Merge pull request #21550 from Snuffleupagus/WorkerMessageHandler-more-async

Change Promise-returning worker message-handler functions to be asynchronous
This commit is contained in:
Tim van der Meij 2026-07-07 20:10:12 +02:00 committed by GitHub
commit 8bc2fe68e5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -391,14 +391,15 @@ class WorkerMessageHandler {
.then(pdfManagerReady, onFailure); .then(pdfManagerReady, onFailure);
} }
handler.on("GetPage", function (data) { handler.on("GetPage", async function ({ pageIndex }) {
return pdfManager.getPage(data.pageIndex).then(function (page) { const page = await pdfManager.getPage(pageIndex);
return Promise.all([
const [rotate, ref, userUnit, view] = await Promise.all([
pdfManager.ensure(page, "rotate"), pdfManager.ensure(page, "rotate"),
pdfManager.ensure(page, "ref"), pdfManager.ensure(page, "ref"),
pdfManager.ensure(page, "userUnit"), pdfManager.ensure(page, "userUnit"),
pdfManager.ensure(page, "view"), pdfManager.ensure(page, "view"),
]).then(function ([rotate, ref, userUnit, view]) { ]);
return { return {
rotate, rotate,
ref, ref,
@ -407,53 +408,44 @@ class WorkerMessageHandler {
view, view,
}; };
}); });
});
handler.on("GetPageIndex", function ({ num, gen }) {
return pdfManager.ensureCatalog("getPageIndex", [Ref.get(num, gen)]);
}); });
handler.on("GetPageIndex", function (data) { handler.on("GetDestinations", function () {
const pageRef = Ref.get(data.num, data.gen);
return pdfManager.ensureCatalog("getPageIndex", [pageRef]);
});
handler.on("GetDestinations", function (data) {
return pdfManager.ensureCatalog("destinations"); return pdfManager.ensureCatalog("destinations");
}); });
handler.on("GetDestination", function (data) { handler.on("GetDestination", function ({ id }) {
return pdfManager.ensureCatalog("getDestination", [data.id]); return pdfManager.ensureCatalog("getDestination", [id]);
}); });
handler.on("GetPageLabels", function (data) { handler.on("GetPageLabels", function () {
return pdfManager.ensureCatalog("pageLabels"); return pdfManager.ensureCatalog("pageLabels");
}); });
handler.on("GetPageLayout", function (data) { handler.on("GetPageLayout", function () {
return pdfManager.ensureCatalog("pageLayout"); return pdfManager.ensureCatalog("pageLayout");
}); });
handler.on("GetPageMode", function (data) { handler.on("GetPageMode", function () {
return pdfManager.ensureCatalog("pageMode"); return pdfManager.ensureCatalog("pageMode");
}); });
handler.on("GetViewerPreferences", function (data) { handler.on("GetViewerPreferences", function () {
return pdfManager.ensureCatalog("viewerPreferences"); return pdfManager.ensureCatalog("viewerPreferences");
}); });
handler.on("GetOpenAction", function (data) { handler.on("GetOpenAction", function () {
return pdfManager.ensureCatalog("openAction"); return pdfManager.ensureCatalog("openAction");
}); });
handler.on("GetAttachments", function (data) { handler.on("GetAttachments", function () {
return pdfManager.ensureCatalog("attachments"); return pdfManager.ensureCatalog("attachments");
}); });
handler.on( handler.on("GetAttachmentContent", async function (id) {
"GetAttachmentContent",
/**
* @param {string} id
* Unique attachment identifier (required).
*/
async function (id) {
let passwordEx; let passwordEx;
// Loop to prompt again after an incorrect password. // Loop to prompt again after an incorrect password.
@ -473,17 +465,15 @@ class WorkerMessageHandler {
throw ex; throw ex;
} }
} }
} });
);
handler.on("GetDocJSActions", function (data) { handler.on("GetDocJSActions", function () {
return pdfManager.ensureCatalog("jsActions"); return pdfManager.ensureCatalog("jsActions");
}); });
handler.on("GetPageJSActions", function ({ pageIndex }) { handler.on("GetPageJSActions", async function ({ pageIndex }) {
return pdfManager const page = await pdfManager.getPage(pageIndex);
.getPage(pageIndex) return pdfManager.ensure(page, "jsActions");
.then(page => pdfManager.ensure(page, "jsActions"));
}); });
handler.on( handler.on(
@ -534,19 +524,19 @@ class WorkerMessageHandler {
} }
); );
handler.on("GetOutline", function (data) { handler.on("GetOutline", function () {
return pdfManager.ensureCatalog("documentOutline"); return pdfManager.ensureCatalog("documentOutline");
}); });
handler.on("GetOptionalContentConfig", function (data) { handler.on("GetOptionalContentConfig", function () {
return pdfManager.ensureCatalog("optionalContentConfig"); return pdfManager.ensureCatalog("optionalContentConfig");
}); });
handler.on("GetPermissions", function (data) { handler.on("GetPermissions", function () {
return pdfManager.ensureCatalog("permissions"); return pdfManager.ensureCatalog("permissions");
}); });
handler.on("GetMetadata", function (data) { handler.on("GetMetadata", function () {
return Promise.all([ return Promise.all([
pdfManager.ensureDoc("documentInfo"), pdfManager.ensureDoc("documentInfo"),
pdfManager.ensureCatalog("metadata"), pdfManager.ensureCatalog("metadata"),
@ -554,32 +544,34 @@ class WorkerMessageHandler {
]); ]);
}); });
handler.on("GetMarkInfo", function (data) { handler.on("GetMarkInfo", function () {
return pdfManager.ensureCatalog("markInfo"); return pdfManager.ensureCatalog("markInfo");
}); });
handler.on("GetData", function (data) { handler.on("GetData", async function () {
return pdfManager.requestLoadedStream().then(stream => stream.bytes); const stream = await pdfManager.requestLoadedStream();
return stream.bytes;
}); });
handler.on("GetAnnotations", function ({ pageIndex, intent }) { handler.on("GetAnnotations", async function ({ pageIndex, intent }) {
return pdfManager.getPage(pageIndex).then(function (page) { const page = await pdfManager.getPage(pageIndex);
const task = new WorkerTask(`GetAnnotations: page ${pageIndex}`); const task = new WorkerTask(`GetAnnotations: page ${pageIndex}`);
startWorkerTask(task); startWorkerTask(task);
return page.getAnnotationsData(handler, task, intent).finally(() => { try {
return await page.getAnnotationsData(handler, task, intent);
} finally {
finishWorkerTask(task); finishWorkerTask(task);
}); }
});
}); });
handler.on("GetFieldObjects", function (data) { handler.on("GetFieldObjects", async function () {
return pdfManager const fieldObjects = await pdfManager.ensureDoc("fieldObjects");
.ensureDoc("fieldObjects") return fieldObjects?.allFields || null;
.then(fieldObjects => fieldObjects?.allFields || null);
}); });
handler.on("GetSignatures", function (data) { handler.on("GetSignatures", function () {
return pdfManager.ensureDoc("signatures"); return pdfManager.ensureDoc("signatures");
}); });
@ -587,11 +579,11 @@ class WorkerMessageHandler {
return pdfManager.ensureDoc("getSignatureData", [id]); return pdfManager.ensureDoc("getSignatureData", [id]);
}); });
handler.on("HasJSActions", function (data) { handler.on("HasJSActions", function () {
return pdfManager.ensureDoc("hasJSActions"); return pdfManager.ensureDoc("hasJSActions");
}); });
handler.on("GetCalculationOrderIds", function (data) { handler.on("GetCalculationOrderIds", function () {
return pdfManager.ensureDoc("calculationOrderIds"); return pdfManager.ensureDoc("calculationOrderIds");
}); });
@ -893,8 +885,12 @@ class WorkerMessageHandler {
} }
); );
handler.on("GetOperatorList", function (data, sink) { handler.on(
const { pageId, pageIndex } = data; "GetOperatorList",
function (
{ pageId, pageIndex, intent, cacheKey, annotationStorage, modifiedIds },
sink
) {
pdfManager.getPage(pageId).then(function (page) { pdfManager.getPage(pageId).then(function (page) {
const task = new WorkerTask(`GetOperatorList: page ${pageIndex}`); const task = new WorkerTask(`GetOperatorList: page ${pageIndex}`);
startWorkerTask(task); startWorkerTask(task);
@ -908,18 +904,17 @@ class WorkerMessageHandler {
handler, handler,
sink, sink,
task, task,
intent: data.intent, intent,
cacheKey: data.cacheKey, cacheKey,
annotationStorage: data.annotationStorage, annotationStorage,
modifiedIds: data.modifiedIds, modifiedIds,
pageIndex, pageIndex,
}) })
.then( .then(
operatorListInfo => { opListInfo => {
if (start) { if (start) {
info( info(
`page=${pageIndex + 1} - getOperatorList: time=` + `${task.name}; time=${Date.now() - start}ms, len=${opListInfo.length}`
`${Date.now() - start}ms, len=${operatorListInfo.length}`
); );
} }
sink.close(); sink.close();
@ -929,21 +924,21 @@ class WorkerMessageHandler {
return; // ignoring errors from the terminated thread return; // ignoring errors from the terminated thread
} }
sink.error(reason); sink.error(reason);
// TODO: Should `reason` be re-thrown here (currently that casues
// "Uncaught exception: ..." messages in the console)?
} }
) )
.finally(() => { .finally(() => {
finishWorkerTask(task); finishWorkerTask(task);
}); });
}); });
}); }
);
handler.on("GetTextContent", function (data, sink) {
const { pageId, pageIndex, includeMarkedContent, disableNormalization } =
data;
handler.on(
"GetTextContent",
function (
{ pageId, pageIndex, includeMarkedContent, disableNormalization },
sink
) {
pdfManager.getPage(pageId).then(function (page) { pdfManager.getPage(pageId).then(function (page) {
const task = new WorkerTask("GetTextContent: page " + pageIndex); const task = new WorkerTask("GetTextContent: page " + pageIndex);
startWorkerTask(task); startWorkerTask(task);
@ -962,10 +957,7 @@ class WorkerMessageHandler {
.then( .then(
() => { () => {
if (start) { if (start) {
info( info(`${task.name}; time=${Date.now() - start}ms`);
`page=${pageIndex + 1} - getTextContent: time=` +
`${Date.now() - start}ms`
);
} }
sink.close(); sink.close();
}, },
@ -974,25 +966,22 @@ class WorkerMessageHandler {
return; // ignoring errors from the terminated thread return; // ignoring errors from the terminated thread
} }
sink.error(reason); sink.error(reason);
// TODO: Should `reason` be re-thrown here (currently that casues
// "Uncaught exception: ..." messages in the console)?
} }
) )
.finally(() => { .finally(() => {
finishWorkerTask(task); finishWorkerTask(task);
}); });
}); });
}
);
handler.on("GetStructTree", async function ({ pageIndex }) {
const page = await pdfManager.getPage(pageIndex);
return pdfManager.ensure(page, "getStructTree");
}); });
handler.on("GetStructTree", function (data) { handler.on("FontFallback", function ({ id }) {
return pdfManager return pdfManager.fontFallback(id, handler);
.getPage(data.pageIndex)
.then(page => pdfManager.ensure(page, "getStructTree"));
});
handler.on("FontFallback", function (data) {
return pdfManager.fontFallback(data.id, handler);
}); });
if ( if (
@ -1015,11 +1004,11 @@ class WorkerMessageHandler {
}); });
} }
handler.on("Cleanup", function (data) { handler.on("Cleanup", function () {
return pdfManager.cleanup(/* manuallyTriggered = */ true); return pdfManager.cleanup(/* manuallyTriggered = */ true);
}); });
handler.on("Terminate", async function (data) { handler.on("Terminate", async function () {
terminated = true; terminated = true;
const waitOn = []; const waitOn = [];
@ -1047,22 +1036,21 @@ class WorkerMessageHandler {
handler = null; handler = null;
}); });
handler.on("Ready", function (data) { handler.on("Ready", function () {
setupDoc(docParams); setupDoc(docParams);
docParams = null; // we don't need docParams anymore -- saving memory. docParams = null; // we don't need docParams anymore -- saving memory.
}); });
if (typeof PDFJSDev === "undefined" || PDFJSDev.test("TESTING")) { if (typeof PDFJSDev === "undefined" || PDFJSDev.test("TESTING")) {
handler.on("GetXFADatasets", function (data) { handler.on("GetXFADatasets", function () {
return pdfManager.ensureDoc("xfaDatasets"); return pdfManager.ensureDoc("xfaDatasets");
}); });
handler.on("GetStartXRefPos", function (data) { handler.on("GetStartXRefPos", function () {
return pdfManager.ensureDoc("startXRef"); return pdfManager.ensureDoc("startXRef");
}); });
handler.on("GetAnnotArray", function (data) { handler.on("GetAnnotArray", async function ({ pageIndex }) {
return pdfManager const page = await pdfManager.getPage(pageIndex);
.getPage(data.pageIndex) return page.annotations.map(a => a.toString());
.then(page => page.annotations.map(a => a.toString()));
}); });
handler.on("GetWorkerCoverage", function () { handler.on("GetWorkerCoverage", function () {
return globalThis.__coverage__ ?? {}; return globalThis.__coverage__ ?? {};