From f3a2ca08d0d2ed141750ed9813ed636734b45403 Mon Sep 17 00:00:00 2001 From: Jonas Jenwald Date: Thu, 2 Apr 2026 12:03:24 +0200 Subject: [PATCH] [api-minor] Change `PDFDataRangeTransport` to use a single (internal) listener The `PDFDataTransportStream` constructor has always registered exactly one listener for each type of data that an `PDFDataRangeTransport` instance can receive. Given that an end-user of the `PDFDataRangeTransport` class will supply data through its `onData...` methods, it's also somewhat difficult to understand why additional end-user registered listeners would be needed (since the data is already, by definition, available to the user). Furthermore, since TypedArray data is being transferred nowadays it's not even clear that multiple listeners (of the same kind) would generally work. All in all, let's simplify this old code a little bit by using *a single* (internal) listener in the `PDFDataRangeTransport` class. --- src/display/api.js | 42 +++++---------------------------- src/display/transport_stream.js | 27 ++++++++++----------- 2 files changed, 19 insertions(+), 50 deletions(-) diff --git a/src/display/api.js b/src/display/api.js index 314206ac8..553d8a3b5 100644 --- a/src/display/api.js +++ b/src/display/api.js @@ -607,11 +607,7 @@ class PDFDocumentLoadingTask { class PDFDataRangeTransport { #capability = Promise.withResolvers(); - #progressiveDoneListeners = []; - - #progressiveReadListeners = []; - - #rangeListeners = []; + #listener = null; /** * @param {number} length @@ -643,35 +639,12 @@ class PDFDataRangeTransport { } } - /** - * @param {function} listener - */ - addRangeListener(listener) { - this.#rangeListeners.push(listener); - } - - /** - * @param {function} listener - */ - addProgressiveReadListener(listener) { - this.#progressiveReadListeners.push(listener); - } - - /** - * @param {function} listener - */ - addProgressiveDoneListener(listener) { - this.#progressiveDoneListeners.push(listener); - } - /** * @param {number} begin * @param {Uint8Array|null} chunk */ onDataRange(begin, chunk) { - for (const listener of this.#rangeListeners) { - listener(begin, chunk); - } + this.#listener({ type: "range", begin, chunk }); } /** @@ -679,21 +652,18 @@ class PDFDataRangeTransport { */ onDataProgressiveRead(chunk) { this.#capability.promise.then(() => { - for (const listener of this.#progressiveReadListeners) { - listener(chunk); - } + this.#listener({ type: "progressiveRead", chunk }); }); } onDataProgressiveDone() { this.#capability.promise.then(() => { - for (const listener of this.#progressiveDoneListeners) { - listener(); - } + this.#listener({ type: "progressiveDone" }); }); } - transportReady() { + transportReady(listener) { + this.#listener = listener; this.#capability.resolve(); } diff --git a/src/display/transport_stream.js b/src/display/transport_stream.js index 9df04b57c..fd5f1b7b3 100644 --- a/src/display/transport_stream.js +++ b/src/display/transport_stream.js @@ -56,20 +56,19 @@ class PDFDataTransportStream extends BasePDFStream { } this._progressiveDone = progressiveDone; - pdfDataRangeTransport.addRangeListener((begin, chunk) => { - this.#onReceiveData(begin, chunk); - }); - - pdfDataRangeTransport.addProgressiveReadListener(chunk => { - this.#onReceiveData(/* begin = */ undefined, chunk); - }); - - pdfDataRangeTransport.addProgressiveDoneListener(() => { - this._fullReader?.progressiveDone(); - this._progressiveDone = true; - }); - - pdfDataRangeTransport.transportReady(); + const listener = args => { + switch (args.type) { + case "range": + case "progressiveRead": + this.#onReceiveData(args.begin, args.chunk); + break; + case "progressiveDone": + this._fullReader?.progressiveDone(); + this._progressiveDone = true; + break; + } + }; + pdfDataRangeTransport.transportReady(listener); } #onReceiveData(begin, chunk) {