Skip to content

Commit 226d7d0

Browse files
authored
Improvements to enablePing() & tests (#506)
#506
1 parent c9ff51e commit 226d7d0

4 files changed

Lines changed: 93 additions & 17 deletions

File tree

pool.test.ts

Lines changed: 56 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -59,16 +59,24 @@ test('same with double subs', async () => {
5959
let priv = generateSecretKey()
6060
let pub = getPublicKey(priv)
6161

62-
pool.subscribeMany(relayURLs, { authors: [pub] }, {
63-
onevent(event) {
64-
received.push(event)
62+
pool.subscribeMany(
63+
relayURLs,
64+
{ authors: [pub] },
65+
{
66+
onevent(event) {
67+
received.push(event)
68+
},
6569
},
66-
})
67-
pool.subscribeMany(relayURLs, { authors: [pub] }, {
68-
onevent(event) {
69-
received.push(event)
70+
)
71+
pool.subscribeMany(
72+
relayURLs,
73+
{ authors: [pub] },
74+
{
75+
onevent(event) {
76+
received.push(event)
77+
},
7078
},
71-
})
79+
)
7280

7381
let received: Event[] = []
7482

@@ -172,12 +180,16 @@ test('query a bunch of events and cancel on eose', async () => {
172180
let events = new Set<string>()
173181

174182
await new Promise<void>(resolve => {
175-
pool.subscribeManyEose(relayURLs, { kinds: [0, 1, 2, 3, 4, 5, 6], limit: 40 }, {
176-
onevent(event) {
177-
events.add(event.id)
183+
pool.subscribeManyEose(
184+
relayURLs,
185+
{ kinds: [0, 1, 2, 3, 4, 5, 6], limit: 40 },
186+
{
187+
onevent(event) {
188+
events.add(event.id)
189+
},
190+
onclose: resolve as any,
178191
},
179-
onclose: resolve as any,
180-
})
192+
)
181193
})
182194

183195
expect(events.size).toBeGreaterThan(50)
@@ -210,6 +222,37 @@ test('get()', async () => {
210222
expect(event).toHaveProperty('id', ids[0])
211223
})
212224

225+
test('ping-pong timeout in pool', async () => {
226+
const mockRelay = mockRelays[0]
227+
pool = new SimplePool({ enablePing: true })
228+
const relay = await pool.ensureRelay(mockRelay.url)
229+
relay.pingTimeout = 50
230+
relay.pingFrequency = 50
231+
232+
let closed = false
233+
const closedPromise = new Promise<void>(resolve => {
234+
relay.onclose = () => {
235+
closed = true
236+
resolve()
237+
}
238+
})
239+
240+
expect(relay.connected).toBeTrue()
241+
242+
// wait for the first ping to succeed
243+
await new Promise(resolve => setTimeout(resolve, 75))
244+
expect(closed).toBeFalse()
245+
246+
// now make it unresponsive
247+
mockRelay.unresponsive = true
248+
249+
// wait for the second ping to fail
250+
await closedPromise
251+
252+
expect(relay.connected).toBeFalse()
253+
expect(closed).toBeTrue()
254+
})
255+
213256
test('track relays when publishing', async () => {
214257
let event1 = finalizeEvent(
215258
{

relay.test.ts

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,3 +117,34 @@ test('publish timeout', async () => {
117117
),
118118
).rejects.toThrow('publish timed out')
119119
})
120+
121+
test('ping-pong timeout', async () => {
122+
const mockRelay = new MockRelay()
123+
const relay = new Relay(mockRelay.url, { enablePing: true })
124+
relay.pingTimeout = 50
125+
relay.pingFrequency = 50
126+
127+
let closed = false
128+
const closedPromise = new Promise<void>(resolve => {
129+
relay.onclose = () => {
130+
closed = true
131+
resolve()
132+
}
133+
})
134+
135+
await relay.connect()
136+
expect(relay.connected).toBeTrue()
137+
138+
// wait for the first ping to succeed
139+
await new Promise(resolve => setTimeout(resolve, 75))
140+
expect(closed).toBeFalse()
141+
142+
// now make it unresponsive
143+
mockRelay.unresponsive = true
144+
145+
// wait for the second ping to fail
146+
await closedPromise
147+
148+
expect(relay.connected).toBeFalse()
149+
expect(closed).toBeTrue()
150+
})

relay.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,12 +14,12 @@ export function useWebSocketImplementation(websocketImplementation: any) {
1414
}
1515

1616
export class Relay extends AbstractRelay {
17-
constructor(url: string) {
18-
super(url, { verifyEvent, websocketImplementation: _WebSocket })
17+
constructor(url: string, options?: { enablePing?: boolean }) {
18+
super(url, { verifyEvent, websocketImplementation: _WebSocket, ...options })
1919
}
2020

21-
static async connect(url: string): Promise<Relay> {
22-
const relay = new Relay(url)
21+
static async connect(url: string, options?: { enablePing?: boolean }): Promise<Relay> {
22+
const relay = new Relay(url, options)
2323
await relay.connect()
2424
return relay
2525
}

test-helpers.ts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ export class MockRelay {
2626
public url: string
2727
public secretKeys: Uint8Array[]
2828
public preloadedEvents: Event[]
29+
public unresponsive: boolean = false
2930

3031
constructor(url?: string | undefined) {
3132
serial++
@@ -48,6 +49,7 @@ export class MockRelay {
4849
let subs: { [subId: string]: { conn: any; filters: Filter[] } } = {}
4950

5051
conn.on('message', (message: string) => {
52+
if (this.unresponsive) return
5153
const data = JSON.parse(message)
5254

5355
switch (data[0]) {

0 commit comments

Comments
 (0)