UNPKG

r2-streamer-js

Version:

Readium 2 'streamer' for NodeJS (TypeScript)

84 lines 4.44 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.serverPub_PATH = void 0; exports.serverPub = serverPub; const debug_ = require("debug"); const express = require("express"); const morgan = require("morgan"); const path = require("path"); const querystring = require("querystring"); const UrlUtils_1 = require("r2-utils-js/dist/es7-es2016/src/_utils/http/UrlUtils"); const request_ext_1 = require("./request-ext"); const server_trailing_slash_redirect_1 = require("./server-trailing-slash-redirect"); const debug = debug_("r2:streamer#http/server-pub"); exports.serverPub_PATH = "/pub"; function serverPub(server, topRouter) { const urlBook = exports.serverPub_PATH + "/PATH_BASE64/manifest.json"; const urlBookShowAll = "./manifest.json/show/all"; const urlReaderNYPL = "/readerNYPL/?url=PREFIX" + querystring.escape(urlBook); const urlReaderEPUBJS = "https://s3.amazonaws.com/epubjs-manifest/examples/manifest.html?href=PREFIZ" + urlBook; const urlReaderHADRIEN = "/readerHADRIEN/?manifest=true&href=PREFIX" + querystring.escape(urlBook); const urlReaderHADRIEN_ = "https://hadriengardeur.github.io/webpub-manifest/examples/viewer/?manifest=true&href=PREFIX" + querystring.escape(urlBook); const htmlLanding = "<html><body><h1>PATH_STR</h1><h2><a href='" + urlBookShowAll + "'>" + urlBookShowAll + "</a></h2>" + (server.disableReaders ? "" : ("<p>Reader NYPL:<br><a href='" + urlReaderNYPL + "'>" + urlReaderNYPL + "</a></p>" + "<p>Reader EPUB.js:<br><a href='" + urlReaderEPUBJS + "'>" + urlReaderEPUBJS + "</a></p>" + "<p>Reader HADRIEN:<br><a href='" + urlReaderHADRIEN + "'>" + urlReaderHADRIEN + "</a></p>" + "<p>Reader HADRIEN BASIC:<br><a href='" + urlReaderHADRIEN_ + "'>" + urlReaderHADRIEN_ + "</a></p>")) + "</body></html>"; const routerPathBase64 = express.Router({ strict: false }); routerPathBase64.use(morgan("combined", { stream: { write: (msg) => debug(msg) } })); routerPathBase64.use(server_trailing_slash_redirect_1.trailingSlashRedirect); routerPathBase64.param("pathBase64", (req, res, next, value, _name) => { const reqparams = req.params; if (value.indexOf(server.lcpBeginToken) === 0 && value.indexOf(server.lcpEndToken) > 0) { const i = value.indexOf(server.lcpEndToken); const pass64 = value.substr(server.lcpBeginToken.length, i - server.lcpBeginToken.length); req.lcpPass64 = pass64; value = value.substr(i + server.lcpEndToken.length); reqparams.pathBase64 = value; debug(value); } const valueStr = Buffer.from(value, "base64").toString("utf8"); if ((0, UrlUtils_1.isHTTP)(valueStr)) { req.pathBase64 = value; next(); return; } const found = server.getPublications().find((filePath) => { const filePathBase64 = Buffer.from(filePath).toString("base64"); return value === filePathBase64; }); if (found) { req.pathBase64 = value; next(); } else { res.status(403).send("<html><body><p>Forbidden</p><p>INVALID parameter: <code>" + reqparams.pathBase64 + "</code></p></body></html>"); } }); routerPathBase64.get("/:" + request_ext_1._pathBase64, (req, res) => { const reqparams = req.params; if (!reqparams.pathBase64) { reqparams.pathBase64 = req.pathBase64; } const pathBase64Str = Buffer.from(reqparams.pathBase64, "base64").toString("utf8"); debug(`Publication: ${pathBase64Str}`); const isSecureHttp = req.secure || req.protocol === "https" || req.get("X-Forwarded-Proto") === "https"; res.status(200).send(htmlLanding .replace(/PATH_STR/g, path.basename(pathBase64Str)) .replace(/PATH_BASE64/g, (0, UrlUtils_1.encodeURIComponent_RFC3986)(reqparams.pathBase64)) .replace(/PREFIX/g, (isSecureHttp ? querystring.escape("https://") : querystring.escape("http://")) + req.headers.host).replace(/PREFIZ/g, (isSecureHttp ? "https://" : "http://") + req.headers.host)); }); topRouter.use(exports.serverPub_PATH, routerPathBase64); return routerPathBase64; } //# sourceMappingURL=server-pub.js.map