From 45df54f2b3515b7c4dc8ab7de5649408f1a5fdec Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Lohrer?= Date: Tue, 28 Apr 2026 08:08:46 +0200 Subject: [PATCH] feat(snapshot): config-loader mit env-validierung Co-Authored-By: Claude Opus 4.7 (1M context) --- snapshot/src/core/config.ts | 15 +++++++++++++++ snapshot/tests/config.test.ts | 22 ++++++++++++++++++++++ 2 files changed, 37 insertions(+) create mode 100644 snapshot/src/core/config.ts create mode 100644 snapshot/tests/config.test.ts diff --git a/snapshot/src/core/config.ts b/snapshot/src/core/config.ts new file mode 100644 index 0000000..bf783ab --- /dev/null +++ b/snapshot/src/core/config.ts @@ -0,0 +1,15 @@ +export interface Config { + authorPubkeyHex: string + bootstrapRelay: string +} + +export function loadConfig(): Config { + const authorPubkeyHex = Deno.env.get('AUTHOR_PUBKEY_HEX') + const bootstrapRelay = Deno.env.get('BOOTSTRAP_RELAY') + if (!authorPubkeyHex) throw new Error('AUTHOR_PUBKEY_HEX fehlt in env') + if (!/^[0-9a-f]{64}$/i.test(authorPubkeyHex)) { + throw new Error('AUTHOR_PUBKEY_HEX muss 64 hex chars sein') + } + if (!bootstrapRelay) throw new Error('BOOTSTRAP_RELAY fehlt in env') + return { authorPubkeyHex, bootstrapRelay } +} diff --git a/snapshot/tests/config.test.ts b/snapshot/tests/config.test.ts new file mode 100644 index 0000000..f34d6bc --- /dev/null +++ b/snapshot/tests/config.test.ts @@ -0,0 +1,22 @@ +import { assertEquals, assertThrows } from '@std/assert' +import { loadConfig } from '../src/core/config.ts' + +Deno.test('loadConfig liest pubkey + bootstrap relay', () => { + Deno.env.set('AUTHOR_PUBKEY_HEX', '4fa5d1c413e2b45e10d40bf3562ab701a5331206e359c90baae0e99bfd6c6e41') + Deno.env.set('BOOTSTRAP_RELAY', 'wss://relay.primal.net') + const cfg = loadConfig() + assertEquals(cfg.authorPubkeyHex, '4fa5d1c413e2b45e10d40bf3562ab701a5331206e359c90baae0e99bfd6c6e41') + assertEquals(cfg.bootstrapRelay, 'wss://relay.primal.net') +}) + +Deno.test('loadConfig wirft bei fehlendem AUTHOR_PUBKEY_HEX', () => { + Deno.env.delete('AUTHOR_PUBKEY_HEX') + Deno.env.set('BOOTSTRAP_RELAY', 'wss://relay.primal.net') + assertThrows(() => loadConfig(), Error, 'AUTHOR_PUBKEY_HEX') +}) + +Deno.test('loadConfig wirft bei ungueltigem hex', () => { + Deno.env.set('AUTHOR_PUBKEY_HEX', 'nicht-hex') + Deno.env.set('BOOTSTRAP_RELAY', 'wss://relay.primal.net') + assertThrows(() => loadConfig(), Error, '64 hex') +})