UNPKG

r2-utils-js

Version:

Readium 2 'utils' for NodeJS (TypeScript)

181 lines 6.27 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.ZipExplodedHTTP = void 0; const debug_ = require("debug"); const request = require("request"); const requestPromise = require("request-promise-native"); const stream_1 = require("stream"); const url_1 = require("url"); const zip_1 = require("./zip"); const debug = debug_("r2:utils#zip/zip-ex-http"); class ZipExplodedHTTP extends zip_1.Zip { static async loadPromise(urlStr) { return Promise.resolve(new ZipExplodedHTTP(urlStr)); } constructor(urlStr) { super(); this.urlStr = urlStr; debug(`ZipExplodedHTTP: ${urlStr}`); } freeDestroy() { debug("freeDestroy: ZipExplodedHTTP -- " + this.urlStr); } entriesCount() { return 0; } hasEntries() { return true; } hasEntry(_entryPath) { return true; } async hasEntryAsync(entryPath) { debug(`hasEntryAsync: ${entryPath}`); const url = new url_1.URL(this.urlStr); url.pathname += entryPath; const urlStrEntry = url.toString(); debug("urlStrEntry: ", urlStrEntry); return new Promise(async (topresolve, _topreject) => { const failure = async (err) => { debug(err); topresolve(false); }; const success = async (response) => { if (response.statusCode && (response.statusCode < 200 || response.statusCode >= 300)) { topresolve(false); return; } topresolve(true); }; const needsStreamingResponse = true; if (needsStreamingResponse) { const promise = new Promise((resolve, reject) => { request.get({ headers: {}, method: "HEAD", uri: urlStrEntry, }) .on("response", async (response) => { try { await success(response); } catch (successError) { await failure(successError); return; } resolve(); }) .on("error", async (err) => { await failure(err); reject(); }); }); try { await promise; } catch (_err) { } } else { let response; try { response = await requestPromise({ headers: {}, method: "HEAD", resolveWithFullResponse: true, uri: urlStrEntry, }); await success(response); } catch (err) { await failure(err); } } }); } async getEntries() { return new Promise(async (_resolve, reject) => { reject("Not implemented."); }); } async entryStreamPromise(entryPath) { debug(`entryStreamPromise: ${entryPath}`); const url = new url_1.URL(this.urlStr); url.pathname += entryPath; const urlStrEntry = url.toString(); debug("urlStrEntry: ", urlStrEntry); return new Promise(async (topresolve, topreject) => { const failure = async (err) => { debug(err); topreject(err); }; const success = async (response) => { if (response.statusCode && (response.statusCode < 200 || response.statusCode >= 300)) { await failure("HTTP CODE " + response.statusCode); return; } let length = 0; const lengthStr = response.headers["content-length"]; if (lengthStr) { length = parseInt(lengthStr, 10); } const stream = new stream_1.PassThrough(); response.pipe(stream); const streamAndLength = { length, reset: async () => { return this.entryStreamPromise(entryPath); }, stream, }; topresolve(streamAndLength); }; const needsStreamingResponse = true; if (needsStreamingResponse) { const promise = new Promise((resolve, reject) => { request.get({ headers: {}, method: "GET", uri: urlStrEntry, }) .on("response", async (response) => { try { await success(response); } catch (successError) { await failure(successError); return; } resolve(); }) .on("error", async (err) => { await failure(err); reject(); }); }); try { await promise; } catch (_err) { } } else { let response; try { response = await requestPromise({ headers: {}, method: "GET", resolveWithFullResponse: true, uri: urlStrEntry, }); await success(response); } catch (err) { await failure(err); } } }); } } exports.ZipExplodedHTTP = ZipExplodedHTTP; //# sourceMappingURL=zip-ex-http.js.map