palbase 0.35.0 → 0.36.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/README.md +10 -4
- package/dist/ai/index.js +2 -2
- package/dist/backend/engine.js +2 -2
- package/dist/backend/env.js +1 -1
- package/dist/backend/index.js +3 -3
- package/dist/backend/stack.js +1 -1
- package/dist/backend/test.js +2 -2
- package/dist/chunks/{ZBKJUKQA.js → 46OHFRCO.js} +1 -1
- package/dist/chunks/{PGH2237Q.js → 7H437WNH.js} +1 -1
- package/dist/chunks/{KBY7IBXO.js → CG4MLOSS.js} +2 -2
- package/dist/chunks/{NOTDQXFX.js → D4FVVF3V.js} +2 -2
- package/dist/chunks/{HMWR5O3Y.js → E4CI4NNS.js} +2 -2
- package/dist/chunks/{S4BXGBZ5.js → FTSLUVFM.js} +2 -2
- package/dist/chunks/{FKGX3BOZ.js → H56DM2K7.js} +1 -1
- package/dist/chunks/{OXEDY6JB.js → IHV64CIO.js} +2 -2
- package/dist/chunks/{ACXA3P2N.js → JWCGOXP2.js} +2 -2
- package/dist/chunks/{CODVONHV.js → KYDXOXBY.js} +2 -2
- package/dist/chunks/{LO57KBUW.js → M5AWMRKL.js} +2 -2
- package/dist/chunks/{C2AFHALD.js → MIGVS67R.js} +1 -1
- package/dist/chunks/{33B3S5RY.js → NIRJK52A.js} +1 -1
- package/dist/chunks/NVD5UXUT.js +22 -0
- package/dist/chunks/{CFJZ3DPG.js → ODKRTA5Q.js} +2 -2
- package/dist/chunks/{TGIVD25Y.js → PIGHUXF4.js} +2 -2
- package/dist/chunks/{ASBRNYVS.js → QBYUSNOL.js} +1 -1
- package/dist/chunks/{BGFOKJRG.js → RSDDSUSD.js} +2 -2
- package/dist/chunks/{AAS47Y5B.js → TJRKN6TT.js} +1 -1
- package/dist/chunks/{6L2MMJA6.js → TV4DBUC7.js} +2 -2
- package/dist/chunks/{2OXYYE3V.js → U567PXWS.js} +2 -2
- package/dist/chunks/{5AY6UR4J.js → UCYI2SR2.js} +2 -2
- package/dist/chunks/{FRUUIOFR.js → UJ6BQKTD.js} +2 -2
- package/dist/cli.js +3 -3
- package/dist/cloud/index.js +2 -2
- package/dist/refuse/ai.js +1 -1
- package/dist/refuse/backend.js +1 -1
- package/dist/refuse/cloud.js +1 -1
- package/dist/refuse/server.js +1 -1
- package/dist/server/index.js +2 -2
- package/dist/server/testing.js +2 -2
- package/dist/web/index.js +2 -2
- package/dist/web/message.js +2 -2
- package/dist/web/palbe.js +2 -2
- package/dist/web/paywall.js +2 -2
- package/dist/web/push-sw.js +1 -1
- package/dist/web/ssr.js +2 -2
- package/dist/web/vite.js +2 -2
- package/package.json +2 -6
- package/types/web/src/calls.d.ts +142 -9
- package/types/web/src/index.d.ts +1 -1
- package/dist/chunks/2YZ33WMV.js +0 -22
- package/dist/web/calls-ui.js +0 -46
- package/types/web/src/calls-ui/index.d.ts +0 -71
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
/*! palbase 0.
|
|
2
|
-
import{a as s,f as a,g as i}from"./
|
|
1
|
+
/*! palbase 0.36.0 — Palbase SDK License (see LICENSE) */
|
|
2
|
+
import{a as s,f as a,g as i}from"./CG4MLOSS.js";import"./QBYUSNOL.js";import"./46OHFRCO.js";import{pathToFileURL as m}from"node:url";import{z as u}from"zod";async function w(e){let t=new Map,n=new Map;for(let r of e){let d=`${r.className}.${r.method}`,o=n.get(r.className);if(o!==void 0&&o!==r.file)throw new Error(`two controllers are named ${r.className} (${o}, ${r.file}): the contract tells routes apart by their class's name \u2014 rename one`);n.set(r.className,r.file),t.set(d,{returns:await h(r),throws:r.throws})}return r=>t.get(`${r.controller.name}.${r.fn}`)}async function h(e){let t=`${e.file} \u2014 ${e.className}.${e.method}`;switch(e.returns.kind){case"void":return{kind:"void"};case"raw":return{kind:"raw"};case"schema":{let r=(await import(m(e.returns.file).href))[e.returns.exportName];if(!c(r))throw new Error(`${t}: its return type names ${e.returns.exportName}, which ${e.returns.file} exports as no schema (a zod, valibot or arktype schema)`);if(i(a(r)))throw new Error(`${t}: ${e.returns.exportName} marks an encrypted field (encrypted()) \u2014 an answer's is encrypt(value) in what the handler returns, its type Encrypted<T>, which the contract reads`);return{kind:"json",schema:r,array:e.returns.array}}case"expression":{let n=new Function("z","encrypted",`return (${e.returns.expression});`)(u,s);if(!c(n))throw new Error(`${t}: the schema made of its return type is not one`);return{kind:"json",schema:n,array:!1}}}}function c(e){return typeof e=="object"&&e!==null&&typeof e["~standard"]?.validate=="function"}export{w as routeContracts};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
/*! palbase 0.
|
|
1
|
+
/*! palbase 0.36.0 — Palbase SDK License (see LICENSE) */
|
|
2
2
|
function o(){let n=globalThis;if(typeof n.document<"u"||n.navigator?.product==="ReactNative")return!0;let t=n.navigator?.userAgent;return typeof t=="string"&&t.startsWith("Mozilla/")}export{o as a};
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
/*! palbase 0.
|
|
1
|
+
/*! palbase 0.36.0 — Palbase SDK License (see LICENSE) */
|
|
2
2
|
var u="X-PoW-Challenge-ID",c="X-PoW-Nonce";function m(e){if(typeof e!="object"||e===null)return null;let t=e;if(t.error!=="pow_required"||typeof t.challenge!="object"||t.challenge===null)return null;let{id:n,prefix:r,difficulty:o}=t.challenge;return typeof n!="string"||typeof r!="string"||typeof o!="number"||!Number.isInteger(o)||o<0?null:{id:n,prefix:r,difficulty:o}}function d(e){return 8*2**e}var s;async function l(){if(s)return s;let e=globalThis;if(e.process?.versions?.node!==void 0||e.process?.versions?.bun!==void 0)try{let r=(await import("node:crypto")).createHash;if(typeof r=="function")return s=o=>new Uint8Array(r("sha256").update(o).digest()),s}catch{}let t=new TextEncoder;return s=async n=>new Uint8Array(await crypto.subtle.digest("SHA-256",t.encode(n))),s}function p(e){let t=0;for(let n of e){if(n===0){t+=8;continue}return t+Math.clz32(n)-24}return t}var w=4096,g=typeof globalThis.setImmediate=="function"?()=>new Promise(e=>globalThis.setImmediate(e)):()=>new Promise(e=>setTimeout(e,0));async function y(e,t={}){if(e.difficulty>24)throw new Error(`proof-of-work: difficulty ${e.difficulty} is above auth's ceiling of 24`);let n=await l(),r=d(e.difficulty),o=Date.now()+(t.timeLimitMs??12e4);for(let i=0;i<r;i++){if(i%w===0&&i>0){if(await g(),t.signal?.aborted)throw t.signal.reason??new DOMException("proof-of-work aborted","AbortError");if(Date.now()>o)throw new Error(`proof-of-work: gave up on difficulty ${e.difficulty} after ${i} attempts`)}let f=n(e.prefix+i),a=f instanceof Uint8Array?f:await f;if(p(a)>=e.difficulty)return{[u]:e.id,[c]:String(i)}}throw new Error(`proof-of-work: no nonce for difficulty ${e.difficulty} within ${r} attempts`)}export{m as a,y as b};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/*! palbase 0.36.0 — Palbase SDK License (see LICENSE) */
|
|
2
|
+
import{e as tt,g as st,h as it}from"./ODKRTA5Q.js";import{h as nt}from"./UCYI2SR2.js";import{a as et}from"./JWCGOXP2.js";import{r as Ye,t as Qe,u as Ze}from"./TJRKN6TT.js";import{b as G,c as K,e as Be,f as Je,i as _e,j as $,k as ze}from"./RSDDSUSD.js";import{a as Xe,b as H}from"./D4FVVF3V.js";import{b as w,d as j}from"./U567PXWS.js";function Qt(r){let e=r,t=e?.body,s=t&&typeof t=="object"?t.reason:void 0;return s==="user_deleted"?"userDeleted":s==="user_banned"?"userBanned":e?.code==="session_expired"||e?.code==="token_expired"?"expired":"revoked"}var T=class extends Error{code="session_changed";constructor(e){super(e),this.name="SessionChangedError"}};function rt(){let r=null;return{load:()=>r,save:e=>{r=e},clear:()=>{r=null},shared:!1}}function at(r){let e=null,t=!0,s=()=>{try{return globalThis.localStorage}catch{return}};return{shared:!0,load(){try{let i=s()?.getItem(r);return i==null?t?null:e:JSON.parse(i)}catch{return e}},save(i){e=i;try{let n=s();if(!n)throw new Error("no storage");n.setItem(r,JSON.stringify(i)),t=!0}catch{t=!1}},clear(){e=null,t=!0;try{s()?.removeItem(r)}catch{}},watch(i){let n=globalThis;if(typeof n.addEventListener!="function")return()=>{};let a=o=>{(o.key===r||o.key===null)&&i()};return n.addEventListener("storage",a),()=>n.removeEventListener?.("storage",a)}}}function Pe(r){try{let e=r.split(".")[1]??"",t=atob(e.replace(/-/g,"+").replace(/_/g,"/").padEnd(Math.ceil(e.length/4)*4,"=")),s=JSON.parse(t).sub;return typeof s=="string"?s:""}catch{return""}}var Zt=6e4,es=15e3;function ts(r,e,t){let s=r?globalThis.navigator?.locks:void 0;return s?s.request(e,t):t()}var B=class{current=null;loaded;inflight=null;endReason=null;listeners=new Set;store;refresher;isRejected;now;lockName;refreshTimeoutMs;mode;constructor(e,t,s,i={}){this.store=e,this.refresher=t,this.isRejected=s,this.now=i.now??Date.now,this.lockName=i.lockName??"palbase.session.refresh",this.refreshTimeoutMs=i.refreshTimeoutMs??es,this.mode=i.refresh??"behind",this.loaded=Promise.resolve(e.load()).then(n=>{this.current=n}),e.watch?.(()=>{this.reconcile()})}async session(){return await this.loaded,this.current}snapshot(){return this.current}onChange(e){return this.listeners.add(e),()=>this.listeners.delete(e)}async set(e,t,s){await this.loaded;let i=t==="TOKEN_REFRESHED"?this.current:null,n={accessToken:e.access_token,refreshToken:e.refresh_token,expiresAt:this.now()+e.expires_in*1e3,userId:s?.id??i?.userId??Pe(e.access_token),user:s??i?.user};return this.current=n,await this.store.save(n),this.emit(t,n),n}async setUser(e,t){await this.loaded,!(!this.current||!t||this.current.userId!==t.userId)&&(this.current={...this.current,user:e},await this.store.save(this.current),this.emit("USER_UPDATED",this.current))}async clear(e,t){await this.loaded;let s=this.current;this.current=null,this.inflight=null;let i=await this.store.load();(!i||!s||i.userId===s.userId)&&await this.store.clear(),s&&(e==="SESSION_EXPIRED"&&(this.endReason=t??"revoked"),this.emit(e,null))}async accessToken(){await this.loaded;let e=this.current;if(!e)return;let t=e.expiresAt-this.now();if(t>Zt)return e.accessToken;if(this.mode==="never")return t>0?e.accessToken:void 0;if(t>0&&this.mode==="behind")return this.refresh().catch(()=>{}),e.accessToken;if(t>0)try{return(await this.refresh()).accessToken}catch(s){if(this.current===e)return e.accessToken;throw s}return(await this.refresh()).accessToken}refresh(){if(this.mode==="never")return Promise.reject(new Error("this client does not renew its session (refresh: 'never'): where the session cannot be written back, the request's middleware renews it"));if(this.inflight)return this.inflight;let e=ts(this.store.shared===!0,this.lockName,async()=>{await this.loaded;let t=this.current;if(!t)throw new T("no session to refresh");let s=await this.adoptStored(t);if(s)return s;try{let i=await this.withTimeout(this.refresher(t.refreshToken));if(this.current?.refreshToken!==t.refreshToken)throw new T("the session changed while it was refreshed");return await this.set(i,"TOKEN_REFRESHED")}catch(i){throw this.isRejected(i)&&this.current?.refreshToken===t.refreshToken&&await this.clear("SESSION_EXPIRED",Qt(i)),i}});return this.inflight=e,e.finally(()=>{this.inflight===e&&(this.inflight=null)}).catch(()=>{}),e}async adoptStored(e){let t=await this.store.load();if(!t)throw this.current=null,this.emit("SIGNED_OUT",null),new T("signed out in another tab");if(t.userId!==e.userId)throw this.current=t,this.emit("SIGNED_OUT",null),this.emit("SIGNED_IN",t),new T("another user signed in in another tab");if(t.refreshToken!==e.refreshToken&&t.expiresAt>=e.expiresAt)return this.current=t,this.emit("TOKEN_REFRESHED",t),t}async reconcile(){await this.loaded;let e=this.current,t=await this.store.load();if(!e){t&&(this.current=t,this.emit("SIGNED_IN",t));return}await this.adoptStored(e).catch(()=>{})}withTimeout(e){let t,s=new Promise((i,n)=>{t=setTimeout(()=>n(new Error(`the refresh did not answer within ${this.refreshTimeoutMs/1e3} s`)),this.refreshTimeoutMs)});return Promise.race([e,s]).finally(()=>clearTimeout(t))}emit(e,t){(e==="SIGNED_IN"||e==="SIGNED_OUT")&&(this.endReason=null);for(let s of this.listeners)try{s(e,t)}catch{}}};var xe=class{state="closed";refusal;logSeq;joinRef=null;listeners=new Map;closers=new Set;joiners=new Set;joinWaiters=[];name;socket;constructor(e,t,s={}){this.name=e,this.socket=t,this.logSeq=s.after}get topic(){return`realtime:${this.name}`}join(){if(this.state==="joined")return Promise.resolve();let e=new Promise((t,s)=>this.joinWaiters.push({resolve:t,reject:s}));return this.state!=="joining"&&this.socket.join(this),e}leave(){this.socket.leave(this)}push(e,t){return this.socket.request(this,e,t)}on(e,t){let s=this.listeners.get(e);return s||this.listeners.set(e,s=new Set),s.add(t),()=>s.delete(t)}onClosed(e){return this.closers.add(e),()=>this.closers.delete(e)}onJoined(e){return this.joiners.add(e),()=>this.joiners.delete(e)}deliver(e,t){e==="broadcast"&&typeof t.seq=="number"&&(this.logSeq=t.seq);for(let s of this.listeners.get(e)??[])try{s(t)}catch{}}settled(e,t){e&&typeof t.log_seq=="number"&&(this.logSeq=t.log_seq),this.state=e?"joined":"refused",this.refusal=e?void 0:t;let s=this.joinWaiters.splice(0);for(let i of s)e?i.resolve():i.reject(new Error(`join ${this.name} refused: ${JSON.stringify(t)}`));if(e)for(let i of[...this.joiners])try{i()}catch{}}closed(e){this.state="closed",this.joinRef=null;let t=this.joinWaiters.splice(0);for(let s of t)s.reject(new Error(`join ${this.name}: ${e}`));for(let s of[...this.closers])try{s()}catch{}}},z=class{ws=null;opening=null;ref=0;channels=new Map;lastJoin=new Map;replies=new Map;heartbeat=null;heartbeatRef=null;reconnectTimer=null;attempts=0;closedByUs=!1;reconnects=0;opts;constructor(e){this.opts=e}channel(e,t){let s=this.channels.get(e);return s||this.channels.set(e,s=new xe(e,this,t)),s}disconnect(){this.closedByUs=!0,this.reconnectTimer&&clearTimeout(this.reconnectTimer),this.reconnectTimer=null,this.stopHeartbeat();let e=this.ws;this.ws=null,this.opening=null,e?.close(1e3);for(let[,t]of this.replies)t("error",{reason:"socket closed"});this.replies.clear();for(let t of this.channels.values())t.closed("the socket was closed");this.lastJoin.clear()}async tokenChanged(){if(!this.ws||this.ws.readyState!==1)return;let e=await this.opts.accessToken();if(e)for(let t of this.channels.values())t.state==="joined"&&this.push(t.joinRef,t.topic,"access_token",{access_token:e})}join(e){e.state="joining",this.open().then(()=>this.sendJoin(e)).catch(t=>e.settled(!1,{reason:t instanceof Error?t.message:String(t)}))}leave(e){e.state==="joined"&&(this.ws?.readyState===1&&this.push(e.joinRef,e.topic,"phx_leave",{}),this.lastJoin.get(e.name)===e&&this.lastJoin.delete(e.name)),e.state="closed",this.channels.delete(e.name)}async request(e,t,s){let i=this.ws;if(this.channels.get(e.name)!==e||e.state!=="joined"||i?.readyState!==1)return{status:"error",response:{reason:"not joined"}};let n=this.nextRef(),a=JSON.stringify([e.joinRef,n,e.topic,t,s]),o=this.awaitReply(n);return i.send(a),o}open(){if(this.ws?.readyState===1)return Promise.resolve();if(this.opening)return this.opening;this.closedByUs=!1;let e=this.opts.webSocket??globalThis.WebSocket,t=`${this.opts.baseUrl.replace(/^http/,"ws")}/realtime/v1/websocket?vsn=2.0.0&apikey=${encodeURIComponent(this.opts.publishableKey)}`,s=new Promise((i,n)=>{let a=new e(t);this.ws=a,a.onopen=()=>{this.attempts=0,this.startHeartbeat(),i()},a.onmessage=o=>this.receive(String(o.data)),a.onerror=()=>n(new Error("the realtime socket could not be opened")),a.onclose=()=>this.dropped(a)});return this.opening=s,s.finally(()=>{this.opening===s&&(this.opening=null)}).catch(()=>{}),s}dropped(e){if(this.ws!==e)return;this.ws=null,this.stopHeartbeat();for(let[,i]of this.replies)i("error",{reason:"socket closed"});this.replies.clear();for(let i of this.channels.values())i.state==="joined"&&(i.state="joining");if(this.closedByUs||![...this.channels.values()].some(i=>i.state==="joining"))return;let t=this.opts.backoff??[500,1e3,2e3,5e3,1e4,3e4],s=t[Math.min(this.attempts,t.length-1)]*(.8+Math.random()*.4);this.attempts++,this.reconnectTimer=J(setTimeout(()=>{this.reconnectTimer=null,this.reconnects++;let i=[...this.channels.values()].filter(n=>n.state==="joining");this.open().then(()=>Promise.all(i.map(n=>this.sendJoin(n)))).catch(()=>{})},s))}async sendJoin(e){let t=await this.opts.accessToken();if(this.channels.get(e.name)!==e||e.state!=="joining")return;let s=this.nextRef();e.joinRef=s;let i=this.awaitReply(s),n={broadcast:{self:!1}};e.logSeq!==void 0&&(n.log={after:e.logSeq}),this.lastJoin.set(e.name,e),this.push(s,e.topic,"phx_join",{access_token:t,config:n},s);let{status:a,response:o}=await i;if(this.channels.get(e.name)!==e||e.state!=="joining"){this.lastJoin.get(e.name)===e&&(this.lastJoin.delete(e.name),a==="ok"&&this.ws?.readyState===1&&this.push(s,e.topic,"phx_leave",{}));return}e.settled(a==="ok",o)}awaitReply(e){return new Promise(t=>{let s=J(setTimeout(()=>{this.replies.delete(e),t({status:"timeout",response:{reason:"no reply"}})},this.opts.replyTimeoutMs??1e4));this.replies.set(e,(i,n)=>{clearTimeout(s),this.replies.delete(e),t({status:i,response:n})})})}receive(e){let t;try{t=JSON.parse(e)}catch{return}if(!Array.isArray(t)||t.length!==5||typeof t[2]!="string"||typeof t[3]!="string")return;let[,s,i,n,a]=t,o=typeof a=="object"&&a!==null?a:{};if(n==="phx_reply"&&typeof s=="string"){if(s===this.heartbeatRef){this.heartbeatRef=null;return}this.replies.get(s)?.(String(o.status),o.response??{});return}let l=[...this.channels.values()].find(d=>d.topic===i);if(l){if(n==="phx_close"){l.state="closed";return}if(n==="phx_error"){l.state="joining",J(setTimeout(()=>this.channels.get(l.name)===l&&l.state==="joining"&&this.ws?.readyState===1&&void this.sendJoin(l),1e3));return}l.deliver(n,o)}}push(e,t,s,i,n=this.nextRef()){this.ws?.send(JSON.stringify([e,n,t,s,i]))}nextRef(){return String(++this.ref)}startHeartbeat(){this.stopHeartbeat(),this.heartbeat=J(setInterval(()=>{if(this.heartbeatRef!==null){this.heartbeatRef=null,this.ws?.close(4e3);return}this.heartbeatRef=this.nextRef(),this.push(null,"phoenix","heartbeat",{},this.heartbeatRef)},this.opts.heartbeatMs??25e3))}stopHeartbeat(){this.heartbeat&&clearInterval(this.heartbeat),this.heartbeat=null,this.heartbeatRef=null}};function J(r){return r.unref?.(),r}var E="X-Palbase-Installation-Secret",Y="X-Palbase-Installation",lt=new WeakMap;function O(r){return lt.get(r)}var dt=new WeakSet;function ct(r){return dt.has(r)}var ss=/^[A-Za-z0-9_-]{43}$/,X=class{id;constructor(e){let t=`palbase.installation.secret.${e}`,s;try{let i=ot()?.getItem(t);i&&ss.test(i)&&(s=i)}catch{}if(!s){dt.add(this),s=ht(crypto.getRandomValues(new Uint8Array(32)));try{ot()?.setItem(t,s)}catch{}}lt.set(this,s),this.id=is(s)}};function is(r){return ht(rs(new TextEncoder().encode(r)).subarray(0,16))}function ot(){try{return globalThis.localStorage}catch{return}}function ht(r){let e="";for(let t of r)e+=String.fromCharCode(t);return btoa(e).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}var ns=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),I=(r,e)=>r>>>e|r<<32-e;function rs(r){let e=new Uint32Array([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]),t=new Uint8Array(Math.ceil((r.length+9)/64)*64);t.set(r),t[r.length]=128;let s=new DataView(t.buffer);s.setUint32(t.length-8,Math.floor(r.length/536870912)),s.setUint32(t.length-4,r.length*8>>>0);let i=new Uint32Array(64);for(let o=0;o<t.length;o+=64){for(let p=0;p<16;p++)i[p]=s.getUint32(o+p*4);for(let p=16;p<64;p++){let y=I(i[p-15],7)^I(i[p-15],18)^i[p-15]>>>3,P=I(i[p-2],17)^I(i[p-2],19)^i[p-2]>>>10;i[p]=i[p-16]+y+i[p-7]+P|0}let[l,d,c,f,g,S,m,h]=e;for(let p=0;p<64;p++){let y=h+(I(g,6)^I(g,11)^I(g,25))+(g&S^~g&m)+ns[p]+i[p]|0,P=(I(l,2)^I(l,13)^I(l,22))+(l&d^l&c^d&c)|0;h=m,m=S,S=g,g=f+y|0,f=c,c=d,d=l,l=y+P|0}e[0]+=l,e[1]+=d,e[2]+=c,e[3]+=f,e[4]+=g,e[5]+=S,e[6]+=m,e[7]+=h}let n=new Uint8Array(32),a=new DataView(n.buffer);for(let o=0;o<8;o++)a.setUint32(o*4,e[o]);return n}var os=30*6e4,ut=1e3,ls=100,ds=60*1024,Q=()=>globalThis.crypto?.randomUUID?globalThis.crypto.randomUUID():`${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;function L(){try{return globalThis.localStorage}catch{return}}var ee=class{api;closingApi;perfApi;closingPerfApi;flushMs;flushAt;now;anonKey;sessionKey;onceKey;events=[];samples=[];timer;memoryAnon;memorySession;memoryOnce;appVersion;stopAuto;session;consent;identifyPending=!1;listeners=new Set;people={set:e=>this.person({set:e}),setOnce:e=>this.person({set_once:e}),unset:e=>this.person({unset:[...e]}),add:e=>this.person({add:e})};constructor(e,t,s,i,n,a,o={}){this.session=s,this.consent=i;let l={send:c=>e.send(this.granted("analytics")?{...c,headers:{...c.headers,[Y]:n.id}}:c)};this.api=G.client(l);let d={send:c=>(this.granted("analytics")?e:t).send(c)};this.perfApi=G.client(d),this.closingApi=G.client({send:c=>l.send({...c,keepalive:!0})}),this.closingPerfApi=G.client({send:c=>d.send({...c,keepalive:!0})}),this.flushMs=o.flushMs??5e3,this.flushAt=o.flushAt??20,this.now=o.now??Date.now,this.anonKey=`palbase.analytics.anonymous.${a}`,this.sessionKey=`palbase.analytics.session.${a}`,this.onceKey=`palbase.analytics.once.${a}`,s.onChange(c=>{c==="SIGNED_IN"?(this.identifyPending=!0,this.soon()):c==="SIGNED_OUT"&&(this.identifyPending=!1,this.reset())}),i.onChange((c,f)=>{f!=="granted"&&(c==="analytics"?(this.events=[],this.identifyPending=!1,this.samples=this.samples.map(Te),this.reset()):c==="performance"&&(this.samples=[]))})}capture(e,t){for(let i of this.listeners)i(e,t);if(!this.granted("analytics"))return;let s=this.now();this.hold({event:e,distinct_id:this.distinctId(),properties:t,timestamp:s,session_id:this.sessionId(s),...this.appVersion?{app_version:this.appVersion}:{}})}captureOnce(e,t,s){if(!this.granted("analytics"))return;let i=this.sessionId(this.now()),n=this.readOnce(),a=n?.session===i?n.keys:[];a.includes(e)||(this.writeOnce({session:i,keys:[...a,e].slice(-500)}),this.capture(t,s))}readOnce(){try{let e=L()?.getItem(this.onceKey);if(e)return JSON.parse(e)}catch{}return this.memoryOnce}writeOnce(e){this.memoryOnce=e;try{L()?.setItem(this.onceKey,JSON.stringify(e))}catch{}}onEvent(e){return this.listeners.add(e),()=>this.listeners.delete(e)}page(e={}){let t=globalThis.location,s=globalThis.document,i=e.url??(t?`${t.origin}${V(t.pathname)}`:"");if(!i)return;let n=e.referrer??gs(s?.referrer);this.capture("$pageview",{...e.properties,url:i,...e.title??s?.title?{title:e.title??s?.title}:{},...n?{referrer:n}:{}})}async identify(e){this.identifyPending=!1;let t=this.session.snapshot()?.userId;!t||!this.granted("analytics")||(await this.flush(),await this.sendIdentify(this.api,t,e))}async sendIdentify(e,t,s){try{await e.identify({body:{distinct_id:t,anonymous_id:this.anonymousId(),traits:s,timestamp:this.now(),sent_at:this.now()}})}catch{}}reset(){this.memoryAnon=void 0,this.memorySession=void 0,this.memoryOnce=void 0;try{L()?.removeItem(this.anonKey),L()?.removeItem(this.sessionKey),L()?.removeItem(this.onceKey)}catch{}}async flush(e=!1){this.timer&&clearTimeout(this.timer),this.timer=void 0,this.granted("analytics")||(this.events=[]),this.granted("performance")?this.granted("analytics")||(this.samples=this.samples.map(Te)):this.samples=[];let t=e?this.closingApi:this.api,s=e?this.closingPerfApi:this.perfApi,i=this.now(),n=this.session.snapshot()?.userId;for(this.identifyPending&&n&&this.granted("analytics")&&(this.identifyPending=!1,await this.sendIdentify(t,n));this.events.length>0;){let a=this.take(this.events,e);try{await t.batch({body:{events:a.map(o=>({...o,sent_at:i}))}})}catch{}}for(;this.samples.length>0;){let a=this.take(this.samples,e);try{await s.sendPerf({body:{items:a}})}catch{}}}start(e={}){this.stopAuto?.(),this.appVersion=e.appVersion;let t=globalThis;if(typeof t.addEventListener!="function"||typeof globalThis.document>"u")return()=>{};let s=[];e.pageViews!==!1&&s.push(this.watchPages(t)),e.webVitals!==!1&&s.push(us((a,o)=>this.sample("web_vital",a,o))),e.network!==!1&&s.push(this.watchFetch(t));let i=()=>{document.visibilityState==="hidden"&&this.flush(!0)},n=()=>{this.flush(!0)};return document.addEventListener("visibilitychange",i),t.addEventListener("pagehide",n),s.push(()=>{document.removeEventListener("visibilitychange",i),t.removeEventListener("pagehide",n)}),this.stopAuto=()=>{for(let a of s.splice(0))a();this.stopAuto=void 0},this.stopAuto}granted(e){return this.consent.state(e)==="granted"}async person(e){if(!this.granted("analytics"))return;let t=this.session.snapshot()?.userId,s=this.now();try{await this.api.setPersonProperties({body:{...e,...t?{}:{distinct_id:this.anonymousId()},timestamp:s,sent_at:s}})}catch{}}hold(e){this.events.length>=ut&&this.events.shift(),this.events.push(e),this.soon()}sample(e,t,s,i={}){if(!this.granted("performance"))return;this.samples.length>=ut&&this.samples.shift();let n={row_id:Q(),trace_type:e,name:t,value:Math.max(0,s),timestamp:this.now(),...i};this.samples.push(this.granted("analytics")?{...n,distinct_id:this.distinctId()}:Te(n)),this.soon()}soon(){if(this.events.length+this.samples.length>=this.flushAt){this.flush();return}this.timer||(this.timer=setTimeout(()=>{this.flush()},this.flushMs),this.timer.unref?.())}take(e,t){let s=e.splice(0,ls);if(!t)return s;for(;s.length>1&&JSON.stringify(s).length>ds;)e.unshift(s.pop());return s}distinctId(){return this.session.snapshot()?.userId??this.anonymousId()}anonymousId(){let e=L();try{let t=e?.getItem(this.anonKey);if(t)return t;let s=`anon_${Q()}`;if(e?.setItem(this.anonKey,s),e?.getItem(this.anonKey)===s)return s}catch{}return this.memoryAnon??=`anon_${Q()}`,this.memoryAnon}sessionId(e){let t=L(),s=this.memorySession;try{let n=t?.getItem(this.sessionKey);n&&(s=JSON.parse(n))}catch{}let i=s&&e-s.last<os?{id:s.id,last:e}:{id:`ses_${Q()}`,last:e};this.memorySession=i;try{t?.setItem(this.sessionKey,JSON.stringify(i))}catch{}return i.id}watchPages(e){let t="",s=()=>{let o=`${e.location.origin}${e.location.pathname}`;if(o===t)return;t=o;let l=`${e.location.origin}${V(e.location.pathname)}`;setTimeout(()=>this.page({url:l}),0)},i=e.history,n=i.pushState.bind(i),a=i.replaceState.bind(i);return i.pushState=(...o)=>{n(...o),s()},i.replaceState=(...o)=>{a(...o),s()},e.addEventListener("popstate",s),s(),()=>{i.pushState=n,i.replaceState=a,e.removeEventListener("popstate",s)}}watchFetch(e){let t=e.fetch;if(typeof t!="function")return()=>{};let s=async(i,n)=>{let a=performance.now(),o=i instanceof Request?i:void 0,l=(n?.method??o?.method??"GET").toUpperCase(),d;try{d=new URL(o?.url??String(i),e.location.href)}catch{d=void 0}let c=!!d&&d.pathname.startsWith("/analytics/")||ps(n?.headers??o?.headers);try{let f=await t(i,n);return d&&!c&&this.sample("network",`${l} ${d.origin}${V(d.pathname)}`,performance.now()-a,{attrs:{status:String(f.status)},...f.headers.get("x-request-id")?{request_id:f.headers.get("x-request-id")}:{}}),f}catch(f){throw d&&!c&&this.sample("network",`${l} ${d.origin}${V(d.pathname)}`,performance.now()-a,{attrs:{status:"0"}}),f}};return e.fetch=s,()=>{e.fetch===s&&(e.fetch=t)}}};function Te(r){let{distinct_id:e,request_id:t,...s}=r;return s}var cs=r=>r.entryType==="layout-shift"&&"value"in r&&"hadRecentInput"in r,hs=r=>r.entryType==="event"||r.entryType==="first-input";function Z(r,e){if(!(typeof PerformanceObserver>"u"))try{let t=new PerformanceObserver(s=>e(s.getEntries()));return t.observe({type:r,buffered:!0}),t}catch{return}}function us(r){if(typeof document>"u"||typeof performance>"u"||typeof performance.getEntriesByType!="function")return()=>{};let e=0,t=0,s=0,i=[Z("largest-contentful-paint",d=>{for(let c of d)e=Math.max(e,c.startTime)}),Z("layout-shift",d=>{for(let c of d)cs(c)&&!c.hadRecentInput&&(t+=c.value)}),Z("event",d=>{for(let c of d)hs(c)&&(s=Math.max(s,c.duration))}),Z("paint",d=>{for(let c of d)c.name==="first-contentful-paint"&&r("FCP",c.startTime)})],n=performance.getEntriesByType("navigation")[0];n&&n.responseStart>0&&r("TTFB",n.responseStart);let a=!1,o=()=>{a||(a=!0,e>0&&r("LCP",e),r("CLS",t),s>0&&r("INP",s))},l=()=>{document.visibilityState==="hidden"&&o()};return document.addEventListener("visibilitychange",l),()=>{o(),document.removeEventListener("visibilitychange",l);for(let d of i)d?.disconnect()}}function ps(r){if(!r)return!1;try{return new Headers(r).has("next-router-prefetch")}catch{return!1}}var fs=/^[a-z][a-z0-9_-]{0,31}$/;function V(r){return r.split("/").map(e=>{if(e==="")return e;let t=e.split(";",1)[0],s=t.toLowerCase();return fs.test(s)&&(s.match(/\d/g)?.length??0)<=2&&t.slice(1)===s.slice(1)&&s.split(/[-_]/).every(n=>n.length<=16)?s:":id"}).join("/")}function gs(r){if(!r)return"";try{let e=new URL(r);return`${e.origin}${V(e.pathname)}`}catch{return V(r.split(/[?#]/,1)[0]??"")}}var _t=/^custom\.[a-z0-9_]{1,48}$/,ms=/^[a-z][a-z0-9_]{0,63}$/,pt=r=>ms.test(r)||_t.test(r),vs=50,ft=[5e3,3e4,12e4,6e5],ys=100,se=class{userApi;deviceApi;session;socket;ref;installation;start;textVersion;customKeys;storeKey;now;kept;listeners=new Set;engaged=!1;platformKeys;watch;sending;sendAgain=!1;retryTimer;retries=0;readFor;stale=!1;lastW=0;lastChosen=0;gpc=globalThis.navigator?.globalPrivacyControl===!0;constructor(e){let t=e.options??{};for(let[l,d]of Object.entries(t.start??{})){if(!pt(l))throw new TypeError(`consent.start: ${JSON.stringify(l)} is not a consent key (a platform key, or custom.<name>)`);if(d!=="granted"&&d!=="denied")throw new TypeError(`consent.start.${l} is granted or denied`)}for(let l of t.customKeys??[])if(!_t.test(l))throw new TypeError(`consent.customKeys: ${JSON.stringify(l)} is not custom.<name> (a-z, 0-9 and _, 48 at most)`);if(t.textVersion!==void 0&&(t.textVersion===""||t.textVersion.length>64))throw new TypeError("consent.textVersion: 1 to 64 characters");this.userApi=e.userApi,this.deviceApi=e.deviceApi,this.session=e.session,this.socket=e.socket,this.ref=e.ref,this.installation=e.installation,this.start={...t.start},this.textVersion=t.textVersion,this.customKeys=[...t.customKeys??[]],this.storeKey=`palbase.consent.${e.origin}.${e.installation.id}`,this.now=e.now??Date.now;let s=this.load(),i=()=>ct(this.installation)?{}:{unknown:{on:!0,w:this.stamp()}},n={whose:null,install:this.installation.id,choices:{},unsent:[]};typeof s!="object"?this.kept={...n,...s==="unreadable"?{unknown:{on:!0,w:this.stamp()}}:i()}:s.whose==null&&s.install!==void 0&&s.install!==this.installation.id?this.kept={...n,unsent:s.unsent.filter(l=>l.user!==null),...s.keys?{keys:s.keys}:{},...i()}:this.kept=s,e.session.onChange((l,d)=>{this.engaged&&(l==="SIGNED_IN"&&d?this.signedIn(d):(l==="SIGNED_OUT"||l==="SESSION_EXPIRED")&&this.signedOut())});let a=globalThis;typeof a.addEventListener=="function"&&(a.addEventListener("storage",l=>{(l.key===this.storeKey||l.key===null)&&this.reload()}),a.addEventListener("online",()=>{this.engaged&&this.send()}));let o=this.kept;(e.options!==void 0||s!=="empty"&&(o.unknown?.on||o.unsent.length>0||o.link!==void 0||Object.keys(o.choices).length>0))&&this.engage()}async keys(){return this.engage(),[...(await this.platform()).map(t=>({key:t.key,category:t.category,title:{...t.title},description:{...t.description},ads:t.ads})),...this.customKeys.map(t=>({key:t,category:"custom",title:{},description:{},ads:!1}))]}state(e){if(x(this.kept)!==this.holder()||this.gpcRefuses(e))return"denied";let t=vt(this.kept,e);return t&&t.state!=="unset"?t.state:this.kept.unknown?.on?"denied":this.start[e]}owesRead(){return this.stale||this.kept.unknown?.on===!0||x(this.kept)!==this.holder()||Object.values(this.kept.choices).some(e=>e.provisional)}holder(){let e=this.session.snapshot()?.userId;return e?`user:${e}`:`device:${this.installation.id}`}lastDeniedAt(e){let t=this.kept.choices[e]?.last_denied_at;return t?new Date(t):void 0}set(e,t){this.setMany({[e]:t})}setMany(e){let t=Object.entries(e);for(let[a,o]of t){if(!pt(a))throw new TypeError(`${JSON.stringify(a)} is not a consent key (a platform key, or custom.<name>)`);if(o!=="granted"&&o!=="denied")throw new TypeError(`${a}: a choice is granted or denied`)}if(t.length===0)return;this.engage();let s=this.chosenAt(),i=this.session.snapshot()?.userId??null,n=this.states();for(let[a,o]of t)this.queue({key:a,state:o,source:"app",chosen_at:s,user:i,...this.textVersion!==void 0?{text_version:this.textVersion}:{}});this.commit(n),this.send()}onChange(e){return this.listeners.add(e),()=>this.listeners.delete(e)}async region(){this.engage();let e=await this.subject();if(this.readFor!==e)try{await this.read(e)}catch(t){if(!this.kept.region)throw t}return this.kept.region}async needsAsking(e){this.engage();let t=await this.subject();this.readFor!==t&&await this.read(t).catch(()=>{});let s=e??(await this.keys()).map(l=>l.key),i=await this.platform().catch(()=>this.kept.keys??[]),n=new Set(i.filter(l=>l.ads).map(l=>l.key)),a=this.kept.region?.jurisdiction==="us",o=new Date(this.now());return o.setUTCMonth(o.getUTCMonth()-12),s.filter(l=>{let d=this.kept.choices[l];return a&&n.has(l)&&d?.last_denied_at!==void 0&&Date.parse(d.last_denied_at)>o.getTime()?!1:!d||d.state==="unset"?!0:this.textVersion!==void 0&&d.source==="app"&&d.text_version!==this.textVersion})}engage(){this.engaged||(this.engaged=!0,this.session.session().then(e=>{e&&!this.watch&&this.follow(e),this.send(),this.refuseByGpc()}))}async subject(){return(await this.session.session())?.userId??null}secret(){return{[E]:O(this.installation)}}platform(){return this.platformKeys??=this.deviceApi.listConsentKeys().then(e=>(this.kept={...this.kept,keys:e.data.keys},this.commit(),e.data.keys),e=>{if(this.platformKeys=void 0,this.kept.keys)return this.kept.keys;throw e}),this.platformKeys}async read(e){let s=(await(e===null?this.deviceApi:this.userApi(e)).getConsents({query:{installation_id:this.installation.id},headers:this.secret()})).data;this.adopt(s,e)}adopt(e,t,s=[]){if(this.kept={...this.kept,region:e.region},(this.session.snapshot()?.userId??null)!==t){this.commit();return}let i=this.states(),n={};for(let h of e.choices)n[h.key]={state:h.state,source:h.source,chosen_at:h.chosen_at,...h.text_version!==void 0?{text_version:h.text_version}:{},...h.last_denied_at!==void 0?{last_denied_at:h.last_denied_at}:{}};let a=s.filter(h=>n[h.key]?.state!==h.state||Date.parse(n[h.key]?.chosen_at??"")!==Date.parse(h.chosen_at)).map(h=>A(h.key,h)),l=x(this.kept)===(t===null?`device:${this.installation.id}`:`user:${t}`)?Object.entries(this.kept.choices).filter(([,h])=>h.provisional).map(([h,p])=>A(h,p)):[];if(a.length+l.length>0&&(this.kept={...this.kept,void:D([...this.kept.void??[],...a,...l])}),t===null&&this.kept.resetAt!==void 0)for(let[h,p]of Object.entries(n))Date.parse(p.chosen_at)<this.kept.resetAt&&delete n[h];let d=new Set(Object.entries(n).map(([h,p])=>A(h,p))),c=(this.kept.void??[]).filter(h=>d.has(h));c.length>0&&(this.kept={...this.kept,unvoid:D([...this.kept.unvoid??[],...c])});let f=Pt(this.kept),g;if(x(this.kept)!==(t===null?`device:${this.installation.id}`:`user:${t}`))g=n;else{g={};for(let h of[...new Set([...Object.keys(this.kept.choices),...Object.keys(n)])].sort()){let p=this.kept.choices[h],y=p&&!p.provisional&&!f.has(A(h,p))?p:void 0,P=n[h],R=P&&(!y||Date.parse(P.chosen_at)>=Date.parse(y.chosen_at))?P:y;R&&(g[h]=R)}}for(let h of this.kept.unsent){if(h.user!==null&&h.user!==t||h.user===null&&h.device!==void 0&&h.device!==this.installation.id||h.user===null&&t!==null)continue;let p=g[h.key];p&&Date.parse(p.chosen_at)>Date.parse(h.chosen_at)||(g[h.key]=gt(h,p))}let{install:S,...m}=this.kept;this.kept={...m,whose:t,...t===null?{install:this.installation.id}:{},choices:g,unknown:{on:!1,w:this.stamp()}},this.readFor=t,this.stale=!1,this.commit(i),this.refuseByGpc()}async refused(e,t,s){let i=t===e&&x(this.kept)===(t===null?`device:${this.installation.id}`:`user:${t}`),n=D([...this.kept.void??[],...s.map(l=>A(l.key,l))]);if(!i){this.kept={...this.kept,void:n},this.commit();return}let a=this.states(),o={...this.kept.choices};for(let l of s){if(this.kept.unsent.some(c=>c.key===l.key&&(c.user===null||c.user===e)&&Date.parse(c.chosen_at)>Date.parse(l.chosen_at)))continue;let d=o[l.key];o[l.key]={state:"denied",source:"app",chosen_at:l.chosen_at,...d?.last_denied_at!==void 0?{last_denied_at:d.last_denied_at}:{},provisional:!0}}this.kept={...this.kept,choices:o,void:n},this.commit(a);try{await this.read(e)}catch{this.stale=!0}}queue(e){let t=e.user===null?{...e,device:this.installation.id}:e,s=x(this.kept)===(t.user===null?`device:${this.installation.id}`:`user:${t.user}`);this.kept={...this.kept,unsent:xt([...this.kept.unsent,t]),...s?{choices:{...this.kept.choices,[t.key]:gt(t,this.kept.choices[t.key])}}:{}}}send(){if(this.sendAgain=!0,this.sending)return;let e=(async()=>{for(;this.sendAgain;)this.sendAgain=!1,await this.sendUnsent()||(this.sendAgain=!1)})();this.sending=e,e.finally(()=>{this.sending===e&&(this.sending=void 0)})}async sendUnsent(){this.retryTimer&&clearTimeout(this.retryTimer),this.retryTimer=void 0;let e=this.session.snapshot()?.userId??null;try{e=await this.subject();let t=await this.sendOf(null,e);if(e!==null&&(this.kept.link===e||t)){let s;try{s=(await this.userApi(e).linkConsents({headers:this.secret(),body:{installation_id:this.installation.id}})).data}catch(i){if(!bt(i))throw i}if(this.kept.link===e){let{link:i,...n}=this.kept;this.kept=n,this.commit()}if(s)this.adopt(s,e);else{let i=this.states();this.kept={...this.kept,unknown:{on:!0,w:this.stamp()}},this.commit(i)}}if(e!==null&&await this.sendOf(e,e),this.owesRead()&&(await this.read(e),this.owesRead()))throw new Error("the choices are not read yet");return this.retries=0,!0}catch{return(this.session.snapshot()?.userId??null)!==e?(this.sendAgain=!0,!0):(this.retryLater(),!1)}}async sendOf(e,t){let s=!1;for(;;){let i=this.nextGroup(e);if(i.length===0)return s;let n=i[0],a=e===null?this.deviceApi:this.userApi(e),o;try{o=(await a.chooseConsents({headers:this.secret(),body:{installation_id:this.installation.id,...n.source==="gpc"?{source:"gpc"}:{},...n.text_version!==void 0?{text_version:n.text_version}:{},choices:i.map(l=>({key:l.key,state:l.state,chosen_at:l.chosen_at}))}})).data}catch(l){if(!bt(l))throw l;if(i.length>1){this.kept={...this.kept,unsent:this.kept.unsent.map(d=>i.some(c=>wt(c,d))?{...d,alone:!0}:d)},this.commit();continue}}this.kept={...this.kept,unsent:this.kept.unsent.filter(l=>!i.some(d=>wt(d,l))),done:D([...this.kept.done??[],...i.map(ie)])},this.commit(),o?(s=!0,e===t&&this.adopt(o,e,i)):await this.refused(t,e,i)}}nextGroup(e){let t=this.kept.unsent.filter(a=>a.user===e&&(e!==null||(a.device??this.installation.id)===this.installation.id)),s=t[0];if(!s)return[];let i=[],n=new Set;if(s.alone)return[s];for(let a of t)if(!n.has(a.key)&&(n.add(a.key),!(a.alone||a.source!==s.source||a.text_version!==s.text_version)&&(i.push(a),i.length===vs)))break;return i}retryLater(){if(this.retryTimer)return;let e=ft[Math.min(this.retries,ft.length-1)];this.retries++,this.retryTimer=setTimeout(()=>{this.retryTimer=void 0,this.send()},e),this.retryTimer.unref?.()}signedIn(e){this.readFor=void 0,this.kept={...this.kept,link:e.userId},this.commit(),this.follow(e),this.send()}signedOut(){this.unfollow(),this.readFor=void 0;let e=this.states(),t=this.chosenAt(),s=new Set([...Object.entries(this.kept.choices).filter(([,o])=>o.state!=="unset").map(([o])=>o),...this.kept.unsent.filter(o=>o.user===null&&(o.device??this.installation.id)===this.installation.id).map(o=>o.key),...Object.keys(this.start),...this.customKeys,...(this.kept.keys??[]).map(o=>o.key)]),i={};for(let[o,l]of Object.entries(this.kept.choices))i[o]={state:"unset",source:"app",chosen_at:t,...l.last_denied_at!==void 0?{last_denied_at:l.last_denied_at}:{}};let n=o=>o.user===null&&(o.device??this.installation.id)===this.installation.id,a=this.kept.unsent.filter(n);this.kept={whose:null,install:this.installation.id,resetAt:Date.parse(t),choices:i,unsent:this.kept.unsent.filter(o=>!n(o)),...this.kept.void?{void:this.kept.void}:{},...this.kept.unvoid?{unvoid:this.kept.unvoid}:{},done:D([...this.kept.done??[],...a.map(ie)]),...this.kept.region?{region:this.kept.region}:{},...this.kept.keys?{keys:this.kept.keys}:{},...this.kept.gpc?{gpc:this.kept.gpc}:{},...this.kept.unknown?{unknown:this.kept.unknown}:{}};for(let o of s)this.queue({key:o,state:"unset",source:"app",chosen_at:t,user:null});this.commit(e),this.send(),this.refuseByGpc()}follow(e){this.unfollow();let t=this.socket.channel(`consents:${this.ref}:${e.userId}`),s={userId:e.userId,channel:t,off:()=>{},version:-1},i=[t.on("broadcast",n=>{n.event==="changed"&&this.changed(s,Me(n.payload))}),t.on("state_snapshot",n=>this.held(s,Me(St(n.entries)))),t.on("state_diff",n=>this.held(s,Me(St(n.set))))];s.off=()=>i.forEach(n=>n()),this.watch=s,t.join().catch(()=>{})}unfollow(){let e=this.watch;e&&(this.watch=void 0,e.off(),e.channel.leave())}held(e,t){t!==void 0&&this.changed(e,t)}changed(e,t){if(this.watch===e){if(t!==void 0){if(t<=e.version)return;e.version=t}this.read(e.userId).catch(()=>{this.watch===e&&(this.stale=!0,this.retryLater())})}}gpcRefuses(e){if(!this.gpc||!(this.kept.keys??[]).some(n=>n.key===e&&n.ads))return!1;let t=vt(this.kept,e);if(t?.state==="denied")return!1;let s=this.kept.gpc?.[x(this.kept)],i=s!==void 0&&(this.kept.whose!=null||s>=(this.kept.resetAt??0));return!(t?.state==="granted"&&t.source==="app"&&i&&Date.parse(t.chosen_at)>s)}async refuseByGpc(){if(!this.gpc||x(this.kept)!==this.holder())return;let e;try{e=await this.platform()}catch{return}if(x(this.kept)!==this.holder())return;let t=this.session.snapshot()?.userId??null,s=e.filter(a=>a.ads&&this.gpcRefuses(a.key)&&!this.kept.unsent.some(o=>o.key===a.key&&o.source==="gpc"&&o.user===t));if(s.length===0)return;let i=this.chosenAt(),n=this.states();for(let a of s)this.queue({key:a.key,state:"denied",source:"gpc",chosen_at:i,user:t});this.kept={...this.kept,gpc:{...this.kept.gpc,[x(this.kept)]:Date.parse(i)}},this.commit(n),this.send()}states(){let e=new Map;for(let t of[...Object.keys(this.start),...Object.keys(this.kept.choices)])e.set(t,this.state(t));return e}tell(e){let t=this.states();for(let s of new Set([...e.keys(),...t.keys()])){let i=t.get(s);if(e.get(s)!==i)for(let n of[...this.listeners])try{n(s,i)}catch{}}}load(){let e;try{e=kt()?.getItem(this.storeKey)}catch{return"unreadable"}if(e==null)return"empty";try{let t=JSON.parse(e);if(Ss(t))return t}catch{}return"unreadable"}reload(){let e=this.load();if(typeof e!="object"){this.write();return}let t=this.states();this.kept=mt(e,this.kept,"theirs",this.holder()),x(e)===x(this.kept)&&yt(this.kept)!==yt(e)&&this.write(),this.tell(t);let s=this.session.snapshot()?.userId??null;this.engaged&&this.kept.unsent.some(i=>i.user!==null&&i.user===s||i.user===null&&(i.device??this.installation.id)===this.installation.id)&&this.retryLater(),this.engaged&&this.refuseByGpc()}commit(e=this.states()){let t=this.load();typeof t=="object"&&(this.kept=mt(t,this.kept,"ours",this.holder())),this.write(),this.tell(e)}write(){try{kt()?.setItem(this.storeKey,JSON.stringify(this.kept))}catch{}}chosenAt(){return this.lastChosen=Math.max(this.now(),this.lastChosen+1),new Date(this.lastChosen).toISOString()}stamp(){let e=this.kept,t=e?Math.max(0,e.unknown?.w??0):0;return this.lastW=Math.max(this.now(),this.lastW+1,t+1),this.lastW}};function gt(r,e){let t=r.state==="denied"?r.chosen_at:e?.last_denied_at;return{state:r.state,source:r.source,chosen_at:r.chosen_at,...r.text_version!==void 0?{text_version:r.text_version}:{},...t!==void 0?{last_denied_at:t}:{}}}function A(r,e){return`${r}|${e.provisional?"provisional":e.state}|${Date.parse(e.chosen_at)}`}function Pt(r){let e=new Set(r.unvoid??[]);return new Set((r.void??[]).filter(t=>!e.has(t)))}var te={denied:2,unset:1,granted:0};function ws(r,e,t,s){let i=e&&!s.has(A(r,e))?e:void 0,n=t&&!s.has(A(r,t))?t:void 0;if(!i||!n)return i??n;let a=Date.parse(i.chosen_at),o=Date.parse(n.chosen_at);return a!==o?a>o?i:n:te[i.state]!==te[n.state]?te[i.state]>te[n.state]?i:n:i.provisional?n:i}function bs(r,e){return!r||!e?r??e:e.w>r.w||e.w===r.w&&e.on?e:r}function mt(r,e,t,s){let i=D([...r.void??[],...e.void??[]]),n=D([...r.unvoid??[],...e.unvoid??[]]),a=Pt({void:i,unvoid:n}),o={},l,d={...r.gpc};for(let[y,P]of Object.entries(e.gpc??{}))d[y]=Math.max(d[y]??0,P);let c;if(x(r)===x(e)){l=e;for(let y of[...new Set([...Object.keys(r.choices),...Object.keys(e.choices)])].sort()){let P=ws(y,r.choices[y],e.choices[y],a);P&&(o[y]=P)}c=bs(r.unknown,e.unknown)}else{l=x(e)===s?e:x(r)===s?r:t==="ours"?e:r;for(let[y,P]of Object.entries(l.choices))a.has(A(y,P))||(o[y]=P);c=l.unknown}let f=D([...r.done??[],...e.done??[]]),g=xt([...r.unsent,...e.unsent]).filter(y=>!f.includes(ie(y))),S=t==="ours"?e:r,m=t==="ours"?r:e,h=S.region??m.region,p=S.keys??m.keys;return{whose:l.whose??null,...l.whose==null&&l.install!==void 0?{install:l.install}:{},...l.whose==null&&(r.resetAt!==void 0||e.resetAt!==void 0)&&x(r)===x(e)?{resetAt:Math.max(r.resetAt??0,e.resetAt??0)}:l.whose==null&&l.resetAt!==void 0?{resetAt:l.resetAt}:{},choices:o,unsent:g,...f.length>0?{done:f}:{},...i.length>0?{void:i}:{},...n.length>0?{unvoid:n}:{},...S.link!==void 0?{link:S.link}:{},...h?{region:h}:{},...Object.keys(d).length>0?{gpc:d}:{},...p?{keys:p}:{},...c?{unknown:c}:{}}}function ie(r){return`${r.user??`device:${r.device??""}`}|${r.key}|${r.state}|${r.source}|${r.chosen_at}`}function vt(r,e){let t=r.choices[e];if(!t||r.whose!=null||r.resetAt===void 0||Date.parse(t.chosen_at)>=r.resetAt)return t}function x(r){return r.whose!=null?`user:${r.whose}`:`device:${r.install??""}`}function D(r){return[...new Set(r)].slice(-ys)}function yt(r){return JSON.stringify(r,(e,t)=>typeof t=="object"&&t!==null&&!Array.isArray(t)?Object.fromEntries(Object.entries(t).sort(([s],[i])=>s.localeCompare(i))):t)}function xt(r){let e=new Map;for(let t of r){let s=ie(t),i=e.get(s);e.set(s,i?i.alone||!t.alone?i:{...i,alone:!0}:t)}return[...e.values()].sort((t,s)=>Date.parse(t.chosen_at)-Date.parse(s.chosen_at))}var ks=new Set(["granted","denied","unset"]);function Ss(r){if(typeof r!="object"||r===null)return!1;let e=r;if(typeof e.choices!="object"||e.choices===null||Array.isArray(e.choices)||!Array.isArray(e.unsent))return!1;let t=(o,l)=>{if(typeof o!="object"||o===null)return!1;let d=o;return ks.has(d.state)&&typeof d.chosen_at=="string"&&(!l||typeof d.key=="string")},s=o=>o===void 0||typeof o=="object"&&o!==null&&typeof o.on=="boolean"&&typeof o.w=="number",i=r,n=o=>o===void 0||Array.isArray(o)&&o.every(l=>typeof l=="string"),a=i.whose===void 0||i.whose===null||typeof i.whose=="string";return Object.values(e.choices).every(o=>t(o,!1))&&e.unsent.every(o=>t(o,!0))&&(i.gpc===void 0||typeof i.gpc=="object"&&i.gpc!==null&&Object.values(i.gpc).every(o=>typeof o=="number"))&&s(i.unknown)&&n(i.done)&&n(i.void)&&n(i.unvoid)&&a}function wt(r,e){return r.key===e.key&&r.user===e.user&&r.state===e.state&&r.source===e.source&&r.chosen_at===e.chosen_at}function bt(r){return r instanceof w&&r.status>=400&&r.status<500&&r.status!==401&&r.status!==408&&r.status!==429}function kt(){try{return globalThis.localStorage}catch{return}}function St(r){let e=typeof r=="object"&&r!==null?r.version:void 0;return typeof e=="object"&&e!==null?e.v:void 0}function Me(r){let e=typeof r=="object"&&r!==null?r.version:void 0;return typeof e=="number"&&Number.isFinite(e)?e:void 0}var _s=`
|
|
3
|
+
:host{display:block;color-scheme:light dark;font:15px/1.4 system-ui,-apple-system,"Segoe UI",Roboto,sans-serif}
|
|
4
|
+
.list{display:flex;flex-direction:column;gap:8px;margin:0;padding:0;list-style:none}
|
|
5
|
+
.item{position:relative;display:flex;gap:12px;align-items:flex-start;padding:12px 40px 12px 12px;border-radius:12px;background:var(--bg);color:var(--fg);cursor:pointer;outline:none}
|
|
6
|
+
.item:focus-visible{box-shadow:0 0 0 2px var(--accent)}
|
|
7
|
+
.item.unread .title{font-weight:600}
|
|
8
|
+
.item .dot{flex:0 0 8px;height:8px;margin-top:7px;border-radius:50%;background:transparent}
|
|
9
|
+
.item.unread .dot{background:var(--accent)}
|
|
10
|
+
.item img{flex:0 0 48px;width:48px;height:48px;border-radius:8px;object-fit:cover}
|
|
11
|
+
.text{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1 1 auto}
|
|
12
|
+
.title{overflow-wrap:anywhere}
|
|
13
|
+
.body{color:var(--muted);overflow-wrap:anywhere}
|
|
14
|
+
.when{color:var(--muted);font-size:12px}
|
|
15
|
+
.card{position:relative;padding-right:32px;cursor:pointer}
|
|
16
|
+
.card.unread::before{content:"";position:absolute;left:-12px;top:14px;width:8px;height:8px;border-radius:50%;background:var(--accent)}
|
|
17
|
+
.delete{position:absolute;top:8px;right:8px;width:28px;height:28px;border:0;border-radius:14px;background:transparent;color:var(--muted);font-size:18px;line-height:1;cursor:pointer}
|
|
18
|
+
.delete:hover,.delete:focus-visible{background:var(--hover)}
|
|
19
|
+
.empty{padding:24px 12px;text-align:center;color:var(--muted)}
|
|
20
|
+
.light{--bg:#f4f4f6;--fg:#111;--muted:#5c5c66;--accent:#2f6bff;--hover:#0000000f}
|
|
21
|
+
.dark{--bg:#1f1f24;--fg:#f2f2f5;--muted:#a0a0ab;--accent:#5b8cff;--hover:#ffffff14}
|
|
22
|
+
`,ne=class{api;session;constructor(e,t){this.api=$.client(e),this.session=t}async list(e={}){return(await this.api.listMyInbox({query:{limit:e.limit,cursor:e.cursor,locale:e.locale}})).data}async unread(){return(await this.list({limit:1})).unread}async markRead(e){let t=e==="all"?{all:!0}:{ids:[...e]};return(await this.api.readMyInbox({body:t})).data.read}async remove(e){await this.api.deleteMyInboxMessage({path:{id:e}})}mount(e,t={}){let s=e.ownerDocument,i=s.defaultView,n=s.createElement("div");n.setAttribute("data-palbase-inbox","");let a=n.attachShadow({mode:"open"});Ze(s,a,_s);let o=s.createElement("ul");o.className="list",a.append(o),e.append(n);let l=()=>t.appearance??(i?.matchMedia?.("(prefers-color-scheme: dark)").matches?"dark":"light"),d=[],c=0,f=[],g=!1,S=u=>{c=u,t.onUnread?.(u)},m=(u,b)=>{u.read_at||(u.read_at=new Date().toISOString(),S(Math.max(0,c-1)),y(),this.markRead([u.id]).catch(()=>{})),!(!b||!Ye(b))&&(t.onOpen?t.onOpen(u,b):b.startsWith("https://")?i?.open(b,"_blank","noopener,noreferrer"):i?.location.assign(b))},h=async u=>{d=d.filter(b=>b.id!==u.id),u.read_at||S(Math.max(0,c-1)),y(),await this.remove(u.id).catch(()=>{})},p=u=>{try{return new Intl.DateTimeFormat(t.locale,{dateStyle:"medium",timeStyle:"short"}).format(new Date(u))}catch{return u}};function y(){if(f.forEach(u=>u.destroy()),f=[],o.replaceChildren(),o.className=`list ${l()}`,!d.length){let u=s.createElement("li");u.className="empty",u.textContent=t.labels?.empty??"No messages",o.append(u);return}for(let u of d)o.append(P(u))}let P=u=>{let b=s.createElement("li");b.setAttribute("data-id",u.id),b.tabIndex=0;let C=s.createElement("button");if(C.type="button",C.className="delete",C.textContent="\xD7",C.setAttribute("aria-label",t.labels?.delete??"Delete"),C.addEventListener("click",v=>{v.stopPropagation(),h(u)}),u.card){b.className=`card ${u.read_at?"":"unread"}`;let v=s.createElement("div");b.append(v,C);let k={onAction:()=>m(u,void 0),onDeepLink:_=>m(u,_),onLink:_=>m(u,_),onCustom:t.onCustom};f.push(Qe(v,{definition:u.card,locale:t.locale??i?.navigator.language??"en",appearance:l(),variables:u.variables??{}},k)),b.addEventListener("click",_=>{_.composedPath().some(M=>M instanceof HTMLElement&&M.tagName==="BUTTON")||m(u,u.deep_link)})}else{b.className=`item ${u.read_at?"":"unread"}`;let v=s.createElement("span");if(v.className="dot",b.append(v),u.image?.startsWith("https://")){let _=s.createElement("img");_.src=u.image,_.alt="",b.append(_)}let k=s.createElement("div");k.className="text";for(let[_,M]of[["title",u.title],["body",u.body],["when",p(u.created_at)]]){if(!M)continue;let Se=s.createElement("span");Se.className=_,Se.textContent=M,k.append(Se)}b.append(k,C),b.addEventListener("click",()=>m(u,u.deep_link))}return b.addEventListener("keydown",v=>{v.key==="Enter"&&v.target===b&&m(u,u.deep_link)}),b},R=0,U=async()=>{let u=++R;if(!(await this.session.session())?.userId){if(g||u!==R)return;d=[],S(0),y();return}let b=await this.list({limit:t.limit??50,locale:t.locale});g||u!==R||(d=b.items,S(b.unread),y())},W=()=>{s.visibilityState==="visible"&&U().catch(()=>{})};s.addEventListener("visibilitychange",W);let ke=this.session.onChange(()=>{U().catch(()=>{})});return y(),U().catch(()=>{}),{refresh:U,get items(){return d},get unread(){return c},destroy(){g=!0,s.removeEventListener("visibilitychange",W),ke?.(),f.forEach(u=>u.destroy()),n.remove()}}}};var Ps=30*6e4,re="session_start";function ae(r){try{return r.localStorage}catch{return}}var xs=()=>globalThis.crypto?.randomUUID?globalThis.crypto.randomUUID():`${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;function Ts(r,e){for(let[t,s]of Object.entries(r??{})){let i=e?.[t];if(i==null||String(i)!==s)return!1}return!0}var oe=class{api;session;installation;g;now;requestPush;analyticsAllowed;purchases;asked=0;person=0;sessionKey;pendingKey;opts;messages=[];limits={per_session:1,per_day:3,min_minutes:10};shown={session:0,day:0,total:0};loaded=Promise.resolve();away=!1;memorySession;memoryPending=[];showing;stopWatching;queue=Promise.resolve();constructor(e,t,s,i,n,a,o,l=globalThis,d=Date.now){this.api=$.client({send:c=>e.send({...c,headers:{...c.headers,[E]:O(s)}})}),this.session=t,this.installation=s,this.requestPush=n,this.analyticsAllowed=a,this.purchases=o,this.g=l,this.now=d,this.sessionKey=`palbase.notify.inapp.session.${i}`,this.pendingKey=`palbase.notify.inapp.conversions.${i}`,t.onChange(c=>{c!=="SIGNED_IN"&&c!=="SIGNED_OUT"&&c!=="SESSION_EXPIRED"||(this.forget(),this.opts&&(this.showing?.message.close(),this.loaded=this.load()))})}get started(){return this.opts!==void 0}start(e={}){let t=!this.opts;if(this.opts=e,!t)return;let s=this.g.document,i=()=>{s?.visibilityState==="visible"?this.enqueue(re,void 0,!0):this.away=!0};s?.addEventListener("visibilitychange",i),this.stopWatching=()=>s?.removeEventListener("visibilitychange",i);let n=this.touch();this.loaded=this.load(),n&&this.trigger(re)}stop(){this.opts=void 0,this.stopWatching?.(),this.stopWatching=void 0,this.showing?.message.close()}refresh(){return this.loaded=this.load(),this.loaded}trigger(e,t){this.enqueue(e,t,!1)}settled(){return this.queue}enqueue(e,t,s){this.queue=this.queue.then(()=>this.take(e,t,s)).catch(()=>{})}async take(e,t,s){if(await this.converted(e),!!this.opts){if(this.touch())this.loaded=this.load(),e!==re&&await this.show(re,void 0);else if(this.away&&(this.loaded=this.load()),s)return;await this.show(e,t)}}async show(e,t){if(await this.loaded,!(!this.opts||this.showing)){for(let s of this.messages)if(!(s.trigger.event!==e||!Ts(s.trigger.where,t)||this.capped(s))&&await this.open(s))return}}capped(e){let t=this.now(),s=(o,l)=>o!==void 0&&l!==void 0&&t-Date.parse(o)<l*6e4,i=this.shown,n=e.shown,a=e.limits;return i.session>=this.limits.per_session||i.day>=this.limits.per_day||s(i.last_at,this.limits.min_minutes)||a.per_session!==void 0&&n.session>=a.per_session||a.per_day!==void 0&&n.day>=a.per_day||s(n.last_at,a.min_minutes)||a.max_total!==void 0&&n.total>=a.max_total}async open(e){let t=this.opts,s=this.person,i=await this.subject(),n,a;try{({id:n,variables:a}=(await this.api.showInAppMessage({body:{campaign_id:e.campaign_id,session_id:this.sessionId(),installation_id:this.installation.id}})).data)}catch(c){return c instanceof w&&c.status===409&&(this.loaded=this.load()),!1}if(!this.opts||this.showing||s!==this.person)return!0;let o=new Date(this.now()).toISOString();for(let c of[this.shown,e.shown])c.session++,c.day++,c.total++,c.last_at=o;e.conversion&&this.pend({impression:n,campaign:e.campaign_id,event:e.conversion.event,until:this.now()+e.conversion.hours*36e5,subject:i});let l=(c,f)=>{this.api.reportInAppEvent({path:{id:n},query:{installation_id:this.installation.id},body:{type:c,...f?{action:f}:{}}}).catch(()=>{})},d=et({definition:e.definition,locale:t.locale??this.g.navigator?.language??"en",appearance:t.appearance??this.appearance(),variables:{...e.variables,...a}},{onAction:c=>{c.type!=="close"&&c.type!=="sheet"&&l("clicked",c.type)},onLink:t.onLink,onDeepLink:t.onDeepLink,onCustom:t.onCustom,onShowPaywall:t.onShowPaywall,onOffer:t.onOffer??(c=>this.takeOffer(c,t.onOfferError)),onRequestPush:t.onRequestPush??(()=>this.requestPush().then(()=>{})),labels:t.labels,onClose:c=>{this.showing?.message===d&&(this.showing=void 0),c!=="action"&&c!=="app"&&l("dismissed"),t.onClose?.(e.campaign_id,c)}},t.root?{root:t.root}:{});return this.showing={campaign:e.campaign_id,message:d},t.onShow?.(e.campaign_id),!0}async takeOffer(e,t){try{let s=(await this.purchases.offers()).find(o=>o.key===e);if(s?.kind==="grant"){await this.purchases.claimOffer(e);return}let i=s?.web?.plans[0];if(!s?.product||i===void 0)throw new w({op:"TakeOffer",status:0,code:"offer_not_open",message:`the offer ${e} is not the customer's to take on the web now`});let n=this.g.location,a=await this.purchases.checkout({product:s.product,plan:i,successUrl:n.href,cancelUrl:n.href,offer:e});n.assign(a)}catch(s){if(!t)throw s;t(s,e)}}async converted(e){let t=this.now(),s=this.pending().filter(a=>a.until>t),i=await this.subject(),n=this.analyticsAllowed()?s.filter(a=>a.event===e&&a.subject===i):[];this.keepPending(s.filter(a=>!n.includes(a))),await Promise.all(n.map(a=>this.api.reportInAppEvent({path:{id:a.impression},query:{installation_id:this.installation.id},body:{type:"converted"}}).catch(()=>{})))}forget(){this.person++,this.asked++,this.messages=[],this.shown={session:0,day:0,total:0}}async load(){this.away=!1;let e=++this.asked;try{let t=(await this.api.listMyInAppMessages({query:{session_id:this.sessionId(!1),installation_id:this.installation.id}})).data;if(e!==this.asked)return;this.messages=t.messages,this.limits=t.limits,this.shown=t.shown}catch{}}async subject(){let e=(await this.session.session())?.userId;return e?`u:${e}`:`i:${this.installation.id}`}appearance(){return this.g.matchMedia?.("(prefers-color-scheme: dark)").matches?"dark":"light"}touch(){let e=this.now(),t=this.readSession(),s=!t||e-t.last>=Ps;return this.writeSession(s?{id:`ses_${xs()}`,last:e}:{id:t.id,last:e}),s}sessionId(e=!0){return e&&this.touch(),(this.readSession()??this.memorySession).id}readSession(){try{let e=ae(this.g)?.getItem(this.sessionKey);if(e)return JSON.parse(e)}catch{}return this.memorySession}writeSession(e){this.memorySession=e;try{ae(this.g)?.setItem(this.sessionKey,JSON.stringify(e))}catch{}}pending(){try{let e=ae(this.g)?.getItem(this.pendingKey);if(e)return JSON.parse(e)}catch{}return this.memoryPending}keepPending(e){this.memoryPending=e;try{let t=ae(this.g);e.length?t?.setItem(this.pendingKey,JSON.stringify(e)):t?.removeItem(this.pendingKey)}catch{}}pend(e){this.keepPending([...this.pending().filter(t=>t.until>this.now()),e].slice(-50))}};var Ie=r=>{let e=r.replace(/-/g,"+").replace(/_/g,"/").padEnd(Math.ceil(r.length/4)*4,"="),t=atob(e),s=new Uint8Array(t.length);for(let i=0;i<t.length;i++)s[i]=t.charCodeAt(i);return s},Re=class{api;session;installation;baseUrl;publishableKey;g;registered;generation=0;wake=()=>{};replacing;changing=Promise.resolve();constructor(e,t,s,i,n,a=globalThis){this.api=$.client(e),this.session=t,this.installation=s,this.baseUrl=i,this.publishableKey=n,this.g=a,t.onChange(o=>{if(o==="SIGNED_IN"||o==="SIGNED_OUT"||o==="SESSION_EXPIRED"){this.registered=void 0;let l=++this.generation;this.wake(),this.changing=this.changing.then(()=>this.registerFor(l)).catch(()=>{})}})}supported(){return!!this.g.navigator?.serviceWorker&&this.g.PushManager!==void 0&&this.g.Notification!==void 0}permission(){return this.supported()?this.g.Notification.permission:"unsupported"}workerUrl(e="/palbase-sw.js"){let t=new URLSearchParams({url:this.baseUrl,key:this.publishableKey});return`${e}${e.includes("?")?"&":"?"}${t}`}async subscribe(e={}){if(!this.supported())return!1;let t=this.g.Notification;if(t.permission==="default"&&await t.requestPermission()!=="granted"||t.permission==="denied")return!1;let s=this.g.navigator.serviceWorker,i=this.workerUrl(e.serviceWorker),n=await this.scopeFor(s,i,e.scope),a=await s.register(i,n?{scope:n}:void 0);await Ms(a);let o=await a.pushManager.getSubscription(),l=(await this.api.getWebPushKey()).data.public_key;o&&!Cs(o.options.applicationServerKey,l)&&(await o.unsubscribe(),o=null),o??=await a.pushManager.subscribe({userVisibleOnly:!0,applicationServerKey:Ie(l)});let d=this.generation;return await this.register(o),this.generation===d&&this.supersede(),!0}async unsubscribe(){this.supersede(),await this.changing;let e=await this.current();e&&await e.unsubscribe(),this.registered=void 0}supersede(){++this.generation,this.replacing=void 0,this.wake()}async refresh(){if(!this.supported()||this.permission()!=="granted")return;let e=await this.current();e&&await this.register(e)}async registerFor(e){if(e===this.generation){if(!this.replacing){try{return await this.refresh()}catch{}let t=await(await this.ours())?.pushManager.getSubscription();if(!t)return;this.replacing={key:t.options.applicationServerKey},await t.unsubscribe()}for(let t of[0,...Tt]){if(t>0&&await this.pause(t),e!==this.generation||this.permission()!=="granted")return;try{let s=await this.ours();if(!s)return void(this.replacing=void 0);let i=this.replacing?.key??Ie((await this.api.getWebPushKey()).data.public_key),n=await s.pushManager.getSubscription()??await s.pushManager.subscribe({userVisibleOnly:!0,applicationServerKey:i});if(e!==this.generation)return;await this.register(n),this.replacing=void 0;return}catch(s){if(t===Tt.at(-1))throw s}}}}pause(e){return new Promise(t=>{let s=setTimeout(i,e);function i(){clearTimeout(s),t()}this.wake=i})}async ours(){let e=this.g.navigator?.serviceWorker;if(e)return(await e.getRegistrations()).find(t=>this.isOurs(t))}isOurs(e){let t=Mt(e)?.searchParams.get("key");return!!t&&Ce(t)!==void 0&&Ce(t)===Ce(this.publishableKey)}async current(){return await(await this.ours())?.pushManager.getSubscription()??null}async scopeFor(e,t,s){let i=this.g.location?.href;if(!i)return s;let n=new URL("./",new URL(t,i)).href,a=s===void 0?n:new URL(s,i).href,o=(await e.getRegistrations()).find(d=>d.scope===a);if(!o||this.isOurs(o))return s;let l=Mt(o);if(s!==void 0)throw new Error(`pb.notify.push.subscribe: ${a} is the scope of another service worker (${l?.href??"unknown"}); registering Palbase's there would replace it \u2014 give Palbase's a scope of its own`);return new URL("palbase-push/",n).href}async register(e){let t=e.toJSON(),s={endpoint:t.endpoint??e.endpoint,keys:{p256dh:t.keys?.p256dh??"",auth:t.keys?.auth??""}},n=`${this.session.snapshot()?.userId??""}|${s.endpoint}`;this.registered!==n&&(await this.api.registerDevice({headers:{[E]:O(this.installation)},body:{device_id:`web-${this.installation.id}`,token:JSON.stringify(s),platform:"web",locale:this.g.navigator?.language??null,installation_id:this.installation.id,timezone:Intl.DateTimeFormat().resolvedOptions().timeZone}}),this.registered=n)}},Tt=[1e3,5e3,3e4,12e4,6e5];async function Ms(r){let e=r.installing??r.waiting;!e||r.active||await new Promise(t=>{let s=()=>{e.state!=="activated"&&e.state!=="redundant"||(e.removeEventListener("statechange",s),t())};e.addEventListener("statechange",s),s()})}function Ce(r){let e=r.split("_");return e.length>=3&&e[0]==="pb"&&e[1]!==""?e[1]:void 0}function Mt(r){let e=(r.installing??r.waiting??r.active)?.scriptURL;return e?new URL(e):void 0}function Cs(r,e){if(!r)return!1;let t=new Uint8Array(r),s=Ie(e);return t.length===s.length&&t.every((i,n)=>i===s[n])}var le=class{push;inbox;inApp;constructor(e,t,s,i,n,a,o){this.push=new Re(e,t,s,a,o),this.inbox=new ne(e,t),this.inApp=new oe(e,t,s,new URL(a).origin,()=>this.push.subscribe(),()=>i.state("analytics")==="granted",n)}};var de=class{api;session;socket;ref;fetch;appVersion;app;listeners=new Set;watch;following;last;constructor(e,t,s,i,n,a,o){this.api=ze.client(e),this.session=t,this.socket=s,this.ref=i,this.fetch=n,this.appVersion=a,this.app=o}async me(){let e=this.session.snapshot()?.userId,t=(await this.api.getMyCustomerInfo()).data;return this.watch&&this.watch.userId===e&&this.offer(this.watch,t),t}async offerings(e="web"){return(await this.api.getOfferings({query:{channel:e}})).data}async paywall(e,t={}){return nt(this.api,this.ref,e,s=>this.checkout(s),{signal:t.signal,fetch:this.fetch,attributes:t.attributes,locale:t.locale,appVersion:this.appVersion,app:this.app})}async checkout(e){let t={product:e.product,plan:e.plan,success_url:e.successUrl,cancel_url:e.cancelUrl,source:e.source,...e.offer!==void 0?{offer:e.offer}:{}},s=(await this.api.createCheckout({body:t})).data;return s.redemption_key&&Rs(this.keyName(s.session_id),s.redemption_key),s.url}async redemptionLink(e,t={}){let s=t.key??Es(this.keyName(e));if(!s)throw new w({op:"CreateCheckoutRedemption",status:0,code:"redemption_key_missing",message:"no redemption key for this checkout in this tab: the link was sent to the buyer's email"});let i=Date.now()+(t.waitSeconds??20)*1e3;for(;;)try{return(await this.api.createCheckoutRedemption({body:{session_id:e,key:s},signal:t.signal})).data}catch(n){let a=(n instanceof w&&n.code==="checkout_not_paid"?n.retryAfter??2:-1)*1e3;if(a<0||Date.now()+a>i)throw n;await Os(a,t.signal)}}async redeem(e){let t=Is(e);if(!t)throw new w({op:"RedeemPurchase",status:0,code:"invalid_redemption_link",message:"not a redemption link: <scheme>://palbase/redeem?token=\u2026 or \u2026/purchases/redeem?token=\u2026"});let s=this.session.snapshot()?.userId,i=(await this.api.redeemPurchase({body:{token:t}})).data;return this.watch&&this.watch.userId===s&&this.offer(this.watch,i),i}async offers(){return(await this.api.listMyOffers()).data.offers}async offerShown(e){await this.api.recordOfferView({path:{offer_key:e}})}async claimOffer(e){return(await this.api.claimOffer({path:{offer_key:e}})).data}async redeemCoupon(e){return(await this.api.redeemCoupon({body:{code:e}})).data}async portal(e){return(await this.api.createPortalSession({body:{return_url:e}})).data.url}async mergeGrant(){return(await this.api.createMergeGrant()).data}async merge(e){let t=this.session.snapshot()?.userId,s=(await this.api.mergeGuest({body:{grant:typeof e=="string"?e:e.grant}})).data;return this.watch&&this.watch.userId===t&&this.offer(this.watch,s),s}async setRefundDataConsent(e){return(await this.api.setRefundDataConsent({body:{consented:e}})).data}keyName(e){return`palbase:${this.ref}:redemption:${e}`}onCustomerInfo(e){if(this.listeners.add(e),this.listeners.size===1)this.start();else if(this.last!==void 0){let t=this.last;queueMicrotask(()=>this.listeners.has(e)&&Ct(e,t))}return()=>{this.listeners.delete(e)&&this.listeners.size===0&&this.stop()}}start(){this.following=this.session.onChange((e,t)=>{(e==="SIGNED_IN"||e==="SIGNED_OUT"||e==="SESSION_EXPIRED")&&this.follow(t)}),this.session.session().then(e=>{this.following&&!this.watch&&this.last===void 0&&this.follow(e)})}stop(){this.following?.(),this.following=void 0,this.unfollow(),this.last=void 0}follow(e){if(this.unfollow(),!e){this.tell(null);return}let t=this.socket.channel(`purchases:${this.ref}:${e.userId}`),s={userId:e.userId,channel:t,off:()=>{},revision:-1,reading:!1,wanted:Number.NEGATIVE_INFINITY},i=[t.on("broadcast",n=>{n.event==="changed"&&this.changed(s,Ee(n.payload))}),t.on("state_snapshot",n=>this.held(s,Ee(It(n.entries)))),t.on("state_diff",n=>this.held(s,Ee(It(n.set))))];s.off=()=>i.forEach(n=>n()),this.watch=s,t.join().catch(()=>{}),this.read(s)}unfollow(){let e=this.watch;e&&(this.watch=void 0,e.off(),e.channel.leave())}changed(e,t){this.watch!==e||t!==void 0&&t<=e.revision||(e.reading?e.wanted=Math.max(e.wanted,t??Number.POSITIVE_INFINITY):this.read(e))}held(e,t){t!==void 0&&this.changed(e,t)}async read(e){e.reading=!0;try{for(;;){e.wanted=Number.NEGATIVE_INFINITY;try{let t=(await this.api.getMyCustomerInfo()).data;if(this.watch!==e)return;this.offer(e,t)}catch{}if(this.watch!==e||e.wanted<=e.revision)return}}finally{e.reading=!1}}offer(e,t){this.watch!==e||t.revision<=e.revision||(e.revision=t.revision,this.tell(t))}tell(e){if(!(this.last===null&&e===null)){this.last=e;for(let t of[...this.listeners])Ct(t,e)}}};function Ct(r,e){try{r(e)}catch{}}function It(r){let e=typeof r=="object"&&r!==null?r.revision:void 0;return typeof e=="object"&&e!==null?e.v:void 0}function Ee(r){let e=typeof r=="object"&&r!==null?r.revision:void 0;return typeof e=="number"&&Number.isFinite(e)?e:void 0}var Rt=/^[A-Za-z0-9_-]{43}$/;function Is(r){let e=r.trim();if(Rt.test(e))return e;let t;try{t=new URL(e)}catch{return}let s=t.host==="palbase"&&t.pathname==="/redeem",i=(t.protocol==="https:"||t.protocol==="http:")&&t.pathname==="/purchases/redeem",n=t.searchParams.get("token");return(s||i)&&n!==null&&Rt.test(n)?n:void 0}function Rs(r,e){try{globalThis.sessionStorage?.setItem(r,e)}catch{}}function Es(r){try{return globalThis.sessionStorage?.getItem(r)??void 0}catch{return}}function Os(r,e){return new Promise((t,s)=>{if(e?.aborted)return s(e.reason);let i=setTimeout(()=>{e?.removeEventListener("abort",n),t()},r),n=()=>{clearTimeout(i),s(e?.reason)};e?.addEventListener("abort",n,{once:!0})})}var ce=class{api;session;socket;installation;ref;analytics;appVersion;storageKey;held;listeners=new Set;started;leave=[];running;queued;fresh=!0;constructor(e,t,s,i,n,a,o,l){this.api=Je.client(e),this.session=t,this.socket=s,this.installation=i,this.ref=n,this.analytics=o,this.appVersion=l,this.storageKey=`palbase.flags.${a}`,this.held=As(this.storageKey)}value(e){let t=this.mine();if(!t||!Object.hasOwn(t.values,e))return;let s=t.experiments[e];return s&&this.analytics.captureOnce(`$flag_exposure:${e}:${s.experiment_id}`,"$flag_exposure",{flag:e,experiment:s.experiment_id,variant:s.variant}),t.values[e]}bool(e,t){let s=this.value(e);return typeof s=="boolean"?s:t}string(e,t){let s=this.value(e);return typeof s=="string"?s:t}number(e,t){let s=this.value(e);return typeof s=="number"&&Number.isFinite(s)?s:t}json(e,t){let s=this.value(e);return typeof s=="object"&&s!==null?s:t}all(){return{...this.mine()?.values}}source(e){return this.mine()?.sources[e]}get version(){return this.mine()?.syncVersion}onChange(e){return this.listeners.add(e),this.start(),()=>{this.listeners.delete(e)}}refresh(){return this.started?this.read():this.start()}mine(){this.start();let e=this.held;return e&&e.user===(this.session.snapshot()?.userId??null)?e:void 0}start(){if(this.started)return this.started;this.session.onChange((t,s)=>{(t==="SIGNED_IN"||t==="SIGNED_OUT"||t==="SESSION_EXPIRED")&&this.follow(s).catch(()=>{})});let e=this.session.session().then(t=>this.follow(t));return e.catch(()=>{}),this.started=e,e}follow(e){let t=e?.userId??null;if(this.held&&this.held.user!==t){let s=Object.keys(this.held.values);this.held=void 0,Et(this.storageKey,void 0),this.tell(s)}return this.join(t),this.fresh=!0,this.read()}join(e){for(let s of this.leave.splice(0))s();let t=[`flags:${this.ref}`,...e!==null?[`flags:${this.ref}:${e}`]:[]];for(let s of t){let i=this.socket.channel(s),n=[i.on("broadcast",a=>{a.event==="changed"&&this.changed(Oe(a.payload))}),i.on("state_snapshot",a=>this.changed(Oe(Ot(a.entries)))),i.on("state_diff",a=>this.changed(Oe(Ot(a.set))))];i.join().catch(()=>{}),this.leave.push(()=>{n.forEach(a=>a()),i.leave()})}}changed(e){if(e===void 0)return;let t=this.mine();t&&Number(t.syncVersion)>=e||this.read().catch(()=>{})}read(){if(this.queued)return this.queued;let e=(this.running??Promise.resolve()).catch(()=>{}).then(()=>(this.queued=void 0,this.fetch()));this.queued=e,this.running=e;let t=()=>{this.running===e&&(this.running=void 0)};return e.then(t,t),e}async fetch(){let e=(await this.session.session())?.userId??null,t=this.held?.user===e?this.held:void 0,s=this.headers(e,t?.etag);if(t&&!this.fresh)try{let d=await this.api.getDelta({query:{since:Number(t.syncVersion)},headers:s});if(d.status===304)return;let c={...t,values:{...t.values},sources:{...t.sources},experiments:{...t.experiments},syncVersion:d.data.sync_version,etag:d.headers.get("etag")??t.etag},f=new Set;for(let g of d.data.ops)f.add(g.key),g.op==="delete"?(delete c.values[g.key],delete c.sources[g.key],delete c.experiments[g.key]):(c.values[g.key]=g.value??null,c.sources[g.key]=g.source,g.experiment?c.experiments[g.key]=g.experiment:delete c.experiments[g.key]);this.apply(c,[...f]);return}catch(d){if(!(d instanceof w&&d.status===410))throw d}let i=await this.api.getSnapshot({headers:s});if(this.fresh=!1,i.status===304)return;let n=i.data,a={user:e,values:n.values,sources:n.sources,experiments:n.experiments??{},syncVersion:n.sync_version,contextHash:n.context_hash,etag:i.headers.get("etag")??void 0},o=t?.values??{},l=[...new Set([...Object.keys(o),...Object.keys(a.values)])].filter(d=>JSON.stringify(o[d])!==JSON.stringify(a.values[d]));this.apply(a,l)}headers(e,t){return{"X-Platform":"web",...this.appVersion?{"X-Palbase-Client-Version":this.appVersion}:{},[Y]:this.installation.id,...e===null?{[E]:O(this.installation)}:{},...t?{"If-None-Match":t}:{}}}apply(e,t){if(e.user!==(this.session.snapshot()?.userId??null))return;let s=this.held?.user===e.user?this.held:void 0;s&&!(Number(e.syncVersion)>Number(s.syncVersion)||e.syncVersion===s.syncVersion&&e.contextHash!==s.contextHash)||(this.held=e,Et(this.storageKey,e),t.length>0&&this.tell(t))}tell(e){for(let t of[...this.listeners])try{t(e)}catch{}}};function Ae(){try{return globalThis.localStorage}catch{return}}function As(r){try{let e=Ae()?.getItem(r);if(!e)return;let t=JSON.parse(e);return typeof t!="object"||t===null||typeof t.values!="object"||t.values===null||typeof t.syncVersion!="string"?void 0:{user:typeof t.user=="string"?t.user:null,values:t.values,sources:t.sources??{},experiments:t.experiments??{},syncVersion:t.syncVersion,contextHash:t.contextHash??"",...typeof t.etag=="string"?{etag:t.etag}:{}}}catch{return}}function Et(r,e){try{e?Ae()?.setItem(r,JSON.stringify(e)):Ae()?.removeItem(r)}catch{}}function Ot(r){let e=typeof r=="object"&&r!==null?r.sync_version:void 0;return typeof e=="object"&&e!==null?e.v:void 0}function Oe(r){let e=typeof r=="object"&&r!==null?r.sync_version:void 0;return typeof e=="number"&&Number.isFinite(e)?e:void 0}var he=class{items=new Map;add(e,t,s){let i={clientMessageId:t.client_message_id,conversationId:e,request:t,state:"pending",attempts:0,error:null,createdAt:s};return this.items.set(i.clientMessageId,i),i}get(e){return this.items.get(e)}all(e){return[...this.items.values()].filter(t=>!e||t.conversationId===e).sort((t,s)=>t.createdAt<s.createdAt?-1:t.createdAt>s.createdAt?1:0)}settle(e,t){return e.sender_id!==t||!e.client_message_id?!1:this.items.delete(e.client_message_id)}retry(e){let t=this.items.get(e);t&&t.state==="failed"&&Object.assign(t,{state:"pending",error:null})}discard(e){return this.items.delete(e)}async flush(e,t){let s=new Map;for(let n of this.all())n.state!=="failed"&&s.set(n.conversationId,[...s.get(n.conversationId)??[],n]);let i=!1;return await Promise.all([...s.values()].map(async n=>{for(let a of n){if(!this.items.has(a.clientMessageId))continue;a.state="sending",a.attempts++;let o;try{o=await e(a)}catch{o={kind:"wait"}}if(o.kind==="wait"){this.items.has(a.clientMessageId)&&(a.state="pending"),i=this.items.has(a.clientMessageId),t(a,o);return}o.kind==="refused"?Object.assign(a,{state:"failed",error:o.code}):this.items.delete(a.clientMessageId),t(a,o)}})),i}save(){return this.all().map(e=>({...e,state:e.state==="sending"?"pending":e.state}))}load(e){this.items.clear();for(let t of e)this.items.set(t.clientMessageId,{...t,state:t.state==="sending"?"pending":t.state})}};function De(r,e){if(r===200||r===201)return{kind:"sent",message:e};if(r===202)return{kind:"scheduled",scheduled:e};if(r<400||r>=500||r===408||r===429)return{kind:"wait"};let t=e?.error;return{kind:"refused",code:typeof t=="string"?t:`http_${r}`}}function At(){return{list:!1,conversations:new Set,threads:new Set,scheduled:!1}}var ue=class{reader;cursor=null;conversations=new Map;members=new Map;messages=new Map;threads=new Map;scheduled=new Map;deleted=new Map;constructor(e){this.reader=e}apply(e){let t=At();for(let s of e.removed_conversations??[])this.removed(s,t);for(let s of e.conversations??[])this.putConversation(s,t);for(let s of e.members??[])this.putMember(s,t);for(let s of e.messages??[])this.putMessage(s,t);for(let s of e.hidden??[])this.messages.get(s.conversation_id)?.delete(s.message_id)&&t.conversations.add(s.conversation_id),this.threads.delete(s.message_id)&&t.threads.add(s.message_id);for(let s of e.threads??[])this.putThread(s,t);for(let s of e.scheduled??[])this.putScheduled(s,t);return t}reset(e){this.conversations.clear(),this.members.clear(),this.messages.clear(),this.threads.clear(),this.scheduled.clear();let t=this.apply(e);return t.list=!0,t.scheduled=!0,t}removed(e,t){if(e.reportable_until){let s=e.conversation_id,i=this.conversations.get(s)?.title??this.deleted.get(s)?.title??null;this.deleted.set(s,{id:s,title:i,deletedBy:e.deleted_by??null,reportableUntil:e.reportable_until})}this.drop(e.conversation_id,t)}drop(e,t){this.conversations.delete(e),this.members.delete(e),this.messages.delete(e);for(let[s,i]of this.threads)i.conversation_id===e&&this.threads.delete(s);t.list=!0,t.conversations.add(e)}putConversation(e,t){let s=this.conversations.get(e.id);if(e.deleted){this.drop(e.id,t);return}let i=s?.me&&e.me&&e.me.read_seq<s.me.read_seq?this.readTo(e,e.me,s.me.read_seq):e.me,n=s&&!Ds(i,s.me)?s.me:i,a={...e,me:n};if(s){if(e.version<s.version){if(n===s.me)return;a={...s,me:n}}else if(e.version===s.version&&Ls(Dt(a),s))return}e.gap&&this.messages.delete(e.id);for(let o of e.members??[])this.putMember(o,t);this.conversations.set(e.id,Dt(a)),t.list=!0,t.conversations.add(e.id)}putMember(e,t){let s=this.members.get(e.conversation_id);s||(s=new Map,this.members.set(e.conversation_id,s));let i=s.get(e.user_id),n=e;if(i){if(e.version<i.version)return;if(e.version===i.version){let a=Ns(i.read_seq,e.read_seq);if(a===i.read_seq&&e.delivered_seq<=i.delivered_seq)return;n={...i,read_seq:a,delivered_seq:Math.max(i.delivered_seq,e.delivered_seq)}}}s.set(e.user_id,n),t.conversations.add(e.conversation_id)}putMessage(e,t){let s=this.messages.get(e.conversation_id);s||(s=new Map,this.messages.set(e.conversation_id,s));let i=s.get(e.id);i&&e.version<=i.version||(s.set(e.id,e),t.conversations.add(e.conversation_id),e.thread_id&&t.threads.add(e.thread_id),(e.reply_count>0||i?.reply_count)&&t.threads.add(e.id),t.list=!0)}putThread(e,t){let s=this.threads.get(e.thread_id),i=s&&e.read_seq<s.read_seq?this.threadReadTo(e,s.read_seq):e;s&&i.version<=s.version&&i.unread_count===s.unread_count||(this.threads.set(e.thread_id,i),t.threads.add(e.thread_id))}putScheduled(e,t){let s=this.scheduled.get(e.id);s&&e.version<=s.version||(e.state==="scheduled"?this.scheduled.set(e.id,e):this.scheduled.delete(e.id),t.scheduled=!0)}read(e,t,s){let i=At(),n=this.conversations.get(e),a=n?Math.min(t,n.me?.left_seq??n.last_seq):t;if(s!==void 0){let o=this.threads.get(s);return!o||a<=o.read_seq||(this.threads.set(s,this.threadReadTo(o,a)),i.threads.add(s)),i}return!n?.me||a<=n.me.read_seq||(this.conversations.set(e,{...n,me:this.readTo(n,n.me,a)}),i.list=!0,i.conversations.add(e)),i}readTo(e,t,s){let i=t.left_seq??e.last_seq;if(s>=i)return{...t,read_seq:s,unread_count:0};let n=Math.max(t.read_seq,t.cleared_seq,t.joined_seq),a=this.timeline(e.id).filter(o=>o.seq>n&&o.seq<=s&&o.sender_id!==this.reader&&o.kind!=="system"&&o.kind!=="call"&&!o.deleted).length;return{...t,read_seq:s,unread_count:Math.max(0,t.unread_count-a)}}threadReadTo(e,t){let s=this.answers(e.conversation_id,e.thread_id).filter(i=>i.seq>e.read_seq&&i.seq<=t&&i.sender_id!==this.reader&&!i.deleted).length;return{...e,read_seq:t,unread_count:Math.max(0,e.unread_count-s)}}expire(e,t){return this.messages.get(e)?.delete(t)??!1}list(){return[...this.conversations.values()].sort(Us)}timeline(e){return[...this.messages.get(e)?.values()??[]].filter(t=>!t.thread_id||t.also_in_conversation).sort((t,s)=>t.seq-s.seq)}answers(e,t){return[...this.messages.get(e)?.values()??[]].filter(s=>s.thread_id===t).sort((s,i)=>s.seq-i.seq)}deletedGroups(e){for(let[t,s]of this.deleted)Date.parse(s.reportableUntil)<=e&&this.deleted.delete(t);return[...this.deleted.values()].sort((t,s)=>Date.parse(s.reportableUntil)-Date.parse(t.reportableUntil)||(t.id<s.id?-1:t.id>s.id?1:0))}membersOf(e){return[...this.members.get(e)?.values()??[]].sort((t,s)=>t.user_id<s.user_id?-1:t.user_id>s.user_id?1:0)}snapshot(){return{cursor:this.cursor,conversations:[...this.conversations.values()],members:[...this.members.values()].flatMap(e=>[...e.values()]),messages:[...this.messages.values()].flatMap(e=>[...e.values()]),threads:[...this.threads.values()],scheduled:[...this.scheduled.values()],deleted:[...this.deleted.values()]}}load(e){this.reset({conversations:e.conversations,members:e.members,messages:e.messages,threads:e.threads,scheduled:e.scheduled}),this.cursor=e.cursor,this.deleted.clear();for(let t of e.deleted??[])this.deleted.set(t.id,t)}};function Ds(r,e){return r?e?r.version!==e.version?r.version>e.version:r.read_seq!==e.read_seq?r.read_seq>e.read_seq:r.unread_count!==e.unread_count||r.delivered_seq>e.delivered_seq:!0:!1}function Ns(r,e){return r===null?e:e===null?r:Math.max(r,e)}function Us(r,e){let t=r.last_message_at??r.created_at,s=e.last_message_at??e.created_at;return t!==s?t<s?1:-1:r.id<e.id?1:-1}function Dt(r){let{members:e,gap:t,...s}=r;return s}function Ls(r,e){return JSON.stringify(r)===JSON.stringify(e)}var pe=class{store;outbox=new he;me;now;constructor(e,t=Date.now){this.me=e,this.now=t,this.store=new ue(e)}apply(e){return this.settled(e,this.store.apply(e))}reset(e){return this.settled(e,this.store.reset(e))}settled(e,t){for(let s of e.messages??[])this.outbox.settle(s,this.me)&&t.conversations.add(s.conversation_id);return t}write(e,t,s){return this.outbox.add(e,t,s)}read(e,t,s){let i=t??(s?Math.max(0,...this.store.answers(e,s).map(n=>n.seq)):this.store.conversations.get(e)?.last_seq??0);return{upTo:i,touched:this.store.read(e,i,s)}}sent(e){return e.kind==="sent"?this.apply({messages:[e.message]}):e.kind==="scheduled"?this.apply({scheduled:[e.scheduled]}):null}timeline(e){return this.entries(this.store.timeline(e),this.outbox.all(e).filter(t=>!t.request.thread_id||t.request.also_in_conversation))}answers(e,t){return this.entries(this.store.answers(e,t),this.outbox.all(e).filter(s=>s.request.thread_id===t))}entries(e,t){let s=new Set(e.filter(i=>i.sender_id===this.me&&i.client_message_id).map(i=>i.client_message_id));return[...e.map(i=>({kind:"message",message:i})),...t.filter(i=>!s.has(i.clientMessageId)&&!i.request.send_at).map(i=>({kind:"pending",item:i}))]}deletedGroups(){return this.store.deletedGroups(this.now())}kept(){return{store:this.store.snapshot(),outbox:this.outbox.save()}}load(e){this.store.load(e.store),this.outbox.load(e.outbox)}};function fe(){let r=globalThis.crypto?.subtle;if(!r)throw new Error("messaging: this platform has no WebCrypto to encrypt files with");return r}function qs(r){let e="";for(let t of r)e+=String.fromCharCode(t);return btoa(e).replaceAll("+","-").replaceAll("/","_").replace(/=+$/,"")}function js(r){let e=atob(r.replaceAll("-","+").replaceAll("_","/")+"=".repeat((4-r.length%4)%4)),t=new Uint8Array(e.length);for(let s=0;s<e.length;s++)t[s]=e.charCodeAt(s);return t}async function Nt(r){let e=crypto.getRandomValues(new Uint8Array(32)),t=crypto.getRandomValues(new Uint8Array(12));return{sealed:await Ks(r,e,t),fileKey:qs(e)}}async function Ks(r,e,t){let s=await fe().importKey("raw",e,"AES-GCM",!1,["encrypt"]),i=new Uint8Array(await fe().encrypt({name:"AES-GCM",iv:t},s,r)),n=new Uint8Array(1+t.length+i.length);return n[0]=1,n.set(t,1),n.set(i,1+t.length),n}async function Ut(r,e){if(r.length<29||r[0]!==1)throw new Error("messaging: not a file this SDK sealed");let t=await fe().importKey("raw",js(e),"AES-GCM",!1,["decrypt"]);return new Uint8Array(await fe().decrypt({name:"AES-GCM",iv:r.subarray(1,13)},t,r.subarray(13)))}function F(r,e){return`palbase.messaging.v1.${r}.${e}`}var ge=class{kv;constructor(e){this.kv=e}async open(e){let t=await this.kv.get(e);if(t===null)return null;try{let s=JSON.parse(t);return s.format===1?{store:s.store,outbox:s.outbox}:null}catch{return null}}async save(e,t){await this.kv.set(e,JSON.stringify({format:1,store:$s(t.store),outbox:t.outbox}))}async drop(e){await this.kv.delete(e)}async dropOthers(e,t){let s=F(e,""),i=F(e,t);for(let n of await this.kv.list())n.startsWith(s)&&n!==i&&await this.kv.delete(n)}};function $s(r){let e=new Map;for(let s of r.messages)e.set(s.conversation_id,[...e.get(s.conversation_id)??[],s]);let t=[...e.values()].flatMap(s=>s.sort((i,n)=>n.seq-i.seq).slice(0,200));return{...r,messages:t}}function Lt(){let r=new Map;return{async get(e){return r.get(e)??null},async set(e,t){r.set(e,t)},async delete(e){r.delete(e)},async list(){return[...r.keys()]},get keys(){return[...r.keys()]}}}var Vs=/[\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}\p{Script=Thai}\p{Script=Lao}\p{Script=Khmer}\p{Script=Myanmar}]/u,Fs=/[\p{L}\p{Nd}\p{M}]/u,Ws=/\p{M}/u,Gs=/\p{Mn}/u;function Hs(r){let e=r.codePointAt(0);if(e===304||e===305||r==="I")return["i"];let t=[];for(let s of r.toLowerCase().normalize("NFD"))Gs.test(s)||t.push(s);return t}function qt(r){let e=[],t=null,s=0,i=0,n=!1;for(let a of r){let o=a.length;if(!Fs.test(a))t=null,n=!1;else if(Vs.test(a))n||(i++,n=!0),e.push({start:s,folded:[a.toLowerCase()],ends:[s+o],run:i}),t=null;else if(Ws.test(a)&&!t){let l=e.at(-1);n&&l&&(l.ends[0]=s+o)}else{n=!1,t||(t={start:s,folded:[],ends:[],run:0},e.push(t));let l=Hs(a);l.length===0&&t.ends.length>0&&(t.ends[t.ends.length-1]=s+o);for(let d of l)t.folded.push(d),t.ends.push(s+o)}s+=o}return e}function jt(r){let e=[],t=0;for(let s of r)s.run!==0&&(s.run!==t&&(e.push(""),t=s.run),e[e.length-1]+=s.folded.join(""));return e}function Kt(r){let e={words:[],runs:[]},t=new Set,s=qt(r);for(let i of s){let n=i.folded.join("");if(n!==""&&!t.has(n)&&(t.add(n),e.words.push(i.folded)),e.words.length===8)break}return e.runs=jt(s).filter(i=>[...i].length>1),e}function Bs(r,e){return e.length===1?r.folded.length===1&&r.folded[0]===e[0]:r.folded.length>=e.length&&e.every((t,s)=>r.folded[s]===t)}function $t(r,...e){let t=r.words.map(()=>!1),s=[],i=e.map(n=>{let a=qt(n);return s.push(...jt(a)),a.flatMap(o=>{let l=0;return r.words.forEach((d,c)=>{Bs(o,d)&&(t[c]=!0,l=Math.max(l,d.length))}),l>0?[{offset:o.start,length:o.ends[l-1]-o.start}]:[]})});return r.runs.every(n=>s.some(a=>a.includes(n)))&&r.words.length>0&&t.every(Boolean)?i:null}var Js=500,zs=300,Xs=2e3,Vt=6e3,Ys=3e4,Ft=[1e3,2e3,5e3,1e4,3e4],Qs=5*6e4,Zs=20,ei=5,Ne=class{conversationId;messages=new Map;earlier=null;later=null;merged=!1;constructor(e){this.conversationId=e}put(e){for(let t of e){let s=this.messages.get(t.id);(!s||t.version>s.version)&&this.messages.set(t.id,t)}}apply(e){let t=!1;for(let s of e.messages??[]){let i=this.messages.get(s.id);i&&s.version>i.version&&(this.messages.set(s.id,s),t=!0)}for(let s of e.hidden??[])this.messages.delete(s.message_id)&&(t=!0);return((e.removed_conversations??[]).some(s=>s.conversation_id===this.conversationId)||(e.conversations??[]).some(s=>s.id===this.conversationId&&s.deleted))&&(this.messages.clear(),t=!0),t}expire(e){return this.messages.delete(e)}entries(){return[...this.messages.values()].filter(e=>!e.thread_id||e.also_in_conversation).sort((e,t)=>e.seq-t.seq).map(e=>({kind:"message",message:e}))}};function ti(r="palbase.messaging"){let e=globalThis.indexedDB;if(!e)return null;let t=null,s=()=>t??=new Promise((n,a)=>{let o=e.open(r,1);o.onupgradeneeded=()=>o.result.createObjectStore("kv"),o.onsuccess=()=>n(o.result),o.onerror=()=>a(o.error)}),i=(n,a)=>s().then(o=>new Promise((l,d)=>{let c=a(o.transaction("kv",n).objectStore("kv"));c.onsuccess=()=>l(c.result),c.onerror=()=>d(c.error)}));return{get:async n=>await i("readonly",a=>a.get(n))??null,set:async(n,a)=>{await i("readwrite",o=>o.put(a,n))},delete:async n=>{await i("readwrite",a=>a.delete(n))},list:async()=>(await i("readonly",n=>n.getAllKeys())).map(String)}}var me=class{api;local;transportFor;clients=new WeakMap;user=null;engine=null;starting=null;channel=null;off=[];heard=new Set;synced=!1;syncing=null;resync=!1;flushing=null;reflush=!1;retries=0;timers={save:void 0,deliver:void 0,retry:void 0,presence:void 0,reportable:void 0};delivered=new Map;expiring=new Map;typingBy=new Map;typedAt=new Map;loaded=new Set;earlier=new Map;saving=Promise.resolve();reopeners=new Set;incoming=new Set;windows=new Set;people=new Map;session;socket;ref;fetchFn;opts;constructor(e,t,s,i,n,a,o={}){this.transportFor=t,this.session=s,this.socket=i,this.ref=n,this.fetchFn=a,this.opts=o,this.api=_e.client(e),this.local=new ge(o.storage??ti()??Lt()),s.onChange((d,c)=>{d==="SIGNED_OUT"||d==="SESSION_EXPIRED"?this.end():d==="SIGNED_IN"&&c?.userId!==this.user?this.end().then(async()=>{if(this.heard.size!==0){await this.ready();for(let f of[...this.reopeners])f()}}):d==="SIGNED_IN"&&this.engine&&this.user&&(this.unfollow(),this.follow(this.user),this.sync())});let l=globalThis;l.addEventListener?.("online",()=>this.wake()),l.document?.addEventListener?.("visibilitychange",()=>{l.document?.visibilityState==="visible"&&this.wake()})}async ready(){let e=this.session.snapshot()??await this.session.session();if(!e)throw new w({op:"messaging",status:401,code:"not_signed_in",message:"messaging is the signed-in person's: sign in first"});if(this.engine&&this.user===e.userId)return this.engine;if(this.starting&&this.user===e.userId)return this.starting;this.user=e.userId;let t=e.userId;return this.starting=(async()=>{let s=new pe(t);this.clients.set(s,_e.client(this.transportFor(t)));let i=await this.local.open(F(this.ref,t));if(this.user!==t)throw new Error("messaging: the session changed while it started");i&&s.load(i),this.engine=s;for(let n of s.store.messages.values())for(let a of n.values())this.expireAt(a);return this.expireDeleted(s),this.tell({list:!0,conversations:new Set(s.store.conversations.keys()),threads:new Set,scheduled:!0}),this.follow(t),this.opts.keepOnSignOut||this.local.dropOthers(this.ref,t).catch(()=>{}),this.sync().then(()=>this.flush()),this.presence(s),s})(),this.starting.catch(()=>{this.user===t&&(this.starting=null)}),this.starting}async end(){let e=this.user,t=this.engine;this.unfollow();for(let s of Object.values(this.timers))s&&clearTimeout(s);for(let s of this.expiring.values())clearTimeout(s);this.expiring.clear(),this.typingBy.clear(),this.delivered.clear(),this.loaded.clear(),this.earlier.clear();for(let s of this.windows)s.merged=!0;if(this.windows.clear(),this.people.clear(),this.engine=null,this.starting=null,this.user=null,this.synced=!1,e){let s=F(this.ref,e);await this.saving,this.opts.keepOnSignOut&&t?await this.local.save(s,t.kept()):await this.local.drop(s)}this.tell({list:!0,conversations:new Set,threads:new Set,scheduled:!0})}unfollow(){for(let e of this.off.splice(0))e();this.channel?.leave(),this.channel=null}follow(e){let t=this.socket.channel(`messaging:${this.ref}:${e}`);this.channel=t,this.off.push(t.on("broadcast",s=>{this.user===e&&(s.event==="changes"?this.heardLive(s.payload):s.event==="typing"&&this.typed(s.payload))}),t.onJoined(()=>{this.sync()})),t.join().catch(()=>{})}wake(){this.engine&&this.sync().then(()=>this.flush())}sync(){return this.syncing?(this.resync=!0,this.syncing):(this.syncing=(async()=>{try{do{this.resync=!1;let e=this.engine;if(!e)return;let t=(await this.as(e).sync({query:e.store.cursor?{since:e.store.cursor}:{}})).data;if(this.engine!==e)return;let s=t.reset?e.reset(t):e.apply(t);this.toWindows(t,s);let i=t.reset?[...this.loaded]:t.conversations.filter(n=>n.gap&&this.loaded.has(n.id)).map(n=>n.id);t.reset&&this.loaded.clear();for(let n of i)this.loaded.delete(n),this.earlier.delete(n);e.store.cursor=t.cursor,this.after(t,s);for(let n of i)this.openPage(n).catch(()=>{});this.synced||(s.list=!0),this.synced=!0,this.tell(s)}while(this.resync)}finally{this.syncing=null}})(),this.syncing)}onIncoming(e){return this.incoming.add(e),()=>{this.incoming.delete(e)}}heardLive(e){let t=this.engine;if(!t)return;let s=(e.messages??[]).filter(i=>i.version===1&&i.sender_id!==t.me&&!i.deleted&&i.kind!=="system"&&i.kind!=="call"&&!t.store.messages.get(i.conversation_id)?.has(i.id));this.changed(e,t);for(let i of s)for(let n of[...this.incoming])n(i)}changed(e,t=this.engine){if(!t||t!==this.engine)return;let s=t.apply(e);this.toWindows(e,s),this.after(e,s),this.tell(s)}toWindows(e,t){for(let s of this.windows)s.apply(e)&&t.conversations.add(s.conversationId)}putWindow(e,t){e.put(t);for(let s of t)this.expireAt(s)}fromWindows(e,t){let s=!1;for(let i of this.windows)i.conversationId===e&&t(i)&&(s=!0);return s}after(e,t){for(let s of e.messages??[])this.expireAt(s),s.sender_id!==this.user&&!s.deleted&&(s.thread_id===null||s.also_in_conversation)&&this.delivered.set(s.conversation_id,Math.max(this.delivered.get(s.conversation_id)??0,s.seq));e.removed_conversations?.some(s=>s.reportable_until)&&this.engine&&this.expireDeleted(this.engine),this.delivered.size>0&&(this.timers.deliver??=setTimeout(()=>{this.deliver()},Js)),(t.list||t.conversations.size>0||t.threads.size>0||t.scheduled)&&this.save()}expireAt(e){let t=e.id,s=this.expiring.get(t);if(s&&clearTimeout(s),this.expiring.delete(t),!e.expires_at||e.deleted)return;let i=Date.parse(e.expires_at)-Date.now(),n=()=>{this.expiring.delete(t);let a=this.engine?.store.expire(e.conversation_id,e.id)??!1;(this.fromWindows(e.conversation_id,o=>o.expire(e.id))||a)&&(this.tell({list:!0,conversations:new Set([e.conversation_id]),threads:new Set(e.thread_id?[e.thread_id]:[]),scheduled:!1}),this.save())};i<=0?n():this.expiring.set(t,setTimeout(n,Math.min(i,2**31-1)))}expireDeleted(e){clearTimeout(this.timers.reportable),this.timers.reportable=void 0;let t=Math.min(...e.deletedGroups().map(s=>Date.parse(s.reportableUntil)));Number.isFinite(t)&&(this.timers.reportable=setTimeout(()=>{this.timers.reportable=void 0,this.engine===e&&(this.tell({list:!0,conversations:new Set,threads:new Set,scheduled:!1}),this.save(),this.expireDeleted(e))},Math.min(Math.max(0,t-Date.now()),2**31-1)))}async deliver(){this.timers.deliver=void 0;let e=[...this.delivered].map(([t,s])=>({conversation_id:t,delivered_seq:s}));if(this.delivered.clear(),!(e.length===0||!this.engine))try{await this.as(this.engine).receipts({body:{receipts:e.slice(0,100)}})}catch{}}save(){this.timers.save??=setTimeout(()=>{this.timers.save=void 0;let e=this.engine,t=this.user;e&&t&&(this.saving=this.saving.then(()=>this.local.save(F(this.ref,t),e.kept())).catch(()=>{}))},zs)}flush(){return this.flushing?(this.reflush=!0,this.flushing):(clearTimeout(this.timers.retry),this.timers.retry=void 0,this.flushing=(async()=>{try{let e=!1;do{this.reflush=!1;let t=this.engine;if(!t)return;let s=this.as(t);if(e=await t.outbox.flush(i=>this.post(s,i),(i,n)=>{let a=t.sent(n)??{list:!1,conversations:new Set([i.conversationId]),threads:new Set,scheduled:!1};a.conversations.add(i.conversationId),n.kind==="sent"&&this.after({messages:[n.message]},a),this.save(),this.tell(a)}),this.engine!==t)return}while(this.reflush&&!e);if(e){let t=Ft[Math.min(this.retries++,Ft.length-1)];this.timers.retry=setTimeout(()=>{this.flush()},t)}else this.retries=0}finally{this.flushing=null}})(),this.flushing)}async post(e,t){try{let s=await e.sendMessage({path:{conversation_id:t.conversationId},body:t.request});return De(s.status,s.data)}catch(s){return s instanceof w?s.isNetworkError?{kind:"wait"}:De(s.status,{error:s.code}):{kind:"wait"}}}presence(e){let t=()=>{if(this.engine!==e)return;let s=globalThis.document;(!s||s.visibilityState!=="hidden")&&this.as(e).presence().catch(()=>{}),this.timers.presence=setTimeout(t,Ys)};t()}as(e){return this.clients.get(e)}async seat(){let e=await this.ready();return{e,as:this.as(e)}}typed(e){let t=this.typingBy.get(e.conversation_id);t||this.typingBy.set(e.conversation_id,t=new Map),t.set(e.user_id,Date.now()+Vt),this.tell({list:!1,conversations:new Set([e.conversation_id]),threads:new Set,scheduled:!1}),setTimeout(()=>this.tell({list:!1,conversations:new Set([e.conversation_id]),threads:new Set,scheduled:!1}),Vt+50)}tell(e){for(let t of[...this.heard])t(e)}listen(e){return this.heard.add(e),this.ready().catch(()=>{}),()=>{this.heard.delete(e)}}onPerson(e){return this.reopeners.add(e),()=>{this.reopeners.delete(e)}}current(){return this.engine}typingIn(e){let t=Date.now();return[...this.typingBy.get(e)??[]].filter(([s,i])=>i>t&&s!==this.user).map(([s])=>s)}touch(e){this.tell({list:!1,conversations:new Set([e]),threads:new Set,scheduled:!1})}isSynced(){return this.synced}conversations(e={}){return new Ue(this,e.spaces??[])}deletedGroups(){return new Le(this)}conversation(e,t={}){return new qe(this,e,t.at??null)}async direct(e,t={}){let{e:s,as:i}=await this.seat(),n=(await i.openDirectConversation({body:{user_id:e,space:t.space}})).data;return this.changed({conversations:[n]},s),this.conversation(n.id)}async group(e){let{e:t,as:s}=await this.seat(),i=(await s.createGroup({body:{title:e.title,member_ids:e.memberIds,description:e.description,photo:e.photo,settings:e.settings,space:e.space,visibility:e.visibility}})).data;return this.changed({conversations:[i.conversation]},t),{conversation:this.conversation(i.conversation.id),notAdded:i.not_added}}thread(e,t,s={}){return new je(this,e,t,s.at??null)}async search(e,t={}){let s=Kt(e);if(s.words.length===0)return{conversations:[],messages:[],nextCursor:null};let i=t.by==="meaning",{e:n,as:a}=await this.seat(),o=async()=>{let m=t.cursor;for(let h=0;;h++){let p={q:e,...i?{by:"meaning"}:{},conversation_id:t.conversationId,...t.space?{space:[t.space]}:{},limit:t.limit,cursor:m},y=(await a.searchMessages({query:p})).data;if(i||y.data.length>0||!y.next_cursor||h+1===ei)return y;m=y.next_cursor}},[l,d]=await Promise.all([o(),i||t.cursor||t.conversationId?Promise.resolve([]):this.named(s,n,t.space)]),c=Date.now();for(let m of l.profiles)this.people.set(m.user_id,{profile:m,at:c});let f=m=>m?this.people.get(m)?.profile??null:null,g=new Map(l.conversations.map(m=>[m.id,m])),S=l.data.flatMap(m=>{let h=g.get(m.message.conversation_id)??n.store.conversations.get(m.message.conversation_id);if(!h)return[];let p=h.kind==="direct"?f(h.peer_id):null;return[{message:m.message,conversation:h,title:h.kind==="direct"?p?.name??null:h.title,photo:h.kind==="direct"?p?.image??null:h.photo,sender:f(m.message.sender_id),peer:p,matches:m.matches,score:m.score??null,threadRootId:m.message.thread_id&&!m.message.also_in_conversation?m.message.thread_id:null}]});return{conversations:d,messages:S,nextCursor:i?null:l.next_cursor??null}}async named(e,t,s){let i=t.store.list().filter(a=>!s||a.space===s),n=[...new Set(i.filter(a=>a.kind==="direct"&&a.peer_id).map(a=>a.peer_id))].filter(a=>{let o=this.people.get(a);return!o||Date.now()-o.at>Qs});for(let a=0;a<n.length;a+=100){let o=n.slice(a,a+100);try{let l=(await this.as(t).getProfiles({query:{user_ids:o.join(",")}})).data.data,d=Date.now();for(let c of o)this.people.set(c,{profile:l.find(f=>f.user_id===c)??null,at:d})}catch{}}return i.flatMap(a=>{let o=a.kind==="direct"&&a.peer_id?this.people.get(a.peer_id)?.profile??null:null,l=a.kind==="direct"?o?.name??null:a.title,d=l?$t(e,l):null;return d?[{conversation:a,title:l,photo:a.kind==="direct"?o?.image??null:a.photo,peer:o,matches:d[0]}]:[]})}async openGroups(e,t={}){let{as:s}=await this.seat(),i=(await s.listOpenGroups({query:{space:e,limit:t.limit,cursor:t.cursor}})).data;return{items:i.data,nextCursor:i.next_cursor??null}}async join(e){let{e:t,as:s}=await this.seat(),i=(await s.joinGroup({path:{conversation_id:e}})).data;return this.changed({conversations:[i]},t),this.conversation(i.id)}scheduled(){return new Ke(this)}async threads(){let{as:e}=await this.seat();return(await e.listThreads()).data.data}async send(e,t){let{e:s}=await this.seat(),i=typeof t=="string"?{text:t}:t,n=i.files?.length?await this.upload(e,i.files):void 0,a={client_message_id:crypto.randomUUID(),...i.text!==void 0?{text:i.text}:{},...i.mentions?{mentions:i.mentions}:{},...n?{attachments:n}:{},...i.replyTo?{reply_to_id:i.replyTo}:{},...i.threadId?{thread_id:i.threadId}:{},...i.alsoInConversation?{also_in_conversation:!0}:{},...i.expiresIn!==void 0?{expires_in:i.expiresIn,expires_from:i.expiresFrom??"send"}:{},...i.viewOnce?{view_once:{limit:i.viewOnce.limit,...i.viewOnce.seconds?{seconds:i.viewOnce.seconds}:{}}}:{},...i.sendAt?{send_at:i.sendAt.toISOString()}:{}};if(s!==this.engine)throw new T(`the session is no longer ${s.me}'s`);let o=s.write(e,a,new Date().toISOString());return this.tell({list:!1,conversations:new Set([e]),threads:new Set(i.threadId?[i.threadId]:[]),scheduled:!1}),this.save(),this.flush(),o}async upload(e,t){let{as:s}=await this.seat(),i=[];for(let n of t){let a=n.data instanceof Uint8Array?n.data:new Uint8Array(await n.data.arrayBuffer()),{sealed:o,fileKey:l}=await Nt(a),d=(await s.createUpload({path:{conversation_id:e},body:{size:o.length}})).data,c=await this.fetchFn(d.url,{method:"PUT",body:o,headers:{"content-type":"application/octet-stream"}});if(!c.ok)throw new w({op:"UploadFile",status:c.status,code:"upload_failed",message:`the file was not uploaded (${c.status})`});i.push({upload_id:d.id,content_type:n.contentType,file_key:l,...n.name?{name:n.name}:{},...n.width?{width:n.width}:{},...n.height?{height:n.height}:{},...n.durationMs?{duration_ms:n.durationMs}:{},...n.thumbnail?{thumbnail:n.thumbnail}:{}})}return i}async open(e,t){let{as:s}=await this.seat(),i=e.attachments.find(a=>a.id===t);if(!i?.file_key)throw new w({op:"OpenFile",status:404,code:"attachment_not_found",message:"no such file of the message, or one seen once"});let n=(await s.attachmentUrl({path:{conversation_id:e.conversation_id,message_id:e.id,attachment_id:i.id}})).data;return{id:i.id,name:i.name,contentType:i.content_type,bytes:await this.bytes(n.url,i.file_key)}}async viewOnce(e){let{as:t}=await this.seat(),s=(await t.viewOnce({path:{conversation_id:e.conversation_id,message_id:e.id}})).data;return Promise.all(s.attachments.map(async i=>({id:i.id,name:null,contentType:i.content_type,bytes:await this.bytes(i.url,i.file_key)})))}async bytes(e,t){let s=await this.fetchFn(e);if(!s.ok)throw new w({op:"OpenFile",status:s.status,code:"download_failed",message:`the file was not read (${s.status})`});return Ut(new Uint8Array(await s.arrayBuffer()),t)}async edit(e,t,s,i){let{e:n,as:a}=await this.seat(),o=(await a.editMessage({path:{conversation_id:e,message_id:t},body:{text:s,...i?{mentions:i}:{}}})).data;return this.changed({messages:[o]},n),o}async remove(e,t,s="everyone"){let{e:i,as:n}=await this.seat(),a=await n.deleteMessage({path:{conversation_id:e,message_id:t},query:{for:s}});a.status===200?this.changed({messages:[a.data]},i):this.changed({hidden:[{conversation_id:e,message_id:t}]},i)}async react(e,t,s,i={}){let{e:n,as:a}=await this.seat(),o=(await a.react({path:{conversation_id:e,message_id:t,emoji:s},body:i.replace?{replace:!0}:{}})).data;return this.changed({messages:[o]},n),o}async unreact(e,t,s){let{e:i,as:n}=await this.seat(),a=(await n.unreact({path:{conversation_id:e,message_id:t,emoji:s}})).data;return this.changed({messages:[a]},i),a}async markRead(e,t,s){let{e:i,as:n}=await this.seat(),{upTo:a,touched:o}=i.read(e,t,s);a<=0||((o.list||o.conversations.size>0||o.threads.size>0)&&(this.tell(o),this.save()),await n.receipts({body:{receipts:[{conversation_id:e,read_seq:a,...s?{thread_id:s}:{}}]}}))}async typing(e,t){let{as:s}=await this.seat(),i=this.typedAt.get(e)??0;Date.now()-i<Xs||(this.typedAt.set(e,Date.now()),await s.typing({path:{conversation_id:e},body:t?{thread_id:t}:{}}).catch(()=>{}))}async update(e,t){let{e:s,as:i}=await this.seat(),n=(await i.updateConversation({path:{conversation_id:e},body:t})).data;return this.changed({conversations:[n]},s),n}async close(e){let{e:t,as:s}=await this.seat();if(await s.closeConversation({path:{conversation_id:e}}),t!==this.engine)return;let i=t.store.conversations.get(e)?.me,n=l=>l.vanish&&l.sender_id!==t.me&&i&&l.seq<=i.read_seq,a=t.store.timeline(e).filter(n);for(let l of a)t.store.expire(e,l.id);let o=this.fromWindows(e,l=>[...l.messages.values()].filter(n).map(d=>l.expire(d.id)).includes(!0));(a.length>0||o)&&(this.tell({list:!0,conversations:new Set([e]),threads:new Set,scheduled:!1}),this.save())}async screenshot(e){let{e:t,as:s}=await this.seat(),i=(await s.reportScreenshot({path:{conversation_id:e}})).data;return this.changed({messages:[i]},t),i}async leave(e){let{e:t,as:s}=await this.seat();await s.removeMember({path:{conversation_id:e,user_id:t.me}}),this.sync()}async deleteConversation(e){let{e:t,as:s}=await this.seat();await s.deleteConversation({path:{conversation_id:e}}),this.changed({removed_conversations:[{conversation_id:e,reason:"deleted"}]},t)}async notifications(e,t){let{as:s}=await this.seat();await s.setConversationNotifications({path:{conversation_id:e},body:t}),this.sync()}async cancelScheduled(e){let{e:t,as:s}=await this.seat();await s.cancelScheduled({path:{scheduled_id:e}}),t===this.engine&&t.store.scheduled.delete(e)&&(this.tell({list:!1,conversations:new Set,threads:new Set,scheduled:!0}),this.save())}async editScheduled(e,t){let{e:s,as:i}=await this.seat(),n=(await i.updateScheduled({path:{scheduled_id:e},body:t})).data;return this.changed({scheduled:[n]},s),n}async me(){let{as:e}=await this.seat();return(await e.getMyProfile()).data}async updateMe(e){let{as:t}=await this.seat(),s=(await t.updateMyProfile({body:e})).data;return e.read_receipts!==void 0&&this.sync(),s}async profiles(e){let{as:t}=await this.seat();return(await t.getProfiles({query:{user_ids:e.join(",")}})).data.data}async block(e){let{as:t}=await this.seat();await t.block({path:{user_id:e}})}async unblock(e){let{as:t}=await this.seat();await t.unblock({path:{user_id:e}})}async report(e){let{as:t}=await this.seat();return(await t.report({body:e})).data}async openPage(e){let{e:t}=await this.seat();this.loaded.has(e)||(this.loaded.add(e),t.store.timeline(e).length>0&&this.synced)||await this.page(e,null)}async page(e,t){let{e:s,as:i}=await this.seat(),n=(await i.listMessages({path:{conversation_id:e},query:t?{cursor:t,limit:50}:{limit:50}})).data;return s!==this.engine?!1:(this.earlier.set(e,n.next_cursor??null),this.changed({messages:n.data},s),!!n.next_cursor)}earlierOf(e){return this.earlier.get(e)}async openAt(e,t){let{e:s,as:i}=await this.seat(),n=s.store.messages.get(e)?.get(t),a=this.earlier.get(e);if(n&&a!==void 0&&(a===null||parseInt(a,36)<=n.seq))return null;let o=(await i.listMessages({path:{conversation_id:e},query:{around:t,limit:50}})).data;if(s!==this.engine)return null;let l=new Ne(e);return this.putWindow(l,o.data),l.earlier=o.next_cursor??null,l.later=o.newer_cursor??null,l.later===null?(this.merge(l,s),null):(this.windows.add(l),l)}async windowPage(e,t){let{e:s,as:i}=await this.seat(),n=t==="earlier"?e.earlier:e.later;if(n===null||e.merged)return;let a=t==="earlier"?{cursor:n,limit:50}:{after:n,limit:50},o=(await i.listMessages({path:{conversation_id:e.conversationId},query:a})).data;s!==this.engine||e.merged||(this.putWindow(e,o.data),t==="earlier"?e.earlier=o.next_cursor??null:e.later=o.newer_cursor??null,e.later===null?this.merge(e,s):this.tell({list:!1,conversations:new Set([e.conversationId]),threads:new Set,scheduled:!1}))}dropWindow(e){e.merged=!0,this.windows.delete(e)}merge(e,t){this.dropWindow(e);let s=e.conversationId,i=this.earlier.get(s),n=i===void 0||i!==null&&(e.earlier===null||parseInt(e.earlier,36)<parseInt(i,36))?e.earlier:i;this.earlier.set(s,n),this.loaded.add(s),this.changed({messages:[...e.messages.values()]},t),this.tell({list:!1,conversations:new Set([s]),threads:new Set,scheduled:!1})}async openThread(e,t,s=null){let{e:i,as:n}=await this.seat(),a=(await n.getMessage({path:{conversation_id:e,message_id:t}})).data,o=[],l;for(let d=0;d<Zs;d++){let c=(await n.listReplies({path:{conversation_id:e,message_id:t},query:l?{limit:100,cursor:l}:{limit:100}})).data;if(o.push(...c.data),l=c.next_cursor,!l||!s||o.some(f=>f.id===s))break}this.changed({messages:[a,...o]},i)}async openScheduled(){let{e,as:t}=await this.seat();this.changed({scheduled:(await t.listScheduled()).data.data},e)}},q=class{listeners=new Set;unlisten=null;unperson=null;cached=null;m;constructor(e){this.m=e}get state(){return this.unlisten?this.cached??=this.read():this.read()}subscribe(e){return this.listeners.add(e),this.unlisten||(this.cached=null,this.unlisten=this.m.listen(t=>{if(this.touches(t)){this.cached=this.read();for(let s of[...this.listeners])s()}}),this.unperson=this.m.onPerson(()=>{this.cached=null,this.opened();for(let t of[...this.listeners])t()}),this.opened()),()=>{this.listeners.delete(e),this.listeners.size===0&&(this.unlisten?.(),this.unperson?.(),this.unlisten=null,this.unperson=null,this.closed())}}opened(){}closed(){}},Ue=class extends q{spaces;constructor(e,t=[]){super(e),this.spaces=[...t]}touches(e){return e.list||e.conversations.size>0}read(){let e=this.m.current()?.store.list()??[],t=this.spaces.length===0?e:e.filter(s=>s.space!=null&&this.spaces.includes(s.space));return{items:t,unread:t.reduce((s,i)=>s+(i.me?.unread_count??0),0),synced:this.m.isSynced()}}},Le=class extends q{touches(e){return e.list}read(){return{items:this.m.current()?.deletedGroups()??[]}}},qe=class extends q{id;focus;window=null;opening=null;settled=!1;constructor(e,t,s=null){super(e),this.id=t,this.focus=s}opened(){if(!this.focus){this.m.openPage(this.id).catch(()=>{});return}this.window&&this.m.dropWindow(this.window),this.window=null,this.settled=!1,this.opening=this.m.openAt(this.id,this.focus).then(e=>{this.window=e,e||this.m.openPage(this.id).catch(()=>{})}).catch(()=>{this.m.openPage(this.id).catch(()=>{})}).finally(()=>{this.settled=!0,this.m.touch(this.id)})}closed(){this.window&&this.m.dropWindow(this.window),this.window=null}touches(e){return e.conversations.has(this.id)}stretch(){return this.window?.merged&&(this.window=null),this.window}read(){let e=this.m.current(),t=this.stretch(),s=this.focus!==null&&!this.settled;return{conversation:e?.store.conversations.get(this.id)??null,entries:s?[]:t?t.entries():e?.timeline(this.id)??[],members:e?.store.membersOf(this.id)??[],typing:this.m.typingIn(this.id),hasEarlier:t?t.earlier!==null:this.m.earlierOf(this.id)!==null,hasLater:t!==null,focus:this.focus}}refresh(){return this.m.page(this.id,null)}async loadEarlier(){await this.opening;let e=this.stretch();if(e)return await this.m.windowPage(e,"earlier"),e.earlier!==null;let t=this.m.earlierOf(this.id);return t===null?!1:this.m.page(this.id,t??null)}async loadLater(){await this.opening;let e=this.stretch();return e?(await this.m.windowPage(e,"later"),this.stretch()!==null):!1}showLatest(){this.window&&(this.m.dropWindow(this.window),this.window=null,this.m.openPage(this.id).catch(()=>{}),this.m.touch(this.id))}send(e){return this.m.send(this.id,e)}markRead(e){return this.m.markRead(this.id,e)}typing(){return this.m.typing(this.id)}thread(e){return this.m.thread(this.id,e)}},je=class extends q{conversationId;rootId;focus;constructor(e,t,s,i=null){super(e),this.conversationId=t,this.rootId=s,this.focus=i}opened(){this.m.openThread(this.conversationId,this.rootId,this.focus).catch(()=>{})}touches(e){return e.threads.has(this.rootId)||e.conversations.has(this.conversationId)}read(){let e=this.m.current();return{root:e?.store.messages.get(this.conversationId)?.get(this.rootId)??null,entries:e?.answers(this.conversationId,this.rootId)??[],thread:e?.store.threads.get(this.rootId)??null,focus:this.focus}}send(e){let t=typeof e=="string"?{text:e}:e;return this.m.send(this.conversationId,{...t,threadId:this.rootId})}markRead(){return this.m.markRead(this.conversationId,void 0,this.rootId)}},Ke=class extends q{opened(){this.m.openScheduled().catch(()=>{})}touches(e){return e.scheduled}read(){return[...this.m.current()?.store.scheduled.values()??[]].sort((e,t)=>e.send_at<t.send_at?-1:1)}};var Wt=async r=>si(await import("livekit-client"))(r);function si(r){return async e=>{let t=new r.Room({adaptiveStream:!1,dynacast:!0,stopLocalTrackOnUnpublish:!1}),s=()=>t.localParticipant,i={microphone:r.Track.Source.Microphone,camera:r.Track.Source.Camera,screen:r.Track.Source.ScreenShare,screen_audio:r.Track.Source.ScreenShareAudio},n=(l,d)=>d.source===r.Track.Source.ScreenShare?"screen":d.source===r.Track.Source.ScreenShareAudio?"screen_audio":l.kind==="video"?"camera":"microphone",a=!1;t.on(r.RoomEvent.TrackSubscribed,(l,d,c)=>e.track(c.identity,l.mediaStreamTrack,n(l,d))).on(r.RoomEvent.TrackUnsubscribed,(l,d,c)=>e.trackGone(c.identity,l.mediaStreamTrack)).on(r.RoomEvent.TrackMuted,(l,d)=>{d!==s()&&l.track&&e.muted(d.identity,l.track.mediaStreamTrack,!0)}).on(r.RoomEvent.TrackUnmuted,(l,d)=>{d!==s()&&l.track&&e.muted(d.identity,l.track.mediaStreamTrack,!1)}).on(r.RoomEvent.Reconnecting,()=>e.state("reconnecting")).on(r.RoomEvent.Reconnected,()=>e.state("connected")).on(r.RoomEvent.ActiveSpeakersChanged,l=>e.speakers(l.map(d=>d.identity))).on(r.RoomEvent.Disconnected,()=>{a||e.state("disconnected")});let o=new Map;return{async connect(l,d){await t.connect(l,d),e.state("connected")},async publish(l,d){o.set(l,await s().publishTrack(l,{source:i[d]}))},async unpublish(l){o.delete(l),await s().unpublishTrack(l,!1)},async mute(l,d){let c=o.get(l);c&&await(d?c.mute():c.unmute())},async close(){a=!0,await t.disconnect()}}}}var ii=/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/,$e=class extends w{call;constructor(e,t){super({op:e.op,status:e.status,code:e.code,message:e.message,requestId:e.requestId,retryAfter:e.retryAfter,body:e.body,cause:e}),this.name="PlaceBusyError",this.call=t}},Ve=class{id;c;call;snapshot;listeners=new Set;owned=!1;entering=!1;phase="incoming";endReason=null;error=null;local=null;tracks={audio:null,video:null};opened=new Set;mic=!0;facing="user";shared=null;sharing=null;room=null;joiningRoom=null;roomState=null;streams=new Map;screens=new Map;owners=new Map;speakers=new Set;mutedInRoom=new Set;players=new Map;sink=null;quieted=!1;heartbeat;poll;done=!1;constructor(e,t,s=!1){this.c=e,this.id=t.id,this.call=t,this.entering=s,this.derive()}get state(){return this.snapshot}subscribe(e){return this.listeners.add(e),()=>this.listeners.delete(e)}async accept(e={}){if(this.phase!=="incoming"&&this.phase!=="invited")throw this.refused("accept","not_ringing","the call does not ring here now");await this.enter(e,t=>this.c.api.acceptCall({path:{call_id:this.id},body:t}))}async join(e={}){if(this.owned&&!this.done)return;if(this.done)throw this.refused("join","call_ended","this session is over: pb.calls.join(callId) comes into the call again");let t={...e.name===void 0?{}:{name:e.name},...e.imageUrl===void 0?{}:{image_url:e.imageUrl}};await this.enter(e,s=>this.c.api.joinCall({path:{call_id:this.id},body:{...s,...t}}))}async decline(){let e=await this.c.api.declineCall({path:{call_id:this.id}}).catch(t=>this.refusal(t));this.apply(e.data)}async leave(){try{let e=await this.c.api.leaveCall({path:{call_id:this.id}});this.apply(e.data)}finally{!this.done&&this.owned&&this.end("left")}}async invite(e,t={}){let s=typeof e=="string"?[e]:e,i=await this.c.api.inviteToCall({path:{call_id:this.id},body:{user_ids:s,...t.ring===void 0?{}:{ring:t.ring}}});this.apply(i.data)}async setMicrophone(e){this.mic=e;let t=this.tracks.audio;t&&(t.enabled=e),this.changed(),t&&this.room&&await this.room.mute(t,!e)}async setCamera(e){if(!e){if(!this.tracks.video)return;await this.putVideo(null);return}this.tracks.video||await this.putVideo(await this.camera({facingMode:this.facing}))}async switchCamera(e){e===void 0&&(this.facing=this.facing==="user"?"environment":"user"),await this.putVideo(await this.camera(e===void 0?{facingMode:this.facing}:{deviceId:{exact:e}}))}async setScreenShare(e,t={}){if(!e){await this.sharing?.catch(()=>{}),await this.putScreen(null);return}if(this.shared)return;if(this.sharing)return this.sharing;if(!this.inCall)throw this.refused("setScreenShare","not_in_call","a screen is shared in a call this device is in");let s=this.c.rtc(),i=s.getDisplayMedia?.bind(s);if(!i)throw new TypeError("calls: this browser shares no screen (getDisplayMedia)");return this.sharing=(async()=>{let n=await i({video:!0,audio:t.audio===!0}),a=n.getVideoTracks()[0],o=t.audio===!0?n.getAudioTracks()[0]??null:null;for(let l of n.getTracks())l!==a&&l!==o&&l.stop();if(!a||this.done){for(let l of n.getTracks())l.stop();if(!a)throw new Error("calls: the screen gave no video");return}this.opened.add(a),o&&this.opened.add(o),a.addEventListener?.("ended",()=>{this.shared?.video===a&&this.putScreen(null).catch(()=>{})}),await this.putScreen({video:a,audio:o,stream:new s.MediaStream([a,...o?[o]:[]])})})().finally(()=>this.sharing=null),this.sharing}async setAudioOutput(e){this.sink=e;for(let t of this.players.values())await Ht(t,e)}async refresh(){let e=await this.c.api.getCall({path:{call_id:this.id}});this.apply(e.data)}apply(e){e.id!==this.id||e.version<this.call.version||(this.call=e,this.derive())}caughtUp(){!this.owned||this.done||this.refresh().catch(()=>{})}online(){this.inCall&&!this.room&&this.toRoom()}get inCall(){return this.owned&&!this.done}drop(){this.done||this.end(this.endReason??"left")}me(){return this.call.participants.find(e=>e.user_id===this.c.me)}derive(){if(this.done)return;let e=this.call,t=this.me();if(e.state==="ended")return this.end(oi(e,t));let s=t?.state==="joined"&&t.device_id===this.c.device;if(s&&this.entering&&(this.owned=!0),this.owned){if(t?.state==="joined"&&!s)return this.end("answered_elsewhere","elsewhere");if(!s)return this.end(t?.state??"left");this.quiet(),this.beat(),this.phase=e.state==="ringing"?"calling":this.mediaPhase(),this.toRoom()}else if(t?.state==="ringing")this.phase="incoming";else if(t?.state==="invited")this.phase="invited";else if(this.entering)this.phase="connecting";else if(t?.state==="joined")this.phase="elsewhere",this.quiet();else return this.end(t?.state??"ended");this.changed()}mediaPhase(){return this.roomState==="connected"?"connected":this.roomState==="reconnecting"?"reconnecting":"connecting"}async enter(e,t){this.entering=!0;try{await this.open(e.video??this.call.video,e.media);let s=await t({device_id:this.c.device});this.apply(s.data)}catch(s){this.entering=!1,this.owned||this.release();let i=We(s);throw i?this.apply(i):this.derive(),s}this.entering=!1,this.derive(),this.inCall&&this.c.entered(this)}own(e){if(this.done){for(let t of e.opened)t.stop();return}this.owned=!0,this.local=e.local,this.tracks=e.tracks;for(let t of e.opened)this.opened.add(t);this.derive()}async open(e,t){let s=await Bt(this.c.rtc(),e,t);this.local=s.local,this.tracks=s.tracks;for(let i of s.opened)this.opened.add(i)}async camera(e){try{let s=(await this.c.rtc().getUserMedia({video:e})).getVideoTracks()[0];if(!s)throw new Error("calls: the camera gave no video");return this.opened.add(s),s}catch(t){throw this.error=t instanceof Error?t:new Error(String(t)),this.changed(),t}}async putVideo(e){let t=this.tracks.video;this.tracks.video=e,t&&this.local?.removeTrack(t),e&&this.local?.addTrack(e),this.changed(),this.room&&(t&&await this.room.unpublish(t).catch(()=>{}),e&&await this.room.publish(e,"camera")),t&&t!==e&&this.stopIfOpened(t)}async putScreen(e){let t=this.shared;if(!(!t&&!e)){if(this.shared=e,this.changed(),this.room){if(t)for(let s of[t.video,t.audio])s&&await this.room.unpublish(s).catch(()=>{});e&&(await this.room.publish(e.video,"screen"),e.audio&&await this.room.publish(e.audio,"screen_audio"))}if(t)for(let s of[t.video,t.audio])s&&this.stopIfOpened(s)}}sent(){let e=[];return this.tracks.audio&&e.push([this.tracks.audio,"microphone"]),this.tracks.video&&e.push([this.tracks.video,"camera"]),this.shared&&e.push([this.shared.video,"screen"]),this.shared?.audio&&e.push([this.shared.audio,"screen_audio"]),e}toRoom(){return this.room||this.joiningRoom||this.done?Promise.resolve():(this.joiningRoom=(async()=>{let e=(await this.c.api.getCallMedia({path:{call_id:this.id},body:{device_id:this.c.device}})).data;if(this.done)return;let t=await this.c.room({track:(s,i,n)=>{this.room===t&&this.heard(s,i,n)},trackGone:(s,i)=>{this.room===t&&this.gone(s,i)},muted:(s,i,n)=>{this.room===t&&(n?this.mutedInRoom.add(i):this.mutedInRoom.delete(i),this.changed())},speakers:s=>{this.room===t&&(this.speakers=new Set(s),this.changed())},state:s=>{if(this.room===t){if(this.roomState=s,s==="disconnected"){this.room=null,this.roomState=null,this.speakers=new Set;for(let[i,n]of[...this.owners])this.gone(n,i);t.close().catch(()=>{})}this.derive()}}});if(this.done){await t.close();return}this.room=t,this.roomState=null,await t.connect(e.url,e.token);for(let[s,i]of this.sent())await t.publish(s,i);this.tracks.audio&&!this.mic&&await t.mute(this.tracks.audio,!0),this.derive()})().catch(e=>{let t=this.room;this.room=null,this.roomState=null,t?.close().catch(()=>{}),this.failed(e)}).finally(()=>this.joiningRoom=null),this.joiningRoom)}streamOf(e,t=this.streams){let s=t.get(e);return s||t.set(e,s=new(this.c.rtc()).MediaStream),s}heard(e,t,s){let i=s==="screen"||s==="screen_audio",n=this.streamOf(e,i?this.screens:this.streams);for(let a of n.getTracks())a.kind===t.kind&&a!==t&&this.gone(e,a);if(n.getTracks().includes(t)||n.addTrack(t),!this.owners.has(t)){let a=()=>this.changed();t.addEventListener?.("mute",a),t.addEventListener?.("unmute",a),t.addEventListener?.("ended",a)}this.owners.set(t,e),t.kind==="audio"&&this.play(i?`${e}\0screen`:e,n),this.changed()}gone(e,t){this.owners.delete(t),this.mutedInRoom.delete(t),this.streams.get(e)?.removeTrack(t),this.screens.get(e)?.removeTrack(t),this.changed()}play(e,t){if(!this.c.playAudio||this.players.has(e))return;let s=globalThis.document;if(!s)return;let i=s.createElement("audio");i.autoplay=!0,i.srcObject=t,this.players.set(e,i),this.sink&&Ht(i,this.sink).catch(()=>{}),i.play?.()?.catch?.(()=>{})}beat(){this.heartbeat===void 0&&(this.heartbeat=setInterval(()=>{this.stillHere()},this.c.heartbeatMs)),this.poll===void 0&&(this.poll=setInterval(()=>{this.c.live()||this.done||this.refresh().catch(()=>{})},this.c.pollMs))}async stillHere(){if(!this.done)try{let e=(await this.c.api.callHeartbeat({path:{call_id:this.id},body:{device_id:this.c.device}})).data;(e.version>this.call.version||!e.in_call||e.state==="ended")&&await this.refresh()}catch(e){e instanceof w&&e.status===404&&this.end("ended")}}end(e,t="ended"){if(this.done)return;this.done=!0,this.entering=!1,this.phase=t,this.quiet(),this.endReason=e,clearInterval(this.heartbeat),clearInterval(this.poll);let s=this.room;this.room=null,this.shared=null,this.speakers=new Set,s?.close().catch(()=>{});for(let i of this.players.values())i.pause?.(),i.srcObject=null;this.players.clear(),this.release(),this.changed(),this.c.forget(this)}release(){for(let e of this.opened)e.stop();this.opened.clear()}stopIfOpened(e){this.opened.delete(e)&&e.stop()}quiet(){this.quieted||(this.quieted=!0,this.c.quiet(this.id))}failed(e){this.done||(this.error=e instanceof Error?e:new Error(String(e)),this.changed())}refusal(e){let t=We(e);throw t&&this.apply(t),e}refused(e,t,s){return new w({op:e,status:409,code:t,message:`${e}: ${s}`})}changed(){let e=this.c.me,t=this.owned&&!this.done,s=t?this.call.participants.filter(a=>a.user_id!==e&&a.state==="joined"):[],i=s.map(a=>this.remoteOf(a.user_id,a));if(t)for(let a of new Set([...this.streams.keys(),...this.screens.keys()]))(this.streams.get(a)?.getTracks().length??0)+(this.screens.get(a)?.getTracks().length??0)>0&&!s.some(l=>l.user_id===a)&&i.push(this.remoteOf(a));let n=this.mic&&this.tracks.audio!==null;this.snapshot={call:this.call,me:this.me()??null,phase:this.phase,outgoing:this.call.caller_id===e,local:t?this.local:null,microphone:n,camera:this.tracks.video!==null,screenSharing:t&&this.shared!==null,screen:t?this.shared?.stream??null:null,speaking:t&&n&&this.speakers.has(e),remote:i,endReason:this.endReason,error:this.error};for(let a of[...this.listeners])try{a()}catch{}}remoteOf(e,t){let s=this.streamOf(e),i=this.screens.get(e),n=(a,o)=>a.getTracks().some(l=>l.kind===o&&l.readyState!=="ended"&&!l.muted&&!this.mutedInRoom.has(l));return{userId:e,name:t?.name??null,imageUrl:t?.image_url??null,bot:t?.kind==="bot"||e.startsWith("bot:"),stream:s,audio:n(s,"audio"),video:n(s,"video"),screen:i&&n(i,"video")?i:null,speaking:this.speakers.has(e)}}},ve=class{deviceId;transportFor;session;socket;ref;opts;beacon;user=null;api=null;channel=null;off=[];sessions=new Map;incoming=new Set;entered=new Set;places=new Map;workerHeard=!1;constructor(e,t,s,i,n,a,o={}){this.transportFor=e,this.session=t,this.socket=s,this.ref=i,this.deviceId=n,this.beacon=a,this.opts=o,t.onChange((d,c)=>{if(d==="SIGNED_OUT"||d==="SESSION_EXPIRED")return this.stop();if(d==="SIGNED_IN"){if(this.user!==null&&c?.userId===this.user){this.unfollow(),this.follow(this.user);return}this.stop(),this.incoming.size>0&&this.ready().catch(()=>{})}});let l=globalThis;l.addEventListener?.("online",()=>{for(let d of this.sessions.values())d.online()}),l.addEventListener?.("pagehide",()=>{for(let d of this.sessions.values())d.inCall&&this.beacon(`/calls/${encodeURIComponent(d.id)}/leave`)})}get current(){for(let e of this.sessions.values())if(e.inCall)return e;return null}async start(e,t={}){let s=typeof e=="string"?[e]:[...e];if(s.length===0&&t.place===void 0)throw new TypeError("calls.start: name the person (or people) to call, or the place to hold it at");t.place!==void 0&&Gt("calls.start",t.place),await this.ready();let i=this.api,n=await Bt(this.rtc(),t.video===!0,t.media),a;try{a=(await i.startCall({body:{user_ids:s,device_id:this.deviceId,video:t.video===!0,...t.ring===void 0?{}:{ring:t.ring},...t.group===void 0?{}:{group:t.group},...t.conversationId===void 0?{}:{conversation_id:t.conversationId},...t.metadata===void 0?{}:{metadata:t.metadata},...t.callerName===void 0?{}:{caller_name:t.callerName},...t.callerImageUrl===void 0?{}:{caller_image_url:t.callerImageUrl},...t.place===void 0?{}:{place:t.place}}})).data}catch(l){for(let c of n.opened)c.stop();let d=l instanceof w&&l.code==="place_busy"?We(l):void 0;throw d?(this.places.get(d.place??"")?.heard(d),new $e(l,d)):l}a.place!==null&&this.places.get(a.place)?.heard(a);let o=this.sessionOf(a,!1);return o.own(n),o.inCall&&(this.sessions.set(o.id,o),this.tell(this.entered,o)),o}voice(e,t={}){return this.start(e,{...t,video:!1})}video(e,t={}){return this.start(e,{...t,video:!0})}async join(e,t={}){await this.ready();let s=typeof e=="string"?e:e.id,i=this.sessions.get(s);return i||(i=this.sessionOf(typeof e=="string"?await this.toJoin(e):e,!0)),await i.join(t),i}place(e){Gt("calls.place",e);let t=this.places.get(e);return t||(t=new Fe(e,{api:async()=>(await this.ready(),this.api),start:s=>this.start(s.userIds??[],{...s,place:e}),join:(s,i)=>this.join(s,i),live:()=>this.channel?.state==="joined",pollMs:this.opts.pollMs??2e3}),this.places.set(e,t)),t}onIncoming(e){return this.incoming.add(e),this.ready().catch(()=>{}),()=>this.incoming.delete(e)}onCall(e){return this.entered.add(e),()=>this.entered.delete(e)}async history(e={}){await this.ready();let t={};return e.limit!==void 0&&(t.limit=e.limit),e.cursor!==void 0&&(t.cursor=e.cursor),e.missed!==void 0&&(t.missed=e.missed),e.state!==void 0&&(t.state=e.state),(await this.api.listCalls({query:t})).data}async get(e){return await this.ready(),(await this.api.getCall({path:{call_id:e}})).data}async ready(){let e=this.session.snapshot()??await this.session.session();if(!e)throw new w({op:"calls",status:401,code:"not_signed_in",message:"calls are the signed-in person's: sign in first"});this.user===e.userId&&this.api||(this.stop(),this.user=e.userId,this.api=Be.client(this.transportFor(e.userId)),this.follow(e.userId),this.listenToWorker(),this.ringing().catch(()=>{}))}stop(){this.unfollow();for(let e of[...this.sessions.values()])e.drop();if(this.sessions.clear(),this.user!==null)for(let e of this.places.values())e.drop();this.user=null,this.api=null}unfollow(){for(let e of this.off.splice(0))e();this.channel?.leave(),this.channel=null}follow(e){let t=this.socket.channel(`calls:${this.ref}:${e}`);this.channel=t,this.off.push(t.on("broadcast",s=>{if(this.user===e){if(s.event==="call"){let i=s.payload;this.heardCall(i),i.place&&this.places.get(i.place)?.heard(i)}else if(s.event==="place"){let i=s.payload;this.places.get(i.place)?.told(i)}}}),t.onJoined(()=>{if(this.user===e){for(let s of this.sessions.values())s.caughtUp();for(let s of this.places.values())s.caughtUp();this.ringing().catch(()=>{})}})),t.join().catch(()=>{})}async toJoin(e){try{return(await this.api.getCall({path:{call_id:e}})).data}catch(t){if(!(t instanceof w)||t.status!==404)throw t;for(let s of this.places.values())if(s.state.call?.id===e)return s.state.call;throw t}}async ringing(){let e=this.user,t=this.api;if(!t)return;let s=await Promise.all([t.listCalls({query:{state:"ringing",limit:20}}),t.listCalls({query:{state:"active",limit:20}})]);if(this.user===e)for(let i of s)for(let n of i.data.calls)this.heardCall(n)}listenToWorker(){if(this.workerHeard)return;let e=globalThis.navigator?.serviceWorker;e?.addEventListener&&(this.workerHeard=!0,e.addEventListener("message",t=>{let s=t.data,i=s?.type==="palbase.push"?s.data?.call_id:void 0;!i||s?.data?.pb_call!=="incoming"||!this.api||this.api.getCall({path:{call_id:i}}).then(n=>this.heardCall(n.data)).catch(()=>{})}))}heardCall(e){let t=this.sessions.get(e.id);if(t){t.apply(e);return}let s=e.participants.find(i=>i.user_id===this.user);e.state==="ended"||s?.state!=="ringing"&&s?.state!=="invited"||this.tell(this.incoming,this.sessionOf(e,!1))}tell(e,t){for(let s of[...e])try{s(t)}catch{}}sessionOf(e,t){let s=this.sessions.get(e.id);if(s)return s.apply(e),s;let i=this.sessions,n=new Ve({api:this.api,me:this.user,device:this.deviceId,rtc:()=>this.rtc(),room:this.opts.room??Wt,playAudio:this.opts.playAudio!==!1,heartbeatMs:this.opts.heartbeatMs??15e3,pollMs:this.opts.pollMs??2e3,live:()=>this.channel?.state==="joined",forget(a){i.get(a.id)===a&&i.delete(a.id)},quiet:a=>li(a),entered:a=>{i.set(a.id,a),this.tell(this.entered,a)}},e,t);return n.state.phase!=="ended"&&i.set(e.id,n),n}rtc(){if(this.opts.rtc)return this.opts.rtc;let e=globalThis;if(typeof e.RTCPeerConnection!="function"||typeof e.MediaStream!="function"||typeof e.navigator?.mediaDevices?.getUserMedia!="function")throw new TypeError("calls: this runtime has no WebRTC (RTCPeerConnection, navigator.mediaDevices): a call's media is a browser's");let t=e.navigator.mediaDevices;return{MediaStream:e.MediaStream,getUserMedia:s=>t.getUserMedia(s),...typeof t.getDisplayMedia=="function"?{getDisplayMedia:s=>t.getDisplayMedia(s)}:{}}}},ni=120,ri=1e4,ai=32,Fe=class{place;c;snapshot;listeners=new Set;call=null;error=null;watchers=0;renewing=null;timer;poll;words=0;ended=new Set;constructor(e,t){this.place=e,this.c=t,this.snapshot=this.make()}get state(){return this.snapshot}subscribe(e){return this.listeners.add(e),()=>this.listeners.delete(e)}async refresh(){let e=await this.c.api(),t=this.words;try{this.take((await e.getCallPlace({path:{place:this.place}})).data,t)}catch(s){this.fail(s)}return this.call}async watch(){this.watchers++,this.changed();try{await this.renew()}catch(e){throw this.watchers=Math.max(0,this.watchers-1),this.watchers===0&&this.idle(),this.changed(),e}return this.call}async unwatch(){if(this.watchers===0||--this.watchers>0||(this.idle(),this.changed(),await this.renewing?.catch(()=>{}),this.watchers>0))return;await(await this.c.api()).unwatchCallPlace({path:{place:this.place}})}start(e={}){return this.c.start(e)}async join(e={}){let t=this.call??await this.refresh();if(!t)throw new w({op:"join",status:404,code:"call_not_found",message:`join: no call goes on at ${this.place}`});return this.c.join(t,e)}told(e){this.words++,e.call?this.heard(e.call):this.set(null)}heard(e){if(e.place===this.place){if(e.state==="ended"){this.ended.add(e.id),this.ended.size>ai&&this.ended.delete(this.ended.values().next().value),this.call?.id===e.id&&this.set(null);return}this.ended.has(e.id)||this.call?.id===e.id&&e.version<this.call.version||this.set({...e,participants:e.participants.map(t=>t.device_id===null?t:{...t,device_id:null})})}}caughtUp(){this.watchers>0&&this.renew().catch(()=>{})}drop(){this.watchers=0,this.idle(),this.call=null,this.error=null,this.ended.clear(),this.changed()}renew(){if(this.renewing)return this.renewing;clearTimeout(this.timer),this.timer=void 0;let e=this.words;return this.renewing=(async()=>(await(await this.c.api()).watchCallPlace({path:{place:this.place}})).data)().then(t=>(this.watchers===0||(this.error=null,this.take(t,e),this.later(Math.max(1,(t.watch_seconds??ni)/2)*1e3),this.polling()),t),t=>(this.watchers>0&&(!(t instanceof w)||t.isNetworkError||t.status===429||t.status>=500?this.later(ri):(this.watchers=0,this.idle())),this.fail(t))).finally(()=>this.renewing=null),this.renewing}later(e){clearTimeout(this.timer),this.timer=setTimeout(()=>{this.renew().catch(()=>{})},e)}polling(){this.poll===void 0&&(this.poll=setInterval(()=>{this.watchers===0||this.c.live()||this.refresh().catch(()=>{})},this.c.pollMs))}idle(){clearTimeout(this.timer),clearInterval(this.poll),this.timer=void 0,this.poll=void 0}take(e,t){e.call?this.heard(e.call):this.words===t?this.set(null):this.changed()}set(e){this.call=e,this.error=null,this.changed()}fail(e){throw this.error=e instanceof Error?e:new Error(String(e)),this.changed(),e}make(){return{place:this.place,call:this.call,watching:this.watchers>0,error:this.error}}changed(){this.snapshot=this.make();for(let e of[...this.listeners])try{e()}catch{}}};function Gt(r,e){if(!ii.test(e))throw new TypeError(`${r}: a place is 1 to 128 letters, digits and . _ : -, starting with a letter or digit (channel:42)`)}async function Bt(r,e,t){let s=t,i=[];if(!s){try{s=await r.getUserMedia({audio:!0,video:e?{facingMode:"user"}:!1})}catch(l){let d=l?.name;if(!e||d==="NotAllowedError"||d==="SecurityError")throw l;s=await r.getUserMedia({audio:!0,video:!1})}i.push(...s.getTracks())}let n=s.getAudioTracks()[0]??null,a=e?s.getVideoTracks()[0]??null:null;if(!t&&!e)for(let l of s.getVideoTracks())l.stop();return{local:new r.MediaStream([n,a].filter(l=>l!==null)),tracks:{audio:n,video:a},opened:i.filter(l=>l===n||l===a)}}function oi(r,e){return e?.state==="missed"||e?.state==="declined"||e?.state==="busy"?e.state:r.end_reason??"ended"}function We(r){if(!(r instanceof w)||r.status!==409)return;let e=r.body;return e?.call&&typeof e.call.id=="string"?e.call:void 0}function li(r){let e=globalThis.navigator?.serviceWorker;typeof e?.getRegistration=="function"&&e.getRegistration().then(async t=>{for(let s of await t?.getNotifications({tag:r})??[])s.close()}).catch(()=>{})}async function Ht(r,e){let t=r;if(typeof t.setSinkId!="function")throw new TypeError("calls: this browser cannot choose where audio plays (setSinkId)");await t.setSinkId(e)}var ye=class{api;open;session;credentials;mfa;passkey;magicLink;phone;password;email;sessions;constructor(e,t,s,i){this.api=K.client(e),this.open=K.client(t),this.session=s,this.credentials=i;let n=this.api,a=this.open;this.mfa={challenge:async(o,l,d)=>this.signedIn((await a.mfaChallenge({body:{mfa_token:o,type:l,code:d}})).data),recovery:async(o,l)=>this.signedIn((await a.mfaRecovery({body:{mfa_token:o,code:l}})).data),sendSmsCode:async o=>{await a.mfaSmsChallenge({body:{mfa_token:o}})},sendEmailCode:async o=>{await a.mfaEmailChallenge({body:{mfa_token:o}})},enrollTotp:async()=>{let o=(await n.mfaEnroll({body:{type:"totp"}})).data;return{enrollmentId:o.enrollment_id,secret:o.secret,otpUrl:o.otp_url,qrCode:o.qr_code,recoveryCodes:o.recovery_codes}},verifyTotp:async o=>{await n.mfaVerifyEnrollment({body:{code:o}})},enrollSms:async o=>(await n.mfaSmsEnroll({body:{phone:o}})).data,verifySms:async o=>{await n.mfaSmsVerifyEnrollment({body:{code:o}})},enrollEmail:async()=>{await n.mfaEmailEnroll()},factors:async()=>(await n.mfaListFactors()).data,removeFactor:async(o,l)=>{await n.mfaRemoveFactor({path:{id:o},body:{current_password:l}})},regenerateRecoveryCodes:async()=>(await n.mfaRegenerateRecoveryCodes()).data,stepUp:async o=>this.steppedUp(async()=>(await n.stepUp({body:{method:"totp",code:o}})).data),sendStepUpSmsCode:async()=>{await n.stepUpSmsSend()},stepUpWithSms:async o=>this.steppedUp(async()=>(await n.stepUp({body:{method:"sms",code:o}})).data)},this.passkey={register:async o=>{let l=(await n.webauthnRegisterBegin({body:{name:o}})).data,d=await this.authenticator().create({publicKey:Jt(l.options.publicKey)});return(await n.webauthnRegisterFinish({body:zt(d)})).data},signIn:async(o={})=>{let l=(await a.webauthnLoginBegin({body:o.userId?{user_id:o.userId}:{}})).data,d=await this.authenticator().get({publicKey:Ge(l.options.publicKey)}),c=await a.webauthnLoginFinish({query:o.userId?{user_id:o.userId}:void 0,body:He(d)});return this.signedIn(c.data)},signUp:async(o,l)=>{let d=(await a.webauthnSignupBegin({body:{identifier:o,user_name:l}})).data,c=await this.authenticator().create({publicKey:Jt(d.options.publicKey)});await a.webauthnSignupFinish({query:{user_id:d.user_id},body:zt(c)});let f=(await a.webauthnLoginBegin({body:{user_id:d.user_id}})).data,g=await this.authenticator().get({publicKey:Ge(f.options.publicKey)});return this.signedIn((await a.webauthnLoginFinish({query:{user_id:d.user_id},body:He(g)})).data)},stepUp:async()=>this.steppedUp(async()=>{let o=(await n.stepUpWebAuthnBegin()).data,l=await this.authenticator().get({publicKey:Ge(o.publicKey)});return(await n.stepUp({body:{method:"webauthn",...He(l)}})).data}),list:async()=>(await n.webauthnListCredentials()).data,remove:async o=>{await n.webauthnDeleteCredential({path:{id:o}})}},this.magicLink={send:async(o,l={})=>{await a.magicLinkRequest({body:{email:o,...l.redirectTo?{redirect_to:l.redirectTo}:{}}})},verify:async o=>this.signedIn((await a.magicLinkVerify({body:{token:o}})).data)},this.phone={sendCode:async o=>(await a.requestPhoneOtp({body:{phone:o,channel:"sms"}})).data,verifyCode:async(o,l)=>this.signInResult((await a.verifyPhoneOtp({body:{phone:o,token:l}})).data)},this.password={requestReset:async(o,l={})=>{await a.passwordResetRequest({body:{email:o,...l.redirectTo?{redirect_to:l.redirectTo}:{}}})},confirmReset:async(o,l)=>{await a.passwordResetConfirm({body:{token:o,new_password:l}})},change:async o=>(await n.passwordChange({body:o})).data,set:async o=>(await n.setPassword({body:o})).data},this.email={verify:async o=>{await a.verifyEmail({body:o})},resendVerification:async o=>(await a.resendVerification({body:{email:o}})).data},this.sessions={list:async()=>(await n.listSessions()).data,revoke:async o=>{await n.revokeSession({path:{id:o}})},revokeAll:async()=>{await n.revokeAllSessions()}}}onAuthStateChange(e){return this.session.onChange(e)}currentSession(){return this.session.session()}get sessionEndReason(){return this.session.endReason}async signUp(e){let t=(await this.open.signup({body:e})).data;return t.access_token&&t.refresh_token&&t.expires_in!==void 0&&await this.session.set({access_token:t.access_token,refresh_token:t.refresh_token,expires_in:t.expires_in},"SIGNED_IN",t.user),t}async signIn(e,t){return this.signInResult((await this.open.login({body:{email:e,password:t}})).data)}async signOut(){try{await this.session.session()&&await this.api.logout()}finally{await this.session.clear("SIGNED_OUT")}}async getUser(){let e=this.session.snapshot(),t=(await this.api.getMe()).data;return await this.session.setUser(t,e),t}async refreshSession(){return this.session.refresh()}async deleteAccount(e){await this.api.deleteAccount(e===void 0?void 0:{body:{password:e}}),await this.session.clear("SIGNED_OUT")}async signInResult(e){return"mfa_required"in e&&e.mfa_required?{mfaRequired:{mfaToken:e.mfa_token,factors:e.factors}}:{user:await this.signedIn(e)}}async setSession(e){return this.signedIn(e)}async signedIn(e){let t=await this.session.set({access_token:e.access_token,refresh_token:e.refresh_token,expires_in:e.expires_in},"SIGNED_IN",e.user);if(e.user)return e.user;let s=(await this.api.verifyTokenUser()).data;return await this.session.setUser(s,t),s}async steppedUp(e){let t=await this.session.session();if(!t)throw new T("a step-up raises the signed-in session: nobody is signed in");let s=await e();if((await this.session.session())?.refreshToken!==t.refreshToken)throw new T("the session changed during the step-up");return this.session.set({access_token:s.access_token,refresh_token:t.refreshToken,expires_in:s.expires_in},"TOKEN_REFRESHED")}authenticator(){if(!this.credentials)throw new Error("passkeys need navigator.credentials (or createClient({ webauthn }))");return this.credentials}},we=r=>{let e=atob(r.replace(/-/g,"+").replace(/_/g,"/").padEnd(Math.ceil(r.length/4)*4,"=")),t=new Uint8Array(e.length);for(let s=0;s<e.length;s++)t[s]=e.charCodeAt(s);return t.buffer},N=r=>{if(!r)return;let e=r instanceof ArrayBuffer?new Uint8Array(r):new Uint8Array(r.buffer,r.byteOffset,r.byteLength),t="";for(let s of e)t+=String.fromCharCode(s);return btoa(t).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")},Xt=r=>Array.isArray(r)?r.map(e=>({...e,id:we(String(e.id))})):void 0;function Jt(r){let e=r.user;return{...r,challenge:we(String(r.challenge)),user:{...e,id:we(String(e.id))},excludeCredentials:Xt(r.excludeCredentials)}}function Ge(r){return{...r,challenge:we(String(r.challenge)),allowCredentials:Xt(r.allowCredentials)}}function zt(r){let e=r,t=e.response;return{id:e.id,rawId:N(e.rawId),type:"public-key",authenticatorAttachment:e.authenticatorAttachment??void 0,clientExtensionResults:e.getClientExtensionResults?.()??{},response:{clientDataJSON:N(t.clientDataJSON),attestationObject:N(t.attestationObject),transports:t.getTransports?.()}}}function He(r){let e=r,t=e.response;return{id:e.id,rawId:N(e.rawId),type:"public-key",authenticatorAttachment:e.authenticatorAttachment??void 0,clientExtensionResults:e.getClientExtensionResults?.()??{},response:{clientDataJSON:N(t.clientDataJSON),authenticatorData:N(t.authenticatorData),signature:N(t.signature),userHandle:N(t.userHandle)}}}var di=/^pb_[a-z0-9]+_s/,ci=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,hi=new Set(["invalid_token","token_expired","session_expired","session_revoked","missing_token"]),ui=new Set(["invalid_token","token_reuse","token_expired","session_revoked","session_expired","session_device_changed"]);function pi(r){return r.status===400&&r.code==="invalid_request"}function Ln(r){if(di.test(r.publishableKey)||"secretKey"in r)throw new TypeError("a secret key never goes into a client app: palbase/web takes the publishable key (pb_<ref>_c\u2026); servers use palbase/server");let e=/^pb_([a-z0-9]+)_c/.exec(r.publishableKey)?.[1];if(e===void 0)throw new TypeError("publishableKey is the project publishable key (pb_<ref>_c\u2026)");if(r.appId!==void 0&&!ci.test(r.appId))throw new TypeError("appId is the registered app's id, a UUID (settings.appId of palbase apps:sync), not its slug");let t=Yt(r.language),s=(v,k)=>{let _=r.fetch??globalThis.fetch;if(t===void 0)return _(v,k);let M=new Headers(k?.headers);return M.has("accept-language")||M.set("accept-language",t),_(v,{...k,headers:M})},i=new URL(r.url).origin,n=r.storage??(gi()?at(`palbase.session.${i}`):rt()),a=r.retry??Xe,o=H(j({baseUrl:r.url,credentials:{publishableKey:r.publishableKey},fetch:s}),a),l=K.client(o),d=new B(n,async v=>(await l.refreshToken({body:{refresh_token:v}})).data,v=>v instanceof w&&(v.status===401&&ui.has(v.code)||pi(v)),{lockName:`palbase.session.refresh.${i}`,refresh:r.refresh}),c=j({baseUrl:r.url,credentials:{publishableKey:r.publishableKey,accessToken:()=>d.accessToken()},fetch:s,xmlHttpRequest:r.xmlHttpRequest??(r.fetch===void 0?globalThis.XMLHttpRequest:void 0)}),f=H(be(c,d),a),g=new z({baseUrl:r.url,publishableKey:r.publishableKey,accessToken:()=>d.accessToken(),webSocket:r.webSocket});d.onChange(v=>{v==="SIGNED_OUT"||v==="SESSION_EXPIRED"||v==="SIGNED_IN"?g.disconnect():v==="TOKEN_REFRESHED"&&g.tokenChanged()});let S=new X(i),m=v=>H(be(j({baseUrl:r.url,credentials:{publishableKey:r.publishableKey,accessToken:async()=>{let k=await d.accessToken();if(k===void 0||Pe(k)!==v)throw new T(`the session is no longer ${v}'s`);return k}},fetch:s}),d),a),h=v=>K.client(m(v)),p=new se({userApi:h,deviceApi:l,session:d,socket:g,ref:e,installation:S,origin:i,options:r.consent}),y=j({baseUrl:r.url,credentials:{publishableKey:r.publishableKey},fetch:s}),P=new ee(be(c,d),y,d,p,S,i),R=new de(f,d,g,e,s,r.appVersion,r.appId),U=new le(f,d,S,p,R,r.url,r.publishableKey);P.onEvent((v,k)=>U.inApp.trigger(v,k)),r.analytics&&P.start(r.analytics===!0?{}:r.analytics);let W=new Map,ke=v=>{let k=new URL(v).origin,_=W.get(k);return _||(_=H(be(j({baseUrl:k,credentials:{accessToken:()=>d.accessToken()},fetch:s}),d),a),W.set(k,_)),_},u=tt(f),b=v=>{let k=d.snapshot();k&&s(new URL(v,i).href,{method:"POST",keepalive:!0,headers:{apikey:r.publishableKey,authorization:`Bearer ${k.accessToken}`}}).catch(()=>{})},C=Object.assign(Object.create(st),{auth:new ye(f,o,d,r.webauthn??globalThis.navigator?.credentials),socket:g,transport:f,analytics:P,consent:p,installation:S,purchases:R,notify:U,flags:new ce(f,d,g,S,e,i,P,r.appVersion),messaging:new me(f,m,d,g,e,s,r.messaging),calls:new ve(m,d,g,e,`web-${S.id}`,b,r.calls),setLanguage(v){t=Yt(v??void 0)},chatToolCall:(v,k,_={})=>u.toolCall(v,k,_.signal),chatWorkspaceFile:(v,k,_,M={})=>u.workspaceFile(v,k,_,M.signal)});return it(C,i,ke,f,g,()=>d.snapshot()?.userId),C}var fi=/^[A-Za-z]{1,8}(-[A-Za-z0-9]{1,8})*$/;function Yt(r){if(r===void 0)return;let e=typeof r=="string"?[r]:[...r];if(e.length!==0){for(let t of e)if(!fi.test(t))throw new TypeError(`language ${JSON.stringify(t)} is a BCP 47 tag ("tr", "pt-BR")`);return e.map((t,s)=>s===0?t:`${t};q=${Math.max(.1,1-s/10).toFixed(1)}`).join(", ")}}function gi(){try{return typeof globalThis.localStorage<"u"}catch{return!1}}function be(r,e){return{async send(t){let s=await e.session();try{return await r.send(t)}catch(i){let n=t.auth.some(a=>a.includes("userJWT"));if(!(i instanceof w)||i.status!==401||!hi.has(i.code)||!n||!s)throw i;try{e.snapshot()?.refreshToken===s.refreshToken&&await e.refresh()}catch{throw i}if(e.snapshot()?.userId!==s.userId)throw i;return r.send(t)}}}}export{T as a,rt as b,at as c,xe as d,z as e,X as f,ee as g,se as h,ne as i,re as j,oe as k,Re as l,le as m,de as n,Is as o,ce as p,ti as q,me as r,Ue as s,Le as t,qe as u,je as v,Ke as w,$e as x,Ve as y,ve as z,Fe as A,Ln as B};
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
/*! palbase 0.
|
|
2
|
-
import{b as M,c as N,d as T}from"./6L2MMJA6.js";import{a as z,f as Q,g as Y,j as Z,k as X,l as ee,o as G,p as te,q as ne}from"./ASBRNYVS.js";import{d as A}from"./NOTDQXFX.js";import{a as b,b as V,c as _,e as j}from"./2OXYYE3V.js";var l=class extends Error{kind;code;status;requestId;fields;retryAfter;data;constructor(e,n){super(n.message,n.cause===void 0?void 0:{cause:n.cause}),this.name="BackendError",this.kind=e,this.code=n.code,this.status=n.status??0,this.requestId=n.requestId,this.fields=n.fields,this.retryAfter=n.retryAfter,this.data=n.data}};function oe(t){return t instanceof l||typeof t=="object"&&t!==null&&t.name==="BackendError"&&typeof t.kind=="string"}function q(t){let e=t.body,n={code:t.code,message:t.message,status:t.status,requestId:t.requestId??qe(e,"request_id"),data:E(e,"data"),cause:t};if(t.code==="network_error")return new l("network",n);if(t.status===401&&t.code==="insufficient_user_authentication")return new l("stepUpRequired",n);if(t.status===401&&t.code==="app_attest_required")return new l("attestationRequired",n);if(t.status===401)return new l("unauthorized",n);if(t.status===429)return new l("rateLimited",{...n,retryAfter:Ne(e)??t.retryAfter});let s=Me(e);return t.status===400&&s?new l("validation",{...n,fields:s}):new l("server",n)}function R(t){return t instanceof V||t instanceof Error&&t.name==="PalbaseError"}function se(t){return Array.isArray(t)&&t.length>0&&t.every(e=>typeof e=="object"&&e!==null&&typeof e.field=="string"&&typeof e.message=="string")}function Me(t){let e=E(E(t,"data"),"fields");if(se(e))return e;let n=E(t,"fields");return se(n)?n:void 0}function Ne(t){return re(t,"retry_after")??re(E(t,"data"),"retryAfter")}function E(t,e){if(typeof t=="object"&&t!==null)return t[e]}function re(t,e){let n=E(t,e);return typeof n=="number"?n:void 0}function qe(t,e){let n=E(t,e);return typeof n=="string"?n:void 0}var De=/^[A-Za-z_$][A-Za-z0-9_$]*$/,Ke=Object.freeze(["adoptSession","analytics","appContext","appVersion","auth","callOnSignOut","cancelCallOnSignOut","configuration","consent","currentSession","flags","installation","module","moduleDirectory","notify","onSessionChange","onSignOut","preferences","realtime","scope","send","socket","storage","storedUserId","telemetry","transport","version","palbe","data","stores","purchases","messaging","notifications","perf","debug","equals","hashCode","toString","self","Type","init","deinit","subscript","then","constructor","__proto__"]),Be=new Set(Ke),Le=new Set(["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf","__proto__","__defineGetter__","__defineSetter__","__lookupGetter__","__lookupSetter__"]);function P(t){return t==="then"||t==="toJSON"||Le.has(t)}function ae(t){return t==="call"||t==="join"||P(t)}function ie(t){return typeof t=="string"&&De.test(t)&&!Be.has(t)&&!P(t)}function de(t){return typeof t=="string"&&/^[a-z][a-z0-9-]{0,62}$/.test(t)}function le(t){j(t)}function ce(t){return j(t).origin}var I=class{me;reader;messages=new Map;responses=new Map;order=[];turn=null;goal=null;goalWords=new Set;voiceWords=new Set;voice=null;history=new Map;forkedFrom=null;calls=new Map;taken=[];older=[];oldestLive;olderCursor;olderLeft=!0;loading;chatId;listeners=new Set;enders=new Set;snapshot;told=!1;ended=!1;constructor(e=()=>{},n,s){this.me=e,this.reader=n,this.chatId=s}get hasOlder(){return this.olderLeft}loadOlder(e={}){return this.loading??=this.readOlder(e).finally(()=>this.loading=void 0),this.loading}async readOlder(e){if(!this.olderLeft)return!1;let s={...this.olderCursor!==void 0?{cursor:this.olderCursor}:this.oldestLive!==void 0?{before:this.oldestLive}:{},...e.limit!==void 0?{limit:e.limit}:{},...e.signal?{signal:e.signal}:{}},r;if(e.load)r=await e.load(s);else{let a=this.idFor("loadOlder",e.chatId);if(!this.reader)throw new TypeError("loadOlder: this chat reads its past through the app's way: give load");r=await this.reader.parts(a,s)}if(this.ended)return!1;let o=(r?.parts??[]).map(a=>M(a)).filter(a=>a!==void 0);return this.older=[...o,...this.older],this.olderCursor=r?.nextCursor,this.olderLeft=typeof r?.nextCursor=="string"&&r.nextCursor!=="",this.refold(),this.olderLeft}idFor(e,n){let s=n??this.chatId;if(typeof s!="string"||s==="")throw new TypeError(`${e}: the chat's id is not known yet (no chatId in the join, no message heard): give { chatId }`);return s}refold(){this.messages.clear(),this.responses.clear(),this.order.length=0,this.turn=null,this.goal=null,this.goalWords.clear(),this.voiceWords.clear(),this.voice=null,this.history.clear(),this.forkedFrom=null,this.calls.clear();for(let e of this.older)this.fold(e);for(let e of this.taken)this.fold(e);this.changed()}get state(){return this.snapshot??=this.build()}subscribe(e){return this.listeners.add(e),()=>{this.listeners.delete(e)}}async*[Symbol.asyncIterator](){let e,n,s=this.subscribe(()=>e?.()),r=()=>e?.();this.enders.add(r);try{for(;;){let o=this.state;if(o!==n){n=o,yield o;continue}if(this.ended)return;await new Promise(a=>e=a)}}finally{s(),this.enders.delete(r)}}end(){if(!this.ended){this.ended=!0;for(let e of[...this.enders])e()}}takePayload(e){let n=M(e);n&&this.take(n)}take(e){if(this.ended)return;this.taken.push(e);let n=e.seq;typeof n=="number"&&n>0&&(this.oldestLive===void 0||n<this.oldestLive)&&(this.oldestLive=n),this.fold(e)&&this.changed()}fold(e){switch(e.type){case"message":return this.chatId===void 0&&typeof e.message.chat_id=="string"&&e.message.chat_id!==""&&(this.chatId=e.message.chat_id),this.heard(e.message),!1;case"turn":{let n=this.response(e.response_id);n.status=e.status,n.waiting=e.waiting,n.error=e.error,n.end=typeof e.end=="string"?e.end:null,e.user_id!==void 0&&(n.startedBy=e.user_id),e.goal&&(n.goal={goalId:e.goal.goal_id,role:e.goal.role,seq:e.goal.seq}),this.turn=e;break}case"thinking":{let n=this.response(e.response_id);if(e.seq>0){if(n.thought.has(e.seq))return!1;n.thought.add(e.seq)}if(e.unavailable){n.marks.set("thinking:unavailable",{type:"thinking",text_offset:N(n.text),thinking:{stepId:null,runId:e.run_id,text:"",unavailable:!0,model:e.model??null,reason:e.reason??null}});break}let s=`thinking:${e.step_id??`seq:${e.seq}`}`,r=n.marks.get(s);r?r.thinking={...r.thinking,text:r.thinking.text+e.text}:n.marks.set(s,{type:"thinking",text_offset:N(n.text),thinking:{stepId:e.step_id??null,runId:e.run_id,text:e.text,unavailable:!1,model:null,reason:null}});break}case"goal":if(e.seq>0){if(this.goalWords.has(e.seq))return!1;this.goalWords.add(e.seq)}this.goalSaid(e),this.order.push({type:"goal",event:e});break;case"voice":{let n=`${e.voice_id}\0${e.status}`;if(this.voiceWords.has(n))return!1;this.voiceWords.add(n),(e.status==="closed"?this.voice===null||this.voice.voice_id===e.voice_id:!this.voiceWords.has(`${e.voice_id}\0closed`))&&(this.voice=e),this.order.push({type:"voice",event:e});break}case"transcript":return this.said(e),!1;case"history":e.forked_from&&(this.forkedFrom={chatId:e.forked_from.chat_id,beforeMessage:e.forked_from.before_message}),this.history.set(e.part,e.items);break;case"text":{let n=this.response(e.response_id);n.text=n.text.slice(0,T(n.text,e.offset))+e.text;break}case"reset":{let n=this.response(e.response_id);n.text=n.text.slice(0,T(n.text,e.offset));break}case"tool":{this.response(typeof e.agent_response_id=="string"&&e.agent_response_id!==""?e.agent_response_id:e.response_id).marks.set(`tool:${e.call_id}`,e),this.calls.set(e.call_id,e);break}case"agent":{if(this.response(e.parent_response_id).marks.set(e.run_id?`agent:${e.run_id}`:`agent:seq:${e.seq}`,e),!e.response_id)break;let n=this.response(e.response_id);if(n.runId=e.run_id,n.agent=e.name,n.parentId===null){n.parentId=e.parent_response_id;let s=this.order.findIndex(r=>r.type==="response"&&r.key===e.response_id);s>=0&&this.order.splice(s,1)}break}}return!0}goalSaid(e){if(e.kind==="set"&&e.goal){this.goal={id:e.goal_id,objective:e.goal.objective,rubric:e.goal.rubric,status:e.goal.status,stopCode:e.goal.stop_code,stopReason:e.goal.stop_reason,phase:e.goal.phase,maxTurns:e.goal.max_turns??null,maxCostUsd:e.goal.max_cost_usd??null,events:[e]};return}let n=this.goal;if(!n||n.id!==e.goal_id)return;let s={...n,events:[...n.events,e]};e.kind==="updated"&&e.goal?Object.assign(s,{objective:e.goal.objective,rubric:e.goal.rubric,status:e.goal.status,stopCode:e.goal.stop_code,stopReason:e.goal.stop_reason,phase:e.goal.phase,maxTurns:e.goal.max_turns??null,maxCostUsd:e.goal.max_cost_usd??null}):e.kind==="status_changed"&&typeof e.to=="string"?Object.assign(s,{status:e.to,stopCode:e.code??"",stopReason:e.reason??""}):e.kind==="cleared"&&Object.assign(s,{status:"cleared",stopReason:e.reason??""}),this.goal=s}heard(e){let n=Fe(e),s=this.messages.get(n),r=e.status==="delivered"||e.status==="failed"?e.status:"pending";this.messages.set(n,{clientId:e.client_id,id:e.id??s?.id??null,text:e.text,author:e.author??null,authorName:e.author_name??"",delivery:e.delivery??"next",status:s?.status==="delivered"?"delivered":r,error:e.error??null,responseId:e.response_id??s?.responseId??null,createdAt:e.created_at??s?.createdAt??"",mine:!1,metadata:e.metadata??s?.metadata??{},history:!1,truncated:!1,kind:e.kind??s?.kind??"text",voice:e.voice?{id:e.voice.id,role:e.voice.role}:s?.voice??null,attachments:e.attachments?ue(e.attachments):s?.attachments??[]}),s||this.place(e,n),this.changed()}said(e){let n=`voice\0${e.id}`,s=this.messages.get(n);this.messages.set(n,{clientId:"",id:e.id,text:e.text,author:e.user_id,authorName:e.author_name,delivery:"next",status:"delivered",error:null,responseId:null,createdAt:e.created_at,mine:!1,metadata:{},history:!1,truncated:!1,kind:"voice",voice:{id:e.voice_id,role:e.role},attachments:[]}),s||this.order.push({type:"message",key:n}),this.changed()}place(e,n){let s=e.response_id??null,o=s!==null&&![...this.messages.entries()].some(([a,i])=>a!==n&&i.responseId===s)?this.order.findIndex(a=>a.type==="response"&&a.key===s):-1;o>=0?this.order.splice(o,0,{type:"message",key:n}):this.order.push({type:"message",key:n})}response(e){let n=this.responses.get(e);return n||(n={id:e,status:null,waiting:null,end:null,error:null,text:"",marks:new Map,thought:new Set,runId:null,agent:null,parentId:null,startedBy:void 0,goal:null},this.responses.set(e,n),this.order.push({type:"response",key:e})),n}changed(){this.snapshot=void 0,!this.told&&(this.told=!0,queueMicrotask(()=>{this.told=!1;let e=this.state;for(let n of[...this.listeners])try{n(e)}catch{}}))}build(){let e=this.me(),n=d=>e!==void 0&&d.startedBy===e,s=new Map;for(let d of this.responses.values()){let u=d.parentId!==null?this.responses.get(d.parentId)??d:d;s.set(d.id,We(d,u.startedBy??null,n(u),d.goal??u.goal))}let r=new Map([...this.messages].map(([d,u])=>[d,e!==void 0&&u.author===e?{...u,mine:!0}:u])),o=[...this.history.entries()].sort(([d],[u])=>d-u).flatMap(([d,u])=>u.map((f,m)=>He(f,`${d}:${m}`,e))),a=[...o];for(let d of this.order)d.type==="goal"?a.push({type:"goal",goal:d.event}):d.type==="voice"?a.push({type:"voice",voice:d.event}):d.type==="message"?a.push({type:"message",message:r.get(d.key)}):this.responses.get(d.key).parentId===null&&a.push({type:"response",response:s.get(d.key)});let i=o.flatMap(d=>d.type==="message"?[d.message]:[]),c=o.flatMap(d=>d.type==="response"?[d.response]:[]),p=[...this.calls.values()].filter(d=>s.get(d.response_id)?.mine===!0);return{items:a,messages:[...i,...r.values()],responses:[...c,...s.values()],turn:this.turn,waiting:{approvals:p.filter(d=>d.status==="awaiting_approval"),outputs:p.filter(d=>d.status==="awaiting_output")},goal:this.goal,forkedFrom:this.forkedFrom,voice:this.voice?Je(this.voice,e):null}}};function Je(t,e){return{id:t.voice_id,userId:t.user_id,mine:e!==void 0&&t.user_id===e,delegation:t.delegation,status:t.status,seconds:typeof t.seconds=="number"?t.seconds:null,closeReason:t.close_reason??""}}function ue(t){return t.map((e,n)=>({kind:e.kind,name:e.name,contentType:e.content_type,size:e.size,sha256:e.sha256,position:n,bucket:e.bucket,path:e.path,workspacePath:e.workspace_path??null}))}function Fe(t){return`${t.author??""}\0${t.client_id}`}function We(t,e,n,s){let r=[...t.marks.values()].map((c,p)=>({m:c,i:p,at:T(t.text,Math.max(0,Number(c.text_offset)||0))}));r.sort((c,p)=>c.at-p.at||c.i-p.i);let o=[],a=[],i=0;for(let{m:c,at:p}of r)p>i&&o.push({type:"text",text:t.text.slice(i,p)}),i=Math.max(i,p),c.type==="thinking"?(o.push({type:"thinking",thinking:c.thinking}),a.push(c.thinking)):o.push(c.type==="tool"?{type:"tool",tool:c}:{type:"agent",agent:c});return i<t.text.length&&o.push({type:"text",text:t.text.slice(i)}),{id:t.id,status:t.status,waiting:t.waiting,end:t.end,error:t.error,text:t.text,parts:o,runId:t.runId,agent:t.agent,parentId:t.parentId,startedBy:e,mine:n,thinking:a,goal:s,history:!1,truncated:!1}}function He(t,e,n){let s=t.text_truncated===!0;if(t.role==="user"){let r=t.author??null;return{type:"message",message:{clientId:t.client_id??"",id:t.message_id??null,text:t.text,author:r,authorName:t.author_name??"",delivery:"next",status:"delivered",error:null,responseId:null,createdAt:t.created_at??"",mine:n!==void 0&&r===n,metadata:t.metadata??{},history:!0,truncated:s,kind:"text",voice:null,attachments:ue(t.attachments??[])}}}return{type:"response",response:{id:t.response_id??`history:${e}`,status:"completed",waiting:null,end:"completed",error:null,text:t.text,parts:t.text===""?[]:[{type:"text",text:t.text}],runId:null,agent:null,parentId:null,startedBy:null,mine:!1,thinking:[],goal:null,history:!0,truncated:s}}}var D=[["ApiKeyAuth","userJWT"]];function pe(t){return{async parts(e,n){let s={};n.limit!==void 0&&(s.limit=n.limit),n.cursor!==void 0?s.cursor=n.cursor:n.before!==void 0&&(s.before=n.before);let r=(await t.send({op:"ListChatParts",method:"GET",path:`/ai/chats/${_("ListChatParts","chat_id",e)}/parts`,auth:D,answers:{200:"json"},query:s,signal:n.signal})).data;return r.next_cursor===void 0?{parts:r.parts}:{parts:r.parts,nextCursor:r.next_cursor}},async toolCall(e,n,s){if(typeof n!="string"||n==="")throw new TypeError("chatToolCall: callId is a tool part's call_id");let r=(await t.send({op:"GetChatToolCall",method:"GET",path:`/ai/chats/${_("GetChatToolCall","chat_id",e)}/tool-calls/${_("GetChatToolCall","call_id",n)}`,auth:D,answers:{200:"json"},signal:s})).data;return{callId:r.call_id,name:r.name,status:r.status,runId:r.run_id,responseId:r.response_id,input:r.input,output:r.output,outputBytes:r.output_bytes,imageCount:r.image_count,isError:r.is_error}},async workspaceFile(e,n,s,r){if(typeof n!="string"||n==="")throw new TypeError("chatWorkspaceFile: path is the file as the workspace's tree names it, relative to its root");let o={path:n};return s!==void 0&&(o.manifest=s),(await t.send({op:"GetChatWorkspaceFile",method:"GET",path:`/ai/chats/${_("GetChatWorkspaceFile","chat_id",e)}/workspace/files`,auth:D,answers:{200:"raw"},query:o,signal:r})).data.blob()}}}var $=class extends Error{reason;constructor(e,n){super(e),this.name="GatewayError",this.reason=n}},he=new WeakMap;async function fe(t,e,n,s={},r=()=>{},o){let{pattern:a,events:i,messages:c,durable:p,chat:d}=Ue(e),u=Ve(a,n),f=he.get(t);f||he.set(t,f=new Map);let m=f,g=m.get(u)??{count:0};m.set(u,g),g.count++;let y=t.channel(u,p&&s.history!==!1?{after:0}:{});if(d&&!g.chat){let h=n.chatId,k=new I(r,o,typeof h=="string"&&h!==""?h:void 0);g.chat=k,g.unchat=y.on("broadcast",w=>{w.event==="chat"&&k.takePayload(w.payload)})}let x=()=>{--g.count>0||(m.delete(u),g.unchat?.(),g.chat?.end(),y.leave())};try{await y.join()}catch{let h=y.state==="refused"?ge(y.refusal,"unavailable"):"socket closed";throw x(),new $(`gateway ${JSON.stringify(u)} was not joined: ${h}`,h)}let C=!1,S=new Set,W=()=>{if(!C){C=!0,Ge();for(let h of[...S])h();x()}},Ge=y.onClosed(W),H=h=>{if(C)return()=>{};let k=y.on("broadcast",v=>{typeof v.event=="string"&&i.has(v.event)&&h(v.event,b(v.payload))}),w=()=>{S.delete(w),k()};return S.add(w),w},U={topic:u,get seq(){return y.logSeq},on(h,k){if(typeof h=="function")return H((w,v)=>h({event:w,payload:v}));if(!i.has(h))throw new TypeError(`gateway ${JSON.stringify(a)} declares no event ${JSON.stringify(String(h))}`);if(typeof k!="function")throw new TypeError(`gateway ${JSON.stringify(a)}: on(${JSON.stringify(h)}, \u2026) takes the function the event is handed to`);return H((w,v)=>{w===h&&k(v)})},off(h){S.has(h)&&h()},async send(h,k){if(!c.has(h))throw new TypeError(`gateway ${JSON.stringify(a)} declares no message ${JSON.stringify(String(h))}`);let w=C?{status:"error",response:{reason:"not joined"}}:await y.push("broadcast",{type:"broadcast",event:h,payload:k});if(w.status==="ok")return b(w.response.reply);let v=ge(w.response,"unavailable");throw new $(`gateway ${JSON.stringify(u)} did not take ${JSON.stringify(h)}: ${v}`,v)},leave:W};return d&&Object.defineProperty(U,"chat",{value:g.chat,enumerable:!0}),U}function Ue(t){let e=typeof t=="object"&&t!==null?t:{},n=s=>Array.isArray(s)&&s.every(r=>typeof r=="string");if(typeof e.pattern!="string"||e.pattern===""||!n(e.events)||!n(e.messages))throw new TypeError("join takes a gateway of the backend's generated module: its pattern, its events and its messages");return{pattern:e.pattern,events:new Set(e.events),messages:new Set(e.messages),durable:e.durable===!0,chat:e.chat===!0}}function Ve(t,e){let n=typeof e=="object"&&e!==null?e:{};return t.split(":").map(s=>{if(!(s.startsWith("{")&&s.endsWith("}")&&s.length>2))return s;let r=s.slice(1,-1),o=Object.hasOwn(n,r)?n[r]:void 0;if(typeof o!="string"||o==="")throw new TypeError(`gateway ${JSON.stringify(t)} needs a value for ${JSON.stringify(r)}`);if(o.includes(":"))throw new TypeError(`gateway ${JSON.stringify(t)}: the value of ${JSON.stringify(r)} is one segment of the channel's name and cannot hold ":"`);return o}).join(":")}function ge(t,e){let n=t?.reason;return typeof n=="string"&&n!==""?n:e}var ze=3600*1e3,O=new Map;function Qe(t,e,n=!1){let s=`${e.projectId}\0${e.signer}`,r=O.get(s);if(!n&&r&&Date.now()-r.at<ze)return r.list;let o=(async()=>{let a=te(),i;try{i=(await t.send({op:"GetTransitPublicKeys",method:"GET",path:"/secrets/transit/public",query:{nonce:a},auth:[["ApiKeyAuth"]],answers:{200:"json"}})).data}catch(c){throw new l("network",{code:"encryption_keys_unavailable",message:"the project's encryption keys could not be fetched: no encrypted field is sent without them",cause:c})}try{return await ne(i,e.signer,e.projectId,a)}catch(c){throw new l("decode",{code:"encryption_keys_unverified",message:"the project's list of encryption keys does not verify with the key this app was built with: nothing is sealed to it",cause:c})}})();return O.set(s,{list:o,at:Date.now()}),o.catch(()=>{O.get(s)?.list===o&&O.delete(s)}),o}async function ye(t,e,n,s,r,o){let i=(await Qe(t,e,o)).keys[0];return Y(i.kid,i.key,Q(e.projectId,n,s,r))}function K(t,e,n,s){return e==null||!s||s.length===0?Promise.resolve(e):G(e,n,s,(r,o)=>Z(t.key,r,o))}function me(t,e,n,s){return e===void 0||!n||n.length===0?Promise.resolve(e):G(e,"/response",n,async(r,o)=>{if(!X(o))throw new l("decode",{code:"field_not_encrypted",message:`${s}: ${r} came plain where the backend's contract says it is encrypted`});try{return await ee(t.key,r,o)}catch(a){throw new l("decode",{code:"field_unopenable",message:`${s}: ${r} does not open with this call's key`,cause:a})}})}function we(t){return t instanceof l&&(t.code==="encryption_key_retired"||t.code==="encryption_key_unknown")}var B=class{pending="";dataLines=[];eventName;consume(e){this.pending+=e.replace(/\r\n/g,`
|
|
1
|
+
/*! palbase 0.36.0 — Palbase SDK License (see LICENSE) */
|
|
2
|
+
import{b as M,c as N,d as T}from"./TV4DBUC7.js";import{a as z,f as Q,g as Y,j as Z,k as X,l as ee,o as G,p as te,q as ne}from"./QBYUSNOL.js";import{d as A}from"./D4FVVF3V.js";import{a as b,b as V,c as _,e as j}from"./U567PXWS.js";var l=class extends Error{kind;code;status;requestId;fields;retryAfter;data;constructor(e,n){super(n.message,n.cause===void 0?void 0:{cause:n.cause}),this.name="BackendError",this.kind=e,this.code=n.code,this.status=n.status??0,this.requestId=n.requestId,this.fields=n.fields,this.retryAfter=n.retryAfter,this.data=n.data}};function oe(t){return t instanceof l||typeof t=="object"&&t!==null&&t.name==="BackendError"&&typeof t.kind=="string"}function q(t){let e=t.body,n={code:t.code,message:t.message,status:t.status,requestId:t.requestId??qe(e,"request_id"),data:E(e,"data"),cause:t};if(t.code==="network_error")return new l("network",n);if(t.status===401&&t.code==="insufficient_user_authentication")return new l("stepUpRequired",n);if(t.status===401&&t.code==="app_attest_required")return new l("attestationRequired",n);if(t.status===401)return new l("unauthorized",n);if(t.status===429)return new l("rateLimited",{...n,retryAfter:Ne(e)??t.retryAfter});let s=Me(e);return t.status===400&&s?new l("validation",{...n,fields:s}):new l("server",n)}function R(t){return t instanceof V||t instanceof Error&&t.name==="PalbaseError"}function se(t){return Array.isArray(t)&&t.length>0&&t.every(e=>typeof e=="object"&&e!==null&&typeof e.field=="string"&&typeof e.message=="string")}function Me(t){let e=E(E(t,"data"),"fields");if(se(e))return e;let n=E(t,"fields");return se(n)?n:void 0}function Ne(t){return re(t,"retry_after")??re(E(t,"data"),"retryAfter")}function E(t,e){if(typeof t=="object"&&t!==null)return t[e]}function re(t,e){let n=E(t,e);return typeof n=="number"?n:void 0}function qe(t,e){let n=E(t,e);return typeof n=="string"?n:void 0}var De=/^[A-Za-z_$][A-Za-z0-9_$]*$/,Ke=Object.freeze(["adoptSession","analytics","appContext","appVersion","auth","callOnSignOut","cancelCallOnSignOut","configuration","consent","currentSession","flags","installation","module","moduleDirectory","notify","onSessionChange","onSignOut","preferences","realtime","scope","send","socket","storage","storedUserId","telemetry","transport","version","palbe","data","stores","purchases","messaging","notifications","perf","debug","equals","hashCode","toString","self","Type","init","deinit","subscript","then","constructor","__proto__"]),Be=new Set(Ke),Le=new Set(["constructor","hasOwnProperty","isPrototypeOf","propertyIsEnumerable","toLocaleString","toString","valueOf","__proto__","__defineGetter__","__defineSetter__","__lookupGetter__","__lookupSetter__"]);function P(t){return t==="then"||t==="toJSON"||Le.has(t)}function ae(t){return t==="call"||t==="join"||P(t)}function ie(t){return typeof t=="string"&&De.test(t)&&!Be.has(t)&&!P(t)}function de(t){return typeof t=="string"&&/^[a-z][a-z0-9-]{0,62}$/.test(t)}function le(t){j(t)}function ce(t){return j(t).origin}var I=class{me;reader;messages=new Map;responses=new Map;order=[];turn=null;goal=null;goalWords=new Set;voiceWords=new Set;voice=null;history=new Map;forkedFrom=null;calls=new Map;taken=[];older=[];oldestLive;olderCursor;olderLeft=!0;loading;chatId;listeners=new Set;enders=new Set;snapshot;told=!1;ended=!1;constructor(e=()=>{},n,s){this.me=e,this.reader=n,this.chatId=s}get hasOlder(){return this.olderLeft}loadOlder(e={}){return this.loading??=this.readOlder(e).finally(()=>this.loading=void 0),this.loading}async readOlder(e){if(!this.olderLeft)return!1;let s={...this.olderCursor!==void 0?{cursor:this.olderCursor}:this.oldestLive!==void 0?{before:this.oldestLive}:{},...e.limit!==void 0?{limit:e.limit}:{},...e.signal?{signal:e.signal}:{}},r;if(e.load)r=await e.load(s);else{let a=this.idFor("loadOlder",e.chatId);if(!this.reader)throw new TypeError("loadOlder: this chat reads its past through the app's way: give load");r=await this.reader.parts(a,s)}if(this.ended)return!1;let o=(r?.parts??[]).map(a=>M(a)).filter(a=>a!==void 0);return this.older=[...o,...this.older],this.olderCursor=r?.nextCursor,this.olderLeft=typeof r?.nextCursor=="string"&&r.nextCursor!=="",this.refold(),this.olderLeft}idFor(e,n){let s=n??this.chatId;if(typeof s!="string"||s==="")throw new TypeError(`${e}: the chat's id is not known yet (no chatId in the join, no message heard): give { chatId }`);return s}refold(){this.messages.clear(),this.responses.clear(),this.order.length=0,this.turn=null,this.goal=null,this.goalWords.clear(),this.voiceWords.clear(),this.voice=null,this.history.clear(),this.forkedFrom=null,this.calls.clear();for(let e of this.older)this.fold(e);for(let e of this.taken)this.fold(e);this.changed()}get state(){return this.snapshot??=this.build()}subscribe(e){return this.listeners.add(e),()=>{this.listeners.delete(e)}}async*[Symbol.asyncIterator](){let e,n,s=this.subscribe(()=>e?.()),r=()=>e?.();this.enders.add(r);try{for(;;){let o=this.state;if(o!==n){n=o,yield o;continue}if(this.ended)return;await new Promise(a=>e=a)}}finally{s(),this.enders.delete(r)}}end(){if(!this.ended){this.ended=!0;for(let e of[...this.enders])e()}}takePayload(e){let n=M(e);n&&this.take(n)}take(e){if(this.ended)return;this.taken.push(e);let n=e.seq;typeof n=="number"&&n>0&&(this.oldestLive===void 0||n<this.oldestLive)&&(this.oldestLive=n),this.fold(e)&&this.changed()}fold(e){switch(e.type){case"message":return this.chatId===void 0&&typeof e.message.chat_id=="string"&&e.message.chat_id!==""&&(this.chatId=e.message.chat_id),this.heard(e.message),!1;case"turn":{let n=this.response(e.response_id);n.status=e.status,n.waiting=e.waiting,n.error=e.error,n.end=typeof e.end=="string"?e.end:null,e.user_id!==void 0&&(n.startedBy=e.user_id),e.goal&&(n.goal={goalId:e.goal.goal_id,role:e.goal.role,seq:e.goal.seq}),this.turn=e;break}case"thinking":{let n=this.response(e.response_id);if(e.seq>0){if(n.thought.has(e.seq))return!1;n.thought.add(e.seq)}if(e.unavailable){n.marks.set("thinking:unavailable",{type:"thinking",text_offset:N(n.text),thinking:{stepId:null,runId:e.run_id,text:"",unavailable:!0,model:e.model??null,reason:e.reason??null}});break}let s=`thinking:${e.step_id??`seq:${e.seq}`}`,r=n.marks.get(s);r?r.thinking={...r.thinking,text:r.thinking.text+e.text}:n.marks.set(s,{type:"thinking",text_offset:N(n.text),thinking:{stepId:e.step_id??null,runId:e.run_id,text:e.text,unavailable:!1,model:null,reason:null}});break}case"goal":if(e.seq>0){if(this.goalWords.has(e.seq))return!1;this.goalWords.add(e.seq)}this.goalSaid(e),this.order.push({type:"goal",event:e});break;case"voice":{let n=`${e.voice_id}\0${e.status}`;if(this.voiceWords.has(n))return!1;this.voiceWords.add(n),(e.status==="closed"?this.voice===null||this.voice.voice_id===e.voice_id:!this.voiceWords.has(`${e.voice_id}\0closed`))&&(this.voice=e),this.order.push({type:"voice",event:e});break}case"transcript":return this.said(e),!1;case"history":e.forked_from&&(this.forkedFrom={chatId:e.forked_from.chat_id,beforeMessage:e.forked_from.before_message}),this.history.set(e.part,e.items);break;case"text":{let n=this.response(e.response_id);n.text=n.text.slice(0,T(n.text,e.offset))+e.text;break}case"reset":{let n=this.response(e.response_id);n.text=n.text.slice(0,T(n.text,e.offset));break}case"tool":{this.response(typeof e.agent_response_id=="string"&&e.agent_response_id!==""?e.agent_response_id:e.response_id).marks.set(`tool:${e.call_id}`,e),this.calls.set(e.call_id,e);break}case"agent":{if(this.response(e.parent_response_id).marks.set(e.run_id?`agent:${e.run_id}`:`agent:seq:${e.seq}`,e),!e.response_id)break;let n=this.response(e.response_id);if(n.runId=e.run_id,n.agent=e.name,n.parentId===null){n.parentId=e.parent_response_id;let s=this.order.findIndex(r=>r.type==="response"&&r.key===e.response_id);s>=0&&this.order.splice(s,1)}break}}return!0}goalSaid(e){if(e.kind==="set"&&e.goal){this.goal={id:e.goal_id,objective:e.goal.objective,rubric:e.goal.rubric,status:e.goal.status,stopCode:e.goal.stop_code,stopReason:e.goal.stop_reason,phase:e.goal.phase,maxTurns:e.goal.max_turns??null,maxCostUsd:e.goal.max_cost_usd??null,events:[e]};return}let n=this.goal;if(!n||n.id!==e.goal_id)return;let s={...n,events:[...n.events,e]};e.kind==="updated"&&e.goal?Object.assign(s,{objective:e.goal.objective,rubric:e.goal.rubric,status:e.goal.status,stopCode:e.goal.stop_code,stopReason:e.goal.stop_reason,phase:e.goal.phase,maxTurns:e.goal.max_turns??null,maxCostUsd:e.goal.max_cost_usd??null}):e.kind==="status_changed"&&typeof e.to=="string"?Object.assign(s,{status:e.to,stopCode:e.code??"",stopReason:e.reason??""}):e.kind==="cleared"&&Object.assign(s,{status:"cleared",stopReason:e.reason??""}),this.goal=s}heard(e){let n=Fe(e),s=this.messages.get(n),r=e.status==="delivered"||e.status==="failed"?e.status:"pending";this.messages.set(n,{clientId:e.client_id,id:e.id??s?.id??null,text:e.text,author:e.author??null,authorName:e.author_name??"",delivery:e.delivery??"next",status:s?.status==="delivered"?"delivered":r,error:e.error??null,responseId:e.response_id??s?.responseId??null,createdAt:e.created_at??s?.createdAt??"",mine:!1,metadata:e.metadata??s?.metadata??{},history:!1,truncated:!1,kind:e.kind??s?.kind??"text",voice:e.voice?{id:e.voice.id,role:e.voice.role}:s?.voice??null,attachments:e.attachments?ue(e.attachments):s?.attachments??[]}),s||this.place(e,n),this.changed()}said(e){let n=`voice\0${e.id}`,s=this.messages.get(n);this.messages.set(n,{clientId:"",id:e.id,text:e.text,author:e.user_id,authorName:e.author_name,delivery:"next",status:"delivered",error:null,responseId:null,createdAt:e.created_at,mine:!1,metadata:{},history:!1,truncated:!1,kind:"voice",voice:{id:e.voice_id,role:e.role},attachments:[]}),s||this.order.push({type:"message",key:n}),this.changed()}place(e,n){let s=e.response_id??null,o=s!==null&&![...this.messages.entries()].some(([a,i])=>a!==n&&i.responseId===s)?this.order.findIndex(a=>a.type==="response"&&a.key===s):-1;o>=0?this.order.splice(o,0,{type:"message",key:n}):this.order.push({type:"message",key:n})}response(e){let n=this.responses.get(e);return n||(n={id:e,status:null,waiting:null,end:null,error:null,text:"",marks:new Map,thought:new Set,runId:null,agent:null,parentId:null,startedBy:void 0,goal:null},this.responses.set(e,n),this.order.push({type:"response",key:e})),n}changed(){this.snapshot=void 0,!this.told&&(this.told=!0,queueMicrotask(()=>{this.told=!1;let e=this.state;for(let n of[...this.listeners])try{n(e)}catch{}}))}build(){let e=this.me(),n=d=>e!==void 0&&d.startedBy===e,s=new Map;for(let d of this.responses.values()){let u=d.parentId!==null?this.responses.get(d.parentId)??d:d;s.set(d.id,We(d,u.startedBy??null,n(u),d.goal??u.goal))}let r=new Map([...this.messages].map(([d,u])=>[d,e!==void 0&&u.author===e?{...u,mine:!0}:u])),o=[...this.history.entries()].sort(([d],[u])=>d-u).flatMap(([d,u])=>u.map((f,m)=>He(f,`${d}:${m}`,e))),a=[...o];for(let d of this.order)d.type==="goal"?a.push({type:"goal",goal:d.event}):d.type==="voice"?a.push({type:"voice",voice:d.event}):d.type==="message"?a.push({type:"message",message:r.get(d.key)}):this.responses.get(d.key).parentId===null&&a.push({type:"response",response:s.get(d.key)});let i=o.flatMap(d=>d.type==="message"?[d.message]:[]),c=o.flatMap(d=>d.type==="response"?[d.response]:[]),p=[...this.calls.values()].filter(d=>s.get(d.response_id)?.mine===!0);return{items:a,messages:[...i,...r.values()],responses:[...c,...s.values()],turn:this.turn,waiting:{approvals:p.filter(d=>d.status==="awaiting_approval"),outputs:p.filter(d=>d.status==="awaiting_output")},goal:this.goal,forkedFrom:this.forkedFrom,voice:this.voice?Je(this.voice,e):null}}};function Je(t,e){return{id:t.voice_id,userId:t.user_id,mine:e!==void 0&&t.user_id===e,delegation:t.delegation,status:t.status,seconds:typeof t.seconds=="number"?t.seconds:null,closeReason:t.close_reason??""}}function ue(t){return t.map((e,n)=>({kind:e.kind,name:e.name,contentType:e.content_type,size:e.size,sha256:e.sha256,position:n,bucket:e.bucket,path:e.path,workspacePath:e.workspace_path??null}))}function Fe(t){return`${t.author??""}\0${t.client_id}`}function We(t,e,n,s){let r=[...t.marks.values()].map((c,p)=>({m:c,i:p,at:T(t.text,Math.max(0,Number(c.text_offset)||0))}));r.sort((c,p)=>c.at-p.at||c.i-p.i);let o=[],a=[],i=0;for(let{m:c,at:p}of r)p>i&&o.push({type:"text",text:t.text.slice(i,p)}),i=Math.max(i,p),c.type==="thinking"?(o.push({type:"thinking",thinking:c.thinking}),a.push(c.thinking)):o.push(c.type==="tool"?{type:"tool",tool:c}:{type:"agent",agent:c});return i<t.text.length&&o.push({type:"text",text:t.text.slice(i)}),{id:t.id,status:t.status,waiting:t.waiting,end:t.end,error:t.error,text:t.text,parts:o,runId:t.runId,agent:t.agent,parentId:t.parentId,startedBy:e,mine:n,thinking:a,goal:s,history:!1,truncated:!1}}function He(t,e,n){let s=t.text_truncated===!0;if(t.role==="user"){let r=t.author??null;return{type:"message",message:{clientId:t.client_id??"",id:t.message_id??null,text:t.text,author:r,authorName:t.author_name??"",delivery:"next",status:"delivered",error:null,responseId:null,createdAt:t.created_at??"",mine:n!==void 0&&r===n,metadata:t.metadata??{},history:!0,truncated:s,kind:"text",voice:null,attachments:ue(t.attachments??[])}}}return{type:"response",response:{id:t.response_id??`history:${e}`,status:"completed",waiting:null,end:"completed",error:null,text:t.text,parts:t.text===""?[]:[{type:"text",text:t.text}],runId:null,agent:null,parentId:null,startedBy:null,mine:!1,thinking:[],goal:null,history:!0,truncated:s}}}var D=[["ApiKeyAuth","userJWT"]];function pe(t){return{async parts(e,n){let s={};n.limit!==void 0&&(s.limit=n.limit),n.cursor!==void 0?s.cursor=n.cursor:n.before!==void 0&&(s.before=n.before);let r=(await t.send({op:"ListChatParts",method:"GET",path:`/ai/chats/${_("ListChatParts","chat_id",e)}/parts`,auth:D,answers:{200:"json"},query:s,signal:n.signal})).data;return r.next_cursor===void 0?{parts:r.parts}:{parts:r.parts,nextCursor:r.next_cursor}},async toolCall(e,n,s){if(typeof n!="string"||n==="")throw new TypeError("chatToolCall: callId is a tool part's call_id");let r=(await t.send({op:"GetChatToolCall",method:"GET",path:`/ai/chats/${_("GetChatToolCall","chat_id",e)}/tool-calls/${_("GetChatToolCall","call_id",n)}`,auth:D,answers:{200:"json"},signal:s})).data;return{callId:r.call_id,name:r.name,status:r.status,runId:r.run_id,responseId:r.response_id,input:r.input,output:r.output,outputBytes:r.output_bytes,imageCount:r.image_count,isError:r.is_error}},async workspaceFile(e,n,s,r){if(typeof n!="string"||n==="")throw new TypeError("chatWorkspaceFile: path is the file as the workspace's tree names it, relative to its root");let o={path:n};return s!==void 0&&(o.manifest=s),(await t.send({op:"GetChatWorkspaceFile",method:"GET",path:`/ai/chats/${_("GetChatWorkspaceFile","chat_id",e)}/workspace/files`,auth:D,answers:{200:"raw"},query:o,signal:r})).data.blob()}}}var $=class extends Error{reason;constructor(e,n){super(e),this.name="GatewayError",this.reason=n}},he=new WeakMap;async function fe(t,e,n,s={},r=()=>{},o){let{pattern:a,events:i,messages:c,durable:p,chat:d}=Ue(e),u=Ve(a,n),f=he.get(t);f||he.set(t,f=new Map);let m=f,g=m.get(u)??{count:0};m.set(u,g),g.count++;let y=t.channel(u,p&&s.history!==!1?{after:0}:{});if(d&&!g.chat){let h=n.chatId,k=new I(r,o,typeof h=="string"&&h!==""?h:void 0);g.chat=k,g.unchat=y.on("broadcast",w=>{w.event==="chat"&&k.takePayload(w.payload)})}let x=()=>{--g.count>0||(m.delete(u),g.unchat?.(),g.chat?.end(),y.leave())};try{await y.join()}catch{let h=y.state==="refused"?ge(y.refusal,"unavailable"):"socket closed";throw x(),new $(`gateway ${JSON.stringify(u)} was not joined: ${h}`,h)}let C=!1,S=new Set,W=()=>{if(!C){C=!0,Ge();for(let h of[...S])h();x()}},Ge=y.onClosed(W),H=h=>{if(C)return()=>{};let k=y.on("broadcast",v=>{typeof v.event=="string"&&i.has(v.event)&&h(v.event,b(v.payload))}),w=()=>{S.delete(w),k()};return S.add(w),w},U={topic:u,get seq(){return y.logSeq},on(h,k){if(typeof h=="function")return H((w,v)=>h({event:w,payload:v}));if(!i.has(h))throw new TypeError(`gateway ${JSON.stringify(a)} declares no event ${JSON.stringify(String(h))}`);if(typeof k!="function")throw new TypeError(`gateway ${JSON.stringify(a)}: on(${JSON.stringify(h)}, \u2026) takes the function the event is handed to`);return H((w,v)=>{w===h&&k(v)})},off(h){S.has(h)&&h()},async send(h,k){if(!c.has(h))throw new TypeError(`gateway ${JSON.stringify(a)} declares no message ${JSON.stringify(String(h))}`);let w=C?{status:"error",response:{reason:"not joined"}}:await y.push("broadcast",{type:"broadcast",event:h,payload:k});if(w.status==="ok")return b(w.response.reply);let v=ge(w.response,"unavailable");throw new $(`gateway ${JSON.stringify(u)} did not take ${JSON.stringify(h)}: ${v}`,v)},leave:W};return d&&Object.defineProperty(U,"chat",{value:g.chat,enumerable:!0}),U}function Ue(t){let e=typeof t=="object"&&t!==null?t:{},n=s=>Array.isArray(s)&&s.every(r=>typeof r=="string");if(typeof e.pattern!="string"||e.pattern===""||!n(e.events)||!n(e.messages))throw new TypeError("join takes a gateway of the backend's generated module: its pattern, its events and its messages");return{pattern:e.pattern,events:new Set(e.events),messages:new Set(e.messages),durable:e.durable===!0,chat:e.chat===!0}}function Ve(t,e){let n=typeof e=="object"&&e!==null?e:{};return t.split(":").map(s=>{if(!(s.startsWith("{")&&s.endsWith("}")&&s.length>2))return s;let r=s.slice(1,-1),o=Object.hasOwn(n,r)?n[r]:void 0;if(typeof o!="string"||o==="")throw new TypeError(`gateway ${JSON.stringify(t)} needs a value for ${JSON.stringify(r)}`);if(o.includes(":"))throw new TypeError(`gateway ${JSON.stringify(t)}: the value of ${JSON.stringify(r)} is one segment of the channel's name and cannot hold ":"`);return o}).join(":")}function ge(t,e){let n=t?.reason;return typeof n=="string"&&n!==""?n:e}var ze=3600*1e3,O=new Map;function Qe(t,e,n=!1){let s=`${e.projectId}\0${e.signer}`,r=O.get(s);if(!n&&r&&Date.now()-r.at<ze)return r.list;let o=(async()=>{let a=te(),i;try{i=(await t.send({op:"GetTransitPublicKeys",method:"GET",path:"/secrets/transit/public",query:{nonce:a},auth:[["ApiKeyAuth"]],answers:{200:"json"}})).data}catch(c){throw new l("network",{code:"encryption_keys_unavailable",message:"the project's encryption keys could not be fetched: no encrypted field is sent without them",cause:c})}try{return await ne(i,e.signer,e.projectId,a)}catch(c){throw new l("decode",{code:"encryption_keys_unverified",message:"the project's list of encryption keys does not verify with the key this app was built with: nothing is sealed to it",cause:c})}})();return O.set(s,{list:o,at:Date.now()}),o.catch(()=>{O.get(s)?.list===o&&O.delete(s)}),o}async function ye(t,e,n,s,r,o){let i=(await Qe(t,e,o)).keys[0];return Y(i.kid,i.key,Q(e.projectId,n,s,r))}function K(t,e,n,s){return e==null||!s||s.length===0?Promise.resolve(e):G(e,n,s,(r,o)=>Z(t.key,r,o))}function me(t,e,n,s){return e===void 0||!n||n.length===0?Promise.resolve(e):G(e,"/response",n,async(r,o)=>{if(!X(o))throw new l("decode",{code:"field_not_encrypted",message:`${s}: ${r} came plain where the backend's contract says it is encrypted`});try{return await ee(t.key,r,o)}catch(a){throw new l("decode",{code:"field_unopenable",message:`${s}: ${r} does not open with this call's key`,cause:a})}})}function we(t){return t instanceof l&&(t.code==="encryption_key_retired"||t.code==="encryption_key_unknown")}var B=class{pending="";dataLines=[];eventName;consume(e){this.pending+=e.replace(/\r\n/g,`
|
|
3
3
|
`);let n=[],s=this.pending.indexOf(`
|
|
4
4
|
`);for(;s!==-1;){let r=this.pending.slice(0,s);this.pending=this.pending.slice(s+1);let o=r.endsWith("\r")?r.slice(0,-1):r;if(o==="")this.dataLines.length>0&&n.push({event:this.eventName,payload:this.dataLines.join(`
|
|
5
5
|
`)}),this.dataLines=[],this.eventName=void 0;else if(!o.startsWith(":")){if(o.startsWith("data:")){let a=o.slice(5);this.dataLines.push(a.startsWith(" ")?a.slice(1):a)}else if(o.startsWith("event:")){let a=o.slice(6);this.eventName=a.startsWith(" ")?a.slice(1):a}}s=this.pending.indexOf(`
|