@prose-reader/streamer 1.320.0 → 1.321.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/Streamer.d.ts +2 -2
- package/dist/{archives/archiveLoader.d.ts → archiveLoader.d.ts} +1 -1
- package/dist/generators/manifest/hooks/apple.d.ts +1 -1
- package/dist/generators/manifest/hooks/audiobookToc.d.ts +1 -1
- package/dist/generators/manifest/hooks/comicInfo.d.ts +1 -1
- package/dist/generators/manifest/hooks/default.d.ts +1 -1
- package/dist/generators/manifest/hooks/epub/epub.d.ts +1 -2
- package/dist/generators/manifest/hooks/epubOptimizer.d.ts +1 -2
- package/dist/generators/manifest/hooks/kobo.d.ts +1 -1
- package/dist/generators/manifest/hooks/nonEpub.d.ts +1 -1
- package/dist/generators/manifest/hooks/toc.d.ts +1 -2
- package/dist/generators/manifest/index.d.ts +1 -1
- package/dist/generators/resources/hooks/calibreFixHook.d.ts +1 -1
- package/dist/generators/resources/hooks/cssFixHook.d.ts +1 -1
- package/dist/generators/resources/hooks/defaultHook.d.ts +1 -1
- package/dist/generators/resources/hooks/selfClosingTagsFixHook.d.ts +1 -1
- package/dist/generators/resources/index.d.ts +1 -1
- package/dist/hooks.d.ts +1 -1
- package/dist/index/index.cjs +1 -31
- package/dist/index/index.cjs.map +1 -1
- package/dist/index/index.js +197 -424
- package/dist/index/index.js.map +1 -1
- package/dist/index.d.ts +0 -14
- package/package.json +5 -63
- package/dist/archives/createArchive.d.ts +0 -10
- package/dist/archives/createArchiveFromArrayBufferList.d.ts +0 -11
- package/dist/archives/createArchiveFromEntries.d.ts +0 -29
- package/dist/archives/createArchiveFromJszip/index.cjs +0 -2
- package/dist/archives/createArchiveFromJszip/index.cjs.map +0 -1
- package/dist/archives/createArchiveFromJszip/index.js +0 -19
- package/dist/archives/createArchiveFromJszip/index.js.map +0 -1
- package/dist/archives/createArchiveFromJszip.d.ts +0 -7
- package/dist/archives/createArchiveFromLibArchive/index.cjs +0 -2
- package/dist/archives/createArchiveFromLibArchive/index.cjs.map +0 -1
- package/dist/archives/createArchiveFromLibArchive/index.js +0 -16
- package/dist/archives/createArchiveFromLibArchive/index.js.map +0 -1
- package/dist/archives/createArchiveFromLibArchive.d.ts +0 -7
- package/dist/archives/createArchiveFromNodeUnrarJs/index.cjs +0 -2
- package/dist/archives/createArchiveFromNodeUnrarJs/index.cjs.map +0 -1
- package/dist/archives/createArchiveFromNodeUnrarJs/index.js +0 -27
- package/dist/archives/createArchiveFromNodeUnrarJs/index.js.map +0 -1
- package/dist/archives/createArchiveFromNodeUnrarJs.d.ts +0 -7
- package/dist/archives/createArchiveFromText.d.ts +0 -7
- package/dist/archives/createArchiveFromUnzipper/index.cjs +0 -2
- package/dist/archives/createArchiveFromUnzipper/index.cjs.map +0 -1
- package/dist/archives/createArchiveFromUnzipper/index.js +0 -23
- package/dist/archives/createArchiveFromUnzipper/index.js.map +0 -1
- package/dist/archives/createArchiveFromUnzipper.d.ts +0 -7
- package/dist/archives/createArchiveFromUrls.d.ts +0 -9
- package/dist/archives/createArchiveFromZipJs/index.cjs +0 -2
- package/dist/archives/createArchiveFromZipJs/index.cjs.map +0 -1
- package/dist/archives/createArchiveFromZipJs/index.js +0 -20
- package/dist/archives/createArchiveFromZipJs/index.js.map +0 -1
- package/dist/archives/createArchiveFromZipJs.d.ts +0 -7
- package/dist/archives/fileAccessors.d.ts +0 -15
- package/dist/archives/getArchiveHasComicInfo.d.ts +0 -2
- package/dist/archives/printTree.d.ts +0 -1
- package/dist/archives/readRecordAsText.d.ts +0 -7
- package/dist/archives/types.d.ts +0 -42
- package/dist/createArchiveFromEntries-CNz716dm.js +0 -68
- package/dist/createArchiveFromEntries-CNz716dm.js.map +0 -1
- package/dist/createArchiveFromEntries-DL9Q2cPL.cjs +0 -3
- package/dist/createArchiveFromEntries-DL9Q2cPL.cjs.map +0 -1
- package/dist/epubs/getArchiveOpfInfo.d.ts +0 -5
- package/dist/epubs/getSpineItemFilesFromArchive.d.ts +0 -6
- package/dist/epubs/isArchiveEpub.d.ts +0 -2
- package/dist/epubs/readArchiveOpf.d.ts +0 -17
- package/dist/fileAccessors-DWVChFUB.cjs +0 -2
- package/dist/fileAccessors-DWVChFUB.cjs.map +0 -1
- package/dist/fileAccessors-etcCPnpQ.js +0 -12
- package/dist/fileAccessors-etcCPnpQ.js.map +0 -1
- package/dist/parsers/nav.d.ts +0 -5
- package/dist/parsers/nav.test.d.ts +0 -1
- package/dist/parsers/xml.d.ts +0 -2
- package/dist/tests/setupTests.d.ts +0 -0
- package/dist/utils/createXmlSafeId.d.ts +0 -3
- package/dist/utils/createXmlSafeId.test.d.ts +0 -1
- package/dist/utils/sortByTitleComparator.d.ts +0 -1
- package/dist/utils/sortByTitleComparator.test.d.ts +0 -1
- package/dist/utils/uri.d.ts +0 -3
- package/dist/utils/uri.test.d.ts +0 -1
- /package/dist/{archives/archiveLoader.test.d.ts → archiveLoader.test.d.ts} +0 -0
package/dist/index/index.js
CHANGED
|
@@ -1,171 +1,51 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import { XmlDocument as y, XmlElement as ae, XmlTextNode as oe } from "xmldoc";
|
|
6
|
-
import { BehaviorSubject as se, EMPTY as b, NEVER as x, Subject as S, catchError as C, distinctUntilChanged as ce, filter as w, finalize as le, first as T, from as E, ignoreElements as ue, lastValueFrom as de, map as D, merge as O, mergeMap as k, of as fe, pairwise as pe, shareReplay as me, startWith as he, switchMap as A, takeUntil as ge, tap as j, timer as _e } from "rxjs";
|
|
7
|
-
//#region src/archives/createArchiveFromArrayBufferList.ts
|
|
8
|
-
var ve = async (e, t = {}) => o(e, (e) => e.isDir ? {
|
|
9
|
-
dir: !0,
|
|
10
|
-
uri: e.name
|
|
11
|
-
} : {
|
|
12
|
-
dir: !1,
|
|
13
|
-
uri: e.name,
|
|
14
|
-
size: e.size,
|
|
15
|
-
...c(e.data, l(e.name) ?? "")
|
|
16
|
-
}, {
|
|
17
|
-
...t,
|
|
18
|
-
close: () => Promise.resolve()
|
|
19
|
-
}), ye = async (e, { mimeType: t, direction: n } = { mimeType: "text/plain" }) => {
|
|
20
|
-
let a = `
|
|
21
|
-
<?xml version="1.0" encoding="UTF-8"?>
|
|
22
|
-
<package xmlns="http://www.idpf.org/2007/opf" version="3.0" xml:lang="ja" prefix="rendition: http://www.idpf.org/vocab/rendition/#"
|
|
23
|
-
unique-identifier="ootuya-id">
|
|
24
|
-
<metadata xmlns:opf="http://www.idpf.org/2007/opf" xmlns:dc="http://purl.org/dc/elements/1.1/"
|
|
25
|
-
xmlns:dcterms="http://purl.org/dc/terms/">
|
|
26
|
-
<meta property="rendition:layout">reflowable</meta>
|
|
27
|
-
</metadata>
|
|
28
|
-
<manifest>
|
|
29
|
-
<item id="p01" href="p01.txt" media-type="text/plain"/>
|
|
30
|
-
</manifest>
|
|
31
|
-
<spine page-progression-direction="${n ?? "ltr"}">
|
|
32
|
-
<itemref idref="p01" />
|
|
33
|
-
</spine>
|
|
34
|
-
</package>
|
|
35
|
-
`;
|
|
36
|
-
return r({
|
|
37
|
-
filename: "content.txt",
|
|
38
|
-
encodingFormat: t,
|
|
39
|
-
records: [{
|
|
40
|
-
dir: !1,
|
|
41
|
-
basename: i("generated.opf"),
|
|
42
|
-
uri: "generated.opf",
|
|
43
|
-
size: 0,
|
|
44
|
-
...s(async () => new Blob([a]))
|
|
45
|
-
}, {
|
|
46
|
-
dir: !1,
|
|
47
|
-
basename: i("p01.txt"),
|
|
48
|
-
uri: "p01.txt",
|
|
49
|
-
size: typeof e == "string" ? new Blob([e]).size : e.size,
|
|
50
|
-
encodingFormat: t,
|
|
51
|
-
...s(async () => typeof e == "string" ? new Blob([e]) : e)
|
|
52
|
-
}],
|
|
53
|
-
close: () => Promise.resolve()
|
|
54
|
-
});
|
|
55
|
-
}, be = /^[A-Za-z0-9_][A-Za-z0-9_.-]*$/, xe = /^[A-Za-z0-9_]/, M = /^xml/i, Se = /[^A-Za-z0-9_.-]+/g, N = "_", Ce = (e) => e.replace(/^_+|_+$/g, ""), we = (e) => Ce(e.trim().replaceAll("/", "_").replace(Se, "_")), P = (e) => {
|
|
56
|
-
if (be.test(e) && !M.test(e)) return e;
|
|
57
|
-
let t = we(e), n = t && !M.test(t) ? t : `${N}${t}`;
|
|
58
|
-
return xe.test(n) ? n : `${N}${n}`;
|
|
59
|
-
}, F = (e, t) => {
|
|
60
|
-
let n = P(e);
|
|
61
|
-
if (!t.has(n)) return t.add(n), n;
|
|
62
|
-
let r = 2, i = `${n}-${r}`;
|
|
63
|
-
for (; t.has(i);) r += 1, i = `${n}-${r}`;
|
|
64
|
-
return t.add(i), i;
|
|
65
|
-
}, I = () => {
|
|
66
|
-
let e = /* @__PURE__ */ new Set();
|
|
67
|
-
return (t) => F(t, e);
|
|
68
|
-
}, Te = async (e, t) => {
|
|
69
|
-
let n = I(), a = e.map((e) => ({
|
|
70
|
-
id: n(e),
|
|
71
|
-
url: e
|
|
72
|
-
})), o = `
|
|
73
|
-
<?xml version="1.0" encoding="UTF-8"?><package xmlns="http://www.idpf.org/2007/opf" version="2.0" unique-identifier="bookid">
|
|
74
|
-
<metadata>
|
|
75
|
-
<meta property="rendition:layout">${t?.useRenditionFlow ? "reflowable" : "pre-paginated"}</meta>
|
|
76
|
-
${t?.useRenditionFlow ? "<meta property=\"rendition:flow\">scrolled-continuous</meta>" : ""}
|
|
77
|
-
</metadata>
|
|
78
|
-
<manifest>
|
|
79
|
-
${a.map(({ id: e, url: t }) => {
|
|
80
|
-
let n = l(t);
|
|
81
|
-
return `<item id="${e}" href="${u(t)}" media-type="${u(n ?? "")}"/>`;
|
|
82
|
-
}).join("\n")}
|
|
83
|
-
</manifest>
|
|
84
|
-
<spine>
|
|
85
|
-
${a.map(({ id: e }) => `<itemref idref="${e}" />`).join("\n")}
|
|
86
|
-
</spine>
|
|
87
|
-
</package>
|
|
88
|
-
`, c = e.map((e) => ({
|
|
89
|
-
dir: !1,
|
|
90
|
-
basename: i(e),
|
|
91
|
-
encodingFormat: l(e),
|
|
92
|
-
uri: e,
|
|
93
|
-
size: 0,
|
|
94
|
-
...s(async () => (await fetch(e)).blob())
|
|
95
|
-
}));
|
|
96
|
-
return r({
|
|
97
|
-
records: [{
|
|
98
|
-
dir: !1,
|
|
99
|
-
basename: "content.opf",
|
|
100
|
-
uri: "content.opf",
|
|
101
|
-
size: 0,
|
|
102
|
-
...s(async () => new Blob([o]))
|
|
103
|
-
}, ...c],
|
|
104
|
-
close: () => Promise.resolve()
|
|
105
|
-
});
|
|
106
|
-
}, L = (e) => !e.dir, Ee = (e) => e.dir, R = (e, t) => {
|
|
107
|
-
let n = e.recordsByUri.get(t);
|
|
108
|
-
return n && L(n) ? n : void 0;
|
|
109
|
-
}, De = g.toLowerCase(), z = (e) => e.records.find((e) => L(e) && e.basename.toLowerCase() === De), B = async (e) => new TextDecoder().decode(await e.arrayBuffer()), Oe = ({ enableReport: e } = {}) => {
|
|
110
|
-
a.enable(!!e);
|
|
111
|
-
}, V = (e) => {
|
|
112
|
-
let t = e.records.filter((e) => !e.dir).find((e) => e.uri.endsWith(".opf"));
|
|
113
|
-
return {
|
|
114
|
-
data: t,
|
|
115
|
-
basePath: t?.uri.substring(0, t.uri.lastIndexOf("/")) || ""
|
|
116
|
-
};
|
|
117
|
-
};
|
|
118
|
-
//#endregion
|
|
119
|
-
//#region src/epubs/readArchiveOpf.ts
|
|
120
|
-
async function H(e) {
|
|
121
|
-
let { data: t, basePath: n } = V(e) || {};
|
|
122
|
-
if (!(!t || t.dir)) return {
|
|
123
|
-
opf: re(await B(t)),
|
|
124
|
-
basePath: n
|
|
125
|
-
};
|
|
126
|
-
}
|
|
1
|
+
import { Report as e, createXmlSafeIdFactory as t, detectMimeTypeFromName as n, isMediaContentMimeType as r, isXmlBasedMimeType as i, parseContentType as a, removeTrailingSlash as o, urlJoin as s } from "@prose-reader/shared";
|
|
2
|
+
import { APPLE_IBOOKS_DISPLAY_OPTIONS_FILENAME as c, COMIC_INFO_FILENAME as l, KOBO_DISPLAY_OPTIONS_FILENAME as u, getArchiveFileRecordByUri as d, getArchiveHasComicInfo as f, getArchiveOpfInfo as p, getSpineItemFilesFromArchive as m, isArchiveEpub as h, isFileRecord as g, parseAppleDisplayOptionsXml as ee, parseComicInfo as _, parseKoboXml as te, readArchiveOpf as v, readRecordAsText as y, resolveArchiveMetadata as b, resolveArchiveToc as x } from "@prose-reader/archive-reader";
|
|
3
|
+
import { XmlDocument as S } from "xmldoc";
|
|
4
|
+
import { BehaviorSubject as ne, EMPTY as C, NEVER as w, Subject as T, catchError as E, distinctUntilChanged as re, filter as D, finalize as ie, first as O, from as k, ignoreElements as A, lastValueFrom as ae, map as j, merge as M, mergeMap as N, of as oe, pairwise as se, shareReplay as ce, startWith as le, switchMap as P, takeUntil as ue, tap as F, timer as I } from "rxjs";
|
|
127
5
|
//#endregion
|
|
128
|
-
//#region src/
|
|
129
|
-
var
|
|
130
|
-
|
|
6
|
+
//#region src/report.ts
|
|
7
|
+
var L = e.namespace("@prose-reader/streamer", void 0, { color: "#ffae42" }), R = ({ enableReport: e } = {}) => {
|
|
8
|
+
L.enable(!!e);
|
|
9
|
+
}, z = c.toLowerCase(), B = ({ archive: e }) => async (t) => {
|
|
10
|
+
let n = e.records.find((e) => !e.dir && e.basename.toLowerCase() === z);
|
|
131
11
|
if (!n || n.dir) return t;
|
|
132
|
-
let r = await
|
|
12
|
+
let r = await y(n);
|
|
133
13
|
try {
|
|
134
|
-
let { renditionLayout: e } =
|
|
14
|
+
let { renditionLayout: e } = b(ee(r));
|
|
135
15
|
return {
|
|
136
16
|
...t,
|
|
137
17
|
renditionLayout: t.renditionLayout ?? e
|
|
138
18
|
};
|
|
139
19
|
} catch (e) {
|
|
140
|
-
return console.error(`Unable to parse ${
|
|
20
|
+
return console.error(`Unable to parse ${c} for content\n`, r), console.error(e), t;
|
|
141
21
|
}
|
|
142
|
-
},
|
|
143
|
-
let n =
|
|
22
|
+
}, V = l.toLowerCase(), H = ({ archive: e }) => async (t) => {
|
|
23
|
+
let n = f(e);
|
|
144
24
|
if (!n) return t;
|
|
145
25
|
let r = {
|
|
146
26
|
...t,
|
|
147
|
-
spineItems: t.spineItems.filter((e) => !e.id.toLowerCase().endsWith(
|
|
27
|
+
spineItems: t.spineItems.filter((e) => !e.id.toLowerCase().endsWith(V)).map((e, t, n) => ({
|
|
148
28
|
...e,
|
|
149
29
|
progressionWeight: 1 / n.length
|
|
150
30
|
}))
|
|
151
|
-
}, i = await
|
|
31
|
+
}, i = await y(n);
|
|
152
32
|
try {
|
|
153
|
-
let e =
|
|
33
|
+
let e = b(_(i));
|
|
154
34
|
return {
|
|
155
35
|
...r,
|
|
156
36
|
readingDirection: e.readingDirection ?? r.readingDirection
|
|
157
37
|
};
|
|
158
38
|
} catch (e) {
|
|
159
|
-
return console.error(`Unable to parse ${
|
|
39
|
+
return console.error(`Unable to parse ${l} for content\n`, i), console.error(e), r;
|
|
160
40
|
}
|
|
161
41
|
}, U = ({ baseUrl: e = "", resourcePath: t }) => {
|
|
162
42
|
if (!e && /^https?:\/\//.test(t)) return encodeURI(t);
|
|
163
43
|
let n = e ? `${e}${e.endsWith("/") ? "" : "/"}` : "file://";
|
|
164
44
|
return encodeURI(`${n}${t}`);
|
|
165
|
-
},
|
|
166
|
-
let
|
|
45
|
+
}, de = ({ archive: e, baseUrl: n }) => async () => {
|
|
46
|
+
let r = e.records.filter((e) => !e.dir), i = t(), a = r.map((e) => ({
|
|
167
47
|
file: e,
|
|
168
|
-
id:
|
|
48
|
+
id: i(e.uri)
|
|
169
49
|
}));
|
|
170
50
|
return {
|
|
171
51
|
filename: e.filename ?? "",
|
|
@@ -173,30 +53,26 @@ var ke = h.toLowerCase(), Ae = ({ archive: e }) => async (t) => {
|
|
|
173
53
|
renditionLayout: void 0,
|
|
174
54
|
renditionSpread: "auto",
|
|
175
55
|
readingDirection: void 0,
|
|
176
|
-
spineItems:
|
|
177
|
-
id:
|
|
56
|
+
spineItems: a.filter(({ file: e }) => !e.basename.endsWith(".db")).map(({ file: e, id: t }, i) => ({
|
|
57
|
+
id: t,
|
|
178
58
|
index: i,
|
|
179
59
|
href: U({
|
|
180
|
-
baseUrl:
|
|
60
|
+
baseUrl: n,
|
|
181
61
|
resourcePath: e.uri
|
|
182
62
|
}),
|
|
183
63
|
renditionLayout: void 0,
|
|
184
|
-
progressionWeight: 1 /
|
|
64
|
+
progressionWeight: 1 / r.length,
|
|
185
65
|
pageSpreadLeft: void 0,
|
|
186
66
|
pageSpreadRight: void 0,
|
|
187
67
|
mediaType: e.encodingFormat
|
|
188
68
|
})),
|
|
189
|
-
items:
|
|
190
|
-
id:
|
|
191
|
-
href: encodeURI(`${
|
|
69
|
+
items: a.map(({ file: e, id: t }) => ({
|
|
70
|
+
id: t,
|
|
71
|
+
href: encodeURI(`${n}${e.uri}`)
|
|
192
72
|
}))
|
|
193
73
|
};
|
|
194
|
-
}, W =
|
|
195
|
-
|
|
196
|
-
let { opf: n, basePath: r } = t, { spineRows: i } = n;
|
|
197
|
-
return e.records.filter((e) => i.find((t) => r ? `${r}/${t.href}` === e.uri : `${t.href}` === e.uri));
|
|
198
|
-
}, G = (e, t, n) => {
|
|
199
|
-
let { basePath: r } = V(t) || {};
|
|
74
|
+
}, W = (e, t, n) => {
|
|
75
|
+
let { basePath: r } = p(t) || {};
|
|
200
76
|
return e.map((e) => {
|
|
201
77
|
let t = e.href, i = n?.(t) ?? "";
|
|
202
78
|
return {
|
|
@@ -205,26 +81,26 @@ var ke = h.toLowerCase(), Ae = ({ archive: e }) => async (t) => {
|
|
|
205
81
|
mediaType: e.mediaType
|
|
206
82
|
};
|
|
207
83
|
});
|
|
208
|
-
},
|
|
84
|
+
}, fe = (e) => {
|
|
209
85
|
let t = e?.trim();
|
|
210
86
|
return t === "scrolled-continuous" || t === "scrolled-doc" || t === "paginated" || t === "auto" ? t : "auto";
|
|
211
|
-
},
|
|
87
|
+
}, pe = (e) => {
|
|
212
88
|
let t = e?.trim();
|
|
213
89
|
if (t === "none" || t === "landscape" || t === "portrait" || t === "both" || t === "auto") return t;
|
|
214
|
-
},
|
|
90
|
+
}, me = (e) => {
|
|
215
91
|
let t = e?.trim();
|
|
216
92
|
if (t === "cover" || t === "title-page" || t === "copyright-page" || t === "text") return t;
|
|
217
|
-
},
|
|
93
|
+
}, he = ({ archive: e, baseUrl: t, archiveOpf: n }) => async (r) => {
|
|
218
94
|
if (!n) return r;
|
|
219
|
-
let { opf: i, basePath:
|
|
220
|
-
|
|
221
|
-
let
|
|
95
|
+
let { opf: i, basePath: a } = n, o = b(i);
|
|
96
|
+
L.groupCollapsed(...L.getGroupArgs("OPF parsed")), L.log("opf", i), L.groupEnd();
|
|
97
|
+
let s = i.renditionLayoutMeta?.trim(), c = s === "reflowable" || s === "pre-paginated" ? s : o.renditionLayout, l = i.title?.trim() || e.records.find(({ dir: e }) => e)?.basename || "", u = o.readingDirection ?? r.readingDirection, f = (await m({
|
|
222
98
|
archive: e,
|
|
223
99
|
archiveOpf: n
|
|
224
|
-
})).filter(
|
|
100
|
+
})).filter(g).reduce((e, t) => t.size + e, 0), p = i.guide, h = [];
|
|
225
101
|
for (let e of p) {
|
|
226
|
-
let t =
|
|
227
|
-
t !== void 0 &&
|
|
102
|
+
let t = me(e.type);
|
|
103
|
+
t !== void 0 && h.push({
|
|
228
104
|
href: e.href,
|
|
229
105
|
title: e.title,
|
|
230
106
|
type: t
|
|
@@ -232,18 +108,18 @@ var ke = h.toLowerCase(), Ae = ({ archive: e }) => async (t) => {
|
|
|
232
108
|
}
|
|
233
109
|
return {
|
|
234
110
|
filename: e.filename ?? "",
|
|
235
|
-
renditionLayout:
|
|
236
|
-
renditionFlow:
|
|
237
|
-
renditionSpread:
|
|
238
|
-
title:
|
|
239
|
-
readingDirection:
|
|
111
|
+
renditionLayout: c,
|
|
112
|
+
renditionFlow: fe(i.renditionFlowMeta),
|
|
113
|
+
renditionSpread: pe(i.renditionSpreadMeta),
|
|
114
|
+
title: l,
|
|
115
|
+
readingDirection: u,
|
|
240
116
|
spineItems: i.spineRows.map((n, r) => {
|
|
241
|
-
let
|
|
117
|
+
let o = d(e, a ? `${a}/${n.href}` : n.href), s = o ? o.size : 0, l = t || (/^https?:\/\//.test(n.href) ? "" : "file://");
|
|
242
118
|
return {
|
|
243
119
|
id: n.id,
|
|
244
120
|
index: r,
|
|
245
|
-
href: n.href.startsWith("https://") ? n.href :
|
|
246
|
-
renditionLayout: n.renditionLayout ??
|
|
121
|
+
href: n.href.startsWith("https://") ? n.href : a ? `${l}${a}/${n.href}` : `${l}${n.href}`,
|
|
122
|
+
renditionLayout: n.renditionLayout ?? c,
|
|
247
123
|
...n.renditionFlow === void 0 ? {} : { renditionFlow: n.renditionFlow },
|
|
248
124
|
progressionWeight: f > 0 ? s / f : 1 / i.spineRows.length,
|
|
249
125
|
pageSpreadLeft: n.pageSpreadLeft,
|
|
@@ -251,20 +127,20 @@ var ke = h.toLowerCase(), Ae = ({ archive: e }) => async (t) => {
|
|
|
251
127
|
mediaType: n.mediaType
|
|
252
128
|
};
|
|
253
129
|
}),
|
|
254
|
-
items:
|
|
255
|
-
guide:
|
|
130
|
+
items: W(i.manifestItems, e, (e) => /^https?:\/\//.test(e) ? "" : t || "file://"),
|
|
131
|
+
guide: h.length > 0 ? h : void 0
|
|
256
132
|
};
|
|
257
|
-
},
|
|
133
|
+
}, ge = (e) => {
|
|
258
134
|
let t = e.descendantWithPath("head")?.childrenNamed("meta").find((e) => e.attr.name === "viewport");
|
|
259
135
|
return !!(t && t.attr.name === "viewport");
|
|
260
|
-
},
|
|
261
|
-
if (!await e || !
|
|
262
|
-
mimeType:
|
|
136
|
+
}, _e = (e) => e.reduce(async (e, t) => {
|
|
137
|
+
if (!await e || !i({
|
|
138
|
+
mimeType: g(t) ? t.encodingFormat : void 0,
|
|
263
139
|
uri: t.uri
|
|
264
140
|
})) return !1;
|
|
265
|
-
let n = t.dir ? null : await
|
|
266
|
-
return n ?
|
|
267
|
-
}, Promise.resolve(!0)),
|
|
141
|
+
let n = t.dir ? null : await y(t);
|
|
142
|
+
return n ? ge(new S(n)) : !1;
|
|
143
|
+
}, Promise.resolve(!0)), ve = ({ archive: e, archiveOpf: t }) => async (n) => n.renditionLayout === "reflowable" && n.spineItems.every((e) => e.renditionLayout === "reflowable") && await _e(await m({
|
|
268
144
|
archive: e,
|
|
269
145
|
archiveOpf: t
|
|
270
146
|
})) ? {
|
|
@@ -274,166 +150,63 @@ var ke = h.toLowerCase(), Ae = ({ archive: e }) => async (t) => {
|
|
|
274
150
|
renditionLayout: "pre-paginated"
|
|
275
151
|
})),
|
|
276
152
|
renditionLayout: "pre-paginated"
|
|
277
|
-
} : n,
|
|
153
|
+
} : n, ye = () => (e) => ({
|
|
278
154
|
...e,
|
|
279
155
|
readingDirection: e.readingDirection ?? "ltr"
|
|
280
|
-
}),
|
|
156
|
+
}), be = async (e) => {
|
|
281
157
|
let t;
|
|
282
158
|
return await Promise.all(e.records.map(async (e) => {
|
|
283
|
-
if (e.dir || !e.uri.endsWith(
|
|
284
|
-
let n = await
|
|
159
|
+
if (e.dir || !e.uri.endsWith(u)) return;
|
|
160
|
+
let n = await y(e);
|
|
285
161
|
try {
|
|
286
|
-
let { renditionLayout: e } =
|
|
162
|
+
let { renditionLayout: e } = te(n);
|
|
287
163
|
e && (t = e);
|
|
288
164
|
} catch (e) {
|
|
289
|
-
console.error(`Unable to parse ${
|
|
165
|
+
console.error(`Unable to parse ${u} for content\n`, n), console.error(e);
|
|
290
166
|
}
|
|
291
167
|
})), {
|
|
292
168
|
kind: "kobo",
|
|
293
169
|
...t === void 0 ? {} : { renditionLayout: t }
|
|
294
170
|
};
|
|
295
|
-
},
|
|
296
|
-
let { renditionLayout: n } =
|
|
171
|
+
}, xe = ({ archive: e }) => async (t) => {
|
|
172
|
+
let { renditionLayout: n } = b(await be(e));
|
|
297
173
|
return {
|
|
298
174
|
...t,
|
|
299
175
|
renditionLayout: t.renditionLayout ?? n
|
|
300
176
|
};
|
|
301
|
-
},
|
|
177
|
+
}, Se = ({ archive: e }) => async (t) => h(e) ? t : {
|
|
302
178
|
...t,
|
|
303
179
|
spineItems: t.spineItems.map((t) => {
|
|
304
|
-
let
|
|
180
|
+
let i = e.records.find((e) => decodeURI(t.href).endsWith(e.uri)), o = a((i && g(i) ? i.encodingFormat : void 0) ?? "") || n(i?.basename ?? "");
|
|
305
181
|
return {
|
|
306
182
|
...t,
|
|
307
|
-
renditionLayout:
|
|
183
|
+
renditionLayout: o && r(o) ? "pre-paginated" : t.renditionLayout
|
|
308
184
|
};
|
|
309
185
|
})
|
|
310
|
-
},
|
|
311
|
-
|
|
312
|
-
contents: [],
|
|
313
|
-
path: "",
|
|
314
|
-
href: "",
|
|
315
|
-
title: ""
|
|
316
|
-
}, i = e.childNamed("span") || e.childNamed("a");
|
|
317
|
-
r.title = (i?.attr.title || i?.val.trim() || q(i)) ?? "";
|
|
318
|
-
let a = i?.name;
|
|
319
|
-
a !== "a" && (i = e.descendantWithPath(`${a}.a`), i && (a = i.name.toLowerCase())), a === "a" && i?.attr.href && (r.path = m(t, i.attr.href), r.href = m(n, t, i.attr.href));
|
|
320
|
-
let o = e.childNamed("ol");
|
|
321
|
-
if (o) {
|
|
322
|
-
let e = o.childrenNamed("li");
|
|
323
|
-
e && e.length > 0 && (r.contents = e.map((e) => J(e, {
|
|
324
|
-
basePath: t,
|
|
325
|
-
baseUrl: n
|
|
326
|
-
})));
|
|
327
|
-
}
|
|
328
|
-
return r;
|
|
329
|
-
}, qe = (e, { basePath: t, baseUrl: n }) => {
|
|
330
|
-
let r = [], i;
|
|
331
|
-
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) => {
|
|
332
|
-
r.push(J(e, {
|
|
333
|
-
basePath: t,
|
|
334
|
-
baseUrl: n
|
|
335
|
-
}));
|
|
336
|
-
}), r;
|
|
337
|
-
}, Je = async (e, t, { baseUrl: r }) => {
|
|
338
|
-
let i = e.manifestItems.find(Ke);
|
|
339
|
-
if (i?.href) {
|
|
340
|
-
let e = t.records.find((e) => e.uri.endsWith(i.href));
|
|
341
|
-
if (e && !e.dir) return qe(new y(await B(e)), {
|
|
342
|
-
basePath: n(e.uri),
|
|
343
|
-
baseUrl: r
|
|
344
|
-
});
|
|
345
|
-
}
|
|
346
|
-
}, Y = (e, { opfBasePath: t, baseUrl: n, prefix: r }) => {
|
|
347
|
-
let i = e?.childNamed(`${r}content`)?.attr.src || "", a = {
|
|
348
|
-
title: e?.descendantWithPath(`${r}navLabel.${r}text`)?.val || "",
|
|
349
|
-
path: m(t, i),
|
|
350
|
-
href: m(n, t, i),
|
|
351
|
-
contents: []
|
|
352
|
-
}, o = e.childrenNamed(`${r}navPoint`);
|
|
353
|
-
return o && o.length > 0 && (a.contents = o.map((e) => Y(e, {
|
|
354
|
-
opfBasePath: t,
|
|
355
|
-
baseUrl: n,
|
|
356
|
-
prefix: r
|
|
357
|
-
}))), a;
|
|
358
|
-
}, Ye = (e, { opfBasePath: t, baseUrl: n }) => {
|
|
359
|
-
let r = [], i = e.name, a = "";
|
|
360
|
-
return i.indexOf(":") !== -1 && (a = `${i.split(":")[0]}:`), e.childNamed(`${a}navMap`)?.childrenNamed(`${a}navPoint`).forEach((e) => {
|
|
361
|
-
r.push(Y(e, {
|
|
362
|
-
opfBasePath: t,
|
|
363
|
-
baseUrl: n,
|
|
364
|
-
prefix: a
|
|
365
|
-
}));
|
|
366
|
-
}), r;
|
|
367
|
-
}, Xe = async ({ opf: e, opfBasePath: t, baseUrl: n, archive: r }) => {
|
|
368
|
-
let i = e.spineTocIdref;
|
|
369
|
-
if (i) {
|
|
370
|
-
let a = e.manifestItems.find((e) => e.id === i);
|
|
371
|
-
if (a) {
|
|
372
|
-
let e = `${t}${t === "" ? "" : "/"}${a.href}`, i = r.records.find((t) => t.uri.endsWith(e));
|
|
373
|
-
if (i && !i.dir) return Ye(new y(await B(i)), {
|
|
374
|
-
opfBasePath: t,
|
|
375
|
-
baseUrl: n
|
|
376
|
-
});
|
|
377
|
-
}
|
|
378
|
-
}
|
|
379
|
-
}, Ze = async (e, t, { baseUrl: n }) => {
|
|
380
|
-
let { basePath: r } = V(t) || {}, i = await Je(e, t, { baseUrl: n });
|
|
381
|
-
if (i) return i;
|
|
382
|
-
let a = await Xe({
|
|
383
|
-
opf: e,
|
|
384
|
-
opfBasePath: r ?? "",
|
|
385
|
-
archive: t,
|
|
386
|
-
baseUrl: n
|
|
387
|
-
});
|
|
388
|
-
if (a) return a;
|
|
389
|
-
}, Qe = (e) => e.replace(/\.[^.]+$/, "").replace(/[_-]/g, " ").replace(/\s+/g, " ").trim(), $e = (e, t) => {
|
|
390
|
-
if (e.spineItems.length !== 0 && e.spineItems.every((e) => (p(e.mediaType ?? "") || l(e.href))?.startsWith("audio/"))) return e.spineItems.map((e) => {
|
|
186
|
+
}, Ce = (e) => e.replace(/\.[^.]+$/, "").replace(/[_-]/g, " ").replace(/\s+/g, " ").trim(), we = (e, t) => {
|
|
187
|
+
if (e.spineItems.length !== 0 && e.spineItems.every((e) => (a(e.mediaType ?? "") || n(e.href))?.startsWith("audio/"))) return e.spineItems.map((e) => {
|
|
391
188
|
let n = t.records.find((t) => !t.dir && decodeURI(e.href).endsWith(t.uri));
|
|
392
189
|
return {
|
|
393
|
-
title:
|
|
190
|
+
title: Ce(n?.basename ?? e.href),
|
|
394
191
|
href: e.href,
|
|
395
192
|
path: n?.uri ?? e.href,
|
|
396
193
|
contents: []
|
|
397
194
|
};
|
|
398
195
|
});
|
|
399
|
-
},
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
path: a,
|
|
408
|
-
href: r
|
|
409
|
-
}] : e : s ? [...e, {
|
|
410
|
-
contents: i([], s, c, r, a),
|
|
411
|
-
href: r,
|
|
412
|
-
path: a,
|
|
413
|
-
title: t
|
|
414
|
-
}] : [...e, {
|
|
415
|
-
contents: [],
|
|
416
|
-
href: r,
|
|
417
|
-
path: a,
|
|
418
|
-
title: t
|
|
419
|
-
}];
|
|
420
|
-
};
|
|
421
|
-
return r.reduce((e, t) => {
|
|
422
|
-
if (t.dir) return e;
|
|
423
|
-
let [r, ...a] = t.uri.split("/").slice(0, -1);
|
|
424
|
-
if (!r) return e;
|
|
425
|
-
let o = m(n, encodeURI(t.uri)).replace(/\/$/, ""), s = t.uri.replace(/\/$/, "");
|
|
426
|
-
return i(e, r, a, o, s);
|
|
427
|
-
}, []);
|
|
428
|
-
}, tt = async (e, t, { baseUrl: n, archiveOpf: r }) => {
|
|
429
|
-
if (r) return await Ze(r.opf, e, { baseUrl: n }) || [];
|
|
430
|
-
let i = $e(t, e);
|
|
196
|
+
}, G = (e) => (t) => ({
|
|
197
|
+
title: t.title,
|
|
198
|
+
path: t.path,
|
|
199
|
+
href: t.containerHref ? s(e, t.containerHref) : "",
|
|
200
|
+
contents: t.contents.map(G(e))
|
|
201
|
+
}), Te = async (e, t, { baseUrl: n, archiveOpf: r }) => {
|
|
202
|
+
if (r) return (await x(e, { opf: r }) ?? []).map(G(n));
|
|
203
|
+
let i = we(t, e);
|
|
431
204
|
if (i) return i;
|
|
432
|
-
let a =
|
|
433
|
-
if (a
|
|
434
|
-
},
|
|
205
|
+
let a = await x(e);
|
|
206
|
+
if (a) return a.map(G(n));
|
|
207
|
+
}, Ee = ({ archive: e, baseUrl: t, archiveOpf: n }) => async (r) => {
|
|
435
208
|
if (r.nav) return r;
|
|
436
|
-
let i = await
|
|
209
|
+
let i = await Te(e, r, {
|
|
437
210
|
baseUrl: t,
|
|
438
211
|
archiveOpf: n
|
|
439
212
|
});
|
|
@@ -441,74 +214,74 @@ var ke = h.toLowerCase(), Ae = ({ archive: e }) => async (t) => {
|
|
|
441
214
|
...r,
|
|
442
215
|
nav: { toc: i }
|
|
443
216
|
} : r;
|
|
444
|
-
},
|
|
445
|
-
|
|
446
|
-
let r = await
|
|
217
|
+
}, De = (e) => e ? e.endsWith("/") ? e : `${e}/` : "", K = async (e, { baseUrl: t = "", hooks: n = {} } = {}) => {
|
|
218
|
+
L.log("Generating manifest from archive", e);
|
|
219
|
+
let r = await v(e), i = De(t), a = (t) => (t ?? []).map((t) => t({
|
|
447
220
|
archive: e,
|
|
448
221
|
baseUrl: i
|
|
449
|
-
})),
|
|
450
|
-
|
|
222
|
+
})), o = [
|
|
223
|
+
he({
|
|
451
224
|
archive: e,
|
|
452
225
|
baseUrl: i,
|
|
453
226
|
archiveOpf: r
|
|
454
227
|
}),
|
|
455
|
-
|
|
228
|
+
H({
|
|
456
229
|
archive: e,
|
|
457
230
|
baseUrl: i
|
|
458
231
|
}),
|
|
459
|
-
|
|
232
|
+
B({
|
|
460
233
|
archive: e,
|
|
461
234
|
baseUrl: i
|
|
462
235
|
}),
|
|
463
|
-
|
|
236
|
+
Se({
|
|
464
237
|
archive: e,
|
|
465
238
|
baseUrl: i
|
|
466
239
|
}),
|
|
467
|
-
...
|
|
468
|
-
],
|
|
469
|
-
|
|
240
|
+
...a(n.content)
|
|
241
|
+
], s = a(n.spine), c = [
|
|
242
|
+
ve({
|
|
470
243
|
archive: e,
|
|
471
244
|
baseUrl: i,
|
|
472
245
|
archiveOpf: r
|
|
473
246
|
}),
|
|
474
|
-
|
|
247
|
+
xe({
|
|
475
248
|
archive: e,
|
|
476
249
|
baseUrl: i
|
|
477
250
|
}),
|
|
478
|
-
...
|
|
479
|
-
],
|
|
251
|
+
...a(n.presentation)
|
|
252
|
+
], l = [Ee({
|
|
480
253
|
archive: e,
|
|
481
254
|
baseUrl: i,
|
|
482
255
|
archiveOpf: r
|
|
483
|
-
}), ...
|
|
256
|
+
}), ...a(n.navigation)], u = [
|
|
257
|
+
...o,
|
|
484
258
|
...s,
|
|
485
259
|
...c,
|
|
486
260
|
...l,
|
|
487
|
-
|
|
488
|
-
Ve()
|
|
261
|
+
ye()
|
|
489
262
|
];
|
|
490
263
|
try {
|
|
491
|
-
let t =
|
|
264
|
+
let t = de({
|
|
492
265
|
archive: e,
|
|
493
266
|
baseUrl: i
|
|
494
|
-
})(), n = await
|
|
495
|
-
if (
|
|
267
|
+
})(), n = await u.reduce(async (e, t) => await t(await e), t);
|
|
268
|
+
if (L.log("Generated manifest", n), process.env.NODE_ENV === "development" && L.isEnabled()) {
|
|
496
269
|
let e = JSON.stringify(n, null, 2);
|
|
497
|
-
|
|
270
|
+
L.groupCollapsed(...L.getGroupArgs("Generated manifest")), L.log(`\n${e}`), L.groupEnd();
|
|
498
271
|
}
|
|
499
272
|
return n;
|
|
500
273
|
} catch (e) {
|
|
501
|
-
throw
|
|
274
|
+
throw L.error(e), e;
|
|
502
275
|
}
|
|
503
|
-
},
|
|
276
|
+
}, Oe = (e) => {
|
|
504
277
|
let t = e.descendantWithPath("head")?.childrenNamed("meta").find((e) => e.attr.name === "calibre:cover");
|
|
505
278
|
return !!(t && t.attr.name === "calibre:cover");
|
|
506
|
-
},
|
|
507
|
-
let r =
|
|
279
|
+
}, ke = (e) => e.descendantWithPath("body")?.descendantWithPath("div")?.childrenNamed("svg")?.find((e) => e.attr.width === "100%" && e.attr.preserveAspectRatio === "none"), Ae = ({ archive: e, resourcePath: t }) => async (n) => {
|
|
280
|
+
let r = d(e, t);
|
|
508
281
|
if (r?.basename.endsWith(".xhtml")) {
|
|
509
|
-
let e = new
|
|
510
|
-
if (
|
|
511
|
-
let t =
|
|
282
|
+
let e = new S(typeof n.body == "string" ? n.body : await y(r));
|
|
283
|
+
if (Oe(e)) {
|
|
284
|
+
let t = ke(e);
|
|
512
285
|
return t && delete t.attr.preserveAspectRatio, {
|
|
513
286
|
...n,
|
|
514
287
|
body: e?.toString()
|
|
@@ -516,36 +289,36 @@ var ke = h.toLowerCase(), Ae = ({ archive: e }) => async (t) => {
|
|
|
516
289
|
}
|
|
517
290
|
}
|
|
518
291
|
return n;
|
|
519
|
-
},
|
|
292
|
+
}, je = ({ archive: e, resourcePath: t }) => async (n) => Ae({
|
|
520
293
|
archive: e,
|
|
521
294
|
resourcePath: t
|
|
522
|
-
})(n),
|
|
523
|
-
let r =
|
|
295
|
+
})(n), Me = ({ archive: e, resourcePath: t }) => async (n) => {
|
|
296
|
+
let r = d(e, t);
|
|
524
297
|
if (r?.basename.endsWith(".css")) {
|
|
525
|
-
let e = (typeof n.body == "string" ? n.body : await
|
|
298
|
+
let e = (typeof n.body == "string" ? n.body : await y(r)).replaceAll("-webkit-writing-mode", "writing-mode");
|
|
526
299
|
return {
|
|
527
300
|
...n,
|
|
528
301
|
body: e
|
|
529
302
|
};
|
|
530
303
|
}
|
|
531
304
|
return n;
|
|
532
|
-
},
|
|
533
|
-
let n = await
|
|
305
|
+
}, Ne = async (e, t) => {
|
|
306
|
+
let n = await v(e);
|
|
534
307
|
if (n) {
|
|
535
|
-
let { opf: r } = n, i =
|
|
308
|
+
let { opf: r } = n, i = W(r.manifestItems, e, () => "").find((e) => t.endsWith(e.href))?.mediaType;
|
|
536
309
|
if (i) return { mediaType: i };
|
|
537
310
|
}
|
|
538
|
-
return { mediaType:
|
|
539
|
-
},
|
|
311
|
+
return { mediaType: Pe(t) };
|
|
312
|
+
}, Pe = (e) => {
|
|
540
313
|
if (e.endsWith(".css")) return "text/css; charset=UTF-8";
|
|
541
314
|
if (e.endsWith(".jpg")) return "image/jpg";
|
|
542
315
|
if (e.endsWith(".xhtml")) return "application/xhtml+xml";
|
|
543
316
|
if (e.endsWith(".mp4")) return "video/mp4";
|
|
544
317
|
if (e.endsWith(".svg")) return "image/svg+xml";
|
|
545
|
-
},
|
|
546
|
-
let r =
|
|
318
|
+
}, Fe = ({ archive: e, resourcePath: t }) => async (n) => {
|
|
319
|
+
let r = d(e, t);
|
|
547
320
|
if (!r) return n;
|
|
548
|
-
let i = await
|
|
321
|
+
let i = await Ne(e, t);
|
|
549
322
|
return {
|
|
550
323
|
...n,
|
|
551
324
|
params: {
|
|
@@ -554,56 +327,56 @@ var ke = h.toLowerCase(), Ae = ({ archive: e }) => async (t) => {
|
|
|
554
327
|
...i.mediaType && { contentType: i.mediaType }
|
|
555
328
|
}
|
|
556
329
|
};
|
|
557
|
-
},
|
|
558
|
-
let r =
|
|
330
|
+
}, q = /* @__PURE__ */ "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("."), Ie = ({ archive: e, resourcePath: t }) => async (n) => {
|
|
331
|
+
let r = d(e, t);
|
|
559
332
|
if (r?.basename.endsWith(".xhtml")) {
|
|
560
|
-
let e = typeof n.body == "string" ? n.body : await
|
|
561
|
-
if (!RegExp(`<(${
|
|
562
|
-
let t = RegExp(`<(${
|
|
333
|
+
let e = typeof n.body == "string" ? n.body : await y(r);
|
|
334
|
+
if (!RegExp(`<(${q.join("|")})[\\s/>]`, "i").test(e)) return n;
|
|
335
|
+
let t = RegExp(`<(${q.join("|")})(\\s[^>]*)?\\s*/>`, "gi"), i = e.replace(t, (e, t, n = "") => `<${t} ${n.trim()}></${t}>`);
|
|
563
336
|
return {
|
|
564
337
|
...n,
|
|
565
338
|
body: i
|
|
566
339
|
};
|
|
567
340
|
}
|
|
568
341
|
return n;
|
|
569
|
-
},
|
|
342
|
+
}, J = async (e, t, { hooks: n = [] } = {}) => {
|
|
570
343
|
let r = { params: {} }, i = [
|
|
571
344
|
...n.map((n) => n({
|
|
572
345
|
archive: e,
|
|
573
346
|
resourcePath: t
|
|
574
347
|
})),
|
|
575
|
-
|
|
348
|
+
Fe({
|
|
576
349
|
archive: e,
|
|
577
350
|
resourcePath: t
|
|
578
351
|
}),
|
|
579
|
-
|
|
352
|
+
Ie({
|
|
580
353
|
archive: e,
|
|
581
354
|
resourcePath: t
|
|
582
355
|
}),
|
|
583
|
-
|
|
356
|
+
Me({
|
|
584
357
|
archive: e,
|
|
585
358
|
resourcePath: t
|
|
586
359
|
}),
|
|
587
|
-
|
|
360
|
+
je({
|
|
588
361
|
archive: e,
|
|
589
362
|
resourcePath: t
|
|
590
363
|
})
|
|
591
364
|
];
|
|
592
365
|
try {
|
|
593
366
|
let n = await i.reduce(async (e, t) => await t(await e), Promise.resolve(r));
|
|
594
|
-
if (
|
|
595
|
-
let
|
|
596
|
-
if (!
|
|
367
|
+
if (L.log("Generated resource", t, n), n.body !== void 0) return n;
|
|
368
|
+
let a = d(e, t);
|
|
369
|
+
if (!a) throw Error(`no file found for resourcePath:${t}`);
|
|
597
370
|
return {
|
|
598
371
|
...n,
|
|
599
|
-
body: await
|
|
372
|
+
body: await a.blob()
|
|
600
373
|
};
|
|
601
374
|
} catch (e) {
|
|
602
|
-
throw
|
|
375
|
+
throw L.error(e), e;
|
|
603
376
|
}
|
|
604
|
-
},
|
|
377
|
+
}, Le = class {
|
|
605
378
|
constructor(e) {
|
|
606
|
-
this.cleanArchiveAfter = e, this.state$ = new
|
|
379
|
+
this.cleanArchiveAfter = e, this.state$ = new ne({
|
|
607
380
|
status: "idle",
|
|
608
381
|
locks: 0
|
|
609
382
|
});
|
|
@@ -615,62 +388,62 @@ var ke = h.toLowerCase(), Ae = ({ archive: e }) => async (t) => {
|
|
|
615
388
|
});
|
|
616
389
|
}
|
|
617
390
|
get locks$() {
|
|
618
|
-
return this.state$.pipe(
|
|
391
|
+
return this.state$.pipe(j(({ locks: e }) => e));
|
|
619
392
|
}
|
|
620
393
|
get state() {
|
|
621
394
|
return this.state$.getValue();
|
|
622
395
|
}
|
|
623
396
|
get isUnlocked$() {
|
|
624
|
-
return this.locks$.pipe(
|
|
397
|
+
return this.locks$.pipe(j((e) => e <= 0), re(), ce());
|
|
625
398
|
}
|
|
626
399
|
get overTTL$() {
|
|
627
|
-
return this.isUnlocked$.pipe(
|
|
400
|
+
return this.isUnlocked$.pipe(P((e) => e ? this.cleanArchiveAfter === Infinity ? w : I(this.cleanArchiveAfter) : w));
|
|
628
401
|
}
|
|
629
|
-
},
|
|
630
|
-
let n = new
|
|
631
|
-
return n.pipe(
|
|
632
|
-
let n =
|
|
633
|
-
if (n?.state.status !== "idle") return
|
|
634
|
-
let r = !1,
|
|
635
|
-
|
|
636
|
-
let t =
|
|
637
|
-
delete
|
|
402
|
+
}, Re = ({ getArchive: e, cleanArchiveAfter: t = 300 * 1e3 }) => {
|
|
403
|
+
let n = new T(), r = new T(), i = new T(), a = {};
|
|
404
|
+
return n.pipe(N((t) => {
|
|
405
|
+
let n = a[t];
|
|
406
|
+
if (n?.state.status !== "idle") return C;
|
|
407
|
+
let r = !1, o = (e) => {
|
|
408
|
+
L.debug(`Cleaning up archive with key: ${e}`);
|
|
409
|
+
let t = a[e];
|
|
410
|
+
delete a[e], r ||= (t?.state.archive?.close(), !0);
|
|
638
411
|
};
|
|
639
412
|
n.update({ status: "loading" });
|
|
640
|
-
let
|
|
641
|
-
return
|
|
413
|
+
let s = n.locks$, c = n.isUnlocked$, l = s.pipe(se(), D(([e, t]) => t > e), le(!0));
|
|
414
|
+
return k(e(t)).pipe(F((e) => {
|
|
642
415
|
n.update({
|
|
643
416
|
archive: e,
|
|
644
417
|
status: "success"
|
|
645
418
|
});
|
|
646
|
-
}),
|
|
419
|
+
}), E((e) => (o(t), n.update({
|
|
647
420
|
status: "error",
|
|
648
421
|
error: e
|
|
649
|
-
}),
|
|
650
|
-
|
|
422
|
+
}), C)), P(() => M(l.pipe(P(() => i), P(() => c), D((e) => e)), n.overTTL$).pipe(O(), F(() => {
|
|
423
|
+
o(t);
|
|
651
424
|
}))));
|
|
652
|
-
}),
|
|
425
|
+
}), ue(r)).subscribe(), {
|
|
653
426
|
access: (e) => {
|
|
654
|
-
let r = !1, i =
|
|
655
|
-
|
|
656
|
-
let
|
|
427
|
+
let r = !1, i = a[e] ?? new Le(t);
|
|
428
|
+
a[e] = i, i.update({ locks: i.state.locks + 1 });
|
|
429
|
+
let o = () => {
|
|
657
430
|
r || (r = !0, i.update({ locks: i.state.locks - 1 }));
|
|
658
431
|
};
|
|
659
|
-
return n.next(e),
|
|
432
|
+
return n.next(e), M(i.state$.pipe(j(({ archive: e }) => e), D((e) => !!e)), i.state$.pipe(F(({ error: e }) => {
|
|
660
433
|
if (e) throw e;
|
|
661
|
-
}),
|
|
434
|
+
}), A())).pipe(O(), j((e) => ({
|
|
662
435
|
archive: e,
|
|
663
|
-
release:
|
|
664
|
-
})),
|
|
665
|
-
throw
|
|
436
|
+
release: o
|
|
437
|
+
})), E((e) => {
|
|
438
|
+
throw o(), e;
|
|
666
439
|
}));
|
|
667
440
|
},
|
|
668
441
|
purge: () => {
|
|
669
442
|
i.next();
|
|
670
443
|
},
|
|
671
|
-
_archives:
|
|
444
|
+
_archives: a
|
|
672
445
|
};
|
|
673
|
-
},
|
|
446
|
+
}, Y = (e) => e ? /^\d+$/.test(e) ? {
|
|
674
447
|
valid: !0,
|
|
675
448
|
value: Number.parseInt(e, 10)
|
|
676
449
|
} : {
|
|
@@ -679,20 +452,20 @@ var ke = h.toLowerCase(), Ae = ({ archive: e }) => async (t) => {
|
|
|
679
452
|
} : {
|
|
680
453
|
valid: !0,
|
|
681
454
|
value: void 0
|
|
682
|
-
},
|
|
455
|
+
}, ze = (e) => {
|
|
683
456
|
if (!e.toLowerCase().startsWith("bytes=")) return { kind: "missing" };
|
|
684
457
|
let t = e.slice(6).trim();
|
|
685
458
|
if (!t) return { kind: "invalid" };
|
|
686
459
|
if (t.includes(",")) return { kind: "multi" };
|
|
687
460
|
let n = /^(\d*)-(\d*)$/.exec(t);
|
|
688
461
|
if (!n) return { kind: "invalid" };
|
|
689
|
-
let [, r = "", i = ""] = n, a =
|
|
462
|
+
let [, r = "", i = ""] = n, a = Y(r.trim()), o = Y(i.trim());
|
|
690
463
|
return !a.valid || !o.valid ? { kind: "invalid" } : {
|
|
691
464
|
kind: "single",
|
|
692
465
|
start: a.value,
|
|
693
466
|
end: o.value
|
|
694
467
|
};
|
|
695
|
-
},
|
|
468
|
+
}, Be = (e) => {
|
|
696
469
|
if (e instanceof Blob) return {
|
|
697
470
|
size: e.size,
|
|
698
471
|
slice: (t, n) => {
|
|
@@ -714,18 +487,18 @@ var ke = h.toLowerCase(), Ae = ({ archive: e }) => async (t) => {
|
|
|
714
487
|
};
|
|
715
488
|
}
|
|
716
489
|
};
|
|
717
|
-
},
|
|
490
|
+
}, X = ({ body: e, contentType: t, rangeHeader: n }) => {
|
|
718
491
|
let r = new Headers();
|
|
719
492
|
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, {
|
|
720
493
|
status: 200,
|
|
721
494
|
headers: r
|
|
722
495
|
});
|
|
723
|
-
let i =
|
|
496
|
+
let i = ze(n);
|
|
724
497
|
if (i.kind === "missing" || i.kind === "multi") return e instanceof Blob && r.set("Content-Length", String(e.size)), new Response(e, {
|
|
725
498
|
status: 200,
|
|
726
499
|
headers: r
|
|
727
500
|
});
|
|
728
|
-
let a =
|
|
501
|
+
let a = Be(e), o = a.size;
|
|
729
502
|
if (i.kind === "invalid") return new Response(null, {
|
|
730
503
|
status: 416,
|
|
731
504
|
headers: { "Content-Range": `bytes */${o}` }
|
|
@@ -740,18 +513,18 @@ var ke = h.toLowerCase(), Ae = ({ archive: e }) => async (t) => {
|
|
|
740
513
|
status: 206,
|
|
741
514
|
headers: r
|
|
742
515
|
});
|
|
743
|
-
},
|
|
516
|
+
}, Z = "file://", Ve = /^https?:\/\//, He = (e) => {
|
|
744
517
|
try {
|
|
745
518
|
return decodeURIComponent(e);
|
|
746
519
|
} catch {
|
|
747
520
|
return e;
|
|
748
521
|
}
|
|
749
|
-
},
|
|
750
|
-
let t =
|
|
751
|
-
return
|
|
752
|
-
},
|
|
522
|
+
}, Q = (e) => e.startsWith(Z) ? e.slice(Z.length) : e, Ue = (e) => {
|
|
523
|
+
let t = Q(e);
|
|
524
|
+
return Ve.test(t) ? t : Q(He(t));
|
|
525
|
+
}, $ = class {
|
|
753
526
|
constructor({ hooks: e, onError: t, onManifestSuccess: n, ...r }) {
|
|
754
|
-
this.onError = (e) => (console.error(e), new Response(String(e), { status: 500 })), this.archiveLoader =
|
|
527
|
+
this.onError = (e) => (console.error(e), new Response(String(e), { status: 500 })), this.archiveLoader = Re(r), this.hooks = e ?? {}, this.onManifestSuccess = n ?? (({ manifest: e }) => Promise.resolve(e)), this.onError = t ?? this.onError;
|
|
755
528
|
}
|
|
756
529
|
prune() {
|
|
757
530
|
this.archiveLoader.purge();
|
|
@@ -760,50 +533,50 @@ var ke = h.toLowerCase(), Ae = ({ archive: e }) => async (t) => {
|
|
|
760
533
|
return this.lastAccessedKey !== void 0 && this.lastAccessedKey !== e && this.archiveLoader.purge(), this.lastAccessedKey = e, this.archiveLoader.access(e);
|
|
761
534
|
}
|
|
762
535
|
accessArchiveWithoutLock(e) {
|
|
763
|
-
return this.accessArchive(e).pipe(
|
|
536
|
+
return this.accessArchive(e).pipe(j(({ archive: e, release: t }) => (t(), e)));
|
|
764
537
|
}
|
|
765
538
|
withArchiveResponse({ key: e, getResponse: t }) {
|
|
766
|
-
return
|
|
539
|
+
return ae(this.accessArchive(e).pipe(N(({ archive: e, release: n }) => k(t(e)).pipe(ie(() => {
|
|
767
540
|
n();
|
|
768
|
-
}))),
|
|
541
|
+
}))), E((e) => oe(this.onError(e)))));
|
|
769
542
|
}
|
|
770
543
|
fetchManifest({ key: e, baseUrl: t }) {
|
|
771
544
|
return this.withArchiveResponse({
|
|
772
545
|
key: e,
|
|
773
|
-
getResponse: (e) =>
|
|
546
|
+
getResponse: (e) => k(K(e, {
|
|
774
547
|
baseUrl: t,
|
|
775
548
|
hooks: this.hooks.manifest
|
|
776
|
-
})).pipe(
|
|
549
|
+
})).pipe(P((t) => k(this.onManifestSuccess({
|
|
777
550
|
manifest: t,
|
|
778
551
|
archive: e
|
|
779
|
-
}))),
|
|
552
|
+
}))), j((e) => new Response(JSON.stringify(e), { status: 200 })))
|
|
780
553
|
});
|
|
781
554
|
}
|
|
782
555
|
fetchResource({ key: e, resourcePath: t, request: n }) {
|
|
783
556
|
return this.withArchiveResponse({
|
|
784
557
|
key: e,
|
|
785
|
-
getResponse: (e) =>
|
|
558
|
+
getResponse: (e) => k(J(e, Ue(t), { hooks: this.hooks.resource })).pipe(j((e) => X({
|
|
786
559
|
body: e.body ?? "",
|
|
787
560
|
contentType: e.params.contentType,
|
|
788
561
|
rangeHeader: n?.headers.get("range")
|
|
789
562
|
})))
|
|
790
563
|
});
|
|
791
564
|
}
|
|
792
|
-
},
|
|
565
|
+
}, We = class extends $ {
|
|
793
566
|
constructor({ getUriInfo: e, ...t }) {
|
|
794
567
|
super(t), this.getUriInfo = e, this.fetchEventListener = this.fetchEventListener.bind(this);
|
|
795
568
|
}
|
|
796
569
|
fetchEventListener(e) {
|
|
797
570
|
try {
|
|
798
|
-
let
|
|
799
|
-
if (!
|
|
800
|
-
let
|
|
801
|
-
|
|
802
|
-
key:
|
|
803
|
-
baseUrl: `${
|
|
571
|
+
let t = this.getUriInfo(e);
|
|
572
|
+
if (!t) return;
|
|
573
|
+
let n = o(t.baseUrl), r = e.request.url.substring(n.length + 1), [i = ""] = r.split("/"), a = o(r.substring(i.length + 1));
|
|
574
|
+
r.endsWith("/manifest") ? e.respondWith(this.fetchManifest({
|
|
575
|
+
key: i,
|
|
576
|
+
baseUrl: `${n}/${i}/`
|
|
804
577
|
})) : e.respondWith(this.fetchResource({
|
|
805
|
-
key:
|
|
806
|
-
resourcePath:
|
|
578
|
+
key: i,
|
|
579
|
+
resourcePath: a,
|
|
807
580
|
request: e.request
|
|
808
581
|
}));
|
|
809
582
|
} catch (t) {
|
|
@@ -812,6 +585,6 @@ var ke = h.toLowerCase(), Ae = ({ archive: e }) => async (t) => {
|
|
|
812
585
|
}
|
|
813
586
|
};
|
|
814
587
|
//#endregion
|
|
815
|
-
export {
|
|
588
|
+
export { We as ServiceWorkerStreamer, $ as Streamer, R as configure, U as createManifestResourceHref, K as generateManifestFromArchive, J as generateResourceFromArchive };
|
|
816
589
|
|
|
817
590
|
//# sourceMappingURL=index.js.map
|