forked from snxraven/peardock
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.
75 lines
1.4 KiB
JavaScript
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()
|