@prose-reader/streamer 1.133.0 → 1.134.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,20 +1,20 @@
1
- (function(g,b){typeof exports=="object"&&typeof module<"u"?b(exports,require("xmldoc"),require("@prose-reader/shared"),require("rxjs")):typeof define=="function"&&define.amd?define(["exports","xmldoc","@prose-reader/shared","rxjs"],b):(g=typeof globalThis<"u"?globalThis:g||self,b(g["prose-streamer"]={},g.xmldoc,g.shared,g.rxjs))})(this,function(g,b,S,c){"use strict";let k=!1;const F={enable:e=>{k=e},log:(...e)=>{k&&console.log("[prose-reader-streamer]",...e)},warn:(...e)=>{k&&console.warn("[prose-reader-streamer]",...e)},error:(...e)=>{console.error(...e)},time:e=>{k&&console.time(`[prose-reader-streamer] [metric] ${e}`)},timeEnd:e=>{k&&console.timeEnd(`[prose-reader-streamer] [metric] ${e}`)},metric:(e,t=1/0)=>{const a=typeof e=="number"?e:e.duration;k&&(e.duration<=t?console.log("[prose-reader-streamer] [metric] ",`${e.name} took ${a}ms`):console.warn("[prose-reader-streamer] [metric] ",`${e.name} took ${e.duration}ms which is above the ${t}ms target for this function`))},measurePerformance:(e,t=10,a)=>(...i)=>{const n=performance.now(),r=a(...i);if(r&&r.then)return r.then(o=>{const l=performance.now();return F.metric({name:e,duration:l-n},t),o});const s=performance.now();return F.metric({name:e,duration:s-n},t),r}},x=e=>{var a;const t=(a=e.descendantWithPath("head"))==null?void 0:a.childrenNamed("meta").find(i=>i.attr.name==="calibre:cover");return!!(t&&t.attr.name==="calibre:cover")},Q=e=>{var t,a,i;return(i=(a=(t=e.descendantWithPath("body"))==null?void 0:t.descendantWithPath("div"))==null?void 0:a.childrenNamed("svg"))==null?void 0:i.find(n=>n.attr.width==="100%"&&n.attr.preserveAspectRatio==="none")},Z=({archive:e,resourcePath:t})=>async a=>{const i=Object.values(e.files).find(n=>n.uri===t);if(i!=null&&i.basename.endsWith(".xhtml")){const n=a.body??await i.string(),r=new b.XmlDocument(n);if(x(r)){const s=Q(r);return s&&delete s.attr.preserveAspectRatio,{...a,body:r==null?void 0:r.toString()}}}return a},j=({archive:e,resourcePath:t})=>async a=>Z({archive:e,resourcePath:t})(a),ee=({archive:e,resourcePath:t})=>async a=>{const i=Object.values(e.files).find(n=>n.uri===t);if(i!=null&&i.basename.endsWith(".css")){const r=(a.body??await i.string()).replaceAll("-webkit-writing-mode","writing-mode");return{...a,body:r}}return a},L=e=>{const a=Object.values(e.files).filter(i=>!i.dir).find(i=>i.uri.endsWith(".opf"));return{data:a,basePath:(a==null?void 0:a.uri.substring(0,a.uri.lastIndexOf("/")))||""}},M=e=>e?e.children.map(t=>t instanceof b.XmlTextNode?t.text:t instanceof b.XmlElement?M(t):"").join("").trim():"",W=e=>e.substring(e.lastIndexOf("/")+1)||e,O=e=>e.endsWith("/")?e.slice(0,-1):e,te=e=>{const t=e.lastIndexOf("/");return t>=0?e.substring(0,t):""},D=(e,{basePath:t,baseUrl:a})=>{const i={contents:[],path:"",href:"",title:""};let n=e.childNamed("span")||e.childNamed("a");i.title=((n==null?void 0:n.attr.title)||(n==null?void 0:n.val.trim())||M(n))??"";let r=n==null?void 0:n.name;r!=="a"&&(n=e.descendantWithPath(`${r}.a`),n&&(r=n.name.toLowerCase())),r==="a"&&(n!=null&&n.attr.href)&&(i.path=S.urlJoin(t,n.attr.href),i.href=S.urlJoin(a,t,n.attr.href));const s=e.childNamed("ol");if(s){const o=s.childrenNamed("li");o&&o.length>0&&(i.contents=o.map(l=>D(l,{basePath:t,baseUrl:a})))}return i},ne=(e,{basePath:t,baseUrl:a})=>{var r,s;const i=[];let n;return e.descendantWithPath("body.nav.ol")?n=(r=e.descendantWithPath("body.nav.ol"))==null?void 0:r.children:e.descendantWithPath("body.section.nav.ol")&&(n=(s=e.descendantWithPath("body.section.nav.ol"))==null?void 0:s.children),n&&n.length>0&&n.filter(o=>o.name==="li").forEach(o=>i.push(D(o,{basePath:t,baseUrl:a}))),i},re=async(e,t,{baseUrl:a})=>{var n;const i=(n=e.childNamed("manifest"))==null?void 0:n.childrenNamed("item").find(r=>r.attr.properties==="nav");if(i){const r=Object.values(t.files).find(s=>s.uri.endsWith(i.attr.href||""));if(r){const s=new b.XmlDocument(await r.string()),o=te(r.uri);return ne(s,{basePath:o,baseUrl:a})}}},z=(e,{opfBasePath:t,baseUrl:a,prefix:i})=>{var o,l;const n=((o=e==null?void 0:e.childNamed(`${i}content`))==null?void 0:o.attr.src)||"",r={title:((l=e==null?void 0:e.descendantWithPath(`${i}navLabel.${i}text`))==null?void 0:l.val)||"",path:S.urlJoin(t,n),href:S.urlJoin(a,t,n),contents:[]},s=e.childrenNamed(`${i}navPoint`);return s&&s.length>0&&(r.contents=s.map(p=>z(p,{opfBasePath:t,baseUrl:a,prefix:i}))),r},ie=(e,{opfBasePath:t,baseUrl:a})=>{var s;const i=[],n=e.name;let r="";return n.indexOf(":")!==-1&&(r=n.split(":")[0]+":"),(s=e.childNamed(`${r}navMap`))==null||s.childrenNamed(`${r}navPoint`).forEach(o=>i.push(z(o,{opfBasePath:t,baseUrl:a,prefix:r}))),i},ae=async({opfData:e,opfBasePath:t,baseUrl:a,archive:i})=>{var s;const n=e.childNamed("spine"),r=n&&n.attr.toc;if(r){const o=(s=e.childNamed("manifest"))==null?void 0:s.childrenNamed("item").find(l=>l.attr.id===r);if(o){const l=`${t}${t===""?"":"/"}${o.attr.href}`,p=Object.values(i.files).find(d=>d.uri.endsWith(l));if(p){const d=new b.XmlDocument(await p.string());return ie(d,{opfBasePath:t,baseUrl:a})}}}},se=async(e,t,{baseUrl:a})=>{const{basePath:i}=L(t)||{},n=await ae({opfData:e,opfBasePath:i,archive:t,baseUrl:a});return n||await re(e,t,{opfBasePath:i,baseUrl:a})},oe=async e=>{const t={renditionLayout:void 0};return await Promise.all(e.files.map(async a=>{var i,n;if(a.uri.endsWith("com.kobobooks.display-options.xml")){const s=(i=new b.XmlDocument(await a.string()).childNamed("platform"))==null?void 0:i.childNamed("option");((n=s==null?void 0:s.attr)==null?void 0:n.name)==="fixed-layout"&&s.val==="true"&&(t.renditionLayout="pre-paginated")}})),t},X=async({archive:e})=>{const{data:t,basePath:a}=L(e)||{},i=await(t==null?void 0:t.string());if(!i)return[];const n=new b.XmlDocument(i),r=n.childNamed("manifest"),s=n.childNamed("spine"),o=s==null?void 0:s.childrenNamed("itemref").map(d=>d.attr.idref),l=(r==null?void 0:r.childrenNamed("item").filter(d=>o.includes(d.attr.id||"")))||[];return e.files.filter(d=>l.find(f=>a?`${a}/${f.attr.href}`===d.uri:`${f.attr.href}`===d.uri))},ce=(e,t,a)=>{const i=e.attr.href||"",n=a==null?void 0:a(e);return{href:t?`${n}${t}/${i}`:`${n}${i}`,id:e.attr.id||"",mediaType:e.attr["media-type"]}},B=(e,t,a)=>{var r;const i=e.childNamed("manifest"),{basePath:n}=L(t)||{};return((r=i==null?void 0:i.childrenNamed("item"))==null?void 0:r.map(s=>ce(s,n,a)))||[]},de=({archive:e,baseUrl:t})=>async a=>{var q;const{data:i,basePath:n}=L(e)||{},r=await oe(e);if(!i)return a;const s=await i.string();F.log(s,r);const o=new b.XmlDocument(s),l=await se(o,e,{baseUrl:t})||[],p=o.childNamed("metadata"),d=o.childNamed("manifest"),f=o.childNamed("spine"),h=o.childNamed("guide"),w=p==null?void 0:p.childNamed("dc:title"),$=(p==null?void 0:p.childrenNamed("meta"))||[],y=$.find(u=>u.attr.property==="rendition:layout"),N=$.find(u=>u.attr.property==="rendition:flow"),v=$.find(u=>u.attr.property==="rendition:spread"),A=y==null?void 0:y.val,I=N==null?void 0:N.val,Pe=v==null?void 0:v.val,Ie=(w==null?void 0:w.val)||((q=e.files.find(({dir:u})=>u))==null?void 0:q.basename)||"",Ce=f==null?void 0:f.attr["page-progression-direction"],Re=(await X({archive:e})).reduce((u,P)=>P.size+u,0);return{filename:e.filename,nav:{toc:l},renditionLayout:A||r.renditionLayout||"reflowable",renditionFlow:I||"auto",renditionSpread:Pe,title:Ie,readingDirection:Ce||"ltr",spineItems:(f==null?void 0:f.childrenNamed("itemref").map((u,P)=>{var G,K,Y;const m=d==null?void 0:d.childrenNamed("item").find(T=>T.attr.id===(u==null?void 0:u.attr.idref)),E=(m==null?void 0:m.attr.href)||"",R=((G=u==null?void 0:u.attr.properties)==null?void 0:G.split(" "))||[],Me=((K=e.files.find(T=>T.uri.endsWith(E)))==null?void 0:K.size)||0,_=t||(/^https?:\/\//.test(E)?"":"file://");return{id:(m==null?void 0:m.attr.id)||"",index:P,href:(Y=m==null?void 0:m.attr.href)!=null&&Y.startsWith("https://")?m==null?void 0:m.attr.href:n?`${_}${n}/${m==null?void 0:m.attr.href}`:`${_}${m==null?void 0:m.attr.href}`,renditionLayout:A||"reflowable",...R.find(T=>T==="rendition:layout-reflowable")&&{renditionLayout:"reflowable"},progressionWeight:Me/Re,pageSpreadLeft:R.some(T=>T==="page-spread-left")||void 0,pageSpreadRight:R.some(T=>T==="page-spread-right")||void 0,mediaType:m==null?void 0:m.attr["media-type"]}}))||[],items:B(o,e,u=>{const P=u.attr.href||"";return/^https?:\/\//.test(P)?"":t||"file://"}),guide:h==null?void 0:h.childrenNamed("reference").map(u=>({href:u.attr.href||"",title:u.attr.title||"",type:u.attr.type}))}},le=async(e,t)=>{var n,r,s;const i=await((n=L(e).data)==null?void 0:n.string());if(i){const o=new b.XmlDocument(i),l=B(o,e,()=>"");if((r=l.find(d=>t.endsWith(d.href)))==null?void 0:r.mediaType)return{mediaType:(s=l.find(d=>t.endsWith(d.href)))==null?void 0:s.mediaType}}return{mediaType:fe(t)}},fe=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"},pe=({archive:e,resourcePath:t})=>async a=>{const i=Object.values(e.files).find(r=>r.uri===t);if(!i)return a;const n=await le(e,t);return{...a,params:{...a.params,...(i==null?void 0:i.encodingFormat)&&{contentType:i.encodingFormat},...n.mediaType&&{contentType:n.mediaType}}}},U=["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"],ue=({archive:e,resourcePath:t})=>async a=>{const i=Object.values(e.files).find(n=>n.uri===t);if(i!=null&&i.basename.endsWith(".xhtml")){const n=a.body??await i.string();if(!new RegExp(`<(${U.join("|")})[\\s/>]`,"i").test(n))return a;const s=new RegExp(`<(${U.join("|")})(\\s[^>]*)?\\s*/>`,"gi"),o=n.replace(s,(l,p,d="")=>`<${p} ${d.trim()}></${p}>`);return{...a,body:o}}return a},V=async(e,t)=>{const a=Object.values(e.files).find(r=>r.uri===t);if(!a)throw new Error("no file found");const i={params:{}},n=[pe({archive:e,resourcePath:t}),ue({archive:e,resourcePath:t}),ee({archive:e,resourcePath:t}),j({archive:e,resourcePath:t})];try{const r=await n.reduce(async(s,o)=>await o(await s),Promise.resolve(i));return F.log("Generated resource",t,r),{...r,body:r.body??await a.blob()}}catch(r){throw F.error(r),r}},me=({archive:e,baseUrl:t})=>async()=>{var i;const a=Object.values(e.files).filter(n=>!n.dir);return{filename:e.filename,title:((i=e.files.find(({dir:n})=>n))==null?void 0:i.basename.replace(/\/$/,""))||"",renditionLayout:"pre-paginated",renditionSpread:"auto",readingDirection:"ltr",spineItems:a.filter(n=>!n.basename.endsWith(".db")).map((n,r)=>({id:`${r}.${n.basename}`,index:r,href:encodeURI(`${t}${n.uri}`),renditionLayout:"pre-paginated",progressionWeight:1/a.length,pageSpreadLeft:void 0,pageSpreadRight:void 0,mediaType:n.encodingFormat})),items:a.map((n,r)=>({id:`${r}.${n.basename}`,href:encodeURI(`${t}${n.uri}`)}))}},he=({archive:e})=>async t=>{var r;const a=e.files.find(s=>s.basename.toLowerCase()==="comicinfo.xml");if(!a)return t;const i={...t,spineItems:t.spineItems.filter(s=>!s.id.toLowerCase().endsWith("comicinfo.xml")).map((s,o,l)=>({...s,progressionWeight:1/l.length}))},n=await a.string();try{const o=((r=new b.XmlDocument(n).childNamed("Manga"))==null?void 0:r.val)||"unknown";return{...i,readingDirection:o==="YesAndRightToLeft"?"rtl":"ltr"}}catch(s){return console.error(`Unable to parse comicinfo.xml for content
2
- `,n),console.error(s),i}},ge=e=>{var a;const t=(a=e.descendantWithPath("head"))==null?void 0:a.childrenNamed("meta").find(i=>i.attr.name==="viewport");return!!(t&&t.attr.name==="viewport")},ye=e=>e.reduce(async(t,a)=>{if(!await t||!S.isXmlBasedMimeType({mimeType:a.encodingFormat,uri:a.uri}))return!1;const n=await a.string();return n?ge(new b.XmlDocument(n)):!1},Promise.resolve(!0)),be=({archive:e})=>async t=>{if(t.renditionLayout==="reflowable"&&t.spineItems.every(i=>i.renditionLayout==="reflowable")){const i=await X({archive:e});if(await ye(i))return{...t,spineItems:t.spineItems.map(r=>({...r,renditionLayout:"pre-paginated"})),renditionLayout:"pre-paginated"}}return t},C=(e,t)=>{var n;const a=e.split(/(\d+)/),i=t.split(/(\d+)/);for(let r=0,s=a.length;r<s;r++)if(a[r]!==i[r])return(n=a[r])!=null&&n.match(/\d/)?+(a[r]||"")-+(i[r]||""):(a[r]||"").localeCompare(i[r]||"");return 1},we=({archive:e,baseUrl:t})=>async a=>{if(a.nav)return a;const i=[...e.files].sort((o,l)=>C(o.uri,l.uri)),n=Object.values(i),r=(o,l,p,d,f)=>{const h=o.find(y=>y.title===l),[w,...$]=p;return h?w?[...o.filter(N=>N!=h),{...h,contents:[...h.contents,...r(h.contents,w,$,d,f)]}]:h.path.split("/").length>f.split("/").length?[...o.filter(N=>N!=h),{...h,path:f,href:d}]:o:w?[...o,{contents:r([],w,$,d,f),href:d,path:f,title:l}]:[...o,{contents:[],href:d,path:f,title:l}]},s=n.reduce((o,l)=>{if(l.dir)return o;const d=l.uri.split("/").slice(0,-1),[f,...h]=d;if(f){const w=S.urlJoin(t,encodeURI(l.uri)).replace(/\/$/,""),$=l.uri.replace(/\/$/,"");return r(o,f,h,w,$)}return o},[]);return s.length===0?a:{...a,nav:{toc:s}}},ve={filename:"",items:[],nav:{toc:[]},readingDirection:"ltr",renditionLayout:"pre-paginated",renditionSpread:"auto",spineItems:[],title:""},H=async(e,{baseUrl:t=""}={})=>{const a=[me({archive:e,baseUrl:t}),de({archive:e,baseUrl:t}),be({archive:e,baseUrl:t}),he({archive:e,baseUrl:t}),we({archive:e,baseUrl:t})];try{const i=await a.reduce(async(n,r)=>await r(await n),Promise.resolve(ve));return F.log("Generated manifest",i),i}catch(i){throw F.error(i),i}},$e=async(e,t)=>{const a=`
1
+ (function(g,b){typeof exports=="object"&&typeof module<"u"?b(exports,require("xmldoc"),require("@prose-reader/shared"),require("rxjs")):typeof define=="function"&&define.amd?define(["exports","xmldoc","@prose-reader/shared","rxjs"],b):(g=typeof globalThis<"u"?globalThis:g||self,b(g["prose-streamer"]={},g.xmldoc,g.shared,g.rxjs))})(this,function(g,b,F,s){"use strict";let L=!1;const A={enable:e=>{L=e},log:(...e)=>{L&&console.log("[prose-reader-streamer]",...e)},warn:(...e)=>{L&&console.warn("[prose-reader-streamer]",...e)},error:(...e)=>{console.error(...e)},time:e=>{L&&console.time(`[prose-reader-streamer] [metric] ${e}`)},timeEnd:e=>{L&&console.timeEnd(`[prose-reader-streamer] [metric] ${e}`)},metric:(e,t=1/0)=>{const a=typeof e=="number"?e:e.duration;L&&(e.duration<=t?console.log("[prose-reader-streamer] [metric] ",`${e.name} took ${a}ms`):console.warn("[prose-reader-streamer] [metric] ",`${e.name} took ${e.duration}ms which is above the ${t}ms target for this function`))},measurePerformance:(e,t=10,a)=>(...r)=>{const n=performance.now(),i=a(...r);if(i&&i.then)return i.then(c=>{const l=performance.now();return A.metric({name:e,duration:l-n},t),c});const o=performance.now();return A.metric({name:e,duration:o-n},t),i}},Y=e=>{var a;const t=(a=e.descendantWithPath("head"))==null?void 0:a.childrenNamed("meta").find(r=>r.attr.name==="calibre:cover");return!!(t&&t.attr.name==="calibre:cover")},x=e=>{var t,a,r;return(r=(a=(t=e.descendantWithPath("body"))==null?void 0:t.descendantWithPath("div"))==null?void 0:a.childrenNamed("svg"))==null?void 0:r.find(n=>n.attr.width==="100%"&&n.attr.preserveAspectRatio==="none")},Q=({archive:e,resourcePath:t})=>async a=>{const r=Object.values(e.files).find(n=>n.uri===t);if(r!=null&&r.basename.endsWith(".xhtml")){const n=a.body??await r.string(),i=new b.XmlDocument(n);if(Y(i)){const o=x(i);return o&&delete o.attr.preserveAspectRatio,{...a,body:i==null?void 0:i.toString()}}}return a},Z=({archive:e,resourcePath:t})=>async a=>Q({archive:e,resourcePath:t})(a),j=({archive:e,resourcePath:t})=>async a=>{const r=Object.values(e.files).find(n=>n.uri===t);if(r!=null&&r.basename.endsWith(".css")){const i=(a.body??await r.string()).replaceAll("-webkit-writing-mode","writing-mode");return{...a,body:i}}return a},R=e=>e?e.children.map(t=>t instanceof b.XmlTextNode?t.text:t instanceof b.XmlElement?R(t):"").join("").trim():"",W=e=>e.substring(e.lastIndexOf("/")+1)||e,M=e=>e.endsWith("/")?e.slice(0,-1):e,ee=e=>{const t=e.lastIndexOf("/");return t>=0?e.substring(0,t):""},O=(e,{basePath:t,baseUrl:a})=>{const r={contents:[],path:"",href:"",title:""};let n=e.childNamed("span")||e.childNamed("a");r.title=((n==null?void 0:n.attr.title)||(n==null?void 0:n.val.trim())||R(n))??"";let i=n==null?void 0:n.name;i!=="a"&&(n=e.descendantWithPath(`${i}.a`),n&&(i=n.name.toLowerCase())),i==="a"&&(n!=null&&n.attr.href)&&(r.path=F.urlJoin(t,n.attr.href),r.href=F.urlJoin(a,t,n.attr.href));const o=e.childNamed("ol");if(o){const c=o.childrenNamed("li");c&&c.length>0&&(r.contents=c.map(l=>O(l,{basePath:t,baseUrl:a})))}return r},te=(e,{basePath:t,baseUrl:a})=>{var i,o;const r=[];let n;return e.descendantWithPath("body.nav.ol")?n=(i=e.descendantWithPath("body.nav.ol"))==null?void 0:i.children:e.descendantWithPath("body.section.nav.ol")&&(n=(o=e.descendantWithPath("body.section.nav.ol"))==null?void 0:o.children),n&&n.length>0&&n.filter(c=>c.name==="li").forEach(c=>r.push(O(c,{basePath:t,baseUrl:a}))),r},ne=async(e,t,{baseUrl:a})=>{var n;const r=(n=e.childNamed("manifest"))==null?void 0:n.childrenNamed("item").find(i=>i.attr.properties==="nav");if(r){const i=Object.values(t.files).find(o=>o.uri.endsWith(r.attr.href||""));if(i){const o=new b.XmlDocument(await i.string()),c=ee(i.uri);return te(o,{basePath:c,baseUrl:a})}}},D=(e,{opfBasePath:t,baseUrl:a,prefix:r})=>{var c,l;const n=((c=e==null?void 0:e.childNamed(`${r}content`))==null?void 0:c.attr.src)||"",i={title:((l=e==null?void 0:e.descendantWithPath(`${r}navLabel.${r}text`))==null?void 0:l.val)||"",path:F.urlJoin(t,n),href:F.urlJoin(a,t,n),contents:[]},o=e.childrenNamed(`${r}navPoint`);return o&&o.length>0&&(i.contents=o.map(p=>D(p,{opfBasePath:t,baseUrl:a,prefix:r}))),i},re=(e,{opfBasePath:t,baseUrl:a})=>{var o;const r=[],n=e.name;let i="";return n.indexOf(":")!==-1&&(i=n.split(":")[0]+":"),(o=e.childNamed(`${i}navMap`))==null||o.childrenNamed(`${i}navPoint`).forEach(c=>r.push(D(c,{opfBasePath:t,baseUrl:a,prefix:i}))),r},ie=async({opfData:e,opfBasePath:t,baseUrl:a,archive:r})=>{var o;const n=e.childNamed("spine"),i=n&&n.attr.toc;if(i){const c=(o=e.childNamed("manifest"))==null?void 0:o.childrenNamed("item").find(l=>l.attr.id===i);if(c){const l=`${t}${t===""?"":"/"}${c.attr.href}`,p=Object.values(r.files).find(d=>d.uri.endsWith(l));if(p){const d=new b.XmlDocument(await p.string());return re(d,{opfBasePath:t,baseUrl:a})}}}},ae=async(e,t,{baseUrl:a})=>{const{basePath:r}=N(t)||{},n=await ie({opfData:e,opfBasePath:r,archive:t,baseUrl:a});return n||await ne(e,t,{opfBasePath:r,baseUrl:a})},oe=e=>{var r;const t=((r=e.attr.properties)==null?void 0:r.split(" "))||[];let a;return t.find(n=>n==="rendition:layout-reflowable")&&(a="reflowable"),t.find(n=>n==="rendition:layout-pre-paginated")&&(a="pre-paginated"),{renditionLayout:a,pageSpreadLeft:t.some(n=>n==="page-spread-left")||void 0,pageSpreadRight:t.some(n=>n==="page-spread-right")||void 0}},N=e=>{const a=Object.values(e.files).filter(r=>!r.dir).find(r=>r.uri.endsWith(".opf"));return{data:a,basePath:(a==null?void 0:a.uri.substring(0,a.uri.lastIndexOf("/")))||""}},z=async({archive:e})=>{const{data:t,basePath:a}=N(e)||{},r=await(t==null?void 0:t.string());if(!r)return[];const n=new b.XmlDocument(r),i=n.childNamed("manifest"),o=n.childNamed("spine"),c=o==null?void 0:o.childrenNamed("itemref").map(d=>d.attr.idref),l=(i==null?void 0:i.childrenNamed("item").filter(d=>c.includes(d.attr.id||"")))||[];return e.files.filter(d=>l.find(f=>a?`${a}/${f.attr.href}`===d.uri:`${f.attr.href}`===d.uri))},se=(e,t,a)=>{const r=e.attr.href||"",n=a==null?void 0:a(e);return{href:t?`${n}${t}/${r}`:`${n}${r}`,id:e.attr.id||"",mediaType:e.attr["media-type"]}},X=(e,t,a)=>{var i;const r=e.childNamed("manifest"),{basePath:n}=N(t)||{};return((i=r==null?void 0:r.childrenNamed("item"))==null?void 0:i.map(o=>se(o,n,a)))||[]},ce=({archive:e,baseUrl:t})=>async a=>{var H;const{data:r,basePath:n}=N(e)||{};if(!r)return a;const i=await r.string(),o=new b.XmlDocument(i),c=await ae(o,e,{baseUrl:t})||[],l=o.childNamed("metadata"),p=o.childNamed("manifest"),d=o.childNamed("spine"),f=o.childNamed("guide"),m=l==null?void 0:l.childNamed("dc:title"),w=(l==null?void 0:l.childrenNamed("meta"))||[],$=w.find(h=>h.attr.property==="rendition:layout"),y=w.find(h=>h.attr.property==="rendition:flow"),S=w.find(h=>h.attr.property==="rendition:spread"),v=$==null?void 0:$.val,T=y==null?void 0:y.val,P=S==null?void 0:S.val,Ce=(m==null?void 0:m.val)||((H=e.files.find(({dir:h})=>h))==null?void 0:H.basename)||"",Re=d==null?void 0:d.attr["page-progression-direction"],Me=(await z({archive:e})).reduce((h,k)=>k.size+h,0);return{filename:e.filename,nav:{toc:c},renditionLayout:v,renditionFlow:T||"auto",renditionSpread:P,title:Ce,readingDirection:Re||"ltr",spineItems:(d==null?void 0:d.childrenNamed("itemref").map((h,k)=>{var G,K;const u=p==null?void 0:p.childrenNamed("item").find(C=>C.attr.id===(h==null?void 0:h.attr.idref)),J=(u==null?void 0:u.attr.href)||"",Oe=((G=e.files.find(C=>C.uri.endsWith(J)))==null?void 0:G.size)||0,q=t||(/^https?:\/\//.test(J)?"":"file://"),_=oe(h);return{..._,id:(u==null?void 0:u.attr.id)||"",index:k,href:(K=u==null?void 0:u.attr.href)!=null&&K.startsWith("https://")?u==null?void 0:u.attr.href:n?`${q}${n}/${u==null?void 0:u.attr.href}`:`${q}${u==null?void 0:u.attr.href}`,renditionLayout:_.renditionLayout??v,progressionWeight:Oe/Me,mediaType:u==null?void 0:u.attr["media-type"]}}))||[],items:X(o,e,h=>{const k=h.attr.href||"";return/^https?:\/\//.test(k)?"":t||"file://"}),guide:f==null?void 0:f.childrenNamed("reference").map(h=>({href:h.attr.href||"",title:h.attr.title||"",type:h.attr.type}))}},de=async(e,t)=>{var n,i,o;const r=await((n=N(e).data)==null?void 0:n.string());if(r){const c=new b.XmlDocument(r),l=X(c,e,()=>"");if((i=l.find(d=>t.endsWith(d.href)))==null?void 0:i.mediaType)return{mediaType:(o=l.find(d=>t.endsWith(d.href)))==null?void 0:o.mediaType}}return{mediaType:le(t)}},le=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"},fe=({archive:e,resourcePath:t})=>async a=>{const r=Object.values(e.files).find(i=>i.uri===t);if(!r)return a;const n=await de(e,t);return{...a,params:{...a.params,...(r==null?void 0:r.encodingFormat)&&{contentType:r.encodingFormat},...n.mediaType&&{contentType:n.mediaType}}}},E=["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"],pe=({archive:e,resourcePath:t})=>async a=>{const r=Object.values(e.files).find(n=>n.uri===t);if(r!=null&&r.basename.endsWith(".xhtml")){const n=a.body??await r.string();if(!new RegExp(`<(${E.join("|")})[\\s/>]`,"i").test(n))return a;const o=new RegExp(`<(${E.join("|")})(\\s[^>]*)?\\s*/>`,"gi"),c=n.replace(o,(l,p,d="")=>`<${p} ${d.trim()}></${p}>`);return{...a,body:c}}return a},B=async(e,t)=>{const a=Object.values(e.files).find(i=>i.uri===t);if(!a)throw new Error("no file found");const r={params:{}},n=[fe({archive:e,resourcePath:t}),pe({archive:e,resourcePath:t}),j({archive:e,resourcePath:t}),Z({archive:e,resourcePath:t})];try{const i=await n.reduce(async(o,c)=>await c(await o),Promise.resolve(r));return A.log("Generated resource",t,i),{...i,body:i.body??await a.blob()}}catch(i){throw A.error(i),i}},ue=({archive:e,baseUrl:t})=>async()=>{var r;const a=Object.values(e.files).filter(n=>!n.dir);return{filename:e.filename,title:((r=e.files.find(({dir:n})=>n))==null?void 0:r.basename.replace(/\/$/,""))||"",renditionLayout:void 0,renditionSpread:"auto",readingDirection:"ltr",spineItems:a.filter(n=>!n.basename.endsWith(".db")).map((n,i)=>({id:`${i}.${n.basename}`,index:i,href:encodeURI(`${t}${n.uri}`),renditionLayout:void 0,progressionWeight:1/a.length,pageSpreadLeft:void 0,pageSpreadRight:void 0,mediaType:n.encodingFormat})),items:a.map((n,i)=>({id:`${i}.${n.basename}`,href:encodeURI(`${t}${n.uri}`)}))}},me=async e=>{const t={renditionLayout:void 0};return await Promise.all(e.files.map(async a=>{var r,n;if(a.uri.endsWith("com.kobobooks.display-options.xml")){const o=(r=new b.XmlDocument(await a.string()).childNamed("platform"))==null?void 0:r.childNamed("option");((n=o==null?void 0:o.attr)==null?void 0:n.name)==="fixed-layout"&&o.val==="true"&&(t.renditionLayout="pre-paginated")}})),t},he=({archive:e})=>async t=>{const a=await me(e);return{...t,renditionLayout:t.renditionLayout??a.renditionLayout}},ge=e=>{var a;const t=(a=e.descendantWithPath("head"))==null?void 0:a.childrenNamed("meta").find(r=>r.attr.name==="viewport");return!!(t&&t.attr.name==="viewport")},ye=e=>e.reduce(async(t,a)=>{if(!await t||!F.isXmlBasedMimeType({mimeType:a.encodingFormat,uri:a.uri}))return!1;const n=await a.string();return n?ge(new b.XmlDocument(n)):!1},Promise.resolve(!0)),be=({archive:e})=>async t=>{if(t.renditionLayout==="reflowable"&&t.spineItems.every(r=>r.renditionLayout==="reflowable")){const r=await z({archive:e});if(await ye(r))return{...t,spineItems:t.spineItems.map(i=>({...i,renditionLayout:"pre-paginated"})),renditionLayout:"pre-paginated"}}return t},I=(e,t)=>{var n;const a=e.split(/(\d+)/),r=t.split(/(\d+)/);for(let i=0,o=a.length;i<o;i++)if(a[i]!==r[i])return(n=a[i])!=null&&n.match(/\d/)?+(a[i]||"")-+(r[i]||""):(a[i]||"").localeCompare(r[i]||"");return 1},we=({archive:e,baseUrl:t})=>async a=>{if(a.nav)return a;const r=[...e.files].sort((c,l)=>I(c.uri,l.uri)),n=Object.values(r),i=(c,l,p,d,f)=>{const m=c.find(y=>y.title===l),[w,...$]=p;return m?w?[...c.filter(S=>S!=m),{...m,contents:[...m.contents,...i(m.contents,w,$,d,f)]}]:m.path.split("/").length>f.split("/").length?[...c.filter(S=>S!=m),{...m,path:f,href:d}]:c:w?[...c,{contents:i([],w,$,d,f),href:d,path:f,title:l}]:[...c,{contents:[],href:d,path:f,title:l}]},o=n.reduce((c,l)=>{if(l.dir)return c;const d=l.uri.split("/").slice(0,-1),[f,...m]=d;if(f){const w=F.urlJoin(t,encodeURI(l.uri)).replace(/\/$/,""),$=l.uri.replace(/\/$/,"");return i(c,f,m,w,$)}return c},[]);return o.length===0?a:{...a,nav:{toc:o}}},ve=({archive:e})=>async t=>{var i;const a=e.files.find(o=>o.basename.toLowerCase()==="comicinfo.xml");if(!a)return t;const r={...t,spineItems:t.spineItems.filter(o=>!o.id.toLowerCase().endsWith("comicinfo.xml")).map((o,c,l)=>({...o,progressionWeight:1/l.length}))},n=await a.string();try{const c=((i=new b.XmlDocument(n).childNamed("Manga"))==null?void 0:i.val)||"unknown";return{...r,readingDirection:c==="YesAndRightToLeft"?"rtl":"ltr"}}catch(o){return console.error(`Unable to parse comicinfo.xml for content
2
+ `,n),console.error(o),r}},$e=e=>e.files.some(t=>t.basename.endsWith(".opf")),Fe=({archive:e})=>async t=>$e(e)?t:{...t,spineItems:t.spineItems.map(r=>{const n=e.files.find(o=>decodeURI(r.href).endsWith(o.uri)),i=F.parseContentType((n==null?void 0:n.encodingFormat)??"")??F.detectMimeTypeFromName((n==null?void 0:n.basename)??"");return{...r,renditionLayout:i!=null&&i.startsWith("image/")?"pre-paginated":r.renditionLayout}})},U=async(e,{baseUrl:t=""}={})=>{const a=[ce({archive:e,baseUrl:t}),ve({archive:e,baseUrl:t}),Fe({archive:e,baseUrl:t}),be({archive:e,baseUrl:t}),he({archive:e,baseUrl:t}),we({archive:e,baseUrl:t})];try{const r=ue({archive:e,baseUrl:t})(),n=await a.reduce(async(i,o)=>await o(await i),r);return A.log("Generated manifest",n),n}catch(r){throw A.error(r),r}},Ae=async(e,t)=>{const a=`
3
3
  <?xml version="1.0" encoding="UTF-8"?><package xmlns="http://www.idpf.org/2007/opf" version="2.0" unique-identifier="bookid">
4
4
  <metadata>
5
5
  <meta property="rendition:layout">${t!=null&&t.useRenditionFlow?"reflowable":"pre-paginated"}</meta>
6
6
  ${t!=null&&t.useRenditionFlow?'<meta property="rendition:flow">scrolled-continuous</meta>':""}
7
7
  </metadata>
8
8
  <manifest>
9
- ${e.map(r=>`<item id="${W(r)}" href="${r}" media-type="${S.detectMimeTypeFromName(r)}"/>`).join(`
9
+ ${e.map(i=>`<item id="${W(i)}" href="${i}" media-type="${F.detectMimeTypeFromName(i)}"/>`).join(`
10
10
  `)}
11
11
  </manifest>
12
12
  <spine>
13
- ${e.map(r=>`<itemref idref="${W(r)}" />`).join(`
13
+ ${e.map(i=>`<itemref idref="${W(i)}" />`).join(`
14
14
  `)}
15
15
  </spine>
16
16
  </package>
17
- `,i=e.map(r=>({dir:!1,basename:W(r),encodingFormat:S.detectMimeTypeFromName(r),uri:r,size:100/e.length,blob:async()=>(await fetch(r)).blob(),string:async()=>""}));return{filename:"",files:[{dir:!1,basename:"content.opf",uri:"content.opf",size:0,blob:async()=>new Blob,string:async()=>a},...i],close:()=>Promise.resolve()}},Fe=async(e,{mimeType:t,direction:a}={mimeType:"text/plain"})=>{const i=`
17
+ `,r=e.map(i=>({dir:!1,basename:W(i),encodingFormat:F.detectMimeTypeFromName(i),uri:i,size:100/e.length,blob:async()=>(await fetch(i)).blob(),string:async()=>""}));return{filename:"",files:[{dir:!1,basename:"content.opf",uri:"content.opf",size:0,blob:async()=>new Blob,string:async()=>a},...r],close:()=>Promise.resolve()}},Te=async(e,{mimeType:t,direction:a}={mimeType:"text/plain"})=>{const r=`
18
18
  <?xml version="1.0" encoding="UTF-8"?>
19
19
  <package xmlns="http://www.idpf.org/2007/opf" version="3.0" xml:lang="ja" prefix="rendition: http://www.idpf.org/vocab/rendition/#"
20
20
  unique-identifier="ootuya-id">
@@ -29,5 +29,5 @@
29
29
  <itemref idref="p01" />
30
30
  </spine>
31
31
  </package>
32
- `;return{filename:"content.txt",files:[{dir:!1,basename:W("generated.opf"),uri:"generated.opf",blob:async()=>new Blob([i]),string:async()=>i,size:0},{dir:!1,basename:W("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:a}={})=>{let i=Object.values(e.files);t&&(i=i.slice().sort((r,s)=>C(r.name,s.name)));const n={filename:a||"",files:i.map(r=>({dir:r.dir,basename:W(r.name),uri:r.name,blob:()=>r.async("blob"),string:()=>r.async("string"),...r.internalStream&&{stream:r.internalStream},size:r._data.uncompressedSize})),close:()=>Promise.resolve()};return F.log("Generated archive",n),n},Te=async(e,{name:t}={})=>{const a=await e.getFilesArray(),i={close:()=>e.close(),filename:t??"",files:a.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",i),i},Se=async(e,{orderByAlpha:t,name:a}={})=>{let i=e;return t&&(i=i.slice().sort((n,r)=>C(n.name,r.name))),{filename:a||"",files:i.map(n=>({dir:n.isDir,basename:W(n.name),uri:n.name,blob:async()=>new Blob([await n.data()]),string:async()=>{const r=await n.data();return String.fromCharCode.apply(null,Array.from(new Uint16Array(r)))},size:n.size})),close:()=>Promise.resolve()}},Ne=({enableReport:e}={})=>{F.enable(!!e)};class We{constructor(t){this.cleanArchiveAfter=t,this.state$=new c.BehaviorSubject({status:"idle",locks:0})}update(t){this.state$.next({...this.state$.getValue(),...t})}get locks$(){return this.state$.pipe(c.map(({locks:t})=>t))}get state(){return this.state$.getValue()}get isUnlocked$(){return this.locks$.pipe(c.map(t=>t<=0),c.distinctUntilChanged(),c.shareReplay())}get overTTL$(){return this.isUnlocked$.pipe(c.switchMap(t=>t?this.cleanArchiveAfter===1/0?c.NEVER:c.timer(this.cleanArchiveAfter):c.NEVER))}}const ke=({getArchive:e,cleanArchiveAfter:t=5*60*1e3})=>{const a=new c.Subject,i=new c.Subject,n=new c.Subject,r={},s=a.pipe(c.mergeMap(p=>{const d=r[p];if(!d||d.state.status!=="idle")return c.EMPTY;let f=!1;const h=v=>{var I;const A=r[v];delete r[v],f||((I=A==null?void 0:A.state.archive)==null||I.close(),f=!0)};d.update({status:"loading"});const w=d.locks$,$=d.isUnlocked$,y=w.pipe(c.pairwise(),c.filter(([v,A])=>A>v),c.startWith(!0));return c.from(e(p)).pipe(c.tap(v=>{d.update({archive:v,status:"success"})}),c.catchError(v=>(h(p),d.update({status:"error",error:v}),c.EMPTY)),c.switchMap(()=>{const v=y.pipe(c.switchMap(()=>n),c.switchMap(()=>$),c.filter(A=>A));return c.merge(v,d.overTTL$)}),c.tap(()=>{h(p)}))}),c.takeUntil(i)),o=p=>{let d=!1;const f=r[p]??new We(t);r[p]=f,f.update({locks:f.state.locks+1});const h=()=>{d||(d=!0,f.update({locks:f.state.locks-1}))};a.next(p);const w=f.state$.pipe(c.map(({archive:y})=>y),c.filter(y=>!!y)),$=f.state$.pipe(c.tap(({error:y})=>{if(y)throw y}),c.ignoreElements());return c.merge(w,$).pipe(c.first(),c.map(y=>({archive:y,release:h})),c.catchError(y=>{throw h(),y}))},l=()=>{n.next()};return s.subscribe(),{access:o,purge:l,archives:r}};class J{constructor({onError:t,onManifestSuccess:a,...i}){this.onError=n=>(console.error(n),new Response(String(n),{status:500})),this.epubLoader=ke(i),this.onManifestSuccess=a??(({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(c.map(({archive:a,release:i})=>(i(),a)))}fetchManifest({key:t,baseUrl:a}){const i=this.accessArchive(t).pipe(c.mergeMap(({archive:n,release:r})=>c.from(H(n,{baseUrl:a})).pipe(c.switchMap(o=>c.from(this.onManifestSuccess({manifest:o,archive:n}))),c.map(o=>new Response(JSON.stringify(o),{status:200})),c.finalize(()=>{r()}))),c.catchError(n=>c.of(this.onError(n))));return c.lastValueFrom(i)}fetchResource({key:t,resourcePath:a}){const i=this.accessArchive(t).pipe(c.mergeMap(({archive:n,release:r})=>{const s=a.replaceAll("file://","");return c.from(V(n,s)).pipe(c.map(l=>new Response(l.body,{status:200,headers:{...l.params.contentType&&{"Content-Type":l.params.contentType}}})),c.finalize(()=>{r()}))}),c.catchError(n=>c.of(this.onError(n))));return c.lastValueFrom(i)}}class Le extends J{constructor({getUriInfo:t,...a}){super(a),this.getUriInfo=t,this.fetchEventListener=this.fetchEventListener.bind(this)}fetchEventListener(t){try{const a=this.getUriInfo(t);if(!a)return;const i=O(a.baseUrl),n=t.request.url.substring(i.length+1),[r=""]=n.split("/"),s=decodeURIComponent(O(n.substring(r.length+1)));n.endsWith("/manifest")?t.respondWith(this.fetchManifest({key:r,baseUrl:`${i}/${r}/`})):t.respondWith(this.fetchResource({key:r,resourcePath:s}))}catch(a){t.respondWith(new Response(String(a),{status:500}))}}}g.ServiceWorkerStreamer=Le,g.Streamer=J,g.configure=Ne,g.createArchiveFromArrayBufferList=Se,g.createArchiveFromJszip=Ae,g.createArchiveFromLibArchive=Te,g.createArchiveFromText=Fe,g.createArchiveFromUrls=$e,g.generateManifestFromArchive=H,g.generateResourceFromArchive=V,g.getArchiveOpfInfo=L,Object.defineProperty(g,Symbol.toStringTag,{value:"Module"})});
32
+ `;return{filename:"content.txt",files:[{dir:!1,basename:W("generated.opf"),uri:"generated.opf",blob:async()=>new Blob([r]),string:async()=>r,size:0},{dir:!1,basename:W("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()}},Se=async(e,{orderByAlpha:t,name:a}={})=>{let r=Object.values(e.files);t&&(r=r.slice().sort((i,o)=>I(i.name,o.name)));const n={filename:a||"",files:r.map(i=>({dir:i.dir,basename:W(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()};return A.log("Generated archive",n),n},We=async(e,{name:t}={})=>{const a=await e.getFilesArray(),r={close:()=>e.close(),filename:t??"",files:a.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 A.log("Generated archive",r),r},Le=async(e,{orderByAlpha:t,name:a}={})=>{let r=e;return t&&(r=r.slice().sort((n,i)=>I(n.name,i.name))),{filename:a||"",files:r.map(n=>({dir:n.isDir,basename:W(n.name),uri:n.name,blob:async()=>new Blob([await n.data()]),string:async()=>{const i=await n.data();return String.fromCharCode.apply(null,Array.from(new Uint16Array(i)))},size:n.size})),close:()=>Promise.resolve()}},Ne=({enableReport:e}={})=>{A.enable(!!e)};class ke{constructor(t){this.cleanArchiveAfter=t,this.state$=new s.BehaviorSubject({status:"idle",locks:0})}update(t){this.state$.next({...this.state$.getValue(),...t})}get locks$(){return this.state$.pipe(s.map(({locks:t})=>t))}get state(){return this.state$.getValue()}get isUnlocked$(){return this.locks$.pipe(s.map(t=>t<=0),s.distinctUntilChanged(),s.shareReplay())}get overTTL$(){return this.isUnlocked$.pipe(s.switchMap(t=>t?this.cleanArchiveAfter===1/0?s.NEVER:s.timer(this.cleanArchiveAfter):s.NEVER))}}const Pe=({getArchive:e,cleanArchiveAfter:t=5*60*1e3})=>{const a=new s.Subject,r=new s.Subject,n=new s.Subject,i={},o=a.pipe(s.mergeMap(p=>{const d=i[p];if(!d||d.state.status!=="idle")return s.EMPTY;let f=!1;const m=v=>{var P;const T=i[v];delete i[v],f||((P=T==null?void 0:T.state.archive)==null||P.close(),f=!0)};d.update({status:"loading"});const w=d.locks$,$=d.isUnlocked$,y=w.pipe(s.pairwise(),s.filter(([v,T])=>T>v),s.startWith(!0));return s.from(e(p)).pipe(s.tap(v=>{d.update({archive:v,status:"success"})}),s.catchError(v=>(m(p),d.update({status:"error",error:v}),s.EMPTY)),s.switchMap(()=>{const v=y.pipe(s.switchMap(()=>n),s.switchMap(()=>$),s.filter(T=>T));return s.merge(v,d.overTTL$)}),s.tap(()=>{m(p)}))}),s.takeUntil(r)),c=p=>{let d=!1;const f=i[p]??new ke(t);i[p]=f,f.update({locks:f.state.locks+1});const m=()=>{d||(d=!0,f.update({locks:f.state.locks-1}))};a.next(p);const w=f.state$.pipe(s.map(({archive:y})=>y),s.filter(y=>!!y)),$=f.state$.pipe(s.tap(({error:y})=>{if(y)throw y}),s.ignoreElements());return s.merge(w,$).pipe(s.first(),s.map(y=>({archive:y,release:m})),s.catchError(y=>{throw m(),y}))},l=()=>{n.next()};return o.subscribe(),{access:c,purge:l,archives:i}};class V{constructor({onError:t,onManifestSuccess:a,...r}){this.onError=n=>(console.error(n),new Response(String(n),{status:500})),this.epubLoader=Pe(r),this.onManifestSuccess=a??(({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(s.map(({archive:a,release:r})=>(r(),a)))}fetchManifest({key:t,baseUrl:a}){const r=this.accessArchive(t).pipe(s.mergeMap(({archive:n,release:i})=>s.from(U(n,{baseUrl:a})).pipe(s.switchMap(c=>s.from(this.onManifestSuccess({manifest:c,archive:n}))),s.map(c=>new Response(JSON.stringify(c),{status:200})),s.finalize(()=>{i()}))),s.catchError(n=>s.of(this.onError(n))));return s.lastValueFrom(r)}fetchResource({key:t,resourcePath:a}){const r=this.accessArchive(t).pipe(s.mergeMap(({archive:n,release:i})=>{const o=a.replaceAll("file://","");return s.from(B(n,o)).pipe(s.map(l=>new Response(l.body,{status:200,headers:{...l.params.contentType&&{"Content-Type":l.params.contentType}}})),s.finalize(()=>{i()}))}),s.catchError(n=>s.of(this.onError(n))));return s.lastValueFrom(r)}}class Ie extends V{constructor({getUriInfo:t,...a}){super(a),this.getUriInfo=t,this.fetchEventListener=this.fetchEventListener.bind(this)}fetchEventListener(t){try{const a=this.getUriInfo(t);if(!a)return;const r=M(a.baseUrl),n=t.request.url.substring(r.length+1),[i=""]=n.split("/"),o=decodeURIComponent(M(n.substring(i.length+1)));n.endsWith("/manifest")?t.respondWith(this.fetchManifest({key:i,baseUrl:`${r}/${i}/`})):t.respondWith(this.fetchResource({key:i,resourcePath:o}))}catch(a){t.respondWith(new Response(String(a),{status:500}))}}}g.ServiceWorkerStreamer=Ie,g.Streamer=V,g.configure=Ne,g.createArchiveFromArrayBufferList=Le,g.createArchiveFromJszip=Se,g.createArchiveFromLibArchive=We,g.createArchiveFromText=Te,g.createArchiveFromUrls=Ae,g.generateManifestFromArchive=U,g.generateResourceFromArchive=B,g.getArchiveOpfInfo=N,Object.defineProperty(g,Symbol.toStringTag,{value:"Module"})});
33
33
  //# sourceMappingURL=index.umd.cjs.map