diff --git a/packages/app/src/core.ts b/packages/app/src/core.ts index d3a54ab..ffc985a 100644 --- a/packages/app/src/core.ts +++ b/packages/app/src/core.ts @@ -7,6 +7,17 @@ import {custom} from "@welshman/store" export const repository = new Repository() +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 tracker = new Tracker() @@ -19,7 +30,7 @@ export const trackerStore = custom(setter => { return () => tracker.off('update', onUpdate) }, { - set: (other: Tracker) => tracker.load(other.data), + set: (other: Tracker) => tracker.load(other.relaysById), }) export type PartialSubscribeRequest = Partial & {filters: Filter[]} diff --git a/packages/app/src/plaintext.ts b/packages/app/src/plaintext.ts index c4091a8..9c05cd9 100644 --- a/packages/app/src/plaintext.ts +++ b/packages/app/src/plaintext.ts @@ -17,7 +17,15 @@ export const ensurePlaintext = async (e: TrustedEvent) => { const $signer = getSigner(getSession(e.pubkey)) 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) { setPlaintext(e, result) diff --git a/packages/app/src/storage.ts b/packages/app/src/storage.ts index 5930768..40f9763 100644 --- a/packages/app/src/storage.ts +++ b/packages/app/src/storage.ts @@ -161,7 +161,7 @@ export const storageAdapters = { let onUpdate = () => setter( migrate( - Array.from(tracker.data.entries()) + Array.from(tracker.relaysById.entries()) .map(([key, urls]) => ({key, value: Array.from(urls)})), options ) diff --git a/packages/net/src/Tracker.ts b/packages/net/src/Tracker.ts index 5e06cb5..5df36c1 100644 --- a/packages/net/src/Tracker.ts +++ b/packages/net/src/Tracker.ts @@ -1,7 +1,8 @@ -import {Emitter} from '@welshman/lib' +import {Emitter, addToMapKey} from '@welshman/lib' export class Tracker extends Emitter { - data = new Map>() + relaysById = new Map>() + idsByRelay = new Map>() constructor() { super() @@ -9,31 +10,27 @@ export class Tracker extends Emitter { this.setMaxListeners(100) } - getRelays = (eventId: string) => { - const relays = new Set() + getIds = (relay: string) => this.idsByRelay.get(relay) || new Set() - for (const relay of this.data.get(eventId) || []) { - relays.add(relay) - } + getRelays = (eventId: string) => this.relaysById.get(eventId) || new Set() - return relays - } - - hasRelay = (eventId: string, relay: string) => { - return this.getRelays(eventId).has(relay) - } + hasRelay = (eventId: string, relay: string) => this.relaysById.get(eventId)?.has(relay) 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) + ids.add(eventId) + + this.relaysById.set(eventId, relays) + this.idsByRelay.set(eventId, relays) - this.data.set(eventId, relays) this.emit('update') } track = (eventId: string, relay: string) => { - const seen = this.data.has(eventId) + const seen = this.relaysById.has(eventId) this.addRelay(eventId, relay) @@ -46,13 +43,24 @@ export class Tracker extends Emitter { } } - load = (data: Tracker['data']) => { - this.data = data + load = (relaysById: Tracker['relaysById']) => { + 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') } clear = () => { - this.data.clear() + this.relaysById.clear() + this.idsByRelay.clear() + this.emit('update') } } diff --git a/packages/util/src/Filters.ts b/packages/util/src/Filters.ts index bd6cd43..2ef6c95 100644 --- a/packages/util/src/Filters.ts +++ b/packages/util/src/Filters.ts @@ -155,7 +155,7 @@ export const getIdFilters = (idsOrAddresses: string[]) => { return filters } -export const getReplyFilters = (events: TrustedEvent[], filter: Filter) => { +export const getReplyFilters = (events: TrustedEvent[], filter: Filter = {}) => { const a = [] const e = []