[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.
This commit is contained in:
Jonas Jenwald 2026-04-02 12:03:24 +02:00
parent 1bd4c4fbde
commit f3a2ca08d0
2 changed files with 19 additions and 50 deletions

View File

@ -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();
}

View File

@ -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) {