/** * @licstart The following is the entire license notice for the * Javascript code in this page * * Copyright 2019 Mozilla Foundation * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * * @licend The above is the entire license notice for the * Javascript code in this page */ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.PDFDataTransportStream = void 0; var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator")); var _util = require("../shared/util"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } 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); } } 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); }); }; } function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } var PDFDataTransportStream = /*#__PURE__*/ function () { function PDFDataTransportStream(params, pdfDataRangeTransport) { var _this = this; _classCallCheck(this, PDFDataTransportStream); (0, _util.assert)(pdfDataRangeTransport); this._queuedChunks = []; this._progressiveDone = params.progressiveDone || false; var initialData = params.initialData; if (initialData && initialData.length > 0) { var buffer = new Uint8Array(initialData).buffer; this._queuedChunks.push(buffer); } this._pdfDataRangeTransport = pdfDataRangeTransport; this._isStreamingSupported = !params.disableStream; this._isRangeSupported = !params.disableRange; this._contentLength = params.length; this._fullRequestReader = null; this._rangeReaders = []; this._pdfDataRangeTransport.addRangeListener(function (begin, chunk) { _this._onReceiveData({ begin: begin, chunk: chunk }); }); this._pdfDataRangeTransport.addProgressListener(function (loaded, total) { _this._onProgress({ loaded: loaded, total: total }); }); this._pdfDataRangeTransport.addProgressiveReadListener(function (chunk) { _this._onReceiveData({ chunk: chunk }); }); this._pdfDataRangeTransport.addProgressiveDoneListener(function () { _this._onProgressiveDone(); }); this._pdfDataRangeTransport.transportReady(); } _createClass(PDFDataTransportStream, [{ key: "_onReceiveData", value: function _onReceiveData(args) { var buffer = new Uint8Array(args.chunk).buffer; if (args.begin === undefined) { if (this._fullRequestReader) { this._fullRequestReader._enqueue(buffer); } else { this._queuedChunks.push(buffer); } } else { var found = this._rangeReaders.some(function (rangeReader) { if (rangeReader._begin !== args.begin) { return false; } rangeReader._enqueue(buffer); return true; }); (0, _util.assert)(found); } } }, { key: "_onProgress", value: function _onProgress(evt) { if (evt.total === undefined) { var firstReader = this._rangeReaders[0]; if (firstReader && firstReader.onProgress) { firstReader.onProgress({ loaded: evt.loaded }); } } else { var fullReader = this._fullRequestReader; if (fullReader && fullReader.onProgress) { fullReader.onProgress({ loaded: evt.loaded, total: evt.total }); } } } }, { key: "_onProgressiveDone", value: function _onProgressiveDone() { if (this._fullRequestReader) { this._fullRequestReader.progressiveDone(); } this._progressiveDone = true; } }, { key: "_removeRangeReader", value: function _removeRangeReader(reader) { var i = this._rangeReaders.indexOf(reader); if (i >= 0) { this._rangeReaders.splice(i, 1); } } }, { key: "getFullReader", value: function getFullReader() { (0, _util.assert)(!this._fullRequestReader); var queuedChunks = this._queuedChunks; this._queuedChunks = null; return new PDFDataTransportStreamReader(this, queuedChunks, this._progressiveDone); } }, { key: "getRangeReader", value: function getRangeReader(begin, end) { if (end <= this._progressiveDataLength) { return null; } var reader = new PDFDataTransportStreamRangeReader(this, begin, end); this._pdfDataRangeTransport.requestDataRange(begin, end); this._rangeReaders.push(reader); return reader; } }, { key: "cancelAllRequests", value: function cancelAllRequests(reason) { if (this._fullRequestReader) { this._fullRequestReader.cancel(reason); } var readers = this._rangeReaders.slice(0); readers.forEach(function (rangeReader) { rangeReader.cancel(reason); }); this._pdfDataRangeTransport.abort(); } }, { key: "_progressiveDataLength", get: function get() { return this._fullRequestReader ? this._fullRequestReader._loaded : 0; } }]); return PDFDataTransportStream; }(); exports.PDFDataTransportStream = PDFDataTransportStream; var PDFDataTransportStreamReader = /*#__PURE__*/ function () { function PDFDataTransportStreamReader(stream, queuedChunks) { var progressiveDone = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false; _classCallCheck(this, PDFDataTransportStreamReader); this._stream = stream; this._done = progressiveDone || false; this._filename = null; this._queuedChunks = queuedChunks || []; this._loaded = 0; var _iteratorNormalCompletion = true; var _didIteratorError = false; var _iteratorError = undefined; try { for (var _iterator = this._queuedChunks[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) { var chunk = _step.value; this._loaded += chunk.byteLength; } } catch (err) { _didIteratorError = true; _iteratorError = err; } finally { try { if (!_iteratorNormalCompletion && _iterator["return"] != null) { _iterator["return"](); } } finally { if (_didIteratorError) { throw _iteratorError; } } } this._requests = []; this._headersReady = Promise.resolve(); stream._fullRequestReader = this; this.onProgress = null; } _createClass(PDFDataTransportStreamReader, [{ key: "_enqueue", value: function _enqueue(chunk) { if (this._done) { return; } if (this._requests.length > 0) { var requestCapability = this._requests.shift(); requestCapability.resolve({ value: chunk, done: false }); } else { this._queuedChunks.push(chunk); } this._loaded += chunk.byteLength; } }, { key: "read", value: function () { var _read = _asyncToGenerator( /*#__PURE__*/ _regenerator["default"].mark(function _callee() { var chunk, requestCapability; return _regenerator["default"].wrap(function _callee$(_context) { while (1) { switch (_context.prev = _context.next) { case 0: if (!(this._queuedChunks.length > 0)) { _context.next = 3; break; } chunk = this._queuedChunks.shift(); return _context.abrupt("return", { value: chunk, done: false }); case 3: if (!this._done) { _context.next = 5; break; } return _context.abrupt("return", { value: undefined, done: true }); case 5: requestCapability = (0, _util.createPromiseCapability)(); this._requests.push(requestCapability); return _context.abrupt("return", requestCapability.promise); case 8: case "end": return _context.stop(); } } }, _callee, this); })); function read() { return _read.apply(this, arguments); } return read; }() }, { key: "cancel", value: function cancel(reason) { this._done = true; this._requests.forEach(function (requestCapability) { requestCapability.resolve({ value: undefined, done: true }); }); this._requests = []; } }, { key: "progressiveDone", value: function progressiveDone() { if (this._done) { return; } this._done = true; } }, { key: "headersReady", get: function get() { return this._headersReady; } }, { key: "filename", get: function get() { return this._filename; } }, { key: "isRangeSupported", get: function get() { return this._stream._isRangeSupported; } }, { key: "isStreamingSupported", get: function get() { return this._stream._isStreamingSupported; } }, { key: "contentLength", get: function get() { return this._stream._contentLength; } }]); return PDFDataTransportStreamReader; }(); var PDFDataTransportStreamRangeReader = /*#__PURE__*/ function () { function PDFDataTransportStreamRangeReader(stream, begin, end) { _classCallCheck(this, PDFDataTransportStreamRangeReader); this._stream = stream; this._begin = begin; this._end = end; this._queuedChunk = null; this._requests = []; this._done = false; this.onProgress = null; } _createClass(PDFDataTransportStreamRangeReader, [{ key: "_enqueue", value: function _enqueue(chunk) { if (this._done) { return; } if (this._requests.length === 0) { this._queuedChunk = chunk; } else { var requestsCapability = this._requests.shift(); requestsCapability.resolve({ value: chunk, done: false }); this._requests.forEach(function (requestCapability) { requestCapability.resolve({ value: undefined, done: true }); }); this._requests = []; } this._done = true; this._stream._removeRangeReader(this); } }, { key: "read", value: function () { var _read2 = _asyncToGenerator( /*#__PURE__*/ _regenerator["default"].mark(function _callee2() { var chunk, requestCapability; return _regenerator["default"].wrap(function _callee2$(_context2) { while (1) { switch (_context2.prev = _context2.next) { case 0: if (!this._queuedChunk) { _context2.next = 4; break; } chunk = this._queuedChunk; this._queuedChunk = null; return _context2.abrupt("return", { value: chunk, done: false }); case 4: if (!this._done) { _context2.next = 6; break; } return _context2.abrupt("return", { value: undefined, done: true }); case 6: requestCapability = (0, _util.createPromiseCapability)(); this._requests.push(requestCapability); return _context2.abrupt("return", requestCapability.promise); case 9: case "end": return _context2.stop(); } } }, _callee2, this); })); function read() { return _read2.apply(this, arguments); } return read; }() }, { key: "cancel", value: function cancel(reason) { this._done = true; this._requests.forEach(function (requestCapability) { requestCapability.resolve({ value: undefined, done: true }); }); this._requests = []; this._stream._removeRangeReader(this); } }, { key: "isStreamingSupported", get: function get() { return false; } }]); return PDFDataTransportStreamRangeReader; }();