refactor: 💨

This commit is contained in:
codytseng
2025-11-19 23:20:59 +08:00
parent 926c3f62a0
commit 14b3fbd496

View File

@@ -159,52 +159,69 @@ class ClientService extends EventTarget {
await new Promise<void>((resolve, reject) => { await new Promise<void>((resolve, reject) => {
let successCount = 0 let successCount = 0
let finishedCount = 0 let finishedCount = 0
// If one third of the relays have accepted the event, consider it a success
const successThreshold = uniqueRelayUrls.length / 3
const errors: { url: string; error: any }[] = [] const errors: { url: string; error: any }[] = []
const checkCompletion = () => {
if (successCount >= successThreshold) {
this.emitNewEvent(event)
resolve()
}
if (++finishedCount >= uniqueRelayUrls.length) {
reject(
new AggregateError(
errors.map(
({ url, error }) =>
new Error(`${url}: ${error instanceof Error ? error.message : String(error)}`)
)
)
)
}
}
Promise.allSettled( Promise.allSettled(
uniqueRelayUrls.map(async (url) => { uniqueRelayUrls.map(async (url) => {
// eslint-disable-next-line @typescript-eslint/no-this-alias // eslint-disable-next-line @typescript-eslint/no-this-alias
const that = this const that = this
const relay = await this.pool.ensureRelay(url) const relay = await this.pool.ensureRelay(url, { connectionTimeout: 5_000 }).catch(() => {
return undefined
})
if (!relay) {
errors.push({ url, error: new Error('Cannot connect to relay') })
checkCompletion()
return
}
relay.publishTimeout = 10_000 // 10s relay.publishTimeout = 10_000 // 10s
return relay let hasAuthed = false
.publish(event)
.then(() => { const publishPromise = async () => {
this.trackEventSeenOn(event.id, relay) try {
await relay.publish(event)
that.trackEventSeenOn(event.id, relay)
successCount++ successCount++
}) } catch (error) {
.catch((error) => {
if ( if (
!hasAuthed &&
error instanceof Error && error instanceof Error &&
error.message.startsWith('auth-required') && error.message.startsWith('auth-required') &&
!!that.signer !!that.signer
) { ) {
return relay try {
.auth((authEvt: EventTemplate) => that.signer!.signEvent(authEvt)) await relay.auth((authEvt: EventTemplate) => that.signer!.signEvent(authEvt))
.then(() => relay.publish(event)) hasAuthed = true
return await publishPromise()
} catch (error) {
errors.push({ url, error })
}
} else { } else {
errors.push({ url, error }) errors.push({ url, error })
} }
}) }
.finally(() => { }
// If one third of the relays have accepted the event, consider it a success
const isSuccess = successCount >= uniqueRelayUrls.length / 3 return publishPromise().finally(checkCompletion)
if (isSuccess) {
this.emitNewEvent(event)
resolve()
}
if (++finishedCount >= uniqueRelayUrls.length) {
reject(
new AggregateError(
errors.map(
({ url, error }) =>
new Error(
`${url}: ${error instanceof Error ? error.message : String(error)}`
)
)
)
)
}
})
}) })
) )
}) })
@@ -396,7 +413,7 @@ class ClientService extends EventTarget {
subPromises.push(startSub()) subPromises.push(startSub())
async function startSub() { async function startSub() {
const relay = await that.pool.ensureRelay(url, { connectionTimeout: 5000 }).catch(() => { const relay = await that.pool.ensureRelay(url, { connectionTimeout: 5_000 }).catch(() => {
return undefined return undefined
}) })
// cannot connect to relay // cannot connect to relay