diff --git a/src/display/api.js b/src/display/api.js index 6e8abb6e9..d3d6b0b89 100644 --- a/src/display/api.js +++ b/src/display/api.js @@ -65,7 +65,8 @@ const RENDERING_CANCELLED_TIMEOUT = 100; // ms * @typedef {function} IPDFStreamFactory * @param {DocumentInitParameters} params - The document initialization * parameters. The "url" key is always present. - * @returns {IPDFStream} + * @returns {Promise} A promise, which is resolved with an instance of + * {IPDFStream}. * @ignore */ @@ -80,7 +81,7 @@ let createPDFNetworkStream; * data transport. * @param {IPDFStreamFactory} pdfNetworkStreamFactory - The factory function * that takes document initialization parameters (including a "url") and - * returns an instance of {IPDFStream}. + * returns a promise which is resolved with an instance of {IPDFStream}. * @ignore */ function setPDFNetworkStreamFactory(pdfNetworkStreamFactory) { @@ -313,34 +314,44 @@ function getDocument(src) { if (task.destroyed) { throw new Error("Loading aborted"); } - return _fetchDocument(worker, params, rangeTransport, docId).then( - function (workerId) { - if (task.destroyed) { - throw new Error("Loading aborted"); - } - let networkStream; - if (rangeTransport) { - networkStream = new PDFDataTransportStream( - { - length: params.length, - initialData: params.initialData, - progressiveDone: params.progressiveDone, - disableRange: params.disableRange, - disableStream: params.disableStream, - }, - rangeTransport - ); - } else if (!params.data) { - networkStream = createPDFNetworkStream({ - url: params.url, + const workerIdPromise = _fetchDocument( + worker, + params, + rangeTransport, + docId + ); + const networkStreamPromise = new Promise(function (resolve) { + let networkStream; + if (rangeTransport) { + networkStream = new PDFDataTransportStream( + { length: params.length, - httpHeaders: params.httpHeaders, - withCredentials: params.withCredentials, - rangeChunkSize: params.rangeChunkSize, + initialData: params.initialData, + progressiveDone: params.progressiveDone, disableRange: params.disableRange, disableStream: params.disableStream, - }); + }, + rangeTransport + ); + } else if (!params.data) { + networkStream = createPDFNetworkStream({ + url: params.url, + length: params.length, + httpHeaders: params.httpHeaders, + withCredentials: params.withCredentials, + rangeChunkSize: params.rangeChunkSize, + disableRange: params.disableRange, + disableStream: params.disableStream, + }); + } + resolve(networkStream); + }); + + return Promise.all([workerIdPromise, networkStreamPromise]).then( + function ([workerId, networkStream]) { + if (task.destroyed) { + throw new Error("Loading aborted"); } const messageHandler = new MessageHandler( diff --git a/src/display/fetch_stream.js b/src/display/fetch_stream.js index c74483025..a1b9c9023 100644 --- a/src/display/fetch_stream.js +++ b/src/display/fetch_stream.js @@ -26,6 +26,12 @@ import { validateResponseStatus, } from "./network_utils.js"; +if (typeof PDFJSDev !== "undefined" && PDFJSDev.test("MOZCENTRAL")) { + throw new Error( + 'Module "./fetch_stream.js" shall not be used with MOZCENTRAL builds.' + ); +} + function createFetchOptions(headers, withCredentials, abortController) { return { method: "GET", diff --git a/src/display/node_stream.js b/src/display/node_stream.js index 79125524a..bbfb5b844 100644 --- a/src/display/node_stream.js +++ b/src/display/node_stream.js @@ -14,11 +14,6 @@ */ /* globals __non_webpack_require__ */ -const fs = __non_webpack_require__("fs"); -const http = __non_webpack_require__("http"); -const https = __non_webpack_require__("https"); -const url = __non_webpack_require__("url"); - import { AbortException, assert, @@ -30,6 +25,17 @@ import { validateRangeRequestCapabilities, } from "./network_utils.js"; +if (typeof PDFJSDev !== "undefined" && PDFJSDev.test("MOZCENTRAL")) { + throw new Error( + 'Module "./node_stream.js" shall not be used with MOZCENTRAL builds.' + ); +} + +const fs = __non_webpack_require__("fs"); +const http = __non_webpack_require__("http"); +const https = __non_webpack_require__("https"); +const url = __non_webpack_require__("url"); + const fileUriRegex = /^file:\/\/\/[a-zA-Z]:\//; function parseUrl(sourceUrl) { diff --git a/src/pdf.js b/src/pdf.js index 2233f3438..3e3c2d018 100644 --- a/src/pdf.js +++ b/src/pdf.js @@ -30,7 +30,24 @@ var pdfjsDisplaySVG = require("./display/svg.js"); const pdfjsDisplayWorkerOptions = require("./display/worker_options.js"); const pdfjsDisplayAPICompatibility = require("./display/api_compatibility.js"); -if (typeof PDFJSDev === "undefined" || PDFJSDev.test("GENERIC")) { +if (typeof PDFJSDev === "undefined" || !PDFJSDev.test("PRODUCTION")) { + const streamsPromise = Promise.all([ + SystemJS.import("pdfjs/display/network.js"), + SystemJS.import("pdfjs/display/fetch_stream.js"), + ]); + pdfjsDisplayAPI.setPDFNetworkStreamFactory(params => { + return streamsPromise.then(streams => { + const [{ PDFNetworkStream }, { PDFFetchStream }] = streams; + if ( + pdfjsDisplayDisplayUtils.isFetchSupported() && + pdfjsDisplayDisplayUtils.isValidFetchUrl(params.url) + ) { + return new PDFFetchStream(params); + } + return new PDFNetworkStream(params); + }); + }); +} else if (PDFJSDev.test("GENERIC")) { const { isNodeJS } = require("./shared/is_node.js"); if (isNodeJS) { const PDFNodeStream = require("./display/node_stream.js").PDFNodeStream;