From 7e44fa414cb618bdae99e719943a5ae96e0f24da Mon Sep 17 00:00:00 2001 From: Jon Staab Date: Fri, 11 Apr 2025 09:21:55 -0700 Subject: [PATCH] Refactor dvm request and outbox loader --- packages/app/src/feeds.ts | 14 ++++------- packages/app/src/follows.ts | 2 +- packages/app/src/mutes.ts | 2 +- packages/app/src/pins.ts | 2 +- packages/app/src/profiles.ts | 2 +- packages/app/src/relaySelections.ts | 38 +++++++++++++++-------------- packages/dvm/src/request.ts | 35 +++++++++----------------- packages/net/src/request.ts | 2 +- 8 files changed, 42 insertions(+), 55 deletions(-) diff --git a/packages/app/src/feeds.ts b/packages/app/src/feeds.ts index 177b7b5..15715c8 100644 --- a/packages/app/src/feeds.ts +++ b/packages/app/src/feeds.ts @@ -2,7 +2,7 @@ import {nthEq, partition, race, now} from "@welshman/lib" import {createEvent, getPubkeyTagValues, TrustedEvent} from "@welshman/util" import {request, Tracker} from "@welshman/net" import {Scope, FeedController, RequestOpts, FeedOptions, DVMOpts, Feed} from "@welshman/feeds" -import {makeDvmRequest, DVMEvent} from "@welshman/dvm" +import {makeDvmRequest} from "@welshman/dvm" import {makeSecret, Nip01Signer} from "@welshman/signer" import {pubkey, signer} from "./session.js" import {Router, addMinimalFallbacks, getFilterSelections} from "./router.js" @@ -91,14 +91,10 @@ export const requestDVM = async ({kind, onEvent, ...request}: DVMOpts) => { tags.push(["param", "max_results", "200"]) } - const event = await $signer.sign(createEvent(kind, {tags})) - const req = makeDvmRequest({event, relays}) - - await new Promise(resolve => { - req.emitter.on(DVMEvent.Result, (url, event) => { - onEvent(event) - resolve() - }) + await makeDvmRequest({ + relays, + event: await $signer.sign(createEvent(kind, {tags})), + onResult: onEvent, }) } diff --git a/packages/app/src/follows.ts b/packages/app/src/follows.ts index 5c5cc96..fbc8a66 100644 --- a/packages/app/src/follows.ts +++ b/packages/app/src/follows.ts @@ -19,5 +19,5 @@ export const { name: "follows", store: follows, getKey: follows => follows.event.pubkey, - load: makeOutboxLoader([FOLLOWS]) + load: makeOutboxLoader(FOLLOWS) }) diff --git a/packages/app/src/mutes.ts b/packages/app/src/mutes.ts index cddbe57..ae94df6 100644 --- a/packages/app/src/mutes.ts +++ b/packages/app/src/mutes.ts @@ -25,5 +25,5 @@ export const { name: "mutes", store: mutes, getKey: mute => mute.event.pubkey, - load: makeOutboxLoader([MUTES]) + load: makeOutboxLoader(MUTES) }) diff --git a/packages/app/src/pins.ts b/packages/app/src/pins.ts index 9556172..e0fc5e8 100644 --- a/packages/app/src/pins.ts +++ b/packages/app/src/pins.ts @@ -19,5 +19,5 @@ export const { name: "pins", store: pins, getKey: pins => pins.event.pubkey, - load: makeOutboxLoader([PINS]) + load: makeOutboxLoader(PINS) }) diff --git a/packages/app/src/profiles.ts b/packages/app/src/profiles.ts index aa6b4c1..aa0aed2 100644 --- a/packages/app/src/profiles.ts +++ b/packages/app/src/profiles.ts @@ -22,7 +22,7 @@ export const { name: "profiles", store: profiles, getKey: profile => profile.event.pubkey, - load: makeOutboxLoader([PROFILE]), + load: makeOutboxLoader(PROFILE), }) export const displayProfileByPubkey = (pubkey: string | undefined) => diff --git a/packages/app/src/relaySelections.ts b/packages/app/src/relaySelections.ts index a33d492..0f5b965 100644 --- a/packages/app/src/relaySelections.ts +++ b/packages/app/src/relaySelections.ts @@ -37,28 +37,30 @@ export const getWriteRelayUrls = (list?: List): string[] => export type OutboxLoaderRequest = { pubkey: string relays: string[] + kind: number } -export const makeOutboxLoader = (kinds: number[]) => { - const loadOutboxRequest = batcher(200, (requests: OutboxLoaderRequest[]) => { - const router = Router.get() - const authors: string[] = [] - const scenarios = [router.Index()] +export const loadUsingOutbox = batcher(200, (requests: OutboxLoaderRequest[]) => { + const router = Router.get() + const authors: string[] = [] + const scenarios = [router.Index()] + const kinds = new Set() - for (const {pubkey, relays} of requests) { - authors.push(pubkey) - scenarios.push(router.FromPubkey(pubkey), router.FromRelays(relays)) - } + for (const {pubkey, relays, kind} of requests) { + kinds.add(kind) + authors.push(pubkey) + scenarios.push(router.FromPubkey(pubkey), router.FromRelays(relays)) + } - const filters = [{authors, kinds}] - const relays = router.merge(scenarios).getUrls() - const promise = request({filters, relays, autoClose: true}) + const relays = router.merge(scenarios).getUrls() + const filters = [{authors, kinds: Array.from(kinds)}] + const promise = request({filters, relays, autoClose: true}) - return requests.map(always(promise)) - }) + return requests.map(always(promise)) +}) - return (pubkey: string, relays: string[]) => loadOutboxRequest({pubkey, relays}) -} +export const makeOutboxLoader = (kind: number) => + (pubkey: string, relays: string[]) => loadUsingOutbox({pubkey, relays, kind}) export const relaySelections = deriveEventsMapped(repository, { filters: [{kinds: [RELAYS]}], @@ -74,7 +76,7 @@ export const { name: "relaySelections", store: relaySelections, getKey: relaySelections => relaySelections.event.pubkey, - load: makeOutboxLoader([RELAYS]), + load: makeOutboxLoader(RELAYS), }) export const inboxRelaySelections = deriveEventsMapped(repository, { @@ -91,5 +93,5 @@ export const { name: "inboxRelaySelections", store: inboxRelaySelections, getKey: inboxRelaySelections => inboxRelaySelections.event.pubkey, - load: makeOutboxLoader([INBOX_RELAYS]), + load: makeOutboxLoader(INBOX_RELAYS), }) diff --git a/packages/dvm/src/request.ts b/packages/dvm/src/request.ts index 72e543c..49e5182 100644 --- a/packages/dvm/src/request.ts +++ b/packages/dvm/src/request.ts @@ -2,51 +2,42 @@ import {Emitter, now} from "@welshman/lib" import {TrustedEvent, SignedEvent, Filter} from "@welshman/util" import {request, publish, AdapterContext} from "@welshman/net" -export enum DVMEvent { - Progress = "progress", - Result = "result", -} - export type DVMRequestOptions = { event: SignedEvent relays: string[] timeout?: number autoClose?: boolean - reportProgress?: boolean context?: AdapterContext + onResult?: (event: TrustedEvent, url: string) => void + onProgress?: (event: TrustedEvent, url: string) => void } -export type DVMRequest = { - options: DVMRequestOptions - emitter: Emitter -} - -export const makeDvmRequest = (options: DVMRequestOptions) => { - const emitter = new Emitter() +export const requestDvmResponse = (options: DVMRequestOptions) => { const { event, relays, context, timeout = 30_000, autoClose = true, - reportProgress = true, + onResult, + onProgress, } = options const kind = event.kind + 1000 - const kinds = reportProgress ? [kind, 7000] : [kind] + const kinds = onProgress ? [kind, 7000] : [kind] const filters: Filter[] = [{kinds, since: now() - 60, "#e": [event.id]}] const abortController = new AbortController() const signal = AbortSignal.any([abortController.signal, AbortSignal.timeout(timeout)]) - request({ + return request({ signal, relays, filters, context, onEvent: (event: TrustedEvent, url: string) => { if (event.kind === 7000) { - emitter.emit(DVMEvent.Progress, url, event) + onProgress?.(event, url) } else { - emitter.emit(DVMEvent.Result, url, event) + onResult?.(event, url) if (autoClose) { abortController.abort() @@ -54,9 +45,7 @@ export const makeDvmRequest = (options: DVMRequestOptions) => { } }, }) - - publish({relays, event, timeout, context}) - - - return {options, emitter} as DVMRequest } + +export const makeDvmRequest = (options: DVMRequestOptions) => + Promise.all([publish(options), requestDvmResponse(options)]) diff --git a/packages/net/src/request.ts b/packages/net/src/request.ts index 88cf2f6..00b8056 100644 --- a/packages/net/src/request.ts +++ b/packages/net/src/request.ts @@ -297,7 +297,7 @@ export const makeLoader = (options: LoaderOptions) => } ) - return allRequests.map(r => resultsByRequest.get(r)) + return allRequests.map(r => resultsByRequest.get(r)!) }) export const load = makeLoader({delay: 200, timeout: 3000, threshold: 0.5})