From 52785afb10fb96d7498fa6c6378f96732181b45d Mon Sep 17 00:00:00 2001 From: Jon Staab Date: Tue, 25 Nov 2025 14:54:10 -0800 Subject: [PATCH] Fix some bugs --- packages/lib/src/Tools.ts | 5 --- packages/store/src/repository.ts | 75 +++++++++++++++----------------- 2 files changed, 36 insertions(+), 44 deletions(-) diff --git a/packages/lib/src/Tools.ts b/packages/lib/src/Tools.ts index 4608c29..8618b26 100644 --- a/packages/lib/src/Tools.ts +++ b/packages/lib/src/Tools.ts @@ -64,11 +64,6 @@ export const not = (x: any, ...args: unknown[]) => !x export const equals = (a: any, b: any) => { if (a === b) return true - if (a instanceof Set && b instanceof Set) { - a = Array.from(a) - b = Array.from(b) - } - if (a instanceof Set) { if (!(b instanceof Set) || a.size !== b.size) { return false diff --git a/packages/store/src/repository.ts b/packages/store/src/repository.ts index 30e6660..75dd53a 100644 --- a/packages/store/src/repository.ts +++ b/packages/store/src/repository.ts @@ -77,13 +77,14 @@ export const makeDeriveEvent = ({ onDerive?.(filters, ...args) return readable>(undefined, set => { - const event = first(repository.query(filters, {includeDeleted})) + let event = first(repository.query(filters, {includeDeleted})) set(event) return on(repository, "update", ({added, removed}: RepositoryUpdate) => { - for (const event of added) { - if (matchFilters(filters, event)) { + for (const newEvent of added) { + if (matchFilters(filters, newEvent)) { + event = newEvent set(event) } } @@ -226,19 +227,21 @@ export const deriveEventsByIdForUrl = ({ }: DeriveEventsByIdForUrlOptions) => { const eventsById: EventsById = new Map() - const initialize = () => { - const initialIds = Array.from(tracker.getIds(url)) - const initialFilters = filters.map(assoc("ids", initialIds)) + return readable(eventsById, set => { + const reset = () => { + const initialIds = Array.from(tracker.getIds(url)) + const initialFilters = filters.map(assoc("ids", initialIds)) - for (const event of repository.query(initialFilters, {includeDeleted})) { - eventsById.set(event.id, event) + eventsById.clear() + + for (const event of repository.query(initialFilters, {includeDeleted})) { + eventsById.set(event.id, event) + } + + set(eventsById) } - return eventsById - } - - return readable(initialize(), set => { - set(initialize()) + reset() const unsubscribers = [ on(repository, "update", ({added, removed}: RepositoryUpdate) => { @@ -276,15 +279,8 @@ export const deriveEventsByIdForUrl = ({ set(eventsById) } }), - on(tracker, "load", () => { - eventsById.clear() - set(initialize()) - }), - on(tracker, "clear", () => { - eventsById.clear() - - set(eventsById) - }), + on(tracker, "load", reset), + on(tracker, "clear", reset), ] return () => unsubscribers.forEach(call) @@ -330,18 +326,20 @@ export const deriveItemsByKey = ({ deferred.set(event.id, itemOrPromise) } - const item = await itemOrPromise + try { + const item = await itemOrPromise - deferred.delete(event.id) + if (item) { + const key = getKey(item) - if (item) { - const key = getKey(item) + itemsByKey.set(key, item) + idsByKey.set(key, event.id) + keysById.set(event.id, key) - itemsByKey.set(key, item) - idsByKey.set(key, event.id) - keysById.set(event.id, key) - - set(itemsByKey) + set(itemsByKey) + } + } finally { + deferred.delete(event.id) } } @@ -350,16 +348,15 @@ export const deriveItemsByKey = ({ } return on(repository, "update", ({added, removed}: RepositoryUpdate) => { - let dirty = false - for (const event of added) { if (matchFilters(filters, event)) { addEvent(event) - dirty = true } } if (!includeDeleted) { + let dirty = false + for (const id of removed) { const key = mapPop(id, keysById) @@ -369,10 +366,10 @@ export const deriveItemsByKey = ({ dirty = true } } - } - if (dirty) { - set(itemsByKey) + if (dirty) { + set(itemsByKey) + } } }) }) @@ -427,7 +424,7 @@ export const makeLoadItem = ( const stale = getItem(key) const fetched = getFetched(key) - // If we have an item, reload if it's stale + // If we have an item, reload if it's relatively recent if (stale && fetched > now() - timeout) { return stale } @@ -458,7 +455,7 @@ export const makeLoadItem = ( try { item = await promise } catch (e) { - console.warn(`Failed to load ${name} item ${key}`, e) + console.warn(`Failed to load item ${key}`, e) } finally { pending.delete(key) }