worker.js 24 KB

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