From 8b2b050c0d976717b655624a08110e6c33cc0278 Mon Sep 17 00:00:00 2001 From: fiatjaf Date: Fri, 19 Jan 2024 16:01:06 -0300 Subject: [PATCH] unify mock-socket interface into a single implementation. --- bun.lockb | Bin 130695 -> 131056 bytes relay.test.ts | 78 +++++++----------------------------------------- test-helpers.ts | 68 +++++++++++++++++++++++++++++++++++++++-- 3 files changed, 77 insertions(+), 69 deletions(-) diff --git a/bun.lockb b/bun.lockb index e3f59181fdc205a5d3da7cd76811da877f2a3050..1b0c329d4d18d036d368c9b63d2c0186a45d8ef3 100755 GIT binary patch delta 20731 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 delta 20510 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 { - const mockRelayURL = 'wss://mock.relay.url' - const mockRelay = new Server(mockRelayURL) - - const relay = new Relay(mockRelayURL) + const { url } = newMockRelay() + const relay = new Relay(url) await relay.connect() - expect(relay.connected).toBeTrue() - relay.close() - mockRelay.stop() }) test('connectivity, with Relay.connect()', async () => { - const mockRelayURL = 'wss://mock.relay.url' - const mockRelay = new Server(mockRelayURL) - - const relay = await Relay.connect(mockRelayURL) - + const { url } = newMockRelay() + const relay = await Relay.connect(url) expect(relay.connected).toBeTrue() - relay.close() - mockRelay.stop() }) test('querying', async done => { - const sk = generateSecretKey() - const pk = getPublicKey(sk) + const { url, authors } = newMockRelay() const kind = 0 - const mockRelayURL = 'wss://mock.relay.url' - const mockRelay = new Server(mockRelayURL) - - mockRelay.on('connection', socket => { - socket.on('message', message => { - const data = JSON.parse(message as string) - - const event = finalizeEvent( - { - kind, - content: '', - created_at: Math.floor(Date.now() / 1000), - tags: [], - }, - sk, - ) - - socket.send(JSON.stringify(['EVENT', data[1], event])) - }) - }) - - const relay = new Relay(mockRelayURL) + const relay = new Relay(url) await relay.connect() relay.subscribe( [ { - authors: [pk], + authors: authors, kinds: [kind], }, ], { onevent(event) { - expect(event).toHaveProperty('pubkey', pk) + expect(authors).toContain(event.pubkey) expect(event).toHaveProperty('kind', kind) relay.close() - mockRelay.stop() - done() }, }, @@ -84,27 +50,8 @@ test('listening and publishing and closing', async done => { const pk = getPublicKey(sk) const kind = 23571 - const mockRelayURL = 'wss://mock.relay.url' - const mockRelay = new Server(mockRelayURL) - - mockRelay.on('connection', socket => { - let subId: string | null = null - - socket.on('message', message => { - const data = JSON.parse(message as string) - - if (data[0] === 'REQ') { - subId = data[1] - socket.send(JSON.stringify(['EOSE', data[1]])) - } else if (data[0] === 'EVENT') { - socket.send(JSON.stringify(['OK', data[1].id, 'true'])) - - socket.send(JSON.stringify(['EVENT', subId, data[1]])) - } - }) - }) - - const relay = new Relay(mockRelayURL) + const { url } = newMockRelay() + const relay = new Relay(url) await relay.connect() let sub = relay.subscribe( @@ -119,14 +66,11 @@ test('listening and publishing and closing', async done => { expect(event).toHaveProperty('pubkey', pk) expect(event).toHaveProperty('kind', kind) expect(event).toHaveProperty('content', 'content') - sub.close() }, oneose() {}, onclose() { relay.close() - mockRelay.stop() - done() }, }, diff --git a/test-helpers.ts b/test-helpers.ts index b75f510..0d79c84 100644 --- a/test-helpers.ts +++ b/test-helpers.ts @@ -1,6 +1,8 @@ -import type { Event } from './pure.ts' +import { Server } from 'mock-socket' + +import { finalizeEvent, type Event, getPublicKey, generateSecretKey } from './pure.ts' +import { matchFilters, type Filter } from './filter.ts' -/** Build an event for testing purposes. */ export function buildEvent(params: Partial): Event { return { id: '', @@ -13,3 +15,65 @@ export function buildEvent(params: Partial): Event { ...params, } } + +let serial = 0 + +// the mock relay will always return 3 events before eose and then do ok with everything +export function newMockRelay(): { url: string; authors: string[] } { + serial++ + const url = `wss://mock.relay.url/${serial}` + const relay = new Server(url) + const secretKeys = [generateSecretKey(), generateSecretKey(), generateSecretKey(), generateSecretKey()] + + relay.on('connection', (conn: any) => { + let subs: { [subId: string]: { conn: any; filters: Filter[] } } = {} + + conn.on('message', (message: string) => { + const data = JSON.parse(message) + switch (data[0]) { + case 'REQ': { + let subId = data[1] + let filters = data.slice(2) + subs[subId] = { conn, filters } + filters.forEach((filter: Filter) => { + const kinds = filter.kinds?.length ? filter.kinds : [1] + kinds.forEach(kind => { + secretKeys.forEach(sk => { + const event = finalizeEvent( + { + kind, + content: '', + created_at: Math.floor(Date.now() / 1000), + tags: [], + }, + sk, + ) + conn.send(JSON.stringify(['EVENT', subId, event])) + }) + }) + }) + conn.send(JSON.stringify(['EOSE', subId])) + break + } + case 'CLOSE': { + let subId = data[1] + delete subs[subId] + break + } + case 'EVENT': { + let event = data[1] + conn.send(JSON.stringify(['OK', event.id, 'true'])) + for (let subId in subs) { + const { filters, conn: listener } = subs[subId] + if (matchFilters(filters, event)) { + listener.send(JSON.stringify(['EVENT', subId, event])) + } + } + break + } + } + }) + }) + + return { url, authors: secretKeys.map(getPublicKey) } +}