// @license magnet:?xt=urn:btih:0b31508aeb0634b347b8270c7bee4d411b5d4109&dn=agpl-3.0.txt AGPL-3.0-or-later
// @source: https://gitlab.com/soapbox-pub/ditto/-/tree/f0a3877c
import{i as e,o as t,t as n}from"./sha256-Cx9u8cje.js";import{r}from"./sanitizeUrl-Bk5f35GN.js";function i(e){let t=new ArrayBuffer(e.byteLength),n=new Uint8Array(t);return n.set(e),n}function a(e){try{let t=e.replace(/-/g,`+`).replace(/_/g,`/`),n=atob(t),r=new Uint8Array(n.length);for(let e=0;e<n.length;e++)r[e]=n.charCodeAt(e);return r}catch{return}}function o(e){let n=e.trim();if(n){if(/^[0-9a-f]+$/i.test(n)&&n.length%2==0)try{return t(n.toLowerCase())}catch{return}return a(n)}}async function s(e,t,n){let r=await crypto.subtle.importKey(`raw`,i(t),`AES-GCM`,!1,[`decrypt`]);return crypto.subtle.decrypt({name:`AES-GCM`,iv:i(n)},r,e)}function c(e){let{algorithm:t,key:n,nonce:r}=e;if(!(!t||!n||!r))return{algorithm:t,key:n,nonce:r,hash:e.hash,mime:e.mime,fallbacks:e.fallbacks?.length?e.fallbacks:void 0}}function l(e){return e.algorithm.toLowerCase()===`aes-gcm`}function u(e){let{algorithm:t,key:n,nonce:r}=e;return{algorithm:t,key:n,nonce:r}}function d(e){let t=(...t)=>t.every((t,n)=>e[n]===t);if(t(137,80,78,71))return`image/png`;if(t(255,216,255))return`image/jpeg`;if(t(71,73,70))return`image/gif`;if(t(82,73,70,70)){if(e[8]===87&&e[9]===69&&e[10]===66)return`image/webp`;if(e[8]===87&&e[9]===65&&e[10]===86)return`audio/wav`}return e[4]===102&&e[5]===116&&e[6]===121&&e[7]===112?`video/mp4`:t(26,69,223,163)?`video/webm`:t(79,103,103,83)?`audio/ogg`:t(73,68,51)||e[0]===255&&(e[1]&224)==224?`audio/mpeg`:t(37,80,68,70)?`application/pdf`:`application/octet-stream`}var f=class extends Error{byteSize;constructor(e){super(`Encrypted file is too large to decrypt: ${e} bytes`),this.name=`FileTooLargeError`,this.byteSize=e}};function p(e){let t=0,n=[];return async function(r){t>=e&&await new Promise(e=>n.push(e)),t++;try{return await r()}finally{t--,n.shift()?.()}}}var m=p(3);async function h(e,t){let n=e.headers.get(`content-length`),r=n===null?NaN:Number(n),i=Number.isFinite(r)&&r>=0;if(i&&r>t)throw new f(r);if(!e.body){let n=await e.arrayBuffer();if(n.byteLength>t)throw new f(n.byteLength);return n}let a=e.body.getReader(),o=i?Math.min(r,t):t,s=i?new Uint8Array(r):void 0,c=[],l=0;for(;;){let{done:e,value:t}=await a.read();if(e)break;if(l+t.byteLength>o)throw await a.cancel(),new f(l+t.byteLength);s?s.set(t,l):c.push(t),l+=t.byteLength}if(s)return l===s.byteLength?s.buffer:s.buffer.slice(0,l);let u=new Uint8Array(l),d=0;for(let e of c)u.set(e,d),d+=e.byteLength;return u.buffer}async function g(t,i,a={}){if(!l(i))throw Error(`Unsupported encryption algorithm: ${i.algorithm}`);let c=o(i.key),u=o(i.nonce);if(!c||!u)throw Error(`Malformed decryption key or nonce`);let p=[t,...i.fallbacks??[],...a.fallbackUrls??[]].map(e=>r(e)).filter(e=>!!e);if(p.length===0)throw Error(`No fetchable source for encrypted file`);let g=a.maxBytes??33554432;return m(async()=>{let t;for(let e of p)try{let n=await fetch(e,{signal:a.signal});if(!n.ok)continue;t=await h(n,g);break}catch(e){if(a.signal?.aborted||e instanceof f)throw e}if(!t)throw Error(`Could not fetch encrypted file`);let r=await s(t,c,u),o=new Uint8Array(r);if(i.hash&&e(n(o))!==i.hash.toLowerCase())throw Error("Decrypted file does not match its `ox` hash");return{bytes:o,mime:i.mime||d(o)}})}async function _(e,t,n={}){let{bytes:r,mime:i}=await g(e,t,n);return{objectUrl:URL.createObjectURL(new Blob([r],{type:i})),mime:i}}export{l as a,g as i,u as n,c as o,_ as r,s,f as t};
// @license-end
