2
0

worker.js 24 KB

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