worker.js 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605
  1. /**
  2. * @licstart The following is the entire license notice for the
  3. * Javascript code in this page
  4. *
  5. * Copyright 2017 Mozilla Foundation
  6. *
  7. * Licensed under the Apache License, Version 2.0 (the "License");
  8. * you may not use this file except in compliance with the License.
  9. * You may obtain a copy of the License at
  10. *
  11. * http://www.apache.org/licenses/LICENSE-2.0
  12. *
  13. * Unless required by applicable law or agreed to in writing, software
  14. * distributed under the License is distributed on an "AS IS" BASIS,
  15. * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
  16. * See the License for the specific language governing permissions and
  17. * limitations under the License.
  18. *
  19. * @licend The above is the entire license notice for the
  20. * Javascript code in this page
  21. */
  22. 'use strict';
  23. Object.defineProperty(exports, "__esModule", {
  24. value: true
  25. });
  26. exports.WorkerMessageHandler = exports.WorkerTask = undefined;
  27. var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; };
  28. var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
  29. var _util = require('../shared/util');
  30. var _pdf_manager = require('./pdf_manager');
  31. var _primitives = require('./primitives');
  32. var WorkerTask = function WorkerTaskClosure() {
  33. function WorkerTask(name) {
  34. this.name = name;
  35. this.terminated = false;
  36. this._capability = (0, _util.createPromiseCapability)();
  37. }
  38. WorkerTask.prototype = {
  39. get finished() {
  40. return this._capability.promise;
  41. },
  42. finish: function finish() {
  43. this._capability.resolve();
  44. },
  45. terminate: function terminate() {
  46. this.terminated = true;
  47. },
  48. ensureNotTerminated: function ensureNotTerminated() {
  49. if (this.terminated) {
  50. throw new Error('Worker task was terminated');
  51. }
  52. }
  53. };
  54. return WorkerTask;
  55. }();
  56. ;
  57. var PDFWorkerStream = function PDFWorkerStreamClosure() {
  58. function PDFWorkerStream(msgHandler) {
  59. this._msgHandler = msgHandler;
  60. this._contentLength = null;
  61. this._fullRequestReader = null;
  62. this._rangeRequestReaders = [];
  63. }
  64. PDFWorkerStream.prototype = {
  65. getFullReader: function getFullReader() {
  66. (0, _util.assert)(!this._fullRequestReader);
  67. this._fullRequestReader = new PDFWorkerStreamReader(this._msgHandler);
  68. return this._fullRequestReader;
  69. },
  70. getRangeReader: function getRangeReader(begin, end) {
  71. var reader = new PDFWorkerStreamRangeReader(begin, end, this._msgHandler);
  72. this._rangeRequestReaders.push(reader);
  73. return reader;
  74. },
  75. cancelAllRequests: function cancelAllRequests(reason) {
  76. if (this._fullRequestReader) {
  77. this._fullRequestReader.cancel(reason);
  78. }
  79. var readers = this._rangeRequestReaders.slice(0);
  80. readers.forEach(function (reader) {
  81. reader.cancel(reason);
  82. });
  83. }
  84. };
  85. function PDFWorkerStreamReader(msgHandler) {
  86. var _this = this;
  87. this._msgHandler = msgHandler;
  88. this._contentLength = null;
  89. this._isRangeSupported = false;
  90. this._isStreamingSupported = false;
  91. var readableStream = this._msgHandler.sendWithStream('GetReader');
  92. this._reader = readableStream.getReader();
  93. this._headersReady = this._msgHandler.sendWithPromise('ReaderHeadersReady').then(function (data) {
  94. _this._isStreamingSupported = data.isStreamingSupported;
  95. _this._isRangeSupported = data.isRangeSupported;
  96. _this._contentLength = data.contentLength;
  97. });
  98. }
  99. PDFWorkerStreamReader.prototype = {
  100. get headersReady() {
  101. return this._headersReady;
  102. },
  103. get contentLength() {
  104. return this._contentLength;
  105. },
  106. get isStreamingSupported() {
  107. return this._isStreamingSupported;
  108. },
  109. get isRangeSupported() {
  110. return this._isRangeSupported;
  111. },
  112. read: function read() {
  113. return this._reader.read().then(function (_ref) {
  114. var value = _ref.value,
  115. done = _ref.done;
  116. if (done) {
  117. return {
  118. value: undefined,
  119. done: true
  120. };
  121. }
  122. return {
  123. value: value.buffer,
  124. done: false
  125. };
  126. });
  127. },
  128. cancel: function cancel(reason) {
  129. this._reader.cancel(reason);
  130. }
  131. };
  132. function PDFWorkerStreamRangeReader(begin, end, msgHandler) {
  133. this._msgHandler = msgHandler;
  134. this.onProgress = null;
  135. var readableStream = this._msgHandler.sendWithStream('GetRangeReader', {
  136. begin: begin,
  137. end: end
  138. });
  139. this._reader = readableStream.getReader();
  140. }
  141. PDFWorkerStreamRangeReader.prototype = {
  142. get isStreamingSupported() {
  143. return false;
  144. },
  145. read: function read() {
  146. return this._reader.read().then(function (_ref2) {
  147. var value = _ref2.value,
  148. done = _ref2.done;
  149. if (done) {
  150. return {
  151. value: undefined,
  152. done: true
  153. };
  154. }
  155. return {
  156. value: value.buffer,
  157. done: false
  158. };
  159. });
  160. },
  161. cancel: function cancel(reason) {
  162. this._reader.cancel(reason);
  163. }
  164. };
  165. return PDFWorkerStream;
  166. }();
  167. var WorkerMessageHandler = {
  168. setup: function setup(handler, port) {
  169. var testMessageProcessed = false;
  170. handler.on('test', function wphSetupTest(data) {
  171. if (testMessageProcessed) {
  172. return;
  173. }
  174. testMessageProcessed = true;
  175. if (!(data instanceof Uint8Array)) {
  176. handler.send('test', 'main', false);
  177. return;
  178. }
  179. var supportTransfers = data[0] === 255;
  180. handler.postMessageTransfers = supportTransfers;
  181. var xhr = new XMLHttpRequest();
  182. var responseExists = 'response' in xhr;
  183. try {
  184. xhr.responseType;
  185. } catch (e) {
  186. responseExists = false;
  187. }
  188. if (!responseExists) {
  189. handler.send('test', false);
  190. return;
  191. }
  192. handler.send('test', {
  193. supportTypedArray: true,
  194. supportTransfers: supportTransfers
  195. });
  196. });
  197. handler.on('configure', function wphConfigure(data) {
  198. (0, _util.setVerbosityLevel)(data.verbosity);
  199. });
  200. handler.on('GetDocRequest', function wphSetupDoc(data) {
  201. return WorkerMessageHandler.createDocumentHandler(data, port);
  202. });
  203. },
  204. createDocumentHandler: function createDocumentHandler(docParams, port) {
  205. var pdfManager;
  206. var terminated = false;
  207. var cancelXHRs = null;
  208. var WorkerTasks = [];
  209. var apiVersion = docParams.apiVersion;
  210. var workerVersion = '2.0.254';
  211. if (apiVersion !== null && apiVersion !== workerVersion) {
  212. throw new Error('The API version "' + apiVersion + '" does not match ' + ('the Worker version "' + workerVersion + '".'));
  213. }
  214. var docId = docParams.docId;
  215. var docBaseUrl = docParams.docBaseUrl;
  216. var workerHandlerName = docParams.docId + '_worker';
  217. var handler = new _util.MessageHandler(workerHandlerName, docId, port);
  218. handler.postMessageTransfers = docParams.postMessageTransfers;
  219. function ensureNotTerminated() {
  220. if (terminated) {
  221. throw new Error('Worker was terminated');
  222. }
  223. }
  224. function startWorkerTask(task) {
  225. WorkerTasks.push(task);
  226. }
  227. function finishWorkerTask(task) {
  228. task.finish();
  229. var i = WorkerTasks.indexOf(task);
  230. WorkerTasks.splice(i, 1);
  231. }
  232. function loadDocument(recoveryMode) {
  233. var loadDocumentCapability = (0, _util.createPromiseCapability)();
  234. var parseSuccess = function parseSuccess() {
  235. Promise.all([pdfManager.ensureDoc('numPages'), pdfManager.ensureDoc('fingerprint')]).then(function (_ref3) {
  236. var _ref4 = _slicedToArray(_ref3, 2),
  237. numPages = _ref4[0],
  238. fingerprint = _ref4[1];
  239. loadDocumentCapability.resolve({
  240. numPages: numPages,
  241. fingerprint: fingerprint
  242. });
  243. }, parseFailure);
  244. };
  245. var parseFailure = function parseFailure(e) {
  246. loadDocumentCapability.reject(e);
  247. };
  248. pdfManager.ensureDoc('checkHeader', []).then(function () {
  249. pdfManager.ensureDoc('parseStartXRef', []).then(function () {
  250. pdfManager.ensureDoc('parse', [recoveryMode]).then(parseSuccess, parseFailure);
  251. }, parseFailure);
  252. }, parseFailure);
  253. return loadDocumentCapability.promise;
  254. }
  255. function getPdfManager(data, evaluatorOptions) {
  256. var pdfManagerCapability = (0, _util.createPromiseCapability)();
  257. var pdfManager;
  258. var source = data.source;
  259. if (source.data) {
  260. try {
  261. pdfManager = new _pdf_manager.LocalPdfManager(docId, source.data, source.password, evaluatorOptions, docBaseUrl);
  262. pdfManagerCapability.resolve(pdfManager);
  263. } catch (ex) {
  264. pdfManagerCapability.reject(ex);
  265. }
  266. return pdfManagerCapability.promise;
  267. }
  268. var pdfStream,
  269. cachedChunks = [];
  270. try {
  271. pdfStream = new PDFWorkerStream(handler);
  272. } catch (ex) {
  273. pdfManagerCapability.reject(ex);
  274. return pdfManagerCapability.promise;
  275. }
  276. var fullRequest = pdfStream.getFullReader();
  277. fullRequest.headersReady.then(function () {
  278. if (!fullRequest.isRangeSupported) {
  279. return;
  280. }
  281. var disableAutoFetch = source.disableAutoFetch || fullRequest.isStreamingSupported;
  282. pdfManager = new _pdf_manager.NetworkPdfManager(docId, pdfStream, {
  283. msgHandler: handler,
  284. url: source.url,
  285. password: source.password,
  286. length: fullRequest.contentLength,
  287. disableAutoFetch: disableAutoFetch,
  288. rangeChunkSize: source.rangeChunkSize
  289. }, evaluatorOptions, docBaseUrl);
  290. for (var i = 0; i < cachedChunks.length; i++) {
  291. pdfManager.sendProgressiveData(cachedChunks[i]);
  292. }
  293. cachedChunks = [];
  294. pdfManagerCapability.resolve(pdfManager);
  295. cancelXHRs = null;
  296. }).catch(function (reason) {
  297. pdfManagerCapability.reject(reason);
  298. cancelXHRs = null;
  299. });
  300. var loaded = 0;
  301. var flushChunks = function flushChunks() {
  302. var pdfFile = (0, _util.arraysToBytes)(cachedChunks);
  303. if (source.length && pdfFile.length !== source.length) {
  304. (0, _util.warn)('reported HTTP length is different from actual');
  305. }
  306. try {
  307. pdfManager = new _pdf_manager.LocalPdfManager(docId, pdfFile, source.password, evaluatorOptions, docBaseUrl);
  308. pdfManagerCapability.resolve(pdfManager);
  309. } catch (ex) {
  310. pdfManagerCapability.reject(ex);
  311. }
  312. cachedChunks = [];
  313. };
  314. var readPromise = new Promise(function (resolve, reject) {
  315. var readChunk = function readChunk(chunk) {
  316. try {
  317. ensureNotTerminated();
  318. if (chunk.done) {
  319. if (!pdfManager) {
  320. flushChunks();
  321. }
  322. cancelXHRs = null;
  323. return;
  324. }
  325. var data = chunk.value;
  326. loaded += (0, _util.arrayByteLength)(data);
  327. if (!fullRequest.isStreamingSupported) {
  328. handler.send('DocProgress', {
  329. loaded: loaded,
  330. total: Math.max(loaded, fullRequest.contentLength || 0)
  331. });
  332. }
  333. if (pdfManager) {
  334. pdfManager.sendProgressiveData(data);
  335. } else {
  336. cachedChunks.push(data);
  337. }
  338. fullRequest.read().then(readChunk, reject);
  339. } catch (e) {
  340. reject(e);
  341. }
  342. };
  343. fullRequest.read().then(readChunk, reject);
  344. });
  345. readPromise.catch(function (e) {
  346. pdfManagerCapability.reject(e);
  347. cancelXHRs = null;
  348. });
  349. cancelXHRs = function cancelXHRs() {
  350. pdfStream.cancelAllRequests('abort');
  351. };
  352. return pdfManagerCapability.promise;
  353. }
  354. function setupDoc(data) {
  355. function onSuccess(doc) {
  356. ensureNotTerminated();
  357. handler.send('GetDoc', { pdfInfo: doc });
  358. }
  359. function onFailure(e) {
  360. ensureNotTerminated();
  361. if (e instanceof _util.PasswordException) {
  362. var task = new WorkerTask('PasswordException: response ' + e.code);
  363. startWorkerTask(task);
  364. handler.sendWithPromise('PasswordRequest', e).then(function (data) {
  365. finishWorkerTask(task);
  366. pdfManager.updatePassword(data.password);
  367. pdfManagerReady();
  368. }).catch(function (ex) {
  369. finishWorkerTask(task);
  370. handler.send('PasswordException', ex);
  371. }.bind(null, e));
  372. } else if (e instanceof _util.InvalidPDFException) {
  373. handler.send('InvalidPDF', e);
  374. } else if (e instanceof _util.MissingPDFException) {
  375. handler.send('MissingPDF', e);
  376. } else if (e instanceof _util.UnexpectedResponseException) {
  377. handler.send('UnexpectedResponse', e);
  378. } else {
  379. handler.send('UnknownError', new _util.UnknownErrorException(e.message, e.toString()));
  380. }
  381. }
  382. function pdfManagerReady() {
  383. ensureNotTerminated();
  384. loadDocument(false).then(onSuccess, function loadFailure(ex) {
  385. ensureNotTerminated();
  386. if (!(ex instanceof _util.XRefParseException)) {
  387. onFailure(ex);
  388. return;
  389. }
  390. pdfManager.requestLoadedStream();
  391. pdfManager.onLoadedStream().then(function () {
  392. ensureNotTerminated();
  393. loadDocument(true).then(onSuccess, onFailure);
  394. });
  395. }, onFailure);
  396. }
  397. ensureNotTerminated();
  398. var evaluatorOptions = {
  399. forceDataSchema: data.disableCreateObjectURL,
  400. maxImageSize: data.maxImageSize === undefined ? -1 : data.maxImageSize,
  401. disableFontFace: data.disableFontFace,
  402. nativeImageDecoderSupport: data.nativeImageDecoderSupport,
  403. ignoreErrors: data.ignoreErrors,
  404. isEvalSupported: data.isEvalSupported
  405. };
  406. getPdfManager(data, evaluatorOptions).then(function (newPdfManager) {
  407. if (terminated) {
  408. newPdfManager.terminate();
  409. throw new Error('Worker was terminated');
  410. }
  411. pdfManager = newPdfManager;
  412. handler.send('PDFManagerReady', null);
  413. pdfManager.onLoadedStream().then(function (stream) {
  414. handler.send('DataLoaded', { length: stream.bytes.byteLength });
  415. });
  416. }).then(pdfManagerReady, onFailure);
  417. }
  418. handler.on('GetPage', function wphSetupGetPage(data) {
  419. return pdfManager.getPage(data.pageIndex).then(function (page) {
  420. var rotatePromise = pdfManager.ensure(page, 'rotate');
  421. var refPromise = pdfManager.ensure(page, 'ref');
  422. var userUnitPromise = pdfManager.ensure(page, 'userUnit');
  423. var viewPromise = pdfManager.ensure(page, 'view');
  424. return Promise.all([rotatePromise, refPromise, userUnitPromise, viewPromise]).then(function (results) {
  425. return {
  426. rotate: results[0],
  427. ref: results[1],
  428. userUnit: results[2],
  429. view: results[3]
  430. };
  431. });
  432. });
  433. });
  434. handler.on('GetPageIndex', function wphSetupGetPageIndex(data) {
  435. var ref = new _primitives.Ref(data.ref.num, data.ref.gen);
  436. var catalog = pdfManager.pdfDocument.catalog;
  437. return catalog.getPageIndex(ref);
  438. });
  439. handler.on('GetDestinations', function wphSetupGetDestinations(data) {
  440. return pdfManager.ensureCatalog('destinations');
  441. });
  442. handler.on('GetDestination', function wphSetupGetDestination(data) {
  443. return pdfManager.ensureCatalog('getDestination', [data.id]);
  444. });
  445. handler.on('GetPageLabels', function wphSetupGetPageLabels(data) {
  446. return pdfManager.ensureCatalog('pageLabels');
  447. });
  448. handler.on('GetPageMode', function wphSetupGetPageMode(data) {
  449. return pdfManager.ensureCatalog('pageMode');
  450. });
  451. handler.on('GetAttachments', function wphSetupGetAttachments(data) {
  452. return pdfManager.ensureCatalog('attachments');
  453. });
  454. handler.on('GetJavaScript', function wphSetupGetJavaScript(data) {
  455. return pdfManager.ensureCatalog('javaScript');
  456. });
  457. handler.on('GetOutline', function wphSetupGetOutline(data) {
  458. return pdfManager.ensureCatalog('documentOutline');
  459. });
  460. handler.on('GetMetadata', function wphSetupGetMetadata(data) {
  461. return Promise.all([pdfManager.ensureDoc('documentInfo'), pdfManager.ensureCatalog('metadata')]);
  462. });
  463. handler.on('GetData', function wphSetupGetData(data) {
  464. pdfManager.requestLoadedStream();
  465. return pdfManager.onLoadedStream().then(function (stream) {
  466. return stream.bytes;
  467. });
  468. });
  469. handler.on('GetStats', function wphSetupGetStats(data) {
  470. return pdfManager.pdfDocument.xref.stats;
  471. });
  472. handler.on('GetAnnotations', function wphSetupGetAnnotations(data) {
  473. return pdfManager.getPage(data.pageIndex).then(function (page) {
  474. return pdfManager.ensure(page, 'getAnnotationsData', [data.intent]);
  475. });
  476. });
  477. handler.on('RenderPageRequest', function wphSetupRenderPage(data) {
  478. var pageIndex = data.pageIndex;
  479. pdfManager.getPage(pageIndex).then(function (page) {
  480. var task = new WorkerTask('RenderPageRequest: page ' + pageIndex);
  481. startWorkerTask(task);
  482. var pageNum = pageIndex + 1;
  483. var start = Date.now();
  484. page.getOperatorList({
  485. handler: handler,
  486. task: task,
  487. intent: data.intent,
  488. renderInteractiveForms: data.renderInteractiveForms
  489. }).then(function (operatorList) {
  490. finishWorkerTask(task);
  491. (0, _util.info)('page=' + pageNum + ' - getOperatorList: time=' + (Date.now() - start) + 'ms, len=' + operatorList.totalLength);
  492. }, function (e) {
  493. finishWorkerTask(task);
  494. if (task.terminated) {
  495. return;
  496. }
  497. handler.send('UnsupportedFeature', { featureId: _util.UNSUPPORTED_FEATURES.unknown });
  498. var minimumStackMessage = 'worker.js: while trying to getPage() and getOperatorList()';
  499. var wrappedException;
  500. if (typeof e === 'string') {
  501. wrappedException = {
  502. message: e,
  503. stack: minimumStackMessage
  504. };
  505. } else if ((typeof e === 'undefined' ? 'undefined' : _typeof(e)) === 'object') {
  506. wrappedException = {
  507. message: e.message || e.toString(),
  508. stack: e.stack || minimumStackMessage
  509. };
  510. } else {
  511. wrappedException = {
  512. message: 'Unknown exception type: ' + (typeof e === 'undefined' ? 'undefined' : _typeof(e)),
  513. stack: minimumStackMessage
  514. };
  515. }
  516. handler.send('PageError', {
  517. pageNum: pageNum,
  518. error: wrappedException,
  519. intent: data.intent
  520. });
  521. });
  522. });
  523. }, this);
  524. handler.on('GetTextContent', function wphExtractText(data, sink) {
  525. var pageIndex = data.pageIndex;
  526. sink.onPull = function (desiredSize) {};
  527. sink.onCancel = function (reason) {};
  528. pdfManager.getPage(pageIndex).then(function (page) {
  529. var task = new WorkerTask('GetTextContent: page ' + pageIndex);
  530. startWorkerTask(task);
  531. var pageNum = pageIndex + 1;
  532. var start = Date.now();
  533. page.extractTextContent({
  534. handler: handler,
  535. task: task,
  536. sink: sink,
  537. normalizeWhitespace: data.normalizeWhitespace,
  538. combineTextItems: data.combineTextItems
  539. }).then(function () {
  540. finishWorkerTask(task);
  541. (0, _util.info)('text indexing: page=' + pageNum + ' - time=' + (Date.now() - start) + 'ms');
  542. sink.close();
  543. }, function (reason) {
  544. finishWorkerTask(task);
  545. if (task.terminated) {
  546. return;
  547. }
  548. sink.error(reason);
  549. throw reason;
  550. });
  551. });
  552. });
  553. handler.on('Cleanup', function wphCleanup(data) {
  554. return pdfManager.cleanup();
  555. });
  556. handler.on('Terminate', function wphTerminate(data) {
  557. terminated = true;
  558. if (pdfManager) {
  559. pdfManager.terminate();
  560. pdfManager = null;
  561. }
  562. if (cancelXHRs) {
  563. cancelXHRs();
  564. }
  565. var waitOn = [];
  566. WorkerTasks.forEach(function (task) {
  567. waitOn.push(task.finished);
  568. task.terminate();
  569. });
  570. return Promise.all(waitOn).then(function () {
  571. handler.destroy();
  572. handler = null;
  573. });
  574. });
  575. handler.on('Ready', function wphReady(data) {
  576. setupDoc(docParams);
  577. docParams = null;
  578. });
  579. return workerHandlerName;
  580. },
  581. initializeFromPort: function initializeFromPort(port) {
  582. var handler = new _util.MessageHandler('worker', 'main', port);
  583. WorkerMessageHandler.setup(handler, port);
  584. handler.send('ready', null);
  585. }
  586. };
  587. function isMessagePort(maybePort) {
  588. return typeof maybePort.postMessage === 'function' && 'onmessage' in maybePort;
  589. }
  590. if (typeof window === 'undefined' && !(0, _util.isNodeJS)() && typeof self !== 'undefined' && isMessagePort(self)) {
  591. WorkerMessageHandler.initializeFromPort(self);
  592. }
  593. exports.WorkerTask = WorkerTask;
  594. exports.WorkerMessageHandler = WorkerMessageHandler;