Merge pull request #10903 from Snuffleupagus/worker-streams
Move `PDFWorkerStream` and related code to its own file
This commit is contained in:
commit
1c9a69db82
@ -14,15 +14,16 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
import {
|
import {
|
||||||
arrayByteLength, arraysToBytes, assert, createPromiseCapability,
|
arrayByteLength, arraysToBytes, createPromiseCapability, getVerbosityLevel,
|
||||||
getVerbosityLevel, info, InvalidPDFException, MissingPDFException,
|
info, InvalidPDFException, MissingPDFException, PasswordException,
|
||||||
PasswordException, setVerbosityLevel, UnexpectedResponseException,
|
setVerbosityLevel, UnexpectedResponseException, UnknownErrorException,
|
||||||
UnknownErrorException, UNSUPPORTED_FEATURES, VerbosityLevel, warn
|
UNSUPPORTED_FEATURES, VerbosityLevel, warn
|
||||||
} from '../shared/util';
|
} from '../shared/util';
|
||||||
import { clearPrimitiveCaches, Ref } from './primitives';
|
import { clearPrimitiveCaches, Ref } from './primitives';
|
||||||
import { LocalPdfManager, NetworkPdfManager } from './pdf_manager';
|
import { LocalPdfManager, NetworkPdfManager } from './pdf_manager';
|
||||||
import isNodeJS from '../shared/is_node';
|
import isNodeJS from '../shared/is_node';
|
||||||
import { MessageHandler } from '../shared/message_handler';
|
import { MessageHandler } from '../shared/message_handler';
|
||||||
|
import { PDFWorkerStream } from './worker_stream';
|
||||||
import { XRefParseException } from './core_utils';
|
import { XRefParseException } from './core_utils';
|
||||||
|
|
||||||
var WorkerTask = (function WorkerTaskClosure() {
|
var WorkerTask = (function WorkerTaskClosure() {
|
||||||
@ -55,122 +56,6 @@ var WorkerTask = (function WorkerTaskClosure() {
|
|||||||
return WorkerTask;
|
return WorkerTask;
|
||||||
})();
|
})();
|
||||||
|
|
||||||
/** @implements {IPDFStream} */
|
|
||||||
var PDFWorkerStream = (function PDFWorkerStreamClosure() {
|
|
||||||
function PDFWorkerStream(msgHandler) {
|
|
||||||
this._msgHandler = msgHandler;
|
|
||||||
this._contentLength = null;
|
|
||||||
this._fullRequestReader = null;
|
|
||||||
this._rangeRequestReaders = [];
|
|
||||||
}
|
|
||||||
PDFWorkerStream.prototype = {
|
|
||||||
getFullReader() {
|
|
||||||
assert(!this._fullRequestReader);
|
|
||||||
this._fullRequestReader = new PDFWorkerStreamReader(this._msgHandler);
|
|
||||||
return this._fullRequestReader;
|
|
||||||
},
|
|
||||||
|
|
||||||
getRangeReader(begin, end) {
|
|
||||||
let reader = new PDFWorkerStreamRangeReader(begin, end, this._msgHandler);
|
|
||||||
this._rangeRequestReaders.push(reader);
|
|
||||||
return reader;
|
|
||||||
},
|
|
||||||
|
|
||||||
cancelAllRequests(reason) {
|
|
||||||
if (this._fullRequestReader) {
|
|
||||||
this._fullRequestReader.cancel(reason);
|
|
||||||
}
|
|
||||||
let readers = this._rangeRequestReaders.slice(0);
|
|
||||||
readers.forEach(function (reader) {
|
|
||||||
reader.cancel(reason);
|
|
||||||
});
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
/** @implements {IPDFStreamReader} */
|
|
||||||
function PDFWorkerStreamReader(msgHandler) {
|
|
||||||
this._msgHandler = msgHandler;
|
|
||||||
|
|
||||||
this._contentLength = null;
|
|
||||||
this._isRangeSupported = false;
|
|
||||||
this._isStreamingSupported = false;
|
|
||||||
|
|
||||||
let readableStream = this._msgHandler.sendWithStream('GetReader');
|
|
||||||
|
|
||||||
this._reader = readableStream.getReader();
|
|
||||||
|
|
||||||
this._headersReady = this._msgHandler.sendWithPromise('ReaderHeadersReady').
|
|
||||||
then((data) => {
|
|
||||||
this._isStreamingSupported = data.isStreamingSupported;
|
|
||||||
this._isRangeSupported = data.isRangeSupported;
|
|
||||||
this._contentLength = data.contentLength;
|
|
||||||
});
|
|
||||||
}
|
|
||||||
PDFWorkerStreamReader.prototype = {
|
|
||||||
get headersReady() {
|
|
||||||
return this._headersReady;
|
|
||||||
},
|
|
||||||
|
|
||||||
get contentLength() {
|
|
||||||
return this._contentLength;
|
|
||||||
},
|
|
||||||
|
|
||||||
get isStreamingSupported() {
|
|
||||||
return this._isStreamingSupported;
|
|
||||||
},
|
|
||||||
|
|
||||||
get isRangeSupported() {
|
|
||||||
return this._isRangeSupported;
|
|
||||||
},
|
|
||||||
|
|
||||||
read() {
|
|
||||||
return this._reader.read().then(function({ value, done, }) {
|
|
||||||
if (done) {
|
|
||||||
return { value: undefined, done: true, };
|
|
||||||
}
|
|
||||||
// `value` is wrapped into Uint8Array, we need to
|
|
||||||
// unwrap it to ArrayBuffer for further processing.
|
|
||||||
return { value: value.buffer, done: false, };
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
cancel(reason) {
|
|
||||||
this._reader.cancel(reason);
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
/** @implements {IPDFStreamRangeReader} */
|
|
||||||
function PDFWorkerStreamRangeReader(begin, end, msgHandler) {
|
|
||||||
this._msgHandler = msgHandler;
|
|
||||||
this.onProgress = null;
|
|
||||||
|
|
||||||
let readableStream = this._msgHandler.sendWithStream('GetRangeReader',
|
|
||||||
{ begin, end, });
|
|
||||||
|
|
||||||
this._reader = readableStream.getReader();
|
|
||||||
}
|
|
||||||
PDFWorkerStreamRangeReader.prototype = {
|
|
||||||
get isStreamingSupported() {
|
|
||||||
return false;
|
|
||||||
},
|
|
||||||
|
|
||||||
read() {
|
|
||||||
return this._reader.read().then(function({ value, done, }) {
|
|
||||||
if (done) {
|
|
||||||
return { value: undefined, done: true, };
|
|
||||||
}
|
|
||||||
return { value: value.buffer, done: false, };
|
|
||||||
});
|
|
||||||
},
|
|
||||||
|
|
||||||
cancel(reason) {
|
|
||||||
this._reader.cancel(reason);
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
return PDFWorkerStream;
|
|
||||||
})();
|
|
||||||
|
|
||||||
var WorkerMessageHandler = {
|
var WorkerMessageHandler = {
|
||||||
setup(handler, port) {
|
setup(handler, port) {
|
||||||
var testMessageProcessed = false;
|
var testMessageProcessed = false;
|
||||||
|
133
src/core/worker_stream.js
Normal file
133
src/core/worker_stream.js
Normal file
@ -0,0 +1,133 @@
|
|||||||
|
/* 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.
|
||||||
|
*/
|
||||||
|
/* eslint no-var: error */
|
||||||
|
|
||||||
|
import { assert } from '../shared/util';
|
||||||
|
|
||||||
|
/** @implements {IPDFStream} */
|
||||||
|
class PDFWorkerStream {
|
||||||
|
constructor(msgHandler) {
|
||||||
|
this._msgHandler = msgHandler;
|
||||||
|
this._contentLength = null;
|
||||||
|
this._fullRequestReader = null;
|
||||||
|
this._rangeRequestReaders = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
getFullReader() {
|
||||||
|
assert(!this._fullRequestReader);
|
||||||
|
this._fullRequestReader = new PDFWorkerStreamReader(this._msgHandler);
|
||||||
|
return this._fullRequestReader;
|
||||||
|
}
|
||||||
|
|
||||||
|
getRangeReader(begin, end) {
|
||||||
|
const reader = new PDFWorkerStreamRangeReader(begin, end, this._msgHandler);
|
||||||
|
this._rangeRequestReaders.push(reader);
|
||||||
|
return reader;
|
||||||
|
}
|
||||||
|
|
||||||
|
cancelAllRequests(reason) {
|
||||||
|
if (this._fullRequestReader) {
|
||||||
|
this._fullRequestReader.cancel(reason);
|
||||||
|
}
|
||||||
|
const readers = this._rangeRequestReaders.slice(0);
|
||||||
|
readers.forEach(function(reader) {
|
||||||
|
reader.cancel(reason);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @implements {IPDFStreamReader} */
|
||||||
|
class PDFWorkerStreamReader {
|
||||||
|
constructor(msgHandler) {
|
||||||
|
this._msgHandler = msgHandler;
|
||||||
|
this.onProgress = null;
|
||||||
|
|
||||||
|
this._contentLength = null;
|
||||||
|
this._isRangeSupported = false;
|
||||||
|
this._isStreamingSupported = false;
|
||||||
|
|
||||||
|
const readableStream = this._msgHandler.sendWithStream('GetReader');
|
||||||
|
this._reader = readableStream.getReader();
|
||||||
|
|
||||||
|
this._headersReady = this._msgHandler.sendWithPromise('ReaderHeadersReady').
|
||||||
|
then((data) => {
|
||||||
|
this._isStreamingSupported = data.isStreamingSupported;
|
||||||
|
this._isRangeSupported = data.isRangeSupported;
|
||||||
|
this._contentLength = data.contentLength;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
get headersReady() {
|
||||||
|
return this._headersReady;
|
||||||
|
}
|
||||||
|
|
||||||
|
get contentLength() {
|
||||||
|
return this._contentLength;
|
||||||
|
}
|
||||||
|
|
||||||
|
get isStreamingSupported() {
|
||||||
|
return this._isStreamingSupported;
|
||||||
|
}
|
||||||
|
|
||||||
|
get isRangeSupported() {
|
||||||
|
return this._isRangeSupported;
|
||||||
|
}
|
||||||
|
|
||||||
|
async read() {
|
||||||
|
const { value, done, } = await this._reader.read();
|
||||||
|
if (done) {
|
||||||
|
return { value: undefined, done: true, };
|
||||||
|
}
|
||||||
|
// `value` is wrapped into Uint8Array, we need to
|
||||||
|
// unwrap it to ArrayBuffer for further processing.
|
||||||
|
return { value: value.buffer, done: false, };
|
||||||
|
}
|
||||||
|
|
||||||
|
cancel(reason) {
|
||||||
|
this._reader.cancel(reason);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/** @implements {IPDFStreamRangeReader} */
|
||||||
|
class PDFWorkerStreamRangeReader {
|
||||||
|
constructor(begin, end, msgHandler) {
|
||||||
|
this._msgHandler = msgHandler;
|
||||||
|
this.onProgress = null;
|
||||||
|
|
||||||
|
const readableStream = this._msgHandler.sendWithStream('GetRangeReader',
|
||||||
|
{ begin, end, });
|
||||||
|
this._reader = readableStream.getReader();
|
||||||
|
}
|
||||||
|
|
||||||
|
get isStreamingSupported() {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
async read() {
|
||||||
|
const { value, done, } = await this._reader.read();
|
||||||
|
if (done) {
|
||||||
|
return { value: undefined, done: true, };
|
||||||
|
}
|
||||||
|
return { value: value.buffer, done: false, };
|
||||||
|
}
|
||||||
|
|
||||||
|
cancel(reason) {
|
||||||
|
this._reader.cancel(reason);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export {
|
||||||
|
PDFWorkerStream,
|
||||||
|
};
|
@ -67,7 +67,7 @@ class IPDFStreamReader {
|
|||||||
* @returns {Promise}
|
* @returns {Promise}
|
||||||
*/
|
*/
|
||||||
get headersReady() {
|
get headersReady() {
|
||||||
return null;
|
return Promise.resolve();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -116,7 +116,7 @@ class IPDFStreamReader {
|
|||||||
* set to true.
|
* set to true.
|
||||||
* @returns {Promise}
|
* @returns {Promise}
|
||||||
*/
|
*/
|
||||||
read() {}
|
async read() {}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Cancels all pending read requests and closes the stream.
|
* Cancels all pending read requests and closes the stream.
|
||||||
@ -157,7 +157,7 @@ class IPDFStreamRangeReader {
|
|||||||
* set to true.
|
* set to true.
|
||||||
* @returns {Promise}
|
* @returns {Promise}
|
||||||
*/
|
*/
|
||||||
read() {}
|
async read() {}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Cancels all pending read requests and closes the stream.
|
* Cancels all pending read requests and closes the stream.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user