From c539c4fee3f9d136ea0440bea49ca5c85058ce58 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Lohrer?= Date: Wed, 15 Apr 2026 15:18:41 +0200 Subject: [PATCH] spa: naddr/habla-link-helper (tdd) --- app/src/lib/nostr/naddr.ts | 22 ++++++++++++++++++++++ app/tests/unit/naddr.test.ts | 24 ++++++++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 app/src/lib/nostr/naddr.ts create mode 100644 app/tests/unit/naddr.test.ts diff --git a/app/src/lib/nostr/naddr.ts b/app/src/lib/nostr/naddr.ts new file mode 100644 index 0000000..9db13b2 --- /dev/null +++ b/app/src/lib/nostr/naddr.ts @@ -0,0 +1,22 @@ +import { nip19 } from 'nostr-tools'; +import { HABLA_BASE } from './config'; + +export interface NaddrArgs { + pubkey: string; + kind: number; + identifier: string; + relays?: string[]; +} + +export function buildNaddr(args: NaddrArgs): string { + return nip19.naddrEncode({ + pubkey: args.pubkey, + kind: args.kind, + identifier: args.identifier, + relays: args.relays ?? [], + }); +} + +export function buildHablaLink(args: NaddrArgs): string { + return `${HABLA_BASE}${buildNaddr(args)}`; +} diff --git a/app/tests/unit/naddr.test.ts b/app/tests/unit/naddr.test.ts new file mode 100644 index 0000000..b08d9f8 --- /dev/null +++ b/app/tests/unit/naddr.test.ts @@ -0,0 +1,24 @@ +import { describe, expect, it } from 'vitest'; +import { buildHablaLink } from '$lib/nostr/naddr'; + +describe('buildHablaLink', () => { + it('erzeugt einen habla.news/a/-Link mit naddr1-Bech32', () => { + const link = buildHablaLink({ + pubkey: '4fa5d1c413e2b45e10d40bf3562ab701a5331206e359c90baae0e99bfd6c6e41', + kind: 30023, + identifier: 'dezentrale-oep-oer', + relays: ['wss://relay.damus.io'], + }); + expect(link).toMatch(/^https:\/\/habla\.news\/a\/naddr1[a-z0-9]+$/); + }); + + it('ist deterministisch für gleiche Inputs', () => { + const args = { + pubkey: '4fa5d1c413e2b45e10d40bf3562ab701a5331206e359c90baae0e99bfd6c6e41', + kind: 30023, + identifier: 'foo', + relays: ['wss://relay.damus.io'], + }; + expect(buildHablaLink(args)).toBe(buildHablaLink(args)); + }); +});