feat(media-streaming): deepen telemetry, ledger, and orchestrator
Session history and stall ranking, contribution percentile snapshots, enterprise region SLA helpers, and latency target configuration. Co-authored-by: Cursor <[email protected]>
This commit is contained in:
@@ -58,6 +58,23 @@ class HyperP2PContributionLedger extends EventEmitter {
|
||||
return this._ledger.delete(assertPeerId(peerId))
|
||||
}
|
||||
|
||||
rankPercentile (peerId) {
|
||||
const id = assertPeerId(peerId)
|
||||
const bal = this.balance(id)
|
||||
const all = [...this._ledger.values()].map((r) => r.bytes).sort((a, b) => a - b)
|
||||
if (!all.length) return 0
|
||||
const below = all.filter((b) => b < bal).length
|
||||
return below / all.length
|
||||
}
|
||||
|
||||
toSnapshot () {
|
||||
return [...this._ledger.values()].map((r) => ({
|
||||
peerId: r.peerId,
|
||||
bytes: r.bytes,
|
||||
streams: [...r.streams]
|
||||
}))
|
||||
}
|
||||
|
||||
_gossip (payload) {
|
||||
if (this._peerMsgs) {
|
||||
gossipSend(this, payload)
|
||||
|
||||
@@ -81,6 +81,20 @@ class HyperP2PEnterpriseOrchestrator extends EventEmitter {
|
||||
return n
|
||||
}
|
||||
|
||||
removeRegion (region) {
|
||||
return this._regions.delete(String(region))
|
||||
}
|
||||
|
||||
setSla ({ targetUptime, maxStallRate } = {}) {
|
||||
if (targetUptime != null) this._sla.targetUptime = targetUptime
|
||||
if (maxStallRate != null) this._sla.maxStallRate = maxStallRate
|
||||
return { ...this._sla }
|
||||
}
|
||||
|
||||
regionNames () {
|
||||
return [...this._regions.keys()]
|
||||
}
|
||||
|
||||
getStats () {
|
||||
return mediaStats(this._stats, PROTOCOL, { regions: this._regions.size })
|
||||
}
|
||||
|
||||
@@ -72,6 +72,11 @@ class HyperP2PLatencyOptimizer extends EventEmitter {
|
||||
return glass <= this.targetGlassMs
|
||||
}
|
||||
|
||||
setTargetGlassMs (ms) {
|
||||
this.targetGlassMs = Math.max(100, ms | 0)
|
||||
return this.targetGlassMs
|
||||
}
|
||||
|
||||
getStats () {
|
||||
return mediaStats(this._stats, PROTOCOL, { paths: this._paths.size })
|
||||
}
|
||||
|
||||
@@ -77,6 +77,25 @@ class HyperP2PStreamTelemetry extends EventEmitter {
|
||||
return [...this._sessions.keys()]
|
||||
}
|
||||
|
||||
history (sessionId, limit = 32) {
|
||||
const hist = this._sessions.get(String(sessionId))
|
||||
if (!hist) return []
|
||||
return hist.slice(-Math.max(0, limit | 0))
|
||||
}
|
||||
|
||||
clearSession (sessionId) {
|
||||
return this._sessions.delete(String(sessionId))
|
||||
}
|
||||
|
||||
worstStalls (limit = 5) {
|
||||
const ranked = []
|
||||
for (const [sessionId, hist] of this._sessions) {
|
||||
const stalls = hist.reduce((s, h) => s + h.stallCount, 0)
|
||||
ranked.push({ sessionId, stalls })
|
||||
}
|
||||
return ranked.sort((a, b) => b.stalls - a.stalls).slice(0, limit)
|
||||
}
|
||||
|
||||
getStats () {
|
||||
return mediaStats(this._stats, PROTOCOL, { sessions: this._sessions.size })
|
||||
}
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
{
|
||||
"name": "hyper-p2p-stream-telemetry",
|
||||
"version": "0.0.0-scaffold",
|
||||
"version": "0.3.1",
|
||||
"lockfileVersion": 3,
|
||||
"requires": true,
|
||||
"packages": {
|
||||
"": {
|
||||
"name": "hyper-p2p-stream-telemetry",
|
||||
"version": "0.0.0-scaffold",
|
||||
"version": "0.3.1",
|
||||
"license": "Apache-2.0",
|
||||
"dependencies": {
|
||||
"b4a": "^1.6.7",
|
||||
|
||||
Reference in New Issue
Block a user