Fix some bugs
This commit is contained in:
@@ -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
|
||||||
|
|||||||
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user