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