@prose-reader/streamer 1.309.0 → 1.311.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/archives/createArchiveFromArrayBufferList.d.ts +1 -1
- package/dist/archives/createArchiveFromEntries.d.ts +29 -0
- package/dist/archives/createArchiveFromJszip/index.cjs +1 -1
- package/dist/archives/createArchiveFromJszip/index.cjs.map +1 -1
- package/dist/archives/createArchiveFromJszip/index.js +15 -28
- package/dist/archives/createArchiveFromJszip/index.js.map +1 -1
- package/dist/archives/createArchiveFromJszip.d.ts +1 -1
- package/dist/archives/createArchiveFromLibArchive/index.cjs +1 -1
- package/dist/archives/createArchiveFromLibArchive/index.cjs.map +1 -1
- package/dist/archives/createArchiveFromLibArchive/index.js +10 -15
- package/dist/archives/createArchiveFromLibArchive/index.js.map +1 -1
- package/dist/archives/createArchiveFromLibArchive.d.ts +1 -1
- package/dist/archives/createArchiveFromNodeUnrarJs/index.cjs +1 -1
- package/dist/archives/createArchiveFromNodeUnrarJs/index.cjs.map +1 -1
- package/dist/archives/createArchiveFromNodeUnrarJs/index.js +20 -32
- package/dist/archives/createArchiveFromNodeUnrarJs/index.js.map +1 -1
- package/dist/archives/createArchiveFromNodeUnrarJs.d.ts +1 -1
- package/dist/archives/createArchiveFromUnzipper/index.cjs +1 -1
- package/dist/archives/createArchiveFromUnzipper/index.cjs.map +1 -1
- package/dist/archives/createArchiveFromUnzipper/index.js +19 -31
- package/dist/archives/createArchiveFromUnzipper/index.js.map +1 -1
- package/dist/archives/createArchiveFromUnzipper.d.ts +1 -1
- package/dist/archives/createArchiveFromZipJs/index.cjs +2 -0
- package/dist/archives/createArchiveFromZipJs/index.cjs.map +1 -0
- package/dist/archives/createArchiveFromZipJs/index.js +20 -0
- package/dist/archives/createArchiveFromZipJs/index.js.map +1 -0
- package/dist/archives/createArchiveFromZipJs.d.ts +7 -0
- package/dist/createArchiveFromEntries-B4KAUclj.cjs +3 -0
- package/dist/createArchiveFromEntries-B4KAUclj.cjs.map +1 -0
- package/dist/createArchiveFromEntries-BgXc4rEL.js +65 -0
- package/dist/createArchiveFromEntries-BgXc4rEL.js.map +1 -0
- package/dist/index/index.cjs +8 -8
- package/dist/index/index.cjs.map +1 -1
- package/dist/index/index.js +243 -255
- package/dist/index/index.js.map +1 -1
- package/package.json +14 -4
- package/dist/createArchive-BB7-JJjh.js +0 -35
- package/dist/createArchive-BB7-JJjh.js.map +0 -1
- package/dist/createArchive-CeuyJUIj.cjs +0 -3
- package/dist/createArchive-CeuyJUIj.cjs.map +0 -1
- package/dist/uri-DBZYnB1I.js +0 -13
- package/dist/uri-DBZYnB1I.js.map +0 -1
- package/dist/uri-DW0-P-ng.cjs +0 -2
- package/dist/uri-DW0-P-ng.cjs.map +0 -1
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
import { Report as e, detectMimeTypeFromName as t } from "@prose-reader/shared";
|
|
2
|
+
//#endregion
|
|
3
|
+
//#region src/report.ts
|
|
4
|
+
var n = e.namespace("@prose-reader/streamer", !1, { color: "#ffae42" }), r = (e) => {
|
|
5
|
+
let t = {};
|
|
6
|
+
for (let n of e) {
|
|
7
|
+
let e = n.split("/"), r = t;
|
|
8
|
+
for (let t = 0; t < e.length; t++) {
|
|
9
|
+
let n = e[t];
|
|
10
|
+
n !== void 0 && (r[n] || (r[n] = {}), r = r[n]);
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
let n = (e, t = "") => Object.keys(e).sort().map((r, i, a) => {
|
|
14
|
+
let o = i === a.length - 1, s = t + (o ? "└── " : "├── "), c = t + (o ? " " : "│ "), l = e[r];
|
|
15
|
+
return l && Object.keys(l).length > 0 ? `${s}${r}/\n${n(l, c)}` : `${s}${r}`;
|
|
16
|
+
}).join("\n");
|
|
17
|
+
return n(t);
|
|
18
|
+
}, i = ({ records: e, ...t }) => {
|
|
19
|
+
let i = /* @__PURE__ */ new Map();
|
|
20
|
+
for (let t of e) i.has(t.uri) || i.set(t.uri, t);
|
|
21
|
+
let a = {
|
|
22
|
+
...t,
|
|
23
|
+
records: e,
|
|
24
|
+
recordsByUri: i
|
|
25
|
+
};
|
|
26
|
+
if (n.log("Generated archive", a), process.env.NODE_ENV === "development" && n.isEnabled()) {
|
|
27
|
+
let t = r(e.map((e) => e.uri));
|
|
28
|
+
n.groupCollapsed(...n.getGroupArgs("Archive folder structure")), n.log(`\n${t}`), n.groupEnd();
|
|
29
|
+
}
|
|
30
|
+
return a;
|
|
31
|
+
}, a = (e, t) => {
|
|
32
|
+
let n = e.split(/(\d+)/), r = t.split(/(\d+)/);
|
|
33
|
+
for (let e = 0, t = n.length; e < t; e++) if (n[e] !== r[e]) return n[e]?.match(/\d/) ? (n[e] || "") - +(r[e] || "") : (n[e] || "").localeCompare(r[e] || "");
|
|
34
|
+
return 1;
|
|
35
|
+
}, o = (e) => e.substring(e.lastIndexOf("/") + 1) || e, s = (e) => e.endsWith("/") ? e.slice(0, -1) : e, c = (e) => {
|
|
36
|
+
let t = e.lastIndexOf("/");
|
|
37
|
+
return t >= 0 ? e.substring(0, t) : "";
|
|
38
|
+
}, l = (e, n, { orderByAlpha: r, name: s, encodingFormat: c, close: l }) => {
|
|
39
|
+
let u = e.map((e) => {
|
|
40
|
+
let r = n(e), i = o(r.uri);
|
|
41
|
+
return r.dir ? {
|
|
42
|
+
dir: !0,
|
|
43
|
+
basename: i,
|
|
44
|
+
uri: r.uri
|
|
45
|
+
} : {
|
|
46
|
+
dir: !1,
|
|
47
|
+
basename: i,
|
|
48
|
+
uri: r.uri,
|
|
49
|
+
encodingFormat: t(r.uri),
|
|
50
|
+
size: r.size,
|
|
51
|
+
blob: r.blob,
|
|
52
|
+
arrayBuffer: r.arrayBuffer
|
|
53
|
+
};
|
|
54
|
+
});
|
|
55
|
+
return r && u.sort((e, t) => a(e.uri, t.uri)), i({
|
|
56
|
+
filename: s,
|
|
57
|
+
encodingFormat: c,
|
|
58
|
+
records: u,
|
|
59
|
+
close: l
|
|
60
|
+
});
|
|
61
|
+
};
|
|
62
|
+
//#endregion
|
|
63
|
+
export { a, s as i, c as n, i as o, o as r, n as s, l as t };
|
|
64
|
+
|
|
65
|
+
//# sourceMappingURL=createArchiveFromEntries-BgXc4rEL.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"createArchiveFromEntries-BgXc4rEL.js","names":[],"sources":["../package.json","../src/report.ts","../src/archives/printTree.ts","../src/archives/createArchive.ts","../src/utils/sortByTitleComparator.ts","../src/utils/uri.ts","../src/archives/createArchiveFromEntries.ts"],"sourcesContent":["{\n \"name\": \"@prose-reader/streamer\",\n \"version\": \"1.310.0\",\n \"type\": \"module\",\n \"main\": \"./dist/index/index.cjs\",\n \"module\": \"./dist/index/index.js\",\n \"exports\": {\n \".\": {\n \"types\": \"./dist/index.d.ts\",\n \"import\": \"./dist/index/index.js\",\n \"require\": \"./dist/index/index.cjs\"\n },\n \"./archives/createArchiveFromJszip\": {\n \"types\": \"./dist/archives/createArchiveFromJszip.d.ts\",\n \"import\": \"./dist/archives/createArchiveFromJszip/index.js\",\n \"require\": \"./dist/archives/createArchiveFromJszip/index.cjs\"\n },\n \"./archives/createArchiveFromLibArchive\": {\n \"types\": \"./dist/archives/createArchiveFromLibArchive.d.ts\",\n \"import\": \"./dist/archives/createArchiveFromLibArchive/index.js\",\n \"require\": \"./dist/archives/createArchiveFromLibArchive/index.cjs\"\n },\n \"./archives/createArchiveFromUnzipper\": {\n \"types\": \"./dist/archives/createArchiveFromUnzipper.d.ts\",\n \"import\": \"./dist/archives/createArchiveFromUnzipper/index.js\",\n \"require\": \"./dist/archives/createArchiveFromUnzipper/index.cjs\"\n },\n \"./archives/createArchiveFromNodeUnrarJs\": {\n \"types\": \"./dist/archives/createArchiveFromNodeUnrarJs.d.ts\",\n \"import\": \"./dist/archives/createArchiveFromNodeUnrarJs/index.js\",\n \"require\": \"./dist/archives/createArchiveFromNodeUnrarJs/index.cjs\"\n },\n \"./archives/createArchiveFromZipJs\": {\n \"types\": \"./dist/archives/createArchiveFromZipJs.d.ts\",\n \"import\": \"./dist/archives/createArchiveFromZipJs/index.js\",\n \"require\": \"./dist/archives/createArchiveFromZipJs/index.cjs\"\n }\n },\n \"types\": \"./dist/index.d.ts\",\n \"license\": \"MIT\",\n \"files\": [\n \"/dist\"\n ],\n \"scripts\": {\n \"start\": \"vite build --watch --mode development\",\n \"build\": \"tsc && vite build\",\n \"test\": \"vitest run --coverage\",\n \"tsc\": \"tsc\",\n \"test:watch\": \"vitest watch\"\n },\n \"dependencies\": {\n \"@prose-reader/archive-parser\": \"^1.310.0\",\n \"@prose-reader/shared\": \"^1.310.0\",\n \"xmldoc\": \"^2.0.0\"\n },\n \"peerDependencies\": {\n \"@zip.js/zip.js\": \"^2.8.26\",\n \"buffer\": \"^6.0.3\",\n \"jszip\": \"^3.10.0\",\n \"libarchive.js\": \"^2.0.2\",\n \"node-unrar-js\": \"^2.0.2\",\n \"rxjs\": \"*\",\n \"unzipper\": \"^0.12.3\"\n },\n \"peerDependenciesMeta\": {\n \"@zip.js/zip.js\": {\n \"optional\": true\n },\n \"jszip\": {\n \"optional\": true\n },\n \"unzipper\": {\n \"optional\": true\n },\n \"libarchive.js\": {\n \"optional\": true\n },\n \"node-unrar-js\": {\n \"optional\": true\n }\n },\n \"gitHead\": \"4601e14dcacf50b2295cb343582a7ef2c7e1eedc\",\n \"devDependencies\": {\n \"@types/unzipper\": \"^0.10.11\",\n \"@zip.js/zip.js\": \"^2.8.26\",\n \"buffer\": \"^6.0.3\",\n \"isomorphic-fetch\": \"^3.0.0\",\n \"jszip\": \"^3.10.0\",\n \"libarchive.js\": \"^2.0.2\",\n \"node-unrar-js\": \"^2.0.2\",\n \"unzipper\": \"^0.12.3\"\n }\n}\n","import { Report as SharedReport } from \"@prose-reader/shared\"\nimport { name } from \"../package.json\"\n\nexport const Report = SharedReport.namespace(name, false, {\n color: \"#ffae42\",\n})\n","interface TreeNode {\n [key: string]: TreeNode\n}\n\nexport const printTree = (paths: string[]): string => {\n // Split and collect all parts for tree reconstruction\n const tree: TreeNode = {}\n for (const path of paths) {\n const parts = path.split(\"/\")\n let node = tree\n for (let i = 0; i < parts.length; i++) {\n const part = parts[i]\n if (part === undefined) continue\n if (!node[part]) {\n node[part] = {}\n }\n node = node[part]\n }\n }\n\n // Recursively build the tree string\n const render = (node: TreeNode, indent = \"\"): string => {\n return Object.keys(node)\n .sort()\n .map((key, i, arr) => {\n const isLast = i === arr.length - 1\n const prefix = indent + (isLast ? \"└── \" : \"├── \")\n const nextIndent = indent + (isLast ? \" \" : \"│ \")\n const value = node[key]\n if (value && Object.keys(value).length > 0) {\n return `${prefix}${key}/\\n${render(value, nextIndent)}`\n }\n return `${prefix}${key}`\n })\n .join(\"\\n\")\n }\n\n return render(tree)\n}\n","import { Report } from \"../report\"\nimport { printTree } from \"./printTree\"\nimport type { Archive, ArchiveRecord } from \"./types\"\n\ntype ArchiveInit = Omit<Archive, \"recordsByUri\">\n\n/**\n * Builds an {@link Archive} from its records and derives the `recordsByUri`\n * lookup index once, so consumers resolve records in O(1) on the hot path\n * instead of scanning {@link Archive.records}. Duplicate URIs keep the first\n * record, matching the previous `Array.prototype.find` semantics.\n */\nexport const createArchive = ({ records, ...rest }: ArchiveInit): Archive => {\n const recordsByUri = new Map<string, ArchiveRecord>()\n\n for (const record of records) {\n if (!recordsByUri.has(record.uri)) {\n recordsByUri.set(record.uri, record)\n }\n }\n\n const archive: Archive = {\n ...rest,\n records,\n recordsByUri,\n }\n\n Report.log(\"Generated archive\", archive)\n\n if (process.env.NODE_ENV === \"development\") {\n if (Report.isEnabled()) {\n const folderStructureStr = printTree(records.map((record) => record.uri))\n Report.groupCollapsed(...Report.getGroupArgs(\"Archive folder structure\"))\n Report.log(`\\n${folderStructureStr}`)\n Report.groupEnd()\n }\n }\n\n return archive\n}\n","export const sortByTitleComparator = (a: string, b: string) => {\n const alist = a.split(/(\\d+)/)\n const blist = b.split(/(\\d+)/)\n\n for (let i = 0, len = alist.length; i < len; i++) {\n if (alist[i] !== blist[i]) {\n if (alist[i]?.match(/\\d/)) {\n return +(alist[i] || ``) - +(blist[i] || ``)\n }\n return (alist[i] || ``).localeCompare(blist[i] || ``)\n }\n }\n\n return 1\n}\n","export const getUriBasename = (uri: string) =>\n uri.substring(uri.lastIndexOf(`/`) + 1) || uri\n\nexport const removeTrailingSlash = (uri: string) =>\n uri.endsWith(\"/\") ? uri.slice(0, -1) : uri\n\nexport const getUriBasePath = (uri: string) => {\n const lastSlashIndex = uri.lastIndexOf(\"/\")\n\n return lastSlashIndex >= 0 ? uri.substring(0, lastSlashIndex) : \"\"\n}\n","import { detectMimeTypeFromName } from \"@prose-reader/shared\"\nimport { sortByTitleComparator } from \"../utils/sortByTitleComparator\"\nimport { getUriBasename } from \"../utils/uri\"\nimport { createArchive } from \"./createArchive\"\nimport type { Archive, ArchiveRecord, FileRecord } from \"./types\"\n\n/**\n * Normalized view of a source entry, shared by every `createArchiveFrom*`\n * creator that enumerates a flat list of records. A source only has to provide\n * each entry's `uri`, whether it is a directory, and (for files) its `size`\n * plus content accessors; everything else (basename derivation, mime\n * detection, ordering, the `recordsByUri` index) is handled centrally here.\n */\nexport type ArchiveEntry =\n | { dir: true; uri: string }\n | ({ dir: false; uri: string; size: number } & Pick<\n FileRecord,\n \"blob\" | \"arrayBuffer\"\n >)\n\nexport type CreateArchiveFromEntriesOptions = {\n orderByAlpha?: boolean\n name?: string\n encodingFormat?: string\n close: () => Promise<void>\n}\n\n/**\n * Builds an {@link Archive} from an arbitrary source list. `toEntry` is invoked\n * once per item, and the resulting records are sorted in place when\n * `orderByAlpha` is set — there is no intermediate array, so construction stays\n * a single map plus an optional sort regardless of the source.\n */\nexport const createArchiveFromEntries = <Item>(\n items: Item[],\n toEntry: (item: Item) => ArchiveEntry,\n {\n orderByAlpha,\n name,\n encodingFormat,\n close,\n }: CreateArchiveFromEntriesOptions,\n): Archive => {\n const records = items.map((item): ArchiveRecord => {\n const entry = toEntry(item)\n const basename = getUriBasename(entry.uri)\n\n if (entry.dir) {\n return { dir: true, basename, uri: entry.uri }\n }\n\n return {\n dir: false,\n basename,\n uri: entry.uri,\n encodingFormat: detectMimeTypeFromName(entry.uri),\n size: entry.size,\n blob: entry.blob,\n arrayBuffer: entry.arrayBuffer,\n }\n })\n\n if (orderByAlpha) {\n records.sort((a, b) => sortByTitleComparator(a.uri, b.uri))\n }\n\n return createArchive({ filename: name, encodingFormat, records, close })\n}\n"],"mappings":";;;ACGA,IAAa,IAAS,EAAa,UAAU,0BAAM,IAAO,EACxD,OAAO,UACT,CAAC,GCDY,KAAa,MAA4B;CAEpD,IAAM,IAAiB,CAAC;CACxB,KAAK,IAAM,KAAQ,GAAO;EACxB,IAAM,IAAQ,EAAK,MAAM,GAAG,GACxB,IAAO;EACX,KAAK,IAAI,IAAI,GAAG,IAAI,EAAM,QAAQ,KAAK;GACrC,IAAM,IAAO,EAAM;GACf,MAAS,KAAA,MACR,EAAK,OACR,EAAK,KAAQ,CAAC,IAEhB,IAAO,EAAK;EACd;CACF;CAGA,IAAM,KAAU,GAAgB,IAAS,OAChC,OAAO,KAAK,CAAI,EACpB,KAAK,EACL,KAAK,GAAK,GAAG,MAAQ;EACpB,IAAM,IAAS,MAAM,EAAI,SAAS,GAC5B,IAAS,KAAU,IAAS,SAAS,SACrC,IAAa,KAAU,IAAS,SAAS,SACzC,IAAQ,EAAK;EAInB,OAHI,KAAS,OAAO,KAAK,CAAK,EAAE,SAAS,IAChC,GAAG,IAAS,EAAI,KAAK,EAAO,GAAO,CAAU,MAE/C,GAAG,IAAS;CACrB,CAAC,EACA,KAAK,IAAI;CAGd,OAAO,EAAO,CAAI;AACpB,GC1Ba,KAAiB,EAAE,YAAS,GAAG,QAAiC;CAC3E,IAAM,oBAAe,IAAI,IAA2B;CAEpD,KAAK,IAAM,KAAU,GACnB,AAAK,EAAa,IAAI,EAAO,GAAG,KAC9B,EAAa,IAAI,EAAO,KAAK,CAAM;CAIvC,IAAM,IAAmB;EACvB,GAAG;EACH;EACA;CACF;CAIA,IAFA,EAAO,IAAI,qBAAqB,CAAO,GAEvC,QAAA,IAAA,aAA6B,iBACvB,EAAO,UAAU,GAAG;EACtB,IAAM,IAAqB,EAAU,EAAQ,KAAK,MAAW,EAAO,GAAG,CAAC;EAGxE,AAFA,EAAO,eAAe,GAAG,EAAO,aAAa,0BAA0B,CAAC,GACxE,EAAO,IAAI,KAAK,GAAoB,GACpC,EAAO,SAAS;CAClB;CAGF,OAAO;AACT,GCvCa,KAAyB,GAAW,MAAc;CAC7D,IAAM,IAAQ,EAAE,MAAM,OAAO,GACvB,IAAQ,EAAE,MAAM,OAAO;CAE7B,KAAK,IAAI,IAAI,GAAG,IAAM,EAAM,QAAQ,IAAI,GAAK,KAC3C,IAAI,EAAM,OAAO,EAAM,IAIrB,OAHI,EAAM,IAAI,MAAM,IAAI,KACb,EAAM,MAAM,MAAM,EAAE,EAAM,MAAM,OAEnC,EAAM,MAAM,IAAI,cAAc,EAAM,MAAM,EAAE;CAIxD,OAAO;AACT,GCda,KAAkB,MAC7B,EAAI,UAAU,EAAI,YAAY,GAAG,IAAI,CAAC,KAAK,GAEhC,KAAuB,MAClC,EAAI,SAAS,GAAG,IAAI,EAAI,MAAM,GAAG,EAAE,IAAI,GAE5B,KAAkB,MAAgB;CAC7C,IAAM,IAAiB,EAAI,YAAY,GAAG;CAE1C,OAAO,KAAkB,IAAI,EAAI,UAAU,GAAG,CAAc,IAAI;AAClE,GCuBa,KACX,GACA,GACA,EACE,iBACA,SACA,mBACA,eAEU;CACZ,IAAM,IAAU,EAAM,KAAK,MAAwB;EACjD,IAAM,IAAQ,EAAQ,CAAI,GACpB,IAAW,EAAe,EAAM,GAAG;EAMzC,OAJI,EAAM,MACD;GAAE,KAAK;GAAM;GAAU,KAAK,EAAM;EAAI,IAGxC;GACL,KAAK;GACL;GACA,KAAK,EAAM;GACX,gBAAgB,EAAuB,EAAM,GAAG;GAChD,MAAM,EAAM;GACZ,MAAM,EAAM;GACZ,aAAa,EAAM;EACrB;CACF,CAAC;CAMD,OAJI,KACF,EAAQ,MAAM,GAAG,MAAM,EAAsB,EAAE,KAAK,EAAE,GAAG,CAAC,GAGrD,EAAc;EAAE,UAAU;EAAM;EAAgB;EAAS;CAAM,CAAC;AACzE"}
|
package/dist/index/index.cjs
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../
|
|
1
|
+
Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require("../createArchiveFromEntries-B4KAUclj.cjs"),t=require("../fileAccessors-DWVChFUB.cjs");let n=require("@prose-reader/shared"),r=require("@prose-reader/archive-parser"),i=require("xmldoc"),a=require("rxjs");var o=async(r,i={})=>e.t(r,e=>e.isDir?{dir:!0,uri:e.name}:{dir:!1,uri:e.name,size:e.size,...t.t(e.data,(0,n.detectMimeTypeFromName)(e.name)??``)},{...i,close:()=>Promise.resolve()}),s=async(n,{mimeType:r,direction:i}={mimeType:`text/plain`})=>{let a=`
|
|
2
2
|
<?xml version="1.0" encoding="UTF-8"?>
|
|
3
3
|
<package xmlns="http://www.idpf.org/2007/opf" version="3.0" xml:lang="ja" prefix="rendition: http://www.idpf.org/vocab/rendition/#"
|
|
4
4
|
unique-identifier="ootuya-id">
|
|
@@ -9,24 +9,24 @@ Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=requi
|
|
|
9
9
|
<manifest>
|
|
10
10
|
<item id="p01" href="p01.txt" media-type="text/plain"/>
|
|
11
11
|
</manifest>
|
|
12
|
-
<spine page-progression-direction="${
|
|
12
|
+
<spine page-progression-direction="${i??`ltr`}">
|
|
13
13
|
<itemref idref="p01" />
|
|
14
14
|
</spine>
|
|
15
15
|
</package>
|
|
16
|
-
`;return e.
|
|
16
|
+
`;return e.o({filename:`content.txt`,encodingFormat:r,records:[{dir:!1,basename:e.r(`generated.opf`),uri:`generated.opf`,size:0,...t.n(async()=>new Blob([a]))},{dir:!1,basename:e.r(`p01.txt`),uri:`p01.txt`,size:typeof n==`string`?new Blob([n]).size:n.size,encodingFormat:r,...t.n(async()=>typeof n==`string`?new Blob([n]):n)}],close:()=>Promise.resolve()})},c=/^[A-Za-z0-9_][A-Za-z0-9_.-]*$/,l=/^[A-Za-z0-9_]/,u=/^xml/i,d=/[^A-Za-z0-9_.-]+/g,f=`_`,p=e=>e.replace(/^_+|_+$/g,``),m=e=>p(e.trim().replaceAll(`/`,`_`).replace(d,`_`)),h=e=>{if(c.test(e)&&!u.test(e))return e;let t=m(e),n=t&&!u.test(t)?t:`${f}${t}`;return l.test(n)?n:`${f}${n}`},g=(e,t)=>{let n=h(e);if(!t.has(n))return t.add(n),n;let r=2,i=`${n}-${r}`;for(;t.has(i);)r+=1,i=`${n}-${r}`;return t.add(i),i},_=()=>{let e=new Set;return t=>g(t,e)},ee=async(r,i)=>{let a=_(),o=r.map(e=>({id:a(e),url:e})),s=`
|
|
17
17
|
<?xml version="1.0" encoding="UTF-8"?><package xmlns="http://www.idpf.org/2007/opf" version="2.0" unique-identifier="bookid">
|
|
18
18
|
<metadata>
|
|
19
|
-
<meta property="rendition:layout">${
|
|
20
|
-
${
|
|
19
|
+
<meta property="rendition:layout">${i?.useRenditionFlow?`reflowable`:`pre-paginated`}</meta>
|
|
20
|
+
${i?.useRenditionFlow?`<meta property="rendition:flow">scrolled-continuous</meta>`:``}
|
|
21
21
|
</metadata>
|
|
22
22
|
<manifest>
|
|
23
|
-
${
|
|
23
|
+
${o.map(({id:e,url:t})=>{let r=(0,n.detectMimeTypeFromName)(t);return`<item id="${e}" href="${(0,n.escapeXmlAttributeValue)(t)}" media-type="${(0,n.escapeXmlAttributeValue)(r??``)}"/>`}).join(`
|
|
24
24
|
`)}
|
|
25
25
|
</manifest>
|
|
26
26
|
<spine>
|
|
27
|
-
${
|
|
27
|
+
${o.map(({id:e})=>`<itemref idref="${e}" />`).join(`
|
|
28
28
|
`)}
|
|
29
29
|
</spine>
|
|
30
30
|
</package>
|
|
31
|
-
`,l=i.map(e=>({dir:!1,basename:t.n(e),encodingFormat:(0,r.detectMimeTypeFromName)(e),uri:e,size:0,...n.n(async()=>(await fetch(e)).blob())}));return e.t({records:[{dir:!1,basename:`content.opf`,uri:`content.opf`,size:0,...n.n(async()=>new Blob([c]))},...l],close:()=>Promise.resolve()})},y=e=>!e.dir,b=e=>e.dir,x=(e,t)=>{let n=e.recordsByUri.get(t);return n&&y(n)?n:void 0},S=i.COMIC_INFO_FILENAME.toLowerCase(),C=e=>e.records.find(e=>y(e)&&e.basename.toLowerCase()===S),w=async e=>new TextDecoder().decode(await e.arrayBuffer()),te=({enableReport:t}={})=>{e.n.enable(!!t)},T=e=>{let t=e.records.filter(e=>!e.dir).find(e=>e.uri.endsWith(`.opf`));return{data:t,basePath:t?.uri.substring(0,t.uri.lastIndexOf(`/`))||``}};async function E(e){let{data:t,basePath:n}=T(e)||{};if(!(!t||t.dir))return{opf:(0,i.parseOpf)(await w(t)),basePath:n}}var D=i.APPLE_IBOOKS_DISPLAY_OPTIONS_FILENAME.toLowerCase(),ne=({archive:e})=>async t=>{let n=e.records.find(e=>!e.dir&&e.basename.toLowerCase()===D);if(!n||n.dir)return t;let r=await w(n);try{let{renditionLayout:e}=(0,i.resolveArchiveMetadata)((0,i.parseAppleDisplayOptionsXml)(r));return{...t,renditionLayout:t.renditionLayout??e}}catch(e){return console.error(`Unable to parse ${i.APPLE_IBOOKS_DISPLAY_OPTIONS_FILENAME} for content\n`,r),console.error(e),t}},re=i.COMIC_INFO_FILENAME.toLowerCase(),ie=({archive:e})=>async t=>{let n=C(e);if(!n)return t;let r={...t,spineItems:t.spineItems.filter(e=>!e.id.toLowerCase().endsWith(re)).map((e,t,n)=>({...e,progressionWeight:1/n.length}))},a=await w(n);try{let e=(0,i.resolveArchiveMetadata)((0,i.parseComicInfo)(a));return{...r,readingDirection:e.readingDirection??r.readingDirection}}catch(e){return console.error(`Unable to parse ${i.COMIC_INFO_FILENAME} for content\n`,a),console.error(e),r}},ae=({baseUrl:e=``,resourcePath:t})=>{if(!e&&/^https?:\/\//.test(t))return encodeURI(t);let n=e?`${e}${e.endsWith(`/`)?``:`/`}`:`file://`;return encodeURI(`${n}${t}`)},oe=({archive:e,baseUrl:t})=>async()=>{let n=e.records.filter(e=>!e.dir),r=v(),i=n.map(e=>({file:e,id:r(e.uri)}));return{filename:e.filename??``,title:e.records.find(({dir:e})=>e)?.basename.replace(/\/$/,``)||e.filename||``,renditionLayout:void 0,renditionSpread:`auto`,readingDirection:void 0,spineItems:i.filter(({file:e})=>!e.basename.endsWith(`.db`)).map(({file:e,id:r},i)=>({id:r,index:i,href:ae({baseUrl:t,resourcePath:e.uri}),renditionLayout:void 0,progressionWeight:1/n.length,pageSpreadLeft:void 0,pageSpreadRight:void 0,mediaType:e.encodingFormat})),items:i.map(({file:e,id:n})=>({id:n,href:encodeURI(`${t}${e.uri}`)}))}},O=async({archive:e,archiveOpf:t})=>{if(!t)return[];let{opf:n,basePath:r}=t,{spineRows:i}=n;return e.records.filter(e=>i.find(t=>r?`${r}/${t.href}`===e.uri:`${t.href}`===e.uri))},k=(e,t,n)=>{let{basePath:r}=T(t)||{};return e.map(e=>{let t=e.href,i=n?.(t)??``;return{href:r?`${i}${r}/${t}`:`${i}${t}`,id:e.id,mediaType:e.mediaType}})},se=e=>{let t=e?.trim();return t===`scrolled-continuous`||t===`scrolled-doc`||t===`paginated`||t===`auto`?t:`auto`},ce=e=>{let t=e?.trim();if(t===`none`||t===`landscape`||t===`portrait`||t===`both`||t===`auto`)return t},le=e=>{let t=e?.trim();if(t===`cover`||t===`title-page`||t===`copyright-page`||t===`text`)return t},A=({archive:t,baseUrl:n,archiveOpf:r})=>async a=>{if(!r)return a;let{opf:o,basePath:s}=r,c=(0,i.resolveArchiveMetadata)(o);e.n.groupCollapsed(...e.n.getGroupArgs(`OPF parsed`)),e.n.log(`opf`,o),e.n.groupEnd();let l=o.renditionLayoutMeta?.trim(),u=l===`reflowable`||l===`pre-paginated`?l:c.renditionLayout,d=o.title?.trim()||t.records.find(({dir:e})=>e)?.basename||``,f=c.readingDirection??a.readingDirection,p=(await O({archive:t,archiveOpf:r})).filter(y).reduce((e,t)=>t.size+e,0),m=o.guide,h=[];for(let e of m){let t=le(e.type);t!==void 0&&h.push({href:e.href,title:e.title,type:t})}return{filename:t.filename??``,renditionLayout:u,renditionFlow:se(o.renditionFlowMeta),renditionSpread:ce(o.renditionSpreadMeta),title:d,readingDirection:f,spineItems:o.spineRows.map((e,r)=>{let i=x(t,s?`${s}/${e.href}`:e.href),a=i?i.size:0,c=n||(/^https?:\/\//.test(e.href)?``:`file://`);return{id:e.id,index:r,href:e.href.startsWith(`https://`)?e.href:s?`${c}${s}/${e.href}`:`${c}${e.href}`,renditionLayout:e.renditionLayout??u,...e.renditionFlow===void 0?{}:{renditionFlow:e.renditionFlow},progressionWeight:p>0?a/p:1/o.spineRows.length,pageSpreadLeft:e.pageSpreadLeft,pageSpreadRight:e.pageSpreadRight,mediaType:e.mediaType}}),items:k(o.manifestItems,t,e=>/^https?:\/\//.test(e)?``:n||`file://`),guide:h.length>0?h:void 0}},j=e=>{let t=e.descendantWithPath(`head`)?.childrenNamed(`meta`).find(e=>e.attr.name===`viewport`);return!!(t&&t.attr.name===`viewport`)},M=e=>e.reduce(async(e,t)=>{if(!await e||!(0,r.isXmlBasedMimeType)({mimeType:y(t)?t.encodingFormat:void 0,uri:t.uri}))return!1;let n=t.dir?null:await w(t);return n?j(new a.XmlDocument(n)):!1},Promise.resolve(!0)),N=({archive:e,archiveOpf:t})=>async n=>n.renditionLayout===`reflowable`&&n.spineItems.every(e=>e.renditionLayout===`reflowable`)&&await M(await O({archive:e,archiveOpf:t}))?{...n,spineItems:n.spineItems.map(e=>({...e,renditionLayout:`pre-paginated`})),renditionLayout:`pre-paginated`}:n,P=()=>e=>({...e,readingDirection:e.readingDirection??`ltr`}),F=async e=>{let t;return await Promise.all(e.records.map(async e=>{if(e.dir||!e.uri.endsWith(i.KOBO_DISPLAY_OPTIONS_FILENAME))return;let n=await w(e);try{let{renditionLayout:e}=(0,i.parseKoboXml)(n);e&&(t=e)}catch(e){console.error(`Unable to parse ${i.KOBO_DISPLAY_OPTIONS_FILENAME} for content\n`,n),console.error(e)}})),{kind:`kobo`,...t===void 0?{}:{renditionLayout:t}}},I=({archive:e})=>async t=>{let{renditionLayout:n}=(0,i.resolveArchiveMetadata)(await F(e));return{...t,renditionLayout:t.renditionLayout??n}},L=e=>e.toLowerCase().endsWith(`.opf`),R=e=>e.records.some(e=>!e.dir&&(L(e.basename)||L(e.uri))),z=({archive:e})=>async t=>R(e)?t:{...t,spineItems:t.spineItems.map(t=>{let n=e.records.find(e=>decodeURI(t.href).endsWith(e.uri)),i=(0,r.parseContentType)((n&&y(n)?n.encodingFormat:void 0)??``)||(0,r.detectMimeTypeFromName)(n?.basename??``);return{...t,renditionLayout:i&&(0,r.isMediaContentMimeType)(i)?`pre-paginated`:t.renditionLayout}})},B=e=>e?e.children.map(e=>e instanceof a.XmlTextNode?e.text:e instanceof a.XmlElement?B(e):``).join(``).trim():``,V=e=>(0,i.tokenizeXmlSpaceSeparatedList)(e.properties).includes(`nav`),H=(e,{basePath:t,baseUrl:n})=>{let i={contents:[],path:``,href:``,title:``},a=e.childNamed(`span`)||e.childNamed(`a`);i.title=(a?.attr.title||a?.val.trim()||B(a))??``;let o=a?.name;o!==`a`&&(a=e.descendantWithPath(`${o}.a`),a&&(o=a.name.toLowerCase())),o===`a`&&a?.attr.href&&(i.path=(0,r.urlJoin)(t,a.attr.href),i.href=(0,r.urlJoin)(n,t,a.attr.href));let s=e.childNamed(`ol`);if(s){let e=s.childrenNamed(`li`);e&&e.length>0&&(i.contents=e.map(e=>H(e,{basePath:t,baseUrl:n})))}return i},U=(e,{basePath:t,baseUrl:n})=>{let r=[],i;return e.descendantWithPath(`body.nav.ol`)?i=e.descendantWithPath(`body.nav.ol`)?.children:e.descendantWithPath(`body.section.nav.ol`)&&(i=e.descendantWithPath(`body.section.nav.ol`)?.children),i&&i.length>0&&i.filter(e=>e.name===`li`).forEach(e=>{r.push(H(e,{basePath:t,baseUrl:n}))}),r},W=async(e,n,{baseUrl:r})=>{let i=e.manifestItems.find(V);if(i?.href){let e=n.records.find(e=>e.uri.endsWith(i.href));if(e&&!e.dir)return U(new a.XmlDocument(await w(e)),{basePath:t.t(e.uri),baseUrl:r})}},G=(e,{opfBasePath:t,baseUrl:n,prefix:i})=>{let a=e?.childNamed(`${i}content`)?.attr.src||``,o={title:e?.descendantWithPath(`${i}navLabel.${i}text`)?.val||``,path:(0,r.urlJoin)(t,a),href:(0,r.urlJoin)(n,t,a),contents:[]},s=e.childrenNamed(`${i}navPoint`);return s&&s.length>0&&(o.contents=s.map(e=>G(e,{opfBasePath:t,baseUrl:n,prefix:i}))),o},ue=(e,{opfBasePath:t,baseUrl:n})=>{let r=[],i=e.name,a=``;return i.indexOf(`:`)!==-1&&(a=`${i.split(`:`)[0]}:`),e.childNamed(`${a}navMap`)?.childrenNamed(`${a}navPoint`).forEach(e=>{r.push(G(e,{opfBasePath:t,baseUrl:n,prefix:a}))}),r},de=async({opf:e,opfBasePath:t,baseUrl:n,archive:r})=>{let i=e.spineTocIdref;if(i){let o=e.manifestItems.find(e=>e.id===i);if(o){let e=`${t}${t===``?``:`/`}${o.href}`,i=r.records.find(t=>t.uri.endsWith(e));if(i&&!i.dir)return ue(new a.XmlDocument(await w(i)),{opfBasePath:t,baseUrl:n})}}},fe=async(e,t,{baseUrl:n})=>{let{basePath:r}=T(t)||{},i=await W(e,t,{baseUrl:n});if(i)return i;let a=await de({opf:e,opfBasePath:r??``,archive:t,baseUrl:n});if(a)return a},pe=e=>e.replace(/\.[^.]+$/,``).replace(/[_-]/g,` `).replace(/\s+/g,` `).trim(),me=(e,t)=>{if(e.spineItems.length!==0&&e.spineItems.every(e=>((0,r.parseContentType)(e.mediaType??``)||(0,r.detectMimeTypeFromName)(e.href))?.startsWith(`audio/`)))return e.spineItems.map(e=>{let n=t.records.find(t=>!t.dir&&decodeURI(e.href).endsWith(t.uri));return{title:pe(n?.basename??e.href),href:e.href,path:n?.uri??e.href,contents:[]}})},he=(e,{baseUrl:n})=>{let i=[...e.records].sort((e,n)=>t.i(e.uri,n.uri)),a=(e,t,n,r,i)=>{let o=e.find(e=>e.title===t),[s,...c]=n;return o?s?[...e.filter(e=>e!==o),{...o,contents:[...o.contents,...a(o.contents,s,c,r,i)]}]:o.path.split(`/`).length>i.split(`/`).length?[...e.filter(e=>e!==o),{...o,path:i,href:r}]:e:s?[...e,{contents:a([],s,c,r,i),href:r,path:i,title:t}]:[...e,{contents:[],href:r,path:i,title:t}]};return i.reduce((e,t)=>{if(t.dir)return e;let[i,...o]=t.uri.split(`/`).slice(0,-1);return i?a(e,i,o,(0,r.urlJoin)(n,encodeURI(t.uri)).replace(/\/$/,``),t.uri.replace(/\/$/,``)):e},[])},ge=async(e,t,{baseUrl:n,archiveOpf:r})=>{if(r)return await fe(r.opf,e,{baseUrl:n})||[];let i=me(t,e);if(i)return i;let a=he(e,{baseUrl:n});if(a.length!==0)return a},_e=({archive:e,baseUrl:t,archiveOpf:n})=>async r=>{if(r.nav)return r;let i=await ge(e,r,{baseUrl:t,archiveOpf:n});return i?{...r,nav:{toc:i}}:r},ve=e=>e?e.endsWith(`/`)?e:`${e}/`:``,K=async(t,{baseUrl:n=``,hooks:r={}}={})=>{e.n.log(`Generating manifest from archive`,t);let i=await E(t),a=ve(n),o=e=>(e??[]).map(e=>e({archive:t,baseUrl:a})),s=[A({archive:t,baseUrl:a,archiveOpf:i}),ie({archive:t,baseUrl:a}),ne({archive:t,baseUrl:a}),z({archive:t,baseUrl:a}),...o(r.content)],c=o(r.spine),l=[N({archive:t,baseUrl:a,archiveOpf:i}),I({archive:t,baseUrl:a}),...o(r.presentation)],u=[_e({archive:t,baseUrl:a,archiveOpf:i}),...o(r.navigation)],d=[...s,...c,...l,...u,P()];try{let n=oe({archive:t,baseUrl:a})(),r=await d.reduce(async(e,t)=>await t(await e),n);if(e.n.log(`Generated manifest`,r),process.env.NODE_ENV===`development`&&e.n.isEnabled()){let t=JSON.stringify(r,null,2);e.n.groupCollapsed(...e.n.getGroupArgs(`Generated manifest`)),e.n.log(`\n${t}`),e.n.groupEnd()}return r}catch(t){throw e.n.error(t),t}},ye=e=>{let t=e.descendantWithPath(`head`)?.childrenNamed(`meta`).find(e=>e.attr.name===`calibre:cover`);return!!(t&&t.attr.name===`calibre:cover`)},be=e=>e.descendantWithPath(`body`)?.descendantWithPath(`div`)?.childrenNamed(`svg`)?.find(e=>e.attr.width===`100%`&&e.attr.preserveAspectRatio===`none`),xe=({archive:e,resourcePath:t})=>async n=>{let r=x(e,t);if(r?.basename.endsWith(`.xhtml`)){let e=new a.XmlDocument(typeof n.body==`string`?n.body:await w(r));if(ye(e)){let t=be(e);return t&&delete t.attr.preserveAspectRatio,{...n,body:e?.toString()}}}return n},Se=({archive:e,resourcePath:t})=>async n=>xe({archive:e,resourcePath:t})(n),Ce=({archive:e,resourcePath:t})=>async n=>{let r=x(e,t);if(r?.basename.endsWith(`.css`)){let e=(typeof n.body==`string`?n.body:await w(r)).replaceAll(`-webkit-writing-mode`,`writing-mode`);return{...n,body:e}}return n},we=async(e,t)=>{let n=await E(e);if(n){let{opf:r}=n,i=k(r.manifestItems,e,()=>``).find(e=>t.endsWith(e.href))?.mediaType;if(i)return{mediaType:i}}return{mediaType:Te(t)}},Te=e=>{if(e.endsWith(`.css`))return`text/css; charset=UTF-8`;if(e.endsWith(`.jpg`))return`image/jpg`;if(e.endsWith(`.xhtml`))return`application/xhtml+xml`;if(e.endsWith(`.mp4`))return`video/mp4`;if(e.endsWith(`.svg`))return`image/svg+xml`},Ee=({archive:e,resourcePath:t})=>async n=>{let r=x(e,t);if(!r)return n;let i=await we(e,t);return{...n,params:{...n.params,...r?.encodingFormat&&{contentType:r.encodingFormat},...i.mediaType&&{contentType:i.mediaType}}}},q=`div.span.p.a.li.ul.ol.h1.h2.h3.h4.h5.h6.table.tr.td.th.thead.tbody.tfoot.section.article.header.footer.nav.aside.main.figure.figcaption.blockquote.pre.code.form.textarea.select.option.button.label.fieldset.legend.caption.dl.dt.dd.iframe.video.audio.canvas.script.style`.split(`.`),De=({archive:e,resourcePath:t})=>async n=>{let r=x(e,t);if(r?.basename.endsWith(`.xhtml`)){let e=typeof n.body==`string`?n.body:await w(r);if(!RegExp(`<(${q.join(`|`)})[\\s/>]`,`i`).test(e))return n;let t=RegExp(`<(${q.join(`|`)})(\\s[^>]*)?\\s*/>`,`gi`),i=e.replace(t,(e,t,n=``)=>`<${t} ${n.trim()}></${t}>`);return{...n,body:i}}return n},J=async(t,n,{hooks:r=[]}={})=>{let i={params:{}},a=[...r.map(e=>e({archive:t,resourcePath:n})),Ee({archive:t,resourcePath:n}),De({archive:t,resourcePath:n}),Ce({archive:t,resourcePath:n}),Se({archive:t,resourcePath:n})];try{let r=await a.reduce(async(e,t)=>await t(await e),Promise.resolve(i));if(e.n.log(`Generated resource`,n,r),r.body!==void 0)return r;let o=x(t,n);if(!o)throw Error(`no file found for resourcePath:${n}`);return{...r,body:await o.blob()}}catch(t){throw e.n.error(t),t}},Oe=class{constructor(e){this.cleanArchiveAfter=e,this.state$=new o.BehaviorSubject({status:`idle`,locks:0})}update(e){this.state$.next({...this.state$.getValue(),...e})}get locks$(){return this.state$.pipe((0,o.map)(({locks:e})=>e))}get state(){return this.state$.getValue()}get isUnlocked$(){return this.locks$.pipe((0,o.map)(e=>e<=0),(0,o.distinctUntilChanged)(),(0,o.shareReplay)())}get overTTL$(){return this.isUnlocked$.pipe((0,o.switchMap)(e=>e?this.cleanArchiveAfter===1/0?o.NEVER:(0,o.timer)(this.cleanArchiveAfter):o.NEVER))}},ke=({getArchive:t,cleanArchiveAfter:n=300*1e3})=>{let r=new o.Subject,i=new o.Subject,a=new o.Subject,s={};return r.pipe((0,o.mergeMap)(n=>{let r=s[n];if(!r||r.state.status!==`idle`)return o.EMPTY;let i=!1,c=t=>{e.n.debug(`Cleaning up archive with key: ${t}`);let n=s[t];delete s[t],i||=(n?.state.archive?.close(),!0)};r.update({status:`loading`});let l=r.locks$,u=r.isUnlocked$,d=l.pipe((0,o.pairwise)(),(0,o.filter)(([e,t])=>t>e),(0,o.startWith)(!0));return(0,o.from)(t(n)).pipe((0,o.tap)(e=>{r.update({archive:e,status:`success`})}),(0,o.catchError)(e=>(c(n),r.update({status:`error`,error:e}),o.EMPTY)),(0,o.switchMap)(()=>(0,o.merge)(d.pipe((0,o.switchMap)(()=>a),(0,o.switchMap)(()=>u),(0,o.filter)(e=>e)),r.overTTL$).pipe((0,o.first)(),(0,o.tap)(()=>{c(n)}))))}),(0,o.takeUntil)(i)).subscribe(),{access:e=>{let t=!1,i=s[e]??new Oe(n);s[e]=i,i.update({locks:i.state.locks+1});let a=()=>{t||(t=!0,i.update({locks:i.state.locks-1}))};return r.next(e),(0,o.merge)(i.state$.pipe((0,o.map)(({archive:e})=>e),(0,o.filter)(e=>!!e)),i.state$.pipe((0,o.tap)(({error:e})=>{if(e)throw e}),(0,o.ignoreElements)())).pipe((0,o.first)(),(0,o.map)(e=>({archive:e,release:a})),(0,o.catchError)(e=>{throw a(),e}))},purge:()=>{a.next()},_archives:s}},Y=e=>e?/^\d+$/.test(e)?{valid:!0,value:Number.parseInt(e,10)}:{valid:!1,value:void 0}:{valid:!0,value:void 0},Ae=e=>{if(!e.toLowerCase().startsWith(`bytes=`))return{kind:`missing`};let t=e.slice(6).trim();if(!t)return{kind:`invalid`};if(t.includes(`,`))return{kind:`multi`};let n=/^(\d*)-(\d*)$/.exec(t);if(!n)return{kind:`invalid`};let[,r=``,i=``]=n,a=Y(r.trim()),o=Y(i.trim());return!a.valid||!o.valid?{kind:`invalid`}:{kind:`single`,start:a.value,end:o.value}},X=e=>{if(e instanceof Blob)return{size:e.size,slice:(t,n)=>{let r=e.slice(t,n);return{content:r,length:r.size}}};let t=new TextEncoder().encode(e);return{size:t.byteLength,slice:(e,n)=>{let r=t.slice(e,n);return{content:r,length:r.byteLength}}}},je=({body:e,contentType:t,rangeHeader:n})=>{let r=new Headers;if(t&&r.set(`Content-Type`,t),r.set(`Accept-Ranges`,`bytes`),!n)return e instanceof Blob&&r.set(`Content-Length`,String(e.size)),new Response(e,{status:200,headers:r});let i=Ae(n);if(i.kind===`missing`||i.kind===`multi`)return e instanceof Blob&&r.set(`Content-Length`,String(e.size)),new Response(e,{status:200,headers:r});let a=X(e),o=a.size;if(i.kind===`invalid`)return new Response(null,{status:416,headers:{"Content-Range":`bytes */${o}`}});let s=i.start,c=i.end;if(s===void 0&&c===void 0||(s===void 0?(s=Math.max(0,o-Math.min(c??0,o)),c=o-1):(c===void 0||c>=o)&&(c=o-1),s<0||c<0||s>=o||c>=o||s>c))return new Response(null,{status:416,headers:{"Content-Range":`bytes */${o}`}});let l=a.slice(s,c+1);return r.set(`Content-Length`,String(l.length)),r.set(`Content-Range`,`bytes ${s}-${c}/${o}`),new Response(l.content,{status:206,headers:r})},Z=`file://`,Me=/^https?:\/\//,Ne=e=>{try{return decodeURIComponent(e)}catch{return e}},Q=e=>e.startsWith(Z)?e.slice(Z.length):e,Pe=e=>{let t=Q(e);return Me.test(t)?t:Q(Ne(t))},$=class{constructor({hooks:e,onError:t,onManifestSuccess:n,...r}){this.onError=e=>(console.error(e),new Response(String(e),{status:500})),this.archiveLoader=ke(r),this.hooks=e??{},this.onManifestSuccess=n??(({manifest:e})=>Promise.resolve(e)),this.onError=t??this.onError}prune(){this.archiveLoader.purge()}accessArchive(e){return this.lastAccessedKey!==void 0&&this.lastAccessedKey!==e&&this.archiveLoader.purge(),this.lastAccessedKey=e,this.archiveLoader.access(e)}accessArchiveWithoutLock(e){return this.accessArchive(e).pipe((0,o.map)(({archive:e,release:t})=>(t(),e)))}withArchiveResponse({key:e,getResponse:t}){return(0,o.lastValueFrom)(this.accessArchive(e).pipe((0,o.mergeMap)(({archive:e,release:n})=>(0,o.from)(t(e)).pipe((0,o.finalize)(()=>{n()}))),(0,o.catchError)(e=>(0,o.of)(this.onError(e)))))}fetchManifest({key:e,baseUrl:t}){return this.withArchiveResponse({key:e,getResponse:e=>(0,o.from)(K(e,{baseUrl:t,hooks:this.hooks.manifest})).pipe((0,o.switchMap)(t=>(0,o.from)(this.onManifestSuccess({manifest:t,archive:e}))),(0,o.map)(e=>new Response(JSON.stringify(e),{status:200})))})}fetchResource({key:e,resourcePath:t,request:n}){return this.withArchiveResponse({key:e,getResponse:e=>(0,o.from)(J(e,Pe(t),{hooks:this.hooks.resource})).pipe((0,o.map)(e=>je({body:e.body??``,contentType:e.params.contentType,rangeHeader:n?.headers.get(`range`)})))})}},Fe=class extends ${constructor({getUriInfo:e,...t}){super(t),this.getUriInfo=e,this.fetchEventListener=this.fetchEventListener.bind(this)}fetchEventListener(e){try{let n=this.getUriInfo(e);if(!n)return;let r=t.r(n.baseUrl),i=e.request.url.substring(r.length+1),[a=``]=i.split(`/`),o=t.r(i.substring(a.length+1));i.endsWith(`/manifest`)?e.respondWith(this.fetchManifest({key:a,baseUrl:`${r}/${a}/`})):e.respondWith(this.fetchResource({key:a,resourcePath:o,request:e.request}))}catch(t){e.respondWith(new Response(String(t),{status:500}))}}};exports.ServiceWorkerStreamer=Fe,exports.Streamer=$,exports.arrayBufferFileAccessors=n.t,exports.blobFileAccessors=n.n,exports.configure=te,exports.createArchive=e.t,exports.createArchiveFromArrayBufferList=s,exports.createArchiveFromText=c,exports.createArchiveFromUrls=ee,exports.createUniqueXmlSafeId=_,exports.createXmlSafeId=g,exports.createXmlSafeIdFactory=v,exports.generateManifestFromArchive=K,exports.generateResourceFromArchive=J,exports.getArchiveFileRecordByUri=x,exports.getArchiveHasComicInfo=C,exports.getArchiveOpfInfo=T,exports.getUriBasePath=t.t,exports.getUriBasename=t.n,exports.isDirectoryRecord=b,exports.isFileRecord=y,exports.readRecordAsText=w,exports.removeTrailingSlash=t.r,exports.sortByTitleComparator=t.i;
|
|
31
|
+
`,c=r.map(r=>({dir:!1,basename:e.r(r),encodingFormat:(0,n.detectMimeTypeFromName)(r),uri:r,size:0,...t.n(async()=>(await fetch(r)).blob())}));return e.o({records:[{dir:!1,basename:`content.opf`,uri:`content.opf`,size:0,...t.n(async()=>new Blob([s]))},...c],close:()=>Promise.resolve()})},v=e=>!e.dir,y=e=>e.dir,b=(e,t)=>{let n=e.recordsByUri.get(t);return n&&v(n)?n:void 0},x=r.COMIC_INFO_FILENAME.toLowerCase(),S=e=>e.records.find(e=>v(e)&&e.basename.toLowerCase()===x),C=async e=>new TextDecoder().decode(await e.arrayBuffer()),te=({enableReport:t}={})=>{e.s.enable(!!t)},w=e=>{let t=e.records.filter(e=>!e.dir).find(e=>e.uri.endsWith(`.opf`));return{data:t,basePath:t?.uri.substring(0,t.uri.lastIndexOf(`/`))||``}};async function T(e){let{data:t,basePath:n}=w(e)||{};if(!(!t||t.dir))return{opf:(0,r.parseOpf)(await C(t)),basePath:n}}var E=r.APPLE_IBOOKS_DISPLAY_OPTIONS_FILENAME.toLowerCase(),D=({archive:e})=>async t=>{let n=e.records.find(e=>!e.dir&&e.basename.toLowerCase()===E);if(!n||n.dir)return t;let i=await C(n);try{let{renditionLayout:e}=(0,r.resolveArchiveMetadata)((0,r.parseAppleDisplayOptionsXml)(i));return{...t,renditionLayout:t.renditionLayout??e}}catch(e){return console.error(`Unable to parse ${r.APPLE_IBOOKS_DISPLAY_OPTIONS_FILENAME} for content\n`,i),console.error(e),t}},ne=r.COMIC_INFO_FILENAME.toLowerCase(),re=({archive:e})=>async t=>{let n=S(e);if(!n)return t;let i={...t,spineItems:t.spineItems.filter(e=>!e.id.toLowerCase().endsWith(ne)).map((e,t,n)=>({...e,progressionWeight:1/n.length}))},a=await C(n);try{let e=(0,r.resolveArchiveMetadata)((0,r.parseComicInfo)(a));return{...i,readingDirection:e.readingDirection??i.readingDirection}}catch(e){return console.error(`Unable to parse ${r.COMIC_INFO_FILENAME} for content\n`,a),console.error(e),i}},ie=({baseUrl:e=``,resourcePath:t})=>{if(!e&&/^https?:\/\//.test(t))return encodeURI(t);let n=e?`${e}${e.endsWith(`/`)?``:`/`}`:`file://`;return encodeURI(`${n}${t}`)},ae=({archive:e,baseUrl:t})=>async()=>{let n=e.records.filter(e=>!e.dir),r=_(),i=n.map(e=>({file:e,id:r(e.uri)}));return{filename:e.filename??``,title:e.records.find(({dir:e})=>e)?.basename.replace(/\/$/,``)||e.filename||``,renditionLayout:void 0,renditionSpread:`auto`,readingDirection:void 0,spineItems:i.filter(({file:e})=>!e.basename.endsWith(`.db`)).map(({file:e,id:r},i)=>({id:r,index:i,href:ie({baseUrl:t,resourcePath:e.uri}),renditionLayout:void 0,progressionWeight:1/n.length,pageSpreadLeft:void 0,pageSpreadRight:void 0,mediaType:e.encodingFormat})),items:i.map(({file:e,id:n})=>({id:n,href:encodeURI(`${t}${e.uri}`)}))}},O=async({archive:e,archiveOpf:t})=>{if(!t)return[];let{opf:n,basePath:r}=t,{spineRows:i}=n;return e.records.filter(e=>i.find(t=>r?`${r}/${t.href}`===e.uri:`${t.href}`===e.uri))},k=(e,t,n)=>{let{basePath:r}=w(t)||{};return e.map(e=>{let t=e.href,i=n?.(t)??``;return{href:r?`${i}${r}/${t}`:`${i}${t}`,id:e.id,mediaType:e.mediaType}})},oe=e=>{let t=e?.trim();return t===`scrolled-continuous`||t===`scrolled-doc`||t===`paginated`||t===`auto`?t:`auto`},se=e=>{let t=e?.trim();if(t===`none`||t===`landscape`||t===`portrait`||t===`both`||t===`auto`)return t},ce=e=>{let t=e?.trim();if(t===`cover`||t===`title-page`||t===`copyright-page`||t===`text`)return t},A=({archive:t,baseUrl:n,archiveOpf:i})=>async a=>{if(!i)return a;let{opf:o,basePath:s}=i,c=(0,r.resolveArchiveMetadata)(o);e.s.groupCollapsed(...e.s.getGroupArgs(`OPF parsed`)),e.s.log(`opf`,o),e.s.groupEnd();let l=o.renditionLayoutMeta?.trim(),u=l===`reflowable`||l===`pre-paginated`?l:c.renditionLayout,d=o.title?.trim()||t.records.find(({dir:e})=>e)?.basename||``,f=c.readingDirection??a.readingDirection,p=(await O({archive:t,archiveOpf:i})).filter(v).reduce((e,t)=>t.size+e,0),m=o.guide,h=[];for(let e of m){let t=ce(e.type);t!==void 0&&h.push({href:e.href,title:e.title,type:t})}return{filename:t.filename??``,renditionLayout:u,renditionFlow:oe(o.renditionFlowMeta),renditionSpread:se(o.renditionSpreadMeta),title:d,readingDirection:f,spineItems:o.spineRows.map((e,r)=>{let i=b(t,s?`${s}/${e.href}`:e.href),a=i?i.size:0,c=n||(/^https?:\/\//.test(e.href)?``:`file://`);return{id:e.id,index:r,href:e.href.startsWith(`https://`)?e.href:s?`${c}${s}/${e.href}`:`${c}${e.href}`,renditionLayout:e.renditionLayout??u,...e.renditionFlow===void 0?{}:{renditionFlow:e.renditionFlow},progressionWeight:p>0?a/p:1/o.spineRows.length,pageSpreadLeft:e.pageSpreadLeft,pageSpreadRight:e.pageSpreadRight,mediaType:e.mediaType}}),items:k(o.manifestItems,t,e=>/^https?:\/\//.test(e)?``:n||`file://`),guide:h.length>0?h:void 0}},j=e=>{let t=e.descendantWithPath(`head`)?.childrenNamed(`meta`).find(e=>e.attr.name===`viewport`);return!!(t&&t.attr.name===`viewport`)},M=e=>e.reduce(async(e,t)=>{if(!await e||!(0,n.isXmlBasedMimeType)({mimeType:v(t)?t.encodingFormat:void 0,uri:t.uri}))return!1;let r=t.dir?null:await C(t);return r?j(new i.XmlDocument(r)):!1},Promise.resolve(!0)),N=({archive:e,archiveOpf:t})=>async n=>n.renditionLayout===`reflowable`&&n.spineItems.every(e=>e.renditionLayout===`reflowable`)&&await M(await O({archive:e,archiveOpf:t}))?{...n,spineItems:n.spineItems.map(e=>({...e,renditionLayout:`pre-paginated`})),renditionLayout:`pre-paginated`}:n,P=()=>e=>({...e,readingDirection:e.readingDirection??`ltr`}),F=async e=>{let t;return await Promise.all(e.records.map(async e=>{if(e.dir||!e.uri.endsWith(r.KOBO_DISPLAY_OPTIONS_FILENAME))return;let n=await C(e);try{let{renditionLayout:e}=(0,r.parseKoboXml)(n);e&&(t=e)}catch(e){console.error(`Unable to parse ${r.KOBO_DISPLAY_OPTIONS_FILENAME} for content\n`,n),console.error(e)}})),{kind:`kobo`,...t===void 0?{}:{renditionLayout:t}}},I=({archive:e})=>async t=>{let{renditionLayout:n}=(0,r.resolveArchiveMetadata)(await F(e));return{...t,renditionLayout:t.renditionLayout??n}},L=e=>e.toLowerCase().endsWith(`.opf`),R=e=>e.records.some(e=>!e.dir&&(L(e.basename)||L(e.uri))),z=({archive:e})=>async t=>R(e)?t:{...t,spineItems:t.spineItems.map(t=>{let r=e.records.find(e=>decodeURI(t.href).endsWith(e.uri)),i=(0,n.parseContentType)((r&&v(r)?r.encodingFormat:void 0)??``)||(0,n.detectMimeTypeFromName)(r?.basename??``);return{...t,renditionLayout:i&&(0,n.isMediaContentMimeType)(i)?`pre-paginated`:t.renditionLayout}})},B=e=>e?e.children.map(e=>e instanceof i.XmlTextNode?e.text:e instanceof i.XmlElement?B(e):``).join(``).trim():``,V=e=>(0,r.tokenizeXmlSpaceSeparatedList)(e.properties).includes(`nav`),H=(e,{basePath:t,baseUrl:r})=>{let i={contents:[],path:``,href:``,title:``},a=e.childNamed(`span`)||e.childNamed(`a`);i.title=(a?.attr.title||a?.val.trim()||B(a))??``;let o=a?.name;o!==`a`&&(a=e.descendantWithPath(`${o}.a`),a&&(o=a.name.toLowerCase())),o===`a`&&a?.attr.href&&(i.path=(0,n.urlJoin)(t,a.attr.href),i.href=(0,n.urlJoin)(r,t,a.attr.href));let s=e.childNamed(`ol`);if(s){let e=s.childrenNamed(`li`);e&&e.length>0&&(i.contents=e.map(e=>H(e,{basePath:t,baseUrl:r})))}return i},U=(e,{basePath:t,baseUrl:n})=>{let r=[],i;return e.descendantWithPath(`body.nav.ol`)?i=e.descendantWithPath(`body.nav.ol`)?.children:e.descendantWithPath(`body.section.nav.ol`)&&(i=e.descendantWithPath(`body.section.nav.ol`)?.children),i&&i.length>0&&i.filter(e=>e.name===`li`).forEach(e=>{r.push(H(e,{basePath:t,baseUrl:n}))}),r},W=async(t,n,{baseUrl:r})=>{let a=t.manifestItems.find(V);if(a?.href){let t=n.records.find(e=>e.uri.endsWith(a.href));if(t&&!t.dir)return U(new i.XmlDocument(await C(t)),{basePath:e.n(t.uri),baseUrl:r})}},G=(e,{opfBasePath:t,baseUrl:r,prefix:i})=>{let a=e?.childNamed(`${i}content`)?.attr.src||``,o={title:e?.descendantWithPath(`${i}navLabel.${i}text`)?.val||``,path:(0,n.urlJoin)(t,a),href:(0,n.urlJoin)(r,t,a),contents:[]},s=e.childrenNamed(`${i}navPoint`);return s&&s.length>0&&(o.contents=s.map(e=>G(e,{opfBasePath:t,baseUrl:r,prefix:i}))),o},le=(e,{opfBasePath:t,baseUrl:n})=>{let r=[],i=e.name,a=``;return i.indexOf(`:`)!==-1&&(a=`${i.split(`:`)[0]}:`),e.childNamed(`${a}navMap`)?.childrenNamed(`${a}navPoint`).forEach(e=>{r.push(G(e,{opfBasePath:t,baseUrl:n,prefix:a}))}),r},ue=async({opf:e,opfBasePath:t,baseUrl:n,archive:r})=>{let a=e.spineTocIdref;if(a){let o=e.manifestItems.find(e=>e.id===a);if(o){let e=`${t}${t===``?``:`/`}${o.href}`,a=r.records.find(t=>t.uri.endsWith(e));if(a&&!a.dir)return le(new i.XmlDocument(await C(a)),{opfBasePath:t,baseUrl:n})}}},de=async(e,t,{baseUrl:n})=>{let{basePath:r}=w(t)||{},i=await W(e,t,{baseUrl:n});if(i)return i;let a=await ue({opf:e,opfBasePath:r??``,archive:t,baseUrl:n});if(a)return a},fe=e=>e.replace(/\.[^.]+$/,``).replace(/[_-]/g,` `).replace(/\s+/g,` `).trim(),pe=(e,t)=>{if(e.spineItems.length!==0&&e.spineItems.every(e=>((0,n.parseContentType)(e.mediaType??``)||(0,n.detectMimeTypeFromName)(e.href))?.startsWith(`audio/`)))return e.spineItems.map(e=>{let n=t.records.find(t=>!t.dir&&decodeURI(e.href).endsWith(t.uri));return{title:fe(n?.basename??e.href),href:e.href,path:n?.uri??e.href,contents:[]}})},me=(t,{baseUrl:r})=>{let i=[...t.records].sort((t,n)=>e.a(t.uri,n.uri)),a=(e,t,n,r,i)=>{let o=e.find(e=>e.title===t),[s,...c]=n;return o?s?[...e.filter(e=>e!==o),{...o,contents:[...o.contents,...a(o.contents,s,c,r,i)]}]:o.path.split(`/`).length>i.split(`/`).length?[...e.filter(e=>e!==o),{...o,path:i,href:r}]:e:s?[...e,{contents:a([],s,c,r,i),href:r,path:i,title:t}]:[...e,{contents:[],href:r,path:i,title:t}]};return i.reduce((e,t)=>{if(t.dir)return e;let[i,...o]=t.uri.split(`/`).slice(0,-1);return i?a(e,i,o,(0,n.urlJoin)(r,encodeURI(t.uri)).replace(/\/$/,``),t.uri.replace(/\/$/,``)):e},[])},he=async(e,t,{baseUrl:n,archiveOpf:r})=>{if(r)return await de(r.opf,e,{baseUrl:n})||[];let i=pe(t,e);if(i)return i;let a=me(e,{baseUrl:n});if(a.length!==0)return a},ge=({archive:e,baseUrl:t,archiveOpf:n})=>async r=>{if(r.nav)return r;let i=await he(e,r,{baseUrl:t,archiveOpf:n});return i?{...r,nav:{toc:i}}:r},_e=e=>e?e.endsWith(`/`)?e:`${e}/`:``,K=async(t,{baseUrl:n=``,hooks:r={}}={})=>{e.s.log(`Generating manifest from archive`,t);let i=await T(t),a=_e(n),o=e=>(e??[]).map(e=>e({archive:t,baseUrl:a})),s=[A({archive:t,baseUrl:a,archiveOpf:i}),re({archive:t,baseUrl:a}),D({archive:t,baseUrl:a}),z({archive:t,baseUrl:a}),...o(r.content)],c=o(r.spine),l=[N({archive:t,baseUrl:a,archiveOpf:i}),I({archive:t,baseUrl:a}),...o(r.presentation)],u=[ge({archive:t,baseUrl:a,archiveOpf:i}),...o(r.navigation)],d=[...s,...c,...l,...u,P()];try{let n=ae({archive:t,baseUrl:a})(),r=await d.reduce(async(e,t)=>await t(await e),n);if(e.s.log(`Generated manifest`,r),process.env.NODE_ENV===`development`&&e.s.isEnabled()){let t=JSON.stringify(r,null,2);e.s.groupCollapsed(...e.s.getGroupArgs(`Generated manifest`)),e.s.log(`\n${t}`),e.s.groupEnd()}return r}catch(t){throw e.s.error(t),t}},ve=e=>{let t=e.descendantWithPath(`head`)?.childrenNamed(`meta`).find(e=>e.attr.name===`calibre:cover`);return!!(t&&t.attr.name===`calibre:cover`)},ye=e=>e.descendantWithPath(`body`)?.descendantWithPath(`div`)?.childrenNamed(`svg`)?.find(e=>e.attr.width===`100%`&&e.attr.preserveAspectRatio===`none`),be=({archive:e,resourcePath:t})=>async n=>{let r=b(e,t);if(r?.basename.endsWith(`.xhtml`)){let e=new i.XmlDocument(typeof n.body==`string`?n.body:await C(r));if(ve(e)){let t=ye(e);return t&&delete t.attr.preserveAspectRatio,{...n,body:e?.toString()}}}return n},xe=({archive:e,resourcePath:t})=>async n=>be({archive:e,resourcePath:t})(n),Se=({archive:e,resourcePath:t})=>async n=>{let r=b(e,t);if(r?.basename.endsWith(`.css`)){let e=(typeof n.body==`string`?n.body:await C(r)).replaceAll(`-webkit-writing-mode`,`writing-mode`);return{...n,body:e}}return n},Ce=async(e,t)=>{let n=await T(e);if(n){let{opf:r}=n,i=k(r.manifestItems,e,()=>``).find(e=>t.endsWith(e.href))?.mediaType;if(i)return{mediaType:i}}return{mediaType:we(t)}},we=e=>{if(e.endsWith(`.css`))return`text/css; charset=UTF-8`;if(e.endsWith(`.jpg`))return`image/jpg`;if(e.endsWith(`.xhtml`))return`application/xhtml+xml`;if(e.endsWith(`.mp4`))return`video/mp4`;if(e.endsWith(`.svg`))return`image/svg+xml`},Te=({archive:e,resourcePath:t})=>async n=>{let r=b(e,t);if(!r)return n;let i=await Ce(e,t);return{...n,params:{...n.params,...r?.encodingFormat&&{contentType:r.encodingFormat},...i.mediaType&&{contentType:i.mediaType}}}},q=`div.span.p.a.li.ul.ol.h1.h2.h3.h4.h5.h6.table.tr.td.th.thead.tbody.tfoot.section.article.header.footer.nav.aside.main.figure.figcaption.blockquote.pre.code.form.textarea.select.option.button.label.fieldset.legend.caption.dl.dt.dd.iframe.video.audio.canvas.script.style`.split(`.`),Ee=({archive:e,resourcePath:t})=>async n=>{let r=b(e,t);if(r?.basename.endsWith(`.xhtml`)){let e=typeof n.body==`string`?n.body:await C(r);if(!RegExp(`<(${q.join(`|`)})[\\s/>]`,`i`).test(e))return n;let t=RegExp(`<(${q.join(`|`)})(\\s[^>]*)?\\s*/>`,`gi`),i=e.replace(t,(e,t,n=``)=>`<${t} ${n.trim()}></${t}>`);return{...n,body:i}}return n},J=async(t,n,{hooks:r=[]}={})=>{let i={params:{}},a=[...r.map(e=>e({archive:t,resourcePath:n})),Te({archive:t,resourcePath:n}),Ee({archive:t,resourcePath:n}),Se({archive:t,resourcePath:n}),xe({archive:t,resourcePath:n})];try{let r=await a.reduce(async(e,t)=>await t(await e),Promise.resolve(i));if(e.s.log(`Generated resource`,n,r),r.body!==void 0)return r;let o=b(t,n);if(!o)throw Error(`no file found for resourcePath:${n}`);return{...r,body:await o.blob()}}catch(t){throw e.s.error(t),t}},De=class{constructor(e){this.cleanArchiveAfter=e,this.state$=new a.BehaviorSubject({status:`idle`,locks:0})}update(e){this.state$.next({...this.state$.getValue(),...e})}get locks$(){return this.state$.pipe((0,a.map)(({locks:e})=>e))}get state(){return this.state$.getValue()}get isUnlocked$(){return this.locks$.pipe((0,a.map)(e=>e<=0),(0,a.distinctUntilChanged)(),(0,a.shareReplay)())}get overTTL$(){return this.isUnlocked$.pipe((0,a.switchMap)(e=>e?this.cleanArchiveAfter===1/0?a.NEVER:(0,a.timer)(this.cleanArchiveAfter):a.NEVER))}},Oe=({getArchive:t,cleanArchiveAfter:n=300*1e3})=>{let r=new a.Subject,i=new a.Subject,o=new a.Subject,s={};return r.pipe((0,a.mergeMap)(n=>{let r=s[n];if(!r||r.state.status!==`idle`)return a.EMPTY;let i=!1,c=t=>{e.s.debug(`Cleaning up archive with key: ${t}`);let n=s[t];delete s[t],i||=(n?.state.archive?.close(),!0)};r.update({status:`loading`});let l=r.locks$,u=r.isUnlocked$,d=l.pipe((0,a.pairwise)(),(0,a.filter)(([e,t])=>t>e),(0,a.startWith)(!0));return(0,a.from)(t(n)).pipe((0,a.tap)(e=>{r.update({archive:e,status:`success`})}),(0,a.catchError)(e=>(c(n),r.update({status:`error`,error:e}),a.EMPTY)),(0,a.switchMap)(()=>(0,a.merge)(d.pipe((0,a.switchMap)(()=>o),(0,a.switchMap)(()=>u),(0,a.filter)(e=>e)),r.overTTL$).pipe((0,a.first)(),(0,a.tap)(()=>{c(n)}))))}),(0,a.takeUntil)(i)).subscribe(),{access:e=>{let t=!1,i=s[e]??new De(n);s[e]=i,i.update({locks:i.state.locks+1});let o=()=>{t||(t=!0,i.update({locks:i.state.locks-1}))};return r.next(e),(0,a.merge)(i.state$.pipe((0,a.map)(({archive:e})=>e),(0,a.filter)(e=>!!e)),i.state$.pipe((0,a.tap)(({error:e})=>{if(e)throw e}),(0,a.ignoreElements)())).pipe((0,a.first)(),(0,a.map)(e=>({archive:e,release:o})),(0,a.catchError)(e=>{throw o(),e}))},purge:()=>{o.next()},_archives:s}},Y=e=>e?/^\d+$/.test(e)?{valid:!0,value:Number.parseInt(e,10)}:{valid:!1,value:void 0}:{valid:!0,value:void 0},ke=e=>{if(!e.toLowerCase().startsWith(`bytes=`))return{kind:`missing`};let t=e.slice(6).trim();if(!t)return{kind:`invalid`};if(t.includes(`,`))return{kind:`multi`};let n=/^(\d*)-(\d*)$/.exec(t);if(!n)return{kind:`invalid`};let[,r=``,i=``]=n,a=Y(r.trim()),o=Y(i.trim());return!a.valid||!o.valid?{kind:`invalid`}:{kind:`single`,start:a.value,end:o.value}},Ae=e=>{if(e instanceof Blob)return{size:e.size,slice:(t,n)=>{let r=e.slice(t,n);return{content:r,length:r.size}}};let t=new TextEncoder().encode(e);return{size:t.byteLength,slice:(e,n)=>{let r=t.slice(e,n);return{content:r,length:r.byteLength}}}},X=({body:e,contentType:t,rangeHeader:n})=>{let r=new Headers;if(t&&r.set(`Content-Type`,t),r.set(`Accept-Ranges`,`bytes`),!n)return e instanceof Blob&&r.set(`Content-Length`,String(e.size)),new Response(e,{status:200,headers:r});let i=ke(n);if(i.kind===`missing`||i.kind===`multi`)return e instanceof Blob&&r.set(`Content-Length`,String(e.size)),new Response(e,{status:200,headers:r});let a=Ae(e),o=a.size;if(i.kind===`invalid`)return new Response(null,{status:416,headers:{"Content-Range":`bytes */${o}`}});let s=i.start,c=i.end;if(s===void 0&&c===void 0||(s===void 0?(s=Math.max(0,o-Math.min(c??0,o)),c=o-1):(c===void 0||c>=o)&&(c=o-1),s<0||c<0||s>=o||c>=o||s>c))return new Response(null,{status:416,headers:{"Content-Range":`bytes */${o}`}});let l=a.slice(s,c+1);return r.set(`Content-Length`,String(l.length)),r.set(`Content-Range`,`bytes ${s}-${c}/${o}`),new Response(l.content,{status:206,headers:r})},Z=`file://`,je=/^https?:\/\//,Me=e=>{try{return decodeURIComponent(e)}catch{return e}},Q=e=>e.startsWith(Z)?e.slice(Z.length):e,Ne=e=>{let t=Q(e);return je.test(t)?t:Q(Me(t))},$=class{constructor({hooks:e,onError:t,onManifestSuccess:n,...r}){this.onError=e=>(console.error(e),new Response(String(e),{status:500})),this.archiveLoader=Oe(r),this.hooks=e??{},this.onManifestSuccess=n??(({manifest:e})=>Promise.resolve(e)),this.onError=t??this.onError}prune(){this.archiveLoader.purge()}accessArchive(e){return this.lastAccessedKey!==void 0&&this.lastAccessedKey!==e&&this.archiveLoader.purge(),this.lastAccessedKey=e,this.archiveLoader.access(e)}accessArchiveWithoutLock(e){return this.accessArchive(e).pipe((0,a.map)(({archive:e,release:t})=>(t(),e)))}withArchiveResponse({key:e,getResponse:t}){return(0,a.lastValueFrom)(this.accessArchive(e).pipe((0,a.mergeMap)(({archive:e,release:n})=>(0,a.from)(t(e)).pipe((0,a.finalize)(()=>{n()}))),(0,a.catchError)(e=>(0,a.of)(this.onError(e)))))}fetchManifest({key:e,baseUrl:t}){return this.withArchiveResponse({key:e,getResponse:e=>(0,a.from)(K(e,{baseUrl:t,hooks:this.hooks.manifest})).pipe((0,a.switchMap)(t=>(0,a.from)(this.onManifestSuccess({manifest:t,archive:e}))),(0,a.map)(e=>new Response(JSON.stringify(e),{status:200})))})}fetchResource({key:e,resourcePath:t,request:n}){return this.withArchiveResponse({key:e,getResponse:e=>(0,a.from)(J(e,Ne(t),{hooks:this.hooks.resource})).pipe((0,a.map)(e=>X({body:e.body??``,contentType:e.params.contentType,rangeHeader:n?.headers.get(`range`)})))})}},Pe=class extends ${constructor({getUriInfo:e,...t}){super(t),this.getUriInfo=e,this.fetchEventListener=this.fetchEventListener.bind(this)}fetchEventListener(t){try{let n=this.getUriInfo(t);if(!n)return;let r=e.i(n.baseUrl),i=t.request.url.substring(r.length+1),[a=``]=i.split(`/`),o=e.i(i.substring(a.length+1));i.endsWith(`/manifest`)?t.respondWith(this.fetchManifest({key:a,baseUrl:`${r}/${a}/`})):t.respondWith(this.fetchResource({key:a,resourcePath:o,request:t.request}))}catch(e){t.respondWith(new Response(String(e),{status:500}))}}};exports.ServiceWorkerStreamer=Pe,exports.Streamer=$,exports.arrayBufferFileAccessors=t.t,exports.blobFileAccessors=t.n,exports.configure=te,exports.createArchive=e.o,exports.createArchiveFromArrayBufferList=o,exports.createArchiveFromText=s,exports.createArchiveFromUrls=ee,exports.createUniqueXmlSafeId=g,exports.createXmlSafeId=h,exports.createXmlSafeIdFactory=_,exports.generateManifestFromArchive=K,exports.generateResourceFromArchive=J,exports.getArchiveFileRecordByUri=b,exports.getArchiveHasComicInfo=S,exports.getArchiveOpfInfo=w,exports.getUriBasePath=e.n,exports.getUriBasename=e.r,exports.isDirectoryRecord=y,exports.isFileRecord=v,exports.readRecordAsText=C,exports.removeTrailingSlash=e.i,exports.sortByTitleComparator=e.a;
|
|
32
32
|
//# sourceMappingURL=index.cjs.map
|