From 96e6bd18b484d50da4cfe344b502a5a8acfc84fd Mon Sep 17 00:00:00 2001 From: Alex Gleason Date: Thu, 28 Dec 2023 00:15:51 -0600 Subject: [PATCH] queries: pull from memorelay when applicable, optimize --- src/queries.ts | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/src/queries.ts b/src/queries.ts index 9e7b4ce..48aeaf4 100644 --- a/src/queries.ts +++ b/src/queries.ts @@ -1,6 +1,6 @@ import * as eventsDB from '@/db/events.ts'; import { type Event, findReplyTag } from '@/deps.ts'; -import { AuthorMicrofilter, type DittoFilter, type Relation } from '@/filter.ts'; +import { type AuthorMicrofilter, type DittoFilter, type IdMicrofilter, type Relation } from '@/filter.ts'; import * as mixer from '@/mixer.ts'; import { reqmeister } from '@/reqmeister.ts'; import { memorelay } from '@/db/memorelay.ts'; @@ -20,12 +20,25 @@ const getEvent = async ( opts: GetEventOpts = {}, ): Promise | undefined> => { const { kind, relations, signal = AbortSignal.timeout(1000) } = opts; + const microfilter: IdMicrofilter = { ids: [id] }; + + let event: Event | undefined; + + [event] = await memorelay.getFilters([microfilter], opts); + + if (event && !relations) return event; + const filter: DittoFilter = { ids: [id], relations, limit: 1 }; if (kind) { filter.kinds = [kind]; } - const [event] = await mixer.getFilters([filter], { limit: 1, signal }); - return event; + + event = await mixer.getFilters([filter], { limit: 1, signal }) + .then((events) => events[0] || event); + + if (event) return event; + + return await reqmeister.req(microfilter).catch(() => event) as Event | undefined; }; /** Get a Nostr `set_medatadata` event for a user's pubkey. */ @@ -37,16 +50,16 @@ const getAuthor = async (pubkey: string, opts: GetEventOpts<0> = {}): Promise events[0] || event); if (event) return event; - return reqmeister.req({ kinds: [0], authors: [pubkey] }).catch(() => undefined); + return reqmeister.req(microfilter).catch(() => event); }; /** Get users the given pubkey follows. */