feat(media-streaming): deepen peer selector and media chunker
Add bestPeer/weight tuning, chunk reassemble and stream listing for manual media-streaming module expansion. Co-authored-by: Cursor <[email protected]>
This commit is contained in:
@@ -85,6 +85,27 @@ class HyperP2PMediaChunker extends EventEmitter {
|
|||||||
return n
|
return n
|
||||||
}
|
}
|
||||||
|
|
||||||
|
reassemble (streamId) {
|
||||||
|
const parts = this.listChunks(streamId)
|
||||||
|
if (!parts.length) return b4a.alloc(0)
|
||||||
|
const total = parts.reduce((s, c) => s + c.byteLength, 0)
|
||||||
|
const out = b4a.alloc(total)
|
||||||
|
let off = 0
|
||||||
|
for (const c of parts) {
|
||||||
|
out.set(c.data, off)
|
||||||
|
off += c.byteLength
|
||||||
|
}
|
||||||
|
return out
|
||||||
|
}
|
||||||
|
|
||||||
|
chunkCount (streamId) {
|
||||||
|
return this.listChunks(streamId).length
|
||||||
|
}
|
||||||
|
|
||||||
|
streamIds () {
|
||||||
|
return [...new Set([...this._chunks.values()].map((c) => c.streamId))]
|
||||||
|
}
|
||||||
|
|
||||||
getStats () {
|
getStats () {
|
||||||
return mediaStats(this._stats, PROTOCOL, { stored: this._chunks.size })
|
return mediaStats(this._stats, PROTOCOL, { stored: this._chunks.size })
|
||||||
}
|
}
|
||||||
|
|||||||
+2
-2
@@ -1,12 +1,12 @@
|
|||||||
{
|
{
|
||||||
"name": "hyper-p2p-media-chunker",
|
"name": "hyper-p2p-media-chunker",
|
||||||
"version": "0.0.0-scaffold",
|
"version": "0.3.1",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "hyper-p2p-media-chunker",
|
"name": "hyper-p2p-media-chunker",
|
||||||
"version": "0.0.0-scaffold",
|
"version": "0.3.1",
|
||||||
"license": "Apache-2.0",
|
"license": "Apache-2.0",
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"b4a": "^1.6.7",
|
"b4a": "^1.6.7",
|
||||||
|
|||||||
@@ -83,6 +83,23 @@ class HyperP2PPeerSelectorStreaming extends EventEmitter {
|
|||||||
return this._peers.delete(assertPeerId(peerId))
|
return this._peers.delete(assertPeerId(peerId))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bestPeer () {
|
||||||
|
const ranked = this.rankPeers()
|
||||||
|
return ranked.length ? ranked[0] : null
|
||||||
|
}
|
||||||
|
|
||||||
|
setWeights (weights = {}) {
|
||||||
|
if (weights.upload != null) this.weights.upload = weights.upload
|
||||||
|
if (weights.latency != null) this.weights.latency = weights.latency
|
||||||
|
if (weights.stability != null) this.weights.stability = weights.stability
|
||||||
|
if (weights.load != null) this.weights.load = weights.load
|
||||||
|
return { ...this.weights }
|
||||||
|
}
|
||||||
|
|
||||||
|
peerCount () {
|
||||||
|
return this._peers.size
|
||||||
|
}
|
||||||
|
|
||||||
getStats () {
|
getStats () {
|
||||||
return mediaStats(this._stats, PROTOCOL, { peers: this._peers.size })
|
return mediaStats(this._stats, PROTOCOL, { peers: this._peers.size })
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user