palbase 0.36.2 → 0.37.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ai/index.js +2 -2
- package/dist/backend/engine.js +2 -2
- package/dist/backend/env.js +1 -1
- package/dist/backend/index.js +3 -3
- package/dist/backend/stack.js +1 -1
- package/dist/backend/test.js +2 -2
- package/dist/chunks/{GQEM44S6.js → 22UYQWHM.js} +2 -2
- package/dist/chunks/{NK6MYB27.js → 2HWKGNH2.js} +2 -2
- package/dist/chunks/{B2C3K3ZP.js → 3NCYWZCH.js} +2 -2
- package/dist/chunks/{M7GMY3P4.js → 5IDPIZGR.js} +2 -2
- package/dist/chunks/{O4PTLVVD.js → BJB4ODEW.js} +1 -1
- package/dist/chunks/{V6AL7JIN.js → BWQXLDGG.js} +2 -2
- package/dist/chunks/{FGVH7QCU.js → EIGFU7MO.js} +1 -1
- package/dist/chunks/{KUKBGTRA.js → FVWB6QLP.js} +2 -2
- package/dist/chunks/{H3GAN4ZX.js → IVZQOIXW.js} +1 -1
- package/dist/chunks/{AYWMSBC6.js → JHRMDLGF.js} +2 -2
- package/dist/chunks/{Q4X2GXW7.js → KC64EJP4.js} +2 -2
- package/dist/chunks/{3JCCPH3E.js → ML2FPPCL.js} +2 -2
- package/dist/chunks/{AUTWQIDS.js → PBYDJFD3.js} +2 -2
- package/dist/chunks/PJP7TT3V.js +22 -0
- package/dist/chunks/{BWNG2MW7.js → RQBRUINN.js} +2 -2
- package/dist/chunks/{ES7NOB76.js → SNCOLU4O.js} +2 -2
- package/dist/chunks/{6LZITVTH.js → SRFAWNOD.js} +1 -1
- package/dist/chunks/{QGZMS57H.js → T64GKIOS.js} +2 -2
- package/dist/chunks/{SDVZP37N.js → TPHZCHLV.js} +2 -2
- package/dist/chunks/{K6WLL5W2.js → VK6ALHIT.js} +1 -1
- package/dist/chunks/{NWDUQQNM.js → WBBBK7KR.js} +2 -2
- package/dist/chunks/{FTXO54MI.js → YIHRINWP.js} +1 -1
- package/dist/chunks/{J3SQ5PAH.js → ZSJDQ34E.js} +1 -1
- package/dist/cli.js +130 -130
- package/dist/cloud/index.js +2 -2
- package/dist/refuse/ai.js +1 -1
- package/dist/refuse/backend.js +1 -1
- package/dist/refuse/cloud.js +1 -1
- package/dist/refuse/server.js +1 -1
- package/dist/server/index.js +2 -2
- package/dist/server/testing.js +2 -2
- package/dist/web/index.js +2 -2
- package/dist/web/message.js +2 -2
- package/dist/web/palbe.js +2 -2
- package/dist/web/paywall.js +2 -2
- package/dist/web/push-sw.js +1 -1
- package/dist/web/ssr.js +2 -2
- package/dist/web/vite.js +2 -2
- package/package.json +2 -2
- package/types/cloud/src/generated/project.d.ts +1 -1
- package/types/cloud/src/generated/studio.d.ts +8 -0
- package/types/internal/src/messaging/store.d.ts +11 -2
- package/types/internal/src/modules/machines.d.ts +64 -2
- package/types/internal/src/modules/messaging.d.ts +2 -2
- package/types/web/src/messaging.d.ts +1 -0
- package/dist/chunks/KGWQZNV2.js +0 -22
|
@@ -266,6 +266,8 @@ export type Machine = {
|
|
|
266
266
|
* Why the contract of the build the machine serves from was refused, in its app's words where it said.
|
|
267
267
|
*/
|
|
268
268
|
contract_error?: string;
|
|
269
|
+
environment?: EnvironmentRef;
|
|
270
|
+
moving_to?: EnvironmentRef;
|
|
269
271
|
};
|
|
270
272
|
/**
|
|
271
273
|
* A machine to open.
|
|
@@ -347,6 +349,10 @@ export type MachineCreate = {
|
|
|
347
349
|
* For a source read with tokens, the first build's commit (its full SHA): the branch's head (409 commit_not_head otherwise); the head when left out.
|
|
348
350
|
*/
|
|
349
351
|
commit?: string;
|
|
352
|
+
/**
|
|
353
|
+
* The ref of the project's environment the machine is bound to (environment_not_found for one the caller does not reach: an environment's own token or key makes what is bound to its environment alone). None: the environment called. Its name is the project's one: name_taken when another environment holds a machine of that name.
|
|
354
|
+
*/
|
|
355
|
+
environment?: string;
|
|
350
356
|
};
|
|
351
357
|
/**
|
|
352
358
|
* A page of a project's machines, by name.
|
|
@@ -569,6 +575,7 @@ export type Database = {
|
|
|
569
575
|
* How much its size lets it read from and write to its disk in a month: past it, it sleeps until the month ends, and a client is told so. Absent for a size with no such limit.
|
|
570
576
|
*/
|
|
571
577
|
traffic_limit_bytes?: number;
|
|
578
|
+
environment?: EnvironmentRef;
|
|
572
579
|
};
|
|
573
580
|
/**
|
|
574
581
|
* A page of a project's databases, by name.
|
|
@@ -600,6 +607,10 @@ export type DatabaseCreate = {
|
|
|
600
607
|
* How many days the database's backups are kept: it can be brought back to any moment of them. 1 to 35.
|
|
601
608
|
*/
|
|
602
609
|
backup_days?: number;
|
|
610
|
+
/**
|
|
611
|
+
* The ref of the project's environment the database is bound to (environment_not_found for one the caller does not reach: an environment's own token or key makes what is bound to its environment alone). None: the environment called. Its name is the project's one: name_taken when another environment holds a database of that name.
|
|
612
|
+
*/
|
|
613
|
+
environment?: string;
|
|
603
614
|
};
|
|
604
615
|
/**
|
|
605
616
|
* A change to a database; a field left out stays as it is.
|
|
@@ -852,6 +863,7 @@ export type MachineDatabase = {
|
|
|
852
863
|
* The machine's releases run their migrations against the database before they serve (a Palbase backend's); they are run as the database's owner. A database's migrations are one machine's: a second machine asking for them is refused (409 `database_migrated_elsewhere`).
|
|
853
864
|
*/
|
|
854
865
|
migrations?: boolean;
|
|
866
|
+
environment?: EnvironmentRef;
|
|
855
867
|
};
|
|
856
868
|
/**
|
|
857
869
|
* When to bring the database back to.
|
|
@@ -1507,6 +1519,7 @@ export type Site = {
|
|
|
1507
1519
|
* Whether a pull request from a fork — another repository, which anyone may open — is previewed too. Off by default: its build would run with the environment's build settings.
|
|
1508
1520
|
*/
|
|
1509
1521
|
preview_forks: boolean;
|
|
1522
|
+
environment?: EnvironmentRef;
|
|
1510
1523
|
};
|
|
1511
1524
|
/**
|
|
1512
1525
|
* The release a site serves; none before its first.
|
|
@@ -1553,6 +1566,10 @@ export type SiteCreate = {
|
|
|
1553
1566
|
* Whether a fork's pull requests are previewed (Site.preview_forks).
|
|
1554
1567
|
*/
|
|
1555
1568
|
preview_forks?: boolean;
|
|
1569
|
+
/**
|
|
1570
|
+
* The ref of the project's environment the site is bound to (environment_not_found for one the caller does not reach: an environment's own token or key makes what is bound to its environment alone). None: the environment called. Its name is the project's one: name_taken when another environment holds a site of that name.
|
|
1571
|
+
*/
|
|
1572
|
+
environment?: string;
|
|
1556
1573
|
};
|
|
1557
1574
|
/**
|
|
1558
1575
|
* What to change of a site; a field left out is unchanged.
|
|
@@ -1898,17 +1915,42 @@ export type PreviewDeploy = {
|
|
|
1898
1915
|
*/
|
|
1899
1916
|
git_access_token?: string;
|
|
1900
1917
|
};
|
|
1918
|
+
/**
|
|
1919
|
+
* An environment of the project, as a machine, a database or a site is bound to it: its ref — the one its address names — and its name. On a machine, a database or a site: the environment it is bound to — a machine takes that environment's settings, secrets and modules, a site is built with its settings and secrets, any machine of the project may be given a database whichever environment keeps it. On a machine's database: the environment that keeps it, when it is not the machine's; given in a change ({"ref": …}), the environment to find the database in — none finds it in the machine's own environment first, then in the project's others (ambiguous_database when two keep one of that name).
|
|
1920
|
+
*/
|
|
1921
|
+
export type EnvironmentRef = {
|
|
1922
|
+
/**
|
|
1923
|
+
* The environment's ref: where it answers (<ref>.<domain>), and what a machine's, a database's or a site's address ends with.
|
|
1924
|
+
*/
|
|
1925
|
+
ref: string;
|
|
1926
|
+
/**
|
|
1927
|
+
* The environment's name.
|
|
1928
|
+
*/
|
|
1929
|
+
name?: string;
|
|
1930
|
+
};
|
|
1931
|
+
/**
|
|
1932
|
+
* Binds a machine to another environment of its project.
|
|
1933
|
+
*/
|
|
1934
|
+
export type MachineMove = {
|
|
1935
|
+
/**
|
|
1936
|
+
* The ref of the environment of the project the machine moves to.
|
|
1937
|
+
*/
|
|
1938
|
+
environment: string;
|
|
1939
|
+
};
|
|
1901
1940
|
/** Palbase Machines */
|
|
1902
1941
|
export declare function client(t: Transport): {
|
|
1903
1942
|
/**
|
|
1904
1943
|
* List machines
|
|
1905
1944
|
*
|
|
1906
1945
|
* Lists the project's machines, by name.
|
|
1946
|
+
*
|
|
1947
|
+
* A project's machines, databases and sites are the project's, each bound to one of its environments: from any of its environments' addresses, one who reaches the project (a developer, an organization's token, an account token) lists every environment's, each naming its environment (environment). A name, in any request that names one (/machines/{name}/…), is found in the environment it is bound to and the request is answered there.
|
|
1907
1948
|
*/
|
|
1908
1949
|
listMachines(input?: {
|
|
1909
1950
|
query?: {
|
|
1910
1951
|
limit?: number; /** The next_cursor of the previous page. Opaque; omit it for the first page. */
|
|
1911
|
-
cursor?: string;
|
|
1952
|
+
cursor?: string; /** The ref of one of the project's environments: what is bound to it alone. None: every environment the caller reaches — every one of the project's for a developer, an organization's token or an account token; an environment's own token or key reaches its environment alone. */
|
|
1953
|
+
environment?: string;
|
|
1912
1954
|
}; /** Stops the call: the request in flight, a wait before a retry, a proof-of-work being solved. */
|
|
1913
1955
|
signal?: AbortSignal;
|
|
1914
1956
|
}): Promise<Reply<200, MachinePage>>;
|
|
@@ -2178,11 +2220,14 @@ export declare function client(t: Transport): {
|
|
|
2178
2220
|
* List the databases
|
|
2179
2221
|
*
|
|
2180
2222
|
* Lists the project's databases by name, deleted ones that may still be taken back among them.
|
|
2223
|
+
*
|
|
2224
|
+
* A project's machines, databases and sites are the project's, each bound to one of its environments: from any of its environments' addresses, one who reaches the project (a developer, an organization's token, an account token) lists every environment's, each naming its environment (environment). A name, in any request that names one (/databases/{name}/…), is found in the environment it is bound to and the request is answered there.
|
|
2181
2225
|
*/
|
|
2182
2226
|
listDatabases(input?: {
|
|
2183
2227
|
query?: {
|
|
2184
2228
|
limit?: number; /** The next_cursor of the previous page. Opaque; omit it for the first page. */
|
|
2185
|
-
cursor?: string;
|
|
2229
|
+
cursor?: string; /** The ref of one of the project's environments: what is bound to it alone. None: every environment the caller reaches — every one of the project's for a developer, an organization's token or an account token; an environment's own token or key reaches its environment alone. */
|
|
2230
|
+
environment?: string;
|
|
2186
2231
|
}; /** Stops the call: the request in flight, a wait before a retry, a proof-of-work being solved. */
|
|
2187
2232
|
signal?: AbortSignal;
|
|
2188
2233
|
}): Promise<Reply<200, DatabasePage>>;
|
|
@@ -2556,8 +2601,13 @@ export declare function client(t: Transport): {
|
|
|
2556
2601
|
* List sites
|
|
2557
2602
|
*
|
|
2558
2603
|
* Lists the project's sites, by name: a project has 10 at most.
|
|
2604
|
+
*
|
|
2605
|
+
* A project's machines, databases and sites are the project's, each bound to one of its environments: from any of its environments' addresses, one who reaches the project (a developer, an organization's token, an account token) lists every environment's, each naming its environment (environment). A name, in any request that names one (/sites/{name}/…), is found in the environment it is bound to and the request is answered there.
|
|
2559
2606
|
*/
|
|
2560
2607
|
listSites(input?: {
|
|
2608
|
+
query?: {
|
|
2609
|
+
environment?: string;
|
|
2610
|
+
}; /** Stops the call: the request in flight, a wait before a retry, a proof-of-work being solved. */
|
|
2561
2611
|
signal?: AbortSignal;
|
|
2562
2612
|
}): Promise<Reply<200, SiteList>>;
|
|
2563
2613
|
/**
|
|
@@ -2796,5 +2846,17 @@ export declare function client(t: Transport): {
|
|
|
2796
2846
|
}; /** Stops the call: the request in flight, a wait before a retry, a proof-of-work being solved. */
|
|
2797
2847
|
signal?: AbortSignal;
|
|
2798
2848
|
}): Promise<Reply<202, PreviewOpened>>;
|
|
2849
|
+
/**
|
|
2850
|
+
* Move a machine to another environment of its project
|
|
2851
|
+
*
|
|
2852
|
+
* Binds the machine to another environment of its project (the user's call of 2026-11-01): it takes that environment's settings, secrets and modules from its next start, and its address names it (<name>-<the environment's ref>). The operator moves it — out of the environment it leaves, into the new one at the version it serves — in its own pass: the machine says where it is moving (moving_to) until it has, a second or so. Its pull requests' previews are closed; a new push opens them in the new environment. The database it is given stays where it is kept, given across environments. Its name is the project's one (name_taken when the new environment holds a machine of that name); a machine with domains of its own does not move (machine_has_domains): they are removed first. It needs the admin role in both environments (environment_role_required); an environment's own token or key moves nothing out of it (environment_not_found).
|
|
2853
|
+
*/
|
|
2854
|
+
moveMachine(input: {
|
|
2855
|
+
path: {
|
|
2856
|
+
name: string;
|
|
2857
|
+
};
|
|
2858
|
+
body: MachineMove; /** Stops the call: the request in flight, a wait before a retry, a proof-of-work being solved. */
|
|
2859
|
+
signal?: AbortSignal;
|
|
2860
|
+
}): Promise<Reply<202, Machine>>;
|
|
2799
2861
|
};
|
|
2800
2862
|
export type Client = ReturnType<typeof client>;
|
|
@@ -2306,7 +2306,7 @@ export declare function client(t: Transport): {
|
|
|
2306
2306
|
/**
|
|
2307
2307
|
* The direct conversation with a person
|
|
2308
2308
|
*
|
|
2309
|
-
* The one conversation between the reader and another person
|
|
2309
|
+
* The one conversation between the reader and another person, with its two `members`: made the first time — when the project's hook lets them reach them — and the same one every time after (200). The other sees it once something is said in it.
|
|
2310
2310
|
*/
|
|
2311
2311
|
openDirectConversation(input: {
|
|
2312
2312
|
body: DirectRequest; /** Stops the call: the request in flight, a wait before a retry, a proof-of-work being solved. */
|
|
@@ -2781,7 +2781,7 @@ export declare function client(t: Transport): {
|
|
|
2781
2781
|
/**
|
|
2782
2782
|
* What changed for the reader
|
|
2783
2783
|
*
|
|
2784
|
-
* What changed for the signed-in person since `since` (the `cursor` the last sync handed out): their conversations with their own place in each
|
|
2784
|
+
* What changed for the signed-in person since `since` (the `cursor` the last sync handed out): their conversations with their own place in each, what they have not read and the last message each shows (`last_message`, as the list has it), the people of the small ones, the messages written, changed or removed, what they removed for themselves, the threads they follow, the messages they scheduled. Nothing is missed; a change may come twice — each says its `version`. With no `since`, or one older than 30 days, it is everything to start from (`reset`): the conversations without their messages, read a page at a time.
|
|
2785
2785
|
*/
|
|
2786
2786
|
sync(input?: {
|
|
2787
2787
|
query?: {
|
|
@@ -389,6 +389,7 @@ export declare class Messaging {
|
|
|
389
389
|
* reportableUntil, naming no message: the last 30 messages the person saw in it go with the report.
|
|
390
390
|
*/
|
|
391
391
|
report(input: api.ReportRequest): Promise<api.ReportCreated>;
|
|
392
|
+
private tellConversation;
|
|
392
393
|
/**
|
|
393
394
|
* A stretch that reaches the newest becomes the timeline's: both run to the newest, so together they are one —
|
|
394
395
|
* read back from the older of their ends.
|
package/dist/chunks/KGWQZNV2.js
DELETED
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
/*! palbase 0.36.2 — Palbase SDK License (see LICENSE) */
|
|
2
|
-
import{e as tt,g as st,h as it}from"./ES7NOB76.js";import{h as nt}from"./V6AL7JIN.js";import{a as et}from"./NWDUQQNM.js";import{r as Ye,t as Qe,u as Ze}from"./6LZITVTH.js";import{b as G,c as K,e as Be,f as Je,i as _e,j as $,k as ze}from"./M7GMY3P4.js";import{a as Xe,b as H}from"./AUTWQIDS.js";import{b as w,d as j}from"./Q4X2GXW7.js";function Qt(r){let e=r,t=e?.body,s=t&&typeof t=="object"?t.reason:void 0;return s==="user_deleted"?"userDeleted":s==="user_banned"?"userBanned":e?.code==="session_expired"||e?.code==="token_expired"?"expired":"revoked"}var T=class extends Error{code="session_changed";constructor(e){super(e),this.name="SessionChangedError"}};function rt(){let r=null;return{load:()=>r,save:e=>{r=e},clear:()=>{r=null},shared:!1}}function at(r){let e=null,t=!0,s=()=>{try{return globalThis.localStorage}catch{return}};return{shared:!0,load(){try{let i=s()?.getItem(r);return i==null?t?null:e:JSON.parse(i)}catch{return e}},save(i){e=i;try{let n=s();if(!n)throw new Error("no storage");n.setItem(r,JSON.stringify(i)),t=!0}catch{t=!1}},clear(){e=null,t=!0;try{s()?.removeItem(r)}catch{}},watch(i){let n=globalThis;if(typeof n.addEventListener!="function")return()=>{};let a=o=>{(o.key===r||o.key===null)&&i()};return n.addEventListener("storage",a),()=>n.removeEventListener?.("storage",a)}}}function Pe(r){try{let e=r.split(".")[1]??"",t=atob(e.replace(/-/g,"+").replace(/_/g,"/").padEnd(Math.ceil(e.length/4)*4,"=")),s=JSON.parse(t).sub;return typeof s=="string"?s:""}catch{return""}}var Zt=6e4,es=15e3;function ts(r,e,t){let s=r?globalThis.navigator?.locks:void 0;return s?s.request(e,t):t()}var B=class{current=null;loaded;inflight=null;endReason=null;listeners=new Set;store;refresher;isRejected;now;lockName;refreshTimeoutMs;mode;constructor(e,t,s,i={}){this.store=e,this.refresher=t,this.isRejected=s,this.now=i.now??Date.now,this.lockName=i.lockName??"palbase.session.refresh",this.refreshTimeoutMs=i.refreshTimeoutMs??es,this.mode=i.refresh??"behind",this.loaded=Promise.resolve(e.load()).then(n=>{this.current=n}),e.watch?.(()=>{this.reconcile()})}async session(){return await this.loaded,this.current}snapshot(){return this.current}onChange(e){return this.listeners.add(e),()=>this.listeners.delete(e)}async set(e,t,s){await this.loaded;let i=t==="TOKEN_REFRESHED"?this.current:null,n={accessToken:e.access_token,refreshToken:e.refresh_token,expiresAt:this.now()+e.expires_in*1e3,userId:s?.id??i?.userId??Pe(e.access_token),user:s??i?.user};return this.current=n,await this.store.save(n),this.emit(t,n),n}async setUser(e,t){await this.loaded,!(!this.current||!t||this.current.userId!==t.userId)&&(this.current={...this.current,user:e},await this.store.save(this.current),this.emit("USER_UPDATED",this.current))}async clear(e,t){await this.loaded;let s=this.current;this.current=null,this.inflight=null;let i=await this.store.load();(!i||!s||i.userId===s.userId)&&await this.store.clear(),s&&(e==="SESSION_EXPIRED"&&(this.endReason=t??"revoked"),this.emit(e,null))}async accessToken(){await this.loaded;let e=this.current;if(!e)return;let t=e.expiresAt-this.now();if(t>Zt)return e.accessToken;if(this.mode==="never")return t>0?e.accessToken:void 0;if(t>0&&this.mode==="behind")return this.refresh().catch(()=>{}),e.accessToken;if(t>0)try{return(await this.refresh()).accessToken}catch(s){if(this.current===e)return e.accessToken;throw s}return(await this.refresh()).accessToken}refresh(){if(this.mode==="never")return Promise.reject(new Error("this client does not renew its session (refresh: 'never'): where the session cannot be written back, the request's middleware renews it"));if(this.inflight)return this.inflight;let e=ts(this.store.shared===!0,this.lockName,async()=>{await this.loaded;let t=this.current;if(!t)throw new T("no session to refresh");let s=await this.adoptStored(t);if(s)return s;try{let i=await this.withTimeout(this.refresher(t.refreshToken));if(this.current?.refreshToken!==t.refreshToken)throw new T("the session changed while it was refreshed");return await this.set(i,"TOKEN_REFRESHED")}catch(i){throw this.isRejected(i)&&this.current?.refreshToken===t.refreshToken&&await this.clear("SESSION_EXPIRED",Qt(i)),i}});return this.inflight=e,e.finally(()=>{this.inflight===e&&(this.inflight=null)}).catch(()=>{}),e}async adoptStored(e){let t=await this.store.load();if(!t)throw this.current=null,this.emit("SIGNED_OUT",null),new T("signed out in another tab");if(t.userId!==e.userId)throw this.current=t,this.emit("SIGNED_OUT",null),this.emit("SIGNED_IN",t),new T("another user signed in in another tab");if(t.refreshToken!==e.refreshToken&&t.expiresAt>=e.expiresAt)return this.current=t,this.emit("TOKEN_REFRESHED",t),t}async reconcile(){await this.loaded;let e=this.current,t=await this.store.load();if(!e){t&&(this.current=t,this.emit("SIGNED_IN",t));return}await this.adoptStored(e).catch(()=>{})}withTimeout(e){let t,s=new Promise((i,n)=>{t=setTimeout(()=>n(new Error(`the refresh did not answer within ${this.refreshTimeoutMs/1e3} s`)),this.refreshTimeoutMs)});return Promise.race([e,s]).finally(()=>clearTimeout(t))}emit(e,t){(e==="SIGNED_IN"||e==="SIGNED_OUT")&&(this.endReason=null);for(let s of this.listeners)try{s(e,t)}catch{}}};var xe=class{state="closed";refusal;logSeq;joinRef=null;listeners=new Map;closers=new Set;joiners=new Set;joinWaiters=[];name;socket;constructor(e,t,s={}){this.name=e,this.socket=t,this.logSeq=s.after}get topic(){return`realtime:${this.name}`}join(){if(this.state==="joined")return Promise.resolve();let e=new Promise((t,s)=>this.joinWaiters.push({resolve:t,reject:s}));return this.state!=="joining"&&this.socket.join(this),e}leave(){this.socket.leave(this)}push(e,t){return this.socket.request(this,e,t)}on(e,t){let s=this.listeners.get(e);return s||this.listeners.set(e,s=new Set),s.add(t),()=>s.delete(t)}onClosed(e){return this.closers.add(e),()=>this.closers.delete(e)}onJoined(e){return this.joiners.add(e),()=>this.joiners.delete(e)}deliver(e,t){e==="broadcast"&&typeof t.seq=="number"&&(this.logSeq=t.seq);for(let s of this.listeners.get(e)??[])try{s(t)}catch{}}settled(e,t){e&&typeof t.log_seq=="number"&&(this.logSeq=t.log_seq),this.state=e?"joined":"refused",this.refusal=e?void 0:t;let s=this.joinWaiters.splice(0);for(let i of s)e?i.resolve():i.reject(new Error(`join ${this.name} refused: ${JSON.stringify(t)}`));if(e)for(let i of[...this.joiners])try{i()}catch{}}closed(e){this.state="closed",this.joinRef=null;let t=this.joinWaiters.splice(0);for(let s of t)s.reject(new Error(`join ${this.name}: ${e}`));for(let s of[...this.closers])try{s()}catch{}}},z=class{ws=null;opening=null;ref=0;channels=new Map;lastJoin=new Map;replies=new Map;heartbeat=null;heartbeatRef=null;reconnectTimer=null;attempts=0;closedByUs=!1;reconnects=0;opts;constructor(e){this.opts=e}channel(e,t){let s=this.channels.get(e);return s||this.channels.set(e,s=new xe(e,this,t)),s}disconnect(){this.closedByUs=!0,this.reconnectTimer&&clearTimeout(this.reconnectTimer),this.reconnectTimer=null,this.stopHeartbeat();let e=this.ws;this.ws=null,this.opening=null,e?.close(1e3);for(let[,t]of this.replies)t("error",{reason:"socket closed"});this.replies.clear();for(let t of this.channels.values())t.closed("the socket was closed");this.lastJoin.clear()}async tokenChanged(){if(!this.ws||this.ws.readyState!==1)return;let e=await this.opts.accessToken();if(e)for(let t of this.channels.values())t.state==="joined"&&this.push(t.joinRef,t.topic,"access_token",{access_token:e})}join(e){e.state="joining",this.open().then(()=>this.sendJoin(e)).catch(t=>e.settled(!1,{reason:t instanceof Error?t.message:String(t)}))}leave(e){e.state==="joined"&&(this.ws?.readyState===1&&this.push(e.joinRef,e.topic,"phx_leave",{}),this.lastJoin.get(e.name)===e&&this.lastJoin.delete(e.name)),e.state="closed",this.channels.delete(e.name)}async request(e,t,s){let i=this.ws;if(this.channels.get(e.name)!==e||e.state!=="joined"||i?.readyState!==1)return{status:"error",response:{reason:"not joined"}};let n=this.nextRef(),a=JSON.stringify([e.joinRef,n,e.topic,t,s]),o=this.awaitReply(n);return i.send(a),o}open(){if(this.ws?.readyState===1)return Promise.resolve();if(this.opening)return this.opening;this.closedByUs=!1;let e=this.opts.webSocket??globalThis.WebSocket,t=`${this.opts.baseUrl.replace(/^http/,"ws")}/realtime/v1/websocket?vsn=2.0.0&apikey=${encodeURIComponent(this.opts.publishableKey)}`,s=new Promise((i,n)=>{let a=new e(t);this.ws=a,a.onopen=()=>{this.attempts=0,this.startHeartbeat(),i()},a.onmessage=o=>this.receive(String(o.data)),a.onerror=()=>n(new Error("the realtime socket could not be opened")),a.onclose=()=>this.dropped(a)});return this.opening=s,s.finally(()=>{this.opening===s&&(this.opening=null)}).catch(()=>{}),s}dropped(e){if(this.ws!==e)return;this.ws=null,this.stopHeartbeat();for(let[,i]of this.replies)i("error",{reason:"socket closed"});this.replies.clear();for(let i of this.channels.values())i.state==="joined"&&(i.state="joining");if(this.closedByUs||![...this.channels.values()].some(i=>i.state==="joining"))return;let t=this.opts.backoff??[500,1e3,2e3,5e3,1e4,3e4],s=t[Math.min(this.attempts,t.length-1)]*(.8+Math.random()*.4);this.attempts++,this.reconnectTimer=J(setTimeout(()=>{this.reconnectTimer=null,this.reconnects++;let i=[...this.channels.values()].filter(n=>n.state==="joining");this.open().then(()=>Promise.all(i.map(n=>this.sendJoin(n)))).catch(()=>{})},s))}async sendJoin(e){let t=await this.opts.accessToken();if(this.channels.get(e.name)!==e||e.state!=="joining")return;let s=this.nextRef();e.joinRef=s;let i=this.awaitReply(s),n={broadcast:{self:!1}};e.logSeq!==void 0&&(n.log={after:e.logSeq}),this.lastJoin.set(e.name,e),this.push(s,e.topic,"phx_join",{access_token:t,config:n},s);let{status:a,response:o}=await i;if(this.channels.get(e.name)!==e||e.state!=="joining"){this.lastJoin.get(e.name)===e&&(this.lastJoin.delete(e.name),a==="ok"&&this.ws?.readyState===1&&this.push(s,e.topic,"phx_leave",{}));return}e.settled(a==="ok",o)}awaitReply(e){return new Promise(t=>{let s=J(setTimeout(()=>{this.replies.delete(e),t({status:"timeout",response:{reason:"no reply"}})},this.opts.replyTimeoutMs??1e4));this.replies.set(e,(i,n)=>{clearTimeout(s),this.replies.delete(e),t({status:i,response:n})})})}receive(e){let t;try{t=JSON.parse(e)}catch{return}if(!Array.isArray(t)||t.length!==5||typeof t[2]!="string"||typeof t[3]!="string")return;let[,s,i,n,a]=t,o=typeof a=="object"&&a!==null?a:{};if(n==="phx_reply"&&typeof s=="string"){if(s===this.heartbeatRef){this.heartbeatRef=null;return}this.replies.get(s)?.(String(o.status),o.response??{});return}let l=[...this.channels.values()].find(d=>d.topic===i);if(l){if(n==="phx_close"){l.state="closed";return}if(n==="phx_error"){l.state="joining",J(setTimeout(()=>this.channels.get(l.name)===l&&l.state==="joining"&&this.ws?.readyState===1&&void this.sendJoin(l),1e3));return}l.deliver(n,o)}}push(e,t,s,i,n=this.nextRef()){this.ws?.send(JSON.stringify([e,n,t,s,i]))}nextRef(){return String(++this.ref)}startHeartbeat(){this.stopHeartbeat(),this.heartbeat=J(setInterval(()=>{if(this.heartbeatRef!==null){this.heartbeatRef=null,this.ws?.close(4e3);return}this.heartbeatRef=this.nextRef(),this.push(null,"phoenix","heartbeat",{},this.heartbeatRef)},this.opts.heartbeatMs??25e3))}stopHeartbeat(){this.heartbeat&&clearInterval(this.heartbeat),this.heartbeat=null,this.heartbeatRef=null}};function J(r){return r.unref?.(),r}var E="X-Palbase-Installation-Secret",Y="X-Palbase-Installation",lt=new WeakMap;function O(r){return lt.get(r)}var dt=new WeakSet;function ct(r){return dt.has(r)}var ss=/^[A-Za-z0-9_-]{43}$/,X=class{id;constructor(e){let t=`palbase.installation.secret.${e}`,s;try{let i=ot()?.getItem(t);i&&ss.test(i)&&(s=i)}catch{}if(!s){dt.add(this),s=ht(crypto.getRandomValues(new Uint8Array(32)));try{ot()?.setItem(t,s)}catch{}}lt.set(this,s),this.id=is(s)}};function is(r){return ht(rs(new TextEncoder().encode(r)).subarray(0,16))}function ot(){try{return globalThis.localStorage}catch{return}}function ht(r){let e="";for(let t of r)e+=String.fromCharCode(t);return btoa(e).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")}var ns=new Uint32Array([1116352408,1899447441,3049323471,3921009573,961987163,1508970993,2453635748,2870763221,3624381080,310598401,607225278,1426881987,1925078388,2162078206,2614888103,3248222580,3835390401,4022224774,264347078,604807628,770255983,1249150122,1555081692,1996064986,2554220882,2821834349,2952996808,3210313671,3336571891,3584528711,113926993,338241895,666307205,773529912,1294757372,1396182291,1695183700,1986661051,2177026350,2456956037,2730485921,2820302411,3259730800,3345764771,3516065817,3600352804,4094571909,275423344,430227734,506948616,659060556,883997877,958139571,1322822218,1537002063,1747873779,1955562222,2024104815,2227730452,2361852424,2428436474,2756734187,3204031479,3329325298]),I=(r,e)=>r>>>e|r<<32-e;function rs(r){let e=new Uint32Array([1779033703,3144134277,1013904242,2773480762,1359893119,2600822924,528734635,1541459225]),t=new Uint8Array(Math.ceil((r.length+9)/64)*64);t.set(r),t[r.length]=128;let s=new DataView(t.buffer);s.setUint32(t.length-8,Math.floor(r.length/536870912)),s.setUint32(t.length-4,r.length*8>>>0);let i=new Uint32Array(64);for(let o=0;o<t.length;o+=64){for(let p=0;p<16;p++)i[p]=s.getUint32(o+p*4);for(let p=16;p<64;p++){let y=I(i[p-15],7)^I(i[p-15],18)^i[p-15]>>>3,P=I(i[p-2],17)^I(i[p-2],19)^i[p-2]>>>10;i[p]=i[p-16]+y+i[p-7]+P|0}let[l,d,c,f,g,S,m,h]=e;for(let p=0;p<64;p++){let y=h+(I(g,6)^I(g,11)^I(g,25))+(g&S^~g&m)+ns[p]+i[p]|0,P=(I(l,2)^I(l,13)^I(l,22))+(l&d^l&c^d&c)|0;h=m,m=S,S=g,g=f+y|0,f=c,c=d,d=l,l=y+P|0}e[0]+=l,e[1]+=d,e[2]+=c,e[3]+=f,e[4]+=g,e[5]+=S,e[6]+=m,e[7]+=h}let n=new Uint8Array(32),a=new DataView(n.buffer);for(let o=0;o<8;o++)a.setUint32(o*4,e[o]);return n}var os=30*6e4,ut=1e3,ls=100,ds=60*1024,Q=()=>globalThis.crypto?.randomUUID?globalThis.crypto.randomUUID():`${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;function L(){try{return globalThis.localStorage}catch{return}}var ee=class{api;closingApi;perfApi;closingPerfApi;flushMs;flushAt;now;anonKey;sessionKey;onceKey;events=[];samples=[];timer;memoryAnon;memorySession;memoryOnce;appVersion;stopAuto;session;consent;identifyPending=!1;listeners=new Set;people={set:e=>this.person({set:e}),setOnce:e=>this.person({set_once:e}),unset:e=>this.person({unset:[...e]}),add:e=>this.person({add:e})};constructor(e,t,s,i,n,a,o={}){this.session=s,this.consent=i;let l={send:c=>e.send(this.granted("analytics")?{...c,headers:{...c.headers,[Y]:n.id}}:c)};this.api=G.client(l);let d={send:c=>(this.granted("analytics")?e:t).send(c)};this.perfApi=G.client(d),this.closingApi=G.client({send:c=>l.send({...c,keepalive:!0})}),this.closingPerfApi=G.client({send:c=>d.send({...c,keepalive:!0})}),this.flushMs=o.flushMs??5e3,this.flushAt=o.flushAt??20,this.now=o.now??Date.now,this.anonKey=`palbase.analytics.anonymous.${a}`,this.sessionKey=`palbase.analytics.session.${a}`,this.onceKey=`palbase.analytics.once.${a}`,s.onChange(c=>{c==="SIGNED_IN"?(this.identifyPending=!0,this.soon()):c==="SIGNED_OUT"&&(this.identifyPending=!1,this.reset())}),i.onChange((c,f)=>{f!=="granted"&&(c==="analytics"?(this.events=[],this.identifyPending=!1,this.samples=this.samples.map(Te),this.reset()):c==="performance"&&(this.samples=[]))})}capture(e,t){for(let i of this.listeners)i(e,t);if(!this.granted("analytics"))return;let s=this.now();this.hold({event:e,distinct_id:this.distinctId(),properties:t,timestamp:s,session_id:this.sessionId(s),...this.appVersion?{app_version:this.appVersion}:{}})}captureOnce(e,t,s){if(!this.granted("analytics"))return;let i=this.sessionId(this.now()),n=this.readOnce(),a=n?.session===i?n.keys:[];a.includes(e)||(this.writeOnce({session:i,keys:[...a,e].slice(-500)}),this.capture(t,s))}readOnce(){try{let e=L()?.getItem(this.onceKey);if(e)return JSON.parse(e)}catch{}return this.memoryOnce}writeOnce(e){this.memoryOnce=e;try{L()?.setItem(this.onceKey,JSON.stringify(e))}catch{}}onEvent(e){return this.listeners.add(e),()=>this.listeners.delete(e)}page(e={}){let t=globalThis.location,s=globalThis.document,i=e.url??(t?`${t.origin}${V(t.pathname)}`:"");if(!i)return;let n=e.referrer??gs(s?.referrer);this.capture("$pageview",{...e.properties,url:i,...e.title??s?.title?{title:e.title??s?.title}:{},...n?{referrer:n}:{}})}async identify(e){this.identifyPending=!1;let t=this.session.snapshot()?.userId;!t||!this.granted("analytics")||(await this.flush(),await this.sendIdentify(this.api,t,e))}async sendIdentify(e,t,s){try{await e.identify({body:{distinct_id:t,anonymous_id:this.anonymousId(),traits:s,timestamp:this.now(),sent_at:this.now()}})}catch{}}reset(){this.memoryAnon=void 0,this.memorySession=void 0,this.memoryOnce=void 0;try{L()?.removeItem(this.anonKey),L()?.removeItem(this.sessionKey),L()?.removeItem(this.onceKey)}catch{}}async flush(e=!1){this.timer&&clearTimeout(this.timer),this.timer=void 0,this.granted("analytics")||(this.events=[]),this.granted("performance")?this.granted("analytics")||(this.samples=this.samples.map(Te)):this.samples=[];let t=e?this.closingApi:this.api,s=e?this.closingPerfApi:this.perfApi,i=this.now(),n=this.session.snapshot()?.userId;for(this.identifyPending&&n&&this.granted("analytics")&&(this.identifyPending=!1,await this.sendIdentify(t,n));this.events.length>0;){let a=this.take(this.events,e);try{await t.batch({body:{events:a.map(o=>({...o,sent_at:i}))}})}catch{}}for(;this.samples.length>0;){let a=this.take(this.samples,e);try{await s.sendPerf({body:{items:a}})}catch{}}}start(e={}){this.stopAuto?.(),this.appVersion=e.appVersion;let t=globalThis;if(typeof t.addEventListener!="function"||typeof globalThis.document>"u")return()=>{};let s=[];e.pageViews!==!1&&s.push(this.watchPages(t)),e.webVitals!==!1&&s.push(us((a,o)=>this.sample("web_vital",a,o))),e.network!==!1&&s.push(this.watchFetch(t));let i=()=>{document.visibilityState==="hidden"&&this.flush(!0)},n=()=>{this.flush(!0)};return document.addEventListener("visibilitychange",i),t.addEventListener("pagehide",n),s.push(()=>{document.removeEventListener("visibilitychange",i),t.removeEventListener("pagehide",n)}),this.stopAuto=()=>{for(let a of s.splice(0))a();this.stopAuto=void 0},this.stopAuto}granted(e){return this.consent.state(e)==="granted"}async person(e){if(!this.granted("analytics"))return;let t=this.session.snapshot()?.userId,s=this.now();try{await this.api.setPersonProperties({body:{...e,...t?{}:{distinct_id:this.anonymousId()},timestamp:s,sent_at:s}})}catch{}}hold(e){this.events.length>=ut&&this.events.shift(),this.events.push(e),this.soon()}sample(e,t,s,i={}){if(!this.granted("performance"))return;this.samples.length>=ut&&this.samples.shift();let n={row_id:Q(),trace_type:e,name:t,value:Math.max(0,s),timestamp:this.now(),...i};this.samples.push(this.granted("analytics")?{...n,distinct_id:this.distinctId()}:Te(n)),this.soon()}soon(){if(this.events.length+this.samples.length>=this.flushAt){this.flush();return}this.timer||(this.timer=setTimeout(()=>{this.flush()},this.flushMs),this.timer.unref?.())}take(e,t){let s=e.splice(0,ls);if(!t)return s;for(;s.length>1&&JSON.stringify(s).length>ds;)e.unshift(s.pop());return s}distinctId(){return this.session.snapshot()?.userId??this.anonymousId()}anonymousId(){let e=L();try{let t=e?.getItem(this.anonKey);if(t)return t;let s=`anon_${Q()}`;if(e?.setItem(this.anonKey,s),e?.getItem(this.anonKey)===s)return s}catch{}return this.memoryAnon??=`anon_${Q()}`,this.memoryAnon}sessionId(e){let t=L(),s=this.memorySession;try{let n=t?.getItem(this.sessionKey);n&&(s=JSON.parse(n))}catch{}let i=s&&e-s.last<os?{id:s.id,last:e}:{id:`ses_${Q()}`,last:e};this.memorySession=i;try{t?.setItem(this.sessionKey,JSON.stringify(i))}catch{}return i.id}watchPages(e){let t="",s=()=>{let o=`${e.location.origin}${e.location.pathname}`;if(o===t)return;t=o;let l=`${e.location.origin}${V(e.location.pathname)}`;setTimeout(()=>this.page({url:l}),0)},i=e.history,n=i.pushState.bind(i),a=i.replaceState.bind(i);return i.pushState=(...o)=>{n(...o),s()},i.replaceState=(...o)=>{a(...o),s()},e.addEventListener("popstate",s),s(),()=>{i.pushState=n,i.replaceState=a,e.removeEventListener("popstate",s)}}watchFetch(e){let t=e.fetch;if(typeof t!="function")return()=>{};let s=async(i,n)=>{let a=performance.now(),o=i instanceof Request?i:void 0,l=(n?.method??o?.method??"GET").toUpperCase(),d;try{d=new URL(o?.url??String(i),e.location.href)}catch{d=void 0}let c=!!d&&d.pathname.startsWith("/analytics/")||ps(n?.headers??o?.headers);try{let f=await t(i,n);return d&&!c&&this.sample("network",`${l} ${d.origin}${V(d.pathname)}`,performance.now()-a,{attrs:{status:String(f.status)},...f.headers.get("x-request-id")?{request_id:f.headers.get("x-request-id")}:{}}),f}catch(f){throw d&&!c&&this.sample("network",`${l} ${d.origin}${V(d.pathname)}`,performance.now()-a,{attrs:{status:"0"}}),f}};return e.fetch=s,()=>{e.fetch===s&&(e.fetch=t)}}};function Te(r){let{distinct_id:e,request_id:t,...s}=r;return s}var cs=r=>r.entryType==="layout-shift"&&"value"in r&&"hadRecentInput"in r,hs=r=>r.entryType==="event"||r.entryType==="first-input";function Z(r,e){if(!(typeof PerformanceObserver>"u"))try{let t=new PerformanceObserver(s=>e(s.getEntries()));return t.observe({type:r,buffered:!0}),t}catch{return}}function us(r){if(typeof document>"u"||typeof performance>"u"||typeof performance.getEntriesByType!="function")return()=>{};let e=0,t=0,s=0,i=[Z("largest-contentful-paint",d=>{for(let c of d)e=Math.max(e,c.startTime)}),Z("layout-shift",d=>{for(let c of d)cs(c)&&!c.hadRecentInput&&(t+=c.value)}),Z("event",d=>{for(let c of d)hs(c)&&(s=Math.max(s,c.duration))}),Z("paint",d=>{for(let c of d)c.name==="first-contentful-paint"&&r("FCP",c.startTime)})],n=performance.getEntriesByType("navigation")[0];n&&n.responseStart>0&&r("TTFB",n.responseStart);let a=!1,o=()=>{a||(a=!0,e>0&&r("LCP",e),r("CLS",t),s>0&&r("INP",s))},l=()=>{document.visibilityState==="hidden"&&o()};return document.addEventListener("visibilitychange",l),()=>{o(),document.removeEventListener("visibilitychange",l);for(let d of i)d?.disconnect()}}function ps(r){if(!r)return!1;try{return new Headers(r).has("next-router-prefetch")}catch{return!1}}var fs=/^[a-z][a-z0-9_-]{0,31}$/;function V(r){return r.split("/").map(e=>{if(e==="")return e;let t=e.split(";",1)[0],s=t.toLowerCase();return fs.test(s)&&(s.match(/\d/g)?.length??0)<=2&&t.slice(1)===s.slice(1)&&s.split(/[-_]/).every(n=>n.length<=16)?s:":id"}).join("/")}function gs(r){if(!r)return"";try{let e=new URL(r);return`${e.origin}${V(e.pathname)}`}catch{return V(r.split(/[?#]/,1)[0]??"")}}var _t=/^custom\.[a-z0-9_]{1,48}$/,ms=/^[a-z][a-z0-9_]{0,63}$/,pt=r=>ms.test(r)||_t.test(r),vs=50,ft=[5e3,3e4,12e4,6e5],ys=100,se=class{userApi;deviceApi;session;socket;ref;installation;start;textVersion;customKeys;storeKey;now;kept;listeners=new Set;engaged=!1;platformKeys;watch;sending;sendAgain=!1;retryTimer;retries=0;readFor;stale=!1;lastW=0;lastChosen=0;gpc=globalThis.navigator?.globalPrivacyControl===!0;constructor(e){let t=e.options??{};for(let[l,d]of Object.entries(t.start??{})){if(!pt(l))throw new TypeError(`consent.start: ${JSON.stringify(l)} is not a consent key (a platform key, or custom.<name>)`);if(d!=="granted"&&d!=="denied")throw new TypeError(`consent.start.${l} is granted or denied`)}for(let l of t.customKeys??[])if(!_t.test(l))throw new TypeError(`consent.customKeys: ${JSON.stringify(l)} is not custom.<name> (a-z, 0-9 and _, 48 at most)`);if(t.textVersion!==void 0&&(t.textVersion===""||t.textVersion.length>64))throw new TypeError("consent.textVersion: 1 to 64 characters");this.userApi=e.userApi,this.deviceApi=e.deviceApi,this.session=e.session,this.socket=e.socket,this.ref=e.ref,this.installation=e.installation,this.start={...t.start},this.textVersion=t.textVersion,this.customKeys=[...t.customKeys??[]],this.storeKey=`palbase.consent.${e.origin}.${e.installation.id}`,this.now=e.now??Date.now;let s=this.load(),i=()=>ct(this.installation)?{}:{unknown:{on:!0,w:this.stamp()}},n={whose:null,install:this.installation.id,choices:{},unsent:[]};typeof s!="object"?this.kept={...n,...s==="unreadable"?{unknown:{on:!0,w:this.stamp()}}:i()}:s.whose==null&&s.install!==void 0&&s.install!==this.installation.id?this.kept={...n,unsent:s.unsent.filter(l=>l.user!==null),...s.keys?{keys:s.keys}:{},...i()}:this.kept=s,e.session.onChange((l,d)=>{this.engaged&&(l==="SIGNED_IN"&&d?this.signedIn(d):(l==="SIGNED_OUT"||l==="SESSION_EXPIRED")&&this.signedOut())});let a=globalThis;typeof a.addEventListener=="function"&&(a.addEventListener("storage",l=>{(l.key===this.storeKey||l.key===null)&&this.reload()}),a.addEventListener("online",()=>{this.engaged&&this.send()}));let o=this.kept;(e.options!==void 0||s!=="empty"&&(o.unknown?.on||o.unsent.length>0||o.link!==void 0||Object.keys(o.choices).length>0))&&this.engage()}async keys(){return this.engage(),[...(await this.platform()).map(t=>({key:t.key,category:t.category,title:{...t.title},description:{...t.description},ads:t.ads})),...this.customKeys.map(t=>({key:t,category:"custom",title:{},description:{},ads:!1}))]}state(e){if(x(this.kept)!==this.holder()||this.gpcRefuses(e))return"denied";let t=vt(this.kept,e);return t&&t.state!=="unset"?t.state:this.kept.unknown?.on?"denied":this.start[e]}owesRead(){return this.stale||this.kept.unknown?.on===!0||x(this.kept)!==this.holder()||Object.values(this.kept.choices).some(e=>e.provisional)}holder(){let e=this.session.snapshot()?.userId;return e?`user:${e}`:`device:${this.installation.id}`}lastDeniedAt(e){let t=this.kept.choices[e]?.last_denied_at;return t?new Date(t):void 0}set(e,t){this.setMany({[e]:t})}setMany(e){let t=Object.entries(e);for(let[a,o]of t){if(!pt(a))throw new TypeError(`${JSON.stringify(a)} is not a consent key (a platform key, or custom.<name>)`);if(o!=="granted"&&o!=="denied")throw new TypeError(`${a}: a choice is granted or denied`)}if(t.length===0)return;this.engage();let s=this.chosenAt(),i=this.session.snapshot()?.userId??null,n=this.states();for(let[a,o]of t)this.queue({key:a,state:o,source:"app",chosen_at:s,user:i,...this.textVersion!==void 0?{text_version:this.textVersion}:{}});this.commit(n),this.send()}onChange(e){return this.listeners.add(e),()=>this.listeners.delete(e)}async region(){this.engage();let e=await this.subject();if(this.readFor!==e)try{await this.read(e)}catch(t){if(!this.kept.region)throw t}return this.kept.region}async needsAsking(e){this.engage();let t=await this.subject();this.readFor!==t&&await this.read(t).catch(()=>{});let s=e??(await this.keys()).map(l=>l.key),i=await this.platform().catch(()=>this.kept.keys??[]),n=new Set(i.filter(l=>l.ads).map(l=>l.key)),a=this.kept.region?.jurisdiction==="us",o=new Date(this.now());return o.setUTCMonth(o.getUTCMonth()-12),s.filter(l=>{let d=this.kept.choices[l];return a&&n.has(l)&&d?.last_denied_at!==void 0&&Date.parse(d.last_denied_at)>o.getTime()?!1:!d||d.state==="unset"?!0:this.textVersion!==void 0&&d.source==="app"&&d.text_version!==this.textVersion})}engage(){this.engaged||(this.engaged=!0,this.session.session().then(e=>{e&&!this.watch&&this.follow(e),this.send(),this.refuseByGpc()}))}async subject(){return(await this.session.session())?.userId??null}secret(){return{[E]:O(this.installation)}}platform(){return this.platformKeys??=this.deviceApi.listConsentKeys().then(e=>(this.kept={...this.kept,keys:e.data.keys},this.commit(),e.data.keys),e=>{if(this.platformKeys=void 0,this.kept.keys)return this.kept.keys;throw e}),this.platformKeys}async read(e){let s=(await(e===null?this.deviceApi:this.userApi(e)).getConsents({query:{installation_id:this.installation.id},headers:this.secret()})).data;this.adopt(s,e)}adopt(e,t,s=[]){if(this.kept={...this.kept,region:e.region},(this.session.snapshot()?.userId??null)!==t){this.commit();return}let i=this.states(),n={};for(let h of e.choices)n[h.key]={state:h.state,source:h.source,chosen_at:h.chosen_at,...h.text_version!==void 0?{text_version:h.text_version}:{},...h.last_denied_at!==void 0?{last_denied_at:h.last_denied_at}:{}};let a=s.filter(h=>n[h.key]?.state!==h.state||Date.parse(n[h.key]?.chosen_at??"")!==Date.parse(h.chosen_at)).map(h=>A(h.key,h)),l=x(this.kept)===(t===null?`device:${this.installation.id}`:`user:${t}`)?Object.entries(this.kept.choices).filter(([,h])=>h.provisional).map(([h,p])=>A(h,p)):[];if(a.length+l.length>0&&(this.kept={...this.kept,void:D([...this.kept.void??[],...a,...l])}),t===null&&this.kept.resetAt!==void 0)for(let[h,p]of Object.entries(n))Date.parse(p.chosen_at)<this.kept.resetAt&&delete n[h];let d=new Set(Object.entries(n).map(([h,p])=>A(h,p))),c=(this.kept.void??[]).filter(h=>d.has(h));c.length>0&&(this.kept={...this.kept,unvoid:D([...this.kept.unvoid??[],...c])});let f=Pt(this.kept),g;if(x(this.kept)!==(t===null?`device:${this.installation.id}`:`user:${t}`))g=n;else{g={};for(let h of[...new Set([...Object.keys(this.kept.choices),...Object.keys(n)])].sort()){let p=this.kept.choices[h],y=p&&!p.provisional&&!f.has(A(h,p))?p:void 0,P=n[h],R=P&&(!y||Date.parse(P.chosen_at)>=Date.parse(y.chosen_at))?P:y;R&&(g[h]=R)}}for(let h of this.kept.unsent){if(h.user!==null&&h.user!==t||h.user===null&&h.device!==void 0&&h.device!==this.installation.id||h.user===null&&t!==null)continue;let p=g[h.key];p&&Date.parse(p.chosen_at)>Date.parse(h.chosen_at)||(g[h.key]=gt(h,p))}let{install:S,...m}=this.kept;this.kept={...m,whose:t,...t===null?{install:this.installation.id}:{},choices:g,unknown:{on:!1,w:this.stamp()}},this.readFor=t,this.stale=!1,this.commit(i),this.refuseByGpc()}async refused(e,t,s){let i=t===e&&x(this.kept)===(t===null?`device:${this.installation.id}`:`user:${t}`),n=D([...this.kept.void??[],...s.map(l=>A(l.key,l))]);if(!i){this.kept={...this.kept,void:n},this.commit();return}let a=this.states(),o={...this.kept.choices};for(let l of s){if(this.kept.unsent.some(c=>c.key===l.key&&(c.user===null||c.user===e)&&Date.parse(c.chosen_at)>Date.parse(l.chosen_at)))continue;let d=o[l.key];o[l.key]={state:"denied",source:"app",chosen_at:l.chosen_at,...d?.last_denied_at!==void 0?{last_denied_at:d.last_denied_at}:{},provisional:!0}}this.kept={...this.kept,choices:o,void:n},this.commit(a);try{await this.read(e)}catch{this.stale=!0}}queue(e){let t=e.user===null?{...e,device:this.installation.id}:e,s=x(this.kept)===(t.user===null?`device:${this.installation.id}`:`user:${t.user}`);this.kept={...this.kept,unsent:xt([...this.kept.unsent,t]),...s?{choices:{...this.kept.choices,[t.key]:gt(t,this.kept.choices[t.key])}}:{}}}send(){if(this.sendAgain=!0,this.sending)return;let e=(async()=>{for(;this.sendAgain;)this.sendAgain=!1,await this.sendUnsent()||(this.sendAgain=!1)})();this.sending=e,e.finally(()=>{this.sending===e&&(this.sending=void 0)})}async sendUnsent(){this.retryTimer&&clearTimeout(this.retryTimer),this.retryTimer=void 0;let e=this.session.snapshot()?.userId??null;try{e=await this.subject();let t=await this.sendOf(null,e);if(e!==null&&(this.kept.link===e||t)){let s;try{s=(await this.userApi(e).linkConsents({headers:this.secret(),body:{installation_id:this.installation.id}})).data}catch(i){if(!bt(i))throw i}if(this.kept.link===e){let{link:i,...n}=this.kept;this.kept=n,this.commit()}if(s)this.adopt(s,e);else{let i=this.states();this.kept={...this.kept,unknown:{on:!0,w:this.stamp()}},this.commit(i)}}if(e!==null&&await this.sendOf(e,e),this.owesRead()&&(await this.read(e),this.owesRead()))throw new Error("the choices are not read yet");return this.retries=0,!0}catch{return(this.session.snapshot()?.userId??null)!==e?(this.sendAgain=!0,!0):(this.retryLater(),!1)}}async sendOf(e,t){let s=!1;for(;;){let i=this.nextGroup(e);if(i.length===0)return s;let n=i[0],a=e===null?this.deviceApi:this.userApi(e),o;try{o=(await a.chooseConsents({headers:this.secret(),body:{installation_id:this.installation.id,...n.source==="gpc"?{source:"gpc"}:{},...n.text_version!==void 0?{text_version:n.text_version}:{},choices:i.map(l=>({key:l.key,state:l.state,chosen_at:l.chosen_at}))}})).data}catch(l){if(!bt(l))throw l;if(i.length>1){this.kept={...this.kept,unsent:this.kept.unsent.map(d=>i.some(c=>wt(c,d))?{...d,alone:!0}:d)},this.commit();continue}}this.kept={...this.kept,unsent:this.kept.unsent.filter(l=>!i.some(d=>wt(d,l))),done:D([...this.kept.done??[],...i.map(ie)])},this.commit(),o?(s=!0,e===t&&this.adopt(o,e,i)):await this.refused(t,e,i)}}nextGroup(e){let t=this.kept.unsent.filter(a=>a.user===e&&(e!==null||(a.device??this.installation.id)===this.installation.id)),s=t[0];if(!s)return[];let i=[],n=new Set;if(s.alone)return[s];for(let a of t)if(!n.has(a.key)&&(n.add(a.key),!(a.alone||a.source!==s.source||a.text_version!==s.text_version)&&(i.push(a),i.length===vs)))break;return i}retryLater(){if(this.retryTimer)return;let e=ft[Math.min(this.retries,ft.length-1)];this.retries++,this.retryTimer=setTimeout(()=>{this.retryTimer=void 0,this.send()},e),this.retryTimer.unref?.()}signedIn(e){this.readFor=void 0,this.kept={...this.kept,link:e.userId},this.commit(),this.follow(e),this.send()}signedOut(){this.unfollow(),this.readFor=void 0;let e=this.states(),t=this.chosenAt(),s=new Set([...Object.entries(this.kept.choices).filter(([,o])=>o.state!=="unset").map(([o])=>o),...this.kept.unsent.filter(o=>o.user===null&&(o.device??this.installation.id)===this.installation.id).map(o=>o.key),...Object.keys(this.start),...this.customKeys,...(this.kept.keys??[]).map(o=>o.key)]),i={};for(let[o,l]of Object.entries(this.kept.choices))i[o]={state:"unset",source:"app",chosen_at:t,...l.last_denied_at!==void 0?{last_denied_at:l.last_denied_at}:{}};let n=o=>o.user===null&&(o.device??this.installation.id)===this.installation.id,a=this.kept.unsent.filter(n);this.kept={whose:null,install:this.installation.id,resetAt:Date.parse(t),choices:i,unsent:this.kept.unsent.filter(o=>!n(o)),...this.kept.void?{void:this.kept.void}:{},...this.kept.unvoid?{unvoid:this.kept.unvoid}:{},done:D([...this.kept.done??[],...a.map(ie)]),...this.kept.region?{region:this.kept.region}:{},...this.kept.keys?{keys:this.kept.keys}:{},...this.kept.gpc?{gpc:this.kept.gpc}:{},...this.kept.unknown?{unknown:this.kept.unknown}:{}};for(let o of s)this.queue({key:o,state:"unset",source:"app",chosen_at:t,user:null});this.commit(e),this.send(),this.refuseByGpc()}follow(e){this.unfollow();let t=this.socket.channel(`consents:${this.ref}:${e.userId}`),s={userId:e.userId,channel:t,off:()=>{},version:-1},i=[t.on("broadcast",n=>{n.event==="changed"&&this.changed(s,Me(n.payload))}),t.on("state_snapshot",n=>this.held(s,Me(St(n.entries)))),t.on("state_diff",n=>this.held(s,Me(St(n.set))))];s.off=()=>i.forEach(n=>n()),this.watch=s,t.join().catch(()=>{})}unfollow(){let e=this.watch;e&&(this.watch=void 0,e.off(),e.channel.leave())}held(e,t){t!==void 0&&this.changed(e,t)}changed(e,t){if(this.watch===e){if(t!==void 0){if(t<=e.version)return;e.version=t}this.read(e.userId).catch(()=>{this.watch===e&&(this.stale=!0,this.retryLater())})}}gpcRefuses(e){if(!this.gpc||!(this.kept.keys??[]).some(n=>n.key===e&&n.ads))return!1;let t=vt(this.kept,e);if(t?.state==="denied")return!1;let s=this.kept.gpc?.[x(this.kept)],i=s!==void 0&&(this.kept.whose!=null||s>=(this.kept.resetAt??0));return!(t?.state==="granted"&&t.source==="app"&&i&&Date.parse(t.chosen_at)>s)}async refuseByGpc(){if(!this.gpc||x(this.kept)!==this.holder())return;let e;try{e=await this.platform()}catch{return}if(x(this.kept)!==this.holder())return;let t=this.session.snapshot()?.userId??null,s=e.filter(a=>a.ads&&this.gpcRefuses(a.key)&&!this.kept.unsent.some(o=>o.key===a.key&&o.source==="gpc"&&o.user===t));if(s.length===0)return;let i=this.chosenAt(),n=this.states();for(let a of s)this.queue({key:a.key,state:"denied",source:"gpc",chosen_at:i,user:t});this.kept={...this.kept,gpc:{...this.kept.gpc,[x(this.kept)]:Date.parse(i)}},this.commit(n),this.send()}states(){let e=new Map;for(let t of[...Object.keys(this.start),...Object.keys(this.kept.choices)])e.set(t,this.state(t));return e}tell(e){let t=this.states();for(let s of new Set([...e.keys(),...t.keys()])){let i=t.get(s);if(e.get(s)!==i)for(let n of[...this.listeners])try{n(s,i)}catch{}}}load(){let e;try{e=kt()?.getItem(this.storeKey)}catch{return"unreadable"}if(e==null)return"empty";try{let t=JSON.parse(e);if(Ss(t))return t}catch{}return"unreadable"}reload(){let e=this.load();if(typeof e!="object"){this.write();return}let t=this.states();this.kept=mt(e,this.kept,"theirs",this.holder()),x(e)===x(this.kept)&&yt(this.kept)!==yt(e)&&this.write(),this.tell(t);let s=this.session.snapshot()?.userId??null;this.engaged&&this.kept.unsent.some(i=>i.user!==null&&i.user===s||i.user===null&&(i.device??this.installation.id)===this.installation.id)&&this.retryLater(),this.engaged&&this.refuseByGpc()}commit(e=this.states()){let t=this.load();typeof t=="object"&&(this.kept=mt(t,this.kept,"ours",this.holder())),this.write(),this.tell(e)}write(){try{kt()?.setItem(this.storeKey,JSON.stringify(this.kept))}catch{}}chosenAt(){return this.lastChosen=Math.max(this.now(),this.lastChosen+1),new Date(this.lastChosen).toISOString()}stamp(){let e=this.kept,t=e?Math.max(0,e.unknown?.w??0):0;return this.lastW=Math.max(this.now(),this.lastW+1,t+1),this.lastW}};function gt(r,e){let t=r.state==="denied"?r.chosen_at:e?.last_denied_at;return{state:r.state,source:r.source,chosen_at:r.chosen_at,...r.text_version!==void 0?{text_version:r.text_version}:{},...t!==void 0?{last_denied_at:t}:{}}}function A(r,e){return`${r}|${e.provisional?"provisional":e.state}|${Date.parse(e.chosen_at)}`}function Pt(r){let e=new Set(r.unvoid??[]);return new Set((r.void??[]).filter(t=>!e.has(t)))}var te={denied:2,unset:1,granted:0};function ws(r,e,t,s){let i=e&&!s.has(A(r,e))?e:void 0,n=t&&!s.has(A(r,t))?t:void 0;if(!i||!n)return i??n;let a=Date.parse(i.chosen_at),o=Date.parse(n.chosen_at);return a!==o?a>o?i:n:te[i.state]!==te[n.state]?te[i.state]>te[n.state]?i:n:i.provisional?n:i}function bs(r,e){return!r||!e?r??e:e.w>r.w||e.w===r.w&&e.on?e:r}function mt(r,e,t,s){let i=D([...r.void??[],...e.void??[]]),n=D([...r.unvoid??[],...e.unvoid??[]]),a=Pt({void:i,unvoid:n}),o={},l,d={...r.gpc};for(let[y,P]of Object.entries(e.gpc??{}))d[y]=Math.max(d[y]??0,P);let c;if(x(r)===x(e)){l=e;for(let y of[...new Set([...Object.keys(r.choices),...Object.keys(e.choices)])].sort()){let P=ws(y,r.choices[y],e.choices[y],a);P&&(o[y]=P)}c=bs(r.unknown,e.unknown)}else{l=x(e)===s?e:x(r)===s?r:t==="ours"?e:r;for(let[y,P]of Object.entries(l.choices))a.has(A(y,P))||(o[y]=P);c=l.unknown}let f=D([...r.done??[],...e.done??[]]),g=xt([...r.unsent,...e.unsent]).filter(y=>!f.includes(ie(y))),S=t==="ours"?e:r,m=t==="ours"?r:e,h=S.region??m.region,p=S.keys??m.keys;return{whose:l.whose??null,...l.whose==null&&l.install!==void 0?{install:l.install}:{},...l.whose==null&&(r.resetAt!==void 0||e.resetAt!==void 0)&&x(r)===x(e)?{resetAt:Math.max(r.resetAt??0,e.resetAt??0)}:l.whose==null&&l.resetAt!==void 0?{resetAt:l.resetAt}:{},choices:o,unsent:g,...f.length>0?{done:f}:{},...i.length>0?{void:i}:{},...n.length>0?{unvoid:n}:{},...S.link!==void 0?{link:S.link}:{},...h?{region:h}:{},...Object.keys(d).length>0?{gpc:d}:{},...p?{keys:p}:{},...c?{unknown:c}:{}}}function ie(r){return`${r.user??`device:${r.device??""}`}|${r.key}|${r.state}|${r.source}|${r.chosen_at}`}function vt(r,e){let t=r.choices[e];if(!t||r.whose!=null||r.resetAt===void 0||Date.parse(t.chosen_at)>=r.resetAt)return t}function x(r){return r.whose!=null?`user:${r.whose}`:`device:${r.install??""}`}function D(r){return[...new Set(r)].slice(-ys)}function yt(r){return JSON.stringify(r,(e,t)=>typeof t=="object"&&t!==null&&!Array.isArray(t)?Object.fromEntries(Object.entries(t).sort(([s],[i])=>s.localeCompare(i))):t)}function xt(r){let e=new Map;for(let t of r){let s=ie(t),i=e.get(s);e.set(s,i?i.alone||!t.alone?i:{...i,alone:!0}:t)}return[...e.values()].sort((t,s)=>Date.parse(t.chosen_at)-Date.parse(s.chosen_at))}var ks=new Set(["granted","denied","unset"]);function Ss(r){if(typeof r!="object"||r===null)return!1;let e=r;if(typeof e.choices!="object"||e.choices===null||Array.isArray(e.choices)||!Array.isArray(e.unsent))return!1;let t=(o,l)=>{if(typeof o!="object"||o===null)return!1;let d=o;return ks.has(d.state)&&typeof d.chosen_at=="string"&&(!l||typeof d.key=="string")},s=o=>o===void 0||typeof o=="object"&&o!==null&&typeof o.on=="boolean"&&typeof o.w=="number",i=r,n=o=>o===void 0||Array.isArray(o)&&o.every(l=>typeof l=="string"),a=i.whose===void 0||i.whose===null||typeof i.whose=="string";return Object.values(e.choices).every(o=>t(o,!1))&&e.unsent.every(o=>t(o,!0))&&(i.gpc===void 0||typeof i.gpc=="object"&&i.gpc!==null&&Object.values(i.gpc).every(o=>typeof o=="number"))&&s(i.unknown)&&n(i.done)&&n(i.void)&&n(i.unvoid)&&a}function wt(r,e){return r.key===e.key&&r.user===e.user&&r.state===e.state&&r.source===e.source&&r.chosen_at===e.chosen_at}function bt(r){return r instanceof w&&r.status>=400&&r.status<500&&r.status!==401&&r.status!==408&&r.status!==429}function kt(){try{return globalThis.localStorage}catch{return}}function St(r){let e=typeof r=="object"&&r!==null?r.version:void 0;return typeof e=="object"&&e!==null?e.v:void 0}function Me(r){let e=typeof r=="object"&&r!==null?r.version:void 0;return typeof e=="number"&&Number.isFinite(e)?e:void 0}var _s=`
|
|
3
|
-
:host{display:block;color-scheme:light dark;font:15px/1.4 system-ui,-apple-system,"Segoe UI",Roboto,sans-serif}
|
|
4
|
-
.list{display:flex;flex-direction:column;gap:8px;margin:0;padding:0;list-style:none}
|
|
5
|
-
.item{position:relative;display:flex;gap:12px;align-items:flex-start;padding:12px 40px 12px 12px;border-radius:12px;background:var(--bg);color:var(--fg);cursor:pointer;outline:none}
|
|
6
|
-
.item:focus-visible{box-shadow:0 0 0 2px var(--accent)}
|
|
7
|
-
.item.unread .title{font-weight:600}
|
|
8
|
-
.item .dot{flex:0 0 8px;height:8px;margin-top:7px;border-radius:50%;background:transparent}
|
|
9
|
-
.item.unread .dot{background:var(--accent)}
|
|
10
|
-
.item img{flex:0 0 48px;width:48px;height:48px;border-radius:8px;object-fit:cover}
|
|
11
|
-
.text{display:flex;flex-direction:column;gap:2px;min-width:0;flex:1 1 auto}
|
|
12
|
-
.title{overflow-wrap:anywhere}
|
|
13
|
-
.body{color:var(--muted);overflow-wrap:anywhere}
|
|
14
|
-
.when{color:var(--muted);font-size:12px}
|
|
15
|
-
.card{position:relative;padding-right:32px;cursor:pointer}
|
|
16
|
-
.card.unread::before{content:"";position:absolute;left:-12px;top:14px;width:8px;height:8px;border-radius:50%;background:var(--accent)}
|
|
17
|
-
.delete{position:absolute;top:8px;right:8px;width:28px;height:28px;border:0;border-radius:14px;background:transparent;color:var(--muted);font-size:18px;line-height:1;cursor:pointer}
|
|
18
|
-
.delete:hover,.delete:focus-visible{background:var(--hover)}
|
|
19
|
-
.empty{padding:24px 12px;text-align:center;color:var(--muted)}
|
|
20
|
-
.light{--bg:#f4f4f6;--fg:#111;--muted:#5c5c66;--accent:#2f6bff;--hover:#0000000f}
|
|
21
|
-
.dark{--bg:#1f1f24;--fg:#f2f2f5;--muted:#a0a0ab;--accent:#5b8cff;--hover:#ffffff14}
|
|
22
|
-
`,ne=class{api;session;constructor(e,t){this.api=$.client(e),this.session=t}async list(e={}){return(await this.api.listMyInbox({query:{limit:e.limit,cursor:e.cursor,locale:e.locale}})).data}async unread(){return(await this.list({limit:1})).unread}async markRead(e){let t=e==="all"?{all:!0}:{ids:[...e]};return(await this.api.readMyInbox({body:t})).data.read}async remove(e){await this.api.deleteMyInboxMessage({path:{id:e}})}mount(e,t={}){let s=e.ownerDocument,i=s.defaultView,n=s.createElement("div");n.setAttribute("data-palbase-inbox","");let a=n.attachShadow({mode:"open"});Ze(s,a,_s);let o=s.createElement("ul");o.className="list",a.append(o),e.append(n);let l=()=>t.appearance??(i?.matchMedia?.("(prefers-color-scheme: dark)").matches?"dark":"light"),d=[],c=0,f=[],g=!1,S=u=>{c=u,t.onUnread?.(u)},m=(u,b)=>{u.read_at||(u.read_at=new Date().toISOString(),S(Math.max(0,c-1)),y(),this.markRead([u.id]).catch(()=>{})),!(!b||!Ye(b))&&(t.onOpen?t.onOpen(u,b):b.startsWith("https://")?i?.open(b,"_blank","noopener,noreferrer"):i?.location.assign(b))},h=async u=>{d=d.filter(b=>b.id!==u.id),u.read_at||S(Math.max(0,c-1)),y(),await this.remove(u.id).catch(()=>{})},p=u=>{try{return new Intl.DateTimeFormat(t.locale,{dateStyle:"medium",timeStyle:"short"}).format(new Date(u))}catch{return u}};function y(){if(f.forEach(u=>u.destroy()),f=[],o.replaceChildren(),o.className=`list ${l()}`,!d.length){let u=s.createElement("li");u.className="empty",u.textContent=t.labels?.empty??"No messages",o.append(u);return}for(let u of d)o.append(P(u))}let P=u=>{let b=s.createElement("li");b.setAttribute("data-id",u.id),b.tabIndex=0;let C=s.createElement("button");if(C.type="button",C.className="delete",C.textContent="\xD7",C.setAttribute("aria-label",t.labels?.delete??"Delete"),C.addEventListener("click",v=>{v.stopPropagation(),h(u)}),u.card){b.className=`card ${u.read_at?"":"unread"}`;let v=s.createElement("div");b.append(v,C);let k={onAction:()=>m(u,void 0),onDeepLink:_=>m(u,_),onLink:_=>m(u,_),onCustom:t.onCustom};f.push(Qe(v,{definition:u.card,locale:t.locale??i?.navigator.language??"en",appearance:l(),variables:u.variables??{}},k)),b.addEventListener("click",_=>{_.composedPath().some(M=>M instanceof HTMLElement&&M.tagName==="BUTTON")||m(u,u.deep_link)})}else{b.className=`item ${u.read_at?"":"unread"}`;let v=s.createElement("span");if(v.className="dot",b.append(v),u.image?.startsWith("https://")){let _=s.createElement("img");_.src=u.image,_.alt="",b.append(_)}let k=s.createElement("div");k.className="text";for(let[_,M]of[["title",u.title],["body",u.body],["when",p(u.created_at)]]){if(!M)continue;let Se=s.createElement("span");Se.className=_,Se.textContent=M,k.append(Se)}b.append(k,C),b.addEventListener("click",()=>m(u,u.deep_link))}return b.addEventListener("keydown",v=>{v.key==="Enter"&&v.target===b&&m(u,u.deep_link)}),b},R=0,U=async()=>{let u=++R;if(!(await this.session.session())?.userId){if(g||u!==R)return;d=[],S(0),y();return}let b=await this.list({limit:t.limit??50,locale:t.locale});g||u!==R||(d=b.items,S(b.unread),y())},W=()=>{s.visibilityState==="visible"&&U().catch(()=>{})};s.addEventListener("visibilitychange",W);let ke=this.session.onChange(()=>{U().catch(()=>{})});return y(),U().catch(()=>{}),{refresh:U,get items(){return d},get unread(){return c},destroy(){g=!0,s.removeEventListener("visibilitychange",W),ke?.(),f.forEach(u=>u.destroy()),n.remove()}}}};var Ps=30*6e4,re="session_start";function ae(r){try{return r.localStorage}catch{return}}var xs=()=>globalThis.crypto?.randomUUID?globalThis.crypto.randomUUID():`${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`;function Ts(r,e){for(let[t,s]of Object.entries(r??{})){let i=e?.[t];if(i==null||String(i)!==s)return!1}return!0}var oe=class{api;session;installation;g;now;requestPush;analyticsAllowed;purchases;asked=0;person=0;sessionKey;pendingKey;opts;messages=[];limits={per_session:1,per_day:3,min_minutes:10};shown={session:0,day:0,total:0};loaded=Promise.resolve();away=!1;memorySession;memoryPending=[];showing;stopWatching;queue=Promise.resolve();constructor(e,t,s,i,n,a,o,l=globalThis,d=Date.now){this.api=$.client({send:c=>e.send({...c,headers:{...c.headers,[E]:O(s)}})}),this.session=t,this.installation=s,this.requestPush=n,this.analyticsAllowed=a,this.purchases=o,this.g=l,this.now=d,this.sessionKey=`palbase.notify.inapp.session.${i}`,this.pendingKey=`palbase.notify.inapp.conversions.${i}`,t.onChange(c=>{c!=="SIGNED_IN"&&c!=="SIGNED_OUT"&&c!=="SESSION_EXPIRED"||(this.forget(),this.opts&&(this.showing?.message.close(),this.loaded=this.load()))})}get started(){return this.opts!==void 0}start(e={}){let t=!this.opts;if(this.opts=e,!t)return;let s=this.g.document,i=()=>{s?.visibilityState==="visible"?this.enqueue(re,void 0,!0):this.away=!0};s?.addEventListener("visibilitychange",i),this.stopWatching=()=>s?.removeEventListener("visibilitychange",i);let n=this.touch();this.loaded=this.load(),n&&this.trigger(re)}stop(){this.opts=void 0,this.stopWatching?.(),this.stopWatching=void 0,this.showing?.message.close()}refresh(){return this.loaded=this.load(),this.loaded}trigger(e,t){this.enqueue(e,t,!1)}settled(){return this.queue}enqueue(e,t,s){this.queue=this.queue.then(()=>this.take(e,t,s)).catch(()=>{})}async take(e,t,s){if(await this.converted(e),!!this.opts){if(this.touch())this.loaded=this.load(),e!==re&&await this.show(re,void 0);else if(this.away&&(this.loaded=this.load()),s)return;await this.show(e,t)}}async show(e,t){if(await this.loaded,!(!this.opts||this.showing)){for(let s of this.messages)if(!(s.trigger.event!==e||!Ts(s.trigger.where,t)||this.capped(s))&&await this.open(s))return}}capped(e){let t=this.now(),s=(o,l)=>o!==void 0&&l!==void 0&&t-Date.parse(o)<l*6e4,i=this.shown,n=e.shown,a=e.limits;return i.session>=this.limits.per_session||i.day>=this.limits.per_day||s(i.last_at,this.limits.min_minutes)||a.per_session!==void 0&&n.session>=a.per_session||a.per_day!==void 0&&n.day>=a.per_day||s(n.last_at,a.min_minutes)||a.max_total!==void 0&&n.total>=a.max_total}async open(e){let t=this.opts,s=this.person,i=await this.subject(),n,a;try{({id:n,variables:a}=(await this.api.showInAppMessage({body:{campaign_id:e.campaign_id,session_id:this.sessionId(),installation_id:this.installation.id}})).data)}catch(c){return c instanceof w&&c.status===409&&(this.loaded=this.load()),!1}if(!this.opts||this.showing||s!==this.person)return!0;let o=new Date(this.now()).toISOString();for(let c of[this.shown,e.shown])c.session++,c.day++,c.total++,c.last_at=o;e.conversion&&this.pend({impression:n,campaign:e.campaign_id,event:e.conversion.event,until:this.now()+e.conversion.hours*36e5,subject:i});let l=(c,f)=>{this.api.reportInAppEvent({path:{id:n},query:{installation_id:this.installation.id},body:{type:c,...f?{action:f}:{}}}).catch(()=>{})},d=et({definition:e.definition,locale:t.locale??this.g.navigator?.language??"en",appearance:t.appearance??this.appearance(),variables:{...e.variables,...a}},{onAction:c=>{c.type!=="close"&&c.type!=="sheet"&&l("clicked",c.type)},onLink:t.onLink,onDeepLink:t.onDeepLink,onCustom:t.onCustom,onShowPaywall:t.onShowPaywall,onOffer:t.onOffer??(c=>this.takeOffer(c,t.onOfferError)),onRequestPush:t.onRequestPush??(()=>this.requestPush().then(()=>{})),labels:t.labels,onClose:c=>{this.showing?.message===d&&(this.showing=void 0),c!=="action"&&c!=="app"&&l("dismissed"),t.onClose?.(e.campaign_id,c)}},t.root?{root:t.root}:{});return this.showing={campaign:e.campaign_id,message:d},t.onShow?.(e.campaign_id),!0}async takeOffer(e,t){try{let s=(await this.purchases.offers()).find(o=>o.key===e);if(s?.kind==="grant"){await this.purchases.claimOffer(e);return}let i=s?.web?.plans[0];if(!s?.product||i===void 0)throw new w({op:"TakeOffer",status:0,code:"offer_not_open",message:`the offer ${e} is not the customer's to take on the web now`});let n=this.g.location,a=await this.purchases.checkout({product:s.product,plan:i,successUrl:n.href,cancelUrl:n.href,offer:e});n.assign(a)}catch(s){if(!t)throw s;t(s,e)}}async converted(e){let t=this.now(),s=this.pending().filter(a=>a.until>t),i=await this.subject(),n=this.analyticsAllowed()?s.filter(a=>a.event===e&&a.subject===i):[];this.keepPending(s.filter(a=>!n.includes(a))),await Promise.all(n.map(a=>this.api.reportInAppEvent({path:{id:a.impression},query:{installation_id:this.installation.id},body:{type:"converted"}}).catch(()=>{})))}forget(){this.person++,this.asked++,this.messages=[],this.shown={session:0,day:0,total:0}}async load(){this.away=!1;let e=++this.asked;try{let t=(await this.api.listMyInAppMessages({query:{session_id:this.sessionId(!1),installation_id:this.installation.id}})).data;if(e!==this.asked)return;this.messages=t.messages,this.limits=t.limits,this.shown=t.shown}catch{}}async subject(){let e=(await this.session.session())?.userId;return e?`u:${e}`:`i:${this.installation.id}`}appearance(){return this.g.matchMedia?.("(prefers-color-scheme: dark)").matches?"dark":"light"}touch(){let e=this.now(),t=this.readSession(),s=!t||e-t.last>=Ps;return this.writeSession(s?{id:`ses_${xs()}`,last:e}:{id:t.id,last:e}),s}sessionId(e=!0){return e&&this.touch(),(this.readSession()??this.memorySession).id}readSession(){try{let e=ae(this.g)?.getItem(this.sessionKey);if(e)return JSON.parse(e)}catch{}return this.memorySession}writeSession(e){this.memorySession=e;try{ae(this.g)?.setItem(this.sessionKey,JSON.stringify(e))}catch{}}pending(){try{let e=ae(this.g)?.getItem(this.pendingKey);if(e)return JSON.parse(e)}catch{}return this.memoryPending}keepPending(e){this.memoryPending=e;try{let t=ae(this.g);e.length?t?.setItem(this.pendingKey,JSON.stringify(e)):t?.removeItem(this.pendingKey)}catch{}}pend(e){this.keepPending([...this.pending().filter(t=>t.until>this.now()),e].slice(-50))}};var Ie=r=>{let e=r.replace(/-/g,"+").replace(/_/g,"/").padEnd(Math.ceil(r.length/4)*4,"="),t=atob(e),s=new Uint8Array(t.length);for(let i=0;i<t.length;i++)s[i]=t.charCodeAt(i);return s},Re=class{api;session;installation;baseUrl;publishableKey;g;registered;generation=0;wake=()=>{};replacing;changing=Promise.resolve();constructor(e,t,s,i,n,a=globalThis){this.api=$.client(e),this.session=t,this.installation=s,this.baseUrl=i,this.publishableKey=n,this.g=a,t.onChange(o=>{if(o==="SIGNED_IN"||o==="SIGNED_OUT"||o==="SESSION_EXPIRED"){this.registered=void 0;let l=++this.generation;this.wake(),this.changing=this.changing.then(()=>this.registerFor(l)).catch(()=>{})}})}supported(){return!!this.g.navigator?.serviceWorker&&this.g.PushManager!==void 0&&this.g.Notification!==void 0}permission(){return this.supported()?this.g.Notification.permission:"unsupported"}workerUrl(e="/palbase-sw.js"){let t=new URLSearchParams({url:this.baseUrl,key:this.publishableKey});return`${e}${e.includes("?")?"&":"?"}${t}`}async subscribe(e={}){if(!this.supported())return!1;let t=this.g.Notification;if(t.permission==="default"&&await t.requestPermission()!=="granted"||t.permission==="denied")return!1;let s=this.g.navigator.serviceWorker,i=this.workerUrl(e.serviceWorker),n=await this.scopeFor(s,i,e.scope),a=await s.register(i,n?{scope:n}:void 0);await Ms(a);let o=await a.pushManager.getSubscription(),l=(await this.api.getWebPushKey()).data.public_key;o&&!Cs(o.options.applicationServerKey,l)&&(await o.unsubscribe(),o=null),o??=await a.pushManager.subscribe({userVisibleOnly:!0,applicationServerKey:Ie(l)});let d=this.generation;return await this.register(o),this.generation===d&&this.supersede(),!0}async unsubscribe(){this.supersede(),await this.changing;let e=await this.current();e&&await e.unsubscribe(),this.registered=void 0}supersede(){++this.generation,this.replacing=void 0,this.wake()}async refresh(){if(!this.supported()||this.permission()!=="granted")return;let e=await this.current();e&&await this.register(e)}async registerFor(e){if(e===this.generation){if(!this.replacing){try{return await this.refresh()}catch{}let t=await(await this.ours())?.pushManager.getSubscription();if(!t)return;this.replacing={key:t.options.applicationServerKey},await t.unsubscribe()}for(let t of[0,...Tt]){if(t>0&&await this.pause(t),e!==this.generation||this.permission()!=="granted")return;try{let s=await this.ours();if(!s)return void(this.replacing=void 0);let i=this.replacing?.key??Ie((await this.api.getWebPushKey()).data.public_key),n=await s.pushManager.getSubscription()??await s.pushManager.subscribe({userVisibleOnly:!0,applicationServerKey:i});if(e!==this.generation)return;await this.register(n),this.replacing=void 0;return}catch(s){if(t===Tt.at(-1))throw s}}}}pause(e){return new Promise(t=>{let s=setTimeout(i,e);function i(){clearTimeout(s),t()}this.wake=i})}async ours(){let e=this.g.navigator?.serviceWorker;if(e)return(await e.getRegistrations()).find(t=>this.isOurs(t))}isOurs(e){let t=Mt(e)?.searchParams.get("key");return!!t&&Ce(t)!==void 0&&Ce(t)===Ce(this.publishableKey)}async current(){return await(await this.ours())?.pushManager.getSubscription()??null}async scopeFor(e,t,s){let i=this.g.location?.href;if(!i)return s;let n=new URL("./",new URL(t,i)).href,a=s===void 0?n:new URL(s,i).href,o=(await e.getRegistrations()).find(d=>d.scope===a);if(!o||this.isOurs(o))return s;let l=Mt(o);if(s!==void 0)throw new Error(`pb.notify.push.subscribe: ${a} is the scope of another service worker (${l?.href??"unknown"}); registering Palbase's there would replace it \u2014 give Palbase's a scope of its own`);return new URL("palbase-push/",n).href}async register(e){let t=e.toJSON(),s={endpoint:t.endpoint??e.endpoint,keys:{p256dh:t.keys?.p256dh??"",auth:t.keys?.auth??""}},n=`${this.session.snapshot()?.userId??""}|${s.endpoint}`;this.registered!==n&&(await this.api.registerDevice({headers:{[E]:O(this.installation)},body:{device_id:`web-${this.installation.id}`,token:JSON.stringify(s),platform:"web",locale:this.g.navigator?.language??null,installation_id:this.installation.id,timezone:Intl.DateTimeFormat().resolvedOptions().timeZone}}),this.registered=n)}},Tt=[1e3,5e3,3e4,12e4,6e5];async function Ms(r){let e=r.installing??r.waiting;!e||r.active||await new Promise(t=>{let s=()=>{e.state!=="activated"&&e.state!=="redundant"||(e.removeEventListener("statechange",s),t())};e.addEventListener("statechange",s),s()})}function Ce(r){let e=r.split("_");return e.length>=3&&e[0]==="pb"&&e[1]!==""?e[1]:void 0}function Mt(r){let e=(r.installing??r.waiting??r.active)?.scriptURL;return e?new URL(e):void 0}function Cs(r,e){if(!r)return!1;let t=new Uint8Array(r),s=Ie(e);return t.length===s.length&&t.every((i,n)=>i===s[n])}var le=class{push;inbox;inApp;constructor(e,t,s,i,n,a,o){this.push=new Re(e,t,s,a,o),this.inbox=new ne(e,t),this.inApp=new oe(e,t,s,new URL(a).origin,()=>this.push.subscribe(),()=>i.state("analytics")==="granted",n)}};var de=class{api;session;socket;ref;fetch;appVersion;app;listeners=new Set;watch;following;last;constructor(e,t,s,i,n,a,o){this.api=ze.client(e),this.session=t,this.socket=s,this.ref=i,this.fetch=n,this.appVersion=a,this.app=o}async me(){let e=this.session.snapshot()?.userId,t=(await this.api.getMyCustomerInfo()).data;return this.watch&&this.watch.userId===e&&this.offer(this.watch,t),t}async offerings(e="web"){return(await this.api.getOfferings({query:{channel:e}})).data}async paywall(e,t={}){return nt(this.api,this.ref,e,s=>this.checkout(s),{signal:t.signal,fetch:this.fetch,attributes:t.attributes,locale:t.locale,appVersion:this.appVersion,app:this.app})}async checkout(e){let t={product:e.product,plan:e.plan,success_url:e.successUrl,cancel_url:e.cancelUrl,source:e.source,...e.offer!==void 0?{offer:e.offer}:{}},s=(await this.api.createCheckout({body:t})).data;return s.redemption_key&&Rs(this.keyName(s.session_id),s.redemption_key),s.url}async redemptionLink(e,t={}){let s=t.key??Es(this.keyName(e));if(!s)throw new w({op:"CreateCheckoutRedemption",status:0,code:"redemption_key_missing",message:"no redemption key for this checkout in this tab: the link was sent to the buyer's email"});let i=Date.now()+(t.waitSeconds??20)*1e3;for(;;)try{return(await this.api.createCheckoutRedemption({body:{session_id:e,key:s},signal:t.signal})).data}catch(n){let a=(n instanceof w&&n.code==="checkout_not_paid"?n.retryAfter??2:-1)*1e3;if(a<0||Date.now()+a>i)throw n;await Os(a,t.signal)}}async redeem(e){let t=Is(e);if(!t)throw new w({op:"RedeemPurchase",status:0,code:"invalid_redemption_link",message:"not a redemption link: <scheme>://palbase/redeem?token=\u2026 or \u2026/purchases/redeem?token=\u2026"});let s=this.session.snapshot()?.userId,i=(await this.api.redeemPurchase({body:{token:t}})).data;return this.watch&&this.watch.userId===s&&this.offer(this.watch,i),i}async offers(){return(await this.api.listMyOffers()).data.offers}async offerShown(e){await this.api.recordOfferView({path:{offer_key:e}})}async claimOffer(e){return(await this.api.claimOffer({path:{offer_key:e}})).data}async redeemCoupon(e){return(await this.api.redeemCoupon({body:{code:e}})).data}async portal(e){return(await this.api.createPortalSession({body:{return_url:e}})).data.url}async mergeGrant(){return(await this.api.createMergeGrant()).data}async merge(e){let t=this.session.snapshot()?.userId,s=(await this.api.mergeGuest({body:{grant:typeof e=="string"?e:e.grant}})).data;return this.watch&&this.watch.userId===t&&this.offer(this.watch,s),s}async setRefundDataConsent(e){return(await this.api.setRefundDataConsent({body:{consented:e}})).data}keyName(e){return`palbase:${this.ref}:redemption:${e}`}onCustomerInfo(e){if(this.listeners.add(e),this.listeners.size===1)this.start();else if(this.last!==void 0){let t=this.last;queueMicrotask(()=>this.listeners.has(e)&&Ct(e,t))}return()=>{this.listeners.delete(e)&&this.listeners.size===0&&this.stop()}}start(){this.following=this.session.onChange((e,t)=>{(e==="SIGNED_IN"||e==="SIGNED_OUT"||e==="SESSION_EXPIRED")&&this.follow(t)}),this.session.session().then(e=>{this.following&&!this.watch&&this.last===void 0&&this.follow(e)})}stop(){this.following?.(),this.following=void 0,this.unfollow(),this.last=void 0}follow(e){if(this.unfollow(),!e){this.tell(null);return}let t=this.socket.channel(`purchases:${this.ref}:${e.userId}`),s={userId:e.userId,channel:t,off:()=>{},revision:-1,reading:!1,wanted:Number.NEGATIVE_INFINITY},i=[t.on("broadcast",n=>{n.event==="changed"&&this.changed(s,Ee(n.payload))}),t.on("state_snapshot",n=>this.held(s,Ee(It(n.entries)))),t.on("state_diff",n=>this.held(s,Ee(It(n.set))))];s.off=()=>i.forEach(n=>n()),this.watch=s,t.join().catch(()=>{}),this.read(s)}unfollow(){let e=this.watch;e&&(this.watch=void 0,e.off(),e.channel.leave())}changed(e,t){this.watch!==e||t!==void 0&&t<=e.revision||(e.reading?e.wanted=Math.max(e.wanted,t??Number.POSITIVE_INFINITY):this.read(e))}held(e,t){t!==void 0&&this.changed(e,t)}async read(e){e.reading=!0;try{for(;;){e.wanted=Number.NEGATIVE_INFINITY;try{let t=(await this.api.getMyCustomerInfo()).data;if(this.watch!==e)return;this.offer(e,t)}catch{}if(this.watch!==e||e.wanted<=e.revision)return}}finally{e.reading=!1}}offer(e,t){this.watch!==e||t.revision<=e.revision||(e.revision=t.revision,this.tell(t))}tell(e){if(!(this.last===null&&e===null)){this.last=e;for(let t of[...this.listeners])Ct(t,e)}}};function Ct(r,e){try{r(e)}catch{}}function It(r){let e=typeof r=="object"&&r!==null?r.revision:void 0;return typeof e=="object"&&e!==null?e.v:void 0}function Ee(r){let e=typeof r=="object"&&r!==null?r.revision:void 0;return typeof e=="number"&&Number.isFinite(e)?e:void 0}var Rt=/^[A-Za-z0-9_-]{43}$/;function Is(r){let e=r.trim();if(Rt.test(e))return e;let t;try{t=new URL(e)}catch{return}let s=t.host==="palbase"&&t.pathname==="/redeem",i=(t.protocol==="https:"||t.protocol==="http:")&&t.pathname==="/purchases/redeem",n=t.searchParams.get("token");return(s||i)&&n!==null&&Rt.test(n)?n:void 0}function Rs(r,e){try{globalThis.sessionStorage?.setItem(r,e)}catch{}}function Es(r){try{return globalThis.sessionStorage?.getItem(r)??void 0}catch{return}}function Os(r,e){return new Promise((t,s)=>{if(e?.aborted)return s(e.reason);let i=setTimeout(()=>{e?.removeEventListener("abort",n),t()},r),n=()=>{clearTimeout(i),s(e?.reason)};e?.addEventListener("abort",n,{once:!0})})}var ce=class{api;session;socket;installation;ref;analytics;appVersion;storageKey;held;listeners=new Set;started;leave=[];running;queued;fresh=!0;constructor(e,t,s,i,n,a,o,l){this.api=Je.client(e),this.session=t,this.socket=s,this.installation=i,this.ref=n,this.analytics=o,this.appVersion=l,this.storageKey=`palbase.flags.${a}`,this.held=As(this.storageKey)}value(e){let t=this.mine();if(!t||!Object.hasOwn(t.values,e))return;let s=t.experiments[e];return s&&this.analytics.captureOnce(`$flag_exposure:${e}:${s.experiment_id}`,"$flag_exposure",{flag:e,experiment:s.experiment_id,variant:s.variant}),t.values[e]}bool(e,t){let s=this.value(e);return typeof s=="boolean"?s:t}string(e,t){let s=this.value(e);return typeof s=="string"?s:t}number(e,t){let s=this.value(e);return typeof s=="number"&&Number.isFinite(s)?s:t}json(e,t){let s=this.value(e);return typeof s=="object"&&s!==null?s:t}all(){return{...this.mine()?.values}}source(e){return this.mine()?.sources[e]}get version(){return this.mine()?.syncVersion}onChange(e){return this.listeners.add(e),this.start(),()=>{this.listeners.delete(e)}}refresh(){return this.started?this.read():this.start()}mine(){this.start();let e=this.held;return e&&e.user===(this.session.snapshot()?.userId??null)?e:void 0}start(){if(this.started)return this.started;this.session.onChange((t,s)=>{(t==="SIGNED_IN"||t==="SIGNED_OUT"||t==="SESSION_EXPIRED")&&this.follow(s).catch(()=>{})});let e=this.session.session().then(t=>this.follow(t));return e.catch(()=>{}),this.started=e,e}follow(e){let t=e?.userId??null;if(this.held&&this.held.user!==t){let s=Object.keys(this.held.values);this.held=void 0,Et(this.storageKey,void 0),this.tell(s)}return this.join(t),this.fresh=!0,this.read()}join(e){for(let s of this.leave.splice(0))s();let t=[`flags:${this.ref}`,...e!==null?[`flags:${this.ref}:${e}`]:[]];for(let s of t){let i=this.socket.channel(s),n=[i.on("broadcast",a=>{a.event==="changed"&&this.changed(Oe(a.payload))}),i.on("state_snapshot",a=>this.changed(Oe(Ot(a.entries)))),i.on("state_diff",a=>this.changed(Oe(Ot(a.set))))];i.join().catch(()=>{}),this.leave.push(()=>{n.forEach(a=>a()),i.leave()})}}changed(e){if(e===void 0)return;let t=this.mine();t&&Number(t.syncVersion)>=e||this.read().catch(()=>{})}read(){if(this.queued)return this.queued;let e=(this.running??Promise.resolve()).catch(()=>{}).then(()=>(this.queued=void 0,this.fetch()));this.queued=e,this.running=e;let t=()=>{this.running===e&&(this.running=void 0)};return e.then(t,t),e}async fetch(){let e=(await this.session.session())?.userId??null,t=this.held?.user===e?this.held:void 0,s=this.headers(e,t?.etag);if(t&&!this.fresh)try{let d=await this.api.getDelta({query:{since:Number(t.syncVersion)},headers:s});if(d.status===304)return;let c={...t,values:{...t.values},sources:{...t.sources},experiments:{...t.experiments},syncVersion:d.data.sync_version,etag:d.headers.get("etag")??t.etag},f=new Set;for(let g of d.data.ops)f.add(g.key),g.op==="delete"?(delete c.values[g.key],delete c.sources[g.key],delete c.experiments[g.key]):(c.values[g.key]=g.value??null,c.sources[g.key]=g.source,g.experiment?c.experiments[g.key]=g.experiment:delete c.experiments[g.key]);this.apply(c,[...f]);return}catch(d){if(!(d instanceof w&&d.status===410))throw d}let i=await this.api.getSnapshot({headers:s});if(this.fresh=!1,i.status===304)return;let n=i.data,a={user:e,values:n.values,sources:n.sources,experiments:n.experiments??{},syncVersion:n.sync_version,contextHash:n.context_hash,etag:i.headers.get("etag")??void 0},o=t?.values??{},l=[...new Set([...Object.keys(o),...Object.keys(a.values)])].filter(d=>JSON.stringify(o[d])!==JSON.stringify(a.values[d]));this.apply(a,l)}headers(e,t){return{"X-Platform":"web",...this.appVersion?{"X-Palbase-Client-Version":this.appVersion}:{},[Y]:this.installation.id,...e===null?{[E]:O(this.installation)}:{},...t?{"If-None-Match":t}:{}}}apply(e,t){if(e.user!==(this.session.snapshot()?.userId??null))return;let s=this.held?.user===e.user?this.held:void 0;s&&!(Number(e.syncVersion)>Number(s.syncVersion)||e.syncVersion===s.syncVersion&&e.contextHash!==s.contextHash)||(this.held=e,Et(this.storageKey,e),t.length>0&&this.tell(t))}tell(e){for(let t of[...this.listeners])try{t(e)}catch{}}};function Ae(){try{return globalThis.localStorage}catch{return}}function As(r){try{let e=Ae()?.getItem(r);if(!e)return;let t=JSON.parse(e);return typeof t!="object"||t===null||typeof t.values!="object"||t.values===null||typeof t.syncVersion!="string"?void 0:{user:typeof t.user=="string"?t.user:null,values:t.values,sources:t.sources??{},experiments:t.experiments??{},syncVersion:t.syncVersion,contextHash:t.contextHash??"",...typeof t.etag=="string"?{etag:t.etag}:{}}}catch{return}}function Et(r,e){try{e?Ae()?.setItem(r,JSON.stringify(e)):Ae()?.removeItem(r)}catch{}}function Ot(r){let e=typeof r=="object"&&r!==null?r.sync_version:void 0;return typeof e=="object"&&e!==null?e.v:void 0}function Oe(r){let e=typeof r=="object"&&r!==null?r.sync_version:void 0;return typeof e=="number"&&Number.isFinite(e)?e:void 0}var he=class{items=new Map;add(e,t,s){let i={clientMessageId:t.client_message_id,conversationId:e,request:t,state:"pending",attempts:0,error:null,createdAt:s};return this.items.set(i.clientMessageId,i),i}get(e){return this.items.get(e)}all(e){return[...this.items.values()].filter(t=>!e||t.conversationId===e).sort((t,s)=>t.createdAt<s.createdAt?-1:t.createdAt>s.createdAt?1:0)}settle(e,t){return e.sender_id!==t||!e.client_message_id?!1:this.items.delete(e.client_message_id)}retry(e){let t=this.items.get(e);t&&t.state==="failed"&&Object.assign(t,{state:"pending",error:null})}discard(e){return this.items.delete(e)}async flush(e,t){let s=new Map;for(let n of this.all())n.state!=="failed"&&s.set(n.conversationId,[...s.get(n.conversationId)??[],n]);let i=!1;return await Promise.all([...s.values()].map(async n=>{for(let a of n){if(!this.items.has(a.clientMessageId))continue;a.state="sending",a.attempts++;let o;try{o=await e(a)}catch{o={kind:"wait"}}if(o.kind==="wait"){this.items.has(a.clientMessageId)&&(a.state="pending"),i=this.items.has(a.clientMessageId),t(a,o);return}o.kind==="refused"?Object.assign(a,{state:"failed",error:o.code}):this.items.delete(a.clientMessageId),t(a,o)}})),i}save(){return this.all().map(e=>({...e,state:e.state==="sending"?"pending":e.state}))}load(e){this.items.clear();for(let t of e)this.items.set(t.clientMessageId,{...t,state:t.state==="sending"?"pending":t.state})}};function De(r,e){if(r===200||r===201)return{kind:"sent",message:e};if(r===202)return{kind:"scheduled",scheduled:e};if(r<400||r>=500||r===408||r===429)return{kind:"wait"};let t=e?.error;return{kind:"refused",code:typeof t=="string"?t:`http_${r}`}}function At(){return{list:!1,conversations:new Set,threads:new Set,scheduled:!1}}var ue=class{reader;cursor=null;conversations=new Map;members=new Map;messages=new Map;threads=new Map;scheduled=new Map;deleted=new Map;constructor(e){this.reader=e}apply(e){let t=At();for(let s of e.removed_conversations??[])this.removed(s,t);for(let s of e.conversations??[])this.putConversation(s,t);for(let s of e.members??[])this.putMember(s,t);for(let s of e.messages??[])this.putMessage(s,t);for(let s of e.hidden??[])this.messages.get(s.conversation_id)?.delete(s.message_id)&&t.conversations.add(s.conversation_id),this.threads.delete(s.message_id)&&t.threads.add(s.message_id);for(let s of e.threads??[])this.putThread(s,t);for(let s of e.scheduled??[])this.putScheduled(s,t);return t}reset(e){this.conversations.clear(),this.members.clear(),this.messages.clear(),this.threads.clear(),this.scheduled.clear();let t=this.apply(e);return t.list=!0,t.scheduled=!0,t}removed(e,t){if(e.reportable_until){let s=e.conversation_id,i=this.conversations.get(s)?.title??this.deleted.get(s)?.title??null;this.deleted.set(s,{id:s,title:i,deletedBy:e.deleted_by??null,reportableUntil:e.reportable_until})}this.drop(e.conversation_id,t)}drop(e,t){this.conversations.delete(e),this.members.delete(e),this.messages.delete(e);for(let[s,i]of this.threads)i.conversation_id===e&&this.threads.delete(s);t.list=!0,t.conversations.add(e)}putConversation(e,t){let s=this.conversations.get(e.id);if(e.deleted){this.drop(e.id,t);return}let i=s?.me&&e.me&&e.me.read_seq<s.me.read_seq?this.readTo(e,e.me,s.me.read_seq):e.me,n=s&&!Ds(i,s.me)?s.me:i,a={...e,me:n};if(s){if(e.version<s.version){if(n===s.me)return;a={...s,me:n}}else if(e.version===s.version&&Ls(Dt(a),s))return}e.gap&&this.messages.delete(e.id);for(let o of e.members??[])this.putMember(o,t);this.conversations.set(e.id,Dt(a)),t.list=!0,t.conversations.add(e.id)}putMember(e,t){let s=this.members.get(e.conversation_id);s||(s=new Map,this.members.set(e.conversation_id,s));let i=s.get(e.user_id),n=e;if(i){if(e.version<i.version)return;if(e.version===i.version){let a=Ns(i.read_seq,e.read_seq);if(a===i.read_seq&&e.delivered_seq<=i.delivered_seq)return;n={...i,read_seq:a,delivered_seq:Math.max(i.delivered_seq,e.delivered_seq)}}}s.set(e.user_id,n),t.conversations.add(e.conversation_id)}putMessage(e,t){let s=this.messages.get(e.conversation_id);s||(s=new Map,this.messages.set(e.conversation_id,s));let i=s.get(e.id);i&&e.version<=i.version||(s.set(e.id,e),t.conversations.add(e.conversation_id),e.thread_id&&t.threads.add(e.thread_id),(e.reply_count>0||i?.reply_count)&&t.threads.add(e.id),t.list=!0)}putThread(e,t){let s=this.threads.get(e.thread_id),i=s&&e.read_seq<s.read_seq?this.threadReadTo(e,s.read_seq):e;s&&i.version<=s.version&&i.unread_count===s.unread_count||(this.threads.set(e.thread_id,i),t.threads.add(e.thread_id))}putScheduled(e,t){let s=this.scheduled.get(e.id);s&&e.version<=s.version||(e.state==="scheduled"?this.scheduled.set(e.id,e):this.scheduled.delete(e.id),t.scheduled=!0)}read(e,t,s){let i=At(),n=this.conversations.get(e),a=n?Math.min(t,n.me?.left_seq??n.last_seq):t;if(s!==void 0){let o=this.threads.get(s);return!o||a<=o.read_seq||(this.threads.set(s,this.threadReadTo(o,a)),i.threads.add(s)),i}return!n?.me||a<=n.me.read_seq||(this.conversations.set(e,{...n,me:this.readTo(n,n.me,a)}),i.list=!0,i.conversations.add(e)),i}readTo(e,t,s){let i=t.left_seq??e.last_seq;if(s>=i)return{...t,read_seq:s,unread_count:0};let n=Math.max(t.read_seq,t.cleared_seq,t.joined_seq),a=this.timeline(e.id).filter(o=>o.seq>n&&o.seq<=s&&o.sender_id!==this.reader&&o.kind!=="system"&&o.kind!=="call"&&!o.deleted).length;return{...t,read_seq:s,unread_count:Math.max(0,t.unread_count-a)}}threadReadTo(e,t){let s=this.answers(e.conversation_id,e.thread_id).filter(i=>i.seq>e.read_seq&&i.seq<=t&&i.sender_id!==this.reader&&!i.deleted).length;return{...e,read_seq:t,unread_count:Math.max(0,e.unread_count-s)}}expire(e,t){return this.messages.get(e)?.delete(t)??!1}list(){return[...this.conversations.values()].sort(Us)}timeline(e){return[...this.messages.get(e)?.values()??[]].filter(t=>!t.thread_id||t.also_in_conversation).sort((t,s)=>t.seq-s.seq)}answers(e,t){return[...this.messages.get(e)?.values()??[]].filter(s=>s.thread_id===t).sort((s,i)=>s.seq-i.seq)}deletedGroups(e){for(let[t,s]of this.deleted)Date.parse(s.reportableUntil)<=e&&this.deleted.delete(t);return[...this.deleted.values()].sort((t,s)=>Date.parse(s.reportableUntil)-Date.parse(t.reportableUntil)||(t.id<s.id?-1:t.id>s.id?1:0))}membersOf(e){return[...this.members.get(e)?.values()??[]].sort((t,s)=>t.user_id<s.user_id?-1:t.user_id>s.user_id?1:0)}snapshot(){return{cursor:this.cursor,conversations:[...this.conversations.values()],members:[...this.members.values()].flatMap(e=>[...e.values()]),messages:[...this.messages.values()].flatMap(e=>[...e.values()]),threads:[...this.threads.values()],scheduled:[...this.scheduled.values()],deleted:[...this.deleted.values()]}}load(e){this.reset({conversations:e.conversations,members:e.members,messages:e.messages,threads:e.threads,scheduled:e.scheduled}),this.cursor=e.cursor,this.deleted.clear();for(let t of e.deleted??[])this.deleted.set(t.id,t)}};function Ds(r,e){return r?e?r.version!==e.version?r.version>e.version:r.read_seq!==e.read_seq?r.read_seq>e.read_seq:r.unread_count!==e.unread_count||r.delivered_seq>e.delivered_seq:!0:!1}function Ns(r,e){return r===null?e:e===null?r:Math.max(r,e)}function Us(r,e){let t=r.last_message_at??r.created_at,s=e.last_message_at??e.created_at;return t!==s?t<s?1:-1:r.id<e.id?1:-1}function Dt(r){let{members:e,gap:t,...s}=r;return s}function Ls(r,e){return JSON.stringify(r)===JSON.stringify(e)}var pe=class{store;outbox=new he;me;now;constructor(e,t=Date.now){this.me=e,this.now=t,this.store=new ue(e)}apply(e){return this.settled(e,this.store.apply(e))}reset(e){return this.settled(e,this.store.reset(e))}settled(e,t){for(let s of e.messages??[])this.outbox.settle(s,this.me)&&t.conversations.add(s.conversation_id);return t}write(e,t,s){return this.outbox.add(e,t,s)}read(e,t,s){let i=t??(s?Math.max(0,...this.store.answers(e,s).map(n=>n.seq)):this.store.conversations.get(e)?.last_seq??0);return{upTo:i,touched:this.store.read(e,i,s)}}sent(e){return e.kind==="sent"?this.apply({messages:[e.message]}):e.kind==="scheduled"?this.apply({scheduled:[e.scheduled]}):null}timeline(e){return this.entries(this.store.timeline(e),this.outbox.all(e).filter(t=>!t.request.thread_id||t.request.also_in_conversation))}answers(e,t){return this.entries(this.store.answers(e,t),this.outbox.all(e).filter(s=>s.request.thread_id===t))}entries(e,t){let s=new Set(e.filter(i=>i.sender_id===this.me&&i.client_message_id).map(i=>i.client_message_id));return[...e.map(i=>({kind:"message",message:i})),...t.filter(i=>!s.has(i.clientMessageId)&&!i.request.send_at).map(i=>({kind:"pending",item:i}))]}deletedGroups(){return this.store.deletedGroups(this.now())}kept(){return{store:this.store.snapshot(),outbox:this.outbox.save()}}load(e){this.store.load(e.store),this.outbox.load(e.outbox)}};function fe(){let r=globalThis.crypto?.subtle;if(!r)throw new Error("messaging: this platform has no WebCrypto to encrypt files with");return r}function qs(r){let e="";for(let t of r)e+=String.fromCharCode(t);return btoa(e).replaceAll("+","-").replaceAll("/","_").replace(/=+$/,"")}function js(r){let e=atob(r.replaceAll("-","+").replaceAll("_","/")+"=".repeat((4-r.length%4)%4)),t=new Uint8Array(e.length);for(let s=0;s<e.length;s++)t[s]=e.charCodeAt(s);return t}async function Nt(r){let e=crypto.getRandomValues(new Uint8Array(32)),t=crypto.getRandomValues(new Uint8Array(12));return{sealed:await Ks(r,e,t),fileKey:qs(e)}}async function Ks(r,e,t){let s=await fe().importKey("raw",e,"AES-GCM",!1,["encrypt"]),i=new Uint8Array(await fe().encrypt({name:"AES-GCM",iv:t},s,r)),n=new Uint8Array(1+t.length+i.length);return n[0]=1,n.set(t,1),n.set(i,1+t.length),n}async function Ut(r,e){if(r.length<29||r[0]!==1)throw new Error("messaging: not a file this SDK sealed");let t=await fe().importKey("raw",js(e),"AES-GCM",!1,["decrypt"]);return new Uint8Array(await fe().decrypt({name:"AES-GCM",iv:r.subarray(1,13)},t,r.subarray(13)))}function F(r,e){return`palbase.messaging.v1.${r}.${e}`}var ge=class{kv;constructor(e){this.kv=e}async open(e){let t=await this.kv.get(e);if(t===null)return null;try{let s=JSON.parse(t);return s.format===1?{store:s.store,outbox:s.outbox}:null}catch{return null}}async save(e,t){await this.kv.set(e,JSON.stringify({format:1,store:$s(t.store),outbox:t.outbox}))}async drop(e){await this.kv.delete(e)}async dropOthers(e,t){let s=F(e,""),i=F(e,t);for(let n of await this.kv.list())n.startsWith(s)&&n!==i&&await this.kv.delete(n)}};function $s(r){let e=new Map;for(let s of r.messages)e.set(s.conversation_id,[...e.get(s.conversation_id)??[],s]);let t=[...e.values()].flatMap(s=>s.sort((i,n)=>n.seq-i.seq).slice(0,200));return{...r,messages:t}}function Lt(){let r=new Map;return{async get(e){return r.get(e)??null},async set(e,t){r.set(e,t)},async delete(e){r.delete(e)},async list(){return[...r.keys()]},get keys(){return[...r.keys()]}}}var Vs=/[\p{Script=Han}\p{Script=Hiragana}\p{Script=Katakana}\p{Script=Thai}\p{Script=Lao}\p{Script=Khmer}\p{Script=Myanmar}]/u,Fs=/[\p{L}\p{Nd}\p{M}]/u,Ws=/\p{M}/u,Gs=/\p{Mn}/u;function Hs(r){let e=r.codePointAt(0);if(e===304||e===305||r==="I")return["i"];let t=[];for(let s of r.toLowerCase().normalize("NFD"))Gs.test(s)||t.push(s);return t}function qt(r){let e=[],t=null,s=0,i=0,n=!1;for(let a of r){let o=a.length;if(!Fs.test(a))t=null,n=!1;else if(Vs.test(a))n||(i++,n=!0),e.push({start:s,folded:[a.toLowerCase()],ends:[s+o],run:i}),t=null;else if(Ws.test(a)&&!t){let l=e.at(-1);n&&l&&(l.ends[0]=s+o)}else{n=!1,t||(t={start:s,folded:[],ends:[],run:0},e.push(t));let l=Hs(a);l.length===0&&t.ends.length>0&&(t.ends[t.ends.length-1]=s+o);for(let d of l)t.folded.push(d),t.ends.push(s+o)}s+=o}return e}function jt(r){let e=[],t=0;for(let s of r)s.run!==0&&(s.run!==t&&(e.push(""),t=s.run),e[e.length-1]+=s.folded.join(""));return e}function Kt(r){let e={words:[],runs:[]},t=new Set,s=qt(r);for(let i of s){let n=i.folded.join("");if(n!==""&&!t.has(n)&&(t.add(n),e.words.push(i.folded)),e.words.length===8)break}return e.runs=jt(s).filter(i=>[...i].length>1),e}function Bs(r,e){return e.length===1?r.folded.length===1&&r.folded[0]===e[0]:r.folded.length>=e.length&&e.every((t,s)=>r.folded[s]===t)}function $t(r,...e){let t=r.words.map(()=>!1),s=[],i=e.map(n=>{let a=qt(n);return s.push(...jt(a)),a.flatMap(o=>{let l=0;return r.words.forEach((d,c)=>{Bs(o,d)&&(t[c]=!0,l=Math.max(l,d.length))}),l>0?[{offset:o.start,length:o.ends[l-1]-o.start}]:[]})});return r.runs.every(n=>s.some(a=>a.includes(n)))&&r.words.length>0&&t.every(Boolean)?i:null}var Js=500,zs=300,Xs=2e3,Vt=6e3,Ys=3e4,Ft=[1e3,2e3,5e3,1e4,3e4],Qs=5*6e4,Zs=20,ei=5,Ne=class{conversationId;messages=new Map;earlier=null;later=null;merged=!1;constructor(e){this.conversationId=e}put(e){for(let t of e){let s=this.messages.get(t.id);(!s||t.version>s.version)&&this.messages.set(t.id,t)}}apply(e){let t=!1;for(let s of e.messages??[]){let i=this.messages.get(s.id);i&&s.version>i.version&&(this.messages.set(s.id,s),t=!0)}for(let s of e.hidden??[])this.messages.delete(s.message_id)&&(t=!0);return((e.removed_conversations??[]).some(s=>s.conversation_id===this.conversationId)||(e.conversations??[]).some(s=>s.id===this.conversationId&&s.deleted))&&(this.messages.clear(),t=!0),t}expire(e){return this.messages.delete(e)}entries(){return[...this.messages.values()].filter(e=>!e.thread_id||e.also_in_conversation).sort((e,t)=>e.seq-t.seq).map(e=>({kind:"message",message:e}))}};function ti(r="palbase.messaging"){let e=globalThis.indexedDB;if(!e)return null;let t=null,s=()=>t??=new Promise((n,a)=>{let o=e.open(r,1);o.onupgradeneeded=()=>o.result.createObjectStore("kv"),o.onsuccess=()=>n(o.result),o.onerror=()=>a(o.error)}),i=(n,a)=>s().then(o=>new Promise((l,d)=>{let c=a(o.transaction("kv",n).objectStore("kv"));c.onsuccess=()=>l(c.result),c.onerror=()=>d(c.error)}));return{get:async n=>await i("readonly",a=>a.get(n))??null,set:async(n,a)=>{await i("readwrite",o=>o.put(a,n))},delete:async n=>{await i("readwrite",a=>a.delete(n))},list:async()=>(await i("readonly",n=>n.getAllKeys())).map(String)}}var me=class{api;local;transportFor;clients=new WeakMap;user=null;engine=null;starting=null;channel=null;off=[];heard=new Set;synced=!1;syncing=null;resync=!1;flushing=null;reflush=!1;retries=0;timers={save:void 0,deliver:void 0,retry:void 0,presence:void 0,reportable:void 0};delivered=new Map;expiring=new Map;typingBy=new Map;typedAt=new Map;loaded=new Set;earlier=new Map;saving=Promise.resolve();reopeners=new Set;incoming=new Set;windows=new Set;people=new Map;session;socket;ref;fetchFn;opts;constructor(e,t,s,i,n,a,o={}){this.transportFor=t,this.session=s,this.socket=i,this.ref=n,this.fetchFn=a,this.opts=o,this.api=_e.client(e),this.local=new ge(o.storage??ti()??Lt()),s.onChange((d,c)=>{d==="SIGNED_OUT"||d==="SESSION_EXPIRED"?this.end():d==="SIGNED_IN"&&c?.userId!==this.user?this.end().then(async()=>{if(this.heard.size!==0){await this.ready();for(let f of[...this.reopeners])f()}}):d==="SIGNED_IN"&&this.engine&&this.user&&(this.unfollow(),this.follow(this.user),this.sync())});let l=globalThis;l.addEventListener?.("online",()=>this.wake()),l.document?.addEventListener?.("visibilitychange",()=>{l.document?.visibilityState==="visible"&&this.wake()})}async ready(){let e=this.session.snapshot()??await this.session.session();if(!e)throw new w({op:"messaging",status:401,code:"not_signed_in",message:"messaging is the signed-in person's: sign in first"});if(this.engine&&this.user===e.userId)return this.engine;if(this.starting&&this.user===e.userId)return this.starting;this.user=e.userId;let t=e.userId;return this.starting=(async()=>{let s=new pe(t);this.clients.set(s,_e.client(this.transportFor(t)));let i=await this.local.open(F(this.ref,t));if(this.user!==t)throw new Error("messaging: the session changed while it started");i&&s.load(i),this.engine=s;for(let n of s.store.messages.values())for(let a of n.values())this.expireAt(a);return this.expireDeleted(s),this.tell({list:!0,conversations:new Set(s.store.conversations.keys()),threads:new Set,scheduled:!0}),this.follow(t),this.opts.keepOnSignOut||this.local.dropOthers(this.ref,t).catch(()=>{}),this.sync().then(()=>this.flush()),this.presence(s),s})(),this.starting.catch(()=>{this.user===t&&(this.starting=null)}),this.starting}async end(){let e=this.user,t=this.engine;this.unfollow();for(let s of Object.values(this.timers))s&&clearTimeout(s);for(let s of this.expiring.values())clearTimeout(s);this.expiring.clear(),this.typingBy.clear(),this.delivered.clear(),this.loaded.clear(),this.earlier.clear();for(let s of this.windows)s.merged=!0;if(this.windows.clear(),this.people.clear(),this.engine=null,this.starting=null,this.user=null,this.synced=!1,e){let s=F(this.ref,e);await this.saving,this.opts.keepOnSignOut&&t?await this.local.save(s,t.kept()):await this.local.drop(s)}this.tell({list:!0,conversations:new Set,threads:new Set,scheduled:!0})}unfollow(){for(let e of this.off.splice(0))e();this.channel?.leave(),this.channel=null}follow(e){let t=this.socket.channel(`messaging:${this.ref}:${e}`);this.channel=t,this.off.push(t.on("broadcast",s=>{this.user===e&&(s.event==="changes"?this.heardLive(s.payload):s.event==="typing"&&this.typed(s.payload))}),t.onJoined(()=>{this.sync()})),t.join().catch(()=>{})}wake(){this.engine&&this.sync().then(()=>this.flush())}sync(){return this.syncing?(this.resync=!0,this.syncing):(this.syncing=(async()=>{try{do{this.resync=!1;let e=this.engine;if(!e)return;let t=(await this.as(e).sync({query:e.store.cursor?{since:e.store.cursor}:{}})).data;if(this.engine!==e)return;let s=t.reset?e.reset(t):e.apply(t);this.toWindows(t,s);let i=t.reset?[...this.loaded]:t.conversations.filter(n=>n.gap&&this.loaded.has(n.id)).map(n=>n.id);t.reset&&this.loaded.clear();for(let n of i)this.loaded.delete(n),this.earlier.delete(n);e.store.cursor=t.cursor,this.after(t,s);for(let n of i)this.openPage(n).catch(()=>{});this.synced||(s.list=!0),this.synced=!0,this.tell(s)}while(this.resync)}finally{this.syncing=null}})(),this.syncing)}onIncoming(e){return this.incoming.add(e),()=>{this.incoming.delete(e)}}heardLive(e){let t=this.engine;if(!t)return;let s=(e.messages??[]).filter(i=>i.version===1&&i.sender_id!==t.me&&!i.deleted&&i.kind!=="system"&&i.kind!=="call"&&!t.store.messages.get(i.conversation_id)?.has(i.id));this.changed(e,t);for(let i of s)for(let n of[...this.incoming])n(i)}changed(e,t=this.engine){if(!t||t!==this.engine)return;let s=t.apply(e);this.toWindows(e,s),this.after(e,s),this.tell(s)}toWindows(e,t){for(let s of this.windows)s.apply(e)&&t.conversations.add(s.conversationId)}putWindow(e,t){e.put(t);for(let s of t)this.expireAt(s)}fromWindows(e,t){let s=!1;for(let i of this.windows)i.conversationId===e&&t(i)&&(s=!0);return s}after(e,t){for(let s of e.messages??[])this.expireAt(s),s.sender_id!==this.user&&!s.deleted&&(s.thread_id===null||s.also_in_conversation)&&this.delivered.set(s.conversation_id,Math.max(this.delivered.get(s.conversation_id)??0,s.seq));e.removed_conversations?.some(s=>s.reportable_until)&&this.engine&&this.expireDeleted(this.engine),this.delivered.size>0&&(this.timers.deliver??=setTimeout(()=>{this.deliver()},Js)),(t.list||t.conversations.size>0||t.threads.size>0||t.scheduled)&&this.save()}expireAt(e){let t=e.id,s=this.expiring.get(t);if(s&&clearTimeout(s),this.expiring.delete(t),!e.expires_at||e.deleted)return;let i=Date.parse(e.expires_at)-Date.now(),n=()=>{this.expiring.delete(t);let a=this.engine?.store.expire(e.conversation_id,e.id)??!1;(this.fromWindows(e.conversation_id,o=>o.expire(e.id))||a)&&(this.tell({list:!0,conversations:new Set([e.conversation_id]),threads:new Set(e.thread_id?[e.thread_id]:[]),scheduled:!1}),this.save())};i<=0?n():this.expiring.set(t,setTimeout(n,Math.min(i,2**31-1)))}expireDeleted(e){clearTimeout(this.timers.reportable),this.timers.reportable=void 0;let t=Math.min(...e.deletedGroups().map(s=>Date.parse(s.reportableUntil)));Number.isFinite(t)&&(this.timers.reportable=setTimeout(()=>{this.timers.reportable=void 0,this.engine===e&&(this.tell({list:!0,conversations:new Set,threads:new Set,scheduled:!1}),this.save(),this.expireDeleted(e))},Math.min(Math.max(0,t-Date.now()),2**31-1)))}async deliver(){this.timers.deliver=void 0;let e=[...this.delivered].map(([t,s])=>({conversation_id:t,delivered_seq:s}));if(this.delivered.clear(),!(e.length===0||!this.engine))try{await this.as(this.engine).receipts({body:{receipts:e.slice(0,100)}})}catch{}}save(){this.timers.save??=setTimeout(()=>{this.timers.save=void 0;let e=this.engine,t=this.user;e&&t&&(this.saving=this.saving.then(()=>this.local.save(F(this.ref,t),e.kept())).catch(()=>{}))},zs)}flush(){return this.flushing?(this.reflush=!0,this.flushing):(clearTimeout(this.timers.retry),this.timers.retry=void 0,this.flushing=(async()=>{try{let e=!1;do{this.reflush=!1;let t=this.engine;if(!t)return;let s=this.as(t);if(e=await t.outbox.flush(i=>this.post(s,i),(i,n)=>{let a=t.sent(n)??{list:!1,conversations:new Set([i.conversationId]),threads:new Set,scheduled:!1};a.conversations.add(i.conversationId),n.kind==="sent"&&this.after({messages:[n.message]},a),this.save(),this.tell(a)}),this.engine!==t)return}while(this.reflush&&!e);if(e){let t=Ft[Math.min(this.retries++,Ft.length-1)];this.timers.retry=setTimeout(()=>{this.flush()},t)}else this.retries=0}finally{this.flushing=null}})(),this.flushing)}async post(e,t){try{let s=await e.sendMessage({path:{conversation_id:t.conversationId},body:t.request});return De(s.status,s.data)}catch(s){return s instanceof w?s.isNetworkError?{kind:"wait"}:De(s.status,{error:s.code}):{kind:"wait"}}}presence(e){let t=()=>{if(this.engine!==e)return;let s=globalThis.document;(!s||s.visibilityState!=="hidden")&&this.as(e).presence().catch(()=>{}),this.timers.presence=setTimeout(t,Ys)};t()}as(e){return this.clients.get(e)}async seat(){let e=await this.ready();return{e,as:this.as(e)}}typed(e){let t=this.typingBy.get(e.conversation_id);t||this.typingBy.set(e.conversation_id,t=new Map),t.set(e.user_id,Date.now()+Vt),this.tell({list:!1,conversations:new Set([e.conversation_id]),threads:new Set,scheduled:!1}),setTimeout(()=>this.tell({list:!1,conversations:new Set([e.conversation_id]),threads:new Set,scheduled:!1}),Vt+50)}tell(e){for(let t of[...this.heard])t(e)}listen(e){return this.heard.add(e),this.ready().catch(()=>{}),()=>{this.heard.delete(e)}}onPerson(e){return this.reopeners.add(e),()=>{this.reopeners.delete(e)}}current(){return this.engine}typingIn(e){let t=Date.now();return[...this.typingBy.get(e)??[]].filter(([s,i])=>i>t&&s!==this.user).map(([s])=>s)}touch(e){this.tell({list:!1,conversations:new Set([e]),threads:new Set,scheduled:!1})}isSynced(){return this.synced}conversations(e={}){return new Ue(this,e.spaces??[])}deletedGroups(){return new Le(this)}conversation(e,t={}){return new qe(this,e,t.at??null)}async direct(e,t={}){let{e:s,as:i}=await this.seat(),n=(await i.openDirectConversation({body:{user_id:e,space:t.space}})).data;return this.changed({conversations:[n]},s),this.conversation(n.id)}async group(e){let{e:t,as:s}=await this.seat(),i=(await s.createGroup({body:{title:e.title,member_ids:e.memberIds,description:e.description,photo:e.photo,settings:e.settings,space:e.space,visibility:e.visibility}})).data;return this.changed({conversations:[i.conversation]},t),{conversation:this.conversation(i.conversation.id),notAdded:i.not_added}}thread(e,t,s={}){return new je(this,e,t,s.at??null)}async search(e,t={}){let s=Kt(e);if(s.words.length===0)return{conversations:[],messages:[],nextCursor:null};let i=t.by==="meaning",{e:n,as:a}=await this.seat(),o=async()=>{let m=t.cursor;for(let h=0;;h++){let p={q:e,...i?{by:"meaning"}:{},conversation_id:t.conversationId,...t.space?{space:[t.space]}:{},limit:t.limit,cursor:m},y=(await a.searchMessages({query:p})).data;if(i||y.data.length>0||!y.next_cursor||h+1===ei)return y;m=y.next_cursor}},[l,d]=await Promise.all([o(),i||t.cursor||t.conversationId?Promise.resolve([]):this.named(s,n,t.space)]),c=Date.now();for(let m of l.profiles)this.people.set(m.user_id,{profile:m,at:c});let f=m=>m?this.people.get(m)?.profile??null:null,g=new Map(l.conversations.map(m=>[m.id,m])),S=l.data.flatMap(m=>{let h=g.get(m.message.conversation_id)??n.store.conversations.get(m.message.conversation_id);if(!h)return[];let p=h.kind==="direct"?f(h.peer_id):null;return[{message:m.message,conversation:h,title:h.kind==="direct"?p?.name??null:h.title,photo:h.kind==="direct"?p?.image??null:h.photo,sender:f(m.message.sender_id),peer:p,matches:m.matches,score:m.score??null,threadRootId:m.message.thread_id&&!m.message.also_in_conversation?m.message.thread_id:null}]});return{conversations:d,messages:S,nextCursor:i?null:l.next_cursor??null}}async named(e,t,s){let i=t.store.list().filter(a=>!s||a.space===s),n=[...new Set(i.filter(a=>a.kind==="direct"&&a.peer_id).map(a=>a.peer_id))].filter(a=>{let o=this.people.get(a);return!o||Date.now()-o.at>Qs});for(let a=0;a<n.length;a+=100){let o=n.slice(a,a+100);try{let l=(await this.as(t).getProfiles({query:{user_ids:o.join(",")}})).data.data,d=Date.now();for(let c of o)this.people.set(c,{profile:l.find(f=>f.user_id===c)??null,at:d})}catch{}}return i.flatMap(a=>{let o=a.kind==="direct"&&a.peer_id?this.people.get(a.peer_id)?.profile??null:null,l=a.kind==="direct"?o?.name??null:a.title,d=l?$t(e,l):null;return d?[{conversation:a,title:l,photo:a.kind==="direct"?o?.image??null:a.photo,peer:o,matches:d[0]}]:[]})}async openGroups(e,t={}){let{as:s}=await this.seat(),i=(await s.listOpenGroups({query:{space:e,limit:t.limit,cursor:t.cursor}})).data;return{items:i.data,nextCursor:i.next_cursor??null}}async join(e){let{e:t,as:s}=await this.seat(),i=(await s.joinGroup({path:{conversation_id:e}})).data;return this.changed({conversations:[i]},t),this.conversation(i.id)}scheduled(){return new Ke(this)}async threads(){let{as:e}=await this.seat();return(await e.listThreads()).data.data}async send(e,t){let{e:s}=await this.seat(),i=typeof t=="string"?{text:t}:t,n=i.files?.length?await this.upload(e,i.files):void 0,a={client_message_id:crypto.randomUUID(),...i.text!==void 0?{text:i.text}:{},...i.mentions?{mentions:i.mentions}:{},...n?{attachments:n}:{},...i.replyTo?{reply_to_id:i.replyTo}:{},...i.threadId?{thread_id:i.threadId}:{},...i.alsoInConversation?{also_in_conversation:!0}:{},...i.expiresIn!==void 0?{expires_in:i.expiresIn,expires_from:i.expiresFrom??"send"}:{},...i.viewOnce?{view_once:{limit:i.viewOnce.limit,...i.viewOnce.seconds?{seconds:i.viewOnce.seconds}:{}}}:{},...i.sendAt?{send_at:i.sendAt.toISOString()}:{}};if(s!==this.engine)throw new T(`the session is no longer ${s.me}'s`);let o=s.write(e,a,new Date().toISOString());return this.tell({list:!1,conversations:new Set([e]),threads:new Set(i.threadId?[i.threadId]:[]),scheduled:!1}),this.save(),this.flush(),o}async upload(e,t){let{as:s}=await this.seat(),i=[];for(let n of t){let a=n.data instanceof Uint8Array?n.data:new Uint8Array(await n.data.arrayBuffer()),{sealed:o,fileKey:l}=await Nt(a),d=(await s.createUpload({path:{conversation_id:e},body:{size:o.length}})).data,c=await this.fetchFn(d.url,{method:"PUT",body:o,headers:{"content-type":"application/octet-stream"}});if(!c.ok)throw new w({op:"UploadFile",status:c.status,code:"upload_failed",message:`the file was not uploaded (${c.status})`});i.push({upload_id:d.id,content_type:n.contentType,file_key:l,...n.name?{name:n.name}:{},...n.width?{width:n.width}:{},...n.height?{height:n.height}:{},...n.durationMs?{duration_ms:n.durationMs}:{},...n.thumbnail?{thumbnail:n.thumbnail}:{}})}return i}async open(e,t){let{as:s}=await this.seat(),i=e.attachments.find(a=>a.id===t);if(!i?.file_key)throw new w({op:"OpenFile",status:404,code:"attachment_not_found",message:"no such file of the message, or one seen once"});let n=(await s.attachmentUrl({path:{conversation_id:e.conversation_id,message_id:e.id,attachment_id:i.id}})).data;return{id:i.id,name:i.name,contentType:i.content_type,bytes:await this.bytes(n.url,i.file_key)}}async viewOnce(e){let{as:t}=await this.seat(),s=(await t.viewOnce({path:{conversation_id:e.conversation_id,message_id:e.id}})).data;return Promise.all(s.attachments.map(async i=>({id:i.id,name:null,contentType:i.content_type,bytes:await this.bytes(i.url,i.file_key)})))}async bytes(e,t){let s=await this.fetchFn(e);if(!s.ok)throw new w({op:"OpenFile",status:s.status,code:"download_failed",message:`the file was not read (${s.status})`});return Ut(new Uint8Array(await s.arrayBuffer()),t)}async edit(e,t,s,i){let{e:n,as:a}=await this.seat(),o=(await a.editMessage({path:{conversation_id:e,message_id:t},body:{text:s,...i?{mentions:i}:{}}})).data;return this.changed({messages:[o]},n),o}async remove(e,t,s="everyone"){let{e:i,as:n}=await this.seat(),a=await n.deleteMessage({path:{conversation_id:e,message_id:t},query:{for:s}});a.status===200?this.changed({messages:[a.data]},i):this.changed({hidden:[{conversation_id:e,message_id:t}]},i)}async react(e,t,s,i={}){let{e:n,as:a}=await this.seat(),o=(await a.react({path:{conversation_id:e,message_id:t,emoji:s},body:i.replace?{replace:!0}:{}})).data;return this.changed({messages:[o]},n),o}async unreact(e,t,s){let{e:i,as:n}=await this.seat(),a=(await n.unreact({path:{conversation_id:e,message_id:t,emoji:s}})).data;return this.changed({messages:[a]},i),a}async markRead(e,t,s){let{e:i,as:n}=await this.seat(),{upTo:a,touched:o}=i.read(e,t,s);a<=0||((o.list||o.conversations.size>0||o.threads.size>0)&&(this.tell(o),this.save()),await n.receipts({body:{receipts:[{conversation_id:e,read_seq:a,...s?{thread_id:s}:{}}]}}))}async typing(e,t){let{as:s}=await this.seat(),i=this.typedAt.get(e)??0;Date.now()-i<Xs||(this.typedAt.set(e,Date.now()),await s.typing({path:{conversation_id:e},body:t?{thread_id:t}:{}}).catch(()=>{}))}async update(e,t){let{e:s,as:i}=await this.seat(),n=(await i.updateConversation({path:{conversation_id:e},body:t})).data;return this.changed({conversations:[n]},s),n}async close(e){let{e:t,as:s}=await this.seat();if(await s.closeConversation({path:{conversation_id:e}}),t!==this.engine)return;let i=t.store.conversations.get(e)?.me,n=l=>l.vanish&&l.sender_id!==t.me&&i&&l.seq<=i.read_seq,a=t.store.timeline(e).filter(n);for(let l of a)t.store.expire(e,l.id);let o=this.fromWindows(e,l=>[...l.messages.values()].filter(n).map(d=>l.expire(d.id)).includes(!0));(a.length>0||o)&&(this.tell({list:!0,conversations:new Set([e]),threads:new Set,scheduled:!1}),this.save())}async screenshot(e){let{e:t,as:s}=await this.seat(),i=(await s.reportScreenshot({path:{conversation_id:e}})).data;return this.changed({messages:[i]},t),i}async leave(e){let{e:t,as:s}=await this.seat();await s.removeMember({path:{conversation_id:e,user_id:t.me}}),this.sync()}async deleteConversation(e){let{e:t,as:s}=await this.seat();await s.deleteConversation({path:{conversation_id:e}}),this.changed({removed_conversations:[{conversation_id:e,reason:"deleted"}]},t)}async notifications(e,t){let{as:s}=await this.seat();await s.setConversationNotifications({path:{conversation_id:e},body:t}),this.sync()}async cancelScheduled(e){let{e:t,as:s}=await this.seat();await s.cancelScheduled({path:{scheduled_id:e}}),t===this.engine&&t.store.scheduled.delete(e)&&(this.tell({list:!1,conversations:new Set,threads:new Set,scheduled:!0}),this.save())}async editScheduled(e,t){let{e:s,as:i}=await this.seat(),n=(await i.updateScheduled({path:{scheduled_id:e},body:t})).data;return this.changed({scheduled:[n]},s),n}async me(){let{as:e}=await this.seat();return(await e.getMyProfile()).data}async updateMe(e){let{as:t}=await this.seat(),s=(await t.updateMyProfile({body:e})).data;return e.read_receipts!==void 0&&this.sync(),s}async profiles(e){let{as:t}=await this.seat();return(await t.getProfiles({query:{user_ids:e.join(",")}})).data.data}async block(e){let{as:t}=await this.seat();await t.block({path:{user_id:e}})}async unblock(e){let{as:t}=await this.seat();await t.unblock({path:{user_id:e}})}async report(e){let{as:t}=await this.seat();return(await t.report({body:e})).data}async openPage(e){let{e:t}=await this.seat();this.loaded.has(e)||(this.loaded.add(e),t.store.timeline(e).length>0&&this.synced)||await this.page(e,null)}async page(e,t){let{e:s,as:i}=await this.seat(),n=(await i.listMessages({path:{conversation_id:e},query:t?{cursor:t,limit:50}:{limit:50}})).data;return s!==this.engine?!1:(this.earlier.set(e,n.next_cursor??null),this.changed({messages:n.data},s),!!n.next_cursor)}earlierOf(e){return this.earlier.get(e)}async openAt(e,t){let{e:s,as:i}=await this.seat(),n=s.store.messages.get(e)?.get(t),a=this.earlier.get(e);if(n&&a!==void 0&&(a===null||parseInt(a,36)<=n.seq))return null;let o=(await i.listMessages({path:{conversation_id:e},query:{around:t,limit:50}})).data;if(s!==this.engine)return null;let l=new Ne(e);return this.putWindow(l,o.data),l.earlier=o.next_cursor??null,l.later=o.newer_cursor??null,l.later===null?(this.merge(l,s),null):(this.windows.add(l),l)}async windowPage(e,t){let{e:s,as:i}=await this.seat(),n=t==="earlier"?e.earlier:e.later;if(n===null||e.merged)return;let a=t==="earlier"?{cursor:n,limit:50}:{after:n,limit:50},o=(await i.listMessages({path:{conversation_id:e.conversationId},query:a})).data;s!==this.engine||e.merged||(this.putWindow(e,o.data),t==="earlier"?e.earlier=o.next_cursor??null:e.later=o.newer_cursor??null,e.later===null?this.merge(e,s):this.tell({list:!1,conversations:new Set([e.conversationId]),threads:new Set,scheduled:!1}))}dropWindow(e){e.merged=!0,this.windows.delete(e)}merge(e,t){this.dropWindow(e);let s=e.conversationId,i=this.earlier.get(s),n=i===void 0||i!==null&&(e.earlier===null||parseInt(e.earlier,36)<parseInt(i,36))?e.earlier:i;this.earlier.set(s,n),this.loaded.add(s),this.changed({messages:[...e.messages.values()]},t),this.tell({list:!1,conversations:new Set([s]),threads:new Set,scheduled:!1})}async openThread(e,t,s=null){let{e:i,as:n}=await this.seat(),a=(await n.getMessage({path:{conversation_id:e,message_id:t}})).data,o=[],l;for(let d=0;d<Zs;d++){let c=(await n.listReplies({path:{conversation_id:e,message_id:t},query:l?{limit:100,cursor:l}:{limit:100}})).data;if(o.push(...c.data),l=c.next_cursor,!l||!s||o.some(f=>f.id===s))break}this.changed({messages:[a,...o]},i)}async openScheduled(){let{e,as:t}=await this.seat();this.changed({scheduled:(await t.listScheduled()).data.data},e)}},q=class{listeners=new Set;unlisten=null;unperson=null;cached=null;m;constructor(e){this.m=e}get state(){return this.unlisten?this.cached??=this.read():this.read()}subscribe(e){return this.listeners.add(e),this.unlisten||(this.cached=null,this.unlisten=this.m.listen(t=>{if(this.touches(t)){this.cached=this.read();for(let s of[...this.listeners])s()}}),this.unperson=this.m.onPerson(()=>{this.cached=null,this.opened();for(let t of[...this.listeners])t()}),this.opened()),()=>{this.listeners.delete(e),this.listeners.size===0&&(this.unlisten?.(),this.unperson?.(),this.unlisten=null,this.unperson=null,this.closed())}}opened(){}closed(){}},Ue=class extends q{spaces;constructor(e,t=[]){super(e),this.spaces=[...t]}touches(e){return e.list||e.conversations.size>0}read(){let e=this.m.current()?.store.list()??[],t=this.spaces.length===0?e:e.filter(s=>s.space!=null&&this.spaces.includes(s.space));return{items:t,unread:t.reduce((s,i)=>s+(i.me?.unread_count??0),0),synced:this.m.isSynced()}}},Le=class extends q{touches(e){return e.list}read(){return{items:this.m.current()?.deletedGroups()??[]}}},qe=class extends q{id;focus;window=null;opening=null;settled=!1;constructor(e,t,s=null){super(e),this.id=t,this.focus=s}opened(){if(!this.focus){this.m.openPage(this.id).catch(()=>{});return}this.window&&this.m.dropWindow(this.window),this.window=null,this.settled=!1,this.opening=this.m.openAt(this.id,this.focus).then(e=>{this.window=e,e||this.m.openPage(this.id).catch(()=>{})}).catch(()=>{this.m.openPage(this.id).catch(()=>{})}).finally(()=>{this.settled=!0,this.m.touch(this.id)})}closed(){this.window&&this.m.dropWindow(this.window),this.window=null}touches(e){return e.conversations.has(this.id)}stretch(){return this.window?.merged&&(this.window=null),this.window}read(){let e=this.m.current(),t=this.stretch(),s=this.focus!==null&&!this.settled;return{conversation:e?.store.conversations.get(this.id)??null,entries:s?[]:t?t.entries():e?.timeline(this.id)??[],members:e?.store.membersOf(this.id)??[],typing:this.m.typingIn(this.id),hasEarlier:t?t.earlier!==null:this.m.earlierOf(this.id)!==null,hasLater:t!==null,focus:this.focus}}refresh(){return this.m.page(this.id,null)}async loadEarlier(){await this.opening;let e=this.stretch();if(e)return await this.m.windowPage(e,"earlier"),e.earlier!==null;let t=this.m.earlierOf(this.id);return t===null?!1:this.m.page(this.id,t??null)}async loadLater(){await this.opening;let e=this.stretch();return e?(await this.m.windowPage(e,"later"),this.stretch()!==null):!1}showLatest(){this.window&&(this.m.dropWindow(this.window),this.window=null,this.m.openPage(this.id).catch(()=>{}),this.m.touch(this.id))}send(e){return this.m.send(this.id,e)}markRead(e){return this.m.markRead(this.id,e)}typing(){return this.m.typing(this.id)}thread(e){return this.m.thread(this.id,e)}},je=class extends q{conversationId;rootId;focus;constructor(e,t,s,i=null){super(e),this.conversationId=t,this.rootId=s,this.focus=i}opened(){this.m.openThread(this.conversationId,this.rootId,this.focus).catch(()=>{})}touches(e){return e.threads.has(this.rootId)||e.conversations.has(this.conversationId)}read(){let e=this.m.current();return{root:e?.store.messages.get(this.conversationId)?.get(this.rootId)??null,entries:e?.answers(this.conversationId,this.rootId)??[],thread:e?.store.threads.get(this.rootId)??null,focus:this.focus}}send(e){let t=typeof e=="string"?{text:e}:e;return this.m.send(this.conversationId,{...t,threadId:this.rootId})}markRead(){return this.m.markRead(this.conversationId,void 0,this.rootId)}},Ke=class extends q{opened(){this.m.openScheduled().catch(()=>{})}touches(e){return e.scheduled}read(){return[...this.m.current()?.store.scheduled.values()??[]].sort((e,t)=>e.send_at<t.send_at?-1:1)}};var Wt=async r=>si(await import("livekit-client"))(r);function si(r){return async e=>{let t=new r.Room({adaptiveStream:!1,dynacast:!0,stopLocalTrackOnUnpublish:!1}),s=()=>t.localParticipant,i={microphone:r.Track.Source.Microphone,camera:r.Track.Source.Camera,screen:r.Track.Source.ScreenShare,screen_audio:r.Track.Source.ScreenShareAudio},n=(l,d)=>d.source===r.Track.Source.ScreenShare?"screen":d.source===r.Track.Source.ScreenShareAudio?"screen_audio":l.kind==="video"?"camera":"microphone",a=!1;t.on(r.RoomEvent.TrackSubscribed,(l,d,c)=>e.track(c.identity,l.mediaStreamTrack,n(l,d))).on(r.RoomEvent.TrackUnsubscribed,(l,d,c)=>e.trackGone(c.identity,l.mediaStreamTrack)).on(r.RoomEvent.TrackMuted,(l,d)=>{d!==s()&&l.track&&e.muted(d.identity,l.track.mediaStreamTrack,!0)}).on(r.RoomEvent.TrackUnmuted,(l,d)=>{d!==s()&&l.track&&e.muted(d.identity,l.track.mediaStreamTrack,!1)}).on(r.RoomEvent.Reconnecting,()=>e.state("reconnecting")).on(r.RoomEvent.Reconnected,()=>e.state("connected")).on(r.RoomEvent.ActiveSpeakersChanged,l=>e.speakers(l.map(d=>d.identity))).on(r.RoomEvent.Disconnected,()=>{a||e.state("disconnected")});let o=new Map;return{async connect(l,d){await t.connect(l,d),e.state("connected")},async publish(l,d){o.set(l,await s().publishTrack(l,{source:i[d]}))},async unpublish(l){o.delete(l),await s().unpublishTrack(l,!1)},async mute(l,d){let c=o.get(l);c&&await(d?c.mute():c.unmute())},async close(){a=!0,await t.disconnect()}}}}var ii=/^[A-Za-z0-9][A-Za-z0-9._:-]{0,127}$/,$e=class extends w{call;constructor(e,t){super({op:e.op,status:e.status,code:e.code,message:e.message,requestId:e.requestId,retryAfter:e.retryAfter,body:e.body,cause:e}),this.name="PlaceBusyError",this.call=t}},Ve=class{id;c;call;snapshot;listeners=new Set;owned=!1;entering=!1;phase="incoming";endReason=null;error=null;local=null;tracks={audio:null,video:null};opened=new Set;mic=!0;facing="user";shared=null;sharing=null;room=null;joiningRoom=null;roomState=null;streams=new Map;screens=new Map;owners=new Map;speakers=new Set;mutedInRoom=new Set;players=new Map;sink=null;quieted=!1;heartbeat;poll;done=!1;constructor(e,t,s=!1){this.c=e,this.id=t.id,this.call=t,this.entering=s,this.derive()}get state(){return this.snapshot}subscribe(e){return this.listeners.add(e),()=>this.listeners.delete(e)}async accept(e={}){if(this.phase!=="incoming"&&this.phase!=="invited")throw this.refused("accept","not_ringing","the call does not ring here now");await this.enter(e,t=>this.c.api.acceptCall({path:{call_id:this.id},body:t}))}async join(e={}){if(this.owned&&!this.done)return;if(this.done)throw this.refused("join","call_ended","this session is over: pb.calls.join(callId) comes into the call again");let t={...e.name===void 0?{}:{name:e.name},...e.imageUrl===void 0?{}:{image_url:e.imageUrl}};await this.enter(e,s=>this.c.api.joinCall({path:{call_id:this.id},body:{...s,...t}}))}async decline(){let e=await this.c.api.declineCall({path:{call_id:this.id}}).catch(t=>this.refusal(t));this.apply(e.data)}async leave(){try{let e=await this.c.api.leaveCall({path:{call_id:this.id}});this.apply(e.data)}finally{!this.done&&this.owned&&this.end("left")}}async invite(e,t={}){let s=typeof e=="string"?[e]:e,i=await this.c.api.inviteToCall({path:{call_id:this.id},body:{user_ids:s,...t.ring===void 0?{}:{ring:t.ring}}});this.apply(i.data)}async setMicrophone(e){this.mic=e;let t=this.tracks.audio;t&&(t.enabled=e),this.changed(),t&&this.room&&await this.room.mute(t,!e)}async setCamera(e){if(!e){if(!this.tracks.video)return;await this.putVideo(null);return}this.tracks.video||await this.putVideo(await this.camera({facingMode:this.facing}))}async switchCamera(e){e===void 0&&(this.facing=this.facing==="user"?"environment":"user"),await this.putVideo(await this.camera(e===void 0?{facingMode:this.facing}:{deviceId:{exact:e}}))}async setScreenShare(e,t={}){if(!e){await this.sharing?.catch(()=>{}),await this.putScreen(null);return}if(this.shared)return;if(this.sharing)return this.sharing;if(!this.inCall)throw this.refused("setScreenShare","not_in_call","a screen is shared in a call this device is in");let s=this.c.rtc(),i=s.getDisplayMedia?.bind(s);if(!i)throw new TypeError("calls: this browser shares no screen (getDisplayMedia)");return this.sharing=(async()=>{let n=await i({video:!0,audio:t.audio===!0}),a=n.getVideoTracks()[0],o=t.audio===!0?n.getAudioTracks()[0]??null:null;for(let l of n.getTracks())l!==a&&l!==o&&l.stop();if(!a||this.done){for(let l of n.getTracks())l.stop();if(!a)throw new Error("calls: the screen gave no video");return}this.opened.add(a),o&&this.opened.add(o),a.addEventListener?.("ended",()=>{this.shared?.video===a&&this.putScreen(null).catch(()=>{})}),await this.putScreen({video:a,audio:o,stream:new s.MediaStream([a,...o?[o]:[]])})})().finally(()=>this.sharing=null),this.sharing}async setAudioOutput(e){this.sink=e;for(let t of this.players.values())await Ht(t,e)}async refresh(){let e=await this.c.api.getCall({path:{call_id:this.id}});this.apply(e.data)}apply(e){e.id!==this.id||e.version<this.call.version||(this.call=e,this.derive())}caughtUp(){!this.owned||this.done||this.refresh().catch(()=>{})}online(){this.inCall&&!this.room&&this.toRoom()}get inCall(){return this.owned&&!this.done}drop(){this.done||this.end(this.endReason??"left")}me(){return this.call.participants.find(e=>e.user_id===this.c.me)}derive(){if(this.done)return;let e=this.call,t=this.me();if(e.state==="ended")return this.end(oi(e,t));let s=t?.state==="joined"&&t.device_id===this.c.device;if(s&&this.entering&&(this.owned=!0),this.owned){if(t?.state==="joined"&&!s)return this.end("answered_elsewhere","elsewhere");if(!s)return this.end(t?.state??"left");this.quiet(),this.beat(),this.phase=e.state==="ringing"?"calling":this.mediaPhase(),this.toRoom()}else if(t?.state==="ringing")this.phase="incoming";else if(t?.state==="invited")this.phase="invited";else if(this.entering)this.phase="connecting";else if(t?.state==="joined")this.phase="elsewhere",this.quiet();else return this.end(t?.state??"ended");this.changed()}mediaPhase(){return this.roomState==="connected"?"connected":this.roomState==="reconnecting"?"reconnecting":"connecting"}async enter(e,t){this.entering=!0;try{await this.open(e.video??this.call.video,e.media);let s=await t({device_id:this.c.device});this.apply(s.data)}catch(s){this.entering=!1,this.owned||this.release();let i=We(s);throw i?this.apply(i):this.derive(),s}this.entering=!1,this.derive(),this.inCall&&this.c.entered(this)}own(e){if(this.done){for(let t of e.opened)t.stop();return}this.owned=!0,this.local=e.local,this.tracks=e.tracks;for(let t of e.opened)this.opened.add(t);this.derive()}async open(e,t){let s=await Bt(this.c.rtc(),e,t);this.local=s.local,this.tracks=s.tracks;for(let i of s.opened)this.opened.add(i)}async camera(e){try{let s=(await this.c.rtc().getUserMedia({video:e})).getVideoTracks()[0];if(!s)throw new Error("calls: the camera gave no video");return this.opened.add(s),s}catch(t){throw this.error=t instanceof Error?t:new Error(String(t)),this.changed(),t}}async putVideo(e){let t=this.tracks.video;this.tracks.video=e,t&&this.local?.removeTrack(t),e&&this.local?.addTrack(e),this.changed(),this.room&&(t&&await this.room.unpublish(t).catch(()=>{}),e&&await this.room.publish(e,"camera")),t&&t!==e&&this.stopIfOpened(t)}async putScreen(e){let t=this.shared;if(!(!t&&!e)){if(this.shared=e,this.changed(),this.room){if(t)for(let s of[t.video,t.audio])s&&await this.room.unpublish(s).catch(()=>{});e&&(await this.room.publish(e.video,"screen"),e.audio&&await this.room.publish(e.audio,"screen_audio"))}if(t)for(let s of[t.video,t.audio])s&&this.stopIfOpened(s)}}sent(){let e=[];return this.tracks.audio&&e.push([this.tracks.audio,"microphone"]),this.tracks.video&&e.push([this.tracks.video,"camera"]),this.shared&&e.push([this.shared.video,"screen"]),this.shared?.audio&&e.push([this.shared.audio,"screen_audio"]),e}toRoom(){return this.room||this.joiningRoom||this.done?Promise.resolve():(this.joiningRoom=(async()=>{let e=(await this.c.api.getCallMedia({path:{call_id:this.id},body:{device_id:this.c.device}})).data;if(this.done)return;let t=await this.c.room({track:(s,i,n)=>{this.room===t&&this.heard(s,i,n)},trackGone:(s,i)=>{this.room===t&&this.gone(s,i)},muted:(s,i,n)=>{this.room===t&&(n?this.mutedInRoom.add(i):this.mutedInRoom.delete(i),this.changed())},speakers:s=>{this.room===t&&(this.speakers=new Set(s),this.changed())},state:s=>{if(this.room===t){if(this.roomState=s,s==="disconnected"){this.room=null,this.roomState=null,this.speakers=new Set;for(let[i,n]of[...this.owners])this.gone(n,i);t.close().catch(()=>{})}this.derive()}}});if(this.done){await t.close();return}this.room=t,this.roomState=null,await t.connect(e.url,e.token);for(let[s,i]of this.sent())await t.publish(s,i);this.tracks.audio&&!this.mic&&await t.mute(this.tracks.audio,!0),this.derive()})().catch(e=>{let t=this.room;this.room=null,this.roomState=null,t?.close().catch(()=>{}),this.failed(e)}).finally(()=>this.joiningRoom=null),this.joiningRoom)}streamOf(e,t=this.streams){let s=t.get(e);return s||t.set(e,s=new(this.c.rtc()).MediaStream),s}heard(e,t,s){let i=s==="screen"||s==="screen_audio",n=this.streamOf(e,i?this.screens:this.streams);for(let a of n.getTracks())a.kind===t.kind&&a!==t&&this.gone(e,a);if(n.getTracks().includes(t)||n.addTrack(t),!this.owners.has(t)){let a=()=>this.changed();t.addEventListener?.("mute",a),t.addEventListener?.("unmute",a),t.addEventListener?.("ended",a)}this.owners.set(t,e),t.kind==="audio"&&this.play(i?`${e}\0screen`:e,n),this.changed()}gone(e,t){this.owners.delete(t),this.mutedInRoom.delete(t),this.streams.get(e)?.removeTrack(t),this.screens.get(e)?.removeTrack(t),this.changed()}play(e,t){if(!this.c.playAudio||this.players.has(e))return;let s=globalThis.document;if(!s)return;let i=s.createElement("audio");i.autoplay=!0,i.srcObject=t,this.players.set(e,i),this.sink&&Ht(i,this.sink).catch(()=>{}),i.play?.()?.catch?.(()=>{})}beat(){this.heartbeat===void 0&&(this.heartbeat=setInterval(()=>{this.stillHere()},this.c.heartbeatMs)),this.poll===void 0&&(this.poll=setInterval(()=>{this.c.live()||this.done||this.refresh().catch(()=>{})},this.c.pollMs))}async stillHere(){if(!this.done)try{let e=(await this.c.api.callHeartbeat({path:{call_id:this.id},body:{device_id:this.c.device}})).data;(e.version>this.call.version||!e.in_call||e.state==="ended")&&await this.refresh()}catch(e){e instanceof w&&e.status===404&&this.end("ended")}}end(e,t="ended"){if(this.done)return;this.done=!0,this.entering=!1,this.phase=t,this.quiet(),this.endReason=e,clearInterval(this.heartbeat),clearInterval(this.poll);let s=this.room;this.room=null,this.shared=null,this.speakers=new Set,s?.close().catch(()=>{});for(let i of this.players.values())i.pause?.(),i.srcObject=null;this.players.clear(),this.release(),this.changed(),this.c.forget(this)}release(){for(let e of this.opened)e.stop();this.opened.clear()}stopIfOpened(e){this.opened.delete(e)&&e.stop()}quiet(){this.quieted||(this.quieted=!0,this.c.quiet(this.id))}failed(e){this.done||(this.error=e instanceof Error?e:new Error(String(e)),this.changed())}refusal(e){let t=We(e);throw t&&this.apply(t),e}refused(e,t,s){return new w({op:e,status:409,code:t,message:`${e}: ${s}`})}changed(){let e=this.c.me,t=this.owned&&!this.done,s=t?this.call.participants.filter(a=>a.user_id!==e&&a.state==="joined"):[],i=s.map(a=>this.remoteOf(a.user_id,a));if(t)for(let a of new Set([...this.streams.keys(),...this.screens.keys()]))(this.streams.get(a)?.getTracks().length??0)+(this.screens.get(a)?.getTracks().length??0)>0&&!s.some(l=>l.user_id===a)&&i.push(this.remoteOf(a));let n=this.mic&&this.tracks.audio!==null;this.snapshot={call:this.call,me:this.me()??null,phase:this.phase,outgoing:this.call.caller_id===e,local:t?this.local:null,microphone:n,camera:this.tracks.video!==null,screenSharing:t&&this.shared!==null,screen:t?this.shared?.stream??null:null,speaking:t&&n&&this.speakers.has(e),remote:i,endReason:this.endReason,error:this.error};for(let a of[...this.listeners])try{a()}catch{}}remoteOf(e,t){let s=this.streamOf(e),i=this.screens.get(e),n=(a,o)=>a.getTracks().some(l=>l.kind===o&&l.readyState!=="ended"&&!l.muted&&!this.mutedInRoom.has(l));return{userId:e,name:t?.name??null,imageUrl:t?.image_url??null,bot:t?.kind==="bot"||e.startsWith("bot:"),stream:s,audio:n(s,"audio"),video:n(s,"video"),screen:i&&n(i,"video")?i:null,speaking:this.speakers.has(e)}}},ve=class{deviceId;transportFor;session;socket;ref;opts;beacon;user=null;api=null;channel=null;off=[];sessions=new Map;incoming=new Set;entered=new Set;places=new Map;workerHeard=!1;constructor(e,t,s,i,n,a,o={}){this.transportFor=e,this.session=t,this.socket=s,this.ref=i,this.deviceId=n,this.beacon=a,this.opts=o,t.onChange((d,c)=>{if(d==="SIGNED_OUT"||d==="SESSION_EXPIRED")return this.stop();if(d==="SIGNED_IN"){if(this.user!==null&&c?.userId===this.user){this.unfollow(),this.follow(this.user);return}this.stop(),this.incoming.size>0&&this.ready().catch(()=>{})}});let l=globalThis;l.addEventListener?.("online",()=>{for(let d of this.sessions.values())d.online()}),l.addEventListener?.("pagehide",()=>{for(let d of this.sessions.values())d.inCall&&this.beacon(`/calls/${encodeURIComponent(d.id)}/leave`)})}get current(){for(let e of this.sessions.values())if(e.inCall)return e;return null}async start(e,t={}){let s=typeof e=="string"?[e]:[...e];if(s.length===0&&t.place===void 0)throw new TypeError("calls.start: name the person (or people) to call, or the place to hold it at");t.place!==void 0&&Gt("calls.start",t.place),await this.ready();let i=this.api,n=await Bt(this.rtc(),t.video===!0,t.media),a;try{a=(await i.startCall({body:{user_ids:s,device_id:this.deviceId,video:t.video===!0,...t.ring===void 0?{}:{ring:t.ring},...t.group===void 0?{}:{group:t.group},...t.conversationId===void 0?{}:{conversation_id:t.conversationId},...t.metadata===void 0?{}:{metadata:t.metadata},...t.callerName===void 0?{}:{caller_name:t.callerName},...t.callerImageUrl===void 0?{}:{caller_image_url:t.callerImageUrl},...t.place===void 0?{}:{place:t.place}}})).data}catch(l){for(let c of n.opened)c.stop();let d=l instanceof w&&l.code==="place_busy"?We(l):void 0;throw d?(this.places.get(d.place??"")?.heard(d),new $e(l,d)):l}a.place!==null&&this.places.get(a.place)?.heard(a);let o=this.sessionOf(a,!1);return o.own(n),o.inCall&&(this.sessions.set(o.id,o),this.tell(this.entered,o)),o}voice(e,t={}){return this.start(e,{...t,video:!1})}video(e,t={}){return this.start(e,{...t,video:!0})}async join(e,t={}){await this.ready();let s=typeof e=="string"?e:e.id,i=this.sessions.get(s);return i||(i=this.sessionOf(typeof e=="string"?await this.toJoin(e):e,!0)),await i.join(t),i}place(e){Gt("calls.place",e);let t=this.places.get(e);return t||(t=new Fe(e,{api:async()=>(await this.ready(),this.api),start:s=>this.start(s.userIds??[],{...s,place:e}),join:(s,i)=>this.join(s,i),live:()=>this.channel?.state==="joined",pollMs:this.opts.pollMs??2e3}),this.places.set(e,t)),t}onIncoming(e){return this.incoming.add(e),this.ready().catch(()=>{}),()=>this.incoming.delete(e)}onCall(e){return this.entered.add(e),()=>this.entered.delete(e)}async history(e={}){await this.ready();let t={};return e.limit!==void 0&&(t.limit=e.limit),e.cursor!==void 0&&(t.cursor=e.cursor),e.missed!==void 0&&(t.missed=e.missed),e.state!==void 0&&(t.state=e.state),(await this.api.listCalls({query:t})).data}async get(e){return await this.ready(),(await this.api.getCall({path:{call_id:e}})).data}async ready(){let e=this.session.snapshot()??await this.session.session();if(!e)throw new w({op:"calls",status:401,code:"not_signed_in",message:"calls are the signed-in person's: sign in first"});this.user===e.userId&&this.api||(this.stop(),this.user=e.userId,this.api=Be.client(this.transportFor(e.userId)),this.follow(e.userId),this.listenToWorker(),this.ringing().catch(()=>{}))}stop(){this.unfollow();for(let e of[...this.sessions.values()])e.drop();if(this.sessions.clear(),this.user!==null)for(let e of this.places.values())e.drop();this.user=null,this.api=null}unfollow(){for(let e of this.off.splice(0))e();this.channel?.leave(),this.channel=null}follow(e){let t=this.socket.channel(`calls:${this.ref}:${e}`);this.channel=t,this.off.push(t.on("broadcast",s=>{if(this.user===e){if(s.event==="call"){let i=s.payload;this.heardCall(i),i.place&&this.places.get(i.place)?.heard(i)}else if(s.event==="place"){let i=s.payload;this.places.get(i.place)?.told(i)}}}),t.onJoined(()=>{if(this.user===e){for(let s of this.sessions.values())s.caughtUp();for(let s of this.places.values())s.caughtUp();this.ringing().catch(()=>{})}})),t.join().catch(()=>{})}async toJoin(e){try{return(await this.api.getCall({path:{call_id:e}})).data}catch(t){if(!(t instanceof w)||t.status!==404)throw t;for(let s of this.places.values())if(s.state.call?.id===e)return s.state.call;throw t}}async ringing(){let e=this.user,t=this.api;if(!t)return;let s=await Promise.all([t.listCalls({query:{state:"ringing",limit:20}}),t.listCalls({query:{state:"active",limit:20}})]);if(this.user===e)for(let i of s)for(let n of i.data.calls)this.heardCall(n)}listenToWorker(){if(this.workerHeard)return;let e=globalThis.navigator?.serviceWorker;e?.addEventListener&&(this.workerHeard=!0,e.addEventListener("message",t=>{let s=t.data,i=s?.type==="palbase.push"?s.data?.call_id:void 0;!i||s?.data?.pb_call!=="incoming"||!this.api||this.api.getCall({path:{call_id:i}}).then(n=>this.heardCall(n.data)).catch(()=>{})}))}heardCall(e){let t=this.sessions.get(e.id);if(t){t.apply(e);return}let s=e.participants.find(i=>i.user_id===this.user);e.state==="ended"||s?.state!=="ringing"&&s?.state!=="invited"||this.tell(this.incoming,this.sessionOf(e,!1))}tell(e,t){for(let s of[...e])try{s(t)}catch{}}sessionOf(e,t){let s=this.sessions.get(e.id);if(s)return s.apply(e),s;let i=this.sessions,n=new Ve({api:this.api,me:this.user,device:this.deviceId,rtc:()=>this.rtc(),room:this.opts.room??Wt,playAudio:this.opts.playAudio!==!1,heartbeatMs:this.opts.heartbeatMs??15e3,pollMs:this.opts.pollMs??2e3,live:()=>this.channel?.state==="joined",forget(a){i.get(a.id)===a&&i.delete(a.id)},quiet:a=>li(a),entered:a=>{i.set(a.id,a),this.tell(this.entered,a)}},e,t);return n.state.phase!=="ended"&&i.set(e.id,n),n}rtc(){if(this.opts.rtc)return this.opts.rtc;let e=globalThis;if(typeof e.RTCPeerConnection!="function"||typeof e.MediaStream!="function"||typeof e.navigator?.mediaDevices?.getUserMedia!="function")throw new TypeError("calls: this runtime has no WebRTC (RTCPeerConnection, navigator.mediaDevices): a call's media is a browser's");let t=e.navigator.mediaDevices;return{MediaStream:e.MediaStream,getUserMedia:s=>t.getUserMedia(s),...typeof t.getDisplayMedia=="function"?{getDisplayMedia:s=>t.getDisplayMedia(s)}:{}}}},ni=120,ri=1e4,ai=32,Fe=class{place;c;snapshot;listeners=new Set;call=null;error=null;watchers=0;renewing=null;timer;poll;words=0;ended=new Set;constructor(e,t){this.place=e,this.c=t,this.snapshot=this.make()}get state(){return this.snapshot}subscribe(e){return this.listeners.add(e),()=>this.listeners.delete(e)}async refresh(){let e=await this.c.api(),t=this.words;try{this.take((await e.getCallPlace({path:{place:this.place}})).data,t)}catch(s){this.fail(s)}return this.call}async watch(){this.watchers++,this.changed();try{await this.renew()}catch(e){throw this.watchers=Math.max(0,this.watchers-1),this.watchers===0&&this.idle(),this.changed(),e}return this.call}async unwatch(){if(this.watchers===0||--this.watchers>0||(this.idle(),this.changed(),await this.renewing?.catch(()=>{}),this.watchers>0))return;await(await this.c.api()).unwatchCallPlace({path:{place:this.place}})}start(e={}){return this.c.start(e)}async join(e={}){let t=this.call??await this.refresh();if(!t)throw new w({op:"join",status:404,code:"call_not_found",message:`join: no call goes on at ${this.place}`});return this.c.join(t,e)}told(e){this.words++,e.call?this.heard(e.call):this.set(null)}heard(e){if(e.place===this.place){if(e.state==="ended"){this.ended.add(e.id),this.ended.size>ai&&this.ended.delete(this.ended.values().next().value),this.call?.id===e.id&&this.set(null);return}this.ended.has(e.id)||this.call?.id===e.id&&e.version<this.call.version||this.set({...e,participants:e.participants.map(t=>t.device_id===null?t:{...t,device_id:null})})}}caughtUp(){this.watchers>0&&this.renew().catch(()=>{})}drop(){this.watchers=0,this.idle(),this.call=null,this.error=null,this.ended.clear(),this.changed()}renew(){if(this.renewing)return this.renewing;clearTimeout(this.timer),this.timer=void 0;let e=this.words;return this.renewing=(async()=>(await(await this.c.api()).watchCallPlace({path:{place:this.place}})).data)().then(t=>(this.watchers===0||(this.error=null,this.take(t,e),this.later(Math.max(1,(t.watch_seconds??ni)/2)*1e3),this.polling()),t),t=>(this.watchers>0&&(!(t instanceof w)||t.isNetworkError||t.status===429||t.status>=500?this.later(ri):(this.watchers=0,this.idle())),this.fail(t))).finally(()=>this.renewing=null),this.renewing}later(e){clearTimeout(this.timer),this.timer=setTimeout(()=>{this.renew().catch(()=>{})},e)}polling(){this.poll===void 0&&(this.poll=setInterval(()=>{this.watchers===0||this.c.live()||this.refresh().catch(()=>{})},this.c.pollMs))}idle(){clearTimeout(this.timer),clearInterval(this.poll),this.timer=void 0,this.poll=void 0}take(e,t){e.call?this.heard(e.call):this.words===t?this.set(null):this.changed()}set(e){this.call=e,this.error=null,this.changed()}fail(e){throw this.error=e instanceof Error?e:new Error(String(e)),this.changed(),e}make(){return{place:this.place,call:this.call,watching:this.watchers>0,error:this.error}}changed(){this.snapshot=this.make();for(let e of[...this.listeners])try{e()}catch{}}};function Gt(r,e){if(!ii.test(e))throw new TypeError(`${r}: a place is 1 to 128 letters, digits and . _ : -, starting with a letter or digit (channel:42)`)}async function Bt(r,e,t){let s=t,i=[];if(!s){try{s=await r.getUserMedia({audio:!0,video:e?{facingMode:"user"}:!1})}catch(l){let d=l?.name;if(!e||d==="NotAllowedError"||d==="SecurityError")throw l;s=await r.getUserMedia({audio:!0,video:!1})}i.push(...s.getTracks())}let n=s.getAudioTracks()[0]??null,a=e?s.getVideoTracks()[0]??null:null;if(!t&&!e)for(let l of s.getVideoTracks())l.stop();return{local:new r.MediaStream([n,a].filter(l=>l!==null)),tracks:{audio:n,video:a},opened:i.filter(l=>l===n||l===a)}}function oi(r,e){return e?.state==="missed"||e?.state==="declined"||e?.state==="busy"?e.state:r.end_reason??"ended"}function We(r){if(!(r instanceof w)||r.status!==409)return;let e=r.body;return e?.call&&typeof e.call.id=="string"?e.call:void 0}function li(r){let e=globalThis.navigator?.serviceWorker;typeof e?.getRegistration=="function"&&e.getRegistration().then(async t=>{for(let s of await t?.getNotifications({tag:r})??[])s.close()}).catch(()=>{})}async function Ht(r,e){let t=r;if(typeof t.setSinkId!="function")throw new TypeError("calls: this browser cannot choose where audio plays (setSinkId)");await t.setSinkId(e)}var ye=class{api;open;session;credentials;mfa;passkey;magicLink;phone;password;email;sessions;constructor(e,t,s,i){this.api=K.client(e),this.open=K.client(t),this.session=s,this.credentials=i;let n=this.api,a=this.open;this.mfa={challenge:async(o,l,d)=>this.signedIn((await a.mfaChallenge({body:{mfa_token:o,type:l,code:d}})).data),recovery:async(o,l)=>this.signedIn((await a.mfaRecovery({body:{mfa_token:o,code:l}})).data),sendSmsCode:async o=>{await a.mfaSmsChallenge({body:{mfa_token:o}})},sendEmailCode:async o=>{await a.mfaEmailChallenge({body:{mfa_token:o}})},enrollTotp:async()=>{let o=(await n.mfaEnroll({body:{type:"totp"}})).data;return{enrollmentId:o.enrollment_id,secret:o.secret,otpUrl:o.otp_url,qrCode:o.qr_code,recoveryCodes:o.recovery_codes}},verifyTotp:async o=>{await n.mfaVerifyEnrollment({body:{code:o}})},enrollSms:async o=>(await n.mfaSmsEnroll({body:{phone:o}})).data,verifySms:async o=>{await n.mfaSmsVerifyEnrollment({body:{code:o}})},enrollEmail:async()=>{await n.mfaEmailEnroll()},factors:async()=>(await n.mfaListFactors()).data,removeFactor:async(o,l)=>{await n.mfaRemoveFactor({path:{id:o},body:{current_password:l}})},regenerateRecoveryCodes:async()=>(await n.mfaRegenerateRecoveryCodes()).data,stepUp:async o=>this.steppedUp(async()=>(await n.stepUp({body:{method:"totp",code:o}})).data),sendStepUpSmsCode:async()=>{await n.stepUpSmsSend()},stepUpWithSms:async o=>this.steppedUp(async()=>(await n.stepUp({body:{method:"sms",code:o}})).data)},this.passkey={register:async o=>{let l=(await n.webauthnRegisterBegin({body:{name:o}})).data,d=await this.authenticator().create({publicKey:Jt(l.options.publicKey)});return(await n.webauthnRegisterFinish({body:zt(d)})).data},signIn:async(o={})=>{let l=(await a.webauthnLoginBegin({body:o.userId?{user_id:o.userId}:{}})).data,d=await this.authenticator().get({publicKey:Ge(l.options.publicKey)}),c=await a.webauthnLoginFinish({query:o.userId?{user_id:o.userId}:void 0,body:He(d)});return this.signedIn(c.data)},signUp:async(o,l)=>{let d=(await a.webauthnSignupBegin({body:{identifier:o,user_name:l}})).data,c=await this.authenticator().create({publicKey:Jt(d.options.publicKey)});await a.webauthnSignupFinish({query:{user_id:d.user_id},body:zt(c)});let f=(await a.webauthnLoginBegin({body:{user_id:d.user_id}})).data,g=await this.authenticator().get({publicKey:Ge(f.options.publicKey)});return this.signedIn((await a.webauthnLoginFinish({query:{user_id:d.user_id},body:He(g)})).data)},stepUp:async()=>this.steppedUp(async()=>{let o=(await n.stepUpWebAuthnBegin()).data,l=await this.authenticator().get({publicKey:Ge(o.publicKey)});return(await n.stepUp({body:{method:"webauthn",...He(l)}})).data}),list:async()=>(await n.webauthnListCredentials()).data,remove:async o=>{await n.webauthnDeleteCredential({path:{id:o}})}},this.magicLink={send:async(o,l={})=>{await a.magicLinkRequest({body:{email:o,...l.redirectTo?{redirect_to:l.redirectTo}:{}}})},verify:async o=>this.signedIn((await a.magicLinkVerify({body:{token:o}})).data)},this.phone={sendCode:async o=>(await a.requestPhoneOtp({body:{phone:o,channel:"sms"}})).data,verifyCode:async(o,l)=>this.signInResult((await a.verifyPhoneOtp({body:{phone:o,token:l}})).data)},this.password={requestReset:async(o,l={})=>{await a.passwordResetRequest({body:{email:o,...l.redirectTo?{redirect_to:l.redirectTo}:{}}})},confirmReset:async(o,l)=>{await a.passwordResetConfirm({body:{token:o,new_password:l}})},change:async o=>(await n.passwordChange({body:o})).data,set:async o=>(await n.setPassword({body:o})).data},this.email={verify:async o=>{await a.verifyEmail({body:o})},resendVerification:async o=>(await a.resendVerification({body:{email:o}})).data},this.sessions={list:async()=>(await n.listSessions()).data,revoke:async o=>{await n.revokeSession({path:{id:o}})},revokeAll:async()=>{await n.revokeAllSessions()}}}onAuthStateChange(e){return this.session.onChange(e)}currentSession(){return this.session.session()}get sessionEndReason(){return this.session.endReason}async signUp(e){let t=(await this.open.signup({body:e})).data;return t.access_token&&t.refresh_token&&t.expires_in!==void 0&&await this.session.set({access_token:t.access_token,refresh_token:t.refresh_token,expires_in:t.expires_in},"SIGNED_IN",t.user),t}async signIn(e,t){return this.signInResult((await this.open.login({body:{email:e,password:t}})).data)}async signOut(){try{await this.session.session()&&await this.api.logout()}finally{await this.session.clear("SIGNED_OUT")}}async getUser(){let e=this.session.snapshot(),t=(await this.api.getMe()).data;return await this.session.setUser(t,e),t}async refreshSession(){return this.session.refresh()}async deleteAccount(e){await this.api.deleteAccount(e===void 0?void 0:{body:{password:e}}),await this.session.clear("SIGNED_OUT")}async signInResult(e){return"mfa_required"in e&&e.mfa_required?{mfaRequired:{mfaToken:e.mfa_token,factors:e.factors}}:{user:await this.signedIn(e)}}async setSession(e){return this.signedIn(e)}async signedIn(e){let t=await this.session.set({access_token:e.access_token,refresh_token:e.refresh_token,expires_in:e.expires_in},"SIGNED_IN",e.user);if(e.user)return e.user;let s=(await this.api.verifyTokenUser()).data;return await this.session.setUser(s,t),s}async steppedUp(e){let t=await this.session.session();if(!t)throw new T("a step-up raises the signed-in session: nobody is signed in");let s=await e();if((await this.session.session())?.refreshToken!==t.refreshToken)throw new T("the session changed during the step-up");return this.session.set({access_token:s.access_token,refresh_token:t.refreshToken,expires_in:s.expires_in},"TOKEN_REFRESHED")}authenticator(){if(!this.credentials)throw new Error("passkeys need navigator.credentials (or createClient({ webauthn }))");return this.credentials}},we=r=>{let e=atob(r.replace(/-/g,"+").replace(/_/g,"/").padEnd(Math.ceil(r.length/4)*4,"=")),t=new Uint8Array(e.length);for(let s=0;s<e.length;s++)t[s]=e.charCodeAt(s);return t.buffer},N=r=>{if(!r)return;let e=r instanceof ArrayBuffer?new Uint8Array(r):new Uint8Array(r.buffer,r.byteOffset,r.byteLength),t="";for(let s of e)t+=String.fromCharCode(s);return btoa(t).replace(/\+/g,"-").replace(/\//g,"_").replace(/=+$/,"")},Xt=r=>Array.isArray(r)?r.map(e=>({...e,id:we(String(e.id))})):void 0;function Jt(r){let e=r.user;return{...r,challenge:we(String(r.challenge)),user:{...e,id:we(String(e.id))},excludeCredentials:Xt(r.excludeCredentials)}}function Ge(r){return{...r,challenge:we(String(r.challenge)),allowCredentials:Xt(r.allowCredentials)}}function zt(r){let e=r,t=e.response;return{id:e.id,rawId:N(e.rawId),type:"public-key",authenticatorAttachment:e.authenticatorAttachment??void 0,clientExtensionResults:e.getClientExtensionResults?.()??{},response:{clientDataJSON:N(t.clientDataJSON),attestationObject:N(t.attestationObject),transports:t.getTransports?.()}}}function He(r){let e=r,t=e.response;return{id:e.id,rawId:N(e.rawId),type:"public-key",authenticatorAttachment:e.authenticatorAttachment??void 0,clientExtensionResults:e.getClientExtensionResults?.()??{},response:{clientDataJSON:N(t.clientDataJSON),authenticatorData:N(t.authenticatorData),signature:N(t.signature),userHandle:N(t.userHandle)}}}var di=/^pb_[a-z0-9]+_s/,ci=/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i,hi=new Set(["invalid_token","token_expired","session_expired","session_revoked","missing_token"]),ui=new Set(["invalid_token","token_reuse","token_expired","session_revoked","session_expired","session_device_changed"]);function pi(r){return r.status===400&&r.code==="invalid_request"}function Ln(r){if(di.test(r.publishableKey)||"secretKey"in r)throw new TypeError("a secret key never goes into a client app: palbase/web takes the publishable key (pb_<ref>_c\u2026); servers use palbase/server");let e=/^pb_([a-z0-9]+)_c/.exec(r.publishableKey)?.[1];if(e===void 0)throw new TypeError("publishableKey is the project publishable key (pb_<ref>_c\u2026)");if(r.appId!==void 0&&!ci.test(r.appId))throw new TypeError("appId is the registered app's id, a UUID (settings.appId of palbase apps:sync), not its slug");let t=Yt(r.language),s=(v,k)=>{let _=r.fetch??globalThis.fetch;if(t===void 0)return _(v,k);let M=new Headers(k?.headers);return M.has("accept-language")||M.set("accept-language",t),_(v,{...k,headers:M})},i=new URL(r.url).origin,n=r.storage??(gi()?at(`palbase.session.${i}`):rt()),a=r.retry??Xe,o=H(j({baseUrl:r.url,credentials:{publishableKey:r.publishableKey},fetch:s}),a),l=K.client(o),d=new B(n,async v=>(await l.refreshToken({body:{refresh_token:v}})).data,v=>v instanceof w&&(v.status===401&&ui.has(v.code)||pi(v)),{lockName:`palbase.session.refresh.${i}`,refresh:r.refresh}),c=j({baseUrl:r.url,credentials:{publishableKey:r.publishableKey,accessToken:()=>d.accessToken()},fetch:s,xmlHttpRequest:r.xmlHttpRequest??(r.fetch===void 0?globalThis.XMLHttpRequest:void 0)}),f=H(be(c,d),a),g=new z({baseUrl:r.url,publishableKey:r.publishableKey,accessToken:()=>d.accessToken(),webSocket:r.webSocket});d.onChange(v=>{v==="SIGNED_OUT"||v==="SESSION_EXPIRED"||v==="SIGNED_IN"?g.disconnect():v==="TOKEN_REFRESHED"&&g.tokenChanged()});let S=new X(i),m=v=>H(be(j({baseUrl:r.url,credentials:{publishableKey:r.publishableKey,accessToken:async()=>{let k=await d.accessToken();if(k===void 0||Pe(k)!==v)throw new T(`the session is no longer ${v}'s`);return k}},fetch:s}),d),a),h=v=>K.client(m(v)),p=new se({userApi:h,deviceApi:l,session:d,socket:g,ref:e,installation:S,origin:i,options:r.consent}),y=j({baseUrl:r.url,credentials:{publishableKey:r.publishableKey},fetch:s}),P=new ee(be(c,d),y,d,p,S,i),R=new de(f,d,g,e,s,r.appVersion,r.appId),U=new le(f,d,S,p,R,r.url,r.publishableKey);P.onEvent((v,k)=>U.inApp.trigger(v,k)),r.analytics&&P.start(r.analytics===!0?{}:r.analytics);let W=new Map,ke=v=>{let k=new URL(v).origin,_=W.get(k);return _||(_=H(be(j({baseUrl:k,credentials:{accessToken:()=>d.accessToken()},fetch:s}),d),a),W.set(k,_)),_},u=tt(f),b=v=>{let k=d.snapshot();k&&s(new URL(v,i).href,{method:"POST",keepalive:!0,headers:{apikey:r.publishableKey,authorization:`Bearer ${k.accessToken}`}}).catch(()=>{})},C=Object.assign(Object.create(st),{auth:new ye(f,o,d,r.webauthn??globalThis.navigator?.credentials),socket:g,transport:f,analytics:P,consent:p,installation:S,purchases:R,notify:U,flags:new ce(f,d,g,S,e,i,P,r.appVersion),messaging:new me(f,m,d,g,e,s,r.messaging),calls:new ve(m,d,g,e,`web-${S.id}`,b,r.calls),setLanguage(v){t=Yt(v??void 0)},chatToolCall:(v,k,_={})=>u.toolCall(v,k,_.signal),chatWorkspaceFile:(v,k,_,M={})=>u.workspaceFile(v,k,_,M.signal)});return it(C,i,ke,f,g,()=>d.snapshot()?.userId),C}var fi=/^[A-Za-z]{1,8}(-[A-Za-z0-9]{1,8})*$/;function Yt(r){if(r===void 0)return;let e=typeof r=="string"?[r]:[...r];if(e.length!==0){for(let t of e)if(!fi.test(t))throw new TypeError(`language ${JSON.stringify(t)} is a BCP 47 tag ("tr", "pt-BR")`);return e.map((t,s)=>s===0?t:`${t};q=${Math.max(.1,1-s/10).toFixed(1)}`).join(", ")}}function gi(){try{return typeof globalThis.localStorage<"u"}catch{return!1}}function be(r,e){return{async send(t){let s=await e.session();try{return await r.send(t)}catch(i){let n=t.auth.some(a=>a.includes("userJWT"));if(!(i instanceof w)||i.status!==401||!hi.has(i.code)||!n||!s)throw i;try{e.snapshot()?.refreshToken===s.refreshToken&&await e.refresh()}catch{throw i}if(e.snapshot()?.userId!==s.userId)throw i;return r.send(t)}}}}export{T as a,rt as b,at as c,xe as d,z as e,X as f,ee as g,se as h,ne as i,re as j,oe as k,Re as l,le as m,de as n,Is as o,ce as p,ti as q,me as r,Ue as s,Le as t,qe as u,je as v,Ke as w,$e as x,Ve as y,ve as z,Fe as A,Ln as B};
|