palbase 0.37.1 → 0.38.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/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/{LEBJY4WH.js → 2WLJWZTT.js} +3 -3
- package/dist/chunks/{NPJJBKWB.js → 4NXMQWCX.js} +2 -2
- package/dist/chunks/{GHUIGLRJ.js → 5DUY3VP2.js} +2 -2
- package/dist/chunks/{DQYLTIE5.js → 6SDU7XE2.js} +2 -2
- package/dist/chunks/{YT7ZMYMN.js → 6SKJE2BU.js} +2 -2
- package/dist/chunks/{I6H2425X.js → 7EDHWR5A.js} +2 -2
- package/dist/chunks/{TPQAYDWC.js → CL6S7PER.js} +1 -1
- package/dist/chunks/{YOR7K46P.js → F3D326PD.js} +1 -1
- package/dist/chunks/{H6LQPKWU.js → FM3BAHZZ.js} +1 -1
- package/dist/chunks/{UA3CCXS4.js → GZEEHPBE.js} +2 -2
- package/dist/chunks/{6FVAAS5I.js → IIZT54SQ.js} +2 -2
- package/dist/chunks/{MW7YMYNO.js → JFHJPS5G.js} +1 -1
- package/dist/chunks/{JEA6LCOK.js → JJ5KC2LB.js} +2 -2
- package/dist/chunks/{QA6474UP.js → JLRUWZ5F.js} +2 -2
- package/dist/chunks/{XYRYBY7I.js → JRTLS5CM.js} +2 -2
- package/dist/chunks/{IZ6RIKPB.js → KCKE34OI.js} +2 -2
- package/dist/chunks/{YO6MPQJ4.js → L5S55A54.js} +2 -2
- package/dist/chunks/{PMT4A5UW.js → LRXCOKXA.js} +2 -2
- package/dist/chunks/{AYPQOPOF.js → RSQV7RNP.js} +1 -1
- package/dist/chunks/{GCVJJS4Y.js → TGQPGUJJ.js} +1 -1
- package/dist/chunks/{SRDV2B4P.js → UDOERJLL.js} +2 -2
- package/dist/chunks/{VU2SS32B.js → WHJSFH5J.js} +2 -2
- package/dist/chunks/{RAPT7CYO.js → Z4ULG52U.js} +1 -1
- package/dist/cli.js +125 -125
- 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 -2
- package/types/cloud/src/generated/project.d.ts +1 -1
- package/types/internal/src/messaging/store.d.ts +2 -0
- package/types/internal/src/modules/machines.d.ts +73 -8
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
/*! palbase 0.
|
|
2
|
-
import{e as tt,g as st,h as it}from"./UA3CCXS4.js";import{h as nt}from"./GHUIGLRJ.js";import{a as et}from"./XYRYBY7I.js";import{r as Ye,t as Qe,u as Ze}from"./TPQAYDWC.js";import{b as G,c as K,e as Be,f as Je,i as _e,j as $,k as ze}from"./I6H2425X.js";import{a as Xe,b as H}from"./PMT4A5UW.js";import{b as w,d as j}from"./IZ6RIKPB.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,Ce(n.payload))}),t.on("state_snapshot",n=>this.held(s,Ce(St(n.entries)))),t.on("state_diff",n=>this.held(s,Ce(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 Ce(r){let e=typeof r=="object"&&r!==null?r.version:void 0;return typeof e=="number"&&Number.isFinite(e)?e:void 0}var _s=`
|
|
1
|
+
/*! palbase 0.38.0 — Palbase SDK License (see LICENSE) */
|
|
2
|
+
import{e as tt,g as st,h as it}from"./GZEEHPBE.js";import{h as nt}from"./5DUY3VP2.js";import{a as et}from"./JRTLS5CM.js";import{r as Ye,t as Qe,u as Ze}from"./CL6S7PER.js";import{b as G,c as K,e as Be,f as Je,i as _e,j as $,k as ze}from"./7EDHWR5A.js";import{a as Xe,b as H}from"./LRXCOKXA.js";import{b as w,d as j}from"./KCKE34OI.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
3
|
:host{display:block;color-scheme:light dark;font:15px/1.4 system-ui,-apple-system,"Segoe UI",Roboto,sans-serif}
|
|
4
4
|
.list{display:flex;flex-direction:column;gap:8px;margin:0;padding:0;list-style:none}
|
|
5
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}
|
|
@@ -19,4 +19,4 @@ import{e as tt,g as st,h as it}from"./UA3CCXS4.js";import{h as nt}from"./GHUIGLR
|
|
|
19
19
|
.empty{padding:24px 12px;text-align:center;color:var(--muted)}
|
|
20
20
|
.light{--bg:#f4f4f6;--fg:#111;--muted:#5c5c66;--accent:#2f6bff;--hover:#0000000f}
|
|
21
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 M=s.createElement("button");if(M.type="button",M.className="delete",M.textContent="\xD7",M.setAttribute("aria-label",t.labels?.delete??"Delete"),M.addEventListener("click",v=>{v.stopPropagation(),h(u)}),u.card){b.className=`card ${u.read_at?"":"unread"}`;let v=s.createElement("div");b.append(v,M);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(C=>C instanceof HTMLElement&&C.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[_,C]of[["title",u.title],["body",u.body],["when",p(u.created_at)]]){if(!C)continue;let Se=s.createElement("span");Se.className=_,Se.textContent=C,k.append(Se)}b.append(k,M),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 Cs(a);let o=await a.pushManager.getSubscription(),l=(await this.api.getWebPushKey()).data.public_key;o&&!Ms(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=Ct(e)?.searchParams.get("key");return!!t&&Me(t)!==void 0&&Me(t)===Me(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=Ct(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 Cs(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 Me(r){let e=r.split("_");return e.length>=3&&e[0]==="pb"&&e[1]!==""?e[1]:void 0}function Ct(r){let e=(r.installing??r.waiting??r.active)?.scriptURL;return e?new URL(e):void 0}function Ms(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)&&Mt(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])Mt(t,e)}}};function Mt(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),this.forgetLast(s.conversation_id,s.message_id)&&(t.list=!0);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,...e.last_message===void 0&&s?.last_message?{last_message:s.last_message}:{}};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){let s=this.messages.get(e)?.delete(t)??!1;return this.forgetLast(e,t)||s}forgetLast(e,t){let s=this.conversations.get(e);if(s?.last_message?.id!==t)return!1;let{last_message:i,...n}=s;return this.conversations.set(e,n),!0}list(){return[...this.conversations.values()].map(e=>this.withLast(e)).sort(Us)}withLast(e){let t=Math.max(e.me?.joined_seq??0,e.me?.cleared_seq??0),s=e.me?.left_seq??Number.POSITIVE_INFINITY,i=c=>c!=null&&c.seq>t&&c.seq<=s&&!(c.expires_at&&Date.parse(c.expires_at)<=Date.now()&&!c.deleted),n=i(e.last_message)?e.last_message:void 0,a=this.timeline(e.id).filter(i).at(-1);a&&(!n||a.seq>=n.seq)&&(n=a);let o=n&&this.messages.get(e.id)?.get(n.id);if(o&&n&&o.version>n.version&&(n=o),n===e.last_message)return e;let{last_message:l,...d}=e;return n?{...d,last_message:n}:d}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();if(this.loaded.has(e))return;this.loaded.add(e);let s=t.store.timeline(e);if(s.length>0&&this.synced){let i=t.store.conversations.get(e)?.me;s[0].seq<=Math.max(i?.joined_seq??0,i?.cleared_seq??0)+1&&(this.earlier.set(e,null),this.tellConversation(e));return}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),this.tellConversation(e),!!n.next_cursor)}tellConversation(e){this.tell({list:!1,conversations:new Set([e]),threads:new Set,scheduled:!1})}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 C=new Headers(k?.headers);return C.has("accept-language")||C.set("accept-language",t),_(v,{...k,headers:C})},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(()=>{})},M=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,_,C={})=>u.workspaceFile(v,k,_,C.signal)});return it(M,i,ke,f,g,()=>d.snapshot()?.userId),M}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};
|
|
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),this.forgetLast(s.conversation_id,s.message_id)&&(t.list=!0);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,...e.last_message===void 0&&s?.last_message?{last_message:s.last_message}:{}};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){let s=this.messages.get(e)?.delete(t)??!1;return this.forgetLast(e,t)||s}forgetLast(e,t){let s=this.conversations.get(e);if(s?.last_message?.id!==t)return!1;let{last_message:i,...n}=s;return this.conversations.set(e,n),!0}list(){return[...this.conversations.values()].map(e=>this.withLast(e)).sort(Us)}holdsAll(e){let t=this.conversations.get(e),s=this.messages.get(e);if(!t||!s)return!1;let i=Math.max(t.me?.joined_seq??0,t.me?.cleared_seq??0),n=t.me?.left_seq??t.last_seq;if(n<=i)return!1;let a=new Set([...s.values()].map(o=>o.seq));for(let o=i+1;o<=n;o++)if(!a.has(o))return!1;return!0}withLast(e){let t=Math.max(e.me?.joined_seq??0,e.me?.cleared_seq??0),s=e.me?.left_seq??Number.POSITIVE_INFINITY,i=c=>c!=null&&c.seq>t&&c.seq<=s&&!(c.expires_at&&Date.parse(c.expires_at)<=Date.now()&&!c.deleted),n=i(e.last_message)?e.last_message:void 0,a;for(let c of this.messages.get(e.id)?.values()??[])(!c.thread_id||c.also_in_conversation)&&i(c)&&(!a||c.seq>a.seq)&&(a=c);a&&(!n||a.seq>=n.seq)&&(n=a);let o=n&&this.messages.get(e.id)?.get(n.id);if(o&&n&&o.version>n.version&&(n=o),n===e.last_message)return e;let{last_message:l,...d}=e;return n?{...d,last_message:n}:d}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();if(!this.loaded.has(e)){if(this.loaded.add(e),t.store.timeline(e).length>0&&this.synced){t.store.holdsAll(e)&&(this.earlier.set(e,null),this.tellConversation(e));return}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),this.tellConversation(e),!!n.next_cursor)}tellConversation(e){this.tell({list:!1,conversations:new Set([e]),threads:new Set,scheduled:!1})}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};
|