make publish() timeout.
This commit is contained in:
parent
94f841f347
commit
d062ab8afd
|
@ -24,6 +24,7 @@ export class AbstractRelay {
|
||||||
|
|
||||||
public baseEoseTimeout: number = 4400
|
public baseEoseTimeout: number = 4400
|
||||||
public connectionTimeout: number = 4400
|
public connectionTimeout: number = 4400
|
||||||
|
public publishTimeout: number = 4400
|
||||||
public openSubs: Map<string, Subscription> = new Map()
|
public openSubs: Map<string, Subscription> = new Map()
|
||||||
private connectionTimeoutHandle: ReturnType<typeof setTimeout> | undefined
|
private connectionTimeoutHandle: ReturnType<typeof setTimeout> | undefined
|
||||||
|
|
||||||
|
@ -198,9 +199,11 @@ export class AbstractRelay {
|
||||||
const ok: boolean = data[2]
|
const ok: boolean = data[2]
|
||||||
const reason: string = data[3]
|
const reason: string = data[3]
|
||||||
const ep = this.openEventPublishes.get(id) as EventPublishResolver
|
const ep = this.openEventPublishes.get(id) as EventPublishResolver
|
||||||
if (ok) ep.resolve(reason)
|
if (ep) {
|
||||||
else ep.reject(new Error(reason))
|
if (ok) ep.resolve(reason)
|
||||||
this.openEventPublishes.delete(id)
|
else ep.reject(new Error(reason))
|
||||||
|
this.openEventPublishes.delete(id)
|
||||||
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
case 'CLOSED': {
|
case 'CLOSED': {
|
||||||
|
@ -248,6 +251,13 @@ export class AbstractRelay {
|
||||||
this.openEventPublishes.set(event.id, { resolve, reject })
|
this.openEventPublishes.set(event.id, { resolve, reject })
|
||||||
})
|
})
|
||||||
this.send('["EVENT",' + JSON.stringify(event) + ']')
|
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
|
return ret
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
import { expect, test } from 'bun:test'
|
import { expect, test } from 'bun:test'
|
||||||
|
import { Server } from 'mock-socket'
|
||||||
import { finalizeEvent, generateSecretKey, getPublicKey } from './pure.ts'
|
import { finalizeEvent, generateSecretKey, getPublicKey } from './pure.ts'
|
||||||
import { Relay, useWebSocketImplementation } from './relay.ts'
|
import { Relay, useWebSocketImplementation } from './relay.ts'
|
||||||
import { MockRelay, MockWebSocketClient } from './test-helpers.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