@prose-reader/streamer 1.322.0 → 1.324.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/generators/manifest/index.d.ts +10 -2
- package/dist/generators/manifest/manifestFromResolvedArchive.d.ts +21 -0
- package/dist/hooks.d.ts +12 -11
- package/dist/index/index.cjs +1 -1
- package/dist/index/index.cjs.map +1 -1
- package/dist/index/index.js +180 -321
- package/dist/index/index.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/package.json +4 -4
- package/dist/generators/manifest/hooks/apple.d.ts +0 -6
- package/dist/generators/manifest/hooks/comicInfo.d.ts +0 -6
- package/dist/generators/manifest/hooks/default.d.ts +0 -6
- package/dist/generators/manifest/hooks/epub/epub.d.ts +0 -16
- package/dist/generators/manifest/hooks/epubOptimizer.d.ts +0 -7
- package/dist/generators/manifest/hooks/finalDefaults.d.ts +0 -2
- package/dist/generators/manifest/hooks/kobo.d.ts +0 -6
- package/dist/generators/manifest/hooks/nonEpub.d.ts +0 -10
- package/dist/generators/manifest/hooks/toc.d.ts +0 -11
- package/dist/generators/manifest/hooks/toc.test.d.ts +0 -1
- /package/dist/generators/manifest/{hooks/audiobookToc.d.ts → audiobookToc.d.ts} +0 -0
- /package/dist/generators/manifest/{hooks/audiobookToc.test.d.ts → audiobookToc.test.d.ts} +0 -0
- /package/dist/generators/manifest/{hooks/epubOptimizer.test.d.ts → characterization.test.d.ts} +0 -0
package/dist/index/index.js
CHANGED
|
@@ -1,287 +1,143 @@
|
|
|
1
|
-
import { Report as e, createXmlSafeIdFactory as t, detectMimeTypeFromName as n,
|
|
2
|
-
import {
|
|
3
|
-
import { XmlDocument as
|
|
4
|
-
import { BehaviorSubject as
|
|
1
|
+
import { Report as e, createXmlSafeIdFactory as t, detectMimeTypeFromName as n, parseContentType as r, removeTrailingSlash as i, urlJoin as a } from "@prose-reader/shared";
|
|
2
|
+
import { getArchiveFileRecordByUri as o, readArchiveOpf as s, readRecordAsText as c, resolveArchive as l } from "@prose-reader/archive-reader";
|
|
3
|
+
import { XmlDocument as u } from "xmldoc";
|
|
4
|
+
import { BehaviorSubject as d, EMPTY as f, NEVER as p, Subject as m, catchError as h, distinctUntilChanged as g, filter as _, finalize as ee, first as v, from as y, ignoreElements as te, lastValueFrom as ne, map as b, merge as x, mergeMap as S, of as C, pairwise as w, shareReplay as T, startWith as re, switchMap as E, takeUntil as ie, tap as D, timer as ae } from "rxjs";
|
|
5
5
|
//#endregion
|
|
6
6
|
//#region src/report.ts
|
|
7
|
-
var
|
|
8
|
-
|
|
9
|
-
},
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
let r = await y(n);
|
|
13
|
-
try {
|
|
14
|
-
let { renditionLayout: e } = b(ee(r));
|
|
15
|
-
return {
|
|
16
|
-
...t,
|
|
17
|
-
renditionLayout: t.renditionLayout ?? e
|
|
18
|
-
};
|
|
19
|
-
} catch (e) {
|
|
20
|
-
return console.error(`Unable to parse ${c} for content\n`, r), console.error(e), t;
|
|
21
|
-
}
|
|
22
|
-
}, V = l.toLowerCase(), H = ({ archive: e }) => async (t) => {
|
|
23
|
-
let n = f(e);
|
|
24
|
-
if (!n) return t;
|
|
25
|
-
let r = {
|
|
26
|
-
...t,
|
|
27
|
-
spineItems: t.spineItems.filter((e) => !e.id.toLowerCase().endsWith(V)).map((e, t, n) => ({
|
|
28
|
-
...e,
|
|
29
|
-
progressionWeight: 1 / n.length
|
|
30
|
-
}))
|
|
31
|
-
}, i = await y(n);
|
|
32
|
-
try {
|
|
33
|
-
let e = b(_(i));
|
|
7
|
+
var O = e.namespace("@prose-reader/streamer", void 0, { color: "#ffae42" }), oe = ({ enableReport: e } = {}) => {
|
|
8
|
+
O.enable(!!e);
|
|
9
|
+
}, k = (e) => e.replace(/\.[^.]+$/, "").replace(/[_-]/g, " ").replace(/\s+/g, " ").trim(), A = (e, t) => {
|
|
10
|
+
if (e.spineItems.length !== 0 && e.spineItems.every((e) => (r(e.mediaType ?? "") || n(e.href))?.startsWith("audio/"))) return e.spineItems.map((e) => {
|
|
11
|
+
let n = t.records.find((t) => !t.dir && decodeURI(e.href).endsWith(t.uri));
|
|
34
12
|
return {
|
|
35
|
-
|
|
36
|
-
|
|
13
|
+
title: k(n?.basename ?? e.href),
|
|
14
|
+
href: e.href,
|
|
15
|
+
path: n?.uri ?? e.href,
|
|
16
|
+
contents: []
|
|
37
17
|
};
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
}
|
|
41
|
-
}, U = ({ baseUrl: e = "", resourcePath: t }) => {
|
|
18
|
+
});
|
|
19
|
+
}, j = ({ baseUrl: e = "", resourcePath: t }) => {
|
|
42
20
|
if (!e && /^https?:\/\//.test(t)) return encodeURI(t);
|
|
43
21
|
let n = e ? `${e}${e.endsWith("/") ? "" : "/"}` : "file://";
|
|
44
22
|
return encodeURI(`${n}${t}`);
|
|
45
|
-
},
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
23
|
+
}, M = (e) => (t) => ({
|
|
24
|
+
title: t.title,
|
|
25
|
+
path: t.path,
|
|
26
|
+
href: t.containerHref ? a(e, t.containerHref) : "",
|
|
27
|
+
contents: t.contents.map(M(e))
|
|
28
|
+
}), N = (e) => {
|
|
29
|
+
let t = e?.trim();
|
|
30
|
+
if (t === "cover" || t === "title-page" || t === "copyright-page" || t === "text") return t;
|
|
31
|
+
}, P = (e) => /^https?:\/\//.test(e), F = (e) => e.records.find(({ dir: e }) => e)?.basename.replace(/\/$/, ""), I = (e, n, r, i) => {
|
|
32
|
+
let { metadata: a, readingOrder: o } = r, s = i.basePath, c = [];
|
|
33
|
+
for (let e of i.opf.guide) {
|
|
34
|
+
let t = N(e.type);
|
|
35
|
+
t !== void 0 && c.push({
|
|
36
|
+
href: e.href,
|
|
37
|
+
title: e.title,
|
|
38
|
+
type: t
|
|
39
|
+
});
|
|
40
|
+
}
|
|
41
|
+
let l = t();
|
|
50
42
|
return {
|
|
51
43
|
filename: e.filename ?? "",
|
|
52
|
-
title:
|
|
53
|
-
renditionLayout:
|
|
44
|
+
title: a.title || F(e) || "",
|
|
45
|
+
renditionLayout: a.renditionLayout,
|
|
46
|
+
renditionFlow: a.renditionFlow ?? "auto",
|
|
47
|
+
renditionSpread: a.renditionSpread,
|
|
48
|
+
readingDirection: a.readingDirection,
|
|
49
|
+
spineItems: o.map((e, t) => ({
|
|
50
|
+
id: e.id ?? l(e.uri),
|
|
51
|
+
index: t,
|
|
52
|
+
href: P(e.uri) ? e.uri : `${n || "file://"}${e.uri}`,
|
|
53
|
+
renditionLayout: e.renditionLayout,
|
|
54
|
+
...e.renditionFlow === void 0 ? {} : { renditionFlow: e.renditionFlow },
|
|
55
|
+
progressionWeight: e.progressionWeight,
|
|
56
|
+
pageSpreadLeft: e.pageSpreadLeft,
|
|
57
|
+
pageSpreadRight: e.pageSpreadRight,
|
|
58
|
+
mediaType: e.mediaType
|
|
59
|
+
})),
|
|
60
|
+
items: i.opf.manifestItems.map((e) => ({
|
|
61
|
+
id: e.id,
|
|
62
|
+
href: P(e.href) ? e.href : `${n || "file://"}${s ? `${s}/` : ""}${e.href}`,
|
|
63
|
+
mediaType: e.mediaType
|
|
64
|
+
})),
|
|
65
|
+
guide: c.length > 0 ? c : void 0,
|
|
66
|
+
nav: { toc: (r.toc ?? []).map(M(n)) }
|
|
67
|
+
};
|
|
68
|
+
}, L = (e, n, r) => {
|
|
69
|
+
let { metadata: i, readingOrder: a } = r, o = e.records.filter((e) => !e.dir), s = t(), c = new Map(o.map((e) => [e.uri, s(e.uri)])), l = {
|
|
70
|
+
filename: e.filename ?? "",
|
|
71
|
+
title: i.title || F(e) || e.filename || "",
|
|
72
|
+
renditionLayout: i.renditionLayout,
|
|
54
73
|
renditionSpread: "auto",
|
|
55
|
-
readingDirection:
|
|
56
|
-
spineItems: a.
|
|
57
|
-
id:
|
|
58
|
-
index:
|
|
59
|
-
href:
|
|
74
|
+
readingDirection: i.readingDirection,
|
|
75
|
+
spineItems: a.map((e, t) => ({
|
|
76
|
+
id: c.get(e.uri) ?? s(e.uri),
|
|
77
|
+
index: t,
|
|
78
|
+
href: j({
|
|
60
79
|
baseUrl: n,
|
|
61
80
|
resourcePath: e.uri
|
|
62
81
|
}),
|
|
63
|
-
renditionLayout:
|
|
64
|
-
progressionWeight:
|
|
82
|
+
renditionLayout: e.renditionLayout,
|
|
83
|
+
progressionWeight: e.progressionWeight,
|
|
65
84
|
pageSpreadLeft: void 0,
|
|
66
85
|
pageSpreadRight: void 0,
|
|
67
|
-
mediaType: e.
|
|
86
|
+
mediaType: e.mediaType
|
|
68
87
|
})),
|
|
69
|
-
items:
|
|
70
|
-
id:
|
|
88
|
+
items: o.map((e) => ({
|
|
89
|
+
id: c.get(e.uri) ?? s(e.uri),
|
|
71
90
|
href: encodeURI(`${n}${e.uri}`)
|
|
72
91
|
}))
|
|
73
|
-
};
|
|
74
|
-
|
|
75
|
-
let { basePath: r } = p(t) || {};
|
|
76
|
-
return e.map((e) => {
|
|
77
|
-
let t = e.href, i = n?.(t) ?? "";
|
|
78
|
-
return {
|
|
79
|
-
href: r ? `${i}${r}/${t}` : `${i}${t}`,
|
|
80
|
-
id: e.id,
|
|
81
|
-
mediaType: e.mediaType
|
|
82
|
-
};
|
|
83
|
-
});
|
|
84
|
-
}, fe = (e) => {
|
|
85
|
-
let t = e?.trim();
|
|
86
|
-
return t === "scrolled-continuous" || t === "scrolled-doc" || t === "paginated" || t === "auto" ? t : "auto";
|
|
87
|
-
}, pe = (e) => {
|
|
88
|
-
let t = e?.trim();
|
|
89
|
-
if (t === "none" || t === "landscape" || t === "portrait" || t === "both" || t === "auto") return t;
|
|
90
|
-
}, me = (e) => {
|
|
91
|
-
let t = e?.trim();
|
|
92
|
-
if (t === "cover" || t === "title-page" || t === "copyright-page" || t === "text") return t;
|
|
93
|
-
}, he = ({ archive: e, baseUrl: t, archiveOpf: n }) => async (r) => {
|
|
94
|
-
if (!n) return r;
|
|
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({
|
|
98
|
-
archive: e,
|
|
99
|
-
archiveOpf: n
|
|
100
|
-
})).filter(g).reduce((e, t) => t.size + e, 0), p = i.guide, h = [];
|
|
101
|
-
for (let e of p) {
|
|
102
|
-
let t = me(e.type);
|
|
103
|
-
t !== void 0 && h.push({
|
|
104
|
-
href: e.href,
|
|
105
|
-
title: e.title,
|
|
106
|
-
type: t
|
|
107
|
-
});
|
|
108
|
-
}
|
|
109
|
-
return {
|
|
110
|
-
filename: e.filename ?? "",
|
|
111
|
-
renditionLayout: c,
|
|
112
|
-
renditionFlow: fe(i.renditionFlowMeta),
|
|
113
|
-
renditionSpread: pe(i.renditionSpreadMeta),
|
|
114
|
-
title: l,
|
|
115
|
-
readingDirection: u,
|
|
116
|
-
spineItems: i.spineRows.map((n, r) => {
|
|
117
|
-
let o = d(e, a ? `${a}/${n.href}` : n.href), s = o ? o.size : 0, l = t || (/^https?:\/\//.test(n.href) ? "" : "file://");
|
|
118
|
-
return {
|
|
119
|
-
id: n.id,
|
|
120
|
-
index: r,
|
|
121
|
-
href: n.href.startsWith("https://") ? n.href : a ? `${l}${a}/${n.href}` : `${l}${n.href}`,
|
|
122
|
-
renditionLayout: n.renditionLayout ?? c,
|
|
123
|
-
...n.renditionFlow === void 0 ? {} : { renditionFlow: n.renditionFlow },
|
|
124
|
-
progressionWeight: f > 0 ? s / f : 1 / i.spineRows.length,
|
|
125
|
-
pageSpreadLeft: n.pageSpreadLeft,
|
|
126
|
-
pageSpreadRight: n.pageSpreadRight,
|
|
127
|
-
mediaType: n.mediaType
|
|
128
|
-
};
|
|
129
|
-
}),
|
|
130
|
-
items: W(i.manifestItems, e, (e) => /^https?:\/\//.test(e) ? "" : t || "file://"),
|
|
131
|
-
guide: h.length > 0 ? h : void 0
|
|
132
|
-
};
|
|
133
|
-
}, ge = (e) => {
|
|
134
|
-
let t = e.descendantWithPath("head")?.childrenNamed("meta").find((e) => e.attr.name === "viewport");
|
|
135
|
-
return !!(t && t.attr.name === "viewport");
|
|
136
|
-
}, _e = (e) => e.reduce(async (e, t) => {
|
|
137
|
-
if (!await e || !i({
|
|
138
|
-
mimeType: g(t) ? t.encodingFormat : void 0,
|
|
139
|
-
uri: t.uri
|
|
140
|
-
})) return !1;
|
|
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({
|
|
144
|
-
archive: e,
|
|
145
|
-
archiveOpf: t
|
|
146
|
-
})) ? {
|
|
147
|
-
...n,
|
|
148
|
-
spineItems: n.spineItems.map((e) => ({
|
|
149
|
-
...e,
|
|
150
|
-
renditionLayout: "pre-paginated"
|
|
151
|
-
})),
|
|
152
|
-
renditionLayout: "pre-paginated"
|
|
153
|
-
} : n, ye = () => (e) => ({
|
|
154
|
-
...e,
|
|
155
|
-
readingDirection: e.readingDirection ?? "ltr"
|
|
156
|
-
}), be = async (e) => {
|
|
157
|
-
let t;
|
|
158
|
-
return await Promise.all(e.records.map(async (e) => {
|
|
159
|
-
if (e.dir || !e.uri.endsWith(u)) return;
|
|
160
|
-
let n = await y(e);
|
|
161
|
-
try {
|
|
162
|
-
let { renditionLayout: e } = te(n);
|
|
163
|
-
e && (t = e);
|
|
164
|
-
} catch (e) {
|
|
165
|
-
console.error(`Unable to parse ${u} for content\n`, n), console.error(e);
|
|
166
|
-
}
|
|
167
|
-
})), {
|
|
168
|
-
kind: "kobo",
|
|
169
|
-
...t === void 0 ? {} : { renditionLayout: t }
|
|
170
|
-
};
|
|
171
|
-
}, xe = ({ archive: e }) => async (t) => {
|
|
172
|
-
let { renditionLayout: n } = b(await be(e));
|
|
173
|
-
return {
|
|
174
|
-
...t,
|
|
175
|
-
renditionLayout: t.renditionLayout ?? n
|
|
176
|
-
};
|
|
177
|
-
}, Se = ({ archive: e }) => async (t) => h(e) ? t : {
|
|
178
|
-
...t,
|
|
179
|
-
spineItems: t.spineItems.map((t) => {
|
|
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 ?? "");
|
|
181
|
-
return {
|
|
182
|
-
...t,
|
|
183
|
-
renditionLayout: o && r(o) ? "pre-paginated" : t.renditionLayout
|
|
184
|
-
};
|
|
185
|
-
})
|
|
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) => {
|
|
188
|
-
let n = t.records.find((t) => !t.dir && decodeURI(e.href).endsWith(t.uri));
|
|
189
|
-
return {
|
|
190
|
-
title: Ce(n?.basename ?? e.href),
|
|
191
|
-
href: e.href,
|
|
192
|
-
path: n?.uri ?? e.href,
|
|
193
|
-
contents: []
|
|
194
|
-
};
|
|
195
|
-
});
|
|
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);
|
|
204
|
-
if (i) return i;
|
|
205
|
-
let a = await x(e);
|
|
206
|
-
if (a) return a.map(G(n));
|
|
207
|
-
}, Ee = ({ archive: e, baseUrl: t, archiveOpf: n }) => async (r) => {
|
|
208
|
-
if (r.nav) return r;
|
|
209
|
-
let i = await Te(e, r, {
|
|
210
|
-
baseUrl: t,
|
|
211
|
-
archiveOpf: n
|
|
212
|
-
});
|
|
213
|
-
return i ? {
|
|
214
|
-
...r,
|
|
215
|
-
nav: { toc: i }
|
|
216
|
-
} : r;
|
|
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({
|
|
220
|
-
archive: e,
|
|
221
|
-
baseUrl: i
|
|
222
|
-
})), o = [
|
|
223
|
-
he({
|
|
224
|
-
archive: e,
|
|
225
|
-
baseUrl: i,
|
|
226
|
-
archiveOpf: r
|
|
227
|
-
}),
|
|
228
|
-
H({
|
|
229
|
-
archive: e,
|
|
230
|
-
baseUrl: i
|
|
231
|
-
}),
|
|
232
|
-
B({
|
|
233
|
-
archive: e,
|
|
234
|
-
baseUrl: i
|
|
235
|
-
}),
|
|
236
|
-
Se({
|
|
237
|
-
archive: e,
|
|
238
|
-
baseUrl: i
|
|
239
|
-
}),
|
|
240
|
-
...a(n.content)
|
|
241
|
-
], s = a(n.spine), c = [
|
|
242
|
-
ve({
|
|
243
|
-
archive: e,
|
|
244
|
-
baseUrl: i,
|
|
245
|
-
archiveOpf: r
|
|
246
|
-
}),
|
|
247
|
-
xe({
|
|
248
|
-
archive: e,
|
|
249
|
-
baseUrl: i
|
|
250
|
-
}),
|
|
251
|
-
...a(n.presentation)
|
|
252
|
-
], l = [Ee({
|
|
253
|
-
archive: e,
|
|
254
|
-
baseUrl: i,
|
|
255
|
-
archiveOpf: r
|
|
256
|
-
}), ...a(n.navigation)], u = [
|
|
257
|
-
...o,
|
|
258
|
-
...s,
|
|
259
|
-
...c,
|
|
92
|
+
}, u = A(l, e) ?? r.toc?.map(M(n));
|
|
93
|
+
return u === void 0 ? l : {
|
|
260
94
|
...l,
|
|
261
|
-
|
|
262
|
-
|
|
95
|
+
nav: { toc: u }
|
|
96
|
+
};
|
|
97
|
+
}, R = ({ archive: e, baseUrl: t, resolved: n }) => {
|
|
98
|
+
let r = n.sources.opf;
|
|
99
|
+
return r ? I(e, t, n, r) : L(e, t, n);
|
|
100
|
+
}, z = (e) => e ? e.endsWith("/") ? e : `${e}/` : "", B = async (e, { baseUrl: t = "", hooks: n = [] } = {}) => {
|
|
101
|
+
O.log("Generating manifest from archive", e);
|
|
102
|
+
let r = z(t);
|
|
263
103
|
try {
|
|
264
|
-
let t =
|
|
104
|
+
let t = R({
|
|
265
105
|
archive: e,
|
|
266
|
-
baseUrl:
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
106
|
+
baseUrl: r,
|
|
107
|
+
resolved: await l(e, {
|
|
108
|
+
include: [
|
|
109
|
+
"metadata",
|
|
110
|
+
"readingOrder",
|
|
111
|
+
"toc",
|
|
112
|
+
"sources"
|
|
113
|
+
],
|
|
114
|
+
layoutScan: !0
|
|
115
|
+
})
|
|
116
|
+
});
|
|
117
|
+
for (let i of n) t = await i({
|
|
118
|
+
archive: e,
|
|
119
|
+
baseUrl: r
|
|
120
|
+
})(t);
|
|
121
|
+
if (t = {
|
|
122
|
+
...t,
|
|
123
|
+
readingDirection: t.readingDirection ?? "ltr"
|
|
124
|
+
}, O.log("Generated manifest", t), process.env.NODE_ENV === "development" && O.isEnabled()) {
|
|
125
|
+
let e = JSON.stringify(t, null, 2);
|
|
126
|
+
O.groupCollapsed(...O.getGroupArgs("Generated manifest")), O.log(`\n${e}`), O.groupEnd();
|
|
271
127
|
}
|
|
272
|
-
return
|
|
128
|
+
return t;
|
|
273
129
|
} catch (e) {
|
|
274
|
-
throw
|
|
130
|
+
throw O.error(e), e;
|
|
275
131
|
}
|
|
276
|
-
},
|
|
132
|
+
}, V = (e) => {
|
|
277
133
|
let t = e.descendantWithPath("head")?.childrenNamed("meta").find((e) => e.attr.name === "calibre:cover");
|
|
278
134
|
return !!(t && t.attr.name === "calibre:cover");
|
|
279
|
-
},
|
|
280
|
-
let r =
|
|
135
|
+
}, H = (e) => e.descendantWithPath("body")?.descendantWithPath("div")?.childrenNamed("svg")?.find((e) => e.attr.width === "100%" && e.attr.preserveAspectRatio === "none"), U = ({ archive: e, resourcePath: t }) => async (n) => {
|
|
136
|
+
let r = o(e, t);
|
|
281
137
|
if (r?.basename.endsWith(".xhtml")) {
|
|
282
|
-
let e = new
|
|
283
|
-
if (
|
|
284
|
-
let t =
|
|
138
|
+
let e = new u(typeof n.body == "string" ? n.body : await c(r));
|
|
139
|
+
if (V(e)) {
|
|
140
|
+
let t = H(e);
|
|
285
141
|
return t && delete t.attr.preserveAspectRatio, {
|
|
286
142
|
...n,
|
|
287
143
|
body: e?.toString()
|
|
@@ -289,36 +145,39 @@ var L = e.namespace("@prose-reader/streamer", void 0, { color: "#ffae42" }), R =
|
|
|
289
145
|
}
|
|
290
146
|
}
|
|
291
147
|
return n;
|
|
292
|
-
},
|
|
148
|
+
}, W = ({ archive: e, resourcePath: t }) => async (n) => U({
|
|
293
149
|
archive: e,
|
|
294
150
|
resourcePath: t
|
|
295
|
-
})(n),
|
|
296
|
-
let r =
|
|
151
|
+
})(n), se = ({ archive: e, resourcePath: t }) => async (n) => {
|
|
152
|
+
let r = o(e, t);
|
|
297
153
|
if (r?.basename.endsWith(".css")) {
|
|
298
|
-
let e = (typeof n.body == "string" ? n.body : await
|
|
154
|
+
let e = (typeof n.body == "string" ? n.body : await c(r)).replaceAll("-webkit-writing-mode", "writing-mode");
|
|
299
155
|
return {
|
|
300
156
|
...n,
|
|
301
157
|
body: e
|
|
302
158
|
};
|
|
303
159
|
}
|
|
304
160
|
return n;
|
|
305
|
-
},
|
|
306
|
-
let n = await
|
|
161
|
+
}, G = async (e, t) => {
|
|
162
|
+
let n = await s(e);
|
|
307
163
|
if (n) {
|
|
308
|
-
let { opf: r } = n, i =
|
|
164
|
+
let { opf: e, basePath: r } = n, i = e.manifestItems.find((e) => {
|
|
165
|
+
let n = r ? `${r}/${e.href}` : e.href;
|
|
166
|
+
return t.endsWith(n);
|
|
167
|
+
})?.mediaType;
|
|
309
168
|
if (i) return { mediaType: i };
|
|
310
169
|
}
|
|
311
|
-
return { mediaType:
|
|
312
|
-
},
|
|
170
|
+
return { mediaType: K(t) };
|
|
171
|
+
}, K = (e) => {
|
|
313
172
|
if (e.endsWith(".css")) return "text/css; charset=UTF-8";
|
|
314
173
|
if (e.endsWith(".jpg")) return "image/jpg";
|
|
315
174
|
if (e.endsWith(".xhtml")) return "application/xhtml+xml";
|
|
316
175
|
if (e.endsWith(".mp4")) return "video/mp4";
|
|
317
176
|
if (e.endsWith(".svg")) return "image/svg+xml";
|
|
318
|
-
},
|
|
319
|
-
let r =
|
|
177
|
+
}, ce = ({ archive: e, resourcePath: t }) => async (n) => {
|
|
178
|
+
let r = o(e, t);
|
|
320
179
|
if (!r) return n;
|
|
321
|
-
let i = await
|
|
180
|
+
let i = await G(e, t);
|
|
322
181
|
return {
|
|
323
182
|
...n,
|
|
324
183
|
params: {
|
|
@@ -327,10 +186,10 @@ var L = e.namespace("@prose-reader/streamer", void 0, { color: "#ffae42" }), R =
|
|
|
327
186
|
...i.mediaType && { contentType: i.mediaType }
|
|
328
187
|
}
|
|
329
188
|
};
|
|
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("."),
|
|
331
|
-
let r =
|
|
189
|
+
}, 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("."), le = ({ archive: e, resourcePath: t }) => async (n) => {
|
|
190
|
+
let r = o(e, t);
|
|
332
191
|
if (r?.basename.endsWith(".xhtml")) {
|
|
333
|
-
let e = typeof n.body == "string" ? n.body : await
|
|
192
|
+
let e = typeof n.body == "string" ? n.body : await c(r);
|
|
334
193
|
if (!RegExp(`<(${q.join("|")})[\\s/>]`, "i").test(e)) return n;
|
|
335
194
|
let t = RegExp(`<(${q.join("|")})(\\s[^>]*)?\\s*/>`, "gi"), i = e.replace(t, (e, t, n = "") => `<${t} ${n.trim()}></${t}>`);
|
|
336
195
|
return {
|
|
@@ -345,38 +204,38 @@ var L = e.namespace("@prose-reader/streamer", void 0, { color: "#ffae42" }), R =
|
|
|
345
204
|
archive: e,
|
|
346
205
|
resourcePath: t
|
|
347
206
|
})),
|
|
348
|
-
|
|
207
|
+
ce({
|
|
349
208
|
archive: e,
|
|
350
209
|
resourcePath: t
|
|
351
210
|
}),
|
|
352
|
-
|
|
211
|
+
le({
|
|
353
212
|
archive: e,
|
|
354
213
|
resourcePath: t
|
|
355
214
|
}),
|
|
356
|
-
|
|
215
|
+
se({
|
|
357
216
|
archive: e,
|
|
358
217
|
resourcePath: t
|
|
359
218
|
}),
|
|
360
|
-
|
|
219
|
+
W({
|
|
361
220
|
archive: e,
|
|
362
221
|
resourcePath: t
|
|
363
222
|
})
|
|
364
223
|
];
|
|
365
224
|
try {
|
|
366
225
|
let n = await i.reduce(async (e, t) => await t(await e), Promise.resolve(r));
|
|
367
|
-
if (
|
|
368
|
-
let a =
|
|
226
|
+
if (O.log("Generated resource", t, n), n.body !== void 0) return n;
|
|
227
|
+
let a = o(e, t);
|
|
369
228
|
if (!a) throw Error(`no file found for resourcePath:${t}`);
|
|
370
229
|
return {
|
|
371
230
|
...n,
|
|
372
231
|
body: await a.blob()
|
|
373
232
|
};
|
|
374
233
|
} catch (e) {
|
|
375
|
-
throw
|
|
234
|
+
throw O.error(e), e;
|
|
376
235
|
}
|
|
377
|
-
},
|
|
236
|
+
}, ue = class {
|
|
378
237
|
constructor(e) {
|
|
379
|
-
this.cleanArchiveAfter = e, this.state$ = new
|
|
238
|
+
this.cleanArchiveAfter = e, this.state$ = new d({
|
|
380
239
|
status: "idle",
|
|
381
240
|
locks: 0
|
|
382
241
|
});
|
|
@@ -388,53 +247,53 @@ var L = e.namespace("@prose-reader/streamer", void 0, { color: "#ffae42" }), R =
|
|
|
388
247
|
});
|
|
389
248
|
}
|
|
390
249
|
get locks$() {
|
|
391
|
-
return this.state$.pipe(
|
|
250
|
+
return this.state$.pipe(b(({ locks: e }) => e));
|
|
392
251
|
}
|
|
393
252
|
get state() {
|
|
394
253
|
return this.state$.getValue();
|
|
395
254
|
}
|
|
396
255
|
get isUnlocked$() {
|
|
397
|
-
return this.locks$.pipe(
|
|
256
|
+
return this.locks$.pipe(b((e) => e <= 0), g(), T());
|
|
398
257
|
}
|
|
399
258
|
get overTTL$() {
|
|
400
|
-
return this.isUnlocked$.pipe(
|
|
259
|
+
return this.isUnlocked$.pipe(E((e) => e ? this.cleanArchiveAfter === Infinity ? p : ae(this.cleanArchiveAfter) : p));
|
|
401
260
|
}
|
|
402
|
-
},
|
|
403
|
-
let n = new
|
|
404
|
-
return n.pipe(
|
|
261
|
+
}, de = ({ getArchive: e, cleanArchiveAfter: t = 300 * 1e3 }) => {
|
|
262
|
+
let n = new m(), r = new m(), i = new m(), a = {};
|
|
263
|
+
return n.pipe(S((t) => {
|
|
405
264
|
let n = a[t];
|
|
406
|
-
if (n?.state.status !== "idle") return
|
|
265
|
+
if (n?.state.status !== "idle") return f;
|
|
407
266
|
let r = !1, o = (e) => {
|
|
408
|
-
|
|
267
|
+
O.debug(`Cleaning up archive with key: ${e}`);
|
|
409
268
|
let t = a[e];
|
|
410
269
|
delete a[e], r ||= (t?.state.archive?.close(), !0);
|
|
411
270
|
};
|
|
412
271
|
n.update({ status: "loading" });
|
|
413
|
-
let s = n.locks$, c = n.isUnlocked$, l = s.pipe(
|
|
414
|
-
return
|
|
272
|
+
let s = n.locks$, c = n.isUnlocked$, l = s.pipe(w(), _(([e, t]) => t > e), re(!0));
|
|
273
|
+
return y(e(t)).pipe(D((e) => {
|
|
415
274
|
n.update({
|
|
416
275
|
archive: e,
|
|
417
276
|
status: "success"
|
|
418
277
|
});
|
|
419
|
-
}),
|
|
278
|
+
}), h((e) => (o(t), n.update({
|
|
420
279
|
status: "error",
|
|
421
280
|
error: e
|
|
422
|
-
}),
|
|
281
|
+
}), f)), E(() => x(l.pipe(E(() => i), E(() => c), _((e) => e)), n.overTTL$).pipe(v(), D(() => {
|
|
423
282
|
o(t);
|
|
424
283
|
}))));
|
|
425
|
-
}),
|
|
284
|
+
}), ie(r)).subscribe(), {
|
|
426
285
|
access: (e) => {
|
|
427
|
-
let r = !1, i = a[e] ?? new
|
|
286
|
+
let r = !1, i = a[e] ?? new ue(t);
|
|
428
287
|
a[e] = i, i.update({ locks: i.state.locks + 1 });
|
|
429
288
|
let o = () => {
|
|
430
289
|
r || (r = !0, i.update({ locks: i.state.locks - 1 }));
|
|
431
290
|
};
|
|
432
|
-
return n.next(e),
|
|
291
|
+
return n.next(e), x(i.state$.pipe(b(({ archive: e }) => e), _((e) => !!e)), i.state$.pipe(D(({ error: e }) => {
|
|
433
292
|
if (e) throw e;
|
|
434
|
-
}),
|
|
293
|
+
}), te())).pipe(v(), b((e) => ({
|
|
435
294
|
archive: e,
|
|
436
295
|
release: o
|
|
437
|
-
})),
|
|
296
|
+
})), h((e) => {
|
|
438
297
|
throw o(), e;
|
|
439
298
|
}));
|
|
440
299
|
},
|
|
@@ -452,7 +311,7 @@ var L = e.namespace("@prose-reader/streamer", void 0, { color: "#ffae42" }), R =
|
|
|
452
311
|
} : {
|
|
453
312
|
valid: !0,
|
|
454
313
|
value: void 0
|
|
455
|
-
},
|
|
314
|
+
}, fe = (e) => {
|
|
456
315
|
if (!e.toLowerCase().startsWith("bytes=")) return { kind: "missing" };
|
|
457
316
|
let t = e.slice(6).trim();
|
|
458
317
|
if (!t) return { kind: "invalid" };
|
|
@@ -465,7 +324,7 @@ var L = e.namespace("@prose-reader/streamer", void 0, { color: "#ffae42" }), R =
|
|
|
465
324
|
start: a.value,
|
|
466
325
|
end: o.value
|
|
467
326
|
};
|
|
468
|
-
},
|
|
327
|
+
}, pe = (e) => {
|
|
469
328
|
if (e instanceof Blob) return {
|
|
470
329
|
size: e.size,
|
|
471
330
|
slice: (t, n) => {
|
|
@@ -487,18 +346,18 @@ var L = e.namespace("@prose-reader/streamer", void 0, { color: "#ffae42" }), R =
|
|
|
487
346
|
};
|
|
488
347
|
}
|
|
489
348
|
};
|
|
490
|
-
},
|
|
349
|
+
}, me = ({ body: e, contentType: t, rangeHeader: n }) => {
|
|
491
350
|
let r = new Headers();
|
|
492
351
|
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, {
|
|
493
352
|
status: 200,
|
|
494
353
|
headers: r
|
|
495
354
|
});
|
|
496
|
-
let i =
|
|
355
|
+
let i = fe(n);
|
|
497
356
|
if (i.kind === "missing" || i.kind === "multi") return e instanceof Blob && r.set("Content-Length", String(e.size)), new Response(e, {
|
|
498
357
|
status: 200,
|
|
499
358
|
headers: r
|
|
500
359
|
});
|
|
501
|
-
let a =
|
|
360
|
+
let a = pe(e), o = a.size;
|
|
502
361
|
if (i.kind === "invalid") return new Response(null, {
|
|
503
362
|
status: 416,
|
|
504
363
|
headers: { "Content-Range": `bytes */${o}` }
|
|
@@ -513,18 +372,18 @@ var L = e.namespace("@prose-reader/streamer", void 0, { color: "#ffae42" }), R =
|
|
|
513
372
|
status: 206,
|
|
514
373
|
headers: r
|
|
515
374
|
});
|
|
516
|
-
},
|
|
375
|
+
}, X = "file://", he = /^https?:\/\//, Z = (e) => {
|
|
517
376
|
try {
|
|
518
377
|
return decodeURIComponent(e);
|
|
519
378
|
} catch {
|
|
520
379
|
return e;
|
|
521
380
|
}
|
|
522
|
-
}, Q = (e) => e.startsWith(
|
|
381
|
+
}, Q = (e) => e.startsWith(X) ? e.slice(X.length) : e, ge = (e) => {
|
|
523
382
|
let t = Q(e);
|
|
524
|
-
return
|
|
383
|
+
return he.test(t) ? t : Q(Z(t));
|
|
525
384
|
}, $ = class {
|
|
526
385
|
constructor({ hooks: e, onError: t, onManifestSuccess: n, ...r }) {
|
|
527
|
-
this.onError = (e) => (console.error(e), new Response(String(e), { status: 500 })), this.archiveLoader =
|
|
386
|
+
this.onError = (e) => (console.error(e), new Response(String(e), { status: 500 })), this.archiveLoader = de(r), this.hooks = e ?? {}, this.onManifestSuccess = n ?? (({ manifest: e }) => Promise.resolve(e)), this.onError = t ?? this.onError;
|
|
528
387
|
}
|
|
529
388
|
prune() {
|
|
530
389
|
this.archiveLoader.purge();
|
|
@@ -533,36 +392,36 @@ var L = e.namespace("@prose-reader/streamer", void 0, { color: "#ffae42" }), R =
|
|
|
533
392
|
return this.lastAccessedKey !== void 0 && this.lastAccessedKey !== e && this.archiveLoader.purge(), this.lastAccessedKey = e, this.archiveLoader.access(e);
|
|
534
393
|
}
|
|
535
394
|
accessArchiveWithoutLock(e) {
|
|
536
|
-
return this.accessArchive(e).pipe(
|
|
395
|
+
return this.accessArchive(e).pipe(b(({ archive: e, release: t }) => (t(), e)));
|
|
537
396
|
}
|
|
538
397
|
withArchiveResponse({ key: e, getResponse: t }) {
|
|
539
|
-
return
|
|
398
|
+
return ne(this.accessArchive(e).pipe(S(({ archive: e, release: n }) => y(t(e)).pipe(ee(() => {
|
|
540
399
|
n();
|
|
541
|
-
}))),
|
|
400
|
+
}))), h((e) => C(this.onError(e)))));
|
|
542
401
|
}
|
|
543
402
|
fetchManifest({ key: e, baseUrl: t }) {
|
|
544
403
|
return this.withArchiveResponse({
|
|
545
404
|
key: e,
|
|
546
|
-
getResponse: (e) =>
|
|
405
|
+
getResponse: (e) => y(B(e, {
|
|
547
406
|
baseUrl: t,
|
|
548
407
|
hooks: this.hooks.manifest
|
|
549
|
-
})).pipe(
|
|
408
|
+
})).pipe(E((t) => y(this.onManifestSuccess({
|
|
550
409
|
manifest: t,
|
|
551
410
|
archive: e
|
|
552
|
-
}))),
|
|
411
|
+
}))), b((e) => new Response(JSON.stringify(e), { status: 200 })))
|
|
553
412
|
});
|
|
554
413
|
}
|
|
555
414
|
fetchResource({ key: e, resourcePath: t, request: n }) {
|
|
556
415
|
return this.withArchiveResponse({
|
|
557
416
|
key: e,
|
|
558
|
-
getResponse: (e) =>
|
|
417
|
+
getResponse: (e) => y(J(e, ge(t), { hooks: this.hooks.resource })).pipe(b((e) => me({
|
|
559
418
|
body: e.body ?? "",
|
|
560
419
|
contentType: e.params.contentType,
|
|
561
420
|
rangeHeader: n?.headers.get("range")
|
|
562
421
|
})))
|
|
563
422
|
});
|
|
564
423
|
}
|
|
565
|
-
},
|
|
424
|
+
}, _e = class extends $ {
|
|
566
425
|
constructor({ getUriInfo: e, ...t }) {
|
|
567
426
|
super(t), this.getUriInfo = e, this.fetchEventListener = this.fetchEventListener.bind(this);
|
|
568
427
|
}
|
|
@@ -570,13 +429,13 @@ var L = e.namespace("@prose-reader/streamer", void 0, { color: "#ffae42" }), R =
|
|
|
570
429
|
try {
|
|
571
430
|
let t = this.getUriInfo(e);
|
|
572
431
|
if (!t) return;
|
|
573
|
-
let n =
|
|
432
|
+
let n = i(t.baseUrl), r = e.request.url.substring(n.length + 1), [a = ""] = r.split("/"), o = i(r.substring(a.length + 1));
|
|
574
433
|
r.endsWith("/manifest") ? e.respondWith(this.fetchManifest({
|
|
575
|
-
key:
|
|
576
|
-
baseUrl: `${n}/${
|
|
434
|
+
key: a,
|
|
435
|
+
baseUrl: `${n}/${a}/`
|
|
577
436
|
})) : e.respondWith(this.fetchResource({
|
|
578
|
-
key:
|
|
579
|
-
resourcePath:
|
|
437
|
+
key: a,
|
|
438
|
+
resourcePath: o,
|
|
580
439
|
request: e.request
|
|
581
440
|
}));
|
|
582
441
|
} catch (t) {
|
|
@@ -585,6 +444,6 @@ var L = e.namespace("@prose-reader/streamer", void 0, { color: "#ffae42" }), R =
|
|
|
585
444
|
}
|
|
586
445
|
};
|
|
587
446
|
//#endregion
|
|
588
|
-
export {
|
|
447
|
+
export { _e as ServiceWorkerStreamer, $ as Streamer, oe as configure, j as createManifestResourceHref, B as generateManifestFromArchive, J as generateResourceFromArchive };
|
|
589
448
|
|
|
590
449
|
//# sourceMappingURL=index.js.map
|