From dcef74e75cbab29678ac39653a397c46da75ddb1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Lohrer?= Date: Wed, 15 Apr 2026 17:22:54 +0200 Subject: [PATCH] spa(task 14): nip-07-signer-wrapper MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit window.nostr-Proxy für Alby/nos2x/Flamingo-Extensions. Fehlertolerant: bei fehlender Extension ODER User-Ablehnung returnen die Helper null, damit UI klar "bitte Extension installieren"-Hinweise zeigen kann statt zu crashen. UnsignedEvent/SignedEvent als explizite Types — werden ab Task 29 (ReplyComposer) für NIP-07-signierte kind:1-Kommentare genutzt. Co-Authored-By: Claude Opus 4.6 (1M context) --- app/src/lib/nostr/signer.ts | 50 +++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 app/src/lib/nostr/signer.ts diff --git a/app/src/lib/nostr/signer.ts b/app/src/lib/nostr/signer.ts new file mode 100644 index 0000000..de85753 --- /dev/null +++ b/app/src/lib/nostr/signer.ts @@ -0,0 +1,50 @@ +/** + * NIP-07-Wrapper für Browser-Extension-Signer (Alby, nos2x, Flamingo). + * + * `window.nostr` ist optional — wenn die Extension fehlt, liefern die Helper + * null zurück und der Aufrufer zeigt einen Hinweis an. + */ + +declare global { + interface Window { + nostr?: { + getPublicKey(): Promise; + signEvent(event: UnsignedEvent): Promise; + }; + } +} + +export interface UnsignedEvent { + kind: number; + tags: string[][]; + content: string; + created_at: number; + pubkey: string; +} + +export interface SignedEvent extends UnsignedEvent { + id: string; + sig: string; +} + +export function hasNip07(): boolean { + return typeof window !== 'undefined' && !!window.nostr; +} + +export async function getPublicKey(): Promise { + if (!hasNip07()) return null; + try { + return await window.nostr!.getPublicKey(); + } catch { + return null; + } +} + +export async function signEvent(event: UnsignedEvent): Promise { + if (!hasNip07()) return null; + try { + return await window.nostr!.signEvent(event); + } catch { + return null; + } +}