diff --git a/packages/ditto/controllers/nostr/relay.ts b/packages/ditto/controllers/nostr/relay.ts index c549c594..9c29f89d 100644 --- a/packages/ditto/controllers/nostr/relay.ts +++ b/packages/ditto/controllers/nostr/relay.ts @@ -125,7 +125,7 @@ function connectStream(socket: WebSocket, ip: string | undefined, conf: DittoCon const store = await Storages.db(); try { - for await (const [verb, , ...rest] of store.req(filters, { timeout: conf.db.timeouts.relay })) { + for await (const [verb, , ...rest] of store.req(filters, { limit: 100, timeout: conf.db.timeouts.relay })) { send([verb, subId, ...rest] as NostrRelayMsg); } } catch (e) { diff --git a/packages/ditto/storages/DittoPgStore.ts b/packages/ditto/storages/DittoPgStore.ts index bcbb9197..e7b88fd4 100644 --- a/packages/ditto/storages/DittoPgStore.ts +++ b/packages/ditto/storages/DittoPgStore.ts @@ -262,10 +262,10 @@ export class DittoPgStore extends NPostgres { override async *req( filters: NostrFilter[], - opts: { timeout?: number; signal?: AbortSignal } = {}, + opts: { timeout?: number; signal?: AbortSignal; limit?: number } = {}, ): AsyncIterable { const { db, chunkSize = 20 } = this.opts; - const { timeout = this.opts.timeout, signal } = opts; + const { limit, timeout = this.opts.timeout, signal } = opts; filters = await this.expandFilters(filters); @@ -273,11 +273,15 @@ export class DittoPgStore extends NPostgres { const normalFilters = this.normalizeFilters(filters); const machina = new Machina(signal); - if (normalFilters.length) { + if (normalFilters.length && limit !== 0) { this.withTimeout(db.kysely as unknown as Kysely, timeout, async (trx) => { - const rows = this.getEventsQuery(trx, normalFilters).stream(chunkSize); + let query = this.getEventsQuery(trx, normalFilters); - for await (const row of rows) { + if (typeof opts.limit === 'number') { + query = query.limit(opts.limit); + } + + for await (const row of query.stream(chunkSize)) { const event = this.parseEventRow(row); machina.push(['EVENT', subId, event]); }