Add util to derive repository store, modify tracker to track relays by id

This commit is contained in:
Jon Staab
2024-10-10 13:10:50 -07:00
parent b8f4b29bb1
commit b5809b6f72
5 changed files with 50 additions and 23 deletions
+12 -1
View File
@@ -7,6 +7,17 @@ import {custom} from "@welshman/store"
export const repository = new Repository<TrustedEvent>() export const repository = new Repository<TrustedEvent>()
export const repositoryStore = custom(setter => {
const onUpdate = () => setter(repository)
onUpdate()
repository.on('update', onUpdate)
return () => repository.off('update', onUpdate)
}, {
set: (other: Repository) => repository.load(other.dump()),
})
export const relay = new Relay(repository) export const relay = new Relay(repository)
export const tracker = new Tracker() export const tracker = new Tracker()
@@ -19,7 +30,7 @@ export const trackerStore = custom(setter => {
return () => tracker.off('update', onUpdate) return () => tracker.off('update', onUpdate)
}, { }, {
set: (other: Tracker) => tracker.load(other.data), set: (other: Tracker) => tracker.load(other.relaysById),
}) })
export type PartialSubscribeRequest = Partial<SubscribeRequestWithHandlers> & {filters: Filter[]} export type PartialSubscribeRequest = Partial<SubscribeRequestWithHandlers> & {filters: Filter[]}
+9 -1
View File
@@ -17,7 +17,15 @@ export const ensurePlaintext = async (e: TrustedEvent) => {
const $signer = getSigner(getSession(e.pubkey)) const $signer = getSigner(getSession(e.pubkey))
if ($signer) { if ($signer) {
const result = await decrypt($signer, e.pubkey, e.content) let result
try {
result = await decrypt($signer, e.pubkey, e.content)
} catch (e: any) {
if (!String(e).match(/invalid base64/)) {
throw e
}
}
if (result) { if (result) {
setPlaintext(e, result) setPlaintext(e, result)
+1 -1
View File
@@ -161,7 +161,7 @@ export const storageAdapters = {
let onUpdate = () => let onUpdate = () =>
setter( setter(
migrate( migrate(
Array.from(tracker.data.entries()) Array.from(tracker.relaysById.entries())
.map(([key, urls]) => ({key, value: Array.from(urls)})), .map(([key, urls]) => ({key, value: Array.from(urls)})),
options options
) )
+27 -19
View File
@@ -1,7 +1,8 @@
import {Emitter} from '@welshman/lib' import {Emitter, addToMapKey} from '@welshman/lib'
export class Tracker extends Emitter { export class Tracker extends Emitter {
data = new Map<string, Set<string>>() relaysById = new Map<string, Set<string>>()
idsByRelay = new Map<string, Set<string>>()
constructor() { constructor() {
super() super()
@@ -9,31 +10,27 @@ export class Tracker extends Emitter {
this.setMaxListeners(100) this.setMaxListeners(100)
} }
getRelays = (eventId: string) => { getIds = (relay: string) => this.idsByRelay.get(relay) || new Set<string>()
const relays = new Set<string>()
for (const relay of this.data.get(eventId) || []) { getRelays = (eventId: string) => this.relaysById.get(eventId) || new Set<string>()
relays.add(relay)
}
return relays hasRelay = (eventId: string, relay: string) => this.relaysById.get(eventId)?.has(relay)
}
hasRelay = (eventId: string, relay: string) => {
return this.getRelays(eventId).has(relay)
}
addRelay = (eventId: string, relay: string) => { addRelay = (eventId: string, relay: string) => {
const relays = this.data.get(eventId) || new Set() const relays = this.relaysById.get(eventId) || new Set()
const ids = this.idsByRelay.get(relay) || new Set()
relays.add(relay) relays.add(relay)
ids.add(eventId)
this.relaysById.set(eventId, relays)
this.idsByRelay.set(eventId, relays)
this.data.set(eventId, relays)
this.emit('update') this.emit('update')
} }
track = (eventId: string, relay: string) => { track = (eventId: string, relay: string) => {
const seen = this.data.has(eventId) const seen = this.relaysById.has(eventId)
this.addRelay(eventId, relay) this.addRelay(eventId, relay)
@@ -46,13 +43,24 @@ export class Tracker extends Emitter {
} }
} }
load = (data: Tracker['data']) => { load = (relaysById: Tracker['relaysById']) => {
this.data = data this.relaysById.clear()
this.idsByRelay.clear()
for (const [id, relays] of relaysById.entries()) {
for (const relay of relays) {
addToMapKey(this.relaysById, id, relay)
addToMapKey(this.idsByRelay, relay, id)
}
}
this.emit('update') this.emit('update')
} }
clear = () => { clear = () => {
this.data.clear() this.relaysById.clear()
this.idsByRelay.clear()
this.emit('update') this.emit('update')
} }
} }
+1 -1
View File
@@ -155,7 +155,7 @@ export const getIdFilters = (idsOrAddresses: string[]) => {
return filters return filters
} }
export const getReplyFilters = (events: TrustedEvent[], filter: Filter) => { export const getReplyFilters = (events: TrustedEvent[], filter: Filter = {}) => {
const a = [] const a = []
const e = [] const e = []