r2-lcp-js
Version:
Readium 2 LCP bits for NodeJS (TypeScript)
116 lines • 5.44 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.downloadEPUBFromLCPL = downloadEPUBFromLCPL;
const debug_ = require("debug");
const fs = require("fs");
const path = require("path");
const request = require("request");
const BufferUtils_1 = require("r2-utils-js/dist/es8-es2017/src/_utils/stream/BufferUtils");
const zipInjector_1 = require("r2-utils-js/dist/es8-es2017/src/_utils/zip/zipInjector");
const lcp_1 = require("./parser/epub/lcp");
const serializable_1 = require("./serializable");
const debug = debug_("r2:lcp#publication-download");
const IS_DEV = (process.env.NODE_ENV === "development" || process.env.NODE_ENV === "dev");
async function downloadEPUBFromLCPL(filePath, dir, destFileName) {
return new Promise(async (resolve, reject) => {
const lcplStr = fs.readFileSync(filePath, { encoding: "utf8" });
const lcplJson = global.JSON.parse(lcplStr);
const lcpl = (0, serializable_1.TaJsonDeserialize)(lcplJson, lcp_1.LCP);
if (lcpl.Links) {
const pubLink = lcpl.Links.find((link) => {
return link.Rel === "publication";
});
if (pubLink) {
const isAudio = pubLink.Type === "application/audiobook+zip";
const isAudioLcp = pubLink.Type === "application/audiobook+lcp";
const ext = isAudio ? ".audiobook" : (isAudioLcp ? ".lcpa" : ".epub");
const destPathTMP = path.join(dir, destFileName + ".tmp");
const destPathFINAL = path.join(dir, destFileName + ext);
const failure = (err) => {
debug(err);
reject(pubLink.Href + " (" + err + ")");
};
const success = async (response) => {
if (IS_DEV) {
Object.keys(response.headers).forEach((header) => {
debug(header + " => " + response.headers[header]);
});
}
if (response.statusCode && (response.statusCode < 200 || response.statusCode >= 300)) {
let failBuff;
try {
failBuff = await (0, BufferUtils_1.streamToBufferPromise)(response);
}
catch (buffErr) {
if (IS_DEV) {
debug(buffErr);
}
failure(response.statusCode);
return;
}
try {
const failStr = failBuff.toString("utf8");
if (IS_DEV) {
debug(failStr);
}
try {
const failJson = global.JSON.parse(failStr);
if (IS_DEV) {
debug(failJson);
}
failJson.httpStatusCode = response.statusCode;
failure(failJson);
}
catch (jsonErr) {
if (IS_DEV) {
debug(jsonErr);
}
failure({ httpStatusCode: response.statusCode, httpResponseBody: failStr });
}
}
catch (strErr) {
if (IS_DEV) {
debug(strErr);
}
failure(response.statusCode);
}
return;
}
const destStreamTMP = fs.createWriteStream(destPathTMP);
response.pipe(destStreamTMP);
destStreamTMP.on("finish", () => {
const zipError = (err) => {
debug(err);
reject(destPathTMP + " (" + err + ")");
};
const doneCallback = () => {
setTimeout(() => {
fs.unlinkSync(destPathTMP);
}, 1000);
resolve([destPathFINAL, pubLink.Href]);
};
const zipEntryPath = (isAudio || isAudioLcp) ? "license.lcpl" : "META-INF/license.lcpl";
(0, zipInjector_1.injectFileInZip)(destPathTMP, destPathFINAL, filePath, zipEntryPath, zipError, doneCallback);
});
};
request.get({
headers: {},
method: "GET",
timeout: 5000,
uri: pubLink.Href,
})
.on("response", async (res) => {
try {
await success(res);
}
catch (successError) {
failure(successError);
return;
}
})
.on("error", failure);
}
}
});
}
//# sourceMappingURL=publication-download.js.map