Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/core/worker_stream.js
Original file line number Diff line number Diff line change
Expand Up @@ -55,7 +55,7 @@ class PDFWorkerStreamReader extends BasePDFStreamReader {
}

cancel(reason) {
this._reader.cancel(reason);
this._reader.cancel(reason).catch(() => {});
}
}

Expand All @@ -81,7 +81,7 @@ class PDFWorkerStreamRangeReader extends BasePDFStreamRangeReader {
}

cancel(reason) {
this._reader.cancel(reason);
this._reader.cancel(reason).catch(() => {});
}
}

Expand Down
4 changes: 2 additions & 2 deletions src/display/fetch_stream.js
Original file line number Diff line number Diff line change
Expand Up @@ -140,7 +140,7 @@ class PDFFetchStreamReader extends BasePDFStreamReader {
}

cancel(reason) {
this._reader?.cancel(reason);
this._reader?.cancel(reason).catch(() => {});
this._abortController.abort();
}
}
Expand Down Expand Up @@ -186,7 +186,7 @@ class PDFFetchStreamRangeReader extends BasePDFStreamRangeReader {
}

cancel(reason) {
this._reader?.cancel(reason);
this._reader?.cancel(reason).catch(() => {});
this._abortController.abort();
}
}
Expand Down
4 changes: 2 additions & 2 deletions src/display/node_stream.js
Original file line number Diff line number Diff line change
Expand Up @@ -99,7 +99,7 @@ class PDFNodeStreamReader extends BasePDFStreamReader {
}

cancel(reason) {
this._reader?.cancel(reason);
this._reader?.cancel(reason).catch(() => {});
}
}

Expand Down Expand Up @@ -138,7 +138,7 @@ class PDFNodeStreamRangeReader extends BasePDFStreamRangeReader {
}

cancel(reason) {
this._reader?.cancel(reason);
this._reader?.cancel(reason).catch(() => {});
}
}

Expand Down
34 changes: 34 additions & 0 deletions test/unit/fetch_stream_spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -118,6 +118,40 @@ describe("fetch_stream", function () {
expect(result2.value).toEqual(tailSize);
});

it("cancel after a failed read doesn't cause an unhandled rejection", async function () {
spyOn(globalThis, "fetch").and.callFake(
async () =>
new Response(
new ReadableStream({
pull(controller) {
controller.error(new Error("Network error"));
},
}),
{ status: 200 }
)
);
const stream = new PDFFetchStream({
url: getPdfUrl(),
rangeChunkSize: 32768,
disableStream: false,
disableRange: false,
});

const fullReader = stream.getFullReader();
const rangeReader = stream.getRangeReader(0, 32768);
await expectAsync(fullReader.read()).toBeRejectedWithError("Network error");
await expectAsync(rangeReader.read()).toBeRejectedWithError(
"Network error"
);

fullReader.cancel(new AbortException("Don't need fullReader."));
rangeReader.cancel(new AbortException("Don't need rangeReader."));
// Allow any unhandled rejections to be reported.
await new Promise(resolve => {
setTimeout(resolve, 0);
});
});

describe("Redirects", function () {
it("redirects allowed if all responses are same-origin", async function () {
await testCrossOriginRedirects({
Expand Down
25 changes: 25 additions & 0 deletions test/unit/node_stream_spec.js
Original file line number Diff line number Diff line change
Expand Up @@ -153,4 +153,29 @@ describe("node_stream", function () {
expect(isRangeSupported).toBeFalse();
expect(len).toEqual(smallLength);
});

it("cancel after a failed read doesn't cause an unhandled rejection", async function () {
// We point the stream at a directory instead of at a PDF file on purpose.
// Opening a directory succeeds, but reading from it fails (with EISDIR),
// so both the full reader and the range reader end up with an errored
// stream.
const stream = new PDFNodeStream({
url: new URL("./test/pdfs/", cwdURL),
rangeChunkSize: 65536,
disableStream: false,
disableRange: false,
});
Comment thread
andrewfader marked this conversation as resolved.
Resolved

const fullReader = stream.getFullReader();
Comment thread
andrewfader marked this conversation as resolved.
Resolved
const rangeReader = stream.getRangeReader(0, 65536);
await expectAsync(fullReader.read()).toBeRejected();
await expectAsync(rangeReader.read()).toBeRejected();
Comment thread
andrewfader marked this conversation as resolved.
Resolved

fullReader.cancel(new AbortException("Don't need fullReader."));
rangeReader.cancel(new AbortException("Don't need rangeReader."));
// Allow any unhandled rejections to be reported.
await new Promise(resolve => {
setTimeout(resolve, 0);
});
});
});
Loading