Files
welshman/packages/app/src/sync.ts
T

66 lines
1.7 KiB
TypeScript

import type {Filter} from "@welshman/util"
import {isSignedEvent} from "@welshman/util"
import {
push as basePush,
pull as basePull,
sync as baseSync,
pushWithoutNegentropy,
pullWithoutNegentropy,
syncWithoutNegentropy,
} from "@welshman/net"
import {repository} from "./core.js"
import {relaysByUrl} from "./relays.js"
const query = (filters: Filter[]) =>
repository.query(filters, {shouldSort: filters.every(f => f.limit === undefined)})
export const hasNegentropy = (url: string) => {
const p = relaysByUrl.get().get(url)?.profile
if (p?.supported_nips?.includes(77)) return true
if (p?.software?.includes("strfry") && !p?.version?.match(/^0\./)) return true
return false
}
export type AppSyncOpts = {
relays: string[]
filters: Filter[]
}
export const pull = async ({relays, filters}: AppSyncOpts) => {
const events = query(filters)
await Promise.all(
relays.map(async relay => {
await (hasNegentropy(relay)
? basePull({filters, events, relays: [relay]})
: pullWithoutNegentropy({filters, relays: [relay]}))
}),
)
}
export const push = async ({relays, filters}: AppSyncOpts) => {
const events = query(filters).filter(isSignedEvent)
await Promise.all(
relays.map(async relay => {
await (hasNegentropy(relay)
? basePush({filters, events, relays: [relay]})
: pushWithoutNegentropy({events, relays: [relay]}))
}),
)
}
export const sync = async ({relays, filters}: AppSyncOpts) => {
const events = query(filters).filter(isSignedEvent)
await Promise.all(
relays.map(async relay => {
await (hasNegentropy(relay)
? baseSync({filters, events, relays: [relay]})
: syncWithoutNegentropy({filters, events, relays: [relay]}))
}),
)
}