: str_replace(): Passing null to parameter #2 ($replace) of type array|string is deprecated in
requestLoadedStream(noFetch = false) {
return this.streamManager.requestAllChunks(noFetch);
sendProgressiveData(chunk) {
this.streamManager.onReceiveData({
this.streamManager.abort(reason);
;// CONCATENATED MODULE: ./src/shared/message_handler.js
function wrapReason(reason) {
if (!(reason instanceof Error || typeof reason === "object" && reason !== null)) {
unreachable('wrapReason: Expected "reason" to be a (possibly cloned) Error.');
return new AbortException(reason.message);
case "MissingPDFException":
return new MissingPDFException(reason.message);
case "PasswordException":
return new PasswordException(reason.message, reason.code);
case "UnexpectedResponseException":
return new UnexpectedResponseException(reason.message, reason.status);
case "UnknownErrorException":
return new UnknownErrorException(reason.message, reason.details);
return new UnknownErrorException(reason.message, reason.toString());
constructor(sourceName, targetName, comObj) {
this.sourceName = sourceName;
this.targetName = targetName;
this.streamSinks = Object.create(null);
this.streamControllers = Object.create(null);
this.callbackCapabilities = Object.create(null);
this.actionHandler = Object.create(null);
this._onComObjOnMessage = event => {
if (data.targetName !== this.sourceName) {
this.#processStreamMessage(data);
const callbackId = data.callbackId;
const capability = this.callbackCapabilities[callbackId];
throw new Error(`Cannot resolve callback ${callbackId}`);
delete this.callbackCapabilities[callbackId];
if (data.callback === CallbackKind.DATA) {
capability.resolve(data.data);
} else if (data.callback === CallbackKind.ERROR) {
capability.reject(wrapReason(data.reason));
throw new Error("Unexpected callback case");
const action = this.actionHandler[data.action];
throw new Error(`Unknown action from worker: ${data.action}`);
const cbSourceName = this.sourceName;
const cbTargetName = data.sourceName;
new Promise(function (resolve) {
resolve(action(data.data));
}).then(function (result) {
sourceName: cbSourceName,
targetName: cbTargetName,
callback: CallbackKind.DATA,
callbackId: data.callbackId,
sourceName: cbSourceName,
targetName: cbTargetName,
callback: CallbackKind.ERROR,
callbackId: data.callbackId,
reason: wrapReason(reason)
this.#createStreamSink(data);
comObj.addEventListener("message", this._onComObjOnMessage);
on(actionName, handler) {
const ah = this.actionHandler;
throw new Error(`There is already an actionName called "${actionName}"`);
ah[actionName] = handler;
send(actionName, data, transfers) {
this.comObj.postMessage({
sourceName: this.sourceName,
targetName: this.targetName,
sendWithPromise(actionName, data, transfers) {
const callbackId = this.callbackId++;
const capability = Promise.withResolvers();
this.callbackCapabilities[callbackId] = capability;
this.comObj.postMessage({
sourceName: this.sourceName,
targetName: this.targetName,
return capability.promise;
sendWithStream(actionName, data, queueingStrategy, transfers) {
const streamId = this.streamId++,
sourceName = this.sourceName,
targetName = this.targetName,
return new ReadableStream({
const startCapability = Promise.withResolvers();
this.streamControllers[streamId] = {
startCall: startCapability,
desiredSize: controller.desiredSize
return startCapability.promise;
const pullCapability = Promise.withResolvers();
this.streamControllers[streamId].pullCall = pullCapability;
desiredSize: controller.desiredSize
return pullCapability.promise;
assert(reason instanceof Error, "cancel must have a valid reason");
const cancelCapability = Promise.withResolvers();
this.streamControllers[streamId].cancelCall = cancelCapability;
this.streamControllers[streamId].isClosed = true;
stream: StreamKind.CANCEL,
reason: wrapReason(reason)
return cancelCapability.promise;
#createStreamSink(data) {
const streamId = data.streamId,
sourceName = this.sourceName,
targetName = data.sourceName,
action = this.actionHandler[data.action];
enqueue(chunk, size = 1, transfers) {
const lastDesiredSize = this.desiredSize;
this.desiredSize -= size;
if (lastDesiredSize > 0 && this.desiredSize <= 0) {
this.sinkCapability = Promise.withResolvers();
this.ready = this.sinkCapability.promise;
stream: StreamKind.ENQUEUE,
stream: StreamKind.CLOSE,
delete self.streamSinks[streamId];
assert(reason instanceof Error, "error must have a valid reason");
stream: StreamKind.ERROR,
reason: wrapReason(reason)
sinkCapability: Promise.withResolvers(),
desiredSize: data.desiredSize,
streamSink.sinkCapability.resolve();
streamSink.ready = streamSink.sinkCapability.promise;
this.streamSinks[streamId] = streamSink;
new Promise(function (resolve) {
resolve(action(data.data, streamSink));
stream: StreamKind.START_COMPLETE,
stream: StreamKind.START_COMPLETE,
reason: wrapReason(reason)
#processStreamMessage(data) {
const streamId = data.streamId,
sourceName = this.sourceName,
targetName = data.sourceName,
const streamController = this.streamControllers[streamId],
streamSink = this.streamSinks[streamId];
case StreamKind.START_COMPLETE:
streamController.startCall.resolve();
streamController.startCall.reject(wrapReason(data.reason));
case StreamKind.PULL_COMPLETE:
streamController.pullCall.resolve();
streamController.pullCall.reject(wrapReason(data.reason));
stream: StreamKind.PULL_COMPLETE,
if (streamSink.desiredSize <= 0 && data.desiredSize > 0) {
streamSink.sinkCapability.resolve();
streamSink.desiredSize = data.desiredSize;
new Promise(function (resolve) {
resolve(streamSink.onPull?.());
stream: StreamKind.PULL_COMPLETE,
stream: StreamKind.PULL_COMPLETE,
reason: wrapReason(reason)
assert(streamController, "enqueue should have stream controller");
if (streamController.isClosed) {
streamController.controller.enqueue(data.chunk);
assert(streamController, "close should have stream controller");
if (streamController.isClosed) {
streamController.isClosed = true;
streamController.controller.close();
this.#deleteStreamController(streamController, streamId);
assert(streamController, "error should have stream controller");
streamController.controller.error(wrapReason(data.reason));
this.#deleteStreamController(streamController, streamId);
case StreamKind.CANCEL_COMPLETE:
streamController.cancelCall.resolve();
streamController.cancelCall.reject(wrapReason(data.reason));
this.#deleteStreamController(streamController, streamId);
new Promise(function (resolve) {
resolve(streamSink.onCancel?.(wrapReason(data.reason)));
stream: StreamKind.CANCEL_COMPLETE,
stream: StreamKind.CANCEL_COMPLETE,
reason: wrapReason(reason)
streamSink.sinkCapability.reject(wrapReason(data.reason));
streamSink.isCancelled = true;
delete this.streamSinks[streamId];
throw new Error("Unexpected stream case");
async #deleteStreamController(streamController, streamId) {
await Promise.allSettled([streamController.startCall?.promise, streamController.pullCall?.promise, streamController.cancelCall?.promise]);
delete this.streamControllers[streamId];
this.comObj.removeEventListener("message", this._onComObjOnMessage);
;// CONCATENATED MODULE: ./src/core/worker_stream.js
constructor(msgHandler) {
this._msgHandler = msgHandler;
this._contentLength = null;
this._fullRequestReader = null;
this._rangeRequestReaders = [];
assert(!this._fullRequestReader, "PDFWorkerStream.getFullReader can only be called once.");
this._fullRequestReader = new PDFWorkerStreamReader(this._msgHandler);
return this._fullRequestReader;
getRangeReader(begin, end) {
const reader = new PDFWorkerStreamRangeReader(begin, end, this._msgHandler);
this._rangeRequestReaders.push(reader);
cancelAllRequests(reason) {
this._fullRequestReader?.cancel(reason);
for (const reader of this._rangeRequestReaders.slice(0)) {
class PDFWorkerStreamReader {
constructor(msgHandler) {
this._msgHandler = msgHandler;
this._contentLength = null;
this._isRangeSupported = false;
this._isStreamingSupported = false;
const readableStream = this._msgHandler.sendWithStream("GetReader");
this._reader = readableStream.getReader();
this._headersReady = this._msgHandler.sendWithPromise("ReaderHeadersReady").then(data => {
this._isStreamingSupported = data.isStreamingSupported;
this._isRangeSupported = data.isRangeSupported;
this._contentLength = data.contentLength;
return this._headersReady;
return this._contentLength;
get isStreamingSupported() {
return this._isStreamingSupported;
return this._isRangeSupported;
} = await this._reader.read();
this._reader.cancel(reason);
class PDFWorkerStreamRangeReader {
constructor(begin, end, msgHandler) {
this._msgHandler = msgHandler;
const readableStream = this._msgHandler.sendWithStream("GetRangeReader", {