worker.js 21 KB

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