91 lines
2.9 KiB
TypeScript
91 lines
2.9 KiB
TypeScript
export * from "./blossom.js"
|
|
export * from "./context.js"
|
|
export * from "./core.js"
|
|
export * from "./commands.js"
|
|
export * from "./feeds.js"
|
|
export * from "./follows.js"
|
|
export * from "./handles.js"
|
|
export * from "./mutes.js"
|
|
export * from "./plaintext.js"
|
|
export * from "./profiles.js"
|
|
export * from "./pins.js"
|
|
export * from "./relays.js"
|
|
export * from "./relaySelections.js"
|
|
export * from "./inboxRelaySelections.js"
|
|
export * from "./search.js"
|
|
export * from "./session.js"
|
|
export * from "./sync.js"
|
|
export * from "./tags.js"
|
|
export * from "./thunk.js"
|
|
export * from "./topics.js"
|
|
export * from "./user.js"
|
|
export * from "./wot.js"
|
|
export * from "./zappers.js"
|
|
|
|
import {derived} from "svelte/store"
|
|
import {sortBy, throttleWithValue, tryCatch} from "@welshman/lib"
|
|
import {isEphemeralKind, isDVMKind, RelayMode, getRelaysFromList} from "@welshman/util"
|
|
import {routerContext} from "@welshman/router"
|
|
import {Pool, SocketEvent, isRelayEvent, netContext} from "@welshman/net"
|
|
import {pubkey} from "./session.js"
|
|
import {repository, tracker} from "./core.js"
|
|
import {Relay, relays, loadRelay, trackRelayStats, getRelayQuality} from "./relays.js"
|
|
import {relaySelectionsByPubkey} from "./relaySelections.js"
|
|
import {inboxRelaySelectionsByPubkey} from "./inboxRelaySelections.js"
|
|
|
|
// Sync relays with our database
|
|
|
|
Pool.get().subscribe(socket => {
|
|
loadRelay(socket.url)
|
|
trackRelayStats(socket)
|
|
|
|
socket.on(SocketEvent.Receive, message => {
|
|
if (isRelayEvent(message)) {
|
|
const event = message[2]
|
|
|
|
if (
|
|
!isEphemeralKind(event.kind) &&
|
|
!isDVMKind(event.kind) &&
|
|
netContext.isEventValid(event, socket.url)
|
|
) {
|
|
tracker.track(event.id, socket.url)
|
|
repository.publish(event)
|
|
}
|
|
}
|
|
})
|
|
})
|
|
|
|
// Configure the router and add a few other relay utils
|
|
|
|
const _relayGetter = (fn?: (relay: Relay) => any) =>
|
|
throttleWithValue(200, () => {
|
|
let _relays = relays.get()
|
|
|
|
if (fn) {
|
|
_relays = _relays.filter(fn)
|
|
}
|
|
|
|
return sortBy(r => -getRelayQuality(r.url), _relays)
|
|
.slice(0, 5)
|
|
.map(r => r.url)
|
|
})
|
|
|
|
export const getPubkeyRelays = (pubkey: string, mode?: RelayMode) =>
|
|
mode === RelayMode.Inbox
|
|
? getRelaysFromList(inboxRelaySelectionsByPubkey.get().get(pubkey))
|
|
: getRelaysFromList(relaySelectionsByPubkey.get().get(pubkey), mode)
|
|
|
|
export const derivePubkeyRelays = (pubkey: string, mode?: RelayMode) =>
|
|
mode === RelayMode.Inbox
|
|
? derived(inboxRelaySelectionsByPubkey, $m => getRelaysFromList($m.get(pubkey)))
|
|
: derived(relaySelectionsByPubkey, $m => getRelaysFromList($m.get(pubkey), mode))
|
|
|
|
routerContext.getUserPubkey = () => pubkey.get()
|
|
routerContext.getPubkeyRelays = getPubkeyRelays
|
|
routerContext.getRelayQuality = getRelayQuality
|
|
routerContext.getDefaultRelays = _relayGetter()
|
|
routerContext.getIndexerRelays = _relayGetter()
|
|
routerContext.getSearchRelays = _relayGetter(r =>
|
|
tryCatch(() => r.profile?.supported_nips?.includes(50)),
|
|
)
|