From 3593d5420d1b24cde73faa9e36f2e7ac0378ccb5 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Sat, 12 Aug 2023 14:01:30 -0500 Subject: [PATCH] Relay: limit to 100 events per filter --- src/controllers/nostr/relay.ts | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/src/controllers/nostr/relay.ts b/src/controllers/nostr/relay.ts index 68bd8152..c2882090 100644 --- a/src/controllers/nostr/relay.ts +++ b/src/controllers/nostr/relay.ts @@ -5,12 +5,15 @@ import { clientMsgSchema, type ClientREQ } from '@/schemas/nostr.ts'; import type { AppController } from '@/app.ts'; +/** Limit of events returned per-filter. */ +const FILTER_LIMIT = 100; + function connectStream(socket: WebSocket) { socket.onmessage = (e) => { const result = jsonSchema.pipe(clientMsgSchema).safeParse(e.data); if (!result.success) { - socket.send(JSON.stringify(['NOTICE', JSON.stringify(result.error.message)])); + socket.send(JSON.stringify(['NOTICE', 'Invalid message.'])); return; } @@ -27,13 +30,20 @@ function connectStream(socket: WebSocket) { }; async function handleReq([_, sub, ...filters]: ClientREQ) { - for (const event of await getFilters(filters as Filter[])) { + for (const event of await getFilters(prepareFilters(filters))) { socket.send(JSON.stringify(['EVENT', sub, event])); } socket.send(JSON.stringify(['EOSE', sub])); } } +function prepareFilters(filters: ClientREQ[2][]): Filter[] { + return filters.map((filter) => ({ + ...filter, + limit: Math.min(filter.limit || FILTER_LIMIT, FILTER_LIMIT), + })); +} + const relayController: AppController = (c) => { const upgrade = c.req.headers.get('upgrade');