@prose-reader/streamer 1.91.0 → 1.93.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.
@@ -1,9 +1,19 @@
1
+ import { Observable } from 'rxjs';
1
2
  import { createArchiveLoader } from './archives/archiveLoader';
3
+ import { Manifest } from '@prose-reader/shared';
4
+ import { Archive } from './archives/types';
5
+ type OnError = (error: unknown) => Response;
6
+ type OnManifestSuccess = (params: {
7
+ manifest: Manifest;
8
+ archive: Archive;
9
+ }) => Observable<Manifest> | Promise<Manifest>;
2
10
  export declare class Streamer {
3
11
  epubLoader: ReturnType<typeof createArchiveLoader>;
4
- onError: (error: unknown) => Response;
5
- constructor({ onError, ...rest }: Parameters<typeof createArchiveLoader>[0] & {
6
- onError?: (error: unknown) => Response;
12
+ onError: OnError;
13
+ onManifestSuccess: OnManifestSuccess;
14
+ constructor({ onError, onManifestSuccess, ...rest }: Parameters<typeof createArchiveLoader>[0] & {
15
+ onError?: OnError;
16
+ onManifestSuccess?: OnManifestSuccess;
7
17
  });
8
18
  fetchManifest({ key, baseUrl }: {
9
19
  key: string;
@@ -14,3 +24,4 @@ export declare class Streamer {
14
24
  resourcePath: string;
15
25
  }): Promise<Response>;
16
26
  }
27
+ export {};
package/dist/index.js CHANGED
@@ -1,6 +1,6 @@
1
- import { urlJoin as N, PROSE_READER_RESOURCE_ERROR_INJECTED_META_NAME as ie, isXmlBasedMimeType as oe, detectMimeTypeFromName as M } from "@prose-reader/shared";
1
+ import { urlJoin as N, PROSE_READER_RESOURCE_ERROR_INJECTED_META_NAME as ie, isXmlBasedMimeType as oe, detectMimeTypeFromName as U } from "@prose-reader/shared";
2
2
  import y, { XmlDocument as ce } from "xmldoc";
3
- import { Subject as U, mergeMap as I, EMPTY as de, from as L, map as v, catchError as F, NEVER as V, shareReplay as le, switchMap as X, distinctUntilChanged as me, timer as pe, tap as B, merge as _, takeUntil as fe, BehaviorSubject as ue, filter as he, ignoreElements as ge, first as be, finalize as H, of as E, lastValueFrom as G } from "rxjs";
3
+ import { Subject as V, mergeMap as L, EMPTY as de, from as T, map as v, catchError as F, NEVER as X, shareReplay as le, switchMap as A, distinctUntilChanged as me, timer as pe, tap as B, merge as _, takeUntil as fe, BehaviorSubject as ue, filter as he, ignoreElements as ge, first as be, finalize as H, of as E, lastValueFrom as G } from "rxjs";
4
4
  let x = !1;
5
5
  const g = {
6
6
  enable: (e) => {
@@ -84,7 +84,7 @@ const g = {
84
84
  };
85
85
  }
86
86
  return s;
87
- }, T = (e) => {
87
+ }, S = (e) => {
88
88
  const s = Object.values(e.files).filter((r) => !r.dir).find((r) => r.uri.endsWith(".opf"));
89
89
  return {
90
90
  data: s,
@@ -171,7 +171,7 @@ const g = {
171
171
  }
172
172
  }
173
173
  }, ke = async (e, n, { baseUrl: s }) => {
174
- const { basePath: r } = T(n) || {}, t = await Se({
174
+ const { basePath: r } = S(n) || {}, t = await Se({
175
175
  opfData: e,
176
176
  opfBasePath: r,
177
177
  archive: n,
@@ -194,7 +194,7 @@ const g = {
194
194
  }, K = async ({
195
195
  archive: e
196
196
  }) => {
197
- const { data: n, basePath: s } = T(e) || {}, r = await (n == null ? void 0 : n.string());
197
+ const { data: n, basePath: s } = S(e) || {}, r = await (n == null ? void 0 : n.string());
198
198
  if (!r) return [];
199
199
  const t = new y.XmlDocument(r), a = t.childNamed("manifest"), i = t.childNamed("spine"), o = i == null ? void 0 : i.childrenNamed("itemref").map((c) => c.attr.idref), d = (a == null ? void 0 : a.childrenNamed("item").filter((c) => o.includes(c.attr.id || ""))) || [];
200
200
  return e.files.filter((c) => d.find((u) => s ? `${s}/${u.attr.href}` === c.uri : `${u.attr.href}` === c.uri));
@@ -207,19 +207,19 @@ const g = {
207
207
  mediaType: r.attr["media-type"]
208
208
  }))) || [];
209
209
  }, We = ({ archive: e, baseUrl: n }) => async (s) => {
210
- var P;
211
- const { data: r, basePath: t } = T(e) || {}, a = await Re(e);
210
+ var D;
211
+ const { data: r, basePath: t } = S(e) || {}, a = await Re(e);
212
212
  if (!r)
213
213
  return s;
214
214
  const i = await r.string();
215
215
  g.log(i, a);
216
- const o = new y.XmlDocument(i), d = await ke(o, e, { baseUrl: n }) || [], l = o.childNamed("metadata"), c = o.childNamed("manifest"), u = o.childNamed("spine"), f = o.childNamed("guide"), w = l == null ? void 0 : l.childNamed("dc:title"), h = (l == null ? void 0 : l.childrenNamed("meta")) || [], S = h.find(
216
+ const o = new y.XmlDocument(i), d = await ke(o, e, { baseUrl: n }) || [], l = o.childNamed("metadata"), c = o.childNamed("manifest"), u = o.childNamed("spine"), f = o.childNamed("guide"), w = l == null ? void 0 : l.childNamed("dc:title"), h = (l == null ? void 0 : l.childrenNamed("meta")) || [], k = h.find(
217
217
  (p) => p.attr.property === "rendition:layout"
218
- ), k = h.find(
219
- (p) => p.attr.property === "rendition:flow"
220
218
  ), R = h.find(
219
+ (p) => p.attr.property === "rendition:flow"
220
+ ), W = h.find(
221
221
  (p) => p.attr.property === "rendition:spread"
222
- ), C = S == null ? void 0 : S.val, Z = k == null ? void 0 : k.val, ee = R == null ? void 0 : R.val, te = (w == null ? void 0 : w.val) || ((P = e.files.find(({ dir: p }) => p)) == null ? void 0 : P.basename) || "", ne = u == null ? void 0 : u.attr["page-progression-direction"], re = (await K({ archive: e })).reduce(
222
+ ), P = k == null ? void 0 : k.val, Z = R == null ? void 0 : R.val, ee = W == null ? void 0 : W.val, te = (w == null ? void 0 : w.val) || ((D = e.files.find(({ dir: p }) => p)) == null ? void 0 : D.basename) || "", ne = u == null ? void 0 : u.attr["page-progression-direction"], re = (await K({ archive: e })).reduce(
223
223
  (p, m) => m.size + p,
224
224
  0
225
225
  );
@@ -228,26 +228,26 @@ const g = {
228
228
  nav: {
229
229
  toc: d
230
230
  },
231
- renditionLayout: C || a.renditionLayout || "reflowable",
231
+ renditionLayout: P || a.renditionLayout || "reflowable",
232
232
  renditionFlow: Z || "auto",
233
233
  renditionSpread: ee,
234
234
  title: te,
235
235
  readingDirection: ne || "ltr",
236
236
  spineItems: (u == null ? void 0 : u.childrenNamed("itemref").map((p) => {
237
- var O, j, z;
238
- const m = c == null ? void 0 : c.childrenNamed("item").find((b) => b.attr.id === (p == null ? void 0 : p.attr.idref)), ae = (m == null ? void 0 : m.attr.href) || "", W = ((O = p == null ? void 0 : p.attr.properties) == null ? void 0 : O.split(" ")) || [], se = ((j = e.files.find((b) => b.uri.endsWith(ae))) == null ? void 0 : j.size) || 0, D = n ?? "";
237
+ var j, M, z;
238
+ const m = c == null ? void 0 : c.childrenNamed("item").find((b) => b.attr.id === (p == null ? void 0 : p.attr.idref)), ae = (m == null ? void 0 : m.attr.href) || "", I = ((j = p == null ? void 0 : p.attr.properties) == null ? void 0 : j.split(" ")) || [], se = ((M = e.files.find((b) => b.uri.endsWith(ae))) == null ? void 0 : M.size) || 0, O = n ?? "";
239
239
  return {
240
240
  id: (m == null ? void 0 : m.attr.id) || "",
241
- href: (z = m == null ? void 0 : m.attr.href) != null && z.startsWith("https://") ? m == null ? void 0 : m.attr.href : t ? `${D}${t}/${m == null ? void 0 : m.attr.href}` : `${D}${m == null ? void 0 : m.attr.href}`,
242
- renditionLayout: C || "reflowable",
243
- ...W.find(
241
+ href: (z = m == null ? void 0 : m.attr.href) != null && z.startsWith("https://") ? m == null ? void 0 : m.attr.href : t ? `${O}${t}/${m == null ? void 0 : m.attr.href}` : `${O}${m == null ? void 0 : m.attr.href}`,
242
+ renditionLayout: P || "reflowable",
243
+ ...I.find(
244
244
  (b) => b === "rendition:layout-reflowable"
245
245
  ) && {
246
246
  renditionLayout: "reflowable"
247
247
  },
248
248
  progressionWeight: se / re,
249
- pageSpreadLeft: W.some((b) => b === "page-spread-left") || void 0,
250
- pageSpreadRight: W.some((b) => b === "page-spread-right") || void 0,
249
+ pageSpreadLeft: I.some((b) => b === "page-spread-left") || void 0,
250
+ pageSpreadRight: I.some((b) => b === "page-spread-right") || void 0,
251
251
  // size: itemSize
252
252
  mediaType: m == null ? void 0 : m.attr["media-type"]
253
253
  };
@@ -261,7 +261,7 @@ const g = {
261
261
  };
262
262
  }, Ie = async (e, n) => {
263
263
  var t, a;
264
- const r = await ((t = T(e).data) == null ? void 0 : t.string());
264
+ const r = await ((t = S(e).data) == null ? void 0 : t.string());
265
265
  if (r) {
266
266
  const i = new y.XmlDocument(r);
267
267
  return {
@@ -407,7 +407,7 @@ const g = {
407
407
  return !1;
408
408
  const t = await s.string();
409
409
  return t ? Oe(new y.XmlDocument(t)) : !1;
410
- }, Promise.resolve(!0)), ze = ({ archive: e }) => async (n) => {
410
+ }, Promise.resolve(!0)), Me = ({ archive: e }) => async (n) => {
411
411
  if (n.renditionLayout === "reflowable" && n.spineItems.every((r) => r.renditionLayout === "reflowable")) {
412
412
  const r = await K({ archive: e });
413
413
  if (await je(r))
@@ -421,17 +421,17 @@ const g = {
421
421
  };
422
422
  }
423
423
  return n;
424
- }, A = (e, n) => {
424
+ }, C = (e, n) => {
425
425
  var t;
426
426
  const s = e.split(/(\d+)/), r = n.split(/(\d+)/);
427
427
  for (let a = 0, i = s.length; a < i; a++)
428
428
  if (s[a] !== r[a])
429
429
  return (t = s[a]) != null && t.match(/\d/) ? +(s[a] || "") - +(r[a] || "") : (s[a] || "").localeCompare(r[a] || "");
430
430
  return 1;
431
- }, Me = ({ archive: e, baseUrl: n }) => async (s) => {
431
+ }, ze = ({ archive: e, baseUrl: n }) => async (s) => {
432
432
  if (s.nav) return s;
433
433
  const r = [...e.files].sort(
434
- (a, i) => A(a.uri, i.uri)
434
+ (a, i) => C(a.uri, i.uri)
435
435
  ), t = Object.values(
436
436
  r
437
437
  ).reduce(
@@ -470,9 +470,9 @@ const g = {
470
470
  const s = [
471
471
  Pe({ archive: e, baseUrl: n }),
472
472
  We({ archive: e, baseUrl: n }),
473
- ze({ archive: e, baseUrl: n }),
473
+ Me({ archive: e, baseUrl: n }),
474
474
  De({ archive: e, baseUrl: n }),
475
- Me({ archive: e, baseUrl: n })
475
+ ze({ archive: e, baseUrl: n })
476
476
  ];
477
477
  try {
478
478
  const r = await s.reduce(async (t, a) => await a(await t), Promise.resolve(Ue));
@@ -489,7 +489,7 @@ const g = {
489
489
  </metadata>
490
490
  <manifest>
491
491
  ${e.map(
492
- (a) => `<item id="${$(a)}" href="${a}" media-type="${M(a)}"/>`
492
+ (a) => `<item id="${$(a)}" href="${a}" media-type="${U(a)}"/>`
493
493
  ).join(`
494
494
  `)}
495
495
  </manifest>
@@ -501,7 +501,7 @@ const g = {
501
501
  `, r = e.map((a) => ({
502
502
  dir: !1,
503
503
  basename: $(a),
504
- encodingFormat: M(a),
504
+ encodingFormat: U(a),
505
505
  uri: a,
506
506
  size: 100 / e.length,
507
507
  base64: async () => "",
@@ -574,7 +574,7 @@ const g = {
574
574
  };
575
575
  }, Qe = async (e, { orderByAlpha: n, name: s } = {}) => {
576
576
  let r = Object.values(e.files);
577
- n && (r = r.slice().sort((a, i) => A(a.name, i.name)));
577
+ n && (r = r.slice().sort((a, i) => C(a.name, i.name)));
578
578
  const t = {
579
579
  filename: s || "",
580
580
  files: r.map((a) => ({
@@ -612,7 +612,7 @@ const g = {
612
612
  return g.log("Generated archive", r), r;
613
613
  }, et = async (e, { orderByAlpha: n, name: s } = {}) => {
614
614
  let r = e;
615
- return n && (r = r.slice().sort((t, a) => A(t.name, a.name))), {
615
+ return n && (r = r.slice().sort((t, a) => C(t.name, a.name))), {
616
616
  filename: s || "",
617
617
  files: r.map((t) => ({
618
618
  dir: t.isDir,
@@ -639,13 +639,13 @@ const g = {
639
639
  getArchive: e,
640
640
  cleanArchiveAfter: n
641
641
  }) => {
642
- const s = new U(), r = new U(), t = {}, a = s.pipe(
643
- I((d) => {
642
+ const s = new V(), r = new V(), t = {}, a = s.pipe(
643
+ L((d) => {
644
644
  const l = t[d];
645
645
  return !l || l.getValue().status !== "idle" ? de : (l.next({
646
646
  ...l.getValue(),
647
647
  status: "loading"
648
- }), L(e(d)).pipe(
648
+ }), T(e(d)).pipe(
649
649
  v((c) => (l.next({
650
650
  ...l.getValue(),
651
651
  archive: c,
@@ -660,15 +660,15 @@ const g = {
660
660
  })
661
661
  ));
662
662
  }),
663
- F(() => V),
663
+ F(() => X),
664
664
  le()
665
665
  ), i = a.pipe(
666
- X(({ archiveEntry: d, key: l }) => d.pipe(v(({ locks: f }) => f)).pipe(
666
+ A(({ archiveEntry: d, key: l }) => d.pipe(v(({ locks: f }) => f)).pipe(
667
667
  v((f) => f <= 0),
668
668
  me()
669
669
  ).pipe(
670
- X(
671
- (f) => f ? pe(n) : V
670
+ A(
671
+ (f) => f ? pe(n) : X
672
672
  ),
673
673
  B(() => {
674
674
  var f;
@@ -719,15 +719,19 @@ const g = {
719
719
  class _e {
720
720
  constructor({
721
721
  onError: n,
722
- ...s
722
+ onManifestSuccess: s,
723
+ ...r
723
724
  }) {
724
- this.onError = (r) => new Response(String(r), { status: 500 }), this.epubLoader = Be(s), this.onError = n ?? this.onError;
725
+ this.onError = (t) => new Response(String(t), { status: 500 }), this.epubLoader = Be(r), this.onManifestSuccess = s ?? (({ manifest: t }) => Promise.resolve(t)), this.onError = n ?? this.onError;
725
726
  }
726
727
  fetchManifest({ key: n, baseUrl: s }) {
727
728
  const r = this.epubLoader.access(n).pipe(
728
- I(({ archive: t, release: a }) => L(
729
+ L(({ archive: t, release: a }) => T(
729
730
  Ve(t, { baseUrl: s })
730
731
  ).pipe(
732
+ A(
733
+ (o) => T(this.onManifestSuccess({ manifest: o, archive: t }))
734
+ ),
731
735
  v(
732
736
  (o) => new Response(JSON.stringify(o), {
733
737
  status: 200
@@ -746,7 +750,7 @@ class _e {
746
750
  resourcePath: s
747
751
  }) {
748
752
  const r = this.epubLoader.access(n).pipe(
749
- I(({ archive: t, release: a }) => L(
753
+ L(({ archive: t, release: a }) => T(
750
754
  Ce(t, s)
751
755
  ).pipe(
752
756
  v((o) => new Response(o.body, { status: 200 })),
@@ -795,6 +799,6 @@ export {
795
799
  Ve as generateManifestFromArchive,
796
800
  Ce as generateResourceFromArchive,
797
801
  qe as generateResourceFromError,
798
- T as getArchiveOpfInfo
802
+ S as getArchiveOpfInfo
799
803
  };
800
804
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/report.ts","../src/generators/resources/hooks/calibreFixHook.ts","../src/generators/resources/hooks/cssFixHook.ts","../src/archives/getArchiveOpfInfo.ts","../src/parsers/nav.ts","../src/parsers/kobo.ts","../src/epub/getSpineItemFilesFromArchive.ts","../src/generators/manifest/hooks/epub.ts","../src/generators/resources/hooks/defaultHook.ts","../src/generators/resources/index.ts","../src/generators/manifest/hooks/default.ts","../src/generators/manifest/hooks/comicInfo.ts","../src/generators/manifest/hooks/epubOptimizer.ts","../src/utils/sortByTitleComparator.ts","../src/generators/manifest/hooks/navigationFallback.ts","../src/generators/manifest/index.ts","../src/utils/uri.ts","../src/archives/createArchiveFromUrls.ts","../src/utils/blobToBAse64.ts","../src/archives/createArchiveFromText.ts","../src/archives/createArchiveFromJszip.ts","../src/archives/createArchiveFromLibArchive.ts","../src/archives/createArchiveFromArrayBufferList.ts","../src/configure.ts","../src/archives/archiveLoader.ts","../src/Streamer.ts","../src/ServiceWorkerStreamer.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nlet enabled = false\n\nexport const Report = {\n enable: (enable: boolean) => {\n enabled = enable\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n log: (...data: any[]) => {\n if (enabled) {\n // eslint-disable-next-line no-console\n console.log(`[prose-reader-streamer]`, ...data)\n }\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n warn: (...data: any[]) => {\n if (enabled) {\n // eslint-disable-next-line no-console\n console.warn(`[prose-reader-streamer]`, ...data)\n }\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n error: (...data: any[]) => {\n // eslint-disable-next-line no-console\n console.error(...data)\n },\n time: (label?: string | undefined) => {\n if (enabled) {\n // eslint-disable-next-line no-console\n console.time(`[prose-reader-streamer] [metric] ${label}`)\n }\n },\n timeEnd: (label?: string | undefined) => {\n if (enabled) {\n // eslint-disable-next-line no-console\n console.timeEnd(`[prose-reader-streamer] [metric] ${label}`)\n }\n },\n metric: (\n performanceEntry: { name: string; duration: number },\n targetDuration = Infinity,\n ) => {\n const duration =\n typeof performanceEntry === `number`\n ? performanceEntry\n : performanceEntry.duration\n if (enabled) {\n if (performanceEntry.duration <= targetDuration) {\n // eslint-disable-next-line no-console\n console.log(\n `[prose-reader-streamer] [metric] `,\n `${performanceEntry.name} took ${duration}ms`,\n )\n } else {\n // eslint-disable-next-line no-console\n console.warn(\n `[prose-reader-streamer] [metric] `,\n `${performanceEntry.name} took ${performanceEntry.duration}ms which is above the ${targetDuration}ms target for this function`,\n )\n }\n }\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n measurePerformance: <F extends (...args: any[]) => any>(\n name: string,\n targetDuration = 10,\n functionToMeasure: F,\n ) => {\n return (...args: Parameters<F>): ReturnType<F> => {\n const t0 = performance.now()\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const response = functionToMeasure(...(args as any))\n\n if (response && response.then) {\n return response.then((res: any) => {\n const t1 = performance.now()\n Report.metric({ name, duration: t1 - t0 }, targetDuration)\n return res\n })\n }\n\n const t1 = performance.now()\n Report.metric({ name, duration: t1 - t0 }, targetDuration)\n\n return response\n }\n },\n}\n","import { XmlDocument } from \"xmldoc\"\nimport { Archive } from \"../../../archives/types\"\nimport { HookResource } from \"./types\"\n\nconst hasCalibreCoverMeta = (doc: XmlDocument) => {\n const metaElm = doc\n .descendantWithPath(\"head\")\n ?.childrenNamed(\"meta\")\n .find((node) => node.attr.name === \"calibre:cover\")\n\n return !!(metaElm && metaElm.attr.name === \"calibre:cover\")\n}\n\nconst getBuggyCoverSvg = (doc: XmlDocument) => {\n return doc\n .descendantWithPath(\"body\")\n ?.descendantWithPath(\"div\")\n ?.childrenNamed(\"svg\")\n ?.find(\n (node) =>\n node.attr.width === \"100%\" && node.attr.preserveAspectRatio === \"none\",\n )\n}\n\nconst fixBuggyCover =\n ({ archive, resourcePath }: { archive: Archive; resourcePath: string }) =>\n async (resource: HookResource): Promise<HookResource> => {\n const file = Object.values(archive.files).find(\n (file) => file.uri === resourcePath,\n )\n\n if (file?.basename.endsWith(`.xhtml`)) {\n const bodyToParse = resource.body ?? (await file.string())\n\n const opfXmlDoc = new XmlDocument(bodyToParse)\n\n if (hasCalibreCoverMeta(opfXmlDoc)) {\n const buggySvg = getBuggyCoverSvg(opfXmlDoc)\n\n if (buggySvg) {\n delete buggySvg.attr.preserveAspectRatio\n }\n\n return {\n ...resource,\n body: opfXmlDoc?.toString(),\n }\n }\n }\n\n return resource\n }\n\nexport const calibreFixHook =\n ({ archive, resourcePath }: { archive: Archive; resourcePath: string }) =>\n async (resource: HookResource): Promise<HookResource> => {\n return fixBuggyCover({ archive, resourcePath })(resource)\n }\n","import { Archive } from \"../../../archives/types\"\nimport { HookResource } from \"./types\"\n\nexport const cssFixHook =\n ({ archive, resourcePath }: { archive: Archive; resourcePath: string }) =>\n async (resource: HookResource): Promise<HookResource> => {\n const file = Object.values(archive.files).find(\n (file) => file.uri === resourcePath,\n )\n\n if (file?.basename.endsWith(`.css`)) {\n const bodyToParse = resource.body ?? (await file.string())\n\n /**\n * Fix the potentially invalid writing mode present on some vertical book.\n * This has the benefit of making it compatible with firefox as well.\n */\n const newBody = bodyToParse.replaceAll(\n `-webkit-writing-mode`,\n `writing-mode`,\n )\n\n return {\n ...resource,\n body: newBody,\n }\n }\n\n return resource\n }\n","import { Archive } from \"./types\"\n\nexport const getArchiveOpfInfo = (archive: Archive) => {\n const filesAsArray = Object.values(archive.files).filter((file) => !file.dir)\n const file = filesAsArray.find((file) => file.uri.endsWith(`.opf`))\n\n return {\n data: file,\n basePath: file?.uri.substring(0, file.uri.lastIndexOf(`/`)) || ``,\n }\n}\n","import xmldoc, { XmlElement } from \"xmldoc\"\nimport type { Manifest } from \"@prose-reader/shared\"\nimport { Archive, getArchiveOpfInfo } from \"..\"\nimport { urlJoin } from \"@prose-reader/shared\"\n\ntype Toc = NonNullable<Manifest[`nav`]>[`toc`]\ntype TocItem = NonNullable<Manifest[`nav`]>[`toc`][number]\n\nconst extractNavChapter = (\n li: XmlElement,\n { opfBasePath, baseUrl }: { opfBasePath: string; baseUrl: string },\n) => {\n const chp: TocItem = {\n contents: [],\n path: ``,\n href: ``,\n title: ``,\n }\n let contentNode = li.childNamed(`span`) || li.childNamed(`a`)\n chp.title = contentNode?.attr.title || contentNode?.val.trim() || chp.title\n let node = contentNode?.name\n if (node !== `a`) {\n contentNode = li.descendantWithPath(`${node}.a`)\n if (contentNode) {\n node = contentNode.name.toLowerCase()\n }\n }\n if (node === `a` && contentNode?.attr.href) {\n chp.path = urlJoin(opfBasePath, contentNode.attr.href)\n chp.href = urlJoin(baseUrl, opfBasePath, contentNode.attr.href)\n }\n const sublistNode = li.childNamed(`ol`)\n if (sublistNode) {\n const children = sublistNode.childrenNamed(`li`)\n if (children && children.length > 0) {\n chp.contents = children.map((child) =>\n extractNavChapter(child, { opfBasePath, baseUrl }),\n )\n }\n }\n\n return chp\n}\n\nconst buildTOCFromNav = (\n doc: xmldoc.XmlDocument,\n { opfBasePath, baseUrl }: { opfBasePath: string; baseUrl: string },\n) => {\n const toc: Toc = []\n\n let navDataChildren\n if (doc.descendantWithPath(`body.nav.ol`)) {\n navDataChildren = doc.descendantWithPath(`body.nav.ol`)?.children\n } else if (doc.descendantWithPath(`body.section.nav.ol`)) {\n navDataChildren = doc.descendantWithPath(`body.section.nav.ol`)?.children\n }\n\n if (navDataChildren && navDataChildren.length > 0) {\n navDataChildren\n .filter((li) => (li as XmlElement).name === `li`)\n .forEach((li) =>\n toc.push(extractNavChapter(li as XmlElement, { opfBasePath, baseUrl })),\n )\n }\n\n return toc\n}\n\nconst parseTocFromNavPath = async (\n opfXmlDoc: xmldoc.XmlDocument,\n archive: Archive,\n { opfBasePath, baseUrl }: { opfBasePath: string; baseUrl: string },\n) => {\n // Try to detect if there is a nav item\n const navItem = opfXmlDoc\n .childNamed(`manifest`)\n ?.childrenNamed(`item`)\n .find((child) => child.attr.properties === `nav`)\n\n if (navItem) {\n const tocFile = Object.values(archive.files).find((item) =>\n item.uri.endsWith(navItem.attr.href || ``),\n )\n if (tocFile) {\n const doc = new xmldoc.XmlDocument(await tocFile.string())\n return buildTOCFromNav(doc, { opfBasePath, baseUrl })\n }\n }\n}\n\nconst mapNcxChapter = (\n point: xmldoc.XmlElement,\n {\n opfBasePath,\n baseUrl,\n prefix,\n }: { opfBasePath: string; baseUrl: string; prefix: string },\n) => {\n const src = point?.childNamed(`${prefix}content`)?.attr.src || ``\n\n const out: TocItem = {\n title:\n point?.descendantWithPath(`${prefix}navLabel.${prefix}text`)?.val || ``,\n path: urlJoin(opfBasePath, src),\n href: urlJoin(baseUrl, opfBasePath, src),\n contents: [],\n }\n const children = point.childrenNamed(`${prefix}navPoint`)\n if (children && children.length > 0) {\n out.contents = children.map((pt) =>\n mapNcxChapter(pt, { opfBasePath, baseUrl, prefix }),\n )\n }\n\n return out\n}\n\nconst buildTOCFromNCX = (\n ncxData: xmldoc.XmlDocument,\n { opfBasePath, baseUrl }: { opfBasePath: string; baseUrl: string },\n) => {\n const toc: NonNullable<Manifest[`nav`]>[`toc`] = []\n\n const rootTagName = ncxData.name\n let prefix = ``\n if (rootTagName.indexOf(`:`) !== -1) {\n prefix = rootTagName.split(`:`)[0] + `:`\n }\n\n ncxData\n .childNamed(`${prefix}navMap`)\n ?.childrenNamed(`${prefix}navPoint`)\n .forEach((point) =>\n toc.push(mapNcxChapter(point, { opfBasePath, baseUrl, prefix })),\n )\n\n return toc\n}\n\nconst parseTocFromNcx = async ({\n opfData,\n opfBasePath,\n baseUrl,\n archive,\n}: {\n opfData: xmldoc.XmlDocument\n opfBasePath: string\n archive: Archive\n baseUrl: string\n}) => {\n const spine = opfData.childNamed(`spine`)\n const ncxId = spine && spine.attr.toc\n\n if (ncxId) {\n const ncxItem = opfData\n .childNamed(`manifest`)\n ?.childrenNamed(`item`)\n .find((item) => item.attr.id === ncxId)\n\n if (ncxItem) {\n const ncxPath = `${opfBasePath}${opfBasePath === `` ? `` : `/`}${ncxItem.attr.href}`\n\n const file = Object.values(archive.files).find((item) =>\n item.uri.endsWith(ncxPath),\n )\n\n if (file) {\n const ncxData = new xmldoc.XmlDocument(await file.string())\n\n return buildTOCFromNCX(ncxData, { opfBasePath, baseUrl })\n }\n }\n }\n}\n\nexport const parseToc = async (\n opfXmlDoc: xmldoc.XmlDocument,\n archive: Archive,\n { baseUrl }: { baseUrl: string },\n) => {\n const { basePath: opfBasePath } = getArchiveOpfInfo(archive) || {}\n\n const tocFromNcx = await parseTocFromNcx({\n opfData: opfXmlDoc,\n opfBasePath,\n archive,\n baseUrl,\n })\n\n if (tocFromNcx) {\n return tocFromNcx\n }\n\n return await parseTocFromNavPath(opfXmlDoc, archive, { opfBasePath, baseUrl })\n}\n","import xmldoc from \"xmldoc\"\nimport { Archive } from \"..\"\n\ntype KoboInformation = {\n renditionLayout?: `reflowable` | `pre-paginated` | undefined\n}\n\nexport const extractKoboInformationFromArchive = async (archive: Archive) => {\n const koboInformation: KoboInformation = {\n renditionLayout: undefined,\n }\n\n await Promise.all(\n archive.files.map(async (file) => {\n if (file.uri.endsWith(`com.kobobooks.display-options.xml`)) {\n const opfXmlDoc = new xmldoc.XmlDocument(await file.string())\n const optionElement = opfXmlDoc\n .childNamed(`platform`)\n ?.childNamed(`option`)\n if (\n optionElement?.attr?.name === `fixed-layout` &&\n optionElement.val === `true`\n ) {\n koboInformation.renditionLayout = `pre-paginated`\n }\n }\n }),\n )\n\n return koboInformation\n}\n","import xmldoc from \"xmldoc\"\nimport { getArchiveOpfInfo } from \"../archives/getArchiveOpfInfo\"\nimport { Archive } from \"../archives/types\"\n\nexport const getSpineItemFilesFromArchive = async ({\n archive,\n}: {\n archive: Archive\n}) => {\n const { data: opsFile, basePath: opfBasePath } =\n getArchiveOpfInfo(archive) || {}\n\n const data = await opsFile?.string()\n\n if (!data) return []\n\n const _opfXmlDoc = new xmldoc.XmlDocument(data)\n\n const manifestElm = _opfXmlDoc.childNamed(`manifest`)\n const spineElm = _opfXmlDoc.childNamed(`spine`)\n\n const spineItemIds = spineElm\n ?.childrenNamed(`itemref`)\n .map((item) => item.attr.idref) as string[]\n const manifestItemsFromSpine =\n manifestElm\n ?.childrenNamed(`item`)\n .filter((item) => spineItemIds.includes(item.attr.id || ``)) || []\n\n const archiveSpineItems = archive.files.filter((file) => {\n return manifestItemsFromSpine.find((item) => {\n if (!opfBasePath) return `${item.attr.href}` === file.uri\n return `${opfBasePath}/${item.attr.href}` === file.uri\n })\n })\n\n return archiveSpineItems\n}\n","import xmldoc from \"xmldoc\"\nimport { parseToc } from \"../../../parsers/nav\"\nimport type { Manifest } from \"@prose-reader/shared\"\nimport { extractKoboInformationFromArchive } from \"../../../parsers/kobo\"\nimport { Report } from \"../../../report\"\nimport { Archive } from \"../../../archives/types\"\nimport { getArchiveOpfInfo } from \"../../../archives/getArchiveOpfInfo\"\nimport { getSpineItemFilesFromArchive } from \"../../../epub/getSpineItemFilesFromArchive\"\n\ntype SpineItemProperties =\n | `rendition:layout-reflowable`\n | `page-spread-left`\n | `page-spread-right`\n\nexport const getItemsFromDoc = (doc: xmldoc.XmlDocument) => {\n const manifestElm = doc.childNamed(`manifest`)\n\n return (\n manifestElm?.childrenNamed(`item`)?.map((el) => ({\n href: el.attr.href || ``,\n id: el.attr.id || ``,\n mediaType: el.attr[`media-type`],\n })) || []\n )\n}\n\nexport const epubHook =\n ({ archive, baseUrl }: { archive: Archive; baseUrl: string }) =>\n async (manifest: Manifest): Promise<Manifest> => {\n const { data: opsFile, basePath: opfBasePath } =\n getArchiveOpfInfo(archive) || {}\n const koboInformation = await extractKoboInformationFromArchive(archive)\n\n if (!opsFile) {\n return manifest\n }\n\n const data = await opsFile.string()\n\n Report.log(data, koboInformation)\n\n const opfXmlDoc = new xmldoc.XmlDocument(data)\n\n const toc = (await parseToc(opfXmlDoc, archive, { baseUrl })) || []\n\n const metadataElm = opfXmlDoc.childNamed(`metadata`)\n const manifestElm = opfXmlDoc.childNamed(`manifest`)\n const spineElm = opfXmlDoc.childNamed(`spine`)\n const guideElm = opfXmlDoc.childNamed(`guide`)\n const titleElm = metadataElm?.childNamed(`dc:title`)\n const metaElmChildren = metadataElm?.childrenNamed(`meta`) || []\n const metaElmWithRendition = metaElmChildren.find(\n (meta) => meta.attr.property === `rendition:layout`,\n )\n const metaElmWithRenditionFlow = metaElmChildren.find(\n (meta) => meta.attr.property === `rendition:flow`,\n )\n const metaElmWithRenditionSpread = metaElmChildren.find(\n (meta) => meta.attr.property === `rendition:spread`,\n )\n\n const publisherRenditionLayout = metaElmWithRendition?.val as\n | `reflowable`\n | `pre-paginated`\n | undefined\n const publisherRenditionFlow = metaElmWithRenditionFlow?.val as\n | `scrolled-continuous`\n | `scrolled-doc`\n | `paginated`\n | `auto`\n | undefined\n const renditionSpread = metaElmWithRenditionSpread?.val as\n | `auto`\n | undefined\n\n const title =\n titleElm?.val || archive.files.find(({ dir }) => dir)?.basename || ``\n const pageProgressionDirection = spineElm?.attr[\n `page-progression-direction`\n ] as `ltr` | `rtl` | undefined\n\n const archiveSpineItems = await getSpineItemFilesFromArchive({ archive })\n\n const totalSize = archiveSpineItems.reduce(\n (size, file) => file.size + size,\n 0,\n )\n\n return {\n filename: archive.filename,\n nav: {\n toc,\n },\n renditionLayout:\n publisherRenditionLayout ||\n koboInformation.renditionLayout ||\n `reflowable`,\n renditionFlow: publisherRenditionFlow || `auto`,\n renditionSpread,\n title,\n readingDirection: pageProgressionDirection || `ltr`,\n spineItems:\n spineElm?.childrenNamed(`itemref`).map((itemrefElm) => {\n const manifestItem = manifestElm\n ?.childrenNamed(`item`)\n .find((item) => item.attr.id === itemrefElm?.attr.idref)\n const href = manifestItem?.attr.href || ``\n const properties = (itemrefElm?.attr.properties?.split(` `) ||\n []) as SpineItemProperties[]\n const itemSize =\n archive.files.find((file) => file.uri.endsWith(href))?.size || 0\n\n // we use base url or nothing (and stay relative)\n const hrefBaseUri = baseUrl ?? \"\"\n\n return {\n id: manifestItem?.attr.id || ``,\n href: manifestItem?.attr.href?.startsWith(`https://`)\n ? manifestItem?.attr.href\n : opfBasePath\n ? `${hrefBaseUri}${opfBasePath}/${manifestItem?.attr.href}`\n : `${hrefBaseUri}${manifestItem?.attr.href}`,\n renditionLayout: publisherRenditionLayout || `reflowable`,\n ...(properties.find(\n (property) => property === `rendition:layout-reflowable`,\n ) && {\n renditionLayout: `reflowable`,\n }),\n progressionWeight: itemSize / totalSize,\n pageSpreadLeft:\n properties.some((property) => property === `page-spread-left`) ||\n undefined,\n pageSpreadRight:\n properties.some((property) => property === `page-spread-right`) ||\n undefined,\n // size: itemSize\n mediaType: manifestItem?.attr[`media-type`],\n }\n }) || [],\n items: getItemsFromDoc(opfXmlDoc),\n guide: guideElm?.childrenNamed(`reference`).map((elm) => {\n return {\n href: elm.attr.href || ``,\n title: elm.attr.title || ``,\n type: elm.attr.type as NonNullable<Manifest[`guide`]>[number][`type`],\n }\n }),\n }\n }\n","import { getArchiveOpfInfo } from \"../../../archives/getArchiveOpfInfo\"\nimport { Archive } from \"../../../archives/types\"\nimport { getItemsFromDoc } from \"../../manifest/hooks/epub\"\nimport xmldoc from \"xmldoc\"\nimport { HookResource } from \"./types\"\n\nconst getMetadata = async (archive: Archive, resourcePath: string) => {\n const opfInfo = getArchiveOpfInfo(archive)\n const data = await opfInfo.data?.string()\n\n if (data) {\n const opfXmlDoc = new xmldoc.XmlDocument(data)\n const items = getItemsFromDoc(opfXmlDoc)\n\n return {\n mediaType: items.find((item) => resourcePath.endsWith(item.href))\n ?.mediaType,\n }\n }\n\n return {\n mediaType: getContentTypeFromExtension(resourcePath),\n }\n}\n\nconst getContentTypeFromExtension = (uri: string) => {\n if (uri.endsWith(`.css`)) {\n return `text/css; charset=UTF-8`\n }\n if (uri.endsWith(`.jpg`)) {\n return `image/jpg`\n }\n if (uri.endsWith(`.xhtml`)) {\n return `application/xhtml+xml`\n }\n if (uri.endsWith(`.mp4`)) {\n return `video/mp4`\n }\n if (uri.endsWith(`.svg`)) {\n return `image/svg+xml`\n }\n}\n\nexport const defaultHook =\n ({ archive, resourcePath }: { archive: Archive; resourcePath: string }) =>\n async (resource: HookResource): Promise<HookResource> => {\n const file = Object.values(archive.files).find(\n (file) => file.uri === resourcePath,\n )\n\n if (!file) return resource\n\n // if (file.stream) {\n // const stream = file.stream()\n\n // console.log(file, stream)\n // stream.on(`data`, data => {\n // console.log(`data`, data)\n // })\n // stream.on(`error`, data => {\n // console.error(`error`, data)\n // })\n // stream.on(`end`, () => {\n // console.log(`end`)\n // })\n\n // }\n\n // const stream = file.stream!()\n\n // const readableStream = new ReadableStream({\n // start(controller) {\n // function push() {\n // stream.on(`data`, data => {\n // controller.enqueue(data)\n // })\n // stream.on(`error`, data => {\n // console.error(`error`, data)\n // })\n // stream.on(`end`, () => {\n // controller.close()\n // })\n\n // stream.resume()\n // }\n\n // push();\n // }\n // })\n\n const metadata = await getMetadata(archive, resourcePath)\n\n return {\n ...resource,\n params: {\n ...resource.params,\n status: 200,\n headers: {\n ...(file?.encodingFormat && {\n \"Content-Type\": file.encodingFormat,\n }),\n ...(metadata.mediaType && {\n \"Content-Type\": metadata.mediaType,\n }),\n },\n },\n }\n }\n","import { PROSE_READER_RESOURCE_ERROR_INJECTED_META_NAME } from \"@prose-reader/shared\"\nimport { Archive } from \"../..\"\nimport { Report } from \"../../report\"\nimport { calibreFixHook } from \"./hooks/calibreFixHook\"\nimport { cssFixHook } from \"./hooks/cssFixHook\"\nimport { defaultHook } from \"./hooks/defaultHook\"\nimport { HookResource } from \"./hooks/types\"\n\nexport const generateResourceFromArchive = async (\n archive: Archive,\n resourcePath: string,\n) => {\n const file = Object.values(archive.files).find(\n (file) => file.uri === resourcePath,\n )\n\n if (!file) {\n throw new Error(`no file found`)\n }\n\n const defaultResource: HookResource = {\n params: {\n status: 200,\n },\n }\n\n const hooks = [\n defaultHook({ archive, resourcePath }),\n cssFixHook({ archive, resourcePath }),\n calibreFixHook({ archive, resourcePath }),\n ]\n\n try {\n const resource = await hooks.reduce(async (manifest, gen) => {\n return await gen(await manifest)\n }, Promise.resolve(defaultResource))\n\n Report.log(\"Generated resource\", resourcePath, resource)\n\n return {\n ...resource,\n body: resource.body || (await file.blob()),\n }\n } catch (e) {\n Report.error(e)\n\n throw e\n }\n}\n\nexport const generateResourceFromError = (error: unknown) => {\n return {\n body: `\n <!DOCTYPE html>\n <html xmlns=\"http://www.w3.org/1999/xhtml\" xmlns:epub=\"http://www.idpf.org/2007/ops\" xml:lang=\"en\" lang=\"en\">\n <head>\n <meta name=\"${PROSE_READER_RESOURCE_ERROR_INJECTED_META_NAME}\" content=\"${String(error)}\" />\n </head>\n <body>\n <pre>${String(error)}</pre>\n </body>\n </html>\n `,\n params: {\n status: 500,\n headers: {\n \"Content-Type\": \"text/html;charset=UTF-8\",\n },\n },\n }\n}\n\n// (() => {\n// fetch(\"https://miro.medium.com/fit/c/64/64/1*dmbNkD5D-u45r44go_cf0g.png\").then(async (response) => {\n// console.log(\"asdasd\")\n// const s = await response.text()\n// console.log(s)\n// debugger\n// }).catch(console.error)\n// })()\n","import { Manifest } from \"@prose-reader/shared\"\nimport { Archive } from \"../../../archives/types\"\n\nexport const defaultHook =\n ({ archive, baseUrl }: { archive: Archive; baseUrl: string }) =>\n async (): Promise<Manifest> => {\n const files = Object.values(archive.files).filter((file) => !file.dir)\n\n return {\n filename: archive.filename,\n title:\n archive.files.find(({ dir }) => dir)?.basename.replace(/\\/$/, ``) || ``,\n renditionLayout: `pre-paginated`,\n renditionSpread: `auto`,\n readingDirection: `ltr`,\n spineItems: files\n .filter((file) => !file.basename.endsWith(`.db`))\n .map((file, index) => ({\n // some books such as cbz can have same basename inside different sub folder\n // we need to make sure to have unique index\n // /chap01/01.png, /chap02/01.png, etc\n id: `${index}.${file.basename}`,\n href: encodeURI(`${baseUrl}${file.uri}`),\n renditionLayout: `pre-paginated`,\n progressionWeight: 1 / files.length,\n pageSpreadLeft: undefined,\n pageSpreadRight: undefined,\n mediaType: file.encodingFormat,\n })),\n items: files.map((file, index) => ({\n id: `${index}.${file.basename}`,\n href: `${baseUrl}${file.uri}`,\n })),\n }\n }\n","import { Manifest } from \"@prose-reader/shared\"\nimport xmldoc from \"xmldoc\"\nimport { Archive } from \"../../../archives/types\"\n\n/**\n * Handle archive which contains ComicInfo.xml. This is a meta file\n * used to define cbz, etc. I believe it comes from some sites or apps.\n */\nexport const comicInfoHook =\n ({ archive }: { archive: Archive; baseUrl: string }) =>\n async (manifest: Manifest): Promise<Manifest> => {\n const comicInfoFile = archive.files.find(\n (file) => file.basename.toLowerCase() === `comicinfo.xml`,\n )\n\n if (!comicInfoFile) {\n return manifest\n }\n\n const manifestWithoutComicInfo = {\n ...manifest,\n spineItems: manifest.spineItems\n .filter((item) => !item.id.toLowerCase().endsWith(`comicinfo.xml`))\n .map((item, _, items) => ({\n ...item,\n progressionWeight: 1 / items.length,\n })),\n }\n\n // @todo handle more meta\n const content = await comicInfoFile.string()\n\n try {\n const xmlDoc = new xmldoc.XmlDocument(content)\n\n const mangaVal =\n (xmlDoc.childNamed(`Manga`)?.val as `YesAndRightToLeft`) || `unknown`\n\n return {\n ...manifestWithoutComicInfo,\n readingDirection: mangaVal === `YesAndRightToLeft` ? `rtl` : `ltr`,\n }\n } catch (e) {\n console.error(\"Unable to parse comicinfo.xml for content\\n\", content)\n console.error(e)\n\n return manifestWithoutComicInfo\n }\n }\n","import { isXmlBasedMimeType, Manifest } from \"@prose-reader/shared\"\nimport xmldoc from \"xmldoc\"\nimport { Archive } from \"../../../archives/types\"\nimport { getSpineItemFilesFromArchive } from \"../../../epub/getSpineItemFilesFromArchive\"\n\nconst hasDocMetaViewport = (doc: xmldoc.XmlDocument) => {\n const metaElm = doc\n .descendantWithPath(\"head\")\n ?.childrenNamed(\"meta\")\n .find((node) => node.attr.name === \"viewport\")\n\n return !!(metaElm && metaElm.attr.name === \"viewport\")\n}\n\nconst allFilesHaveViewportMeta = (files: Archive[\"files\"]) =>\n files.reduce(async (result, current) => {\n const _result = await result\n\n if (!_result) return false\n\n if (\n !isXmlBasedMimeType({\n mimeType: current.encodingFormat,\n uri: current.uri,\n })\n ) {\n return false\n }\n\n const file = await current.string()\n\n if (!file) return false\n\n return hasDocMetaViewport(new xmldoc.XmlDocument(file))\n }, Promise.resolve(true))\n\nexport const epubOptimizerHook =\n ({ archive }: { archive: Archive; baseUrl: string }) =>\n async (manifest: Manifest): Promise<Manifest> => {\n const bookIsFullReflowable =\n manifest.renditionLayout === \"reflowable\" &&\n manifest.spineItems.every((item) => item.renditionLayout === \"reflowable\")\n\n if (bookIsFullReflowable) {\n const files = await getSpineItemFilesFromArchive({ archive })\n\n const hasAllViewport = await allFilesHaveViewportMeta(files)\n\n if (hasAllViewport) {\n return {\n ...manifest,\n spineItems: manifest.spineItems.map((item) => ({\n ...item,\n renditionLayout: \"pre-paginated\",\n })),\n renditionLayout: \"pre-paginated\",\n }\n }\n }\n\n return manifest\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 } else {\n return (alist[i] || ``).localeCompare(blist[i] || ``)\n }\n }\n }\n\n return 1\n}\n","import { Manifest, urlJoin } from \"@prose-reader/shared\"\nimport { Archive } from \"../../../archives/types\"\nimport { sortByTitleComparator } from \"../../../utils/sortByTitleComparator\"\n\n/**\n * In case no navigation was generated prior to this hook, we will try\n * to generate something based on the structure of the archive.\n *\n * We use folders as chapters.\n */\nexport const navigationFallbackHook =\n ({ archive, baseUrl }: { archive: Archive; baseUrl: string }) =>\n async (manifest: Manifest): Promise<Manifest> => {\n if (manifest.nav) return manifest\n\n const filesSortedByAlpha = [...archive.files].sort((a, b) =>\n sortByTitleComparator(a.uri, b.uri),\n )\n\n const toc: NonNullable<Manifest[\"nav\"]>[\"toc\"] = Object.values(\n filesSortedByAlpha,\n ).reduce(\n (acc, file) => {\n const parts = file.uri.split(\"/\")\n\n // we have a file that is\n const isFileUnderFolder = !file.dir && parts.length > 1\n\n if (isFileUnderFolder) {\n parts.forEach((part, level) => {\n const partIsFileName = level === parts.length - 1\n\n if (partIsFileName) return\n\n const existingTocItem = acc.find(({ title }) => title === part)\n\n if (existingTocItem) {\n // @todo\n } else {\n acc.push({\n contents: [],\n href: urlJoin(baseUrl, encodeURI(file.uri)).replace(/\\/$/, \"\"),\n path: file.uri.replace(/\\/$/, \"\"),\n title: parts[0] ?? \"\",\n })\n }\n })\n }\n\n return acc\n },\n [] as NonNullable<Manifest[\"nav\"]>[\"toc\"],\n )\n\n if (toc.length === 0) return manifest\n\n return {\n ...manifest,\n nav: {\n toc,\n },\n }\n }\n","import type { Manifest } from \"@prose-reader/shared\"\nimport { Report } from \"../../report\"\nimport { Archive } from \"../../archives/types\"\nimport { defaultHook } from \"./hooks/default\"\nimport { epubHook } from \"./hooks/epub\"\nimport { comicInfoHook } from \"./hooks/comicInfo\"\nimport { epubOptimizerHook } from \"./hooks/epubOptimizer\"\nimport { navigationFallbackHook } from \"./hooks/navigationFallback\"\n\nconst baseManifest: Manifest = {\n filename: ``,\n items: [],\n nav: {\n toc: [],\n },\n readingDirection: `ltr`,\n renditionLayout: `pre-paginated`,\n renditionSpread: `auto`,\n spineItems: [],\n title: ``,\n}\n\nexport const generateManifestFromArchive = async (\n archive: Archive,\n { baseUrl = `` }: { baseUrl?: string } = {},\n) => {\n const hooks = [\n defaultHook({ archive, baseUrl }),\n epubHook({ archive, baseUrl }),\n epubOptimizerHook({ archive, baseUrl }),\n comicInfoHook({ archive, baseUrl }),\n navigationFallbackHook({ archive, baseUrl }),\n ]\n\n try {\n const manifest = await hooks.reduce(async (manifest, gen) => {\n return await gen(await manifest)\n }, Promise.resolve(baseManifest))\n\n Report.log(\"Generated manifest\", manifest)\n\n return manifest\n } catch (e) {\n Report.error(e)\n\n throw e\n }\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","import { detectMimeTypeFromName } from \"@prose-reader/shared\"\nimport { getUriBasename } from \"../utils/uri\"\nimport { Archive } from \"./types\"\n\n/**\n * @important\n * Make sure the urls are on the same origin or the cors header is set otherwise\n * the resource cannot be consumed as it is on the web.\n */\nexport const createArchiveFromUrls = async (\n urls: string[],\n options?: { useRenditionFlow: boolean },\n): Promise<Archive> => {\n const opfFileData = `\n <?xml version=\"1.0\" encoding=\"UTF-8\"?><package xmlns=\"http://www.idpf.org/2007/opf\" version=\"2.0\" unique-identifier=\"bookid\">\n <metadata>\n <meta property=\"rendition:layout\">${options?.useRenditionFlow ? `reflowable` : `pre-paginated`}</meta>\n ${options?.useRenditionFlow ? `<meta property=\"rendition:flow\">scrolled-continuous</meta>` : ``}\n </metadata>\n <manifest>\n ${urls\n .map(\n (url) =>\n `<item id=\"${getUriBasename(url)}\" href=\"${url}\" media-type=\"${detectMimeTypeFromName(url)}\"/>`,\n )\n .join(`\\n`)}\n </manifest>\n <spine>\n ${urls.map((url) => `<itemref idref=\"${getUriBasename(url)}\" />`).join(`\\n`)}\n </spine>\n </package>\n `\n\n const filesFromUrl: Archive[`files`] = urls.map((url) => ({\n dir: false,\n basename: getUriBasename(url),\n encodingFormat: detectMimeTypeFromName(url),\n uri: url,\n size: 100 / urls.length,\n base64: async () => ``,\n blob: async () => new Blob(),\n string: async () => ``,\n }))\n\n const opfFile: Archive[`files`][number] = {\n dir: false,\n basename: `content.opf`,\n uri: `content.opf`,\n size: 0,\n base64: async () => opfFileData,\n blob: async () => new Blob(),\n string: async () => opfFileData,\n }\n\n return {\n filename: ``,\n files: [opfFile, ...filesFromUrl],\n close: () => Promise.resolve(),\n }\n}\n","export const blobToBase64 = async (blob: Blob) =>\n new Promise<string>((resolve) => {\n const reader = new FileReader()\n reader.readAsDataURL(blob)\n reader.onloadend = function () {\n const base64data = reader.result as string\n resolve(base64data)\n }\n })\n","import { blobToBase64 } from \"../utils/blobToBAse64\"\nimport { getUriBasename } from \"../utils/uri\"\nimport { Archive } from \"./types\"\n\n/**\n * Useful to create archive from txt content\n */\nexport const createArchiveFromText = async (\n content: string | Blob,\n {\n mimeType,\n direction,\n }: {\n direction?: `ltr` | `rtl`\n mimeType?: string\n } = { mimeType: \"text/plain\" },\n) => {\n const txtOpfContent = `\n <?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <package xmlns=\"http://www.idpf.org/2007/opf\" version=\"3.0\" xml:lang=\"ja\" prefix=\"rendition: http://www.idpf.org/vocab/rendition/#\"\n unique-identifier=\"ootuya-id\">\n <metadata xmlns:opf=\"http://www.idpf.org/2007/opf\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\"\n xmlns:dcterms=\"http://purl.org/dc/terms/\">\n <meta property=\"rendition:layout\">reflowable</meta>\n </metadata>\n <manifest>\n <item id=\"p01\" href=\"p01.txt\" media-type=\"text/plain\"/>\n </manifest>\n <spine page-progression-direction=\"${direction ?? `ltr`}\">\n <itemref idref=\"p01\" />\n </spine>\n </package>\n `\n\n const archive: Archive = {\n filename: `content.txt`,\n files: [\n {\n dir: false,\n basename: getUriBasename(`generated.opf`),\n uri: `generated.opf`,\n blob: async () => new Blob([txtOpfContent]),\n string: async () => txtOpfContent,\n base64: async () => btoa(txtOpfContent),\n size: 0,\n },\n {\n dir: false,\n basename: getUriBasename(`p01.txt`),\n uri: `p01.txt`,\n blob: async () => {\n if (typeof content === `string`) return new Blob([content])\n return content\n },\n string: async () => {\n if (typeof content === `string`) return content\n return content.text()\n },\n base64: async () => {\n if (typeof content === `string`) return btoa(content)\n return blobToBase64(content)\n },\n size: typeof content === `string` ? content.length : content.size,\n encodingFormat: mimeType,\n },\n ],\n close: () => Promise.resolve(),\n }\n\n return archive\n}\n","import { Report } from \"../report\"\nimport { sortByTitleComparator } from \"../utils/sortByTitleComparator\"\nimport { getUriBasename } from \"../utils/uri\"\nimport { Archive, StreamResult } from \"./types\"\n\ninterface OutputByType {\n base64: string\n string: string\n text: string\n binarystring: string\n array: number[]\n uint8array: Uint8Array\n arraybuffer: ArrayBuffer\n blob: Blob\n nodebuffer: Buffer\n}\n\ntype OutputType = keyof OutputByType\ninterface JSZipObject {\n name: string\n dir: boolean\n date: Date\n comment: string\n unixPermissions: number | string | null\n dosPermissions: number | null\n async<T extends OutputType>(type: T): Promise<OutputByType[T]>\n // nodeStream(type?: `nodebuffer`): NodeJS.ReadableStream;\n internalStream?: (type?: `uint8array`) => StreamResult\n}\n\ninterface JSZip {\n files: { [key: string]: JSZipObject }\n}\n\nexport const createArchiveFromJszip = async (\n jszip: JSZip,\n { orderByAlpha, name }: { orderByAlpha?: boolean; name?: string } = {},\n): Promise<Archive> => {\n let files = Object.values(jszip.files)\n\n if (orderByAlpha) {\n files = files.slice().sort((a, b) => sortByTitleComparator(a.name, b.name))\n }\n\n const archive = {\n filename: name || ``,\n files: files.map((file) => ({\n dir: file.dir,\n basename: getUriBasename(file.name),\n uri: file.name,\n blob: () => file.async(`blob`),\n string: () => file.async(`string`),\n base64: () => file.async(`base64`),\n ...(file.internalStream && {\n stream: file.internalStream,\n }),\n // this is private API\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n size: file._data.uncompressedSize,\n })),\n close: () => Promise.resolve(),\n }\n\n Report.log(\"Generated archive\", archive)\n\n return archive\n}\n","/**\n * @see https://github.com/nika-begiashvili/libarchivejs.\n *\n * Does not work in service worker due to usage of web worker.\n */\n/* eslint-disable @typescript-eslint/ban-types */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { Report } from \"../report\"\nimport { Archive } from \"./types\"\n\ninterface ArchiveReader {\n getFilesArray(): Promise<any[]>\n /**\n * Terminate worker to free up memory\n */\n close(): Promise<void>\n}\n\n/**\n * Represents compressed file before extraction\n */\ninterface CompressedFile {\n /**\n * File name\n */\n get name(): string\n /**\n * File size\n */\n get size(): number\n get lastModified(): number\n /**\n * Extract file from archive\n * @returns {Promise<File>} extracted file\n */\n extract(): any\n}\n\nexport const createArchiveFromLibArchive = async (\n libArchive: ArchiveReader,\n { name }: { orderByAlpha?: boolean; name?: string } = {},\n): Promise<Archive> => {\n const objArray = await libArchive.getFilesArray()\n\n const archive: Archive = {\n close: () => libArchive.close(),\n filename: name ?? ``,\n files: objArray.map((item: { file: CompressedFile; path: string }) => ({\n dir: false,\n basename: item.file.name,\n size: item.file.size,\n uri: `${item.path}${item.file.name}`,\n base64: async () => {\n return ``\n },\n blob: async () => {\n const file = await (item.file.extract() as Promise<File>)\n\n return file\n },\n string: async () => {\n const file = await (item.file.extract() as Promise<File>)\n\n return file.text()\n },\n })),\n }\n\n Report.log(\"Generated archive\", archive)\n\n return archive\n}\n","import { sortByTitleComparator } from \"../utils/sortByTitleComparator\"\nimport { getUriBasename } from \"../utils/uri\"\nimport { Archive } from \"./types\"\n\nexport const createArchiveFromArrayBufferList = async (\n list: {\n isDir: boolean\n name: string\n size: number\n data: () => Promise<ArrayBuffer>\n }[],\n { orderByAlpha, name }: { orderByAlpha?: boolean; name?: string } = {},\n): Promise<Archive> => {\n let files = list\n\n if (orderByAlpha) {\n files = files.slice().sort((a, b) => sortByTitleComparator(a.name, b.name))\n }\n\n return {\n filename: name || ``,\n files: files.map((file) => ({\n dir: file.isDir,\n basename: getUriBasename(file.name),\n uri: file.name,\n blob: async () => new Blob([await file.data()]),\n string: async () => {\n const data = await file.data()\n return String.fromCharCode.apply(\n null,\n Array.from(new Uint16Array(data)),\n )\n },\n base64: async () => {\n // @todo not used for now, lets implement it later if needed\n return ``\n },\n size: file.size,\n })),\n close: () => Promise.resolve(),\n }\n}\n","import { Report } from \"./report\"\n\nexport const configure = ({\n enableReport,\n}: { enableReport?: boolean } = {}) => {\n Report.enable(!!enableReport)\n}\n","import {\n BehaviorSubject,\n catchError,\n distinctUntilChanged,\n EMPTY,\n filter,\n first,\n from,\n ignoreElements,\n map,\n merge,\n mergeMap,\n NEVER,\n shareReplay,\n Subject,\n switchMap,\n takeUntil,\n tap,\n timer,\n} from \"rxjs\"\nimport { Archive } from \"./types\"\n\ntype ArchiveEntry = {\n status: \"idle\" | \"loading\" | \"success\" | \"error\"\n error: unknown\n archive: undefined | Archive\n locks: number\n}\n\nexport const createArchiveLoader = ({\n getArchive,\n cleanArchiveAfter,\n}: {\n getArchive: (key: string) => Promise<Archive>\n cleanArchiveAfter: number\n}) => {\n const loadSubject = new Subject<string>()\n const destroySubject = new Subject<void>()\n const archives: Record<string, BehaviorSubject<ArchiveEntry>> = {}\n\n const archiveLoaded$ = loadSubject.pipe(\n mergeMap((key) => {\n const archiveEntry = archives[key]\n\n if (!archiveEntry || archiveEntry.getValue().status !== \"idle\")\n return EMPTY\n\n archiveEntry.next({\n ...archiveEntry.getValue(),\n status: \"loading\",\n })\n\n return from(getArchive(key)).pipe(\n map((archive) => {\n archiveEntry.next({\n ...archiveEntry.getValue(),\n archive,\n status: \"success\",\n })\n\n return { key, archiveEntry }\n }),\n catchError((error) => {\n archiveEntry.next({\n ...archiveEntry.getValue(),\n status: \"error\",\n error,\n })\n\n throw error\n }),\n )\n }),\n catchError(() => NEVER),\n shareReplay(),\n )\n\n const cleanup$ = archiveLoaded$.pipe(\n switchMap(({ archiveEntry, key }) => {\n const locks$ = archiveEntry.pipe(map(({ locks }) => locks))\n const isUnlocked$ = locks$.pipe(\n map((locks) => locks <= 0),\n distinctUntilChanged(),\n )\n\n return isUnlocked$.pipe(\n switchMap((isUnlocked) =>\n !isUnlocked ? NEVER : timer(cleanArchiveAfter),\n ),\n tap(() => {\n delete archives[key]\n\n archiveEntry.getValue().archive?.close()\n }),\n )\n }),\n )\n\n const access = (key: string) => {\n let releaseCalled = false\n\n const archiveEntry =\n archives[key] ??\n new BehaviorSubject<ArchiveEntry>({\n archive: undefined,\n status: \"idle\",\n locks: 0,\n error: undefined,\n })\n\n archives[key] = archiveEntry\n\n archiveEntry.next({\n ...archiveEntry.getValue(),\n locks: archiveEntry.getValue().locks + 1,\n })\n\n const release = () => {\n if (releaseCalled) return\n\n releaseCalled = true\n\n archiveEntry.next({\n ...archiveEntry.getValue(),\n locks: archiveEntry.getValue().locks - 1,\n })\n }\n\n loadSubject.next(key)\n\n const archive$ = archiveEntry.pipe(\n map(({ archive }) => archive),\n filter((archive) => !!archive),\n )\n\n const error$ = archiveEntry.pipe(\n tap(({ error }) => {\n if (error) {\n throw error\n }\n }),\n ignoreElements(),\n )\n\n return merge(archive$, error$).pipe(\n first(),\n map((archive) => ({ archive, release })),\n catchError((error) => {\n release()\n\n throw error\n }),\n )\n }\n\n merge(cleanup$, archiveLoaded$).pipe(takeUntil(destroySubject)).subscribe()\n\n return {\n access,\n }\n}\n","import {\n catchError,\n finalize,\n from,\n lastValueFrom,\n map,\n mergeMap,\n of,\n} from \"rxjs\"\nimport { createArchiveLoader } from \"./archives/archiveLoader\"\nimport { Manifest } from \"@prose-reader/shared\"\nimport { generateManifestFromArchive } from \"./generators/manifest\"\nimport { generateResourceFromArchive } from \"./generators/resources\"\n\nexport class Streamer {\n epubLoader: ReturnType<typeof createArchiveLoader>\n onError = (error: unknown) => {\n return new Response(String(error), { status: 500 })\n }\n\n constructor({\n onError,\n ...rest\n }: Parameters<typeof createArchiveLoader>[0] & {\n onError?: (error: unknown) => Response\n }) {\n this.epubLoader = createArchiveLoader(rest)\n\n this.onError = onError ?? this.onError\n }\n\n public fetchManifest({ key, baseUrl }: { key: string; baseUrl?: string }) {\n const response$ = this.epubLoader.access(key).pipe(\n mergeMap(({ archive, release }) => {\n const manifest$ = from(\n generateManifestFromArchive(archive, { baseUrl }),\n )\n\n return manifest$.pipe(\n map(\n (manifest) =>\n new Response(JSON.stringify(manifest satisfies Manifest), {\n status: 200,\n }),\n ),\n finalize(() => {\n release()\n }),\n )\n }),\n catchError((error) => {\n return of(this.onError(error))\n }),\n )\n\n return lastValueFrom(response$)\n }\n\n public fetchResource({\n key,\n resourcePath,\n }: {\n key: string\n resourcePath: string\n }) {\n const response$ = this.epubLoader.access(key).pipe(\n mergeMap(({ archive, release }) => {\n const manifest$ = from(\n generateResourceFromArchive(archive, resourcePath),\n )\n\n return manifest$.pipe(\n map((resource) => new Response(resource.body, { status: 200 })),\n finalize(() => {\n release()\n }),\n )\n }),\n catchError((error) => {\n return of(this.onError(error))\n }),\n )\n\n return lastValueFrom(response$)\n }\n}\n","import { Streamer } from \"./Streamer\"\nimport { removeTrailingSlash } from \"./utils/uri\"\n\ntype ConflictFreeWebWorkerFetchEvent = {\n readonly request: Request\n /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/FetchEvent/respondWith) */\n respondWith(r: Response | PromiseLike<Response>): void\n}\n\nexport class ServiceWorkerStreamer extends Streamer {\n protected getUriInfo: (event: ConflictFreeWebWorkerFetchEvent) =>\n | {\n baseUrl: string\n }\n | undefined\n\n constructor({\n getUriInfo,\n ...rest\n }: ConstructorParameters<typeof Streamer>[0] & {\n getUriInfo: (event: ConflictFreeWebWorkerFetchEvent) =>\n | {\n baseUrl: string\n }\n | undefined\n }) {\n super(rest)\n\n this.getUriInfo = getUriInfo\n this.fetchEventListener = this.fetchEventListener.bind(this)\n }\n\n fetchEventListener(event: ConflictFreeWebWorkerFetchEvent) {\n try {\n const uriInfo = this.getUriInfo(event)\n\n if (!uriInfo) return\n\n const baseUrl = removeTrailingSlash(uriInfo.baseUrl)\n const streamerPath = event.request.url.substring(\n baseUrl.length + `/`.length,\n )\n const [key = ``] = streamerPath.split(\"/\")\n const resourcePath = decodeURIComponent(\n removeTrailingSlash(streamerPath.substring(key.length + `/`.length)),\n )\n\n if (streamerPath.endsWith(`/manifest`)) {\n event.respondWith(\n this.fetchManifest({ key, baseUrl: `${baseUrl}/${key}/` }),\n )\n } else {\n event.respondWith(this.fetchResource({ key, resourcePath }))\n }\n } catch (e) {\n event.respondWith(new Response(String(e), { status: 500 }))\n }\n }\n}\n"],"names":["enabled","Report","enable","data","label","performanceEntry","targetDuration","duration","name","functionToMeasure","args","t0","response","res","t1","hasCalibreCoverMeta","doc","metaElm","_a","node","getBuggyCoverSvg","_c","_b","fixBuggyCover","archive","resourcePath","resource","file","bodyToParse","opfXmlDoc","XmlDocument","buggySvg","calibreFixHook","cssFixHook","newBody","getArchiveOpfInfo","extractNavChapter","li","opfBasePath","baseUrl","chp","contentNode","urlJoin","sublistNode","children","child","buildTOCFromNav","toc","navDataChildren","parseTocFromNavPath","navItem","tocFile","item","xmldoc","mapNcxChapter","point","prefix","src","out","pt","buildTOCFromNCX","ncxData","rootTagName","parseTocFromNcx","opfData","spine","ncxId","ncxItem","ncxPath","parseToc","tocFromNcx","extractKoboInformationFromArchive","koboInformation","optionElement","getSpineItemFilesFromArchive","opsFile","_opfXmlDoc","manifestElm","spineElm","spineItemIds","manifestItemsFromSpine","getItemsFromDoc","el","epubHook","manifest","metadataElm","guideElm","titleElm","metaElmChildren","metaElmWithRendition","meta","metaElmWithRenditionFlow","metaElmWithRenditionSpread","publisherRenditionLayout","publisherRenditionFlow","renditionSpread","title","dir","pageProgressionDirection","totalSize","size","itemrefElm","manifestItem","href","properties","itemSize","hrefBaseUri","property","elm","getMetadata","getContentTypeFromExtension","uri","defaultHook","metadata","generateResourceFromArchive","defaultResource","hooks","gen","e","generateResourceFromError","error","PROSE_READER_RESOURCE_ERROR_INJECTED_META_NAME","files","index","comicInfoHook","comicInfoFile","manifestWithoutComicInfo","_","items","content","mangaVal","hasDocMetaViewport","allFilesHaveViewportMeta","result","current","isXmlBasedMimeType","epubOptimizerHook","sortByTitleComparator","a","b","alist","blist","i","len","navigationFallbackHook","filesSortedByAlpha","acc","parts","part","level","baseManifest","generateManifestFromArchive","getUriBasename","removeTrailingSlash","createArchiveFromUrls","urls","options","opfFileData","url","detectMimeTypeFromName","filesFromUrl","blobToBase64","blob","resolve","reader","base64data","createArchiveFromText","mimeType","direction","txtOpfContent","createArchiveFromJszip","jszip","orderByAlpha","createArchiveFromLibArchive","libArchive","objArray","createArchiveFromArrayBufferList","list","configure","enableReport","createArchiveLoader","getArchive","cleanArchiveAfter","loadSubject","Subject","destroySubject","archives","archiveLoaded$","mergeMap","key","archiveEntry","EMPTY","from","map","catchError","NEVER","shareReplay","cleanup$","switchMap","locks","distinctUntilChanged","isUnlocked","timer","tap","access","releaseCalled","BehaviorSubject","release","archive$","filter","error$","ignoreElements","merge","first","takeUntil","Streamer","onError","rest","response$","finalize","of","lastValueFrom","ServiceWorkerStreamer","getUriInfo","event","uriInfo","streamerPath"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/report.ts","../src/generators/resources/hooks/calibreFixHook.ts","../src/generators/resources/hooks/cssFixHook.ts","../src/archives/getArchiveOpfInfo.ts","../src/parsers/nav.ts","../src/parsers/kobo.ts","../src/epub/getSpineItemFilesFromArchive.ts","../src/generators/manifest/hooks/epub.ts","../src/generators/resources/hooks/defaultHook.ts","../src/generators/resources/index.ts","../src/generators/manifest/hooks/default.ts","../src/generators/manifest/hooks/comicInfo.ts","../src/generators/manifest/hooks/epubOptimizer.ts","../src/utils/sortByTitleComparator.ts","../src/generators/manifest/hooks/navigationFallback.ts","../src/generators/manifest/index.ts","../src/utils/uri.ts","../src/archives/createArchiveFromUrls.ts","../src/utils/blobToBAse64.ts","../src/archives/createArchiveFromText.ts","../src/archives/createArchiveFromJszip.ts","../src/archives/createArchiveFromLibArchive.ts","../src/archives/createArchiveFromArrayBufferList.ts","../src/configure.ts","../src/archives/archiveLoader.ts","../src/Streamer.ts","../src/ServiceWorkerStreamer.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nlet enabled = false\n\nexport const Report = {\n enable: (enable: boolean) => {\n enabled = enable\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n log: (...data: any[]) => {\n if (enabled) {\n // eslint-disable-next-line no-console\n console.log(`[prose-reader-streamer]`, ...data)\n }\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n warn: (...data: any[]) => {\n if (enabled) {\n // eslint-disable-next-line no-console\n console.warn(`[prose-reader-streamer]`, ...data)\n }\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n error: (...data: any[]) => {\n // eslint-disable-next-line no-console\n console.error(...data)\n },\n time: (label?: string | undefined) => {\n if (enabled) {\n // eslint-disable-next-line no-console\n console.time(`[prose-reader-streamer] [metric] ${label}`)\n }\n },\n timeEnd: (label?: string | undefined) => {\n if (enabled) {\n // eslint-disable-next-line no-console\n console.timeEnd(`[prose-reader-streamer] [metric] ${label}`)\n }\n },\n metric: (\n performanceEntry: { name: string; duration: number },\n targetDuration = Infinity,\n ) => {\n const duration =\n typeof performanceEntry === `number`\n ? performanceEntry\n : performanceEntry.duration\n if (enabled) {\n if (performanceEntry.duration <= targetDuration) {\n // eslint-disable-next-line no-console\n console.log(\n `[prose-reader-streamer] [metric] `,\n `${performanceEntry.name} took ${duration}ms`,\n )\n } else {\n // eslint-disable-next-line no-console\n console.warn(\n `[prose-reader-streamer] [metric] `,\n `${performanceEntry.name} took ${performanceEntry.duration}ms which is above the ${targetDuration}ms target for this function`,\n )\n }\n }\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n measurePerformance: <F extends (...args: any[]) => any>(\n name: string,\n targetDuration = 10,\n functionToMeasure: F,\n ) => {\n return (...args: Parameters<F>): ReturnType<F> => {\n const t0 = performance.now()\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const response = functionToMeasure(...(args as any))\n\n if (response && response.then) {\n return response.then((res: any) => {\n const t1 = performance.now()\n Report.metric({ name, duration: t1 - t0 }, targetDuration)\n return res\n })\n }\n\n const t1 = performance.now()\n Report.metric({ name, duration: t1 - t0 }, targetDuration)\n\n return response\n }\n },\n}\n","import { XmlDocument } from \"xmldoc\"\nimport { Archive } from \"../../../archives/types\"\nimport { HookResource } from \"./types\"\n\nconst hasCalibreCoverMeta = (doc: XmlDocument) => {\n const metaElm = doc\n .descendantWithPath(\"head\")\n ?.childrenNamed(\"meta\")\n .find((node) => node.attr.name === \"calibre:cover\")\n\n return !!(metaElm && metaElm.attr.name === \"calibre:cover\")\n}\n\nconst getBuggyCoverSvg = (doc: XmlDocument) => {\n return doc\n .descendantWithPath(\"body\")\n ?.descendantWithPath(\"div\")\n ?.childrenNamed(\"svg\")\n ?.find(\n (node) =>\n node.attr.width === \"100%\" && node.attr.preserveAspectRatio === \"none\",\n )\n}\n\nconst fixBuggyCover =\n ({ archive, resourcePath }: { archive: Archive; resourcePath: string }) =>\n async (resource: HookResource): Promise<HookResource> => {\n const file = Object.values(archive.files).find(\n (file) => file.uri === resourcePath,\n )\n\n if (file?.basename.endsWith(`.xhtml`)) {\n const bodyToParse = resource.body ?? (await file.string())\n\n const opfXmlDoc = new XmlDocument(bodyToParse)\n\n if (hasCalibreCoverMeta(opfXmlDoc)) {\n const buggySvg = getBuggyCoverSvg(opfXmlDoc)\n\n if (buggySvg) {\n delete buggySvg.attr.preserveAspectRatio\n }\n\n return {\n ...resource,\n body: opfXmlDoc?.toString(),\n }\n }\n }\n\n return resource\n }\n\nexport const calibreFixHook =\n ({ archive, resourcePath }: { archive: Archive; resourcePath: string }) =>\n async (resource: HookResource): Promise<HookResource> => {\n return fixBuggyCover({ archive, resourcePath })(resource)\n }\n","import { Archive } from \"../../../archives/types\"\nimport { HookResource } from \"./types\"\n\nexport const cssFixHook =\n ({ archive, resourcePath }: { archive: Archive; resourcePath: string }) =>\n async (resource: HookResource): Promise<HookResource> => {\n const file = Object.values(archive.files).find(\n (file) => file.uri === resourcePath,\n )\n\n if (file?.basename.endsWith(`.css`)) {\n const bodyToParse = resource.body ?? (await file.string())\n\n /**\n * Fix the potentially invalid writing mode present on some vertical book.\n * This has the benefit of making it compatible with firefox as well.\n */\n const newBody = bodyToParse.replaceAll(\n `-webkit-writing-mode`,\n `writing-mode`,\n )\n\n return {\n ...resource,\n body: newBody,\n }\n }\n\n return resource\n }\n","import { Archive } from \"./types\"\n\nexport const getArchiveOpfInfo = (archive: Archive) => {\n const filesAsArray = Object.values(archive.files).filter((file) => !file.dir)\n const file = filesAsArray.find((file) => file.uri.endsWith(`.opf`))\n\n return {\n data: file,\n basePath: file?.uri.substring(0, file.uri.lastIndexOf(`/`)) || ``,\n }\n}\n","import xmldoc, { XmlElement } from \"xmldoc\"\nimport type { Manifest } from \"@prose-reader/shared\"\nimport { Archive, getArchiveOpfInfo } from \"..\"\nimport { urlJoin } from \"@prose-reader/shared\"\n\ntype Toc = NonNullable<Manifest[`nav`]>[`toc`]\ntype TocItem = NonNullable<Manifest[`nav`]>[`toc`][number]\n\nconst extractNavChapter = (\n li: XmlElement,\n { opfBasePath, baseUrl }: { opfBasePath: string; baseUrl: string },\n) => {\n const chp: TocItem = {\n contents: [],\n path: ``,\n href: ``,\n title: ``,\n }\n let contentNode = li.childNamed(`span`) || li.childNamed(`a`)\n chp.title = contentNode?.attr.title || contentNode?.val.trim() || chp.title\n let node = contentNode?.name\n if (node !== `a`) {\n contentNode = li.descendantWithPath(`${node}.a`)\n if (contentNode) {\n node = contentNode.name.toLowerCase()\n }\n }\n if (node === `a` && contentNode?.attr.href) {\n chp.path = urlJoin(opfBasePath, contentNode.attr.href)\n chp.href = urlJoin(baseUrl, opfBasePath, contentNode.attr.href)\n }\n const sublistNode = li.childNamed(`ol`)\n if (sublistNode) {\n const children = sublistNode.childrenNamed(`li`)\n if (children && children.length > 0) {\n chp.contents = children.map((child) =>\n extractNavChapter(child, { opfBasePath, baseUrl }),\n )\n }\n }\n\n return chp\n}\n\nconst buildTOCFromNav = (\n doc: xmldoc.XmlDocument,\n { opfBasePath, baseUrl }: { opfBasePath: string; baseUrl: string },\n) => {\n const toc: Toc = []\n\n let navDataChildren\n if (doc.descendantWithPath(`body.nav.ol`)) {\n navDataChildren = doc.descendantWithPath(`body.nav.ol`)?.children\n } else if (doc.descendantWithPath(`body.section.nav.ol`)) {\n navDataChildren = doc.descendantWithPath(`body.section.nav.ol`)?.children\n }\n\n if (navDataChildren && navDataChildren.length > 0) {\n navDataChildren\n .filter((li) => (li as XmlElement).name === `li`)\n .forEach((li) =>\n toc.push(extractNavChapter(li as XmlElement, { opfBasePath, baseUrl })),\n )\n }\n\n return toc\n}\n\nconst parseTocFromNavPath = async (\n opfXmlDoc: xmldoc.XmlDocument,\n archive: Archive,\n { opfBasePath, baseUrl }: { opfBasePath: string; baseUrl: string },\n) => {\n // Try to detect if there is a nav item\n const navItem = opfXmlDoc\n .childNamed(`manifest`)\n ?.childrenNamed(`item`)\n .find((child) => child.attr.properties === `nav`)\n\n if (navItem) {\n const tocFile = Object.values(archive.files).find((item) =>\n item.uri.endsWith(navItem.attr.href || ``),\n )\n if (tocFile) {\n const doc = new xmldoc.XmlDocument(await tocFile.string())\n return buildTOCFromNav(doc, { opfBasePath, baseUrl })\n }\n }\n}\n\nconst mapNcxChapter = (\n point: xmldoc.XmlElement,\n {\n opfBasePath,\n baseUrl,\n prefix,\n }: { opfBasePath: string; baseUrl: string; prefix: string },\n) => {\n const src = point?.childNamed(`${prefix}content`)?.attr.src || ``\n\n const out: TocItem = {\n title:\n point?.descendantWithPath(`${prefix}navLabel.${prefix}text`)?.val || ``,\n path: urlJoin(opfBasePath, src),\n href: urlJoin(baseUrl, opfBasePath, src),\n contents: [],\n }\n const children = point.childrenNamed(`${prefix}navPoint`)\n if (children && children.length > 0) {\n out.contents = children.map((pt) =>\n mapNcxChapter(pt, { opfBasePath, baseUrl, prefix }),\n )\n }\n\n return out\n}\n\nconst buildTOCFromNCX = (\n ncxData: xmldoc.XmlDocument,\n { opfBasePath, baseUrl }: { opfBasePath: string; baseUrl: string },\n) => {\n const toc: NonNullable<Manifest[`nav`]>[`toc`] = []\n\n const rootTagName = ncxData.name\n let prefix = ``\n if (rootTagName.indexOf(`:`) !== -1) {\n prefix = rootTagName.split(`:`)[0] + `:`\n }\n\n ncxData\n .childNamed(`${prefix}navMap`)\n ?.childrenNamed(`${prefix}navPoint`)\n .forEach((point) =>\n toc.push(mapNcxChapter(point, { opfBasePath, baseUrl, prefix })),\n )\n\n return toc\n}\n\nconst parseTocFromNcx = async ({\n opfData,\n opfBasePath,\n baseUrl,\n archive,\n}: {\n opfData: xmldoc.XmlDocument\n opfBasePath: string\n archive: Archive\n baseUrl: string\n}) => {\n const spine = opfData.childNamed(`spine`)\n const ncxId = spine && spine.attr.toc\n\n if (ncxId) {\n const ncxItem = opfData\n .childNamed(`manifest`)\n ?.childrenNamed(`item`)\n .find((item) => item.attr.id === ncxId)\n\n if (ncxItem) {\n const ncxPath = `${opfBasePath}${opfBasePath === `` ? `` : `/`}${ncxItem.attr.href}`\n\n const file = Object.values(archive.files).find((item) =>\n item.uri.endsWith(ncxPath),\n )\n\n if (file) {\n const ncxData = new xmldoc.XmlDocument(await file.string())\n\n return buildTOCFromNCX(ncxData, { opfBasePath, baseUrl })\n }\n }\n }\n}\n\nexport const parseToc = async (\n opfXmlDoc: xmldoc.XmlDocument,\n archive: Archive,\n { baseUrl }: { baseUrl: string },\n) => {\n const { basePath: opfBasePath } = getArchiveOpfInfo(archive) || {}\n\n const tocFromNcx = await parseTocFromNcx({\n opfData: opfXmlDoc,\n opfBasePath,\n archive,\n baseUrl,\n })\n\n if (tocFromNcx) {\n return tocFromNcx\n }\n\n return await parseTocFromNavPath(opfXmlDoc, archive, { opfBasePath, baseUrl })\n}\n","import xmldoc from \"xmldoc\"\nimport { Archive } from \"..\"\n\ntype KoboInformation = {\n renditionLayout?: `reflowable` | `pre-paginated` | undefined\n}\n\nexport const extractKoboInformationFromArchive = async (archive: Archive) => {\n const koboInformation: KoboInformation = {\n renditionLayout: undefined,\n }\n\n await Promise.all(\n archive.files.map(async (file) => {\n if (file.uri.endsWith(`com.kobobooks.display-options.xml`)) {\n const opfXmlDoc = new xmldoc.XmlDocument(await file.string())\n const optionElement = opfXmlDoc\n .childNamed(`platform`)\n ?.childNamed(`option`)\n if (\n optionElement?.attr?.name === `fixed-layout` &&\n optionElement.val === `true`\n ) {\n koboInformation.renditionLayout = `pre-paginated`\n }\n }\n }),\n )\n\n return koboInformation\n}\n","import xmldoc from \"xmldoc\"\nimport { getArchiveOpfInfo } from \"../archives/getArchiveOpfInfo\"\nimport { Archive } from \"../archives/types\"\n\nexport const getSpineItemFilesFromArchive = async ({\n archive,\n}: {\n archive: Archive\n}) => {\n const { data: opsFile, basePath: opfBasePath } =\n getArchiveOpfInfo(archive) || {}\n\n const data = await opsFile?.string()\n\n if (!data) return []\n\n const _opfXmlDoc = new xmldoc.XmlDocument(data)\n\n const manifestElm = _opfXmlDoc.childNamed(`manifest`)\n const spineElm = _opfXmlDoc.childNamed(`spine`)\n\n const spineItemIds = spineElm\n ?.childrenNamed(`itemref`)\n .map((item) => item.attr.idref) as string[]\n const manifestItemsFromSpine =\n manifestElm\n ?.childrenNamed(`item`)\n .filter((item) => spineItemIds.includes(item.attr.id || ``)) || []\n\n const archiveSpineItems = archive.files.filter((file) => {\n return manifestItemsFromSpine.find((item) => {\n if (!opfBasePath) return `${item.attr.href}` === file.uri\n return `${opfBasePath}/${item.attr.href}` === file.uri\n })\n })\n\n return archiveSpineItems\n}\n","import xmldoc from \"xmldoc\"\nimport { parseToc } from \"../../../parsers/nav\"\nimport type { Manifest } from \"@prose-reader/shared\"\nimport { extractKoboInformationFromArchive } from \"../../../parsers/kobo\"\nimport { Report } from \"../../../report\"\nimport { Archive } from \"../../../archives/types\"\nimport { getArchiveOpfInfo } from \"../../../archives/getArchiveOpfInfo\"\nimport { getSpineItemFilesFromArchive } from \"../../../epub/getSpineItemFilesFromArchive\"\n\ntype SpineItemProperties =\n | `rendition:layout-reflowable`\n | `page-spread-left`\n | `page-spread-right`\n\nexport const getItemsFromDoc = (doc: xmldoc.XmlDocument) => {\n const manifestElm = doc.childNamed(`manifest`)\n\n return (\n manifestElm?.childrenNamed(`item`)?.map((el) => ({\n href: el.attr.href || ``,\n id: el.attr.id || ``,\n mediaType: el.attr[`media-type`],\n })) || []\n )\n}\n\nexport const epubHook =\n ({ archive, baseUrl }: { archive: Archive; baseUrl: string }) =>\n async (manifest: Manifest): Promise<Manifest> => {\n const { data: opsFile, basePath: opfBasePath } =\n getArchiveOpfInfo(archive) || {}\n const koboInformation = await extractKoboInformationFromArchive(archive)\n\n if (!opsFile) {\n return manifest\n }\n\n const data = await opsFile.string()\n\n Report.log(data, koboInformation)\n\n const opfXmlDoc = new xmldoc.XmlDocument(data)\n\n const toc = (await parseToc(opfXmlDoc, archive, { baseUrl })) || []\n\n const metadataElm = opfXmlDoc.childNamed(`metadata`)\n const manifestElm = opfXmlDoc.childNamed(`manifest`)\n const spineElm = opfXmlDoc.childNamed(`spine`)\n const guideElm = opfXmlDoc.childNamed(`guide`)\n const titleElm = metadataElm?.childNamed(`dc:title`)\n const metaElmChildren = metadataElm?.childrenNamed(`meta`) || []\n const metaElmWithRendition = metaElmChildren.find(\n (meta) => meta.attr.property === `rendition:layout`,\n )\n const metaElmWithRenditionFlow = metaElmChildren.find(\n (meta) => meta.attr.property === `rendition:flow`,\n )\n const metaElmWithRenditionSpread = metaElmChildren.find(\n (meta) => meta.attr.property === `rendition:spread`,\n )\n\n const publisherRenditionLayout = metaElmWithRendition?.val as\n | `reflowable`\n | `pre-paginated`\n | undefined\n const publisherRenditionFlow = metaElmWithRenditionFlow?.val as\n | `scrolled-continuous`\n | `scrolled-doc`\n | `paginated`\n | `auto`\n | undefined\n const renditionSpread = metaElmWithRenditionSpread?.val as\n | `auto`\n | undefined\n\n const title =\n titleElm?.val || archive.files.find(({ dir }) => dir)?.basename || ``\n const pageProgressionDirection = spineElm?.attr[\n `page-progression-direction`\n ] as `ltr` | `rtl` | undefined\n\n const archiveSpineItems = await getSpineItemFilesFromArchive({ archive })\n\n const totalSize = archiveSpineItems.reduce(\n (size, file) => file.size + size,\n 0,\n )\n\n return {\n filename: archive.filename,\n nav: {\n toc,\n },\n renditionLayout:\n publisherRenditionLayout ||\n koboInformation.renditionLayout ||\n `reflowable`,\n renditionFlow: publisherRenditionFlow || `auto`,\n renditionSpread,\n title,\n readingDirection: pageProgressionDirection || `ltr`,\n spineItems:\n spineElm?.childrenNamed(`itemref`).map((itemrefElm) => {\n const manifestItem = manifestElm\n ?.childrenNamed(`item`)\n .find((item) => item.attr.id === itemrefElm?.attr.idref)\n const href = manifestItem?.attr.href || ``\n const properties = (itemrefElm?.attr.properties?.split(` `) ||\n []) as SpineItemProperties[]\n const itemSize =\n archive.files.find((file) => file.uri.endsWith(href))?.size || 0\n\n // we use base url or nothing (and stay relative)\n const hrefBaseUri = baseUrl ?? \"\"\n\n return {\n id: manifestItem?.attr.id || ``,\n href: manifestItem?.attr.href?.startsWith(`https://`)\n ? manifestItem?.attr.href\n : opfBasePath\n ? `${hrefBaseUri}${opfBasePath}/${manifestItem?.attr.href}`\n : `${hrefBaseUri}${manifestItem?.attr.href}`,\n renditionLayout: publisherRenditionLayout || `reflowable`,\n ...(properties.find(\n (property) => property === `rendition:layout-reflowable`,\n ) && {\n renditionLayout: `reflowable`,\n }),\n progressionWeight: itemSize / totalSize,\n pageSpreadLeft:\n properties.some((property) => property === `page-spread-left`) ||\n undefined,\n pageSpreadRight:\n properties.some((property) => property === `page-spread-right`) ||\n undefined,\n // size: itemSize\n mediaType: manifestItem?.attr[`media-type`],\n }\n }) || [],\n items: getItemsFromDoc(opfXmlDoc),\n guide: guideElm?.childrenNamed(`reference`).map((elm) => {\n return {\n href: elm.attr.href || ``,\n title: elm.attr.title || ``,\n type: elm.attr.type as NonNullable<Manifest[`guide`]>[number][`type`],\n }\n }),\n }\n }\n","import { getArchiveOpfInfo } from \"../../../archives/getArchiveOpfInfo\"\nimport { Archive } from \"../../../archives/types\"\nimport { getItemsFromDoc } from \"../../manifest/hooks/epub\"\nimport xmldoc from \"xmldoc\"\nimport { HookResource } from \"./types\"\n\nconst getMetadata = async (archive: Archive, resourcePath: string) => {\n const opfInfo = getArchiveOpfInfo(archive)\n const data = await opfInfo.data?.string()\n\n if (data) {\n const opfXmlDoc = new xmldoc.XmlDocument(data)\n const items = getItemsFromDoc(opfXmlDoc)\n\n return {\n mediaType: items.find((item) => resourcePath.endsWith(item.href))\n ?.mediaType,\n }\n }\n\n return {\n mediaType: getContentTypeFromExtension(resourcePath),\n }\n}\n\nconst getContentTypeFromExtension = (uri: string) => {\n if (uri.endsWith(`.css`)) {\n return `text/css; charset=UTF-8`\n }\n if (uri.endsWith(`.jpg`)) {\n return `image/jpg`\n }\n if (uri.endsWith(`.xhtml`)) {\n return `application/xhtml+xml`\n }\n if (uri.endsWith(`.mp4`)) {\n return `video/mp4`\n }\n if (uri.endsWith(`.svg`)) {\n return `image/svg+xml`\n }\n}\n\nexport const defaultHook =\n ({ archive, resourcePath }: { archive: Archive; resourcePath: string }) =>\n async (resource: HookResource): Promise<HookResource> => {\n const file = Object.values(archive.files).find(\n (file) => file.uri === resourcePath,\n )\n\n if (!file) return resource\n\n // if (file.stream) {\n // const stream = file.stream()\n\n // console.log(file, stream)\n // stream.on(`data`, data => {\n // console.log(`data`, data)\n // })\n // stream.on(`error`, data => {\n // console.error(`error`, data)\n // })\n // stream.on(`end`, () => {\n // console.log(`end`)\n // })\n\n // }\n\n // const stream = file.stream!()\n\n // const readableStream = new ReadableStream({\n // start(controller) {\n // function push() {\n // stream.on(`data`, data => {\n // controller.enqueue(data)\n // })\n // stream.on(`error`, data => {\n // console.error(`error`, data)\n // })\n // stream.on(`end`, () => {\n // controller.close()\n // })\n\n // stream.resume()\n // }\n\n // push();\n // }\n // })\n\n const metadata = await getMetadata(archive, resourcePath)\n\n return {\n ...resource,\n params: {\n ...resource.params,\n status: 200,\n headers: {\n ...(file?.encodingFormat && {\n \"Content-Type\": file.encodingFormat,\n }),\n ...(metadata.mediaType && {\n \"Content-Type\": metadata.mediaType,\n }),\n },\n },\n }\n }\n","import { PROSE_READER_RESOURCE_ERROR_INJECTED_META_NAME } from \"@prose-reader/shared\"\nimport { Archive } from \"../..\"\nimport { Report } from \"../../report\"\nimport { calibreFixHook } from \"./hooks/calibreFixHook\"\nimport { cssFixHook } from \"./hooks/cssFixHook\"\nimport { defaultHook } from \"./hooks/defaultHook\"\nimport { HookResource } from \"./hooks/types\"\n\nexport const generateResourceFromArchive = async (\n archive: Archive,\n resourcePath: string,\n) => {\n const file = Object.values(archive.files).find(\n (file) => file.uri === resourcePath,\n )\n\n if (!file) {\n throw new Error(`no file found`)\n }\n\n const defaultResource: HookResource = {\n params: {\n status: 200,\n },\n }\n\n const hooks = [\n defaultHook({ archive, resourcePath }),\n cssFixHook({ archive, resourcePath }),\n calibreFixHook({ archive, resourcePath }),\n ]\n\n try {\n const resource = await hooks.reduce(async (manifest, gen) => {\n return await gen(await manifest)\n }, Promise.resolve(defaultResource))\n\n Report.log(\"Generated resource\", resourcePath, resource)\n\n return {\n ...resource,\n body: resource.body || (await file.blob()),\n }\n } catch (e) {\n Report.error(e)\n\n throw e\n }\n}\n\nexport const generateResourceFromError = (error: unknown) => {\n return {\n body: `\n <!DOCTYPE html>\n <html xmlns=\"http://www.w3.org/1999/xhtml\" xmlns:epub=\"http://www.idpf.org/2007/ops\" xml:lang=\"en\" lang=\"en\">\n <head>\n <meta name=\"${PROSE_READER_RESOURCE_ERROR_INJECTED_META_NAME}\" content=\"${String(error)}\" />\n </head>\n <body>\n <pre>${String(error)}</pre>\n </body>\n </html>\n `,\n params: {\n status: 500,\n headers: {\n \"Content-Type\": \"text/html;charset=UTF-8\",\n },\n },\n }\n}\n\n// (() => {\n// fetch(\"https://miro.medium.com/fit/c/64/64/1*dmbNkD5D-u45r44go_cf0g.png\").then(async (response) => {\n// console.log(\"asdasd\")\n// const s = await response.text()\n// console.log(s)\n// debugger\n// }).catch(console.error)\n// })()\n","import { Manifest } from \"@prose-reader/shared\"\nimport { Archive } from \"../../../archives/types\"\n\nexport const defaultHook =\n ({ archive, baseUrl }: { archive: Archive; baseUrl: string }) =>\n async (): Promise<Manifest> => {\n const files = Object.values(archive.files).filter((file) => !file.dir)\n\n return {\n filename: archive.filename,\n title:\n archive.files.find(({ dir }) => dir)?.basename.replace(/\\/$/, ``) || ``,\n renditionLayout: `pre-paginated`,\n renditionSpread: `auto`,\n readingDirection: `ltr`,\n spineItems: files\n .filter((file) => !file.basename.endsWith(`.db`))\n .map((file, index) => ({\n // some books such as cbz can have same basename inside different sub folder\n // we need to make sure to have unique index\n // /chap01/01.png, /chap02/01.png, etc\n id: `${index}.${file.basename}`,\n href: encodeURI(`${baseUrl}${file.uri}`),\n renditionLayout: `pre-paginated`,\n progressionWeight: 1 / files.length,\n pageSpreadLeft: undefined,\n pageSpreadRight: undefined,\n mediaType: file.encodingFormat,\n })),\n items: files.map((file, index) => ({\n id: `${index}.${file.basename}`,\n href: `${baseUrl}${file.uri}`,\n })),\n }\n }\n","import { Manifest } from \"@prose-reader/shared\"\nimport xmldoc from \"xmldoc\"\nimport { Archive } from \"../../../archives/types\"\n\n/**\n * Handle archive which contains ComicInfo.xml. This is a meta file\n * used to define cbz, etc. I believe it comes from some sites or apps.\n */\nexport const comicInfoHook =\n ({ archive }: { archive: Archive; baseUrl: string }) =>\n async (manifest: Manifest): Promise<Manifest> => {\n const comicInfoFile = archive.files.find(\n (file) => file.basename.toLowerCase() === `comicinfo.xml`,\n )\n\n if (!comicInfoFile) {\n return manifest\n }\n\n const manifestWithoutComicInfo = {\n ...manifest,\n spineItems: manifest.spineItems\n .filter((item) => !item.id.toLowerCase().endsWith(`comicinfo.xml`))\n .map((item, _, items) => ({\n ...item,\n progressionWeight: 1 / items.length,\n })),\n }\n\n // @todo handle more meta\n const content = await comicInfoFile.string()\n\n try {\n const xmlDoc = new xmldoc.XmlDocument(content)\n\n const mangaVal =\n (xmlDoc.childNamed(`Manga`)?.val as `YesAndRightToLeft`) || `unknown`\n\n return {\n ...manifestWithoutComicInfo,\n readingDirection: mangaVal === `YesAndRightToLeft` ? `rtl` : `ltr`,\n }\n } catch (e) {\n console.error(\"Unable to parse comicinfo.xml for content\\n\", content)\n console.error(e)\n\n return manifestWithoutComicInfo\n }\n }\n","import { isXmlBasedMimeType, Manifest } from \"@prose-reader/shared\"\nimport xmldoc from \"xmldoc\"\nimport { Archive } from \"../../../archives/types\"\nimport { getSpineItemFilesFromArchive } from \"../../../epub/getSpineItemFilesFromArchive\"\n\nconst hasDocMetaViewport = (doc: xmldoc.XmlDocument) => {\n const metaElm = doc\n .descendantWithPath(\"head\")\n ?.childrenNamed(\"meta\")\n .find((node) => node.attr.name === \"viewport\")\n\n return !!(metaElm && metaElm.attr.name === \"viewport\")\n}\n\nconst allFilesHaveViewportMeta = (files: Archive[\"files\"]) =>\n files.reduce(async (result, current) => {\n const _result = await result\n\n if (!_result) return false\n\n if (\n !isXmlBasedMimeType({\n mimeType: current.encodingFormat,\n uri: current.uri,\n })\n ) {\n return false\n }\n\n const file = await current.string()\n\n if (!file) return false\n\n return hasDocMetaViewport(new xmldoc.XmlDocument(file))\n }, Promise.resolve(true))\n\nexport const epubOptimizerHook =\n ({ archive }: { archive: Archive; baseUrl: string }) =>\n async (manifest: Manifest): Promise<Manifest> => {\n const bookIsFullReflowable =\n manifest.renditionLayout === \"reflowable\" &&\n manifest.spineItems.every((item) => item.renditionLayout === \"reflowable\")\n\n if (bookIsFullReflowable) {\n const files = await getSpineItemFilesFromArchive({ archive })\n\n const hasAllViewport = await allFilesHaveViewportMeta(files)\n\n if (hasAllViewport) {\n return {\n ...manifest,\n spineItems: manifest.spineItems.map((item) => ({\n ...item,\n renditionLayout: \"pre-paginated\",\n })),\n renditionLayout: \"pre-paginated\",\n }\n }\n }\n\n return manifest\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 } else {\n return (alist[i] || ``).localeCompare(blist[i] || ``)\n }\n }\n }\n\n return 1\n}\n","import { Manifest, urlJoin } from \"@prose-reader/shared\"\nimport { Archive } from \"../../../archives/types\"\nimport { sortByTitleComparator } from \"../../../utils/sortByTitleComparator\"\n\n/**\n * In case no navigation was generated prior to this hook, we will try\n * to generate something based on the structure of the archive.\n *\n * We use folders as chapters.\n */\nexport const navigationFallbackHook =\n ({ archive, baseUrl }: { archive: Archive; baseUrl: string }) =>\n async (manifest: Manifest): Promise<Manifest> => {\n if (manifest.nav) return manifest\n\n const filesSortedByAlpha = [...archive.files].sort((a, b) =>\n sortByTitleComparator(a.uri, b.uri),\n )\n\n const toc: NonNullable<Manifest[\"nav\"]>[\"toc\"] = Object.values(\n filesSortedByAlpha,\n ).reduce(\n (acc, file) => {\n const parts = file.uri.split(\"/\")\n\n // we have a file that is\n const isFileUnderFolder = !file.dir && parts.length > 1\n\n if (isFileUnderFolder) {\n parts.forEach((part, level) => {\n const partIsFileName = level === parts.length - 1\n\n if (partIsFileName) return\n\n const existingTocItem = acc.find(({ title }) => title === part)\n\n if (existingTocItem) {\n // @todo\n } else {\n acc.push({\n contents: [],\n href: urlJoin(baseUrl, encodeURI(file.uri)).replace(/\\/$/, \"\"),\n path: file.uri.replace(/\\/$/, \"\"),\n title: parts[0] ?? \"\",\n })\n }\n })\n }\n\n return acc\n },\n [] as NonNullable<Manifest[\"nav\"]>[\"toc\"],\n )\n\n if (toc.length === 0) return manifest\n\n return {\n ...manifest,\n nav: {\n toc,\n },\n }\n }\n","import type { Manifest } from \"@prose-reader/shared\"\nimport { Report } from \"../../report\"\nimport { Archive } from \"../../archives/types\"\nimport { defaultHook } from \"./hooks/default\"\nimport { epubHook } from \"./hooks/epub\"\nimport { comicInfoHook } from \"./hooks/comicInfo\"\nimport { epubOptimizerHook } from \"./hooks/epubOptimizer\"\nimport { navigationFallbackHook } from \"./hooks/navigationFallback\"\n\nconst baseManifest: Manifest = {\n filename: ``,\n items: [],\n nav: {\n toc: [],\n },\n readingDirection: `ltr`,\n renditionLayout: `pre-paginated`,\n renditionSpread: `auto`,\n spineItems: [],\n title: ``,\n}\n\nexport const generateManifestFromArchive = async (\n archive: Archive,\n { baseUrl = `` }: { baseUrl?: string } = {},\n) => {\n const hooks = [\n defaultHook({ archive, baseUrl }),\n epubHook({ archive, baseUrl }),\n epubOptimizerHook({ archive, baseUrl }),\n comicInfoHook({ archive, baseUrl }),\n navigationFallbackHook({ archive, baseUrl }),\n ]\n\n try {\n const manifest = await hooks.reduce(async (manifest, gen) => {\n return await gen(await manifest)\n }, Promise.resolve(baseManifest))\n\n Report.log(\"Generated manifest\", manifest)\n\n return manifest\n } catch (e) {\n Report.error(e)\n\n throw e\n }\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","import { detectMimeTypeFromName } from \"@prose-reader/shared\"\nimport { getUriBasename } from \"../utils/uri\"\nimport { Archive } from \"./types\"\n\n/**\n * @important\n * Make sure the urls are on the same origin or the cors header is set otherwise\n * the resource cannot be consumed as it is on the web.\n */\nexport const createArchiveFromUrls = async (\n urls: string[],\n options?: { useRenditionFlow: boolean },\n): Promise<Archive> => {\n const opfFileData = `\n <?xml version=\"1.0\" encoding=\"UTF-8\"?><package xmlns=\"http://www.idpf.org/2007/opf\" version=\"2.0\" unique-identifier=\"bookid\">\n <metadata>\n <meta property=\"rendition:layout\">${options?.useRenditionFlow ? `reflowable` : `pre-paginated`}</meta>\n ${options?.useRenditionFlow ? `<meta property=\"rendition:flow\">scrolled-continuous</meta>` : ``}\n </metadata>\n <manifest>\n ${urls\n .map(\n (url) =>\n `<item id=\"${getUriBasename(url)}\" href=\"${url}\" media-type=\"${detectMimeTypeFromName(url)}\"/>`,\n )\n .join(`\\n`)}\n </manifest>\n <spine>\n ${urls.map((url) => `<itemref idref=\"${getUriBasename(url)}\" />`).join(`\\n`)}\n </spine>\n </package>\n `\n\n const filesFromUrl: Archive[`files`] = urls.map((url) => ({\n dir: false,\n basename: getUriBasename(url),\n encodingFormat: detectMimeTypeFromName(url),\n uri: url,\n size: 100 / urls.length,\n base64: async () => ``,\n blob: async () => new Blob(),\n string: async () => ``,\n }))\n\n const opfFile: Archive[`files`][number] = {\n dir: false,\n basename: `content.opf`,\n uri: `content.opf`,\n size: 0,\n base64: async () => opfFileData,\n blob: async () => new Blob(),\n string: async () => opfFileData,\n }\n\n return {\n filename: ``,\n files: [opfFile, ...filesFromUrl],\n close: () => Promise.resolve(),\n }\n}\n","export const blobToBase64 = async (blob: Blob) =>\n new Promise<string>((resolve) => {\n const reader = new FileReader()\n reader.readAsDataURL(blob)\n reader.onloadend = function () {\n const base64data = reader.result as string\n resolve(base64data)\n }\n })\n","import { blobToBase64 } from \"../utils/blobToBAse64\"\nimport { getUriBasename } from \"../utils/uri\"\nimport { Archive } from \"./types\"\n\n/**\n * Useful to create archive from txt content\n */\nexport const createArchiveFromText = async (\n content: string | Blob,\n {\n mimeType,\n direction,\n }: {\n direction?: `ltr` | `rtl`\n mimeType?: string\n } = { mimeType: \"text/plain\" },\n) => {\n const txtOpfContent = `\n <?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <package xmlns=\"http://www.idpf.org/2007/opf\" version=\"3.0\" xml:lang=\"ja\" prefix=\"rendition: http://www.idpf.org/vocab/rendition/#\"\n unique-identifier=\"ootuya-id\">\n <metadata xmlns:opf=\"http://www.idpf.org/2007/opf\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\"\n xmlns:dcterms=\"http://purl.org/dc/terms/\">\n <meta property=\"rendition:layout\">reflowable</meta>\n </metadata>\n <manifest>\n <item id=\"p01\" href=\"p01.txt\" media-type=\"text/plain\"/>\n </manifest>\n <spine page-progression-direction=\"${direction ?? `ltr`}\">\n <itemref idref=\"p01\" />\n </spine>\n </package>\n `\n\n const archive: Archive = {\n filename: `content.txt`,\n files: [\n {\n dir: false,\n basename: getUriBasename(`generated.opf`),\n uri: `generated.opf`,\n blob: async () => new Blob([txtOpfContent]),\n string: async () => txtOpfContent,\n base64: async () => btoa(txtOpfContent),\n size: 0,\n },\n {\n dir: false,\n basename: getUriBasename(`p01.txt`),\n uri: `p01.txt`,\n blob: async () => {\n if (typeof content === `string`) return new Blob([content])\n return content\n },\n string: async () => {\n if (typeof content === `string`) return content\n return content.text()\n },\n base64: async () => {\n if (typeof content === `string`) return btoa(content)\n return blobToBase64(content)\n },\n size: typeof content === `string` ? content.length : content.size,\n encodingFormat: mimeType,\n },\n ],\n close: () => Promise.resolve(),\n }\n\n return archive\n}\n","import { Report } from \"../report\"\nimport { sortByTitleComparator } from \"../utils/sortByTitleComparator\"\nimport { getUriBasename } from \"../utils/uri\"\nimport { Archive, StreamResult } from \"./types\"\n\ninterface OutputByType {\n base64: string\n string: string\n text: string\n binarystring: string\n array: number[]\n uint8array: Uint8Array\n arraybuffer: ArrayBuffer\n blob: Blob\n nodebuffer: Buffer\n}\n\ntype OutputType = keyof OutputByType\ninterface JSZipObject {\n name: string\n dir: boolean\n date: Date\n comment: string\n unixPermissions: number | string | null\n dosPermissions: number | null\n async<T extends OutputType>(type: T): Promise<OutputByType[T]>\n // nodeStream(type?: `nodebuffer`): NodeJS.ReadableStream;\n internalStream?: (type?: `uint8array`) => StreamResult\n}\n\ninterface JSZip {\n files: { [key: string]: JSZipObject }\n}\n\nexport const createArchiveFromJszip = async (\n jszip: JSZip,\n { orderByAlpha, name }: { orderByAlpha?: boolean; name?: string } = {},\n): Promise<Archive> => {\n let files = Object.values(jszip.files)\n\n if (orderByAlpha) {\n files = files.slice().sort((a, b) => sortByTitleComparator(a.name, b.name))\n }\n\n const archive = {\n filename: name || ``,\n files: files.map((file) => ({\n dir: file.dir,\n basename: getUriBasename(file.name),\n uri: file.name,\n blob: () => file.async(`blob`),\n string: () => file.async(`string`),\n base64: () => file.async(`base64`),\n ...(file.internalStream && {\n stream: file.internalStream,\n }),\n // this is private API\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n size: file._data.uncompressedSize,\n })),\n close: () => Promise.resolve(),\n }\n\n Report.log(\"Generated archive\", archive)\n\n return archive\n}\n","/**\n * @see https://github.com/nika-begiashvili/libarchivejs.\n *\n * Does not work in service worker due to usage of web worker.\n */\n/* eslint-disable @typescript-eslint/ban-types */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { Report } from \"../report\"\nimport { Archive } from \"./types\"\n\ninterface ArchiveReader {\n getFilesArray(): Promise<any[]>\n /**\n * Terminate worker to free up memory\n */\n close(): Promise<void>\n}\n\n/**\n * Represents compressed file before extraction\n */\ninterface CompressedFile {\n /**\n * File name\n */\n get name(): string\n /**\n * File size\n */\n get size(): number\n get lastModified(): number\n /**\n * Extract file from archive\n * @returns {Promise<File>} extracted file\n */\n extract(): any\n}\n\nexport const createArchiveFromLibArchive = async (\n libArchive: ArchiveReader,\n { name }: { orderByAlpha?: boolean; name?: string } = {},\n): Promise<Archive> => {\n const objArray = await libArchive.getFilesArray()\n\n const archive: Archive = {\n close: () => libArchive.close(),\n filename: name ?? ``,\n files: objArray.map((item: { file: CompressedFile; path: string }) => ({\n dir: false,\n basename: item.file.name,\n size: item.file.size,\n uri: `${item.path}${item.file.name}`,\n base64: async () => {\n return ``\n },\n blob: async () => {\n const file = await (item.file.extract() as Promise<File>)\n\n return file\n },\n string: async () => {\n const file = await (item.file.extract() as Promise<File>)\n\n return file.text()\n },\n })),\n }\n\n Report.log(\"Generated archive\", archive)\n\n return archive\n}\n","import { sortByTitleComparator } from \"../utils/sortByTitleComparator\"\nimport { getUriBasename } from \"../utils/uri\"\nimport { Archive } from \"./types\"\n\nexport const createArchiveFromArrayBufferList = async (\n list: {\n isDir: boolean\n name: string\n size: number\n data: () => Promise<ArrayBuffer>\n }[],\n { orderByAlpha, name }: { orderByAlpha?: boolean; name?: string } = {},\n): Promise<Archive> => {\n let files = list\n\n if (orderByAlpha) {\n files = files.slice().sort((a, b) => sortByTitleComparator(a.name, b.name))\n }\n\n return {\n filename: name || ``,\n files: files.map((file) => ({\n dir: file.isDir,\n basename: getUriBasename(file.name),\n uri: file.name,\n blob: async () => new Blob([await file.data()]),\n string: async () => {\n const data = await file.data()\n return String.fromCharCode.apply(\n null,\n Array.from(new Uint16Array(data)),\n )\n },\n base64: async () => {\n // @todo not used for now, lets implement it later if needed\n return ``\n },\n size: file.size,\n })),\n close: () => Promise.resolve(),\n }\n}\n","import { Report } from \"./report\"\n\nexport const configure = ({\n enableReport,\n}: { enableReport?: boolean } = {}) => {\n Report.enable(!!enableReport)\n}\n","import {\n BehaviorSubject,\n catchError,\n distinctUntilChanged,\n EMPTY,\n filter,\n first,\n from,\n ignoreElements,\n map,\n merge,\n mergeMap,\n NEVER,\n shareReplay,\n Subject,\n switchMap,\n takeUntil,\n tap,\n timer,\n} from \"rxjs\"\nimport { Archive } from \"./types\"\n\ntype ArchiveEntry = {\n status: \"idle\" | \"loading\" | \"success\" | \"error\"\n error: unknown\n archive: undefined | Archive\n locks: number\n}\n\nexport const createArchiveLoader = ({\n getArchive,\n cleanArchiveAfter,\n}: {\n getArchive: (key: string) => Promise<Archive>\n cleanArchiveAfter: number\n}) => {\n const loadSubject = new Subject<string>()\n const destroySubject = new Subject<void>()\n const archives: Record<string, BehaviorSubject<ArchiveEntry>> = {}\n\n const archiveLoaded$ = loadSubject.pipe(\n mergeMap((key) => {\n const archiveEntry = archives[key]\n\n if (!archiveEntry || archiveEntry.getValue().status !== \"idle\")\n return EMPTY\n\n archiveEntry.next({\n ...archiveEntry.getValue(),\n status: \"loading\",\n })\n\n return from(getArchive(key)).pipe(\n map((archive) => {\n archiveEntry.next({\n ...archiveEntry.getValue(),\n archive,\n status: \"success\",\n })\n\n return { key, archiveEntry }\n }),\n catchError((error) => {\n archiveEntry.next({\n ...archiveEntry.getValue(),\n status: \"error\",\n error,\n })\n\n throw error\n }),\n )\n }),\n catchError(() => NEVER),\n shareReplay(),\n )\n\n const cleanup$ = archiveLoaded$.pipe(\n switchMap(({ archiveEntry, key }) => {\n const locks$ = archiveEntry.pipe(map(({ locks }) => locks))\n const isUnlocked$ = locks$.pipe(\n map((locks) => locks <= 0),\n distinctUntilChanged(),\n )\n\n return isUnlocked$.pipe(\n switchMap((isUnlocked) =>\n !isUnlocked ? NEVER : timer(cleanArchiveAfter),\n ),\n tap(() => {\n delete archives[key]\n\n archiveEntry.getValue().archive?.close()\n }),\n )\n }),\n )\n\n const access = (key: string) => {\n let releaseCalled = false\n\n const archiveEntry =\n archives[key] ??\n new BehaviorSubject<ArchiveEntry>({\n archive: undefined,\n status: \"idle\",\n locks: 0,\n error: undefined,\n })\n\n archives[key] = archiveEntry\n\n archiveEntry.next({\n ...archiveEntry.getValue(),\n locks: archiveEntry.getValue().locks + 1,\n })\n\n const release = () => {\n if (releaseCalled) return\n\n releaseCalled = true\n\n archiveEntry.next({\n ...archiveEntry.getValue(),\n locks: archiveEntry.getValue().locks - 1,\n })\n }\n\n loadSubject.next(key)\n\n const archive$ = archiveEntry.pipe(\n map(({ archive }) => archive),\n filter((archive) => !!archive),\n )\n\n const error$ = archiveEntry.pipe(\n tap(({ error }) => {\n if (error) {\n throw error\n }\n }),\n ignoreElements(),\n )\n\n return merge(archive$, error$).pipe(\n first(),\n map((archive) => ({ archive, release })),\n catchError((error) => {\n release()\n\n throw error\n }),\n )\n }\n\n merge(cleanup$, archiveLoaded$).pipe(takeUntil(destroySubject)).subscribe()\n\n return {\n access,\n }\n}\n","import {\n catchError,\n finalize,\n from,\n lastValueFrom,\n map,\n mergeMap,\n Observable,\n of,\n switchMap,\n} from \"rxjs\"\nimport { createArchiveLoader } from \"./archives/archiveLoader\"\nimport { Manifest } from \"@prose-reader/shared\"\nimport { generateManifestFromArchive } from \"./generators/manifest\"\nimport { generateResourceFromArchive } from \"./generators/resources\"\nimport { Archive } from \"./archives/types\"\n\ntype OnError = (error: unknown) => Response\ntype OnManifestSuccess = (params: {\n manifest: Manifest\n archive: Archive\n}) => Observable<Manifest> | Promise<Manifest>\n\nexport class Streamer {\n epubLoader: ReturnType<typeof createArchiveLoader>\n onError: OnError = (error) => {\n return new Response(String(error), { status: 500 })\n }\n onManifestSuccess: OnManifestSuccess\n\n constructor({\n onError,\n onManifestSuccess,\n ...rest\n }: Parameters<typeof createArchiveLoader>[0] & {\n onError?: OnError\n onManifestSuccess?: OnManifestSuccess\n }) {\n this.epubLoader = createArchiveLoader(rest)\n\n this.onManifestSuccess =\n onManifestSuccess ?? (({ manifest }) => Promise.resolve(manifest))\n this.onError = onError ?? this.onError\n }\n\n public fetchManifest({ key, baseUrl }: { key: string; baseUrl?: string }) {\n const response$ = this.epubLoader.access(key).pipe(\n mergeMap(({ archive, release }) => {\n const manifest$ = from(\n generateManifestFromArchive(archive, { baseUrl }),\n )\n\n return manifest$.pipe(\n switchMap((manifest) =>\n from(this.onManifestSuccess({ manifest, archive })),\n ),\n map(\n (manifest) =>\n new Response(JSON.stringify(manifest satisfies Manifest), {\n status: 200,\n }),\n ),\n finalize(() => {\n release()\n }),\n )\n }),\n catchError((error) => {\n return of(this.onError(error))\n }),\n )\n\n return lastValueFrom(response$)\n }\n\n public fetchResource({\n key,\n resourcePath,\n }: {\n key: string\n resourcePath: string\n }) {\n const response$ = this.epubLoader.access(key).pipe(\n mergeMap(({ archive, release }) => {\n const manifest$ = from(\n generateResourceFromArchive(archive, resourcePath),\n )\n\n return manifest$.pipe(\n map((resource) => new Response(resource.body, { status: 200 })),\n finalize(() => {\n release()\n }),\n )\n }),\n catchError((error) => {\n return of(this.onError(error))\n }),\n )\n\n return lastValueFrom(response$)\n }\n}\n","import { Streamer } from \"./Streamer\"\nimport { removeTrailingSlash } from \"./utils/uri\"\n\ntype ConflictFreeWebWorkerFetchEvent = {\n readonly request: Request\n /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/FetchEvent/respondWith) */\n respondWith(r: Response | PromiseLike<Response>): void\n}\n\nexport class ServiceWorkerStreamer extends Streamer {\n protected getUriInfo: (event: ConflictFreeWebWorkerFetchEvent) =>\n | {\n baseUrl: string\n }\n | undefined\n\n constructor({\n getUriInfo,\n ...rest\n }: ConstructorParameters<typeof Streamer>[0] & {\n getUriInfo: (event: ConflictFreeWebWorkerFetchEvent) =>\n | {\n baseUrl: string\n }\n | undefined\n }) {\n super(rest)\n\n this.getUriInfo = getUriInfo\n this.fetchEventListener = this.fetchEventListener.bind(this)\n }\n\n fetchEventListener(event: ConflictFreeWebWorkerFetchEvent) {\n try {\n const uriInfo = this.getUriInfo(event)\n\n if (!uriInfo) return\n\n const baseUrl = removeTrailingSlash(uriInfo.baseUrl)\n const streamerPath = event.request.url.substring(\n baseUrl.length + `/`.length,\n )\n const [key = ``] = streamerPath.split(\"/\")\n const resourcePath = decodeURIComponent(\n removeTrailingSlash(streamerPath.substring(key.length + `/`.length)),\n )\n\n if (streamerPath.endsWith(`/manifest`)) {\n event.respondWith(\n this.fetchManifest({ key, baseUrl: `${baseUrl}/${key}/` }),\n )\n } else {\n event.respondWith(this.fetchResource({ key, resourcePath }))\n }\n } catch (e) {\n event.respondWith(new Response(String(e), { status: 500 }))\n }\n }\n}\n"],"names":["enabled","Report","enable","data","label","performanceEntry","targetDuration","duration","name","functionToMeasure","args","t0","response","res","t1","hasCalibreCoverMeta","doc","metaElm","_a","node","getBuggyCoverSvg","_c","_b","fixBuggyCover","archive","resourcePath","resource","file","bodyToParse","opfXmlDoc","XmlDocument","buggySvg","calibreFixHook","cssFixHook","newBody","getArchiveOpfInfo","extractNavChapter","li","opfBasePath","baseUrl","chp","contentNode","urlJoin","sublistNode","children","child","buildTOCFromNav","toc","navDataChildren","parseTocFromNavPath","navItem","tocFile","item","xmldoc","mapNcxChapter","point","prefix","src","out","pt","buildTOCFromNCX","ncxData","rootTagName","parseTocFromNcx","opfData","spine","ncxId","ncxItem","ncxPath","parseToc","tocFromNcx","extractKoboInformationFromArchive","koboInformation","optionElement","getSpineItemFilesFromArchive","opsFile","_opfXmlDoc","manifestElm","spineElm","spineItemIds","manifestItemsFromSpine","getItemsFromDoc","el","epubHook","manifest","metadataElm","guideElm","titleElm","metaElmChildren","metaElmWithRendition","meta","metaElmWithRenditionFlow","metaElmWithRenditionSpread","publisherRenditionLayout","publisherRenditionFlow","renditionSpread","title","dir","pageProgressionDirection","totalSize","size","itemrefElm","manifestItem","href","properties","itemSize","hrefBaseUri","property","elm","getMetadata","getContentTypeFromExtension","uri","defaultHook","metadata","generateResourceFromArchive","defaultResource","hooks","gen","e","generateResourceFromError","error","PROSE_READER_RESOURCE_ERROR_INJECTED_META_NAME","files","index","comicInfoHook","comicInfoFile","manifestWithoutComicInfo","_","items","content","mangaVal","hasDocMetaViewport","allFilesHaveViewportMeta","result","current","isXmlBasedMimeType","epubOptimizerHook","sortByTitleComparator","a","b","alist","blist","i","len","navigationFallbackHook","filesSortedByAlpha","acc","parts","part","level","baseManifest","generateManifestFromArchive","getUriBasename","removeTrailingSlash","createArchiveFromUrls","urls","options","opfFileData","url","detectMimeTypeFromName","filesFromUrl","blobToBase64","blob","resolve","reader","base64data","createArchiveFromText","mimeType","direction","txtOpfContent","createArchiveFromJszip","jszip","orderByAlpha","createArchiveFromLibArchive","libArchive","objArray","createArchiveFromArrayBufferList","list","configure","enableReport","createArchiveLoader","getArchive","cleanArchiveAfter","loadSubject","Subject","destroySubject","archives","archiveLoaded$","mergeMap","key","archiveEntry","EMPTY","from","map","catchError","NEVER","shareReplay","cleanup$","switchMap","locks","distinctUntilChanged","isUnlocked","timer","tap","access","releaseCalled","BehaviorSubject","release","archive$","filter","error$","ignoreElements","merge","first","takeUntil","Streamer","onError","onManifestSuccess","rest","response$","finalize","of","lastValueFrom","ServiceWorkerStreamer","getUriInfo","event","uriInfo","streamerPath"],"mappings":";;;AACA,IAAIA,IAAU;AAEP,MAAMC,IAAS;AAAA,EACpB,QAAQ,CAACC,MAAoB;AACjB,IAAAF,IAAAE;AAAA,EACZ;AAAA;AAAA,EAEA,KAAK,IAAIC,MAAgB;AACvB,IAAIH,KAEM,QAAA,IAAI,2BAA2B,GAAGG,CAAI;AAAA,EAElD;AAAA;AAAA,EAEA,MAAM,IAAIA,MAAgB;AACxB,IAAIH,KAEM,QAAA,KAAK,2BAA2B,GAAGG,CAAI;AAAA,EAEnD;AAAA;AAAA,EAEA,OAAO,IAAIA,MAAgB;AAEjB,YAAA,MAAM,GAAGA,CAAI;AAAA,EACvB;AAAA,EACA,MAAM,CAACC,MAA+B;AACpC,IAAIJ,KAEM,QAAA,KAAK,oCAAoCI,CAAK,EAAE;AAAA,EAE5D;AAAA,EACA,SAAS,CAACA,MAA+B;AACvC,IAAIJ,KAEM,QAAA,QAAQ,oCAAoCI,CAAK,EAAE;AAAA,EAE/D;AAAA,EACA,QAAQ,CACNC,GACAC,IAAiB,UACd;AACH,UAAMC,IACJ,OAAOF,KAAqB,WACxBA,IACAA,EAAiB;AACvB,IAAIL,MACEK,EAAiB,YAAYC,IAEvB,QAAA;AAAA,MACN;AAAA,MACA,GAAGD,EAAiB,IAAI,SAASE,CAAQ;AAAA,IAAA,IAInC,QAAA;AAAA,MACN;AAAA,MACA,GAAGF,EAAiB,IAAI,SAASA,EAAiB,QAAQ,yBAAyBC,CAAc;AAAA,IAAA;AAAA,EAIzG;AAAA;AAAA,EAEA,oBAAoB,CAClBE,GACAF,IAAiB,IACjBG,MAEO,IAAIC,MAAuC;AAC1C,UAAAC,IAAK,YAAY,OAGjBC,IAAWH,EAAkB,GAAIC,CAAY;AAE/C,QAAAE,KAAYA,EAAS;AAChB,aAAAA,EAAS,KAAK,CAACC,MAAa;AAC3BC,cAAAA,IAAK,YAAY;AACvB,eAAAb,EAAO,OAAO,EAAE,MAAAO,GAAM,UAAUM,IAAKH,EAAA,GAAML,CAAc,GAClDO;AAAA,MAAA,CACR;AAGG,UAAAC,IAAK,YAAY;AACvB,WAAAb,EAAO,OAAO,EAAE,MAAAO,GAAM,UAAUM,IAAKH,EAAA,GAAML,CAAc,GAElDM;AAAA,EAAA;AAGb,GCpFMG,KAAsB,CAACC,MAAqB;;AAChD,QAAMC,KAAUC,IAAAF,EACb,mBAAmB,MAAM,MADZ,gBAAAE,EAEZ,cAAc,QACf,KAAK,CAACC,MAASA,EAAK,KAAK,SAAS;AAErC,SAAO,CAAC,EAAEF,KAAWA,EAAQ,KAAK,SAAS;AAC7C,GAEMG,KAAmB,CAACJ,MAAqB;;AACtC,UAAAK,KAAAC,KAAAJ,IAAAF,EACJ,mBAAmB,MAAM,MADrB,gBAAAE,EAEH,mBAAmB,WAFhB,gBAAAI,EAGH,cAAc,WAHX,gBAAAD,EAIH;AAAA,IACA,CAACF,MACCA,EAAK,KAAK,UAAU,UAAUA,EAAK,KAAK,wBAAwB;AAAA;AAExE,GAEMI,KACJ,CAAC,EAAE,SAAAC,GAAS,cAAAC,EAAa,MACzB,OAAOC,MAAkD;AACvD,QAAMC,IAAO,OAAO,OAAOH,EAAQ,KAAK,EAAE;AAAA,IACxC,CAACG,MAASA,EAAK,QAAQF;AAAA,EAAA;AAGzB,MAAIE,KAAA,QAAAA,EAAM,SAAS,SAAS,WAAW;AACrC,UAAMC,IAAcF,EAAS,QAAS,MAAMC,EAAK,OAAO,GAElDE,IAAY,IAAIC,GAAYF,CAAW;AAEzC,QAAAb,GAAoBc,CAAS,GAAG;AAC5B,YAAAE,IAAWX,GAAiBS,CAAS;AAE3C,aAAIE,KACF,OAAOA,EAAS,KAAK,qBAGhB;AAAA,QACL,GAAGL;AAAA,QACH,MAAMG,KAAA,gBAAAA,EAAW;AAAA,MAAS;AAAA,IAE9B;AAAA,EACF;AAEO,SAAAH;AACT,GAEWM,KACX,CAAC,EAAE,SAAAR,GAAS,cAAAC,EAAa,MACzB,OAAOC,MACEH,GAAc,EAAE,SAAAC,GAAS,cAAAC,EAAa,CAAC,EAAEC,CAAQ,GCrD/CO,KACX,CAAC,EAAE,SAAAT,GAAS,cAAAC,EAAa,MACzB,OAAOC,MAAkD;AACvD,QAAMC,IAAO,OAAO,OAAOH,EAAQ,KAAK,EAAE;AAAA,IACxC,CAACG,MAASA,EAAK,QAAQF;AAAA,EAAA;AAGzB,MAAIE,KAAA,QAAAA,EAAM,SAAS,SAAS,SAAS;AAOnC,UAAMO,KANcR,EAAS,QAAS,MAAMC,EAAK,OAAO,GAM5B;AAAA,MAC1B;AAAA,MACA;AAAA,IAAA;AAGK,WAAA;AAAA,MACL,GAAGD;AAAA,MACH,MAAMQ;AAAA,IAAA;AAAA,EAEV;AAEO,SAAAR;AACT,GC3BWS,IAAoB,CAACX,MAAqB;AAE/C,QAAAG,IADe,OAAO,OAAOH,EAAQ,KAAK,EAAE,OAAO,CAACG,MAAS,CAACA,EAAK,GAAG,EAClD,KAAK,CAACA,MAASA,EAAK,IAAI,SAAS,MAAM,CAAC;AAE3D,SAAA;AAAA,IACL,MAAMA;AAAA,IACN,WAAUA,KAAA,gBAAAA,EAAM,IAAI,UAAU,GAAGA,EAAK,IAAI,YAAY,GAAG,OAAM;AAAA,EAAA;AAEnE,GCFMS,IAAoB,CACxBC,GACA,EAAE,aAAAC,GAAa,SAAAC,QACZ;AACH,QAAMC,IAAe;AAAA,IACnB,UAAU,CAAC;AAAA,IACX,MAAM;AAAA,IACN,MAAM;AAAA,IACN,OAAO;AAAA,EAAA;AAET,MAAIC,IAAcJ,EAAG,WAAW,MAAM,KAAKA,EAAG,WAAW,GAAG;AACxD,EAAAG,EAAA,SAAQC,KAAA,gBAAAA,EAAa,KAAK,WAASA,KAAA,gBAAAA,EAAa,IAAI,WAAUD,EAAI;AACtE,MAAIrB,IAAOsB,KAAA,gBAAAA,EAAa;AACxB,EAAItB,MAAS,QACXsB,IAAcJ,EAAG,mBAAmB,GAAGlB,CAAI,IAAI,GAC3CsB,MACKtB,IAAAsB,EAAY,KAAK,iBAGxBtB,MAAS,QAAOsB,KAAA,QAAAA,EAAa,KAAK,UACpCD,EAAI,OAAOE,EAAQJ,GAAaG,EAAY,KAAK,IAAI,GACrDD,EAAI,OAAOE,EAAQH,GAASD,GAAaG,EAAY,KAAK,IAAI;AAE1D,QAAAE,IAAcN,EAAG,WAAW,IAAI;AACtC,MAAIM,GAAa;AACT,UAAAC,IAAWD,EAAY,cAAc,IAAI;AAC3C,IAAAC,KAAYA,EAAS,SAAS,MAChCJ,EAAI,WAAWI,EAAS;AAAA,MAAI,CAACC,MAC3BT,EAAkBS,GAAO,EAAE,aAAAP,GAAa,SAAAC,GAAS;AAAA,IAAA;AAAA,EAGvD;AAEO,SAAAC;AACT,GAEMM,KAAkB,CACtB9B,GACA,EAAE,aAAAsB,GAAa,SAAAC,QACZ;;AACH,QAAMQ,IAAW,CAAA;AAEb,MAAAC;AACA,SAAAhC,EAAI,mBAAmB,aAAa,IACpBgC,KAAA9B,IAAAF,EAAI,mBAAmB,aAAa,MAApC,gBAAAE,EAAuC,WAChDF,EAAI,mBAAmB,qBAAqB,MACnCgC,KAAA1B,IAAAN,EAAI,mBAAmB,qBAAqB,MAA5C,gBAAAM,EAA+C,WAG/D0B,KAAmBA,EAAgB,SAAS,KAC9CA,EACG,OAAO,CAACX,MAAQA,EAAkB,SAAS,IAAI,EAC/C;AAAA,IAAQ,CAACA,MACRU,EAAI,KAAKX,EAAkBC,GAAkB,EAAE,aAAAC,GAAa,SAAAC,EAAQ,CAAC,CAAC;AAAA,EAAA,GAIrEQ;AACT,GAEME,KAAsB,OAC1BpB,GACAL,GACA,EAAE,aAAAc,GAAa,SAAAC,QACZ;;AAEH,QAAMW,KAAUhC,IAAAW,EACb,WAAW,UAAU,MADR,gBAAAX,EAEZ,cAAc,QACf,KAAK,CAAC2B,MAAUA,EAAM,KAAK,eAAe;AAE7C,MAAIK,GAAS;AACX,UAAMC,IAAU,OAAO,OAAO3B,EAAQ,KAAK,EAAE;AAAA,MAAK,CAAC4B,MACjDA,EAAK,IAAI,SAASF,EAAQ,KAAK,QAAQ,EAAE;AAAA,IAAA;AAE3C,QAAIC,GAAS;AACX,YAAMnC,IAAM,IAAIqC,EAAO,YAAY,MAAMF,EAAQ,QAAQ;AACzD,aAAOL,GAAgB9B,GAAK,EAAE,aAAAsB,GAAa,SAAAC,EAAS,CAAA;AAAA,IACtD;AAAA,EACF;AACF,GAEMe,IAAgB,CACpBC,GACA;AAAA,EACE,aAAAjB;AAAA,EACA,SAAAC;AAAA,EACA,QAAAiB;AACF,MACG;;AACG,QAAAC,MAAMvC,IAAAqC,KAAA,gBAAAA,EAAO,WAAW,GAAGC,CAAM,eAA3B,gBAAAtC,EAAuC,KAAK,QAAO,IAEzDwC,IAAe;AAAA,IACnB,SACEpC,IAAAiC,KAAA,gBAAAA,EAAO,mBAAmB,GAAGC,CAAM,YAAYA,CAAM,YAArD,gBAAAlC,EAA8D,QAAO;AAAA,IACvE,MAAMoB,EAAQJ,GAAamB,CAAG;AAAA,IAC9B,MAAMf,EAAQH,GAASD,GAAamB,CAAG;AAAA,IACvC,UAAU,CAAC;AAAA,EAAA,GAEPb,IAAWW,EAAM,cAAc,GAAGC,CAAM,UAAU;AACpD,SAAAZ,KAAYA,EAAS,SAAS,MAChCc,EAAI,WAAWd,EAAS;AAAA,IAAI,CAACe,MAC3BL,EAAcK,GAAI,EAAE,aAAArB,GAAa,SAAAC,GAAS,QAAAiB,GAAQ;AAAA,EAAA,IAI/CE;AACT,GAEME,KAAkB,CACtBC,GACA,EAAE,aAAAvB,GAAa,SAAAC,QACZ;;AACH,QAAMQ,IAA2C,CAAA,GAE3Ce,IAAcD,EAAQ;AAC5B,MAAIL,IAAS;AACb,SAAIM,EAAY,QAAQ,GAAG,MAAM,OAC/BN,IAASM,EAAY,MAAM,GAAG,EAAE,CAAC,IAAI,OAIpC5C,IAAA2C,EAAA,WAAW,GAAGL,CAAM,QAAQ,MAA5B,QAAAtC,EACC,cAAc,GAAGsC,CAAM,YACxB;AAAA,IAAQ,CAACD,MACRR,EAAI,KAAKO,EAAcC,GAAO,EAAE,aAAAjB,GAAa,SAAAC,GAAS,QAAAiB,EAAO,CAAC,CAAC;AAAA,KAG5DT;AACT,GAEMgB,KAAkB,OAAO;AAAA,EAC7B,SAAAC;AAAA,EACA,aAAA1B;AAAA,EACA,SAAAC;AAAA,EACA,SAAAf;AACF,MAKM;;AACE,QAAAyC,IAAQD,EAAQ,WAAW,OAAO,GAClCE,IAAQD,KAASA,EAAM,KAAK;AAElC,MAAIC,GAAO;AACT,UAAMC,KAAUjD,IAAA8C,EACb,WAAW,UAAU,MADR,gBAAA9C,EAEZ,cAAc,QACf,KAAK,CAACkC,MAASA,EAAK,KAAK,OAAOc;AAEnC,QAAIC,GAAS;AACL,YAAAC,IAAU,GAAG9B,CAAW,GAAGA,MAAgB,KAAK,KAAK,GAAG,GAAG6B,EAAQ,KAAK,IAAI,IAE5ExC,IAAO,OAAO,OAAOH,EAAQ,KAAK,EAAE;AAAA,QAAK,CAAC4B,MAC9CA,EAAK,IAAI,SAASgB,CAAO;AAAA,MAAA;AAG3B,UAAIzC,GAAM;AACR,cAAMkC,IAAU,IAAIR,EAAO,YAAY,MAAM1B,EAAK,QAAQ;AAE1D,eAAOiC,GAAgBC,GAAS,EAAE,aAAAvB,GAAa,SAAAC,EAAS,CAAA;AAAA,MAC1D;AAAA,IACF;AAAA,EACF;AACF,GAEa8B,KAAW,OACtBxC,GACAL,GACA,EAAE,SAAAe,QACC;AACH,QAAM,EAAE,UAAUD,EAAA,IAAgBH,EAAkBX,CAAO,KAAK,IAE1D8C,IAAa,MAAMP,GAAgB;AAAA,IACvC,SAASlC;AAAA,IACT,aAAAS;AAAA,IACA,SAAAd;AAAA,IACA,SAAAe;AAAA,EAAA,CACD;AAED,SAAI+B,KAIG,MAAMrB,GAAoBpB,GAAWL,GAAS,EAAE,aAAAc,GAAa,SAAAC,GAAS;AAC/E,GC3LagC,KAAoC,OAAO/C,MAAqB;AAC3E,QAAMgD,IAAmC;AAAA,IACvC,iBAAiB;AAAA,EAAA;AAGnB,eAAM,QAAQ;AAAA,IACZhD,EAAQ,MAAM,IAAI,OAAOG,MAAS;;AAChC,UAAIA,EAAK,IAAI,SAAS,mCAAmC,GAAG;AAE1D,cAAM8C,KAAgBvD,IADJ,IAAImC,EAAO,YAAY,MAAM1B,EAAK,QAAQ,EAEzD,WAAW,UAAU,MADF,gBAAAT,EAElB,WAAW;AACf,UACEI,IAAAmD,KAAA,gBAAAA,EAAe,SAAf,gBAAAnD,EAAqB,UAAS,kBAC9BmD,EAAc,QAAQ,WAEtBD,EAAgB,kBAAkB;AAAA,MAEtC;AAAA,IAAA,CACD;AAAA,EAAA,GAGIA;AACT,GC1BaE,IAA+B,OAAO;AAAA,EACjD,SAAAlD;AACF,MAEM;AACE,QAAA,EAAE,MAAMmD,GAAS,UAAUrC,MAC/BH,EAAkBX,CAAO,KAAK,IAE1BrB,IAAO,OAAMwE,KAAA,gBAAAA,EAAS;AAExB,MAAA,CAACxE,EAAM,QAAO;AAElB,QAAMyE,IAAa,IAAIvB,EAAO,YAAYlD,CAAI,GAExC0E,IAAcD,EAAW,WAAW,UAAU,GAC9CE,IAAWF,EAAW,WAAW,OAAO,GAExCG,IAAeD,KAAA,gBAAAA,EACjB,cAAc,WACf,IAAI,CAAC1B,MAASA,EAAK,KAAK,QACrB4B,KACJH,KAAA,gBAAAA,EACI,cAAc,QACf,OAAO,CAACzB,MAAS2B,EAAa,SAAS3B,EAAK,KAAK,MAAM,EAAE,OAAM;AAS7D,SAPmB5B,EAAQ,MAAM,OAAO,CAACG,MACvCqD,EAAuB,KAAK,CAAC5B,MAC7Bd,IACE,GAAGA,CAAW,IAAIc,EAAK,KAAK,IAAI,OAAOzB,EAAK,MAD1B,GAAGyB,EAAK,KAAK,IAAI,OAAOzB,EAAK,GAEvD,CACF;AAGH,GCvBasD,IAAkB,CAACjE,MAA4B;;AACpD,QAAA6D,IAAc7D,EAAI,WAAW,UAAU;AAE7C,WACEE,IAAA2D,KAAA,gBAAAA,EAAa,cAAc,YAA3B,gBAAA3D,EAAoC,IAAI,CAACgE,OAAQ;AAAA,IAC/C,MAAMA,EAAG,KAAK,QAAQ;AAAA,IACtB,IAAIA,EAAG,KAAK,MAAM;AAAA,IAClB,WAAWA,EAAG,KAAK,YAAY;AAAA,EAAA,QAC1B,CAAA;AAEX,GAEaC,KACX,CAAC,EAAE,SAAA3D,GAAS,SAAAe,EAAQ,MACpB,OAAO6C,MAA0C;;AACzC,QAAA,EAAE,MAAMT,GAAS,UAAUrC,MAC/BH,EAAkBX,CAAO,KAAK,IAC1BgD,IAAkB,MAAMD,GAAkC/C,CAAO;AAEvE,MAAI,CAACmD;AACI,WAAAS;AAGH,QAAAjF,IAAO,MAAMwE,EAAQ;AAEpB,EAAA1E,EAAA,IAAIE,GAAMqE,CAAe;AAEhC,QAAM3C,IAAY,IAAIwB,EAAO,YAAYlD,CAAI,GAEvC4C,IAAO,MAAMsB,GAASxC,GAAWL,GAAS,EAAE,SAAAe,EAAA,CAAS,KAAM,IAE3D8C,IAAcxD,EAAU,WAAW,UAAU,GAC7CgD,IAAchD,EAAU,WAAW,UAAU,GAC7CiD,IAAWjD,EAAU,WAAW,OAAO,GACvCyD,IAAWzD,EAAU,WAAW,OAAO,GACvC0D,IAAWF,KAAA,gBAAAA,EAAa,WAAW,aACnCG,KAAkBH,KAAA,gBAAAA,EAAa,cAAc,YAAW,IACxDI,IAAuBD,EAAgB;AAAA,IAC3C,CAACE,MAASA,EAAK,KAAK,aAAa;AAAA,EAAA,GAE7BC,IAA2BH,EAAgB;AAAA,IAC/C,CAACE,MAASA,EAAK,KAAK,aAAa;AAAA,EAAA,GAE7BE,IAA6BJ,EAAgB;AAAA,IACjD,CAACE,MAASA,EAAK,KAAK,aAAa;AAAA,EAAA,GAG7BG,IAA2BJ,KAAA,gBAAAA,EAAsB,KAIjDK,IAAyBH,KAAA,gBAAAA,EAA0B,KAMnDI,KAAkBH,KAAA,gBAAAA,EAA4B,KAI9CI,MACJT,KAAA,gBAAAA,EAAU,UAAOrE,IAAAM,EAAQ,MAAM,KAAK,CAAC,EAAE,KAAAyE,EAAI,MAAMA,CAAG,MAAnC,gBAAA/E,EAAsC,aAAY,IAC/DgF,KAA2BpB,KAAA,gBAAAA,EAAU,KACzC,+BAKIqB,MAFoB,MAAMzB,EAA6B,EAAE,SAAAlD,EAAS,CAAA,GAEpC;AAAA,IAClC,CAAC4E,GAAMzE,MAASA,EAAK,OAAOyE;AAAA,IAC5B;AAAA,EAAA;AAGK,SAAA;AAAA,IACL,UAAU5E,EAAQ;AAAA,IAClB,KAAK;AAAA,MACH,KAAAuB;AAAA,IACF;AAAA,IACA,iBACE8C,KACArB,EAAgB,mBAChB;AAAA,IACF,eAAesB,KAA0B;AAAA,IACzC,iBAAAC;AAAA,IACA,OAAAC;AAAA,IACA,kBAAkBE,MAA4B;AAAA,IAC9C,aACEpB,KAAA,gBAAAA,EAAU,cAAc,WAAW,IAAI,CAACuB,MAAe;;AACrD,YAAMC,IAAezB,KAAA,gBAAAA,EACjB,cAAc,QACf,KAAK,CAACzB,MAASA,EAAK,KAAK,QAAOiD,KAAA,gBAAAA,EAAY,KAAK,SAC9CE,MAAOD,KAAA,gBAAAA,EAAc,KAAK,SAAQ,IAClCE,MAActF,IAAAmF,KAAA,gBAAAA,EAAY,KAAK,eAAjB,gBAAAnF,EAA6B,MAAM,SACrD,IACIuF,OACJnF,IAAAE,EAAQ,MAAM,KAAK,CAACG,MAASA,EAAK,IAAI,SAAS4E,EAAI,CAAC,MAApD,gBAAAjF,EAAuD,SAAQ,GAG3DoF,IAAcnE,KAAW;AAExB,aAAA;AAAA,QACL,KAAI+D,KAAA,gBAAAA,EAAc,KAAK,OAAM;AAAA,QAC7B,OAAMjF,IAAAiF,KAAA,gBAAAA,EAAc,KAAK,SAAnB,QAAAjF,EAAyB,WAAW,cACtCiF,KAAA,gBAAAA,EAAc,KAAK,OACnBhE,IACE,GAAGoE,CAAW,GAAGpE,CAAW,IAAIgE,KAAA,gBAAAA,EAAc,KAAK,IAAI,KACvD,GAAGI,CAAW,GAAGJ,KAAA,gBAAAA,EAAc,KAAK,IAAI;AAAA,QAC9C,iBAAiBT,KAA4B;AAAA,QAC7C,GAAIW,EAAW;AAAA,UACb,CAACG,MAAaA,MAAa;AAAA,QAAA,KACxB;AAAA,UACH,iBAAiB;AAAA,QACnB;AAAA,QACA,mBAAmBF,KAAWN;AAAA,QAC9B,gBACEK,EAAW,KAAK,CAACG,MAAaA,MAAa,kBAAkB,KAC7D;AAAA,QACF,iBACEH,EAAW,KAAK,CAACG,MAAaA,MAAa,mBAAmB,KAC9D;AAAA;AAAA,QAEF,WAAWL,KAAA,gBAAAA,EAAc,KAAK;AAAA,MAAY;AAAA,IAE7C,OAAK,CAAC;AAAA,IACT,OAAOrB,EAAgBpD,CAAS;AAAA,IAChC,OAAOyD,KAAA,gBAAAA,EAAU,cAAc,aAAa,IAAI,CAACsB,OACxC;AAAA,MACL,MAAMA,EAAI,KAAK,QAAQ;AAAA,MACvB,OAAOA,EAAI,KAAK,SAAS;AAAA,MACzB,MAAMA,EAAI,KAAK;AAAA,IAAA;AAAA,EAElB;AAEL,GC9IIC,KAAc,OAAOrF,GAAkBC,MAAyB;;AAEpE,QAAMtB,IAAO,QAAMe,IADHiB,EAAkBX,CAAO,EACd,SAAR,gBAAAN,EAAc;AAEjC,MAAIf,GAAM;AACR,UAAM0B,IAAY,IAAIwB,EAAO,YAAYlD,CAAI;AAGtC,WAAA;AAAA,MACL,YAAWmB,IAHC2D,EAAgBpD,CAAS,EAGpB,KAAK,CAACuB,MAAS3B,EAAa,SAAS2B,EAAK,IAAI,CAAC,MAArD,gBAAA9B,EACP;AAAA,IAAA;AAAA,EAER;AAEO,SAAA;AAAA,IACL,WAAWwF,GAA4BrF,CAAY;AAAA,EAAA;AAEvD,GAEMqF,KAA8B,CAACC,MAAgB;AAC/C,MAAAA,EAAI,SAAS,MAAM;AACd,WAAA;AAEL,MAAAA,EAAI,SAAS,MAAM;AACd,WAAA;AAEL,MAAAA,EAAI,SAAS,QAAQ;AAChB,WAAA;AAEL,MAAAA,EAAI,SAAS,MAAM;AACd,WAAA;AAEL,MAAAA,EAAI,SAAS,MAAM;AACd,WAAA;AAEX,GAEaC,KACX,CAAC,EAAE,SAAAxF,GAAS,cAAAC,EAAa,MACzB,OAAOC,MAAkD;AACvD,QAAMC,IAAO,OAAO,OAAOH,EAAQ,KAAK,EAAE;AAAA,IACxC,CAACG,MAASA,EAAK,QAAQF;AAAA,EAAA;AAGrB,MAAA,CAACE,EAAa,QAAAD;AAwClB,QAAMuF,IAAW,MAAMJ,GAAYrF,GAASC,CAAY;AAEjD,SAAA;AAAA,IACL,GAAGC;AAAA,IACH,QAAQ;AAAA,MACN,GAAGA,EAAS;AAAA,MACZ,QAAQ;AAAA,MACR,SAAS;AAAA,QACP,IAAIC,KAAA,gBAAAA,EAAM,mBAAkB;AAAA,UAC1B,gBAAgBA,EAAK;AAAA,QACvB;AAAA,QACA,GAAIsF,EAAS,aAAa;AAAA,UACxB,gBAAgBA,EAAS;AAAA,QAC3B;AAAA,MACF;AAAA,IACF;AAAA,EAAA;AAEJ,GCnGWC,KAA8B,OACzC1F,GACAC,MACG;AACH,QAAME,IAAO,OAAO,OAAOH,EAAQ,KAAK,EAAE;AAAA,IACxC,CAACG,MAASA,EAAK,QAAQF;AAAA,EAAA;AAGzB,MAAI,CAACE;AACG,UAAA,IAAI,MAAM,eAAe;AAGjC,QAAMwF,IAAgC;AAAA,IACpC,QAAQ;AAAA,MACN,QAAQ;AAAA,IACV;AAAA,EAAA,GAGIC,IAAQ;AAAA,IACZJ,GAAY,EAAE,SAAAxF,GAAS,cAAAC,GAAc;AAAA,IACrCQ,GAAW,EAAE,SAAAT,GAAS,cAAAC,GAAc;AAAA,IACpCO,GAAe,EAAE,SAAAR,GAAS,cAAAC,GAAc;AAAA,EAAA;AAGtC,MAAA;AACF,UAAMC,IAAW,MAAM0F,EAAM,OAAO,OAAOhC,GAAUiC,MAC5C,MAAMA,EAAI,MAAMjC,CAAQ,GAC9B,QAAQ,QAAQ+B,CAAe,CAAC;AAE5B,WAAAlH,EAAA,IAAI,sBAAsBwB,GAAcC,CAAQ,GAEhD;AAAA,MACL,GAAGA;AAAA,MACH,MAAMA,EAAS,QAAS,MAAMC,EAAK,KAAK;AAAA,IAAA;AAAA,WAEnC2F,GAAG;AACV,UAAArH,EAAO,MAAMqH,CAAC,GAERA;AAAA,EACR;AACF,GAEaC,KAA4B,CAACC,OACjC;AAAA,EACL,MAAM;AAAA;AAAA;AAAA;AAAA,sBAIYC,EAA8C,cAAc,OAAOD,CAAK,CAAC;AAAA;AAAA;AAAA,eAGhF,OAAOA,CAAK,CAAC;AAAA;AAAA;AAAA;AAAA,EAIxB,QAAQ;AAAA,IACN,QAAQ;AAAA,IACR,SAAS;AAAA,MACP,gBAAgB;AAAA,IAClB;AAAA,EACF;AAAA,ICjESR,KACX,CAAC,EAAE,SAAAxF,GAAS,SAAAe,QACZ,YAA+B;;AACvB,QAAAmF,IAAQ,OAAO,OAAOlG,EAAQ,KAAK,EAAE,OAAO,CAACG,MAAS,CAACA,EAAK,GAAG;AAE9D,SAAA;AAAA,IACL,UAAUH,EAAQ;AAAA,IAClB,SACEN,IAAAM,EAAQ,MAAM,KAAK,CAAC,EAAE,KAAAyE,EAAU,MAAAA,CAAG,MAAnC,gBAAA/E,EAAsC,SAAS,QAAQ,OAAO,QAAO;AAAA,IACvE,iBAAiB;AAAA,IACjB,iBAAiB;AAAA,IACjB,kBAAkB;AAAA,IAClB,YAAYwG,EACT,OAAO,CAAC/F,MAAS,CAACA,EAAK,SAAS,SAAS,KAAK,CAAC,EAC/C,IAAI,CAACA,GAAMgG,OAAW;AAAA;AAAA;AAAA;AAAA,MAIrB,IAAI,GAAGA,CAAK,IAAIhG,EAAK,QAAQ;AAAA,MAC7B,MAAM,UAAU,GAAGY,CAAO,GAAGZ,EAAK,GAAG,EAAE;AAAA,MACvC,iBAAiB;AAAA,MACjB,mBAAmB,IAAI+F,EAAM;AAAA,MAC7B,gBAAgB;AAAA,MAChB,iBAAiB;AAAA,MACjB,WAAW/F,EAAK;AAAA,IAAA,EAChB;AAAA,IACJ,OAAO+F,EAAM,IAAI,CAAC/F,GAAMgG,OAAW;AAAA,MACjC,IAAI,GAAGA,CAAK,IAAIhG,EAAK,QAAQ;AAAA,MAC7B,MAAM,GAAGY,CAAO,GAAGZ,EAAK,GAAG;AAAA,IAAA,EAC3B;AAAA,EAAA;AAEN,GC1BWiG,KACX,CAAC,EAAE,SAAApG,EAAQ,MACX,OAAO4D,MAA0C;;AACzC,QAAAyC,IAAgBrG,EAAQ,MAAM;AAAA,IAClC,CAACG,MAASA,EAAK,SAAS,YAAkB,MAAA;AAAA,EAAA;AAG5C,MAAI,CAACkG;AACI,WAAAzC;AAGT,QAAM0C,IAA2B;AAAA,IAC/B,GAAG1C;AAAA,IACH,YAAYA,EAAS,WAClB,OAAO,CAAChC,MAAS,CAACA,EAAK,GAAG,YAAc,EAAA,SAAS,eAAe,CAAC,EACjE,IAAI,CAACA,GAAM2E,GAAGC,OAAW;AAAA,MACxB,GAAG5E;AAAA,MACH,mBAAmB,IAAI4E,EAAM;AAAA,IAAA,EAC7B;AAAA,EAAA,GAIAC,IAAU,MAAMJ,EAAc;AAEhC,MAAA;AAGF,UAAMK,MACHhH,IAHY,IAAImC,EAAO,YAAY4E,CAAO,EAGnC,WAAW,OAAO,MAAzB,gBAAA/G,EAA4B,QAA+B;AAEvD,WAAA;AAAA,MACL,GAAG4G;AAAA,MACH,kBAAkBI,MAAa,sBAAsB,QAAQ;AAAA,IAAA;AAAA,WAExDZ,GAAG;AACF,mBAAA,MAAM;AAAA,GAA+CW,CAAO,GACpE,QAAQ,MAAMX,CAAC,GAERQ;AAAA,EACT;AACF,GC3CIK,KAAqB,CAACnH,MAA4B;;AACtD,QAAMC,KAAUC,IAAAF,EACb,mBAAmB,MAAM,MADZ,gBAAAE,EAEZ,cAAc,QACf,KAAK,CAACC,MAASA,EAAK,KAAK,SAAS;AAErC,SAAO,CAAC,EAAEF,KAAWA,EAAQ,KAAK,SAAS;AAC7C,GAEMmH,KAA2B,CAACV,MAChCA,EAAM,OAAO,OAAOW,GAAQC,MAAY;AAKtC,MAFI,CAFY,MAAMD,KAKpB,CAACE,GAAmB;AAAA,IAClB,UAAUD,EAAQ;AAAA,IAClB,KAAKA,EAAQ;AAAA,EAAA,CACd;AAEM,WAAA;AAGH,QAAA3G,IAAO,MAAM2G,EAAQ;AAEvB,SAAC3G,IAEEwG,GAAmB,IAAI9E,EAAO,YAAY1B,CAAI,CAAC,IAFpC;AAGpB,GAAG,QAAQ,QAAQ,EAAI,CAAC,GAEb6G,KACX,CAAC,EAAE,SAAAhH,EAAQ,MACX,OAAO4D,MAA0C;AAK/C,MAHEA,EAAS,oBAAoB,gBAC7BA,EAAS,WAAW,MAAM,CAAChC,MAASA,EAAK,oBAAoB,YAAY,GAEjD;AACxB,UAAMsE,IAAQ,MAAMhD,EAA6B,EAAE,SAAAlD,EAAS,CAAA;AAI5D,QAFuB,MAAM4G,GAAyBV,CAAK;AAGlD,aAAA;AAAA,QACL,GAAGtC;AAAA,QACH,YAAYA,EAAS,WAAW,IAAI,CAAChC,OAAU;AAAA,UAC7C,GAAGA;AAAA,UACH,iBAAiB;AAAA,QAAA,EACjB;AAAA,QACF,iBAAiB;AAAA,MAAA;AAAA,EAGvB;AAEO,SAAAgC;AACT,GC7DWqD,IAAwB,CAACC,GAAWC,MAAc;;AACvD,QAAAC,IAAQF,EAAE,MAAM,OAAO,GACvBG,IAAQF,EAAE,MAAM,OAAO;AAE7B,WAASG,IAAI,GAAGC,IAAMH,EAAM,QAAQE,IAAIC,GAAKD;AAC3C,QAAIF,EAAME,CAAC,MAAMD,EAAMC,CAAC;AACtB,cAAI5H,IAAA0H,EAAME,CAAC,MAAP,QAAA5H,EAAU,MAAM,QACX,EAAE0H,EAAME,CAAC,KAAK,MAAM,EAAED,EAAMC,CAAC,KAAK,OAEjCF,EAAME,CAAC,KAAK,IAAI,cAAcD,EAAMC,CAAC,KAAK,EAAE;AAKnD,SAAA;AACT,GCLaE,KACX,CAAC,EAAE,SAAAxH,GAAS,SAAAe,EAAQ,MACpB,OAAO6C,MAA0C;AAC3C,MAAAA,EAAS,IAAY,QAAAA;AAEzB,QAAM6D,IAAqB,CAAC,GAAGzH,EAAQ,KAAK,EAAE;AAAA,IAAK,CAAC,GAAGmH,MACrDF,EAAsB,EAAE,KAAKE,EAAE,GAAG;AAAA,EAAA,GAG9B5F,IAA2C,OAAO;AAAA,IACtDkG;AAAA,EAAA,EACA;AAAA,IACA,CAACC,GAAKvH,MAAS;AACb,YAAMwH,IAAQxH,EAAK,IAAI,MAAM,GAAG;AAKhC,aAF0B,CAACA,EAAK,OAAOwH,EAAM,SAAS,KAG9CA,EAAA,QAAQ,CAACC,GAAMC,MAAU;AAG7B,YAFuBA,MAAUF,EAAM,SAAS,EAE5B;AAIpB,QAFwBD,EAAI,KAAK,CAAC,EAAE,OAAAlD,QAAYA,MAAUoD,CAAI,KAK5DF,EAAI,KAAK;AAAA,UACP,UAAU,CAAC;AAAA,UACX,MAAMxG,EAAQH,GAAS,UAAUZ,EAAK,GAAG,CAAC,EAAE,QAAQ,OAAO,EAAE;AAAA,UAC7D,MAAMA,EAAK,IAAI,QAAQ,OAAO,EAAE;AAAA,UAChC,OAAOwH,EAAM,CAAC,KAAK;AAAA,QAAA,CACpB;AAAA,MACH,CACD,GAGID;AAAA,IACT;AAAA,IACA,CAAC;AAAA,EAAA;AAGC,SAAAnG,EAAI,WAAW,IAAUqC,IAEtB;AAAA,IACL,GAAGA;AAAA,IACH,KAAK;AAAA,MACH,KAAArC;AAAA,IACF;AAAA,EAAA;AAEJ,GCrDIuG,KAAyB;AAAA,EAC7B,UAAU;AAAA,EACV,OAAO,CAAC;AAAA,EACR,KAAK;AAAA,IACH,KAAK,CAAC;AAAA,EACR;AAAA,EACA,kBAAkB;AAAA,EAClB,iBAAiB;AAAA,EACjB,iBAAiB;AAAA,EACjB,YAAY,CAAC;AAAA,EACb,OAAO;AACT,GAEaC,KAA8B,OACzC/H,GACA,EAAE,SAAAe,IAAU,GAAG,IAA0B,OACtC;AACH,QAAM6E,IAAQ;AAAA,IACZJ,GAAY,EAAE,SAAAxF,GAAS,SAAAe,GAAS;AAAA,IAChC4C,GAAS,EAAE,SAAA3D,GAAS,SAAAe,GAAS;AAAA,IAC7BiG,GAAkB,EAAE,SAAAhH,GAAS,SAAAe,GAAS;AAAA,IACtCqF,GAAc,EAAE,SAAApG,GAAS,SAAAe,GAAS;AAAA,IAClCyG,GAAuB,EAAE,SAAAxH,GAAS,SAAAe,GAAS;AAAA,EAAA;AAGzC,MAAA;AACF,UAAM6C,IAAW,MAAMgC,EAAM,OAAO,OAAOhC,GAAUiC,MAC5C,MAAMA,EAAI,MAAMjC,CAAQ,GAC9B,QAAQ,QAAQkE,EAAY,CAAC;AAEzB,WAAArJ,EAAA,IAAI,sBAAsBmF,CAAQ,GAElCA;AAAA,WACAkC,GAAG;AACV,UAAArH,EAAO,MAAMqH,CAAC,GAERA;AAAA,EACR;AACF,GC/CakC,IAAiB,CAACzC,MAC7BA,EAAI,UAAUA,EAAI,YAAY,GAAG,IAAI,CAAC,KAAKA,GAEhC0C,IAAsB,CAAC1C,MAClCA,EAAI,SAAS,GAAG,IAAIA,EAAI,MAAM,GAAG,EAAE,IAAIA,GCK5B2C,KAAwB,OACnCC,GACAC,MACqB;AACrB,QAAMC,IAAc;AAAA;AAAA;AAAA,4CAGsBD,KAAA,QAAAA,EAAS,mBAAmB,eAAe,eAAe;AAAA,UAC5FA,KAAA,QAAAA,EAAS,mBAAmB,+DAA+D,EAAE;AAAA;AAAA;AAAA,UAG7FD,EACC;AAAA,IACC,CAACG,MACC,aAAaN,EAAeM,CAAG,CAAC,WAAWA,CAAG,iBAAiBC,EAAuBD,CAAG,CAAC;AAAA,IAE7F,KAAK;AAAA,CAAI,CAAC;AAAA;AAAA;AAAA,UAGXH,EAAK,IAAI,CAACG,MAAQ,mBAAmBN,EAAeM,CAAG,CAAC,MAAM,EAAE,KAAK;AAAA,CAAI,CAAC;AAAA;AAAA;AAAA,KAK5EE,IAAiCL,EAAK,IAAI,CAACG,OAAS;AAAA,IACxD,KAAK;AAAA,IACL,UAAUN,EAAeM,CAAG;AAAA,IAC5B,gBAAgBC,EAAuBD,CAAG;AAAA,IAC1C,KAAKA;AAAA,IACL,MAAM,MAAMH,EAAK;AAAA,IACjB,QAAQ,YAAY;AAAA,IACpB,MAAM,YAAY,IAAI,KAAK;AAAA,IAC3B,QAAQ,YAAY;AAAA,EACpB,EAAA;AAYK,SAAA;AAAA,IACL,UAAU;AAAA,IACV,OAAO,CAZiC;AAAA,MACxC,KAAK;AAAA,MACL,UAAU;AAAA,MACV,KAAK;AAAA,MACL,MAAM;AAAA,MACN,QAAQ,YAAYE;AAAA,MACpB,MAAM,YAAY,IAAI,KAAK;AAAA,MAC3B,QAAQ,YAAYA;AAAA,IAAA,GAKH,GAAGG,CAAY;AAAA,IAChC,OAAO,MAAM,QAAQ,QAAQ;AAAA,EAAA;AAEjC,GC3DaC,KAAe,OAAOC,MACjC,IAAI,QAAgB,CAACC,MAAY;AACzB,QAAAC,IAAS,IAAI;AACnB,EAAAA,EAAO,cAAcF,CAAI,GACzBE,EAAO,YAAY,WAAY;AAC7B,UAAMC,IAAaD,EAAO;AAC1B,IAAAD,EAAQE,CAAU;AAAA,EAAA;AAEtB,CAAC,GCDUC,KAAwB,OACnCrC,GACA;AAAA,EACE,UAAAsC;AAAA,EACA,WAAAC;AACF,IAGI,EAAE,UAAU,mBACb;AACH,QAAMC,IAAgB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,6CAWqBD,KAAa,KAAK;AAAA;AAAA;AAAA;AAAA;AAyCtD,SAnCkB;AAAA,IACvB,UAAU;AAAA,IACV,OAAO;AAAA,MACL;AAAA,QACE,KAAK;AAAA,QACL,UAAUhB,EAAe,eAAe;AAAA,QACxC,KAAK;AAAA,QACL,MAAM,YAAY,IAAI,KAAK,CAACiB,CAAa,CAAC;AAAA,QAC1C,QAAQ,YAAYA;AAAA,QACpB,QAAQ,YAAY,KAAKA,CAAa;AAAA,QACtC,MAAM;AAAA,MACR;AAAA,MACA;AAAA,QACE,KAAK;AAAA,QACL,UAAUjB,EAAe,SAAS;AAAA,QAClC,KAAK;AAAA,QACL,MAAM,YACA,OAAOvB,KAAY,WAAiB,IAAI,KAAK,CAACA,CAAO,CAAC,IACnDA;AAAA,QAET,QAAQ,YACF,OAAOA,KAAY,WAAiBA,IACjCA,EAAQ;QAEjB,QAAQ,YACF,OAAOA,KAAY,WAAiB,KAAKA,CAAO,IAC7CgC,GAAahC,CAAO;AAAA,QAE7B,MAAM,OAAOA,KAAY,WAAWA,EAAQ,SAASA,EAAQ;AAAA,QAC7D,gBAAgBsC;AAAA,MAClB;AAAA,IACF;AAAA,IACA,OAAO,MAAM,QAAQ,QAAQ;AAAA,EAAA;AAIjC,GCpCaG,KAAyB,OACpCC,GACA,EAAE,cAAAC,GAAc,MAAApK,EAAK,IAA+C,CAAA,MAC/C;AACrB,MAAIkH,IAAQ,OAAO,OAAOiD,EAAM,KAAK;AAErC,EAAIC,MACFlD,IAAQA,EAAM,QAAQ,KAAK,CAAC,GAAGiB,MAAMF,EAAsB,EAAE,MAAME,EAAE,IAAI,CAAC;AAG5E,QAAMnH,IAAU;AAAA,IACd,UAAUhB,KAAQ;AAAA,IAClB,OAAOkH,EAAM,IAAI,CAAC/F,OAAU;AAAA,MAC1B,KAAKA,EAAK;AAAA,MACV,UAAU6H,EAAe7H,EAAK,IAAI;AAAA,MAClC,KAAKA,EAAK;AAAA,MACV,MAAM,MAAMA,EAAK,MAAM,MAAM;AAAA,MAC7B,QAAQ,MAAMA,EAAK,MAAM,QAAQ;AAAA,MACjC,QAAQ,MAAMA,EAAK,MAAM,QAAQ;AAAA,MACjC,GAAIA,EAAK,kBAAkB;AAAA,QACzB,QAAQA,EAAK;AAAA,MACf;AAAA;AAAA;AAAA;AAAA,MAIA,MAAMA,EAAK,MAAM;AAAA,IAAA,EACjB;AAAA,IACF,OAAO,MAAM,QAAQ,QAAQ;AAAA,EAAA;AAGxB,SAAA1B,EAAA,IAAI,qBAAqBuB,CAAO,GAEhCA;AACT,GC7BaqJ,KAA8B,OACzCC,GACA,EAAE,MAAAtK,EAAK,IAA+C,CAAA,MACjC;AACf,QAAAuK,IAAW,MAAMD,EAAW,iBAE5BtJ,IAAmB;AAAA,IACvB,OAAO,MAAMsJ,EAAW,MAAM;AAAA,IAC9B,UAAUtK,KAAQ;AAAA,IAClB,OAAOuK,EAAS,IAAI,CAAC3H,OAAkD;AAAA,MACrE,KAAK;AAAA,MACL,UAAUA,EAAK,KAAK;AAAA,MACpB,MAAMA,EAAK,KAAK;AAAA,MAChB,KAAK,GAAGA,EAAK,IAAI,GAAGA,EAAK,KAAK,IAAI;AAAA,MAClC,QAAQ,YACC;AAAA,MAET,MAAM,YACS,MAAOA,EAAK,KAAK,QAAQ;AAAA,MAIxC,QAAQ,aACO,MAAOA,EAAK,KAAK,QAAQ,GAE1B;IACd,EACA;AAAA,EAAA;AAGG,SAAAnD,EAAA,IAAI,qBAAqBuB,CAAO,GAEhCA;AACT,GCnEawJ,KAAmC,OAC9CC,GAMA,EAAE,cAAAL,GAAc,MAAApK,EAAK,IAA+C,CAAA,MAC/C;AACrB,MAAIkH,IAAQuD;AAEZ,SAAIL,MACFlD,IAAQA,EAAM,QAAQ,KAAK,CAACgB,GAAGC,MAAMF,EAAsBC,EAAE,MAAMC,EAAE,IAAI,CAAC,IAGrE;AAAA,IACL,UAAUnI,KAAQ;AAAA,IAClB,OAAOkH,EAAM,IAAI,CAAC/F,OAAU;AAAA,MAC1B,KAAKA,EAAK;AAAA,MACV,UAAU6H,EAAe7H,EAAK,IAAI;AAAA,MAClC,KAAKA,EAAK;AAAA,MACV,MAAM,YAAY,IAAI,KAAK,CAAC,MAAMA,EAAK,KAAK,CAAC,CAAC;AAAA,MAC9C,QAAQ,YAAY;AACZ,cAAAxB,IAAO,MAAMwB,EAAK;AACxB,eAAO,OAAO,aAAa;AAAA,UACzB;AAAA,UACA,MAAM,KAAK,IAAI,YAAYxB,CAAI,CAAC;AAAA,QAAA;AAAA,MAEpC;AAAA,MACA,QAAQ,YAEC;AAAA,MAET,MAAMwB,EAAK;AAAA,IAAA,EACX;AAAA,IACF,OAAO,MAAM,QAAQ,QAAQ;AAAA,EAAA;AAEjC,GCvCauJ,KAAY,CAAC;AAAA,EACxB,cAAAC;AACF,IAAgC,OAAO;AAC9B,EAAAlL,EAAA,OAAO,CAAC,CAACkL,CAAY;AAC9B,GCuBaC,KAAsB,CAAC;AAAA,EAClC,YAAAC;AAAA,EACA,mBAAAC;AACF,MAGM;AACE,QAAAC,IAAc,IAAIC,KAClBC,IAAiB,IAAID,KACrBE,IAA0D,CAAA,GAE1DC,IAAiBJ,EAAY;AAAA,IACjCK,EAAS,CAACC,MAAQ;AACV,YAAAC,IAAeJ,EAASG,CAAG;AAEjC,aAAI,CAACC,KAAgBA,EAAa,WAAW,WAAW,SAC/CC,MAETD,EAAa,KAAK;AAAA,QAChB,GAAGA,EAAa,SAAS;AAAA,QACzB,QAAQ;AAAA,MAAA,CACT,GAEME,EAAKX,EAAWQ,CAAG,CAAC,EAAE;AAAA,QAC3BI,EAAI,CAACzK,OACHsK,EAAa,KAAK;AAAA,UAChB,GAAGA,EAAa,SAAS;AAAA,UACzB,SAAAtK;AAAA,UACA,QAAQ;AAAA,QAAA,CACT,GAEM,EAAE,KAAAqK,GAAK,cAAAC,IACf;AAAA,QACDI,EAAW,CAAC1E,MAAU;AACpB,gBAAAsE,EAAa,KAAK;AAAA,YAChB,GAAGA,EAAa,SAAS;AAAA,YACzB,QAAQ;AAAA,YACR,OAAAtE;AAAA,UAAA,CACD,GAEKA;AAAA,QAAA,CACP;AAAA,MAAA;AAAA,IACH,CACD;AAAA,IACD0E,EAAW,MAAMC,CAAK;AAAA,IACtBC,GAAY;AAAA,EAAA,GAGRC,IAAWV,EAAe;AAAA,IAC9BW,EAAU,CAAC,EAAE,cAAAR,GAAc,KAAAD,QACVC,EAAa,KAAKG,EAAI,CAAC,EAAE,OAAAM,EAAA,MAAYA,CAAK,CAAC,EAC/B;AAAA,MACzBN,EAAI,CAACM,MAAUA,KAAS,CAAC;AAAA,MACzBC,GAAqB;AAAA,IAAA,EAGJ;AAAA,MACjBF;AAAA,QAAU,CAACG,MACRA,IAAqBC,GAAMpB,CAAiB,IAA/Ba;AAAA,MAChB;AAAA,MACAQ,EAAI,MAAM;;AACR,eAAOjB,EAASG,CAAG,IAEN3K,IAAA4K,EAAA,SAAA,EAAW,YAAX,QAAA5K,EAAoB;AAAA,MAAM,CACxC;AAAA,IAAA,CAEJ;AAAA,EAAA,GAGG0L,IAAS,CAACf,MAAgB;AAC9B,QAAIgB,IAAgB;AAEpB,UAAMf,IACJJ,EAASG,CAAG,KACZ,IAAIiB,GAA8B;AAAA,MAChC,SAAS;AAAA,MACT,QAAQ;AAAA,MACR,OAAO;AAAA,MACP,OAAO;AAAA,IAAA,CACR;AAEH,IAAApB,EAASG,CAAG,IAAIC,GAEhBA,EAAa,KAAK;AAAA,MAChB,GAAGA,EAAa,SAAS;AAAA,MACzB,OAAOA,EAAa,SAAS,EAAE,QAAQ;AAAA,IAAA,CACxC;AAED,UAAMiB,IAAU,MAAM;AACpB,MAAIF,MAEYA,IAAA,IAEhBf,EAAa,KAAK;AAAA,QAChB,GAAGA,EAAa,SAAS;AAAA,QACzB,OAAOA,EAAa,SAAS,EAAE,QAAQ;AAAA,MAAA,CACxC;AAAA,IAAA;AAGH,IAAAP,EAAY,KAAKM,CAAG;AAEpB,UAAMmB,IAAWlB,EAAa;AAAA,MAC5BG,EAAI,CAAC,EAAE,SAAAzK,QAAcA,CAAO;AAAA,MAC5ByL,GAAO,CAACzL,MAAY,CAAC,CAACA,CAAO;AAAA,IAAA,GAGzB0L,IAASpB,EAAa;AAAA,MAC1Ba,EAAI,CAAC,EAAE,OAAAnF,QAAY;AACjB,YAAIA;AACI,gBAAAA;AAAA,MACR,CACD;AAAA,MACD2F,GAAe;AAAA,IAAA;AAGV,WAAAC,EAAMJ,GAAUE,CAAM,EAAE;AAAA,MAC7BG,GAAM;AAAA,MACNpB,EAAI,CAACzK,OAAa,EAAE,SAAAA,GAAS,SAAAuL,EAAU,EAAA;AAAA,MACvCb,EAAW,CAAC1E,MAAU;AACZ,cAAAuF,KAEFvF;AAAA,MAAA,CACP;AAAA,IAAA;AAAA,EACH;AAGI,SAAA4F,EAAAf,GAAUV,CAAc,EAAE,KAAK2B,GAAU7B,CAAc,CAAC,EAAE,aAEzD;AAAA,IACL,QAAAmB;AAAA,EAAA;AAEJ;ACzIO,MAAMW,GAAS;AAAA,EAOpB,YAAY;AAAA,IACV,SAAAC;AAAA,IACA,mBAAAC;AAAA,IACA,GAAGC;AAAA,EAAA,GAIF;AAZH,SAAA,UAAmB,CAAClG,MACX,IAAI,SAAS,OAAOA,CAAK,GAAG,EAAE,QAAQ,KAAK,GAY7C,KAAA,aAAa4D,GAAoBsC,CAAI,GAErC,KAAA,oBACHD,MAAsB,CAAC,EAAE,UAAArI,EAAe,MAAA,QAAQ,QAAQA,CAAQ,IAC7D,KAAA,UAAUoI,KAAW,KAAK;AAAA,EACjC;AAAA,EAEO,cAAc,EAAE,KAAA3B,GAAK,SAAAtJ,KAA8C;AACxE,UAAMoL,IAAY,KAAK,WAAW,OAAO9B,CAAG,EAAE;AAAA,MAC5CD,EAAS,CAAC,EAAE,SAAApK,GAAS,SAAAuL,QACDf;AAAA,QAChBzC,GAA4B/H,GAAS,EAAE,SAAAe,GAAS;AAAA,MAAA,EAGjC;AAAA,QACf+J;AAAA,UAAU,CAAClH,MACT4G,EAAK,KAAK,kBAAkB,EAAE,UAAA5G,GAAU,SAAA5D,EAAQ,CAAC,CAAC;AAAA,QACpD;AAAA,QACAyK;AAAA,UACE,CAAC7G,MACC,IAAI,SAAS,KAAK,UAAUA,CAA2B,GAAG;AAAA,YACxD,QAAQ;AAAA,UAAA,CACT;AAAA,QACL;AAAA,QACAwI,EAAS,MAAM;AACL,UAAAb;QAAA,CACT;AAAA,MAAA,CAEJ;AAAA,MACDb,EAAW,CAAC1E,MACHqG,EAAG,KAAK,QAAQrG,CAAK,CAAC,CAC9B;AAAA,IAAA;AAGH,WAAOsG,EAAcH,CAAS;AAAA,EAChC;AAAA,EAEO,cAAc;AAAA,IACnB,KAAA9B;AAAA,IACA,cAAApK;AAAA,EAAA,GAIC;AACD,UAAMkM,IAAY,KAAK,WAAW,OAAO9B,CAAG,EAAE;AAAA,MAC5CD,EAAS,CAAC,EAAE,SAAApK,GAAS,SAAAuL,QACDf;AAAA,QAChB9E,GAA4B1F,GAASC,CAAY;AAAA,MAAA,EAGlC;AAAA,QACfwK,EAAI,CAACvK,MAAa,IAAI,SAASA,EAAS,MAAM,EAAE,QAAQ,IAAI,CAAC,CAAC;AAAA,QAC9DkM,EAAS,MAAM;AACL,UAAAb;QAAA,CACT;AAAA,MAAA,CAEJ;AAAA,MACDb,EAAW,CAAC1E,MACHqG,EAAG,KAAK,QAAQrG,CAAK,CAAC,CAC9B;AAAA,IAAA;AAGH,WAAOsG,EAAcH,CAAS;AAAA,EAChC;AACF;AC7FO,MAAMI,WAA8BR,GAAS;AAAA,EAOlD,YAAY;AAAA,IACV,YAAAS;AAAA,IACA,GAAGN;AAAA,EAAA,GAOF;AACD,UAAMA,CAAI,GAEV,KAAK,aAAaM,GAClB,KAAK,qBAAqB,KAAK,mBAAmB,KAAK,IAAI;AAAA,EAC7D;AAAA,EAEA,mBAAmBC,GAAwC;AACrD,QAAA;AACI,YAAAC,IAAU,KAAK,WAAWD,CAAK;AAErC,UAAI,CAACC,EAAS;AAER,YAAA3L,IAAUkH,EAAoByE,EAAQ,OAAO,GAC7CC,IAAeF,EAAM,QAAQ,IAAI;AAAA,QACrC1L,EAAQ,SAAS;AAAA,MAAI,GAEjB,CAACsJ,IAAM,EAAE,IAAIsC,EAAa,MAAM,GAAG,GACnC1M,IAAe;AAAA,QACnBgI,EAAoB0E,EAAa,UAAUtC,EAAI,SAAS,CAAU,CAAC;AAAA,MAAA;AAGjE,MAAAsC,EAAa,SAAS,WAAW,IAC7BF,EAAA;AAAA,QACJ,KAAK,cAAc,EAAE,KAAApC,GAAK,SAAS,GAAGtJ,CAAO,IAAIsJ,CAAG,KAAK;AAAA,MAAA,IAG3DoC,EAAM,YAAY,KAAK,cAAc,EAAE,KAAApC,GAAK,cAAApK,EAAc,CAAA,CAAC;AAAA,aAEtD6F,GAAG;AACJ,MAAA2G,EAAA,YAAY,IAAI,SAAS,OAAO3G,CAAC,GAAG,EAAE,QAAQ,IAAK,CAAA,CAAC;AAAA,IAC5D;AAAA,EACF;AACF;"}
@@ -1,4 +1,4 @@
1
- (function(f,b){typeof exports=="object"&&typeof module<"u"?b(exports,require("@prose-reader/shared"),require("xmldoc"),require("rxjs")):typeof define=="function"&&define.amd?define(["exports","@prose-reader/shared","xmldoc","rxjs"],b):(f=typeof globalThis<"u"?globalThis:f||self,b(f["prose-streamer"]={},f.shared,f.xmldoc,f.rxjs))})(this,function(f,b,v,c){"use strict";let T=!1;const w={enable:e=>{T=e},log:(...e)=>{T&&console.log("[prose-reader-streamer]",...e)},warn:(...e)=>{T&&console.warn("[prose-reader-streamer]",...e)},error:(...e)=>{console.error(...e)},time:e=>{T&&console.time(`[prose-reader-streamer] [metric] ${e}`)},timeEnd:e=>{T&&console.timeEnd(`[prose-reader-streamer] [metric] ${e}`)},metric:(e,n=1/0)=>{const i=typeof e=="number"?e:e.duration;T&&(e.duration<=n?console.log("[prose-reader-streamer] [metric] ",`${e.name} took ${i}ms`):console.warn("[prose-reader-streamer] [metric] ",`${e.name} took ${e.duration}ms which is above the ${n}ms target for this function`))},measurePerformance:(e,n=10,i)=>(...r)=>{const t=performance.now(),a=i(...r);if(a&&a.then)return a.then(s=>{const l=performance.now();return w.metric({name:e,duration:l-t},n),s});const o=performance.now();return w.metric({name:e,duration:o-t},n),a}},H=e=>{var i;const n=(i=e.descendantWithPath("head"))==null?void 0:i.childrenNamed("meta").find(r=>r.attr.name==="calibre:cover");return!!(n&&n.attr.name==="calibre:cover")},J=e=>{var n,i,r;return(r=(i=(n=e.descendantWithPath("body"))==null?void 0:n.descendantWithPath("div"))==null?void 0:i.childrenNamed("svg"))==null?void 0:r.find(t=>t.attr.width==="100%"&&t.attr.preserveAspectRatio==="none")},q=({archive:e,resourcePath:n})=>async i=>{const r=Object.values(e.files).find(t=>t.uri===n);if(r!=null&&r.basename.endsWith(".xhtml")){const t=i.body??await r.string(),a=new v.XmlDocument(t);if(H(a)){const o=J(a);return o&&delete o.attr.preserveAspectRatio,{...i,body:a==null?void 0:a.toString()}}}return i},G=({archive:e,resourcePath:n})=>async i=>q({archive:e,resourcePath:n})(i),Y=({archive:e,resourcePath:n})=>async i=>{const r=Object.values(e.files).find(t=>t.uri===n);if(r!=null&&r.basename.endsWith(".css")){const a=(i.body??await r.string()).replaceAll("-webkit-writing-mode","writing-mode");return{...i,body:a}}return i},S=e=>{const i=Object.values(e.files).filter(r=>!r.dir).find(r=>r.uri.endsWith(".opf"));return{data:i,basePath:(i==null?void 0:i.uri.substring(0,i.uri.lastIndexOf("/")))||""}},I=(e,{opfBasePath:n,baseUrl:i})=>{const r={contents:[],path:"",href:"",title:""};let t=e.childNamed("span")||e.childNamed("a");r.title=(t==null?void 0:t.attr.title)||(t==null?void 0:t.val.trim())||r.title;let a=t==null?void 0:t.name;a!=="a"&&(t=e.descendantWithPath(`${a}.a`),t&&(a=t.name.toLowerCase())),a==="a"&&(t!=null&&t.attr.href)&&(r.path=b.urlJoin(n,t.attr.href),r.href=b.urlJoin(i,n,t.attr.href));const o=e.childNamed("ol");if(o){const s=o.childrenNamed("li");s&&s.length>0&&(r.contents=s.map(l=>I(l,{opfBasePath:n,baseUrl:i})))}return r},K=(e,{opfBasePath:n,baseUrl:i})=>{var a,o;const r=[];let t;return e.descendantWithPath("body.nav.ol")?t=(a=e.descendantWithPath("body.nav.ol"))==null?void 0:a.children:e.descendantWithPath("body.section.nav.ol")&&(t=(o=e.descendantWithPath("body.section.nav.ol"))==null?void 0:o.children),t&&t.length>0&&t.filter(s=>s.name==="li").forEach(s=>r.push(I(s,{opfBasePath:n,baseUrl:i}))),r},Q=async(e,n,{opfBasePath:i,baseUrl:r})=>{var a;const t=(a=e.childNamed("manifest"))==null?void 0:a.childrenNamed("item").find(o=>o.attr.properties==="nav");if(t){const o=Object.values(n.files).find(s=>s.uri.endsWith(t.attr.href||""));if(o){const s=new v.XmlDocument(await o.string());return K(s,{opfBasePath:i,baseUrl:r})}}},C=(e,{opfBasePath:n,baseUrl:i,prefix:r})=>{var s,l;const t=((s=e==null?void 0:e.childNamed(`${r}content`))==null?void 0:s.attr.src)||"",a={title:((l=e==null?void 0:e.descendantWithPath(`${r}navLabel.${r}text`))==null?void 0:l.val)||"",path:b.urlJoin(n,t),href:b.urlJoin(i,n,t),contents:[]},o=e.childrenNamed(`${r}navPoint`);return o&&o.length>0&&(a.contents=o.map(m=>C(m,{opfBasePath:n,baseUrl:i,prefix:r}))),a},Z=(e,{opfBasePath:n,baseUrl:i})=>{var o;const r=[],t=e.name;let a="";return t.indexOf(":")!==-1&&(a=t.split(":")[0]+":"),(o=e.childNamed(`${a}navMap`))==null||o.childrenNamed(`${a}navPoint`).forEach(s=>r.push(C(s,{opfBasePath:n,baseUrl:i,prefix:a}))),r},j=async({opfData:e,opfBasePath:n,baseUrl:i,archive:r})=>{var o;const t=e.childNamed("spine"),a=t&&t.attr.toc;if(a){const s=(o=e.childNamed("manifest"))==null?void 0:o.childrenNamed("item").find(l=>l.attr.id===a);if(s){const l=`${n}${n===""?"":"/"}${s.attr.href}`,m=Object.values(r.files).find(d=>d.uri.endsWith(l));if(m){const d=new v.XmlDocument(await m.string());return Z(d,{opfBasePath:n,baseUrl:i})}}}},ee=async(e,n,{baseUrl:i})=>{const{basePath:r}=S(n)||{},t=await j({opfData:e,opfBasePath:r,archive:n,baseUrl:i});return t||await Q(e,n,{opfBasePath:r,baseUrl:i})},te=async e=>{const n={renditionLayout:void 0};return await Promise.all(e.files.map(async i=>{var r,t;if(i.uri.endsWith("com.kobobooks.display-options.xml")){const o=(r=new v.XmlDocument(await i.string()).childNamed("platform"))==null?void 0:r.childNamed("option");((t=o==null?void 0:o.attr)==null?void 0:t.name)==="fixed-layout"&&o.val==="true"&&(n.renditionLayout="pre-paginated")}})),n},P=async({archive:e})=>{const{data:n,basePath:i}=S(e)||{},r=await(n==null?void 0:n.string());if(!r)return[];const t=new v.XmlDocument(r),a=t.childNamed("manifest"),o=t.childNamed("spine"),s=o==null?void 0:o.childrenNamed("itemref").map(d=>d.attr.idref),l=(a==null?void 0:a.childrenNamed("item").filter(d=>s.includes(d.attr.id||"")))||[];return e.files.filter(d=>l.find(g=>i?`${i}/${g.attr.href}`===d.uri:`${g.attr.href}`===d.uri))},D=e=>{var i;const n=e.childNamed("manifest");return((i=n==null?void 0:n.childrenNamed("item"))==null?void 0:i.map(r=>({href:r.attr.href||"",id:r.attr.id||"",mediaType:r.attr["media-type"]})))||[]},ne=({archive:e,baseUrl:n})=>async i=>{var B;const{data:r,basePath:t}=S(e)||{},a=await te(e);if(!r)return i;const o=await r.string();w.log(o,a);const s=new v.XmlDocument(o),l=await ee(s,e,{baseUrl:n})||[],m=s.childNamed("metadata"),d=s.childNamed("manifest"),g=s.childNamed("spine"),h=s.childNamed("guide"),N=m==null?void 0:m.childNamed("dc:title"),y=(m==null?void 0:m.childrenNamed("meta"))||[],R=y.find(u=>u.attr.property==="rendition:layout"),k=y.find(u=>u.attr.property==="rendition:flow"),L=y.find(u=>u.attr.property==="rendition:spread"),V=R==null?void 0:R.val,Ne=k==null?void 0:k.val,Te=L==null?void 0:L.val,Se=(N==null?void 0:N.val)||((B=e.files.find(({dir:u})=>u))==null?void 0:B.basename)||"",Ae=g==null?void 0:g.attr["page-progression-direction"],Re=(await P({archive:e})).reduce((u,p)=>p.size+u,0);return{filename:e.filename,nav:{toc:l},renditionLayout:V||a.renditionLayout||"reflowable",renditionFlow:Ne||"auto",renditionSpread:Te,title:Se,readingDirection:Ae||"ltr",spineItems:(g==null?void 0:g.childrenNamed("itemref").map(u=>{var E,_,x;const p=d==null?void 0:d.childrenNamed("item").find($=>$.attr.id===(u==null?void 0:u.attr.idref)),ke=(p==null?void 0:p.attr.href)||"",W=((E=u==null?void 0:u.attr.properties)==null?void 0:E.split(" "))||[],Le=((_=e.files.find($=>$.uri.endsWith(ke)))==null?void 0:_.size)||0,X=n??"";return{id:(p==null?void 0:p.attr.id)||"",href:(x=p==null?void 0:p.attr.href)!=null&&x.startsWith("https://")?p==null?void 0:p.attr.href:t?`${X}${t}/${p==null?void 0:p.attr.href}`:`${X}${p==null?void 0:p.attr.href}`,renditionLayout:V||"reflowable",...W.find($=>$==="rendition:layout-reflowable")&&{renditionLayout:"reflowable"},progressionWeight:Le/Re,pageSpreadLeft:W.some($=>$==="page-spread-left")||void 0,pageSpreadRight:W.some($=>$==="page-spread-right")||void 0,mediaType:p==null?void 0:p.attr["media-type"]}}))||[],items:D(s),guide:h==null?void 0:h.childrenNamed("reference").map(u=>({href:u.attr.href||"",title:u.attr.title||"",type:u.attr.type}))}},re=async(e,n)=>{var t,a;const r=await((t=S(e).data)==null?void 0:t.string());if(r){const o=new v.XmlDocument(r);return{mediaType:(a=D(o).find(l=>n.endsWith(l.href)))==null?void 0:a.mediaType}}return{mediaType:ae(n)}},ae=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"},ie=({archive:e,resourcePath:n})=>async i=>{const r=Object.values(e.files).find(a=>a.uri===n);if(!r)return i;const t=await re(e,n);return{...i,params:{...i.params,status:200,headers:{...(r==null?void 0:r.encodingFormat)&&{"Content-Type":r.encodingFormat},...t.mediaType&&{"Content-Type":t.mediaType}}}}},O=async(e,n)=>{const i=Object.values(e.files).find(a=>a.uri===n);if(!i)throw new Error("no file found");const r={params:{status:200}},t=[ie({archive:e,resourcePath:n}),Y({archive:e,resourcePath:n}),G({archive:e,resourcePath:n})];try{const a=await t.reduce(async(o,s)=>await s(await o),Promise.resolve(r));return w.log("Generated resource",n,a),{...a,body:a.body||await i.blob()}}catch(a){throw w.error(a),a}},oe=e=>({body:`
1
+ (function(f,b){typeof exports=="object"&&typeof module<"u"?b(exports,require("@prose-reader/shared"),require("xmldoc"),require("rxjs")):typeof define=="function"&&define.amd?define(["exports","@prose-reader/shared","xmldoc","rxjs"],b):(f=typeof globalThis<"u"?globalThis:f||self,b(f["prose-streamer"]={},f.shared,f.xmldoc,f.rxjs))})(this,function(f,b,v,c){"use strict";let S=!1;const w={enable:e=>{S=e},log:(...e)=>{S&&console.log("[prose-reader-streamer]",...e)},warn:(...e)=>{S&&console.warn("[prose-reader-streamer]",...e)},error:(...e)=>{console.error(...e)},time:e=>{S&&console.time(`[prose-reader-streamer] [metric] ${e}`)},timeEnd:e=>{S&&console.timeEnd(`[prose-reader-streamer] [metric] ${e}`)},metric:(e,n=1/0)=>{const i=typeof e=="number"?e:e.duration;S&&(e.duration<=n?console.log("[prose-reader-streamer] [metric] ",`${e.name} took ${i}ms`):console.warn("[prose-reader-streamer] [metric] ",`${e.name} took ${e.duration}ms which is above the ${n}ms target for this function`))},measurePerformance:(e,n=10,i)=>(...r)=>{const t=performance.now(),a=i(...r);if(a&&a.then)return a.then(s=>{const l=performance.now();return w.metric({name:e,duration:l-t},n),s});const o=performance.now();return w.metric({name:e,duration:o-t},n),a}},J=e=>{var i;const n=(i=e.descendantWithPath("head"))==null?void 0:i.childrenNamed("meta").find(r=>r.attr.name==="calibre:cover");return!!(n&&n.attr.name==="calibre:cover")},x=e=>{var n,i,r;return(r=(i=(n=e.descendantWithPath("body"))==null?void 0:n.descendantWithPath("div"))==null?void 0:i.childrenNamed("svg"))==null?void 0:r.find(t=>t.attr.width==="100%"&&t.attr.preserveAspectRatio==="none")},q=({archive:e,resourcePath:n})=>async i=>{const r=Object.values(e.files).find(t=>t.uri===n);if(r!=null&&r.basename.endsWith(".xhtml")){const t=i.body??await r.string(),a=new v.XmlDocument(t);if(J(a)){const o=x(a);return o&&delete o.attr.preserveAspectRatio,{...i,body:a==null?void 0:a.toString()}}}return i},G=({archive:e,resourcePath:n})=>async i=>q({archive:e,resourcePath:n})(i),Y=({archive:e,resourcePath:n})=>async i=>{const r=Object.values(e.files).find(t=>t.uri===n);if(r!=null&&r.basename.endsWith(".css")){const a=(i.body??await r.string()).replaceAll("-webkit-writing-mode","writing-mode");return{...i,body:a}}return i},T=e=>{const i=Object.values(e.files).filter(r=>!r.dir).find(r=>r.uri.endsWith(".opf"));return{data:i,basePath:(i==null?void 0:i.uri.substring(0,i.uri.lastIndexOf("/")))||""}},I=(e,{opfBasePath:n,baseUrl:i})=>{const r={contents:[],path:"",href:"",title:""};let t=e.childNamed("span")||e.childNamed("a");r.title=(t==null?void 0:t.attr.title)||(t==null?void 0:t.val.trim())||r.title;let a=t==null?void 0:t.name;a!=="a"&&(t=e.descendantWithPath(`${a}.a`),t&&(a=t.name.toLowerCase())),a==="a"&&(t!=null&&t.attr.href)&&(r.path=b.urlJoin(n,t.attr.href),r.href=b.urlJoin(i,n,t.attr.href));const o=e.childNamed("ol");if(o){const s=o.childrenNamed("li");s&&s.length>0&&(r.contents=s.map(l=>I(l,{opfBasePath:n,baseUrl:i})))}return r},K=(e,{opfBasePath:n,baseUrl:i})=>{var a,o;const r=[];let t;return e.descendantWithPath("body.nav.ol")?t=(a=e.descendantWithPath("body.nav.ol"))==null?void 0:a.children:e.descendantWithPath("body.section.nav.ol")&&(t=(o=e.descendantWithPath("body.section.nav.ol"))==null?void 0:o.children),t&&t.length>0&&t.filter(s=>s.name==="li").forEach(s=>r.push(I(s,{opfBasePath:n,baseUrl:i}))),r},Q=async(e,n,{opfBasePath:i,baseUrl:r})=>{var a;const t=(a=e.childNamed("manifest"))==null?void 0:a.childrenNamed("item").find(o=>o.attr.properties==="nav");if(t){const o=Object.values(n.files).find(s=>s.uri.endsWith(t.attr.href||""));if(o){const s=new v.XmlDocument(await o.string());return K(s,{opfBasePath:i,baseUrl:r})}}},C=(e,{opfBasePath:n,baseUrl:i,prefix:r})=>{var s,l;const t=((s=e==null?void 0:e.childNamed(`${r}content`))==null?void 0:s.attr.src)||"",a={title:((l=e==null?void 0:e.descendantWithPath(`${r}navLabel.${r}text`))==null?void 0:l.val)||"",path:b.urlJoin(n,t),href:b.urlJoin(i,n,t),contents:[]},o=e.childrenNamed(`${r}navPoint`);return o&&o.length>0&&(a.contents=o.map(m=>C(m,{opfBasePath:n,baseUrl:i,prefix:r}))),a},Z=(e,{opfBasePath:n,baseUrl:i})=>{var o;const r=[],t=e.name;let a="";return t.indexOf(":")!==-1&&(a=t.split(":")[0]+":"),(o=e.childNamed(`${a}navMap`))==null||o.childrenNamed(`${a}navPoint`).forEach(s=>r.push(C(s,{opfBasePath:n,baseUrl:i,prefix:a}))),r},j=async({opfData:e,opfBasePath:n,baseUrl:i,archive:r})=>{var o;const t=e.childNamed("spine"),a=t&&t.attr.toc;if(a){const s=(o=e.childNamed("manifest"))==null?void 0:o.childrenNamed("item").find(l=>l.attr.id===a);if(s){const l=`${n}${n===""?"":"/"}${s.attr.href}`,m=Object.values(r.files).find(d=>d.uri.endsWith(l));if(m){const d=new v.XmlDocument(await m.string());return Z(d,{opfBasePath:n,baseUrl:i})}}}},ee=async(e,n,{baseUrl:i})=>{const{basePath:r}=T(n)||{},t=await j({opfData:e,opfBasePath:r,archive:n,baseUrl:i});return t||await Q(e,n,{opfBasePath:r,baseUrl:i})},te=async e=>{const n={renditionLayout:void 0};return await Promise.all(e.files.map(async i=>{var r,t;if(i.uri.endsWith("com.kobobooks.display-options.xml")){const o=(r=new v.XmlDocument(await i.string()).childNamed("platform"))==null?void 0:r.childNamed("option");((t=o==null?void 0:o.attr)==null?void 0:t.name)==="fixed-layout"&&o.val==="true"&&(n.renditionLayout="pre-paginated")}})),n},P=async({archive:e})=>{const{data:n,basePath:i}=T(e)||{},r=await(n==null?void 0:n.string());if(!r)return[];const t=new v.XmlDocument(r),a=t.childNamed("manifest"),o=t.childNamed("spine"),s=o==null?void 0:o.childrenNamed("itemref").map(d=>d.attr.idref),l=(a==null?void 0:a.childrenNamed("item").filter(d=>s.includes(d.attr.id||"")))||[];return e.files.filter(d=>l.find(g=>i?`${i}/${g.attr.href}`===d.uri:`${g.attr.href}`===d.uri))},D=e=>{var i;const n=e.childNamed("manifest");return((i=n==null?void 0:n.childrenNamed("item"))==null?void 0:i.map(r=>({href:r.attr.href||"",id:r.attr.id||"",mediaType:r.attr["media-type"]})))||[]},ne=({archive:e,baseUrl:n})=>async i=>{var B;const{data:r,basePath:t}=T(e)||{},a=await te(e);if(!r)return i;const o=await r.string();w.log(o,a);const s=new v.XmlDocument(o),l=await ee(s,e,{baseUrl:n})||[],m=s.childNamed("metadata"),d=s.childNamed("manifest"),g=s.childNamed("spine"),h=s.childNamed("guide"),N=m==null?void 0:m.childNamed("dc:title"),y=(m==null?void 0:m.childrenNamed("meta"))||[],R=y.find(u=>u.attr.property==="rendition:layout"),k=y.find(u=>u.attr.property==="rendition:flow"),L=y.find(u=>u.attr.property==="rendition:spread"),V=R==null?void 0:R.val,Ne=k==null?void 0:k.val,Se=L==null?void 0:L.val,Te=(N==null?void 0:N.val)||((B=e.files.find(({dir:u})=>u))==null?void 0:B.basename)||"",Ae=g==null?void 0:g.attr["page-progression-direction"],Re=(await P({archive:e})).reduce((u,p)=>p.size+u,0);return{filename:e.filename,nav:{toc:l},renditionLayout:V||a.renditionLayout||"reflowable",renditionFlow:Ne||"auto",renditionSpread:Se,title:Te,readingDirection:Ae||"ltr",spineItems:(g==null?void 0:g.childrenNamed("itemref").map(u=>{var E,_,H;const p=d==null?void 0:d.childrenNamed("item").find($=>$.attr.id===(u==null?void 0:u.attr.idref)),ke=(p==null?void 0:p.attr.href)||"",W=((E=u==null?void 0:u.attr.properties)==null?void 0:E.split(" "))||[],Le=((_=e.files.find($=>$.uri.endsWith(ke)))==null?void 0:_.size)||0,X=n??"";return{id:(p==null?void 0:p.attr.id)||"",href:(H=p==null?void 0:p.attr.href)!=null&&H.startsWith("https://")?p==null?void 0:p.attr.href:t?`${X}${t}/${p==null?void 0:p.attr.href}`:`${X}${p==null?void 0:p.attr.href}`,renditionLayout:V||"reflowable",...W.find($=>$==="rendition:layout-reflowable")&&{renditionLayout:"reflowable"},progressionWeight:Le/Re,pageSpreadLeft:W.some($=>$==="page-spread-left")||void 0,pageSpreadRight:W.some($=>$==="page-spread-right")||void 0,mediaType:p==null?void 0:p.attr["media-type"]}}))||[],items:D(s),guide:h==null?void 0:h.childrenNamed("reference").map(u=>({href:u.attr.href||"",title:u.attr.title||"",type:u.attr.type}))}},re=async(e,n)=>{var t,a;const r=await((t=T(e).data)==null?void 0:t.string());if(r){const o=new v.XmlDocument(r);return{mediaType:(a=D(o).find(l=>n.endsWith(l.href)))==null?void 0:a.mediaType}}return{mediaType:ae(n)}},ae=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"},ie=({archive:e,resourcePath:n})=>async i=>{const r=Object.values(e.files).find(a=>a.uri===n);if(!r)return i;const t=await re(e,n);return{...i,params:{...i.params,status:200,headers:{...(r==null?void 0:r.encodingFormat)&&{"Content-Type":r.encodingFormat},...t.mediaType&&{"Content-Type":t.mediaType}}}}},M=async(e,n)=>{const i=Object.values(e.files).find(a=>a.uri===n);if(!i)throw new Error("no file found");const r={params:{status:200}},t=[ie({archive:e,resourcePath:n}),Y({archive:e,resourcePath:n}),G({archive:e,resourcePath:n})];try{const a=await t.reduce(async(o,s)=>await s(await o),Promise.resolve(r));return w.log("Generated resource",n,a),{...a,body:a.body||await i.blob()}}catch(a){throw w.error(a),a}},oe=e=>({body:`
2
2
  <!DOCTYPE html>
3
3
  <html xmlns="http://www.w3.org/1999/xhtml" xmlns:epub="http://www.idpf.org/2007/ops" xml:lang="en" lang="en">
4
4
  <head>
@@ -9,7 +9,7 @@
9
9
  </body>
10
10
  </html>
11
11
  `,params:{status:500,headers:{"Content-Type":"text/html;charset=UTF-8"}}}),se=({archive:e,baseUrl:n})=>async()=>{var r;const i=Object.values(e.files).filter(t=>!t.dir);return{filename:e.filename,title:((r=e.files.find(({dir:t})=>t))==null?void 0:r.basename.replace(/\/$/,""))||"",renditionLayout:"pre-paginated",renditionSpread:"auto",readingDirection:"ltr",spineItems:i.filter(t=>!t.basename.endsWith(".db")).map((t,a)=>({id:`${a}.${t.basename}`,href:encodeURI(`${n}${t.uri}`),renditionLayout:"pre-paginated",progressionWeight:1/i.length,pageSpreadLeft:void 0,pageSpreadRight:void 0,mediaType:t.encodingFormat})),items:i.map((t,a)=>({id:`${a}.${t.basename}`,href:`${n}${t.uri}`}))}},ce=({archive:e})=>async n=>{var a;const i=e.files.find(o=>o.basename.toLowerCase()==="comicinfo.xml");if(!i)return n;const r={...n,spineItems:n.spineItems.filter(o=>!o.id.toLowerCase().endsWith("comicinfo.xml")).map((o,s,l)=>({...o,progressionWeight:1/l.length}))},t=await i.string();try{const s=((a=new v.XmlDocument(t).childNamed("Manga"))==null?void 0:a.val)||"unknown";return{...r,readingDirection:s==="YesAndRightToLeft"?"rtl":"ltr"}}catch(o){return console.error(`Unable to parse comicinfo.xml for content
12
- `,t),console.error(o),r}},de=e=>{var i;const n=(i=e.descendantWithPath("head"))==null?void 0:i.childrenNamed("meta").find(r=>r.attr.name==="viewport");return!!(n&&n.attr.name==="viewport")},le=e=>e.reduce(async(n,i)=>{if(!await n||!b.isXmlBasedMimeType({mimeType:i.encodingFormat,uri:i.uri}))return!1;const t=await i.string();return t?de(new v.XmlDocument(t)):!1},Promise.resolve(!0)),me=({archive:e})=>async n=>{if(n.renditionLayout==="reflowable"&&n.spineItems.every(r=>r.renditionLayout==="reflowable")){const r=await P({archive:e});if(await le(r))return{...n,spineItems:n.spineItems.map(a=>({...a,renditionLayout:"pre-paginated"})),renditionLayout:"pre-paginated"}}return n},A=(e,n)=>{var t;const i=e.split(/(\d+)/),r=n.split(/(\d+)/);for(let a=0,o=i.length;a<o;a++)if(i[a]!==r[a])return(t=i[a])!=null&&t.match(/\d/)?+(i[a]||"")-+(r[a]||""):(i[a]||"").localeCompare(r[a]||"");return 1},pe=({archive:e,baseUrl:n})=>async i=>{if(i.nav)return i;const r=[...e.files].sort((a,o)=>A(a.uri,o.uri)),t=Object.values(r).reduce((a,o)=>{const s=o.uri.split("/");return!o.dir&&s.length>1&&s.forEach((m,d)=>{if(d===s.length-1)return;a.find(({title:N})=>N===m)||a.push({contents:[],href:b.urlJoin(n,encodeURI(o.uri)).replace(/\/$/,""),path:o.uri.replace(/\/$/,""),title:s[0]??""})}),a},[]);return t.length===0?i:{...i,nav:{toc:t}}},fe={filename:"",items:[],nav:{toc:[]},readingDirection:"ltr",renditionLayout:"pre-paginated",renditionSpread:"auto",spineItems:[],title:""},M=async(e,{baseUrl:n=""}={})=>{const i=[se({archive:e,baseUrl:n}),ne({archive:e,baseUrl:n}),me({archive:e,baseUrl:n}),ce({archive:e,baseUrl:n}),pe({archive:e,baseUrl:n})];try{const r=await i.reduce(async(t,a)=>await a(await t),Promise.resolve(fe));return w.log("Generated manifest",r),r}catch(r){throw w.error(r),r}},F=e=>e.substring(e.lastIndexOf("/")+1)||e,z=e=>e.endsWith("/")?e.slice(0,-1):e,ue=async(e,n)=>{const i=`
12
+ `,t),console.error(o),r}},de=e=>{var i;const n=(i=e.descendantWithPath("head"))==null?void 0:i.childrenNamed("meta").find(r=>r.attr.name==="viewport");return!!(n&&n.attr.name==="viewport")},le=e=>e.reduce(async(n,i)=>{if(!await n||!b.isXmlBasedMimeType({mimeType:i.encodingFormat,uri:i.uri}))return!1;const t=await i.string();return t?de(new v.XmlDocument(t)):!1},Promise.resolve(!0)),me=({archive:e})=>async n=>{if(n.renditionLayout==="reflowable"&&n.spineItems.every(r=>r.renditionLayout==="reflowable")){const r=await P({archive:e});if(await le(r))return{...n,spineItems:n.spineItems.map(a=>({...a,renditionLayout:"pre-paginated"})),renditionLayout:"pre-paginated"}}return n},A=(e,n)=>{var t;const i=e.split(/(\d+)/),r=n.split(/(\d+)/);for(let a=0,o=i.length;a<o;a++)if(i[a]!==r[a])return(t=i[a])!=null&&t.match(/\d/)?+(i[a]||"")-+(r[a]||""):(i[a]||"").localeCompare(r[a]||"");return 1},pe=({archive:e,baseUrl:n})=>async i=>{if(i.nav)return i;const r=[...e.files].sort((a,o)=>A(a.uri,o.uri)),t=Object.values(r).reduce((a,o)=>{const s=o.uri.split("/");return!o.dir&&s.length>1&&s.forEach((m,d)=>{if(d===s.length-1)return;a.find(({title:N})=>N===m)||a.push({contents:[],href:b.urlJoin(n,encodeURI(o.uri)).replace(/\/$/,""),path:o.uri.replace(/\/$/,""),title:s[0]??""})}),a},[]);return t.length===0?i:{...i,nav:{toc:t}}},fe={filename:"",items:[],nav:{toc:[]},readingDirection:"ltr",renditionLayout:"pre-paginated",renditionSpread:"auto",spineItems:[],title:""},O=async(e,{baseUrl:n=""}={})=>{const i=[se({archive:e,baseUrl:n}),ne({archive:e,baseUrl:n}),me({archive:e,baseUrl:n}),ce({archive:e,baseUrl:n}),pe({archive:e,baseUrl:n})];try{const r=await i.reduce(async(t,a)=>await a(await t),Promise.resolve(fe));return w.log("Generated manifest",r),r}catch(r){throw w.error(r),r}},F=e=>e.substring(e.lastIndexOf("/")+1)||e,z=e=>e.endsWith("/")?e.slice(0,-1):e,ue=async(e,n)=>{const i=`
13
13
  <?xml version="1.0" encoding="UTF-8"?><package xmlns="http://www.idpf.org/2007/opf" version="2.0" unique-identifier="bookid">
14
14
  <metadata>
15
15
  <meta property="rendition:layout">${n!=null&&n.useRenditionFlow?"reflowable":"pre-paginated"}</meta>
@@ -39,5 +39,5 @@
39
39
  <itemref idref="p01" />
40
40
  </spine>
41
41
  </package>
42
- `;return{filename:"content.txt",files:[{dir:!1,basename:F("generated.opf"),uri:"generated.opf",blob:async()=>new Blob([r]),string:async()=>r,base64:async()=>btoa(r),size:0},{dir:!1,basename:F("p01.txt"),uri:"p01.txt",blob:async()=>typeof e=="string"?new Blob([e]):e,string:async()=>typeof e=="string"?e:e.text(),base64:async()=>typeof e=="string"?btoa(e):he(e),size:typeof e=="string"?e.length:e.size,encodingFormat:n}],close:()=>Promise.resolve()}},ye=async(e,{orderByAlpha:n,name:i}={})=>{let r=Object.values(e.files);n&&(r=r.slice().sort((a,o)=>A(a.name,o.name)));const t={filename:i||"",files:r.map(a=>({dir:a.dir,basename:F(a.name),uri:a.name,blob:()=>a.async("blob"),string:()=>a.async("string"),base64:()=>a.async("base64"),...a.internalStream&&{stream:a.internalStream},size:a._data.uncompressedSize})),close:()=>Promise.resolve()};return w.log("Generated archive",t),t},be=async(e,{name:n}={})=>{const i=await e.getFilesArray(),r={close:()=>e.close(),filename:n??"",files:i.map(t=>({dir:!1,basename:t.file.name,size:t.file.size,uri:`${t.path}${t.file.name}`,base64:async()=>"",blob:async()=>await t.file.extract(),string:async()=>(await t.file.extract()).text()}))};return w.log("Generated archive",r),r},we=async(e,{orderByAlpha:n,name:i}={})=>{let r=e;return n&&(r=r.slice().sort((t,a)=>A(t.name,a.name))),{filename:i||"",files:r.map(t=>({dir:t.isDir,basename:F(t.name),uri:t.name,blob:async()=>new Blob([await t.data()]),string:async()=>{const a=await t.data();return String.fromCharCode.apply(null,Array.from(new Uint16Array(a)))},base64:async()=>"",size:t.size})),close:()=>Promise.resolve()}},ve=({enableReport:e}={})=>{w.enable(!!e)},$e=({getArchive:e,cleanArchiveAfter:n})=>{const i=new c.Subject,r=new c.Subject,t={},a=i.pipe(c.mergeMap(l=>{const m=t[l];return!m||m.getValue().status!=="idle"?c.EMPTY:(m.next({...m.getValue(),status:"loading"}),c.from(e(l)).pipe(c.map(d=>(m.next({...m.getValue(),archive:d,status:"success"}),{key:l,archiveEntry:m})),c.catchError(d=>{throw m.next({...m.getValue(),status:"error",error:d}),d})))}),c.catchError(()=>c.NEVER),c.shareReplay()),o=a.pipe(c.switchMap(({archiveEntry:l,key:m})=>l.pipe(c.map(({locks:h})=>h)).pipe(c.map(h=>h<=0),c.distinctUntilChanged()).pipe(c.switchMap(h=>h?c.timer(n):c.NEVER),c.tap(()=>{var h;delete t[m],(h=l.getValue().archive)==null||h.close()})))),s=l=>{let m=!1;const d=t[l]??new c.BehaviorSubject({archive:void 0,status:"idle",locks:0,error:void 0});t[l]=d,d.next({...d.getValue(),locks:d.getValue().locks+1});const g=()=>{m||(m=!0,d.next({...d.getValue(),locks:d.getValue().locks-1}))};i.next(l);const h=d.pipe(c.map(({archive:y})=>y),c.filter(y=>!!y)),N=d.pipe(c.tap(({error:y})=>{if(y)throw y}),c.ignoreElements());return c.merge(h,N).pipe(c.first(),c.map(y=>({archive:y,release:g})),c.catchError(y=>{throw g(),y}))};return c.merge(o,a).pipe(c.takeUntil(r)).subscribe(),{access:s}};class U{constructor({onError:n,...i}){this.onError=r=>new Response(String(r),{status:500}),this.epubLoader=$e(i),this.onError=n??this.onError}fetchManifest({key:n,baseUrl:i}){const r=this.epubLoader.access(n).pipe(c.mergeMap(({archive:t,release:a})=>c.from(M(t,{baseUrl:i})).pipe(c.map(s=>new Response(JSON.stringify(s),{status:200})),c.finalize(()=>{a()}))),c.catchError(t=>c.of(this.onError(t))));return c.lastValueFrom(r)}fetchResource({key:n,resourcePath:i}){const r=this.epubLoader.access(n).pipe(c.mergeMap(({archive:t,release:a})=>c.from(O(t,i)).pipe(c.map(s=>new Response(s.body,{status:200})),c.finalize(()=>{a()}))),c.catchError(t=>c.of(this.onError(t))));return c.lastValueFrom(r)}}class Fe extends U{constructor({getUriInfo:n,...i}){super(i),this.getUriInfo=n,this.fetchEventListener=this.fetchEventListener.bind(this)}fetchEventListener(n){try{const i=this.getUriInfo(n);if(!i)return;const r=z(i.baseUrl),t=n.request.url.substring(r.length+1),[a=""]=t.split("/"),o=decodeURIComponent(z(t.substring(a.length+1)));t.endsWith("/manifest")?n.respondWith(this.fetchManifest({key:a,baseUrl:`${r}/${a}/`})):n.respondWith(this.fetchResource({key:a,resourcePath:o}))}catch(i){n.respondWith(new Response(String(i),{status:500}))}}}f.ServiceWorkerStreamer=Fe,f.Streamer=U,f.configure=ve,f.createArchiveFromArrayBufferList=we,f.createArchiveFromJszip=ye,f.createArchiveFromLibArchive=be,f.createArchiveFromText=ge,f.createArchiveFromUrls=ue,f.generateManifestFromArchive=M,f.generateResourceFromArchive=O,f.generateResourceFromError=oe,f.getArchiveOpfInfo=S,Object.defineProperty(f,Symbol.toStringTag,{value:"Module"})});
42
+ `;return{filename:"content.txt",files:[{dir:!1,basename:F("generated.opf"),uri:"generated.opf",blob:async()=>new Blob([r]),string:async()=>r,base64:async()=>btoa(r),size:0},{dir:!1,basename:F("p01.txt"),uri:"p01.txt",blob:async()=>typeof e=="string"?new Blob([e]):e,string:async()=>typeof e=="string"?e:e.text(),base64:async()=>typeof e=="string"?btoa(e):he(e),size:typeof e=="string"?e.length:e.size,encodingFormat:n}],close:()=>Promise.resolve()}},ye=async(e,{orderByAlpha:n,name:i}={})=>{let r=Object.values(e.files);n&&(r=r.slice().sort((a,o)=>A(a.name,o.name)));const t={filename:i||"",files:r.map(a=>({dir:a.dir,basename:F(a.name),uri:a.name,blob:()=>a.async("blob"),string:()=>a.async("string"),base64:()=>a.async("base64"),...a.internalStream&&{stream:a.internalStream},size:a._data.uncompressedSize})),close:()=>Promise.resolve()};return w.log("Generated archive",t),t},be=async(e,{name:n}={})=>{const i=await e.getFilesArray(),r={close:()=>e.close(),filename:n??"",files:i.map(t=>({dir:!1,basename:t.file.name,size:t.file.size,uri:`${t.path}${t.file.name}`,base64:async()=>"",blob:async()=>await t.file.extract(),string:async()=>(await t.file.extract()).text()}))};return w.log("Generated archive",r),r},we=async(e,{orderByAlpha:n,name:i}={})=>{let r=e;return n&&(r=r.slice().sort((t,a)=>A(t.name,a.name))),{filename:i||"",files:r.map(t=>({dir:t.isDir,basename:F(t.name),uri:t.name,blob:async()=>new Blob([await t.data()]),string:async()=>{const a=await t.data();return String.fromCharCode.apply(null,Array.from(new Uint16Array(a)))},base64:async()=>"",size:t.size})),close:()=>Promise.resolve()}},ve=({enableReport:e}={})=>{w.enable(!!e)},$e=({getArchive:e,cleanArchiveAfter:n})=>{const i=new c.Subject,r=new c.Subject,t={},a=i.pipe(c.mergeMap(l=>{const m=t[l];return!m||m.getValue().status!=="idle"?c.EMPTY:(m.next({...m.getValue(),status:"loading"}),c.from(e(l)).pipe(c.map(d=>(m.next({...m.getValue(),archive:d,status:"success"}),{key:l,archiveEntry:m})),c.catchError(d=>{throw m.next({...m.getValue(),status:"error",error:d}),d})))}),c.catchError(()=>c.NEVER),c.shareReplay()),o=a.pipe(c.switchMap(({archiveEntry:l,key:m})=>l.pipe(c.map(({locks:h})=>h)).pipe(c.map(h=>h<=0),c.distinctUntilChanged()).pipe(c.switchMap(h=>h?c.timer(n):c.NEVER),c.tap(()=>{var h;delete t[m],(h=l.getValue().archive)==null||h.close()})))),s=l=>{let m=!1;const d=t[l]??new c.BehaviorSubject({archive:void 0,status:"idle",locks:0,error:void 0});t[l]=d,d.next({...d.getValue(),locks:d.getValue().locks+1});const g=()=>{m||(m=!0,d.next({...d.getValue(),locks:d.getValue().locks-1}))};i.next(l);const h=d.pipe(c.map(({archive:y})=>y),c.filter(y=>!!y)),N=d.pipe(c.tap(({error:y})=>{if(y)throw y}),c.ignoreElements());return c.merge(h,N).pipe(c.first(),c.map(y=>({archive:y,release:g})),c.catchError(y=>{throw g(),y}))};return c.merge(o,a).pipe(c.takeUntil(r)).subscribe(),{access:s}};class U{constructor({onError:n,onManifestSuccess:i,...r}){this.onError=t=>new Response(String(t),{status:500}),this.epubLoader=$e(r),this.onManifestSuccess=i??(({manifest:t})=>Promise.resolve(t)),this.onError=n??this.onError}fetchManifest({key:n,baseUrl:i}){const r=this.epubLoader.access(n).pipe(c.mergeMap(({archive:t,release:a})=>c.from(O(t,{baseUrl:i})).pipe(c.switchMap(s=>c.from(this.onManifestSuccess({manifest:s,archive:t}))),c.map(s=>new Response(JSON.stringify(s),{status:200})),c.finalize(()=>{a()}))),c.catchError(t=>c.of(this.onError(t))));return c.lastValueFrom(r)}fetchResource({key:n,resourcePath:i}){const r=this.epubLoader.access(n).pipe(c.mergeMap(({archive:t,release:a})=>c.from(M(t,i)).pipe(c.map(s=>new Response(s.body,{status:200})),c.finalize(()=>{a()}))),c.catchError(t=>c.of(this.onError(t))));return c.lastValueFrom(r)}}class Fe extends U{constructor({getUriInfo:n,...i}){super(i),this.getUriInfo=n,this.fetchEventListener=this.fetchEventListener.bind(this)}fetchEventListener(n){try{const i=this.getUriInfo(n);if(!i)return;const r=z(i.baseUrl),t=n.request.url.substring(r.length+1),[a=""]=t.split("/"),o=decodeURIComponent(z(t.substring(a.length+1)));t.endsWith("/manifest")?n.respondWith(this.fetchManifest({key:a,baseUrl:`${r}/${a}/`})):n.respondWith(this.fetchResource({key:a,resourcePath:o}))}catch(i){n.respondWith(new Response(String(i),{status:500}))}}}f.ServiceWorkerStreamer=Fe,f.Streamer=U,f.configure=ve,f.createArchiveFromArrayBufferList=we,f.createArchiveFromJszip=ye,f.createArchiveFromLibArchive=be,f.createArchiveFromText=ge,f.createArchiveFromUrls=ue,f.generateManifestFromArchive=O,f.generateResourceFromArchive=M,f.generateResourceFromError=oe,f.getArchiveOpfInfo=T,Object.defineProperty(f,Symbol.toStringTag,{value:"Module"})});
43
43
  //# sourceMappingURL=index.umd.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.umd.cjs","sources":["../src/report.ts","../src/generators/resources/hooks/calibreFixHook.ts","../src/generators/resources/hooks/cssFixHook.ts","../src/archives/getArchiveOpfInfo.ts","../src/parsers/nav.ts","../src/parsers/kobo.ts","../src/epub/getSpineItemFilesFromArchive.ts","../src/generators/manifest/hooks/epub.ts","../src/generators/resources/hooks/defaultHook.ts","../src/generators/resources/index.ts","../src/generators/manifest/hooks/default.ts","../src/generators/manifest/hooks/comicInfo.ts","../src/generators/manifest/hooks/epubOptimizer.ts","../src/utils/sortByTitleComparator.ts","../src/generators/manifest/hooks/navigationFallback.ts","../src/generators/manifest/index.ts","../src/utils/uri.ts","../src/archives/createArchiveFromUrls.ts","../src/utils/blobToBAse64.ts","../src/archives/createArchiveFromText.ts","../src/archives/createArchiveFromJszip.ts","../src/archives/createArchiveFromLibArchive.ts","../src/archives/createArchiveFromArrayBufferList.ts","../src/configure.ts","../src/archives/archiveLoader.ts","../src/Streamer.ts","../src/ServiceWorkerStreamer.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nlet enabled = false\n\nexport const Report = {\n enable: (enable: boolean) => {\n enabled = enable\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n log: (...data: any[]) => {\n if (enabled) {\n // eslint-disable-next-line no-console\n console.log(`[prose-reader-streamer]`, ...data)\n }\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n warn: (...data: any[]) => {\n if (enabled) {\n // eslint-disable-next-line no-console\n console.warn(`[prose-reader-streamer]`, ...data)\n }\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n error: (...data: any[]) => {\n // eslint-disable-next-line no-console\n console.error(...data)\n },\n time: (label?: string | undefined) => {\n if (enabled) {\n // eslint-disable-next-line no-console\n console.time(`[prose-reader-streamer] [metric] ${label}`)\n }\n },\n timeEnd: (label?: string | undefined) => {\n if (enabled) {\n // eslint-disable-next-line no-console\n console.timeEnd(`[prose-reader-streamer] [metric] ${label}`)\n }\n },\n metric: (\n performanceEntry: { name: string; duration: number },\n targetDuration = Infinity,\n ) => {\n const duration =\n typeof performanceEntry === `number`\n ? performanceEntry\n : performanceEntry.duration\n if (enabled) {\n if (performanceEntry.duration <= targetDuration) {\n // eslint-disable-next-line no-console\n console.log(\n `[prose-reader-streamer] [metric] `,\n `${performanceEntry.name} took ${duration}ms`,\n )\n } else {\n // eslint-disable-next-line no-console\n console.warn(\n `[prose-reader-streamer] [metric] `,\n `${performanceEntry.name} took ${performanceEntry.duration}ms which is above the ${targetDuration}ms target for this function`,\n )\n }\n }\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n measurePerformance: <F extends (...args: any[]) => any>(\n name: string,\n targetDuration = 10,\n functionToMeasure: F,\n ) => {\n return (...args: Parameters<F>): ReturnType<F> => {\n const t0 = performance.now()\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const response = functionToMeasure(...(args as any))\n\n if (response && response.then) {\n return response.then((res: any) => {\n const t1 = performance.now()\n Report.metric({ name, duration: t1 - t0 }, targetDuration)\n return res\n })\n }\n\n const t1 = performance.now()\n Report.metric({ name, duration: t1 - t0 }, targetDuration)\n\n return response\n }\n },\n}\n","import { XmlDocument } from \"xmldoc\"\nimport { Archive } from \"../../../archives/types\"\nimport { HookResource } from \"./types\"\n\nconst hasCalibreCoverMeta = (doc: XmlDocument) => {\n const metaElm = doc\n .descendantWithPath(\"head\")\n ?.childrenNamed(\"meta\")\n .find((node) => node.attr.name === \"calibre:cover\")\n\n return !!(metaElm && metaElm.attr.name === \"calibre:cover\")\n}\n\nconst getBuggyCoverSvg = (doc: XmlDocument) => {\n return doc\n .descendantWithPath(\"body\")\n ?.descendantWithPath(\"div\")\n ?.childrenNamed(\"svg\")\n ?.find(\n (node) =>\n node.attr.width === \"100%\" && node.attr.preserveAspectRatio === \"none\",\n )\n}\n\nconst fixBuggyCover =\n ({ archive, resourcePath }: { archive: Archive; resourcePath: string }) =>\n async (resource: HookResource): Promise<HookResource> => {\n const file = Object.values(archive.files).find(\n (file) => file.uri === resourcePath,\n )\n\n if (file?.basename.endsWith(`.xhtml`)) {\n const bodyToParse = resource.body ?? (await file.string())\n\n const opfXmlDoc = new XmlDocument(bodyToParse)\n\n if (hasCalibreCoverMeta(opfXmlDoc)) {\n const buggySvg = getBuggyCoverSvg(opfXmlDoc)\n\n if (buggySvg) {\n delete buggySvg.attr.preserveAspectRatio\n }\n\n return {\n ...resource,\n body: opfXmlDoc?.toString(),\n }\n }\n }\n\n return resource\n }\n\nexport const calibreFixHook =\n ({ archive, resourcePath }: { archive: Archive; resourcePath: string }) =>\n async (resource: HookResource): Promise<HookResource> => {\n return fixBuggyCover({ archive, resourcePath })(resource)\n }\n","import { Archive } from \"../../../archives/types\"\nimport { HookResource } from \"./types\"\n\nexport const cssFixHook =\n ({ archive, resourcePath }: { archive: Archive; resourcePath: string }) =>\n async (resource: HookResource): Promise<HookResource> => {\n const file = Object.values(archive.files).find(\n (file) => file.uri === resourcePath,\n )\n\n if (file?.basename.endsWith(`.css`)) {\n const bodyToParse = resource.body ?? (await file.string())\n\n /**\n * Fix the potentially invalid writing mode present on some vertical book.\n * This has the benefit of making it compatible with firefox as well.\n */\n const newBody = bodyToParse.replaceAll(\n `-webkit-writing-mode`,\n `writing-mode`,\n )\n\n return {\n ...resource,\n body: newBody,\n }\n }\n\n return resource\n }\n","import { Archive } from \"./types\"\n\nexport const getArchiveOpfInfo = (archive: Archive) => {\n const filesAsArray = Object.values(archive.files).filter((file) => !file.dir)\n const file = filesAsArray.find((file) => file.uri.endsWith(`.opf`))\n\n return {\n data: file,\n basePath: file?.uri.substring(0, file.uri.lastIndexOf(`/`)) || ``,\n }\n}\n","import xmldoc, { XmlElement } from \"xmldoc\"\nimport type { Manifest } from \"@prose-reader/shared\"\nimport { Archive, getArchiveOpfInfo } from \"..\"\nimport { urlJoin } from \"@prose-reader/shared\"\n\ntype Toc = NonNullable<Manifest[`nav`]>[`toc`]\ntype TocItem = NonNullable<Manifest[`nav`]>[`toc`][number]\n\nconst extractNavChapter = (\n li: XmlElement,\n { opfBasePath, baseUrl }: { opfBasePath: string; baseUrl: string },\n) => {\n const chp: TocItem = {\n contents: [],\n path: ``,\n href: ``,\n title: ``,\n }\n let contentNode = li.childNamed(`span`) || li.childNamed(`a`)\n chp.title = contentNode?.attr.title || contentNode?.val.trim() || chp.title\n let node = contentNode?.name\n if (node !== `a`) {\n contentNode = li.descendantWithPath(`${node}.a`)\n if (contentNode) {\n node = contentNode.name.toLowerCase()\n }\n }\n if (node === `a` && contentNode?.attr.href) {\n chp.path = urlJoin(opfBasePath, contentNode.attr.href)\n chp.href = urlJoin(baseUrl, opfBasePath, contentNode.attr.href)\n }\n const sublistNode = li.childNamed(`ol`)\n if (sublistNode) {\n const children = sublistNode.childrenNamed(`li`)\n if (children && children.length > 0) {\n chp.contents = children.map((child) =>\n extractNavChapter(child, { opfBasePath, baseUrl }),\n )\n }\n }\n\n return chp\n}\n\nconst buildTOCFromNav = (\n doc: xmldoc.XmlDocument,\n { opfBasePath, baseUrl }: { opfBasePath: string; baseUrl: string },\n) => {\n const toc: Toc = []\n\n let navDataChildren\n if (doc.descendantWithPath(`body.nav.ol`)) {\n navDataChildren = doc.descendantWithPath(`body.nav.ol`)?.children\n } else if (doc.descendantWithPath(`body.section.nav.ol`)) {\n navDataChildren = doc.descendantWithPath(`body.section.nav.ol`)?.children\n }\n\n if (navDataChildren && navDataChildren.length > 0) {\n navDataChildren\n .filter((li) => (li as XmlElement).name === `li`)\n .forEach((li) =>\n toc.push(extractNavChapter(li as XmlElement, { opfBasePath, baseUrl })),\n )\n }\n\n return toc\n}\n\nconst parseTocFromNavPath = async (\n opfXmlDoc: xmldoc.XmlDocument,\n archive: Archive,\n { opfBasePath, baseUrl }: { opfBasePath: string; baseUrl: string },\n) => {\n // Try to detect if there is a nav item\n const navItem = opfXmlDoc\n .childNamed(`manifest`)\n ?.childrenNamed(`item`)\n .find((child) => child.attr.properties === `nav`)\n\n if (navItem) {\n const tocFile = Object.values(archive.files).find((item) =>\n item.uri.endsWith(navItem.attr.href || ``),\n )\n if (tocFile) {\n const doc = new xmldoc.XmlDocument(await tocFile.string())\n return buildTOCFromNav(doc, { opfBasePath, baseUrl })\n }\n }\n}\n\nconst mapNcxChapter = (\n point: xmldoc.XmlElement,\n {\n opfBasePath,\n baseUrl,\n prefix,\n }: { opfBasePath: string; baseUrl: string; prefix: string },\n) => {\n const src = point?.childNamed(`${prefix}content`)?.attr.src || ``\n\n const out: TocItem = {\n title:\n point?.descendantWithPath(`${prefix}navLabel.${prefix}text`)?.val || ``,\n path: urlJoin(opfBasePath, src),\n href: urlJoin(baseUrl, opfBasePath, src),\n contents: [],\n }\n const children = point.childrenNamed(`${prefix}navPoint`)\n if (children && children.length > 0) {\n out.contents = children.map((pt) =>\n mapNcxChapter(pt, { opfBasePath, baseUrl, prefix }),\n )\n }\n\n return out\n}\n\nconst buildTOCFromNCX = (\n ncxData: xmldoc.XmlDocument,\n { opfBasePath, baseUrl }: { opfBasePath: string; baseUrl: string },\n) => {\n const toc: NonNullable<Manifest[`nav`]>[`toc`] = []\n\n const rootTagName = ncxData.name\n let prefix = ``\n if (rootTagName.indexOf(`:`) !== -1) {\n prefix = rootTagName.split(`:`)[0] + `:`\n }\n\n ncxData\n .childNamed(`${prefix}navMap`)\n ?.childrenNamed(`${prefix}navPoint`)\n .forEach((point) =>\n toc.push(mapNcxChapter(point, { opfBasePath, baseUrl, prefix })),\n )\n\n return toc\n}\n\nconst parseTocFromNcx = async ({\n opfData,\n opfBasePath,\n baseUrl,\n archive,\n}: {\n opfData: xmldoc.XmlDocument\n opfBasePath: string\n archive: Archive\n baseUrl: string\n}) => {\n const spine = opfData.childNamed(`spine`)\n const ncxId = spine && spine.attr.toc\n\n if (ncxId) {\n const ncxItem = opfData\n .childNamed(`manifest`)\n ?.childrenNamed(`item`)\n .find((item) => item.attr.id === ncxId)\n\n if (ncxItem) {\n const ncxPath = `${opfBasePath}${opfBasePath === `` ? `` : `/`}${ncxItem.attr.href}`\n\n const file = Object.values(archive.files).find((item) =>\n item.uri.endsWith(ncxPath),\n )\n\n if (file) {\n const ncxData = new xmldoc.XmlDocument(await file.string())\n\n return buildTOCFromNCX(ncxData, { opfBasePath, baseUrl })\n }\n }\n }\n}\n\nexport const parseToc = async (\n opfXmlDoc: xmldoc.XmlDocument,\n archive: Archive,\n { baseUrl }: { baseUrl: string },\n) => {\n const { basePath: opfBasePath } = getArchiveOpfInfo(archive) || {}\n\n const tocFromNcx = await parseTocFromNcx({\n opfData: opfXmlDoc,\n opfBasePath,\n archive,\n baseUrl,\n })\n\n if (tocFromNcx) {\n return tocFromNcx\n }\n\n return await parseTocFromNavPath(opfXmlDoc, archive, { opfBasePath, baseUrl })\n}\n","import xmldoc from \"xmldoc\"\nimport { Archive } from \"..\"\n\ntype KoboInformation = {\n renditionLayout?: `reflowable` | `pre-paginated` | undefined\n}\n\nexport const extractKoboInformationFromArchive = async (archive: Archive) => {\n const koboInformation: KoboInformation = {\n renditionLayout: undefined,\n }\n\n await Promise.all(\n archive.files.map(async (file) => {\n if (file.uri.endsWith(`com.kobobooks.display-options.xml`)) {\n const opfXmlDoc = new xmldoc.XmlDocument(await file.string())\n const optionElement = opfXmlDoc\n .childNamed(`platform`)\n ?.childNamed(`option`)\n if (\n optionElement?.attr?.name === `fixed-layout` &&\n optionElement.val === `true`\n ) {\n koboInformation.renditionLayout = `pre-paginated`\n }\n }\n }),\n )\n\n return koboInformation\n}\n","import xmldoc from \"xmldoc\"\nimport { getArchiveOpfInfo } from \"../archives/getArchiveOpfInfo\"\nimport { Archive } from \"../archives/types\"\n\nexport const getSpineItemFilesFromArchive = async ({\n archive,\n}: {\n archive: Archive\n}) => {\n const { data: opsFile, basePath: opfBasePath } =\n getArchiveOpfInfo(archive) || {}\n\n const data = await opsFile?.string()\n\n if (!data) return []\n\n const _opfXmlDoc = new xmldoc.XmlDocument(data)\n\n const manifestElm = _opfXmlDoc.childNamed(`manifest`)\n const spineElm = _opfXmlDoc.childNamed(`spine`)\n\n const spineItemIds = spineElm\n ?.childrenNamed(`itemref`)\n .map((item) => item.attr.idref) as string[]\n const manifestItemsFromSpine =\n manifestElm\n ?.childrenNamed(`item`)\n .filter((item) => spineItemIds.includes(item.attr.id || ``)) || []\n\n const archiveSpineItems = archive.files.filter((file) => {\n return manifestItemsFromSpine.find((item) => {\n if (!opfBasePath) return `${item.attr.href}` === file.uri\n return `${opfBasePath}/${item.attr.href}` === file.uri\n })\n })\n\n return archiveSpineItems\n}\n","import xmldoc from \"xmldoc\"\nimport { parseToc } from \"../../../parsers/nav\"\nimport type { Manifest } from \"@prose-reader/shared\"\nimport { extractKoboInformationFromArchive } from \"../../../parsers/kobo\"\nimport { Report } from \"../../../report\"\nimport { Archive } from \"../../../archives/types\"\nimport { getArchiveOpfInfo } from \"../../../archives/getArchiveOpfInfo\"\nimport { getSpineItemFilesFromArchive } from \"../../../epub/getSpineItemFilesFromArchive\"\n\ntype SpineItemProperties =\n | `rendition:layout-reflowable`\n | `page-spread-left`\n | `page-spread-right`\n\nexport const getItemsFromDoc = (doc: xmldoc.XmlDocument) => {\n const manifestElm = doc.childNamed(`manifest`)\n\n return (\n manifestElm?.childrenNamed(`item`)?.map((el) => ({\n href: el.attr.href || ``,\n id: el.attr.id || ``,\n mediaType: el.attr[`media-type`],\n })) || []\n )\n}\n\nexport const epubHook =\n ({ archive, baseUrl }: { archive: Archive; baseUrl: string }) =>\n async (manifest: Manifest): Promise<Manifest> => {\n const { data: opsFile, basePath: opfBasePath } =\n getArchiveOpfInfo(archive) || {}\n const koboInformation = await extractKoboInformationFromArchive(archive)\n\n if (!opsFile) {\n return manifest\n }\n\n const data = await opsFile.string()\n\n Report.log(data, koboInformation)\n\n const opfXmlDoc = new xmldoc.XmlDocument(data)\n\n const toc = (await parseToc(opfXmlDoc, archive, { baseUrl })) || []\n\n const metadataElm = opfXmlDoc.childNamed(`metadata`)\n const manifestElm = opfXmlDoc.childNamed(`manifest`)\n const spineElm = opfXmlDoc.childNamed(`spine`)\n const guideElm = opfXmlDoc.childNamed(`guide`)\n const titleElm = metadataElm?.childNamed(`dc:title`)\n const metaElmChildren = metadataElm?.childrenNamed(`meta`) || []\n const metaElmWithRendition = metaElmChildren.find(\n (meta) => meta.attr.property === `rendition:layout`,\n )\n const metaElmWithRenditionFlow = metaElmChildren.find(\n (meta) => meta.attr.property === `rendition:flow`,\n )\n const metaElmWithRenditionSpread = metaElmChildren.find(\n (meta) => meta.attr.property === `rendition:spread`,\n )\n\n const publisherRenditionLayout = metaElmWithRendition?.val as\n | `reflowable`\n | `pre-paginated`\n | undefined\n const publisherRenditionFlow = metaElmWithRenditionFlow?.val as\n | `scrolled-continuous`\n | `scrolled-doc`\n | `paginated`\n | `auto`\n | undefined\n const renditionSpread = metaElmWithRenditionSpread?.val as\n | `auto`\n | undefined\n\n const title =\n titleElm?.val || archive.files.find(({ dir }) => dir)?.basename || ``\n const pageProgressionDirection = spineElm?.attr[\n `page-progression-direction`\n ] as `ltr` | `rtl` | undefined\n\n const archiveSpineItems = await getSpineItemFilesFromArchive({ archive })\n\n const totalSize = archiveSpineItems.reduce(\n (size, file) => file.size + size,\n 0,\n )\n\n return {\n filename: archive.filename,\n nav: {\n toc,\n },\n renditionLayout:\n publisherRenditionLayout ||\n koboInformation.renditionLayout ||\n `reflowable`,\n renditionFlow: publisherRenditionFlow || `auto`,\n renditionSpread,\n title,\n readingDirection: pageProgressionDirection || `ltr`,\n spineItems:\n spineElm?.childrenNamed(`itemref`).map((itemrefElm) => {\n const manifestItem = manifestElm\n ?.childrenNamed(`item`)\n .find((item) => item.attr.id === itemrefElm?.attr.idref)\n const href = manifestItem?.attr.href || ``\n const properties = (itemrefElm?.attr.properties?.split(` `) ||\n []) as SpineItemProperties[]\n const itemSize =\n archive.files.find((file) => file.uri.endsWith(href))?.size || 0\n\n // we use base url or nothing (and stay relative)\n const hrefBaseUri = baseUrl ?? \"\"\n\n return {\n id: manifestItem?.attr.id || ``,\n href: manifestItem?.attr.href?.startsWith(`https://`)\n ? manifestItem?.attr.href\n : opfBasePath\n ? `${hrefBaseUri}${opfBasePath}/${manifestItem?.attr.href}`\n : `${hrefBaseUri}${manifestItem?.attr.href}`,\n renditionLayout: publisherRenditionLayout || `reflowable`,\n ...(properties.find(\n (property) => property === `rendition:layout-reflowable`,\n ) && {\n renditionLayout: `reflowable`,\n }),\n progressionWeight: itemSize / totalSize,\n pageSpreadLeft:\n properties.some((property) => property === `page-spread-left`) ||\n undefined,\n pageSpreadRight:\n properties.some((property) => property === `page-spread-right`) ||\n undefined,\n // size: itemSize\n mediaType: manifestItem?.attr[`media-type`],\n }\n }) || [],\n items: getItemsFromDoc(opfXmlDoc),\n guide: guideElm?.childrenNamed(`reference`).map((elm) => {\n return {\n href: elm.attr.href || ``,\n title: elm.attr.title || ``,\n type: elm.attr.type as NonNullable<Manifest[`guide`]>[number][`type`],\n }\n }),\n }\n }\n","import { getArchiveOpfInfo } from \"../../../archives/getArchiveOpfInfo\"\nimport { Archive } from \"../../../archives/types\"\nimport { getItemsFromDoc } from \"../../manifest/hooks/epub\"\nimport xmldoc from \"xmldoc\"\nimport { HookResource } from \"./types\"\n\nconst getMetadata = async (archive: Archive, resourcePath: string) => {\n const opfInfo = getArchiveOpfInfo(archive)\n const data = await opfInfo.data?.string()\n\n if (data) {\n const opfXmlDoc = new xmldoc.XmlDocument(data)\n const items = getItemsFromDoc(opfXmlDoc)\n\n return {\n mediaType: items.find((item) => resourcePath.endsWith(item.href))\n ?.mediaType,\n }\n }\n\n return {\n mediaType: getContentTypeFromExtension(resourcePath),\n }\n}\n\nconst getContentTypeFromExtension = (uri: string) => {\n if (uri.endsWith(`.css`)) {\n return `text/css; charset=UTF-8`\n }\n if (uri.endsWith(`.jpg`)) {\n return `image/jpg`\n }\n if (uri.endsWith(`.xhtml`)) {\n return `application/xhtml+xml`\n }\n if (uri.endsWith(`.mp4`)) {\n return `video/mp4`\n }\n if (uri.endsWith(`.svg`)) {\n return `image/svg+xml`\n }\n}\n\nexport const defaultHook =\n ({ archive, resourcePath }: { archive: Archive; resourcePath: string }) =>\n async (resource: HookResource): Promise<HookResource> => {\n const file = Object.values(archive.files).find(\n (file) => file.uri === resourcePath,\n )\n\n if (!file) return resource\n\n // if (file.stream) {\n // const stream = file.stream()\n\n // console.log(file, stream)\n // stream.on(`data`, data => {\n // console.log(`data`, data)\n // })\n // stream.on(`error`, data => {\n // console.error(`error`, data)\n // })\n // stream.on(`end`, () => {\n // console.log(`end`)\n // })\n\n // }\n\n // const stream = file.stream!()\n\n // const readableStream = new ReadableStream({\n // start(controller) {\n // function push() {\n // stream.on(`data`, data => {\n // controller.enqueue(data)\n // })\n // stream.on(`error`, data => {\n // console.error(`error`, data)\n // })\n // stream.on(`end`, () => {\n // controller.close()\n // })\n\n // stream.resume()\n // }\n\n // push();\n // }\n // })\n\n const metadata = await getMetadata(archive, resourcePath)\n\n return {\n ...resource,\n params: {\n ...resource.params,\n status: 200,\n headers: {\n ...(file?.encodingFormat && {\n \"Content-Type\": file.encodingFormat,\n }),\n ...(metadata.mediaType && {\n \"Content-Type\": metadata.mediaType,\n }),\n },\n },\n }\n }\n","import { PROSE_READER_RESOURCE_ERROR_INJECTED_META_NAME } from \"@prose-reader/shared\"\nimport { Archive } from \"../..\"\nimport { Report } from \"../../report\"\nimport { calibreFixHook } from \"./hooks/calibreFixHook\"\nimport { cssFixHook } from \"./hooks/cssFixHook\"\nimport { defaultHook } from \"./hooks/defaultHook\"\nimport { HookResource } from \"./hooks/types\"\n\nexport const generateResourceFromArchive = async (\n archive: Archive,\n resourcePath: string,\n) => {\n const file = Object.values(archive.files).find(\n (file) => file.uri === resourcePath,\n )\n\n if (!file) {\n throw new Error(`no file found`)\n }\n\n const defaultResource: HookResource = {\n params: {\n status: 200,\n },\n }\n\n const hooks = [\n defaultHook({ archive, resourcePath }),\n cssFixHook({ archive, resourcePath }),\n calibreFixHook({ archive, resourcePath }),\n ]\n\n try {\n const resource = await hooks.reduce(async (manifest, gen) => {\n return await gen(await manifest)\n }, Promise.resolve(defaultResource))\n\n Report.log(\"Generated resource\", resourcePath, resource)\n\n return {\n ...resource,\n body: resource.body || (await file.blob()),\n }\n } catch (e) {\n Report.error(e)\n\n throw e\n }\n}\n\nexport const generateResourceFromError = (error: unknown) => {\n return {\n body: `\n <!DOCTYPE html>\n <html xmlns=\"http://www.w3.org/1999/xhtml\" xmlns:epub=\"http://www.idpf.org/2007/ops\" xml:lang=\"en\" lang=\"en\">\n <head>\n <meta name=\"${PROSE_READER_RESOURCE_ERROR_INJECTED_META_NAME}\" content=\"${String(error)}\" />\n </head>\n <body>\n <pre>${String(error)}</pre>\n </body>\n </html>\n `,\n params: {\n status: 500,\n headers: {\n \"Content-Type\": \"text/html;charset=UTF-8\",\n },\n },\n }\n}\n\n// (() => {\n// fetch(\"https://miro.medium.com/fit/c/64/64/1*dmbNkD5D-u45r44go_cf0g.png\").then(async (response) => {\n// console.log(\"asdasd\")\n// const s = await response.text()\n// console.log(s)\n// debugger\n// }).catch(console.error)\n// })()\n","import { Manifest } from \"@prose-reader/shared\"\nimport { Archive } from \"../../../archives/types\"\n\nexport const defaultHook =\n ({ archive, baseUrl }: { archive: Archive; baseUrl: string }) =>\n async (): Promise<Manifest> => {\n const files = Object.values(archive.files).filter((file) => !file.dir)\n\n return {\n filename: archive.filename,\n title:\n archive.files.find(({ dir }) => dir)?.basename.replace(/\\/$/, ``) || ``,\n renditionLayout: `pre-paginated`,\n renditionSpread: `auto`,\n readingDirection: `ltr`,\n spineItems: files\n .filter((file) => !file.basename.endsWith(`.db`))\n .map((file, index) => ({\n // some books such as cbz can have same basename inside different sub folder\n // we need to make sure to have unique index\n // /chap01/01.png, /chap02/01.png, etc\n id: `${index}.${file.basename}`,\n href: encodeURI(`${baseUrl}${file.uri}`),\n renditionLayout: `pre-paginated`,\n progressionWeight: 1 / files.length,\n pageSpreadLeft: undefined,\n pageSpreadRight: undefined,\n mediaType: file.encodingFormat,\n })),\n items: files.map((file, index) => ({\n id: `${index}.${file.basename}`,\n href: `${baseUrl}${file.uri}`,\n })),\n }\n }\n","import { Manifest } from \"@prose-reader/shared\"\nimport xmldoc from \"xmldoc\"\nimport { Archive } from \"../../../archives/types\"\n\n/**\n * Handle archive which contains ComicInfo.xml. This is a meta file\n * used to define cbz, etc. I believe it comes from some sites or apps.\n */\nexport const comicInfoHook =\n ({ archive }: { archive: Archive; baseUrl: string }) =>\n async (manifest: Manifest): Promise<Manifest> => {\n const comicInfoFile = archive.files.find(\n (file) => file.basename.toLowerCase() === `comicinfo.xml`,\n )\n\n if (!comicInfoFile) {\n return manifest\n }\n\n const manifestWithoutComicInfo = {\n ...manifest,\n spineItems: manifest.spineItems\n .filter((item) => !item.id.toLowerCase().endsWith(`comicinfo.xml`))\n .map((item, _, items) => ({\n ...item,\n progressionWeight: 1 / items.length,\n })),\n }\n\n // @todo handle more meta\n const content = await comicInfoFile.string()\n\n try {\n const xmlDoc = new xmldoc.XmlDocument(content)\n\n const mangaVal =\n (xmlDoc.childNamed(`Manga`)?.val as `YesAndRightToLeft`) || `unknown`\n\n return {\n ...manifestWithoutComicInfo,\n readingDirection: mangaVal === `YesAndRightToLeft` ? `rtl` : `ltr`,\n }\n } catch (e) {\n console.error(\"Unable to parse comicinfo.xml for content\\n\", content)\n console.error(e)\n\n return manifestWithoutComicInfo\n }\n }\n","import { isXmlBasedMimeType, Manifest } from \"@prose-reader/shared\"\nimport xmldoc from \"xmldoc\"\nimport { Archive } from \"../../../archives/types\"\nimport { getSpineItemFilesFromArchive } from \"../../../epub/getSpineItemFilesFromArchive\"\n\nconst hasDocMetaViewport = (doc: xmldoc.XmlDocument) => {\n const metaElm = doc\n .descendantWithPath(\"head\")\n ?.childrenNamed(\"meta\")\n .find((node) => node.attr.name === \"viewport\")\n\n return !!(metaElm && metaElm.attr.name === \"viewport\")\n}\n\nconst allFilesHaveViewportMeta = (files: Archive[\"files\"]) =>\n files.reduce(async (result, current) => {\n const _result = await result\n\n if (!_result) return false\n\n if (\n !isXmlBasedMimeType({\n mimeType: current.encodingFormat,\n uri: current.uri,\n })\n ) {\n return false\n }\n\n const file = await current.string()\n\n if (!file) return false\n\n return hasDocMetaViewport(new xmldoc.XmlDocument(file))\n }, Promise.resolve(true))\n\nexport const epubOptimizerHook =\n ({ archive }: { archive: Archive; baseUrl: string }) =>\n async (manifest: Manifest): Promise<Manifest> => {\n const bookIsFullReflowable =\n manifest.renditionLayout === \"reflowable\" &&\n manifest.spineItems.every((item) => item.renditionLayout === \"reflowable\")\n\n if (bookIsFullReflowable) {\n const files = await getSpineItemFilesFromArchive({ archive })\n\n const hasAllViewport = await allFilesHaveViewportMeta(files)\n\n if (hasAllViewport) {\n return {\n ...manifest,\n spineItems: manifest.spineItems.map((item) => ({\n ...item,\n renditionLayout: \"pre-paginated\",\n })),\n renditionLayout: \"pre-paginated\",\n }\n }\n }\n\n return manifest\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 } else {\n return (alist[i] || ``).localeCompare(blist[i] || ``)\n }\n }\n }\n\n return 1\n}\n","import { Manifest, urlJoin } from \"@prose-reader/shared\"\nimport { Archive } from \"../../../archives/types\"\nimport { sortByTitleComparator } from \"../../../utils/sortByTitleComparator\"\n\n/**\n * In case no navigation was generated prior to this hook, we will try\n * to generate something based on the structure of the archive.\n *\n * We use folders as chapters.\n */\nexport const navigationFallbackHook =\n ({ archive, baseUrl }: { archive: Archive; baseUrl: string }) =>\n async (manifest: Manifest): Promise<Manifest> => {\n if (manifest.nav) return manifest\n\n const filesSortedByAlpha = [...archive.files].sort((a, b) =>\n sortByTitleComparator(a.uri, b.uri),\n )\n\n const toc: NonNullable<Manifest[\"nav\"]>[\"toc\"] = Object.values(\n filesSortedByAlpha,\n ).reduce(\n (acc, file) => {\n const parts = file.uri.split(\"/\")\n\n // we have a file that is\n const isFileUnderFolder = !file.dir && parts.length > 1\n\n if (isFileUnderFolder) {\n parts.forEach((part, level) => {\n const partIsFileName = level === parts.length - 1\n\n if (partIsFileName) return\n\n const existingTocItem = acc.find(({ title }) => title === part)\n\n if (existingTocItem) {\n // @todo\n } else {\n acc.push({\n contents: [],\n href: urlJoin(baseUrl, encodeURI(file.uri)).replace(/\\/$/, \"\"),\n path: file.uri.replace(/\\/$/, \"\"),\n title: parts[0] ?? \"\",\n })\n }\n })\n }\n\n return acc\n },\n [] as NonNullable<Manifest[\"nav\"]>[\"toc\"],\n )\n\n if (toc.length === 0) return manifest\n\n return {\n ...manifest,\n nav: {\n toc,\n },\n }\n }\n","import type { Manifest } from \"@prose-reader/shared\"\nimport { Report } from \"../../report\"\nimport { Archive } from \"../../archives/types\"\nimport { defaultHook } from \"./hooks/default\"\nimport { epubHook } from \"./hooks/epub\"\nimport { comicInfoHook } from \"./hooks/comicInfo\"\nimport { epubOptimizerHook } from \"./hooks/epubOptimizer\"\nimport { navigationFallbackHook } from \"./hooks/navigationFallback\"\n\nconst baseManifest: Manifest = {\n filename: ``,\n items: [],\n nav: {\n toc: [],\n },\n readingDirection: `ltr`,\n renditionLayout: `pre-paginated`,\n renditionSpread: `auto`,\n spineItems: [],\n title: ``,\n}\n\nexport const generateManifestFromArchive = async (\n archive: Archive,\n { baseUrl = `` }: { baseUrl?: string } = {},\n) => {\n const hooks = [\n defaultHook({ archive, baseUrl }),\n epubHook({ archive, baseUrl }),\n epubOptimizerHook({ archive, baseUrl }),\n comicInfoHook({ archive, baseUrl }),\n navigationFallbackHook({ archive, baseUrl }),\n ]\n\n try {\n const manifest = await hooks.reduce(async (manifest, gen) => {\n return await gen(await manifest)\n }, Promise.resolve(baseManifest))\n\n Report.log(\"Generated manifest\", manifest)\n\n return manifest\n } catch (e) {\n Report.error(e)\n\n throw e\n }\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","import { detectMimeTypeFromName } from \"@prose-reader/shared\"\nimport { getUriBasename } from \"../utils/uri\"\nimport { Archive } from \"./types\"\n\n/**\n * @important\n * Make sure the urls are on the same origin or the cors header is set otherwise\n * the resource cannot be consumed as it is on the web.\n */\nexport const createArchiveFromUrls = async (\n urls: string[],\n options?: { useRenditionFlow: boolean },\n): Promise<Archive> => {\n const opfFileData = `\n <?xml version=\"1.0\" encoding=\"UTF-8\"?><package xmlns=\"http://www.idpf.org/2007/opf\" version=\"2.0\" unique-identifier=\"bookid\">\n <metadata>\n <meta property=\"rendition:layout\">${options?.useRenditionFlow ? `reflowable` : `pre-paginated`}</meta>\n ${options?.useRenditionFlow ? `<meta property=\"rendition:flow\">scrolled-continuous</meta>` : ``}\n </metadata>\n <manifest>\n ${urls\n .map(\n (url) =>\n `<item id=\"${getUriBasename(url)}\" href=\"${url}\" media-type=\"${detectMimeTypeFromName(url)}\"/>`,\n )\n .join(`\\n`)}\n </manifest>\n <spine>\n ${urls.map((url) => `<itemref idref=\"${getUriBasename(url)}\" />`).join(`\\n`)}\n </spine>\n </package>\n `\n\n const filesFromUrl: Archive[`files`] = urls.map((url) => ({\n dir: false,\n basename: getUriBasename(url),\n encodingFormat: detectMimeTypeFromName(url),\n uri: url,\n size: 100 / urls.length,\n base64: async () => ``,\n blob: async () => new Blob(),\n string: async () => ``,\n }))\n\n const opfFile: Archive[`files`][number] = {\n dir: false,\n basename: `content.opf`,\n uri: `content.opf`,\n size: 0,\n base64: async () => opfFileData,\n blob: async () => new Blob(),\n string: async () => opfFileData,\n }\n\n return {\n filename: ``,\n files: [opfFile, ...filesFromUrl],\n close: () => Promise.resolve(),\n }\n}\n","export const blobToBase64 = async (blob: Blob) =>\n new Promise<string>((resolve) => {\n const reader = new FileReader()\n reader.readAsDataURL(blob)\n reader.onloadend = function () {\n const base64data = reader.result as string\n resolve(base64data)\n }\n })\n","import { blobToBase64 } from \"../utils/blobToBAse64\"\nimport { getUriBasename } from \"../utils/uri\"\nimport { Archive } from \"./types\"\n\n/**\n * Useful to create archive from txt content\n */\nexport const createArchiveFromText = async (\n content: string | Blob,\n {\n mimeType,\n direction,\n }: {\n direction?: `ltr` | `rtl`\n mimeType?: string\n } = { mimeType: \"text/plain\" },\n) => {\n const txtOpfContent = `\n <?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <package xmlns=\"http://www.idpf.org/2007/opf\" version=\"3.0\" xml:lang=\"ja\" prefix=\"rendition: http://www.idpf.org/vocab/rendition/#\"\n unique-identifier=\"ootuya-id\">\n <metadata xmlns:opf=\"http://www.idpf.org/2007/opf\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\"\n xmlns:dcterms=\"http://purl.org/dc/terms/\">\n <meta property=\"rendition:layout\">reflowable</meta>\n </metadata>\n <manifest>\n <item id=\"p01\" href=\"p01.txt\" media-type=\"text/plain\"/>\n </manifest>\n <spine page-progression-direction=\"${direction ?? `ltr`}\">\n <itemref idref=\"p01\" />\n </spine>\n </package>\n `\n\n const archive: Archive = {\n filename: `content.txt`,\n files: [\n {\n dir: false,\n basename: getUriBasename(`generated.opf`),\n uri: `generated.opf`,\n blob: async () => new Blob([txtOpfContent]),\n string: async () => txtOpfContent,\n base64: async () => btoa(txtOpfContent),\n size: 0,\n },\n {\n dir: false,\n basename: getUriBasename(`p01.txt`),\n uri: `p01.txt`,\n blob: async () => {\n if (typeof content === `string`) return new Blob([content])\n return content\n },\n string: async () => {\n if (typeof content === `string`) return content\n return content.text()\n },\n base64: async () => {\n if (typeof content === `string`) return btoa(content)\n return blobToBase64(content)\n },\n size: typeof content === `string` ? content.length : content.size,\n encodingFormat: mimeType,\n },\n ],\n close: () => Promise.resolve(),\n }\n\n return archive\n}\n","import { Report } from \"../report\"\nimport { sortByTitleComparator } from \"../utils/sortByTitleComparator\"\nimport { getUriBasename } from \"../utils/uri\"\nimport { Archive, StreamResult } from \"./types\"\n\ninterface OutputByType {\n base64: string\n string: string\n text: string\n binarystring: string\n array: number[]\n uint8array: Uint8Array\n arraybuffer: ArrayBuffer\n blob: Blob\n nodebuffer: Buffer\n}\n\ntype OutputType = keyof OutputByType\ninterface JSZipObject {\n name: string\n dir: boolean\n date: Date\n comment: string\n unixPermissions: number | string | null\n dosPermissions: number | null\n async<T extends OutputType>(type: T): Promise<OutputByType[T]>\n // nodeStream(type?: `nodebuffer`): NodeJS.ReadableStream;\n internalStream?: (type?: `uint8array`) => StreamResult\n}\n\ninterface JSZip {\n files: { [key: string]: JSZipObject }\n}\n\nexport const createArchiveFromJszip = async (\n jszip: JSZip,\n { orderByAlpha, name }: { orderByAlpha?: boolean; name?: string } = {},\n): Promise<Archive> => {\n let files = Object.values(jszip.files)\n\n if (orderByAlpha) {\n files = files.slice().sort((a, b) => sortByTitleComparator(a.name, b.name))\n }\n\n const archive = {\n filename: name || ``,\n files: files.map((file) => ({\n dir: file.dir,\n basename: getUriBasename(file.name),\n uri: file.name,\n blob: () => file.async(`blob`),\n string: () => file.async(`string`),\n base64: () => file.async(`base64`),\n ...(file.internalStream && {\n stream: file.internalStream,\n }),\n // this is private API\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n size: file._data.uncompressedSize,\n })),\n close: () => Promise.resolve(),\n }\n\n Report.log(\"Generated archive\", archive)\n\n return archive\n}\n","/**\n * @see https://github.com/nika-begiashvili/libarchivejs.\n *\n * Does not work in service worker due to usage of web worker.\n */\n/* eslint-disable @typescript-eslint/ban-types */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { Report } from \"../report\"\nimport { Archive } from \"./types\"\n\ninterface ArchiveReader {\n getFilesArray(): Promise<any[]>\n /**\n * Terminate worker to free up memory\n */\n close(): Promise<void>\n}\n\n/**\n * Represents compressed file before extraction\n */\ninterface CompressedFile {\n /**\n * File name\n */\n get name(): string\n /**\n * File size\n */\n get size(): number\n get lastModified(): number\n /**\n * Extract file from archive\n * @returns {Promise<File>} extracted file\n */\n extract(): any\n}\n\nexport const createArchiveFromLibArchive = async (\n libArchive: ArchiveReader,\n { name }: { orderByAlpha?: boolean; name?: string } = {},\n): Promise<Archive> => {\n const objArray = await libArchive.getFilesArray()\n\n const archive: Archive = {\n close: () => libArchive.close(),\n filename: name ?? ``,\n files: objArray.map((item: { file: CompressedFile; path: string }) => ({\n dir: false,\n basename: item.file.name,\n size: item.file.size,\n uri: `${item.path}${item.file.name}`,\n base64: async () => {\n return ``\n },\n blob: async () => {\n const file = await (item.file.extract() as Promise<File>)\n\n return file\n },\n string: async () => {\n const file = await (item.file.extract() as Promise<File>)\n\n return file.text()\n },\n })),\n }\n\n Report.log(\"Generated archive\", archive)\n\n return archive\n}\n","import { sortByTitleComparator } from \"../utils/sortByTitleComparator\"\nimport { getUriBasename } from \"../utils/uri\"\nimport { Archive } from \"./types\"\n\nexport const createArchiveFromArrayBufferList = async (\n list: {\n isDir: boolean\n name: string\n size: number\n data: () => Promise<ArrayBuffer>\n }[],\n { orderByAlpha, name }: { orderByAlpha?: boolean; name?: string } = {},\n): Promise<Archive> => {\n let files = list\n\n if (orderByAlpha) {\n files = files.slice().sort((a, b) => sortByTitleComparator(a.name, b.name))\n }\n\n return {\n filename: name || ``,\n files: files.map((file) => ({\n dir: file.isDir,\n basename: getUriBasename(file.name),\n uri: file.name,\n blob: async () => new Blob([await file.data()]),\n string: async () => {\n const data = await file.data()\n return String.fromCharCode.apply(\n null,\n Array.from(new Uint16Array(data)),\n )\n },\n base64: async () => {\n // @todo not used for now, lets implement it later if needed\n return ``\n },\n size: file.size,\n })),\n close: () => Promise.resolve(),\n }\n}\n","import { Report } from \"./report\"\n\nexport const configure = ({\n enableReport,\n}: { enableReport?: boolean } = {}) => {\n Report.enable(!!enableReport)\n}\n","import {\n BehaviorSubject,\n catchError,\n distinctUntilChanged,\n EMPTY,\n filter,\n first,\n from,\n ignoreElements,\n map,\n merge,\n mergeMap,\n NEVER,\n shareReplay,\n Subject,\n switchMap,\n takeUntil,\n tap,\n timer,\n} from \"rxjs\"\nimport { Archive } from \"./types\"\n\ntype ArchiveEntry = {\n status: \"idle\" | \"loading\" | \"success\" | \"error\"\n error: unknown\n archive: undefined | Archive\n locks: number\n}\n\nexport const createArchiveLoader = ({\n getArchive,\n cleanArchiveAfter,\n}: {\n getArchive: (key: string) => Promise<Archive>\n cleanArchiveAfter: number\n}) => {\n const loadSubject = new Subject<string>()\n const destroySubject = new Subject<void>()\n const archives: Record<string, BehaviorSubject<ArchiveEntry>> = {}\n\n const archiveLoaded$ = loadSubject.pipe(\n mergeMap((key) => {\n const archiveEntry = archives[key]\n\n if (!archiveEntry || archiveEntry.getValue().status !== \"idle\")\n return EMPTY\n\n archiveEntry.next({\n ...archiveEntry.getValue(),\n status: \"loading\",\n })\n\n return from(getArchive(key)).pipe(\n map((archive) => {\n archiveEntry.next({\n ...archiveEntry.getValue(),\n archive,\n status: \"success\",\n })\n\n return { key, archiveEntry }\n }),\n catchError((error) => {\n archiveEntry.next({\n ...archiveEntry.getValue(),\n status: \"error\",\n error,\n })\n\n throw error\n }),\n )\n }),\n catchError(() => NEVER),\n shareReplay(),\n )\n\n const cleanup$ = archiveLoaded$.pipe(\n switchMap(({ archiveEntry, key }) => {\n const locks$ = archiveEntry.pipe(map(({ locks }) => locks))\n const isUnlocked$ = locks$.pipe(\n map((locks) => locks <= 0),\n distinctUntilChanged(),\n )\n\n return isUnlocked$.pipe(\n switchMap((isUnlocked) =>\n !isUnlocked ? NEVER : timer(cleanArchiveAfter),\n ),\n tap(() => {\n delete archives[key]\n\n archiveEntry.getValue().archive?.close()\n }),\n )\n }),\n )\n\n const access = (key: string) => {\n let releaseCalled = false\n\n const archiveEntry =\n archives[key] ??\n new BehaviorSubject<ArchiveEntry>({\n archive: undefined,\n status: \"idle\",\n locks: 0,\n error: undefined,\n })\n\n archives[key] = archiveEntry\n\n archiveEntry.next({\n ...archiveEntry.getValue(),\n locks: archiveEntry.getValue().locks + 1,\n })\n\n const release = () => {\n if (releaseCalled) return\n\n releaseCalled = true\n\n archiveEntry.next({\n ...archiveEntry.getValue(),\n locks: archiveEntry.getValue().locks - 1,\n })\n }\n\n loadSubject.next(key)\n\n const archive$ = archiveEntry.pipe(\n map(({ archive }) => archive),\n filter((archive) => !!archive),\n )\n\n const error$ = archiveEntry.pipe(\n tap(({ error }) => {\n if (error) {\n throw error\n }\n }),\n ignoreElements(),\n )\n\n return merge(archive$, error$).pipe(\n first(),\n map((archive) => ({ archive, release })),\n catchError((error) => {\n release()\n\n throw error\n }),\n )\n }\n\n merge(cleanup$, archiveLoaded$).pipe(takeUntil(destroySubject)).subscribe()\n\n return {\n access,\n }\n}\n","import {\n catchError,\n finalize,\n from,\n lastValueFrom,\n map,\n mergeMap,\n of,\n} from \"rxjs\"\nimport { createArchiveLoader } from \"./archives/archiveLoader\"\nimport { Manifest } from \"@prose-reader/shared\"\nimport { generateManifestFromArchive } from \"./generators/manifest\"\nimport { generateResourceFromArchive } from \"./generators/resources\"\n\nexport class Streamer {\n epubLoader: ReturnType<typeof createArchiveLoader>\n onError = (error: unknown) => {\n return new Response(String(error), { status: 500 })\n }\n\n constructor({\n onError,\n ...rest\n }: Parameters<typeof createArchiveLoader>[0] & {\n onError?: (error: unknown) => Response\n }) {\n this.epubLoader = createArchiveLoader(rest)\n\n this.onError = onError ?? this.onError\n }\n\n public fetchManifest({ key, baseUrl }: { key: string; baseUrl?: string }) {\n const response$ = this.epubLoader.access(key).pipe(\n mergeMap(({ archive, release }) => {\n const manifest$ = from(\n generateManifestFromArchive(archive, { baseUrl }),\n )\n\n return manifest$.pipe(\n map(\n (manifest) =>\n new Response(JSON.stringify(manifest satisfies Manifest), {\n status: 200,\n }),\n ),\n finalize(() => {\n release()\n }),\n )\n }),\n catchError((error) => {\n return of(this.onError(error))\n }),\n )\n\n return lastValueFrom(response$)\n }\n\n public fetchResource({\n key,\n resourcePath,\n }: {\n key: string\n resourcePath: string\n }) {\n const response$ = this.epubLoader.access(key).pipe(\n mergeMap(({ archive, release }) => {\n const manifest$ = from(\n generateResourceFromArchive(archive, resourcePath),\n )\n\n return manifest$.pipe(\n map((resource) => new Response(resource.body, { status: 200 })),\n finalize(() => {\n release()\n }),\n )\n }),\n catchError((error) => {\n return of(this.onError(error))\n }),\n )\n\n return lastValueFrom(response$)\n }\n}\n","import { Streamer } from \"./Streamer\"\nimport { removeTrailingSlash } from \"./utils/uri\"\n\ntype ConflictFreeWebWorkerFetchEvent = {\n readonly request: Request\n /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/FetchEvent/respondWith) */\n respondWith(r: Response | PromiseLike<Response>): void\n}\n\nexport class ServiceWorkerStreamer extends Streamer {\n protected getUriInfo: (event: ConflictFreeWebWorkerFetchEvent) =>\n | {\n baseUrl: string\n }\n | undefined\n\n constructor({\n getUriInfo,\n ...rest\n }: ConstructorParameters<typeof Streamer>[0] & {\n getUriInfo: (event: ConflictFreeWebWorkerFetchEvent) =>\n | {\n baseUrl: string\n }\n | undefined\n }) {\n super(rest)\n\n this.getUriInfo = getUriInfo\n this.fetchEventListener = this.fetchEventListener.bind(this)\n }\n\n fetchEventListener(event: ConflictFreeWebWorkerFetchEvent) {\n try {\n const uriInfo = this.getUriInfo(event)\n\n if (!uriInfo) return\n\n const baseUrl = removeTrailingSlash(uriInfo.baseUrl)\n const streamerPath = event.request.url.substring(\n baseUrl.length + `/`.length,\n )\n const [key = ``] = streamerPath.split(\"/\")\n const resourcePath = decodeURIComponent(\n removeTrailingSlash(streamerPath.substring(key.length + `/`.length)),\n )\n\n if (streamerPath.endsWith(`/manifest`)) {\n event.respondWith(\n this.fetchManifest({ key, baseUrl: `${baseUrl}/${key}/` }),\n )\n } else {\n event.respondWith(this.fetchResource({ key, resourcePath }))\n }\n } catch (e) {\n event.respondWith(new Response(String(e), { status: 500 }))\n }\n }\n}\n"],"names":["enabled","Report","enable","data","label","performanceEntry","targetDuration","duration","name","functionToMeasure","args","t0","response","res","t1","hasCalibreCoverMeta","doc","metaElm","_a","node","getBuggyCoverSvg","_c","_b","fixBuggyCover","archive","resourcePath","resource","file","bodyToParse","opfXmlDoc","XmlDocument","buggySvg","calibreFixHook","cssFixHook","newBody","getArchiveOpfInfo","extractNavChapter","li","opfBasePath","baseUrl","chp","contentNode","urlJoin","sublistNode","children","child","buildTOCFromNav","toc","navDataChildren","parseTocFromNavPath","navItem","tocFile","item","xmldoc","mapNcxChapter","point","prefix","src","out","pt","buildTOCFromNCX","ncxData","rootTagName","parseTocFromNcx","opfData","spine","ncxId","ncxItem","ncxPath","parseToc","tocFromNcx","extractKoboInformationFromArchive","koboInformation","optionElement","getSpineItemFilesFromArchive","opsFile","_opfXmlDoc","manifestElm","spineElm","spineItemIds","manifestItemsFromSpine","getItemsFromDoc","el","epubHook","manifest","metadataElm","guideElm","titleElm","metaElmChildren","metaElmWithRendition","meta","metaElmWithRenditionFlow","metaElmWithRenditionSpread","publisherRenditionLayout","publisherRenditionFlow","renditionSpread","title","dir","pageProgressionDirection","totalSize","size","itemrefElm","manifestItem","href","properties","itemSize","hrefBaseUri","property","elm","getMetadata","getContentTypeFromExtension","uri","defaultHook","metadata","generateResourceFromArchive","defaultResource","hooks","gen","e","generateResourceFromError","error","PROSE_READER_RESOURCE_ERROR_INJECTED_META_NAME","files","index","comicInfoHook","comicInfoFile","manifestWithoutComicInfo","_","items","content","mangaVal","hasDocMetaViewport","allFilesHaveViewportMeta","result","current","isXmlBasedMimeType","epubOptimizerHook","sortByTitleComparator","a","b","alist","blist","i","len","navigationFallbackHook","filesSortedByAlpha","acc","parts","part","level","baseManifest","generateManifestFromArchive","getUriBasename","removeTrailingSlash","createArchiveFromUrls","urls","options","opfFileData","url","detectMimeTypeFromName","filesFromUrl","blobToBase64","blob","resolve","reader","base64data","createArchiveFromText","mimeType","direction","txtOpfContent","createArchiveFromJszip","jszip","orderByAlpha","createArchiveFromLibArchive","libArchive","objArray","createArchiveFromArrayBufferList","list","configure","enableReport","createArchiveLoader","getArchive","cleanArchiveAfter","loadSubject","Subject","destroySubject","archives","archiveLoaded$","mergeMap","key","archiveEntry","EMPTY","from","map","catchError","NEVER","shareReplay","cleanup$","switchMap","locks","distinctUntilChanged","isUnlocked","timer","tap","access","releaseCalled","BehaviorSubject","release","archive$","filter","error$","ignoreElements","merge","first","takeUntil","Streamer","onError","rest","response$","finalize","of","lastValueFrom","ServiceWorkerStreamer","getUriInfo","event","uriInfo","streamerPath"],"mappings":"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"}
1
+ {"version":3,"file":"index.umd.cjs","sources":["../src/report.ts","../src/generators/resources/hooks/calibreFixHook.ts","../src/generators/resources/hooks/cssFixHook.ts","../src/archives/getArchiveOpfInfo.ts","../src/parsers/nav.ts","../src/parsers/kobo.ts","../src/epub/getSpineItemFilesFromArchive.ts","../src/generators/manifest/hooks/epub.ts","../src/generators/resources/hooks/defaultHook.ts","../src/generators/resources/index.ts","../src/generators/manifest/hooks/default.ts","../src/generators/manifest/hooks/comicInfo.ts","../src/generators/manifest/hooks/epubOptimizer.ts","../src/utils/sortByTitleComparator.ts","../src/generators/manifest/hooks/navigationFallback.ts","../src/generators/manifest/index.ts","../src/utils/uri.ts","../src/archives/createArchiveFromUrls.ts","../src/utils/blobToBAse64.ts","../src/archives/createArchiveFromText.ts","../src/archives/createArchiveFromJszip.ts","../src/archives/createArchiveFromLibArchive.ts","../src/archives/createArchiveFromArrayBufferList.ts","../src/configure.ts","../src/archives/archiveLoader.ts","../src/Streamer.ts","../src/ServiceWorkerStreamer.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any */\nlet enabled = false\n\nexport const Report = {\n enable: (enable: boolean) => {\n enabled = enable\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n log: (...data: any[]) => {\n if (enabled) {\n // eslint-disable-next-line no-console\n console.log(`[prose-reader-streamer]`, ...data)\n }\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n warn: (...data: any[]) => {\n if (enabled) {\n // eslint-disable-next-line no-console\n console.warn(`[prose-reader-streamer]`, ...data)\n }\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n error: (...data: any[]) => {\n // eslint-disable-next-line no-console\n console.error(...data)\n },\n time: (label?: string | undefined) => {\n if (enabled) {\n // eslint-disable-next-line no-console\n console.time(`[prose-reader-streamer] [metric] ${label}`)\n }\n },\n timeEnd: (label?: string | undefined) => {\n if (enabled) {\n // eslint-disable-next-line no-console\n console.timeEnd(`[prose-reader-streamer] [metric] ${label}`)\n }\n },\n metric: (\n performanceEntry: { name: string; duration: number },\n targetDuration = Infinity,\n ) => {\n const duration =\n typeof performanceEntry === `number`\n ? performanceEntry\n : performanceEntry.duration\n if (enabled) {\n if (performanceEntry.duration <= targetDuration) {\n // eslint-disable-next-line no-console\n console.log(\n `[prose-reader-streamer] [metric] `,\n `${performanceEntry.name} took ${duration}ms`,\n )\n } else {\n // eslint-disable-next-line no-console\n console.warn(\n `[prose-reader-streamer] [metric] `,\n `${performanceEntry.name} took ${performanceEntry.duration}ms which is above the ${targetDuration}ms target for this function`,\n )\n }\n }\n },\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n measurePerformance: <F extends (...args: any[]) => any>(\n name: string,\n targetDuration = 10,\n functionToMeasure: F,\n ) => {\n return (...args: Parameters<F>): ReturnType<F> => {\n const t0 = performance.now()\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const response = functionToMeasure(...(args as any))\n\n if (response && response.then) {\n return response.then((res: any) => {\n const t1 = performance.now()\n Report.metric({ name, duration: t1 - t0 }, targetDuration)\n return res\n })\n }\n\n const t1 = performance.now()\n Report.metric({ name, duration: t1 - t0 }, targetDuration)\n\n return response\n }\n },\n}\n","import { XmlDocument } from \"xmldoc\"\nimport { Archive } from \"../../../archives/types\"\nimport { HookResource } from \"./types\"\n\nconst hasCalibreCoverMeta = (doc: XmlDocument) => {\n const metaElm = doc\n .descendantWithPath(\"head\")\n ?.childrenNamed(\"meta\")\n .find((node) => node.attr.name === \"calibre:cover\")\n\n return !!(metaElm && metaElm.attr.name === \"calibre:cover\")\n}\n\nconst getBuggyCoverSvg = (doc: XmlDocument) => {\n return doc\n .descendantWithPath(\"body\")\n ?.descendantWithPath(\"div\")\n ?.childrenNamed(\"svg\")\n ?.find(\n (node) =>\n node.attr.width === \"100%\" && node.attr.preserveAspectRatio === \"none\",\n )\n}\n\nconst fixBuggyCover =\n ({ archive, resourcePath }: { archive: Archive; resourcePath: string }) =>\n async (resource: HookResource): Promise<HookResource> => {\n const file = Object.values(archive.files).find(\n (file) => file.uri === resourcePath,\n )\n\n if (file?.basename.endsWith(`.xhtml`)) {\n const bodyToParse = resource.body ?? (await file.string())\n\n const opfXmlDoc = new XmlDocument(bodyToParse)\n\n if (hasCalibreCoverMeta(opfXmlDoc)) {\n const buggySvg = getBuggyCoverSvg(opfXmlDoc)\n\n if (buggySvg) {\n delete buggySvg.attr.preserveAspectRatio\n }\n\n return {\n ...resource,\n body: opfXmlDoc?.toString(),\n }\n }\n }\n\n return resource\n }\n\nexport const calibreFixHook =\n ({ archive, resourcePath }: { archive: Archive; resourcePath: string }) =>\n async (resource: HookResource): Promise<HookResource> => {\n return fixBuggyCover({ archive, resourcePath })(resource)\n }\n","import { Archive } from \"../../../archives/types\"\nimport { HookResource } from \"./types\"\n\nexport const cssFixHook =\n ({ archive, resourcePath }: { archive: Archive; resourcePath: string }) =>\n async (resource: HookResource): Promise<HookResource> => {\n const file = Object.values(archive.files).find(\n (file) => file.uri === resourcePath,\n )\n\n if (file?.basename.endsWith(`.css`)) {\n const bodyToParse = resource.body ?? (await file.string())\n\n /**\n * Fix the potentially invalid writing mode present on some vertical book.\n * This has the benefit of making it compatible with firefox as well.\n */\n const newBody = bodyToParse.replaceAll(\n `-webkit-writing-mode`,\n `writing-mode`,\n )\n\n return {\n ...resource,\n body: newBody,\n }\n }\n\n return resource\n }\n","import { Archive } from \"./types\"\n\nexport const getArchiveOpfInfo = (archive: Archive) => {\n const filesAsArray = Object.values(archive.files).filter((file) => !file.dir)\n const file = filesAsArray.find((file) => file.uri.endsWith(`.opf`))\n\n return {\n data: file,\n basePath: file?.uri.substring(0, file.uri.lastIndexOf(`/`)) || ``,\n }\n}\n","import xmldoc, { XmlElement } from \"xmldoc\"\nimport type { Manifest } from \"@prose-reader/shared\"\nimport { Archive, getArchiveOpfInfo } from \"..\"\nimport { urlJoin } from \"@prose-reader/shared\"\n\ntype Toc = NonNullable<Manifest[`nav`]>[`toc`]\ntype TocItem = NonNullable<Manifest[`nav`]>[`toc`][number]\n\nconst extractNavChapter = (\n li: XmlElement,\n { opfBasePath, baseUrl }: { opfBasePath: string; baseUrl: string },\n) => {\n const chp: TocItem = {\n contents: [],\n path: ``,\n href: ``,\n title: ``,\n }\n let contentNode = li.childNamed(`span`) || li.childNamed(`a`)\n chp.title = contentNode?.attr.title || contentNode?.val.trim() || chp.title\n let node = contentNode?.name\n if (node !== `a`) {\n contentNode = li.descendantWithPath(`${node}.a`)\n if (contentNode) {\n node = contentNode.name.toLowerCase()\n }\n }\n if (node === `a` && contentNode?.attr.href) {\n chp.path = urlJoin(opfBasePath, contentNode.attr.href)\n chp.href = urlJoin(baseUrl, opfBasePath, contentNode.attr.href)\n }\n const sublistNode = li.childNamed(`ol`)\n if (sublistNode) {\n const children = sublistNode.childrenNamed(`li`)\n if (children && children.length > 0) {\n chp.contents = children.map((child) =>\n extractNavChapter(child, { opfBasePath, baseUrl }),\n )\n }\n }\n\n return chp\n}\n\nconst buildTOCFromNav = (\n doc: xmldoc.XmlDocument,\n { opfBasePath, baseUrl }: { opfBasePath: string; baseUrl: string },\n) => {\n const toc: Toc = []\n\n let navDataChildren\n if (doc.descendantWithPath(`body.nav.ol`)) {\n navDataChildren = doc.descendantWithPath(`body.nav.ol`)?.children\n } else if (doc.descendantWithPath(`body.section.nav.ol`)) {\n navDataChildren = doc.descendantWithPath(`body.section.nav.ol`)?.children\n }\n\n if (navDataChildren && navDataChildren.length > 0) {\n navDataChildren\n .filter((li) => (li as XmlElement).name === `li`)\n .forEach((li) =>\n toc.push(extractNavChapter(li as XmlElement, { opfBasePath, baseUrl })),\n )\n }\n\n return toc\n}\n\nconst parseTocFromNavPath = async (\n opfXmlDoc: xmldoc.XmlDocument,\n archive: Archive,\n { opfBasePath, baseUrl }: { opfBasePath: string; baseUrl: string },\n) => {\n // Try to detect if there is a nav item\n const navItem = opfXmlDoc\n .childNamed(`manifest`)\n ?.childrenNamed(`item`)\n .find((child) => child.attr.properties === `nav`)\n\n if (navItem) {\n const tocFile = Object.values(archive.files).find((item) =>\n item.uri.endsWith(navItem.attr.href || ``),\n )\n if (tocFile) {\n const doc = new xmldoc.XmlDocument(await tocFile.string())\n return buildTOCFromNav(doc, { opfBasePath, baseUrl })\n }\n }\n}\n\nconst mapNcxChapter = (\n point: xmldoc.XmlElement,\n {\n opfBasePath,\n baseUrl,\n prefix,\n }: { opfBasePath: string; baseUrl: string; prefix: string },\n) => {\n const src = point?.childNamed(`${prefix}content`)?.attr.src || ``\n\n const out: TocItem = {\n title:\n point?.descendantWithPath(`${prefix}navLabel.${prefix}text`)?.val || ``,\n path: urlJoin(opfBasePath, src),\n href: urlJoin(baseUrl, opfBasePath, src),\n contents: [],\n }\n const children = point.childrenNamed(`${prefix}navPoint`)\n if (children && children.length > 0) {\n out.contents = children.map((pt) =>\n mapNcxChapter(pt, { opfBasePath, baseUrl, prefix }),\n )\n }\n\n return out\n}\n\nconst buildTOCFromNCX = (\n ncxData: xmldoc.XmlDocument,\n { opfBasePath, baseUrl }: { opfBasePath: string; baseUrl: string },\n) => {\n const toc: NonNullable<Manifest[`nav`]>[`toc`] = []\n\n const rootTagName = ncxData.name\n let prefix = ``\n if (rootTagName.indexOf(`:`) !== -1) {\n prefix = rootTagName.split(`:`)[0] + `:`\n }\n\n ncxData\n .childNamed(`${prefix}navMap`)\n ?.childrenNamed(`${prefix}navPoint`)\n .forEach((point) =>\n toc.push(mapNcxChapter(point, { opfBasePath, baseUrl, prefix })),\n )\n\n return toc\n}\n\nconst parseTocFromNcx = async ({\n opfData,\n opfBasePath,\n baseUrl,\n archive,\n}: {\n opfData: xmldoc.XmlDocument\n opfBasePath: string\n archive: Archive\n baseUrl: string\n}) => {\n const spine = opfData.childNamed(`spine`)\n const ncxId = spine && spine.attr.toc\n\n if (ncxId) {\n const ncxItem = opfData\n .childNamed(`manifest`)\n ?.childrenNamed(`item`)\n .find((item) => item.attr.id === ncxId)\n\n if (ncxItem) {\n const ncxPath = `${opfBasePath}${opfBasePath === `` ? `` : `/`}${ncxItem.attr.href}`\n\n const file = Object.values(archive.files).find((item) =>\n item.uri.endsWith(ncxPath),\n )\n\n if (file) {\n const ncxData = new xmldoc.XmlDocument(await file.string())\n\n return buildTOCFromNCX(ncxData, { opfBasePath, baseUrl })\n }\n }\n }\n}\n\nexport const parseToc = async (\n opfXmlDoc: xmldoc.XmlDocument,\n archive: Archive,\n { baseUrl }: { baseUrl: string },\n) => {\n const { basePath: opfBasePath } = getArchiveOpfInfo(archive) || {}\n\n const tocFromNcx = await parseTocFromNcx({\n opfData: opfXmlDoc,\n opfBasePath,\n archive,\n baseUrl,\n })\n\n if (tocFromNcx) {\n return tocFromNcx\n }\n\n return await parseTocFromNavPath(opfXmlDoc, archive, { opfBasePath, baseUrl })\n}\n","import xmldoc from \"xmldoc\"\nimport { Archive } from \"..\"\n\ntype KoboInformation = {\n renditionLayout?: `reflowable` | `pre-paginated` | undefined\n}\n\nexport const extractKoboInformationFromArchive = async (archive: Archive) => {\n const koboInformation: KoboInformation = {\n renditionLayout: undefined,\n }\n\n await Promise.all(\n archive.files.map(async (file) => {\n if (file.uri.endsWith(`com.kobobooks.display-options.xml`)) {\n const opfXmlDoc = new xmldoc.XmlDocument(await file.string())\n const optionElement = opfXmlDoc\n .childNamed(`platform`)\n ?.childNamed(`option`)\n if (\n optionElement?.attr?.name === `fixed-layout` &&\n optionElement.val === `true`\n ) {\n koboInformation.renditionLayout = `pre-paginated`\n }\n }\n }),\n )\n\n return koboInformation\n}\n","import xmldoc from \"xmldoc\"\nimport { getArchiveOpfInfo } from \"../archives/getArchiveOpfInfo\"\nimport { Archive } from \"../archives/types\"\n\nexport const getSpineItemFilesFromArchive = async ({\n archive,\n}: {\n archive: Archive\n}) => {\n const { data: opsFile, basePath: opfBasePath } =\n getArchiveOpfInfo(archive) || {}\n\n const data = await opsFile?.string()\n\n if (!data) return []\n\n const _opfXmlDoc = new xmldoc.XmlDocument(data)\n\n const manifestElm = _opfXmlDoc.childNamed(`manifest`)\n const spineElm = _opfXmlDoc.childNamed(`spine`)\n\n const spineItemIds = spineElm\n ?.childrenNamed(`itemref`)\n .map((item) => item.attr.idref) as string[]\n const manifestItemsFromSpine =\n manifestElm\n ?.childrenNamed(`item`)\n .filter((item) => spineItemIds.includes(item.attr.id || ``)) || []\n\n const archiveSpineItems = archive.files.filter((file) => {\n return manifestItemsFromSpine.find((item) => {\n if (!opfBasePath) return `${item.attr.href}` === file.uri\n return `${opfBasePath}/${item.attr.href}` === file.uri\n })\n })\n\n return archiveSpineItems\n}\n","import xmldoc from \"xmldoc\"\nimport { parseToc } from \"../../../parsers/nav\"\nimport type { Manifest } from \"@prose-reader/shared\"\nimport { extractKoboInformationFromArchive } from \"../../../parsers/kobo\"\nimport { Report } from \"../../../report\"\nimport { Archive } from \"../../../archives/types\"\nimport { getArchiveOpfInfo } from \"../../../archives/getArchiveOpfInfo\"\nimport { getSpineItemFilesFromArchive } from \"../../../epub/getSpineItemFilesFromArchive\"\n\ntype SpineItemProperties =\n | `rendition:layout-reflowable`\n | `page-spread-left`\n | `page-spread-right`\n\nexport const getItemsFromDoc = (doc: xmldoc.XmlDocument) => {\n const manifestElm = doc.childNamed(`manifest`)\n\n return (\n manifestElm?.childrenNamed(`item`)?.map((el) => ({\n href: el.attr.href || ``,\n id: el.attr.id || ``,\n mediaType: el.attr[`media-type`],\n })) || []\n )\n}\n\nexport const epubHook =\n ({ archive, baseUrl }: { archive: Archive; baseUrl: string }) =>\n async (manifest: Manifest): Promise<Manifest> => {\n const { data: opsFile, basePath: opfBasePath } =\n getArchiveOpfInfo(archive) || {}\n const koboInformation = await extractKoboInformationFromArchive(archive)\n\n if (!opsFile) {\n return manifest\n }\n\n const data = await opsFile.string()\n\n Report.log(data, koboInformation)\n\n const opfXmlDoc = new xmldoc.XmlDocument(data)\n\n const toc = (await parseToc(opfXmlDoc, archive, { baseUrl })) || []\n\n const metadataElm = opfXmlDoc.childNamed(`metadata`)\n const manifestElm = opfXmlDoc.childNamed(`manifest`)\n const spineElm = opfXmlDoc.childNamed(`spine`)\n const guideElm = opfXmlDoc.childNamed(`guide`)\n const titleElm = metadataElm?.childNamed(`dc:title`)\n const metaElmChildren = metadataElm?.childrenNamed(`meta`) || []\n const metaElmWithRendition = metaElmChildren.find(\n (meta) => meta.attr.property === `rendition:layout`,\n )\n const metaElmWithRenditionFlow = metaElmChildren.find(\n (meta) => meta.attr.property === `rendition:flow`,\n )\n const metaElmWithRenditionSpread = metaElmChildren.find(\n (meta) => meta.attr.property === `rendition:spread`,\n )\n\n const publisherRenditionLayout = metaElmWithRendition?.val as\n | `reflowable`\n | `pre-paginated`\n | undefined\n const publisherRenditionFlow = metaElmWithRenditionFlow?.val as\n | `scrolled-continuous`\n | `scrolled-doc`\n | `paginated`\n | `auto`\n | undefined\n const renditionSpread = metaElmWithRenditionSpread?.val as\n | `auto`\n | undefined\n\n const title =\n titleElm?.val || archive.files.find(({ dir }) => dir)?.basename || ``\n const pageProgressionDirection = spineElm?.attr[\n `page-progression-direction`\n ] as `ltr` | `rtl` | undefined\n\n const archiveSpineItems = await getSpineItemFilesFromArchive({ archive })\n\n const totalSize = archiveSpineItems.reduce(\n (size, file) => file.size + size,\n 0,\n )\n\n return {\n filename: archive.filename,\n nav: {\n toc,\n },\n renditionLayout:\n publisherRenditionLayout ||\n koboInformation.renditionLayout ||\n `reflowable`,\n renditionFlow: publisherRenditionFlow || `auto`,\n renditionSpread,\n title,\n readingDirection: pageProgressionDirection || `ltr`,\n spineItems:\n spineElm?.childrenNamed(`itemref`).map((itemrefElm) => {\n const manifestItem = manifestElm\n ?.childrenNamed(`item`)\n .find((item) => item.attr.id === itemrefElm?.attr.idref)\n const href = manifestItem?.attr.href || ``\n const properties = (itemrefElm?.attr.properties?.split(` `) ||\n []) as SpineItemProperties[]\n const itemSize =\n archive.files.find((file) => file.uri.endsWith(href))?.size || 0\n\n // we use base url or nothing (and stay relative)\n const hrefBaseUri = baseUrl ?? \"\"\n\n return {\n id: manifestItem?.attr.id || ``,\n href: manifestItem?.attr.href?.startsWith(`https://`)\n ? manifestItem?.attr.href\n : opfBasePath\n ? `${hrefBaseUri}${opfBasePath}/${manifestItem?.attr.href}`\n : `${hrefBaseUri}${manifestItem?.attr.href}`,\n renditionLayout: publisherRenditionLayout || `reflowable`,\n ...(properties.find(\n (property) => property === `rendition:layout-reflowable`,\n ) && {\n renditionLayout: `reflowable`,\n }),\n progressionWeight: itemSize / totalSize,\n pageSpreadLeft:\n properties.some((property) => property === `page-spread-left`) ||\n undefined,\n pageSpreadRight:\n properties.some((property) => property === `page-spread-right`) ||\n undefined,\n // size: itemSize\n mediaType: manifestItem?.attr[`media-type`],\n }\n }) || [],\n items: getItemsFromDoc(opfXmlDoc),\n guide: guideElm?.childrenNamed(`reference`).map((elm) => {\n return {\n href: elm.attr.href || ``,\n title: elm.attr.title || ``,\n type: elm.attr.type as NonNullable<Manifest[`guide`]>[number][`type`],\n }\n }),\n }\n }\n","import { getArchiveOpfInfo } from \"../../../archives/getArchiveOpfInfo\"\nimport { Archive } from \"../../../archives/types\"\nimport { getItemsFromDoc } from \"../../manifest/hooks/epub\"\nimport xmldoc from \"xmldoc\"\nimport { HookResource } from \"./types\"\n\nconst getMetadata = async (archive: Archive, resourcePath: string) => {\n const opfInfo = getArchiveOpfInfo(archive)\n const data = await opfInfo.data?.string()\n\n if (data) {\n const opfXmlDoc = new xmldoc.XmlDocument(data)\n const items = getItemsFromDoc(opfXmlDoc)\n\n return {\n mediaType: items.find((item) => resourcePath.endsWith(item.href))\n ?.mediaType,\n }\n }\n\n return {\n mediaType: getContentTypeFromExtension(resourcePath),\n }\n}\n\nconst getContentTypeFromExtension = (uri: string) => {\n if (uri.endsWith(`.css`)) {\n return `text/css; charset=UTF-8`\n }\n if (uri.endsWith(`.jpg`)) {\n return `image/jpg`\n }\n if (uri.endsWith(`.xhtml`)) {\n return `application/xhtml+xml`\n }\n if (uri.endsWith(`.mp4`)) {\n return `video/mp4`\n }\n if (uri.endsWith(`.svg`)) {\n return `image/svg+xml`\n }\n}\n\nexport const defaultHook =\n ({ archive, resourcePath }: { archive: Archive; resourcePath: string }) =>\n async (resource: HookResource): Promise<HookResource> => {\n const file = Object.values(archive.files).find(\n (file) => file.uri === resourcePath,\n )\n\n if (!file) return resource\n\n // if (file.stream) {\n // const stream = file.stream()\n\n // console.log(file, stream)\n // stream.on(`data`, data => {\n // console.log(`data`, data)\n // })\n // stream.on(`error`, data => {\n // console.error(`error`, data)\n // })\n // stream.on(`end`, () => {\n // console.log(`end`)\n // })\n\n // }\n\n // const stream = file.stream!()\n\n // const readableStream = new ReadableStream({\n // start(controller) {\n // function push() {\n // stream.on(`data`, data => {\n // controller.enqueue(data)\n // })\n // stream.on(`error`, data => {\n // console.error(`error`, data)\n // })\n // stream.on(`end`, () => {\n // controller.close()\n // })\n\n // stream.resume()\n // }\n\n // push();\n // }\n // })\n\n const metadata = await getMetadata(archive, resourcePath)\n\n return {\n ...resource,\n params: {\n ...resource.params,\n status: 200,\n headers: {\n ...(file?.encodingFormat && {\n \"Content-Type\": file.encodingFormat,\n }),\n ...(metadata.mediaType && {\n \"Content-Type\": metadata.mediaType,\n }),\n },\n },\n }\n }\n","import { PROSE_READER_RESOURCE_ERROR_INJECTED_META_NAME } from \"@prose-reader/shared\"\nimport { Archive } from \"../..\"\nimport { Report } from \"../../report\"\nimport { calibreFixHook } from \"./hooks/calibreFixHook\"\nimport { cssFixHook } from \"./hooks/cssFixHook\"\nimport { defaultHook } from \"./hooks/defaultHook\"\nimport { HookResource } from \"./hooks/types\"\n\nexport const generateResourceFromArchive = async (\n archive: Archive,\n resourcePath: string,\n) => {\n const file = Object.values(archive.files).find(\n (file) => file.uri === resourcePath,\n )\n\n if (!file) {\n throw new Error(`no file found`)\n }\n\n const defaultResource: HookResource = {\n params: {\n status: 200,\n },\n }\n\n const hooks = [\n defaultHook({ archive, resourcePath }),\n cssFixHook({ archive, resourcePath }),\n calibreFixHook({ archive, resourcePath }),\n ]\n\n try {\n const resource = await hooks.reduce(async (manifest, gen) => {\n return await gen(await manifest)\n }, Promise.resolve(defaultResource))\n\n Report.log(\"Generated resource\", resourcePath, resource)\n\n return {\n ...resource,\n body: resource.body || (await file.blob()),\n }\n } catch (e) {\n Report.error(e)\n\n throw e\n }\n}\n\nexport const generateResourceFromError = (error: unknown) => {\n return {\n body: `\n <!DOCTYPE html>\n <html xmlns=\"http://www.w3.org/1999/xhtml\" xmlns:epub=\"http://www.idpf.org/2007/ops\" xml:lang=\"en\" lang=\"en\">\n <head>\n <meta name=\"${PROSE_READER_RESOURCE_ERROR_INJECTED_META_NAME}\" content=\"${String(error)}\" />\n </head>\n <body>\n <pre>${String(error)}</pre>\n </body>\n </html>\n `,\n params: {\n status: 500,\n headers: {\n \"Content-Type\": \"text/html;charset=UTF-8\",\n },\n },\n }\n}\n\n// (() => {\n// fetch(\"https://miro.medium.com/fit/c/64/64/1*dmbNkD5D-u45r44go_cf0g.png\").then(async (response) => {\n// console.log(\"asdasd\")\n// const s = await response.text()\n// console.log(s)\n// debugger\n// }).catch(console.error)\n// })()\n","import { Manifest } from \"@prose-reader/shared\"\nimport { Archive } from \"../../../archives/types\"\n\nexport const defaultHook =\n ({ archive, baseUrl }: { archive: Archive; baseUrl: string }) =>\n async (): Promise<Manifest> => {\n const files = Object.values(archive.files).filter((file) => !file.dir)\n\n return {\n filename: archive.filename,\n title:\n archive.files.find(({ dir }) => dir)?.basename.replace(/\\/$/, ``) || ``,\n renditionLayout: `pre-paginated`,\n renditionSpread: `auto`,\n readingDirection: `ltr`,\n spineItems: files\n .filter((file) => !file.basename.endsWith(`.db`))\n .map((file, index) => ({\n // some books such as cbz can have same basename inside different sub folder\n // we need to make sure to have unique index\n // /chap01/01.png, /chap02/01.png, etc\n id: `${index}.${file.basename}`,\n href: encodeURI(`${baseUrl}${file.uri}`),\n renditionLayout: `pre-paginated`,\n progressionWeight: 1 / files.length,\n pageSpreadLeft: undefined,\n pageSpreadRight: undefined,\n mediaType: file.encodingFormat,\n })),\n items: files.map((file, index) => ({\n id: `${index}.${file.basename}`,\n href: `${baseUrl}${file.uri}`,\n })),\n }\n }\n","import { Manifest } from \"@prose-reader/shared\"\nimport xmldoc from \"xmldoc\"\nimport { Archive } from \"../../../archives/types\"\n\n/**\n * Handle archive which contains ComicInfo.xml. This is a meta file\n * used to define cbz, etc. I believe it comes from some sites or apps.\n */\nexport const comicInfoHook =\n ({ archive }: { archive: Archive; baseUrl: string }) =>\n async (manifest: Manifest): Promise<Manifest> => {\n const comicInfoFile = archive.files.find(\n (file) => file.basename.toLowerCase() === `comicinfo.xml`,\n )\n\n if (!comicInfoFile) {\n return manifest\n }\n\n const manifestWithoutComicInfo = {\n ...manifest,\n spineItems: manifest.spineItems\n .filter((item) => !item.id.toLowerCase().endsWith(`comicinfo.xml`))\n .map((item, _, items) => ({\n ...item,\n progressionWeight: 1 / items.length,\n })),\n }\n\n // @todo handle more meta\n const content = await comicInfoFile.string()\n\n try {\n const xmlDoc = new xmldoc.XmlDocument(content)\n\n const mangaVal =\n (xmlDoc.childNamed(`Manga`)?.val as `YesAndRightToLeft`) || `unknown`\n\n return {\n ...manifestWithoutComicInfo,\n readingDirection: mangaVal === `YesAndRightToLeft` ? `rtl` : `ltr`,\n }\n } catch (e) {\n console.error(\"Unable to parse comicinfo.xml for content\\n\", content)\n console.error(e)\n\n return manifestWithoutComicInfo\n }\n }\n","import { isXmlBasedMimeType, Manifest } from \"@prose-reader/shared\"\nimport xmldoc from \"xmldoc\"\nimport { Archive } from \"../../../archives/types\"\nimport { getSpineItemFilesFromArchive } from \"../../../epub/getSpineItemFilesFromArchive\"\n\nconst hasDocMetaViewport = (doc: xmldoc.XmlDocument) => {\n const metaElm = doc\n .descendantWithPath(\"head\")\n ?.childrenNamed(\"meta\")\n .find((node) => node.attr.name === \"viewport\")\n\n return !!(metaElm && metaElm.attr.name === \"viewport\")\n}\n\nconst allFilesHaveViewportMeta = (files: Archive[\"files\"]) =>\n files.reduce(async (result, current) => {\n const _result = await result\n\n if (!_result) return false\n\n if (\n !isXmlBasedMimeType({\n mimeType: current.encodingFormat,\n uri: current.uri,\n })\n ) {\n return false\n }\n\n const file = await current.string()\n\n if (!file) return false\n\n return hasDocMetaViewport(new xmldoc.XmlDocument(file))\n }, Promise.resolve(true))\n\nexport const epubOptimizerHook =\n ({ archive }: { archive: Archive; baseUrl: string }) =>\n async (manifest: Manifest): Promise<Manifest> => {\n const bookIsFullReflowable =\n manifest.renditionLayout === \"reflowable\" &&\n manifest.spineItems.every((item) => item.renditionLayout === \"reflowable\")\n\n if (bookIsFullReflowable) {\n const files = await getSpineItemFilesFromArchive({ archive })\n\n const hasAllViewport = await allFilesHaveViewportMeta(files)\n\n if (hasAllViewport) {\n return {\n ...manifest,\n spineItems: manifest.spineItems.map((item) => ({\n ...item,\n renditionLayout: \"pre-paginated\",\n })),\n renditionLayout: \"pre-paginated\",\n }\n }\n }\n\n return manifest\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 } else {\n return (alist[i] || ``).localeCompare(blist[i] || ``)\n }\n }\n }\n\n return 1\n}\n","import { Manifest, urlJoin } from \"@prose-reader/shared\"\nimport { Archive } from \"../../../archives/types\"\nimport { sortByTitleComparator } from \"../../../utils/sortByTitleComparator\"\n\n/**\n * In case no navigation was generated prior to this hook, we will try\n * to generate something based on the structure of the archive.\n *\n * We use folders as chapters.\n */\nexport const navigationFallbackHook =\n ({ archive, baseUrl }: { archive: Archive; baseUrl: string }) =>\n async (manifest: Manifest): Promise<Manifest> => {\n if (manifest.nav) return manifest\n\n const filesSortedByAlpha = [...archive.files].sort((a, b) =>\n sortByTitleComparator(a.uri, b.uri),\n )\n\n const toc: NonNullable<Manifest[\"nav\"]>[\"toc\"] = Object.values(\n filesSortedByAlpha,\n ).reduce(\n (acc, file) => {\n const parts = file.uri.split(\"/\")\n\n // we have a file that is\n const isFileUnderFolder = !file.dir && parts.length > 1\n\n if (isFileUnderFolder) {\n parts.forEach((part, level) => {\n const partIsFileName = level === parts.length - 1\n\n if (partIsFileName) return\n\n const existingTocItem = acc.find(({ title }) => title === part)\n\n if (existingTocItem) {\n // @todo\n } else {\n acc.push({\n contents: [],\n href: urlJoin(baseUrl, encodeURI(file.uri)).replace(/\\/$/, \"\"),\n path: file.uri.replace(/\\/$/, \"\"),\n title: parts[0] ?? \"\",\n })\n }\n })\n }\n\n return acc\n },\n [] as NonNullable<Manifest[\"nav\"]>[\"toc\"],\n )\n\n if (toc.length === 0) return manifest\n\n return {\n ...manifest,\n nav: {\n toc,\n },\n }\n }\n","import type { Manifest } from \"@prose-reader/shared\"\nimport { Report } from \"../../report\"\nimport { Archive } from \"../../archives/types\"\nimport { defaultHook } from \"./hooks/default\"\nimport { epubHook } from \"./hooks/epub\"\nimport { comicInfoHook } from \"./hooks/comicInfo\"\nimport { epubOptimizerHook } from \"./hooks/epubOptimizer\"\nimport { navigationFallbackHook } from \"./hooks/navigationFallback\"\n\nconst baseManifest: Manifest = {\n filename: ``,\n items: [],\n nav: {\n toc: [],\n },\n readingDirection: `ltr`,\n renditionLayout: `pre-paginated`,\n renditionSpread: `auto`,\n spineItems: [],\n title: ``,\n}\n\nexport const generateManifestFromArchive = async (\n archive: Archive,\n { baseUrl = `` }: { baseUrl?: string } = {},\n) => {\n const hooks = [\n defaultHook({ archive, baseUrl }),\n epubHook({ archive, baseUrl }),\n epubOptimizerHook({ archive, baseUrl }),\n comicInfoHook({ archive, baseUrl }),\n navigationFallbackHook({ archive, baseUrl }),\n ]\n\n try {\n const manifest = await hooks.reduce(async (manifest, gen) => {\n return await gen(await manifest)\n }, Promise.resolve(baseManifest))\n\n Report.log(\"Generated manifest\", manifest)\n\n return manifest\n } catch (e) {\n Report.error(e)\n\n throw e\n }\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","import { detectMimeTypeFromName } from \"@prose-reader/shared\"\nimport { getUriBasename } from \"../utils/uri\"\nimport { Archive } from \"./types\"\n\n/**\n * @important\n * Make sure the urls are on the same origin or the cors header is set otherwise\n * the resource cannot be consumed as it is on the web.\n */\nexport const createArchiveFromUrls = async (\n urls: string[],\n options?: { useRenditionFlow: boolean },\n): Promise<Archive> => {\n const opfFileData = `\n <?xml version=\"1.0\" encoding=\"UTF-8\"?><package xmlns=\"http://www.idpf.org/2007/opf\" version=\"2.0\" unique-identifier=\"bookid\">\n <metadata>\n <meta property=\"rendition:layout\">${options?.useRenditionFlow ? `reflowable` : `pre-paginated`}</meta>\n ${options?.useRenditionFlow ? `<meta property=\"rendition:flow\">scrolled-continuous</meta>` : ``}\n </metadata>\n <manifest>\n ${urls\n .map(\n (url) =>\n `<item id=\"${getUriBasename(url)}\" href=\"${url}\" media-type=\"${detectMimeTypeFromName(url)}\"/>`,\n )\n .join(`\\n`)}\n </manifest>\n <spine>\n ${urls.map((url) => `<itemref idref=\"${getUriBasename(url)}\" />`).join(`\\n`)}\n </spine>\n </package>\n `\n\n const filesFromUrl: Archive[`files`] = urls.map((url) => ({\n dir: false,\n basename: getUriBasename(url),\n encodingFormat: detectMimeTypeFromName(url),\n uri: url,\n size: 100 / urls.length,\n base64: async () => ``,\n blob: async () => new Blob(),\n string: async () => ``,\n }))\n\n const opfFile: Archive[`files`][number] = {\n dir: false,\n basename: `content.opf`,\n uri: `content.opf`,\n size: 0,\n base64: async () => opfFileData,\n blob: async () => new Blob(),\n string: async () => opfFileData,\n }\n\n return {\n filename: ``,\n files: [opfFile, ...filesFromUrl],\n close: () => Promise.resolve(),\n }\n}\n","export const blobToBase64 = async (blob: Blob) =>\n new Promise<string>((resolve) => {\n const reader = new FileReader()\n reader.readAsDataURL(blob)\n reader.onloadend = function () {\n const base64data = reader.result as string\n resolve(base64data)\n }\n })\n","import { blobToBase64 } from \"../utils/blobToBAse64\"\nimport { getUriBasename } from \"../utils/uri\"\nimport { Archive } from \"./types\"\n\n/**\n * Useful to create archive from txt content\n */\nexport const createArchiveFromText = async (\n content: string | Blob,\n {\n mimeType,\n direction,\n }: {\n direction?: `ltr` | `rtl`\n mimeType?: string\n } = { mimeType: \"text/plain\" },\n) => {\n const txtOpfContent = `\n <?xml version=\"1.0\" encoding=\"UTF-8\"?>\n <package xmlns=\"http://www.idpf.org/2007/opf\" version=\"3.0\" xml:lang=\"ja\" prefix=\"rendition: http://www.idpf.org/vocab/rendition/#\"\n unique-identifier=\"ootuya-id\">\n <metadata xmlns:opf=\"http://www.idpf.org/2007/opf\" xmlns:dc=\"http://purl.org/dc/elements/1.1/\"\n xmlns:dcterms=\"http://purl.org/dc/terms/\">\n <meta property=\"rendition:layout\">reflowable</meta>\n </metadata>\n <manifest>\n <item id=\"p01\" href=\"p01.txt\" media-type=\"text/plain\"/>\n </manifest>\n <spine page-progression-direction=\"${direction ?? `ltr`}\">\n <itemref idref=\"p01\" />\n </spine>\n </package>\n `\n\n const archive: Archive = {\n filename: `content.txt`,\n files: [\n {\n dir: false,\n basename: getUriBasename(`generated.opf`),\n uri: `generated.opf`,\n blob: async () => new Blob([txtOpfContent]),\n string: async () => txtOpfContent,\n base64: async () => btoa(txtOpfContent),\n size: 0,\n },\n {\n dir: false,\n basename: getUriBasename(`p01.txt`),\n uri: `p01.txt`,\n blob: async () => {\n if (typeof content === `string`) return new Blob([content])\n return content\n },\n string: async () => {\n if (typeof content === `string`) return content\n return content.text()\n },\n base64: async () => {\n if (typeof content === `string`) return btoa(content)\n return blobToBase64(content)\n },\n size: typeof content === `string` ? content.length : content.size,\n encodingFormat: mimeType,\n },\n ],\n close: () => Promise.resolve(),\n }\n\n return archive\n}\n","import { Report } from \"../report\"\nimport { sortByTitleComparator } from \"../utils/sortByTitleComparator\"\nimport { getUriBasename } from \"../utils/uri\"\nimport { Archive, StreamResult } from \"./types\"\n\ninterface OutputByType {\n base64: string\n string: string\n text: string\n binarystring: string\n array: number[]\n uint8array: Uint8Array\n arraybuffer: ArrayBuffer\n blob: Blob\n nodebuffer: Buffer\n}\n\ntype OutputType = keyof OutputByType\ninterface JSZipObject {\n name: string\n dir: boolean\n date: Date\n comment: string\n unixPermissions: number | string | null\n dosPermissions: number | null\n async<T extends OutputType>(type: T): Promise<OutputByType[T]>\n // nodeStream(type?: `nodebuffer`): NodeJS.ReadableStream;\n internalStream?: (type?: `uint8array`) => StreamResult\n}\n\ninterface JSZip {\n files: { [key: string]: JSZipObject }\n}\n\nexport const createArchiveFromJszip = async (\n jszip: JSZip,\n { orderByAlpha, name }: { orderByAlpha?: boolean; name?: string } = {},\n): Promise<Archive> => {\n let files = Object.values(jszip.files)\n\n if (orderByAlpha) {\n files = files.slice().sort((a, b) => sortByTitleComparator(a.name, b.name))\n }\n\n const archive = {\n filename: name || ``,\n files: files.map((file) => ({\n dir: file.dir,\n basename: getUriBasename(file.name),\n uri: file.name,\n blob: () => file.async(`blob`),\n string: () => file.async(`string`),\n base64: () => file.async(`base64`),\n ...(file.internalStream && {\n stream: file.internalStream,\n }),\n // this is private API\n // eslint-disable-next-line @typescript-eslint/ban-ts-comment\n // @ts-ignore\n size: file._data.uncompressedSize,\n })),\n close: () => Promise.resolve(),\n }\n\n Report.log(\"Generated archive\", archive)\n\n return archive\n}\n","/**\n * @see https://github.com/nika-begiashvili/libarchivejs.\n *\n * Does not work in service worker due to usage of web worker.\n */\n/* eslint-disable @typescript-eslint/ban-types */\n/* eslint-disable @typescript-eslint/no-explicit-any */\nimport { Report } from \"../report\"\nimport { Archive } from \"./types\"\n\ninterface ArchiveReader {\n getFilesArray(): Promise<any[]>\n /**\n * Terminate worker to free up memory\n */\n close(): Promise<void>\n}\n\n/**\n * Represents compressed file before extraction\n */\ninterface CompressedFile {\n /**\n * File name\n */\n get name(): string\n /**\n * File size\n */\n get size(): number\n get lastModified(): number\n /**\n * Extract file from archive\n * @returns {Promise<File>} extracted file\n */\n extract(): any\n}\n\nexport const createArchiveFromLibArchive = async (\n libArchive: ArchiveReader,\n { name }: { orderByAlpha?: boolean; name?: string } = {},\n): Promise<Archive> => {\n const objArray = await libArchive.getFilesArray()\n\n const archive: Archive = {\n close: () => libArchive.close(),\n filename: name ?? ``,\n files: objArray.map((item: { file: CompressedFile; path: string }) => ({\n dir: false,\n basename: item.file.name,\n size: item.file.size,\n uri: `${item.path}${item.file.name}`,\n base64: async () => {\n return ``\n },\n blob: async () => {\n const file = await (item.file.extract() as Promise<File>)\n\n return file\n },\n string: async () => {\n const file = await (item.file.extract() as Promise<File>)\n\n return file.text()\n },\n })),\n }\n\n Report.log(\"Generated archive\", archive)\n\n return archive\n}\n","import { sortByTitleComparator } from \"../utils/sortByTitleComparator\"\nimport { getUriBasename } from \"../utils/uri\"\nimport { Archive } from \"./types\"\n\nexport const createArchiveFromArrayBufferList = async (\n list: {\n isDir: boolean\n name: string\n size: number\n data: () => Promise<ArrayBuffer>\n }[],\n { orderByAlpha, name }: { orderByAlpha?: boolean; name?: string } = {},\n): Promise<Archive> => {\n let files = list\n\n if (orderByAlpha) {\n files = files.slice().sort((a, b) => sortByTitleComparator(a.name, b.name))\n }\n\n return {\n filename: name || ``,\n files: files.map((file) => ({\n dir: file.isDir,\n basename: getUriBasename(file.name),\n uri: file.name,\n blob: async () => new Blob([await file.data()]),\n string: async () => {\n const data = await file.data()\n return String.fromCharCode.apply(\n null,\n Array.from(new Uint16Array(data)),\n )\n },\n base64: async () => {\n // @todo not used for now, lets implement it later if needed\n return ``\n },\n size: file.size,\n })),\n close: () => Promise.resolve(),\n }\n}\n","import { Report } from \"./report\"\n\nexport const configure = ({\n enableReport,\n}: { enableReport?: boolean } = {}) => {\n Report.enable(!!enableReport)\n}\n","import {\n BehaviorSubject,\n catchError,\n distinctUntilChanged,\n EMPTY,\n filter,\n first,\n from,\n ignoreElements,\n map,\n merge,\n mergeMap,\n NEVER,\n shareReplay,\n Subject,\n switchMap,\n takeUntil,\n tap,\n timer,\n} from \"rxjs\"\nimport { Archive } from \"./types\"\n\ntype ArchiveEntry = {\n status: \"idle\" | \"loading\" | \"success\" | \"error\"\n error: unknown\n archive: undefined | Archive\n locks: number\n}\n\nexport const createArchiveLoader = ({\n getArchive,\n cleanArchiveAfter,\n}: {\n getArchive: (key: string) => Promise<Archive>\n cleanArchiveAfter: number\n}) => {\n const loadSubject = new Subject<string>()\n const destroySubject = new Subject<void>()\n const archives: Record<string, BehaviorSubject<ArchiveEntry>> = {}\n\n const archiveLoaded$ = loadSubject.pipe(\n mergeMap((key) => {\n const archiveEntry = archives[key]\n\n if (!archiveEntry || archiveEntry.getValue().status !== \"idle\")\n return EMPTY\n\n archiveEntry.next({\n ...archiveEntry.getValue(),\n status: \"loading\",\n })\n\n return from(getArchive(key)).pipe(\n map((archive) => {\n archiveEntry.next({\n ...archiveEntry.getValue(),\n archive,\n status: \"success\",\n })\n\n return { key, archiveEntry }\n }),\n catchError((error) => {\n archiveEntry.next({\n ...archiveEntry.getValue(),\n status: \"error\",\n error,\n })\n\n throw error\n }),\n )\n }),\n catchError(() => NEVER),\n shareReplay(),\n )\n\n const cleanup$ = archiveLoaded$.pipe(\n switchMap(({ archiveEntry, key }) => {\n const locks$ = archiveEntry.pipe(map(({ locks }) => locks))\n const isUnlocked$ = locks$.pipe(\n map((locks) => locks <= 0),\n distinctUntilChanged(),\n )\n\n return isUnlocked$.pipe(\n switchMap((isUnlocked) =>\n !isUnlocked ? NEVER : timer(cleanArchiveAfter),\n ),\n tap(() => {\n delete archives[key]\n\n archiveEntry.getValue().archive?.close()\n }),\n )\n }),\n )\n\n const access = (key: string) => {\n let releaseCalled = false\n\n const archiveEntry =\n archives[key] ??\n new BehaviorSubject<ArchiveEntry>({\n archive: undefined,\n status: \"idle\",\n locks: 0,\n error: undefined,\n })\n\n archives[key] = archiveEntry\n\n archiveEntry.next({\n ...archiveEntry.getValue(),\n locks: archiveEntry.getValue().locks + 1,\n })\n\n const release = () => {\n if (releaseCalled) return\n\n releaseCalled = true\n\n archiveEntry.next({\n ...archiveEntry.getValue(),\n locks: archiveEntry.getValue().locks - 1,\n })\n }\n\n loadSubject.next(key)\n\n const archive$ = archiveEntry.pipe(\n map(({ archive }) => archive),\n filter((archive) => !!archive),\n )\n\n const error$ = archiveEntry.pipe(\n tap(({ error }) => {\n if (error) {\n throw error\n }\n }),\n ignoreElements(),\n )\n\n return merge(archive$, error$).pipe(\n first(),\n map((archive) => ({ archive, release })),\n catchError((error) => {\n release()\n\n throw error\n }),\n )\n }\n\n merge(cleanup$, archiveLoaded$).pipe(takeUntil(destroySubject)).subscribe()\n\n return {\n access,\n }\n}\n","import {\n catchError,\n finalize,\n from,\n lastValueFrom,\n map,\n mergeMap,\n Observable,\n of,\n switchMap,\n} from \"rxjs\"\nimport { createArchiveLoader } from \"./archives/archiveLoader\"\nimport { Manifest } from \"@prose-reader/shared\"\nimport { generateManifestFromArchive } from \"./generators/manifest\"\nimport { generateResourceFromArchive } from \"./generators/resources\"\nimport { Archive } from \"./archives/types\"\n\ntype OnError = (error: unknown) => Response\ntype OnManifestSuccess = (params: {\n manifest: Manifest\n archive: Archive\n}) => Observable<Manifest> | Promise<Manifest>\n\nexport class Streamer {\n epubLoader: ReturnType<typeof createArchiveLoader>\n onError: OnError = (error) => {\n return new Response(String(error), { status: 500 })\n }\n onManifestSuccess: OnManifestSuccess\n\n constructor({\n onError,\n onManifestSuccess,\n ...rest\n }: Parameters<typeof createArchiveLoader>[0] & {\n onError?: OnError\n onManifestSuccess?: OnManifestSuccess\n }) {\n this.epubLoader = createArchiveLoader(rest)\n\n this.onManifestSuccess =\n onManifestSuccess ?? (({ manifest }) => Promise.resolve(manifest))\n this.onError = onError ?? this.onError\n }\n\n public fetchManifest({ key, baseUrl }: { key: string; baseUrl?: string }) {\n const response$ = this.epubLoader.access(key).pipe(\n mergeMap(({ archive, release }) => {\n const manifest$ = from(\n generateManifestFromArchive(archive, { baseUrl }),\n )\n\n return manifest$.pipe(\n switchMap((manifest) =>\n from(this.onManifestSuccess({ manifest, archive })),\n ),\n map(\n (manifest) =>\n new Response(JSON.stringify(manifest satisfies Manifest), {\n status: 200,\n }),\n ),\n finalize(() => {\n release()\n }),\n )\n }),\n catchError((error) => {\n return of(this.onError(error))\n }),\n )\n\n return lastValueFrom(response$)\n }\n\n public fetchResource({\n key,\n resourcePath,\n }: {\n key: string\n resourcePath: string\n }) {\n const response$ = this.epubLoader.access(key).pipe(\n mergeMap(({ archive, release }) => {\n const manifest$ = from(\n generateResourceFromArchive(archive, resourcePath),\n )\n\n return manifest$.pipe(\n map((resource) => new Response(resource.body, { status: 200 })),\n finalize(() => {\n release()\n }),\n )\n }),\n catchError((error) => {\n return of(this.onError(error))\n }),\n )\n\n return lastValueFrom(response$)\n }\n}\n","import { Streamer } from \"./Streamer\"\nimport { removeTrailingSlash } from \"./utils/uri\"\n\ntype ConflictFreeWebWorkerFetchEvent = {\n readonly request: Request\n /** [MDN Reference](https://developer.mozilla.org/docs/Web/API/FetchEvent/respondWith) */\n respondWith(r: Response | PromiseLike<Response>): void\n}\n\nexport class ServiceWorkerStreamer extends Streamer {\n protected getUriInfo: (event: ConflictFreeWebWorkerFetchEvent) =>\n | {\n baseUrl: string\n }\n | undefined\n\n constructor({\n getUriInfo,\n ...rest\n }: ConstructorParameters<typeof Streamer>[0] & {\n getUriInfo: (event: ConflictFreeWebWorkerFetchEvent) =>\n | {\n baseUrl: string\n }\n | undefined\n }) {\n super(rest)\n\n this.getUriInfo = getUriInfo\n this.fetchEventListener = this.fetchEventListener.bind(this)\n }\n\n fetchEventListener(event: ConflictFreeWebWorkerFetchEvent) {\n try {\n const uriInfo = this.getUriInfo(event)\n\n if (!uriInfo) return\n\n const baseUrl = removeTrailingSlash(uriInfo.baseUrl)\n const streamerPath = event.request.url.substring(\n baseUrl.length + `/`.length,\n )\n const [key = ``] = streamerPath.split(\"/\")\n const resourcePath = decodeURIComponent(\n removeTrailingSlash(streamerPath.substring(key.length + `/`.length)),\n )\n\n if (streamerPath.endsWith(`/manifest`)) {\n event.respondWith(\n this.fetchManifest({ key, baseUrl: `${baseUrl}/${key}/` }),\n )\n } else {\n event.respondWith(this.fetchResource({ key, resourcePath }))\n }\n } catch (e) {\n event.respondWith(new Response(String(e), { status: 500 }))\n }\n }\n}\n"],"names":["enabled","Report","enable","data","label","performanceEntry","targetDuration","duration","name","functionToMeasure","args","t0","response","res","t1","hasCalibreCoverMeta","doc","metaElm","_a","node","getBuggyCoverSvg","_c","_b","fixBuggyCover","archive","resourcePath","resource","file","bodyToParse","opfXmlDoc","XmlDocument","buggySvg","calibreFixHook","cssFixHook","newBody","getArchiveOpfInfo","extractNavChapter","li","opfBasePath","baseUrl","chp","contentNode","urlJoin","sublistNode","children","child","buildTOCFromNav","toc","navDataChildren","parseTocFromNavPath","navItem","tocFile","item","xmldoc","mapNcxChapter","point","prefix","src","out","pt","buildTOCFromNCX","ncxData","rootTagName","parseTocFromNcx","opfData","spine","ncxId","ncxItem","ncxPath","parseToc","tocFromNcx","extractKoboInformationFromArchive","koboInformation","optionElement","getSpineItemFilesFromArchive","opsFile","_opfXmlDoc","manifestElm","spineElm","spineItemIds","manifestItemsFromSpine","getItemsFromDoc","el","epubHook","manifest","metadataElm","guideElm","titleElm","metaElmChildren","metaElmWithRendition","meta","metaElmWithRenditionFlow","metaElmWithRenditionSpread","publisherRenditionLayout","publisherRenditionFlow","renditionSpread","title","dir","pageProgressionDirection","totalSize","size","itemrefElm","manifestItem","href","properties","itemSize","hrefBaseUri","property","elm","getMetadata","getContentTypeFromExtension","uri","defaultHook","metadata","generateResourceFromArchive","defaultResource","hooks","gen","e","generateResourceFromError","error","PROSE_READER_RESOURCE_ERROR_INJECTED_META_NAME","files","index","comicInfoHook","comicInfoFile","manifestWithoutComicInfo","_","items","content","mangaVal","hasDocMetaViewport","allFilesHaveViewportMeta","result","current","isXmlBasedMimeType","epubOptimizerHook","sortByTitleComparator","a","b","alist","blist","i","len","navigationFallbackHook","filesSortedByAlpha","acc","parts","part","level","baseManifest","generateManifestFromArchive","getUriBasename","removeTrailingSlash","createArchiveFromUrls","urls","options","opfFileData","url","detectMimeTypeFromName","filesFromUrl","blobToBase64","blob","resolve","reader","base64data","createArchiveFromText","mimeType","direction","txtOpfContent","createArchiveFromJszip","jszip","orderByAlpha","createArchiveFromLibArchive","libArchive","objArray","createArchiveFromArrayBufferList","list","configure","enableReport","createArchiveLoader","getArchive","cleanArchiveAfter","loadSubject","Subject","destroySubject","archives","archiveLoaded$","mergeMap","key","archiveEntry","EMPTY","from","map","catchError","NEVER","shareReplay","cleanup$","switchMap","locks","distinctUntilChanged","isUnlocked","timer","tap","access","releaseCalled","BehaviorSubject","release","archive$","filter","error$","ignoreElements","merge","first","takeUntil","Streamer","onError","onManifestSuccess","rest","response$","finalize","of","lastValueFrom","ServiceWorkerStreamer","getUriInfo","event","uriInfo","streamerPath"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prose-reader/streamer",
3
- "version": "1.91.0",
3
+ "version": "1.93.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.umd.cjs",
6
6
  "module": "./dist/index.js",
@@ -24,14 +24,14 @@
24
24
  "test:watch": "vitest watch"
25
25
  },
26
26
  "dependencies": {
27
- "@prose-reader/shared": "^1.91.0"
27
+ "@prose-reader/shared": "^1.93.0"
28
28
  },
29
29
  "peerDependencies": {
30
30
  "buffer": "^6.0.3",
31
31
  "rxjs": "*",
32
32
  "xmldoc": "^1.1.2"
33
33
  },
34
- "gitHead": "e361ed339f8f89047dc33df45cab62dd0d42ab9a",
34
+ "gitHead": "a251b980b95d5794b74a3acc08927ee7983cb94d",
35
35
  "devDependencies": {
36
36
  "buffer": "^6.0.3",
37
37
  "xmldoc": "^1.2.0"