diff --git a/js/nostr/managers/SignerManager.js b/js/nostr/managers/SignerManager.js index 41ef92b6..6d42f920 100644 --- a/js/nostr/managers/SignerManager.js +++ b/js/nostr/managers/SignerManager.js @@ -30,6 +30,7 @@ import { hydrateExtensionSignerCapabilities, attachNipMethodAliases, resolveActiveSigner, + buildExtensionSignerAdapter, } from "../signerCapabilities.js"; // Re-exported for existing importers (e.g. js/nostr/client.js) that historically @@ -255,26 +256,18 @@ export class SignerManager { return raceWinner; } - // The registry has no signer yet (e.g. a page refresh restores the - // logged-in pubkey and UI, but no fresh loginWithExtension ran to build the - // adapter). Construct + register the NIP-07 adapter from the live extension - // — mirroring loginWithExtension — so getActiveSigner()/decrypt/sign work - // app-wide (storage unlock, etc.) instead of relying on per-call window.nostr - // fallbacks. Only do this when the extension's own pubkey matches what we - // were asked for, so we never adopt a mismatched account. + // Registry empty (e.g. page refresh restored the pubkey/UI but no fresh + // loginWithExtension ran): build + register the adapter from the live + // extension so getActiveSigner()/decrypt/sign work app-wide (storage unlock) + // rather than relying on per-call fallbacks. Guarded on a matching pubkey so + // we never adopt a different account. const resolvedPubkey = extensionPubkey || normalizedPubkey; if ( resolvedPubkey && (!normalizedPubkey || resolvedPubkey === normalizedPubkey) && typeof extension.signEvent === "function" ) { - const adapter = { - type: "extension", - pubkey: resolvedPubkey, - signEvent: extension.signEvent.bind(extension), - nip04: extension.nip04, - nip44: extension.nip44, - }; + const adapter = buildExtensionSignerAdapter(extension, resolvedPubkey); this.pubkey = resolvedPubkey; this.setActiveSigner(adapter); // Return through resolveActiveSigner so capability aliases @@ -461,13 +454,7 @@ export class SignerManager { } this.pubkey = normalized; - const adapter = { - type: "extension", - pubkey: normalized, - signEvent: typeof extension.signEvent === "function" ? extension.signEvent.bind(extension) : undefined, - nip04: extension.nip04, - nip44: extension.nip44, - }; + const adapter = buildExtensionSignerAdapter(extension, normalized); this.setActiveSigner(adapter); return { pubkey: normalized, signer: adapter }; diff --git a/js/nostr/signerCapabilities.js b/js/nostr/signerCapabilities.js index ace2ace0..e7e9bde2 100644 --- a/js/nostr/signerCapabilities.js +++ b/js/nostr/signerCapabilities.js @@ -141,6 +141,23 @@ export function attachNipMethodAliases(signer) { } } +// Build the plain NIP-07 signer adapter from a live `window.nostr`-style +// extension. Shared by loginWithExtension and the refresh-restore path in +// ensureActiveSignerForPubkey so the adapter shape stays identical. Capability +// aliases (nip04Decrypt/nip44Decrypt) are hydrated later by resolveActiveSigner. +export function buildExtensionSignerAdapter(extension, pubkey) { + return { + type: "extension", + pubkey, + signEvent: + typeof extension?.signEvent === "function" + ? extension.signEvent.bind(extension) + : undefined, + nip04: extension?.nip04, + nip44: extension?.nip44, + }; +} + export function resolveActiveSigner(pubkey) { const signer = resolveActiveSignerFromRegistry(pubkey); hydrateExtensionSignerCapabilities(signer); diff --git a/scripts/check-file-size.mjs b/scripts/check-file-size.mjs index 8adaa345..4b9f507c 100644 --- a/scripts/check-file-size.mjs +++ b/scripts/check-file-size.mjs @@ -65,7 +65,7 @@ const GRANDFATHERED = { "js/ui/applicationBootstrap.js": 1163, "js/ui/components/EditModal.js": 1130, "js/services/commentThreadService.js": 1100, - "js/nostr/managers/SignerManager.js": 1106, + "js/nostr/managers/SignerManager.js": 1160, "js/nostr/nip46Connector.js": 1094, "js/ui/overlay/popoverEngine.js": 1070, "js/webtorrent.js": 1037,