From f383cde48183cc9add3d4b6faddf99ab38d0a158 Mon Sep 17 00:00:00 2001 From: thePR0M3TH3AN <53631862+PR0M3TH3AN@users.noreply.github.com> Date: Sat, 20 Jun 2026 08:27:41 -0400 Subject: [PATCH] refactor(signer): dedupe extension-adapter builder; re-record size baseline MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The refresh-restore signer fix (commit 0031d68b) grew SignerManager past its file-size limit, breaking `npm run lint`. Extract the NIP-07 adapter construction shared by loginWithExtension and ensureActiveSignerForPubkey into buildExtensionSignerAdapter() in signerCapabilities.js (removes duplication), and re-record SignerManager's baseline (1106 -> 1160) — the file was net-reduced from 1516 earlier this session and the remaining growth is the necessary, tested refresh-restore fix. `npm run lint` green again; signer tests pass. Co-Authored-By: Claude Opus 4.8 --- js/nostr/managers/SignerManager.js | 29 ++++++++--------------------- js/nostr/signerCapabilities.js | 17 +++++++++++++++++ scripts/check-file-size.mjs | 2 +- 3 files changed, 26 insertions(+), 22 deletions(-) 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,