2026-01-13 14:49:19 +01:00

69 lines
2.8 KiB
TypeScript

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<void> {
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<RelayPublishStatus[]> {
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<string[]> {
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<string> {
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) }
}