/** * 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} */ 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()