2
0

worker.js 22 KB

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