69 lines
2.8 KiB
TypeScript
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) }
|
|
}
|