From 4dd675a9fe0c0dd4c28061d7134b107864dab57a Mon Sep 17 00:00:00 2001 From: Pablo Fernandez Date: Mon, 1 Jul 2024 12:21:28 +0100 Subject: [PATCH] apply limit filter --- ndk-cache-dexie/src/index.test.ts | 24 ++++++++++++++++++++++++ ndk-cache-dexie/src/index.ts | 14 +++++++++++--- ndk-cache-dexie/tsconfig.json | 2 +- 3 files changed, 36 insertions(+), 4 deletions(-) diff --git a/ndk-cache-dexie/src/index.test.ts b/ndk-cache-dexie/src/index.test.ts index 6de32ad7..b95e2b2c 100644 --- a/ndk-cache-dexie/src/index.test.ts +++ b/ndk-cache-dexie/src/index.test.ts @@ -5,6 +5,30 @@ const ndk = new NDK() ndk.signer = NDKPrivateKeySigner.generate(); ndk.cacheAdapter = new NDKCacheAdapterDexie(); +describe("foundEvents", () => { + it('applies limit filter', async () => { + const startTime = Math.floor(Date.now() / 1000); + const times = []; + for (let i = 0; i < 10; i++) { + const event = new NDKEvent(ndk); + event.kind = 2; + event.created_at = startTime - i * 60; + times.push(event.created_at); + await event.sign(); + ndk.cacheAdapter!.setEvent(event, []); + } + + const subscription = new NDKSubscription(ndk, [{kinds: [2], limit: 2}]); + const spy = jest.spyOn(subscription, "eventReceived"); + await ndk.cacheAdapter!.query(subscription); + expect(subscription.eventReceived).toBeCalledTimes(2); + + // the time of the events that were received must be the first two in the list + expect(spy.mock.calls[0][0].created_at).toBe(times[0]); + expect(spy.mock.calls[1][0].created_at).toBe(times[1]); + }); +}) + describe("foundEvent", () => { beforeAll(async () => { // save event diff --git a/ndk-cache-dexie/src/index.ts b/ndk-cache-dexie/src/index.ts index a9d384b4..5570b3b7 100644 --- a/ndk-cache-dexie/src/index.ts +++ b/ndk-cache-dexie/src/index.ts @@ -518,13 +518,16 @@ export default class NDKCacheAdapterDexie implements NDKCacheAdapter { const f = ["kinds"]; const hasAllKeys = filterKeys.size === f.length && f.every((k) => filterKeys.has(k)); + let events: Event[] = []; + if (!hasAllKeys) return false; for (const kind of filter.kinds) { - const events = Array.from(this.events.getFromIndex("kind", kind)); - foundEvents(subscription, events, filter); + events = [ ...events, ...Array.from(this.events.getFromIndex("kind", kind))] } + foundEvents(subscription, events, filter); + return true; } } @@ -558,6 +561,11 @@ export function foundEvents( events: Event[], filter?: NDKFilter ) { + // if we have a limit, sort and slice + if (filter?.limit && events.length > filter.limit) { + events = events.sort((a, b) => b.createdAt - a.createdAt).slice(0, filter.limit); + } + for (const event of events) { foundEvent(subscription, event, event.relay, filter); } @@ -575,7 +583,7 @@ export function foundEvent( if (filter && !matchFilter(filter, deserializedEvent as any)) return; const ndkEvent = new NDKEvent(undefined, deserializedEvent); - const relay = relayUrl ? subscription.pool.getRelay(relayUrl) : undefined; + const relay = relayUrl ? subscription.pool.getRelay(relayUrl, false) : undefined; ndkEvent.relay = relay; subscription.eventReceived(ndkEvent, relay, true); } catch (e) { diff --git a/ndk-cache-dexie/tsconfig.json b/ndk-cache-dexie/tsconfig.json index 11ac4ac4..fe257ae3 100644 --- a/ndk-cache-dexie/tsconfig.json +++ b/ndk-cache-dexie/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "@nostr-dev-kit/tsconfig/ndk-cache-dexie.json", + "extends": "../packages/tsconfig/ndk-cache-dexie.json", "include": ["src/**/*.d.ts", "src/**/*.js", "src/**/*.ts"], "exclude": ["dist", "build", "node_modules"] }