// The relay-facing transport for nostr backup, kept injectable so tests // never touch a network. The default is nostr-tools' SimplePool, imported // lazily: merely importing the backup module must never open (or even // reference) a WebSocket. import type { Filter as NostrFilter } from 'nostr-tools/filter'; import type { NostrEvent } from './events'; export type { NostrFilter }; // publish throws when the event was accepted NOWHERE export type BackupTransport = { publish: (relays: string[], event: NostrEvent) => Promise; fetch: (relays: string[], filter: NostrFilter) => Promise; }; export const defaultTransport = async (): Promise => { const { SimplePool } = await import('nostr-tools/pool'); const pool = new SimplePool(); return { publish: async (relays, event) => { const results = await Promise.allSettled(pool.publish(relays, event)); // one honest relay keeping the event is enough - addressable events // are re-publishable, and the next debounced publish retries anyway if (!results.some((r) => r.status === 'fulfilled')) { throw new Error('No relay accepted the backup event.'); } }, fetch: (relays, filter) => pool.querySync(relays, filter), }; };