@prose-reader/streamer 1.276.0 → 1.277.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,21 +1,7 @@
1
- (function(p,y){typeof exports=="object"&&typeof module<"u"?y(exports,require("xmldoc"),require("@prose-reader/shared"),require("rxjs")):typeof define=="function"&&define.amd?define(["exports","xmldoc","@prose-reader/shared","rxjs"],y):(p=typeof globalThis<"u"?globalThis:p||self,y(p["prose-streamer"]={},p.xmldoc,p.shared,p.rxjs))})(this,(function(p,y,v,a){"use strict";let W=!1;const F={enable:e=>{W=e},log:(...e)=>{W&&console.log("[prose-reader-streamer]",...e)},debug:(...e)=>{W&&console.debug("[prose-reader-streamer]",...e)},warn:(...e)=>{W&&console.warn("[prose-reader-streamer]",...e)},error:(...e)=>{console.error(...e)}},G=e=>{const t=e.descendantWithPath("head")?.childrenNamed("meta").find(i=>i.attr.name==="calibre:cover");return!!(t&&t.attr.name==="calibre:cover")},K=e=>e.descendantWithPath("body")?.descendantWithPath("div")?.childrenNamed("svg")?.find(t=>t.attr.width==="100%"&&t.attr.preserveAspectRatio==="none"),Y=({archive:e,resourcePath:t})=>async i=>{const r=Object.values(e.records).find(n=>n.uri===t&&!n.dir);if(r&&!r.dir&&r.basename.endsWith(".xhtml")){const n=i.body??await r.string(),o=new y.XmlDocument(n);if(G(o)){const s=K(o);return s&&delete s.attr.preserveAspectRatio,{...i,body:o?.toString()}}}return i},x=({archive:e,resourcePath:t})=>async i=>Y({archive:e,resourcePath:t})(i),Q=({archive:e,resourcePath:t})=>async i=>{const r=Object.values(e.records).find(n=>n.uri===t&&!n.dir);if(r&&!r.dir&&r.basename.endsWith(".css")){const o=(i.body??await r.string()).replaceAll("-webkit-writing-mode","writing-mode");return{...i,body:o}}return i},E=e=>{const i=Object.values(e.records).filter(r=>!r.dir).find(r=>r.uri.endsWith(".opf"));return{data:i,basePath:i?.uri.substring(0,i.uri.lastIndexOf("/"))||""}},R=async({archive:e})=>{const{data:t,basePath:i}=E(e)||{},r=await t?.string();if(!r)return[];const n=new y.XmlDocument(r),o=n.childNamed("manifest"),c=n.childNamed("spine")?.childrenNamed("itemref").map(d=>d.attr.idref),l=o?.childrenNamed("item").filter(d=>c.includes(d.attr.id||""))||[];return e.records.filter(d=>l.find(m=>i?`${i}/${m.attr.href}`===d.uri:`${m.attr.href}`===d.uri))},A=e=>e.substring(e.lastIndexOf("/")+1)||e,k=e=>e.endsWith("/")?e.slice(0,-1):e,M=e=>{const t=e.lastIndexOf("/");return t>=0?e.substring(0,t):""},D=e=>e?e.children.map(t=>t instanceof y.XmlTextNode?t.text:t instanceof y.XmlElement?D(t):"").join("").trim():"",O=(e,{basePath:t,baseUrl:i})=>{const r={contents:[],path:"",href:"",title:""};let n=e.childNamed("span")||e.childNamed("a");r.title=(n?.attr.title||n?.val.trim()||D(n))??"";let o=n?.name;o!=="a"&&(n=e.descendantWithPath(`${o}.a`),n&&(o=n.name.toLowerCase())),o==="a"&&n?.attr.href&&(r.path=v.urlJoin(t,n.attr.href),r.href=v.urlJoin(i,t,n.attr.href));const s=e.childNamed("ol");if(s){const c=s.childrenNamed("li");c&&c.length>0&&(r.contents=c.map(l=>O(l,{basePath:t,baseUrl:i})))}return r},Z=(e,{basePath:t,baseUrl:i})=>{const r=[];let n;return e.descendantWithPath("body.nav.ol")?n=e.descendantWithPath("body.nav.ol")?.children:e.descendantWithPath("body.section.nav.ol")&&(n=e.descendantWithPath("body.section.nav.ol")?.children),n&&n.length>0&&n.filter(o=>o.name==="li").forEach(o=>{r.push(O(o,{basePath:t,baseUrl:i}))}),r},j=async(e,t,{baseUrl:i})=>{const r=e.childNamed("manifest")?.childrenNamed("item").find(n=>n.attr.properties==="nav");if(r){const n=Object.values(t.records).find(o=>o.uri.endsWith(r.attr.href||""));if(n&&!n.dir){const o=new y.XmlDocument(await n.string()),s=M(n.uri);return Z(o,{basePath:s,baseUrl:i})}}},U=(e,{opfBasePath:t,baseUrl:i,prefix:r})=>{const n=e?.childNamed(`${r}content`)?.attr.src||"",o={title:e?.descendantWithPath(`${r}navLabel.${r}text`)?.val||"",path:v.urlJoin(t,n),href:v.urlJoin(i,t,n),contents:[]},s=e.childrenNamed(`${r}navPoint`);return s&&s.length>0&&(o.contents=s.map(c=>U(c,{opfBasePath:t,baseUrl:i,prefix:r}))),o},ee=(e,{opfBasePath:t,baseUrl:i})=>{const r=[],n=e.name;let o="";return n.indexOf(":")!==-1&&(o=`${n.split(":")[0]}:`),e.childNamed(`${o}navMap`)?.childrenNamed(`${o}navPoint`).forEach(s=>{r.push(U(s,{opfBasePath:t,baseUrl:i,prefix:o}))}),r},te=async({opfData:e,opfBasePath:t,baseUrl:i,archive:r})=>{const o=e.childNamed("spine")?.attr.toc;if(o){const s=e.childNamed("manifest")?.childrenNamed("item").find(c=>c.attr.id===o);if(s){const c=`${t}${t===""?"":"/"}${s.attr.href}`,l=Object.values(r.records).find(f=>f.uri.endsWith(c));if(l&&!l.dir){const f=new y.XmlDocument(await l.string());return ee(f,{opfBasePath:t,baseUrl:i})}}}},ne=async(e,t,{baseUrl:i})=>{const{basePath:r}=E(t)||{},n=await te({opfData:e,opfBasePath:r,archive:t,baseUrl:i});return n||await j(e,t,{baseUrl:i})},re=e=>{const t=e.attr.properties?.split(" ")||[];let i;return t.find(r=>r==="rendition:layout-reflowable")&&(i="reflowable"),t.find(r=>r==="rendition:layout-pre-paginated")&&(i="pre-paginated"),{renditionLayout:i,pageSpreadLeft:t.some(r=>r==="page-spread-left")||void 0,pageSpreadRight:t.some(r=>r==="page-spread-right")||void 0}},ie=(e,t,i)=>{const r=e.attr.href||"",n=i?.(e);return{href:t?`${n}${t}/${r}`:`${n}${r}`,id:e.attr.id||"",mediaType:e.attr["media-type"]}},B=(e,t,i)=>{const r=e.childNamed("manifest"),{basePath:n}=E(t)||{};return r?.childrenNamed("item")?.map(o=>ie(o,n,i))||[]},oe=({archive:e,baseUrl:t})=>async i=>{const{data:r,basePath:n}=E(e)||{};if(!r)return i;const o=await r.string();F.log("data",o);const s=new y.XmlDocument(o),c=await ne(s,e,{baseUrl:t})||[],l=s.childNamed("metadata"),f=s.childNamed("manifest"),d=s.childNamed("spine"),m=s.childNamed("guide"),u=l?.childNamed("dc:title"),b=l?.childrenNamed("meta")||[],$=b.find(h=>h.attr.property==="rendition:layout"),g=b.find(h=>h.attr.property==="rendition:flow"),I=b.find(h=>h.attr.property==="rendition:spread"),w=$?.val,N=g?.val,P=I?.val,Le=u?.val||e.records.find(({dir:h})=>h)?.basename||"",ke=d?.attr["page-progression-direction"],Pe=(await R({archive:e})).reduce((h,S)=>S.size+h,0);return{filename:e.filename,nav:{toc:c},renditionLayout:w,renditionFlow:N||"auto",renditionSpread:P,title:Le,readingDirection:ke||"ltr",spineItems:d?.childrenNamed("itemref").map((h,S)=>{const T=f?.childrenNamed("item").find(C=>C.attr.id===h?.attr.idref),J=T?.attr.href||"",Ce=e.records.find(C=>C.uri.endsWith(J))?.size||0,q=t||(/^https?:\/\//.test(J)?"":"file://"),_=re(h);return{..._,id:T?.attr.id||"",index:S,href:T?.attr.href?.startsWith("https://")?T?.attr.href:n?`${q}${n}/${T?.attr.href}`:`${q}${T?.attr.href}`,renditionLayout:_.renditionLayout??w,progressionWeight:Ce/Pe,mediaType:T?.attr["media-type"]}})||[],items:B(s,e,h=>{const S=h.attr.href||"";return/^https?:\/\//.test(S)?"":t||"file://"}),guide:m?.childrenNamed("reference").map(h=>({href:h.attr.href||"",title:h.attr.title||"",type:h.attr.type}))}},ae=async(e,t)=>{const r=await E(e).data?.string();if(r){const n=new y.XmlDocument(r),o=B(n,e,()=>"");if(o.find(c=>t.endsWith(c.href))?.mediaType)return{mediaType:o.find(c=>t.endsWith(c.href))?.mediaType}}return{mediaType:se(t)}},se=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"},ce=({archive:e,resourcePath:t})=>async i=>{const r=Object.values(e.records).find(o=>o.uri===t&&!o.dir);if(!r||r.dir)return i;const n=await ae(e,t);return{...i,params:{...i.params,...r?.encodingFormat&&{contentType:r.encodingFormat},...n.mediaType&&{contentType:n.mediaType}}}},z=["div","span","p","a","li","ul","ol","h1","h2","h3","h4","h5","h6","table","tr","td","th","thead","tbody","tfoot","section","article","header","footer","nav","aside","main","figure","figcaption","blockquote","pre","code","form","textarea","select","option","button","label","fieldset","legend","caption","dl","dt","dd","iframe","video","audio","canvas","script","style"],de=({archive:e,resourcePath:t})=>async i=>{const r=Object.values(e.records).find(n=>n.uri===t&&!n.dir);if(r&&!r.dir&&r.basename.endsWith(".xhtml")){const n=i.body??await r.string();if(!new RegExp(`<(${z.join("|")})[\\s/>]`,"i").test(n))return i;const s=new RegExp(`<(${z.join("|")})(\\s[^>]*)?\\s*/>`,"gi"),c=n.replace(s,(l,f,d="")=>`<${f} ${d.trim()}></${f}>`);return{...i,body:c}}return i},X=async(e,t)=>{const i=Object.values(e.records).find(o=>o.uri===t&&!o.dir);if(!i||i.dir)throw new Error(`no file found for resourcePath:${t}`);const r={params:{}},n=[ce({archive:e,resourcePath:t}),de({archive:e,resourcePath:t}),Q({archive:e,resourcePath:t}),x({archive:e,resourcePath:t})];try{const o=await n.reduce(async(s,c)=>await c(await s),Promise.resolve(r));return F.log("Generated resource",t,o),{...o,body:o.body??await i.blob()}}catch(o){throw F.error(o),o}},le=({archive:e})=>async t=>{const i=e.records.find(n=>n.basename.toLowerCase()==="com.apple.ibooks.display-options.xml");if(!i||i.dir)return t;const r=await(await i.blob()).text();try{const s=new y.XmlDocument(r).childNamed("platform")?.childrenNamed("option")?.find(c=>c.attr.name==="fixed-layout")?.val||"false";return{...t,renditionLayout:s==="true"?"pre-paginated":t.renditionLayout}}catch(n){return console.error(`Unable to parse com.apple.ibooks.display-options.xml for content
2
- `,r),console.error(n),t}},me=async e=>{const t={renditionLayout:void 0};return await Promise.all(e.records.map(async i=>{if(i.uri.endsWith("com.kobobooks.display-options.xml")&&!i.dir){const n=new y.XmlDocument(await i.string()).childNamed("platform")?.childNamed("option");n?.attr?.name==="fixed-layout"&&n.val==="true"&&(t.renditionLayout="pre-paginated")}})),t},pe=({archive:e})=>async t=>{const i=await me(e);return{...t,renditionLayout:t.renditionLayout??i.renditionLayout}},fe=({archive:e,baseUrl:t})=>async()=>{const i=Object.values(e.records).filter(r=>!r.dir);return{filename:e.filename,title:e.records.find(({dir:r})=>r)?.basename.replace(/\/$/,"")||e.filename,renditionLayout:void 0,renditionSpread:"auto",readingDirection:"ltr",spineItems:i.filter(r=>!r.basename.endsWith(".db")).map((r,n)=>{const o=t||(/^https?:\/\//.test(r.uri)?"":"file://");return{id:`${n}.${r.basename}`,index:n,href:encodeURI(`${o}${r.uri}`),renditionLayout:void 0,progressionWeight:1/i.length,pageSpreadLeft:void 0,pageSpreadRight:void 0,mediaType:r.encodingFormat}}),items:i.map((r,n)=>({id:`${n}.${r.basename}`,href:encodeURI(`${t}${r.uri}`)}))}},ue=e=>{const t=e.descendantWithPath("head")?.childrenNamed("meta").find(i=>i.attr.name==="viewport");return!!(t&&t.attr.name==="viewport")},he=e=>e.reduce(async(t,i)=>{if(!await t||!v.isXmlBasedMimeType({mimeType:i.encodingFormat,uri:i.uri}))return!1;const n=i.dir?null:await i.string();return n?ue(new y.XmlDocument(n)):!1},Promise.resolve(!0)),ge=({archive:e})=>async t=>{if(t.renditionLayout==="reflowable"&&t.spineItems.every(r=>r.renditionLayout==="reflowable")){const r=await R({archive:e});if(await he(r))return{...t,spineItems:t.spineItems.map(o=>({...o,renditionLayout:"pre-paginated"})),renditionLayout:"pre-paginated"}}return t},ye=({archive:e})=>async t=>{const i=e.records.find(o=>o.basename.toLowerCase()==="comicinfo.xml"&&!o.dir);if(!i||i.dir)return t;const r={...t,spineItems:t.spineItems.filter(o=>!o.id.toLowerCase().endsWith("comicinfo.xml")).map((o,s,c)=>({...o,progressionWeight:1/c.length}))},n=await i.string();try{const s=new y.XmlDocument(n).childNamed("Manga")?.val||"unknown";return{...r,readingDirection:s==="YesAndRightToLeft"?"rtl":"ltr"}}catch(o){return console.error(`Unable to parse comicinfo.xml for content
3
- `,n),console.error(o),r}},L=(e,t)=>{const i=e.split(/(\d+)/),r=t.split(/(\d+)/);for(let n=0,o=i.length;n<o;n++)if(i[n]!==r[n])return i[n]?.match(/\d/)?+(i[n]||"")-+(r[n]||""):(i[n]||"").localeCompare(r[n]||"");return 1},be=({archive:e,baseUrl:t})=>async i=>{if(i.nav)return i;const r=[...e.records].sort((c,l)=>L(c.uri,l.uri)),n=Object.values(r),o=(c,l,f,d,m)=>{const u=c.find(g=>g.title===l),[b,...$]=f;return u?b?[...c.filter(I=>I!==u),{...u,contents:[...u.contents,...o(u.contents,b,$,d,m)]}]:u.path.split("/").length>m.split("/").length?[...c.filter(I=>I!==u),{...u,path:m,href:d}]:c:b?[...c,{contents:o([],b,$,d,m),href:d,path:m,title:l}]:[...c,{contents:[],href:d,path:m,title:l}]},s=n.reduce((c,l)=>{if(l.dir)return c;const d=l.uri.split("/").slice(0,-1),[m,...u]=d;if(m){const b=v.urlJoin(t,encodeURI(l.uri)).replace(/\/$/,""),$=l.uri.replace(/\/$/,"");return o(c,m,u,b,$)}return c},[]);return s.length===0?i:{...i,nav:{toc:s}}},we=e=>e.records.some(t=>t.basename.endsWith(".opf")),ve=({archive:e})=>async t=>we(e)?t:{...t,spineItems:t.spineItems.map(r=>{const n=e.records.find(s=>decodeURI(r.href).endsWith(s.uri)),o=v.parseContentType(n?.encodingFormat??"")??v.detectMimeTypeFromName(n?.basename??"");return{...r,renditionLayout:o?.startsWith("image/")?"pre-paginated":r.renditionLayout}})},V=async(e,{baseUrl:t=""}={})=>{const i=[oe({archive:e,baseUrl:t}),ye({archive:e}),le({archive:e}),ve({archive:e}),ge({archive:e}),pe({archive:e}),be({archive:e,baseUrl:t})];try{const r=fe({archive:e,baseUrl:t})(),n=await i.reduce(async(o,s)=>await s(await o),r);return F.log("Generated manifest",n),n}catch(r){throw F.error(r),r}},$e=async(e,t)=>{const i=`
4
- <?xml version="1.0" encoding="UTF-8"?><package xmlns="http://www.idpf.org/2007/opf" version="2.0" unique-identifier="bookid">
5
- <metadata>
6
- <meta property="rendition:layout">${t?.useRenditionFlow?"reflowable":"pre-paginated"}</meta>
7
- ${t?.useRenditionFlow?'<meta property="rendition:flow">scrolled-continuous</meta>':""}
8
- </metadata>
9
- <manifest>
10
- ${e.map(o=>`<item id="${A(o)}" href="${o}" media-type="${v.detectMimeTypeFromName(o)}"/>`).join(`
11
- `)}
12
- </manifest>
13
- <spine>
14
- ${e.map(o=>`<itemref idref="${A(o)}" />`).join(`
15
- `)}
16
- </spine>
17
- </package>
18
- `,r=e.map(o=>({dir:!1,basename:A(o),encodingFormat:v.detectMimeTypeFromName(o),uri:o,size:100/e.length,blob:async()=>(await fetch(o)).blob(),string:async()=>""}));return{filename:"",records:[{dir:!1,basename:"content.opf",uri:"content.opf",size:0,blob:async()=>new Blob,string:async()=>i},...r],close:()=>Promise.resolve()}},Fe=async(e,{mimeType:t,direction:i}={mimeType:"text/plain"})=>{const r=`
1
+ (function(p,g){typeof exports=="object"&&typeof module<"u"?g(exports,require("@prose-reader/shared"),require("xmldoc"),require("rxjs")):typeof define=="function"&&define.amd?define(["exports","@prose-reader/shared","xmldoc","rxjs"],g):(p=typeof globalThis<"u"?globalThis:p||self,g(p["prose-streamer"]={},p.shared,p.xmldoc,p.rxjs))})(this,(function(p,g,b,s){"use strict";const S=(n,e)=>{const o=n.split(/(\d+)/),r=e.split(/(\d+)/);for(let t=0,i=o.length;t<i;t++)if(o[t]!==r[t])return o[t]?.match(/\d/)?+(o[t]||"")-+(r[t]||""):(o[t]||"").localeCompare(r[t]||"");return 1},F=n=>n.substring(n.lastIndexOf("/")+1)||n,W=n=>n.endsWith("/")?n.slice(0,-1):n,P=n=>{const e=n.lastIndexOf("/");return e>=0?n.substring(0,e):""},G=async(n,{orderByAlpha:e,name:o}={})=>{let r=n;return e&&(r=r.slice().sort((t,i)=>S(t.name,i.name))),{filename:o||"",records:r.map(t=>({dir:t.isDir,basename:F(t.name),uri:t.name,blob:async()=>new Blob([await t.data()]),string:async()=>{const i=await t.data();return String.fromCharCode.apply(null,Array.from(new Uint16Array(i)))},size:t.size})),close:()=>Promise.resolve()}},f=g.Report.namespace("@prose-reader/streamer",!1,{color:"#ffae42"}),q=n=>{const e={};for(const r of n){const t=r.split("/");let i=e;for(let a=0;a<t.length;a++){const c=t[a];c!==void 0&&(i[c]||(i[c]={}),i=i[c])}}const o=(r,t="")=>Object.keys(r).sort().map((i,a,c)=>{const m=a===c.length-1,d=t+(m?"└── ":"├── "),l=t+(m?" ":""),u=r[i];return u&&Object.keys(u).length>0?`${d}${i}/
2
+ ${o(u,l)}`:`${d}${i}`}).join(`
3
+ `);return o(e)},K=async(n,{orderByAlpha:e,name:o}={})=>{let r=Object.values(n.files);e&&(r=r.slice().sort((i,a)=>S(i.name,a.name)));const t={filename:o||"",records:r.map(i=>({dir:i.dir,basename:F(i.name),uri:i.name,blob:()=>i.async("blob"),string:()=>i.async("string"),...i.internalStream&&{stream:i.internalStream},size:i._data.uncompressedSize})),close:()=>Promise.resolve()};if(f.log("Generated archive",t),process.env.NODE_ENV==="development"&&f.isEnabled()){const i=q(r.map(a=>a.name));f.groupCollapsed(...f.getGroupArgs("Archive folder structure")),f.log(`
4
+ ${i}`),f.groupEnd()}return t},Y=async(n,{name:e}={})=>{const o=await n.getFilesArray(),r={close:()=>n.close(),filename:e??"",records:o.map(t=>({dir:!1,basename:t.file.name,size:t.file.size,uri:`${t.path}${t.file.name}`,blob:async()=>await t.file.extract(),string:async()=>(await t.file.extract()).text()}))};return f.log("Generated archive",r),r},x=async(n,{mimeType:e,direction:o}={mimeType:"text/plain"})=>{const r=`
19
5
  <?xml version="1.0" encoding="UTF-8"?>
20
6
  <package xmlns="http://www.idpf.org/2007/opf" version="3.0" xml:lang="ja" prefix="rendition: http://www.idpf.org/vocab/rendition/#"
21
7
  unique-identifier="ootuya-id">
@@ -26,9 +12,27 @@
26
12
  <manifest>
27
13
  <item id="p01" href="p01.txt" media-type="text/plain"/>
28
14
  </manifest>
29
- <spine page-progression-direction="${i??"ltr"}">
15
+ <spine page-progression-direction="${o??"ltr"}">
30
16
  <itemref idref="p01" />
31
17
  </spine>
32
18
  </package>
33
- `;return{filename:"content.txt",records:[{dir:!1,basename:A("generated.opf"),uri:"generated.opf",blob:async()=>new Blob([r]),string:async()=>r,size:0},{dir:!1,basename:A("p01.txt"),uri:"p01.txt",blob:async()=>typeof e=="string"?new Blob([e]):e,string:async()=>typeof e=="string"?e:e.text(),size:typeof e=="string"?e.length:e.size,encodingFormat:t}],close:()=>Promise.resolve()}},Ae=async(e,{orderByAlpha:t,name:i}={})=>{let r=Object.values(e.files);t&&(r=r.slice().sort((o,s)=>L(o.name,s.name)));const n={filename:i||"",records:r.map(o=>({dir:o.dir,basename:A(o.name),uri:o.name,blob:()=>o.async("blob"),string:()=>o.async("string"),...o.internalStream&&{stream:o.internalStream},size:o._data.uncompressedSize})),close:()=>Promise.resolve()};return F.log("Generated archive",n),n},Te=async(e,{name:t}={})=>{const i=await e.getFilesArray(),r={close:()=>e.close(),filename:t??"",records:i.map(n=>({dir:!1,basename:n.file.name,size:n.file.size,uri:`${n.path}${n.file.name}`,blob:async()=>await n.file.extract(),string:async()=>(await n.file.extract()).text()}))};return F.log("Generated archive",r),r},Ee=async(e,{orderByAlpha:t,name:i}={})=>{let r=e;return t&&(r=r.slice().sort((n,o)=>L(n.name,o.name))),{filename:i||"",records:r.map(n=>({dir:n.isDir,basename:A(n.name),uri:n.name,blob:async()=>new Blob([await n.data()]),string:async()=>{const o=await n.data();return String.fromCharCode.apply(null,Array.from(new Uint16Array(o)))},size:n.size})),close:()=>Promise.resolve()}},Ie=({enableReport:e}={})=>{F.enable(!!e)};class Ne{constructor(t){this.cleanArchiveAfter=t,this.state$=new a.BehaviorSubject({status:"idle",locks:0})}update(t){this.state$.next({...this.state$.getValue(),...t})}get locks$(){return this.state$.pipe(a.map(({locks:t})=>t))}get state(){return this.state$.getValue()}get isUnlocked$(){return this.locks$.pipe(a.map(t=>t<=0),a.distinctUntilChanged(),a.shareReplay())}get overTTL$(){return this.isUnlocked$.pipe(a.switchMap(t=>t?this.cleanArchiveAfter===1/0?a.NEVER:a.timer(this.cleanArchiveAfter):a.NEVER))}}const Se=({getArchive:e,cleanArchiveAfter:t=300*1e3})=>{const i=new a.Subject,r=new a.Subject,n=new a.Subject,o={},s=i.pipe(a.mergeMap(f=>{const d=o[f];if(!d||d.state.status!=="idle")return a.EMPTY;let m=!1;const u=w=>{F.debug(`Cleaning up archive with key: ${w}`);const N=o[w];delete o[w],m||(N?.state.archive?.close(),m=!0)};d.update({status:"loading"});const b=d.locks$,$=d.isUnlocked$,g=b.pipe(a.pairwise(),a.filter(([w,N])=>N>w),a.startWith(!0));return a.from(e(f)).pipe(a.tap(w=>{d.update({archive:w,status:"success"})}),a.catchError(w=>(u(f),d.update({status:"error",error:w}),a.EMPTY)),a.switchMap(()=>{const w=g.pipe(a.switchMap(()=>n),a.switchMap(()=>$),a.filter(P=>P));return a.merge(w,d.overTTL$).pipe(a.first(),a.tap(()=>{u(f)}))}))}),a.takeUntil(r)),c=f=>{let d=!1;const m=o[f]??new Ne(t);o[f]=m,m.update({locks:m.state.locks+1});const u=()=>{d||(d=!0,m.update({locks:m.state.locks-1}))};i.next(f);const b=m.state$.pipe(a.map(({archive:g})=>g),a.filter(g=>!!g)),$=m.state$.pipe(a.tap(({error:g})=>{if(g)throw g}),a.ignoreElements());return a.merge(b,$).pipe(a.first(),a.map(g=>({archive:g,release:u})),a.catchError(g=>{throw u(),g}))},l=()=>{n.next()};return s.subscribe(),{access:c,purge:l,_archives:o}};class H{constructor({onError:t,onManifestSuccess:i,...r}){this.onError=n=>(console.error(n),new Response(String(n),{status:500})),this.epubLoader=Se(r),this.onManifestSuccess=i??(({manifest:n})=>Promise.resolve(n)),this.onError=t??this.onError}prune(){this.epubLoader.purge()}accessArchive(t){return this.lastAccessedKey!==void 0&&this.lastAccessedKey!==t&&this.epubLoader.purge(),this.lastAccessedKey=t,this.epubLoader.access(t)}accessArchiveWithoutLock(t){return this.accessArchive(t).pipe(a.map(({archive:i,release:r})=>(r(),i)))}fetchManifest({key:t,baseUrl:i}){const r=this.accessArchive(t).pipe(a.mergeMap(({archive:n,release:o})=>a.from(V(n,{baseUrl:i})).pipe(a.switchMap(c=>a.from(this.onManifestSuccess({manifest:c,archive:n}))),a.map(c=>new Response(JSON.stringify(c),{status:200})),a.finalize(()=>{o()}))),a.catchError(n=>a.of(this.onError(n))));return a.lastValueFrom(r)}fetchResource({key:t,resourcePath:i}){const r=this.accessArchive(t).pipe(a.mergeMap(({archive:n,release:o})=>{const s=i.replaceAll("file://","");return a.from(X(n,s)).pipe(a.map(l=>new Response(l.body,{status:200,headers:{...l.params.contentType&&{"Content-Type":l.params.contentType}}})),a.finalize(()=>{o()}))}),a.catchError(n=>a.of(this.onError(n))));return a.lastValueFrom(r)}}class We extends H{constructor({getUriInfo:t,...i}){super(i),this.getUriInfo=t,this.fetchEventListener=this.fetchEventListener.bind(this)}fetchEventListener(t){try{const i=this.getUriInfo(t);if(!i)return;const r=k(i.baseUrl),n=t.request.url.substring(r.length+1),[o=""]=n.split("/"),s=decodeURIComponent(k(n.substring(o.length+1)));n.endsWith("/manifest")?t.respondWith(this.fetchManifest({key:o,baseUrl:`${r}/${o}/`})):t.respondWith(this.fetchResource({key:o,resourcePath:s}))}catch(i){t.respondWith(new Response(String(i),{status:500}))}}}p.ServiceWorkerStreamer=We,p.Streamer=H,p.configure=Ie,p.createArchiveFromArrayBufferList=Ee,p.createArchiveFromJszip=Ae,p.createArchiveFromLibArchive=Te,p.createArchiveFromText=Fe,p.createArchiveFromUrls=$e,p.generateManifestFromArchive=V,p.generateResourceFromArchive=X,p.getArchiveOpfInfo=E,p.getUriBasePath=M,p.getUriBasename=A,p.removeTrailingSlash=k,p.sortByTitleComparator=L,Object.defineProperty(p,Symbol.toStringTag,{value:"Module"})}));
19
+ `;return{filename:"content.txt",records:[{dir:!1,basename:F("generated.opf"),uri:"generated.opf",blob:async()=>new Blob([r]),string:async()=>r,size:0},{dir:!1,basename:F("p01.txt"),uri:"p01.txt",blob:async()=>typeof n=="string"?new Blob([n]):n,string:async()=>typeof n=="string"?n:n.text(),size:typeof n=="string"?n.length:n.size,encodingFormat:e}],close:()=>Promise.resolve()}},Q=async(n,e)=>{const o=`
20
+ <?xml version="1.0" encoding="UTF-8"?><package xmlns="http://www.idpf.org/2007/opf" version="2.0" unique-identifier="bookid">
21
+ <metadata>
22
+ <meta property="rendition:layout">${e?.useRenditionFlow?"reflowable":"pre-paginated"}</meta>
23
+ ${e?.useRenditionFlow?'<meta property="rendition:flow">scrolled-continuous</meta>':""}
24
+ </metadata>
25
+ <manifest>
26
+ ${n.map(i=>`<item id="${F(i)}" href="${i}" media-type="${g.detectMimeTypeFromName(i)}"/>`).join(`
27
+ `)}
28
+ </manifest>
29
+ <spine>
30
+ ${n.map(i=>`<itemref idref="${F(i)}" />`).join(`
31
+ `)}
32
+ </spine>
33
+ </package>
34
+ `,r=n.map(i=>({dir:!1,basename:F(i),encodingFormat:g.detectMimeTypeFromName(i),uri:i,size:100/n.length,blob:async()=>(await fetch(i)).blob(),string:async()=>""}));return{filename:"",records:[{dir:!1,basename:"content.opf",uri:"content.opf",size:0,blob:async()=>new Blob,string:async()=>o},...r],close:()=>Promise.resolve()}},Z=({enableReport:n}={})=>{f.enable(!!n)},A=n=>{const o=Object.values(n.records).filter(r=>!r.dir).find(r=>r.uri.endsWith(".opf"));return{data:o,basePath:o?.uri.substring(0,o.uri.lastIndexOf("/"))||""}},j=({archive:n})=>async e=>{const o=n.records.find(t=>t.basename.toLowerCase()==="com.apple.ibooks.display-options.xml");if(!o||o.dir)return e;const r=await(await o.blob()).text();try{const a=new b.XmlDocument(r).childNamed("platform")?.childrenNamed("option")?.find(c=>c.attr.name==="fixed-layout")?.val||"false";return{...e,renditionLayout:a==="true"?"pre-paginated":e.renditionLayout}}catch(t){return console.error(`Unable to parse com.apple.ibooks.display-options.xml for content
35
+ `,r),console.error(t),e}},ee=async n=>{const e={renditionLayout:void 0};return await Promise.all(n.records.map(async o=>{if(o.uri.endsWith("com.kobobooks.display-options.xml")&&!o.dir){const t=new b.XmlDocument(await o.string()).childNamed("platform")?.childNamed("option");t?.attr?.name==="fixed-layout"&&t.val==="true"&&(e.renditionLayout="pre-paginated")}})),e},te=({archive:n})=>async e=>{const o=await ee(n);return{...e,renditionLayout:e.renditionLayout??o.renditionLayout}},ne=({archive:n,baseUrl:e})=>async()=>{const o=Object.values(n.records).filter(r=>!r.dir);return{filename:n.filename,title:n.records.find(({dir:r})=>r)?.basename.replace(/\/$/,"")||n.filename,renditionLayout:void 0,renditionSpread:"auto",readingDirection:"ltr",spineItems:o.filter(r=>!r.basename.endsWith(".db")).map((r,t)=>{const i=e||(/^https?:\/\//.test(r.uri)?"":"file://");return{id:`${t}.${r.basename}`,index:t,href:encodeURI(`${i}${r.uri}`),renditionLayout:void 0,progressionWeight:1/o.length,pageSpreadLeft:void 0,pageSpreadRight:void 0,mediaType:r.encodingFormat}}),items:o.map((r,t)=>({id:`${t}.${r.basename}`,href:encodeURI(`${e}${r.uri}`)}))}},R=async({archive:n})=>{const{data:e,basePath:o}=A(n)||{},r=await e?.string();if(!r)return[];const t=new b.XmlDocument(r),i=t.childNamed("manifest"),c=t.childNamed("spine")?.childrenNamed("itemref").map(l=>l.attr.idref),m=i?.childrenNamed("item").filter(l=>c.includes(l.attr.id||""))||[];return n.records.filter(l=>m.find(u=>o?`${o}/${u.attr.href}`===l.uri:`${u.attr.href}`===l.uri))},re=n=>{const e=n.attr.properties?.split(" ")||[];let o;return e.find(r=>r==="rendition:layout-reflowable")&&(o="reflowable"),e.find(r=>r==="rendition:layout-pre-paginated")&&(o="pre-paginated"),{renditionLayout:o,pageSpreadLeft:e.some(r=>r==="page-spread-left")||void 0,pageSpreadRight:e.some(r=>r==="page-spread-right")||void 0}},ie=(n,e,o)=>{const r=n.attr.href||"",t=o?.(n);return{href:e?`${t}${e}/${r}`:`${t}${r}`,id:n.attr.id||"",mediaType:n.attr["media-type"]}},D=(n,e,o)=>{const r=n.childNamed("manifest"),{basePath:t}=A(e)||{};return r?.childrenNamed("item")?.map(i=>ie(i,t,o))||[]},oe=({archive:n,baseUrl:e})=>async o=>{const{data:r,basePath:t}=A(n)||{};if(!r)return o;const i=await r.string();f.groupCollapsed(...f.getGroupArgs("OPF data")),f.log("data",i),f.groupEnd();const a=new b.XmlDocument(i),c=a.childNamed("metadata"),m=a.childNamed("manifest"),d=a.childNamed("spine"),l=a.childNamed("guide"),u=c?.childNamed("dc:title"),w=c?.childrenNamed("meta")||[],$=w.find(h=>h.attr.property==="rendition:layout"),N=w.find(h=>h.attr.property==="rendition:flow"),y=w.find(h=>h.attr.property==="rendition:spread"),L=$?.val,v=N?.val,T=y?.val,k=u?.val||n.records.find(({dir:h})=>h)?.basename||"",Ce=d?.attr["page-progression-direction"],Pe=(await R({archive:n})).reduce((h,I)=>I.size+h,0);return{filename:n.filename,renditionLayout:L,renditionFlow:v||"auto",renditionSpread:T,title:k,readingDirection:Ce||"ltr",spineItems:d?.childrenNamed("itemref").map((h,I)=>{const E=m?.childrenNamed("item").find(C=>C.attr.id===h?.attr.idref),H=E?.attr.href||"",Re=n.records.find(C=>C.uri.endsWith(H))?.size||0,J=e||(/^https?:\/\//.test(H)?"":"file://"),_=re(h);return{..._,id:E?.attr.id||"",index:I,href:E?.attr.href?.startsWith("https://")?E?.attr.href:t?`${J}${t}/${E?.attr.href}`:`${J}${E?.attr.href}`,renditionLayout:_.renditionLayout??L,progressionWeight:Re/Pe,mediaType:E?.attr["media-type"]}})||[],items:D(a,n,h=>{const I=h.attr.href||"";return/^https?:\/\//.test(I)?"":e||"file://"}),guide:l?.childrenNamed("reference").map(h=>({href:h.attr.href||"",title:h.attr.title||"",type:h.attr.type}))}},ae=n=>{const e=n.descendantWithPath("head")?.childrenNamed("meta").find(o=>o.attr.name==="viewport");return!!(e&&e.attr.name==="viewport")},se=n=>n.reduce(async(e,o)=>{if(!await e||!g.isXmlBasedMimeType({mimeType:o.encodingFormat,uri:o.uri}))return!1;const t=o.dir?null:await o.string();return t?ae(new b.XmlDocument(t)):!1},Promise.resolve(!0)),ce=({archive:n})=>async e=>{if(e.renditionLayout==="reflowable"&&e.spineItems.every(r=>r.renditionLayout==="reflowable")){const r=await R({archive:n});if(await se(r))return{...e,spineItems:e.spineItems.map(i=>({...i,renditionLayout:"pre-paginated"})),renditionLayout:"pre-paginated"}}return e},de=({archive:n})=>async e=>{const o=n.records.find(i=>i.basename.toLowerCase()==="comicinfo.xml"&&!i.dir);if(!o||o.dir)return e;const r={...e,spineItems:e.spineItems.filter(i=>!i.id.toLowerCase().endsWith("comicinfo.xml")).map((i,a,c)=>({...i,progressionWeight:1/c.length}))},t=await o.string();try{const a=new b.XmlDocument(t).childNamed("Manga")?.val||"unknown";return{...r,readingDirection:a==="YesAndRightToLeft"?"rtl":"ltr"}}catch(i){return console.error(`Unable to parse comicinfo.xml for content
36
+ `,t),console.error(i),r}},le=n=>n.records.some(e=>e.basename.endsWith(".opf")),me=({archive:n})=>async e=>le(n)?e:{...e,spineItems:e.spineItems.map(r=>{const t=n.records.find(a=>decodeURI(r.href).endsWith(a.uri)),i=g.parseContentType(t?.encodingFormat??"")??g.detectMimeTypeFromName(t?.basename??"");return{...r,renditionLayout:i?.startsWith("image/")?"pre-paginated":r.renditionLayout}})},M=n=>n?n.children.map(e=>e instanceof b.XmlTextNode?e.text:e instanceof b.XmlElement?M(e):"").join("").trim():"",O=(n,{basePath:e,baseUrl:o})=>{const r={contents:[],path:"",href:"",title:""};let t=n.childNamed("span")||n.childNamed("a");r.title=(t?.attr.title||t?.val.trim()||M(t))??"";let i=t?.name;i!=="a"&&(t=n.descendantWithPath(`${i}.a`),t&&(i=t.name.toLowerCase())),i==="a"&&t?.attr.href&&(r.path=g.urlJoin(e,t.attr.href),r.href=g.urlJoin(o,e,t.attr.href));const a=n.childNamed("ol");if(a){const c=a.childrenNamed("li");c&&c.length>0&&(r.contents=c.map(m=>O(m,{basePath:e,baseUrl:o})))}return r},pe=(n,{basePath:e,baseUrl:o})=>{const r=[];let t;return n.descendantWithPath("body.nav.ol")?t=n.descendantWithPath("body.nav.ol")?.children:n.descendantWithPath("body.section.nav.ol")&&(t=n.descendantWithPath("body.section.nav.ol")?.children),t&&t.length>0&&t.filter(i=>i.name==="li").forEach(i=>{r.push(O(i,{basePath:e,baseUrl:o}))}),r},fe=async(n,e,{baseUrl:o})=>{const r=n.childNamed("manifest")?.childrenNamed("item").find(t=>t.attr.properties==="nav");if(r){const t=Object.values(e.records).find(i=>i.uri.endsWith(r.attr.href||""));if(t&&!t.dir){const i=new b.XmlDocument(await t.string()),a=P(t.uri);return pe(i,{basePath:a,baseUrl:o})}}},U=(n,{opfBasePath:e,baseUrl:o,prefix:r})=>{const t=n?.childNamed(`${r}content`)?.attr.src||"",i={title:n?.descendantWithPath(`${r}navLabel.${r}text`)?.val||"",path:g.urlJoin(e,t),href:g.urlJoin(o,e,t),contents:[]},a=n.childrenNamed(`${r}navPoint`);return a&&a.length>0&&(i.contents=a.map(c=>U(c,{opfBasePath:e,baseUrl:o,prefix:r}))),i},ue=(n,{opfBasePath:e,baseUrl:o})=>{const r=[],t=n.name;let i="";return t.indexOf(":")!==-1&&(i=`${t.split(":")[0]}:`),n.childNamed(`${i}navMap`)?.childrenNamed(`${i}navPoint`).forEach(a=>{r.push(U(a,{opfBasePath:e,baseUrl:o,prefix:i}))}),r},he=async({opfData:n,opfBasePath:e,baseUrl:o,archive:r})=>{const i=n.childNamed("spine")?.attr.toc;if(i){const a=n.childNamed("manifest")?.childrenNamed("item").find(c=>c.attr.id===i);if(a){const c=`${e}${e===""?"":"/"}${a.attr.href}`,m=Object.values(r.records).find(d=>d.uri.endsWith(c));if(m&&!m.dir){const d=new b.XmlDocument(await m.string());return ue(d,{opfBasePath:e,baseUrl:o})}}}},ge=async(n,e,{baseUrl:o})=>{const{basePath:r}=A(e)||{},t=await fe(n,e,{baseUrl:o});if(t)return t;const i=await he({opfData:n,opfBasePath:r,archive:e,baseUrl:o});if(i)return i},ye=(n,{baseUrl:e})=>{const o=[...n.records].sort((t,i)=>S(t.uri,i.uri)),r=(t,i,a,c,m)=>{const d=t.find(w=>w.title===i),[l,...u]=a;return d?l?[...t.filter($=>$!==d),{...d,contents:[...d.contents,...r(d.contents,l,u,c,m)]}]:d.path.split("/").length>m.split("/").length?[...t.filter($=>$!==d),{...d,path:m,href:c}]:t:l?[...t,{contents:r([],l,u,c,m),href:c,path:m,title:i}]:[...t,{contents:[],href:c,path:m,title:i}]};return o.reduce((t,i)=>{if(i.dir)return t;const a=i.uri.split("/").slice(0,-1),[c,...m]=a;if(!c)return t;const d=g.urlJoin(e,encodeURI(i.uri)).replace(/\/$/,""),l=i.uri.replace(/\/$/,"");return r(t,c,m,d,l)},[])},be=async(n,{baseUrl:e})=>{const{data:o}=A(n)||{};if(o&&!o.dir){const t=new b.XmlDocument(await o.string());return await ge(t,n,{baseUrl:e})||[]}const r=ye(n,{baseUrl:e});if(r.length!==0)return r},ve=({archive:n,baseUrl:e})=>async o=>{if(o.nav)return o;const r=await be(n,{baseUrl:e});return r?{...o,nav:{toc:r}}:o},X=async(n,{baseUrl:e=""}={})=>{const o=[oe({archive:n,baseUrl:e}),de({archive:n}),j({archive:n}),me({archive:n}),ce({archive:n}),te({archive:n}),ve({archive:n,baseUrl:e})];try{const r=ne({archive:n,baseUrl:e})(),t=await o.reduce(async(i,a)=>await a(await i),r);if(f.log("Generated manifest",t),process.env.NODE_ENV==="development"&&f.isEnabled()){const i=JSON.stringify(t,null,2);f.groupCollapsed(...f.getGroupArgs("Generated manifest")),f.log(`
37
+ ${i}`),f.groupEnd()}return t}catch(r){throw f.error(r),r}},we=n=>{const e=n.descendantWithPath("head")?.childrenNamed("meta").find(o=>o.attr.name==="calibre:cover");return!!(e&&e.attr.name==="calibre:cover")},$e=n=>n.descendantWithPath("body")?.descendantWithPath("div")?.childrenNamed("svg")?.find(e=>e.attr.width==="100%"&&e.attr.preserveAspectRatio==="none"),Fe=({archive:n,resourcePath:e})=>async o=>{const r=Object.values(n.records).find(t=>t.uri===e&&!t.dir);if(r&&!r.dir&&r.basename.endsWith(".xhtml")){const t=o.body??await r.string(),i=new b.XmlDocument(t);if(we(i)){const a=$e(i);return a&&delete a.attr.preserveAspectRatio,{...o,body:i?.toString()}}}return o},Ae=({archive:n,resourcePath:e})=>async o=>Fe({archive:n,resourcePath:e})(o),Ee=({archive:n,resourcePath:e})=>async o=>{const r=Object.values(n.records).find(t=>t.uri===e&&!t.dir);if(r&&!r.dir&&r.basename.endsWith(".css")){const i=(o.body??await r.string()).replaceAll("-webkit-writing-mode","writing-mode");return{...o,body:i}}return o},Te=async(n,e)=>{const r=await A(n).data?.string();if(r){const t=new b.XmlDocument(r),i=D(t,n,()=>"");if(i.find(c=>e.endsWith(c.href))?.mediaType)return{mediaType:i.find(c=>e.endsWith(c.href))?.mediaType}}return{mediaType:Ne(e)}},Ne=n=>{if(n.endsWith(".css"))return"text/css; charset=UTF-8";if(n.endsWith(".jpg"))return"image/jpg";if(n.endsWith(".xhtml"))return"application/xhtml+xml";if(n.endsWith(".mp4"))return"video/mp4";if(n.endsWith(".svg"))return"image/svg+xml"},Ie=({archive:n,resourcePath:e})=>async o=>{const r=Object.values(n.records).find(i=>i.uri===e&&!i.dir);if(!r||r.dir)return o;const t=await Te(n,e);return{...o,params:{...o.params,...r?.encodingFormat&&{contentType:r.encodingFormat},...t.mediaType&&{contentType:t.mediaType}}}},B=["div","span","p","a","li","ul","ol","h1","h2","h3","h4","h5","h6","table","tr","td","th","thead","tbody","tfoot","section","article","header","footer","nav","aside","main","figure","figcaption","blockquote","pre","code","form","textarea","select","option","button","label","fieldset","legend","caption","dl","dt","dd","iframe","video","audio","canvas","script","style"],Se=({archive:n,resourcePath:e})=>async o=>{const r=Object.values(n.records).find(t=>t.uri===e&&!t.dir);if(r&&!r.dir&&r.basename.endsWith(".xhtml")){const t=o.body??await r.string();if(!new RegExp(`<(${B.join("|")})[\\s/>]`,"i").test(t))return o;const a=new RegExp(`<(${B.join("|")})(\\s[^>]*)?\\s*/>`,"gi"),c=t.replace(a,(m,d,l="")=>`<${d} ${l.trim()}></${d}>`);return{...o,body:c}}return o},z=async(n,e)=>{const o=Object.values(n.records).find(i=>i.uri===e&&!i.dir);if(!o||o.dir)throw new Error(`no file found for resourcePath:${e}`);const r={params:{}},t=[Ie({archive:n,resourcePath:e}),Se({archive:n,resourcePath:e}),Ee({archive:n,resourcePath:e}),Ae({archive:n,resourcePath:e})];try{const i=await t.reduce(async(a,c)=>await c(await a),Promise.resolve(r));return f.log("Generated resource",e,i),{...i,body:i.body??await o.blob()}}catch(i){throw f.error(i),i}};class We{constructor(e){this.cleanArchiveAfter=e,this.state$=new s.BehaviorSubject({status:"idle",locks:0})}update(e){this.state$.next({...this.state$.getValue(),...e})}get locks$(){return this.state$.pipe(s.map(({locks:e})=>e))}get state(){return this.state$.getValue()}get isUnlocked$(){return this.locks$.pipe(s.map(e=>e<=0),s.distinctUntilChanged(),s.shareReplay())}get overTTL$(){return this.isUnlocked$.pipe(s.switchMap(e=>e?this.cleanArchiveAfter===1/0?s.NEVER:s.timer(this.cleanArchiveAfter):s.NEVER))}}const Le=({getArchive:n,cleanArchiveAfter:e=300*1e3})=>{const o=new s.Subject,r=new s.Subject,t=new s.Subject,i={},a=o.pipe(s.mergeMap(d=>{const l=i[d];if(!l||l.state.status!=="idle")return s.EMPTY;let u=!1;const w=v=>{f.debug(`Cleaning up archive with key: ${v}`);const T=i[v];delete i[v],u||(T?.state.archive?.close(),u=!0)};l.update({status:"loading"});const $=l.locks$,N=l.isUnlocked$,y=$.pipe(s.pairwise(),s.filter(([v,T])=>T>v),s.startWith(!0));return s.from(n(d)).pipe(s.tap(v=>{l.update({archive:v,status:"success"})}),s.catchError(v=>(w(d),l.update({status:"error",error:v}),s.EMPTY)),s.switchMap(()=>{const v=y.pipe(s.switchMap(()=>t),s.switchMap(()=>N),s.filter(k=>k));return s.merge(v,l.overTTL$).pipe(s.first(),s.tap(()=>{w(d)}))}))}),s.takeUntil(r)),c=d=>{let l=!1;const u=i[d]??new We(e);i[d]=u,u.update({locks:u.state.locks+1});const w=()=>{l||(l=!0,u.update({locks:u.state.locks-1}))};o.next(d);const $=u.state$.pipe(s.map(({archive:y})=>y),s.filter(y=>!!y)),N=u.state$.pipe(s.tap(({error:y})=>{if(y)throw y}),s.ignoreElements());return s.merge($,N).pipe(s.first(),s.map(y=>({archive:y,release:w})),s.catchError(y=>{throw w(),y}))},m=()=>{t.next()};return a.subscribe(),{access:c,purge:m,_archives:i}};class V{constructor({onError:e,onManifestSuccess:o,...r}){this.onError=t=>(console.error(t),new Response(String(t),{status:500})),this.epubLoader=Le(r),this.onManifestSuccess=o??(({manifest:t})=>Promise.resolve(t)),this.onError=e??this.onError}prune(){this.epubLoader.purge()}accessArchive(e){return this.lastAccessedKey!==void 0&&this.lastAccessedKey!==e&&this.epubLoader.purge(),this.lastAccessedKey=e,this.epubLoader.access(e)}accessArchiveWithoutLock(e){return this.accessArchive(e).pipe(s.map(({archive:o,release:r})=>(r(),o)))}fetchManifest({key:e,baseUrl:o}){const r=this.accessArchive(e).pipe(s.mergeMap(({archive:t,release:i})=>s.from(X(t,{baseUrl:o})).pipe(s.switchMap(c=>s.from(this.onManifestSuccess({manifest:c,archive:t}))),s.map(c=>new Response(JSON.stringify(c),{status:200})),s.finalize(()=>{i()}))),s.catchError(t=>s.of(this.onError(t))));return s.lastValueFrom(r)}fetchResource({key:e,resourcePath:o}){const r=this.accessArchive(e).pipe(s.mergeMap(({archive:t,release:i})=>{const a=o.replaceAll("file://","");return s.from(z(t,a)).pipe(s.map(m=>new Response(m.body,{status:200,headers:{...m.params.contentType&&{"Content-Type":m.params.contentType}}})),s.finalize(()=>{i()}))}),s.catchError(t=>s.of(this.onError(t))));return s.lastValueFrom(r)}}class ke extends V{constructor({getUriInfo:e,...o}){super(o),this.getUriInfo=e,this.fetchEventListener=this.fetchEventListener.bind(this)}fetchEventListener(e){try{const o=this.getUriInfo(e);if(!o)return;const r=W(o.baseUrl),t=e.request.url.substring(r.length+1),[i=""]=t.split("/"),a=decodeURIComponent(W(t.substring(i.length+1)));t.endsWith("/manifest")?e.respondWith(this.fetchManifest({key:i,baseUrl:`${r}/${i}/`})):e.respondWith(this.fetchResource({key:i,resourcePath:a}))}catch(o){e.respondWith(new Response(String(o),{status:500}))}}}p.ServiceWorkerStreamer=ke,p.Streamer=V,p.configure=Z,p.createArchiveFromArrayBufferList=G,p.createArchiveFromJszip=K,p.createArchiveFromLibArchive=Y,p.createArchiveFromText=x,p.createArchiveFromUrls=Q,p.generateManifestFromArchive=X,p.generateResourceFromArchive=z,p.getArchiveOpfInfo=A,p.getUriBasePath=P,p.getUriBasename=F,p.removeTrailingSlash=W,p.sortByTitleComparator=S,Object.defineProperty(p,Symbol.toStringTag,{value:"Module"})}));
34
38
  //# sourceMappingURL=index.umd.cjs.map