Utilize private fields and methods more in the PDFWorker class
This replaces, wherever possible, the old semi-private fields and methods with actually private ones.
This commit is contained in:
parent
ab672f0b77
commit
fc697b3602
@ -2091,6 +2091,14 @@ class LoopbackPort {
|
|||||||
* @param {PDFWorkerParameters} params - The worker initialization parameters.
|
* @param {PDFWorkerParameters} params - The worker initialization parameters.
|
||||||
*/
|
*/
|
||||||
class PDFWorker {
|
class PDFWorker {
|
||||||
|
#capability = Promise.withResolvers();
|
||||||
|
|
||||||
|
#messageHandler = null;
|
||||||
|
|
||||||
|
#port = null;
|
||||||
|
|
||||||
|
#webWorker = null;
|
||||||
|
|
||||||
static #fakeWorkerId = 0;
|
static #fakeWorkerId = 0;
|
||||||
|
|
||||||
static #isWorkerDisabled = false;
|
static #isWorkerDisabled = false;
|
||||||
@ -2158,20 +2166,24 @@ class PDFWorker {
|
|||||||
this.destroyed = false;
|
this.destroyed = false;
|
||||||
this.verbosity = verbosity;
|
this.verbosity = verbosity;
|
||||||
|
|
||||||
this._readyCapability = Promise.withResolvers();
|
|
||||||
this._port = null;
|
|
||||||
this._webWorker = null;
|
|
||||||
this._messageHandler = null;
|
|
||||||
|
|
||||||
if (port) {
|
if (port) {
|
||||||
if (PDFWorker.#workerPorts.has(port)) {
|
if (PDFWorker.#workerPorts.has(port)) {
|
||||||
throw new Error("Cannot use more than one PDFWorker per port.");
|
throw new Error("Cannot use more than one PDFWorker per port.");
|
||||||
}
|
}
|
||||||
PDFWorker.#workerPorts.set(port, this);
|
PDFWorker.#workerPorts.set(port, this);
|
||||||
this._initializeFromPort(port);
|
this.#initializeFromPort(port);
|
||||||
return;
|
} else {
|
||||||
|
this.#initialize();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (typeof PDFJSDev === "undefined" || PDFJSDev.test("TESTING")) {
|
||||||
|
// For testing purposes.
|
||||||
|
Object.defineProperty(this, "_webWorker", {
|
||||||
|
get() {
|
||||||
|
return this.#webWorker;
|
||||||
|
},
|
||||||
|
});
|
||||||
}
|
}
|
||||||
this._initialize();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -2179,13 +2191,13 @@ class PDFWorker {
|
|||||||
* @type {Promise<void>}
|
* @type {Promise<void>}
|
||||||
*/
|
*/
|
||||||
get promise() {
|
get promise() {
|
||||||
return this._readyCapability.promise;
|
return this.#capability.promise;
|
||||||
}
|
}
|
||||||
|
|
||||||
#resolve() {
|
#resolve() {
|
||||||
this._readyCapability.resolve();
|
this.#capability.resolve();
|
||||||
// Send global setting, e.g. verbosity level.
|
// Send global setting, e.g. verbosity level.
|
||||||
this._messageHandler.send("configure", {
|
this.#messageHandler.send("configure", {
|
||||||
verbosity: this.verbosity,
|
verbosity: this.verbosity,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -2195,7 +2207,7 @@ class PDFWorker {
|
|||||||
* @type {Worker}
|
* @type {Worker}
|
||||||
*/
|
*/
|
||||||
get port() {
|
get port() {
|
||||||
return this._port;
|
return this.#port;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -2203,20 +2215,20 @@ class PDFWorker {
|
|||||||
* @type {MessageHandler}
|
* @type {MessageHandler}
|
||||||
*/
|
*/
|
||||||
get messageHandler() {
|
get messageHandler() {
|
||||||
return this._messageHandler;
|
return this.#messageHandler;
|
||||||
}
|
}
|
||||||
|
|
||||||
_initializeFromPort(port) {
|
#initializeFromPort(port) {
|
||||||
this._port = port;
|
this.#port = port;
|
||||||
this._messageHandler = new MessageHandler("main", "worker", port);
|
this.#messageHandler = new MessageHandler("main", "worker", port);
|
||||||
this._messageHandler.on("ready", function () {
|
this.#messageHandler.on("ready", () => {
|
||||||
// Ignoring "ready" event -- MessageHandler should already be initialized
|
// Ignoring "ready" event -- MessageHandler should already be initialized
|
||||||
// and ready to accept messages.
|
// and ready to accept messages.
|
||||||
});
|
});
|
||||||
this.#resolve();
|
this.#resolve();
|
||||||
}
|
}
|
||||||
|
|
||||||
_initialize() {
|
#initialize() {
|
||||||
// If worker support isn't disabled explicit and the browser has worker
|
// If worker support isn't disabled explicit and the browser has worker
|
||||||
// support, create a new web worker and test if it/the browser fulfills
|
// support, create a new web worker and test if it/the browser fulfills
|
||||||
// all requirements to run parts of pdf.js in a web worker.
|
// all requirements to run parts of pdf.js in a web worker.
|
||||||
@ -2226,7 +2238,7 @@ class PDFWorker {
|
|||||||
PDFWorker.#isWorkerDisabled ||
|
PDFWorker.#isWorkerDisabled ||
|
||||||
PDFWorker.#mainThreadWorkerMessageHandler
|
PDFWorker.#mainThreadWorkerMessageHandler
|
||||||
) {
|
) {
|
||||||
this._setupFakeWorker();
|
this.#setupFakeWorker();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
let { workerSrc } = PDFWorker;
|
let { workerSrc } = PDFWorker;
|
||||||
@ -2251,11 +2263,11 @@ class PDFWorker {
|
|||||||
messageHandler.destroy();
|
messageHandler.destroy();
|
||||||
worker.terminate();
|
worker.terminate();
|
||||||
if (this.destroyed) {
|
if (this.destroyed) {
|
||||||
this._readyCapability.reject(new Error("Worker was destroyed"));
|
this.#capability.reject(new Error("Worker was destroyed"));
|
||||||
} else {
|
} else {
|
||||||
// Fall back to fake worker if the termination is caused by an
|
// Fall back to fake worker if the termination is caused by an
|
||||||
// error (e.g. NetworkError / SecurityError).
|
// error (e.g. NetworkError / SecurityError).
|
||||||
this._setupFakeWorker();
|
this.#setupFakeWorker();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -2263,7 +2275,7 @@ class PDFWorker {
|
|||||||
worker.addEventListener(
|
worker.addEventListener(
|
||||||
"error",
|
"error",
|
||||||
() => {
|
() => {
|
||||||
if (!this._webWorker) {
|
if (!this.#webWorker) {
|
||||||
// Worker failed to initialize due to an error. Clean up and fall
|
// Worker failed to initialize due to an error. Clean up and fall
|
||||||
// back to the fake worker.
|
// back to the fake worker.
|
||||||
terminateEarly();
|
terminateEarly();
|
||||||
@ -2278,9 +2290,9 @@ class PDFWorker {
|
|||||||
terminateEarly();
|
terminateEarly();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
this._messageHandler = messageHandler;
|
this.#messageHandler = messageHandler;
|
||||||
this._port = worker;
|
this.#port = worker;
|
||||||
this._webWorker = worker;
|
this.#webWorker = worker;
|
||||||
|
|
||||||
this.#resolve();
|
this.#resolve();
|
||||||
});
|
});
|
||||||
@ -2295,7 +2307,7 @@ class PDFWorker {
|
|||||||
sendTest();
|
sendTest();
|
||||||
} catch {
|
} catch {
|
||||||
// We need fallback to a faked worker.
|
// We need fallback to a faked worker.
|
||||||
this._setupFakeWorker();
|
this.#setupFakeWorker();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -2315,10 +2327,10 @@ class PDFWorker {
|
|||||||
}
|
}
|
||||||
// Either workers are not supported or have thrown an exception.
|
// Either workers are not supported or have thrown an exception.
|
||||||
// Thus, we fallback to a faked worker.
|
// Thus, we fallback to a faked worker.
|
||||||
this._setupFakeWorker();
|
this.#setupFakeWorker();
|
||||||
}
|
}
|
||||||
|
|
||||||
_setupFakeWorker() {
|
#setupFakeWorker() {
|
||||||
if (!PDFWorker.#isWorkerDisabled) {
|
if (!PDFWorker.#isWorkerDisabled) {
|
||||||
warn("Setting up fake worker.");
|
warn("Setting up fake worker.");
|
||||||
PDFWorker.#isWorkerDisabled = true;
|
PDFWorker.#isWorkerDisabled = true;
|
||||||
@ -2327,11 +2339,11 @@ class PDFWorker {
|
|||||||
PDFWorker._setupFakeWorkerGlobal
|
PDFWorker._setupFakeWorkerGlobal
|
||||||
.then(WorkerMessageHandler => {
|
.then(WorkerMessageHandler => {
|
||||||
if (this.destroyed) {
|
if (this.destroyed) {
|
||||||
this._readyCapability.reject(new Error("Worker was destroyed"));
|
this.#capability.reject(new Error("Worker was destroyed"));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const port = new LoopbackPort();
|
const port = new LoopbackPort();
|
||||||
this._port = port;
|
this.#port = port;
|
||||||
|
|
||||||
// All fake workers use the same port, making id unique.
|
// All fake workers use the same port, making id unique.
|
||||||
const id = `fake${PDFWorker.#fakeWorkerId++}`;
|
const id = `fake${PDFWorker.#fakeWorkerId++}`;
|
||||||
@ -2341,11 +2353,11 @@ class PDFWorker {
|
|||||||
const workerHandler = new MessageHandler(id + "_worker", id, port);
|
const workerHandler = new MessageHandler(id + "_worker", id, port);
|
||||||
WorkerMessageHandler.setup(workerHandler, port);
|
WorkerMessageHandler.setup(workerHandler, port);
|
||||||
|
|
||||||
this._messageHandler = new MessageHandler(id, id + "_worker", port);
|
this.#messageHandler = new MessageHandler(id, id + "_worker", port);
|
||||||
this.#resolve();
|
this.#resolve();
|
||||||
})
|
})
|
||||||
.catch(reason => {
|
.catch(reason => {
|
||||||
this._readyCapability.reject(
|
this.#capability.reject(
|
||||||
new Error(`Setting up fake worker failed: "${reason.message}".`)
|
new Error(`Setting up fake worker failed: "${reason.message}".`)
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
@ -2358,14 +2370,14 @@ class PDFWorker {
|
|||||||
this.destroyed = true;
|
this.destroyed = true;
|
||||||
|
|
||||||
// We need to terminate only web worker created resource.
|
// We need to terminate only web worker created resource.
|
||||||
this._webWorker?.terminate();
|
this.#webWorker?.terminate();
|
||||||
this._webWorker = null;
|
this.#webWorker = null;
|
||||||
|
|
||||||
PDFWorker.#workerPorts.delete(this._port);
|
PDFWorker.#workerPorts.delete(this.#port);
|
||||||
this._port = null;
|
this.#port = null;
|
||||||
|
|
||||||
this._messageHandler?.destroy();
|
this.#messageHandler?.destroy();
|
||||||
this._messageHandler = null;
|
this.#messageHandler = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user