refactor: 💨

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

View File

@@ -159,36 +159,12 @@ 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
const errors: { url: string; error: any }[] = []
Promise.allSettled(
uniqueRelayUrls.map(async (url) => {
// eslint-disable-next-line @typescript-eslint/no-this-alias
const that = this
const relay = await this.pool.ensureRelay(url)
relay.publishTimeout = 10_000 // 10s
return relay
.publish(event)
.then(() => {
this.trackEventSeenOn(event.id, relay)
successCount++
})
.catch((error) => {
if (
error instanceof Error &&
error.message.startsWith('auth-required') &&
!!that.signer
) {
return relay
.auth((authEvt: EventTemplate) => that.signer!.signEvent(authEvt))
.then(() => relay.publish(event))
} else {
errors.push({ url, error })
}
})
.finally(() => {
// If one third of the relays have accepted the event, consider it a success // If one third of the relays have accepted the event, consider it a success
const isSuccess = successCount >= uniqueRelayUrls.length / 3 const successThreshold = uniqueRelayUrls.length / 3
if (isSuccess) { const errors: { url: string; error: any }[] = []
const checkCompletion = () => {
if (successCount >= successThreshold) {
this.emitNewEvent(event) this.emitNewEvent(event)
resolve() resolve()
} }
@@ -197,14 +173,55 @@ class ClientService extends EventTarget {
new AggregateError( new AggregateError(
errors.map( errors.map(
({ url, error }) => ({ url, error }) =>
new Error( new Error(`${url}: ${error instanceof Error ? error.message : String(error)}`)
`${url}: ${error instanceof Error ? error.message : String(error)}`
)
) )
) )
) )
} }
}
Promise.allSettled(
uniqueRelayUrls.map(async (url) => {
// eslint-disable-next-line @typescript-eslint/no-this-alias
const that = this
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
let hasAuthed = false
const publishPromise = async () => {
try {
await relay.publish(event)
that.trackEventSeenOn(event.id, relay)
successCount++
} catch (error) {
if (
!hasAuthed &&
error instanceof Error &&
error.message.startsWith('auth-required') &&
!!that.signer
) {
try {
await relay.auth((authEvt: EventTemplate) => that.signer!.signEvent(authEvt))
hasAuthed = true
return await publishPromise()
} catch (error) {
errors.push({ url, error })
}
} else {
errors.push({ url, error })
}
}
}
return publishPromise().finally(checkCompletion)
}) })
) )
}) })
@@ -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