This commit is contained in:
@@ -9,20 +9,54 @@ export class PeerRegistry {
|
||||
constructor() {
|
||||
/** @type {Map<string, import('../rpc/session.js').PeerSession>} */
|
||||
this.sessions = new Map()
|
||||
/** @type {Set<(size: number, prevSize: number) => void>} */
|
||||
this._listeners = new Set()
|
||||
}
|
||||
|
||||
/**
|
||||
* Subscribe to peer count changes (add / remove / clear).
|
||||
* @param {(size: number, prevSize: number) => void} fn
|
||||
* @returns {() => void} unsubscribe
|
||||
*/
|
||||
onChange(fn) {
|
||||
if (typeof fn !== 'function') return () => {}
|
||||
this._listeners.add(fn)
|
||||
return () => {
|
||||
this._listeners.delete(fn)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {number} prevSize
|
||||
*/
|
||||
_emitChange(prevSize) {
|
||||
const size = this.sessions.size
|
||||
if (size === prevSize) return
|
||||
for (const fn of this._listeners) {
|
||||
try {
|
||||
fn(size, prevSize)
|
||||
} catch (err) {
|
||||
log.debug('onChange listener failed', { error: err?.message })
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {import('../rpc/session.js').PeerSession} session
|
||||
*/
|
||||
add(session) {
|
||||
const prev = this.sessions.size
|
||||
this.sessions.set(session.id, session)
|
||||
this._emitChange(prev)
|
||||
}
|
||||
|
||||
/**
|
||||
* @param {string} id
|
||||
*/
|
||||
remove(id) {
|
||||
this.sessions.delete(id)
|
||||
const prev = this.sessions.size
|
||||
const had = this.sessions.delete(id)
|
||||
if (had) this._emitChange(prev)
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -46,6 +80,7 @@ export class PeerRegistry {
|
||||
* @param {unknown} payload
|
||||
*/
|
||||
broadcast(method, payload) {
|
||||
if (this.sessions.size === 0) return
|
||||
for (const session of this.sessions.values()) {
|
||||
try {
|
||||
session.push(method, payload)
|
||||
@@ -60,6 +95,7 @@ export class PeerRegistry {
|
||||
}
|
||||
|
||||
clear() {
|
||||
const prev = this.sessions.size
|
||||
for (const session of this.sessions.values()) {
|
||||
try {
|
||||
session.destroy()
|
||||
@@ -68,6 +104,7 @@ export class PeerRegistry {
|
||||
}
|
||||
}
|
||||
this.sessions.clear()
|
||||
this._emitChange(prev)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user