make publish() timeout.
This commit is contained in:
parent
94f841f347
commit
d062ab8afd
|
@ -24,6 +24,7 @@ export class AbstractRelay {
|
|||
|
||||
public baseEoseTimeout: number = 4400
|
||||
public connectionTimeout: number = 4400
|
||||
public publishTimeout: number = 4400
|
||||
public openSubs: Map<string, Subscription> = new Map()
|
||||
private connectionTimeoutHandle: ReturnType<typeof setTimeout> | undefined
|
||||
|
||||
|
@ -198,9 +199,11 @@ export class AbstractRelay {
|
|||
const ok: boolean = data[2]
|
||||
const reason: string = data[3]
|
||||
const ep = this.openEventPublishes.get(id) as EventPublishResolver
|
||||
if (ok) ep.resolve(reason)
|
||||
else ep.reject(new Error(reason))
|
||||
this.openEventPublishes.delete(id)
|
||||
if (ep) {
|
||||
if (ok) ep.resolve(reason)
|
||||
else ep.reject(new Error(reason))
|
||||
this.openEventPublishes.delete(id)
|
||||
}
|
||||
return
|
||||
}
|
||||
case 'CLOSED': {
|
||||
|
@ -248,6 +251,13 @@ export class AbstractRelay {
|
|||
this.openEventPublishes.set(event.id, { resolve, reject })
|
||||
})
|
||||
this.send('["EVENT",' + JSON.stringify(event) + ']')
|
||||
setTimeout(() => {
|
||||
const ep = this.openEventPublishes.get(event.id) as EventPublishResolver
|
||||
if (ep) {
|
||||
ep.reject(new Error('publish timed out'))
|
||||
this.openEventPublishes.delete(event.id)
|
||||
}
|
||||
}, this.publishTimeout)
|
||||
return ret
|
||||
}
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
import { expect, test } from 'bun:test'
|
||||
|
||||
import { Server } from 'mock-socket'
|
||||
import { finalizeEvent, generateSecretKey, getPublicKey } from './pure.ts'
|
||||
import { Relay, useWebSocketImplementation } from './relay.ts'
|
||||
import { MockRelay, MockWebSocketClient } from './test-helpers.ts'
|
||||
|
@ -92,3 +92,28 @@ test('listening and publishing and closing', async done => {
|
|||
),
|
||||
)
|
||||
})
|
||||
|
||||
test('publish timeout', async () => {
|
||||
const url = 'wss://relay.example.com'
|
||||
new Server(url)
|
||||
|
||||
const relay = new Relay(url)
|
||||
relay.publishTimeout = 100
|
||||
await relay.connect()
|
||||
|
||||
setTimeout(() => relay.close(), 20000) // close the relay to fail the test on timeout
|
||||
|
||||
expect(
|
||||
relay.publish(
|
||||
finalizeEvent(
|
||||
{
|
||||
kind: 1,
|
||||
created_at: Math.floor(Date.now() / 1000),
|
||||
tags: [],
|
||||
content: 'hello',
|
||||
},
|
||||
generateSecretKey(),
|
||||
),
|
||||
),
|
||||
).rejects.toThrow('publish timed out')
|
||||
})
|
||||
|
|
Loading…
Reference in New Issue