Skip to content

Commit 91679ec

Browse files
Merge pull request #19943 from Snuffleupagus/PDFWorker-create
Replace `PDFWorker.fromPort` with a generic `PDFWorker.create` method
2 parents 278fc06 + fc697b3 commit 91679ec

File tree

2 files changed

+70
-53
lines changed

2 files changed

+70
-53
lines changed

src/display/api.js

Lines changed: 69 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -38,14 +38,15 @@ import {
3838
PrintAnnotationStorage,
3939
SerializableEmpty,
4040
} from "./annotation_storage.js";
41-
import { FontFaceObject, FontLoader } from "./font_loader.js";
4241
import {
42+
deprecated,
4343
isDataScheme,
4444
isValidFetchUrl,
4545
PageViewport,
4646
RenderingCancelledException,
4747
StatTimer,
4848
} from "./display_utils.js";
49+
import { FontFaceObject, FontLoader } from "./font_loader.js";
4950
import { MessageHandler, wrapReason } from "../shared/message_handler.js";
5051
import {
5152
NodeCanvasFactory,
@@ -383,15 +384,12 @@ function getDocument(src = {}) {
383384
};
384385

385386
if (!worker) {
386-
const workerParams = {
387-
verbosity,
388-
port: GlobalWorkerOptions.workerPort,
389-
};
390387
// Worker was not provided -- creating and owning our own. If message port
391388
// is specified in global worker options, using it.
392-
worker = workerParams.port
393-
? PDFWorker.fromPort(workerParams)
394-
: new PDFWorker(workerParams);
389+
worker = PDFWorker.create({
390+
verbosity,
391+
port: GlobalWorkerOptions.workerPort,
392+
});
395393
task._worker = worker;
396394
}
397395

@@ -2093,6 +2091,14 @@ class LoopbackPort {
20932091
* @param {PDFWorkerParameters} params - The worker initialization parameters.
20942092
*/
20952093
class PDFWorker {
2094+
#capability = Promise.withResolvers();
2095+
2096+
#messageHandler = null;
2097+
2098+
#port = null;
2099+
2100+
#webWorker = null;
2101+
20962102
static #fakeWorkerId = 0;
20972103

20982104
static #isWorkerDisabled = false;
@@ -2131,6 +2137,16 @@ class PDFWorker {
21312137
new Blob([wrapper], { type: "text/javascript" })
21322138
);
21332139
};
2140+
2141+
this.fromPort = params => {
2142+
deprecated(
2143+
"`PDFWorker.fromPort` - please use `PDFWorker.create` instead."
2144+
);
2145+
if (!params?.port) {
2146+
throw new Error("PDFWorker.fromPort - invalid method signature.");
2147+
}
2148+
return this.create(params);
2149+
};
21342150
}
21352151

21362152
if (typeof PDFJSDev === "undefined" || PDFJSDev.test("TESTING")) {
@@ -2150,34 +2166,38 @@ class PDFWorker {
21502166
this.destroyed = false;
21512167
this.verbosity = verbosity;
21522168

2153-
this._readyCapability = Promise.withResolvers();
2154-
this._port = null;
2155-
this._webWorker = null;
2156-
this._messageHandler = null;
2157-
21582169
if (port) {
21592170
if (PDFWorker.#workerPorts.has(port)) {
21602171
throw new Error("Cannot use more than one PDFWorker per port.");
21612172
}
21622173
PDFWorker.#workerPorts.set(port, this);
2163-
this._initializeFromPort(port);
2164-
return;
2174+
this.#initializeFromPort(port);
2175+
} else {
2176+
this.#initialize();
2177+
}
2178+
2179+
if (typeof PDFJSDev === "undefined" || PDFJSDev.test("TESTING")) {
2180+
// For testing purposes.
2181+
Object.defineProperty(this, "_webWorker", {
2182+
get() {
2183+
return this.#webWorker;
2184+
},
2185+
});
21652186
}
2166-
this._initialize();
21672187
}
21682188

21692189
/**
21702190
* Promise for worker initialization completion.
21712191
* @type {Promise<void>}
21722192
*/
21732193
get promise() {
2174-
return this._readyCapability.promise;
2194+
return this.#capability.promise;
21752195
}
21762196

21772197
#resolve() {
2178-
this._readyCapability.resolve();
2198+
this.#capability.resolve();
21792199
// Send global setting, e.g. verbosity level.
2180-
this._messageHandler.send("configure", {
2200+
this.#messageHandler.send("configure", {
21812201
verbosity: this.verbosity,
21822202
});
21832203
}
@@ -2187,28 +2207,28 @@ class PDFWorker {
21872207
* @type {Worker}
21882208
*/
21892209
get port() {
2190-
return this._port;
2210+
return this.#port;
21912211
}
21922212

21932213
/**
21942214
* The current MessageHandler-instance.
21952215
* @type {MessageHandler}
21962216
*/
21972217
get messageHandler() {
2198-
return this._messageHandler;
2218+
return this.#messageHandler;
21992219
}
22002220

2201-
_initializeFromPort(port) {
2202-
this._port = port;
2203-
this._messageHandler = new MessageHandler("main", "worker", port);
2204-
this._messageHandler.on("ready", function () {
2221+
#initializeFromPort(port) {
2222+
this.#port = port;
2223+
this.#messageHandler = new MessageHandler("main", "worker", port);
2224+
this.#messageHandler.on("ready", () => {
22052225
// Ignoring "ready" event -- MessageHandler should already be initialized
22062226
// and ready to accept messages.
22072227
});
22082228
this.#resolve();
22092229
}
22102230

2211-
_initialize() {
2231+
#initialize() {
22122232
// If worker support isn't disabled explicit and the browser has worker
22132233
// support, create a new web worker and test if it/the browser fulfills
22142234
// all requirements to run parts of pdf.js in a web worker.
@@ -2218,7 +2238,7 @@ class PDFWorker {
22182238
PDFWorker.#isWorkerDisabled ||
22192239
PDFWorker.#mainThreadWorkerMessageHandler
22202240
) {
2221-
this._setupFakeWorker();
2241+
this.#setupFakeWorker();
22222242
return;
22232243
}
22242244
let { workerSrc } = PDFWorker;
@@ -2243,19 +2263,19 @@ class PDFWorker {
22432263
messageHandler.destroy();
22442264
worker.terminate();
22452265
if (this.destroyed) {
2246-
this._readyCapability.reject(new Error("Worker was destroyed"));
2266+
this.#capability.reject(new Error("Worker was destroyed"));
22472267
} else {
22482268
// Fall back to fake worker if the termination is caused by an
22492269
// error (e.g. NetworkError / SecurityError).
2250-
this._setupFakeWorker();
2270+
this.#setupFakeWorker();
22512271
}
22522272
};
22532273

22542274
const ac = new AbortController();
22552275
worker.addEventListener(
22562276
"error",
22572277
() => {
2258-
if (!this._webWorker) {
2278+
if (!this.#webWorker) {
22592279
// Worker failed to initialize due to an error. Clean up and fall
22602280
// back to the fake worker.
22612281
terminateEarly();
@@ -2270,9 +2290,9 @@ class PDFWorker {
22702290
terminateEarly();
22712291
return;
22722292
}
2273-
this._messageHandler = messageHandler;
2274-
this._port = worker;
2275-
this._webWorker = worker;
2293+
this.#messageHandler = messageHandler;
2294+
this.#port = worker;
2295+
this.#webWorker = worker;
22762296

22772297
this.#resolve();
22782298
});
@@ -2287,7 +2307,7 @@ class PDFWorker {
22872307
sendTest();
22882308
} catch {
22892309
// We need fallback to a faked worker.
2290-
this._setupFakeWorker();
2310+
this.#setupFakeWorker();
22912311
}
22922312
});
22932313

@@ -2307,10 +2327,10 @@ class PDFWorker {
23072327
}
23082328
// Either workers are not supported or have thrown an exception.
23092329
// Thus, we fallback to a faked worker.
2310-
this._setupFakeWorker();
2330+
this.#setupFakeWorker();
23112331
}
23122332

2313-
_setupFakeWorker() {
2333+
#setupFakeWorker() {
23142334
if (!PDFWorker.#isWorkerDisabled) {
23152335
warn("Setting up fake worker.");
23162336
PDFWorker.#isWorkerDisabled = true;
@@ -2319,11 +2339,11 @@ class PDFWorker {
23192339
PDFWorker._setupFakeWorkerGlobal
23202340
.then(WorkerMessageHandler => {
23212341
if (this.destroyed) {
2322-
this._readyCapability.reject(new Error("Worker was destroyed"));
2342+
this.#capability.reject(new Error("Worker was destroyed"));
23232343
return;
23242344
}
23252345
const port = new LoopbackPort();
2326-
this._port = port;
2346+
this.#port = port;
23272347

23282348
// All fake workers use the same port, making id unique.
23292349
const id = `fake${PDFWorker.#fakeWorkerId++}`;
@@ -2333,11 +2353,11 @@ class PDFWorker {
23332353
const workerHandler = new MessageHandler(id + "_worker", id, port);
23342354
WorkerMessageHandler.setup(workerHandler, port);
23352355

2336-
this._messageHandler = new MessageHandler(id, id + "_worker", port);
2356+
this.#messageHandler = new MessageHandler(id, id + "_worker", port);
23372357
this.#resolve();
23382358
})
23392359
.catch(reason => {
2340-
this._readyCapability.reject(
2360+
this.#capability.reject(
23412361
new Error(`Setting up fake worker failed: "${reason.message}".`)
23422362
);
23432363
});
@@ -2350,29 +2370,26 @@ class PDFWorker {
23502370
this.destroyed = true;
23512371

23522372
// We need to terminate only web worker created resource.
2353-
this._webWorker?.terminate();
2354-
this._webWorker = null;
2373+
this.#webWorker?.terminate();
2374+
this.#webWorker = null;
23552375

2356-
PDFWorker.#workerPorts.delete(this._port);
2357-
this._port = null;
2376+
PDFWorker.#workerPorts.delete(this.#port);
2377+
this.#port = null;
23582378

2359-
this._messageHandler?.destroy();
2360-
this._messageHandler = null;
2379+
this.#messageHandler?.destroy();
2380+
this.#messageHandler = null;
23612381
}
23622382

23632383
/**
23642384
* @param {PDFWorkerParameters} params - The worker initialization parameters.
23652385
* @returns {PDFWorker}
23662386
*/
2367-
static fromPort(params) {
2368-
if (!params?.port) {
2369-
throw new Error("PDFWorker.fromPort - invalid method signature.");
2370-
}
2371-
const cachedPort = this.#workerPorts.get(params.port);
2387+
static create(params) {
2388+
const cachedPort = this.#workerPorts.get(params?.port);
23722389
if (cachedPort) {
23732390
if (cachedPort._pendingDestroy) {
23742391
throw new Error(
2375-
"PDFWorker.fromPort - the worker is being destroyed.\n" +
2392+
"PDFWorker.create - the worker is being destroyed.\n" +
23762393
"Please remember to await `PDFDocumentLoadingTask.destroy()`-calls."
23772394
);
23782395
}

test/unit/api_spec.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1082,7 +1082,7 @@ describe("api", function () {
10821082
getDocument(tracemonkeyGetDocumentParams);
10831083
}).toThrow(
10841084
new Error(
1085-
"PDFWorker.fromPort - the worker is being destroyed.\n" +
1085+
"PDFWorker.create - the worker is being destroyed.\n" +
10861086
"Please remember to await `PDFDocumentLoadingTask.destroy()`-calls."
10871087
)
10881088
);

0 commit comments

Comments
 (0)