Add util to derive repository store, modify tracker to track relays by id
This commit is contained in:
@@ -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[]}
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
@@ -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')
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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 = []
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user