diff --git a/src/display/api.js b/src/display/api.js index 137e8594a..fcde21d49 100644 --- a/src/display/api.js +++ b/src/display/api.js @@ -264,7 +264,7 @@ function getDocument(src, pdfDataRangeTransport, // Worker was not provided -- creating and owning our own. If message port // is specified in global settings, using it. var workerPort = getDefaultSetting('workerPort'); - worker = workerPort ? new PDFWorker(null, workerPort) : new PDFWorker(); + worker = workerPort ? PDFWorker.fromPort(workerPort) : new PDFWorker(); task._worker = worker; } var docId = task.docId; @@ -1160,7 +1160,7 @@ class LoopbackPort { * @class */ var PDFWorker = (function PDFWorkerClosure() { - var nextFakeWorkerId = 0; + let nextFakeWorkerId = 0; function getWorkerSrc() { if (typeof workerSrc !== 'undefined') { @@ -1177,7 +1177,7 @@ var PDFWorker = (function PDFWorkerClosure() { error('No PDFJS.workerSrc specified'); } - var fakeWorkerFilesLoadedCapability; + let fakeWorkerFilesLoadedCapability; // Loads worker code into main thread. function setupFakeWorkerGlobal() { @@ -1229,7 +1229,13 @@ var PDFWorker = (function PDFWorkerClosure() { return URL.createObjectURL(new Blob([wrapper])); } + let pdfWorkerPorts = new WeakMap(); + function PDFWorker(name, port) { + if (pdfWorkerPorts.has(port)) { + throw new Error('Cannot use more than one PDFWorker per port'); + } + this.name = name; this.destroyed = false; @@ -1239,6 +1245,7 @@ var PDFWorker = (function PDFWorkerClosure() { this._messageHandler = null; if (port) { + pdfWorkerPorts.set(port, this); this._initializeFromPort(port); return; } @@ -1444,6 +1451,13 @@ var PDFWorker = (function PDFWorkerClosure() { }, }; + PDFWorker.fromPort = function (port) { + if (pdfWorkerPorts.has(port)) { + return pdfWorkerPorts.get(port); + } + return new PDFWorker(null, port); + }; + return PDFWorker; })();