From 17e23ffb33e11dfa26830e3fd58d0c57b3a86ef1 Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Tue, 9 Jun 2020 11:46:56 +0200 Subject: [PATCH] Convert the `ChunkedStreamManager.chunksNeededByRequest` property to a `Map` (containing `Set`s) Compared to regular `Object`s, `Map`s (and `Set`s) have a number of advantageous properties: Of particular importance in this case is the built-in iteration support, and that determining if the structure is empty is easy. --- src/core/chunked_stream.js | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/src/core/chunked_stream.js b/src/core/chunked_stream.js index 2ba358fe9..dfc8920d9 100644 --- a/src/core/chunked_stream.js +++ b/src/core/chunked_stream.js @@ -319,7 +319,7 @@ class ChunkedStreamManager { this.currRequestId = 0; - this.chunksNeededByRequest = Object.create(null); + this._chunksNeededByRequest = new Map(); this.requestsByChunk = Object.create(null); this.promisesByRequest = Object.create(null); this.progressiveDataLength = 0; @@ -384,15 +384,15 @@ class ChunkedStreamManager { _requestChunks(chunks) { const requestId = this.currRequestId++; - const chunksNeeded = Object.create(null); - this.chunksNeededByRequest[requestId] = chunksNeeded; + const chunksNeeded = new Set(); + this._chunksNeededByRequest.set(requestId, chunksNeeded); for (const chunk of chunks) { if (!this.stream.hasChunk(chunk)) { - chunksNeeded[chunk] = true; + chunksNeeded.add(chunk); } } - if (isEmptyObj(chunksNeeded)) { + if (chunksNeeded.size === 0) { return Promise.resolve(); } @@ -400,8 +400,7 @@ class ChunkedStreamManager { this.promisesByRequest[requestId] = capability; const chunksToRequest = []; - for (let chunk in chunksNeeded) { - chunk = chunk | 0; + for (const chunk of chunksNeeded) { if (!(chunk in this.requestsByChunk)) { this.requestsByChunk[chunk] = []; chunksToRequest.push(chunk); @@ -526,12 +525,12 @@ class ChunkedStreamManager { delete this.requestsByChunk[curChunk]; for (const requestId of requestIds) { - const chunksNeeded = this.chunksNeededByRequest[requestId]; - if (curChunk in chunksNeeded) { - delete chunksNeeded[curChunk]; + const chunksNeeded = this._chunksNeededByRequest.get(requestId); + if (chunksNeeded.has(curChunk)) { + chunksNeeded.delete(curChunk); } - if (!isEmptyObj(chunksNeeded)) { + if (chunksNeeded.size > 0) { continue; } loadedRequests.push(requestId);