api-ape 2.2.2 → 2.3.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.
package/dist/ape.js CHANGED
@@ -1,2 +1,2 @@
1
- (()=>{var ge=Object.create;var Q=Object.defineProperty;var we=Object.getOwnPropertyDescriptor;var ye=Object.getOwnPropertyNames;var me=Object.getPrototypeOf,be=Object.prototype.hasOwnProperty;var Z=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Te=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of ye(t))!be.call(e,s)&&s!==n&&Q(e,s,{get:()=>t[s],enumerable:!(o=we(t,s))||o.enumerable});return e};var j=(e,t,n)=>(n=e!=null?ge(me(e)):{},Te(t||!e||!e.__esModule?Q(n,"default",{value:e,enumerable:!0}):n,e));var te=Z((ve,ee)=>{var z="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function v(e){let t=Math.floor(e/32),n=e%32;return t===0?z[n]:v(t)+z[n]}function Se(e){for(var t=0,n=0;n<e.length;++n)t+=e.charCodeAt(n),t+=t<<10,t^=t>>6;return t+=t<<3,t^=t>>11,(t+(t<<15)&4294967295)>>>0}function ke(e){return v(Se(e))}ee.exports=ke});var H=Z((et,re)=>{function ne(e){let t={"[object RegExp]":"R","[object Date]":"D","[object Error]":"E","[object Undefined]":"U","[object Map]":"M","[object Set]":"S"},n=new WeakMap;function o(r,a=""){let p=typeof r,f=t[Object.prototype.toString.call(r)];if(f!==void 0)return f==="D"?[f,r.valueOf()]:f==="E"?[f,[r.name,r.message,r.stack]]:f==="R"?[f,r.toString()]:f==="U"?[f,null]:f==="S"?[f,Array.from(r)]:f==="M"?[f,Object.fromEntries(r)]:[f,JSON.stringify(r)];if(p==="object"&&r!==null){if(i.has(r))return["P",i.get(r)];i.set(r,a);let d=Array.isArray(r),u=d?Array.from(Array(r.length).keys()):Object.keys(r),g=d?[]:{},w=[];for(let h=0;h<u.length;h++){let m=u[h],[y,S]=o(r[m],m);d?(w.push(y),g.push(S)):r[m]!==void 0&&(g[m+(y?`<!${y}>`:"")]=S)}return n.delete(r),d&&w.find(h=>!!h)?[`[${w.join()}]`,g]:["",g]}else return["",r]}let s=[];Array.isArray(e)?s=Array.from(Array(e.length).keys()):s=Object.keys(e);let i=new WeakMap;i.set(e,[]);function l(r,a=[]){let p=typeof r,f=t[Object.prototype.toString.call(r)];if(f!==void 0)return f==="D"?[f,r.valueOf()]:f==="E"?[f,[r.name,r.message,r.stack]]:f==="R"?[f,r.toString()]:f==="U"?[f,null]:f==="S"?[f,Array.from(r)]:f==="M"?[f,Object.fromEntries(r)]:[f,JSON.stringify(r)];if(p==="object"&&r!==null){if(i.has(r))return["P",i.get(r)];i.set(r,a);let d=Array.isArray(r),u=d?Array.from(Array(r.length).keys()):Object.keys(r),g=d?[]:{},w=[];for(let h=0;h<u.length;h++){let m=u[h],[y,S]=l(r[m],[...a,m]);d?(w.push(y),g.push(S)):r[m]!==void 0&&(g[m+(y?`<!${y}>`:"")]=S)}return d&&w.find(h=>!!h)?[`[${w.join()}]`,g]:["",g]}else return["",r]}let c={};for(let r=0;r<s.length;r++){let a=s[r];if(e[a]!==void 0){let[p,f]=l(e[a],[a]);c[a+(p?`<!${p}>`:"")]=f}}return c}function Ae(e){return JSON.stringify(ne(e))}function Ee(e){return oe(JSON.parse(e))}function oe(e){let t={},n=[],o={R:c=>new RegExp(c),D:c=>new Date(c),P:function(c,r){return n.push([c,r]),null},E:([c,r,a])=>{let p;try{if(p=new global[c](r),p instanceof Error)p.stack=a;else throw{}}catch{p=new Error(r),p.name=c,p.stack=a}return p},U:()=>{},S:c=>new Set(c),M:c=>new Map(Object.entries(c))},s=new Map;function i(c,r,a){let p=Array.isArray(this)?this:[];if(r in o)return o[r](a,p);if(Array.isArray(a))if(r&&r.startsWith("[")){let f=r.slice(1,-1).split(","),d=[];for(let u=0;u<a.length;u++){let g=[...p,u],w=i.call(g,u.toString(),f[u],a[u]);d.push(w)}return d}else{let f=[];for(let d=0;d<a.length;d++){let u=i.call([...p,d],"","",a[d]);f.push(u)}return f}else if(typeof a=="object"&&a!==null){if(s.has(a))return s.get(a);s.set(a,{});let f={};for(let d in a){let[u,g]=l(d),w=i.call([...p,u],u,g,a[d]);f[u]=w}return s.set(a,f),f}else return a}function l(c){let r=c.match(/(.+)(<!(.)>)/);if(r)return[r[1],r[3]];let a=c.match(/(.+)(<!!(.+)>)/);if(a)return[a[1],a[3]];let p=c.match(/(.+)(<!\[(.*)>)/);return p?[p[1],"["+p[3]]:[c,void 0]}for(let c in e){let[r,a]=l(c);t[r]=i.call([r],r,a,e[c])}return n.forEach($e.bind(null,t)),t}function $e(e,[t,n]){let o=t||[],s=n||[],i=e;for(let c=0;c<o.length;c++)i=i[o[c]];let l=e;for(let c=0;c<s.length-1;c++)l=l[s[c]];return l[s[s.length-1]]=i,e}re.exports={parse:Ee,stringify:Ae,encode:ne,decode:oe}});var le=j(te()),q=j(H());var _=j(H());function se(){let e=window.location.hostname,n=["localhost","127.0.0.1","[::1]"].includes(e),o=window.location.protocol==="https:",s=n?9010:window.location.port||(o?443:80),i=o?"https":"http",l=n||s!==80&&s!==443?`:${s}`:"";return`${i}://${e}${l}/api/ape/poll`}function Oe(e){let t=[],n=-1,o=0,s=!1,i=!1;for(let c=0;c<e.length;c++){let r=e[c];if(i){i=!1;continue}if(r==="\\"&&s){i=!0;continue}if(r==='"'){s=!s;continue}if(!s){if(r==="{")o===0&&(n=c),o++;else if(r==="}"&&(o--,o===0&&n!==-1)){let a=e.slice(n,c+1);try{t.push(_.default.parse(a))}catch(p){console.error("\u{1F98D} Failed to parse stream message:",p)}n=-1}}}let l=n!==-1?e.slice(n):"";return{messages:t,remaining:l}}function ie(){let e=!1,t=null,n="",o=null,s=()=>{},i=()=>{},l=()=>{},c=()=>{};async function r(){if(!e){e=!0,t=new AbortController;try{let d=await fetch(se(),{method:"GET",credentials:"include",signal:t.signal,headers:{Accept:"application/json"}});if(!d.ok)throw new Error(`Stream connect failed: ${d.status}`);i();let u=d.body.getReader(),g=new TextDecoder;async function w(){for(;e;)try{let{done:h,value:m}=await u.read();if(h){a();return}n+=g.decode(m,{stream:!0});let{messages:y,remaining:S}=Oe(n);n=S;for(let Y of y)Y.type!=="__heartbeat__"&&s(Y)}catch(h){if(h.name==="AbortError")return;console.error("\u{1F98D} Stream read error:",h),a();return}}w()}catch(d){if(d.name==="AbortError")return;console.error("\u{1F98D} Stream connection error:",d),c(d),a()}}}function a(){e&&(o&&clearTimeout(o),o=setTimeout(()=>{e&&r()},500))}async function p(d,u,g){let w={type:d,data:u,createdAt:new Date(g)},h=await fetch(se(),{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:_.default.stringify(w)});if(!h.ok){let y=await h.json().catch(()=>({error:"Unknown error"}));throw new Error(y.error||`Request failed: ${h.status}`)}return _.default.parse(await h.text()).data}function f(){e=!1,o&&(clearTimeout(o),o=null),t&&(t.abort(),t=null),n="",l()}return{connect:r,send:p,close:f,isConnected:()=>e,set onMessage(d){s=d},set onOpen(d){i=d},set onClose(d){l=d},set onError(d){c=d}}}var fe,b={Offline:"offline",Walled:"walled",Disconnected:"disconnected",Connecting:"connecting",Connected:"connected",Closing:"closing"},W=typeof navigator<"u"&&!navigator.onLine?b.Offline:b.Disconnected,B=[];function k(e){W!==e&&(W=e,B.forEach(t=>t(e)))}var U="auto",A=null,T=null,E=null,V=null,Ce=4e3,ue=3e4,Pe=3e3,De=6e4;function L(){return typeof window>"u"?!1:["localhost","127.0.0.1","[::1]"].includes(window.location.hostname)}function Re(){let e=window.location.hostname,n=["localhost","127.0.0.1","[::1]"].includes(e),o=window.location.protocol==="https:",s=n?9010:window.location.port||(o?443:80),i=o?"https":"http",l=n||s!==80&&s!==443?`:${s}`:"";return`${i}://${e}${l}/api/ape/ping`}async function _e(){try{let e=new AbortController,t=setTimeout(()=>e.abort(),Pe),n=await fetch(Re(),{cache:"no-store",signal:e.signal});if(clearTimeout(t),!n.ok)return L()&&console.error("\u{1F98D} [DEV] Ping failed: HTTP",n.status),"walled";let o=await n.json();if(o?.ok!==!0)return L()&&console.error("\u{1F98D} [DEV] Ping failed: invalid response",o),"walled";if(typeof o.ts=="number"){let s=Date.now(),i=Math.abs(s-o.ts);if(i>De)return L()&&console.error("\u{1F98D} [DEV] Ping failed: timestamp too old/stale (skew:",i,"ms)"),"walled"}return"ok"}catch(e){return L()&&console.error("\u{1F98D} [DEV] Ping failed:",e.message||e),"walled"}}function Le(){typeof window>"u"||(window.addEventListener("online",()=>{console.log("\u{1F98D} Browser went online, checking network..."),G()}),window.addEventListener("offline",()=>{console.log("\u{1F98D} Browser went offline"),k(b.Offline)}))}typeof window<"u"&&Le();function Me(){let e=window.location.hostname,n=["localhost","127.0.0.1","[::1]"].includes(e),o=window.location.protocol==="https:",s=n?9010:window.location.port||(o?443:80),i=o?"wss":"ws",l=n||s!==80&&s!==443?`:${s}`:"";return`${i}://${e}${l}/api/ape`}var de=!1,Be=5e3,We=1e4,Ue="/",xe=new Set(["on","onConnectionChange","getTransport"]),pe={get(e,t){if(xe.has(t))return e[t];let n=function(o,s){let i=Ue+t,l;return arguments.length===2?(i+=o,l=s):l=o,e(i,l)};return new Proxy(n,pe)}};function je(e){return new Proxy(e,pe)}var C=!1,O=!1,J=!1,$={};var P=[],x=[],D={};function K(){console.log("\u{1F98D} Switching to HTTP streaming transport"),A="polling",T||(T=ie(),T.onMessage=async e=>{let{err:t,type:n,data:o}=e;D[n]&&D[n].forEach(s=>s({err:t,type:n,data:o})),x.forEach(s=>s({err:t,type:n,data:o}))},T.onOpen=()=>{O=!0,k(b.Connected),console.log("\u{1F98D} HTTP streaming connected"),P.forEach(({type:e,data:t,next:n,err:o,waiting:s,createdAt:i,timer:l})=>{clearTimeout(l);let c=He(e,t,i);s&&c.then(n).catch(o)}),P=[],Ve()},T.onClose=()=>{O=!1,k(b.Disconnected)},T.onError=e=>{console.error("\u{1F98D} Streaming error:",e)}),T.connect()}function He(e,t,n){return T.send(e,t,n)}function Ve(){E||A==="polling"&&U!=="polling"&&(E=setInterval(()=>{if(A!=="polling"){clearInterval(E),E=null;return}console.log("\u{1F98D} Attempting WebSocket reconnection..."),he(!0)},ue))}function he(e=!1){let t=new WebSocket(Me()),n=null;!e&&U==="auto"&&(n=setTimeout(()=>{t.readyState!==WebSocket.OPEN&&(console.log("\u{1F98D} WebSocket timeout, falling back to HTTP streaming"),t.close(),K())},Ce)),t.onopen=()=>{n&&clearTimeout(n),e&&A==="polling"&&(console.log("\u{1F98D} WebSocket reconnected, switching from HTTP streaming"),T&&T.close(),E&&(clearInterval(E),E=null)),A="websocket",C=t,O=!0,k(b.Connected),P.forEach(({type:o,data:s,next:i,err:l,waiting:c,createdAt:r,timer:a})=>{clearTimeout(a);let p=J(o,s,r);c&&p.then(i).catch(l)}),P=[]},t.onmessage=async function(o){let{err:s,type:i,queryId:l,data:c}=q.default.parse(o.data);if(l){if($[l]){if(c&&!s)try{let a=await ae(c);$[l](s,a)}catch(a){$[l](a,null)}else $[l](s,c);delete $[l]}else console.error(`\u{1F98D} No matching queryId: ${l}`);return}let r=c;if(c&&!s)try{r=await ae(c)}catch(a){console.error("\u{1F98D} Failed to hydrate broadcast data:",a)}D[i]&&D[i].forEach(a=>a({err:s,type:i,data:r})),x.forEach(a=>a({err:s,type:i,data:r}))},t.onerror=function(o){n&&clearTimeout(n),console.error("socket ERROR:",o),!e&&U==="auto"&&!O&&K()},t.onclose=function(o){n&&clearTimeout(n),console.warn("socket disconnect:",o),C=!1,O=!1,A==="websocket"&&(k(b.Disconnected),setTimeout(()=>de&&R(),500))}}function I(e,t=""){let n=[];if(e==null||typeof e!="object")return n;if(Array.isArray(e)){for(let o=0;o<e.length;o++)n.push(...I(e[o],t?`${t}.${o}`:String(o)));return n}for(let o of Object.keys(e))if(o.endsWith("<!L>")){let s=o.slice(0,-4),i=e[o];n.push({path:t?`${t}.${s}`:s,hash:i,originalKey:o})}else n.push(...I(e[o],t?`${t}.${o}`:o));return n}function ce(e,t,n){let o=t.split("."),s=e;for(let i=0;i<o.length-1;i++)s=s[o[i]];s[o[o.length-1]]=n}function F(e){if(e==null||typeof e!="object")return e;if(Array.isArray(e))return e.map(F);let t={};for(let n of Object.keys(e))if(n.endsWith("<!L>")){let o=n.slice(0,-4);t[o]=e[n]}else t[n]=F(e[n]);return t}async function ae(e,t){let n=I(e);if(n.length===0)return e;console.log(`\u{1F98D} Fetching ${n.length} binary resource(s)`);let o=F(e),s=window.location.hostname,i=["localhost","127.0.0.1","[::1]"].includes(s),l=window.location.protocol==="https:",c=i?9010:window.location.port||(l?443:80),r=l?"https":"http",a=i||c!==80&&c!==443?`:${c}`:"",p=`${r}://${s}${a}`;return await Promise.all(n.map(async({path:f,hash:d})=>{try{let u=await fetch(`${p}/api/ape/data/${d}`,{credentials:"include",headers:{"X-Ape-Client-Id":t||""}});if(!u.ok)throw new Error(`Failed to fetch binary resource: ${u.status}`);let g=await u.arrayBuffer();ce(o,f,g)}catch(u){console.error(`\u{1F98D} Failed to fetch binary resource at ${f}:`,u),ce(o,f,null)}})),o}async function G(){if(typeof navigator<"u"&&!navigator.onLine){k(b.Offline);return}if(k(b.Connecting),await _e()==="walled"){k(b.Walled),Ke();return}Ie()}function Ke(){V||(V=setTimeout(()=>{V=null,G()},ue))}function Ie(){U==="polling"?K():he(!1)}function R(){return C&&C.readyState!==WebSocket.CLOSED||A==="polling"&&T?.isConnected()||W===b.Connecting||G(),M()}function Fe(e){return e==null?!1:e instanceof ArrayBuffer||ArrayBuffer.isView(e)||typeof Blob<"u"&&e instanceof Blob}function Ne(e){return typeof Blob<"u"&&e instanceof Blob?"B":"A"}function qe(e){let t=0;for(let n=0;n<e.length;n++){let o=e.charCodeAt(n);t=(t<<5)-t+o,t=t&t}return Math.abs(t).toString(36)}function N(e,t=""){if(e==null)return{processedData:e,uploads:[]};if(Fe(e)){let n=Ne(e),o=qe(t||"root");return{processedData:{__ape_upload__:o},uploads:[{path:t,hash:o,data:e,tag:n}]}}if(Array.isArray(e)){let n=[],o=[];for(let s=0;s<e.length;s++){let i=t?`${t}.${s}`:String(s),{processedData:l,uploads:c}=N(e[s],i);n.push(l),o.push(...c)}return{processedData:n,uploads:o}}if(typeof e=="object"){let n={},o=[];for(let s of Object.keys(e)){let i=t?`${t}.${s}`:s,{processedData:l,uploads:c}=N(e[s],i);if(c.length>0&&l?.__ape_upload__){let r=c[c.length-1].tag;n[`${s}<!${r}>`]=l.__ape_upload__}else n[s]=l;o.push(...c)}return{processedData:n,uploads:o}}return{processedData:e,uploads:[]}}async function Je(e,t){if(t.length===0)return;let n=window.location.hostname,o=["localhost","127.0.0.1","[::1]"].includes(n),s=window.location.protocol==="https:",i=o?9010:window.location.port||(s?443:80),l=s?"https":"http",c=o||i!==80&&i!==443?`:${i}`:"",r=`${l}://${n}${c}`;console.log(`\u{1F98D} Uploading ${t.length} binary file(s)`),await Promise.all(t.map(async({hash:a,data:p})=>{try{let f=await fetch(`${r}/api/ape/data/${e}/${a}`,{method:"PUT",credentials:"include",headers:{"Content-Type":"application/octet-stream"},body:p});if(!f.ok)throw new Error(`Upload failed: ${f.status}`)}catch(f){throw console.error(`\u{1F98D} Failed to upload binary at ${a}:`,f),f}}))}J=function(e,t,n,o){let s,i=!1,l=n+We-Date.now(),c=setTimeout(()=>{i&&s(new Error("Request Timedout for :"+e))},l),{processedData:r,uploads:a}=N(t),p={type:e,data:r,createdAt:new Date(n),requestedAt:o?void 0:new Date},f=q.default.stringify(p),d=(0,le.default)(f),u=new Promise((h,m)=>{s=m,$[d]=(y,S)=>{clearTimeout(c),u.then=g.bind(u),y?m(y):h(S)},C.send(f),a.length>0&&Je(d,a).catch(y=>{console.error("\u{1F98D} Binary upload failed:",y)})}),g=u.then;u.then=h=>(i=!0,u.then=g.bind(u),u.catch=w.bind(u),g.call(u,h));let w=u.catch;return u.catch=h=>(i=!0,u.catch=w.bind(u),u.then=g.bind(u),w.call(u,h)),u};var Ge=(e,t)=>{if(typeof e!="string")throw new Error("Missing Path vaule");let n=Date.now();if(O)return J(e,t,n,!0);let o=n+Be-Date.now(),s=setTimeout(()=>{let a="Request not sent for :"+e;if(i.waiting)i.err(new Error(a));else throw new Error(a)},o),i={type:e,data:t,next:void 0,err:void 0,waiting:!1,createdAt:n,timer:s},l=new Promise((a,p)=>{i.next=a,i.err=p}),c=l.then,r=l.catch;return l.then=a=>(i.waiting=!0,l.then=c.bind(l),l.catch=r.bind(l),c.call(l,a)),l.catch=a=>(i.waiting=!0,l.catch=r.bind(l),l.then=c.bind(l),r.call(l,a)),P.push(i),C||R(),l};function M(){return{sender:je(Ge),setOnReciver:(e,t)=>{typeof e=="string"?D[e]=[t]:x.includes(e)||x.push(e)},onConnectionChange:e=>(B.push(e),e(W),()=>{let t=B.indexOf(e);t>-1&&B.splice(t,1)}),getTransport:()=>A}}R.autoReconnect=()=>de=!0;R.ConnectionState=b;fe=R;var X=fe;var{sender:Xe,setOnReciver:Ye,onConnectionChange:Qe,getTransport:Ze}=X();X.autoReconnect();window.api=Xe;Object.defineProperty(window.api,"on",{value:Ye,writable:!1,enumerable:!1,configurable:!1});Object.defineProperty(window.api,"onConnectionChange",{value:Qe,writable:!1,enumerable:!1,configurable:!1});Object.defineProperty(window.api,"getTransport",{value:Ze,writable:!1,enumerable:!1,configurable:!1});})();
1
+ (()=>{var $e=Object.create;var ne=Object.defineProperty;var Se=Object.getOwnPropertyDescriptor;var ke=Object.getOwnPropertyNames;var Te=Object.getPrototypeOf,Ae=Object.prototype.hasOwnProperty;var oe=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var be=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of ke(t))!Ae.call(e,r)&&r!==n&&ne(e,r,{get:()=>t[r],enumerable:!(o=Se(t,r))||o.enumerable});return e};var K=(e,t,n)=>(n=e!=null?$e(Te(e)):{},be(t||!e||!e.__esModule?ne(n,"default",{value:e,enumerable:!0}):n,e));var ce=oe((ve,ie)=>{var re="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function se(e){let t=Math.floor(e/32),n=e%32;return t===0?re[n]:se(t)+re[n]}function Ee(e){for(var t=0,n=0;n<e.length;++n)t+=e.charCodeAt(n),t+=t<<10,t^=t>>6;return t+=t<<3,t^=t>>11,(t+(t<<15)&4294967295)>>>0}function Oe(e){return se(Ee(e))}ie.exports=Oe});var V=oe((et,fe)=>{function ae(e){let t={"[object RegExp]":"R","[object Date]":"D","[object Error]":"E","[object Undefined]":"U","[object Map]":"M","[object Set]":"S"},n=new WeakMap;function o(s,a=""){let p=typeof s,f=t[Object.prototype.toString.call(s)];if(f!==void 0)return f==="D"?[f,s.valueOf()]:f==="E"?[f,[s.name,s.message,s.stack]]:f==="R"?[f,s.toString()]:f==="U"?[f,null]:f==="S"?[f,Array.from(s)]:f==="M"?[f,Object.fromEntries(s)]:[f,JSON.stringify(s)];if(p==="object"&&s!==null){if(i.has(s))return["P",i.get(s)];i.set(s,a);let d=Array.isArray(s),u=d?Array.from(Array(s.length).keys()):Object.keys(s),g=d?[]:{},w=[];for(let h=0;h<u.length;h++){let m=u[h],[y,k]=o(s[m],m);d?(w.push(y),g.push(k)):s[m]!==void 0&&(g[m+(y?`<!${y}>`:"")]=k)}return n.delete(s),d&&w.find(h=>!!h)?[`[${w.join()}]`,g]:["",g]}else return["",s]}let r=[];Array.isArray(e)?r=Array.from(Array(e.length).keys()):r=Object.keys(e);let i=new WeakMap;i.set(e,[]);function l(s,a=[]){let p=typeof s,f=t[Object.prototype.toString.call(s)];if(f!==void 0)return f==="D"?[f,s.valueOf()]:f==="E"?[f,[s.name,s.message,s.stack]]:f==="R"?[f,s.toString()]:f==="U"?[f,null]:f==="S"?[f,Array.from(s)]:f==="M"?[f,Object.fromEntries(s)]:[f,JSON.stringify(s)];if(p==="object"&&s!==null){if(i.has(s))return["P",i.get(s)];i.set(s,a);let d=Array.isArray(s),u=d?Array.from(Array(s.length).keys()):Object.keys(s),g=d?[]:{},w=[];for(let h=0;h<u.length;h++){let m=u[h],[y,k]=l(s[m],[...a,m]);d?(w.push(y),g.push(k)):s[m]!==void 0&&(g[m+(y?`<!${y}>`:"")]=k)}return d&&w.find(h=>!!h)?[`[${w.join()}]`,g]:["",g]}else return["",s]}let c={};for(let s=0;s<r.length;s++){let a=r[s];if(e[a]!==void 0){let[p,f]=l(e[a],[a]);c[a+(p?`<!${p}>`:"")]=f}}return c}function Ce(e){return JSON.stringify(ae(e))}function De(e){return le(JSON.parse(e))}function le(e){let t={},n=[],o={R:c=>new RegExp(c),D:c=>new Date(c),P:function(c,s){return n.push([c,s]),null},E:([c,s,a])=>{let p;try{if(p=new global[c](s),p instanceof Error)p.stack=a;else throw{}}catch{p=new Error(s),p.name=c,p.stack=a}return p},U:()=>{},S:c=>new Set(c),M:c=>new Map(Object.entries(c))},r=new Map;function i(c,s,a){let p=Array.isArray(this)?this:[];if(s in o)return o[s](a,p);if(Array.isArray(a))if(s&&s.startsWith("[")){let f=s.slice(1,-1).split(","),d=[];for(let u=0;u<a.length;u++){let g=[...p,u],w=i.call(g,u.toString(),f[u],a[u]);d.push(w)}return d}else{let f=[];for(let d=0;d<a.length;d++){let u=i.call([...p,d],"","",a[d]);f.push(u)}return f}else if(typeof a=="object"&&a!==null){if(r.has(a))return r.get(a);r.set(a,{});let f={};for(let d in a){let[u,g]=l(d),w=i.call([...p,u],u,g,a[d]);f[u]=w}return r.set(a,f),f}else return a}function l(c){let s=c.match(/(.+)(<!(.)>)/);if(s)return[s[1],s[3]];let a=c.match(/(.+)(<!!(.+)>)/);if(a)return[a[1],a[3]];let p=c.match(/(.+)(<!\[(.*)>)/);return p?[p[1],"["+p[3]]:[c,void 0]}for(let c in e){let[s,a]=l(c);t[s]=i.call([s],s,a,e[c])}return n.forEach(Pe.bind(null,t)),t}function Pe(e,[t,n]){let o=t||[],r=n||[],i=e;for(let c=0;c<o.length;c++)i=i[o[c]];let l=e;for(let c=0;c<r.length-1;c++)l=l[r[c]];return l[r[r.length-1]]=i,e}fe.exports={parse:De,stringify:Ce,encode:ae,decode:le}});var pe=K(ce()),Z=K(V());var R=K(V());function ue(){let e=window.location.hostname,n=["localhost","127.0.0.1","[::1]"].includes(e),o=window.location.protocol==="https:",r=n?9010:window.location.port||(o?443:80),i=o?"https":"http",l=n||r!==80&&r!==443?`:${r}`:"";return`${i}://${e}${l}/api/ape/poll`}function _e(e){let t=[],n=-1,o=0,r=!1,i=!1;for(let c=0;c<e.length;c++){let s=e[c];if(i){i=!1;continue}if(s==="\\"&&r){i=!0;continue}if(s==='"'){r=!r;continue}if(!r){if(s==="{")o===0&&(n=c),o++;else if(s==="}"&&(o--,o===0&&n!==-1)){let a=e.slice(n,c+1);try{t.push(R.default.parse(a))}catch(p){console.error("\u{1F98D} Failed to parse stream message:",p)}n=-1}}}let l=n!==-1?e.slice(n):"";return{messages:t,remaining:l}}function de(){let e=!1,t=null,n="",o=null,r=()=>{},i=()=>{},l=()=>{},c=()=>{};async function s(){if(!e){e=!0,t=new AbortController;try{let d=await fetch(ue(),{method:"GET",credentials:"include",signal:t.signal,headers:{Accept:"application/json"}});if(!d.ok)throw new Error(`Stream connect failed: ${d.status}`);i();let u=d.body.getReader(),g=new TextDecoder;async function w(){for(;e;)try{let{done:h,value:m}=await u.read();if(h){a();return}n+=g.decode(m,{stream:!0});let{messages:y,remaining:k}=_e(n);n=k;for(let te of y)te.type!=="__heartbeat__"&&r(te)}catch(h){if(h.name==="AbortError")return;console.error("\u{1F98D} Stream read error:",h),a();return}}w()}catch(d){if(d.name==="AbortError")return;console.error("\u{1F98D} Stream connection error:",d),c(d),a()}}}function a(){e&&(o&&clearTimeout(o),o=setTimeout(()=>{e&&s()},500))}async function p(d,u,g){let w={type:d,data:u,createdAt:new Date(g)},h=await fetch(ue(),{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:R.default.stringify(w)});if(!h.ok){let y=await h.json().catch(()=>({error:"Unknown error"}));throw new Error(y.error||`Request failed: ${h.status}`)}return R.default.parse(await h.text()).data}function f(){e=!1,o&&(clearTimeout(o),o=null),t&&(t.abort(),t=null),n="",l()}return{connect:s,send:p,close:f,isConnected:()=>e,set onMessage(d){r=d},set onOpen(d){i=d},set onClose(d){l=d},set onError(d){c=d}}}var he,$={Offline:"offline",Walled:"walled",Disconnected:"disconnected",Connecting:"connecting",Connected:"connected",Closing:"closing"},W=typeof navigator<"u"&&!navigator.onLine?$.Offline:$.Disconnected,M=[];function T(e){W!==e&&(W=e,M.forEach(t=>t(e)))}var F="auto",A=null,S=null,b=null,I=null,Re=4e3,ge=3e4,Le=3e3,Be=6e4;function L(){return typeof window>"u"?!1:["localhost","127.0.0.1","[::1]"].includes(window.location.hostname)}function Me(){let e=window.location.hostname,n=["localhost","127.0.0.1","[::1]"].includes(e),o=window.location.protocol==="https:",r=n?9010:window.location.port||(o?443:80),i=o?"https":"http",l=n||r!==80&&r!==443?`:${r}`:"";return`${i}://${e}${l}/api/ape/ping`}async function We(){try{let e=new AbortController,t=setTimeout(()=>e.abort(),Le),n=await fetch(Me(),{cache:"no-store",signal:e.signal});if(clearTimeout(t),!n.ok)return L()&&console.error("\u{1F98D} [DEV] Ping failed: HTTP",n.status),"walled";let o=await n.json();if(o?.ok!==!0)return L()&&console.error("\u{1F98D} [DEV] Ping failed: invalid response",o),"walled";if(typeof o.ts=="number"){let r=Date.now(),i=Math.abs(r-o.ts);if(i>Be)return L()&&console.error("\u{1F98D} [DEV] Ping failed: timestamp too old/stale (skew:",i,"ms)"),"walled"}return"ok"}catch(e){return L()&&console.error("\u{1F98D} [DEV] Ping failed:",e.message||e),"walled"}}function Fe(){typeof window>"u"||(window.addEventListener("online",()=>{console.log("\u{1F98D} Browser went online, checking network..."),v()}),window.addEventListener("offline",()=>{console.log("\u{1F98D} Browser went offline"),T($.Offline)}))}typeof window<"u"&&Fe();function Ue(){let e=window.location.hostname,n=["localhost","127.0.0.1","[::1]"].includes(e),o=window.location.protocol==="https:",r=n?9010:window.location.port||(o?443:80),i=o?"wss":"ws",l=n||r!==80&&r!==443?`:${r}`:"";return`${i}://${e}${l}/api/ape`}var we=!1,xe=5e3,He=1e4,Ke="/",Ve=new Set(["on","onConnectionChange","transport"]),ye={get(e,t){if(Ve.has(t))return e[t];let n=function(o,r){let i=Ke+t,l;return arguments.length===2?(i+=o,l=r):l=o,e(i,l)};return new Proxy(n,ye)}};function Ie(e){return new Proxy(e,ye)}var C=!1,O=!1,z=!1,E={},D=[],U=[],P={};function N(){console.log("\u{1F98D} Switching to HTTP streaming transport"),A="polling",S||(S=de(),S.onMessage=async e=>{let{err:t,type:n,data:o}=e,r=o;if(o&&!t)try{r=await Y(o),r=await X(r)}catch(i){console.error("\u{1F98D} Failed to hydrate streaming data:",i)}P[n]&&P[n].forEach(i=>i({err:t,type:n,data:r})),U.forEach(i=>i({err:t,type:n,data:r}))},S.onOpen=()=>{O=!0,T($.Connected),console.log("\u{1F98D} HTTP streaming connected"),D.forEach(({type:e,data:t,resolve:n,reject:o,waiting:r,createdAt:i,timer:l})=>{clearTimeout(l);let c=Ne(e,t,i);r&&c.then(n).catch(o)}),D=[],je()},S.onClose=()=>{O=!1,T($.Disconnected)},S.onError=e=>{console.error("\u{1F98D} Streaming error:",e)}),S.connect()}function Ne(e,t,n){return S.send(e,t,n)}function je(){b||A==="polling"&&F!=="polling"&&(b=setInterval(()=>{if(A!=="polling"){clearInterval(b),b=null;return}console.log("\u{1F98D} Attempting WebSocket reconnection..."),me(!0)},ge))}function me(e=!1){let t=new WebSocket(Ue()),n=null;!e&&F==="auto"&&(n=setTimeout(()=>{t.readyState!==WebSocket.OPEN&&(console.log("\u{1F98D} WebSocket timeout, falling back to HTTP streaming"),t.close(),N())},Re)),t.onopen=()=>{n&&clearTimeout(n),e&&A==="polling"&&(console.log("\u{1F98D} WebSocket reconnected, switching from HTTP streaming"),S&&S.close(),b&&(clearInterval(b),b=null)),A="websocket",C=t,O=!0,T($.Connected),D.forEach(({type:o,data:r,resolve:i,reject:l,waiting:c,createdAt:s,timer:a})=>{clearTimeout(a);let p=z(o,r,s);c&&p.then(i).catch(l)}),D=[]},t.onmessage=async function(o){let{err:r,type:i,queryId:l,data:c}=Z.default.parse(o.data);if(l){if(E[l]){if(c&&!r)try{let a=await Y(c);a=await X(a),E[l](r,a)}catch(a){E[l](a,null)}else E[l](r,c);delete E[l]}else console.error(`\u{1F98D} No matching queryId: ${l}`);return}let s=c;if(c&&!r)try{s=await Y(c),s=await X(s)}catch(a){console.error("\u{1F98D} Failed to hydrate broadcast data:",a)}P[i]&&P[i].forEach(a=>a({err:r,type:i,data:s})),U.forEach(a=>a({err:r,type:i,data:s}))},t.onerror=function(o){n&&clearTimeout(n),console.error("socket ERROR:",o),!e&&F==="auto"&&!O&&N()},t.onclose=function(o){n&&clearTimeout(n),console.warn("socket disconnect:",o),C=!1,O=!1,A==="websocket"&&(T($.Disconnected),setTimeout(()=>we&&_(),500))}}function j(e,t=""){let n=[];if(e==null||typeof e!="object")return n;if(Array.isArray(e)){for(let o=0;o<e.length;o++)n.push(...j(e[o],t?`${t}.${o}`:String(o)));return n}for(let o of Object.keys(e))if(o.endsWith("<!L>")){let r=o.slice(0,-4),i=e[o];n.push({path:t?`${t}.${r}`:r,hash:i,originalKey:o})}else n.push(...j(e[o],t?`${t}.${o}`:o));return n}function q(e,t=""){let n=[];if(e==null||typeof e!="object")return n;if(Array.isArray(e)){for(let o=0;o<e.length;o++)n.push(...q(e[o],t?`${t}.${o}`:String(o)));return n}for(let o of Object.keys(e))if(o.endsWith("<!F>")){let r=o.slice(0,-4),i=e[o];n.push({path:t?`${t}.${r}`:r,hash:i,originalKey:o})}else n.push(...q(e[o],t?`${t}.${o}`:o));return n}function J(e){if(e==null||typeof e!="object")return e;if(Array.isArray(e))return e.map(J);let t={};for(let n of Object.keys(e))if(n.endsWith("<!F>")){let o=n.slice(0,-4);t[o]=e[n]}else t[n]=J(e[n]);return t}async function X(e,t=5){let n=q(e);if(n.length===0)return e;console.log(`\u{1F98D} Fetching ${n.length} shared file(s)`);let o=J(e),r=window.location.hostname,i=["localhost","127.0.0.1","[::1]"].includes(r),l=window.location.protocol==="https:",c=i?9010:window.location.port||(l?443:80),s=l?"https":"http",a=i||c!==80&&c!==443?`:${c}`:"",p=`${s}://${r}${a}`;return await Promise.all(n.map(async({path:f,hash:d})=>{let u=0,g=100;for(;u<t;)try{let w=await fetch(`${p}/api/ape/data/${d}`,{credentials:"include"});if(!w.ok){if(w.status===404&&u<t-1){u++,await new Promise(y=>setTimeout(y,g)),g*=2;continue}throw new Error(`Failed to fetch shared file: ${w.status}`)}let h=await w.arrayBuffer();x(o,f,h),w.headers.get("X-Ape-Complete")==="1"||console.log(`\u{1F98D} Shared file ${d} still uploading (${w.headers.get("X-Ape-Total-Received")||"?"} bytes)`);break}catch(w){u>=t-1&&(console.error(`\u{1F98D} Failed to fetch shared file at ${f}:`,w),x(o,f,null)),u++,await new Promise(h=>setTimeout(h,g)),g*=2}})),o}function x(e,t,n){let o=t.split("."),r=e;for(let i=0;i<o.length-1;i++)r=r[o[i]];r[o[o.length-1]]=n}function G(e){if(e==null||typeof e!="object")return e;if(Array.isArray(e))return e.map(G);let t={};for(let n of Object.keys(e))if(n.endsWith("<!L>")){let o=n.slice(0,-4);t[o]=e[n]}else t[n]=G(e[n]);return t}async function Y(e,t){let n=j(e);if(n.length===0)return e;console.log(`\u{1F98D} Fetching ${n.length} binary resource(s)`);let o=G(e),r=window.location.hostname,i=["localhost","127.0.0.1","[::1]"].includes(r),l=window.location.protocol==="https:",c=i?9010:window.location.port||(l?443:80),s=l?"https":"http",a=i||c!==80&&c!==443?`:${c}`:"",p=`${s}://${r}${a}`;return await Promise.all(n.map(async({path:f,hash:d})=>{try{let u=await fetch(`${p}/api/ape/data/${d}`,{credentials:"include",headers:{"X-Ape-Client-Id":t||""}});if(!u.ok)throw new Error(`Failed to fetch binary resource: ${u.status}`);let g=await u.arrayBuffer();x(o,f,g)}catch(u){console.error(`\u{1F98D} Failed to fetch binary resource at ${f}:`,u),x(o,f,null)}})),o}async function v(){if(typeof navigator<"u"&&!navigator.onLine){T($.Offline);return}if(T($.Connecting),await We()==="walled"){T($.Walled),qe();return}Je()}function qe(){I||(I=setTimeout(()=>{I=null,v()},ge))}function Je(){F==="polling"?N():me(!1)}function _(){return C&&C.readyState!==WebSocket.CLOSED||A==="polling"&&S?.isConnected()||W===$.Connecting||v(),B()}function Xe(e){return e==null?!1:e instanceof ArrayBuffer||ArrayBuffer.isView(e)||typeof Blob<"u"&&e instanceof Blob}function Ge(e){return typeof Blob<"u"&&e instanceof Blob?"B":"A"}function Ye(e){let t=0;for(let n=0;n<e.length;n++){let o=e.charCodeAt(n);t=(t<<5)-t+o,t=t&t}return Math.abs(t).toString(36)}function Q(e,t=""){if(e==null)return{processedData:e,uploads:[]};if(Xe(e)){let n=Ge(e),o=Ye(t||"root");return{processedData:{__ape_upload__:o},uploads:[{path:t,hash:o,data:e,tag:n}]}}if(Array.isArray(e)){let n=[],o=[];for(let r=0;r<e.length;r++){let i=t?`${t}.${r}`:String(r),{processedData:l,uploads:c}=Q(e[r],i);n.push(l),o.push(...c)}return{processedData:n,uploads:o}}if(typeof e=="object"){let n={},o=[];for(let r of Object.keys(e)){let i=t?`${t}.${r}`:r,{processedData:l,uploads:c}=Q(e[r],i);if(c.length>0&&l?.__ape_upload__){let s=c[c.length-1].tag;n[`${r}<!${s}>`]=l.__ape_upload__}else n[r]=l;o.push(...c)}return{processedData:n,uploads:o}}return{processedData:e,uploads:[]}}async function Qe(e,t){if(t.length===0)return;let n=window.location.hostname,o=["localhost","127.0.0.1","[::1]"].includes(n),r=window.location.protocol==="https:",i=o?9010:window.location.port||(r?443:80),l=r?"https":"http",c=o||i!==80&&i!==443?`:${i}`:"",s=`${l}://${n}${c}`;console.log(`\u{1F98D} Uploading ${t.length} binary file(s)`),await Promise.all(t.map(async({hash:a,data:p})=>{try{let f=await fetch(`${s}/api/ape/data/${e}/${a}`,{method:"PUT",credentials:"include",headers:{"Content-Type":"application/octet-stream"},body:p});if(!f.ok)throw new Error(`Upload failed: ${f.status}`)}catch(f){throw console.error(`\u{1F98D} Failed to upload binary at ${a}:`,f),f}}))}z=function(e,t,n,o){let r,i=!1,l=n+He-Date.now(),c=setTimeout(()=>{i&&r(new Error("Request Timedout for :"+e))},l),{processedData:s,uploads:a}=Q(t),p={type:e,data:s,createdAt:new Date(n),requestedAt:o?void 0:new Date},f=Z.default.stringify(p),d=(0,pe.default)(f),u=new Promise((h,m)=>{r=m,E[d]=(y,k)=>{clearTimeout(c),u.then=g.bind(u),y?m(y):h(k)},C.send(f),a.length>0&&Qe(d,a).catch(y=>{console.error("\u{1F98D} Binary upload failed:",y)})}),g=u.then;u.then=h=>(i=!0,u.then=g.bind(u),u.catch=w.bind(u),g.call(u,h));let w=u.catch;return u.catch=h=>(i=!0,u.catch=w.bind(u),u.then=g.bind(u),w.call(u,h)),u};var Ze=(e,t)=>{if(typeof e!="string")throw new Error("Missing Path vaule");let n=Date.now();if(O)return z(e,t,n,!0);let o=n+xe-Date.now(),r=setTimeout(()=>{let a="Request not sent for :"+e;if(i.waiting)i.reject(new Error(a));else throw new Error(a)},o),i={type:e,data:t,resolve:void 0,reject:void 0,waiting:!1,createdAt:n,timer:r},l=new Promise((a,p)=>{i.resolve=a,i.reject=p}),c=l.then,s=l.catch;return l.then=a=>(i.waiting=!0,l.then=c.bind(l),l.catch=s.bind(l),c.call(l,a)),l.catch=a=>(i.waiting=!0,l.catch=s.bind(l),l.then=c.bind(l),s.call(l,a)),D.push(i),C||_(),l};function B(){return{sender:Ie(Ze),setOnReceiver:(e,t)=>{typeof e=="string"?P[e]=[t]:U.includes(e)||U.push(e)},onConnectionChange:e=>(M.push(e),e(W),()=>{let t=M.indexOf(e);t>-1&&M.splice(t,1)}),get transport(){return A}}}_.autoReconnect=()=>we=!0;_.ConnectionState=$;he=_;var ee=he;var H=ee();ee.autoReconnect();window.api=H.sender;Object.defineProperty(window.api,"on",{value:H.setOnReceiver,writable:!1,enumerable:!1,configurable:!1});Object.defineProperty(window.api,"onConnectionChange",{value:H.onConnectionChange,writable:!1,enumerable:!1,configurable:!1});Object.defineProperty(window.api,"transport",{get:()=>H.transport,enumerable:!1,configurable:!1});})();
2
2
  //# sourceMappingURL=ape.js.map
package/dist/ape.js.map CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "version": 3,
3
3
  "sources": ["../utils/messageHash.js", "../utils/jss.js", "../client/connectSocket.js", "../client/transports/streaming.js", "../client/browser.js"],
4
- "sourcesContent": ["const alphabet = \"0123456789ABCDEFGHJKMNPQRSTVWXYZ\"\n/*\nfunction charValue(char){\n return alphabet.indexOf(char.toUpperCase())\n} // END charValue\n\nfunction fromBase32(b32){\n if (0 === b32.length) {\n return 0\n }\n return charValue(b32.slice(-1)) + fromBase32(b32.slice(0,-1)) * 32\n} // END fromBase32\n*/\nfunction toBase32 (n){\n const remainder = Math.floor(n/32)\n const current = n % 32\n if (0 === remainder) {\n return alphabet[current]\n }\n return toBase32(remainder)+alphabet[current]\n} // END toBase32\n\nfunction jenkinsOneAtATimeHash(keyString){\n \n var hash = 0\n \n for (var charIndex = 0; charIndex < keyString.length; ++charIndex)\n {\n hash += keyString.charCodeAt(charIndex);\n hash += hash << 10;\n hash ^= hash >> 6;\n }\n hash += hash << 3;\n hash ^= hash >> 11;\n //4,294,967,295 is FFFFFFFF, the maximum 32 bit unsigned integer value, used here as a mask.\n return (((hash + (hash << 15)) & 4294967295) >>> 0)\n} // END jenkinsOneAtATimeHash\n\nfunction messageHash(messageSt){\n return toBase32(jenkinsOneAtATimeHash(messageSt))\n} // END messageHash\n\nmodule.exports = messageHash", "//JsonSuperSet\n\n// TODO: add tests\n// check for any repeated ref not just cyclical references\n// support nasted array a<![,,[D]]>:[\"a\",\"b\",[Date]]\n// support array for the same type a<![*D]>:[Date,Date,Date]\n\nfunction encode(obj) {\n const tagLookup = {\n '[object RegExp]': 'R',\n '[object Date]': 'D',\n '[object Error]': 'E',\n \"[object Undefined]\": 'U',\n \"[object Map]\": 'M',\n \"[object Set]\": 'S',\n };\n const visited = new WeakMap();\n\n function encodeValue(value, path = '') {\n const type = typeof value;\n const tag = tagLookup[Object.prototype.toString.call(value)];\n // console.log({tag,value,path})\n if (tag !== undefined) {\n if ('D' === tag) return [tag, value.valueOf()];\n if ('E' === tag) return [tag, [value.name, value.message, value.stack]];\n if ('R' === tag) return [tag, value.toString()];\n if ('U' === tag) return [tag, null];\n if ('S' === tag) return [tag, Array.from(value)];\n if ('M' === tag) return [tag, Object.fromEntries(value)];\n\n return [tag, JSON.stringify(value)];\n } else if (type === 'object' && value !== null) {\n /*if (value.$ID) {\n return ['', value.$ID];\n }*/\n if (visitedEncode.has(value)) {\n return ['P', visitedEncode.get(value)];\n }\n visitedEncode.set(value, path);\n const isArray = Array.isArray(value);\n // keep index with undefined in Array\n const keys = isArray ? Array.from(Array(value.length).keys()) : Object.keys(value);\n const result = isArray ? [] : {};\n const typesFound = [];\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n const [t, v] = encodeValue(value[key], key);\n // console.log([t, v])\n if (isArray) {\n typesFound.push(t);\n result.push(v);\n // remove key with undefined from Objects\n } else if (value[key] !== undefined) {\n result[key + (t ? `<!${t}>` : '')] = v;\n }\n }\n\n visited.delete(value);\n if (isArray && typesFound.find((t) => !!t)) {\n return [`[${typesFound.join()}]`, result];\n }\n return ['', result];\n } else {\n return ['', value];\n }\n } // END encodeValue\n\n let keys = [];\n // console.log(obj)\n if (Array.isArray(obj)) {\n keys = Array.from(Array(obj.length).keys())\n } else {\n keys = Object.keys(obj);\n }\n\n // Track root object to handle self-references\n const visitedEncode = new WeakMap();\n visitedEncode.set(obj, []); // Root path is empty array\n\n function encodeValueWithVisited(value, path = []) {\n const type = typeof value;\n const tag = tagLookup[Object.prototype.toString.call(value)];\n if (tag !== undefined) {\n if ('D' === tag) return [tag, value.valueOf()];\n if ('E' === tag) return [tag, [value.name, value.message, value.stack]];\n if ('R' === tag) return [tag, value.toString()];\n if ('U' === tag) return [tag, null];\n if ('S' === tag) return [tag, Array.from(value)];\n if ('M' === tag) return [tag, Object.fromEntries(value)];\n return [tag, JSON.stringify(value)];\n } else if (type === 'object' && value !== null) {\n if (visitedEncode.has(value)) {\n return ['P', visitedEncode.get(value)]; // Return array path\n }\n visitedEncode.set(value, path);\n const isArray = Array.isArray(value);\n const objKeys = isArray ? Array.from(Array(value.length).keys()) : Object.keys(value);\n const result = isArray ? [] : {};\n const typesFound = [];\n for (let i = 0; i < objKeys.length; i++) {\n const key = objKeys[i];\n const [t, v] = encodeValueWithVisited(value[key], [...path, key]); // Append key to path array\n if (isArray) {\n typesFound.push(t);\n result.push(v);\n } else if (value[key] !== undefined) {\n result[key + (t ? `<!${t}>` : '')] = v;\n }\n }\n if (isArray && typesFound.find((t) => !!t)) {\n return [`[${typesFound.join()}]`, result];\n }\n return ['', result];\n } else {\n return ['', value];\n }\n }\n\n const result = {};\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n // remove key with undefined from Objects\n if (obj[key] !== undefined) {\n const [t, v] = encodeValueWithVisited(obj[key], [key]); // Start path with single key\n result[key + (t ? `<!${t}>` : '')] = v;\n }\n }\n return result;\n} // END encode\n\nfunction stringify(obj) {\n return JSON.stringify(encode(obj))\n}\n\n\nfunction parse(encoded) {\n return decode(JSON.parse(encoded))\n}\n\nfunction decode(data) {\n const result = {};\n const pointers2Res = [];\n const tagLookup = {\n R: (s) => new RegExp(s),\n D: (n) => new Date(n),\n P: function (sourceToPointAt, replaceAtThisPlace) {\n // Both paths are now arrays\n pointers2Res.push([sourceToPointAt, replaceAtThisPlace]);\n return null; // Placeholder, will be replaced by changeAttributeReference\n },\n E: ([name, message, stack]) => {\n let err;\n try {\n err = new global[name](message);\n if (err instanceof Error) err.stack = stack;\n else throw {};\n } catch (e) {\n err = new Error(message);\n err.name = name;\n err.stack = stack;\n }\n return err;\n },\n U: () => undefined,\n S: (a) => new Set(a),\n M: (o) => new Map(Object.entries(o))\n };\n const visited = new Map();\n\n function decodeValue(name, tag, val) {\n // this is now an array path\n const currentPath = Array.isArray(this) ? this : [];\n\n if (tag in tagLookup) {\n return tagLookup[tag](val, currentPath);\n } else if (Array.isArray(val)) {\n if (tag && tag.startsWith('[')) {\n const typeTags = tag.slice(1, -1).split(',');\n const res = [];\n for (let i = 0; i < val.length; i++) {\n // Pass path with array index appended\n const itemPath = [...currentPath, i];\n const decodedValue = decodeValue.call(\n itemPath,\n i.toString(),\n typeTags[i],\n val[i]\n );\n res.push(decodedValue);\n }\n return res;\n } else {\n const res = [];\n for (let i = 0; i < val.length; i++) {\n const decodedValue = decodeValue.call([...currentPath, i], '', '', val[i]);\n res.push(decodedValue);\n }\n return res;\n }\n } else if ('object' === typeof val && val !== null) {\n if (visited.has(val)) {\n return visited.get(val);\n }\n visited.set(val, {});\n const res = {};\n for (const key in val) {\n const [nam, t] = parseKeyWithTags(key);\n const decodedValue = decodeValue.call(\n [...currentPath, nam],\n nam,\n t,\n val[key]\n );\n res[nam] = decodedValue;\n }\n visited.set(val, res);\n return res;\n } else {\n return val;\n }\n } // END decodeValue\n\n function parseKeyWithTags(key) {\n const match = key.match(/(.+)(<!(.)>)/);\n if (match) {\n return [match[1], match[3]];\n }\n // Try multi-character tags like array types [,D,]\n const multiMatch = key.match(/(.+)(<!!(.+)>)/);\n if (multiMatch) {\n return [multiMatch[1], multiMatch[3]];\n }\n // Also handle array type tags that start with [\n const arrayMatch = key.match(/(.+)(<!\\[(.*)>)/);\n if (arrayMatch) {\n return [arrayMatch[1], '[' + arrayMatch[3]];\n }\n return [key, undefined];\n } // END parseKeyWithTags\n\n for (const key in data) {\n const [name, tag] = parseKeyWithTags(key);\n // Start with path containing just the key name\n result[name] = decodeValue.call([name], name, tag, data[key]);\n }\n pointers2Res.forEach(changeAttributeReference.bind(null, result));\n return result;\n} // END decode\n\nfunction changeAttributeReference(obj, [refPath, attrPath]) {\n // refPath and attrPath are now arrays, no splitting needed\n const refKeys = refPath || [];\n const attrKeys = attrPath || [];\n\n // Get the reference target by traversing refPath\n let ref = obj;\n for (let i = 0; i < refKeys.length; i++) {\n ref = ref[refKeys[i]];\n }\n\n // Get the parent of the attribute to set\n let attr = obj;\n for (let i = 0; i < attrKeys.length - 1; i++) {\n attr = attr[attrKeys[i]];\n }\n\n // Set the attribute to point to the reference\n attr[attrKeys[attrKeys.length - 1]] = ref;\n return obj;\n} // END changeAttributeReference\n\n\nmodule.exports = { parse, stringify, encode, decode };\n", "import messageHash from '../utils/messageHash'\nimport jss from '../utils/jss'\nimport { createStreamingTransport } from './transports/streaming'\n\nlet connect;\n\n// Connection state enum\nconst ConnectionState = {\n Offline: 'offline', // navigator.onLine = false\n Walled: 'walled', // Captive portal detected (ping failed)\n Disconnected: 'disconnected',\n Connecting: 'connecting',\n Connected: 'connected',\n Closing: 'closing'\n}\n\n// Connection state tracking - start with offline check\nlet connectionState = (typeof navigator !== 'undefined' && !navigator.onLine)\n ? ConnectionState.Offline\n : ConnectionState.Disconnected\nconst connectionChangeListeners = []\n\nfunction notifyConnectionChange(newState) {\n if (connectionState !== newState) {\n connectionState = newState\n connectionChangeListeners.forEach(fn => fn(newState))\n }\n}\n\n// Configuration\nlet configuredTransport = 'auto' // 'auto' | 'websocket' | 'polling'\n\n// Transport state\nlet currentTransport = null // 'websocket' | 'polling'\nlet streamingTransport = null\nlet wsRetryTimer = null\nlet networkCheckTimer = null\nconst WS_FALLBACK_TIMEOUT = 4000 // Time to wait for WS before fallback\nconst WS_RETRY_INTERVAL = 30000 // Retry WebSocket while in polling mode\nconst PING_TIMEOUT = 3000 // Timeout for ping check\nconst MAX_PING_CLOCK_SKEW = 60000 // Max allowed time difference (60s)\n\n/**\n * Check if running in dev/local mode\n */\nfunction isDevMode() {\n if (typeof window === 'undefined') return false\n return ['localhost', '127.0.0.1', '[::1]'].includes(window.location.hostname)\n}\n\n/**\n * Build ping URL for captive portal detection\n */\nfunction getPingUrl() {\n const hostname = window.location.hostname\n const localServers = ['localhost', '127.0.0.1', '[::1]']\n const isLocal = localServers.includes(hostname)\n const isHttps = window.location.protocol === 'https:'\n const port = isLocal ? 9010 : (window.location.port || (isHttps ? 443 : 80))\n const protocol = isHttps ? 'https' : 'http'\n const portSuffix = (isLocal || (port !== 80 && port !== 443)) ? `:${port}` : ''\n return `${protocol}://${hostname}${portSuffix}/api/ape/ping`\n}\n\n/**\n * Check for captive portal by pinging /api/ape/ping\n * Returns 'ok' if real internet, 'walled' if captive portal detected\n */\nasync function checkCaptivePortal() {\n try {\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), PING_TIMEOUT)\n\n const response = await fetch(getPingUrl(), {\n cache: 'no-store',\n signal: controller.signal\n })\n clearTimeout(timeoutId)\n\n if (!response.ok) {\n if (isDevMode()) {\n console.error('\uD83E\uDD8D [DEV] Ping failed: HTTP', response.status)\n }\n return 'walled'\n }\n\n const data = await response.json()\n\n // Verify response is genuine (not a captive portal redirect page)\n if (data?.ok !== true) {\n if (isDevMode()) {\n console.error('\uD83E\uDD8D [DEV] Ping failed: invalid response', data)\n }\n return 'walled'\n }\n\n // Validate timestamp to detect proxy replay attacks\n if (typeof data.ts === 'number') {\n const now = Date.now()\n const skew = Math.abs(now - data.ts)\n if (skew > MAX_PING_CLOCK_SKEW) {\n if (isDevMode()) {\n console.error('\uD83E\uDD8D [DEV] Ping failed: timestamp too old/stale (skew:', skew, 'ms)')\n }\n return 'walled'\n }\n }\n\n return 'ok'\n } catch (err) {\n if (isDevMode()) {\n console.error('\uD83E\uDD8D [DEV] Ping failed:', err.message || err)\n }\n return 'walled'\n }\n}\n\n/**\n * Setup navigator.onLine event listeners\n */\nfunction setupOnlineListeners() {\n if (typeof window === 'undefined') return\n\n window.addEventListener('online', () => {\n console.log('\uD83E\uDD8D Browser went online, checking network...')\n // Trigger reconnection attempt\n attemptConnection()\n })\n\n window.addEventListener('offline', () => {\n console.log('\uD83E\uDD8D Browser went offline')\n notifyConnectionChange(ConnectionState.Offline)\n })\n}\n\n// Setup listeners on module load (browser only)\nif (typeof window !== 'undefined') {\n setupOnlineListeners()\n}\n\n\n\n/**\n * Get WebSocket URL - auto-detects from window.location, keeps /api/ape path\n */\nfunction getSocketUrl() {\n const hostname = window.location.hostname\n const localServers = [\"localhost\", \"127.0.0.1\", \"[::1]\"]\n const isLocal = localServers.includes(hostname)\n const isHttps = window.location.protocol === \"https:\"\n\n // Default port: 9010 for local dev, otherwise use window.location.port or implicit 443/80\n const port = isLocal ? 9010 : (window.location.port || (isHttps ? 443 : 80))\n\n // Build URL - keep /api/ape path\n const protocol = isHttps ? \"wss\" : \"ws\"\n const portSuffix = (isLocal || port !== 80 && port !== 443) ? `:${port}` : \"\"\n\n return `${protocol}://${hostname}${portSuffix}/api/ape`\n}\n\nlet reconnect = false\nconst connentTimeout = 5000\nconst totalRequestTimeout = 10000\n//const location = window.location\n\nconst joinKey = \"/\"\n// Properties accessed directly on `ape` that should NOT be intercepted\nconst reservedKeys = new Set(['on', 'onConnectionChange', 'getTransport'])\nconst handler = {\n get(fn, key) {\n // Skip proxy interception for reserved keys - return actual property\n if (reservedKeys.has(key)) {\n return fn[key]\n }\n const wrapperFn = function (a, b) {\n let path = joinKey + key, body;\n if (2 === arguments.length) {\n path += a\n body = b\n } else {\n body = a\n }\n return fn(path, body)\n }\n return new Proxy(wrapperFn, handler)\n } // END get\n}\n\nfunction wrap(api) {\n return new Proxy(api, handler)\n}\n\nlet __socket = false, ready = false, wsSend = false;\nconst waitingOn = {};\nconst reciverOn = [];\n\nlet aWaitingSend = []\nconst reciverOnAr = [];\nconst ofTypesOb = {};\n\n/**\n * Switch to streaming transport (HTTP long polling fallback)\n */\nfunction switchToStreaming() {\n console.log('\uD83E\uDD8D Switching to HTTP streaming transport')\n currentTransport = 'polling'\n\n if (!streamingTransport) {\n streamingTransport = createStreamingTransport()\n\n // Handle incoming messages from streaming transport\n streamingTransport.onMessage = async (msg) => {\n const { err, type, data } = msg\n\n // Dispatch to type-specific handlers\n if (ofTypesOb[type]) {\n ofTypesOb[type].forEach(worker => worker({ err, type, data }))\n }\n // Dispatch to general handlers\n reciverOnAr.forEach(worker => worker({ err, type, data }))\n }\n\n streamingTransport.onOpen = () => {\n ready = true\n notifyConnectionChange(ConnectionState.Connected)\n console.log('\uD83E\uDD8D HTTP streaming connected')\n\n // Flush waiting messages\n aWaitingSend.forEach(({ type, data, next, err, waiting, createdAt, timer }) => {\n clearTimeout(timer)\n const resultPromise = streamingSend(type, data, createdAt)\n if (waiting) {\n resultPromise.then(next).catch(err)\n }\n })\n aWaitingSend = []\n\n // Start background WebSocket retry\n startWsRetry()\n }\n\n streamingTransport.onClose = () => {\n ready = false\n notifyConnectionChange(ConnectionState.Disconnected)\n }\n\n streamingTransport.onError = (err) => {\n console.error('\uD83E\uDD8D Streaming error:', err)\n }\n }\n\n streamingTransport.connect()\n}\n\n/**\n * Send via streaming transport\n */\nfunction streamingSend(type, data, createdAt) {\n return streamingTransport.send(type, data, createdAt)\n}\n\n/**\n * Start background retry for WebSocket (while in polling mode)\n */\nfunction startWsRetry() {\n if (wsRetryTimer) return\n if (currentTransport !== 'polling') return\n if (configuredTransport === 'polling') return // User explicitly wants polling only\n\n wsRetryTimer = setInterval(() => {\n if (currentTransport !== 'polling') {\n clearInterval(wsRetryTimer)\n wsRetryTimer = null\n return\n }\n\n console.log('\uD83E\uDD8D Attempting WebSocket reconnection...')\n tryWebSocket(true)\n }, WS_RETRY_INTERVAL)\n}\n\n/**\n * Try to establish WebSocket connection\n * @param {boolean} isRetry - If true, this is a background retry attempt\n */\nfunction tryWebSocket(isRetry = false) {\n const ws = new WebSocket(getSocketUrl())\n let fallbackTimer = null\n\n // Set fallback timeout (only for initial connection, not retries)\n if (!isRetry && configuredTransport === 'auto') {\n fallbackTimer = setTimeout(() => {\n if (ws.readyState !== WebSocket.OPEN) {\n console.log('\uD83E\uDD8D WebSocket timeout, falling back to HTTP streaming')\n ws.close()\n switchToStreaming()\n }\n }, WS_FALLBACK_TIMEOUT)\n }\n\n ws.onopen = () => {\n if (fallbackTimer) clearTimeout(fallbackTimer)\n\n // If this is a retry and we're in polling mode, switch back to WebSocket\n if (isRetry && currentTransport === 'polling') {\n console.log('\uD83E\uDD8D WebSocket reconnected, switching from HTTP streaming')\n if (streamingTransport) {\n streamingTransport.close()\n }\n if (wsRetryTimer) {\n clearInterval(wsRetryTimer)\n wsRetryTimer = null\n }\n }\n\n currentTransport = 'websocket'\n __socket = ws\n ready = true\n notifyConnectionChange(ConnectionState.Connected)\n\n aWaitingSend.forEach(({ type, data, next, err, waiting, createdAt, timer }) => {\n clearTimeout(timer)\n const resultPromise = wsSend(type, data, createdAt)\n if (waiting) {\n resultPromise.then(next).catch(err)\n }\n })\n aWaitingSend = []\n }\n\n ws.onmessage = async function (event) {\n const { err, type, queryId, data } = jss.parse(event.data)\n\n // Messages with queryId must fulfill matching promise\n if (queryId) {\n if (waitingOn[queryId]) {\n // Check for linked resources and fetch them before resolving\n if (data && !err) {\n try {\n const hydratedData = await fetchLinkedResources(data)\n waitingOn[queryId](err, hydratedData)\n } catch (fetchErr) {\n waitingOn[queryId](fetchErr, null)\n }\n } else {\n waitingOn[queryId](err, data)\n }\n delete waitingOn[queryId]\n } else {\n console.error(`\uD83E\uDD8D No matching queryId: ${queryId}`)\n }\n return\n }\n\n // Only messages WITHOUT queryId go to setOnReciver\n let processedData = data\n if (data && !err) {\n try {\n processedData = await fetchLinkedResources(data)\n } catch (fetchErr) {\n console.error(`\uD83E\uDD8D Failed to hydrate broadcast data:`, fetchErr)\n }\n }\n\n if (ofTypesOb[type]) {\n ofTypesOb[type].forEach(worker => worker({ err, type, data: processedData }))\n }\n reciverOnAr.forEach(worker => worker({ err, type, data: processedData }))\n }\n\n ws.onerror = function (err) {\n if (fallbackTimer) clearTimeout(fallbackTimer)\n console.error('socket ERROR:', err)\n\n // On initial connection error in auto mode, fallback to streaming\n if (!isRetry && configuredTransport === 'auto' && !ready) {\n switchToStreaming()\n }\n }\n\n ws.onclose = function (event) {\n if (fallbackTimer) clearTimeout(fallbackTimer)\n console.warn('socket disconnect:', event)\n __socket = false\n ready = false\n\n // Only notify disconnected if we're on websocket transport\n if (currentTransport === 'websocket') {\n notifyConnectionChange(ConnectionState.Disconnected)\n setTimeout(() => reconnect && connectSocket(), 500)\n }\n }\n}\n\n/**\n * Find all L-tagged (binary link) properties in data\n * Returns array of { path, hash }\n */\nfunction findLinkedResources(obj, path = '') {\n const resources = []\n\n if (obj === null || obj === undefined || typeof obj !== 'object') {\n return resources\n }\n\n if (Array.isArray(obj)) {\n for (let i = 0; i < obj.length; i++) {\n resources.push(...findLinkedResources(obj[i], path ? `${path}.${i}` : String(i)))\n }\n return resources\n }\n\n for (const key of Object.keys(obj)) {\n // Check for L-tag in key (from JJS encoding: key<!L>)\n if (key.endsWith('<!L>')) {\n const cleanKey = key.slice(0, -4)\n const hash = obj[key]\n resources.push({\n path: path ? `${path}.${cleanKey}` : cleanKey,\n hash,\n originalKey: key\n })\n } else {\n resources.push(...findLinkedResources(obj[key], path ? `${path}.${key}` : key))\n }\n }\n\n return resources\n}\n\n/**\n * Set a value at a nested path in an object\n */\nfunction setValueAtPath(obj, path, value) {\n const parts = path.split('.')\n let current = obj\n\n for (let i = 0; i < parts.length - 1; i++) {\n current = current[parts[i]]\n }\n\n current[parts[parts.length - 1]] = value\n}\n\n/**\n * Clean up L-tagged keys (rename key<!L> to key)\n */\nfunction cleanLinkedKeys(obj) {\n if (obj === null || obj === undefined || typeof obj !== 'object') {\n return obj\n }\n\n if (Array.isArray(obj)) {\n return obj.map(cleanLinkedKeys)\n }\n\n const cleaned = {}\n for (const key of Object.keys(obj)) {\n if (key.endsWith('<!L>')) {\n const cleanKey = key.slice(0, -4)\n cleaned[cleanKey] = obj[key]\n } else {\n cleaned[key] = cleanLinkedKeys(obj[key])\n }\n }\n return cleaned\n}\n\n/**\n * Fetch binary resources and hydrate data object\n */\nasync function fetchLinkedResources(data, clientId) {\n const resources = findLinkedResources(data)\n\n if (resources.length === 0) {\n return data\n }\n\n console.log(`\uD83E\uDD8D Fetching ${resources.length} binary resource(s)`)\n\n const cleanedData = cleanLinkedKeys(data)\n\n const hostname = window.location.hostname\n const isLocal = [\"localhost\", \"127.0.0.1\", \"[::1]\"].includes(hostname)\n const isHttps = window.location.protocol === \"https:\"\n const port = isLocal ? 9010 : (window.location.port || (isHttps ? 443 : 80))\n const protocol = isHttps ? \"https\" : \"http\"\n const portSuffix = (isLocal || (port !== 80 && port !== 443)) ? `:${port}` : \"\"\n const baseUrl = `${protocol}://${hostname}${portSuffix}`\n\n await Promise.all(resources.map(async ({ path, hash }) => {\n try {\n const response = await fetch(`${baseUrl}/api/ape/data/${hash}`, {\n credentials: 'include',\n headers: {\n 'X-Ape-Client-Id': clientId || ''\n }\n })\n\n if (!response.ok) {\n throw new Error(`Failed to fetch binary resource: ${response.status}`)\n }\n\n const arrayBuffer = await response.arrayBuffer()\n setValueAtPath(cleanedData, path, arrayBuffer)\n } catch (err) {\n console.error(`\uD83E\uDD8D Failed to fetch binary resource at ${path}:`, err)\n setValueAtPath(cleanedData, path, null)\n }\n }))\n\n return cleanedData\n}\n\n/**\n * Attempt to establish connection with network pre-checks\n */\nasync function attemptConnection() {\n // Check if browser is online\n if (typeof navigator !== 'undefined' && !navigator.onLine) {\n notifyConnectionChange(ConnectionState.Offline)\n return\n }\n\n // Perform captive portal check\n notifyConnectionChange(ConnectionState.Connecting)\n const pingResult = await checkCaptivePortal()\n\n if (pingResult === 'walled') {\n notifyConnectionChange(ConnectionState.Walled)\n // Retry network check periodically\n scheduleNetworkRetry()\n return\n }\n\n // Network is good, proceed with socket connection\n proceedWithConnection()\n}\n\n/**\n * Schedule a retry of network check (for walled/offline states)\n */\nfunction scheduleNetworkRetry() {\n if (networkCheckTimer) return\n networkCheckTimer = setTimeout(() => {\n networkCheckTimer = null\n attemptConnection()\n }, WS_RETRY_INTERVAL)\n}\n\n/**\n * Proceed with WebSocket/polling connection after network checks pass\n */\nfunction proceedWithConnection() {\n // Determine which transport to use\n if (configuredTransport === 'polling') {\n switchToStreaming()\n } else {\n // 'auto' or 'websocket' - try WebSocket first\n tryWebSocket(false)\n }\n}\n\nfunction connectSocket() {\n // Skip if already connected or connecting\n if (__socket && __socket.readyState !== WebSocket.CLOSED) {\n return buildClientInterface()\n }\n if (currentTransport === 'polling' && streamingTransport?.isConnected()) {\n return buildClientInterface()\n }\n if (connectionState === ConnectionState.Connecting) {\n return buildClientInterface()\n }\n\n // Start connection with network pre-checks\n attemptConnection()\n\n return buildClientInterface()\n}\n\n/**\n * Check if value is binary data (ArrayBuffer, typed array, or Blob)\n */\nfunction isBinaryData(value) {\n if (value === null || value === undefined) return false\n return value instanceof ArrayBuffer ||\n ArrayBuffer.isView(value) ||\n (typeof Blob !== 'undefined' && value instanceof Blob)\n}\n\n/**\n * Get binary type tag (A for ArrayBuffer, B for Blob)\n */\nfunction getBinaryTag(value) {\n if (typeof Blob !== 'undefined' && value instanceof Blob) return 'B'\n return 'A'\n}\n\n/**\n * Generate a simple hash for binary upload\n */\nfunction generateUploadHash(path) {\n let hash = 0\n for (let i = 0; i < path.length; i++) {\n const char = path.charCodeAt(i)\n hash = ((hash << 5) - hash) + char\n hash = hash & hash\n }\n return Math.abs(hash).toString(36)\n}\n\n/**\n * Find and extract binary data from payload\n * Returns { processedData, uploads: [{ path, hash, data, tag }] }\n */\nfunction processBinaryForUpload(data, path = '') {\n if (data === null || data === undefined) {\n return { processedData: data, uploads: [] }\n }\n\n if (isBinaryData(data)) {\n const tag = getBinaryTag(data)\n const hash = generateUploadHash(path || 'root')\n return {\n processedData: { [`__ape_upload__`]: hash },\n uploads: [{ path, hash, data, tag }]\n }\n }\n\n if (Array.isArray(data)) {\n const processedArray = []\n const allUploads = []\n\n for (let i = 0; i < data.length; i++) {\n const itemPath = path ? `${path}.${i}` : String(i)\n const { processedData, uploads } = processBinaryForUpload(data[i], itemPath)\n processedArray.push(processedData)\n allUploads.push(...uploads)\n }\n\n return { processedData: processedArray, uploads: allUploads }\n }\n\n if (typeof data === 'object') {\n const processedObj = {}\n const allUploads = []\n\n for (const key of Object.keys(data)) {\n const itemPath = path ? `${path}.${key}` : key\n const { processedData, uploads } = processBinaryForUpload(data[key], itemPath)\n\n // If this was binary data, mark the key with <!B> or <!A> tag\n if (uploads.length > 0 && processedData?.__ape_upload__) {\n const tag = uploads[uploads.length - 1].tag\n processedObj[`${key}<!${tag}>`] = processedData.__ape_upload__\n } else {\n processedObj[key] = processedData\n }\n allUploads.push(...uploads)\n }\n\n return { processedData: processedObj, uploads: allUploads }\n }\n\n return { processedData: data, uploads: [] }\n}\n\n/**\n * Upload binary data via HTTP PUT\n */\nasync function uploadBinaryData(queryId, uploads) {\n if (uploads.length === 0) return\n\n // Build base URL\n const hostname = window.location.hostname\n const isLocal = [\"localhost\", \"127.0.0.1\", \"[::1]\"].includes(hostname)\n const isHttps = window.location.protocol === \"https:\"\n const port = isLocal ? 9010 : (window.location.port || (isHttps ? 443 : 80))\n const protocol = isHttps ? \"https\" : \"http\"\n const portSuffix = (isLocal || (port !== 80 && port !== 443)) ? `:${port}` : \"\"\n const baseUrl = `${protocol}://${hostname}${portSuffix}`\n\n console.log(`\uD83E\uDD8D Uploading ${uploads.length} binary file(s)`)\n\n await Promise.all(uploads.map(async ({ hash, data }) => {\n try {\n const response = await fetch(`${baseUrl}/api/ape/data/${queryId}/${hash}`, {\n method: 'PUT',\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/octet-stream'\n },\n body: data\n })\n\n if (!response.ok) {\n throw new Error(`Upload failed: ${response.status}`)\n }\n } catch (err) {\n console.error(`\uD83E\uDD8D Failed to upload binary at ${hash}:`, err)\n throw err\n }\n }))\n}\n\nwsSend = function (type, data, createdAt, dirctCall) {\n let rej, promiseIsLive = false;\n const timeLetForReqToBeMade = (createdAt + totalRequestTimeout) - Date.now()\n\n const timer = setTimeout(() => {\n if (promiseIsLive) {\n rej(new Error(\"Request Timedout for :\" + type))\n }\n }, timeLetForReqToBeMade);\n\n // Process binary data for upload\n const { processedData, uploads } = processBinaryForUpload(data)\n\n const payload = {\n type,\n data: processedData,\n //referer:window.location.href,\n createdAt: new Date(createdAt),\n requestedAt: dirctCall ? undefined\n : new Date()\n }\n const message = jss.stringify(payload)\n const queryId = messageHash(message);\n\n const replyPromise = new Promise((resolve, reject) => {\n rej = reject\n waitingOn[queryId] = (err, result) => {\n clearTimeout(timer)\n replyPromise.then = next.bind(replyPromise)\n if (err) {\n reject(err)\n } else {\n resolve(result)\n }\n }\n __socket.send(message);\n\n // Upload binary data after sending WS message\n if (uploads.length > 0) {\n uploadBinaryData(queryId, uploads).catch(err => {\n console.error('\uD83E\uDD8D Binary upload failed:', err)\n // The server will timeout waiting for the upload\n })\n }\n });\n const next = replyPromise.then;\n replyPromise.then = worker => {\n promiseIsLive = true;\n replyPromise.then = next.bind(replyPromise)\n replyPromise.catch = err.bind(replyPromise)\n return next.call(replyPromise, worker)\n }\n const err = replyPromise.catch;\n replyPromise.catch = worker => {\n promiseIsLive = true;\n replyPromise.catch = err.bind(replyPromise)\n replyPromise.then = next.bind(replyPromise)\n return err.call(replyPromise, worker)\n }\n return replyPromise\n} // END wsSend\n\n\nconst sender = (type, data) => {\n if (\"string\" !== typeof type) {\n throw new Error(\"Missing Path vaule\")\n }\n\n const createdAt = Date.now()\n\n if (ready) {\n return wsSend(type, data, createdAt, true)\n }\n\n const timeLetForReqToBeMade = (createdAt + connentTimeout) - Date.now() // 5sec for reconnent\n\n const timer = setTimeout(() => {\n const errMessage = \"Request not sent for :\" + type\n if (payload.waiting) {\n payload.err(new Error(errMessage))\n } else {\n throw new Error(errMessage)\n }\n }, timeLetForReqToBeMade);\n\n const payload = { type, data, next: undefined, err: undefined, waiting: false, createdAt, timer };\n const waitingOnOpen = new Promise((res, er) => { payload.next = res; payload.err = er; })\n\n const waitingOnOpenThen = waitingOnOpen.then;\n const waitingOnOpenCatch = waitingOnOpen.catch;\n waitingOnOpen.then = worker => {\n payload.waiting = true;\n waitingOnOpen.then = waitingOnOpenThen.bind(waitingOnOpen)\n waitingOnOpen.catch = waitingOnOpenCatch.bind(waitingOnOpen)\n return waitingOnOpenThen.call(waitingOnOpen, worker)\n }\n waitingOnOpen.catch = worker => {\n payload.waiting = true;\n waitingOnOpen.catch = waitingOnOpenCatch.bind(waitingOnOpen)\n waitingOnOpen.then = waitingOnOpenThen.bind(waitingOnOpen)\n return waitingOnOpenCatch.call(waitingOnOpen, worker)\n }\n\n aWaitingSend.push(payload)\n if (!__socket) {\n connectSocket()\n }\n\n return waitingOnOpen\n} // END sender\n\n/**\n * Build the client interface object\n */\nfunction buildClientInterface() {\n return {\n sender: wrap(sender),\n setOnReciver: (onTypeStFn, handlerFn) => {\n if (\"string\" === typeof onTypeStFn) {\n // Replace handler for this type (prevents duplicates in React StrictMode)\n ofTypesOb[onTypeStFn] = [handlerFn]\n } else {\n // For general receivers, prevent duplicates by checking\n if (!reciverOnAr.includes(onTypeStFn)) {\n reciverOnAr.push(onTypeStFn)\n }\n }\n },\n onConnectionChange: (handler) => {\n connectionChangeListeners.push(handler)\n // Immediately call with current state\n handler(connectionState)\n // Return unsubscribe function\n return () => {\n const idx = connectionChangeListeners.indexOf(handler)\n if (idx > -1) connectionChangeListeners.splice(idx, 1)\n }\n },\n // Expose current transport type\n getTransport: () => currentTransport\n }\n}\n\nconnectSocket.autoReconnect = () => reconnect = true\nconnectSocket.ConnectionState = ConnectionState\nconnect = connectSocket\n\nexport default connect;\nexport { ConnectionState };\n", "import jss from '../../utils/jss'\n\n/**\n * HTTP Streaming transport - fallback when WebSocket is blocked\n * Uses fetch + ReadableStream for receiving, POST for sending\n */\n\n/**\n * Get base URL for polling endpoints\n */\nfunction getPollUrl() {\n const hostname = window.location.hostname\n const localServers = [\"localhost\", \"127.0.0.1\", \"[::1]\"]\n const isLocal = localServers.includes(hostname)\n const isHttps = window.location.protocol === \"https:\"\n\n const port = isLocal ? 9010 : (window.location.port || (isHttps ? 443 : 80))\n\n const protocol = isHttps ? \"https\" : \"http\"\n const portSuffix = (isLocal || (port !== 80 && port !== 443)) ? `:${port}` : \"\"\n\n return `${protocol}://${hostname}${portSuffix}/api/ape/poll`\n}\n\n/**\n * Parse JSON objects from a streaming buffer by counting braces\n * Handles strings containing braces correctly\n */\nfunction parseStreamBuffer(buffer) {\n const messages = []\n let start = -1\n let depth = 0\n let inString = false\n let escaped = false\n\n for (let i = 0; i < buffer.length; i++) {\n const char = buffer[i]\n\n if (escaped) {\n escaped = false\n continue\n }\n\n if (char === '\\\\' && inString) {\n escaped = true\n continue\n }\n\n if (char === '\"') {\n inString = !inString\n continue\n }\n\n if (inString) continue\n\n if (char === '{') {\n if (depth === 0) {\n start = i\n }\n depth++\n } else if (char === '}') {\n depth--\n if (depth === 0 && start !== -1) {\n const jsonStr = buffer.slice(start, i + 1)\n try {\n messages.push(jss.parse(jsonStr))\n } catch (e) {\n console.error('\uD83E\uDD8D Failed to parse stream message:', e)\n }\n start = -1\n }\n }\n }\n\n // Return remaining buffer (incomplete message)\n const remaining = start !== -1 ? buffer.slice(start) : ''\n return { messages, remaining }\n}\n\n/**\n * Create streaming transport instance\n */\nfunction createStreamingTransport() {\n let isActive = false\n let abortController = null\n let streamBuffer = ''\n let reconnectTimer = null\n\n // Callbacks\n let onMessage = () => { }\n let onOpen = () => { }\n let onClose = () => { }\n let onError = () => { }\n\n /**\n * Start the streaming connection\n */\n async function connect() {\n if (isActive) return\n\n isActive = true\n abortController = new AbortController()\n\n try {\n const response = await fetch(getPollUrl(), {\n method: 'GET',\n credentials: 'include',\n signal: abortController.signal,\n headers: {\n 'Accept': 'application/json'\n }\n })\n\n if (!response.ok) {\n throw new Error(`Stream connect failed: ${response.status}`)\n }\n\n onOpen()\n\n const reader = response.body.getReader()\n const decoder = new TextDecoder()\n\n async function read() {\n while (isActive) {\n try {\n const { done, value } = await reader.read()\n\n if (done) {\n // Stream ended - reconnect\n scheduleReconnect()\n return\n }\n\n streamBuffer += decoder.decode(value, { stream: true })\n const { messages, remaining } = parseStreamBuffer(streamBuffer)\n streamBuffer = remaining\n\n for (const msg of messages) {\n // Skip heartbeat messages\n if (msg.type === '__heartbeat__') continue\n onMessage(msg)\n }\n } catch (readErr) {\n if (readErr.name === 'AbortError') return\n console.error('\uD83E\uDD8D Stream read error:', readErr)\n scheduleReconnect()\n return\n }\n }\n }\n\n read()\n\n } catch (err) {\n if (err.name === 'AbortError') return\n\n console.error('\uD83E\uDD8D Stream connection error:', err)\n onError(err)\n scheduleReconnect()\n }\n }\n\n /**\n * Schedule reconnection with small delay\n */\n function scheduleReconnect() {\n if (!isActive) return\n\n if (reconnectTimer) {\n clearTimeout(reconnectTimer)\n }\n\n reconnectTimer = setTimeout(() => {\n if (isActive) {\n connect()\n }\n }, 500)\n }\n\n /**\n * Send a message via POST\n */\n async function send(type, data, createdAt) {\n const payload = {\n type,\n data,\n createdAt: new Date(createdAt)\n }\n\n const response = await fetch(getPollUrl(), {\n method: 'POST',\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: jss.stringify(payload)\n })\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ error: 'Unknown error' }))\n throw new Error(error.error || `Request failed: ${response.status}`)\n }\n\n const result = jss.parse(await response.text())\n return result.data\n }\n\n /**\n * Close the streaming connection\n */\n function close() {\n isActive = false\n\n if (reconnectTimer) {\n clearTimeout(reconnectTimer)\n reconnectTimer = null\n }\n\n if (abortController) {\n abortController.abort()\n abortController = null\n }\n\n streamBuffer = ''\n onClose()\n }\n\n return {\n connect,\n send,\n close,\n isConnected: () => isActive,\n set onMessage(fn) { onMessage = fn },\n set onOpen(fn) { onOpen = fn },\n set onClose(fn) { onClose = fn },\n set onError(fn) { onError = fn }\n }\n}\n\nexport { createStreamingTransport, getPollUrl }\n", "import connectSocket from './connectSocket.js'\n\nconst { sender, setOnReciver, onConnectionChange, getTransport } = connectSocket()\nconnectSocket.autoReconnect()\n\n// Global API - use defineProperty to bypass Proxy interception\nwindow.api = sender\nObject.defineProperty(window.api, 'on', {\n value: setOnReciver,\n writable: false,\n enumerable: false,\n configurable: false\n})\nObject.defineProperty(window.api, 'onConnectionChange', {\n value: onConnectionChange,\n writable: false,\n enumerable: false,\n configurable: false\n})\nObject.defineProperty(window.api, 'getTransport', {\n value: getTransport,\n writable: false,\n enumerable: false,\n configurable: false\n})\n"],
5
- "mappings": "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",
6
- "names": ["require_messageHash", "__commonJSMin", "exports", "module", "alphabet", "toBase32", "n", "remainder", "current", "jenkinsOneAtATimeHash", "keyString", "hash", "charIndex", "messageHash", "messageSt", "require_jss", "__commonJSMin", "exports", "module", "encode", "obj", "tagLookup", "visited", "encodeValue", "value", "path", "type", "tag", "visitedEncode", "isArray", "keys", "result", "typesFound", "i", "key", "t", "v", "encodeValueWithVisited", "objKeys", "stringify", "parse", "encoded", "decode", "data", "pointers2Res", "s", "n", "sourceToPointAt", "replaceAtThisPlace", "name", "message", "stack", "err", "a", "o", "decodeValue", "val", "currentPath", "typeTags", "res", "itemPath", "decodedValue", "nam", "parseKeyWithTags", "match", "multiMatch", "arrayMatch", "changeAttributeReference", "refPath", "attrPath", "refKeys", "attrKeys", "ref", "attr", "import_messageHash", "import_jss", "import_jss", "getPollUrl", "hostname", "isLocal", "isHttps", "port", "protocol", "portSuffix", "parseStreamBuffer", "buffer", "messages", "start", "depth", "inString", "escaped", "i", "char", "jsonStr", "jss", "e", "remaining", "createStreamingTransport", "isActive", "abortController", "streamBuffer", "reconnectTimer", "onMessage", "onOpen", "onClose", "onError", "connect", "response", "reader", "decoder", "read", "done", "value", "scheduleReconnect", "msg", "readErr", "err", "send", "type", "data", "createdAt", "payload", "error", "close", "fn", "connect", "ConnectionState", "connectionState", "connectionChangeListeners", "notifyConnectionChange", "newState", "fn", "configuredTransport", "currentTransport", "streamingTransport", "wsRetryTimer", "networkCheckTimer", "WS_FALLBACK_TIMEOUT", "WS_RETRY_INTERVAL", "PING_TIMEOUT", "MAX_PING_CLOCK_SKEW", "isDevMode", "getPingUrl", "hostname", "isLocal", "isHttps", "port", "protocol", "portSuffix", "checkCaptivePortal", "controller", "timeoutId", "response", "data", "now", "skew", "err", "setupOnlineListeners", "attemptConnection", "getSocketUrl", "reconnect", "connentTimeout", "totalRequestTimeout", "joinKey", "reservedKeys", "handler", "key", "wrapperFn", "a", "b", "path", "body", "wrap", "api", "__socket", "ready", "wsSend", "waitingOn", "aWaitingSend", "reciverOnAr", "ofTypesOb", "switchToStreaming", "currentTransport", "streamingTransport", "createStreamingTransport", "msg", "err", "type", "data", "worker", "ready", "notifyConnectionChange", "ConnectionState", "next", "waiting", "createdAt", "timer", "resultPromise", "streamingSend", "startWsRetry", "wsRetryTimer", "configuredTransport", "tryWebSocket", "WS_RETRY_INTERVAL", "isRetry", "ws", "getSocketUrl", "fallbackTimer", "WS_FALLBACK_TIMEOUT", "__socket", "wsSend", "event", "queryId", "jss", "waitingOn", "hydratedData", "fetchLinkedResources", "fetchErr", "processedData", "reconnect", "connectSocket", "findLinkedResources", "obj", "path", "resources", "i", "key", "cleanKey", "hash", "setValueAtPath", "value", "parts", "current", "cleanLinkedKeys", "cleaned", "clientId", "cleanedData", "hostname", "isLocal", "isHttps", "port", "protocol", "portSuffix", "baseUrl", "response", "arrayBuffer", "attemptConnection", "checkCaptivePortal", "scheduleNetworkRetry", "proceedWithConnection", "networkCheckTimer", "connectionState", "buildClientInterface", "isBinaryData", "getBinaryTag", "generateUploadHash", "char", "processBinaryForUpload", "tag", "processedArray", "allUploads", "itemPath", "uploads", "processedObj", "uploadBinaryData", "dirctCall", "rej", "promiseIsLive", "timeLetForReqToBeMade", "totalRequestTimeout", "payload", "message", "messageHash", "replyPromise", "resolve", "reject", "result", "sender", "connentTimeout", "errMessage", "waitingOnOpen", "res", "er", "waitingOnOpenThen", "waitingOnOpenCatch", "wrap", "onTypeStFn", "handlerFn", "handler", "connectionChangeListeners", "idx", "connect", "connectSocket_default", "sender", "setOnReciver", "onConnectionChange", "getTransport", "connectSocket_default"]
4
+ "sourcesContent": ["const alphabet = \"0123456789ABCDEFGHJKMNPQRSTVWXYZ\"\n/*\nfunction charValue(char){\n return alphabet.indexOf(char.toUpperCase())\n} // END charValue\n\nfunction fromBase32(b32){\n if (0 === b32.length) {\n return 0\n }\n return charValue(b32.slice(-1)) + fromBase32(b32.slice(0,-1)) * 32\n} // END fromBase32\n*/\nfunction toBase32 (n){\n const remainder = Math.floor(n/32)\n const current = n % 32\n if (0 === remainder) {\n return alphabet[current]\n }\n return toBase32(remainder)+alphabet[current]\n} // END toBase32\n\nfunction jenkinsOneAtATimeHash(keyString){\n \n var hash = 0\n \n for (var charIndex = 0; charIndex < keyString.length; ++charIndex)\n {\n hash += keyString.charCodeAt(charIndex);\n hash += hash << 10;\n hash ^= hash >> 6;\n }\n hash += hash << 3;\n hash ^= hash >> 11;\n //4,294,967,295 is FFFFFFFF, the maximum 32 bit unsigned integer value, used here as a mask.\n return (((hash + (hash << 15)) & 4294967295) >>> 0)\n} // END jenkinsOneAtATimeHash\n\nfunction messageHash(messageSt){\n return toBase32(jenkinsOneAtATimeHash(messageSt))\n} // END messageHash\n\nmodule.exports = messageHash", "//JsonSuperSet\n\n// TODO: add tests\n// check for any repeated ref not just cyclical references\n// support nasted array a<![,,[D]]>:[\"a\",\"b\",[Date]]\n// support array for the same type a<![*D]>:[Date,Date,Date]\n\nfunction encode(obj) {\n const tagLookup = {\n '[object RegExp]': 'R',\n '[object Date]': 'D',\n '[object Error]': 'E',\n \"[object Undefined]\": 'U',\n \"[object Map]\": 'M',\n \"[object Set]\": 'S',\n };\n const visited = new WeakMap();\n\n function encodeValue(value, path = '') {\n const type = typeof value;\n const tag = tagLookup[Object.prototype.toString.call(value)];\n // console.log({tag,value,path})\n if (tag !== undefined) {\n if ('D' === tag) return [tag, value.valueOf()];\n if ('E' === tag) return [tag, [value.name, value.message, value.stack]];\n if ('R' === tag) return [tag, value.toString()];\n if ('U' === tag) return [tag, null];\n if ('S' === tag) return [tag, Array.from(value)];\n if ('M' === tag) return [tag, Object.fromEntries(value)];\n\n return [tag, JSON.stringify(value)];\n } else if (type === 'object' && value !== null) {\n /*if (value.$ID) {\n return ['', value.$ID];\n }*/\n if (visitedEncode.has(value)) {\n return ['P', visitedEncode.get(value)];\n }\n visitedEncode.set(value, path);\n const isArray = Array.isArray(value);\n // keep index with undefined in Array\n const keys = isArray ? Array.from(Array(value.length).keys()) : Object.keys(value);\n const result = isArray ? [] : {};\n const typesFound = [];\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n const [t, v] = encodeValue(value[key], key);\n // console.log([t, v])\n if (isArray) {\n typesFound.push(t);\n result.push(v);\n // remove key with undefined from Objects\n } else if (value[key] !== undefined) {\n result[key + (t ? `<!${t}>` : '')] = v;\n }\n }\n\n visited.delete(value);\n if (isArray && typesFound.find((t) => !!t)) {\n return [`[${typesFound.join()}]`, result];\n }\n return ['', result];\n } else {\n return ['', value];\n }\n } // END encodeValue\n\n let keys = [];\n // console.log(obj)\n if (Array.isArray(obj)) {\n keys = Array.from(Array(obj.length).keys())\n } else {\n keys = Object.keys(obj);\n }\n\n // Track root object to handle self-references\n const visitedEncode = new WeakMap();\n visitedEncode.set(obj, []); // Root path is empty array\n\n function encodeValueWithVisited(value, path = []) {\n const type = typeof value;\n const tag = tagLookup[Object.prototype.toString.call(value)];\n if (tag !== undefined) {\n if ('D' === tag) return [tag, value.valueOf()];\n if ('E' === tag) return [tag, [value.name, value.message, value.stack]];\n if ('R' === tag) return [tag, value.toString()];\n if ('U' === tag) return [tag, null];\n if ('S' === tag) return [tag, Array.from(value)];\n if ('M' === tag) return [tag, Object.fromEntries(value)];\n return [tag, JSON.stringify(value)];\n } else if (type === 'object' && value !== null) {\n if (visitedEncode.has(value)) {\n return ['P', visitedEncode.get(value)]; // Return array path\n }\n visitedEncode.set(value, path);\n const isArray = Array.isArray(value);\n const objKeys = isArray ? Array.from(Array(value.length).keys()) : Object.keys(value);\n const result = isArray ? [] : {};\n const typesFound = [];\n for (let i = 0; i < objKeys.length; i++) {\n const key = objKeys[i];\n const [t, v] = encodeValueWithVisited(value[key], [...path, key]); // Append key to path array\n if (isArray) {\n typesFound.push(t);\n result.push(v);\n } else if (value[key] !== undefined) {\n result[key + (t ? `<!${t}>` : '')] = v;\n }\n }\n if (isArray && typesFound.find((t) => !!t)) {\n return [`[${typesFound.join()}]`, result];\n }\n return ['', result];\n } else {\n return ['', value];\n }\n }\n\n const result = {};\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i];\n // remove key with undefined from Objects\n if (obj[key] !== undefined) {\n const [t, v] = encodeValueWithVisited(obj[key], [key]); // Start path with single key\n result[key + (t ? `<!${t}>` : '')] = v;\n }\n }\n return result;\n} // END encode\n\nfunction stringify(obj) {\n return JSON.stringify(encode(obj))\n}\n\n\nfunction parse(encoded) {\n return decode(JSON.parse(encoded))\n}\n\nfunction decode(data) {\n const result = {};\n const pointers2Res = [];\n const tagLookup = {\n R: (s) => new RegExp(s),\n D: (n) => new Date(n),\n P: function (sourceToPointAt, replaceAtThisPlace) {\n // Both paths are now arrays\n pointers2Res.push([sourceToPointAt, replaceAtThisPlace]);\n return null; // Placeholder, will be replaced by changeAttributeReference\n },\n E: ([name, message, stack]) => {\n let err;\n try {\n err = new global[name](message);\n if (err instanceof Error) err.stack = stack;\n else throw {};\n } catch (e) {\n err = new Error(message);\n err.name = name;\n err.stack = stack;\n }\n return err;\n },\n U: () => undefined,\n S: (a) => new Set(a),\n M: (o) => new Map(Object.entries(o))\n };\n const visited = new Map();\n\n function decodeValue(name, tag, val) {\n // this is now an array path\n const currentPath = Array.isArray(this) ? this : [];\n\n if (tag in tagLookup) {\n return tagLookup[tag](val, currentPath);\n } else if (Array.isArray(val)) {\n if (tag && tag.startsWith('[')) {\n const typeTags = tag.slice(1, -1).split(',');\n const res = [];\n for (let i = 0; i < val.length; i++) {\n // Pass path with array index appended\n const itemPath = [...currentPath, i];\n const decodedValue = decodeValue.call(\n itemPath,\n i.toString(),\n typeTags[i],\n val[i]\n );\n res.push(decodedValue);\n }\n return res;\n } else {\n const res = [];\n for (let i = 0; i < val.length; i++) {\n const decodedValue = decodeValue.call([...currentPath, i], '', '', val[i]);\n res.push(decodedValue);\n }\n return res;\n }\n } else if ('object' === typeof val && val !== null) {\n if (visited.has(val)) {\n return visited.get(val);\n }\n visited.set(val, {});\n const res = {};\n for (const key in val) {\n const [nam, t] = parseKeyWithTags(key);\n const decodedValue = decodeValue.call(\n [...currentPath, nam],\n nam,\n t,\n val[key]\n );\n res[nam] = decodedValue;\n }\n visited.set(val, res);\n return res;\n } else {\n return val;\n }\n } // END decodeValue\n\n function parseKeyWithTags(key) {\n const match = key.match(/(.+)(<!(.)>)/);\n if (match) {\n return [match[1], match[3]];\n }\n // Try multi-character tags like array types [,D,]\n const multiMatch = key.match(/(.+)(<!!(.+)>)/);\n if (multiMatch) {\n return [multiMatch[1], multiMatch[3]];\n }\n // Also handle array type tags that start with [\n const arrayMatch = key.match(/(.+)(<!\\[(.*)>)/);\n if (arrayMatch) {\n return [arrayMatch[1], '[' + arrayMatch[3]];\n }\n return [key, undefined];\n } // END parseKeyWithTags\n\n for (const key in data) {\n const [name, tag] = parseKeyWithTags(key);\n // Start with path containing just the key name\n result[name] = decodeValue.call([name], name, tag, data[key]);\n }\n pointers2Res.forEach(changeAttributeReference.bind(null, result));\n return result;\n} // END decode\n\nfunction changeAttributeReference(obj, [refPath, attrPath]) {\n // refPath and attrPath are now arrays, no splitting needed\n const refKeys = refPath || [];\n const attrKeys = attrPath || [];\n\n // Get the reference target by traversing refPath\n let ref = obj;\n for (let i = 0; i < refKeys.length; i++) {\n ref = ref[refKeys[i]];\n }\n\n // Get the parent of the attribute to set\n let attr = obj;\n for (let i = 0; i < attrKeys.length - 1; i++) {\n attr = attr[attrKeys[i]];\n }\n\n // Set the attribute to point to the reference\n attr[attrKeys[attrKeys.length - 1]] = ref;\n return obj;\n} // END changeAttributeReference\n\n\nmodule.exports = { parse, stringify, encode, decode };\n", "import messageHash from '../utils/messageHash'\nimport jss from '../utils/jss'\nimport { createStreamingTransport } from './transports/streaming'\n\nlet connect;\n\n// Connection state enum\nconst ConnectionState = {\n Offline: 'offline', // navigator.onLine = false\n Walled: 'walled', // Captive portal detected (ping failed)\n Disconnected: 'disconnected',\n Connecting: 'connecting',\n Connected: 'connected',\n Closing: 'closing'\n}\n\n// Connection state tracking - start with offline check\nlet connectionState = (typeof navigator !== 'undefined' && !navigator.onLine)\n ? ConnectionState.Offline\n : ConnectionState.Disconnected\nconst connectionChangeListeners = []\n\nfunction notifyConnectionChange(newState) {\n if (connectionState !== newState) {\n connectionState = newState\n connectionChangeListeners.forEach(fn => fn(newState))\n }\n}\n\n// Configuration\nlet configuredTransport = 'auto' // 'auto' | 'websocket' | 'polling'\n\n// Transport state\nlet currentTransport = null // 'websocket' | 'polling'\nlet streamingTransport = null\nlet wsRetryTimer = null\nlet networkCheckTimer = null\nconst WS_FALLBACK_TIMEOUT = 4000 // Time to wait for WS before fallback\nconst WS_RETRY_INTERVAL = 30000 // Retry WebSocket while in polling mode\nconst PING_TIMEOUT = 3000 // Timeout for ping check\nconst MAX_PING_CLOCK_SKEW = 60000 // Max allowed time difference (60s)\n\n/**\n * Check if running in dev/local mode\n */\nfunction isDevMode() {\n if (typeof window === 'undefined') return false\n return ['localhost', '127.0.0.1', '[::1]'].includes(window.location.hostname)\n}\n\n/**\n * Build ping URL for captive portal detection\n */\nfunction getPingUrl() {\n const hostname = window.location.hostname\n const localServers = ['localhost', '127.0.0.1', '[::1]']\n const isLocal = localServers.includes(hostname)\n const isHttps = window.location.protocol === 'https:'\n const port = isLocal ? 9010 : (window.location.port || (isHttps ? 443 : 80))\n const protocol = isHttps ? 'https' : 'http'\n const portSuffix = (isLocal || (port !== 80 && port !== 443)) ? `:${port}` : ''\n return `${protocol}://${hostname}${portSuffix}/api/ape/ping`\n}\n\n/**\n * Check for captive portal by pinging /api/ape/ping\n * Returns 'ok' if real internet, 'walled' if captive portal detected\n */\nasync function checkCaptivePortal() {\n try {\n const controller = new AbortController()\n const timeoutId = setTimeout(() => controller.abort(), PING_TIMEOUT)\n\n const response = await fetch(getPingUrl(), {\n cache: 'no-store',\n signal: controller.signal\n })\n clearTimeout(timeoutId)\n\n if (!response.ok) {\n if (isDevMode()) {\n console.error('\uD83E\uDD8D [DEV] Ping failed: HTTP', response.status)\n }\n return 'walled'\n }\n\n const data = await response.json()\n\n // Verify response is genuine (not a captive portal redirect page)\n if (data?.ok !== true) {\n if (isDevMode()) {\n console.error('\uD83E\uDD8D [DEV] Ping failed: invalid response', data)\n }\n return 'walled'\n }\n\n // Validate timestamp to detect proxy replay attacks\n if (typeof data.ts === 'number') {\n const now = Date.now()\n const skew = Math.abs(now - data.ts)\n if (skew > MAX_PING_CLOCK_SKEW) {\n if (isDevMode()) {\n console.error('\uD83E\uDD8D [DEV] Ping failed: timestamp too old/stale (skew:', skew, 'ms)')\n }\n return 'walled'\n }\n }\n\n return 'ok'\n } catch (err) {\n if (isDevMode()) {\n console.error('\uD83E\uDD8D [DEV] Ping failed:', err.message || err)\n }\n return 'walled'\n }\n}\n\n/**\n * Setup navigator.onLine event listeners\n */\nfunction setupOnlineListeners() {\n if (typeof window === 'undefined') return\n\n window.addEventListener('online', () => {\n console.log('\uD83E\uDD8D Browser went online, checking network...')\n // Trigger reconnection attempt\n attemptConnection()\n })\n\n window.addEventListener('offline', () => {\n console.log('\uD83E\uDD8D Browser went offline')\n notifyConnectionChange(ConnectionState.Offline)\n })\n}\n\n// Setup listeners on module load (browser only)\nif (typeof window !== 'undefined') {\n setupOnlineListeners()\n}\n\n\n\n/**\n * Get WebSocket URL - auto-detects from window.location, keeps /api/ape path\n */\nfunction getSocketUrl() {\n const hostname = window.location.hostname\n const localServers = [\"localhost\", \"127.0.0.1\", \"[::1]\"]\n const isLocal = localServers.includes(hostname)\n const isHttps = window.location.protocol === \"https:\"\n\n // Default port: 9010 for local dev, otherwise use window.location.port or implicit 443/80\n const port = isLocal ? 9010 : (window.location.port || (isHttps ? 443 : 80))\n\n // Build URL - keep /api/ape path\n const protocol = isHttps ? \"wss\" : \"ws\"\n const portSuffix = (isLocal || port !== 80 && port !== 443) ? `:${port}` : \"\"\n\n return `${protocol}://${hostname}${portSuffix}/api/ape`\n}\n\nlet reconnect = false\nconst connectTimeout = 5000\nconst totalRequestTimeout = 10000\n//const location = window.location\n\nconst joinKey = \"/\"\n// Properties accessed directly on `ape` that should NOT be intercepted\nconst reservedKeys = new Set(['on', 'onConnectionChange', 'transport'])\nconst handler = {\n get(fn, key) {\n // Skip proxy interception for reserved keys - return actual property\n if (reservedKeys.has(key)) {\n return fn[key]\n }\n const wrapperFn = function (a, b) {\n let path = joinKey + key, body;\n if (2 === arguments.length) {\n path += a\n body = b\n } else {\n body = a\n }\n return fn(path, body)\n }\n return new Proxy(wrapperFn, handler)\n } // END get\n}\n\nfunction wrap(api) {\n return new Proxy(api, handler)\n}\n\nlet __socket = false, ready = false, wsSend = false;\nconst waitingOn = {};\n\nlet aWaitingSend = []\nconst receiverArray = [];\nconst ofTypesOb = {};\n\n/**\n * Switch to streaming transport (HTTP long polling fallback)\n */\nfunction switchToStreaming() {\n console.log('\uD83E\uDD8D Switching to HTTP streaming transport')\n currentTransport = 'polling'\n\n if (!streamingTransport) {\n streamingTransport = createStreamingTransport()\n\n // Handle incoming messages from streaming transport\n streamingTransport.onMessage = async (msg) => {\n const { err, type, data } = msg\n\n // Process linked resources and shared files\n let processedData = data\n if (data && !err) {\n try {\n processedData = await fetchLinkedResources(data)\n processedData = await fetchSharedFiles(processedData)\n } catch (fetchErr) {\n console.error(`\uD83E\uDD8D Failed to hydrate streaming data:`, fetchErr)\n }\n }\n\n // Dispatch to type-specific handlers\n if (ofTypesOb[type]) {\n ofTypesOb[type].forEach(worker => worker({ err, type, data: processedData }))\n }\n // Dispatch to general handlers\n receiverArray.forEach(worker => worker({ err, type, data: processedData }))\n }\n\n streamingTransport.onOpen = () => {\n ready = true\n notifyConnectionChange(ConnectionState.Connected)\n console.log('\uD83E\uDD8D HTTP streaming connected')\n\n // Flush waiting messages\n aWaitingSend.forEach(({ type, data, resolve, reject, waiting, createdAt, timer }) => {\n clearTimeout(timer)\n const resultPromise = streamingSend(type, data, createdAt)\n if (waiting) {\n resultPromise.then(resolve).catch(reject)\n }\n })\n aWaitingSend = []\n\n // Start background WebSocket retry\n startWsRetry()\n }\n\n streamingTransport.onClose = () => {\n ready = false\n notifyConnectionChange(ConnectionState.Disconnected)\n }\n\n streamingTransport.onError = (err) => {\n console.error('\uD83E\uDD8D Streaming error:', err)\n }\n }\n\n streamingTransport.connect()\n}\n\n/**\n * Send via streaming transport\n */\nfunction streamingSend(type, data, createdAt) {\n return streamingTransport.send(type, data, createdAt)\n}\n\n/**\n * Start background retry for WebSocket (while in polling mode)\n */\nfunction startWsRetry() {\n if (wsRetryTimer) return\n if (currentTransport !== 'polling') return\n if (configuredTransport === 'polling') return // User explicitly wants polling only\n\n wsRetryTimer = setInterval(() => {\n if (currentTransport !== 'polling') {\n clearInterval(wsRetryTimer)\n wsRetryTimer = null\n return\n }\n\n console.log('\uD83E\uDD8D Attempting WebSocket reconnection...')\n tryWebSocket(true)\n }, WS_RETRY_INTERVAL)\n}\n\n/**\n * Try to establish WebSocket connection\n * @param {boolean} isRetry - If true, this is a background retry attempt\n */\nfunction tryWebSocket(isRetry = false) {\n const ws = new WebSocket(getSocketUrl())\n let fallbackTimer = null\n\n // Set fallback timeout (only for initial connection, not retries)\n if (!isRetry && configuredTransport === 'auto') {\n fallbackTimer = setTimeout(() => {\n if (ws.readyState !== WebSocket.OPEN) {\n console.log('\uD83E\uDD8D WebSocket timeout, falling back to HTTP streaming')\n ws.close()\n switchToStreaming()\n }\n }, WS_FALLBACK_TIMEOUT)\n }\n\n ws.onopen = () => {\n if (fallbackTimer) clearTimeout(fallbackTimer)\n\n // If this is a retry and we're in polling mode, switch back to WebSocket\n if (isRetry && currentTransport === 'polling') {\n console.log('\uD83E\uDD8D WebSocket reconnected, switching from HTTP streaming')\n if (streamingTransport) {\n streamingTransport.close()\n }\n if (wsRetryTimer) {\n clearInterval(wsRetryTimer)\n wsRetryTimer = null\n }\n }\n\n currentTransport = 'websocket'\n __socket = ws\n ready = true\n notifyConnectionChange(ConnectionState.Connected)\n\n aWaitingSend.forEach(({ type, data, resolve, reject, waiting, createdAt, timer }) => {\n clearTimeout(timer)\n const resultPromise = wsSend(type, data, createdAt)\n if (waiting) {\n resultPromise.then(resolve).catch(reject)\n }\n })\n aWaitingSend = []\n }\n\n ws.onmessage = async function (event) {\n const { err, type, queryId, data } = jss.parse(event.data)\n\n // Messages with queryId must fulfill matching promise\n if (queryId) {\n if (waitingOn[queryId]) {\n // Check for linked resources and fetch them before resolving\n if (data && !err) {\n try {\n let hydratedData = await fetchLinkedResources(data)\n hydratedData = await fetchSharedFiles(hydratedData)\n waitingOn[queryId](err, hydratedData)\n } catch (fetchErr) {\n waitingOn[queryId](fetchErr, null)\n }\n } else {\n waitingOn[queryId](err, data)\n }\n delete waitingOn[queryId]\n } else {\n console.error(`\uD83E\uDD8D No matching queryId: ${queryId}`)\n }\n return\n }\n\n // Only messages WITHOUT queryId go to setOnReceiver\n let processedData = data\n if (data && !err) {\n try {\n processedData = await fetchLinkedResources(data)\n processedData = await fetchSharedFiles(processedData)\n } catch (fetchErr) {\n console.error(`\uD83E\uDD8D Failed to hydrate broadcast data:`, fetchErr)\n }\n }\n\n if (ofTypesOb[type]) {\n ofTypesOb[type].forEach(worker => worker({ err, type, data: processedData }))\n }\n receiverArray.forEach(worker => worker({ err, type, data: processedData }))\n }\n\n ws.onerror = function (err) {\n if (fallbackTimer) clearTimeout(fallbackTimer)\n console.error('socket ERROR:', err)\n\n // On initial connection error in auto mode, fallback to streaming\n if (!isRetry && configuredTransport === 'auto' && !ready) {\n switchToStreaming()\n }\n }\n\n ws.onclose = function (event) {\n if (fallbackTimer) clearTimeout(fallbackTimer)\n console.warn('socket disconnect:', event)\n __socket = false\n ready = false\n\n // Only notify disconnected if we're on websocket transport\n if (currentTransport === 'websocket') {\n notifyConnectionChange(ConnectionState.Disconnected)\n setTimeout(() => reconnect && connectSocket(), 500)\n }\n }\n}\n\n/**\n * Find all L-tagged (binary link) properties in data\n * Returns array of { path, hash }\n */\nfunction findLinkedResources(obj, path = '') {\n const resources = []\n\n if (obj === null || obj === undefined || typeof obj !== 'object') {\n return resources\n }\n\n if (Array.isArray(obj)) {\n for (let i = 0; i < obj.length; i++) {\n resources.push(...findLinkedResources(obj[i], path ? `${path}.${i}` : String(i)))\n }\n return resources\n }\n\n for (const key of Object.keys(obj)) {\n // Check for L-tag in key (from JJS encoding: key<!L>)\n if (key.endsWith('<!L>')) {\n const cleanKey = key.slice(0, -4)\n const hash = obj[key]\n resources.push({\n path: path ? `${path}.${cleanKey}` : cleanKey,\n hash,\n originalKey: key\n })\n } else {\n resources.push(...findLinkedResources(obj[key], path ? `${path}.${key}` : key))\n }\n }\n\n return resources\n}\n\n/**\n * Find all F-tagged (shared file) properties in data\n * Returns array of { path, hash, originalKey }\n */\nfunction findFileTags(obj, path = '') {\n const files = []\n\n if (obj === null || obj === undefined || typeof obj !== 'object') {\n return files\n }\n\n if (Array.isArray(obj)) {\n for (let i = 0; i < obj.length; i++) {\n files.push(...findFileTags(obj[i], path ? `${path}.${i}` : String(i)))\n }\n return files\n }\n\n for (const key of Object.keys(obj)) {\n // Check for F-tag in key (client-to-client shared file marker)\n if (key.endsWith('<!F>')) {\n const cleanKey = key.slice(0, -4)\n const hash = obj[key]\n files.push({\n path: path ? `${path}.${cleanKey}` : cleanKey,\n hash,\n originalKey: key\n })\n } else {\n files.push(...findFileTags(obj[key], path ? `${path}.${key}` : key))\n }\n }\n\n return files\n}\n\n/**\n * Clean up F-tagged keys (rename key<!F> to key)\n */\nfunction cleanFileTags(obj) {\n if (obj === null || obj === undefined || typeof obj !== 'object') {\n return obj\n }\n\n if (Array.isArray(obj)) {\n return obj.map(cleanFileTags)\n }\n\n const cleaned = {}\n for (const key of Object.keys(obj)) {\n if (key.endsWith('<!F>')) {\n const cleanKey = key.slice(0, -4)\n cleaned[cleanKey] = obj[key]\n } else {\n cleaned[key] = cleanFileTags(obj[key])\n }\n }\n return cleaned\n}\n\n/**\n * Fetch shared files (client-to-client transfers)\n * Retries if upload is still in progress\n */\nasync function fetchSharedFiles(data, maxRetries = 5) {\n const files = findFileTags(data)\n\n if (files.length === 0) {\n return data\n }\n\n console.log(`\uD83E\uDD8D Fetching ${files.length} shared file(s)`)\n\n const cleanedData = cleanFileTags(data)\n\n const hostname = window.location.hostname\n const isLocal = [\"localhost\", \"127.0.0.1\", \"[::1]\"].includes(hostname)\n const isHttps = window.location.protocol === \"https:\"\n const port = isLocal ? 9010 : (window.location.port || (isHttps ? 443 : 80))\n const protocol = isHttps ? \"https\" : \"http\"\n const portSuffix = (isLocal || (port !== 80 && port !== 443)) ? `:${port}` : \"\"\n const baseUrl = `${protocol}://${hostname}${portSuffix}`\n\n await Promise.all(files.map(async ({ path, hash }) => {\n let retries = 0\n let backoff = 100 // Start with 100ms\n\n while (retries < maxRetries) {\n try {\n const response = await fetch(`${baseUrl}/api/ape/data/${hash}`, {\n credentials: 'include'\n })\n\n if (!response.ok) {\n // 404 might mean file not uploaded yet, retry\n if (response.status === 404 && retries < maxRetries - 1) {\n retries++\n await new Promise(r => setTimeout(r, backoff))\n backoff *= 2 // Exponential backoff\n continue\n }\n throw new Error(`Failed to fetch shared file: ${response.status}`)\n }\n\n const arrayBuffer = await response.arrayBuffer()\n setValueAtPath(cleanedData, path, arrayBuffer)\n\n // Check if upload is still in progress\n const isComplete = response.headers.get('X-Ape-Complete') === '1'\n if (!isComplete) {\n console.log(`\uD83E\uDD8D Shared file ${hash} still uploading (${response.headers.get('X-Ape-Total-Received') || '?'} bytes)`)\n }\n break\n } catch (err) {\n if (retries >= maxRetries - 1) {\n console.error(`\uD83E\uDD8D Failed to fetch shared file at ${path}:`, err)\n setValueAtPath(cleanedData, path, null)\n }\n retries++\n await new Promise(r => setTimeout(r, backoff))\n backoff *= 2\n }\n }\n }))\n\n return cleanedData\n}\n\n/**\n * Set a value at a nested path in an object\n */\nfunction setValueAtPath(obj, path, value) {\n const parts = path.split('.')\n let current = obj\n\n for (let i = 0; i < parts.length - 1; i++) {\n current = current[parts[i]]\n }\n\n current[parts[parts.length - 1]] = value\n}\n\n/**\n * Clean up L-tagged keys (rename key<!L> to key)\n */\nfunction cleanLinkedKeys(obj) {\n if (obj === null || obj === undefined || typeof obj !== 'object') {\n return obj\n }\n\n if (Array.isArray(obj)) {\n return obj.map(cleanLinkedKeys)\n }\n\n const cleaned = {}\n for (const key of Object.keys(obj)) {\n if (key.endsWith('<!L>')) {\n const cleanKey = key.slice(0, -4)\n cleaned[cleanKey] = obj[key]\n } else {\n cleaned[key] = cleanLinkedKeys(obj[key])\n }\n }\n return cleaned\n}\n\n/**\n * Fetch binary resources and hydrate data object\n */\nasync function fetchLinkedResources(data, clientId) {\n const resources = findLinkedResources(data)\n\n if (resources.length === 0) {\n return data\n }\n\n console.log(`\uD83E\uDD8D Fetching ${resources.length} binary resource(s)`)\n\n const cleanedData = cleanLinkedKeys(data)\n\n const hostname = window.location.hostname\n const isLocal = [\"localhost\", \"127.0.0.1\", \"[::1]\"].includes(hostname)\n const isHttps = window.location.protocol === \"https:\"\n const port = isLocal ? 9010 : (window.location.port || (isHttps ? 443 : 80))\n const protocol = isHttps ? \"https\" : \"http\"\n const portSuffix = (isLocal || (port !== 80 && port !== 443)) ? `:${port}` : \"\"\n const baseUrl = `${protocol}://${hostname}${portSuffix}`\n\n await Promise.all(resources.map(async ({ path, hash }) => {\n try {\n const response = await fetch(`${baseUrl}/api/ape/data/${hash}`, {\n credentials: 'include',\n headers: {\n 'X-Ape-Client-Id': clientId || ''\n }\n })\n\n if (!response.ok) {\n throw new Error(`Failed to fetch binary resource: ${response.status}`)\n }\n\n const arrayBuffer = await response.arrayBuffer()\n setValueAtPath(cleanedData, path, arrayBuffer)\n } catch (err) {\n console.error(`\uD83E\uDD8D Failed to fetch binary resource at ${path}:`, err)\n setValueAtPath(cleanedData, path, null)\n }\n }))\n\n return cleanedData\n}\n\n/**\n * Attempt to establish connection with network pre-checks\n */\nasync function attemptConnection() {\n // Check if browser is online\n if (typeof navigator !== 'undefined' && !navigator.onLine) {\n notifyConnectionChange(ConnectionState.Offline)\n return\n }\n\n // Perform captive portal check\n notifyConnectionChange(ConnectionState.Connecting)\n const pingResult = await checkCaptivePortal()\n\n if (pingResult === 'walled') {\n notifyConnectionChange(ConnectionState.Walled)\n // Retry network check periodically\n scheduleNetworkRetry()\n return\n }\n\n // Network is good, proceed with socket connection\n proceedWithConnection()\n}\n\n/**\n * Schedule a retry of network check (for walled/offline states)\n */\nfunction scheduleNetworkRetry() {\n if (networkCheckTimer) return\n networkCheckTimer = setTimeout(() => {\n networkCheckTimer = null\n attemptConnection()\n }, WS_RETRY_INTERVAL)\n}\n\n/**\n * Proceed with WebSocket/polling connection after network checks pass\n */\nfunction proceedWithConnection() {\n // Determine which transport to use\n if (configuredTransport === 'polling') {\n switchToStreaming()\n } else {\n // 'auto' or 'websocket' - try WebSocket first\n tryWebSocket(false)\n }\n}\n\nfunction connectSocket() {\n // Skip if already connected or connecting\n if (__socket && __socket.readyState !== WebSocket.CLOSED) {\n return buildClientInterface()\n }\n if (currentTransport === 'polling' && streamingTransport?.isConnected()) {\n return buildClientInterface()\n }\n if (connectionState === ConnectionState.Connecting) {\n return buildClientInterface()\n }\n\n // Start connection with network pre-checks\n attemptConnection()\n\n return buildClientInterface()\n}\n\n/**\n * Check if value is binary data (ArrayBuffer, typed array, or Blob)\n */\nfunction isBinaryData(value) {\n if (value === null || value === undefined) return false\n return value instanceof ArrayBuffer ||\n ArrayBuffer.isView(value) ||\n (typeof Blob !== 'undefined' && value instanceof Blob)\n}\n\n/**\n * Get binary type tag (A for ArrayBuffer, B for Blob)\n */\nfunction getBinaryTag(value) {\n if (typeof Blob !== 'undefined' && value instanceof Blob) return 'B'\n return 'A'\n}\n\n/**\n * Generate a simple hash for binary upload\n */\nfunction generateUploadHash(path) {\n let hash = 0\n for (let i = 0; i < path.length; i++) {\n const char = path.charCodeAt(i)\n hash = ((hash << 5) - hash) + char\n hash = hash & hash\n }\n return Math.abs(hash).toString(36)\n}\n\n/**\n * Find and extract binary data from payload\n * Returns { processedData, uploads: [{ path, hash, data, tag }] }\n */\nfunction processBinaryForUpload(data, path = '') {\n if (data === null || data === undefined) {\n return { processedData: data, uploads: [] }\n }\n\n if (isBinaryData(data)) {\n const tag = getBinaryTag(data)\n const hash = generateUploadHash(path || 'root')\n return {\n processedData: { [`__ape_upload__`]: hash },\n uploads: [{ path, hash, data, tag }]\n }\n }\n\n if (Array.isArray(data)) {\n const processedArray = []\n const allUploads = []\n\n for (let i = 0; i < data.length; i++) {\n const itemPath = path ? `${path}.${i}` : String(i)\n const { processedData, uploads } = processBinaryForUpload(data[i], itemPath)\n processedArray.push(processedData)\n allUploads.push(...uploads)\n }\n\n return { processedData: processedArray, uploads: allUploads }\n }\n\n if (typeof data === 'object') {\n const processedObj = {}\n const allUploads = []\n\n for (const key of Object.keys(data)) {\n const itemPath = path ? `${path}.${key}` : key\n const { processedData, uploads } = processBinaryForUpload(data[key], itemPath)\n\n // If this was binary data, mark the key with <!B> or <!A> tag\n if (uploads.length > 0 && processedData?.__ape_upload__) {\n const tag = uploads[uploads.length - 1].tag\n processedObj[`${key}<!${tag}>`] = processedData.__ape_upload__\n } else {\n processedObj[key] = processedData\n }\n allUploads.push(...uploads)\n }\n\n return { processedData: processedObj, uploads: allUploads }\n }\n\n return { processedData: data, uploads: [] }\n}\n\n/**\n * Find and extract binary data for SHARING (client-to-client)\n * Uses <!F> tag instead of <!A>/<!B>\n * Returns { processedData, shares: [{ path, hash, data }] }\n */\nfunction processBinaryForSharing(data, path = '') {\n if (data === null || data === undefined) {\n return { processedData: data, shares: [] }\n }\n\n if (isBinaryData(data)) {\n const hash = generateUploadHash(path || 'share')\n return {\n processedData: { [`__ape_share__`]: hash },\n shares: [{ path, hash, data }]\n }\n }\n\n if (Array.isArray(data)) {\n const processedArray = []\n const allShares = []\n\n for (let i = 0; i < data.length; i++) {\n const itemPath = path ? `${path}.${i}` : String(i)\n const { processedData, shares } = processBinaryForSharing(data[i], itemPath)\n processedArray.push(processedData)\n allShares.push(...shares)\n }\n\n return { processedData: processedArray, shares: allShares }\n }\n\n if (typeof data === 'object') {\n const processedObj = {}\n const allShares = []\n\n for (const key of Object.keys(data)) {\n const itemPath = path ? `${path}.${key}` : key\n const { processedData, shares } = processBinaryForSharing(data[key], itemPath)\n\n // If this was binary data, mark the key with <!F> tag\n if (shares.length > 0 && processedData?.__ape_share__) {\n processedObj[`${key}<!F>`] = processedData.__ape_share__\n } else {\n processedObj[key] = processedData\n }\n allShares.push(...shares)\n }\n\n return { processedData: processedObj, shares: allShares }\n }\n\n return { processedData: data, shares: [] }\n}\n\n/**\n * Upload shared files via HTTP PUT\n * Uses different endpoint pattern for streaming files\n */\nasync function uploadSharedFiles(shares) {\n if (shares.length === 0) return\n\n // Build base URL\n const hostname = window.location.hostname\n const isLocal = [\"localhost\", \"127.0.0.1\", \"[::1]\"].includes(hostname)\n const isHttps = window.location.protocol === \"https:\"\n const port = isLocal ? 9010 : (window.location.port || (isHttps ? 443 : 80))\n const protocol = isHttps ? \"https\" : \"http\"\n const portSuffix = (isLocal || (port !== 80 && port !== 443)) ? `:${port}` : \"\"\n const baseUrl = `${protocol}://${hostname}${portSuffix}`\n\n console.log(`\uD83E\uDD8D Uploading ${shares.length} shared file(s)`)\n\n await Promise.all(shares.map(async ({ hash, data }) => {\n try {\n // For shared files, use upload pattern with hash as both queryId and pathHash\n const response = await fetch(`${baseUrl}/api/ape/data/_share/${hash}`, {\n method: 'PUT',\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/octet-stream'\n },\n body: data\n })\n\n if (!response.ok) {\n throw new Error(`Shared upload failed: ${response.status}`)\n }\n } catch (err) {\n console.error(`\uD83E\uDD8D Failed to upload shared file ${hash}:`, err)\n throw err\n }\n }))\n}\n\n/**\n * Upload binary data via HTTP PUT\n */\nasync function uploadBinaryData(queryId, uploads) {\n if (uploads.length === 0) return\n\n // Build base URL\n const hostname = window.location.hostname\n const isLocal = [\"localhost\", \"127.0.0.1\", \"[::1]\"].includes(hostname)\n const isHttps = window.location.protocol === \"https:\"\n const port = isLocal ? 9010 : (window.location.port || (isHttps ? 443 : 80))\n const protocol = isHttps ? \"https\" : \"http\"\n const portSuffix = (isLocal || (port !== 80 && port !== 443)) ? `:${port}` : \"\"\n const baseUrl = `${protocol}://${hostname}${portSuffix}`\n\n console.log(`\uD83E\uDD8D Uploading ${uploads.length} binary file(s)`)\n\n await Promise.all(uploads.map(async ({ hash, data }) => {\n try {\n const response = await fetch(`${baseUrl}/api/ape/data/${queryId}/${hash}`, {\n method: 'PUT',\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/octet-stream'\n },\n body: data\n })\n\n if (!response.ok) {\n throw new Error(`Upload failed: ${response.status}`)\n }\n } catch (err) {\n console.error(`\uD83E\uDD8D Failed to upload binary at ${hash}:`, err)\n throw err\n }\n }))\n}\n\nwsSend = function (type, data, createdAt, dirctCall) {\n let rej, promiseIsLive = false;\n const timeLetForReqToBeMade = (createdAt + totalRequestTimeout) - Date.now()\n\n const timer = setTimeout(() => {\n if (promiseIsLive) {\n rej(new Error(\"Request Timedout for :\" + type))\n }\n }, timeLetForReqToBeMade);\n\n // Process binary data for upload\n const { processedData, uploads } = processBinaryForUpload(data)\n\n const payload = {\n type,\n data: processedData,\n //referer:window.location.href,\n createdAt: new Date(createdAt),\n requestedAt: dirctCall ? undefined\n : new Date()\n }\n const message = jss.stringify(payload)\n const queryId = messageHash(message);\n\n const replyPromise = new Promise((resolve, reject) => {\n rej = reject\n waitingOn[queryId] = (err, result) => {\n clearTimeout(timer)\n replyPromise.then = next.bind(replyPromise)\n if (err) {\n reject(err)\n } else {\n resolve(result)\n }\n }\n __socket.send(message);\n\n // Upload binary data after sending WS message\n if (uploads.length > 0) {\n uploadBinaryData(queryId, uploads).catch(err => {\n console.error('\uD83E\uDD8D Binary upload failed:', err)\n // The server will timeout waiting for the upload\n })\n }\n });\n const next = replyPromise.then;\n replyPromise.then = worker => {\n promiseIsLive = true;\n replyPromise.then = next.bind(replyPromise)\n replyPromise.catch = err.bind(replyPromise)\n return next.call(replyPromise, worker)\n }\n const err = replyPromise.catch;\n replyPromise.catch = worker => {\n promiseIsLive = true;\n replyPromise.catch = err.bind(replyPromise)\n replyPromise.then = next.bind(replyPromise)\n return err.call(replyPromise, worker)\n }\n return replyPromise\n} // END wsSend\n\n\nconst sender = (type, data) => {\n if (\"string\" !== typeof type) {\n throw new Error(\"Missing Path vaule\")\n }\n\n const createdAt = Date.now()\n\n if (ready) {\n return wsSend(type, data, createdAt, true)\n }\n\n const timeLetForReqToBeMade = (createdAt + connectTimeout) - Date.now() // 5sec for reconnect\n\n const timer = setTimeout(() => {\n const errMessage = \"Request not sent for :\" + type\n if (payload.waiting) {\n payload.reject(new Error(errMessage))\n } else {\n throw new Error(errMessage)\n }\n }, timeLetForReqToBeMade);\n\n const payload = { type, data, resolve: undefined, reject: undefined, waiting: false, createdAt, timer };\n const waitingOnOpen = new Promise((res, rej) => { payload.resolve = res; payload.reject = rej; })\n\n const waitingOnOpenThen = waitingOnOpen.then;\n const waitingOnOpenCatch = waitingOnOpen.catch;\n waitingOnOpen.then = worker => {\n payload.waiting = true;\n waitingOnOpen.then = waitingOnOpenThen.bind(waitingOnOpen)\n waitingOnOpen.catch = waitingOnOpenCatch.bind(waitingOnOpen)\n return waitingOnOpenThen.call(waitingOnOpen, worker)\n }\n waitingOnOpen.catch = worker => {\n payload.waiting = true;\n waitingOnOpen.catch = waitingOnOpenCatch.bind(waitingOnOpen)\n waitingOnOpen.then = waitingOnOpenThen.bind(waitingOnOpen)\n return waitingOnOpenCatch.call(waitingOnOpen, worker)\n }\n\n aWaitingSend.push(payload)\n if (!__socket) {\n connectSocket()\n }\n\n return waitingOnOpen\n} // END sender\n\n/**\n * Build the client interface object\n */\nfunction buildClientInterface() {\n return {\n sender: wrap(sender),\n setOnReceiver: (onTypeStFn, handlerFn) => {\n if (\"string\" === typeof onTypeStFn) {\n // Replace handler for this type (prevents duplicates in React StrictMode)\n ofTypesOb[onTypeStFn] = [handlerFn]\n } else {\n // For general receivers, prevent duplicates by checking\n if (!receiverArray.includes(onTypeStFn)) {\n receiverArray.push(onTypeStFn)\n }\n }\n },\n onConnectionChange: (handler) => {\n connectionChangeListeners.push(handler)\n // Immediately call with current state\n handler(connectionState)\n // Return unsubscribe function\n return () => {\n const idx = connectionChangeListeners.indexOf(handler)\n if (idx > -1) connectionChangeListeners.splice(idx, 1)\n }\n },\n // Expose current transport type (read-only)\n get transport() { return currentTransport }\n }\n}\n\nconnectSocket.autoReconnect = () => reconnect = true\nconnectSocket.ConnectionState = ConnectionState\nconnect = connectSocket\n\nexport default connect;\nexport { ConnectionState };\n", "import jss from '../../utils/jss'\n\n/**\n * HTTP Streaming transport - fallback when WebSocket is blocked\n * Uses fetch + ReadableStream for receiving, POST for sending\n */\n\n/**\n * Get base URL for polling endpoints\n */\nfunction getPollUrl() {\n const hostname = window.location.hostname\n const localServers = [\"localhost\", \"127.0.0.1\", \"[::1]\"]\n const isLocal = localServers.includes(hostname)\n const isHttps = window.location.protocol === \"https:\"\n\n const port = isLocal ? 9010 : (window.location.port || (isHttps ? 443 : 80))\n\n const protocol = isHttps ? \"https\" : \"http\"\n const portSuffix = (isLocal || (port !== 80 && port !== 443)) ? `:${port}` : \"\"\n\n return `${protocol}://${hostname}${portSuffix}/api/ape/poll`\n}\n\n/**\n * Parse JSON objects from a streaming buffer by counting braces\n * Handles strings containing braces correctly\n */\nfunction parseStreamBuffer(buffer) {\n const messages = []\n let start = -1\n let depth = 0\n let inString = false\n let escaped = false\n\n for (let i = 0; i < buffer.length; i++) {\n const char = buffer[i]\n\n if (escaped) {\n escaped = false\n continue\n }\n\n if (char === '\\\\' && inString) {\n escaped = true\n continue\n }\n\n if (char === '\"') {\n inString = !inString\n continue\n }\n\n if (inString) continue\n\n if (char === '{') {\n if (depth === 0) {\n start = i\n }\n depth++\n } else if (char === '}') {\n depth--\n if (depth === 0 && start !== -1) {\n const jsonStr = buffer.slice(start, i + 1)\n try {\n messages.push(jss.parse(jsonStr))\n } catch (e) {\n console.error('\uD83E\uDD8D Failed to parse stream message:', e)\n }\n start = -1\n }\n }\n }\n\n // Return remaining buffer (incomplete message)\n const remaining = start !== -1 ? buffer.slice(start) : ''\n return { messages, remaining }\n}\n\n/**\n * Create streaming transport instance\n */\nfunction createStreamingTransport() {\n let isActive = false\n let abortController = null\n let streamBuffer = ''\n let reconnectTimer = null\n\n // Callbacks\n let onMessage = () => { }\n let onOpen = () => { }\n let onClose = () => { }\n let onError = () => { }\n\n /**\n * Start the streaming connection\n */\n async function connect() {\n if (isActive) return\n\n isActive = true\n abortController = new AbortController()\n\n try {\n const response = await fetch(getPollUrl(), {\n method: 'GET',\n credentials: 'include',\n signal: abortController.signal,\n headers: {\n 'Accept': 'application/json'\n }\n })\n\n if (!response.ok) {\n throw new Error(`Stream connect failed: ${response.status}`)\n }\n\n onOpen()\n\n const reader = response.body.getReader()\n const decoder = new TextDecoder()\n\n async function read() {\n while (isActive) {\n try {\n const { done, value } = await reader.read()\n\n if (done) {\n // Stream ended - reconnect\n scheduleReconnect()\n return\n }\n\n streamBuffer += decoder.decode(value, { stream: true })\n const { messages, remaining } = parseStreamBuffer(streamBuffer)\n streamBuffer = remaining\n\n for (const msg of messages) {\n // Skip heartbeat messages\n if (msg.type === '__heartbeat__') continue\n onMessage(msg)\n }\n } catch (readErr) {\n if (readErr.name === 'AbortError') return\n console.error('\uD83E\uDD8D Stream read error:', readErr)\n scheduleReconnect()\n return\n }\n }\n }\n\n read()\n\n } catch (err) {\n if (err.name === 'AbortError') return\n\n console.error('\uD83E\uDD8D Stream connection error:', err)\n onError(err)\n scheduleReconnect()\n }\n }\n\n /**\n * Schedule reconnection with small delay\n */\n function scheduleReconnect() {\n if (!isActive) return\n\n if (reconnectTimer) {\n clearTimeout(reconnectTimer)\n }\n\n reconnectTimer = setTimeout(() => {\n if (isActive) {\n connect()\n }\n }, 500)\n }\n\n /**\n * Send a message via POST\n */\n async function send(type, data, createdAt) {\n const payload = {\n type,\n data,\n createdAt: new Date(createdAt)\n }\n\n const response = await fetch(getPollUrl(), {\n method: 'POST',\n credentials: 'include',\n headers: {\n 'Content-Type': 'application/json'\n },\n body: jss.stringify(payload)\n })\n\n if (!response.ok) {\n const error = await response.json().catch(() => ({ error: 'Unknown error' }))\n throw new Error(error.error || `Request failed: ${response.status}`)\n }\n\n const result = jss.parse(await response.text())\n return result.data\n }\n\n /**\n * Close the streaming connection\n */\n function close() {\n isActive = false\n\n if (reconnectTimer) {\n clearTimeout(reconnectTimer)\n reconnectTimer = null\n }\n\n if (abortController) {\n abortController.abort()\n abortController = null\n }\n\n streamBuffer = ''\n onClose()\n }\n\n return {\n connect,\n send,\n close,\n isConnected: () => isActive,\n set onMessage(fn) { onMessage = fn },\n set onOpen(fn) { onOpen = fn },\n set onClose(fn) { onClose = fn },\n set onError(fn) { onError = fn }\n }\n}\n\nexport { createStreamingTransport, getPollUrl }\n", "import connectSocket from './connectSocket.js'\n\nconst client = connectSocket()\nconnectSocket.autoReconnect()\n\n// Global API - use defineProperty to bypass Proxy interception\nwindow.api = client.sender\nObject.defineProperty(window.api, 'on', {\n value: client.setOnReceiver,\n writable: false,\n enumerable: false,\n configurable: false\n})\nObject.defineProperty(window.api, 'onConnectionChange', {\n value: client.onConnectionChange,\n writable: false,\n enumerable: false,\n configurable: false\n})\n// Read-only transport property - only ape can change this internally\nObject.defineProperty(window.api, 'transport', {\n get: () => client.transport,\n enumerable: false,\n configurable: false\n})\n"],
5
+ "mappings": "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",
6
+ "names": ["require_messageHash", "__commonJSMin", "exports", "module", "alphabet", "toBase32", "n", "remainder", "current", "jenkinsOneAtATimeHash", "keyString", "hash", "charIndex", "messageHash", "messageSt", "require_jss", "__commonJSMin", "exports", "module", "encode", "obj", "tagLookup", "visited", "encodeValue", "value", "path", "type", "tag", "visitedEncode", "isArray", "keys", "result", "typesFound", "i", "key", "t", "v", "encodeValueWithVisited", "objKeys", "stringify", "parse", "encoded", "decode", "data", "pointers2Res", "s", "n", "sourceToPointAt", "replaceAtThisPlace", "name", "message", "stack", "err", "a", "o", "decodeValue", "val", "currentPath", "typeTags", "res", "itemPath", "decodedValue", "nam", "parseKeyWithTags", "match", "multiMatch", "arrayMatch", "changeAttributeReference", "refPath", "attrPath", "refKeys", "attrKeys", "ref", "attr", "import_messageHash", "import_jss", "import_jss", "getPollUrl", "hostname", "isLocal", "isHttps", "port", "protocol", "portSuffix", "parseStreamBuffer", "buffer", "messages", "start", "depth", "inString", "escaped", "i", "char", "jsonStr", "jss", "e", "remaining", "createStreamingTransport", "isActive", "abortController", "streamBuffer", "reconnectTimer", "onMessage", "onOpen", "onClose", "onError", "connect", "response", "reader", "decoder", "read", "done", "value", "scheduleReconnect", "msg", "readErr", "err", "send", "type", "data", "createdAt", "payload", "error", "close", "fn", "connect", "ConnectionState", "connectionState", "connectionChangeListeners", "notifyConnectionChange", "newState", "fn", "configuredTransport", "currentTransport", "streamingTransport", "wsRetryTimer", "networkCheckTimer", "WS_FALLBACK_TIMEOUT", "WS_RETRY_INTERVAL", "PING_TIMEOUT", "MAX_PING_CLOCK_SKEW", "isDevMode", "getPingUrl", "hostname", "isLocal", "isHttps", "port", "protocol", "portSuffix", "checkCaptivePortal", "controller", "timeoutId", "response", "data", "now", "skew", "err", "setupOnlineListeners", "attemptConnection", "getSocketUrl", "reconnect", "connectTimeout", "totalRequestTimeout", "joinKey", "reservedKeys", "handler", "key", "wrapperFn", "a", "b", "path", "body", "wrap", "api", "__socket", "ready", "wsSend", "waitingOn", "aWaitingSend", "receiverArray", "ofTypesOb", "switchToStreaming", "createStreamingTransport", "msg", "type", "processedData", "fetchLinkedResources", "fetchSharedFiles", "fetchErr", "worker", "resolve", "reject", "waiting", "createdAt", "timer", "resultPromise", "streamingSend", "startWsRetry", "tryWebSocket", "isRetry", "ws", "fallbackTimer", "event", "queryId", "jss", "hydratedData", "connectSocket", "findLinkedResources", "obj", "resources", "i", "cleanKey", "hash", "findFileTags", "files", "cleanFileTags", "cleaned", "maxRetries", "cleanedData", "baseUrl", "retries", "backoff", "r", "arrayBuffer", "setValueAtPath", "value", "parts", "current", "cleanLinkedKeys", "clientId", "scheduleNetworkRetry", "proceedWithConnection", "buildClientInterface", "isBinaryData", "getBinaryTag", "generateUploadHash", "char", "processBinaryForUpload", "tag", "processedArray", "allUploads", "itemPath", "uploads", "processedObj", "uploadBinaryData", "queryId", "uploads", "hostname", "isLocal", "isHttps", "port", "protocol", "portSuffix", "baseUrl", "hash", "data", "response", "err", "wsSend", "type", "createdAt", "dirctCall", "rej", "promiseIsLive", "timeLetForReqToBeMade", "totalRequestTimeout", "timer", "processedData", "processBinaryForUpload", "payload", "message", "jss", "messageHash", "replyPromise", "resolve", "reject", "waitingOn", "result", "next", "__socket", "worker", "sender", "ready", "connectTimeout", "errMessage", "waitingOnOpen", "res", "waitingOnOpenThen", "waitingOnOpenCatch", "aWaitingSend", "connectSocket", "buildClientInterface", "wrap", "onTypeStFn", "handlerFn", "ofTypesOb", "receiverArray", "handler", "connectionChangeListeners", "connectionState", "idx", "currentTransport", "reconnect", "ConnectionState", "connect", "connectSocket_default", "client", "connectSocket_default"]
7
7
  }
@@ -1,2 +1,2 @@
1
- (()=>{var De=Object.create;var I=Object.defineProperty;var Re=Object.getOwnPropertyDescriptor;var _e=Object.getOwnPropertyNames;var Le=Object.getPrototypeOf,Me=Object.prototype.hasOwnProperty;var oe=(e,t)=>()=>(e&&(t=e(e=0)),t);var re=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),xe=(e,t)=>{for(var n in t)I(e,n,{get:t[n],enumerable:!0})},Be=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of _e(t))!Me.call(e,r)&&r!==n&&I(e,r,{get:()=>t[r],enumerable:!(o=Re(t,r))||o.enumerable});return e};var F=(e,t,n)=>(n=e!=null?De(Le(e)):{},Be(t||!e||!e.__esModule?I(n,"default",{value:e,enumerable:!0}):n,e));var ae=re((ut,ie)=>{var se="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function ce(e){let t=Math.floor(e/32),n=e%32;return t===0?se[n]:ce(t)+se[n]}function We(e){for(var t=0,n=0;n<e.length;++n)t+=e.charCodeAt(n),t+=t<<10,t^=t>>6;return t+=t<<3,t^=t>>11,(t+(t<<15)&4294967295)>>>0}function Ue(e){return ce(We(e))}ie.exports=Ue});var N=re((dt,ue)=>{function le(e){let t={"[object RegExp]":"R","[object Date]":"D","[object Error]":"E","[object Undefined]":"U","[object Map]":"M","[object Set]":"S"},n=new WeakMap;function o(s,l=""){let p=typeof s,f=t[Object.prototype.toString.call(s)];if(f!==void 0)return f==="D"?[f,s.valueOf()]:f==="E"?[f,[s.name,s.message,s.stack]]:f==="R"?[f,s.toString()]:f==="U"?[f,null]:f==="S"?[f,Array.from(s)]:f==="M"?[f,Object.fromEntries(s)]:[f,JSON.stringify(s)];if(p==="object"&&s!==null){if(c.has(s))return["P",c.get(s)];c.set(s,l);let d=Array.isArray(s),u=d?Array.from(Array(s.length).keys()):Object.keys(s),g=d?[]:{},w=[];for(let h=0;h<u.length;h++){let m=u[h],[y,S]=o(s[m],m);d?(w.push(y),g.push(S)):s[m]!==void 0&&(g[m+(y?`<!${y}>`:"")]=S)}return n.delete(s),d&&w.find(h=>!!h)?[`[${w.join()}]`,g]:["",g]}else return["",s]}let r=[];Array.isArray(e)?r=Array.from(Array(e.length).keys()):r=Object.keys(e);let c=new WeakMap;c.set(e,[]);function i(s,l=[]){let p=typeof s,f=t[Object.prototype.toString.call(s)];if(f!==void 0)return f==="D"?[f,s.valueOf()]:f==="E"?[f,[s.name,s.message,s.stack]]:f==="R"?[f,s.toString()]:f==="U"?[f,null]:f==="S"?[f,Array.from(s)]:f==="M"?[f,Object.fromEntries(s)]:[f,JSON.stringify(s)];if(p==="object"&&s!==null){if(c.has(s))return["P",c.get(s)];c.set(s,l);let d=Array.isArray(s),u=d?Array.from(Array(s.length).keys()):Object.keys(s),g=d?[]:{},w=[];for(let h=0;h<u.length;h++){let m=u[h],[y,S]=i(s[m],[...l,m]);d?(w.push(y),g.push(S)):s[m]!==void 0&&(g[m+(y?`<!${y}>`:"")]=S)}return d&&w.find(h=>!!h)?[`[${w.join()}]`,g]:["",g]}else return["",s]}let a={};for(let s=0;s<r.length;s++){let l=r[s];if(e[l]!==void 0){let[p,f]=i(e[l],[l]);a[l+(p?`<!${p}>`:"")]=f}}return a}function He(e){return JSON.stringify(le(e))}function Ve(e){return fe(JSON.parse(e))}function fe(e){let t={},n=[],o={R:a=>new RegExp(a),D:a=>new Date(a),P:function(a,s){return n.push([a,s]),null},E:([a,s,l])=>{let p;try{if(p=new global[a](s),p instanceof Error)p.stack=l;else throw{}}catch{p=new Error(s),p.name=a,p.stack=l}return p},U:()=>{},S:a=>new Set(a),M:a=>new Map(Object.entries(a))},r=new Map;function c(a,s,l){let p=Array.isArray(this)?this:[];if(s in o)return o[s](l,p);if(Array.isArray(l))if(s&&s.startsWith("[")){let f=s.slice(1,-1).split(","),d=[];for(let u=0;u<l.length;u++){let g=[...p,u],w=c.call(g,u.toString(),f[u],l[u]);d.push(w)}return d}else{let f=[];for(let d=0;d<l.length;d++){let u=c.call([...p,d],"","",l[d]);f.push(u)}return f}else if(typeof l=="object"&&l!==null){if(r.has(l))return r.get(l);r.set(l,{});let f={};for(let d in l){let[u,g]=i(d),w=c.call([...p,u],u,g,l[d]);f[u]=w}return r.set(l,f),f}else return l}function i(a){let s=a.match(/(.+)(<!(.)>)/);if(s)return[s[1],s[3]];let l=a.match(/(.+)(<!!(.+)>)/);if(l)return[l[1],l[3]];let p=a.match(/(.+)(<!\[(.*)>)/);return p?[p[1],"["+p[3]]:[a,void 0]}for(let a in e){let[s,l]=i(a);t[s]=c.call([s],s,l,e[a])}return n.forEach(je.bind(null,t)),t}function je(e,[t,n]){let o=t||[],r=n||[],c=e;for(let a=0;a<o.length;a++)c=c[o[a]];let i=e;for(let a=0;a<r.length-1;a++)i=i[r[a]];return i[r[r.length-1]]=c,e}ue.exports={parse:Ve,stringify:He,encode:le,decode:fe}});function de(){let e=window.location.hostname,n=["localhost","127.0.0.1","[::1]"].includes(e),o=window.location.protocol==="https:",r=n?9010:window.location.port||(o?443:80),c=o?"https":"http",i=n||r!==80&&r!==443?`:${r}`:"";return`${c}://${e}${i}/api/ape/poll`}function Ke(e){let t=[],n=-1,o=0,r=!1,c=!1;for(let a=0;a<e.length;a++){let s=e[a];if(c){c=!1;continue}if(s==="\\"&&r){c=!0;continue}if(s==='"'){r=!r;continue}if(!r){if(s==="{")o===0&&(n=a),o++;else if(s==="}"&&(o--,o===0&&n!==-1)){let l=e.slice(n,a+1);try{t.push(L.default.parse(l))}catch(p){console.error("\u{1F98D} Failed to parse stream message:",p)}n=-1}}}let i=n!==-1?e.slice(n):"";return{messages:t,remaining:i}}function pe(){let e=!1,t=null,n="",o=null,r=()=>{},c=()=>{},i=()=>{},a=()=>{};async function s(){if(!e){e=!0,t=new AbortController;try{let d=await fetch(de(),{method:"GET",credentials:"include",signal:t.signal,headers:{Accept:"application/json"}});if(!d.ok)throw new Error(`Stream connect failed: ${d.status}`);c();let u=d.body.getReader(),g=new TextDecoder;async function w(){for(;e;)try{let{done:h,value:m}=await u.read();if(h){l();return}n+=g.decode(m,{stream:!0});let{messages:y,remaining:S}=Ke(n);n=S;for(let ne of y)ne.type!=="__heartbeat__"&&r(ne)}catch(h){if(h.name==="AbortError")return;console.error("\u{1F98D} Stream read error:",h),l();return}}w()}catch(d){if(d.name==="AbortError")return;console.error("\u{1F98D} Stream connection error:",d),a(d),l()}}}function l(){e&&(o&&clearTimeout(o),o=setTimeout(()=>{e&&s()},500))}async function p(d,u,g){let w={type:d,data:u,createdAt:new Date(g)},h=await fetch(de(),{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:L.default.stringify(w)});if(!h.ok){let y=await h.json().catch(()=>({error:"Unknown error"}));throw new Error(y.error||`Request failed: ${h.status}`)}return L.default.parse(await h.text()).data}function f(){e=!1,o&&(clearTimeout(o),o=null),t&&(t.abort(),t=null),n="",i()}return{connect:s,send:p,close:f,isConnected:()=>e,set onMessage(d){r=d},set onOpen(d){c=d},set onClose(d){i=d},set onError(d){a=d}}}var L,he=oe(()=>{L=F(N())});var Ce={};xe(Ce,{ConnectionState:()=>b,default:()=>lt});function k(e){W!==e&&(W=e,B.forEach(t=>t(e)))}function M(){return typeof window>"u"?!1:["localhost","127.0.0.1","[::1]"].includes(window.location.hostname)}function qe(){let e=window.location.hostname,n=["localhost","127.0.0.1","[::1]"].includes(e),o=window.location.protocol==="https:",r=n?9010:window.location.port||(o?443:80),c=o?"https":"http",i=n||r!==80&&r!==443?`:${r}`:"";return`${c}://${e}${i}/api/ape/ping`}async function Je(){try{let e=new AbortController,t=setTimeout(()=>e.abort(),Fe),n=await fetch(qe(),{cache:"no-store",signal:e.signal});if(clearTimeout(t),!n.ok)return M()&&console.error("\u{1F98D} [DEV] Ping failed: HTTP",n.status),"walled";let o=await n.json();if(o?.ok!==!0)return M()&&console.error("\u{1F98D} [DEV] Ping failed: invalid response",o),"walled";if(typeof o.ts=="number"){let r=Date.now(),c=Math.abs(r-o.ts);if(c>Ne)return M()&&console.error("\u{1F98D} [DEV] Ping failed: timestamp too old/stale (skew:",c,"ms)"),"walled"}return"ok"}catch(e){return M()&&console.error("\u{1F98D} [DEV] Ping failed:",e.message||e),"walled"}}function Ge(){typeof window>"u"||(window.addEventListener("online",()=>{console.log("\u{1F98D} Browser went online, checking network..."),z()}),window.addEventListener("offline",()=>{console.log("\u{1F98D} Browser went offline"),k(b.Offline)}))}function Xe(){let e=window.location.hostname,n=["localhost","127.0.0.1","[::1]"].includes(e),o=window.location.protocol==="https:",r=n?9010:window.location.port||(o?443:80),c=o?"wss":"ws",i=n||r!==80&&r!==443?`:${r}`:"";return`${c}://${e}${i}/api/ape`}function ve(e){return new Proxy(e,Se)}function J(){console.log("\u{1F98D} Switching to HTTP streaming transport"),C="polling",T||(T=pe(),T.onMessage=async e=>{let{err:t,type:n,data:o}=e;R[n]&&R[n].forEach(r=>r({err:t,type:n,data:o})),H.forEach(r=>r({err:t,type:n,data:o}))},T.onOpen=()=>{$=!0,k(b.Connected),console.log("\u{1F98D} HTTP streaming connected"),D.forEach(({type:e,data:t,next:n,err:o,waiting:r,createdAt:c,timer:i})=>{clearTimeout(i);let a=et(e,t,c);r&&a.then(n).catch(o)}),D=[],tt()},T.onClose=()=>{$=!1,k(b.Disconnected)},T.onError=e=>{console.error("\u{1F98D} Streaming error:",e)}),T.connect()}function et(e,t,n){return T.send(e,t,n)}function tt(){A||C==="polling"&&U!=="polling"&&(A=setInterval(()=>{if(C!=="polling"){clearInterval(A),A=null;return}console.log("\u{1F98D} Attempting WebSocket reconnection..."),ke(!0)},be))}function ke(e=!1){let t=new WebSocket(Xe()),n=null;!e&&U==="auto"&&(n=setTimeout(()=>{t.readyState!==WebSocket.OPEN&&(console.log("\u{1F98D} WebSocket timeout, falling back to HTTP streaming"),t.close(),J())},Ie)),t.onopen=()=>{n&&clearTimeout(n),e&&C==="polling"&&(console.log("\u{1F98D} WebSocket reconnected, switching from HTTP streaming"),T&&T.close(),A&&(clearInterval(A),A=null)),C="websocket",P=t,$=!0,k(b.Connected),D.forEach(({type:o,data:r,next:c,err:i,waiting:a,createdAt:s,timer:l})=>{clearTimeout(l);let p=Z(o,r,s);a&&p.then(c).catch(i)}),D=[]},t.onmessage=async function(o){let{err:r,type:c,queryId:i,data:a}=Q.default.parse(o.data);if(i){if(O[i]){if(a&&!r)try{let l=await we(a);O[i](r,l)}catch(l){O[i](l,null)}else O[i](r,a);delete O[i]}else console.error(`\u{1F98D} No matching queryId: ${i}`);return}let s=a;if(a&&!r)try{s=await we(a)}catch(l){console.error("\u{1F98D} Failed to hydrate broadcast data:",l)}R[c]&&R[c].forEach(l=>l({err:r,type:c,data:s})),H.forEach(l=>l({err:r,type:c,data:s}))},t.onerror=function(o){n&&clearTimeout(n),console.error("socket ERROR:",o),!e&&U==="auto"&&!$&&J()},t.onclose=function(o){n&&clearTimeout(n),console.warn("socket disconnect:",o),P=!1,$=!1,C==="websocket"&&(k(b.Disconnected),setTimeout(()=>Te&&_(),500))}}function G(e,t=""){let n=[];if(e==null||typeof e!="object")return n;if(Array.isArray(e)){for(let o=0;o<e.length;o++)n.push(...G(e[o],t?`${t}.${o}`:String(o)));return n}for(let o of Object.keys(e))if(o.endsWith("<!L>")){let r=o.slice(0,-4),c=e[o];n.push({path:t?`${t}.${r}`:r,hash:c,originalKey:o})}else n.push(...G(e[o],t?`${t}.${o}`:o));return n}function ge(e,t,n){let o=t.split("."),r=e;for(let c=0;c<o.length-1;c++)r=r[o[c]];r[o[o.length-1]]=n}function X(e){if(e==null||typeof e!="object")return e;if(Array.isArray(e))return e.map(X);let t={};for(let n of Object.keys(e))if(n.endsWith("<!L>")){let o=n.slice(0,-4);t[o]=e[n]}else t[n]=X(e[n]);return t}async function we(e,t){let n=G(e);if(n.length===0)return e;console.log(`\u{1F98D} Fetching ${n.length} binary resource(s)`);let o=X(e),r=window.location.hostname,c=["localhost","127.0.0.1","[::1]"].includes(r),i=window.location.protocol==="https:",a=c?9010:window.location.port||(i?443:80),s=i?"https":"http",l=c||a!==80&&a!==443?`:${a}`:"",p=`${s}://${r}${l}`;return await Promise.all(n.map(async({path:f,hash:d})=>{try{let u=await fetch(`${p}/api/ape/data/${d}`,{credentials:"include",headers:{"X-Ape-Client-Id":t||""}});if(!u.ok)throw new Error(`Failed to fetch binary resource: ${u.status}`);let g=await u.arrayBuffer();ge(o,f,g)}catch(u){console.error(`\u{1F98D} Failed to fetch binary resource at ${f}:`,u),ge(o,f,null)}})),o}async function z(){if(typeof navigator<"u"&&!navigator.onLine){k(b.Offline);return}if(k(b.Connecting),await Je()==="walled"){k(b.Walled),nt();return}ot()}function nt(){q||(q=setTimeout(()=>{q=null,z()},be))}function ot(){U==="polling"?J():ke(!1)}function _(){return P&&P.readyState!==WebSocket.CLOSED||C==="polling"&&T?.isConnected()||W===b.Connecting||z(),x()}function rt(e){return e==null?!1:e instanceof ArrayBuffer||ArrayBuffer.isView(e)||typeof Blob<"u"&&e instanceof Blob}function st(e){return typeof Blob<"u"&&e instanceof Blob?"B":"A"}function ct(e){let t=0;for(let n=0;n<e.length;n++){let o=e.charCodeAt(n);t=(t<<5)-t+o,t=t&t}return Math.abs(t).toString(36)}function Y(e,t=""){if(e==null)return{processedData:e,uploads:[]};if(rt(e)){let n=st(e),o=ct(t||"root");return{processedData:{__ape_upload__:o},uploads:[{path:t,hash:o,data:e,tag:n}]}}if(Array.isArray(e)){let n=[],o=[];for(let r=0;r<e.length;r++){let c=t?`${t}.${r}`:String(r),{processedData:i,uploads:a}=Y(e[r],c);n.push(i),o.push(...a)}return{processedData:n,uploads:o}}if(typeof e=="object"){let n={},o=[];for(let r of Object.keys(e)){let c=t?`${t}.${r}`:r,{processedData:i,uploads:a}=Y(e[r],c);if(a.length>0&&i?.__ape_upload__){let s=a[a.length-1].tag;n[`${r}<!${s}>`]=i.__ape_upload__}else n[r]=i;o.push(...a)}return{processedData:n,uploads:o}}return{processedData:e,uploads:[]}}async function it(e,t){if(t.length===0)return;let n=window.location.hostname,o=["localhost","127.0.0.1","[::1]"].includes(n),r=window.location.protocol==="https:",c=o?9010:window.location.port||(r?443:80),i=r?"https":"http",a=o||c!==80&&c!==443?`:${c}`:"",s=`${i}://${n}${a}`;console.log(`\u{1F98D} Uploading ${t.length} binary file(s)`),await Promise.all(t.map(async({hash:l,data:p})=>{try{let f=await fetch(`${s}/api/ape/data/${e}/${l}`,{method:"PUT",credentials:"include",headers:{"Content-Type":"application/octet-stream"},body:p});if(!f.ok)throw new Error(`Upload failed: ${f.status}`)}catch(f){throw console.error(`\u{1F98D} Failed to upload binary at ${l}:`,f),f}}))}function x(){return{sender:ve(at),setOnReciver:(e,t)=>{typeof e=="string"?R[e]=[t]:H.includes(e)||H.push(e)},onConnectionChange:e=>(B.push(e),e(W),()=>{let t=B.indexOf(e);t>-1&&B.splice(t,1)}),getTransport:()=>C}}var ye,Q,me,b,W,B,U,C,T,A,q,Ie,be,Fe,Ne,Te,Ye,Qe,Ze,ze,Se,P,$,Z,O,D,H,R,at,lt,Ee=oe(()=>{ye=F(ae()),Q=F(N());he();b={Offline:"offline",Walled:"walled",Disconnected:"disconnected",Connecting:"connecting",Connected:"connected",Closing:"closing"},W=typeof navigator<"u"&&!navigator.onLine?b.Offline:b.Disconnected,B=[];U="auto",C=null,T=null,A=null,q=null,Ie=4e3,be=3e4,Fe=3e3,Ne=6e4;typeof window<"u"&&Ge();Te=!1,Ye=5e3,Qe=1e4,Ze="/",ze=new Set(["on","onConnectionChange","getTransport"]),Se={get(e,t){if(ze.has(t))return e[t];let n=function(o,r){let c=Ze+t,i;return arguments.length===2?(c+=o,i=r):i=o,e(c,i)};return new Proxy(n,Se)}};P=!1,$=!1,Z=!1,O={},D=[],H=[],R={};Z=function(e,t,n,o){let r,c=!1,i=n+Qe-Date.now(),a=setTimeout(()=>{c&&r(new Error("Request Timedout for :"+e))},i),{processedData:s,uploads:l}=Y(t),p={type:e,data:s,createdAt:new Date(n),requestedAt:o?void 0:new Date},f=Q.default.stringify(p),d=(0,ye.default)(f),u=new Promise((h,m)=>{r=m,O[d]=(y,S)=>{clearTimeout(a),u.then=g.bind(u),y?m(y):h(S)},P.send(f),l.length>0&&it(d,l).catch(y=>{console.error("\u{1F98D} Binary upload failed:",y)})}),g=u.then;u.then=h=>(c=!0,u.then=g.bind(u),u.catch=w.bind(u),g.call(u,h));let w=u.catch;return u.catch=h=>(c=!0,u.catch=w.bind(u),u.then=g.bind(u),w.call(u,h)),u};at=(e,t)=>{if(typeof e!="string")throw new Error("Missing Path vaule");let n=Date.now();if($)return Z(e,t,n,!0);let o=n+Ye-Date.now(),r=setTimeout(()=>{let l="Request not sent for :"+e;if(c.waiting)c.err(new Error(l));else throw new Error(l)},o),c={type:e,data:t,next:void 0,err:void 0,waiting:!1,createdAt:n,timer:r},i=new Promise((l,p)=>{c.next=l,c.err=p}),a=i.then,s=i.catch;return i.then=l=>(c.waiting=!0,i.then=a.bind(i),i.catch=s.bind(i),a.call(i,l)),i.catch=l=>(c.waiting=!0,i.catch=s.bind(i),i.then=a.bind(i),s.call(i,l)),D.push(c),P||_(),i};_.autoReconnect=()=>Te=!0;_.ConnectionState=b;me=_;lt=me});var Ae=typeof window<"u"&&typeof document<"u",V=null,E=null,v=[],ee=[],j=[],Oe="disconnected";function K(){return V||(Ae?(V=(async()=>{let e=(await Promise.resolve().then(()=>(Ee(),Ce))).default,t=e();return e.autoReconnect(),t.onConnectionChange(n=>{Oe=n,j.forEach(o=>o(n))}),E=t,ee.forEach(({type:n,handler:o})=>{t.setOnReciver(n,o)}),ee.length=0,v.forEach(({method:n,args:o,resolve:r,reject:c})=>{try{let i=t.sender[n](...o);i&&typeof i.then=="function"?i.then(r).catch(c):r(i)}catch(i){c(i)}}),v.length=0,t})(),V):Promise.resolve(null))}var te=new Proxy({},{get(e,t){if(t==="on")return $e;if(t==="onConnectionChange")return Pe;if(t==="getTransport")return()=>E?.getTransport?.()||null;if(!(t==="then"||t==="catch"))return(...n)=>E?E.sender[t](...n):new Promise((o,r)=>{v.push({method:t,args:n,resolve:o,reject:r}),K()})}});function $e(e,t){E?E.setOnReciver(e,t):(ee.push({type:e,handler:t}),K())}function Pe(e){return j.push(e),e(Oe),E?E.onConnectionChange(e):(K(),()=>{let t=j.indexOf(e);t>-1&&j.splice(t,1)})}Object.defineProperty(te,"on",{value:$e,writable:!1,enumerable:!1,configurable:!1});Object.defineProperty(te,"onConnectionChange",{value:Pe,writable:!1,enumerable:!1,configurable:!1});Ae&&K();var gt=te;})();
1
+ (()=>{var Le=Object.create;var N=Object.defineProperty;var Be=Object.getOwnPropertyDescriptor;var Me=Object.getOwnPropertyNames;var We=Object.getPrototypeOf,Fe=Object.prototype.hasOwnProperty;var ae=(e,t)=>()=>(e&&(t=e(e=0)),t);var le=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports),Ue=(e,t)=>{for(var n in t)N(e,n,{get:t[n],enumerable:!0})},xe=(e,t,n,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let r of Me(t))!Fe.call(e,r)&&r!==n&&N(e,r,{get:()=>t[r],enumerable:!(o=Be(t,r))||o.enumerable});return e};var q=(e,t,n)=>(n=e!=null?Le(We(e)):{},xe(t||!e||!e.__esModule?N(n,"default",{value:e,enumerable:!0}):n,e));var he=le((pt,de)=>{var fe="0123456789ABCDEFGHJKMNPQRSTVWXYZ";function ue(e){let t=Math.floor(e/32),n=e%32;return t===0?fe[n]:ue(t)+fe[n]}function He(e){for(var t=0,n=0;n<e.length;++n)t+=e.charCodeAt(n),t+=t<<10,t^=t>>6;return t+=t<<3,t^=t>>11,(t+(t<<15)&4294967295)>>>0}function Ke(e){return ue(He(e))}de.exports=Ke});var j=le((gt,ye)=>{function pe(e){let t={"[object RegExp]":"R","[object Date]":"D","[object Error]":"E","[object Undefined]":"U","[object Map]":"M","[object Set]":"S"},n=new WeakMap;function o(s,l=""){let h=typeof s,f=t[Object.prototype.toString.call(s)];if(f!==void 0)return f==="D"?[f,s.valueOf()]:f==="E"?[f,[s.name,s.message,s.stack]]:f==="R"?[f,s.toString()]:f==="U"?[f,null]:f==="S"?[f,Array.from(s)]:f==="M"?[f,Object.fromEntries(s)]:[f,JSON.stringify(s)];if(h==="object"&&s!==null){if(c.has(s))return["P",c.get(s)];c.set(s,l);let d=Array.isArray(s),u=d?Array.from(Array(s.length).keys()):Object.keys(s),g=d?[]:{},y=[];for(let p=0;p<u.length;p++){let m=u[p],[w,k]=o(s[m],m);d?(y.push(w),g.push(k)):s[m]!==void 0&&(g[m+(w?`<!${w}>`:"")]=k)}return n.delete(s),d&&y.find(p=>!!p)?[`[${y.join()}]`,g]:["",g]}else return["",s]}let r=[];Array.isArray(e)?r=Array.from(Array(e.length).keys()):r=Object.keys(e);let c=new WeakMap;c.set(e,[]);function i(s,l=[]){let h=typeof s,f=t[Object.prototype.toString.call(s)];if(f!==void 0)return f==="D"?[f,s.valueOf()]:f==="E"?[f,[s.name,s.message,s.stack]]:f==="R"?[f,s.toString()]:f==="U"?[f,null]:f==="S"?[f,Array.from(s)]:f==="M"?[f,Object.fromEntries(s)]:[f,JSON.stringify(s)];if(h==="object"&&s!==null){if(c.has(s))return["P",c.get(s)];c.set(s,l);let d=Array.isArray(s),u=d?Array.from(Array(s.length).keys()):Object.keys(s),g=d?[]:{},y=[];for(let p=0;p<u.length;p++){let m=u[p],[w,k]=i(s[m],[...l,m]);d?(y.push(w),g.push(k)):s[m]!==void 0&&(g[m+(w?`<!${w}>`:"")]=k)}return d&&y.find(p=>!!p)?[`[${y.join()}]`,g]:["",g]}else return["",s]}let a={};for(let s=0;s<r.length;s++){let l=r[s];if(e[l]!==void 0){let[h,f]=i(e[l],[l]);a[l+(h?`<!${h}>`:"")]=f}}return a}function Ve(e){return JSON.stringify(pe(e))}function Ie(e){return ge(JSON.parse(e))}function ge(e){let t={},n=[],o={R:a=>new RegExp(a),D:a=>new Date(a),P:function(a,s){return n.push([a,s]),null},E:([a,s,l])=>{let h;try{if(h=new global[a](s),h instanceof Error)h.stack=l;else throw{}}catch{h=new Error(s),h.name=a,h.stack=l}return h},U:()=>{},S:a=>new Set(a),M:a=>new Map(Object.entries(a))},r=new Map;function c(a,s,l){let h=Array.isArray(this)?this:[];if(s in o)return o[s](l,h);if(Array.isArray(l))if(s&&s.startsWith("[")){let f=s.slice(1,-1).split(","),d=[];for(let u=0;u<l.length;u++){let g=[...h,u],y=c.call(g,u.toString(),f[u],l[u]);d.push(y)}return d}else{let f=[];for(let d=0;d<l.length;d++){let u=c.call([...h,d],"","",l[d]);f.push(u)}return f}else if(typeof l=="object"&&l!==null){if(r.has(l))return r.get(l);r.set(l,{});let f={};for(let d in l){let[u,g]=i(d),y=c.call([...h,u],u,g,l[d]);f[u]=y}return r.set(l,f),f}else return l}function i(a){let s=a.match(/(.+)(<!(.)>)/);if(s)return[s[1],s[3]];let l=a.match(/(.+)(<!!(.+)>)/);if(l)return[l[1],l[3]];let h=a.match(/(.+)(<!\[(.*)>)/);return h?[h[1],"["+h[3]]:[a,void 0]}for(let a in e){let[s,l]=i(a);t[s]=c.call([s],s,l,e[a])}return n.forEach(Ne.bind(null,t)),t}function Ne(e,[t,n]){let o=t||[],r=n||[],c=e;for(let a=0;a<o.length;a++)c=c[o[a]];let i=e;for(let a=0;a<r.length-1;a++)i=i[r[a]];return i[r[r.length-1]]=c,e}ye.exports={parse:Ie,stringify:Ve,encode:pe,decode:ge}});function we(){let e=window.location.hostname,n=["localhost","127.0.0.1","[::1]"].includes(e),o=window.location.protocol==="https:",r=n?9010:window.location.port||(o?443:80),c=o?"https":"http",i=n||r!==80&&r!==443?`:${r}`:"";return`${c}://${e}${i}/api/ape/poll`}function qe(e){let t=[],n=-1,o=0,r=!1,c=!1;for(let a=0;a<e.length;a++){let s=e[a];if(c){c=!1;continue}if(s==="\\"&&r){c=!0;continue}if(s==='"'){r=!r;continue}if(!r){if(s==="{")o===0&&(n=a),o++;else if(s==="}"&&(o--,o===0&&n!==-1)){let l=e.slice(n,a+1);try{t.push(L.default.parse(l))}catch(h){console.error("\u{1F98D} Failed to parse stream message:",h)}n=-1}}}let i=n!==-1?e.slice(n):"";return{messages:t,remaining:i}}function me(){let e=!1,t=null,n="",o=null,r=()=>{},c=()=>{},i=()=>{},a=()=>{};async function s(){if(!e){e=!0,t=new AbortController;try{let d=await fetch(we(),{method:"GET",credentials:"include",signal:t.signal,headers:{Accept:"application/json"}});if(!d.ok)throw new Error(`Stream connect failed: ${d.status}`);c();let u=d.body.getReader(),g=new TextDecoder;async function y(){for(;e;)try{let{done:p,value:m}=await u.read();if(p){l();return}n+=g.decode(m,{stream:!0});let{messages:w,remaining:k}=qe(n);n=k;for(let ie of w)ie.type!=="__heartbeat__"&&r(ie)}catch(p){if(p.name==="AbortError")return;console.error("\u{1F98D} Stream read error:",p),l();return}}y()}catch(d){if(d.name==="AbortError")return;console.error("\u{1F98D} Stream connection error:",d),a(d),l()}}}function l(){e&&(o&&clearTimeout(o),o=setTimeout(()=>{e&&s()},500))}async function h(d,u,g){let y={type:d,data:u,createdAt:new Date(g)},p=await fetch(we(),{method:"POST",credentials:"include",headers:{"Content-Type":"application/json"},body:L.default.stringify(y)});if(!p.ok){let w=await p.json().catch(()=>({error:"Unknown error"}));throw new Error(w.error||`Request failed: ${p.status}`)}return L.default.parse(await p.text()).data}function f(){e=!1,o&&(clearTimeout(o),o=null),t&&(t.abort(),t=null),n="",i()}return{connect:s,send:h,close:f,isConnected:()=>e,set onMessage(d){r=d},set onOpen(d){c=d},set onClose(d){i=d},set onError(d){a=d}}}var L,$e=ae(()=>{L=q(j())});var Ee={};Ue(Ee,{ConnectionState:()=>$,default:()=>dt});function T(e){F!==e&&(F=e,W.forEach(t=>t(e)))}function B(){return typeof window>"u"?!1:["localhost","127.0.0.1","[::1]"].includes(window.location.hostname)}function Ge(){let e=window.location.hostname,n=["localhost","127.0.0.1","[::1]"].includes(e),o=window.location.protocol==="https:",r=n?9010:window.location.port||(o?443:80),c=o?"https":"http",i=n||r!==80&&r!==443?`:${r}`:"";return`${c}://${e}${i}/api/ape/ping`}async function Ye(){try{let e=new AbortController,t=setTimeout(()=>e.abort(),Je),n=await fetch(Ge(),{cache:"no-store",signal:e.signal});if(clearTimeout(t),!n.ok)return B()&&console.error("\u{1F98D} [DEV] Ping failed: HTTP",n.status),"walled";let o=await n.json();if(o?.ok!==!0)return B()&&console.error("\u{1F98D} [DEV] Ping failed: invalid response",o),"walled";if(typeof o.ts=="number"){let r=Date.now(),c=Math.abs(r-o.ts);if(c>Xe)return B()&&console.error("\u{1F98D} [DEV] Ping failed: timestamp too old/stale (skew:",c,"ms)"),"walled"}return"ok"}catch(e){return B()&&console.error("\u{1F98D} [DEV] Ping failed:",e.message||e),"walled"}}function Qe(){typeof window>"u"||(window.addEventListener("online",()=>{console.log("\u{1F98D} Browser went online, checking network..."),oe()}),window.addEventListener("offline",()=>{console.log("\u{1F98D} Browser went offline"),T($.Offline)}))}function Ze(){let e=window.location.hostname,n=["localhost","127.0.0.1","[::1]"].includes(e),o=window.location.protocol==="https:",r=n?9010:window.location.port||(o?443:80),c=o?"wss":"ws",i=n||r!==80&&r!==443?`:${r}`:"";return`${c}://${e}${i}/api/ape`}function nt(e){return new Proxy(e,be)}function X(){console.log("\u{1F98D} Switching to HTTP streaming transport"),A="polling",S||(S=me(),S.onMessage=async e=>{let{err:t,type:n,data:o}=e,r=o;if(o&&!t)try{r=await v(o),r=await Z(r)}catch(c){console.error("\u{1F98D} Failed to hydrate streaming data:",c)}_[n]&&_[n].forEach(c=>c({err:t,type:n,data:r})),x.forEach(c=>c({err:t,type:n,data:r}))},S.onOpen=()=>{O=!0,T($.Connected),console.log("\u{1F98D} HTTP streaming connected"),D.forEach(({type:e,data:t,resolve:n,reject:o,waiting:r,createdAt:c,timer:i})=>{clearTimeout(i);let a=ot(e,t,c);r&&a.then(n).catch(o)}),D=[],rt()},S.onClose=()=>{O=!1,T($.Disconnected)},S.onError=e=>{console.error("\u{1F98D} Streaming error:",e)}),S.connect()}function ot(e,t,n){return S.send(e,t,n)}function rt(){C||A==="polling"&&U!=="polling"&&(C=setInterval(()=>{if(A!=="polling"){clearInterval(C),C=null;return}console.log("\u{1F98D} Attempting WebSocket reconnection..."),Ce(!0)},Te))}function Ce(e=!1){let t=new WebSocket(Ze()),n=null;!e&&U==="auto"&&(n=setTimeout(()=>{t.readyState!==WebSocket.OPEN&&(console.log("\u{1F98D} WebSocket timeout, falling back to HTTP streaming"),t.close(),X())},je)),t.onopen=()=>{n&&clearTimeout(n),e&&A==="polling"&&(console.log("\u{1F98D} WebSocket reconnected, switching from HTTP streaming"),S&&S.close(),C&&(clearInterval(C),C=null)),A="websocket",P=t,O=!0,T($.Connected),D.forEach(({type:o,data:r,resolve:c,reject:i,waiting:a,createdAt:s,timer:l})=>{clearTimeout(l);let h=ne(o,r,s);a&&h.then(c).catch(i)}),D=[]},t.onmessage=async function(o){let{err:r,type:c,queryId:i,data:a}=te.default.parse(o.data);if(i){if(E[i]){if(a&&!r)try{let l=await v(a);l=await Z(l),E[i](r,l)}catch(l){E[i](l,null)}else E[i](r,a);delete E[i]}else console.error(`\u{1F98D} No matching queryId: ${i}`);return}let s=a;if(a&&!r)try{s=await v(a),s=await Z(s)}catch(l){console.error("\u{1F98D} Failed to hydrate broadcast data:",l)}_[c]&&_[c].forEach(l=>l({err:r,type:c,data:s})),x.forEach(l=>l({err:r,type:c,data:s}))},t.onerror=function(o){n&&clearTimeout(n),console.error("socket ERROR:",o),!e&&U==="auto"&&!O&&X()},t.onclose=function(o){n&&clearTimeout(n),console.warn("socket disconnect:",o),P=!1,O=!1,A==="websocket"&&(T($.Disconnected),setTimeout(()=>Ae&&R(),500))}}function G(e,t=""){let n=[];if(e==null||typeof e!="object")return n;if(Array.isArray(e)){for(let o=0;o<e.length;o++)n.push(...G(e[o],t?`${t}.${o}`:String(o)));return n}for(let o of Object.keys(e))if(o.endsWith("<!L>")){let r=o.slice(0,-4),c=e[o];n.push({path:t?`${t}.${r}`:r,hash:c,originalKey:o})}else n.push(...G(e[o],t?`${t}.${o}`:o));return n}function Y(e,t=""){let n=[];if(e==null||typeof e!="object")return n;if(Array.isArray(e)){for(let o=0;o<e.length;o++)n.push(...Y(e[o],t?`${t}.${o}`:String(o)));return n}for(let o of Object.keys(e))if(o.endsWith("<!F>")){let r=o.slice(0,-4),c=e[o];n.push({path:t?`${t}.${r}`:r,hash:c,originalKey:o})}else n.push(...Y(e[o],t?`${t}.${o}`:o));return n}function Q(e){if(e==null||typeof e!="object")return e;if(Array.isArray(e))return e.map(Q);let t={};for(let n of Object.keys(e))if(n.endsWith("<!F>")){let o=n.slice(0,-4);t[o]=e[n]}else t[n]=Q(e[n]);return t}async function Z(e,t=5){let n=Y(e);if(n.length===0)return e;console.log(`\u{1F98D} Fetching ${n.length} shared file(s)`);let o=Q(e),r=window.location.hostname,c=["localhost","127.0.0.1","[::1]"].includes(r),i=window.location.protocol==="https:",a=c?9010:window.location.port||(i?443:80),s=i?"https":"http",l=c||a!==80&&a!==443?`:${a}`:"",h=`${s}://${r}${l}`;return await Promise.all(n.map(async({path:f,hash:d})=>{let u=0,g=100;for(;u<t;)try{let y=await fetch(`${h}/api/ape/data/${d}`,{credentials:"include"});if(!y.ok){if(y.status===404&&u<t-1){u++,await new Promise(w=>setTimeout(w,g)),g*=2;continue}throw new Error(`Failed to fetch shared file: ${y.status}`)}let p=await y.arrayBuffer();H(o,f,p),y.headers.get("X-Ape-Complete")==="1"||console.log(`\u{1F98D} Shared file ${d} still uploading (${y.headers.get("X-Ape-Total-Received")||"?"} bytes)`);break}catch(y){u>=t-1&&(console.error(`\u{1F98D} Failed to fetch shared file at ${f}:`,y),H(o,f,null)),u++,await new Promise(p=>setTimeout(p,g)),g*=2}})),o}function H(e,t,n){let o=t.split("."),r=e;for(let c=0;c<o.length-1;c++)r=r[o[c]];r[o[o.length-1]]=n}function z(e){if(e==null||typeof e!="object")return e;if(Array.isArray(e))return e.map(z);let t={};for(let n of Object.keys(e))if(n.endsWith("<!L>")){let o=n.slice(0,-4);t[o]=e[n]}else t[n]=z(e[n]);return t}async function v(e,t){let n=G(e);if(n.length===0)return e;console.log(`\u{1F98D} Fetching ${n.length} binary resource(s)`);let o=z(e),r=window.location.hostname,c=["localhost","127.0.0.1","[::1]"].includes(r),i=window.location.protocol==="https:",a=c?9010:window.location.port||(i?443:80),s=i?"https":"http",l=c||a!==80&&a!==443?`:${a}`:"",h=`${s}://${r}${l}`;return await Promise.all(n.map(async({path:f,hash:d})=>{try{let u=await fetch(`${h}/api/ape/data/${d}`,{credentials:"include",headers:{"X-Ape-Client-Id":t||""}});if(!u.ok)throw new Error(`Failed to fetch binary resource: ${u.status}`);let g=await u.arrayBuffer();H(o,f,g)}catch(u){console.error(`\u{1F98D} Failed to fetch binary resource at ${f}:`,u),H(o,f,null)}})),o}async function oe(){if(typeof navigator<"u"&&!navigator.onLine){T($.Offline);return}if(T($.Connecting),await Ye()==="walled"){T($.Walled),st();return}ct()}function st(){J||(J=setTimeout(()=>{J=null,oe()},Te))}function ct(){U==="polling"?X():Ce(!1)}function R(){return P&&P.readyState!==WebSocket.CLOSED||A==="polling"&&S?.isConnected()||F===$.Connecting||oe(),M()}function it(e){return e==null?!1:e instanceof ArrayBuffer||ArrayBuffer.isView(e)||typeof Blob<"u"&&e instanceof Blob}function at(e){return typeof Blob<"u"&&e instanceof Blob?"B":"A"}function lt(e){let t=0;for(let n=0;n<e.length;n++){let o=e.charCodeAt(n);t=(t<<5)-t+o,t=t&t}return Math.abs(t).toString(36)}function ee(e,t=""){if(e==null)return{processedData:e,uploads:[]};if(it(e)){let n=at(e),o=lt(t||"root");return{processedData:{__ape_upload__:o},uploads:[{path:t,hash:o,data:e,tag:n}]}}if(Array.isArray(e)){let n=[],o=[];for(let r=0;r<e.length;r++){let c=t?`${t}.${r}`:String(r),{processedData:i,uploads:a}=ee(e[r],c);n.push(i),o.push(...a)}return{processedData:n,uploads:o}}if(typeof e=="object"){let n={},o=[];for(let r of Object.keys(e)){let c=t?`${t}.${r}`:r,{processedData:i,uploads:a}=ee(e[r],c);if(a.length>0&&i?.__ape_upload__){let s=a[a.length-1].tag;n[`${r}<!${s}>`]=i.__ape_upload__}else n[r]=i;o.push(...a)}return{processedData:n,uploads:o}}return{processedData:e,uploads:[]}}async function ft(e,t){if(t.length===0)return;let n=window.location.hostname,o=["localhost","127.0.0.1","[::1]"].includes(n),r=window.location.protocol==="https:",c=o?9010:window.location.port||(r?443:80),i=r?"https":"http",a=o||c!==80&&c!==443?`:${c}`:"",s=`${i}://${n}${a}`;console.log(`\u{1F98D} Uploading ${t.length} binary file(s)`),await Promise.all(t.map(async({hash:l,data:h})=>{try{let f=await fetch(`${s}/api/ape/data/${e}/${l}`,{method:"PUT",credentials:"include",headers:{"Content-Type":"application/octet-stream"},body:h});if(!f.ok)throw new Error(`Upload failed: ${f.status}`)}catch(f){throw console.error(`\u{1F98D} Failed to upload binary at ${l}:`,f),f}}))}function M(){return{sender:nt(ut),setOnReceiver:(e,t)=>{typeof e=="string"?_[e]=[t]:x.includes(e)||x.push(e)},onConnectionChange:e=>(W.push(e),e(F),()=>{let t=W.indexOf(e);t>-1&&W.splice(t,1)}),get transport(){return A}}}var Se,te,ke,$,F,W,U,A,S,C,J,je,Te,Je,Xe,Ae,ze,ve,et,tt,be,P,O,ne,E,D,x,_,ut,dt,Oe=ae(()=>{Se=q(he()),te=q(j());$e();$={Offline:"offline",Walled:"walled",Disconnected:"disconnected",Connecting:"connecting",Connected:"connected",Closing:"closing"},F=typeof navigator<"u"&&!navigator.onLine?$.Offline:$.Disconnected,W=[];U="auto",A=null,S=null,C=null,J=null,je=4e3,Te=3e4,Je=3e3,Xe=6e4;typeof window<"u"&&Qe();Ae=!1,ze=5e3,ve=1e4,et="/",tt=new Set(["on","onConnectionChange","transport"]),be={get(e,t){if(tt.has(t))return e[t];let n=function(o,r){let c=et+t,i;return arguments.length===2?(c+=o,i=r):i=o,e(c,i)};return new Proxy(n,be)}};P=!1,O=!1,ne=!1,E={},D=[],x=[],_={};ne=function(e,t,n,o){let r,c=!1,i=n+ve-Date.now(),a=setTimeout(()=>{c&&r(new Error("Request Timedout for :"+e))},i),{processedData:s,uploads:l}=ee(t),h={type:e,data:s,createdAt:new Date(n),requestedAt:o?void 0:new Date},f=te.default.stringify(h),d=(0,Se.default)(f),u=new Promise((p,m)=>{r=m,E[d]=(w,k)=>{clearTimeout(a),u.then=g.bind(u),w?m(w):p(k)},P.send(f),l.length>0&&ft(d,l).catch(w=>{console.error("\u{1F98D} Binary upload failed:",w)})}),g=u.then;u.then=p=>(c=!0,u.then=g.bind(u),u.catch=y.bind(u),g.call(u,p));let y=u.catch;return u.catch=p=>(c=!0,u.catch=y.bind(u),u.then=g.bind(u),y.call(u,p)),u};ut=(e,t)=>{if(typeof e!="string")throw new Error("Missing Path vaule");let n=Date.now();if(O)return ne(e,t,n,!0);let o=n+ze-Date.now(),r=setTimeout(()=>{let l="Request not sent for :"+e;if(c.waiting)c.reject(new Error(l));else throw new Error(l)},o),c={type:e,data:t,resolve:void 0,reject:void 0,waiting:!1,createdAt:n,timer:r},i=new Promise((l,h)=>{c.resolve=l,c.reject=h}),a=i.then,s=i.catch;return i.then=l=>(c.waiting=!0,i.then=a.bind(i),i.catch=s.bind(i),a.call(i,l)),i.catch=l=>(c.waiting=!0,i.catch=s.bind(i),i.then=a.bind(i),s.call(i,l)),D.push(c),P||R(),i};R.autoReconnect=()=>Ae=!0;R.ConnectionState=$;ke=R;dt=ke});var Pe=typeof window<"u"&&typeof document<"u",K=null,b=null,re=[],se=[],V=[],De="disconnected";function I(){return K||(Pe?(K=(async()=>{let e=(await Promise.resolve().then(()=>(Oe(),Ee))).default,t=e();return e.autoReconnect(),t.onConnectionChange(n=>{De=n,V.forEach(o=>o(n))}),b=t,se.forEach(({type:n,handler:o})=>{t.setOnReceiver(n,o)}),se.length=0,re.forEach(({method:n,args:o,resolve:r,reject:c})=>{try{let i=t.sender[n](...o);i&&typeof i.then=="function"?i.then(r).catch(c):r(i)}catch(i){c(i)}}),re.length=0,t})(),K):Promise.resolve(null))}var ce=new Proxy({},{get(e,t){if(t==="on")return _e;if(t==="onConnectionChange")return Re;if(t==="transport")return b?.transport||null;if(!(t==="then"||t==="catch"))return(...n)=>b?b.sender[t](...n):new Promise((o,r)=>{re.push({method:t,args:n,resolve:o,reject:r}),I()})}});function _e(e,t){b?b.setOnReceiver(e,t):(se.push({type:e,handler:t}),I())}function Re(e){return V.push(e),e(De),b?b.onConnectionChange(e):(I(),()=>{let t=V.indexOf(e);t>-1&&V.splice(t,1)})}Object.defineProperty(ce,"on",{value:_e,writable:!1,enumerable:!1,configurable:!1});Object.defineProperty(ce,"onConnectionChange",{value:Re,writable:!1,enumerable:!1,configurable:!1});Pe&&I();var mt=ce;})();
2
2
  //# sourceMappingURL=api-ape.min.js.map