Browse Source

Fix signing of lists

imwald
Nuša Pukšič 1 month ago
parent
commit
e8411c92fd
  1. 24
      assets/controllers/nostr_single_sign_controller.js
  2. 31
      assets/controllers/signer_manager.js

24
assets/controllers/nostr_single_sign_controller.js

@ -38,22 +38,30 @@ export default class extends Controller {
async signAndPublish(event) { async signAndPublish(event) {
event.preventDefault(); event.preventDefault();
console.log('[nostr_single_sign] Sign and publish triggered');
let signer; let signer;
try { try {
this.showStatus('Connecting to signer...');
signer = await getSigner(); signer = await getSigner();
console.log('[nostr_single_sign] Signer obtained successfully');
} catch (e) { } catch (e) {
this.showError('No Nostr signer available. Please connect Amber or install a Nostr signer extension.'); console.error('[nostr_single_sign] Failed to get signer:', e);
this.showError(`No Nostr signer available: ${e.message}. Please connect Amber or install a Nostr signer extension.`);
return; return;
} }
if (!this.publishUrlValue || !this.csrfTokenValue) { if (!this.publishUrlValue || !this.csrfTokenValue) {
console.error('[nostr_single_sign] Missing config', { publishUrl: this.publishUrlValue, csrf: !!this.csrfTokenValue });
this.showError('Missing config'); this.showError('Missing config');
return; return;
} }
this.publishButtonTarget.disabled = true; this.publishButtonTarget.disabled = true;
try { try {
this.showStatus('Getting public key...');
const pubkey = await signer.getPublicKey(); const pubkey = await signer.getPublicKey();
console.log('[nostr_single_sign] Public key obtained:', pubkey);
const skeleton = JSON.parse(this.eventValue || '{}'); const skeleton = JSON.parse(this.eventValue || '{}');
// Update content from textarea before signing // Update content from textarea before signing
const textarea = this.element.querySelector('textarea'); const textarea = this.element.querySelector('textarea');
@ -64,15 +72,23 @@ export default class extends Controller {
this.ensureContent(skeleton); this.ensureContent(skeleton);
skeleton.pubkey = pubkey; skeleton.pubkey = pubkey;
this.showStatus('Signing feedback…'); this.showStatus('Signing event…');
console.log('[nostr_single_sign] Signing event:', skeleton);
const signed = await signer.signEvent(skeleton); const signed = await signer.signEvent(skeleton);
console.log('[nostr_single_sign] Event signed successfully');
this.showStatus('Publishing…'); this.showStatus('Publishing…');
await this.publishSigned(signed); await this.publishSigned(signed);
console.log('[nostr_single_sign] Event published successfully');
this.showSuccess('Published successfully! Redirecting...');
this.showSuccess('Published feedback successfully'); // Redirect to reading list index after successful publish
setTimeout(() => {
window.location.href = '/reading-list';
}, 1500);
} catch (e) { } catch (e) {
console.error(e); console.error('[nostr_single_sign] Error during sign/publish:', e);
this.showError(e.message || 'Publish failed'); this.showError(e.message || 'Publish failed');
} finally { } finally {
this.publishButtonTarget.disabled = false; this.publishButtonTarget.disabled = false;

31
assets/controllers/signer_manager.js

@ -14,9 +14,16 @@ export async function getSigner() {
if (session) { if (session) {
if (remoteSigner) return remoteSigner; if (remoteSigner) return remoteSigner;
if (remoteSignerPromise) return remoteSignerPromise; if (remoteSignerPromise) return remoteSignerPromise;
remoteSignerPromise = createRemoteSigner(session).then(signer => {
remoteSignerPromise = createRemoteSigner(session)
.then(signer => {
remoteSigner = signer; remoteSigner = signer;
return signer; return signer;
})
.catch(error => {
// Reset promise on failure so next call can retry
remoteSignerPromise = null;
throw error;
}); });
return remoteSignerPromise; return remoteSignerPromise;
} }
@ -53,6 +60,26 @@ export function getRemoteSignerSession() {
async function createRemoteSigner(session) { async function createRemoteSigner(session) {
remoteSignerPool = new SimplePool(); remoteSignerPool = new SimplePool();
return await BunkerSigner.fromURI(session.privkey, session.uri, { pool: remoteSignerPool });
// Add timeout to prevent hanging indefinitely
const timeoutPromise = new Promise((_, reject) => {
setTimeout(() => reject(new Error('Remote signer connection timeout')), 10000);
});
try {
return await Promise.race([
BunkerSigner.fromURI(session.privkey, session.uri, { pool: remoteSignerPool }),
timeoutPromise
]);
} catch (error) {
// Clean up on error
if (remoteSignerPool) {
try { remoteSignerPool.close?.([]); } catch (_) {}
remoteSignerPool = null;
}
remoteSigner = null;
remoteSignerPromise = null;
throw error;
}
} }

Loading…
Cancel
Save