diff --git a/src/services/bookmarkProcessing.ts b/src/services/bookmarkProcessing.ts index c8a04830..c2501f5a 100644 --- a/src/services/bookmarkProcessing.ts +++ b/src/services/bookmarkProcessing.ts @@ -26,16 +26,6 @@ async function withTimeout(promise: Promise, ms: number, label: string): P } } -// Serialize NIP-46 decrypt/unlock calls to avoid overloading the provider -let decryptQueue: Promise = Promise.resolve() -function enqueueDecrypt(task: () => Promise): Promise { - const run = async () => task() - const next = decryptQueue.then(run, run) - // Chain to ensure one-at-a-time execution - decryptQueue = next.then(() => undefined, () => undefined) - return next -} - export async function collectBookmarksFromEvents( bookmarkListEvents: NostrEvent[], activeAccount: ActiveAccount, @@ -106,23 +96,19 @@ export async function collectBookmarksFromEvents( hasHiddenTags: true }) try { - await enqueueDecrypt(() => - withTimeout( - Helpers.unlockHiddenTags(evt, signerCandidate as HiddenContentSigner), - 5000, - 'unlockHiddenTags(nip04)' - ) + await withTimeout( + Helpers.unlockHiddenTags(evt, signerCandidate as HiddenContentSigner), + 5000, + 'unlockHiddenTags(nip04)' ) console.log('[bunker] ✅ Unlocked hidden tags with nip04') } catch (err) { console.log('[bunker] ⚠️ nip04 unlock failed (or timed out), trying nip44:', err) try { - await enqueueDecrypt(() => - withTimeout( - Helpers.unlockHiddenTags(evt, signerCandidate as HiddenContentSigner, 'nip44' as UnlockMode), - 5000, - 'unlockHiddenTags(nip44)' - ) + await withTimeout( + Helpers.unlockHiddenTags(evt, signerCandidate as HiddenContentSigner, 'nip44' as UnlockMode), + 5000, + 'unlockHiddenTags(nip44)' ) console.log('[bunker] ✅ Unlocked hidden tags with nip44') } catch (err2) { @@ -141,15 +127,13 @@ export async function collectBookmarksFromEvents( try { if (hasNip44Decrypt(signerCandidate)) { console.log('[bunker] Trying nip44 decrypt...') - decryptedContent = await enqueueDecrypt(() => - withTimeout( - (signerCandidate as { nip44: { decrypt: DecryptFn } }).nip44.decrypt( - evt.pubkey, - evt.content - ), - 6000, - 'nip44.decrypt' - ) + decryptedContent = await withTimeout( + (signerCandidate as { nip44: { decrypt: DecryptFn } }).nip44.decrypt( + evt.pubkey, + evt.content + ), + 6000, + 'nip44.decrypt' ) console.log('[bunker] ✅ nip44 decrypt succeeded') } @@ -161,15 +145,13 @@ export async function collectBookmarksFromEvents( try { if (hasNip04Decrypt(signerCandidate)) { console.log('[bunker] Trying nip04 decrypt...') - decryptedContent = await enqueueDecrypt(() => - withTimeout( - (signerCandidate as { nip04: { decrypt: DecryptFn } }).nip04.decrypt( - evt.pubkey, - evt.content - ), - 6000, - 'nip04.decrypt' - ) + decryptedContent = await withTimeout( + (signerCandidate as { nip04: { decrypt: DecryptFn } }).nip04.decrypt( + evt.pubkey, + evt.content + ), + 6000, + 'nip04.decrypt' ) console.log('[bunker] ✅ nip04 decrypt succeeded') } diff --git a/src/services/highlightCreationService.ts b/src/services/highlightCreationService.ts index 4d8c247a..f6251bc1 100644 --- a/src/services/highlightCreationService.ts +++ b/src/services/highlightCreationService.ts @@ -48,6 +48,25 @@ export async function createHighlight( // Create EventFactory with the account as signer const factory = new EventFactory({ signer: account }) + // For NIP-46 (bunker) accounts, ensure connection before signing + try { + const signer = (account as unknown as { signer?: unknown })?.signer as unknown + const hasConnect = signer && typeof (signer as { connect?: unknown }).connect === 'function' + const hasOpen = signer && typeof (signer as { open?: unknown }).open === 'function' + const isListening = signer && (signer as { listening?: boolean }).listening === true + if (hasConnect) { + if (hasOpen && !isListening) { + console.log('[bunker] Opening signer subscription before signing...') + await (signer as { open: () => Promise }).open() + } + console.log('[bunker] Ensuring bunker connection before signing...') + await (signer as { connect: () => Promise }).connect() + console.log('[bunker] ✅ Bunker connection ready for signing') + } + } catch (err) { + console.warn('[bunker] ⚠️ Could not pre-connect signer (will rely on requireConnection):', err) + } + let blueprintSource: NostrEvent | AddressPointer | string let context: string | undefined