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