[api-major] Refactor PDFWorker to be initialized with a parameter object, rather than a bunch of regular parameters

This commit is contained in:
Jonas Jenwald 2018-02-14 16:03:54 +01:00
parent c3c1fc511d
commit 83d52518da
2 changed files with 34 additions and 15 deletions

View File

@ -125,8 +125,8 @@ function setPDFNetworkStreamFactory(pdfNetworkStreamFactory) {
* @property {number} rangeChunkSize - Optional parameter to specify * @property {number} rangeChunkSize - Optional parameter to specify
* maximum number of bytes fetched per range request. The default value is * maximum number of bytes fetched per range request. The default value is
* 2^16 = 65536. * 2^16 = 65536.
* @property {PDFWorker} worker - The worker that will be used for the loading * @property {PDFWorker} worker - (optional) The worker that will be used for
* and parsing of the PDF data. * the loading and parsing of the PDF data.
* @property {string} docBaseUrl - (optional) The base URL of the document, * @property {string} docBaseUrl - (optional) The base URL of the document,
* used when attempting to recover valid absolute URLs for annotations, and * used when attempting to recover valid absolute URLs for annotations, and
* outline items, that (incorrectly) only specify relative URLs. * outline items, that (incorrectly) only specify relative URLs.
@ -193,7 +193,7 @@ function getDocument(src) {
var params = {}; var params = {};
var rangeTransport = null; var rangeTransport = null;
var worker = null; let worker = null;
var CMapReaderFactory = DOMCMapReaderFactory; var CMapReaderFactory = DOMCMapReaderFactory;
for (var key in source) { for (var key in source) {
@ -240,10 +240,17 @@ function getDocument(src) {
} }
if (!worker) { if (!worker) {
const workerParams = {
};
// Worker was not provided -- creating and owning our own. If message port // Worker was not provided -- creating and owning our own. If message port
// is specified in global worker options, using it. // is specified in global worker options, using it.
let workerPort = GlobalWorkerOptions.workerPort; let workerPort = GlobalWorkerOptions.workerPort;
worker = workerPort ? PDFWorker.fromPort(workerPort) : new PDFWorker(); if (workerPort) {
workerParams.port = workerPort;
worker = PDFWorker.fromPort(workerParams);
} else {
worker = new PDFWorker(workerParams);
}
task._worker = worker; task._worker = worker;
} }
var docId = task.docId; var docId = task.docId;
@ -1192,9 +1199,15 @@ class LoopbackPort {
} }
} }
/**
* @typedef {Object} PDFWorkerParameters
* @property {string} name - (optional) The name of the worker.
* @property {Object} port - (optional) The `workerPort`.
*/
/** /**
* PDF.js web worker abstraction, it controls instantiation of PDF documents and * PDF.js web worker abstraction, it controls instantiation of PDF documents and
* WorkerTransport for them. If creation of a web worker is not possible, * WorkerTransport for them. If creation of a web worker is not possible,
* a "fake" worker will be used instead. * a "fake" worker will be used instead.
* @class * @class
*/ */
@ -1280,7 +1293,10 @@ var PDFWorker = (function PDFWorkerClosure() {
let pdfWorkerPorts = new WeakMap(); let pdfWorkerPorts = new WeakMap();
function PDFWorker(name, port) { /**
* @param {PDFWorkerParameters} params - The worker initialization parameters.
*/
function PDFWorker({ name = null, port = null, } = {}) {
if (port && pdfWorkerPorts.has(port)) { if (port && pdfWorkerPorts.has(port)) {
throw new Error('Cannot use more than one PDFWorker per port'); throw new Error('Cannot use more than one PDFWorker per port');
} }
@ -1495,11 +1511,14 @@ var PDFWorker = (function PDFWorkerClosure() {
}, },
}; };
PDFWorker.fromPort = function (port) { /**
if (pdfWorkerPorts.has(port)) { * @param {PDFWorkerParameters} params - The worker initialization parameters.
return pdfWorkerPorts.get(port); */
PDFWorker.fromPort = function(params) {
if (pdfWorkerPorts.has(params.port)) {
return pdfWorkerPorts.get(params.port);
} }
return new PDFWorker(null, port); return new PDFWorker(params);
}; };
PDFWorker.getWorkerSrc = function() { PDFWorker.getWorkerSrc = function() {

View File

@ -324,7 +324,7 @@ describe('api', function() {
} }
it('worker created or destroyed', function (done) { it('worker created or destroyed', function (done) {
var worker = new PDFWorker('test1'); var worker = new PDFWorker({ name: 'test1', });
worker.promise.then(function () { worker.promise.then(function () {
expect(worker.name).toEqual('test1'); expect(worker.name).toEqual('test1');
expect(!!worker.port).toEqual(true); expect(!!worker.port).toEqual(true);
@ -361,7 +361,7 @@ describe('api', function() {
}); });
}); });
it('worker created and can be used in getDocument', function (done) { it('worker created and can be used in getDocument', function (done) {
var worker = new PDFWorker('test1'); var worker = new PDFWorker({ name: 'test1', });
var loadingTask = getDocument( var loadingTask = getDocument(
buildGetDocumentParams(basicApiFileName, { buildGetDocumentParams(basicApiFileName, {
worker, worker,
@ -386,9 +386,9 @@ describe('api', function() {
}); });
}); });
it('creates more than one worker', function (done) { it('creates more than one worker', function (done) {
var worker1 = new PDFWorker('test1'); var worker1 = new PDFWorker({ name: 'test1', });
var worker2 = new PDFWorker('test2'); var worker2 = new PDFWorker({ name: 'test2', });
var worker3 = new PDFWorker('test3'); var worker3 = new PDFWorker({ name: 'test3', });
var ready = Promise.all([worker1.promise, worker2.promise, var ready = Promise.all([worker1.promise, worker2.promise,
worker3.promise]); worker3.promise]);
ready.then(function () { ready.then(function () {