// The relay-facing transport for the NWC service, kept injectable so // tests never touch a network. Same pattern as nostr/transport.ts: the // default (nostr-tools' SimplePool) is imported lazily, so merely // importing the service module never opens (or even references) a // WebSocket. import type { Filter as NostrFilter } from 'nostr-tools/filter'; import type { NostrEvent } from './protocol'; export type { NostrFilter }; export type NwcSubscription = { close: () => void; }; export type NwcTransport = { publish: (relays: string[], event: NostrEvent) => Promise; subscribe: ( relays: string[], filter: NostrFilter, onEvent: (event: NostrEvent) => void, ) => NwcSubscription; }; export const defaultNwcTransport = 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 accepting is enough - same rule as the backup if (!results.some((r) => r.status === 'fulfilled')) { throw new Error('No relay accepted the event.'); } }, subscribe: (relays, filter, onEvent) => pool.subscribeMany(relays, filter, { onevent: onEvent }), }; };