Files
peardock/server/core/peer-registry.js
T
snxraven fa99bd8c6e Harden server logging and production boot experience
Replace ad-hoc console output with a structured logger (pretty/JSON,
levels, redaction, optional file rotation), a clean startup banner with
Docker/feature probes, graceful shutdown signals, and slow-RPC warnings.
2026-07-10 23:59:13 -04:00

75 lines
1.4 KiB
JavaScript

/**
* Tracks live ProtomuxRPC sessions for broadcast and cleanup.
*/
import logger from '../utils/logger.js'
const log = logger.child('peers')
export class PeerRegistry {
constructor() {
/** @type {Map<string, import('../rpc/session.js').PeerSession>} */
this.sessions = new Map()
}
/**
* @param {import('../rpc/session.js').PeerSession} session
*/
add(session) {
this.sessions.set(session.id, session)
}
/**
* @param {string} id
*/
remove(id) {
this.sessions.delete(id)
}
/**
* @param {string} id
*/
get(id) {
return this.sessions.get(id) || null
}
get size() {
return this.sessions.size
}
[Symbol.iterator]() {
return this.sessions.values()
}
/**
* Fire a push event on every open session.
* @param {string} method
* @param {unknown} payload
*/
broadcast(method, payload) {
for (const session of this.sessions.values()) {
try {
session.push(method, payload)
} catch (err) {
log.debug('Broadcast failed', {
peerId: session.id.slice(0, 12),
method,
error: err.message,
})
}
}
}
clear() {
for (const session of this.sessions.values()) {
try {
session.destroy()
} catch {
// ignore
}
}
this.sessions.clear()
}
}
export const peers = new PeerRegistry()