Fix some bugs

This commit is contained in:
Jon Staab
2025-11-25 14:54:10 -08:00
parent 92af4dcfde
commit 52785afb10
2 changed files with 36 additions and 44 deletions
-5
View File
@@ -64,11 +64,6 @@ export const not = (x: any, ...args: unknown[]) => !x
export const equals = (a: any, b: any) => { export const equals = (a: any, b: any) => {
if (a === b) return true 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 (a instanceof Set) {
if (!(b instanceof Set) || a.size !== b.size) { if (!(b instanceof Set) || a.size !== b.size) {
return false return false
+36 -39
View File
@@ -77,13 +77,14 @@ export const makeDeriveEvent = ({
onDerive?.(filters, ...args) onDerive?.(filters, ...args)
return readable<Maybe<TrustedEvent>>(undefined, set => { return readable<Maybe<TrustedEvent>>(undefined, set => {
const event = first(repository.query(filters, {includeDeleted})) let event = first(repository.query(filters, {includeDeleted}))
set(event) set(event)
return on(repository, "update", ({added, removed}: RepositoryUpdate) => { return on(repository, "update", ({added, removed}: RepositoryUpdate) => {
for (const event of added) { for (const newEvent of added) {
if (matchFilters(filters, event)) { if (matchFilters(filters, newEvent)) {
event = newEvent
set(event) set(event)
} }
} }
@@ -226,19 +227,21 @@ export const deriveEventsByIdForUrl = ({
}: DeriveEventsByIdForUrlOptions) => { }: DeriveEventsByIdForUrlOptions) => {
const eventsById: EventsById = new Map() const eventsById: EventsById = new Map()
const initialize = () => { return readable(eventsById, set => {
const initialIds = Array.from(tracker.getIds(url)) const reset = () => {
const initialFilters = filters.map(assoc("ids", initialIds)) const initialIds = Array.from(tracker.getIds(url))
const initialFilters = filters.map(assoc("ids", initialIds))
for (const event of repository.query(initialFilters, {includeDeleted})) { eventsById.clear()
eventsById.set(event.id, event)
for (const event of repository.query(initialFilters, {includeDeleted})) {
eventsById.set(event.id, event)
}
set(eventsById)
} }
return eventsById reset()
}
return readable(initialize(), set => {
set(initialize())
const unsubscribers = [ const unsubscribers = [
on(repository, "update", ({added, removed}: RepositoryUpdate) => { on(repository, "update", ({added, removed}: RepositoryUpdate) => {
@@ -276,15 +279,8 @@ export const deriveEventsByIdForUrl = ({
set(eventsById) set(eventsById)
} }
}), }),
on(tracker, "load", () => { on(tracker, "load", reset),
eventsById.clear() on(tracker, "clear", reset),
set(initialize())
}),
on(tracker, "clear", () => {
eventsById.clear()
set(eventsById)
}),
] ]
return () => unsubscribers.forEach(call) return () => unsubscribers.forEach(call)
@@ -330,18 +326,20 @@ export const deriveItemsByKey = <T>({
deferred.set(event.id, itemOrPromise) 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) { itemsByKey.set(key, item)
const key = getKey(item) idsByKey.set(key, event.id)
keysById.set(event.id, key)
itemsByKey.set(key, item) set(itemsByKey)
idsByKey.set(key, event.id) }
keysById.set(event.id, key) } finally {
deferred.delete(event.id)
set(itemsByKey)
} }
} }
@@ -350,16 +348,15 @@ export const deriveItemsByKey = <T>({
} }
return on(repository, "update", ({added, removed}: RepositoryUpdate) => { return on(repository, "update", ({added, removed}: RepositoryUpdate) => {
let dirty = false
for (const event of added) { for (const event of added) {
if (matchFilters(filters, event)) { if (matchFilters(filters, event)) {
addEvent(event) addEvent(event)
dirty = true
} }
} }
if (!includeDeleted) { if (!includeDeleted) {
let dirty = false
for (const id of removed) { for (const id of removed) {
const key = mapPop(id, keysById) const key = mapPop(id, keysById)
@@ -369,10 +366,10 @@ export const deriveItemsByKey = <T>({
dirty = true dirty = true
} }
} }
}
if (dirty) { if (dirty) {
set(itemsByKey) set(itemsByKey)
}
} }
}) })
}) })
@@ -427,7 +424,7 @@ export const makeLoadItem = <T>(
const stale = getItem(key) const stale = getItem(key)
const fetched = getFetched(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) { if (stale && fetched > now() - timeout) {
return stale return stale
} }
@@ -458,7 +455,7 @@ export const makeLoadItem = <T>(
try { try {
item = await promise item = await promise
} catch (e) { } catch (e) {
console.warn(`Failed to load ${name} item ${key}`, e) console.warn(`Failed to load item ${key}`, e)
} finally { } finally {
pending.delete(key) pending.delete(key)
} }