Attempt to make repository more reactive

This commit is contained in:
Jon Staab
2024-05-15 11:44:19 -07:00
parent 2a2b6b8fec
commit 94e1d8ad52
2 changed files with 37 additions and 36 deletions
+2 -1
View File
@@ -45,6 +45,7 @@ export const REMIX = 1808
export const NOSTROCKER_PROBLEM = 1971
export const REPORT = 1984
export const LABEL = 1985
export const REVIEW = 1986
export const APPROVAL = 4550
export const DVM_REQUEST_TEXT_EXTRACTION = 5000
export const DVM_REQUEST_TEXT_SUMMARY = 5001
@@ -127,7 +128,7 @@ export const LONG_FORM = 30023
export const LONG_FORM_DRAFT = 30024
export const APPLICATION = 30078
export const LIVE_EVENT = 30311
export const STATUSES = 30315
export const STATUS = 30315
export const CLASSIFIED = 30402
export const DRAFT_CLASSIFIED = 30403
export const AUDIO = 31337
+35 -35
View File
@@ -1,6 +1,6 @@
import {throttle} from 'throttle-debounce'
import type {IReadable, Subscriber, Invalidator} from '@welshman/lib'
import {Derived, Emitter, sortBy, customStore, inc, first, always, chunk, sleep, uniq, omit, now, range, identity} from '@welshman/lib'
import {Derived, Emitter, sortBy, customStore, inc, first, chunk, sleep, uniq, omit, now, range, identity} from '@welshman/lib'
import {DELETE} from './Kinds'
import {EPOCH, matchFilter, getIdFilters, matchFilters} from './Filters'
import {isReplaceable, isTrustedEvent, getAddress} from './Events'
@@ -65,28 +65,30 @@ export class Repository extends Emitter implements IReadable<TrustedEvent[]> {
return new Derived<TrustedEvent[]>(this, identity, t)
}
filter(getFilters: () => Filter[]) {
const getValue = () => Array.from(this.query(getFilters()))
filter(filters: Filter[], {includeDeleted = false} = {}) {
const getValue = () => Array.from(this.query(filters, {includeDeleted}))
return customStore<TrustedEvent[]>({
get: getValue,
start: setValue => {
const onEvent = (event: TrustedEvent) => {
if (matchFilters(getFilters(), event)) {
if (matchFilters(filters, event)) {
setValue(getValue())
}
}
const onDelete = () => {
const onRefresh = () => {
setValue(getValue())
}
onRefresh()
this.on('event', onEvent)
this.on('delete', onDelete)
this.on('delete', onRefresh)
return () => {
this.off('event', onEvent)
this.off('delete', onDelete)
this.off('delete', onRefresh)
}
},
})
@@ -128,10 +130,10 @@ export class Repository extends Emitter implements IReadable<TrustedEvent[]> {
}
watchEvent(idOrAddress: string) {
return this.filter(always(getIdFilters([idOrAddress]))).derived(first)
return this.filter(getIdFilters([idOrAddress]), {includeDeleted: true}).derived(first)
}
*query(filters: Filter[]) {
*query(filters: Filter[], {includeDeleted = false} = {}) {
for (let filter of filters) {
let events: TrustedEvent[] = Array.from(this.eventsById.values())
@@ -171,7 +173,11 @@ export class Repository extends Emitter implements IReadable<TrustedEvent[]> {
break
}
if (!this.isDeleted(event) && matchFilter(filter, event)) {
if (!includeDeleted && this.isDeleted(event)) {
continue
}
if (matchFilter(filter, event)) {
yield event
i += 1
}
@@ -195,12 +201,7 @@ export class Repository extends Emitter implements IReadable<TrustedEvent[]> {
return
}
this.eventsById.set(event.id, event)
if (isReplaceable(event)) {
this.eventsByAddress.set(address, event)
}
// Delete our duplicate first
if (duplicate) {
this.eventsById.delete(duplicate.id)
@@ -209,19 +210,26 @@ export class Repository extends Emitter implements IReadable<TrustedEvent[]> {
}
}
// Now add our new event
this.eventsById.set(event.id, event)
if (isReplaceable(event)) {
this.eventsByAddress.set(address, event)
}
// Update our timestamp and author indexes
this._updateIndex(this.eventsByDay, getDay(event.created_at), event, duplicate)
this._updateIndex(this.eventsByAuthor, event.pubkey, event, duplicate)
// Store our event by tags
// Update our tag indexes
for (const tag of event.tags) {
if (tag[0].length === 1) {
this._updateIndex(this.eventsByTag, tag.slice(0, 2).join(':'), event, duplicate)
// If this is a delete event, the tag value is an id or address. Track when it was
// deleted so that replaceables can be restored.
if (event.kind === DELETE) {
const id = tag[1]
const ts = Math.max(event.created_at, this.deletes.get(tag[1]) || 0)
this.deletes.set(id, ts)
this.deletes.set(tag[1], Math.max(event.created_at, this.deletes.get(tag[1]) || 0))
}
}
}
@@ -238,21 +246,13 @@ export class Repository extends Emitter implements IReadable<TrustedEvent[]> {
}
isDeleted(event: TrustedEvent) {
const idDeletedAt = this.deletes.get(event.id) || 0
const deletedAt = (
this.deletes.get(event.id) ||
this.deletes.get(getAddress(event)) ||
0
)
if (idDeletedAt > event.created_at) {
return true
}
if (isReplaceable(event)) {
const addressDeletedAt = this.deletes.get(getAddress(event)) || 0
if (addressDeletedAt > event.created_at) {
return true
}
}
return false
return deletedAt > event.created_at
}
// Utilities