63 lines
1.5 KiB
TypeScript
63 lines
1.5 KiB
TypeScript
import {throttle} from "@welshman/lib"
|
|
import {verifyEvent, isEphemeralKind, isDVMKind} from "@welshman/util"
|
|
import {Repository} from "@welshman/relay"
|
|
import {Pool, Tracker, SocketEvent, isRelayEvent} from "@welshman/net"
|
|
import {custom} from "@welshman/store"
|
|
|
|
export const repository = Repository.getSingleton()
|
|
|
|
export const tracker = new Tracker()
|
|
|
|
Pool.getSingleton().subscribe(socket => {
|
|
socket.on(SocketEvent.Receive, message => {
|
|
if (isRelayEvent(message)) {
|
|
const event = message[2]
|
|
|
|
if (!isEphemeralKind(event.kind) && !isDVMKind(event.kind) && verifyEvent(event)) {
|
|
tracker.track(event.id, socket.url)
|
|
repository.publish(event)
|
|
}
|
|
}
|
|
})
|
|
})
|
|
|
|
// Adapt above objects to stores
|
|
|
|
export const makeRepositoryStore = ({throttle: t = 300}: {throttle?: number} = {}) =>
|
|
custom(
|
|
setter => {
|
|
let onUpdate = () => setter(repository)
|
|
|
|
if (t) {
|
|
onUpdate = throttle(t, onUpdate)
|
|
}
|
|
|
|
onUpdate()
|
|
repository.on("update", onUpdate)
|
|
|
|
return () => repository.off("update", onUpdate)
|
|
},
|
|
{
|
|
set: (other: Repository) => repository.load(other.dump()),
|
|
},
|
|
)
|
|
|
|
export const makeTrackerStore = ({throttle: t = 300}: {throttle?: number} = {}) =>
|
|
custom(
|
|
setter => {
|
|
let onUpdate = () => setter(tracker)
|
|
|
|
if (t) {
|
|
onUpdate = throttle(t, onUpdate)
|
|
}
|
|
|
|
onUpdate()
|
|
tracker.on("update", onUpdate)
|
|
|
|
return () => tracker.off("update", onUpdate)
|
|
},
|
|
{
|
|
set: (other: Tracker) => tracker.load(other.relaysById),
|
|
},
|
|
)
|