Skip to content

Commit

Permalink
Make MessageHandler.prototype.send able to handle Errors properly
Browse files Browse the repository at this point in the history
Currently the "DocException" message requires manual handling of `Error`s on both the main- and worker-threads, which leads to some code duplication.
Note that the `MessageHandler` implementation already deals with `Error`s when its `sendWithPromise` respectively `sendWithStream` methods are used, and it's easy enough to extend this to also apply to the `send` method.

Finally, changes the `wrapReason` helper function to use a slightly shorter parameter name and removes unused entries from the `CallbackKind`/`StreamKind` enumerations.
  • Loading branch information
Snuffleupagus committed Dec 23, 2024
1 parent 4547f23 commit 238000e
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 63 deletions.
16 changes: 1 addition & 15 deletions src/core/worker.js
Original file line number Diff line number Diff line change
Expand Up @@ -18,14 +18,10 @@ import {
assert,
getVerbosityLevel,
info,
InvalidPDFException,
isNodeJS,
MissingPDFException,
PasswordException,
setVerbosityLevel,
stringToPDFString,
UnexpectedResponseException,
UnknownErrorException,
VerbosityLevel,
warn,
} from "../shared/util.js";
Expand Down Expand Up @@ -347,18 +343,8 @@ class WorkerMessageHandler {
finishWorkerTask(task);
handler.send("DocException", ex);
});
} else if (
ex instanceof InvalidPDFException ||
ex instanceof MissingPDFException ||
ex instanceof UnexpectedResponseException ||
ex instanceof UnknownErrorException
) {
handler.send("DocException", ex);
} else {
handler.send(
"DocException",
new UnknownErrorException(ex.message, ex.toString())
);
handler.send("DocException", ex);
}
}

Expand Down
28 changes: 2 additions & 26 deletions src/display/api.js
Original file line number Diff line number Diff line change
Expand Up @@ -24,17 +24,13 @@ import {
FeatureTest,
getVerbosityLevel,
info,
InvalidPDFException,
isNodeJS,
MAX_IMAGE_SIZE_TO_CACHE,
MissingPDFException,
PasswordException,
RenderingIntentFlag,
setVerbosityLevel,
shadow,
stringToBytes,
UnexpectedResponseException,
UnknownErrorException,
unreachable,
warn,
} from "../shared/util.js";
Expand Down Expand Up @@ -2731,28 +2727,8 @@ class WorkerTransport {
loadingTask._capability.resolve(new PDFDocumentProxy(pdfInfo, this));
});

messageHandler.on("DocException", function (ex) {
let reason;
switch (ex.name) {
case "PasswordException":
reason = new PasswordException(ex.message, ex.code);
break;
case "InvalidPDFException":
reason = new InvalidPDFException(ex.message);
break;
case "MissingPDFException":
reason = new MissingPDFException(ex.message);
break;
case "UnexpectedResponseException":
reason = new UnexpectedResponseException(ex.message, ex.status);
break;
case "UnknownErrorException":
reason = new UnknownErrorException(ex.message, ex.details);
break;
default:
unreachable("DocException - expected a valid Error.");
}
loadingTask._capability.reject(reason);
messageHandler.on("DocException", ex => {
loadingTask._capability.reject(ex);
});

messageHandler.on("PasswordRequest", exception => {
Expand Down
40 changes: 18 additions & 22 deletions src/shared/message_handler.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
import {
AbortException,
assert,
InvalidPDFException,
MissingPDFException,
PasswordException,
UnexpectedResponseException,
Expand All @@ -24,13 +25,11 @@ import {
} from "./util.js";

const CallbackKind = {
UNKNOWN: 0,
DATA: 1,
ERROR: 2,
};

const StreamKind = {
UNKNOWN: 0,
CANCEL: 1,
CANCEL_COMPLETE: 2,
CLOSE: 3,
Expand All @@ -43,31 +42,25 @@ const StreamKind = {

function onFn() {}

function wrapReason(reason) {
if (
!(
reason instanceof Error ||
(typeof reason === "object" && reason !== null)
)
) {
unreachable(
'wrapReason: Expected "reason" to be a (possibly cloned) Error.'
);
function wrapReason(ex) {
if (!(ex instanceof Error || (typeof ex === "object" && ex !== null))) {
unreachable("wrapReason: Expected a (possibly cloned) Error.");
}
switch (reason.name) {
switch (ex.name) {
case "AbortException":
return new AbortException(reason.message);
return new AbortException(ex.message);
case "InvalidPDFException":
return new InvalidPDFException(ex.message);
case "MissingPDFException":
return new MissingPDFException(reason.message);
return new MissingPDFException(ex.message);
case "PasswordException":
return new PasswordException(reason.message, reason.code);
return new PasswordException(ex.message, ex.code);
case "UnexpectedResponseException":
return new UnexpectedResponseException(reason.message, reason.status);
return new UnexpectedResponseException(ex.message, ex.status);
case "UnknownErrorException":
return new UnknownErrorException(reason.message, reason.details);
default:
return new UnknownErrorException(reason.message, reason.toString());
return new UnknownErrorException(ex.message, ex.details);
}
return new UnknownErrorException(ex.message, ex.toString());
}

class MessageHandler {
Expand Down Expand Up @@ -149,7 +142,7 @@ class MessageHandler {
this.#createStreamSink(data);
return;
}
action(data.data);
action(data.reason ? wrapReason(data.reason) : data.data);
}

on(actionName, handler) {
Expand All @@ -173,12 +166,15 @@ class MessageHandler {
* @param {Array} [transfers] - List of transfers/ArrayBuffers.
*/
send(actionName, data, transfers) {
const isErr = data instanceof Error;

this.comObj.postMessage(
{
sourceName: this.sourceName,
targetName: this.targetName,
action: actionName,
data,
data: isErr ? null : data,
reason: isErr ? wrapReason(data) : null,
},
transfers
);
Expand Down

0 comments on commit 238000e

Please sign in to comment.