From 3fe32d8d246781585f04d73bcb2c5363437a8cfd Mon Sep 17 00:00:00 2001 From: dtonon Date: Wed, 8 Apr 2026 15:59:56 +0100 Subject: [PATCH] Fix web extension after de3f223c --- src/lib/auth.svelte.ts | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/lib/auth.svelte.ts b/src/lib/auth.svelte.ts index ebc8df6..6c604e9 100644 --- a/src/lib/auth.svelte.ts +++ b/src/lib/auth.svelte.ts @@ -56,6 +56,23 @@ function makeNsecSigner(secretKey: Uint8Array): Signer { }; } +// Always reads window.nostr at call time. This avoids two issues: +// 1. window.nostr may not be injected yet when restoreSession runs. +// 2. Storing window.nostr in a $state wraps it in a reactive proxy, which +// rebinds `this` and confuses some extensions (request never resolves). +function makeExtensionSigner(): Signer { + return { + async getPublicKey() { + if (!window.nostr) throw new Error("No Nostr extension found"); + return window.nostr.getPublicKey(); + }, + async signEvent(template) { + if (!window.nostr) throw new Error("No Nostr extension found"); + return window.nostr.signEvent(template); + }, + }; +} + async function setUser(pubkey: string) { const { loadNostrUser } = await import("@nostr/gadgets/metadata"); user = await loadNostrUser(pubkey); @@ -67,7 +84,7 @@ export async function loginWithExtension() { throw new Error("No Nostr extension found"); } const pubkey = await window.nostr.getPublicKey(); - signer = window.nostr; + signer = makeExtensionSigner(); localStorage.setItem(PUBKEY_KEY, pubkey); localStorage.setItem(METHOD_KEY, "extension"); localStorage.removeItem(NSEC_KEY); @@ -129,7 +146,7 @@ export async function restoreSession() { return; } } else { - signer = window.nostr ?? null; + signer = makeExtensionSigner(); } await setUser(pubkey); }