From 412f71599ade7a94d6e5b9a58a5337deb7e1290b Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Thu, 4 Jan 2024 01:44:56 -0600 Subject: [PATCH] Add hydrator module to hydrate relationships on events --- src/storages/hydrate.ts | 26 ++++++++++++++++++++++++++ src/storages/search-store.ts | 14 +++++--------- 2 files changed, 31 insertions(+), 9 deletions(-) create mode 100644 src/storages/hydrate.ts diff --git a/src/storages/hydrate.ts b/src/storages/hydrate.ts new file mode 100644 index 0000000..3edca14 --- /dev/null +++ b/src/storages/hydrate.ts @@ -0,0 +1,26 @@ +import { type DittoFilter } from '@/filter.ts'; +import { type DittoEvent, type EventStore } from '@/storages/types.ts'; + +interface HydrateEventOpts { + events: DittoEvent[]; + filters: DittoFilter[]; + storage: EventStore; +} + +/** Hydrate event relationships using the provided storage. */ +async function hydrateEvents(opts: HydrateEventOpts): Promise[]> { + const { events, filters, storage } = opts; + + if (filters.some((filter) => filter.relations?.includes('author'))) { + const pubkeys = new Set([...events].map((event) => event.pubkey)); + const authors = await storage.getEvents([{ kinds: [0], authors: [...pubkeys] }]); + + for (const event of events) { + event.author = authors.find((author) => author.pubkey === event.pubkey); + } + } + + return events; +} + +export { hydrateEvents }; diff --git a/src/storages/search-store.ts b/src/storages/search-store.ts index 7dd2de8..a289734 100644 --- a/src/storages/search-store.ts +++ b/src/storages/search-store.ts @@ -2,24 +2,28 @@ import { NiceRelay } from 'https://gitlab.com/soapbox-pub/nostr-machina/-/raw/5f import { Debug, type Event, type Filter } from '@/deps.ts'; import { type DittoFilter, normalizeFilters } from '@/filter.ts'; +import { hydrateEvents } from '@/storages/hydrate.ts'; import { type DittoEvent, type EventStore, type GetEventsOpts, type StoreEventOpts } from '@/storages/types.ts'; import { EventSet } from '@/utils/event-set.ts'; interface SearchStoreOpts { relay: string | undefined; fallback: EventStore; + hydrator?: EventStore; } class SearchStore implements EventStore { #debug = Debug('ditto:storages:search'); #fallback: EventStore; + #hydrator: EventStore; #relay: NiceRelay | undefined; supportedNips = [50]; constructor(opts: SearchStoreOpts) { this.#fallback = opts.fallback; + this.#hydrator = opts.hydrator ?? this; if (opts.relay) { this.#relay = new NiceRelay(opts.relay); @@ -53,15 +57,7 @@ class SearchStore implements EventStore { events.add(event); } - if (filters[0]?.relations?.includes('author')) { - const authorIds = new Set([...events].map((event) => event.pubkey)); - const authors = await this.getEvents([{ kinds: [0], authors: [...authorIds] }], opts); - for (const event of events) { - event.author = authors.find((author) => author.pubkey === event.pubkey); - } - } - - return [...events]; + return hydrateEvents({ events: [...events], filters, storage: this.#hydrator }); } else { this.#debug(`Searching for "${query}" locally...`); return this.#fallback.getEvents(filters, opts);