Add ping policy

This commit is contained in:
Jon Staab
2026-01-06 21:18:15 -08:00
parent de9d137b57
commit c850ab405c
3 changed files with 40 additions and 155 deletions
+3 -2
View File
@@ -5,6 +5,7 @@ import {
TrustedEvent,
getRelaysFromList,
RelayMode,
Filter,
} from "@welshman/util"
import {
deriveItemsByKey,
@@ -52,9 +53,9 @@ export const deriveRelayList = makeDeriveItem(relayListsByPubkey, loadRelayList)
// Outbox loader
export const makeOutboxLoader =
(kind: number) =>
(kind: number, filter: Filter = {}) =>
async (pubkey: string, relayHints: string[] = []) => {
const filters = [{kinds: [kind], authors: [pubkey]}]
const filters = [{...filter, kinds: [kind], authors: [pubkey]}]
const relays = Router.get().FromRelays(relayHints).policy(addMinimalFallbacks).getUrls()
await Promise.all([
+30
View File
@@ -25,6 +25,35 @@ import {Unsubscriber} from "./util.js"
*/
export type SocketPolicy = (socket: Socket) => Unsubscriber
/**
* Sends a ping message every so often to ensure connection health
* @param socket - a Socket object
* @return a cleanup function
*/
export const socketPolicyPing = (socket: Socket) => {
let lastActivity = 0
const unsubscribers = [
on(socket, SocketEvent.Send, (message: ClientMessage) => {
lastActivity = Date.now()
}),
on(socket, SocketEvent.Receive, (message: ClientMessage) => {
lastActivity = Date.now()
}),
]
const interval = setInterval(() => {
if (socket.status === SocketStatus.Open && lastActivity < Date.now() - 30_000) {
socket._ws?.send('["PING"]')
}
}, 30_000)
return () => {
unsubscribers.forEach(call)
clearInterval(interval)
}
}
/**
* Handles auth-related message management:
* - Defers sending messages when a challenge is pending
@@ -232,6 +261,7 @@ export const makeSocketPolicyAuth = (options: SocketPolicyAuthOptions) => (socke
}
export const defaultSocketPolicies = [
socketPolicyPing,
socketPolicyAuthBuffer,
socketPolicyConnectOnSend,
socketPolicyCloseInactive,