From 22cbb9fe1c93de930ebddfc1d08c72ec10f2d114 Mon Sep 17 00:00:00 2001 From: Jon Staab Date: Tue, 4 Feb 2025 14:06:05 -0800 Subject: [PATCH] Handle thunks in feeds --- src/app/requests.ts | 43 +++++++++++++++++++++++++++++++++---------- 1 file changed, 33 insertions(+), 10 deletions(-) diff --git a/src/app/requests.ts b/src/app/requests.ts index e4794673..7dfe8f58 100644 --- a/src/app/requests.ts +++ b/src/app/requests.ts @@ -4,8 +4,16 @@ import {MESSAGE, DELETE, THREAD, COMMENT, matchFilters, getTagValues} from "@wel import type {TrustedEvent, Filter} from "@welshman/util" import {feedFromFilters, makeRelayFeed, makeIntersectionFeed} from "@welshman/feeds" import type {Subscription} from "@welshman/net" -import type {AppSyncOpts} from "@welshman/app" -import {subscribe, load, repository, pull, hasNegentropy, createFeedController} from "@welshman/app" +import type {AppSyncOpts, Thunk} from "@welshman/app" +import { + subscribe, + load, + repository, + pull, + hasNegentropy, + thunkWorker, + createFeedController, +} from "@welshman/app" import {createScroller} from "@lib/html" import {userRoomsByUrl, getUrlsForEvent} from "@app/state" @@ -50,7 +58,7 @@ export const makeFeed = ({ const buffer = writable([]) const events = writable(initialEvents) - const onEvent = (event: TrustedEvent) => { + const insertEvent = (event: TrustedEvent) => { buffer.update($buffer => { for (let i = 0; i < $buffer.length; i++) { if ($buffer[i].id === event.id) return $buffer @@ -61,17 +69,29 @@ export const makeFeed = ({ }) } - const deleteEvent = (e: TrustedEvent) => { - const ids = getTagValues(["e", "a"], e.tags) - + const removeEvents = (ids: string[]) => { buffer.update($buffer => $buffer.filter(e => !ids.includes(e.id))) events.update($events => $events.filter(e => !ids.includes(e.id))) } + const handleDelete = (e: TrustedEvent) => removeEvents(getTagValues(["e", "a"], e.tags)) + + const onThunk = (thunk: Thunk) => { + if (matchFilters(feedFilters, thunk.event)) { + insertEvent(thunk.event) + + thunk.controller.signal.addEventListener("abort", () => { + removeEvents([thunk.event.id]) + }) + } else if (thunk.event.kind === DELETE) { + handleDelete(thunk.event) + } + } + const ctrl = createFeedController({ useWindowing: true, feed: makeIntersectionFeed(makeRelayFeed(...relays), feedFromFilters(feedFilters)), - onEvent, + onEvent: insertEvent, onExhausted, }) @@ -79,8 +99,8 @@ export const makeFeed = ({ relays, filters: subscriptionFilters, onEvent: (e: TrustedEvent) => { - if (matchFilters(feedFilters, e)) onEvent(e) - if (e.kind === DELETE) deleteEvent(e) + if (matchFilters(feedFilters, e)) insertEvent(e) + if (e.kind === DELETE) handleDelete(e) }, }) @@ -99,11 +119,14 @@ export const makeFeed = ({ }, }) + thunkWorker.addGlobalHandler(onThunk) + return { events, cleanup: () => { - scroller.stop() sub.close() + scroller.stop() + thunkWorker.removeGlobalHandler(onThunk) }, } }