diff --git a/src/controllers/NostrController.ts b/src/controllers/NostrController.ts index 95f4c08..13787e5 100644 --- a/src/controllers/NostrController.ts +++ b/src/controllers/NostrController.ts @@ -223,29 +223,31 @@ export class NostrController extends EventEmitter { /** * Function will publish provided event to the provided relays + * + * @param event - The event to publish. + * @param relays - An array of relay URLs to publish the event to. + * @returns A promise that resolves to an array of relays where the event was successfully published. */ publishEvent = async (event: Event, relays: string[]) => { const simplePool = new SimplePool() + // Publish the event to all relays const promises = simplePool.publish(relays, event) - const results = await Promise.allSettled(promises) + // Use Promise.race to wait for the first successful publish + const firstSuccessfulPublish = await Promise.race( + promises.map((promise, index) => + promise.then(() => relays[index]).catch(() => null) + ) + ) - const publishedRelays: string[] = [] - - console.log('results of publish event :>> ', results) - - results.forEach((result, index) => { - if (result.status === 'fulfilled') { - publishedRelays.push(relays[index]) - } - }) - - if (publishedRelays.length === 0) { + if (!firstSuccessfulPublish) { + // If no publish was successful, collect the reasons for failures const failedPublishes: any[] = [] const fallbackRejectionReason = 'Attempt to publish an event has been rejected with unknown reason.' + const results = await Promise.allSettled(promises) results.forEach((res, index) => { if (res.status === 'rejected') { failedPublishes.push({ @@ -260,7 +262,14 @@ export class NostrController extends EventEmitter { throw failedPublishes } - return publishedRelays + // Continue publishing to other relays in the background + promises.forEach((promise, index) => { + promise.catch((err) => { + console.log(`Failed to publish to ${relays[index]}`, err) + }) + }) + + return [firstSuccessfulPublish] } /** diff --git a/src/utils/nostr.ts b/src/utils/nostr.ts index 24f5a9f..ff38faa 100644 --- a/src/utils/nostr.ts +++ b/src/utils/nostr.ts @@ -562,7 +562,7 @@ export const updateUsersAppData = async (meta: Meta) => { console.log(`publishing event kind: ${kinds.Application}`) const publishResult = await Promise.race([ nostrController.publishEvent(signedEvent, writeRelays), - timeout(1000 * 60 * 2) + timeout(1000 * 30) ]).catch((err) => { console.log('err :>> ', err) if (err.message === 'Timeout') { @@ -906,7 +906,7 @@ export const sendNotification = async (receiver: string, meta: Meta) => { // Attempt to publish the event to the relays, with a timeout of 2 minutes await Promise.race([ nostrController.publishEvent(wrappedEvent, relaySet.read), - timeout(1000 * 60 * 2) + timeout(1000 * 30) ]).catch((err) => { // Log an error if publishing the notification event fails console.log(