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.
  • Loading branch information
Snuffleupagus committed Dec 23, 2024
1 parent 4547f23 commit 8d773a9
Show file tree
Hide file tree
Showing 3 changed files with 21 additions and 61 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
38 changes: 18 additions & 20 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 Down Expand Up @@ -43,31 +44,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 +144,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 +168,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 8d773a9

Please sign in to comment.