import type { Event, EventTemplate } from 'nostr-tools' import type { PublishResult, RelayPublishStatus } from '../publishResult' import { updatePublishedStatus } from './publishedStatus' export type PublishEventResult = | { kind: 'event'; event: Event } | { kind: 'status'; result: PublishResult } export async function publishEventNonBlocking(params: { pool: import('nostr-tools').SimplePool event: Event activeRelays: string[] relaySessionManager: typeof import('../relaySessionManager').relaySessionManager }): Promise { try { const successfulRelays = await publishToRelaysAndLog({ pool: params.pool, event: params.event, relays: params.activeRelays.length > 0 ? params.activeRelays : [await getPrimaryRelay()], relaySessionManager: params.relaySessionManager, }) await updatePublishedStatus({ eventId: params.event.id, published: successfulRelays.length > 0 ? successfulRelays : false }) } catch (publishError) { console.error('[NostrService] Error during publish (non-blocking):', publishError) await updatePublishedStatus({ eventId: params.event.id, published: false }) } } export async function buildImmediatePublishStatuses(activeRelays: string[]): Promise { return activeRelays.map((relayUrl) => ({ relayUrl, success: false })) } async function publishToRelaysAndLog(params: { pool: import('nostr-tools').SimplePool event: Event relays: string[] relaySessionManager: typeof import('../relaySessionManager').relaySessionManager }): Promise { const pubs = params.pool.publish(params.relays, params.event) const results = await Promise.allSettled(pubs) const successfulRelays: string[] = [] const { publishLog } = await import('../publishLog') results.forEach((result, index) => { const relayUrl = params.relays[index] if (!relayUrl) { return } if (result.status === 'fulfilled') { successfulRelays.push(relayUrl) void publishLog.logPublication({ eventId: params.event.id, relayUrl, success: true }) return } const errorMessage = result.reason instanceof Error ? result.reason.message : String(result.reason) console.error(`[NostrService] Relay ${relayUrl} failed during publish:`, result.reason) params.relaySessionManager.markRelayFailed(relayUrl) void publishLog.logPublication({ eventId: params.event.id, relayUrl, success: false, error: errorMessage }) }) return successfulRelays } async function getPrimaryRelay(): Promise { const { getPrimaryRelay: getPrimaryRelayFromConfig } = await import('../config') return getPrimaryRelayFromConfig() } export function buildUnsignedEventTemplate(eventTemplate: EventTemplate): EventTemplate { return { ...eventTemplate, created_at: eventTemplate.created_at ?? Math.floor(Date.now() / 1000) } }