@lunora/client 1.0.0-alpha.232 → 1.0.0-alpha.234
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/auth/index.d.mts +1 -1
- package/dist/auth/index.d.ts +1 -1
- package/dist/index.d.mts +82 -3
- package/dist/index.d.ts +82 -3
- package/dist/index.mjs +1 -1
- package/dist/packem_shared/LunoraClient-D6Mn3qEX.mjs +1 -0
- package/dist/packem_shared/OfflineQueue-BLRESpAe.mjs +1 -0
- package/dist/packem_shared/TabCoordinator-DBuR7Dwv.mjs +1 -0
- package/dist/packem_shared/client-tuning-C10B2KCO.mjs +1 -0
- package/dist/packem_shared/connectLiveStream-CXD8k-Sp.mjs +1 -0
- package/dist/packem_shared/{createAsyncStorageQueryCache-f5023fdB.mjs → createAsyncStorageQueryCache-COqH5_SV.mjs} +1 -1
- package/dist/packem_shared/{createInMemoryPersistence-Cz2W6XVj.mjs → createInMemoryPersistence-BfgXApi_.mjs} +1 -1
- package/dist/packem_shared/{createInMemoryQueryCache-D2uNHLfM.mjs → createInMemoryQueryCache-B5wX-gTy.mjs} +1 -1
- package/dist/packem_shared/{createServerClient-BqCdfoE1.mjs → createServerClient-B0TsbJkS.mjs} +1 -1
- package/dist/packem_shared/httpStream-DceAMeMf.mjs +9 -0
- package/dist/packem_shared/idb-utility-BS7xvou1.mjs +1 -0
- package/dist/packem_shared/live-stream-Dil9byXF.mjs +10 -0
- package/dist/packem_shared/{liveTopicSubscription-Bs-ULKfs.mjs → liveTopicSubscription-gOmRbuhH.mjs} +1 -1
- package/dist/packem_shared/{lunora-client.d-DpmxnYmL.d.ts → lunora-client.d-CZ9TlyaL.d.ts} +207 -19
- package/dist/packem_shared/{lunora-client.d-dOEEoF4x.d.mts → lunora-client.d-DZ9gzk9p.d.mts} +207 -19
- package/dist/packem_shared/offline-queue-Dt_um8sR.mjs +1 -0
- package/dist/packem_shared/{preload.d-XVLTUaah.d.mts → preload.d-BOpEnFP8.d.mts} +1 -1
- package/dist/packem_shared/{preload.d-BkXsKMmU.d.ts → preload.d-CXUIU6pE.d.ts} +1 -1
- package/dist/packem_shared/stream-idle-C7CsIT_m.mjs +1 -0
- package/dist/packem_shared/{wire-errors-Bw04a4ZQ.mjs → wire-errors-BTLdHNoh.mjs} +1 -1
- package/dist/query/index.d.mts +2 -2
- package/dist/query/index.d.ts +2 -2
- package/dist/service.mjs +1 -1
- package/dist/ssr/index.d.mts +2 -2
- package/dist/ssr/index.d.ts +2 -2
- package/dist/ssr/index.mjs +1 -1
- package/package.json +1 -1
- package/dist/packem_shared/LunoraClient-D6MyuSWy.mjs +0 -1
- package/dist/packem_shared/OfflineQueue-BWamzR6p.mjs +0 -1
- package/dist/packem_shared/TabCoordinator-CXD7vulJ.mjs +0 -1
- package/dist/packem_shared/connectLiveStream-DCgklEjI.mjs +0 -1
- package/dist/packem_shared/httpStream-DaqP70Ne.mjs +0 -9
- package/dist/packem_shared/idb-utility-C8WS390w.mjs +0 -1
- package/dist/packem_shared/live-stream-ct8j7T75.mjs +0 -10
- package/dist/packem_shared/offline-queue-D_fr-uQ3.mjs +0 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{LunoraError as y}from"@lunora/errors";import{encodeWire as x,decodeWire as w,stableWireKey as ce}from"@lunora/wire";import{r as De,U as We,P as xe}from"./delta-merge-Ls3DED4g.mjs";import{w as v,b as ne,j as C,d as de,p as ue,s as he}from"./client-urls-BHLUjjcG.mjs";import Be from"./createInMemoryBookmarkStorage-BooZhW0n.mjs";import{s as X,a as Qe,e as B,r as qe,b as le,w as Ke,c as Ge,d as fe,u as je}from"./wire-errors-BTLdHNoh.mjs";import{ClientQueryStore as $e}from"./createClientQuery-B8Nfj-7o.mjs";import{D as Ve,a as ze,b as Je,c as Ye,d as Xe,S as pe,M as Ze,I as et,Q as tt,R as st,e as it,f as nt,g as rt}from"./client-tuning-C10B2KCO.mjs";import{TabCoordinator as ot}from"./TabCoordinator-DBuR7Dwv.mjs";import{TransportError as U,getRetryAfterMs as at,AUTH_REPLAY_ERROR_CODES as ct,isAuthReplayFailure as Q}from"./CONFLICT_ERROR_CODE-B7qNZMMk.mjs";import{httpStream as dt}from"./httpStream-DceAMeMf.mjs";import{d as Z,r as M,a as F,b as ut,c as ht,e as lt,f as ft}from"./local-store-fqWV2n_Z.mjs";import{O as pt,n as me,i as mt}from"./offline-queue-Dt_um8sR.mjs";import{resolvePersistenceAdapter as yt}from"./createInMemoryPersistence-BfgXApi_.mjs";import{w as W,a as ye,b as St}from"./stream-idle-C7CsIT_m.mjs";import{resolveQueryCacheAdapter as bt,queryCacheKey as L}from"./createInMemoryQueryCache-B5wX-gTy.mjs";import{createReconnect as Se}from"./createReconnect-CjTmjJDH.mjs";import{fanSubscriptionError as I,SubscriptionRegistry as A,wrapSubscriber as j}from"./SubscriptionRegistry-DKIXE7M7.mjs";import vt from"./createSnapshotPrecondition-CLkxVeN1.mjs";import{createStream as gt}from"./DEFAULT_MAX_BUFFER-Bd-_iyiV.mjs";const $=500,Ee=(n,e)=>{if(n.size<e)return;const t=n.keys().next().value;t!==void 0&&n.delete(t)},_="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_",Tt=n=>{let e="",t=0;const s=n.length-2;for(;t<s;t+=3){const r=n[t]<<16|n[t+1]<<8|n[t+2];e+=_.charAt(r>>18&63)+_.charAt(r>>12&63)+_.charAt(r>>6&63)+_.charAt(r&63)}const i=n.length-t;if(i===1){const r=n[t]<<16;e+=_.charAt(r>>18&63)+_.charAt(r>>12&63)}else if(i===2){const r=n[t]<<16|n[t+1]<<8;e+=_.charAt(r>>18&63)+_.charAt(r>>12&63)+_.charAt(r>>6&63)}return e};new TextDecoder;const kt=new TextEncoder,wt=n=>Tt(kt.encode(JSON.stringify(n))),Ct="x-lunora-expect-subject",Et=n=>wt({subject:n}),be=Symbol.for("lunora:session-change"),At="lunora:session-change",_t="better-auth.message",It="signout",Ae=()=>{const n=globalThis;let e=n[be];return e===void 0&&(e={detach:void 0,listeners:new Set,tab:`${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`},n[be]=e),e},Ot=()=>"document"in globalThis,Rt=async()=>{const n=[];for(const e of Ae().listeners)try{n.push(e())}catch{}await Promise.allSettled(n)},Pt=(n,e)=>{if(n!==_t||e===null)return!1;try{const t=JSON.parse(e);return t?.event==="session"&&t.data?.trigger===It}catch{return!1}},Ft=n=>{const e=[],t=()=>{Rt().catch(()=>{})};let s;try{s=typeof BroadcastChannel=="function"?new BroadcastChannel(At):void 0}catch{s=void 0}if(s!==void 0){const r=s;r.addEventListener("message",o=>{o.data?.type==="lunora:session-change"&&o.data.tab!==n&&t()}),e.push(()=>{r.close()})}const i=globalThis;if(typeof i.addEventListener=="function"){const r=o=>{Pt(o.key,o.newValue)&&t()};i.addEventListener("storage",r),e.push(()=>{i.removeEventListener?.("storage",r)})}return()=>{for(const r of e)r()}},Lt=n=>{const e=Ae();return e.listeners.add(n),e.detach===void 0&&Ot()&&(e.detach=Ft(e.tab)),()=>{e.listeners.delete(n),e.listeners.size===0&&(e.detach?.(),e.detach=void 0)}},Mt="/_lunora/rpc",V="/_lunora/rpc-batch",z="/_lunora/ws",Ht="/_lunora/admin/shard-traffic",Ut="/_lunora/admin/scheduled",Nt="/_lunora/admin/scheduled/status",Dt="/_lunora/admin/scheduled/ws",Wt="/_lunora/admin/scheduled/cancel",ve="/_lunora/admin/scheduled/dead",xt="/_lunora/admin/scheduled/dead/retry",Bt="/_lunora/admin/scheduled/dead/cancel",Qt="/_lunora/admin/workflows/instances",qt="/_lunora/admin/workflows/instance",Kt="/_lunora/admin/workflows/status",re="/_lunora/admin/storage",Gt="/_lunora/admin/storage/url",jt="/_lunora/admin/storage/buckets",$t="/_lunora/admin/functions",Vt="/_lunora/admin/cron-jobs",zt="/_lunora/admin/cron-jobs/run",Jt="/_lunora/admin/architecture",Yt="/_lunora/admin/openapi",Xt="/_lunora/admin/openrpc",Zt="/_lunora/admin/global/tables",es="/_lunora/admin/global/table",ts="/_lunora/admin/global/facet",ss="/_lunora/admin/vector/indexes",is="/_lunora/admin/vector/query",ns="/_lunora/admin/logs/archive",rs="/_lunora/admin/kv/namespaces",os="/_lunora/admin/kv/keys",oe="/_lunora/admin/kv/value",as="/_lunora/admin/auth/users",cs="/_lunora/admin/auth/sessions",ds="/_lunora/admin/auth/users/create",us="/_lunora/admin/auth/users/role",hs="/_lunora/admin/auth/users/ban",ls="/_lunora/admin/auth/users/unban",fs="/_lunora/admin/auth/users/password",ps="/_lunora/admin/auth/users/remove",ms="/_lunora/admin/auth/users/impersonate",ys="/_lunora/admin/auth/sessions/revoke",Ss="/_lunora/admin/auth/sessions/revoke-all",bs="/_lunora/admin/auth/capabilities",vs="/_lunora/admin/auth/users/update",gs="/_lunora/admin/auth/accounts",Ts="/_lunora/admin/auth/accounts/unlink",ks="/_lunora/admin/auth/passkeys",ws="/_lunora/admin/auth/passkeys/delete",Cs="/_lunora/admin/auth/two-factor/disable",Es="/_lunora/admin/auth/organizations",As="/_lunora/admin/auth/organizations/members",_s="/_lunora/admin/auth/organizations/invitations",Is="/_lunora/admin/auth/organizations/members/remove",Os="/_lunora/admin/auth/organizations/invitations/cancel",Rs="/_lunora/admin/auth/config",Ps="/_lunora/admin/auth/sign-up-invitations",Fs="/_lunora/admin/auth/sign-up-invitations/create",Ls="/_lunora/admin/auth/sign-up-invitations/revoke",Ms="/_lunora/admin/auth/organizations/create",Hs="/_lunora/admin/auth/organizations/update",Us="/_lunora/admin/auth/organizations/remove",Ns="/_lunora/admin/auth/organizations/members/add",Ds="/_lunora/admin/auth/organizations/members/invite",Ws="/_lunora/admin/auth/organizations/members/role",xs="/_lunora/admin/auth/organizations/teams",Bs="/_lunora/admin/auth/organizations/teams/create",Qs="/_lunora/admin/auth/organizations/teams/update",qs="/_lunora/admin/auth/organizations/teams/remove",Ks="/_lunora/admin/auth/organizations/teams/members",Gs="/_lunora/admin/auth/organizations/teams/members/add",js="/_lunora/admin/auth/organizations/teams/members/remove",$s="/_lunora/admin/auth/organizations/roles",Vs="/_lunora/admin/auth/organizations/roles/create",zs="/_lunora/admin/auth/organizations/roles/update",Js="/_lunora/admin/auth/organizations/roles/remove",Ys="/api/auth",Xs="/get-session",Zs="lunora-ping",ei=async n=>(n.assertOpen(),(await n.adminFetch($t,"GET")).functions??[]),ti=async n=>(n.assertOpen(),(await n.adminFetch(Vt,"GET")).jobs??[]),si=async(n,e)=>{n.assertOpen();const t=await n.adminFetch(zt,"POST",{name:e});return{name:t.name??e,ran:t.ran===!0}},ii=async n=>(n.assertOpen(),await n.adminFetch(Yt,"GET")),ni=async n=>(n.assertOpen(),await n.adminFetch(Jt,"GET")),ri=async n=>(n.assertOpen(),await n.adminFetch(Xt,"GET")),oi=async n=>(n.assertOpen(),await n.adminFetch(Zt,"GET")),ai=async(n,e)=>{n.assertOpen();const t=new URLSearchParams({table:e.table});return e.limit!==void 0&&t.set("limit",String(e.limit)),e.offset!==void 0&&t.set("offset",String(e.offset)),e.filters!==void 0&&e.filters.length>0&&t.set("filters",JSON.stringify(x(e.filters))),w(await n.adminFetch(`${es}?${t.toString()}`,"GET"))},ci=async(n,e)=>{n.assertOpen();const t=new URLSearchParams({column:e.column,table:e.table});return e.limit!==void 0&&t.set("limit",String(e.limit)),e.filters!==void 0&&e.filters.length>0&&t.set("filters",JSON.stringify(x(e.filters))),w(await n.adminFetch(`${ts}?${t.toString()}`,"GET"))},di=async n=>(n.assertOpen(),(await n.adminFetch(rs,"GET")).namespaces??[]),ui=async(n,e)=>{n.assertOpen();const t=v(os,{cursor:e.cursor,limit:e.limit,namespace:e.namespace,prefix:e.prefix});return await n.adminFetch(t,"GET")},hi=async(n,e)=>{n.assertOpen();const t=v(oe,{key:e.key,namespace:e.namespace});return await n.adminFetch(t,"GET")},li=async(n,e)=>{n.assertOpen(),await n.adminFetch(oe,"PUT",e)},fi=async(n,e)=>{n.assertOpen();const t=v(oe,{key:e.key,namespace:e.namespace});await n.adminFetch(t,"DELETE")},pi=async(n,e)=>{n.assertOpen();const t=await n.adminFetch(Ht,"POST",{table:e});return{failed:t.failed??0,ok:t.ok??0,shards:t.shards??[]}},mi=async(n,e={})=>{n.assertOpen();const t=await n.adminFetch(ns,"POST",e);return{nextCursor:t.nextCursor,rows:t.rows??[]}},yi=async n=>{const e=[];let t;for(;;){const s=await n(t);if(e.push(...Array.isArray(s.records)?s.records:[]),s.truncated!==!0||typeof s.cursor!="string"||s.cursor.length===0)return e;if(s.cursor===t)throw new Error("collectPages: the list did not advance its cursor — refusing to page forever");t=s.cursor}},ae=n=>"args"in n?{...n,args:w(n.args)}:n,Si=async n=>(n.assertOpen(),((await n.adminFetch(Ut,"GET")).records??[]).map(t=>ae(t))),bi=async n=>{n.assertOpen();const e=await n.adminFetch(Nt,"GET");return{backlog:e.backlog??0,inFlight:e.inFlight??0,pools:e.pools??[]}},vi=async(n,e)=>(n.assertOpen(),{cancelled:(await n.adminFetch(Wt,"POST",{id:e})).cancelled===!0}),gi=async n=>(n.assertOpen(),(await yi(async t=>await n.adminFetch(t===void 0?ve:`${ve}?cursor=${encodeURIComponent(t)}`,"GET"))).map(t=>ae(t))),Ti=async(n,e)=>(n.assertOpen(),{retried:(await n.adminFetch(xt,"POST",{id:e})).retried===!0}),ki=async(n,e)=>(n.assertOpen(),{removed:(await n.adminFetch(Bt,"POST",{id:e})).removed===!0}),wi=async(n,e)=>{n.assertOpen();const t=new URLSearchParams({name:e.name});e.status!==void 0&&t.set("status",e.status),e.page!==void 0&&t.set("page",String(e.page)),e.perPage!==void 0&&t.set("perPage",String(e.perPage));const s=await n.adminFetch(`${Qt}?${t.toString()}`,"GET");return{configured:s.configured,instances:s.instances??[],page:s.page??1,perPage:s.perPage??e.perPage??0,totalCount:s.totalCount}},Ci=async(n,e)=>{n.assertOpen();const t=new URLSearchParams({id:e.id,name:e.name}),s=await n.adminFetch(`${qt}?${t.toString()}`,"GET");return{createdOn:s.createdOn,endedOn:s.endedOn,error:s.error,id:s.id??e.id,output:s.output,params:s.params,startedOn:s.startedOn,status:s.status??"unknown",steps:s.steps??[]}},Ei=async(n,e)=>(n.assertOpen(),{status:(await n.adminFetch(Kt,"POST",{action:e.action,id:e.id,name:e.name})).status??"unknown"}),Ai=async(n,e={})=>{n.assertOpen();const t=v(re,{bucket:e.bucket,cursor:e.cursor,limit:e.limit,prefix:e.prefix}),s=await n.adminFetch(t,"GET");return{cursor:s.cursor,objects:s.objects??[]}},_i=async(n,e,t)=>{n.assertOpen();const s=`${re}?key=${encodeURIComponent(e)}${ne(t?.bucket)}`,i=await n.adminFetch(s,"DELETE");return{deleted:i.deleted===!0,key:i.key??e}},Ii=async n=>(n.assertOpen(),(await n.adminFetch(jt,"GET")).buckets??[]),Oi=async(n,e)=>{n.assertOpen();const t=`${re}?key=${encodeURIComponent(e.key)}${ne(e.bucket)}`,s=await n.adminFetch(t,"PUT",e.body,e.contentType);return{etag:s.etag,key:s.key??e.key}},Ri=async(n,e,t)=>{n.assertOpen();const s=t?.expiresInSeconds,i=s===void 0?"":`&expiresIn=${encodeURIComponent(s.toString())}`,r=`${Gt}?key=${encodeURIComponent(e)}${i}${ne(t?.bucket)}`,o=await n.adminFetch(r,"GET");if(typeof o.url!="string")throw new TypeError("LunoraClient: storage URL endpoint returned no `url`");return o.url},Pi=async n=>(n.assertOpen(),(await n.adminFetch(ss,"GET")).indexes??[]),Fi=async(n,e)=>(n.assertOpen(),(await n.adminFetch(is,"POST",e)).matches??[]),E=(n,e)=>{try{return x(n)}catch(t){const s=t instanceof Error?t.message:String(t);throw new TypeError(`LunoraClient: cannot encode ${e} — ${s}`,t instanceof Error?{cause:t}:void 0)}},ee=n=>{try{return x(n),!0}catch{return!1}},_e=n=>n!==null&&typeof n=="object"&&("error"in n||"result"in n),Li=(n,e)=>{const t=Array.from({length:e});for(const s of n){if(typeof s.id!="number"||s.id<0||s.id>=e)continue;if(!_e(s.body)){t[s.id]={error:X({}),ok:!1};continue}const i=s.body;t[s.id]="error"in i?{error:X(i),ok:!1}:{ok:!0,value:w(i.result)}}return t.map(s=>s??{error:new Error("batch call returned no result"),ok:!1})},J=(n,e)=>e!==null?{}:n===null?{expectSubject:null}:n?.startsWith("subj:")===!0?{expectSubject:n.slice(5)}:{},q=n=>n==="connected"||n==="polling",l=n=>n??"",k=(n,e)=>{if(!n.socket||n.wsState!=="open")return!1;try{return n.socket.send(JSON.stringify(e)),!0}catch{return!1}},Mi=n=>{if(!n.pendingStreams||n.pendingStreams.length===0)return;const e=n.pendingStreams;n.pendingStreams=[];for(const t of e)k(n,t)},Hi=new TextDecoder,Ui=n=>{if(typeof n=="string")return n;if(n instanceof ArrayBuffer)return Hi.decode(n)};class R{listeners=new Set;get size(){return this.listeners.size}add(e){return this.listeners.add(e),()=>{this.listeners.delete(e)}}emit(...e){const[t]=e;for(const s of this.listeners)try{s(t)}catch{}}clear(){this.listeners.clear()}}const H=n=>{n.heartbeatTimer!==void 0&&(clearInterval(n.heartbeatTimer),n.heartbeatTimer=void 0)},Ni=(n,e,t)=>{H(n),!(e<=0)&&(n.heartbeatTimer=setInterval(()=>{if(!n.socket)return;const{socket:s}=n;if(Date.now()-n.lastFrameAt>e*2.5){try{s.close()}catch{}t();return}try{s.send(Zs)}catch{}},e))},ge=(n,e,t,s)=>{const{WebSocketImpl:i,connectTimeoutMs:r,heartbeatIntervalMs:o}=t;if(i===void 0)throw new y("INTERNAL","no WebSocket implementation available");const a=new i(e);n.socket=a;const c=()=>{H(n),n.connectTimer!==void 0&&(clearTimeout(n.connectTimer),n.connectTimer=void 0),n.socket===a&&(n.socket=void 0)},u=d=>{c(),s.onClose(d)};r>0&&(n.connectTimer=setTimeout(()=>{if(n.connectTimer=void 0,n.socket===a){try{a.close()}catch{}u()}},r)),a.addEventListener("open",()=>{if(n.socket===a){n.connectTimer!==void 0&&(clearTimeout(n.connectTimer),n.connectTimer=void 0),n.lastFrameAt=Date.now();try{s.onOpen?.()}catch(d){console.error("[lunora] connection open handler threw",d)}n.socket===a&&Ni(n,o,u)}}),a.addEventListener("message",d=>{if(n.socket===a){n.lastFrameAt=Date.now();try{s.onMessage(d)}catch(h){console.error("[lunora] server frame handler threw",h)}}}),a.addEventListener("close",d=>{n.socket===a&&u(d)}),a.addEventListener("error",()=>{n.socket===a&&u()})},Di=n=>{const{afterFailedAttempts:e,intervalMs:t,onReachable:s,onStateChange:i,poll:r}=n,o=t>0&&e>0;let a=0,c,u=!1,d=!1;const h=()=>{c!==void 0&&(clearInterval(c),c=void 0,u=!1,i())},p=m=>{if(c!==void 0){if(!m){h();return}u||(u=!0,i()),s()}},f=()=>{d||(d=!0,r().then(p).finally(()=>{d=!1}).catch(()=>{}))};return{isPolling:()=>c!==void 0&&u,noteFailedOpen:()=>{a+=1,!(!o||c!==void 0||a<e)&&(c=setInterval(f,t),i(),f())},noteOpen:()=>{a=0,h()},stop:h}},Wi=1e4,Te=async n=>W(Wi,void 0,n,()=>new TypeError("LunoraClient: poll timed out")),Ie=new Set(["DELIVERY_FENCED","RATE_LIMITED","SHARD_ERROR","SHARD_UNAVAILABLE","TOO_MANY_REQUESTS"]),ke=n=>{if(n instanceof U)return!0;const e=n?.code;return e===void 0||Ie.has(e)||ct.has(e)},xi=1e3,Oe=6e4,Bi={401:"UNAUTHORIZED",403:"FORBIDDEN",404:"NOT_FOUND",413:"PAYLOAD_TOO_LARGE",429:"TOO_MANY_REQUESTS"},D=(n,e,t)=>{const s=Qe(t),i=s===void 0?void 0:{retryAfterMs:s},r=`LunoraClient: response carried no error envelope (status ${n.toString()}${e?` ${e}`:""})`;return n<400||n>=500||n===408?new U(r,i):new y(Bi[n]??"BAD_REQUEST",r,{data:i})},te=(n,e=Math.random)=>{const t=Math.min(xi*2**Math.max(n-1,0),Oe);return Math.round(t*(.5+e()*.5))},Qi=n=>{const e=n?.code;return n instanceof U||e===void 0||Ie.has(e)},qi=(n,e,t)=>{const s=at(n);return s!==void 0&&s>0?Math.min(s,Oe):Qi(n)?te(e,t):void 0},Ki=983040,Gi=n=>typeof TextEncoder>"u"?n.length:new TextEncoder().encode(n).length,Re=new WeakSet,Pe=n=>{const e=new y("WIRE_DECODE_FAILED",`LunoraClient: the call succeeded but its result could not be decoded (a mutation has still committed) — ${n instanceof Error?n.message:String(n)}`,{cause:n});return Re.add(e),e},K=n=>n instanceof Error&&Re.has(n),ji=n=>{const e=new Map;for(const t of n)typeof t.id=="number"&&_e(t.body)&&e.set(t.id,t.body);return e},$i=n=>{if(n===void 0)return{kind:"unanswered"};if("error"in n)return{error:X(n),kind:"errored"};try{return{commitCursor:n.commitCursor,kind:"committed",value:w(n.result)}}catch(e){return{commitCursor:n.commitCursor,error:Pe(e),kind:"undecodable"}}},Y=(n,e)=>`${l(n)}\0${e}`,Vi=(n,e)=>{for(const t of e)t.op==="delete"?n.delete(t.key):t.value!==void 0&&n.set(t.key,t.value)};class zi{constructor(e){this.maxBuffers=e}maxBuffers;buffers=new Map;start(e,t){Ee(this.buffers,this.maxBuffers),this.buffers.set(Y(e,t.pokeId),{baseCheckpoint:t.baseCheckpoint,bases:new Map,epoch:t.epoch,lastMutationId:new Map,parts:new Map,resets:new Set,undecodable:new Map})}part(e,t){const s=this.buffers.get(Y(e,t.pokeId));if(!s)return;const i=[];try{for(const a of t.rowsPatch)i.push(a.value===void 0?a:{...a,value:w(a.value)})}catch(a){s.undecodable.set(t.shapeId,a);return}const r=s.parts.get(t.shapeId)??[];for(const a of i)r.push(a);s.parts.set(t.shapeId,r),t.lastMutationId!==void 0&&s.lastMutationId.set(t.shapeId,t.lastMutationId);const o=t.baseCheckpoint??s.baseCheckpoint;o!==void 0&&s.bases.set(t.shapeId,o),t.reset===!0&&s.resets.add(t.shapeId)}end(e,t){const s=Y(e,t),i=this.buffers.get(s);return i&&this.buffers.delete(s),i}clear(){this.buffers.clear()}}const Ji=(n,e,t)=>{const s=e.parts.get(n.id)??[],i=e.resets.has(n.id),r=e.bases.get(n.id),o=e.epoch!==void 0&&n.serverEpoch!==void 0&&e.epoch!==n.serverEpoch,a=r!==void 0&&n.serverCursor!==void 0&&n.serverCursor!==r;if(!i&&(o||a))return n.rows.clear(),n.serverCursor=void 0,n.serverEpoch=void 0,n.answered=!1,"reseed";i&&n.rows.clear(),Vi(n.rows,s),n.answered=!0,t.checkpoint!==void 0&&(n.serverCursor=t.checkpoint),t.epoch!==void 0&&(n.serverEpoch=t.epoch);const c=e.lastMutationId.get(n.id);return c!==void 0&&(n.lastMutationId=c),"applied"},we=n=>{const e=[...n.rows.values()];for(const t of n.callbacks)try{t(e)}catch{}},Yi=(n,e)=>{for(const[t,s]of e.undecodable){const i=n.get(t);i&&I(i.errorCallbacks,{code:"WIRE_DECODE_FAILED",message:`could not decode a poke for this shape — ${s instanceof Error?s.message:String(s)}`})}},se=(n,e)=>{n.lastMutationId=Math.max(n.lastMutationId??0,e)},ie=(n,e=!1)=>{for(const t of n.checkpointCallbacks)t({checkpoint:n.serverCursor,mutationId:n.lastMutationId,...e&&{rowsFollow:!0}})},Fe=(n,e,t)=>{n.serverBase=e,t.cursor!==void 0&&(n.serverCursor=t.cursor),t.epoch!==void 0&&(n.serverEpoch=t.epoch)},Xi=(n,e)=>e.cursor!==void 0&&n.serverCursor!==void 0&&n.serverBase!==void 0&&e.epoch!==void 0&&e.epoch===n.serverEpoch&&e.cursor<n.serverCursor,G=(n,e)=>n!==void 0&&n!==e,Zi=(n,e)=>e==="connected"&&n!=="connected"||e==="polling"&&n!=="connected"&&n!=="polling",en=n=>{for(const e of n.activeSubscriptions())e.valueReceived=!1,n.ensureSocket(e.shardKey),n.queueResubscribe(e);for(const e of n.activeShapes())e.answered=!1,n.ensureSocket(e.shardKey);for(const e of n.queuedShardKeys())n.ensureSocket(e);n.broadcastStatus(n.computeStatus(),n.identityFingerprint()),n.emitConnectionStatus()},tn=n=>{n.closeConnections();const e=n.leader;e.status=void 0,e.wasEverConnected=!1;for(const t of n.activeSubscriptions())t.acked=!1,t.valueReceived=!1;for(const t of n.activeShapes())t.answered=!1;n.emitConnectionStatus()},sn=(n,e,t)=>{if(G(t,n.identityFingerprint()))return;const s=n.leader,i=Zi(s.status,e);s.status=e,e==="connected"&&(s.wasEverConnected=!0),n.emitConnectionStatus(),i&&n.flushOfflineQueues()},nn=n=>{n.isLeader()&&n.broadcastStatus(n.computeStatus(),n.identityFingerprint())},rn=(n,e,t,s,i,r)=>{if(G(r,n.identityFingerprint()))return;const o=n.subscription(e);if(!o)return;n.dropCacheSeed(e);const a=!o.valueReceived;o.valueReceived=!0,Fe(o,t,s===void 0?{}:{cursor:s,epoch:i}),s!==void 0&&Z(o,s),M(o,t),a&&n.emitConnectionStatus()},on=(n,e,t,s)=>{if(G(s,n.identityFingerprint()))return;const i=n.subscription(e);if(i){const r=!i.valueReceived;i.valueReceived=!0,I(i.errorCallbacks,t),r&&n.emitConnectionStatus()}},an=(n,e,t,s,i,r,o)=>{if(G(o,n.identityFingerprint()))return;const a=n.subscription(e);a&&(n.ackAndAdvanceCursor(a,t,s),i!==void 0&&r===n.clientIdentifier()&&se(a,i),ie(a))},cn=(n,e,t)=>n!==null||e&&t===null,dn=n=>n.sensitive===!0,un=(n,e)=>{if(!dn(n))return e;if(e.onlineOnly===!1)throw new y("BAD_REQUEST",`'${n.__lunoraRef}' takes a sensitive argument and is always online-only; onlineOnly: false is not allowed`);return{...e,onlineOnly:!0}},hn=[xe],ln=100,Le=1e4,fn=async(n,e,t,s)=>{const i=new AbortController,r=setTimeout(()=>{i.abort()},Le);try{const o=await n(e,{body:t,credentials:"include",headers:s,method:"POST",signal:i.signal});return await o.text(),o.status}finally{clearTimeout(r)}},Ce=(n,e)=>new y("OFFLINE_NOT_QUEUED",`'${n}' is online-only and the connection is not live, so it was not queued`,{cause:e}),pn=(n,e)=>n instanceof TypeError&&ee(e),mn=Promise.resolve();class Me{static MAX_POKE_BUFFERS=256;static createClientQuery(e,t){return{defaultValue:t,key:e}}url;wsUrl;adminHost={adminFetch:(...e)=>this.adminFetch(...e),assertOpen:()=>{this.assertOpen()}};clientQueryStore;wsToken;wsTokenGeneration=0;authBasePath;fetchImpl;WebSocketImpl;bookmark;reconnectOptions;connectTimeoutMs;heartbeatIntervalMs;rpcTimeoutMs;managedSocketOptions;pollingFallbackAfterFailedAttempts;pollingFallbackIntervalMs;offlineQueue;outbox;clientId;shardCursors=new Map;defaultShardKey;readyResolved=!1;readyResolve;readyPromise;clientWatermarks=new Map;outboxMutationCounter=0;mutationIssueCounter=0;persistence;persistenceVersion;releasePageHideFlush;outboxLeaderRelease;queryCache;hydratedQueryCache=new Map;cacheSeededQueries=new Map;pendingCacheWrites=new Map;cacheFlushTimer;subscriptions=new A;tabCoordinator;leader={status:void 0,wasEverConnected:!1};connections=new Map;idleClosedShards=new Set;defaultConnectionContext;connectionContexts=new Map;connectionContextHolders=new Map;authToken=null;authSubject=void 0;subjectToken=null;sessionProbesInFlight=0;sessionProbeGeneration=0;identityQuestions=0;identityAnsweredAt=0;releaseSessionChangeListener;warnedIdentityDisagreement=!1;identityResolutionExpected=!1;identitySettled=!1;queuedIdentities=new Map;queuedOfflineShardKeys=new Set;closed=!1;authTokenListeners=new R;statusListeners=new R;roomFlushes=new Map;roomIdentityResets=new Set;tokenExpiredListeners=new R;identityChangeListeners=new R;retiredIdentities=0;authRefusalNotifiedFor;replayCredentials=new WeakMap;mutationSettledListeners=new R;pendingChangeListeners=new R;syncStatusListeners=new R;lastSyncStatus;whisperHandlers=new Map;liveSocketGrants=new Map;liveControlChain=Promise.resolve();whisperJoins=new Map;nextLiveSocketId=0;lastStatus="idle";nextSubId=0;nextStreamId=0;streams=new Map;adminSocketTeardowns=new Set;supplementaryBounces=new Set;offlineFlushes=new Map;replayRetryState=new Map;replayAttempts=new Map;replayRetryTimers=new Map;shapeSubscriptions=new Map;pokeAssembler=new zi(Me.MAX_POKE_BUFFERS);nextShapeId=0;constructor(e){this.url=e.url,this.wsUrl=e.wsUrl??C(de(e.url),z),this.wsToken=e.wsToken;const t=e.authBasePath??Ys;this.authBasePath=t.endsWith("/")?t.slice(0,-1):t,this.fetchImpl=e.fetch??(typeof fetch=="function"?fetch.bind(globalThis):void 0),this.WebSocketImpl=e.WebSocket??(typeof WebSocket=="function"?WebSocket:void 0),this.bookmark=e.bookmarkStorage??Be(),this.reconnectOptions=e.reconnect,this.heartbeatIntervalMs=e.heartbeatIntervalMs??Ve,this.connectTimeoutMs=e.connectTimeoutMs??ze,this.rpcTimeoutMs=e.rpcTimeoutMs??Je,this.managedSocketOptions={connectTimeoutMs:this.connectTimeoutMs,heartbeatIntervalMs:this.heartbeatIntervalMs,WebSocketImpl:this.WebSocketImpl},this.pollingFallbackIntervalMs=e.pollingFallback?.intervalMs??Ye,this.pollingFallbackAfterFailedAttempts=e.pollingFallback?.afterFailedAttempts??Xe,this.defaultConnectionContext=e.connectionContext,this.persistence=yt(e.persistence,e.outbox===void 0),this.persistenceVersion=e.persistenceVersion,this.queryCache=bt(e.queryCache),this.clientQueryStore=new $e,e.crossTabSync?(this.tabCoordinator=this.createTabCoordinator(),this.tabCoordinator.start()):this.tabCoordinator=void 0,e.hydrateOnStart&&this.queryCache?this.readyPromise=new Promise(s=>{this.readyResolve=s}):(this.readyResolved=!0,this.readyPromise=mn),this.offlineQueue=new pt(e.offlineQueue,{onEvict:(s,i)=>{this.emitItemSettled(s,"rejected",i),this.releaseIdleShard(s.shardKey)},onReplayingChange:()=>{this.emitSyncStatus()},onSizeChange:s=>{this.pendingChangeListeners.emit(s),this.emitSyncStatus()},persistence:this.persistence,version:e.persistenceVersion}),this.outbox=e.outbox,this.clientId=e.clientId??`client-${me()}`,this.persistence&&queueMicrotask(()=>{this.hydrateAsOutboxLeader()}),this.installPageHideFlush(),this.queryCache&&queueMicrotask(()=>{(async()=>{try{await this.hydrateQueryCache()}catch{}finally{this.readyResolved=!0,this.readyResolve?.()}})().catch(()=>{})}),"document"in globalThis&&(this.releaseSessionChangeListener=Lt(async()=>{!this.closed&&this.authToken===null&&await this.getCurrentUser().catch(()=>{})}))}setAuthToken(e,t){const s=this.authToken!==e,i=this.identityFingerprint(),r=this.authSubject===void 0||this.subjectToken===this.authToken,o=this.subjectAwaitingReconfirm(),a=this.isKnownNobody(),c=this.authToken;this.authToken=e,this.applySubject(e,t);const u=this.identityFingerprint();u!==i&&(!s&&e!==null&&r?(this.restampQueuedIdentity(i,u),this.restampWatermarks(i,u),this.restampConnectionIdentity(i,u),this.reseedFromHydratedCache()):!s&&e===null&&i===null&&r&&!a?(this.restampWatermarks(i,u),this.restampConnectionIdentity(i,u),this.reseedFromHydratedCache()):(this.rejectQueuedForIdentityChange(i),this.warnRefreshWithoutSubject(c,e),cn(i,a,e)&&this.evictPreviousIdentitySession()),this.restartTabCoordinatorForIdentity()),this.syncReadCacheToCredential(o),s&&this.authTokenListeners.emit(e),(u!==i||s||o)&&this.offlineQueue.size>0&&q(this.computeStatus())&&this.flushAllOfflineQueues()}getAuthToken(){return this.authToken}currentIdentity(){return this.identityFingerprint()}expectIdentityResolution(){this.identityResolutionExpected=!0}currentBaseline(e){return this.baselineCursorFor(e)}replayIdentityVerdict(e){const t=this.identityVerdict(e);if(t!=="match")return{verdict:t};const s=Object.freeze({});return this.replayCredentials.set(s,{authToken:this.authToken,stamp:e}),{credential:s,verdict:t}}clientIdentifier(){return this.clientId}confirmedMutationWatermark(e){return this.clientWatermarks.get(this.identityFingerprint()??"")?.get(e??"")??0}async callMutator(e,t,s){const i=s?.clientSeq;if(i!==void 0&&(!Number.isInteger(i)||i<=0))throw new y("INTERNAL",`callMutator: clientSeq must be a positive integer, got ${String(i)}`);const r=s?.shardKey??"",o=this.identityFingerprint();let a,c,u;try{c=await this.rpc(e,t,s?.shardKey,{captureBookmark:!0,clientId:this.clientId,clientSeq:i,onMutationAck:h=>{a=h}})}catch(h){if(!K(h))throw h;u=h}if(a!==void 0&&a>(this.clientWatermarks.get(o??"")?.get(r)??0)){let h=this.clientWatermarks.get(o??"");h===void 0&&(Ee(this.clientWatermarks,rt),h=new Map,this.clientWatermarks.set(o??"",h)),h.set(r,a)}if(u!==void 0)throw u;return{applied:a===void 0||a===i,result:c}}onAuthTokenChange(e){return this.authTokenListeners.add(e)}onIdentityChange(e){return this.identityChangeListeners.add(e)}identityEpoch(){return this.retiredIdentities}async getCurrentUser(){if(this.identityResolutionExpected=!0,this.closed||!this.fetchImpl)return this.identitySettled=!0,null;const e={},t=this.authToken;this.authToken&&(e.authorization=`Bearer ${this.authToken}`),this.sessionProbesInFlight+=1,this.identityQuestions+=1,this.sessionProbeGeneration=this.identityQuestions;const s=this.sessionProbeGeneration;try{const i=await this.fetchImpl(C(this.url,`${this.authBasePath}${Xs}`),{credentials:"include",headers:e,method:"GET"});if(!i.ok)return this.identitySettled=!0,i.status===401&&this.adoptResolvedSubject(t,null,s),null;const o=(await i.json())?.user??null;return this.identitySettled=!0,this.adoptResolvedSubject(t,o,s),o}finally{this.releaseSessionProbe()}}setWsToken(e){this.wsToken!==e&&(this.wsToken=e,this.wsTokenGeneration+=1,this.resetRoomSends(),this.bounceShardSockets())}setConnectionContext(e,t={}){this.assertLeaderOwnedSurface("setConnectionContext");const s=l(t.shardKey);e===void 0?this.connectionContexts.delete(s):this.connectionContexts.set(s,e),this.refreshConnectionContext(s),e===void 0&&this.releaseIdleShard(t.shardKey)}acquireConnectionContext(e,t={}){if(this.followsAnotherTab())return()=>{};const s=l(t.shardKey),i={context:e},r=this.connectionContextHolders.get(s);r?r.push(i):this.connectionContextHolders.set(s,[i]),this.refreshConnectionContext(s);let o=!1;return()=>{if(o)return;o=!0;const a=this.connectionContextHolders.get(s);if(!a)return;const c=a.indexOf(i);c!==-1&&a.splice(c,1),a.length===0&&this.connectionContextHolders.delete(s),this.refreshConnectionContext(s),this.releaseIdleShard(t.shardKey)}}whisperSubscribe(e,t,s={}){this.assertLeaderOwnedSurface("whisperSubscribe");const i=l(s.shardKey);let r=this.whisperHandlers.get(i);r||(r=new Map,this.whisperHandlers.set(i,r));let o=r.get(e);const a=o===void 0;if(o||(o=new Set,r.set(e,o)),o.add(t),this.ensureSocket(s.shardKey),a){const c=this.getConnection(s.shardKey);c&&this.sendWhisperJoin(c,i,e)}return()=>{const c=this.whisperHandlers.get(i),u=c?.get(e);if(!u?.delete(t)||u.size>0)return;c?.delete(e),c?.size===0&&this.whisperHandlers.delete(i);const d=this.getConnection(s.shardKey);d&&k(d,{topic:e,type:"whisper_unsubscribe"}),this.releaseWhisperJoin(i,e),this.releaseIdleShard(s.shardKey)}}subscribeLiveTopic(e){const{onError:t,onEvent:s,shardKey:i,stream:r,topic:o}=e;if(o.length===0)throw new y("INTERNAL","LunoraClient: subscribeLiveTopic needs a non-empty topic");this.nextLiveSocketId+=1;const a=`ws-live-${String(this.nextLiveSocketId)}`,c=l(i),u=`/live/${r}/control`;let h=this.whisperSubscribe(o,()=>{},{shardKey:i});const p=()=>{const S=h;h=void 0,S?.()};let f=this.liveSocketGrants.get(c);f===void 0&&(f=new Map,this.liveSocketGrants.set(c,f)),f.set(a,{onError:t,onEvent:s,release:p,stream:r,topic:o});const m=this.getConnection(i)?.connectionId;m!==void 0&&this.grantWhenJoined(i,a,m);let b=!1;return()=>{if(b)return;b=!0;const S=this.liveSocketGrants.get(c),O=S?.delete(a)===!0;S?.size===0&&this.liveSocketGrants.delete(c);const g=this.getConnection(i)?.connectionId;O&&g!==void 0&&this.postLiveControl(u,i,{action:"unsubscribe",connectionId:g,stream:r,subscriptionId:a,topic:o}),p()}}whisper(e,t,s={}){return this.assertLeaderOwnedSurface("whisper"),this.sendEncodedWhisper(e,E(t??null,`whisper data for topic '${e}'`),s)}connectRoom(e,t,s={}){const i=`room:${e.name}`,r=this.whisperSubscribe(i,p=>{t.onMessage(p)},s);let o=!1;const a=[],c=()=>{a.length=0},u=()=>{for(;a.length>0&&this.roomSendsAdmitted(s.shardKey);){if(!this.sendEncodedWhisper(i,a[0],s))return;a.shift()}},d=l(s.shardKey),h=this.roomFlushes.get(d)??new Set;return h.add(u),this.roomFlushes.set(d,h),this.roomIdentityResets.add(c),{close:()=>{o=!0,a.length=0,h.delete(u),h.size===0&&this.roomFlushes.delete(d),this.roomIdentityResets.delete(c),r()},send:p=>{if(o||this.closed||this.WebSocketImpl===void 0)return!1;const f=E(p,`room message for '${i}'`),m=typeof structuredClone=="function"?structuredClone(f):JSON.parse(JSON.stringify(f));return u(),a.length===0&&this.roomSendsAdmitted(s.shardKey)&&this.sendEncodedWhisper(i,m,s)?!0:a.length>=ln?!1:(a.push(m),!0)}}}connectWebSocket(e,t,s={}){if(this.assertLeaderOwnedSurface("connectWebSocket"),this.WebSocketImpl===void 0||this.closed)return{close:()=>{},send:()=>{}};const i=a=>{try{a?.()}catch(c){console.error("[lunora] socket route handler threw",c)}};let r;const o=this.openSupplementarySocket(this.supplementaryUrl(e),{onClose:()=>{clearTimeout(r),i(t.onClose)},onMessage:a=>{let c;try{c=JSON.parse(typeof a.data=="string"?a.data:"")}catch{return}c.type==="message"&&(o.resetBackoff(),i(()=>{t.onMessage(w(c.data))}))},onOpen:()=>{clearTimeout(r);const a=o.socket();r=setTimeout(()=>{o.socket()===a&&o.resetBackoff()},pe),i(t.onOpen)},shardKey:s.shardKey});return{close:()=>{clearTimeout(r),o.close()},send:a=>{const c=JSON.stringify(E(a,`socket message for '${e}'`)),u=o.socket();if(u!==void 0)try{u.send(c)}catch{}}}}onTokenExpired(e){return this.tokenExpiredListeners.add(e)}connectionStatus(){return this.computeStatus()}onConnectionStatus(e){const t=this.statusListeners.add(e);return e(this.computeStatus()),t}syncStatus(){const e=this.computeStatus(),t=this.tabCoordinator!==void 0&&!this.tabCoordinator.isLeader();let s=0;for(const r of this.subscriptions.all())(t||this.connectionGateState(r.shardKey).polling?r.valueReceived:r.acked)||(s+=1);for(const r of this.shapeSubscriptions.values())r.answered||(s+=1);const i=this.offlineQueue.size+this.offlineQueue.replaying;return{connection:e,pendingSubscriptions:s,pendingWrites:i,synced:q(e)&&s===0&&i===0}}onSyncStatus(e){const t=this.syncStatusListeners.add(e),s=this.syncStatus();return this.lastSyncStatus=s,e(s),t}pendingCount(){return this.offlineQueue.size}debug(){const e=[],t=this.clientWatermarks.get(this.identityFingerprint()??""),s=new Set([...this.connections.keys(),...t?.keys()??[]]);for(const r of s){const o=this.connections.get(r);e.push({confirmedMutationWatermark:t?.get(r)??0,hasSocket:o?.socket!==void 0,shardKey:r===""?void 0:r,wasEverConnected:o?.wasEverConnected??!1,wsState:o?.wsState??"idle"})}const i=this.subscriptions.all().map(r=>({acked:r.acked,functionPath:r.fn.__lunoraRef,id:r.id,kind:"query",lastMutationId:r.lastMutationId,pendingOptimisticLayers:r.optimisticLayers.length,serverCursor:r.serverCursor,shardKey:r.shardKey,subscriberCount:r.callbacks.size}));for(const r of this.shapeSubscriptions.values())i.push({acked:r.answered,functionPath:`shape:${r.name}`,id:r.id,kind:"shape",lastMutationId:r.lastMutationId,pendingOptimisticLayers:0,rowCount:r.rows.size,serverCursor:r.serverCursor,shardKey:r.shardKey,subscriberCount:r.callbacks.size});return{clientId:this.clientId,closed:this.closed,connectionStatus:this.computeStatus(),pendingWrites:this.offlineQueue.size,shards:e.toSorted((r,o)=>(r.shardKey??"").localeCompare(o.shardKey??"")),subscriptions:i.toSorted((r,o)=>r.functionPath.localeCompare(o.functionPath))}}onPendingChange(e){const t=this.pendingChangeListeners.add(e);return e(this.offlineQueue.size),t}onMutationSettled(e){return this.mutationSettledListeners.add(e)}getWebSocketImpl(){return this.WebSocketImpl}getClientQuery(e){return this.clientQueryStore.get(e)}setClientQuery(e,t){this.clientQueryStore.set(e,t)}subscribeClientQuery(e,t){return this.clientQueryStore.subscribe(e,t)}resetClientQuery(e){this.clientQueryStore.reset(e)}snapshotPrecondition(e,t,s){return vt(this,e,t,s)}whenReady(e={}){return e.signal===void 0?this.readyPromise:ye(this.readyPromise,e.signal)}get isReady(){return this.readyResolved}peekHydratedQuery(e,t,s){return this.peekHydratedQueryByKey(e,ce(t),s)}peekHydratedQueryByKey(e,t,s){if(!this.readyResolved)return;const i=L(e,t,s),r=this.hydratedQueryCache.get(i);if(r!==void 0)return this.cachedQueryMatchesIdentity(r)?r.value:void 0}peekActiveQuerySnapshot(e,t,s){const i=A.key(e,t,s),r=this.subscriptions.get(i);return{present:r!==void 0,value:r?.lastValue}}async query(e,t,s={}){return this.assertOpen(),await this.rpc(e.__lunoraRef,t,s.shardKey,{attachBookmark:!0,signal:s.signal})}async batch(e){return W(this.rpcTimeoutMs,void 0,async t=>this.sendBatch(e,t))}async mutation(e,t,s={}){if(s.signal?.aborted)throw St(s.signal);const{value:i}=await ye(this.runMutation(e,t,s),s.signal);return i}canQueueOffline(e){const{wasEverConnected:t}=this.connectionGateState(e);return this.WebSocketImpl!==void 0&&(t||this.offlineQueue.queueBeforeFirstConnect)}async action(e,t,s={}){return this.assertOpen(),await this.rpc(e.__lunoraRef,t,s.shardKey,{attachBookmark:!0,captureBookmark:!0,signal:s.signal,unbounded:!0})}async importRows(e,t,s={}){this.assertOpen();const i=Math.max(1,Math.trunc(s.chunkSize??500)),r=s.toArgs??(d=>({rows:d})),o=t.length;let a=0,c=0,u=0;for(let d=0;d<o;d+=i){const h=t.slice(d,d+i),p=u,{committed:f}=await this.runMutation(e,r(h),{...s.importId===void 0?{}:{mutationId:`${s.importId}:${String(p)}`},shardKey:s.shardKey});u+=1,a+=h.length,f&&(c+=h.length),s.onProgress?.({done:a,total:o})}return{chunks:u,imported:c,queued:a-c}}async shardTraffic(e){return pi(this.adminHost,e)}async listScheduledJobs(){return Si(this.adminHost)}async schedulerStatus(){return bi(this.adminHost)}async cancelScheduledJob(e){return vi(this.adminHost,e)}async listDeadJobs(){return gi(this.adminHost)}async retryDeadJob(e){return Ti(this.adminHost,e)}async removeDeadJob(e){return ki(this.adminHost,e)}async listWorkflowInstances(e){return wi(this.adminHost,e)}async getWorkflowInstance(e){return Ci(this.adminHost,e)}async setWorkflowInstanceStatus(e){return Ei(this.adminHost,e)}subscribeScheduledJobs(e){if(this.assertOpen(),this.WebSocketImpl===void 0)return()=>{};const t=this.openSupplementarySocket(C(de(this.url),Dt),{onMessage:s=>{let i;try{i=JSON.parse(typeof s.data=="string"?s.data:"")}catch{return}i.type==="jobs"&&Array.isArray(i.records)&&(t.resetBackoff(),e(i.records.map(r=>ae(r))))}});return t.close}async listFunctions(){return ei(this.adminHost)}async getCronJobs(){return ti(this.adminHost)}async runCronJob(e){return si(this.adminHost,e)}async fetchOpenApi(){return ii(this.adminHost)}async fetchArchitecture(){return ni(this.adminHost)}async fetchOpenRpc(){return ri(this.adminHost)}async listStorageObjects(e={}){return Ai(this.adminHost,e)}async deleteStorageObject(e,t){return _i(this.adminHost,e,t)}async listStorageBuckets(){return Ii(this.adminHost)}async uploadStorageObject(e){return Oi(this.adminHost,e)}async signedStorageUrl(e,t){return Ri(this.adminHost,e,t)}async listGlobalTables(){return oi(this.adminHost)}async readGlobalTablePage(e){return ai(this.adminHost,e)}async facetGlobalColumn(e){return ci(this.adminHost,e)}async listVectorIndexes(){return Pi(this.adminHost)}async queryVectorIndex(e){return Fi(this.adminHost,e)}async queryLogArchive(e={}){return mi(this.adminHost,e)}async listKvNamespaces(){return di(this.adminHost)}async listKvKeys(e){return ui(this.adminHost,e)}async getKvValue(e){return hi(this.adminHost,e)}async putKvValue(e){return li(this.adminHost,e)}async deleteKvKey(e){return fi(this.adminHost,e)}async listAuthUsers(e={}){this.assertOpen();const t=v(as,{filterField:e.filterField,filterValue:e.filterValue,limit:e.limit,offset:e.offset,search:e.search,searchField:e.searchField,sortBy:e.sortBy,sortDirection:e.sortDirection});return await this.adminFetch(t,"GET")}async createAuthUser(e){return this.assertOpen(),await this.adminFetch(ds,"POST",e)}async setAuthUserRole(e){return this.assertOpen(),await this.adminFetch(us,"POST",e)}async banAuthUser(e){return this.assertOpen(),await this.adminFetch(hs,"POST",e)}async unbanAuthUser(e){return this.assertOpen(),await this.adminFetch(ls,"POST",e)}async setAuthUserPassword(e){this.assertOpen(),await this.adminFetch(fs,"POST",e)}async removeAuthUser(e){this.assertOpen(),await this.adminFetch(ps,"POST",e)}async impersonateAuthUser(e){return this.assertOpen(),await this.adminFetch(ms,"POST",e)}async revokeAuthSession(e){this.assertOpen(),await this.adminFetch(ys,"POST",e)}async revokeAuthUserSessions(e){this.assertOpen(),await this.adminFetch(Ss,"POST",e)}async getAuthCapabilities(){return this.assertOpen(),await this.adminFetch(bs,"GET")}async updateAuthUser(e){return this.assertOpen(),await this.adminFetch(vs,"POST",e)}async listAuthAccounts(e){return this.assertOpen(),await this.adminFetch(v(gs,{userId:e.userId}),"GET")}async unlinkAuthAccount(e){this.assertOpen(),await this.adminFetch(Ts,"POST",e)}async listAuthPasskeys(e){return this.assertOpen(),await this.adminFetch(v(ks,{userId:e.userId}),"GET")}async deleteAuthPasskey(e){this.assertOpen(),await this.adminFetch(ws,"POST",e)}async disableAuthTwoFactor(e){this.assertOpen(),await this.adminFetch(Cs,"POST",e)}async listAuthOrganizations(e={}){return this.assertOpen(),await this.adminFetch(v(Es,{limit:e.limit,offset:e.offset}),"GET")}async listAuthOrgMembers(e){this.assertOpen();const t=v(As,{limit:e.limit,offset:e.offset,organizationId:e.organizationId});return await this.adminFetch(t,"GET")}async listAuthOrgInvitations(e){this.assertOpen();const t=v(_s,{limit:e.limit,offset:e.offset,organizationId:e.organizationId});return await this.adminFetch(t,"GET")}async listAuthSignUpInvitations(e={}){this.assertOpen();const t=v(Ps,{limit:e.limit,offset:e.offset});return await this.adminFetch(t,"GET")}async createAuthSignUpInvitation(e){return this.assertOpen(),await this.adminFetch(Fs,"POST",e)}async revokeAuthSignUpInvitation(e){this.assertOpen(),await this.adminFetch(Ls,"POST",e)}async removeAuthOrgMember(e){this.assertOpen(),await this.adminFetch(Is,"POST",e)}async cancelAuthOrgInvitation(e){this.assertOpen(),await this.adminFetch(Os,"POST",e)}async getAuthConfig(){return this.assertOpen(),await this.adminFetch(Rs,"GET")}async createAuthOrganization(e){return this.assertOpen(),await this.adminFetch(Ms,"POST",e)}async updateAuthOrganization(e){return this.assertOpen(),await this.adminFetch(Hs,"POST",e)}async deleteAuthOrganization(e){this.assertOpen(),await this.adminFetch(Us,"POST",e)}async addAuthOrgMember(e){return this.assertOpen(),await this.adminFetch(Ns,"POST",e)}async inviteAuthOrgMember(e){return this.assertOpen(),await this.adminFetch(Ds,"POST",e)}async setAuthOrgMemberRole(e){return this.assertOpen(),await this.adminFetch(Ws,"POST",e)}async listAuthOrgTeams(e){this.assertOpen();const t=v(xs,{limit:e.limit,offset:e.offset,organizationId:e.organizationId});return await this.adminFetch(t,"GET")}async createAuthOrgTeam(e){return this.assertOpen(),await this.adminFetch(Bs,"POST",e)}async updateAuthOrgTeam(e){return this.assertOpen(),await this.adminFetch(Qs,"POST",e)}async removeAuthOrgTeam(e){this.assertOpen(),await this.adminFetch(qs,"POST",e)}async listAuthOrgTeamMembers(e){this.assertOpen();const t=v(Ks,{limit:e.limit,offset:e.offset,teamId:e.teamId});return await this.adminFetch(t,"GET")}async addAuthOrgTeamMember(e){return this.assertOpen(),await this.adminFetch(Gs,"POST",e)}async removeAuthOrgTeamMember(e){this.assertOpen(),await this.adminFetch(js,"POST",e)}async listAuthOrgRoles(e){this.assertOpen();const t=v($s,{limit:e.limit,offset:e.offset,organizationId:e.organizationId});return await this.adminFetch(t,"GET")}async createAuthOrgRole(e){return this.assertOpen(),await this.adminFetch(Vs,"POST",e)}async updateAuthOrgRole(e){return this.assertOpen(),await this.adminFetch(zs,"POST",e)}async deleteAuthOrgRole(e){this.assertOpen(),await this.adminFetch(Js,"POST",e)}async listAuthSessions(e={}){this.assertOpen();const t=v(cs,{limit:e.limit,offset:e.offset,userId:e.userId});return await this.adminFetch(t,"GET")}subscribe(e,t,s,i={}){if(this.assertOpen(),i.signal?.aborted)return()=>{};const r=t??{},o=A.key(e.__lunoraRef,r,i.shardKey);let a=this.subscriptions.get(o);const c=j(s),u=j(i.onError),d=j(i.onCheckpoint);if(!a){this.nextSubId+=1;const m=`sub_${this.nextSubId.toString()}`,b=ce(r),S=this.takeHydratedCache(e.__lunoraRef,b,i.shardKey);a={acked:!1,args:r,argsKey:b,callbacks:new Set,checkpointCallbacks:new Set,errorCallbacks:new Set,fn:e,id:m,lastValue:S?.value,optimisticLayers:[],serverBase:S?.value,serverCursor:S?.serverCursor,shardKey:i.shardKey,valueReceived:!1,wireArgs:E(r,`args for '${e.__lunoraRef}'`),...S?.serverEpoch===void 0?{}:{serverEpoch:S.serverEpoch}},this.subscriptions.add(a),this.emitSyncStatus(),S!==void 0&&this.cacheSeededQueries.set(o,S)}if(a.callbacks.add(c),u&&a.errorCallbacks.add(u),d&&a.checkpointCallbacks.add(d),a.lastValue!==void 0)try{c(a.lastValue)}catch{}this.ensureSocket(i.shardKey),this.sendSubscribeIfOpen(a);const h=a;let p=!1;const f=()=>{if(!p&&(p=!0,i.signal?.removeEventListener("abort",f),h.callbacks.delete(c),u&&h.errorCallbacks.delete(u),d&&h.checkpointCallbacks.delete(d),h.callbacks.size===0)){this.sendOrQueueUnsubscribe(h.shardKey,h.id,"unsubscribe"),this.returnCacheSeed(A.keyOf(h)),this.subscriptions.remove(h);const m=this.getConnection(h.shardKey);m&&this.settleSubscribeWatchdog(m,h.id),this.releaseIdleShard(h.shardKey),this.emitSyncStatus()}};return i.signal?.addEventListener("abort",f,{once:!0}),i.signal?.aborted&&f(),f}subscribeShape(e,t,s={}){if(this.assertOpen(),this.followsAnotherTab()){const{onError:o}=s;return o!==void 0&&queueMicrotask(()=>{o({code:"NOT_IMPLEMENTED",message:"LunoraClient: `subscribeShape` is unavailable on a cross-tab follower tab. The `crossTabSync` channel only carries data from the leader tab outward and shape pokes are not part of that broadcast set, so this subscription could never resolve. Turn off `crossTabSync`, or use a `list`-backed collection, which IS relayed."})}),()=>{}}this.nextShapeId+=1;const i=`shape_${this.nextShapeId.toString()}`,r={answered:!1,args:e.args,callbacks:new Set([t]),errorCallbacks:s.onError?new Set([s.onError]):new Set,id:i,name:e.name,onCheckpoint:s.onCheckpoint,rows:new Map,shardKey:s.shardKey,wireArgs:e.args===void 0?void 0:E(e.args,`shape args for '${e.name}'`)};return this.shapeSubscriptions.set(i,r),this.emitSyncStatus(),this.ensureSocket(s.shardKey),this.sendShapeSubscribeIfOpen(r),()=>{this.shapeSubscriptions.delete(i),this.sendOrQueueUnsubscribe(r.shardKey,i,"shape_unsubscribe"),this.releaseIdleShard(r.shardKey),this.emitSyncStatus()}}stream(e,t,s={}){if(this.assertOpen(),this.WebSocketImpl===void 0)throw new y("INTERNAL","LunoraClient: streams require a WebSocket implementation");this.nextStreamId+=1;const i=`stream_${this.nextStreamId.toString()}`,{shardKey:r}=s,o=t??{},{handle:a,iterable:c}=gt({maxBuffer:s.maxBuffer,onCancel:()=>{this.cancelStream(i,r)}});this.ensureSocket(r);const u=this.getConnection(r),d={id:i,query:{args:E(o,`stream args for '${e.__lunoraRef}'`),functionPath:e.__lunoraRef,shardKey:r},type:"stream"},h={durable:s.durable===!0,generation:void 0,handle:a,lastSeq:0,message:d,shardKey:r};this.streams.set(i,h);const p=u?.wsState==="open"&&k(u,d);if(!p&&u===void 0)return this.forgetStream(i),a.fail(new y("STREAM_DISCONNECTED","stream unavailable: this tab is not the cross-tab WebSocket leader, so it holds no socket to stream over")),c;if(!p){for(u.pendingStreams=u.pendingStreams??[];u.pendingStreams.length>=Ze;){const m=u.pendingStreams.shift()?.id,b=m?this.streams.get(m):void 0;b&&(b.handle.fail(new y("STREAM_QUEUE_OVERFLOW","stream-start frame evicted while socket was unreachable")),this.forgetStream(m))}u.pendingStreams.push(d)}return c}httpStream(e,t,s={}){if(this.closed)throw new y("CLIENT_CLOSED","LunoraClient is closed");if(!this.fetchImpl)throw new y("INTERNAL","LunoraClient: no `fetch` implementation available");const i={...this.authToken?{authorization:`Bearer ${this.authToken}`}:{},...s.headers};return dt(e,t,{baseUrl:this.url,fetch:this.fetchImpl,headers:i,maxBuffer:s.maxBuffer,signal:s.signal})}close(){this.closed=!0;for(const e of this.whisperJoins.keys())this.dropWhisperJoinWaiters(e);this.releaseSessionChangeListener?.(),this.releaseSessionChangeListener=void 0,this.releasePageHideFlush?.(),this.releasePageHideFlush=void 0,this.outboxLeaderRelease?.(),this.outboxLeaderRelease=void 0;for(const e of this.streams.values())e.handle.fail(new y("CLIENT_CLOSED","LunoraClient closed"));this.streams.clear();for(const e of this.connections.values())this.teardownConnection(e);for(const e of this.adminSocketTeardowns)e();this.adminSocketTeardowns.clear(),this.supplementaryBounces.clear();for(const e of this.replayRetryTimers.values())clearTimeout(e);this.replayRetryTimers.clear(),this.replayRetryState.clear(),this.offlineQueue.clear(),this.queuedIdentities.clear(),this.cacheFlushTimer!==void 0&&(clearTimeout(this.cacheFlushTimer),this.cacheFlushTimer=void 0),this.pendingCacheWrites.size>0&&this.flushQueryCacheWrites().catch(()=>{}),this.authTokenListeners.clear(),this.statusListeners.clear(),this.tokenExpiredListeners.clear(),this.identityChangeListeners.clear(),this.mutationSettledListeners.clear(),this.pendingChangeListeners.clear(),this.syncStatusListeners.clear(),this.whisperHandlers.clear(),this.liveSocketGrants.clear(),this.roomFlushes.clear(),this.roomIdentityResets.clear(),this.shapeSubscriptions.clear(),this.pokeAssembler.clear(),this.subscriptions.clear(),this.clientQueryStore.clear(),this.hydratedQueryCache.clear(),this.cacheSeededQueries.clear(),this.tabCoordinator?.stop(),this.tabCoordinator=void 0}assertOpen(){if(this.closed)throw new y("INTERNAL","LunoraClient is closed")}followsAnotherTab(){const e=this.tabCoordinator;if(e===void 0||e.isLeader())return!1;const t=e.leaderTabId;return t!==void 0&&t!==e.id}assertLeaderOwnedSurface(e){if(this.followsAnotherTab())throw new y("NOT_IMPLEMENTED",`LunoraClient: \`${e}\` is unavailable on a cross-tab follower tab. The \`crossTabSync\` channel only carries data from the leader tab outward, so this call could never reach the server. Turn off \`crossTabSync\`, or keep \`${e}\` on the leader tab.`)}clearConnectionTimers(e){clearTimeout(e.reconnectTimer),clearTimeout(e.connectTimer),clearTimeout(e.stableTimer),e.reconnectTimer=void 0,e.connectTimer=void 0,e.stableTimer=void 0}shardInUse(e){const t=s=>l(s)===e;return this.subscriptions.all().some(s=>t(s.shardKey))||[...this.shapeSubscriptions.values()].some(s=>t(s.shardKey))||[...this.streams.values()].some(s=>t(s.shardKey))||this.whisperHandlers.has(e)||this.connectionContexts.has(e)||this.connectionContextHolders.has(e)||this.offlineFlushes.has(e)||this.offlineQueue.hasPending(s=>t(s.shardKey))}releaseIdleShard(e){const t=l(e),s=this.connections.get(t);this.closed||t===""||s===void 0||(clearTimeout(s.idleTimer),s.idleTimer=setTimeout(()=>{s.idleTimer=void 0,!(this.closed||this.connections.get(t)!==s||this.shardInUse(t))&&(s.wasEverConnected&&this.idleClosedShards.add(t),this.teardownConnection(s),this.connections.delete(t),this.emitConnectionStatus())},et))}forgetStream(e){const t=this.streams.get(e);this.streams.delete(e),t&&this.releaseIdleShard(t.shardKey)}teardownConnection(e){e.polling.stop();const t=l(e.shardKey);for(const[i,r]of this.streams)l(r.shardKey)===t&&(r.handle.fail(new y("STREAM_DISCONNECTED","stream terminated: the connection carrying it was torn down")),this.streams.delete(i));e.pendingStreams=void 0,e.pendingUnsubscribes=[],this.clearResubscribeQueue(e),this.clearConnectionTimers(e),clearTimeout(e.idleTimer),e.idleTimer=void 0,H(e);const{socket:s}=e;if(s){e.socket=void 0;try{s.close()}catch{}}e.wsState="closed"}createTabCoordinator(){const e=`lunora-bridge::${this.url}::${this.identityFingerprint()??"anon"}`,t={activeShapes:()=>[...this.shapeSubscriptions.values()],activeSubscriptions:()=>this.subscriptions.all(),broadcastStatus:(s,i)=>this.tabCoordinator?.broadcastConnectionStatus(s,i),closeConnections:()=>{for(const[s,i]of this.connections)this.teardownConnection(i),this.connections.delete(s)},computeStatus:()=>this.computeStatus(),emitConnectionStatus:()=>{this.emitConnectionStatus()},ensureSocket:s=>{this.ensureSocket(s)},flushOfflineQueues:()=>{this.flushAllOfflineQueues()},identityFingerprint:()=>this.identityFingerprint(),isLeader:()=>this.tabCoordinator?.isLeader()===!0,leader:this.leader,queueResubscribe:s=>{this.queueResubscribe(s)},queuedShardKeys:()=>this.queuedOfflineShardKeys,clientIdentifier:()=>this.clientId,dropCacheSeed:s=>{this.dropCacheSeed(s)},ackAndAdvanceCursor:(s,i,r)=>{this.ackAndAdvanceCursor(s,i,r)},subscription:s=>this.subscriptions.get(s)};return new ot({channelName:e,onBecomeLeader:()=>{en(t)},onStopBeingLeader:()=>{tn(t)},onConnectionStatus:(s,i)=>{sn(t,s,i)},onSubscriptionData:(s,i,r,o,a)=>{rn(t,s,i,r,o,a)},onLeaderClaimAnswered:()=>{nn(t)},onSubscriptionError:(s,i,r)=>{on(t,s,i,r)},onSubscriptionSettled:(s,i,r,o,a,c)=>{an(t,s,i,r,o,a,c)}})}async sendBatch(e,t){if(this.assertOpen(),!this.fetchImpl)throw new y("INTERNAL","LunoraClient: no `fetch` implementation available");if(e.length===0)return[];const s=await this.fetchImpl(C(this.url,V),{body:JSON.stringify({calls:e.map((a,c)=>({args:E(a.args??{},`args for batch call '${a.fn.__lunoraRef}'`),functionPath:a.fn.__lunoraRef,id:c,shardKey:a.shardKey}))}),headers:this.rpcRequestHeaders({attachBookmark:!0}),method:"POST",signal:t}),i=s.headers.get("x-d1-bookmark");i&&this.bookmark.set(i);let r;try{r=await s.json()}catch{throw new y("INTERNAL",`LunoraClient: batch response was not JSON (status ${s.status.toString()})`)}const o=B(r);if(!s.ok||o!==void 0&&!r.results)throw o!==void 0?qe(o):new y("INTERNAL",`LunoraClient: batch request failed (status ${s.status.toString()})`);for(const a of r.results??[]){const c=a.body?.commitCursor;typeof a.id=="number"&&typeof c=="number"&&this.recordShardCursor(e[a.id]?.shardKey,c)}return Li(r.results??[],e.length)}async runMutation(e,t,s){this.assertOpen();const i=un(e,s),r=t,o=i.mutationId??me();this.mutationIssueCounter+=1;const a=this.mutationIssueCounter,c=this.takeReplayCredential(i.replayCredential),u=i.replayBaseline===void 0?this.baselineCursorFor(i.shardKey):i.replayBaseline??void 0;this.refuseOnlineOnlyWhenDown(e.__lunoraRef,i);const{confirms:d,rollbacks:h}=this.applyOptimisticUpdates(e.__lunoraRef,r,i.shardKey,i.optimistic);i.optimisticUpdate&&this.applyOptimisticUpdate(i.optimisticUpdate,t,i.shardKey,h,d);const p=i.onlineOnly?void 0:this.offlineFlushes.get(l(i.shardKey));p!==void 0&&await p;const{httpFirst:f,midReconnect:m,shouldQueueOffline:b,socketDown:S}=this.writeQueueGate(i.shardKey),O=!i.onlineOnly&&b&&i.replayBaseline===void 0&&this.hasPendingWriteAhead(i.shardKey),g=async(T=!1)=>this.enqueueOfflineMutation(e,r,i.shardKey,u,o,h,d,T?void 0:i.precondition,i.mutationId,c?.stamp,T,a);if(this.refuseOnlineOnlyWhenDown(e.__lunoraRef,i,h),S||m||O)return g();let N;try{const T=await this.rpc(e.__lunoraRef,r,i.shardKey,{baselineSeq:u,captureBookmark:!0,...c?.flags,mutationId:o,onCommitCursor:P=>{N=P}});for(const P of d)P(N);return{committed:!0,value:T}}catch(T){const P=pn(T,r),He=f&&b&&P,Ue=this.ownSocketOpen(i.shardKey);if(b&&!i.onlineOnly&&this.fetchImpl!==void 0&&!this.outbox&&i.replayBaseline===void 0&&(T instanceof TypeError||T instanceof U)&&ee(r)){const Ne=g(!0);return this.noteHeldRetryDelay(i.shardKey),this.scheduleRateLimitedRetry(i.shardKey),Ne}throw this.settleFailedDirectWrite(T,N,d,h,c?.flags.authToken),He||i.onlineOnly&&P&&!Ue?Ce(e.__lunoraRef,T):T}}refuseOnlineOnlyWhenDown(e,t,s=[]){if(!t.onlineOnly)return;const i=this.writeQueueGate(t.shardKey);if(i.socketDown||i.midReconnect)throw F(s),Ce(e)}ownSocketOpen(e){return this.tabCoordinator!==void 0&&!this.tabCoordinator.isLeader()?!1:this.writeQueueGate(e).socketOpen}writeQueueGate(e){const{hasSocket:t,idleClosed:s,polling:i,wasEverConnected:r,wsState:o}=this.connectionGateState(e),{queueBeforeFirstConnect:a}=this.offlineQueue,c=r||a,u=this.WebSocketImpl!==void 0&&c,d=i||s;return{httpFirst:d,midReconnect:o==="connecting"&&c&&!d,shouldQueueOffline:u,socketDown:o!=="open"&&!t&&u&&!d,socketOpen:o==="open"}}settleFailedDirectWrite(e,t,s,i,r){if(this.noteIdentityMismatch(e),r!==void 0&&this.noteReplayAuthRefusal(e,r),K(e)){for(const o of s)o(t);return}F(i)}async enqueueOfflineMutation(e,t,s,i,r,o,a,c,u,d,h,p){const f=d===void 0?this.identityFingerprint():d;if(this.outbox){this.outboxMutationCounter+=1;const b=this.outboxMutationCounter;try{await this.outbox.enqueue({args:t,baselineSeq:i,clientId:this.clientId,functionPath:e.__lunoraRef,idempotencyKey:u??`${this.clientId}:${String(b)}`,identity:f,mutationId:b,...o.length>0&&{onRejected:()=>{F(o)}},shardKey:s})}catch(S){throw F(o),S instanceof Error?S:new Error(String(S))}for(const S of a)S(void 0);return{committed:!1,value:void 0}}return{committed:!0,value:await new Promise((b,S)=>{const O={ambiguousSend:h,args:t,functionPath:e.__lunoraRef,liveAwaiter:!0,baselineSeq:i,id:r,issueSeq:p,clientId:this.clientId,identity:f,precondition:c,onCommit:g=>{for(const N of a)N(g)},reject:g=>{this.queuedIdentities.delete(r),K(g)||F(o),S(g instanceof Error?g:new Error(String(g))),this.releaseIdleShard(s)},resolve:b,shardKey:s};this.offlineQueue.enqueue(O),this.queuedOfflineShardKeys.add(s),this.ensureSocket(s),O.id!==void 0&&this.queuedIdentities.set(O.id,f)})}}hasPendingWriteAhead(e){if(this.outbox)return this.outbox.pending?.()??!1;const t=l(e);return this.offlineQueue.hasPending(s=>l(s.shardKey)===t)}async hydratePersistedQueue(){try{const e=await this.offlineQueue.hydrate();for(const t of e)this.queuedOfflineShardKeys.add(t),this.ensureSocket(t)}catch{}}hydrateAsOutboxLeader(){const e=()=>{this.hydratePersistedQueue().catch(()=>{})},t=globalThis.navigator?.locks;if(!t){e();return}t.request(`lunora:outbox-leader:${this.url}`,()=>(this.closed||e(),new Promise(s=>{if(this.closed){s();return}this.outboxLeaderRelease=s}))).catch(e)}async hydrateQueryCache(){if(this.queryCache)try{const e=await this.queryCache.load(),t=new Map;for(const s of this.subscriptions.all())t.set(L(s.fn.__lunoraRef,s.argsKey,s.shardKey),s);for(const{key:s,...i}of e){if(mt(this.persistenceVersion,i.version)){this.queryCache.remove(s).catch(()=>{});continue}const r=t.get(s);if(r&&this.cachedQueryMatchesIdentity(i)){this.seedSubscriptionFromCache(r,i);continue}this.hydratedQueryCache.set(s,i)}}catch{}}seedSubscriptionFromCache(e,t){e.serverBase!==void 0||e.lastValue!==void 0||!this.cachedQueryMatchesIdentity(t)||(e.serverBase=t.value,e.serverCursor=t.serverCursor,t.serverEpoch!==void 0&&(e.serverEpoch=t.serverEpoch),this.cacheSeededQueries.set(L(e.fn.__lunoraRef,e.argsKey,e.shardKey),t),M(e,t.value))}syncReadCacheToCredential(e){this.subjectAwaitingReconfirm()?this.revokeCacheSeededValues():e&&this.reseedFromHydratedCache()}dropCacheSeed(e){this.cacheSeededQueries.delete(e),this.hydratedQueryCache.delete(e)}returnCacheSeed(e){const t=this.cacheSeededQueries.get(e);t!==void 0&&(this.cacheSeededQueries.delete(e),this.hydratedQueryCache.set(e,t))}revokeCacheSeededValues(){if(this.cacheSeededQueries.size!==0){for(const[e,t]of this.cacheSeededQueries){const s=this.subscriptions.get(e);s!==void 0&&(s.serverBase=void 0,s.serverCursor=void 0,s.serverEpoch=void 0,M(s,void 0)),this.hydratedQueryCache.set(e,t)}this.cacheSeededQueries.clear()}}takeHydratedCache(e,t,s){const i=L(e,t,s),r=this.hydratedQueryCache.get(i);if(!(r===void 0||!this.cachedQueryMatchesIdentity(r)))return this.hydratedQueryCache.delete(i),r}reseedFromHydratedCache(){if(this.hydratedQueryCache.size!==0)for(const e of this.subscriptions.all()){const t=L(e.fn.__lunoraRef,e.argsKey,e.shardKey),s=this.hydratedQueryCache.get(t);s!==void 0&&this.cachedQueryMatchesIdentity(s)&&(this.hydratedQueryCache.delete(t),this.seedSubscriptionFromCache(e,s))}}persistQueryValue(e){const t=e.serverBase;if(!this.queryCache||t===void 0)return;const s=L(e.fn.__lunoraRef,e.argsKey,e.shardKey),i=this.getConnection(e.shardKey)?.identity,r=i===void 0?this.identityFingerprint():i;r===null&&this.identityUnresolved()||(this.pendingCacheWrites.set(s,{identity:r,serverCursor:e.serverCursor,ts:Date.now(),value:t,...r===this.identityFingerprint()&&!this.subjectAwaitingReconfirm()?this.credentialStamp():{},...e.serverEpoch===void 0?{}:{serverEpoch:e.serverEpoch},...this.persistenceVersion===void 0?{}:{version:this.persistenceVersion}}),this.cacheFlushTimer??=setTimeout(()=>{this.flushQueryCacheWrites().catch(()=>{})},tt))}async flushQueryCacheWrites(){this.cacheFlushTimer=void 0;const{queryCache:e}=this;if(!e){this.pendingCacheWrites.clear();return}const t=[...this.pendingCacheWrites.entries()];this.pendingCacheWrites.clear(),await Promise.allSettled(t.map(async([s,i])=>e.put(s,i)))}installPageHideFlush(){const e=globalThis;if(!this.persistence&&!this.queryCache||!("document"in globalThis)||typeof e.addEventListener!="function")return;const t=()=>{this.offlineQueue.flushUnpersisted(),this.cacheFlushTimer!==void 0&&(clearTimeout(this.cacheFlushTimer),this.flushQueryCacheWrites().catch(()=>{}))},s=()=>{e.document?.visibilityState==="hidden"&&t()};e.addEventListener("pagehide",t),e.document?.addEventListener("visibilitychange",s),this.releasePageHideFlush=()=>{e.removeEventListener?.("pagehide",t),e.document?.removeEventListener("visibilitychange",s)}}computeStatus(){if(this.tabCoordinator&&!this.tabCoordinator.isLeader())return this.leader.status??"idle";const e=[...this.connections.values()];return e.length===0?"idle":e.some(t=>t.wsState==="open")?"connected":e.some(t=>t.polling.isPolling())?"polling":e.some(t=>t.wsState==="connecting")?"connecting":"offline"}baselineCursorFor(e){const t=l(e);let s;for(const i of this.subscriptions.all())l(i.shardKey)!==t||i.serverCursor===void 0||(s=s===void 0?i.serverCursor:Math.max(s,i.serverCursor));return s}async pollSubscriptions(e){const t=l(e),s=[];for(const a of this.subscriptions.all())l(a.shardKey)===t&&(ee(a.args)?s.push(a):(this.markQueryRejected(a,!0),I(a.errorCallbacks,{code:"WIRE_ENCODE_FAILED",message:"could not encode this subscription's args for a poll"})));if(s.length===0)return this.probeOrigin();const i=ft(),r=this.identityFingerprint();let o;try{o=await Te(async a=>this.sendBatch(s.map(c=>({args:c.args,fn:c.fn,shardKey:c.shardKey})),a))}catch(a){return!(a instanceof TypeError)}if(this.identityFingerprint()!==r)return!0;for(const[a,c]of s.entries()){const u=o[a];if(u!==void 0){if(!u.ok){this.markQueryRejected(c,!0),I(c.errorCallbacks,{code:u.error.code,message:u.error.message});continue}this.handleDataMessage({data:x(u.value),id:c.id,type:"data"},i)}}return!0}async probeOrigin(){const{fetchImpl:e}=this;if(!e)return!1;try{return await Te(async t=>e(C(this.url,V),{body:JSON.stringify({calls:[]}),headers:this.rpcRequestHeaders({}),method:"POST",signal:t})),!0}catch{return!1}}emitSyncStatus(){if(this.syncStatusListeners.size===0)return;const e=this.syncStatus(),t=this.lastSyncStatus;t?.connection===e.connection&&t.pendingSubscriptions===e.pendingSubscriptions&&t.pendingWrites===e.pendingWrites&&t.synced===e.synced||(this.lastSyncStatus=e,this.syncStatusListeners.emit(e))}emitConnectionStatus(){const e=this.computeStatus();this.emitSyncStatus(),e!==this.lastStatus&&(this.lastStatus=e,this.statusListeners.emit(e),this.tabCoordinator?.isLeader()&&this.tabCoordinator.broadcastConnectionStatus(e,this.identityFingerprint()))}emitItemSettled(e,t,s){this.mutationSettledListeners.emit({args:e.args,code:s===void 0?void 0:s.code,error:s,functionPath:e.functionPath,hadAwaiter:e.liveAwaiter??!1,id:e.id??"",shardKey:e.shardKey,status:t})}applyOptimisticUpdates(e,t,s,i){const r=[],o=[];if(!i)return{confirms:r,rollbacks:o};const a=A.key(e,t,s),c=this.subscriptions.get(a);if(c){const u=ut(c,i);u&&(r.push(u.confirm),o.push(u.rollback))}return{confirms:r,rollbacks:o}}applyOptimisticUpdate(e,t,s,i,r){const{confirms:o,rollbacks:a,store:c}=ht(this.subscriptions,s);try{e(c,t)}catch{F(a);return}i.push(...a),r.push(...o)}getConnection(e){return this.connections.get(l(e))}sendOrQueueUnsubscribe(e,t,s){const i=this.getConnection(e);i&&!k(i,{id:t,type:s})&&i.pendingUnsubscribes.push({id:t,type:s})}connectionGateState(e){if(this.tabCoordinator&&!this.tabCoordinator.isLeader()){let i="idle";return this.leader.status==="connected"?i="open":this.leader.status==="connecting"&&(i="connecting"),{hasSocket:!1,idleClosed:!1,polling:this.leader.status==="polling",wasEverConnected:this.leader.wasEverConnected,wsState:i}}const t=this.getConnection(e),s=t===void 0&&this.idleClosedShards.has(l(e));return{hasSocket:t?.socket!==void 0,idleClosed:s,polling:t?.polling.isPolling()??!1,wasEverConnected:t?.wasEverConnected??s,wsState:t?.wsState??"idle"}}getOrCreateConnection(e){const t=l(e);let s=this.connections.get(t);return s||(s={connectTimer:void 0,heartbeatTimer:void 0,lastFrameAt:0,pendingUnsubscribes:[],polling:Di({afterFailedAttempts:this.pollingFallbackAfterFailedAttempts,intervalMs:this.pollingFallbackIntervalMs,onReachable:()=>{this.flushOfflineQueue(e).catch(()=>{})},onStateChange:()=>{this.emitConnectionStatus()},poll:async()=>this.pollSubscriptions(e)}),reconnect:Se(this.reconnectOptions),reconnectTimer:void 0,resubscribeQueue:[],resubscribeSlots:new Set,shardKey:e,socket:void 0,stableTimer:void 0,unackedWatchdogs:new Map,wasEverConnected:this.idleClosedShards.delete(t),wsState:"idle"},this.connections.set(t,s)),s}openSupplementarySocket(e,t){if(this.WebSocketImpl===void 0||this.closed)return{close:()=>{},resetBackoff:()=>{},socket:()=>{}};const s=Se(this.reconnectOptions),i={connectTimer:void 0,heartbeatTimer:void 0,lastFrameAt:0,socket:void 0};let r,o=!1;const a=()=>{o||this.closed||(r=setTimeout(d,s.next()))},c=f=>{o||this.WebSocketImpl===void 0||ge(i,this.wsUrlFor(t.shardKey,f,e),this.managedSocketOptions,{onClose:()=>{a(),t.onClose?.()},onMessage:t.onMessage,...t.onOpen===void 0?{}:{onOpen:t.onOpen}})},u=async f=>{const m=this.wsTokenGeneration;let b;try{b=await f()}catch{a();return}if(m!==this.wsTokenGeneration){d();return}c(b)},d=()=>{if(o||this.WebSocketImpl===void 0)return;const{wsToken:f}=this;if(typeof f=="function"){u(f).catch(()=>{});return}c(f)};d();const h=()=>{o=!0,r!==void 0&&(clearTimeout(r),r=void 0),i.connectTimer!==void 0&&(clearTimeout(i.connectTimer),i.connectTimer=void 0),H(i);const{socket:f}=i;i.socket=void 0;try{f?.close()}catch{}};this.adminSocketTeardowns.add(h);const p=()=>{const{socket:f}=i;if(f!==void 0){i.socket=void 0,i.connectTimer!==void 0&&(clearTimeout(i.connectTimer),i.connectTimer=void 0),H(i);try{f.close()}catch{}t.onClose?.(),a()}};return this.supplementaryBounces.add(p),{close:()=>{h(),this.adminSocketTeardowns.delete(h),this.supplementaryBounces.delete(p)},resetBackoff:()=>{s.reset()},socket:()=>i.socket}}supplementaryUrl(e){const t=ue(this.wsUrl),s=t.pathname.endsWith(z)?t.pathname.slice(0,-z.length):t.pathname;return t.pathname=C(s,e),he(t,this.wsUrl)}wsUrlFor(e,t,s=this.wsUrl){if(e===void 0&&t===void 0)return s;const i=ue(s),r=new Set([...e===void 0?[]:["shard"],...t===void 0?[]:["token"]]),o=[...i.searchParams].filter(([a])=>!r.has(a)).map(([a,c])=>`${encodeURIComponent(a)}=${encodeURIComponent(c)}`);return e!==void 0&&o.push(`shard=${encodeURIComponent(e)}`),t!==void 0&&o.push(`token=${encodeURIComponent(t)}`),i.search=o.join("&"),he(i,s)}rpcRequestHeaders(e,t){const s={"content-type":"application/json"};e.expectSubject!==void 0&&(s[Ct]=Et(e.expectSubject));const i=this.shardCursors.get(this.cursorKeyFor(t));i!==void 0&&(s["x-lunora-min-seq"]=i.toString());const r=e.authToken===void 0?this.authToken:e.authToken;if(r&&(s.authorization=`Bearer ${r}`),e.mutationId&&(s["x-lunora-mutation-id"]=e.mutationId),(e.clientId!==void 0||e.mutationId!==void 0)&&(s["x-lunora-client-id"]=e.clientId??this.clientId),e.clientSeq!==void 0&&(s["x-lunora-client-seq"]=e.clientSeq.toString()),e.baselineSeq!==void 0&&(s["x-lunora-base-seq"]=e.baselineSeq.toString()),e.attachBookmark){const o=this.bookmark.get();o&&(s["x-d1-bookmark"]=o)}return s}async rpc(e,t,s,i={}){const{fetchImpl:r}=this;if(!r)throw new U("LunoraClient: no `fetch` implementation available");const o=this.rpcRequestHeaders(i,s),a=i.authToken===void 0?this.authToken:i.authToken,c=JSON.stringify({args:E(t,`args for '${e}'`),functionPath:e,shardKey:s}),{body:u,response:d}=await W(i.unbounded?0:this.rpcTimeoutMs,i.signal,async f=>{const m=await r(C(this.url,Mt),{body:c,headers:o,method:"POST",signal:f});try{return{body:await m.json(),response:m}}catch{return{body:void 0,response:m}}});if(i.captureBookmark){const f=d.headers.get("x-d1-bookmark");f&&this.bookmark.set(f)}if(u===void 0)throw D(d.status,d.statusText,d.headers.get("retry-after"));const h=u;if(typeof h!="object"||h===null||Array.isArray(h))throw D(d.status,d.statusText,d.headers.get("retry-after"));const p=B(u);if(p!==void 0)throw le(p,d.headers.get("retry-after"));if(!d.ok)throw D(d.status,d.statusText,d.headers.get("retry-after"));i.onMutationAck?.(u.lastMutationId),i.onCommitCursor?.(u.commitCursor),this.noteCredentialAccepted(a),this.learnDefaultShardKey(d,s),this.recordShardCursor(s,u.commitCursor);try{return w(u.result)}catch(f){throw Pe(f)}}async adminFetch(e,t,s,i){if(!this.fetchImpl)throw new y("INTERNAL","LunoraClient: no `fetch` implementation available");const r={};this.authToken&&(r.authorization=`Bearer ${this.authToken}`);const o=s instanceof ArrayBuffer||s instanceof Blob;let a;s===void 0?a=void 0:o?(a=s,i!==void 0&&(r["content-type"]=i)):(a=JSON.stringify(s),r["content-type"]="application/json");const c=await this.fetchImpl(C(this.url,e),{body:a,headers:r,method:t});let u;try{u=await c.json()}catch{const h=c.statusText?` ${c.statusText}`:"";throw new y("INTERNAL",`LunoraClient: response was not JSON (status ${c.status.toString()}${h})`)}const d=B(u);if(d!==void 0){const h=new Error(d.message??"admin request failed");throw Object.assign(h,{code:d.code},Ke(d)),h}if(!c.ok){const h=c.statusText?` ${c.statusText}`:"";throw new y("INTERNAL",`LunoraClient: admin request failed (status ${c.status.toString()}${h})`)}return u}effectiveConnectionContext(e){const t=this.connectionContextHolders.get(e);return t&&t.length>0?t[t.length-1]?.context:this.connectionContexts.get(e)??this.defaultConnectionContext}refreshConnectionContext(e){const t=this.connections.get(e);t?.wsState==="open"&&this.sendConnectEnvelope(t)}sendConnectEnvelope(e){const t=this.effectiveConnectionContext(l(e.shardKey));k(e,{caps:hn,clientId:this.clientId,id:"connect",type:"connect",...t===void 0?{}:{context:t}})}resendShapeSubscriptions(e){for(const t of this.shapeSubscriptions.values())l(t.shardKey)===l(e)&&this.sendShapeSubscribeIfOpen(t)}ensureSocket(e){if(this.closed||this.WebSocketImpl===void 0||this.tabCoordinator&&!this.tabCoordinator.isLeader())return;const t=this.getOrCreateConnection(e);if(!(t.wsState==="open"||t.wsState==="connecting")){if(t.wsState="connecting",this.emitConnectionStatus(),typeof this.wsToken=="function"){this.openSocketWithProvidedToken(t,e,this.wsToken).catch(()=>{});return}this.openSocket(t,e,this.wsToken)}}async openSocketWithProvidedToken(e,t,s){const i=this.wsTokenGeneration,r=Symbol("ws-token-attempt");let o;e.providerAttempt=r;try{o=await W(this.connectTimeoutMs,void 0,async()=>s(),()=>new Error("LunoraClient: wsToken provider timed out"))}catch{e.providerAttempt===r&&(e.providerAttempt=void 0,this.handleDisconnect(e));return}if(e.providerAttempt===r&&(e.providerAttempt=void 0,!(this.closed||this.WebSocketImpl===void 0||e.wsState!=="connecting"||e.socket!==void 0))){if(i!==this.wsTokenGeneration){typeof this.wsToken=="function"?await this.openSocketWithProvidedToken(e,t,this.wsToken):this.openSocket(e,t,this.wsToken);return}this.openSocket(e,t,o)}}openSocket(e,t,s){this.WebSocketImpl!==void 0&&(e.identity=this.identityFingerprint(),s===void 0&&this.authToken===null?(this.identityQuestions+=1,e.identityQuestion=this.identityQuestions):e.identityQuestion=void 0,e.retired=!1,ge(e,this.wsUrlFor(t,s),this.managedSocketOptions,{onClose:i=>{i?.code===4001&&this.notifyTokenExpired(),this.handleDisconnect(e)},onMessage:i=>{e.retired!==!0&&this.handleServerMessage(i.data,t)},onOpen:()=>{e.wsState="open",e.wasEverConnected=!0,e.identityConfirmed=!1,e.connectionId=void 0,e.roomsRejoined=!1,e.polling.noteOpen(),clearTimeout(e.stableTimer),e.stableTimer=setTimeout(()=>{e.wsState==="open"&&e.reconnect.reset()},pe),this.markShardPendingAck(t,!0),this.emitConnectionStatus(),this.sendConnectEnvelope(e),this.clearResubscribeQueue(e);for(const o of this.subscriptions.all())l(o.shardKey)===l(t)&&this.queueResubscribe(o);if(this.resendShapeSubscriptions(t),e.pendingUnsubscribes.length>0){const o=e.pendingUnsubscribes;e.pendingUnsubscribes=[];for(const{id:a,type:c}of o)k(e,{id:a,type:c});this.releaseIdleShard(t)}Mi(e);const i=l(t),r=this.whisperHandlers.get(i);if(this.dropWhisperJoinWaiters(i),this.whisperJoins.set(i,new Map),r)for(const o of r.keys())this.sendWhisperJoin(e,i,o);e.roomsRejoined=!0,this.releaseRoomSends(t),this.flushOfflineQueue(t).catch(()=>{})}}))}cancelStream(e,t){const s=this.getConnection(t);s&&(s.pendingStreams=s.pendingStreams?.filter(i=>i.id!==e),k(s,{id:e,type:"unsubscribe"})),this.forgetStream(e)}handleDisconnect(e){if(this.closed||e.wsState==="idle"||e.wsState==="closed")return;e.wsState==="connecting"&&e.polling.noteFailedOpen(),H(e),this.clearConnectionTimers(e),e.socket=void 0,e.wsState="idle",e.connectionId=void 0,e.whisperAck=void 0,this.dropWhisperJoinWaiters(l(e.shardKey)),this.markShardPendingAck(e.shardKey),this.emitConnectionStatus(),this.clearResubscribeQueue(e);const t=new Set((e.pendingStreams??[]).map(i=>i.id));for(const[i,r]of this.streams)if(!(l(r.shardKey)!==l(e.shardKey)||t.has(i))){if(r.durable){const o={...r.message,...r.generation===void 0?{}:{generation:r.generation},sinceChunk:r.lastSeq};r.message=o,e.pendingStreams=[...(e.pendingStreams??[]).filter(a=>a.id!==i),o];continue}r.handle.fail(new y("STREAM_DISCONNECTED","stream terminated: WebSocket disconnected")),this.forgetStream(i)}if(this.WebSocketImpl===void 0)return;const s=e.reconnect.next();e.reconnectTimer=setTimeout(()=>{e.reconnectTimer=void 0,this.ensureSocket(e.shardKey)},s)}markShardPendingAck(e,t=!1){const s=l(e);for(const i of this.subscriptions.all())l(i.shardKey)===s&&(i.acked=!1,t&&(i.valueReceived=!1));for(const i of this.shapeSubscriptions.values())l(i.shardKey)===s&&(i.answered=!1)}queueResubscribe(e){const t=this.getConnection(e.shardKey);t&&(t.resubscribeQueue.push(e),this.drainResubscribeQueue(t))}drainResubscribeQueue(e){for(;e.resubscribeSlots.size<st;){const t=e.resubscribeQueue.shift();if(!t)return;this.subscriptions.getById(t.id)&&this.sendSubscribeIfOpen(t)&&e.resubscribeSlots.add(t.id)}}settleSubscribeWatchdog(e,t){clearTimeout(e.unackedWatchdogs.get(t)),e.unackedWatchdogs.delete(t),e.resubscribeSlots.delete(t)&&this.drainResubscribeQueue(e)}clearResubscribeQueue(e){for(const t of e.unackedWatchdogs.values())clearTimeout(t);e.unackedWatchdogs.clear(),e.resubscribeSlots.clear(),e.resubscribeQueue=[]}sendSubscribeIfOpen(e,t=!1){const s=this.getConnection(e.shardKey);if(s?.wsState!=="open"||e.acked)return!1;const i=e.serverCursor!==void 0&&e.serverBase!==void 0,r=k(s,{id:e.id,query:{args:e.wireArgs,functionPath:e.fn.__lunoraRef,table:e.fn.__lunoraRef,...i?{sinceSeq:e.serverCursor}:{},...i&&e.serverEpoch!==void 0?{sinceEpoch:e.serverEpoch}:{}},type:"subscribe"});return r&&!t&&this.armUnackedWatchdog(s,e),r}armUnackedWatchdog(e,t){clearTimeout(e.unackedWatchdogs.get(t.id)),e.unackedWatchdogs.set(t.id,setTimeout(()=>{!t.acked&&this.subscriptions.getById(t.id)===t&&this.sendSubscribeIfOpen(t,!0),this.settleSubscribeWatchdog(e,t.id)},it))}sendShapeSubscribeIfOpen(e){const t=this.getConnection(e.shardKey);t?.wsState==="open"&&k(t,{id:e.id,shape:{name:e.name,...e.wireArgs===void 0?{}:{args:e.wireArgs}},type:"shape_subscribe",...e.serverCursor===void 0?{}:{sinceCheckpoint:e.serverCursor},...e.serverEpoch===void 0?{}:{sinceEpoch:e.serverEpoch}})}handleServerMessage(e,t){const s=Ui(e);if(s===void 0)return;let i;try{i=JSON.parse(s)}catch{return}if(i.type!=="error"&&this.getConnection(t)?.reconnect.reset(),typeof i.id=="string"){const r=this.getConnection(t);if(r){const{id:o}=i;this.settleSubscribeWatchdog(r,o)}}switch(i.type){case"ack":{const r=this.subscriptions.getById(i.id);r&&this.ackAndAdvanceCursor(r,void 0,void 0);return}case"chunk":{const{data:r,generation:o,id:a,seq:c}=i,u=this.streams.get(a);u&&typeof c=="number"&&(u.lastSeq=c,typeof o=="number"&&(u.generation=o),u.durable=!0),u?.handle.push(w(r));return}case"complete":{this.handleCompleteMessage(i.id);return}case"data":case"delta":{this.handleDataMessage(i);return}case"error":{this.handleErrorMessage(i);break}case"identity":{this.handleIdentityFrame(i,t),this.adoptSocketConnectionId(i,t),this.confirmShardIdentity(t);break}case"live":{this.dispatchLive(i,t);break}case"pokeEnd":{this.handlePokeEnd(i,t);break}case"pokePart":{this.pokeAssembler.part(t,i);break}case"pokeStart":{this.pokeAssembler.start(t,i);break}case"resume":{this.handleResumeMessage(i);break}case"settled":{this.handleSettledMessage(i);break}case"whisper":{this.dispatchWhisper(i,t);break}case"whisper_subscribed":{this.acknowledgeWhisperJoin(l(t),i.topic);break}}}handleErrorMessage(e){const t=e.error?.code;if(t==="TOKEN_EXPIRED"){this.notifyTokenExpired();return}if(t==="STREAM_ID_IN_USE")return;const{id:s}=e,i=s===void 0?void 0:this.streams.get(s);if(i&&s!==void 0){i.handle.fail(Ge(e)),this.forgetStream(s);return}const r=s===void 0?void 0:this.subscriptions.getById(s);if(r){const a=fe(e),c=this.identityFingerprint(),u=A.keyOf(r);this.markQueryRejected(r),I(r.errorCallbacks,a),this.tabCoordinator?.isLeader()&&this.tabCoordinator.broadcastSubscriptionError(u,a,c);return}const o=s===void 0?void 0:this.shapeSubscriptions.get(s);o&&(o.answered||(o.answered=!0,this.emitSyncStatus()),I(o.errorCallbacks,fe(e)))}markQueryRejected(e,t=this.tabCoordinator!==void 0&&!this.tabCoordinator.isLeader()||this.connectionGateState(e.shardKey).polling){const s=t?"valueReceived":"acked";e[s]||(e[s]=!0,this.emitSyncStatus())}handlePokeEnd(e,t){const s=this.pokeAssembler.end(t,e.pokeId);if(s){Yi(this.shapeSubscriptions,s);for(const i of s.parts.keys()){const r=this.shapeSubscriptions.get(i);r&&!s.undecodable.has(i)&&this.applyPokePart(r,s,e)}}}applyPokePart(e,t,s){const i=e.answered,r=Ji(e,t,s);if(e.answered!==i&&this.emitSyncStatus(),we(e),r==="reseed"){this.sendShapeSubscribeIfOpen(e);return}e.onCheckpoint?.({checkpoint:e.serverCursor,mutationId:e.lastMutationId})}resnapshotSubscription(e){e.acked=!1,e.serverCursor=void 0,e.serverEpoch=void 0,this.emitSyncStatus(),console.warn("[lunora] could not merge a row delta into the cached result; re-subscribing for a full snapshot"),this.sendSubscribeIfOpen(e)}handleDataMessage(e,t){const{id:s}=e,i=s?this.subscriptions.getById(s):void 0;if(!i||e.type==="data"&&Xi(i,e))return;let r;try{r=De(e,i.serverBase)}catch(a){I(i.errorCallbacks,{code:"WIRE_DECODE_FAILED",message:`could not decode a server frame for this subscription — ${a instanceof Error?a.message:String(a)}`});return}if(r===We){this.resnapshotSubscription(i);return}this.dropCacheSeed(A.keyOf(i));const o=t!==void 0&&!i.valueReceived;if(Fe(i,r,{cursor:e.cursor,epoch:e.epoch}),o&&(i.valueReceived=!0,this.emitSyncStatus()),e.lastMutationId!==void 0&&(se(i,e.lastMutationId),ie(i,!0)),this.persistQueryValue(i),Z(i,i.serverCursor),t!==void 0&<(i,t),M(i,r),this.tabCoordinator?.isLeader()){const a=A.keyOf(i);this.tabCoordinator.broadcastSubscriptionData(a,r,i.serverCursor,i.serverEpoch,this.identityFingerprint())}}handleResumeMessage(e){const t=this.subscriptions.getById(e.id);t&&this.ackAndAdvanceCursor(t,e.cursor,e.epoch)}handleSettledMessage(e){const t=this.subscriptions.getById(e.id);if(t&&(this.ackAndAdvanceCursor(t,e.cursor,e.epoch),e.lastMutationId!==void 0&&se(t,e.lastMutationId),ie(t),this.tabCoordinator?.isLeader())){const s=A.keyOf(t);this.tabCoordinator.broadcastSubscriptionSettled(s,t.serverCursor,t.serverEpoch,t.lastMutationId,this.clientId,this.identityFingerprint())}}ackAndAdvanceCursor(e,t,s){const i=!e.acked;e.acked=!0,i&&this.emitSyncStatus(),(t!==void 0&&t!==e.serverCursor||s!==void 0&&s!==e.serverEpoch)&&(t!==void 0&&(e.serverCursor=t),s!==void 0&&(e.serverEpoch=s),this.persistQueryValue(e),Z(e,e.serverCursor)&&M(e,e.serverBase))}adoptSocketConnectionId(e,t){const s=this.getConnection(t);if(!(s===void 0||typeof e.connectionId!="string")){s.connectionId=e.connectionId,s.whisperAck=e.whisperAck===!0;for(const i of this.liveSocketGrants.get(l(t))?.keys()??[])this.grantWhenJoined(t,i,e.connectionId)}}grantWhenJoined(e,t,s){const i=l(e),r=this.liveSocketGrants.get(i)?.get(t);if(r===void 0)return;const{stream:o,topic:a}=r,c=()=>{this.liveSocketGrants.get(i)?.get(t)===void 0||this.getConnection(e)?.connectionId!==s||this.postLiveControl(`/live/${o}/control`,e,{action:"subscribe",connectionId:s,stream:o,subscriptionId:t,topic:a},d=>{this.refuseLiveGrant(e,t,d,s)})};this.getConnection(e)?.whisperAck===!0?this.whenWhisperJoined(i,a,c):c()}sendWhisperJoin(e,t,s){const i=this.whisperJoinState(t,s);i.pending+=1,i.joined=!1,k(e,{topic:s,type:"whisper_subscribe"})}acknowledgeWhisperJoin(e,t){const s=this.whisperJoins.get(e)?.get(t);if(s!==void 0&&(s.pending=Math.max(0,s.pending-1),!(s.pending>0))){s.joined=!0;for(const i of s.waiters.splice(0))clearTimeout(i.timer),i.run();this.releaseWhisperJoin(e,t)}}releaseWhisperJoin(e,t){if(this.whisperHandlers.get(e)?.has(t)===!0)return;const s=this.whisperJoins.get(e),i=s?.get(t);if(!(s===void 0||i===void 0||i.pending>0)){for(const r of i.waiters.splice(0))clearTimeout(r.timer);s.delete(t),s.size===0&&this.whisperJoins.delete(e)}}whenWhisperJoined(e,t,s){const i=this.whisperJoinState(e,t);if(i.joined){s();return}const r={run:s,timer:void 0};r.timer=setTimeout(()=>{i.waiters=i.waiters.filter(o=>o!==r),s()},Le),i.waiters.push(r)}dropWhisperJoinWaiters(e){for(const t of this.whisperJoins.get(e)?.values()??[])for(const s of t.waiters.splice(0))clearTimeout(s.timer)}whisperJoinState(e,t){let s=this.whisperJoins.get(e);s===void 0&&(s=new Map,this.whisperJoins.set(e,s));let i=s.get(t);return i===void 0&&(i={joined:!1,pending:0,waiters:[]},s.set(t,i)),i}refuseLiveGrant(e,t,s,i){const r=l(e),o=this.liveSocketGrants.get(r),a=o?.get(t);o===void 0||a===void 0||this.getConnection(e)?.connectionId!==i||(o.delete(t),o.size===0&&this.liveSocketGrants.delete(r),a.release(),a.onError?.({status:s,topic:a.topic}))}postLiveControl(e,t,s,i){const{fetchImpl:r}=this;if(!r)return;const o=JSON.stringify(t===void 0?s:{...s,shardKey:t}),a=this.rpcRequestHeaders({},t);this.liveControlChain=this.liveControlChain.then(()=>fn(r,C(this.url,e),o,a)).then(c=>{c>=400&&c<500&&c!==404&&c!==401&&i?.(c)}).catch(()=>{})}dispatchLive(e,t){const s=this.liveSocketGrants.get(l(t));if(!s)return;const i=w(e.data);for(const r of s.values())if(!(r.stream!==e.stream||r.topic!==e.topic))try{r.onEvent(i)}catch{}}dispatchWhisper(e,t){const s=this.whisperHandlers.get(l(t))?.get(e.topic);if(!s)return;const i=w(e.data);for(const r of s)try{r(i,e.from)}catch{}}notifyTokenExpired(){this.tokenExpiredListeners.emit()}handleCompleteMessage(e){const t=this.streams.get(e);if(t){t.handle.complete(),this.forgetStream(e);return}const s=this.subscriptions.getById(e);s&&(s.acked=!1,this.emitSyncStatus(),I(s.errorCallbacks,{code:"SUBSCRIPTION_CANCELLED",message:"subscription was cancelled by the server"}))}unpersist(e){e&&(this.replayAttempts.delete(e),this.offlineQueue.discard(e))}identityFingerprint(){if(this.authSubject!==void 0)return this.authSubject===null?null:`subj:${this.authSubject}`;const e=this.authToken;return e===null?null:this.hashToken(e)}hashToken(e){let t=2166136261,s=5381;for(let i=0;i<e.length;i+=1){const r=e.charCodeAt(i);t^=r,t=Math.imul(t,16777619),s=Math.imul(s,33)+r}return`${e.length.toString(36)}:${(t>>>0).toString(36)}:${(s>>>0).toString(36)}`}credentialStamp(){const e=this.authToken;return e===null?{}:{credential:this.hashToken(e)}}cachedQueryMatchesIdentity(e){return this.identityFingerprint()===null&&this.identityUnresolved()?!1:!this.subjectAwaitingReconfirm()&&e.identity===this.identityFingerprint()||this.isSameCredentialUnderTokenHash(e.identity)?!0:e.credential!==void 0&&e.credential===this.credentialStamp().credential}isSameCredentialUnderTokenHash(e){if(e===null||e.startsWith("subj:"))return!1;const t=this.authToken;return t===null?!1:this.hashToken(t)===e}releaseSessionProbe(){this.sessionProbesInFlight-=1,!(this.identityUnresolved()||this.identityFingerprint()!==null)&&!this.closed&&this.offlineQueue.size>0&&q(this.computeStatus())&&this.flushAllOfflineQueues()}identityUnresolved(){return this.sessionProbesInFlight>0?!0:this.identityResolutionExpected&&!this.identitySettled}adoptResolvedSubject(e,t,s){if(!(this.closed||this.authToken!==e||s!==this.sessionProbeGeneration)){if(e===null){this.adoptCookieSubject(t?.id??null,s);return}t!==null&&this.setAuthToken(e,t.id)}}adoptCookieSubject(e,t){return this.closed||this.authToken!==null||t<this.identityAnsweredAt?!1:(this.identityAnsweredAt=t,this.identitySettled=!0,this.setAuthToken(null,e),!0)}sendEncodedWhisper(e,t,s){this.ensureSocket(s.shardKey);const i=this.getConnection(s.shardKey),r=i!==void 0&&k(i,{data:t,topic:e,type:"whisper"});return this.releaseIdleShard(s.shardKey),r}roomSendsAdmitted(e){const t=this.getConnection(e);return t?.wsState==="open"&&t.retired!==!0&&t.identityConfirmed===!0&&t.roomsRejoined===!0}releaseRoomSends(e){if(this.roomSendsAdmitted(e))for(const t of this.roomFlushes.get(l(e))??[])t()}confirmShardIdentity(e){const t=this.getConnection(e);t!==void 0&&(t.identityConfirmed=!0),this.releaseRoomSends(e)}handleIdentityFrame(e,t){const s=this.getConnection(t)?.identityQuestion,{subject:i}=e;s===void 0||i!==null&&typeof i!="string"||this.adoptCookieSubject(i,s)||!this.closed&&this.authToken===null&&(i===null?null:`subj:${i}`)!==this.identityFingerprint()&&this.evictPreviousIdentitySession()}applySubject(e,t){if(t!==void 0){this.authSubject=t,this.subjectToken=e;return}(e===null&&this.authSubject!==null||e!==null&&this.authSubject===null)&&(this.authSubject=void 0,this.subjectToken=null)}isKnownNobody(){return this.authSubject===null&&this.authToken===null}subjectAwaitingReconfirm(){return this.authSubject!==void 0&&this.authSubject!==null&&this.subjectToken!==this.authToken}stampOf(e){const t=e.id===void 0?void 0:this.queuedIdentities.get(e.id);return t===void 0?e.identity:t}warnRefreshWithoutSubject(e,t){e===null||t===null||this.authSubject!==void 0||this.authRefusalNotifiedFor!==this.hashToken(e)||console.warn("[lunora] setAuthToken replaced a token that was just refused for a queued write, with no subject: without one a refresh reads as a user switch, so the held writes were discarded (OFFLINE_IDENTITY_CHANGED). Pass the user id, e.g. setAuthToken(token, user.id), to keep them across a refresh.")}rejectQueuedForIdentityChange(e){const t=this.offlineQueue.drain(),s=[];for(const i of t){if(this.identityVerdict(this.stampOf(i))!=="mismatch"){s.push(i);continue}this.queuedIdentities.delete(i.id??""),this.unpersist(i.id);const r=new Error("offline mutation discarded: auth identity changed before replay");r.code="OFFLINE_IDENTITY_CHANGED",i.reject(r),this.emitItemSettled(i,"rejected",r)}this.offlineQueue.requeue(s),e!==null&&this.clearQueryCacheForIdentityChange()}restampConnectionIdentity(e,t){for(const s of this.connections.values())s.identity===e&&(s.identity=t)}restampQueuedIdentity(e,t){for(const[s,i]of this.queuedIdentities)i===e&&this.queuedIdentities.set(s,t);this.offlineQueue.restampIdentity(e,t)}restampWatermarks(e,t){const s=e??"",i=this.clientWatermarks.get(s);if(i===void 0)return;this.clientWatermarks.delete(s);const r=t??"",o=this.clientWatermarks.get(r);if(o===void 0)this.clientWatermarks.set(r,i);else for(const[a,c]of i)o.set(a,c)}clearQueryCacheForIdentityChange(){this.revokeCacheSeededValues(),this.cacheFlushTimer!==void 0&&(clearTimeout(this.cacheFlushTimer),this.cacheFlushTimer=void 0),this.pendingCacheWrites.clear(),this.hydratedQueryCache.clear(),this.queryCache?.clear().catch(()=>{})}evictPreviousIdentitySession(){this.resetRoomSends(),this.revokeCacheSeededValues();for(const e of this.subscriptions.all())e.serverBase=void 0,e.serverCursor=void 0,e.serverEpoch=void 0,e.acked=!1,e.valueReceived=!1,M(e,void 0);for(const e of this.shapeSubscriptions.values())e.rows.clear(),e.serverCursor=void 0,e.serverEpoch=void 0,e.answered=!1,we(e);this.emitSyncStatus(),this.bounceShardSockets(),this.retiredIdentities+=1,this.identityChangeListeners.emit()}restartTabCoordinatorForIdentity(){if(!this.tabCoordinator)return;const e=this.tabCoordinator.isLeader();this.tabCoordinator.stop(),this.tabCoordinator=this.createTabCoordinator(),this.tabCoordinator.start(),e&&this.tabCoordinator.promoteImmediately()}resetRoomSends(){for(const e of this.roomIdentityResets)e()}bounceShardSockets(){for(const e of this.connections.values())if(e.socket){e.retired=!0;try{e.socket.close()}catch{}}for(const e of this.supplementaryBounces)e()}flushAllOfflineQueues(){for(const e of this.queuedOfflineShardKeys)this.flushOfflineQueue(e).catch(()=>{})}async flushOfflineQueue(e){const t=l(e),s=this.offlineFlushes.get(t);if(s===void 0&&this.offlineQueue.size===0)return;const i=(async()=>{await(s??Promise.resolve());const{authToken:r}=this;try{await this.drainOfflineQueue(e,r)}catch{}!this.closed&&this.authToken!==r&&this.offlineQueue.size>0&&q(this.computeStatus())&&this.flushOfflineQueue(e).catch(()=>{})})();this.offlineFlushes.set(t,i),await i,this.offlineFlushes.get(t)===i&&(this.offlineFlushes.delete(t),this.releaseIdleShard(e))}async drainOfflineQueue(e,t){const s=this.offlineQueue.drainConflict();for(const d of s){this.unpersist(d.id),this.queuedIdentities.delete(d.id??"");const h=new Error("offline mutation skipped: precondition failed before replay");h.code="OFFLINE_PRECONDITION_FAILED",this.emitItemSettled(d,"rejected",h)}const i=l(e),r=this.offlineQueue.drain(d=>l(d.shardKey)===i);if(r.length===0)return;const o=[],a=[];for(const d of r){const h=this.replayGateVerdict(d);h==="send"?o.push(d):h==="hold"&&a.push(d)}if(this.offlineQueue.requeue(a),a.length>0&&this.subjectAwaitingReconfirm()&&(this.getCurrentUser().catch(()=>{}),this.noteHeldRetryDelay(e)),o.length===0){this.scheduleRateLimitedRetry(e);return}const c=this.encodableOrSettleTerminal(o);if(c.length===0){this.scheduleRateLimitedRetry(e);return}if(c.length===1){await this.replaySequential(c,e,t),this.scheduleRateLimitedRetry(e);return}const u=[];for(let d=0;d<c.length;d+=$){const h=c.slice(d,d+$),p=await this.replayBatched(h,e,t);if(u.push(...p.requeue),p.stop||p.requeue.length>0){u.push(...c.slice(d+$));break}}u.length>0&&this.offlineQueue.requeue(u),this.scheduleRateLimitedRetry(e)}noteHeldRetryDelay(e){const t=l(e),s=this.replayRetryState.get(t),i=(s?.attempts??0)+1;this.replayRetryState.set(t,{attempts:i,delayMs:Math.max(s?.delayMs??0,te(i))})}noteReplayRetryDelay(e,t,s){const i=l(e),r=this.replayRetryState.get(i),o=(r?.attempts??0)+1,a=qi(t,o)??(s===null&&Q(t)?te(o):void 0);this.replayRetryState.set(i,{attempts:o,delayMs:a===void 0?r?.delayMs:Math.max(r?.delayMs??0,a)})}scheduleRateLimitedRetry(e){const t=l(e),s=this.replayRetryState.get(t),i=s?.delayMs;if(s===void 0||i===void 0||this.closed||this.offlineQueue.size===0){this.replayRetryState.delete(t);return}s.delayMs=void 0;const r=this.replayRetryTimers.get(t);r!==void 0&&clearTimeout(r),this.replayRetryTimers.set(t,setTimeout(()=>{this.replayRetryTimers.delete(t),this.flushOfflineQueue(e).catch(()=>{})},i))}encodableOrSettleTerminal(e){const t=[];for(const s of e)try{E(s.args,`args for '${s.functionPath}'`),t.push(s)}catch(i){this.settleReplayTerminal(s,i instanceof Error?i:new Error(String(i)))}return t}identityVerdict(e){if(this.subjectAwaitingReconfirm())return"unknown";const t=this.identityFingerprint();return t===null&&this.identityUnresolved()?"unknown":e===t||e!==void 0&&this.isSameCredentialUnderTokenHash(e)?"match":t===null?"unknown":"mismatch"}replayGateVerdict(e){const t=this.stampOf(e);if(t===void 0)return this.queuedIdentities.delete(e.id??""),"send";const s=this.identityVerdict(t);if(s==="unknown")return"hold";if(this.queuedIdentities.delete(e.id??""),s==="match")return"send";this.unpersist(e.id);const i=new Error("offline mutation skipped: auth identity changed before replay");return i.code="OFFLINE_IDENTITY_CHANGED",e.reject(i),this.emitItemSettled(e,"rejected",i),"reject"}settleReplaySuccess(e,t,s){this.unpersist(e.id),this.recordShardCursor(e.shardKey,s),e.onCommit?.(s),e.resolve(t),this.emitItemSettled(e,"committed")}cursorKeyFor(e){return e??this.defaultShardKey??""}learnDefaultShardKey(e,t){const s=e.headers.get("x-lunora-shard-key");if(s===null||t!==void 0||this.defaultShardKey===s)return;this.defaultShardKey=s;const i=this.shardCursors.get("");i!==void 0&&(this.shardCursors.set(s,Math.max(this.shardCursors.get(s)??0,i)),this.shardCursors.delete(""))}recordShardCursor(e,t){if(typeof t!="number")return;const s=this.cursorKeyFor(e);this.shardCursors.set(s,Math.max(this.shardCursors.get(s)??0,t))}shouldRequeueReplayFailure(e,t){return this.noteIdentityMismatch(e)?!0:this.noteReplayAuthRefusal(e,t)||ke(e)}noteReplayAuthRefusal(e,t){if(!Q(e))return!1;const s=this.hashToken(t??"");return t===this.authToken&&this.authRefusalNotifiedFor!==s&&(this.authRefusalNotifiedFor=s,this.notifyTokenExpired()),!0}noteCredentialAccepted(e){this.authRefusalNotifiedFor!==void 0&&this.authRefusalNotifiedFor===this.hashToken(e??"")&&(this.authRefusalNotifiedFor=void 0)}takeReplayCredential(e){if(e===void 0)return;const t=this.replayCredentials.get(e);if(t===void 0)throw new TypeError("LunoraClient: `replayCredential` must come from this client's `replayIdentityVerdict`, and is single use");return this.replayCredentials.delete(e),{flags:{authToken:t.authToken,...J(t.stamp,t.authToken)},stamp:t.stamp}}noteIdentityMismatch(e){if(e?.code!=="IDENTITY_MISMATCH")return!1;const t=this.identityFingerprint();return this.getCurrentUser().then(()=>{!this.warnedIdentityDisagreement&&this.identityFingerprint()===t&&(this.warnedIdentityDisagreement=!0,console.warn('[lunora] a replayed write was refused with IDENTITY_MISMATCH, but `/get-session` still names the same user. The worker\'s `resolveIdentity` must return the same `userId` as the better-auth `user.id`, and RPC requests must carry the session cookie (`credentials: "include"` on a cross-origin fetch).'))}).catch(()=>{}),!0}settleReplayUndecodable(e,t,s){this.unpersist(e.id),this.recordShardCursor(e.shardKey,s),e.onCommit?.(s),e.reject(t),this.emitItemSettled(e,"committed",t)}spendsLastReplayAttempt(e,t){if(e.id===void 0)return!1;const s=t?.code;if(e.ambiguousSend!==!0||Q(t)||s==="RATE_LIMITED"||s==="TOO_MANY_REQUESTS"||!ke(t))return!1;const i=(this.replayAttempts.get(e.id)??0)+1;return this.replayAttempts.set(e.id,i),i>=nt}keepUnexhaustedAmbiguousWrites(e,t){return e.filter(s=>s.ambiguousSend===!0&&this.spendsLastReplayAttempt(s,t)?(this.settleReplayTerminal(s,t),!1):!0)}settleReplayTerminal(e,t){this.unpersist(e.id),e.reject(t),this.emitItemSettled(e,"rejected",t)}async replaySequential(e,t,s){for(let i=0;i<e.length;i+=1){const r=e[i];if(!r)continue;let o;try{const a=await this.rpc(r.functionPath,r.args,r.shardKey,{authToken:s,baselineSeq:r.baselineSeq,captureBookmark:!0,clientId:r.clientId??this.clientId,...J(r.identity,s),mutationId:r.id,onCommitCursor:c=>{o=c}});this.settleReplaySuccess(r,a,o)}catch(a){if(K(a)){this.settleReplayUndecodable(r,a,o);continue}if(!this.shouldRequeueReplayFailure(a,s)||this.spendsLastReplayAttempt(r,a)){this.settleReplayTerminal(r,a);continue}this.noteReplayRetryDelay(t,a,s),this.offlineQueue.requeue(e.slice(i));return}}}async replayBatched(e,t,s){if(!this.fetchImpl)return{requeue:e,stop:!0};const i=JSON.stringify({calls:e.map((d,h)=>({args:E(d.args,`args for '${d.functionPath}'`),baselineSeq:d.baselineSeq,functionPath:d.functionPath,id:h,clientId:d.clientId??this.clientId,mutationId:d.id,shardKey:d.shardKey}))});if(e.length>1&&Gi(i)>Ki)return await this.replayBatchedHalves(e,t,s);const{fetchImpl:r}=this;let o,a;try{({payload:a,response:o}=await W(this.rpcTimeoutMs,void 0,async d=>{const h=await r(C(this.url,V),{body:i,headers:this.rpcRequestHeaders({attachBookmark:!0,authToken:s,...J(e.find(p=>p.identity!==void 0)?.identity,s)}),method:"POST",signal:d});if(h.status===413&&e.length>1)return{payload:void 0,response:h};try{return{payload:await h.json(),response:h}}catch{return{payload:void 0,response:h}}}))}catch(d){return this.noteReplayRetryDelay(t,d,s),{requeue:this.keepUnexhaustedAmbiguousWrites(e,d),stop:!0}}const c=o.headers.get("x-d1-bookmark");if(c&&this.bookmark.set(c),o.status===413&&e.length>1)return await this.replayBatchedHalves(e,t,s);const u=o.headers.get("retry-after");if(!a)return this.settleWholeBatchError(e,D(o.status,o.statusText,u),t,s);if(!Array.isArray(a.results)){const d=B(a),h=d===void 0?D(o.status,o.statusText,u):le(d,u);return this.settleWholeBatchError(e,h,t,s)}return{requeue:this.settleReplayBatchSlots(e,a.results,t,s),stop:!1}}settleWholeBatchError(e,t,s,i){if(t instanceof U||t.code!==void 0&&this.shouldRequeueReplayFailure(t,i))return this.noteReplayRetryDelay(s,t,i),{requeue:this.keepUnexhaustedAmbiguousWrites(e,t),stop:!0};for(const r of e)this.settleReplayTerminal(r,t);return{requeue:[],stop:!1}}async replayBatchedHalves(e,t,s){const i=Math.ceil(e.length/2),r=await this.replayBatched(e.slice(0,i),t,s);if(r.stop||r.requeue.length>0)return{requeue:[...r.requeue,...e.slice(i)],stop:!0};const o=await this.replayBatched(e.slice(i),t,s);return{requeue:[...r.requeue,...o.requeue],stop:o.stop}}settleReplayBatchSlots(e,t,s,i){const r=ji(t),o=[];let a=!1,c=!1;for(const[u,d]of e.entries()){const h=$i(r.get(u));switch(h.kind){case"committed":{a=!0,this.settleReplaySuccess(d,h.value,h.commitCursor);break}case"errored":{c||=Q(h.error),this.shouldRequeueReplayFailure(h.error,i)&&!this.spendsLastReplayAttempt(d,h.error)?(this.noteReplayRetryDelay(s,h.error,i),o.push(d)):this.settleReplayTerminal(d,h.error);break}case"unanswered":{const p=je();if(this.spendsLastReplayAttempt(d,p)){this.settleReplayTerminal(d,p);break}this.noteReplayRetryDelay(s,p,i),o.push(d);break}default:a=!0,this.settleReplayUndecodable(d,h.error,h.commitCursor)}}return a&&!c&&this.noteCredentialAccepted(i),o}}export{Me as LunoraClient};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{O as s,n,r as o}from"./offline-queue-Dt_um8sR.mjs";export{s as OfflineQueue,n as nextId,o as reportPersistenceError};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
let d=0;const s="lunora-bridge",o=1e3,h=3e3;class l{bc;tabId;heartbeatInterval;leaderTimeout;knownLeader=void 0;leader=!1;running=!1;promotionPending=!1;lastHeartbeat=0;pendingData=new Map;heartbeatTimer=void 0;leaderCheckTimer=void 0;onBecomeLeader;onStopBeingLeader;onConnectionStatus;onSubscriptionData;onLeaderClaimAnswered;onSubscriptionError;onSubscriptionSettled;constructor(t={}){if(d+=1,this.tabId=`tab_${String(d)}_${crypto.randomUUID()}`,this.heartbeatInterval=t.heartbeatInterval??o,this.leaderTimeout=t.leaderTimeout??h,this.onBecomeLeader=t.onBecomeLeader,this.onStopBeingLeader=t.onStopBeingLeader,this.onConnectionStatus=t.onConnectionStatus,this.onSubscriptionData=t.onSubscriptionData,this.onLeaderClaimAnswered=t.onLeaderClaimAnswered,this.onSubscriptionError=t.onSubscriptionError,this.onSubscriptionSettled=t.onSubscriptionSettled,typeof BroadcastChannel>"u"){this.bc=void 0;return}this.bc=new BroadcastChannel(t.channelName??s),this.bc.addEventListener("message",e=>{this.handleMessage(e.data)})}start(){if(!this.running){if(this.running=!0,this.bc===void 0){this.becomeLeader();return}this.broadcast({type:"claim-leadership",tabId:this.tabId,ts:Date.now()}),setTimeout(()=>{this.running&&this.knownLeader===void 0&&this.becomeLeader()},this.leaderTimeout),this.leaderCheckTimer=setInterval(()=>{this.checkLeaderHealth()},this.leaderTimeout),this.heartbeatTimer=setInterval(()=>{this.sendHeartbeat()},this.heartbeatInterval)}}stop(){this.running=!1,this.leader&&(this.broadcast({type:"yield-leadership",tabId:this.tabId}),this.leader=!1,this.knownLeader=void 0,this.onStopBeingLeader?.()),this.heartbeatTimer!==void 0&&(clearInterval(this.heartbeatTimer),this.heartbeatTimer=void 0),this.leaderCheckTimer!==void 0&&(clearInterval(this.leaderCheckTimer),this.leaderCheckTimer=void 0),this.bc?.close()}isLeader(){return this.leader}promoteImmediately(){this.running&&this.becomeLeader()}get leaderTabId(){return this.knownLeader}get id(){return this.tabId}get isRunning(){return this.running}broadcastSubscriptionData(t,e,i,a,r){this.leader&&(this.pendingData.size===0&&queueMicrotask(()=>{this.flushPendingData()}),this.pendingData.set(t,{type:"subscription-data",tabId:this.tabId,key:t,data:e,...i===void 0?{}:{cursor:i},...a===void 0?{}:{epoch:a},...r===void 0?{}:{identity:r}}))}broadcastSubscriptionError(t,e,i){this.leader&&this.broadcast({type:"subscription-error",tabId:this.tabId,key:t,error:e,...i===void 0?{}:{identity:i}})}broadcastSubscriptionSettled(t,e,i,a,r,n){this.leader&&this.broadcast({type:"subscription-settled",tabId:this.tabId,key:t,...e===void 0?{}:{cursor:e},...i===void 0?{}:{epoch:i},...a===void 0?{}:{lastMutationId:a},...r===void 0?{}:{clientId:r},...n===void 0?{}:{identity:n}})}broadcastConnectionStatus(t,e){this.leader&&this.broadcast({type:"connection-status",tabId:this.tabId,status:t,...e===void 0?{}:{identity:e}})}broadcast(t){this.flushPendingData(),this.bc?.postMessage(t)}flushPendingData(){if(this.pendingData.size===0)return;const t=[...this.pendingData.values()];if(this.pendingData.clear(),!!this.leader)for(const e of t)this.bc?.postMessage(e)}handleMessage(t){switch(t.type){case"claim-leadership":{this.handleClaimLeadership(t);break}case"connection-status":{if(this.leader||t.tabId===this.tabId)break;this.onConnectionStatus?.(t.status,t.identity);break}case"heartbeat":{this.handleHeartbeat(t);break}case"subscription-data":{if(this.leader||t.tabId===this.tabId)break;this.onSubscriptionData?.(t.key,t.data,t.cursor,t.epoch,t.identity);break}case"subscription-error":{if(this.leader||t.tabId===this.tabId)break;this.onSubscriptionError?.(t.key,t.error,t.identity);break}case"subscription-settled":{if(this.leader||t.tabId===this.tabId)break;this.onSubscriptionSettled?.(t.key,t.cursor,t.epoch,t.lastMutationId,t.clientId,t.identity);break}case"yield-leadership":{this.knownLeader===t.tabId&&(this.knownLeader=void 0,this.running&&!this.leader&&this.claimAndPromote());break}}}handleClaimLeadership(t){if(t.tabId!==this.tabId){if(this.leader){this.broadcast({type:"heartbeat",tabId:this.tabId,ts:Date.now()}),this.onLeaderClaimAnswered?.();return}this.knownLeader===void 0&&t.tabId<this.tabId&&(this.knownLeader=t.tabId,this.lastHeartbeat=t.ts)}}handleHeartbeat(t){if(t.tabId!==this.tabId){if(this.leader){this.resolveLeaderVsLeaderTieBreak(t);return}this.lastHeartbeat=t.ts,this.knownLeader=t.tabId}}resolveLeaderVsLeaderTieBreak(t){t.tabId<this.tabId?(this.leader=!1,this.knownLeader=t.tabId,this.lastHeartbeat=t.ts,this.onStopBeingLeader?.()):this.broadcast({type:"heartbeat",tabId:this.tabId,ts:Date.now()})}becomeLeader(){this.leader||(this.leader=!0,this.knownLeader=this.tabId,this.lastHeartbeat=Date.now(),this.onBecomeLeader?.(),this.broadcast({type:"heartbeat",tabId:this.tabId,ts:Date.now()}))}sendHeartbeat(){this.leader&&this.broadcast({type:"heartbeat",tabId:this.tabId,ts:Date.now()})}checkLeaderHealth(){if(!this.running||this.leader)return;if(this.knownLeader===void 0){this.claimAndPromote();return}Date.now()-this.lastHeartbeat>this.leaderTimeout&&(this.knownLeader=void 0,this.claimAndPromote())}claimAndPromote(){this.promotionPending||(this.promotionPending=!0,this.broadcast({type:"claim-leadership",tabId:this.tabId,ts:Date.now()}),setTimeout(()=>{this.promotionPending=!1,this.running&&this.knownLeader===void 0&&this.becomeLeader()},this.leaderTimeout))}}export{l as TabCoordinator};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const _=3e4,E=1e4,T=3e4,A=5e3,s=3,S=250,M=5e3,L=5e3,I=64,R=3,C=1e4,U=5,a=8;export{_ as D,L as I,I as M,S as Q,R,M as S,E as a,T as b,A as c,s as d,C as e,U as f,a as g};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{c as i}from"./live-stream-Dil9byXF.mjs";import"./client-tuning-C10B2KCO.mjs";import"./createReconnect-CjTmjJDH.mjs";import"./stream-idle-C7CsIT_m.mjs";export{i as connectLiveStream};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{assertMaxEntries as y}from"./createInMemoryQueryCache-
|
|
1
|
+
import{assertMaxEntries as y}from"./createInMemoryQueryCache-B5wX-gTy.mjs";import{s as u}from"./single-blob-store-DpqSxsgi.mjs";const w="lunora:query-cache",d=50,E=s=>{const n=y(s.maxEntries??d,"createAsyncStorageQueryCache"),r=u(s.storage,s.key??w),c=async()=>{const e=await r.read();return typeof e=="object"&&e!==null&&!Array.isArray(e)?new Map(Object.entries(e)):new Map},o=e=>r.write(Object.fromEntries(e)),i=e=>{if(e.size<=n)return;const a=[...e.values()].toSorted((t,l)=>t.ts-l.ts);for(const t of a){if(e.size<=n)break;e.delete(t.key)}};return{clear:r.clear,load:()=>r.serialize(async()=>[...(await c()).values()]),put:(e,a)=>r.serialize(async()=>{const t=await c();t.set(e,{...a,key:e}),i(t),await o(t)}),remove:e=>r.serialize(async()=>{const a=await c();a.delete(e)&&await o(a)})}};export{E as createAsyncStorageQueryCache};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{LunoraError as u}from"@lunora/errors";import{p as s,c as f,a as y}from"./idb-utility-
|
|
1
|
+
import{LunoraError as u}from"@lunora/errors";import{p as s,c as f,a as y}from"./idb-utility-BS7xvou1.mjs";const x=()=>{const r=new Map,t=e=>({...e,args:{...e.args}});return{append:e=>(r.set(e.id,t(e)),Promise.resolve()),clear:()=>(r.clear(),Promise.resolve()),load:()=>Promise.resolve([...r.values()].map(e=>t(e))),remove:e=>(r.delete(e),Promise.resolve()),replace:e=>(r.has(e.id)&&r.set(e.id,t(e)),Promise.resolve())}},m="lunora-outbox",p="offline-mutations",d="by_id",w=(r={})=>{const t=r.indexedDB??(typeof indexedDB>"u"?void 0:indexedDB);if(!t)throw new u("INTERNAL","createIndexedDbPersistence: no IndexedDB available — pass `indexedDB` or use createInMemoryPersistence()");const e=r.databaseName??m,c=r.storeName??p,l=y(t,e,1,a=>{a.objectStoreNames.contains(c)||a.createObjectStore(c,{autoIncrement:!0}).createIndex(d,"id",{unique:!0})}),o=f(l,c);return{append:async a=>{await o("readwrite",n=>s(n.add(a)))},clear:async()=>{await o("readwrite",a=>s(a.clear()))},load:async()=>o("readonly",a=>s(a.getAll())),remove:async a=>{await o("readwrite",async n=>{const i=await s(n.index(d).getKey(a));i!==void 0&&await s(n.delete(i))})},replace:async a=>{await o("readwrite",async n=>{const i=await s(n.index(d).getKey(a.id));i!==void 0&&await s(n.put(a,i))})}}},b=(r,t=!0)=>{if(r!==!1){if(r)return r;if(!(!t||typeof indexedDB>"u"))return w()}};export{x as createInMemoryPersistence,w as createIndexedDbPersistence,b as resolvePersistenceAdapter};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{LunoraError as v}from"@lunora/errors";import{p as u,c as h,a as I}from"./idb-utility-
|
|
1
|
+
import{LunoraError as v}from"@lunora/errors";import{p as u,c as h,a as I}from"./idb-utility-BS7xvou1.mjs";const T=(e,o,a)=>`${e}::${o}::${a??""}`,w=500,E=(e,o)=>{if(!Number.isInteger(e)||e<1)throw new v("INTERNAL",`${o}: maxEntries must be a positive integer, got ${String(e)}`);return e},B=(e={})=>{const o=E(e.maxEntries??w,"createInMemoryQueryCache"),a=new Map,s=r=>({...r,value:structuredClone(r.value)}),l=()=>{if(a.size<=o)return;const r=[...a.values()].toSorted((n,y)=>n.ts-y.ts);for(const n of r){if(a.size<=o)break;a.delete(n.key)}};return{clear:()=>(a.clear(),Promise.resolve()),load:()=>Promise.resolve([...a.values()].map(r=>s(r))),put:(r,n)=>(a.set(r,s({...n,key:r})),l(),Promise.resolve()),remove:r=>(a.delete(r),Promise.resolve())}},A="lunora-query-cache",b="query-cache",f="by_ts",p=1,N=(e={})=>{const o=e.indexedDB??(typeof indexedDB>"u"?void 0:indexedDB);if(!o)throw new v("INTERNAL","createIndexedDbQueryCache: no IndexedDB available — pass `indexedDB` or use createInMemoryQueryCache()");const a=e.databaseName??A,s=e.storeName??b,l=E(e.maxEntries??w,"createIndexedDbQueryCache"),r=I(o,a,p,t=>{t.objectStoreNames.contains(s)||t.createObjectStore(s,{keyPath:"key"}).createIndex(f,"ts",{unique:!1})}),n=h(r,s),y=async t=>{let c=await u(t.count())-l;c<=0||await new Promise((D,x)=>{const d=t.index(f).openCursor();d.addEventListener("success",()=>{const m=d.result;if(!m||c<=0){D();return}m.delete(),c-=1,m.continue()}),d.addEventListener("error",()=>{x(d.error??new Error("IndexedDB eviction failed"))})})};return{clear:async()=>{await n("readwrite",t=>u(t.clear()))},load:async()=>n("readonly",t=>u(t.getAll())),put:async(t,i)=>{await n("readwrite",async c=>{await u(c.put({...i,key:t})),await y(c)})},remove:async t=>{await n("readwrite",i=>u(i.delete(t)))}}},L=e=>{if(e!==!1){if(e)return e;if(!(typeof indexedDB>"u"))return N()}};export{E as assertMaxEntries,B as createInMemoryQueryCache,N as createIndexedDbQueryCache,T as queryCacheKey,L as resolveQueryCacheAdapter};
|
package/dist/packem_shared/{createServerClient-BqCdfoE1.mjs → createServerClient-B0TsbJkS.mjs}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{LunoraClient as r}from"./LunoraClient-
|
|
1
|
+
import{LunoraClient as r}from"./LunoraClient-D6Mn3qEX.mjs";const c=e=>{const t=new r({fetch:e.fetch,url:e.url});return e.token!==void 0&&t.setAuthToken(e.token),t};export{c as createServerClient};
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import{LunoraError as u}from"@lunora/errors";import{decodeWire as L}from"@lunora/wire";import{createReconnect as I}from"./createReconnect-CjTmjJDH.mjs";import{createStream as C}from"./DEFAULT_MAX_BUFFER-Bd-_iyiV.mjs";import{r as H}from"./stream-idle-C7CsIT_m.mjs";const y=/^ /u,$=/^\d+$/u,x=2147483647,B=10,k=1e3,_=t=>typeof t=="object"&&t!==null?JSON.stringify(t):String(t),F=t=>{let n="",e,a;const s=[];for(const r of t.split(`
|
|
2
|
+
`))if(r.startsWith("event:"))n=r.slice(6).replace(y,"");else if(r.startsWith("data:"))s.push(r.slice(5).replace(y,""));else if(r.startsWith("id:")){const c=r.slice(3).replace(y,"");c.includes("\0")||(e=c)}else if(r.startsWith("retry:")){const c=r.slice(6).replace(y,"");$.test(c)&&Number.isSafeInteger(Number(c))&&(a=Math.min(Number(c),x))}return{data:s.join(`
|
|
3
|
+
`),event:n,id:e,retry:a}},W=(t,n,e)=>{const a=n.params??{},s=t.path.split("/").map(o=>{if(!o.startsWith(":"))return o;const f=o.slice(1),p=a[f];if(p===void 0)throw new u("HTTP_STREAM_MISSING_PARAM",`httpStream: missing path param ":${f}" for route ${t.path}`);return encodeURIComponent(_(p))}).join("/"),r=new URLSearchParams;for(const[o,f]of Object.entries(n.searchParams??{}))f!==void 0&&r.set(o,_(f));const c=r.toString();return`${e.endsWith("/")?e.slice(0,-1):e}${s}${c===""?"":`?${c}`}`},j=(t,n)=>{if(t.event==="complete")return n.complete(),!0;if(t.event==="error"){let e={};try{e=JSON.parse(t.data)}catch{}const a=typeof e.message=="string"?e.message:"stream error",s=typeof e.code=="string"?e.code:"HTTP_STREAM_ERROR",r=new u(s,a);return typeof e.why=="string"&&(r.why=e.why),n.fail(r),!0}if((t.event===""||t.event==="message")&&t.data!=="")try{n.push(L(JSON.parse(t.data)))}catch{return n.fail(new u("HTTP_STREAM_BAD_CHUNK","httpStream: malformed SSE chunk (invalid JSON)")),!0}return!1},D=async(t,n,e,a,s=0)=>{const r=t.getReader(),c=new TextDecoder;let m="",o=!1;const f=d=>{let l=o?`\r${d}`:d;o=l.endsWith("\r"),o&&(l=l.slice(0,-1)),m+=l.replaceAll(`\r
|
|
4
|
+
`,`
|
|
5
|
+
`)},p=()=>{let d=m.indexOf(`
|
|
6
|
+
|
|
7
|
+
`);for(;d!==-1;){const l=F(m.slice(0,d));if(m=m.slice(d+2),e.onFrame?.(),l.id!==void 0&&e.onId?.(l.id),l.retry!==void 0&&e.onRetry?.(l.retry),j(l,n))return!0;d=m.indexOf(`
|
|
8
|
+
|
|
9
|
+
`)}return!1},T=()=>r.cancel().then(()=>{},()=>{});try{for(;;){const{done:d,value:l}=await H(r,s);if(d)break;if(f(c.decode(l,{stream:!0})),p())return await T(),!0}return f(c.decode()),p()}catch(d){throw a.abort(),T().catch(()=>{}),d}},U=async(t,n)=>{n.aborted||await new Promise(e=>{let a;const s=()=>{clearTimeout(a),e()};a=setTimeout(()=>{n.removeEventListener("abort",s),e()},t),n.addEventListener("abort",s,{once:!0})})},J=(t,n)=>{if(typeof t!="object"||t===null)return;const{code:e,error:a,why:s}=t;if(!(typeof e!="string"||typeof a!="string"))return new u("HTTP_STREAM_STATUS",`httpStream: request failed (status ${n.toString()}, ${e}): ${a}`,{status:n,why:typeof s=="string"?s:void 0})},Y=async(t,n)=>{let e;const a=new Promise(r=>{e=setTimeout(()=>{r(void 0)},k)}),s=t.json().catch(r=>{if(n.aborted)throw r});try{return await Promise.race([s,a])}finally{clearTimeout(e),await t.body?.cancel().catch(()=>{})}},q=(t,n)=>{const e=Object.entries(t??{}).filter(([a])=>n===void 0||a.toLowerCase()!=="last-event-id");return{accept:"text/event-stream",...Object.fromEntries(e),...n===void 0?{}:{"last-event-id":n}}},A=t=>t instanceof Error&&"code"in t?t:new u("HTTP_STREAM_TRANSPORT",t instanceof Error?t.message:String(t),{cause:t}),V=(t,n,e={})=>{const a=e.fetch??(typeof fetch=="function"?fetch.bind(globalThis):void 0);if(!a)throw new u("INTERNAL","httpStream: no `fetch` implementation available");const s=W(t,n??{},e.baseUrl??""),r=new AbortController;let c;e.signal&&(e.signal.aborted?r.abort():(c=()=>{r.abort()},e.signal.addEventListener("abort",c,{once:!0})));const m=()=>{c&&e.signal?.removeEventListener("abort",c)},{handle:o,iterable:f}=C({maxBuffer:e.maxBuffer,onCancel:()=>{r.abort()},onFail:()=>{r.abort()}}),p=e.reconnect??!1,T=I();let{lastEventId:d}=e,l,v=0;const M=()=>{T.reset(),v=0},E={},R=i=>{try{i()}catch(S){throw E.value={error:S},S}},P={onFrame:M,onId:i=>{R(()=>e.onEventId?.(i)),d=i},onRetry:i=>{R(()=>e.onRetry?.(i)),l=i}},O=async()=>{const i=q(e.headers,d),S=new u("HTTP_STREAM_INTERRUPTED","httpStream: stream ended without a complete frame"),b=new AbortController,g=()=>{b.abort()};r.signal.addEventListener("abort",g,{once:!0});try{const h=await a(s,{headers:i,method:t.method,signal:b.signal});if(!h.ok){const N=await Y(h,r.signal);o.fail(J(N,h.status)??new u("HTTP_STREAM_STATUS",`httpStream: request failed (status ${h.status.toString()})`,{status:h.status}));return}if(!h.body){o.fail(new u("HTTP_STREAM_NO_BODY","httpStream: response has no body"));return}return{completed:await D(h.body,o,P,b,e.idleTimeoutMs),error:S}}catch(h){if(r.signal.aborted){o.complete();return}if(E.value){const{error:w}=E.value;o.fail(w instanceof Error?w:new u("HTTP_STREAM_CALLBACK","httpStream: an onEventId/onRetry callback threw"));return}return{completed:!1,error:A(h)}}finally{r.signal.removeEventListener("abort",g)}};return(async()=>{try{for(;;){if(r.signal.aborted){o.complete();return}const i=await O();if(!i)return;if(i.completed||!p||v>=B){i.completed||o.fail(i.error);return}v+=1,await U(l??T.next(),r.signal)}}finally{m()}})().catch(i=>{if(r.signal.aborted){o.complete();return}o.fail(A(i))}),f};export{V as httpStream};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const c=t=>new Promise((n,s)=>{t.addEventListener("success",()=>{n(t.result)}),t.addEventListener("error",()=>{s(t.error??new Error("IndexedDB request failed"))})}),E=(t,n,s,o)=>{let a;return()=>{if(a)return a;const e=new Promise((d,i)=>{const r=t.open(n,s);r.addEventListener("upgradeneeded",()=>{o(r.result)}),r.addEventListener("success",()=>{d(r.result)}),r.addEventListener("error",()=>{i(r.error??new Error("IndexedDB open failed"))})});return a=e,e.catch(()=>{a===e&&(a=void 0)}),e}},u=(t,n)=>async(s,o)=>{const e=(await t()).transaction(n,s),d=await o(e.objectStore(n));return await new Promise((i,r)=>{e.addEventListener("complete",()=>{i()}),e.addEventListener("error",()=>{r(e.error??new Error("IndexedDB transaction failed"))}),e.addEventListener("abort",()=>{r(e.error??new Error("IndexedDB transaction aborted"))})}),d};export{E as a,u as c,c as p};
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import{decodeWire as K}from"@lunora/wire";import{S as q}from"./client-tuning-C10B2KCO.mjs";import{createReconnect as F}from"./createReconnect-CjTmjJDH.mjs";import{r as z}from"./stream-idle-C7CsIT_m.mjs";const Q="x-lunora-live-connection",X="live",ie=c=>`/live/${c}/connect`,D=c=>c===void 0?void 0:(...s)=>{c(...s)},Y=/^ /u,Z=1e4,ee=c=>{const s=c.indexOf("?"),f=s===-1?c:c.slice(0,s);if(!f.endsWith("/connect"))throw new Error(`connectLiveStream: expected a connect URL ending in "/connect", got "${c}"`);return`${f.slice(0,-8)}/control${s===-1?"":c.slice(s)}`},te=c=>{let s="message";const f=[];for(const m of c.split(`
|
|
2
|
+
`))m.startsWith("event:")?s=m.slice(6).trim():m.startsWith("data:")&&f.push(m.slice(5).replace(Y,""));return f.length===0?void 0:{data:f.join(`
|
|
3
|
+
`),event:s}},ae=(c,s={})=>{const f=s.fetch??fetch,m=ee(c),k=s.maxDelayMs??3e4,U=s.idleTimeoutMs??75e3,O=F({initialDelayMs:s.retryDelay??1e3,maxDelayMs:k}),M=s.withCredentials===!0?"include":"same-origin",_=new URL(c,"https://lunora.invalid").searchParams.get("shard")??void 0,l=new Map,y=new Set;let h,v,I,C=!1,N=0;const W=()=>{let e;do N+=1,e=`live-${String(N)}`;while(l.has(e));return e},L=()=>C;let g,E;const P=new Promise((e,t)=>{g=e,E=t});P.catch(()=>{});const R={...s.headers},S=new Map,T=new Set,j=async e=>{const t=new AbortController,r=setTimeout(()=>{t.abort()},Z);T.add(t);try{const n=await f(m,{body:JSON.stringify(_===void 0?e:{...e,shardKey:_}),credentials:M,headers:{"content-type":"application/json",...R},method:"POST",signal:t.signal});return await n.text(),n.status}catch{return}finally{clearTimeout(r),T.delete(t)}},A=(e,t)=>{const n=(S.get(e)??Promise.resolve()).then(()=>L()?void 0:j(t)),o=n.then(()=>{},()=>{});return S.set(e,o),o.then(()=>{S.get(e)===o&&S.delete(e)}).catch(()=>{}),n},V=(e,t)=>{for(const r of l.values())if(r.topic===e)for(const n of r.handlers)try{n(t)}catch{}for(const r of y)try{r({payload:t,topic:e})}catch{}},B=e=>{const t=te(e);if(t?.event===X)try{const r=JSON.parse(t.data);V(r.topic,K(r.data))}catch{}},$=(e,t,r)=>{if(l.get(e)===t){l.delete(e);for(const n of t.errors)try{n({status:r,subscriptionId:e,topic:t.topic})}catch{}}},H=async()=>{const e=await Promise.all([...l].map(async([t,r])=>{const n=await A(t,{action:"subscribe",connectionId:h,subscriptionId:t,topic:r.topic});return{entry:r,id:t,status:n}}));for(const{entry:t,id:r,status:n}of e){if(n===void 0||n>=500||n===404||n===401){v?.abort();return}n>=400&&$(r,t,n)}},G=async e=>{h=e.headers.get(Q)??void 0,I=setTimeout(()=>{O.reset()},q);const r=(async()=>{try{await H()}catch{v?.abort();return}g?.(),g=void 0,E=void 0})(),n=e.body?.getReader();if(n===void 0){await r;return}const o=new TextDecoder;let a="",i=!1;for(;;){let u;try{u=await z(n,U)}catch(J){throw n.cancel().catch(()=>{}),v?.abort(),J}const{done:w,value:x}=u;if(w)break;const b=o.decode(x,{stream:!0}),p=i?`\r${b}`:b;i=p.endsWith("\r"),a+=(i?p.slice(0,-1):p).replaceAll(`\r
|
|
4
|
+
`,`
|
|
5
|
+
`).replaceAll("\r",`
|
|
6
|
+
`);let d=a.indexOf(`
|
|
7
|
+
|
|
8
|
+
`);for(;d!==-1;)B(a.slice(0,d)),a=a.slice(d+2),d=a.indexOf(`
|
|
9
|
+
|
|
10
|
+
`)}await r};return(async()=>{for(;!L();){v=new AbortController;try{const t=await f(c,{credentials:M,headers:{accept:"text/event-stream",...R},signal:v.signal});if(!t.ok)throw new Error(`live stream connect failed: HTTP ${String(t.status)}`);await G(t)}catch{}if(clearTimeout(I),h=void 0,L())return;const e=O.next();await new Promise(t=>{setTimeout(t,e)})}})().catch(()=>{}),{close:()=>{C=!0,v?.abort();for(const e of T)e.abort();T.clear(),l.clear(),y.clear(),E?.(new Error("connectLiveStream: closed before the first connection")),g=void 0,E=void 0},get connectionId(){return h},onEvent:e=>(y.add(e),()=>y.delete(e)),ready:P,subscribe:({id:e,onError:t,onEvent:r,topic:n})=>{if(C)throw new Error("connectLiveStream: subscribe on a closed stream");const o=e??W(),a=l.get(o);if(a!==void 0&&a.topic!==n)throw new Error(`connectLiveStream: subscription id "${o}" already follows "${a.topic}"; unsubscribe it first`);const i=a??{errors:new Set,handlers:new Set,refs:0,topic:n},u=D(r),w=D(t);if(i.refs+=1,u!==void 0&&i.handlers.add(u),w!==void 0&&i.errors.add(w),a===void 0&&(l.set(o,i),h!==void 0)){const b=h,p=v;A(o,{action:"subscribe",connectionId:b,subscriptionId:o,topic:n}).then(d=>{if(d===void 0||d===401||d===404||d>=500){b===h&&l.get(o)===i&&p?.abort();return}d>=400&&$(o,i,d)}).catch(()=>{})}let x=!1;return()=>{x||(x=!0,u!==void 0&&i.handlers.delete(u),w!==void 0&&i.errors.delete(w),i.refs-=1,!(i.refs>0||l.get(o)!==i)&&(l.delete(o),A(o,{action:"unsubscribe",connectionId:h,subscriptionId:o,topic:n}).catch(()=>{})))}}}};export{ae as c,ie as l};
|
package/dist/packem_shared/{liveTopicSubscription-Bs-ULKfs.mjs → liveTopicSubscription-gOmRbuhH.mjs}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{c as u,l as d}from"./live-stream-
|
|
1
|
+
import{c as u,l as d}from"./live-stream-Dil9byXF.mjs";import{j as y,w as f}from"./client-urls-BHLUjjcG.mjs";const o=new Map,v=e=>JSON.stringify([e.url,e.sessionKey,e.withCredentials===!0,e.retryDelay,e.maxDelayMs,Object.entries(e.headers??{}).toSorted(([t],[r])=>t.localeCompare(r))]),T=e=>{const t=v(e);let r=o.get(t);if(r===void 0){const{headers:i,maxDelayMs:l,retryDelay:n,withCredentials:m}=e;r={closeTimer:void 0,refs:0,stream:u(e.url,{headers:i,maxDelayMs:l,retryDelay:n,withCredentials:m})},o.set(t,r)}clearTimeout(r.closeTimer),r.closeTimer=void 0,r.refs+=1;const s=r,a=s.stream.subscribe({id:e.topic,onError:e.onError,onEvent:e.onEvent,topic:e.topic});let c=!1;return()=>{c||(c=!0,a(),s.refs-=1,s.refs===0&&(s.closeTimer=setTimeout(()=>{o.delete(t),s.stream.close()},0)))}},w=(e,t,r={})=>{const{onEvent:s,shardKey:a,...c}=r,{__lunoraLive:i,topic:l}=t;return{...c,onEvent:s,topic:l,url:y(e.url,f(d(i),{shard:a}))}};export{w as liveTopicSubscription,T as subscribeLiveTopic};
|