From dda7a5d1b7888287cf7bb82995190d5f2cbbff7b Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Tue, 9 Jun 2020 16:06:26 +0200 Subject: [PATCH] Convert the `ChunkedStreamManager.requestsByChunk` property to a `Map` Compared to regular `Object`s, `Map`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 | 20 +++++++++++++------- 1 file changed, 13 insertions(+), 7 deletions(-) diff --git a/src/core/chunked_stream.js b/src/core/chunked_stream.js index dfc8920d9..7437ae391 100644 --- a/src/core/chunked_stream.js +++ b/src/core/chunked_stream.js @@ -320,7 +320,7 @@ class ChunkedStreamManager { this.currRequestId = 0; this._chunksNeededByRequest = new Map(); - this.requestsByChunk = Object.create(null); + this._requestsByChunk = new Map(); this.promisesByRequest = Object.create(null); this.progressiveDataLength = 0; this.aborted = false; @@ -401,11 +401,14 @@ class ChunkedStreamManager { const chunksToRequest = []; for (const chunk of chunksNeeded) { - if (!(chunk in this.requestsByChunk)) { - this.requestsByChunk[chunk] = []; + let requestIds = this._requestsByChunk.get(chunk); + if (!requestIds) { + requestIds = []; + this._requestsByChunk.set(chunk, requestIds); + chunksToRequest.push(chunk); } - this.requestsByChunk[chunk].push(requestId); + requestIds.push(requestId); } if (!chunksToRequest.length) { @@ -521,8 +524,11 @@ class ChunkedStreamManager { const loadedRequests = []; for (let curChunk = beginChunk; curChunk < endChunk; ++curChunk) { // The server might return more chunks than requested. - const requestIds = this.requestsByChunk[curChunk] || []; - delete this.requestsByChunk[curChunk]; + const requestIds = this._requestsByChunk.get(curChunk); + if (!requestIds) { + continue; + } + this._requestsByChunk.delete(curChunk); for (const requestId of requestIds) { const chunksNeeded = this._chunksNeededByRequest.get(requestId); @@ -539,7 +545,7 @@ class ChunkedStreamManager { // If there are no pending requests, automatically fetch the next // unfetched chunk of the PDF file. - if (!this.disableAutoFetch && isEmptyObj(this.requestsByChunk)) { + if (!this.disableAutoFetch && this._requestsByChunk.size === 0) { let nextEmptyChunk; if (this.stream.numChunksLoaded === 1) { // This is a special optimization so that after fetching the first