From 539804215665d141f526014042e6f924bab779b2 Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Wed, 27 Dec 2023 22:49:35 -0600 Subject: [PATCH] Add memorelay module --- src/db/memorelay.ts | 27 +++++++++++++++++++++++++++ src/filter.ts | 18 +++++++++++++++--- 2 files changed, 42 insertions(+), 3 deletions(-) create mode 100644 src/db/memorelay.ts diff --git a/src/db/memorelay.ts b/src/db/memorelay.ts new file mode 100644 index 00000000..a6dc2d97 --- /dev/null +++ b/src/db/memorelay.ts @@ -0,0 +1,27 @@ +import { Debug, type Event, type Filter, LRUCache } from '@/deps.ts'; +import { getFilterId, type GetFiltersOpts, isMicrofilter } from '@/filter.ts'; + +const debug = Debug('ditto:memorelay'); +const events = new LRUCache({ max: 1000 }); + +/** Get events from memory. */ +function getFilters(filters: Filter[], opts: GetFiltersOpts = {}): Promise[]> { + if (opts.signal?.aborted) return Promise.resolve([]); + if (!filters.length) return Promise.resolve([]); + debug('REQ', JSON.stringify(filters)); + + const results: Event[] = []; + + for (const filter of filters) { + if (isMicrofilter(filter)) { + const event = events.get(getFilterId(filter)); + if (event) { + results.push(event as Event); + } + } + } + + return Promise.resolve(results); +} + +export { getFilters }; diff --git a/src/filter.ts b/src/filter.ts index 7178e2d7..f562a828 100644 --- a/src/filter.ts +++ b/src/filter.ts @@ -1,7 +1,7 @@ import { Conf } from '@/config.ts'; -import { type Event, type Filter, matchFilters, stringifyStable } from '@/deps.ts'; - -import type { EventData } from '@/types.ts'; +import { type Event, type Filter, matchFilters, stringifyStable, z } from '@/deps.ts'; +import { nostrIdSchema } from '@/schemas/nostr.ts'; +import { type EventData } from '@/types.ts'; /** Additional properties that may be added by Ditto to events. */ type Relation = 'author' | 'author_stats' | 'event_stats'; @@ -70,11 +70,23 @@ function eventToMicroFilter(event: Event): MicroFilter { } } +/** Microfilter schema. */ +const microFilterSchema = z.union([ + z.object({ ids: z.tuple([nostrIdSchema]) }).strict(), + z.object({ kinds: z.tuple([z.literal(0)]), authors: z.tuple([nostrIdSchema]) }).strict(), +]); + +/** Checks whether the filter is a microfilter. */ +function isMicrofilter(filter: Filter): filter is MicroFilter { + return microFilterSchema.safeParse(filter).success; +} + export { type DittoFilter, eventToMicroFilter, getFilterId, type GetFiltersOpts, + isMicrofilter, matchDittoFilters, type MicroFilter, type Relation,