palbase 0.18.6 → 0.19.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +14 -0
- 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/{OGP5DLL6.js → 2565R445.js} +2 -2
- package/dist/chunks/{BDD3FVHP.js → 33IVA4BF.js} +2 -2
- package/dist/chunks/{6JA355QW.js → 6BHXBWO2.js} +1 -1
- package/dist/chunks/{U4R3KQT6.js → 7KRALA6Q.js} +1 -1
- package/dist/chunks/BCTD3FJ7.js +2 -0
- package/dist/chunks/{NIDBDL7O.js → BNMHHWXR.js} +1 -1
- package/dist/chunks/{OL33SRTB.js → E64JU3BI.js} +2 -2
- package/dist/chunks/{L4SDE4IC.js → ETIZ76MU.js} +2 -2
- package/dist/chunks/{Y76SPW2M.js → I6XSBSCX.js} +1 -1
- package/dist/chunks/{7HE22VDH.js → M3ISZUMT.js} +1 -1
- package/dist/chunks/{E4CPOSFA.js → MW3TKB25.js} +2 -2
- package/dist/chunks/{IO3G5VIC.js → MZWR5LM3.js} +2 -2
- package/dist/chunks/{C53PUTQR.js → PAYTQB5N.js} +2 -2
- package/dist/chunks/{RHLHSALC.js → QFSDHCVW.js} +2 -2
- package/dist/chunks/{Q2O72MGS.js → SO7CPQKM.js} +1 -1
- package/dist/chunks/{4HYASQT5.js → UFED6IQR.js} +2 -2
- package/dist/chunks/{ARDQJVIP.js → UXROASPM.js} +2 -2
- package/dist/chunks/{6HESVOSN.js → V2CPPIF7.js} +1 -1
- package/dist/chunks/{S76H65KW.js → WJYO5EHR.js} +2 -2
- package/dist/chunks/{RUE6N2T6.js → Y6ICMAUF.js} +2 -2
- package/dist/chunks/{5N36M3Y3.js → YAVDYP2M.js} +3 -3
- package/dist/chunks/{6IHNI2FC.js → ZNUDS44B.js} +2 -2
- package/dist/chunks/{U6UXSVEZ.js → ZX4XWAGN.js} +2 -2
- package/dist/cli.js +103 -103
- package/dist/cloud/index.js +2 -0
- package/dist/refuse/ai.js +1 -1
- package/dist/refuse/backend.js +1 -1
- package/dist/refuse/cloud.js +2 -0
- 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 +18 -4
- package/types/cloud/src/cloud.d.ts +23 -0
- package/types/cloud/src/generated/project.d.ts +19 -0
- package/types/cloud/src/generated/studio.d.ts +1765 -0
- package/types/cloud/src/index.d.ts +7 -0
- package/types/cloud/src/token.d.ts +6 -0
- package/types/internal/src/modules/notify.d.ts +1 -1
- package/types/internal/src/transport.d.ts +10 -1
- package/types/web/src/consent.d.ts +1 -1
- package/types/web/src/socket.d.ts +6 -0
- package/dist/chunks/RGZZCQMZ.js +0 -2
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
/*! palbase 0.
|
|
2
|
-
import{e as He,g as We,h as Je}from"./S76H65KW.js";import{h as ze}from"./RUE6N2T6.js";import{a as Be}from"./ARDQJVIP.js";import{r as Ve,t as Fe,u as Ge}from"./6HESVOSN.js";import{b as B,c as K,e as Ke,g as Se,h as j,i as je}from"./IO3G5VIC.js";import{a as $e,b as H}from"./4HYASQT5.js";import{b as S,d as q}from"./RGZZCQMZ.js";function Nt(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 Xe(){let r=null;return{load:()=>r,save:e=>{r=e},clear:()=>{r=null},shared:!1}}function Ye(r){let e=null,t=!0,s=()=>{try{return globalThis.localStorage}catch{return}};return{shared:!0,load(){try{let n=s()?.getItem(r);return n==null?t?null:e:JSON.parse(n)}catch{return e}},save(n){e=n;try{let i=s();if(!i)throw new Error("no storage");i.setItem(r,JSON.stringify(n)),t=!0}catch{t=!1}},clear(){e=null,t=!0;try{s()?.removeItem(r)}catch{}},watch(n){let i=globalThis;if(typeof i.addEventListener!="function")return()=>{};let a=o=>{(o.key===r||o.key===null)&&n()};return i.addEventListener("storage",a),()=>i.removeEventListener?.("storage",a)}}}function _e(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 Dt=6e4,Ut=15e3;function Lt(r,e,t){let s=r?globalThis.navigator?.locks:void 0;return s?s.request(e,t):t()}var W=class{current=null;loaded;inflight=null;endReason=null;listeners=new Set;store;refresher;isRejected;now;lockName;refreshTimeoutMs;mode;constructor(e,t,s,n={}){this.store=e,this.refresher=t,this.isRejected=s,this.now=n.now??Date.now,this.lockName=n.lockName??"palbase.session.refresh",this.refreshTimeoutMs=n.refreshTimeoutMs??Ut,this.mode=n.refresh??"behind",this.loaded=Promise.resolve(e.load()).then(i=>{this.current=i}),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 n=t==="TOKEN_REFRESHED"?this.current:null,i={accessToken:e.access_token,refreshToken:e.refresh_token,expiresAt:this.now()+e.expires_in*1e3,userId:s?.id??n?.userId??_e(e.access_token),user:s??n?.user};return this.current=i,await this.store.save(i),this.emit(t,i),i}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 n=await this.store.load();(!n||!s||n.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>Dt)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=Lt(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 n=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(n,"TOKEN_REFRESHED")}catch(n){throw this.isRejected(n)&&this.current?.refreshToken===t.refreshToken&&await this.clear("SESSION_EXPIRED",Nt(n)),n}});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((n,i)=>{t=setTimeout(()=>i(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 n of s)e?n.resolve():n.reject(new Error(`join ${this.name} refused: ${JSON.stringify(t)}`));if(e)for(let n of[...this.joiners])try{n()}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;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")}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",{}),e.state="closed",this.channels.delete(e.name)}async request(e,t,s){let n=this.ws;if(this.channels.get(e.name)!==e||e.state!=="joined"||n?.readyState!==1)return{status:"error",response:{reason:"not joined"}};let i=this.nextRef(),a=JSON.stringify([e.joinRef,i,e.topic,t,s]),o=this.awaitReply(i);return n.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((n,i)=>{let a=new e(t);this.ws=a,a.onopen=()=>{this.attempts=0,this.startHeartbeat(),n()},a.onmessage=o=>this.receive(String(o.data)),a.onerror=()=>i(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[,n]of this.replies)n("error",{reason:"socket closed"});this.replies.clear();for(let n of this.channels.values())n.state==="joined"&&(n.state="joining");if(this.closedByUs||![...this.channels.values()].some(n=>n.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 n=[...this.channels.values()].filter(i=>i.state==="joining");this.open().then(()=>Promise.all(n.map(i=>this.sendJoin(i)))).catch(()=>{})},s))}async sendJoin(e){let t=await this.opts.accessToken(),s=this.nextRef();e.joinRef=s;let n=this.awaitReply(s),i={broadcast:{self:!1}};e.logSeq!==void 0&&(i.log={after:e.logSeq}),this.push(s,e.topic,"phx_join",{access_token:t,config:i},s);let{status:a,response:o}=await n;if(this.channels.get(e.name)!==e||e.state!=="joining"){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,(n,i)=>{clearTimeout(s),this.replies.delete(e),t({status:n,response:i})})})}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,n,i,a]=t,o=typeof a=="object"&&a!==null?a:{};if(i==="phx_reply"&&typeof s=="string"){if(s===this.heartbeatRef){this.heartbeatRef=null;return}this.replies.get(s)?.(String(o.status),o.response??{});return}let d=[...this.channels.values()].find(c=>c.topic===n);if(d){if(i==="phx_close"){d.state="closed";return}if(i==="phx_error"){d.state="joining",J(setTimeout(()=>this.channels.get(d.name)===d&&d.state==="joining"&&this.ws?.readyState===1&&void this.sendJoin(d),1e3));return}d.deliver(i,o)}}push(e,t,s,n,i=this.nextRef()){this.ws?.send(JSON.stringify([e,i,t,s,n]))}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 R="X-Palbase-Installation-Secret",Y="X-Palbase-Installation",Qe=new WeakMap;function O(r){return Qe.get(r)}var et=new WeakSet;function tt(r){return et.has(r)}var qt=/^[A-Za-z0-9_-]{43}$/,X=class{id;constructor(e){let t=`palbase.installation.secret.${e}`,s;try{let n=Ze()?.getItem(t);n&&qt.test(n)&&(s=n)}catch{}if(!s){et.add(this),s=st(crypto.getRandomValues(new Uint8Array(32)));try{Ze()?.setItem(t,s)}catch{}}Qe.set(this,s),this.id=Kt(s)}};function Kt(r){return st($t(new TextEncoder().encode(r)).subarray(0,16))}function Ze(){try{return globalThis.localStorage}catch{return}}function st(r){let e="";for(let t of r)e+=String.fromCharCode(t);return btoa(e).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}var jt=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]),E=(r,e)=>r>>>e|r<<32-e;function $t(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 n=new Uint32Array(64);for(let o=0;o<t.length;o+=64){for(let f=0;f<16;f++)n[f]=s.getUint32(o+f*4);for(let f=16;f<64;f++){let y=E(n[f-15],7)^E(n[f-15],18)^n[f-15]>>>3,b=E(n[f-2],17)^E(n[f-2],19)^n[f-2]>>>10;n[f]=n[f-16]+y+n[f-7]+b|0}let[d,c,l,g,p,k,_,h]=e;for(let f=0;f<64;f++){let y=h+(E(p,6)^E(p,11)^E(p,25))+(p&k^~p&_)+jt[f]+n[f]|0,b=(E(d,2)^E(d,13)^E(d,22))+(d&c^d&l^c&l)|0;h=_,_=k,k=p,p=g+y|0,g=l,l=c,c=d,d=y+b|0}e[0]+=d,e[1]+=c,e[2]+=l,e[3]+=g,e[4]+=p,e[5]+=k,e[6]+=_,e[7]+=h}let i=new Uint8Array(32),a=new DataView(i.buffer);for(let o=0;o<8;o++)a.setUint32(o*4,e[o]);return i}var Ft=30*6e4,nt=1e3,Gt=100,Bt=60*1024,Z=()=>globalThis.crypto?.randomUUID?globalThis.crypto.randomUUID():`${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;function U(){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,n,i,a,o={}){this.session=s,this.consent=n;let d={send:l=>e.send(this.granted("analytics")?{...l,headers:{...l.headers,[Y]:i.id}}:l)};this.api=B.client(d);let c={send:l=>(this.granted("analytics")?e:t).send(l)};this.perfApi=B.client(c),this.closingApi=B.client({send:l=>d.send({...l,keepalive:!0})}),this.closingPerfApi=B.client({send:l=>c.send({...l,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(l=>{l==="SIGNED_IN"?(this.identifyPending=!0,this.soon()):l==="SIGNED_OUT"&&(this.identifyPending=!1,this.reset())}),n.onChange((l,g)=>{g!=="granted"&&(l==="analytics"?(this.events=[],this.identifyPending=!1,this.samples=this.samples.map(Pe),this.reset()):l==="performance"&&(this.samples=[]))})}capture(e,t){for(let n of this.listeners)n(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 n=this.sessionId(this.now()),i=this.readOnce(),a=i?.session===n?i.keys:[];a.includes(e)||(this.writeOnce({session:n,keys:[...a,e].slice(-500)}),this.capture(t,s))}readOnce(){try{let e=U()?.getItem(this.onceKey);if(e)return JSON.parse(e)}catch{}return this.memoryOnce}writeOnce(e){this.memoryOnce=e;try{U()?.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,n=e.url??(t?`${t.origin}${$(t.pathname)}`:"");if(!n)return;let i=e.referrer??Yt(s?.referrer);this.capture("$pageview",{...e.properties,url:n,...e.title??s?.title?{title:e.title??s?.title}:{},...i?{referrer:i}:{}})}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{U()?.removeItem(this.anonKey),U()?.removeItem(this.sessionKey),U()?.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(Pe)):this.samples=[];let t=e?this.closingApi:this.api,s=e?this.closingPerfApi:this.perfApi,n=this.now(),i=this.session.snapshot()?.userId;for(this.identifyPending&&i&&this.granted("analytics")&&(this.identifyPending=!1,await this.sendIdentify(t,i));this.events.length>0;){let a=this.take(this.events,e);try{await t.batch({body:{events:a.map(o=>({...o,sent_at:n}))}})}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(Jt((a,o)=>this.sample("web_vital",a,o))),e.network!==!1&&s.push(this.watchFetch(t));let n=()=>{document.visibilityState==="hidden"&&this.flush(!0)},i=()=>{this.flush(!0)};return document.addEventListener("visibilitychange",n),t.addEventListener("pagehide",i),s.push(()=>{document.removeEventListener("visibilitychange",n),t.removeEventListener("pagehide",i)}),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>=nt&&this.events.shift(),this.events.push(e),this.soon()}sample(e,t,s,n={}){if(!this.granted("performance"))return;this.samples.length>=nt&&this.samples.shift();let i={row_id:Z(),trace_type:e,name:t,value:Math.max(0,s),timestamp:this.now(),...n};this.samples.push(this.granted("analytics")?{...i,distinct_id:this.distinctId()}:Pe(i)),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,Gt);if(!t)return s;for(;s.length>1&&JSON.stringify(s).length>Bt;)e.unshift(s.pop());return s}distinctId(){return this.session.snapshot()?.userId??this.anonymousId()}anonymousId(){let e=U();try{let t=e?.getItem(this.anonKey);if(t)return t;let s=`anon_${Z()}`;if(e?.setItem(this.anonKey,s),e?.getItem(this.anonKey)===s)return s}catch{}return this.memoryAnon??=`anon_${Z()}`,this.memoryAnon}sessionId(e){let t=U(),s=this.memorySession;try{let i=t?.getItem(this.sessionKey);i&&(s=JSON.parse(i))}catch{}let n=s&&e-s.last<Ft?{id:s.id,last:e}:{id:`ses_${Z()}`,last:e};this.memorySession=n;try{t?.setItem(this.sessionKey,JSON.stringify(n))}catch{}return n.id}watchPages(e){let t="",s=()=>{let o=`${e.location.origin}${e.location.pathname}`;if(o===t)return;t=o;let d=`${e.location.origin}${$(e.location.pathname)}`;setTimeout(()=>this.page({url:d}),0)},n=e.history,i=n.pushState.bind(n),a=n.replaceState.bind(n);return n.pushState=(...o)=>{i(...o),s()},n.replaceState=(...o)=>{a(...o),s()},e.addEventListener("popstate",s),s(),()=>{n.pushState=i,n.replaceState=a,e.removeEventListener("popstate",s)}}watchFetch(e){let t=e.fetch;if(typeof t!="function")return()=>{};let s=async(n,i)=>{let a=performance.now(),o=n instanceof Request?n:void 0,d=(i?.method??o?.method??"GET").toUpperCase(),c;try{c=new URL(o?.url??String(n),e.location.href)}catch{c=void 0}let l=!!c&&c.pathname.startsWith("/analytics/")||zt(i?.headers??o?.headers);try{let g=await t(n,i);return c&&!l&&this.sample("network",`${d} ${c.origin}${$(c.pathname)}`,performance.now()-a,{attrs:{status:String(g.status)},...g.headers.get("x-request-id")?{request_id:g.headers.get("x-request-id")}:{}}),g}catch(g){throw c&&!l&&this.sample("network",`${d} ${c.origin}${$(c.pathname)}`,performance.now()-a,{attrs:{status:"0"}}),g}};return e.fetch=s,()=>{e.fetch===s&&(e.fetch=t)}}};function Pe(r){let{distinct_id:e,request_id:t,...s}=r;return s}var Ht=r=>r.entryType==="layout-shift"&&"value"in r&&"hadRecentInput"in r,Wt=r=>r.entryType==="event"||r.entryType==="first-input";function Q(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 Jt(r){if(typeof document>"u"||typeof performance>"u"||typeof performance.getEntriesByType!="function")return()=>{};let e=0,t=0,s=0,n=[Q("largest-contentful-paint",c=>{for(let l of c)e=Math.max(e,l.startTime)}),Q("layout-shift",c=>{for(let l of c)Ht(l)&&!l.hadRecentInput&&(t+=l.value)}),Q("event",c=>{for(let l of c)Wt(l)&&(s=Math.max(s,l.duration))}),Q("paint",c=>{for(let l of c)l.name==="first-contentful-paint"&&r("FCP",l.startTime)})],i=performance.getEntriesByType("navigation")[0];i&&i.responseStart>0&&r("TTFB",i.responseStart);let a=!1,o=()=>{a||(a=!0,e>0&&r("LCP",e),r("CLS",t),s>0&&r("INP",s))},d=()=>{document.visibilityState==="hidden"&&o()};return document.addEventListener("visibilitychange",d),()=>{o(),document.removeEventListener("visibilitychange",d);for(let c of n)c?.disconnect()}}function zt(r){if(!r)return!1;try{return new Headers(r).has("next-router-prefetch")}catch{return!1}}var Xt=/^[a-z][a-z0-9_-]{0,31}$/;function $(r){return r.split("/").map(e=>{if(e==="")return e;let t=e.split(";",1)[0],s=t.toLowerCase();return Xt.test(s)&&(s.match(/\d/g)?.length??0)<=2&&t.slice(1)===s.slice(1)&&s.split(/[-_]/).every(i=>i.length<=16)?s:":id"}).join("/")}function Yt(r){if(!r)return"";try{let e=new URL(r);return`${e.origin}${$(e.pathname)}`}catch{return $(r.split(/[?#]/,1)[0]??"")}}var ft=/^custom\.[a-z0-9_]{1,48}$/,Zt=/^[a-z][a-z0-9_]{0,63}$/,it=r=>Zt.test(r)||ft.test(r),Qt=50,rt=[5e3,3e4,12e4,6e5],es=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[d,c]of Object.entries(t.start??{})){if(!it(d))throw new TypeError(`consent.start: ${JSON.stringify(d)} is not a consent key (a platform key, or custom.<name>)`);if(c!=="granted"&&c!=="denied")throw new TypeError(`consent.start.${d} is granted or denied`)}for(let d of t.customKeys??[])if(!ft.test(d))throw new TypeError(`consent.customKeys: ${JSON.stringify(d)} 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(),n=()=>tt(this.installation)?{}:{unknown:{on:!0,w:this.stamp()}},i={whose:null,install:this.installation.id,choices:{},unsent:[]};typeof s!="object"?this.kept={...i,...s==="unreadable"?{unknown:{on:!0,w:this.stamp()}}:n()}:s.whose==null&&s.install!==void 0&&s.install!==this.installation.id?this.kept={...i,unsent:s.unsent.filter(d=>d.user!==null),...s.keys?{keys:s.keys}:{},...n()}:this.kept=s,e.session.onChange((d,c)=>{this.engaged&&(d==="SIGNED_IN"&&c?this.signedIn(c):(d==="SIGNED_OUT"||d==="SESSION_EXPIRED")&&this.signedOut())});let a=globalThis;typeof a.addEventListener=="function"&&(a.addEventListener("storage",d=>{(d.key===this.storeKey||d.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=dt(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(!it(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(),n=this.session.snapshot()?.userId??null,i=this.states();for(let[a,o]of t)this.queue({key:a,state:o,source:"app",chosen_at:s,user:n,...this.textVersion!==void 0?{text_version:this.textVersion}:{}});this.commit(i),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(d=>d.key),n=await this.platform().catch(()=>this.kept.keys??[]),i=new Set(n.filter(d=>d.ads).map(d=>d.key)),a=this.kept.region?.jurisdiction==="us",o=new Date(this.now());return o.setUTCMonth(o.getUTCMonth()-12),s.filter(d=>{let c=this.kept.choices[d];return a&&i.has(d)&&c?.last_denied_at!==void 0&&Date.parse(c.last_denied_at)>o.getTime()?!1:!c||c.state==="unset"?!0:this.textVersion!==void 0&&c.source==="app"&&c.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{[R]: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 n=this.states(),i={};for(let h of e.choices)i[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=>i[h.key]?.state!==h.state||Date.parse(i[h.key]?.chosen_at??"")!==Date.parse(h.chosen_at)).map(h=>A(h.key,h)),d=x(this.kept)===(t===null?`device:${this.installation.id}`:`user:${t}`)?Object.entries(this.kept.choices).filter(([,h])=>h.provisional).map(([h,f])=>A(h,f)):[];if(a.length+d.length>0&&(this.kept={...this.kept,void:C([...this.kept.void??[],...a,...d])}),t===null&&this.kept.resetAt!==void 0)for(let[h,f]of Object.entries(i))Date.parse(f.chosen_at)<this.kept.resetAt&&delete i[h];let c=new Set(Object.entries(i).map(([h,f])=>A(h,f))),l=(this.kept.void??[]).filter(h=>c.has(h));l.length>0&&(this.kept={...this.kept,unvoid:C([...this.kept.unvoid??[],...l])});let g=gt(this.kept),p;if(x(this.kept)!==(t===null?`device:${this.installation.id}`:`user:${t}`))p=i;else{p={};for(let h of[...new Set([...Object.keys(this.kept.choices),...Object.keys(i)])].sort()){let f=this.kept.choices[h],y=f&&!f.provisional&&!g.has(A(h,f))?f:void 0,b=i[h],M=b&&(!y||Date.parse(b.chosen_at)>=Date.parse(y.chosen_at))?b:y;M&&(p[h]=M)}}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 f=p[h.key];f&&Date.parse(f.chosen_at)>Date.parse(h.chosen_at)||(p[h.key]=ot(h,f))}let{install:k,..._}=this.kept;this.kept={..._,whose:t,...t===null?{install:this.installation.id}:{},choices:p,unknown:{on:!1,w:this.stamp()}},this.readFor=t,this.stale=!1,this.commit(n),this.refuseByGpc()}async refused(e,t,s){let n=t===e&&x(this.kept)===(t===null?`device:${this.installation.id}`:`user:${t}`),i=C([...this.kept.void??[],...s.map(d=>A(d.key,d))]);if(!n){this.kept={...this.kept,void:i},this.commit();return}let a=this.states(),o={...this.kept.choices};for(let d of s){if(this.kept.unsent.some(l=>l.key===d.key&&(l.user===null||l.user===e)&&Date.parse(l.chosen_at)>Date.parse(d.chosen_at)))continue;let c=o[d.key];o[d.key]={state:"denied",source:"app",chosen_at:d.chosen_at,...c?.last_denied_at!==void 0?{last_denied_at:c.last_denied_at}:{},provisional:!0}}this.kept={...this.kept,choices:o,void:i},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:mt([...this.kept.unsent,t]),...s?{choices:{...this.kept.choices,[t.key]:ot(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=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(n){if(!ht(n))throw n}if(this.kept.link===e){let{link:n,...i}=this.kept;this.kept=i,this.commit()}if(s)this.adopt(s,e);else{let n=this.states();this.kept={...this.kept,unknown:{on:!0,w:this.stamp()}},this.commit(n)}}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(t){return t instanceof T&&(this.session.snapshot()?.userId??null)!==e?(this.sendAgain=!0,!0):(this.retryLater(),!1)}}async sendOf(e,t){let s=!1;for(;;){let n=this.nextGroup(e);if(n.length===0)return s;let i=n[0],a=e===null?this.deviceApi:this.userApi(e),o;try{o=(await a.chooseConsents({headers:this.secret(),body:{installation_id:this.installation.id,...i.source==="gpc"?{source:"gpc"}:{},...i.text_version!==void 0?{text_version:i.text_version}:{},choices:n.map(d=>({key:d.key,state:d.state,chosen_at:d.chosen_at}))}})).data}catch(d){if(!ht(d))throw d;if(n.length>1){this.kept={...this.kept,unsent:this.kept.unsent.map(c=>n.some(l=>lt(l,c))?{...c,alone:!0}:c)},this.commit();continue}}this.kept={...this.kept,unsent:this.kept.unsent.filter(d=>!n.some(c=>lt(c,d))),done:C([...this.kept.done??[],...n.map(ne)])},this.commit(),o?(s=!0,e===t&&this.adopt(o,e,n)):await this.refused(t,e,n)}}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 n=[],i=new Set;if(s.alone)return[s];for(let a of t)if(!i.has(a.key)&&(i.add(a.key),!(a.alone||a.source!==s.source||a.text_version!==s.text_version)&&(n.push(a),n.length===Qt)))break;return n}retryLater(){if(this.retryTimer)return;let e=rt[Math.min(this.retries,rt.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)]),n={};for(let[o,d]of Object.entries(this.kept.choices))n[o]={state:"unset",source:"app",chosen_at:t,...d.last_denied_at!==void 0?{last_denied_at:d.last_denied_at}:{}};let i=o=>o.user===null&&(o.device??this.installation.id)===this.installation.id,a=this.kept.unsent.filter(i);this.kept={whose:null,install:this.installation.id,resetAt:Date.parse(t),choices:n,unsent:this.kept.unsent.filter(o=>!i(o)),...this.kept.void?{void:this.kept.void}:{},...this.kept.unvoid?{unvoid:this.kept.unvoid}:{},done:C([...this.kept.done??[],...a.map(ne)]),...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},n=[t.on("broadcast",i=>{i.event==="changed"&&this.changed(s,Ie(i.payload))}),t.on("state_snapshot",i=>this.held(s,Ie(pt(i.entries)))),t.on("state_diff",i=>this.held(s,Ie(pt(i.set))))];s.off=()=>n.forEach(i=>i()),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(i=>i.key===e&&i.ads))return!1;let t=dt(this.kept,e);if(t?.state==="denied")return!1;let s=this.kept.gpc?.[x(this.kept)],n=s!==void 0&&(this.kept.whose!=null||s>=(this.kept.resetAt??0));return!(t?.state==="granted"&&t.source==="app"&&n&&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 n=this.chosenAt(),i=this.states();for(let a of s)this.queue({key:a.key,state:"denied",source:"gpc",chosen_at:n,user:t});this.kept={...this.kept,gpc:{...this.kept.gpc,[x(this.kept)]:Date.parse(n)}},this.commit(i),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 n=t.get(s);if(e.get(s)!==n)for(let i of[...this.listeners])try{i(s,n)}catch{}}}load(){let e;try{e=ut()?.getItem(this.storeKey)}catch{return"unreadable"}if(e==null)return"empty";try{let t=JSON.parse(e);if(is(t))return t}catch{}return"unreadable"}reload(){let e=this.load();if(typeof e!="object"){this.write();return}let t=this.states();this.kept=at(e,this.kept,"theirs",this.holder()),x(e)===x(this.kept)&&ct(this.kept)!==ct(e)&&this.write(),this.tell(t);let s=this.session.snapshot()?.userId??null;this.engaged&&this.kept.unsent.some(n=>n.user!==null&&n.user===s||n.user===null&&(n.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=at(t,this.kept,"ours",this.holder())),this.write(),this.tell(e)}write(){try{ut()?.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 ot(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 gt(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 ts(r,e,t,s){let n=e&&!s.has(A(r,e))?e:void 0,i=t&&!s.has(A(r,t))?t:void 0;if(!n||!i)return n??i;let a=Date.parse(n.chosen_at),o=Date.parse(i.chosen_at);return a!==o?a>o?n:i:te[n.state]!==te[i.state]?te[n.state]>te[i.state]?n:i:n.provisional?i:n}function ss(r,e){return!r||!e?r??e:e.w>r.w||e.w===r.w&&e.on?e:r}function at(r,e,t,s){let n=C([...r.void??[],...e.void??[]]),i=C([...r.unvoid??[],...e.unvoid??[]]),a=gt({void:n,unvoid:i}),o={},d,c={...r.gpc};for(let[y,b]of Object.entries(e.gpc??{}))c[y]=Math.max(c[y]??0,b);let l;if(x(r)===x(e)){d=e;for(let y of[...new Set([...Object.keys(r.choices),...Object.keys(e.choices)])].sort()){let b=ts(y,r.choices[y],e.choices[y],a);b&&(o[y]=b)}l=ss(r.unknown,e.unknown)}else{d=x(e)===s?e:x(r)===s?r:t==="ours"?e:r;for(let[y,b]of Object.entries(d.choices))a.has(A(y,b))||(o[y]=b);l=d.unknown}let g=C([...r.done??[],...e.done??[]]),p=mt([...r.unsent,...e.unsent]).filter(y=>!g.includes(ne(y))),k=t==="ours"?e:r,_=t==="ours"?r:e,h=k.region??_.region,f=k.keys??_.keys;return{whose:d.whose??null,...d.whose==null&&d.install!==void 0?{install:d.install}:{},...d.whose==null&&(r.resetAt!==void 0||e.resetAt!==void 0)&&x(r)===x(e)?{resetAt:Math.max(r.resetAt??0,e.resetAt??0)}:d.whose==null&&d.resetAt!==void 0?{resetAt:d.resetAt}:{},choices:o,unsent:p,...g.length>0?{done:g}:{},...n.length>0?{void:n}:{},...i.length>0?{unvoid:i}:{},...k.link!==void 0?{link:k.link}:{},...h?{region:h}:{},...Object.keys(c).length>0?{gpc:c}:{},...f?{keys:f}:{},...l?{unknown:l}:{}}}function ne(r){return`${r.user??`device:${r.device??""}`}|${r.key}|${r.state}|${r.source}|${r.chosen_at}`}function dt(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 C(r){return[...new Set(r)].slice(-es)}function ct(r){return JSON.stringify(r,(e,t)=>typeof t=="object"&&t!==null&&!Array.isArray(t)?Object.fromEntries(Object.entries(t).sort(([s],[n])=>s.localeCompare(n))):t)}function mt(r){let e=new Map;for(let t of r){let s=ne(t),n=e.get(s);e.set(s,n?n.alone||!t.alone?n:{...n,alone:!0}:t)}return[...e.values()].sort((t,s)=>Date.parse(t.chosen_at)-Date.parse(s.chosen_at))}var ns=new Set(["granted","denied","unset"]);function is(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,d)=>{if(typeof o!="object"||o===null)return!1;let c=o;return ns.has(c.state)&&typeof c.chosen_at=="string"&&(!d||typeof c.key=="string")},s=o=>o===void 0||typeof o=="object"&&o!==null&&typeof o.on=="boolean"&&typeof o.w=="number",n=r,i=o=>o===void 0||Array.isArray(o)&&o.every(d=>typeof d=="string"),a=n.whose===void 0||n.whose===null||typeof n.whose=="string";return Object.values(e.choices).every(o=>t(o,!1))&&e.unsent.every(o=>t(o,!0))&&(n.gpc===void 0||typeof n.gpc=="object"&&n.gpc!==null&&Object.values(n.gpc).every(o=>typeof o=="number"))&&s(n.unknown)&&i(n.done)&&i(n.void)&&i(n.unvoid)&&a}function lt(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 ht(r){return r instanceof S&&r.status>=400&&r.status<500&&r.status!==401&&r.status!==408&&r.status!==429}function ut(){try{return globalThis.localStorage}catch{return}}function pt(r){let e=typeof r=="object"&&r!==null?r.version:void 0;return typeof e=="object"&&e!==null?e.v:void 0}function Ie(r){let e=typeof r=="object"&&r!==null?r.version:void 0;return typeof e=="number"&&Number.isFinite(e)?e:void 0}var rs=`
|
|
1
|
+
/*! palbase 0.19.1 — Palbase SDK License (see LICENSE) */
|
|
2
|
+
import{e as He,g as Je,h as We}from"./WJYO5EHR.js";import{h as ze}from"./Y6ICMAUF.js";import{a as Be}from"./UXROASPM.js";import{r as Ve,t as Fe,u as Ge}from"./V2CPPIF7.js";import{b as B,c as K,e as Ke,h as Se,i as j,j as je}from"./MZWR5LM3.js";import{a as $e,b as H}from"./UFED6IQR.js";import{b as S,d as q}from"./BCTD3FJ7.js";function Nt(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 Xe(){let r=null;return{load:()=>r,save:e=>{r=e},clear:()=>{r=null},shared:!1}}function Ye(r){let e=null,t=!0,s=()=>{try{return globalThis.localStorage}catch{return}};return{shared:!0,load(){try{let n=s()?.getItem(r);return n==null?t?null:e:JSON.parse(n)}catch{return e}},save(n){e=n;try{let i=s();if(!i)throw new Error("no storage");i.setItem(r,JSON.stringify(n)),t=!0}catch{t=!1}},clear(){e=null,t=!0;try{s()?.removeItem(r)}catch{}},watch(n){let i=globalThis;if(typeof i.addEventListener!="function")return()=>{};let a=o=>{(o.key===r||o.key===null)&&n()};return i.addEventListener("storage",a),()=>i.removeEventListener?.("storage",a)}}}function _e(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 Dt=6e4,Ut=15e3;function Lt(r,e,t){let s=r?globalThis.navigator?.locks:void 0;return s?s.request(e,t):t()}var J=class{current=null;loaded;inflight=null;endReason=null;listeners=new Set;store;refresher;isRejected;now;lockName;refreshTimeoutMs;mode;constructor(e,t,s,n={}){this.store=e,this.refresher=t,this.isRejected=s,this.now=n.now??Date.now,this.lockName=n.lockName??"palbase.session.refresh",this.refreshTimeoutMs=n.refreshTimeoutMs??Ut,this.mode=n.refresh??"behind",this.loaded=Promise.resolve(e.load()).then(i=>{this.current=i}),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 n=t==="TOKEN_REFRESHED"?this.current:null,i={accessToken:e.access_token,refreshToken:e.refresh_token,expiresAt:this.now()+e.expires_in*1e3,userId:s?.id??n?.userId??_e(e.access_token),user:s??n?.user};return this.current=i,await this.store.save(i),this.emit(t,i),i}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 n=await this.store.load();(!n||!s||n.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>Dt)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=Lt(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 n=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(n,"TOKEN_REFRESHED")}catch(n){throw this.isRejected(n)&&this.current?.refreshToken===t.refreshToken&&await this.clear("SESSION_EXPIRED",Nt(n)),n}});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((n,i)=>{t=setTimeout(()=>i(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 n of s)e?n.resolve():n.reject(new Error(`join ${this.name} refused: ${JSON.stringify(t)}`));if(e)for(let n of[...this.joiners])try{n()}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 n=this.ws;if(this.channels.get(e.name)!==e||e.state!=="joined"||n?.readyState!==1)return{status:"error",response:{reason:"not joined"}};let i=this.nextRef(),a=JSON.stringify([e.joinRef,i,e.topic,t,s]),o=this.awaitReply(i);return n.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((n,i)=>{let a=new e(t);this.ws=a,a.onopen=()=>{this.attempts=0,this.startHeartbeat(),n()},a.onmessage=o=>this.receive(String(o.data)),a.onerror=()=>i(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[,n]of this.replies)n("error",{reason:"socket closed"});this.replies.clear();for(let n of this.channels.values())n.state==="joined"&&(n.state="joining");if(this.closedByUs||![...this.channels.values()].some(n=>n.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=W(setTimeout(()=>{this.reconnectTimer=null,this.reconnects++;let n=[...this.channels.values()].filter(i=>i.state==="joining");this.open().then(()=>Promise.all(n.map(i=>this.sendJoin(i)))).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 n=this.awaitReply(s),i={broadcast:{self:!1}};e.logSeq!==void 0&&(i.log={after:e.logSeq}),this.lastJoin.set(e.name,e),this.push(s,e.topic,"phx_join",{access_token:t,config:i},s);let{status:a,response:o}=await n;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=W(setTimeout(()=>{this.replies.delete(e),t({status:"timeout",response:{reason:"no reply"}})},this.opts.replyTimeoutMs??1e4));this.replies.set(e,(n,i)=>{clearTimeout(s),this.replies.delete(e),t({status:n,response:i})})})}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,n,i,a]=t,o=typeof a=="object"&&a!==null?a:{};if(i==="phx_reply"&&typeof s=="string"){if(s===this.heartbeatRef){this.heartbeatRef=null;return}this.replies.get(s)?.(String(o.status),o.response??{});return}let d=[...this.channels.values()].find(l=>l.topic===n);if(d){if(i==="phx_close"){d.state="closed";return}if(i==="phx_error"){d.state="joining",W(setTimeout(()=>this.channels.get(d.name)===d&&d.state==="joining"&&this.ws?.readyState===1&&void this.sendJoin(d),1e3));return}d.deliver(i,o)}}push(e,t,s,n,i=this.nextRef()){this.ws?.send(JSON.stringify([e,i,t,s,n]))}nextRef(){return String(++this.ref)}startHeartbeat(){this.stopHeartbeat(),this.heartbeat=W(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 W(r){return r.unref?.(),r}var R="X-Palbase-Installation-Secret",Y="X-Palbase-Installation",Qe=new WeakMap;function O(r){return Qe.get(r)}var et=new WeakSet;function tt(r){return et.has(r)}var qt=/^[A-Za-z0-9_-]{43}$/,X=class{id;constructor(e){let t=`palbase.installation.secret.${e}`,s;try{let n=Ze()?.getItem(t);n&&qt.test(n)&&(s=n)}catch{}if(!s){et.add(this),s=st(crypto.getRandomValues(new Uint8Array(32)));try{Ze()?.setItem(t,s)}catch{}}Qe.set(this,s),this.id=Kt(s)}};function Kt(r){return st($t(new TextEncoder().encode(r)).subarray(0,16))}function Ze(){try{return globalThis.localStorage}catch{return}}function st(r){let e="";for(let t of r)e+=String.fromCharCode(t);return btoa(e).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}var jt=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]),E=(r,e)=>r>>>e|r<<32-e;function $t(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 n=new Uint32Array(64);for(let o=0;o<t.length;o+=64){for(let f=0;f<16;f++)n[f]=s.getUint32(o+f*4);for(let f=16;f<64;f++){let y=E(n[f-15],7)^E(n[f-15],18)^n[f-15]>>>3,b=E(n[f-2],17)^E(n[f-2],19)^n[f-2]>>>10;n[f]=n[f-16]+y+n[f-7]+b|0}let[d,l,c,g,p,k,_,h]=e;for(let f=0;f<64;f++){let y=h+(E(p,6)^E(p,11)^E(p,25))+(p&k^~p&_)+jt[f]+n[f]|0,b=(E(d,2)^E(d,13)^E(d,22))+(d&l^d&c^l&c)|0;h=_,_=k,k=p,p=g+y|0,g=c,c=l,l=d,d=y+b|0}e[0]+=d,e[1]+=l,e[2]+=c,e[3]+=g,e[4]+=p,e[5]+=k,e[6]+=_,e[7]+=h}let i=new Uint8Array(32),a=new DataView(i.buffer);for(let o=0;o<8;o++)a.setUint32(o*4,e[o]);return i}var Ft=30*6e4,nt=1e3,Gt=100,Bt=60*1024,Z=()=>globalThis.crypto?.randomUUID?globalThis.crypto.randomUUID():`${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;function U(){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,n,i,a,o={}){this.session=s,this.consent=n;let d={send:c=>e.send(this.granted("analytics")?{...c,headers:{...c.headers,[Y]:i.id}}:c)};this.api=B.client(d);let l={send:c=>(this.granted("analytics")?e:t).send(c)};this.perfApi=B.client(l),this.closingApi=B.client({send:c=>d.send({...c,keepalive:!0})}),this.closingPerfApi=B.client({send:c=>l.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())}),n.onChange((c,g)=>{g!=="granted"&&(c==="analytics"?(this.events=[],this.identifyPending=!1,this.samples=this.samples.map(Pe),this.reset()):c==="performance"&&(this.samples=[]))})}capture(e,t){for(let n of this.listeners)n(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 n=this.sessionId(this.now()),i=this.readOnce(),a=i?.session===n?i.keys:[];a.includes(e)||(this.writeOnce({session:n,keys:[...a,e].slice(-500)}),this.capture(t,s))}readOnce(){try{let e=U()?.getItem(this.onceKey);if(e)return JSON.parse(e)}catch{}return this.memoryOnce}writeOnce(e){this.memoryOnce=e;try{U()?.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,n=e.url??(t?`${t.origin}${$(t.pathname)}`:"");if(!n)return;let i=e.referrer??Yt(s?.referrer);this.capture("$pageview",{...e.properties,url:n,...e.title??s?.title?{title:e.title??s?.title}:{},...i?{referrer:i}:{}})}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{U()?.removeItem(this.anonKey),U()?.removeItem(this.sessionKey),U()?.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(Pe)):this.samples=[];let t=e?this.closingApi:this.api,s=e?this.closingPerfApi:this.perfApi,n=this.now(),i=this.session.snapshot()?.userId;for(this.identifyPending&&i&&this.granted("analytics")&&(this.identifyPending=!1,await this.sendIdentify(t,i));this.events.length>0;){let a=this.take(this.events,e);try{await t.batch({body:{events:a.map(o=>({...o,sent_at:n}))}})}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(Wt((a,o)=>this.sample("web_vital",a,o))),e.network!==!1&&s.push(this.watchFetch(t));let n=()=>{document.visibilityState==="hidden"&&this.flush(!0)},i=()=>{this.flush(!0)};return document.addEventListener("visibilitychange",n),t.addEventListener("pagehide",i),s.push(()=>{document.removeEventListener("visibilitychange",n),t.removeEventListener("pagehide",i)}),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>=nt&&this.events.shift(),this.events.push(e),this.soon()}sample(e,t,s,n={}){if(!this.granted("performance"))return;this.samples.length>=nt&&this.samples.shift();let i={row_id:Z(),trace_type:e,name:t,value:Math.max(0,s),timestamp:this.now(),...n};this.samples.push(this.granted("analytics")?{...i,distinct_id:this.distinctId()}:Pe(i)),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,Gt);if(!t)return s;for(;s.length>1&&JSON.stringify(s).length>Bt;)e.unshift(s.pop());return s}distinctId(){return this.session.snapshot()?.userId??this.anonymousId()}anonymousId(){let e=U();try{let t=e?.getItem(this.anonKey);if(t)return t;let s=`anon_${Z()}`;if(e?.setItem(this.anonKey,s),e?.getItem(this.anonKey)===s)return s}catch{}return this.memoryAnon??=`anon_${Z()}`,this.memoryAnon}sessionId(e){let t=U(),s=this.memorySession;try{let i=t?.getItem(this.sessionKey);i&&(s=JSON.parse(i))}catch{}let n=s&&e-s.last<Ft?{id:s.id,last:e}:{id:`ses_${Z()}`,last:e};this.memorySession=n;try{t?.setItem(this.sessionKey,JSON.stringify(n))}catch{}return n.id}watchPages(e){let t="",s=()=>{let o=`${e.location.origin}${e.location.pathname}`;if(o===t)return;t=o;let d=`${e.location.origin}${$(e.location.pathname)}`;setTimeout(()=>this.page({url:d}),0)},n=e.history,i=n.pushState.bind(n),a=n.replaceState.bind(n);return n.pushState=(...o)=>{i(...o),s()},n.replaceState=(...o)=>{a(...o),s()},e.addEventListener("popstate",s),s(),()=>{n.pushState=i,n.replaceState=a,e.removeEventListener("popstate",s)}}watchFetch(e){let t=e.fetch;if(typeof t!="function")return()=>{};let s=async(n,i)=>{let a=performance.now(),o=n instanceof Request?n:void 0,d=(i?.method??o?.method??"GET").toUpperCase(),l;try{l=new URL(o?.url??String(n),e.location.href)}catch{l=void 0}let c=!!l&&l.pathname.startsWith("/analytics/")||zt(i?.headers??o?.headers);try{let g=await t(n,i);return l&&!c&&this.sample("network",`${d} ${l.origin}${$(l.pathname)}`,performance.now()-a,{attrs:{status:String(g.status)},...g.headers.get("x-request-id")?{request_id:g.headers.get("x-request-id")}:{}}),g}catch(g){throw l&&!c&&this.sample("network",`${d} ${l.origin}${$(l.pathname)}`,performance.now()-a,{attrs:{status:"0"}}),g}};return e.fetch=s,()=>{e.fetch===s&&(e.fetch=t)}}};function Pe(r){let{distinct_id:e,request_id:t,...s}=r;return s}var Ht=r=>r.entryType==="layout-shift"&&"value"in r&&"hadRecentInput"in r,Jt=r=>r.entryType==="event"||r.entryType==="first-input";function Q(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 Wt(r){if(typeof document>"u"||typeof performance>"u"||typeof performance.getEntriesByType!="function")return()=>{};let e=0,t=0,s=0,n=[Q("largest-contentful-paint",l=>{for(let c of l)e=Math.max(e,c.startTime)}),Q("layout-shift",l=>{for(let c of l)Ht(c)&&!c.hadRecentInput&&(t+=c.value)}),Q("event",l=>{for(let c of l)Jt(c)&&(s=Math.max(s,c.duration))}),Q("paint",l=>{for(let c of l)c.name==="first-contentful-paint"&&r("FCP",c.startTime)})],i=performance.getEntriesByType("navigation")[0];i&&i.responseStart>0&&r("TTFB",i.responseStart);let a=!1,o=()=>{a||(a=!0,e>0&&r("LCP",e),r("CLS",t),s>0&&r("INP",s))},d=()=>{document.visibilityState==="hidden"&&o()};return document.addEventListener("visibilitychange",d),()=>{o(),document.removeEventListener("visibilitychange",d);for(let l of n)l?.disconnect()}}function zt(r){if(!r)return!1;try{return new Headers(r).has("next-router-prefetch")}catch{return!1}}var Xt=/^[a-z][a-z0-9_-]{0,31}$/;function $(r){return r.split("/").map(e=>{if(e==="")return e;let t=e.split(";",1)[0],s=t.toLowerCase();return Xt.test(s)&&(s.match(/\d/g)?.length??0)<=2&&t.slice(1)===s.slice(1)&&s.split(/[-_]/).every(i=>i.length<=16)?s:":id"}).join("/")}function Yt(r){if(!r)return"";try{let e=new URL(r);return`${e.origin}${$(e.pathname)}`}catch{return $(r.split(/[?#]/,1)[0]??"")}}var ft=/^custom\.[a-z0-9_]{1,48}$/,Zt=/^[a-z][a-z0-9_]{0,63}$/,it=r=>Zt.test(r)||ft.test(r),Qt=50,rt=[5e3,3e4,12e4,6e5],es=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[d,l]of Object.entries(t.start??{})){if(!it(d))throw new TypeError(`consent.start: ${JSON.stringify(d)} is not a consent key (a platform key, or custom.<name>)`);if(l!=="granted"&&l!=="denied")throw new TypeError(`consent.start.${d} is granted or denied`)}for(let d of t.customKeys??[])if(!ft.test(d))throw new TypeError(`consent.customKeys: ${JSON.stringify(d)} 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(),n=()=>tt(this.installation)?{}:{unknown:{on:!0,w:this.stamp()}},i={whose:null,install:this.installation.id,choices:{},unsent:[]};typeof s!="object"?this.kept={...i,...s==="unreadable"?{unknown:{on:!0,w:this.stamp()}}:n()}:s.whose==null&&s.install!==void 0&&s.install!==this.installation.id?this.kept={...i,unsent:s.unsent.filter(d=>d.user!==null),...s.keys?{keys:s.keys}:{},...n()}:this.kept=s,e.session.onChange((d,l)=>{this.engaged&&(d==="SIGNED_IN"&&l?this.signedIn(l):(d==="SIGNED_OUT"||d==="SESSION_EXPIRED")&&this.signedOut())});let a=globalThis;typeof a.addEventListener=="function"&&(a.addEventListener("storage",d=>{(d.key===this.storeKey||d.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=dt(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(!it(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(),n=this.session.snapshot()?.userId??null,i=this.states();for(let[a,o]of t)this.queue({key:a,state:o,source:"app",chosen_at:s,user:n,...this.textVersion!==void 0?{text_version:this.textVersion}:{}});this.commit(i),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(d=>d.key),n=await this.platform().catch(()=>this.kept.keys??[]),i=new Set(n.filter(d=>d.ads).map(d=>d.key)),a=this.kept.region?.jurisdiction==="us",o=new Date(this.now());return o.setUTCMonth(o.getUTCMonth()-12),s.filter(d=>{let l=this.kept.choices[d];return a&&i.has(d)&&l?.last_denied_at!==void 0&&Date.parse(l.last_denied_at)>o.getTime()?!1:!l||l.state==="unset"?!0:this.textVersion!==void 0&&l.source==="app"&&l.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{[R]: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 n=this.states(),i={};for(let h of e.choices)i[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=>i[h.key]?.state!==h.state||Date.parse(i[h.key]?.chosen_at??"")!==Date.parse(h.chosen_at)).map(h=>A(h.key,h)),d=x(this.kept)===(t===null?`device:${this.installation.id}`:`user:${t}`)?Object.entries(this.kept.choices).filter(([,h])=>h.provisional).map(([h,f])=>A(h,f)):[];if(a.length+d.length>0&&(this.kept={...this.kept,void:C([...this.kept.void??[],...a,...d])}),t===null&&this.kept.resetAt!==void 0)for(let[h,f]of Object.entries(i))Date.parse(f.chosen_at)<this.kept.resetAt&&delete i[h];let l=new Set(Object.entries(i).map(([h,f])=>A(h,f))),c=(this.kept.void??[]).filter(h=>l.has(h));c.length>0&&(this.kept={...this.kept,unvoid:C([...this.kept.unvoid??[],...c])});let g=gt(this.kept),p;if(x(this.kept)!==(t===null?`device:${this.installation.id}`:`user:${t}`))p=i;else{p={};for(let h of[...new Set([...Object.keys(this.kept.choices),...Object.keys(i)])].sort()){let f=this.kept.choices[h],y=f&&!f.provisional&&!g.has(A(h,f))?f:void 0,b=i[h],M=b&&(!y||Date.parse(b.chosen_at)>=Date.parse(y.chosen_at))?b:y;M&&(p[h]=M)}}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 f=p[h.key];f&&Date.parse(f.chosen_at)>Date.parse(h.chosen_at)||(p[h.key]=ot(h,f))}let{install:k,..._}=this.kept;this.kept={..._,whose:t,...t===null?{install:this.installation.id}:{},choices:p,unknown:{on:!1,w:this.stamp()}},this.readFor=t,this.stale=!1,this.commit(n),this.refuseByGpc()}async refused(e,t,s){let n=t===e&&x(this.kept)===(t===null?`device:${this.installation.id}`:`user:${t}`),i=C([...this.kept.void??[],...s.map(d=>A(d.key,d))]);if(!n){this.kept={...this.kept,void:i},this.commit();return}let a=this.states(),o={...this.kept.choices};for(let d of s){if(this.kept.unsent.some(c=>c.key===d.key&&(c.user===null||c.user===e)&&Date.parse(c.chosen_at)>Date.parse(d.chosen_at)))continue;let l=o[d.key];o[d.key]={state:"denied",source:"app",chosen_at:d.chosen_at,...l?.last_denied_at!==void 0?{last_denied_at:l.last_denied_at}:{},provisional:!0}}this.kept={...this.kept,choices:o,void:i},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:mt([...this.kept.unsent,t]),...s?{choices:{...this.kept.choices,[t.key]:ot(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(n){if(!ht(n))throw n}if(this.kept.link===e){let{link:n,...i}=this.kept;this.kept=i,this.commit()}if(s)this.adopt(s,e);else{let n=this.states();this.kept={...this.kept,unknown:{on:!0,w:this.stamp()}},this.commit(n)}}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 n=this.nextGroup(e);if(n.length===0)return s;let i=n[0],a=e===null?this.deviceApi:this.userApi(e),o;try{o=(await a.chooseConsents({headers:this.secret(),body:{installation_id:this.installation.id,...i.source==="gpc"?{source:"gpc"}:{},...i.text_version!==void 0?{text_version:i.text_version}:{},choices:n.map(d=>({key:d.key,state:d.state,chosen_at:d.chosen_at}))}})).data}catch(d){if(!ht(d))throw d;if(n.length>1){this.kept={...this.kept,unsent:this.kept.unsent.map(l=>n.some(c=>ct(c,l))?{...l,alone:!0}:l)},this.commit();continue}}this.kept={...this.kept,unsent:this.kept.unsent.filter(d=>!n.some(l=>ct(l,d))),done:C([...this.kept.done??[],...n.map(ne)])},this.commit(),o?(s=!0,e===t&&this.adopt(o,e,n)):await this.refused(t,e,n)}}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 n=[],i=new Set;if(s.alone)return[s];for(let a of t)if(!i.has(a.key)&&(i.add(a.key),!(a.alone||a.source!==s.source||a.text_version!==s.text_version)&&(n.push(a),n.length===Qt)))break;return n}retryLater(){if(this.retryTimer)return;let e=rt[Math.min(this.retries,rt.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)]),n={};for(let[o,d]of Object.entries(this.kept.choices))n[o]={state:"unset",source:"app",chosen_at:t,...d.last_denied_at!==void 0?{last_denied_at:d.last_denied_at}:{}};let i=o=>o.user===null&&(o.device??this.installation.id)===this.installation.id,a=this.kept.unsent.filter(i);this.kept={whose:null,install:this.installation.id,resetAt:Date.parse(t),choices:n,unsent:this.kept.unsent.filter(o=>!i(o)),...this.kept.void?{void:this.kept.void}:{},...this.kept.unvoid?{unvoid:this.kept.unvoid}:{},done:C([...this.kept.done??[],...a.map(ne)]),...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},n=[t.on("broadcast",i=>{i.event==="changed"&&this.changed(s,Ie(i.payload))}),t.on("state_snapshot",i=>this.held(s,Ie(pt(i.entries)))),t.on("state_diff",i=>this.held(s,Ie(pt(i.set))))];s.off=()=>n.forEach(i=>i()),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(i=>i.key===e&&i.ads))return!1;let t=dt(this.kept,e);if(t?.state==="denied")return!1;let s=this.kept.gpc?.[x(this.kept)],n=s!==void 0&&(this.kept.whose!=null||s>=(this.kept.resetAt??0));return!(t?.state==="granted"&&t.source==="app"&&n&&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 n=this.chosenAt(),i=this.states();for(let a of s)this.queue({key:a.key,state:"denied",source:"gpc",chosen_at:n,user:t});this.kept={...this.kept,gpc:{...this.kept.gpc,[x(this.kept)]:Date.parse(n)}},this.commit(i),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 n=t.get(s);if(e.get(s)!==n)for(let i of[...this.listeners])try{i(s,n)}catch{}}}load(){let e;try{e=ut()?.getItem(this.storeKey)}catch{return"unreadable"}if(e==null)return"empty";try{let t=JSON.parse(e);if(is(t))return t}catch{}return"unreadable"}reload(){let e=this.load();if(typeof e!="object"){this.write();return}let t=this.states();this.kept=at(e,this.kept,"theirs",this.holder()),x(e)===x(this.kept)&<(this.kept)!==lt(e)&&this.write(),this.tell(t);let s=this.session.snapshot()?.userId??null;this.engaged&&this.kept.unsent.some(n=>n.user!==null&&n.user===s||n.user===null&&(n.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=at(t,this.kept,"ours",this.holder())),this.write(),this.tell(e)}write(){try{ut()?.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 ot(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 gt(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 ts(r,e,t,s){let n=e&&!s.has(A(r,e))?e:void 0,i=t&&!s.has(A(r,t))?t:void 0;if(!n||!i)return n??i;let a=Date.parse(n.chosen_at),o=Date.parse(i.chosen_at);return a!==o?a>o?n:i:te[n.state]!==te[i.state]?te[n.state]>te[i.state]?n:i:n.provisional?i:n}function ss(r,e){return!r||!e?r??e:e.w>r.w||e.w===r.w&&e.on?e:r}function at(r,e,t,s){let n=C([...r.void??[],...e.void??[]]),i=C([...r.unvoid??[],...e.unvoid??[]]),a=gt({void:n,unvoid:i}),o={},d,l={...r.gpc};for(let[y,b]of Object.entries(e.gpc??{}))l[y]=Math.max(l[y]??0,b);let c;if(x(r)===x(e)){d=e;for(let y of[...new Set([...Object.keys(r.choices),...Object.keys(e.choices)])].sort()){let b=ts(y,r.choices[y],e.choices[y],a);b&&(o[y]=b)}c=ss(r.unknown,e.unknown)}else{d=x(e)===s?e:x(r)===s?r:t==="ours"?e:r;for(let[y,b]of Object.entries(d.choices))a.has(A(y,b))||(o[y]=b);c=d.unknown}let g=C([...r.done??[],...e.done??[]]),p=mt([...r.unsent,...e.unsent]).filter(y=>!g.includes(ne(y))),k=t==="ours"?e:r,_=t==="ours"?r:e,h=k.region??_.region,f=k.keys??_.keys;return{whose:d.whose??null,...d.whose==null&&d.install!==void 0?{install:d.install}:{},...d.whose==null&&(r.resetAt!==void 0||e.resetAt!==void 0)&&x(r)===x(e)?{resetAt:Math.max(r.resetAt??0,e.resetAt??0)}:d.whose==null&&d.resetAt!==void 0?{resetAt:d.resetAt}:{},choices:o,unsent:p,...g.length>0?{done:g}:{},...n.length>0?{void:n}:{},...i.length>0?{unvoid:i}:{},...k.link!==void 0?{link:k.link}:{},...h?{region:h}:{},...Object.keys(l).length>0?{gpc:l}:{},...f?{keys:f}:{},...c?{unknown:c}:{}}}function ne(r){return`${r.user??`device:${r.device??""}`}|${r.key}|${r.state}|${r.source}|${r.chosen_at}`}function dt(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 C(r){return[...new Set(r)].slice(-es)}function lt(r){return JSON.stringify(r,(e,t)=>typeof t=="object"&&t!==null&&!Array.isArray(t)?Object.fromEntries(Object.entries(t).sort(([s],[n])=>s.localeCompare(n))):t)}function mt(r){let e=new Map;for(let t of r){let s=ne(t),n=e.get(s);e.set(s,n?n.alone||!t.alone?n:{...n,alone:!0}:t)}return[...e.values()].sort((t,s)=>Date.parse(t.chosen_at)-Date.parse(s.chosen_at))}var ns=new Set(["granted","denied","unset"]);function is(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,d)=>{if(typeof o!="object"||o===null)return!1;let l=o;return ns.has(l.state)&&typeof l.chosen_at=="string"&&(!d||typeof l.key=="string")},s=o=>o===void 0||typeof o=="object"&&o!==null&&typeof o.on=="boolean"&&typeof o.w=="number",n=r,i=o=>o===void 0||Array.isArray(o)&&o.every(d=>typeof d=="string"),a=n.whose===void 0||n.whose===null||typeof n.whose=="string";return Object.values(e.choices).every(o=>t(o,!1))&&e.unsent.every(o=>t(o,!0))&&(n.gpc===void 0||typeof n.gpc=="object"&&n.gpc!==null&&Object.values(n.gpc).every(o=>typeof o=="number"))&&s(n.unknown)&&i(n.done)&&i(n.void)&&i(n.unvoid)&&a}function ct(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 ht(r){return r instanceof S&&r.status>=400&&r.status<500&&r.status!==401&&r.status!==408&&r.status!==429}function ut(){try{return globalThis.localStorage}catch{return}}function pt(r){let e=typeof r=="object"&&r!==null?r.version:void 0;return typeof e=="object"&&e!==null?e.v:void 0}function Ie(r){let e=typeof r=="object"&&r!==null?r.version:void 0;return typeof e=="number"&&Number.isFinite(e)?e:void 0}var rs=`
|
|
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 He,g as We,h as Je}from"./S76H65KW.js";import{h as ze}from"./RUE6N2T
|
|
|
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
|
-
`,ie=class{api;session;constructor(e,t){this.api=j.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,n=s.defaultView,i=s.createElement("div");i.setAttribute("data-palbase-inbox","");let a=i.attachShadow({mode:"open"});Ge(s,a,rs);let o=s.createElement("ul");o.className="list",a.append(o),e.append(i);let d=()=>t.appearance??(n?.matchMedia?.("(prefers-color-scheme: dark)").matches?"dark":"light"),c=[],l=0,g=[],p=!1,k=u=>{l=u,t.onUnread?.(u)},_=(u,v)=>{u.read_at||(u.read_at=new Date().toISOString(),k(Math.max(0,l-1)),y(),this.markRead([u.id]).catch(()=>{})),!(!v||!Ve(v))&&(t.onOpen?t.onOpen(u,v):v.startsWith("https://")?n?.open(v,"_blank","noopener,noreferrer"):n?.location.assign(v))},h=async u=>{c=c.filter(v=>v.id!==u.id),u.read_at||k(Math.max(0,l-1)),y(),await this.remove(u.id).catch(()=>{})},f=u=>{try{return new Intl.DateTimeFormat(t.locale,{dateStyle:"medium",timeStyle:"short"}).format(new Date(u))}catch{return u}};function y(){if(g.forEach(u=>u.destroy()),g=[],o.replaceChildren(),o.className=`list ${d()}`,!c.length){let u=s.createElement("li");u.className="empty",u.textContent=t.labels?.empty??"No messages",o.append(u);return}for(let u of c)o.append(b(u))}let b=u=>{let v=s.createElement("li");v.setAttribute("data-id",u.id),v.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",w=>{w.stopPropagation(),h(u)}),u.card){v.className=`card ${u.read_at?"":"unread"}`;let w=s.createElement("div");v.append(w,m);let P={onAction:()=>_(u,void 0),onDeepLink:I=>_(u,I),onLink:I=>_(u,I),onCustom:t.onCustom};g.push(Fe(w,{definition:u.card,locale:t.locale??n?.navigator.language??"en",appearance:d(),variables:u.variables??{}},P)),v.addEventListener("click",I=>{I.composedPath().some(G=>G instanceof HTMLElement&&G.tagName==="BUTTON")||_(u,u.deep_link)})}else{v.className=`item ${u.read_at?"":"unread"}`;let w=s.createElement("span");if(w.className="dot",v.append(w),u.image?.startsWith("https://")){let I=s.createElement("img");I.src=u.image,I.alt="",v.append(I)}let P=s.createElement("div");P.className="text";for(let[I,G]of[["title",u.title],["body",u.body],["when",f(u.created_at)]]){if(!G)continue;let ke=s.createElement("span");ke.className=I,ke.textContent=G,P.append(ke)}v.append(P,m),v.addEventListener("click",()=>_(u,u.deep_link))}return v.addEventListener("keydown",w=>{w.key==="Enter"&&w.target===v&&_(u,u.deep_link)}),v},M=0,D=async()=>{let u=++M;if(!(await this.session.session())?.userId){if(p||u!==M)return;c=[],k(0),y();return}let v=await this.list({limit:t.limit??50,locale:t.locale});p||u!==M||(c=v.items,k(v.unread),y())},F=()=>{s.visibilityState==="visible"&&D().catch(()=>{})};s.addEventListener("visibilitychange",F);let be=this.session.onChange(()=>{D().catch(()=>{})});return y(),D().catch(()=>{}),{refresh:D,get items(){return c},get unread(){return l},destroy(){p=!0,s.removeEventListener("visibilitychange",F),be?.(),g.forEach(u=>u.destroy()),i.remove()}}}};var os=30*6e4,re="session_start";function oe(r){try{return r.localStorage}catch{return}}var as=()=>globalThis.crypto?.randomUUID?globalThis.crypto.randomUUID():`${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;function ds(r,e){for(let[t,s]of Object.entries(r??{})){let n=e?.[t];if(n==null||String(n)!==s)return!1}return!0}var ae=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,n,i,a,o,d=globalThis,c=Date.now){this.api=j.client({send:l=>e.send({...l,headers:{...l.headers,[R]:O(s)}})}),this.session=t,this.installation=s,this.requestPush=i,this.analyticsAllowed=a,this.purchases=o,this.g=d,this.now=c,this.sessionKey=`palbase.notify.inapp.session.${n}`,this.pendingKey=`palbase.notify.inapp.conversions.${n}`,t.onChange(l=>{l!=="SIGNED_IN"&&l!=="SIGNED_OUT"&&l!=="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,n=()=>{s?.visibilityState==="visible"?this.enqueue(re,void 0,!0):this.away=!0};s?.addEventListener("visibilitychange",n),this.stopWatching=()=>s?.removeEventListener("visibilitychange",n);let i=this.touch();this.loaded=this.load(),i&&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||!ds(s.trigger.where,t)||this.capped(s))&&await this.open(s))return}}capped(e){let t=this.now(),s=(o,d)=>o!==void 0&&d!==void 0&&t-Date.parse(o)<d*6e4,n=this.shown,i=e.shown,a=e.limits;return n.session>=this.limits.per_session||n.day>=this.limits.per_day||s(n.last_at,this.limits.min_minutes)||a.per_session!==void 0&&i.session>=a.per_session||a.per_day!==void 0&&i.day>=a.per_day||s(i.last_at,a.min_minutes)||a.max_total!==void 0&&i.total>=a.max_total}async open(e){let t=this.opts,s=this.person,n=await this.subject(),i,a;try{({id:i,variables:a}=(await this.api.showInAppMessage({body:{campaign_id:e.campaign_id,session_id:this.sessionId(),installation_id:this.installation.id}})).data)}catch(l){return l instanceof S&&l.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 l of[this.shown,e.shown])l.session++,l.day++,l.total++,l.last_at=o;e.conversion&&this.pend({impression:i,campaign:e.campaign_id,event:e.conversion.event,until:this.now()+e.conversion.hours*36e5,subject:n});let d=(l,g)=>{this.api.reportInAppEvent({path:{id:i},query:{installation_id:this.installation.id},body:{type:l,...g?{action:g}:{}}}).catch(()=>{})},c=Be({definition:e.definition,locale:t.locale??this.g.navigator?.language??"en",appearance:t.appearance??this.appearance(),variables:{...e.variables,...a}},{onAction:l=>{l.type!=="close"&&l.type!=="sheet"&&d("clicked",l.type)},onLink:t.onLink,onDeepLink:t.onDeepLink,onCustom:t.onCustom,onShowPaywall:t.onShowPaywall,onOffer:t.onOffer??(l=>this.takeOffer(l,t.onOfferError)),onRequestPush:t.onRequestPush??(()=>this.requestPush().then(()=>{})),labels:t.labels,onClose:l=>{this.showing?.message===c&&(this.showing=void 0),l!=="action"&&l!=="app"&&d("dismissed"),t.onClose?.(e.campaign_id,l)}},t.root?{root:t.root}:{});return this.showing={campaign:e.campaign_id,message:c},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 n=s?.web?.plans[0];if(!s?.product||n===void 0)throw new S({op:"TakeOffer",status:0,code:"offer_not_open",message:`the offer ${e} is not the customer's to take on the web now`});let i=this.g.location,a=await this.purchases.checkout({product:s.product,plan:n,successUrl:i.href,cancelUrl:i.href,offer:e});i.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),n=await this.subject(),i=this.analyticsAllowed()?s.filter(a=>a.event===e&&a.subject===n):[];this.keepPending(s.filter(a=>!i.includes(a))),await Promise.all(i.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>=os;return this.writeSession(s?{id:`ses_${as()}`,last:e}:{id:t.id,last:e}),s}sessionId(e=!0){return e&&this.touch(),(this.readSession()??this.memorySession).id}readSession(){try{let e=oe(this.g)?.getItem(this.sessionKey);if(e)return JSON.parse(e)}catch{}return this.memorySession}writeSession(e){this.memorySession=e;try{oe(this.g)?.setItem(this.sessionKey,JSON.stringify(e))}catch{}}pending(){try{let e=oe(this.g)?.getItem(this.pendingKey);if(e)return JSON.parse(e)}catch{}return this.memoryPending}keepPending(e){this.memoryPending=e;try{let t=oe(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 yt=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 n=0;n<t.length;n++)s[n]=t.charCodeAt(n);return s},Te=class{api;session;installation;baseUrl;publishableKey;g;registered;changing=Promise.resolve();constructor(e,t,s,n,i,a=globalThis){this.api=j.client(e),this.session=t,this.installation=s,this.baseUrl=n,this.publishableKey=i,this.g=a,t.onChange(o=>{(o==="SIGNED_IN"||o==="SIGNED_OUT"||o==="SESSION_EXPIRED")&&(this.registered=void 0,this.changing=this.refresh().catch(()=>this.unsubscribe().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,n=await s.register(this.workerUrl(e.serviceWorker),e.scope?{scope:e.scope}:void 0);await s.ready;let i=await n.pushManager.getSubscription(),a=(await this.api.getWebPushKey()).data.public_key;return i&&!cs(i.options.applicationServerKey,a)&&(await i.unsubscribe(),i=null),i??=await n.pushManager.subscribe({userVisibleOnly:!0,applicationServerKey:yt(a)}),await this.register(i),!0}async unsubscribe(){let e=await this.current();e&&await e.unsubscribe(),this.registered=void 0}async refresh(){if(!this.supported()||this.permission()!=="granted")return;let e=await this.current();e&&await this.register(e)}async current(){let e=this.g.navigator?.serviceWorker;return e?await(await e.getRegistration())?.pushManager.getSubscription()??null:null}async register(e){let t=e.toJSON(),s={endpoint:t.endpoint??e.endpoint,keys:{p256dh:t.keys?.p256dh??"",auth:t.keys?.auth??""}},i=`${this.session.snapshot()?.userId??""}|${s.endpoint}`;this.registered!==i&&(await this.api.registerDevice({headers:{[R]: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=i)}};function cs(r,e){if(!r)return!1;let t=new Uint8Array(r),s=yt(e);return t.length===s.length&&t.every((n,i)=>n===s[i])}var de=class{push;inbox;inApp;constructor(e,t,s,n,i,a,o){this.push=new Te(e,t,s,a,o),this.inbox=new ie(e,t),this.inApp=new ae(e,t,s,new URL(a).origin,()=>this.push.subscribe(),()=>n.state("analytics")==="granted",i)}};var ce=class{api;session;socket;ref;fetch;appVersion;app;listeners=new Set;watch;following;last;constructor(e,t,s,n,i,a,o){this.api=je.client(e),this.session=t,this.socket=s,this.ref=n,this.fetch=i,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 ze(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&&hs(this.keyName(s.session_id),s.redemption_key),s.url}async redemptionLink(e,t={}){let s=t.key??us(this.keyName(e));if(!s)throw new S({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 n=Date.now()+(t.waitSeconds??20)*1e3;for(;;)try{return(await this.api.createCheckoutRedemption({body:{session_id:e,key:s},signal:t.signal})).data}catch(i){let a=(i instanceof S&&i.code==="checkout_not_paid"?i.retryAfter??2:-1)*1e3;if(a<0||Date.now()+a>n)throw i;await ps(a,t.signal)}}async redeem(e){let t=ls(e);if(!t)throw new S({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,n=(await this.api.redeemPurchase({body:{token:t}})).data;return this.watch&&this.watch.userId===s&&this.offer(this.watch,n),n}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)&&vt(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},n=[t.on("broadcast",i=>{i.event==="changed"&&this.changed(s,Ee(i.payload))}),t.on("state_snapshot",i=>this.held(s,Ee(wt(i.entries)))),t.on("state_diff",i=>this.held(s,Ee(wt(i.set))))];s.off=()=>n.forEach(i=>i()),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])vt(t,e)}}};function vt(r,e){try{r(e)}catch{}}function wt(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 bt=/^[A-Za-z0-9_-]{43}$/;function ls(r){let e=r.trim();if(bt.test(e))return e;let t;try{t=new URL(e)}catch{return}let s=t.host==="palbase"&&t.pathname==="/redeem",n=(t.protocol==="https:"||t.protocol==="http:")&&t.pathname==="/purchases/redeem",i=t.searchParams.get("token");return(s||n)&&i!==null&&bt.test(i)?i:void 0}function hs(r,e){try{globalThis.sessionStorage?.setItem(r,e)}catch{}}function us(r){try{return globalThis.sessionStorage?.getItem(r)??void 0}catch{return}}function ps(r,e){return new Promise((t,s)=>{if(e?.aborted)return s(e.reason);let n=setTimeout(()=>{e?.removeEventListener("abort",i),t()},r),i=()=>{clearTimeout(n),s(e?.reason)};e?.addEventListener("abort",i,{once:!0})})}var le=class{api;session;socket;installation;ref;analytics;appVersion;storageKey;held;listeners=new Set;started;leave=[];running;queued;fresh=!0;constructor(e,t,s,n,i,a,o,d){this.api=Ke.client(e),this.session=t,this.socket=s,this.installation=n,this.ref=i,this.analytics=o,this.appVersion=d,this.storageKey=`palbase.flags.${a}`,this.held=fs(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,kt(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 n=this.socket.channel(s),i=[n.on("broadcast",a=>{a.event==="changed"&&this.changed(Me(a.payload))}),n.on("state_snapshot",a=>this.changed(Me(St(a.entries)))),n.on("state_diff",a=>this.changed(Me(St(a.set))))];n.join().catch(()=>{}),this.leave.push(()=>{i.forEach(a=>a()),n.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 c=await this.api.getDelta({query:{since:Number(t.syncVersion)},headers:s});if(c.status===304)return;let l={...t,values:{...t.values},sources:{...t.sources},experiments:{...t.experiments},syncVersion:c.data.sync_version,etag:c.headers.get("etag")??t.etag},g=new Set;for(let p of c.data.ops)g.add(p.key),p.op==="delete"?(delete l.values[p.key],delete l.sources[p.key],delete l.experiments[p.key]):(l.values[p.key]=p.value??null,l.sources[p.key]=p.source,p.experiment?l.experiments[p.key]=p.experiment:delete l.experiments[p.key]);this.apply(l,[...g]);return}catch(c){if(!(c instanceof S&&c.status===410))throw c}let n=await this.api.getSnapshot({headers:s});if(this.fresh=!1,n.status===304)return;let i=n.data,a={user:e,values:i.values,sources:i.sources,experiments:i.experiments??{},syncVersion:i.sync_version,contextHash:i.context_hash,etag:n.headers.get("etag")??void 0},o=t?.values??{},d=[...new Set([...Object.keys(o),...Object.keys(a.values)])].filter(c=>JSON.stringify(o[c])!==JSON.stringify(a.values[c]));this.apply(a,d)}headers(e,t){return{"X-Platform":"web",...this.appVersion?{"X-Palbase-Client-Version":this.appVersion}:{},[Y]:this.installation.id,...e===null?{[R]: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,kt(this.storageKey,e),t.length>0&&this.tell(t))}tell(e){for(let t of[...this.listeners])try{t(e)}catch{}}};function Re(){try{return globalThis.localStorage}catch{return}}function fs(r){try{let e=Re()?.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 kt(r,e){try{e?Re()?.setItem(r,JSON.stringify(e)):Re()?.removeItem(r)}catch{}}function St(r){let e=typeof r=="object"&&r!==null?r.sync_version:void 0;return typeof e=="object"&&e!==null?e.v:void 0}function Me(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 n={clientMessageId:t.client_message_id,conversationId:e,request:t,state:"pending",attempts:0,error:null,createdAt:s};return this.items.set(n.clientMessageId,n),n}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 i of this.all())i.state!=="failed"&&s.set(i.conversationId,[...s.get(i.conversationId)??[],i]);let n=!1;return await Promise.all([...s.values()].map(async i=>{for(let a of i){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"),n=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)}})),n}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 Oe(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 _t(){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=_t();for(let s of e.removed_conversations??[])this.removed(s,t);for(let s of e.conversations??[])this.putConversation(s,t);for(let s of e.members??[])this.putMember(s,t);for(let s of e.messages??[])this.putMessage(s,t);for(let s of e.hidden??[])this.messages.get(s.conversation_id)?.delete(s.message_id)&&t.conversations.add(s.conversation_id),this.threads.delete(s.message_id)&&t.threads.add(s.message_id);for(let s of e.threads??[])this.putThread(s,t);for(let s of e.scheduled??[])this.putScheduled(s,t);return t}reset(e){this.conversations.clear(),this.members.clear(),this.messages.clear(),this.threads.clear(),this.scheduled.clear();let t=this.apply(e);return t.list=!0,t.scheduled=!0,t}removed(e,t){if(e.reportable_until){let s=e.conversation_id,n=this.conversations.get(s)?.title??this.deleted.get(s)?.title??null;this.deleted.set(s,{id:s,title:n,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,n]of this.threads)n.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 n=s?.me&&e.me&&e.me.read_seq<s.me.read_seq?this.readTo(e,e.me,s.me.read_seq):e.me,i=s&&!gs(n,s.me)?s.me:n,a={...e,me:i};if(s){if(e.version<s.version){if(i===s.me)return;a={...s,me:i}}else if(e.version===s.version&&vs(xt(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,xt(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 n=s.get(e.user_id),i=e;if(n){if(e.version<n.version)return;if(e.version===n.version){let a=ms(n.read_seq,e.read_seq);if(a===n.read_seq&&e.delivered_seq<=n.delivered_seq)return;i={...n,read_seq:a,delivered_seq:Math.max(n.delivered_seq,e.delivered_seq)}}}s.set(e.user_id,i),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 n=s.get(e.id);n&&e.version<=n.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||n?.reply_count)&&t.threads.add(e.id),t.list=!0)}putThread(e,t){let s=this.threads.get(e.thread_id),n=s&&e.read_seq<s.read_seq?this.threadReadTo(e,s.read_seq):e;s&&n.version<=s.version&&n.unread_count===s.unread_count||(this.threads.set(e.thread_id,n),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 n=_t(),i=this.conversations.get(e),a=i?Math.min(t,i.me?.left_seq??i.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)),n.threads.add(s)),n}return!i?.me||a<=i.me.read_seq||(this.conversations.set(e,{...i,me:this.readTo(i,i.me,a)}),n.list=!0,n.conversations.add(e)),n}readTo(e,t,s){let n=t.left_seq??e.last_seq;if(s>=n)return{...t,read_seq:s,unread_count:0};let i=Math.max(t.read_seq,t.cleared_seq,t.joined_seq),a=this.timeline(e.id).filter(o=>o.seq>i&&o.seq<=s&&o.sender_id!==this.reader&&o.kind!=="system"&&!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(n=>n.seq>e.read_seq&&n.seq<=t&&n.sender_id!==this.reader&&!n.deleted).length;return{...e,read_seq:t,unread_count:Math.max(0,e.unread_count-s)}}expire(e,t){return this.messages.get(e)?.delete(t)??!1}list(){return[...this.conversations.values()].sort(ys)}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,n)=>s.seq-n.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 gs(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 ms(r,e){return r===null?e:e===null?r:Math.max(r,e)}function ys(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 xt(r){let{members:e,gap:t,...s}=r;return s}function vs(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 n=t??(s?Math.max(0,...this.store.answers(e,s).map(i=>i.seq)):this.store.conversations.get(e)?.last_seq??0);return{upTo:n,touched:this.store.read(e,n,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(n=>n.sender_id===this.me&&n.client_message_id).map(n=>n.client_message_id));return[...e.map(n=>({kind:"message",message:n})),...t.filter(n=>!s.has(n.clientMessageId)&&!n.request.send_at).map(n=>({kind:"pending",item:n}))]}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 ws(r){let e="";for(let t of r)e+=String.fromCharCode(t);return btoa(e).replaceAll("+","-").replaceAll("/","_").replace(/=+$/,"")}function bs(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 Pt(r){let e=crypto.getRandomValues(new Uint8Array(32)),t=crypto.getRandomValues(new Uint8Array(12));return{sealed:await ks(r,e,t),fileKey:ws(e)}}async function ks(r,e,t){let s=await fe().importKey("raw",e,"AES-GCM",!1,["encrypt"]),n=new Uint8Array(await fe().encrypt({name:"AES-GCM",iv:t},s,r)),i=new Uint8Array(1+t.length+n.length);return i[0]=1,i.set(t,1),i.set(n,1+t.length),i}async function It(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",bs(e),"AES-GCM",!1,["decrypt"]);return new Uint8Array(await fe().decrypt({name:"AES-GCM",iv:r.subarray(1,13)},t,r.subarray(13)))}function V(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:Ss(t.store),outbox:t.outbox}))}async drop(e){await this.kv.delete(e)}async dropOthers(e,t){let s=V(e,""),n=V(e,t);for(let i of await this.kv.list())i.startsWith(s)&&i!==n&&await this.kv.delete(i)}};function Ss(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((n,i)=>i.seq-n.seq).slice(0,200));return{...r,messages:t}}function Tt(){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 _s=500,xs=300,Ps=2e3,Et=6e3,Is=3e4,Mt=[1e3,2e3,5e3,1e4,3e4];function Ts(r="palbase.messaging"){let e=globalThis.indexedDB;if(!e)return null;let t=null,s=()=>t??=new Promise((i,a)=>{let o=e.open(r,1);o.onupgradeneeded=()=>o.result.createObjectStore("kv"),o.onsuccess=()=>i(o.result),o.onerror=()=>a(o.error)}),n=(i,a)=>s().then(o=>new Promise((d,c)=>{let l=a(o.transaction("kv",i).objectStore("kv"));l.onsuccess=()=>d(l.result),l.onerror=()=>c(l.error)}));return{get:async i=>await n("readonly",a=>a.get(i))??null,set:async(i,a)=>{await n("readwrite",o=>o.put(a,i))},delete:async i=>{await n("readwrite",a=>a.delete(i))},list:async()=>(await n("readonly",i=>i.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;session;socket;ref;fetchFn;opts;constructor(e,t,s,n,i,a,o={}){this.transportFor=t,this.session=s,this.socket=n,this.ref=i,this.fetchFn=a,this.opts=o,this.api=Se.client(e),this.local=new ge(o.storage??Ts()??Tt()),s.onChange((c,l)=>{c==="SIGNED_OUT"||c==="SESSION_EXPIRED"?this.end():c==="SIGNED_IN"&&l?.userId!==this.user?this.end().then(async()=>{if(this.heard.size!==0){await this.ready();for(let g of[...this.reopeners])g()}}):c==="SIGNED_IN"&&this.engine&&this.user&&(this.unfollow(),this.follow(this.user),this.sync())});let d=globalThis;d.addEventListener?.("online",()=>this.wake()),d.document?.addEventListener?.("visibilitychange",()=>{d.document?.visibilityState==="visible"&&this.wake()})}async ready(){let e=this.session.snapshot()??await this.session.session();if(!e)throw new S({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,Se.client(this.transportFor(t)));let n=await this.local.open(V(this.ref,t));if(this.user!==t)throw new Error("messaging: the session changed while it started");n&&s.load(n),this.engine=s;for(let i of s.store.messages.values())for(let a of i.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);if(this.expiring.clear(),this.typingBy.clear(),this.delivered.clear(),this.loaded.clear(),this.earlier.clear(),this.engine=null,this.starting=null,this.user=null,this.synced=!1,e){let s=V(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),n=t.reset?[...this.loaded]:t.conversations.filter(i=>i.gap&&this.loaded.has(i.id)).map(i=>i.id);t.reset&&this.loaded.clear();for(let i of n)this.loaded.delete(i),this.earlier.delete(i);e.store.cursor=t.cursor,this.after(t,s);for(let i of n)this.openPage(i).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(n=>n.version===1&&n.sender_id!==t.me&&!n.deleted&&n.kind!=="system"&&!t.store.messages.get(n.conversation_id)?.has(n.id));this.changed(e,t);for(let n of s)for(let i of[...this.incoming])i(n)}changed(e,t=this.engine){if(!t||t!==this.engine)return;let s=t.apply(e);this.after(e,s),this.tell(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()},_s)),(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 n=Date.parse(e.expires_at)-Date.now(),i=()=>{this.expiring.delete(t),this.engine?.store.expire(e.conversation_id,e.id)&&(this.tell({list:!0,conversations:new Set([e.conversation_id]),threads:new Set(e.thread_id?[e.thread_id]:[]),scheduled:!1}),this.save())};n<=0?i():this.expiring.set(t,setTimeout(i,Math.min(n,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(V(this.ref,t),e.kept())).catch(()=>{}))},xs)}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(n=>this.post(s,n),(n,i)=>{let a=t.sent(i)??{list:!1,conversations:new Set([n.conversationId]),threads:new Set,scheduled:!1};a.conversations.add(n.conversationId),i.kind==="sent"&&this.after({messages:[i.message]},a),this.save(),this.tell(a)}),this.engine!==t)return}while(this.reflush&&!e);if(e){let t=Mt[Math.min(this.retries++,Mt.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 Oe(s.status,s.data)}catch(s){return s instanceof S?s.isNetworkError?{kind:"wait"}:Oe(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,Is)};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()+Et),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}),Et+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,n])=>n>t&&s!==this.user).map(([s])=>s)}isSynced(){return this.synced}conversations(){return new Ae(this)}deletedGroups(){return new Ce(this)}conversation(e){return new Ne(this,e)}async direct(e){let{e:t,as:s}=await this.seat(),n=(await s.openDirectConversation({body:{user_id:e}})).data;return this.changed({conversations:[n]},t),this.conversation(n.id)}async group(e){let{e:t,as:s}=await this.seat(),n=(await s.createGroup({body:{title:e.title,member_ids:e.memberIds,description:e.description,photo:e.photo,settings:e.settings}})).data;return this.changed({conversations:[n.conversation]},t),{conversation:this.conversation(n.conversation.id),notAdded:n.not_added}}thread(e,t){return new De(this,e,t)}scheduled(){return new Ue(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(),n=typeof t=="string"?{text:t}:t,i=n.files?.length?await this.upload(e,n.files):void 0,a={client_message_id:crypto.randomUUID(),...n.text!==void 0?{text:n.text}:{},...n.mentions?{mentions:n.mentions}:{},...i?{attachments:i}:{},...n.replyTo?{reply_to_id:n.replyTo}:{},...n.threadId?{thread_id:n.threadId}:{},...n.alsoInConversation?{also_in_conversation:!0}:{},...n.expiresIn!==void 0?{expires_in:n.expiresIn,expires_from:n.expiresFrom??"send"}:{},...n.viewOnce?{view_once:{limit:n.viewOnce.limit,...n.viewOnce.seconds?{seconds:n.viewOnce.seconds}:{}}}:{},...n.sendAt?{send_at:n.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(n.threadId?[n.threadId]:[]),scheduled:!1}),this.save(),this.flush(),o}async upload(e,t){let{as:s}=await this.seat(),n=[];for(let i of t){let a=i.data instanceof Uint8Array?i.data:new Uint8Array(await i.data.arrayBuffer()),{sealed:o,fileKey:d}=await Pt(a),c=(await s.createUpload({path:{conversation_id:e},body:{size:o.length}})).data,l=await this.fetchFn(c.url,{method:"PUT",body:o,headers:{"content-type":"application/octet-stream"}});if(!l.ok)throw new S({op:"UploadFile",status:l.status,code:"upload_failed",message:`the file was not uploaded (${l.status})`});n.push({upload_id:c.id,content_type:i.contentType,file_key:d,...i.name?{name:i.name}:{},...i.width?{width:i.width}:{},...i.height?{height:i.height}:{},...i.durationMs?{duration_ms:i.durationMs}:{},...i.thumbnail?{thumbnail:i.thumbnail}:{}})}return n}async open(e,t){let{as:s}=await this.seat(),n=e.attachments.find(a=>a.id===t);if(!n?.file_key)throw new S({op:"OpenFile",status:404,code:"attachment_not_found",message:"no such file of the message, or one seen once"});let i=(await s.attachmentUrl({path:{conversation_id:e.conversation_id,message_id:e.id,attachment_id:n.id}})).data;return{id:n.id,name:n.name,contentType:n.content_type,bytes:await this.bytes(i.url,n.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 n=>({id:n.id,name:null,contentType:n.content_type,bytes:await this.bytes(n.url,n.file_key)})))}async bytes(e,t){let s=await this.fetchFn(e);if(!s.ok)throw new S({op:"OpenFile",status:s.status,code:"download_failed",message:`the file was not read (${s.status})`});return It(new Uint8Array(await s.arrayBuffer()),t)}async edit(e,t,s,n){let{e:i,as:a}=await this.seat(),o=(await a.editMessage({path:{conversation_id:e,message_id:t},body:{text:s,...n?{mentions:n}:{}}})).data;return this.changed({messages:[o]},i),o}async remove(e,t,s="everyone"){let{e:n,as:i}=await this.seat(),a=await i.deleteMessage({path:{conversation_id:e,message_id:t},query:{for:s}});a.status===200?this.changed({messages:[a.data]},n):this.changed({hidden:[{conversation_id:e,message_id:t}]},n)}async react(e,t,s,n={}){let{e:i,as:a}=await this.seat(),o=(await a.react({path:{conversation_id:e,message_id:t,emoji:s},body:n.replace?{replace:!0}:{}})).data;return this.changed({messages:[o]},i),o}async unreact(e,t,s){let{e:n,as:i}=await this.seat(),a=(await i.unreact({path:{conversation_id:e,message_id:t,emoji:s}})).data;return this.changed({messages:[a]},n),a}async markRead(e,t,s){let{e:n,as:i}=await this.seat(),{upTo:a,touched:o}=n.read(e,t,s);a<=0||((o.list||o.conversations.size>0||o.threads.size>0)&&(this.tell(o),this.save()),await i.receipts({body:{receipts:[{conversation_id:e,read_seq:a,...s?{thread_id:s}:{}}]}}))}async typing(e,t){let{as:s}=await this.seat(),n=this.typedAt.get(e)??0;Date.now()-n<Ps||(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:n}=await this.seat(),i=(await n.updateConversation({path:{conversation_id:e},body:t})).data;return this.changed({conversations:[i]},s),i}async close(e){let{e:t,as:s}=await this.seat();if(await s.closeConversation({path:{conversation_id:e}}),t!==this.engine)return;let n=t.store.conversations.get(e)?.me,i=t.store.timeline(e).filter(a=>a.vanish&&a.sender_id!==t.me&&n&&a.seq<=n.read_seq);for(let a of i)t.store.expire(e,a.id);i.length>0&&(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(),n=(await s.reportScreenshot({path:{conversation_id:e}})).data;return this.changed({messages:[n]},t),n}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:n}=await this.seat(),i=(await n.updateScheduled({path:{scheduled_id:e},body:t})).data;return this.changed({scheduled:[i]},s),i}async me(){let{as:e}=await this.seat();return(await e.getMyProfile()).data}async updateMe(e){let{as:t}=await this.seat(),s=(await t.updateMyProfile({body:e})).data;return e.read_receipts!==void 0&&this.sync(),s}async profiles(e){let{as:t}=await this.seat();return(await t.getProfiles({query:{user_ids:e.join(",")}})).data.data}async block(e){let{as:t}=await this.seat();await t.block({path:{user_id:e}})}async unblock(e){let{as:t}=await this.seat();await t.unblock({path:{user_id:e}})}async report(e){let{as:t}=await this.seat();return(await t.report({body:e})).data}async openPage(e){let{e:t}=await this.seat();this.loaded.has(e)||(this.loaded.add(e),t.store.timeline(e).length>0&&this.synced)||await this.page(e,null)}async page(e,t){let{e:s,as:n}=await this.seat(),i=(await n.listMessages({path:{conversation_id:e},query:t?{cursor:t,limit:50}:{limit:50}})).data;return s!==this.engine?!1:(this.earlier.set(e,i.next_cursor??null),this.changed({messages:i.data},s),!!i.next_cursor)}earlierOf(e){return this.earlier.get(e)}async openThread(e,t){let{e:s,as:n}=await this.seat(),i=(await n.getMessage({path:{conversation_id:e,message_id:t}})).data,a=(await n.listReplies({path:{conversation_id:e,message_id:t},query:{limit:100}})).data;this.changed({messages:[i,...a.data]},s)}async openScheduled(){let{e,as:t}=await this.seat();this.changed({scheduled:(await t.listScheduled()).data.data},e)}},L=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)}}opened(){}},Ae=class extends L{touches(e){return e.list||e.conversations.size>0}read(){let e=this.m.current()?.store.list()??[];return{items:e,unread:e.reduce((t,s)=>t+(s.me?.unread_count??0),0),synced:this.m.isSynced()}}},Ce=class extends L{touches(e){return e.list}read(){return{items:this.m.current()?.deletedGroups()??[]}}},Ne=class extends L{id;constructor(e,t){super(e),this.id=t}opened(){this.m.openPage(this.id).catch(()=>{})}touches(e){return e.conversations.has(this.id)}read(){let e=this.m.current();return{conversation:e?.store.conversations.get(this.id)??null,entries:e?.timeline(this.id)??[],members:e?.store.membersOf(this.id)??[],typing:this.m.typingIn(this.id),hasEarlier:this.m.earlierOf(this.id)!==null}}refresh(){return this.m.page(this.id,null)}async loadEarlier(){let e=this.m.earlierOf(this.id);return e===null?!1:this.m.page(this.id,e??null)}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)}},De=class extends L{conversationId;rootId;constructor(e,t,s){super(e),this.conversationId=t,this.rootId=s}opened(){this.m.openThread(this.conversationId,this.rootId).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}}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)}},Ue=class extends L{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 ye=class{api;open;session;credentials;mfa;passkey;magicLink;phone;password;email;sessions;constructor(e,t,s,n){this.api=K.client(e),this.open=K.client(t),this.session=s,this.credentials=n;let i=this.api,a=this.open;this.mfa={challenge:async(o,d,c)=>this.signedIn((await a.mfaChallenge({body:{mfa_token:o,type:d,code:c}})).data),recovery:async(o,d)=>this.signedIn((await a.mfaRecovery({body:{mfa_token:o,code:d}})).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 i.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 i.mfaVerifyEnrollment({body:{code:o}})},enrollSms:async o=>(await i.mfaSmsEnroll({body:{phone:o}})).data,verifySms:async o=>{await i.mfaSmsVerifyEnrollment({body:{code:o}})},enrollEmail:async()=>{await i.mfaEmailEnroll()},factors:async()=>(await i.mfaListFactors()).data,removeFactor:async(o,d)=>{await i.mfaRemoveFactor({path:{id:o},body:{current_password:d}})},regenerateRecoveryCodes:async()=>(await i.mfaRegenerateRecoveryCodes()).data,stepUp:async o=>this.steppedUp(async()=>(await i.stepUp({body:{method:"totp",code:o}})).data),sendStepUpSmsCode:async()=>{await i.stepUpSmsSend()},stepUpWithSms:async o=>this.steppedUp(async()=>(await i.stepUp({body:{method:"sms",code:o}})).data)},this.passkey={register:async o=>{let d=(await i.webauthnRegisterBegin({body:{name:o}})).data,c=await this.authenticator().create({publicKey:Rt(d.options.publicKey)});return(await i.webauthnRegisterFinish({body:Ot(c)})).data},signIn:async(o={})=>{let d=(await a.webauthnLoginBegin({body:o.userId?{user_id:o.userId}:{}})).data,c=await this.authenticator().get({publicKey:Le(d.options.publicKey)}),l=await a.webauthnLoginFinish({query:o.userId?{user_id:o.userId}:void 0,body:qe(c)});return this.signedIn(l.data)},signUp:async(o,d)=>{let c=(await a.webauthnSignupBegin({body:{identifier:o,user_name:d}})).data,l=await this.authenticator().create({publicKey:Rt(c.options.publicKey)});await a.webauthnSignupFinish({query:{user_id:c.user_id},body:Ot(l)});let g=(await a.webauthnLoginBegin({body:{user_id:c.user_id}})).data,p=await this.authenticator().get({publicKey:Le(g.options.publicKey)});return this.signedIn((await a.webauthnLoginFinish({query:{user_id:c.user_id},body:qe(p)})).data)},stepUp:async()=>this.steppedUp(async()=>{let o=(await i.stepUpWebAuthnBegin()).data,d=await this.authenticator().get({publicKey:Le(o.publicKey)});return(await i.stepUp({body:{method:"webauthn",...qe(d)}})).data}),list:async()=>(await i.webauthnListCredentials()).data,remove:async o=>{await i.webauthnDeleteCredential({path:{id:o}})}},this.magicLink={send:async(o,d={})=>{await a.magicLinkRequest({body:{email:o,...d.redirectTo?{redirect_to:d.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,d)=>this.signInResult((await a.verifyPhoneOtp({body:{phone:o,token:d}})).data)},this.password={requestReset:async(o,d={})=>{await a.passwordResetRequest({body:{email:o,...d.redirectTo?{redirect_to:d.redirectTo}:{}}})},confirmReset:async(o,d)=>{await a.passwordResetConfirm({body:{token:o,new_password:d}})},change:async o=>(await i.passwordChange({body:o})).data,set:async o=>(await i.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 i.listSessions()).data,revoke:async o=>{await i.revokeSession({path:{id:o}})},revokeAll:async()=>{await i.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}},ve=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(/=+$/,"")},At=r=>Array.isArray(r)?r.map(e=>({...e,id:ve(String(e.id))})):void 0;function Rt(r){let e=r.user;return{...r,challenge:ve(String(r.challenge)),user:{...e,id:ve(String(e.id))},excludeCredentials:At(r.excludeCredentials)}}function Le(r){return{...r,challenge:ve(String(r.challenge)),allowCredentials:At(r.allowCredentials)}}function Ot(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 qe(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 Es=/^pb_[a-z0-9]+_s/,Ms=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Rs=new Set(["invalid_token","token_expired","session_expired","session_revoked","missing_token"]),Os=new Set(["invalid_token","token_reuse","token_expired","session_revoked","session_expired","session_device_changed"]);function As(r){return r.status===400&&r.code==="invalid_request"}function zn(r){if(Es.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&&!Ms.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=Ct(r.language),s=(m,w)=>{let P=r.fetch??globalThis.fetch;if(t===void 0)return P(m,w);let I=new Headers(w?.headers);return I.has("accept-language")||I.set("accept-language",t),P(m,{...w,headers:I})},n=new URL(r.url).origin,i=r.storage??(Ns()?Ye(`palbase.session.${n}`):Xe()),a=r.retry??$e,o=H(q({baseUrl:r.url,credentials:{publishableKey:r.publishableKey},fetch:s}),a),d=K.client(o),c=new W(i,async m=>(await d.refreshToken({body:{refresh_token:m}})).data,m=>m instanceof S&&(m.status===401&&Os.has(m.code)||As(m)),{lockName:`palbase.session.refresh.${n}`,refresh:r.refresh}),l=q({baseUrl:r.url,credentials:{publishableKey:r.publishableKey,accessToken:()=>c.accessToken()},fetch:s,xmlHttpRequest:r.xmlHttpRequest??(r.fetch===void 0?globalThis.XMLHttpRequest:void 0)}),g=H(we(l,c),a),p=new z({baseUrl:r.url,publishableKey:r.publishableKey,accessToken:()=>c.accessToken(),webSocket:r.webSocket});c.onChange(m=>{m==="SIGNED_OUT"||m==="SESSION_EXPIRED"||m==="SIGNED_IN"?p.disconnect():m==="TOKEN_REFRESHED"&&p.tokenChanged()});let k=new X(n),_=m=>H(we(q({baseUrl:r.url,credentials:{publishableKey:r.publishableKey,accessToken:async()=>{let w=await c.accessToken();if(w===void 0||_e(w)!==m)throw new T(`the session is no longer ${m}'s`);return w}},fetch:s}),c),a),h=m=>K.client(_(m)),f=new se({userApi:h,deviceApi:d,session:c,socket:p,ref:e,installation:k,origin:n,options:r.consent}),y=q({baseUrl:r.url,credentials:{publishableKey:r.publishableKey},fetch:s}),b=new ee(we(l,c),y,c,f,k,n),M=new ce(g,c,p,e,s,r.appVersion,r.appId),D=new de(g,c,k,f,M,r.url,r.publishableKey);b.onEvent((m,w)=>D.inApp.trigger(m,w)),r.analytics&&b.start(r.analytics===!0?{}:r.analytics);let F=new Map,be=m=>{let w=new URL(m).origin,P=F.get(w);return P||(P=H(we(q({baseUrl:w,credentials:{accessToken:()=>c.accessToken()},fetch:s}),c),a),F.set(w,P)),P},u=He(g),v=Object.assign(Object.create(We),{auth:new ye(g,o,c,r.webauthn??globalThis.navigator?.credentials),socket:p,transport:g,analytics:b,consent:f,installation:k,purchases:M,notify:D,flags:new le(g,c,p,k,e,n,b,r.appVersion),messaging:new me(g,_,c,p,e,s,r.messaging),setLanguage(m){t=Ct(m??void 0)},chatToolCall:(m,w,P={})=>u.toolCall(m,w,P.signal),chatWorkspaceFile:(m,w,P,I={})=>u.workspaceFile(m,w,P,I.signal)});return Je(v,n,be,g,p,()=>c.snapshot()?.userId),v}var Cs=/^[A-Za-z]{1,8}(-[A-Za-z0-9]{1,8})*$/;function Ct(r){if(r===void 0)return;let e=typeof r=="string"?[r]:[...r];if(e.length!==0){for(let t of e)if(!Cs.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 Ns(){try{return typeof globalThis.localStorage<"u"}catch{return!1}}function we(r,e){return{async send(t){let s=await e.session();try{return await r.send(t)}catch(n){let i=t.auth.some(a=>a.includes("userJWT"));if(!(n instanceof S)||n.status!==401||!Rs.has(n.code)||!i||!s)throw n;try{e.snapshot()?.refreshToken===s.refreshToken&&await e.refresh()}catch{throw n}if(e.snapshot()?.userId!==s.userId)throw n;return r.send(t)}}}}export{T as a,Xe as b,Ye as c,xe as d,z as e,X as f,ee as g,se as h,ie as i,re as j,ae as k,Te as l,de as m,ce as n,ls as o,le as p,Ts as q,me as r,Ae as s,Ce as t,Ne as u,De as v,Ue as w,zn as x};
|
|
22
|
+
`,ie=class{api;session;constructor(e,t){this.api=j.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,n=s.defaultView,i=s.createElement("div");i.setAttribute("data-palbase-inbox","");let a=i.attachShadow({mode:"open"});Ge(s,a,rs);let o=s.createElement("ul");o.className="list",a.append(o),e.append(i);let d=()=>t.appearance??(n?.matchMedia?.("(prefers-color-scheme: dark)").matches?"dark":"light"),l=[],c=0,g=[],p=!1,k=u=>{c=u,t.onUnread?.(u)},_=(u,v)=>{u.read_at||(u.read_at=new Date().toISOString(),k(Math.max(0,c-1)),y(),this.markRead([u.id]).catch(()=>{})),!(!v||!Ve(v))&&(t.onOpen?t.onOpen(u,v):v.startsWith("https://")?n?.open(v,"_blank","noopener,noreferrer"):n?.location.assign(v))},h=async u=>{l=l.filter(v=>v.id!==u.id),u.read_at||k(Math.max(0,c-1)),y(),await this.remove(u.id).catch(()=>{})},f=u=>{try{return new Intl.DateTimeFormat(t.locale,{dateStyle:"medium",timeStyle:"short"}).format(new Date(u))}catch{return u}};function y(){if(g.forEach(u=>u.destroy()),g=[],o.replaceChildren(),o.className=`list ${d()}`,!l.length){let u=s.createElement("li");u.className="empty",u.textContent=t.labels?.empty??"No messages",o.append(u);return}for(let u of l)o.append(b(u))}let b=u=>{let v=s.createElement("li");v.setAttribute("data-id",u.id),v.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",w=>{w.stopPropagation(),h(u)}),u.card){v.className=`card ${u.read_at?"":"unread"}`;let w=s.createElement("div");v.append(w,m);let P={onAction:()=>_(u,void 0),onDeepLink:I=>_(u,I),onLink:I=>_(u,I),onCustom:t.onCustom};g.push(Fe(w,{definition:u.card,locale:t.locale??n?.navigator.language??"en",appearance:d(),variables:u.variables??{}},P)),v.addEventListener("click",I=>{I.composedPath().some(G=>G instanceof HTMLElement&&G.tagName==="BUTTON")||_(u,u.deep_link)})}else{v.className=`item ${u.read_at?"":"unread"}`;let w=s.createElement("span");if(w.className="dot",v.append(w),u.image?.startsWith("https://")){let I=s.createElement("img");I.src=u.image,I.alt="",v.append(I)}let P=s.createElement("div");P.className="text";for(let[I,G]of[["title",u.title],["body",u.body],["when",f(u.created_at)]]){if(!G)continue;let ke=s.createElement("span");ke.className=I,ke.textContent=G,P.append(ke)}v.append(P,m),v.addEventListener("click",()=>_(u,u.deep_link))}return v.addEventListener("keydown",w=>{w.key==="Enter"&&w.target===v&&_(u,u.deep_link)}),v},M=0,D=async()=>{let u=++M;if(!(await this.session.session())?.userId){if(p||u!==M)return;l=[],k(0),y();return}let v=await this.list({limit:t.limit??50,locale:t.locale});p||u!==M||(l=v.items,k(v.unread),y())},F=()=>{s.visibilityState==="visible"&&D().catch(()=>{})};s.addEventListener("visibilitychange",F);let be=this.session.onChange(()=>{D().catch(()=>{})});return y(),D().catch(()=>{}),{refresh:D,get items(){return l},get unread(){return c},destroy(){p=!0,s.removeEventListener("visibilitychange",F),be?.(),g.forEach(u=>u.destroy()),i.remove()}}}};var os=30*6e4,re="session_start";function oe(r){try{return r.localStorage}catch{return}}var as=()=>globalThis.crypto?.randomUUID?globalThis.crypto.randomUUID():`${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;function ds(r,e){for(let[t,s]of Object.entries(r??{})){let n=e?.[t];if(n==null||String(n)!==s)return!1}return!0}var ae=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,n,i,a,o,d=globalThis,l=Date.now){this.api=j.client({send:c=>e.send({...c,headers:{...c.headers,[R]:O(s)}})}),this.session=t,this.installation=s,this.requestPush=i,this.analyticsAllowed=a,this.purchases=o,this.g=d,this.now=l,this.sessionKey=`palbase.notify.inapp.session.${n}`,this.pendingKey=`palbase.notify.inapp.conversions.${n}`,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,n=()=>{s?.visibilityState==="visible"?this.enqueue(re,void 0,!0):this.away=!0};s?.addEventListener("visibilitychange",n),this.stopWatching=()=>s?.removeEventListener("visibilitychange",n);let i=this.touch();this.loaded=this.load(),i&&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||!ds(s.trigger.where,t)||this.capped(s))&&await this.open(s))return}}capped(e){let t=this.now(),s=(o,d)=>o!==void 0&&d!==void 0&&t-Date.parse(o)<d*6e4,n=this.shown,i=e.shown,a=e.limits;return n.session>=this.limits.per_session||n.day>=this.limits.per_day||s(n.last_at,this.limits.min_minutes)||a.per_session!==void 0&&i.session>=a.per_session||a.per_day!==void 0&&i.day>=a.per_day||s(i.last_at,a.min_minutes)||a.max_total!==void 0&&i.total>=a.max_total}async open(e){let t=this.opts,s=this.person,n=await this.subject(),i,a;try{({id:i,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 S&&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:i,campaign:e.campaign_id,event:e.conversion.event,until:this.now()+e.conversion.hours*36e5,subject:n});let d=(c,g)=>{this.api.reportInAppEvent({path:{id:i},query:{installation_id:this.installation.id},body:{type:c,...g?{action:g}:{}}}).catch(()=>{})},l=Be({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"&&d("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===l&&(this.showing=void 0),c!=="action"&&c!=="app"&&d("dismissed"),t.onClose?.(e.campaign_id,c)}},t.root?{root:t.root}:{});return this.showing={campaign:e.campaign_id,message:l},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 n=s?.web?.plans[0];if(!s?.product||n===void 0)throw new S({op:"TakeOffer",status:0,code:"offer_not_open",message:`the offer ${e} is not the customer's to take on the web now`});let i=this.g.location,a=await this.purchases.checkout({product:s.product,plan:n,successUrl:i.href,cancelUrl:i.href,offer:e});i.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),n=await this.subject(),i=this.analyticsAllowed()?s.filter(a=>a.event===e&&a.subject===n):[];this.keepPending(s.filter(a=>!i.includes(a))),await Promise.all(i.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>=os;return this.writeSession(s?{id:`ses_${as()}`,last:e}:{id:t.id,last:e}),s}sessionId(e=!0){return e&&this.touch(),(this.readSession()??this.memorySession).id}readSession(){try{let e=oe(this.g)?.getItem(this.sessionKey);if(e)return JSON.parse(e)}catch{}return this.memorySession}writeSession(e){this.memorySession=e;try{oe(this.g)?.setItem(this.sessionKey,JSON.stringify(e))}catch{}}pending(){try{let e=oe(this.g)?.getItem(this.pendingKey);if(e)return JSON.parse(e)}catch{}return this.memoryPending}keepPending(e){this.memoryPending=e;try{let t=oe(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 yt=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 n=0;n<t.length;n++)s[n]=t.charCodeAt(n);return s},Te=class{api;session;installation;baseUrl;publishableKey;g;registered;changing=Promise.resolve();constructor(e,t,s,n,i,a=globalThis){this.api=j.client(e),this.session=t,this.installation=s,this.baseUrl=n,this.publishableKey=i,this.g=a,t.onChange(o=>{(o==="SIGNED_IN"||o==="SIGNED_OUT"||o==="SESSION_EXPIRED")&&(this.registered=void 0,this.changing=this.refresh().catch(()=>this.unsubscribe().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,n=await s.register(this.workerUrl(e.serviceWorker),e.scope?{scope:e.scope}:void 0);await s.ready;let i=await n.pushManager.getSubscription(),a=(await this.api.getWebPushKey()).data.public_key;return i&&!ls(i.options.applicationServerKey,a)&&(await i.unsubscribe(),i=null),i??=await n.pushManager.subscribe({userVisibleOnly:!0,applicationServerKey:yt(a)}),await this.register(i),!0}async unsubscribe(){let e=await this.current();e&&await e.unsubscribe(),this.registered=void 0}async refresh(){if(!this.supported()||this.permission()!=="granted")return;let e=await this.current();e&&await this.register(e)}async current(){let e=this.g.navigator?.serviceWorker;return e?await(await e.getRegistration())?.pushManager.getSubscription()??null:null}async register(e){let t=e.toJSON(),s={endpoint:t.endpoint??e.endpoint,keys:{p256dh:t.keys?.p256dh??"",auth:t.keys?.auth??""}},i=`${this.session.snapshot()?.userId??""}|${s.endpoint}`;this.registered!==i&&(await this.api.registerDevice({headers:{[R]: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=i)}};function ls(r,e){if(!r)return!1;let t=new Uint8Array(r),s=yt(e);return t.length===s.length&&t.every((n,i)=>n===s[i])}var de=class{push;inbox;inApp;constructor(e,t,s,n,i,a,o){this.push=new Te(e,t,s,a,o),this.inbox=new ie(e,t),this.inApp=new ae(e,t,s,new URL(a).origin,()=>this.push.subscribe(),()=>n.state("analytics")==="granted",i)}};var le=class{api;session;socket;ref;fetch;appVersion;app;listeners=new Set;watch;following;last;constructor(e,t,s,n,i,a,o){this.api=je.client(e),this.session=t,this.socket=s,this.ref=n,this.fetch=i,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 ze(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&&hs(this.keyName(s.session_id),s.redemption_key),s.url}async redemptionLink(e,t={}){let s=t.key??us(this.keyName(e));if(!s)throw new S({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 n=Date.now()+(t.waitSeconds??20)*1e3;for(;;)try{return(await this.api.createCheckoutRedemption({body:{session_id:e,key:s},signal:t.signal})).data}catch(i){let a=(i instanceof S&&i.code==="checkout_not_paid"?i.retryAfter??2:-1)*1e3;if(a<0||Date.now()+a>n)throw i;await ps(a,t.signal)}}async redeem(e){let t=cs(e);if(!t)throw new S({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,n=(await this.api.redeemPurchase({body:{token:t}})).data;return this.watch&&this.watch.userId===s&&this.offer(this.watch,n),n}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)&&vt(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},n=[t.on("broadcast",i=>{i.event==="changed"&&this.changed(s,Ee(i.payload))}),t.on("state_snapshot",i=>this.held(s,Ee(wt(i.entries)))),t.on("state_diff",i=>this.held(s,Ee(wt(i.set))))];s.off=()=>n.forEach(i=>i()),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])vt(t,e)}}};function vt(r,e){try{r(e)}catch{}}function wt(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 bt=/^[A-Za-z0-9_-]{43}$/;function cs(r){let e=r.trim();if(bt.test(e))return e;let t;try{t=new URL(e)}catch{return}let s=t.host==="palbase"&&t.pathname==="/redeem",n=(t.protocol==="https:"||t.protocol==="http:")&&t.pathname==="/purchases/redeem",i=t.searchParams.get("token");return(s||n)&&i!==null&&bt.test(i)?i:void 0}function hs(r,e){try{globalThis.sessionStorage?.setItem(r,e)}catch{}}function us(r){try{return globalThis.sessionStorage?.getItem(r)??void 0}catch{return}}function ps(r,e){return new Promise((t,s)=>{if(e?.aborted)return s(e.reason);let n=setTimeout(()=>{e?.removeEventListener("abort",i),t()},r),i=()=>{clearTimeout(n),s(e?.reason)};e?.addEventListener("abort",i,{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,n,i,a,o,d){this.api=Ke.client(e),this.session=t,this.socket=s,this.installation=n,this.ref=i,this.analytics=o,this.appVersion=d,this.storageKey=`palbase.flags.${a}`,this.held=fs(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,kt(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 n=this.socket.channel(s),i=[n.on("broadcast",a=>{a.event==="changed"&&this.changed(Me(a.payload))}),n.on("state_snapshot",a=>this.changed(Me(St(a.entries)))),n.on("state_diff",a=>this.changed(Me(St(a.set))))];n.join().catch(()=>{}),this.leave.push(()=>{i.forEach(a=>a()),n.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 l=await this.api.getDelta({query:{since:Number(t.syncVersion)},headers:s});if(l.status===304)return;let c={...t,values:{...t.values},sources:{...t.sources},experiments:{...t.experiments},syncVersion:l.data.sync_version,etag:l.headers.get("etag")??t.etag},g=new Set;for(let p of l.data.ops)g.add(p.key),p.op==="delete"?(delete c.values[p.key],delete c.sources[p.key],delete c.experiments[p.key]):(c.values[p.key]=p.value??null,c.sources[p.key]=p.source,p.experiment?c.experiments[p.key]=p.experiment:delete c.experiments[p.key]);this.apply(c,[...g]);return}catch(l){if(!(l instanceof S&&l.status===410))throw l}let n=await this.api.getSnapshot({headers:s});if(this.fresh=!1,n.status===304)return;let i=n.data,a={user:e,values:i.values,sources:i.sources,experiments:i.experiments??{},syncVersion:i.sync_version,contextHash:i.context_hash,etag:n.headers.get("etag")??void 0},o=t?.values??{},d=[...new Set([...Object.keys(o),...Object.keys(a.values)])].filter(l=>JSON.stringify(o[l])!==JSON.stringify(a.values[l]));this.apply(a,d)}headers(e,t){return{"X-Platform":"web",...this.appVersion?{"X-Palbase-Client-Version":this.appVersion}:{},[Y]:this.installation.id,...e===null?{[R]: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,kt(this.storageKey,e),t.length>0&&this.tell(t))}tell(e){for(let t of[...this.listeners])try{t(e)}catch{}}};function Re(){try{return globalThis.localStorage}catch{return}}function fs(r){try{let e=Re()?.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 kt(r,e){try{e?Re()?.setItem(r,JSON.stringify(e)):Re()?.removeItem(r)}catch{}}function St(r){let e=typeof r=="object"&&r!==null?r.sync_version:void 0;return typeof e=="object"&&e!==null?e.v:void 0}function Me(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 n={clientMessageId:t.client_message_id,conversationId:e,request:t,state:"pending",attempts:0,error:null,createdAt:s};return this.items.set(n.clientMessageId,n),n}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 i of this.all())i.state!=="failed"&&s.set(i.conversationId,[...s.get(i.conversationId)??[],i]);let n=!1;return await Promise.all([...s.values()].map(async i=>{for(let a of i){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"),n=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)}})),n}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 Oe(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 _t(){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=_t();for(let s of e.removed_conversations??[])this.removed(s,t);for(let s of e.conversations??[])this.putConversation(s,t);for(let s of e.members??[])this.putMember(s,t);for(let s of e.messages??[])this.putMessage(s,t);for(let s of e.hidden??[])this.messages.get(s.conversation_id)?.delete(s.message_id)&&t.conversations.add(s.conversation_id),this.threads.delete(s.message_id)&&t.threads.add(s.message_id);for(let s of e.threads??[])this.putThread(s,t);for(let s of e.scheduled??[])this.putScheduled(s,t);return t}reset(e){this.conversations.clear(),this.members.clear(),this.messages.clear(),this.threads.clear(),this.scheduled.clear();let t=this.apply(e);return t.list=!0,t.scheduled=!0,t}removed(e,t){if(e.reportable_until){let s=e.conversation_id,n=this.conversations.get(s)?.title??this.deleted.get(s)?.title??null;this.deleted.set(s,{id:s,title:n,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,n]of this.threads)n.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 n=s?.me&&e.me&&e.me.read_seq<s.me.read_seq?this.readTo(e,e.me,s.me.read_seq):e.me,i=s&&!gs(n,s.me)?s.me:n,a={...e,me:i};if(s){if(e.version<s.version){if(i===s.me)return;a={...s,me:i}}else if(e.version===s.version&&vs(xt(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,xt(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 n=s.get(e.user_id),i=e;if(n){if(e.version<n.version)return;if(e.version===n.version){let a=ms(n.read_seq,e.read_seq);if(a===n.read_seq&&e.delivered_seq<=n.delivered_seq)return;i={...n,read_seq:a,delivered_seq:Math.max(n.delivered_seq,e.delivered_seq)}}}s.set(e.user_id,i),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 n=s.get(e.id);n&&e.version<=n.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||n?.reply_count)&&t.threads.add(e.id),t.list=!0)}putThread(e,t){let s=this.threads.get(e.thread_id),n=s&&e.read_seq<s.read_seq?this.threadReadTo(e,s.read_seq):e;s&&n.version<=s.version&&n.unread_count===s.unread_count||(this.threads.set(e.thread_id,n),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 n=_t(),i=this.conversations.get(e),a=i?Math.min(t,i.me?.left_seq??i.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)),n.threads.add(s)),n}return!i?.me||a<=i.me.read_seq||(this.conversations.set(e,{...i,me:this.readTo(i,i.me,a)}),n.list=!0,n.conversations.add(e)),n}readTo(e,t,s){let n=t.left_seq??e.last_seq;if(s>=n)return{...t,read_seq:s,unread_count:0};let i=Math.max(t.read_seq,t.cleared_seq,t.joined_seq),a=this.timeline(e.id).filter(o=>o.seq>i&&o.seq<=s&&o.sender_id!==this.reader&&o.kind!=="system"&&!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(n=>n.seq>e.read_seq&&n.seq<=t&&n.sender_id!==this.reader&&!n.deleted).length;return{...e,read_seq:t,unread_count:Math.max(0,e.unread_count-s)}}expire(e,t){return this.messages.get(e)?.delete(t)??!1}list(){return[...this.conversations.values()].sort(ys)}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,n)=>s.seq-n.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 gs(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 ms(r,e){return r===null?e:e===null?r:Math.max(r,e)}function ys(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 xt(r){let{members:e,gap:t,...s}=r;return s}function vs(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 n=t??(s?Math.max(0,...this.store.answers(e,s).map(i=>i.seq)):this.store.conversations.get(e)?.last_seq??0);return{upTo:n,touched:this.store.read(e,n,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(n=>n.sender_id===this.me&&n.client_message_id).map(n=>n.client_message_id));return[...e.map(n=>({kind:"message",message:n})),...t.filter(n=>!s.has(n.clientMessageId)&&!n.request.send_at).map(n=>({kind:"pending",item:n}))]}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 ws(r){let e="";for(let t of r)e+=String.fromCharCode(t);return btoa(e).replaceAll("+","-").replaceAll("/","_").replace(/=+$/,"")}function bs(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 Pt(r){let e=crypto.getRandomValues(new Uint8Array(32)),t=crypto.getRandomValues(new Uint8Array(12));return{sealed:await ks(r,e,t),fileKey:ws(e)}}async function ks(r,e,t){let s=await fe().importKey("raw",e,"AES-GCM",!1,["encrypt"]),n=new Uint8Array(await fe().encrypt({name:"AES-GCM",iv:t},s,r)),i=new Uint8Array(1+t.length+n.length);return i[0]=1,i.set(t,1),i.set(n,1+t.length),i}async function It(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",bs(e),"AES-GCM",!1,["decrypt"]);return new Uint8Array(await fe().decrypt({name:"AES-GCM",iv:r.subarray(1,13)},t,r.subarray(13)))}function V(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:Ss(t.store),outbox:t.outbox}))}async drop(e){await this.kv.delete(e)}async dropOthers(e,t){let s=V(e,""),n=V(e,t);for(let i of await this.kv.list())i.startsWith(s)&&i!==n&&await this.kv.delete(i)}};function Ss(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((n,i)=>i.seq-n.seq).slice(0,200));return{...r,messages:t}}function Tt(){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 _s=500,xs=300,Ps=2e3,Et=6e3,Is=3e4,Mt=[1e3,2e3,5e3,1e4,3e4];function Ts(r="palbase.messaging"){let e=globalThis.indexedDB;if(!e)return null;let t=null,s=()=>t??=new Promise((i,a)=>{let o=e.open(r,1);o.onupgradeneeded=()=>o.result.createObjectStore("kv"),o.onsuccess=()=>i(o.result),o.onerror=()=>a(o.error)}),n=(i,a)=>s().then(o=>new Promise((d,l)=>{let c=a(o.transaction("kv",i).objectStore("kv"));c.onsuccess=()=>d(c.result),c.onerror=()=>l(c.error)}));return{get:async i=>await n("readonly",a=>a.get(i))??null,set:async(i,a)=>{await n("readwrite",o=>o.put(a,i))},delete:async i=>{await n("readwrite",a=>a.delete(i))},list:async()=>(await n("readonly",i=>i.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;session;socket;ref;fetchFn;opts;constructor(e,t,s,n,i,a,o={}){this.transportFor=t,this.session=s,this.socket=n,this.ref=i,this.fetchFn=a,this.opts=o,this.api=Se.client(e),this.local=new ge(o.storage??Ts()??Tt()),s.onChange((l,c)=>{l==="SIGNED_OUT"||l==="SESSION_EXPIRED"?this.end():l==="SIGNED_IN"&&c?.userId!==this.user?this.end().then(async()=>{if(this.heard.size!==0){await this.ready();for(let g of[...this.reopeners])g()}}):l==="SIGNED_IN"&&this.engine&&this.user&&(this.unfollow(),this.follow(this.user),this.sync())});let d=globalThis;d.addEventListener?.("online",()=>this.wake()),d.document?.addEventListener?.("visibilitychange",()=>{d.document?.visibilityState==="visible"&&this.wake()})}async ready(){let e=this.session.snapshot()??await this.session.session();if(!e)throw new S({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,Se.client(this.transportFor(t)));let n=await this.local.open(V(this.ref,t));if(this.user!==t)throw new Error("messaging: the session changed while it started");n&&s.load(n),this.engine=s;for(let i of s.store.messages.values())for(let a of i.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);if(this.expiring.clear(),this.typingBy.clear(),this.delivered.clear(),this.loaded.clear(),this.earlier.clear(),this.engine=null,this.starting=null,this.user=null,this.synced=!1,e){let s=V(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),n=t.reset?[...this.loaded]:t.conversations.filter(i=>i.gap&&this.loaded.has(i.id)).map(i=>i.id);t.reset&&this.loaded.clear();for(let i of n)this.loaded.delete(i),this.earlier.delete(i);e.store.cursor=t.cursor,this.after(t,s);for(let i of n)this.openPage(i).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(n=>n.version===1&&n.sender_id!==t.me&&!n.deleted&&n.kind!=="system"&&!t.store.messages.get(n.conversation_id)?.has(n.id));this.changed(e,t);for(let n of s)for(let i of[...this.incoming])i(n)}changed(e,t=this.engine){if(!t||t!==this.engine)return;let s=t.apply(e);this.after(e,s),this.tell(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()},_s)),(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 n=Date.parse(e.expires_at)-Date.now(),i=()=>{this.expiring.delete(t),this.engine?.store.expire(e.conversation_id,e.id)&&(this.tell({list:!0,conversations:new Set([e.conversation_id]),threads:new Set(e.thread_id?[e.thread_id]:[]),scheduled:!1}),this.save())};n<=0?i():this.expiring.set(t,setTimeout(i,Math.min(n,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(V(this.ref,t),e.kept())).catch(()=>{}))},xs)}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(n=>this.post(s,n),(n,i)=>{let a=t.sent(i)??{list:!1,conversations:new Set([n.conversationId]),threads:new Set,scheduled:!1};a.conversations.add(n.conversationId),i.kind==="sent"&&this.after({messages:[i.message]},a),this.save(),this.tell(a)}),this.engine!==t)return}while(this.reflush&&!e);if(e){let t=Mt[Math.min(this.retries++,Mt.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 Oe(s.status,s.data)}catch(s){return s instanceof S?s.isNetworkError?{kind:"wait"}:Oe(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,Is)};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()+Et),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}),Et+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,n])=>n>t&&s!==this.user).map(([s])=>s)}isSynced(){return this.synced}conversations(){return new Ae(this)}deletedGroups(){return new Ce(this)}conversation(e){return new Ne(this,e)}async direct(e){let{e:t,as:s}=await this.seat(),n=(await s.openDirectConversation({body:{user_id:e}})).data;return this.changed({conversations:[n]},t),this.conversation(n.id)}async group(e){let{e:t,as:s}=await this.seat(),n=(await s.createGroup({body:{title:e.title,member_ids:e.memberIds,description:e.description,photo:e.photo,settings:e.settings}})).data;return this.changed({conversations:[n.conversation]},t),{conversation:this.conversation(n.conversation.id),notAdded:n.not_added}}thread(e,t){return new De(this,e,t)}scheduled(){return new Ue(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(),n=typeof t=="string"?{text:t}:t,i=n.files?.length?await this.upload(e,n.files):void 0,a={client_message_id:crypto.randomUUID(),...n.text!==void 0?{text:n.text}:{},...n.mentions?{mentions:n.mentions}:{},...i?{attachments:i}:{},...n.replyTo?{reply_to_id:n.replyTo}:{},...n.threadId?{thread_id:n.threadId}:{},...n.alsoInConversation?{also_in_conversation:!0}:{},...n.expiresIn!==void 0?{expires_in:n.expiresIn,expires_from:n.expiresFrom??"send"}:{},...n.viewOnce?{view_once:{limit:n.viewOnce.limit,...n.viewOnce.seconds?{seconds:n.viewOnce.seconds}:{}}}:{},...n.sendAt?{send_at:n.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(n.threadId?[n.threadId]:[]),scheduled:!1}),this.save(),this.flush(),o}async upload(e,t){let{as:s}=await this.seat(),n=[];for(let i of t){let a=i.data instanceof Uint8Array?i.data:new Uint8Array(await i.data.arrayBuffer()),{sealed:o,fileKey:d}=await Pt(a),l=(await s.createUpload({path:{conversation_id:e},body:{size:o.length}})).data,c=await this.fetchFn(l.url,{method:"PUT",body:o,headers:{"content-type":"application/octet-stream"}});if(!c.ok)throw new S({op:"UploadFile",status:c.status,code:"upload_failed",message:`the file was not uploaded (${c.status})`});n.push({upload_id:l.id,content_type:i.contentType,file_key:d,...i.name?{name:i.name}:{},...i.width?{width:i.width}:{},...i.height?{height:i.height}:{},...i.durationMs?{duration_ms:i.durationMs}:{},...i.thumbnail?{thumbnail:i.thumbnail}:{}})}return n}async open(e,t){let{as:s}=await this.seat(),n=e.attachments.find(a=>a.id===t);if(!n?.file_key)throw new S({op:"OpenFile",status:404,code:"attachment_not_found",message:"no such file of the message, or one seen once"});let i=(await s.attachmentUrl({path:{conversation_id:e.conversation_id,message_id:e.id,attachment_id:n.id}})).data;return{id:n.id,name:n.name,contentType:n.content_type,bytes:await this.bytes(i.url,n.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 n=>({id:n.id,name:null,contentType:n.content_type,bytes:await this.bytes(n.url,n.file_key)})))}async bytes(e,t){let s=await this.fetchFn(e);if(!s.ok)throw new S({op:"OpenFile",status:s.status,code:"download_failed",message:`the file was not read (${s.status})`});return It(new Uint8Array(await s.arrayBuffer()),t)}async edit(e,t,s,n){let{e:i,as:a}=await this.seat(),o=(await a.editMessage({path:{conversation_id:e,message_id:t},body:{text:s,...n?{mentions:n}:{}}})).data;return this.changed({messages:[o]},i),o}async remove(e,t,s="everyone"){let{e:n,as:i}=await this.seat(),a=await i.deleteMessage({path:{conversation_id:e,message_id:t},query:{for:s}});a.status===200?this.changed({messages:[a.data]},n):this.changed({hidden:[{conversation_id:e,message_id:t}]},n)}async react(e,t,s,n={}){let{e:i,as:a}=await this.seat(),o=(await a.react({path:{conversation_id:e,message_id:t,emoji:s},body:n.replace?{replace:!0}:{}})).data;return this.changed({messages:[o]},i),o}async unreact(e,t,s){let{e:n,as:i}=await this.seat(),a=(await i.unreact({path:{conversation_id:e,message_id:t,emoji:s}})).data;return this.changed({messages:[a]},n),a}async markRead(e,t,s){let{e:n,as:i}=await this.seat(),{upTo:a,touched:o}=n.read(e,t,s);a<=0||((o.list||o.conversations.size>0||o.threads.size>0)&&(this.tell(o),this.save()),await i.receipts({body:{receipts:[{conversation_id:e,read_seq:a,...s?{thread_id:s}:{}}]}}))}async typing(e,t){let{as:s}=await this.seat(),n=this.typedAt.get(e)??0;Date.now()-n<Ps||(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:n}=await this.seat(),i=(await n.updateConversation({path:{conversation_id:e},body:t})).data;return this.changed({conversations:[i]},s),i}async close(e){let{e:t,as:s}=await this.seat();if(await s.closeConversation({path:{conversation_id:e}}),t!==this.engine)return;let n=t.store.conversations.get(e)?.me,i=t.store.timeline(e).filter(a=>a.vanish&&a.sender_id!==t.me&&n&&a.seq<=n.read_seq);for(let a of i)t.store.expire(e,a.id);i.length>0&&(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(),n=(await s.reportScreenshot({path:{conversation_id:e}})).data;return this.changed({messages:[n]},t),n}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:n}=await this.seat(),i=(await n.updateScheduled({path:{scheduled_id:e},body:t})).data;return this.changed({scheduled:[i]},s),i}async me(){let{as:e}=await this.seat();return(await e.getMyProfile()).data}async updateMe(e){let{as:t}=await this.seat(),s=(await t.updateMyProfile({body:e})).data;return e.read_receipts!==void 0&&this.sync(),s}async profiles(e){let{as:t}=await this.seat();return(await t.getProfiles({query:{user_ids:e.join(",")}})).data.data}async block(e){let{as:t}=await this.seat();await t.block({path:{user_id:e}})}async unblock(e){let{as:t}=await this.seat();await t.unblock({path:{user_id:e}})}async report(e){let{as:t}=await this.seat();return(await t.report({body:e})).data}async openPage(e){let{e:t}=await this.seat();this.loaded.has(e)||(this.loaded.add(e),t.store.timeline(e).length>0&&this.synced)||await this.page(e,null)}async page(e,t){let{e:s,as:n}=await this.seat(),i=(await n.listMessages({path:{conversation_id:e},query:t?{cursor:t,limit:50}:{limit:50}})).data;return s!==this.engine?!1:(this.earlier.set(e,i.next_cursor??null),this.changed({messages:i.data},s),!!i.next_cursor)}earlierOf(e){return this.earlier.get(e)}async openThread(e,t){let{e:s,as:n}=await this.seat(),i=(await n.getMessage({path:{conversation_id:e,message_id:t}})).data,a=(await n.listReplies({path:{conversation_id:e,message_id:t},query:{limit:100}})).data;this.changed({messages:[i,...a.data]},s)}async openScheduled(){let{e,as:t}=await this.seat();this.changed({scheduled:(await t.listScheduled()).data.data},e)}},L=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)}}opened(){}},Ae=class extends L{touches(e){return e.list||e.conversations.size>0}read(){let e=this.m.current()?.store.list()??[];return{items:e,unread:e.reduce((t,s)=>t+(s.me?.unread_count??0),0),synced:this.m.isSynced()}}},Ce=class extends L{touches(e){return e.list}read(){return{items:this.m.current()?.deletedGroups()??[]}}},Ne=class extends L{id;constructor(e,t){super(e),this.id=t}opened(){this.m.openPage(this.id).catch(()=>{})}touches(e){return e.conversations.has(this.id)}read(){let e=this.m.current();return{conversation:e?.store.conversations.get(this.id)??null,entries:e?.timeline(this.id)??[],members:e?.store.membersOf(this.id)??[],typing:this.m.typingIn(this.id),hasEarlier:this.m.earlierOf(this.id)!==null}}refresh(){return this.m.page(this.id,null)}async loadEarlier(){let e=this.m.earlierOf(this.id);return e===null?!1:this.m.page(this.id,e??null)}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)}},De=class extends L{conversationId;rootId;constructor(e,t,s){super(e),this.conversationId=t,this.rootId=s}opened(){this.m.openThread(this.conversationId,this.rootId).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}}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)}},Ue=class extends L{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 ye=class{api;open;session;credentials;mfa;passkey;magicLink;phone;password;email;sessions;constructor(e,t,s,n){this.api=K.client(e),this.open=K.client(t),this.session=s,this.credentials=n;let i=this.api,a=this.open;this.mfa={challenge:async(o,d,l)=>this.signedIn((await a.mfaChallenge({body:{mfa_token:o,type:d,code:l}})).data),recovery:async(o,d)=>this.signedIn((await a.mfaRecovery({body:{mfa_token:o,code:d}})).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 i.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 i.mfaVerifyEnrollment({body:{code:o}})},enrollSms:async o=>(await i.mfaSmsEnroll({body:{phone:o}})).data,verifySms:async o=>{await i.mfaSmsVerifyEnrollment({body:{code:o}})},enrollEmail:async()=>{await i.mfaEmailEnroll()},factors:async()=>(await i.mfaListFactors()).data,removeFactor:async(o,d)=>{await i.mfaRemoveFactor({path:{id:o},body:{current_password:d}})},regenerateRecoveryCodes:async()=>(await i.mfaRegenerateRecoveryCodes()).data,stepUp:async o=>this.steppedUp(async()=>(await i.stepUp({body:{method:"totp",code:o}})).data),sendStepUpSmsCode:async()=>{await i.stepUpSmsSend()},stepUpWithSms:async o=>this.steppedUp(async()=>(await i.stepUp({body:{method:"sms",code:o}})).data)},this.passkey={register:async o=>{let d=(await i.webauthnRegisterBegin({body:{name:o}})).data,l=await this.authenticator().create({publicKey:Rt(d.options.publicKey)});return(await i.webauthnRegisterFinish({body:Ot(l)})).data},signIn:async(o={})=>{let d=(await a.webauthnLoginBegin({body:o.userId?{user_id:o.userId}:{}})).data,l=await this.authenticator().get({publicKey:Le(d.options.publicKey)}),c=await a.webauthnLoginFinish({query:o.userId?{user_id:o.userId}:void 0,body:qe(l)});return this.signedIn(c.data)},signUp:async(o,d)=>{let l=(await a.webauthnSignupBegin({body:{identifier:o,user_name:d}})).data,c=await this.authenticator().create({publicKey:Rt(l.options.publicKey)});await a.webauthnSignupFinish({query:{user_id:l.user_id},body:Ot(c)});let g=(await a.webauthnLoginBegin({body:{user_id:l.user_id}})).data,p=await this.authenticator().get({publicKey:Le(g.options.publicKey)});return this.signedIn((await a.webauthnLoginFinish({query:{user_id:l.user_id},body:qe(p)})).data)},stepUp:async()=>this.steppedUp(async()=>{let o=(await i.stepUpWebAuthnBegin()).data,d=await this.authenticator().get({publicKey:Le(o.publicKey)});return(await i.stepUp({body:{method:"webauthn",...qe(d)}})).data}),list:async()=>(await i.webauthnListCredentials()).data,remove:async o=>{await i.webauthnDeleteCredential({path:{id:o}})}},this.magicLink={send:async(o,d={})=>{await a.magicLinkRequest({body:{email:o,...d.redirectTo?{redirect_to:d.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,d)=>this.signInResult((await a.verifyPhoneOtp({body:{phone:o,token:d}})).data)},this.password={requestReset:async(o,d={})=>{await a.passwordResetRequest({body:{email:o,...d.redirectTo?{redirect_to:d.redirectTo}:{}}})},confirmReset:async(o,d)=>{await a.passwordResetConfirm({body:{token:o,new_password:d}})},change:async o=>(await i.passwordChange({body:o})).data,set:async o=>(await i.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 i.listSessions()).data,revoke:async o=>{await i.revokeSession({path:{id:o}})},revokeAll:async()=>{await i.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}},ve=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(/=+$/,"")},At=r=>Array.isArray(r)?r.map(e=>({...e,id:ve(String(e.id))})):void 0;function Rt(r){let e=r.user;return{...r,challenge:ve(String(r.challenge)),user:{...e,id:ve(String(e.id))},excludeCredentials:At(r.excludeCredentials)}}function Le(r){return{...r,challenge:ve(String(r.challenge)),allowCredentials:At(r.allowCredentials)}}function Ot(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 qe(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 Es=/^pb_[a-z0-9]+_s/,Ms=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,Rs=new Set(["invalid_token","token_expired","session_expired","session_revoked","missing_token"]),Os=new Set(["invalid_token","token_reuse","token_expired","session_revoked","session_expired","session_device_changed"]);function As(r){return r.status===400&&r.code==="invalid_request"}function Wn(r){if(Es.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&&!Ms.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=Ct(r.language),s=(m,w)=>{let P=r.fetch??globalThis.fetch;if(t===void 0)return P(m,w);let I=new Headers(w?.headers);return I.has("accept-language")||I.set("accept-language",t),P(m,{...w,headers:I})},n=new URL(r.url).origin,i=r.storage??(Ns()?Ye(`palbase.session.${n}`):Xe()),a=r.retry??$e,o=H(q({baseUrl:r.url,credentials:{publishableKey:r.publishableKey},fetch:s}),a),d=K.client(o),l=new J(i,async m=>(await d.refreshToken({body:{refresh_token:m}})).data,m=>m instanceof S&&(m.status===401&&Os.has(m.code)||As(m)),{lockName:`palbase.session.refresh.${n}`,refresh:r.refresh}),c=q({baseUrl:r.url,credentials:{publishableKey:r.publishableKey,accessToken:()=>l.accessToken()},fetch:s,xmlHttpRequest:r.xmlHttpRequest??(r.fetch===void 0?globalThis.XMLHttpRequest:void 0)}),g=H(we(c,l),a),p=new z({baseUrl:r.url,publishableKey:r.publishableKey,accessToken:()=>l.accessToken(),webSocket:r.webSocket});l.onChange(m=>{m==="SIGNED_OUT"||m==="SESSION_EXPIRED"||m==="SIGNED_IN"?p.disconnect():m==="TOKEN_REFRESHED"&&p.tokenChanged()});let k=new X(n),_=m=>H(we(q({baseUrl:r.url,credentials:{publishableKey:r.publishableKey,accessToken:async()=>{let w=await l.accessToken();if(w===void 0||_e(w)!==m)throw new T(`the session is no longer ${m}'s`);return w}},fetch:s}),l),a),h=m=>K.client(_(m)),f=new se({userApi:h,deviceApi:d,session:l,socket:p,ref:e,installation:k,origin:n,options:r.consent}),y=q({baseUrl:r.url,credentials:{publishableKey:r.publishableKey},fetch:s}),b=new ee(we(c,l),y,l,f,k,n),M=new le(g,l,p,e,s,r.appVersion,r.appId),D=new de(g,l,k,f,M,r.url,r.publishableKey);b.onEvent((m,w)=>D.inApp.trigger(m,w)),r.analytics&&b.start(r.analytics===!0?{}:r.analytics);let F=new Map,be=m=>{let w=new URL(m).origin,P=F.get(w);return P||(P=H(we(q({baseUrl:w,credentials:{accessToken:()=>l.accessToken()},fetch:s}),l),a),F.set(w,P)),P},u=He(g),v=Object.assign(Object.create(Je),{auth:new ye(g,o,l,r.webauthn??globalThis.navigator?.credentials),socket:p,transport:g,analytics:b,consent:f,installation:k,purchases:M,notify:D,flags:new ce(g,l,p,k,e,n,b,r.appVersion),messaging:new me(g,_,l,p,e,s,r.messaging),setLanguage(m){t=Ct(m??void 0)},chatToolCall:(m,w,P={})=>u.toolCall(m,w,P.signal),chatWorkspaceFile:(m,w,P,I={})=>u.workspaceFile(m,w,P,I.signal)});return We(v,n,be,g,p,()=>l.snapshot()?.userId),v}var Cs=/^[A-Za-z]{1,8}(-[A-Za-z0-9]{1,8})*$/;function Ct(r){if(r===void 0)return;let e=typeof r=="string"?[r]:[...r];if(e.length!==0){for(let t of e)if(!Cs.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 Ns(){try{return typeof globalThis.localStorage<"u"}catch{return!1}}function we(r,e){return{async send(t){let s=await e.session();try{return await r.send(t)}catch(n){let i=t.auth.some(a=>a.includes("userJWT"));if(!(n instanceof S)||n.status!==401||!Rs.has(n.code)||!i||!s)throw n;try{e.snapshot()?.refreshToken===s.refreshToken&&await e.refresh()}catch{throw n}if(e.snapshot()?.userId!==s.userId)throw n;return r.send(t)}}}}export{T as a,Xe as b,Ye as c,xe as d,z as e,X as f,ee as g,se as h,ie as i,re as j,ae as k,Te as l,de as m,le as n,cs as o,ce as p,Ts as q,me as r,Ae as s,Ce as t,Ne as u,De as v,Ue as w,Wn as x};
|