refactor: 💨
This commit is contained in:
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user