UNPKG

13.2 kBSource Map (JSON)View Raw
1{"version":3,"file":"server-mediaoverlays.js","sourceRoot":"","sources":["../../../../src/http/server-mediaoverlays.ts"],"names":[],"mappings":"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","sourcesContent":["// ==LICENSE-BEGIN==\n// Copyright 2017 European Digital Reading Lab. All rights reserved.\n// Licensed to the Readium Foundation under one or more contributor license agreements.\n// Use of this source code is governed by a BSD-style license\n// that can be found in the LICENSE file exposed on Github (readium) in the project repository.\n// ==LICENSE-END==\n\nimport * as crypto from \"crypto\";\nimport * as css2json from \"css2json\";\nimport * as debug_ from \"debug\";\nimport * as express from \"express\";\nimport * as jsonMarkup from \"json-markup\";\nimport * as path from \"path\";\n\nimport { TaJsonSerialize } from \"@r2-lcp-js/serializable\";\nimport { Publication } from \"@r2-shared-js/models/publication\";\nimport {\n getAllMediaOverlays, getMediaOverlay, mediaOverlayURLParam, mediaOverlayURLPath,\n} from \"@r2-shared-js/parser/epub\";\nimport { encodeURIComponent_RFC3986, isHTTP } from \"@r2-utils-js/_utils/http/UrlUtils\";\nimport { sortObject, traverseJsonObjects } from \"@r2-utils-js/_utils/JsonUtils\";\n\nimport { IRequestPayloadExtension, IRequestQueryParams, _pathBase64, _show } from \"./request-ext\";\nimport { Server } from \"./server\";\n\nconst debug = debug_(\"r2:streamer#http/server-mediaoverlays\");\n\nexport function serverMediaOverlays(server: Server, routerPathBase64: express.Router) {\n\n // https://github.com/mafintosh/json-markup/blob/master/style.css\n const jsonStyle = `\n.json-markup {\n line-height: 17px;\n font-size: 13px;\n font-family: monospace;\n white-space: pre;\n}\n.json-markup-key {\n font-weight: bold;\n}\n.json-markup-bool {\n color: firebrick;\n}\n.json-markup-string {\n color: green;\n}\n.json-markup-null {\n color: gray;\n}\n.json-markup-number {\n color: blue;\n}\n`;\n\n const routerMediaOverlays = express.Router({ strict: false });\n // routerMediaOverlays.use(morgan(\"combined\", { stream: { write: (msg: any) => debug(msg) } }));\n\n routerMediaOverlays.get([\"/\", \"/\" + _show + \"/:\" + mediaOverlayURLParam + \"?\"],\n async (req: express.Request, res: express.Response) => {\n\n const reqparams = (req as IRequestPayloadExtension).params;\n\n if (!reqparams.pathBase64) {\n reqparams.pathBase64 = (req as IRequestPayloadExtension).pathBase64;\n }\n if (!reqparams.lcpPass64) {\n reqparams.lcpPass64 = (req as IRequestPayloadExtension).lcpPass64;\n }\n\n const isShow = req.url.indexOf(\"/show\") >= 0 || (req.query as IRequestQueryParams).show;\n\n // debug(req.method);\n const isHead = req.method.toLowerCase() === \"head\";\n if (isHead) {\n debug(\"HEAD !!!!!!!!!!!!!!!!!!!\");\n }\n\n const isCanonical = (req.query as IRequestQueryParams).canonical &&\n (req.query as IRequestQueryParams).canonical === \"true\";\n\n const isSecureHttp = req.secure ||\n req.protocol === \"https\" ||\n req.get(\"X-Forwarded-Proto\") === \"https\"\n ;\n\n // reqparams.pathBase64 is already decoded!\n // const decoded = decodeURIComponent(reqparams.pathBase64);\n const pathBase64Str = Buffer.from(reqparams.pathBase64, \"base64\").toString(\"utf8\");\n\n // const fileName = path.basename(pathBase64Str);\n // const ext = path.extname(fileName).toLowerCase();\n\n let publication: Publication;\n try {\n publication = await server.loadOrGetCachedPublication(pathBase64Str);\n } catch (err) {\n debug(err);\n res.status(500).send(\"<html><body><p>Internal Server Error</p><p>\"\n + err + \"</p></body></html>\");\n return;\n }\n\n // dumpPublication(publication);\n\n const rootUrl = (isSecureHttp ? \"https://\" : \"http://\")\n + req.headers.host + \"/pub/\"\n + (reqparams.lcpPass64 ?\n (server.lcpBeginToken + encodeURIComponent_RFC3986(reqparams.lcpPass64) + server.lcpEndToken) :\n \"\")\n + encodeURIComponent_RFC3986(reqparams.pathBase64);\n\n function absoluteURL(href: string): string {\n return rootUrl + \"/\" + href;\n }\n\n function absolutizeURLs(jsonObject: any) {\n traverseJsonObjects(jsonObject,\n (obj) => {\n if (obj.text && typeof obj.text === \"string\"\n && !isHTTP(obj.text)) {\n // obj.text_ = obj.text;\n obj.text = absoluteURL(obj.text);\n }\n\n if (obj.audio && typeof obj.audio === \"string\"\n && !isHTTP(obj.audio)) {\n // obj.audio_ = obj.audio;\n obj.audio = absoluteURL(obj.audio);\n }\n });\n }\n\n let objToSerialize: any = null;\n\n const resource = isShow ?\n ((req.query as IRequestQueryParams).show ?\n (req.query as IRequestQueryParams).show :\n reqparams[mediaOverlayURLParam]) :\n (req.query as IRequestQueryParams)[mediaOverlayURLParam];\n if (resource && resource !== \"all\") {\n try {\n objToSerialize = await getMediaOverlay(publication, resource);\n } catch (err) {\n debug(err);\n res.status(500).send(\"<html><body><p>Internal Server Error</p><p>\"\n + err + \"</p></body></html>\");\n return;\n }\n } else {\n try {\n objToSerialize = await getAllMediaOverlays(publication);\n } catch (err) {\n debug(err);\n res.status(500).send(\"<html><body><p>Internal Server Error</p><p>\"\n + err + \"</p></body></html>\");\n return;\n }\n }\n\n if (!objToSerialize) {\n objToSerialize = [];\n }\n\n const jsonObj = TaJsonSerialize(objToSerialize);\n // jsonObj = { \"media-overlay\": jsonObj };\n\n if (isShow) {\n absolutizeURLs(jsonObj);\n\n // const jsonStr = global.JSON.stringify(jsonObj, null, \" \");\n\n // // breakLength: 100 maxArrayLength: undefined\n // const dumpStr = util.inspect(objToSerialize,\n // { showHidden: false, depth: 1000, colors: false, customInspect: true });\n\n const jsonPretty = jsonMarkup(jsonObj, css2json(jsonStyle));\n\n res.status(200).send(\"<html><body>\" +\n \"<h1>\" + path.basename(pathBase64Str) + \"</h1>\" +\n \"<p><pre>\" + jsonPretty + \"</pre></p>\" +\n // \"<p><pre>\" + jsonStr + \"</pre></p>\" +\n // \"<p><pre>\" + dumpStr + \"</pre></p>\" +\n \"</body></html>\");\n } else {\n // absolutizeURLs(jsonObj);\n\n server.setResponseCORS(res);\n res.set(\"Content-Type\", \"application/vnd.syncnarr+json; charset=utf-8\");\n\n const jsonStr = isCanonical ?\n global.JSON.stringify(sortObject(jsonObj), null, \"\") :\n global.JSON.stringify(jsonObj, null, \" \");\n\n const checkSum = crypto.createHash(\"sha256\");\n checkSum.update(jsonStr);\n const hash = checkSum.digest(\"hex\");\n\n const match = req.header(\"If-None-Match\");\n if (match === hash) {\n debug(\"smil cache\");\n res.status(304); // StatusNotModified\n res.end();\n return;\n }\n\n res.setHeader(\"ETag\", hash);\n // server.setResponseCacheHeaders(res, true);\n\n res.status(200);\n\n if (isHead) {\n res.end();\n } else {\n res.send(jsonStr);\n }\n }\n });\n\n routerPathBase64.use(\"/:\" + _pathBase64 + \"/\" + mediaOverlayURLPath, routerMediaOverlays);\n}\n"]}
\No newline at end of file