From acffdd7fb80d12590f109835570d88c7778a36a9 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Wed, 27 Dec 2023 23:22:24 -0600 Subject: [PATCH] memorelay: insertEvent --- src/db/memorelay.ts | 22 +++++++++++++++++++--- src/filter.ts | 14 +++++++++++--- 2 files changed, 30 insertions(+), 6 deletions(-) diff --git a/src/db/memorelay.ts b/src/db/memorelay.ts index a6dc2d9..ad2a884 100644 --- a/src/db/memorelay.ts +++ b/src/db/memorelay.ts @@ -1,8 +1,13 @@ import { Debug, type Event, type Filter, LRUCache } from '@/deps.ts'; -import { getFilterId, type GetFiltersOpts, isMicrofilter } from '@/filter.ts'; +import { getFilterId, type GetFiltersOpts, getMicroFilters, isMicrofilter } from '@/filter.ts'; const debug = Debug('ditto:memorelay'); -const events = new LRUCache({ max: 1000 }); + +const events = new LRUCache({ + max: 1000, + maxEntrySize: 1000, + sizeCalculation: (event) => JSON.stringify(event).length, +}); /** Get events from memory. */ function getFilters(filters: Filter[], opts: GetFiltersOpts = {}): Promise[]> { @@ -24,4 +29,15 @@ function getFilters(filters: Filter[], opts: GetFiltersOpts return Promise.resolve(results); } -export { getFilters }; +/** Insert an event into memory. */ +function insertEvent(event: Event): void { + for (const microfilter of getMicroFilters(event)) { + const filterId = getFilterId(microfilter); + const existing = events.get(filterId); + if (!existing || event.created_at > existing.created_at) { + events.set(filterId, event); + } + } +} + +export { getFilters, insertEvent }; diff --git a/src/filter.ts b/src/filter.ts index f562a82..7f3cb4f 100644 --- a/src/filter.ts +++ b/src/filter.ts @@ -63,11 +63,18 @@ function getFilterId(filter: MicroFilter): string { /** Get a microfilter from a Nostr event. */ function eventToMicroFilter(event: Event): MicroFilter { + const [microfilter] = getMicroFilters(event); + return microfilter; +} + +/** Get all the microfilters for an event, in order of priority. */ +function getMicroFilters(event: Event): MicroFilter[] { + const microfilters: MicroFilter[] = []; if (event.kind === 0) { - return { kinds: [0], authors: [event.pubkey] }; - } else { - return { ids: [event.id] }; + microfilters.push({ kinds: [0], authors: [event.pubkey] }); } + microfilters.push({ ids: [event.id] }); + return microfilters; } /** Microfilter schema. */ @@ -86,6 +93,7 @@ export { eventToMicroFilter, getFilterId, type GetFiltersOpts, + getMicroFilters, isMicrofilter, matchDittoFilters, type MicroFilter,