/** * @licstart The following is the entire license notice for the * Javascript code in this page * * Copyright 2018 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 = undefined; var _regenerator = require('babel-runtime/regenerator'); var _regenerator2 = _interopRequireDefault(_regenerator); var _util = require('../shared/util'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _asyncToGenerator(fn) { return function () { var gen = fn.apply(this, arguments); return new Promise(function (resolve, reject) { function step(key, arg) { try { var info = gen[key](arg); var value = info.value; } catch (error) { reject(error); return; } if (info.done) { resolve(value); } else { return Promise.resolve(value).then(function (value) { step("next", value); }, function (err) { step("throw", err); }); } } return step("next"); }); }; } var PDFDataTransportStream = function PDFDataTransportStreamClosure() { function PDFDataTransportStream(params, pdfDataRangeTransport) { var _this = this; (0, _util.assert)(pdfDataRangeTransport); this._queuedChunks = []; 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) { _this._onProgress({ loaded: loaded }); }); this._pdfDataRangeTransport.addProgressiveReadListener(function (chunk) { _this._onReceiveData({ chunk: chunk }); }); this._pdfDataRangeTransport.transportReady(); } PDFDataTransportStream.prototype = { _onReceiveData: function PDFDataTransportStream_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); } }, _onProgress: function PDFDataTransportStream_onDataProgress(evt) { if (this._rangeReaders.length > 0) { var firstReader = this._rangeReaders[0]; if (firstReader.onProgress) { firstReader.onProgress({ loaded: evt.loaded }); } } }, _removeRangeReader: function PDFDataTransportStream_removeRangeReader(reader) { var i = this._rangeReaders.indexOf(reader); if (i >= 0) { this._rangeReaders.splice(i, 1); } }, getFullReader: function PDFDataTransportStream_getFullReader() { (0, _util.assert)(!this._fullRequestReader); var queuedChunks = this._queuedChunks; this._queuedChunks = null; return new PDFDataTransportStreamReader(this, queuedChunks); }, getRangeReader: function PDFDataTransportStream_getRangeReader(begin, end) { var reader = new PDFDataTransportStreamRangeReader(this, begin, end); this._pdfDataRangeTransport.requestDataRange(begin, end); this._rangeReaders.push(reader); return reader; }, cancelAllRequests: function PDFDataTransportStream_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(); } }; function PDFDataTransportStreamReader(stream, queuedChunks) { this._stream = stream; this._done = false; this._filename = null; this._queuedChunks = queuedChunks || []; this._requests = []; this._headersReady = Promise.resolve(); stream._fullRequestReader = this; this.onProgress = null; } PDFDataTransportStreamReader.prototype = { _enqueue: function PDFDataTransportStreamReader_enqueue(chunk) { if (this._done) { return; } if (this._requests.length > 0) { var requestCapability = this._requests.shift(); requestCapability.resolve({ value: chunk, done: false }); return; } this._queuedChunks.push(chunk); }, get headersReady() { return this._headersReady; }, get filename() { return this._filename; }, get isRangeSupported() { return this._stream._isRangeSupported; }, get isStreamingSupported() { return this._stream._isStreamingSupported; }, get contentLength() { return this._stream._contentLength; }, read: function () { var _ref = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee() { var chunk, requestCapability; return _regenerator2.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 _ref.apply(this, arguments); } return read; }(), cancel: function PDFDataTransportStreamReader_cancel(reason) { this._done = true; this._requests.forEach(function (requestCapability) { requestCapability.resolve({ value: undefined, done: true }); }); this._requests = []; } }; function PDFDataTransportStreamRangeReader(stream, begin, end) { this._stream = stream; this._begin = begin; this._end = end; this._queuedChunk = null; this._requests = []; this._done = false; this.onProgress = null; } PDFDataTransportStreamRangeReader.prototype = { _enqueue: function PDFDataTransportStreamRangeReader_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); }, get isStreamingSupported() { return false; }, read: function () { var _ref2 = _asyncToGenerator( /*#__PURE__*/_regenerator2.default.mark(function _callee2() { var chunk, requestCapability; return _regenerator2.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 _ref2.apply(this, arguments); } return read; }(), cancel: function PDFDataTransportStreamRangeReader_cancel(reason) { this._done = true; this._requests.forEach(function (requestCapability) { requestCapability.resolve({ value: undefined, done: true }); }); this._requests = []; this._stream._removeRangeReader(this); } }; return PDFDataTransportStream; }(); exports.PDFDataTransportStream = PDFDataTransportStream;