@lunora/client 1.0.0-alpha.233 → 1.0.0-alpha.235

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.
@@ -1,4 +1,4 @@
1
- import { U as User, L as LunoraClient } from "../packem_shared/lunora-client.d-D7gNlYT7.mjs";
1
+ import { U as User, L as LunoraClient } from "../packem_shared/lunora-client.d-DZ9gzk9p.mjs";
2
2
  import '@lunora/errors';
3
3
  import "../packem_shared/function-reference.d-Br_hsKje.mjs";
4
4
  import '@lunora/runtime';
@@ -1,4 +1,4 @@
1
- import { U as User, L as LunoraClient } from "../packem_shared/lunora-client.d-DTJ5zJKH.js";
1
+ import { U as User, L as LunoraClient } from "../packem_shared/lunora-client.d-CZ9TlyaL.js";
2
2
  import '@lunora/errors';
3
3
  import "../packem_shared/function-reference.d-Br_hsKje.js";
4
4
  import '@lunora/runtime';
package/dist/index.d.mts CHANGED
@@ -1,8 +1,8 @@
1
- import { R as ReconnectOptions, c as PersistenceAdapter, Q as QueryCacheAdapter, B as BookmarkStorage, C as ConnectionStatus, S as SubscriptionError, H as HttpStreamRef, d as HttpStreamArgsOf, e as HttpStreamChunkOf, f as StreamIterable, O as OfflineQueueOptions, L as LunoraClient } from "./packem_shared/lunora-client.d-D7gNlYT7.mjs";
2
- export { type A as ActionCallOptions, type g as BatchSlot, type h as CachedQuery, type i as ClientDebugShard, type j as ClientDebugSnapshot, type k as ClientDebugSubscription, type l as ClientMessage, type m as ClientQueryRef, type n as ClientShapeSubscribeMessage, type o as ClientShapeUnsubscribeMessage, D as DEFAULT_MAX_BUFFER, type F as FunctionArgumentDescriptor, type p as FunctionDescriptor, type G as GlobalFacetResult, type q as GlobalFacetValue, type r as GlobalFilterClause, type s as GlobalTableInfo, type t as GlobalTablePage, type u as HttpStreamCallArgs, type v as LunoraClientError, type w as LunoraClientOptions, type M as MutationCallOptions, type x as MutationSettledEvent, type y as OptimisticLocalStore, type z as OptimisticUpdate, type E as OutboxMutation, type I as OutboxSink, type J as PersistedMutation, type P as Preloaded, type K as ReplayCredential, type N as ReplayIdentityVerdict, type T as RoomRef, type V as RowOp, type W as RpcEnvelope, type X as RpcResponseBody, type Y as ScheduleRecord, type Z as ScheduleRetryPolicy, type _ as SchedulerPoolStatus, type $ as SchedulerStatus, type a0 as ServerMessage, type a1 as ServerPokeEndMessage, type a2 as ServerPokePartMessage, type a3 as ServerPokeStartMessage, type a4 as ShardTrafficEntry, type a5 as ShardTrafficResult, type a6 as StorageListPage, type a7 as StorageObject, type a8 as StoredQuery, type a9 as StreamHandle, type aa as SubscriptionCallback, type b as SubscriptionErrorCallback, ab as SubscriptionRegistry, type ac as SubscriptionState, type ad as SyncStatus, type ae as SyncWatermark, type a as Unsubscribe, type U as User, type af as WorkflowInstanceAction, type ag as WorkflowInstanceDetail, type ah as WorkflowInstancePage, type ai as WorkflowInstanceStatus, type aj as WorkflowInstanceSummary, type ak as WorkflowStepDetail, type al as WsTokenProvider, am as createClientQuery, an as createLocalStore, ao as createStream } from "./packem_shared/lunora-client.d-D7gNlYT7.mjs";
1
+ import { R as ReconnectOptions, c as PersistenceAdapter, Q as QueryCacheAdapter, B as BookmarkStorage, C as ConnectionStatus, S as SubscriptionError, H as HttpStreamRef, d as HttpStreamArgsOf, e as HttpStreamChunkOf, f as StreamIterable, O as OfflineQueueOptions, L as LunoraClient } from "./packem_shared/lunora-client.d-DZ9gzk9p.mjs";
2
+ export { type A as ActionCallOptions, type g as BatchSlot, type h as CachedQuery, type i as ClientDebugShard, type j as ClientDebugSnapshot, type k as ClientDebugSubscription, type l as ClientMessage, type m as ClientQueryRef, type n as ClientShapeSubscribeMessage, type o as ClientShapeUnsubscribeMessage, D as DEFAULT_MAX_BUFFER, type F as FunctionArgumentDescriptor, type p as FunctionDescriptor, type G as GlobalFacetResult, type q as GlobalFacetValue, type r as GlobalFilterClause, type s as GlobalTableInfo, type t as GlobalTablePage, type u as HttpStreamCallArgs, type v as LunoraClientError, type w as LunoraClientOptions, type M as MutationCallOptions, type x as MutationSettledEvent, type y as OnlineOnlyOption, type z as OptimisticLocalStore, type E as OptimisticUpdate, type I as OutboxMutation, type J as OutboxSink, type K as PersistedMutation, type P as Preloaded, type N as ReplayCredential, type T as ReplayIdentityVerdict, type V as RoomRef, type W as RowOp, type X as RpcEnvelope, type Y as RpcResponseBody, type Z as ScheduleRecord, type _ as ScheduleRetryPolicy, type $ as SchedulerPoolStatus, type a0 as SchedulerStatus, type a1 as ServerMessage, type a2 as ServerPokeEndMessage, type a3 as ServerPokePartMessage, type a4 as ServerPokeStartMessage, type a5 as ShardTrafficEntry, type a6 as ShardTrafficResult, type a7 as StorageListPage, type a8 as StorageObject, type a9 as StoredQuery, type aa as StreamHandle, type ab as SubscriptionCallback, type b as SubscriptionErrorCallback, ac as SubscriptionRegistry, type ad as SubscriptionState, type ae as SyncStatus, type af as SyncWatermark, type a as Unsubscribe, type U as User, type ag as WorkflowInstanceAction, type ah as WorkflowInstanceDetail, type ai as WorkflowInstancePage, type aj as WorkflowInstanceStatus, type ak as WorkflowInstanceSummary, type al as WorkflowStepDetail, type am as WsTokenProvider, an as createClientQuery, ao as createLocalStore, ap as createStream } from "./packem_shared/lunora-client.d-DZ9gzk9p.mjs";
3
3
  import { LunoraError, LunoraErrorCode } from '@lunora/errors';
4
4
  export type { LunoraErrorCode } from '@lunora/errors';
5
- export { p as preloadQuery, a as preloadedQueryResult } from "./packem_shared/preload.d-B0FFchsh.mjs";
5
+ export { p as preloadQuery, a as preloadedQueryResult } from "./packem_shared/preload.d-BOpEnFP8.mjs";
6
6
  import { F as FunctionReference } from "./packem_shared/function-reference.d-Br_hsKje.mjs";
7
7
  export type { A as ArgsOf, R as ReturnOf } from "./packem_shared/function-reference.d-Br_hsKje.mjs";
8
8
  export type { AuthCapabilities, AuthConfigInfo, AuthImpersonation, AuthPage, AuthSession, AuthUser, AuthUserFieldSpec, CronJobInfo, KvKeyEntry, KvKeyListResult, KvNamespaceSummary, KvValueResult, PipelineLogColumnMap, PipelineLogCursor, PipelineLogField, PipelineLogPage, PipelineLogQuery, PipelineLogRow, VectorIndexSummary, VectorQueryMatch } from '@lunora/runtime';
package/dist/index.d.ts CHANGED
@@ -1,8 +1,8 @@
1
- import { R as ReconnectOptions, c as PersistenceAdapter, Q as QueryCacheAdapter, B as BookmarkStorage, C as ConnectionStatus, S as SubscriptionError, H as HttpStreamRef, d as HttpStreamArgsOf, e as HttpStreamChunkOf, f as StreamIterable, O as OfflineQueueOptions, L as LunoraClient } from "./packem_shared/lunora-client.d-DTJ5zJKH.js";
2
- export { type A as ActionCallOptions, type g as BatchSlot, type h as CachedQuery, type i as ClientDebugShard, type j as ClientDebugSnapshot, type k as ClientDebugSubscription, type l as ClientMessage, type m as ClientQueryRef, type n as ClientShapeSubscribeMessage, type o as ClientShapeUnsubscribeMessage, D as DEFAULT_MAX_BUFFER, type F as FunctionArgumentDescriptor, type p as FunctionDescriptor, type G as GlobalFacetResult, type q as GlobalFacetValue, type r as GlobalFilterClause, type s as GlobalTableInfo, type t as GlobalTablePage, type u as HttpStreamCallArgs, type v as LunoraClientError, type w as LunoraClientOptions, type M as MutationCallOptions, type x as MutationSettledEvent, type y as OptimisticLocalStore, type z as OptimisticUpdate, type E as OutboxMutation, type I as OutboxSink, type J as PersistedMutation, type P as Preloaded, type K as ReplayCredential, type N as ReplayIdentityVerdict, type T as RoomRef, type V as RowOp, type W as RpcEnvelope, type X as RpcResponseBody, type Y as ScheduleRecord, type Z as ScheduleRetryPolicy, type _ as SchedulerPoolStatus, type $ as SchedulerStatus, type a0 as ServerMessage, type a1 as ServerPokeEndMessage, type a2 as ServerPokePartMessage, type a3 as ServerPokeStartMessage, type a4 as ShardTrafficEntry, type a5 as ShardTrafficResult, type a6 as StorageListPage, type a7 as StorageObject, type a8 as StoredQuery, type a9 as StreamHandle, type aa as SubscriptionCallback, type b as SubscriptionErrorCallback, ab as SubscriptionRegistry, type ac as SubscriptionState, type ad as SyncStatus, type ae as SyncWatermark, type a as Unsubscribe, type U as User, type af as WorkflowInstanceAction, type ag as WorkflowInstanceDetail, type ah as WorkflowInstancePage, type ai as WorkflowInstanceStatus, type aj as WorkflowInstanceSummary, type ak as WorkflowStepDetail, type al as WsTokenProvider, am as createClientQuery, an as createLocalStore, ao as createStream } from "./packem_shared/lunora-client.d-DTJ5zJKH.js";
1
+ import { R as ReconnectOptions, c as PersistenceAdapter, Q as QueryCacheAdapter, B as BookmarkStorage, C as ConnectionStatus, S as SubscriptionError, H as HttpStreamRef, d as HttpStreamArgsOf, e as HttpStreamChunkOf, f as StreamIterable, O as OfflineQueueOptions, L as LunoraClient } from "./packem_shared/lunora-client.d-CZ9TlyaL.js";
2
+ export { type A as ActionCallOptions, type g as BatchSlot, type h as CachedQuery, type i as ClientDebugShard, type j as ClientDebugSnapshot, type k as ClientDebugSubscription, type l as ClientMessage, type m as ClientQueryRef, type n as ClientShapeSubscribeMessage, type o as ClientShapeUnsubscribeMessage, D as DEFAULT_MAX_BUFFER, type F as FunctionArgumentDescriptor, type p as FunctionDescriptor, type G as GlobalFacetResult, type q as GlobalFacetValue, type r as GlobalFilterClause, type s as GlobalTableInfo, type t as GlobalTablePage, type u as HttpStreamCallArgs, type v as LunoraClientError, type w as LunoraClientOptions, type M as MutationCallOptions, type x as MutationSettledEvent, type y as OnlineOnlyOption, type z as OptimisticLocalStore, type E as OptimisticUpdate, type I as OutboxMutation, type J as OutboxSink, type K as PersistedMutation, type P as Preloaded, type N as ReplayCredential, type T as ReplayIdentityVerdict, type V as RoomRef, type W as RowOp, type X as RpcEnvelope, type Y as RpcResponseBody, type Z as ScheduleRecord, type _ as ScheduleRetryPolicy, type $ as SchedulerPoolStatus, type a0 as SchedulerStatus, type a1 as ServerMessage, type a2 as ServerPokeEndMessage, type a3 as ServerPokePartMessage, type a4 as ServerPokeStartMessage, type a5 as ShardTrafficEntry, type a6 as ShardTrafficResult, type a7 as StorageListPage, type a8 as StorageObject, type a9 as StoredQuery, type aa as StreamHandle, type ab as SubscriptionCallback, type b as SubscriptionErrorCallback, ac as SubscriptionRegistry, type ad as SubscriptionState, type ae as SyncStatus, type af as SyncWatermark, type a as Unsubscribe, type U as User, type ag as WorkflowInstanceAction, type ah as WorkflowInstanceDetail, type ai as WorkflowInstancePage, type aj as WorkflowInstanceStatus, type ak as WorkflowInstanceSummary, type al as WorkflowStepDetail, type am as WsTokenProvider, an as createClientQuery, ao as createLocalStore, ap as createStream } from "./packem_shared/lunora-client.d-CZ9TlyaL.js";
3
3
  import { LunoraError, LunoraErrorCode } from '@lunora/errors';
4
4
  export type { LunoraErrorCode } from '@lunora/errors';
5
- export { p as preloadQuery, a as preloadedQueryResult } from "./packem_shared/preload.d-d05S6fB-.js";
5
+ export { p as preloadQuery, a as preloadedQueryResult } from "./packem_shared/preload.d-CXUIU6pE.js";
6
6
  import { F as FunctionReference } from "./packem_shared/function-reference.d-Br_hsKje.js";
7
7
  export type { A as ArgsOf, R as ReturnOf } from "./packem_shared/function-reference.d-Br_hsKje.js";
8
8
  export type { AuthCapabilities, AuthConfigInfo, AuthImpersonation, AuthPage, AuthSession, AuthUser, AuthUserFieldSpec, CronJobInfo, KvKeyEntry, KvKeyListResult, KvNamespaceSummary, KvValueResult, PipelineLogColumnMap, PipelineLogCursor, PipelineLogField, PipelineLogPage, PipelineLogQuery, PipelineLogRow, VectorIndexSummary, VectorQueryMatch } from '@lunora/runtime';
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- import{RETIRE_AFTER_DURABLE_SEQ_ADVANCE as o,maxSeq as t,reconcileOptimistic as a}from"./packem_shared/RETIRE_AFTER_DURABLE_SEQ_ADVANCE-DoEHtuR8.mjs";import{createAsyncStoragePersistence as i}from"./packem_shared/createAsyncStoragePersistence-6FCvqc6C.mjs";import{createAsyncStorageQueryCache as n}from"./packem_shared/createAsyncStorageQueryCache-COqH5_SV.mjs";import{default as s}from"./packem_shared/createInMemoryBookmarkStorage-BooZhW0n.mjs";import{createCallRunner as x}from"./packem_shared/createCallRunner-Bwcrfh76.mjs";import{createClientQuery as l}from"./packem_shared/createClientQuery-B8Nfj-7o.mjs";import{TabCoordinator as d}from"./packem_shared/TabCoordinator-DBuR7Dwv.mjs";import{a as R,i as C}from"./packem_shared/delta-merge-Ls3DED4g.mjs";import{CONFLICT_ERROR_CODE as A,TransportError as b,getErrorCode as h,getRetryAfterMs as D,isAuthReplayFailure as L,isConflictError as Q,isForbiddenError as T,isRateLimitedError as _,isUnauthorizedError as F}from"./packem_shared/CONFLICT_ERROR_CODE-B7qNZMMk.mjs";import{httpStream as M}from"./packem_shared/httpStream-DceAMeMf.mjs";import{c as O}from"./packem_shared/live-stream-Dil9byXF.mjs";import{liveTopicSubscription as U,subscribeLiveTopic as v}from"./packem_shared/liveTopicSubscription-gOmRbuhH.mjs";import{c as k}from"./packem_shared/local-store-fqWV2n_Z.mjs";import{LunoraClient as N}from"./packem_shared/LunoraClient-CN4shVl4.mjs";import{createMutatorRunner as K}from"./packem_shared/createMutatorRunner-CuMRJpUx.mjs";import{O as X}from"./packem_shared/offline-queue-Dt_um8sR.mjs";import{createInMemoryPersistence as w,createIndexedDbPersistence as G}from"./packem_shared/createInMemoryPersistence-BfgXApi_.mjs";import{preloadQuery as J,preloadedQueryResult as W}from"./packem_shared/preloadQuery-uFy24PCR.mjs";import{createInMemoryQueryCache as Z,createIndexedDbQueryCache as $,queryCacheKey as ee}from"./packem_shared/createInMemoryQueryCache-B5wX-gTy.mjs";import{createReconnect as oe}from"./packem_shared/createReconnect-CjTmjJDH.mjs";import{default as ae}from"./packem_shared/createSnapshotPrecondition-CLkxVeN1.mjs";import{DEFAULT_MAX_BUFFER as ie,createStream as pe}from"./packem_shared/DEFAULT_MAX_BUFFER-Bd-_iyiV.mjs";import{SubscriptionRegistry as me}from"./packem_shared/SubscriptionRegistry-DKIXE7M7.mjs";export{A as CONFLICT_ERROR_CODE,ie as DEFAULT_MAX_BUFFER,N as LunoraClient,X as OfflineQueue,o as RETIRE_AFTER_DURABLE_SEQ_ADVANCE,me as SubscriptionRegistry,d as TabCoordinator,b as TransportError,R as applyDelta,O as connectLiveStream,i as createAsyncStoragePersistence,n as createAsyncStorageQueryCache,x as createCallRunner,l as createClientQuery,s as createInMemoryBookmarkStorage,w as createInMemoryPersistence,Z as createInMemoryQueryCache,G as createIndexedDbPersistence,$ as createIndexedDbQueryCache,k as createLocalStore,K as createMutatorRunner,oe as createReconnect,ae as createSnapshotPrecondition,pe as createStream,h as getErrorCode,D as getRetryAfterMs,M as httpStream,L as isAuthReplayFailure,Q as isConflictError,T as isForbiddenError,C as isMutationDelta,_ as isRateLimitedError,F as isUnauthorizedError,U as liveTopicSubscription,t as maxSeq,J as preloadQuery,W as preloadedQueryResult,ee as queryCacheKey,a as reconcileOptimistic,v as subscribeLiveTopic};
1
+ import{RETIRE_AFTER_DURABLE_SEQ_ADVANCE as o,maxSeq as t,reconcileOptimistic as a}from"./packem_shared/RETIRE_AFTER_DURABLE_SEQ_ADVANCE-DoEHtuR8.mjs";import{createAsyncStoragePersistence as i}from"./packem_shared/createAsyncStoragePersistence-6FCvqc6C.mjs";import{createAsyncStorageQueryCache as n}from"./packem_shared/createAsyncStorageQueryCache-COqH5_SV.mjs";import{default as s}from"./packem_shared/createInMemoryBookmarkStorage-BooZhW0n.mjs";import{createCallRunner as x}from"./packem_shared/createCallRunner-Bwcrfh76.mjs";import{createClientQuery as l}from"./packem_shared/createClientQuery-B8Nfj-7o.mjs";import{TabCoordinator as d}from"./packem_shared/TabCoordinator-DBuR7Dwv.mjs";import{a as R,i as C}from"./packem_shared/delta-merge-Ls3DED4g.mjs";import{CONFLICT_ERROR_CODE as A,TransportError as b,getErrorCode as h,getRetryAfterMs as D,isAuthReplayFailure as L,isConflictError as Q,isForbiddenError as T,isRateLimitedError as _,isUnauthorizedError as F}from"./packem_shared/CONFLICT_ERROR_CODE-B7qNZMMk.mjs";import{httpStream as M}from"./packem_shared/httpStream-DceAMeMf.mjs";import{c as O}from"./packem_shared/live-stream-Dil9byXF.mjs";import{liveTopicSubscription as U,subscribeLiveTopic as v}from"./packem_shared/liveTopicSubscription-gOmRbuhH.mjs";import{c as k}from"./packem_shared/local-store-fqWV2n_Z.mjs";import{LunoraClient as N}from"./packem_shared/LunoraClient-D6Mn3qEX.mjs";import{createMutatorRunner as K}from"./packem_shared/createMutatorRunner-CuMRJpUx.mjs";import{O as X}from"./packem_shared/offline-queue-Dt_um8sR.mjs";import{createInMemoryPersistence as w,createIndexedDbPersistence as G}from"./packem_shared/createInMemoryPersistence-BfgXApi_.mjs";import{preloadQuery as J,preloadedQueryResult as W}from"./packem_shared/preloadQuery-uFy24PCR.mjs";import{createInMemoryQueryCache as Z,createIndexedDbQueryCache as $,queryCacheKey as ee}from"./packem_shared/createInMemoryQueryCache-B5wX-gTy.mjs";import{createReconnect as oe}from"./packem_shared/createReconnect-CjTmjJDH.mjs";import{default as ae}from"./packem_shared/createSnapshotPrecondition-CLkxVeN1.mjs";import{DEFAULT_MAX_BUFFER as ie,createStream as pe}from"./packem_shared/DEFAULT_MAX_BUFFER-Bd-_iyiV.mjs";import{SubscriptionRegistry as me}from"./packem_shared/SubscriptionRegistry-DKIXE7M7.mjs";export{A as CONFLICT_ERROR_CODE,ie as DEFAULT_MAX_BUFFER,N as LunoraClient,X as OfflineQueue,o as RETIRE_AFTER_DURABLE_SEQ_ADVANCE,me as SubscriptionRegistry,d as TabCoordinator,b as TransportError,R as applyDelta,O as connectLiveStream,i as createAsyncStoragePersistence,n as createAsyncStorageQueryCache,x as createCallRunner,l as createClientQuery,s as createInMemoryBookmarkStorage,w as createInMemoryPersistence,Z as createInMemoryQueryCache,G as createIndexedDbPersistence,$ as createIndexedDbQueryCache,k as createLocalStore,K as createMutatorRunner,oe as createReconnect,ae as createSnapshotPrecondition,pe as createStream,h as getErrorCode,D as getRetryAfterMs,M as httpStream,L as isAuthReplayFailure,Q as isConflictError,T as isForbiddenError,C as isMutationDelta,_ as isRateLimitedError,F as isUnauthorizedError,U as liveTopicSubscription,t as maxSeq,J as preloadQuery,W as preloadedQueryResult,ee as queryCacheKey,a as reconcileOptimistic,v as subscribeLiveTopic};
@@ -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&&lt(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};
@@ -1 +1 @@
1
- import{LunoraClient as r}from"./LunoraClient-CN4shVl4.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};
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};
@@ -1,6 +1,18 @@
1
1
  import { LunoraErrorCodeInput, LunoraErrorCode } from '@lunora/errors';
2
2
  import { F as FunctionReference, A as ArgsOf, R as ReturnOf } from "./function-reference.d-Br_hsKje.js";
3
3
  import { CronJobInfo, VectorIndexSummary, VectorQueryMatch, PipelineLogQuery, PipelineLogPage, KvNamespaceSummary, KvKeyListResult, KvValueResult, AuthUser, AuthPage, AuthImpersonation, AuthCapabilities, AuthConfigInfo, AuthSession } from '@lunora/runtime';
4
+ /**
5
+ * The `onlineOnly` option a call to the function reference `F` may take. A
6
+ * function with a `v.sensitive` argument is emitted as `… & { readonly sensitive:
7
+ * true }`, and is always online-only: its arguments never reach the offline queue,
8
+ * the outbox or a persistence adapter. For it the option may be omitted or `true`;
9
+ * `false` is a type error. Every other reference is unchanged.
10
+ */
11
+ type OnlineOnlyOption<F> = F extends {
12
+ readonly sensitive: true;
13
+ } ? {
14
+ onlineOnly?: true;
15
+ } : unknown;
4
16
  /**
5
17
  * Typed reference to an HTTP-SSE stream route (`httpRoute.<verb>(path).stream()`)
6
18
  * emitted by `@lunora/codegen` as `httpStreams.<namespace>.<name>`.
@@ -1133,6 +1145,8 @@ interface FunctionArgumentDescriptor {
1133
1145
  name: string;
1134
1146
  /** True when the arg is wrapped in `v.optional(...)`. */
1135
1147
  optional: boolean;
1148
+ /** True when the arg is marked `v.sensitive` — a secret the caller supplies, never queued offline. */
1149
+ sensitive?: true;
1136
1150
  /** Target table for an `id` arg (`v.id("table")`). */
1137
1151
  table?: string;
1138
1152
  }
@@ -1726,6 +1740,23 @@ interface MutationCallOptions<TCurrent = unknown, TValue = unknown, TArgs = unkn
1726
1740
  * each then gets a fresh key.
1727
1741
  */
1728
1742
  mutationId?: string;
1743
+ /**
1744
+ * Never queue, persist or replay this write. When the shard's connection is
1745
+ * down or reconnecting — the states in which a normal write is queued — the
1746
+ * call rejects at once with `OFFLINE_NOT_QUEUED`, and its args never reach the
1747
+ * offline queue, the persistence adapter or the outbox. Use it for a write whose
1748
+ * arguments must not sit on disk: a credential a person typed in, a one-time
1749
+ * token. A function with a `v.sensitive` argument is always online-only, whatever
1750
+ * this option says: the client forces it on, and `false` is refused.
1751
+ *
1752
+ * Ordering: an online-only call neither waits for a queue flush nor queues
1753
+ * behind writes already queued for its shard. When it is sent it can overtake
1754
+ * them, so it may land on the server before an older queued write to the same
1755
+ * document. Optimistic layers are in-memory and are not applied to a refused call.
1756
+ *
1757
+ * Omit for normal calls, which queue as usual.
1758
+ */
1759
+ onlineOnly?: boolean;
1729
1760
  /**
1730
1761
  * Single-query shortcut: the transform is layered onto the subscription
1731
1762
  * registered under **this write's own** `(functionPath, args, shardKey)`, and
@@ -2910,7 +2941,8 @@ declare class LunoraClient {
2910
2941
  * (`wasEverConnected`), so the registry / resubscribe handshake has run.
2911
2942
  * Mutations issued before the very first WS connect to a shard fail fast.
2912
2943
  * Opt into queueing-before-first-connect via
2913
- * `OfflineQueueOptions.queueBeforeFirstConnect`.
2944
+ * `OfflineQueueOptions.queueBeforeFirstConnect`. Pass `onlineOnly: true` to
2945
+ * refuse a write instead of queueing it — see {@link MutationCallOptions.onlineOnly}.
2914
2946
  *
2915
2947
  * **Return-value caveat — the queued paths do not carry the server's result.**
2916
2948
  * The declared `Promise<ReturnOf<F>>` only holds when the write goes straight
@@ -2928,7 +2960,7 @@ declare class LunoraClient {
2928
2960
  * on a mutation's return value in an offline-capable app —
2929
2961
  * {@link LunoraClient.importRows} documents the same caveat for its counts.
2930
2962
  */
2931
- mutation<F extends FunctionReference>(function_: F, args: ArgsOf<F>, options?: MutationCallOptions<unknown, unknown, ArgsOf<F>>): Promise<ReturnOf<F>>;
2963
+ mutation<F extends FunctionReference>(function_: F, args: ArgsOf<F>, options?: MutationCallOptions<unknown, unknown, ArgsOf<F>> & OnlineOnlyOption<F>): Promise<ReturnOf<F>>;
2932
2964
  /**
2933
2965
  * Whether a {@link mutation} on `shardKey` would be queued (offline queue or
2934
2966
  * durable outbox) rather than fail when the network is down. `false` before
@@ -3821,6 +3853,26 @@ declare class LunoraClient {
3821
3853
  * with no server result.
3822
3854
  */
3823
3855
  private runMutation;
3856
+ /**
3857
+ * Refuses an `onlineOnly` write whose shard's connection is down or reconnecting,
3858
+ * the states in which a normal write is queued. Reads the gate synchronously, so
3859
+ * the refusal is immediate. Called again after the optimistic updates have been
3860
+ * applied, which is user code and may have dropped the shard: `optimisticRollbacks`
3861
+ * unwinds those layers before the refusal.
3862
+ */
3863
+ private refuseOnlineOnlyWhenDown;
3864
+ /**
3865
+ * Whether this tab's own socket is open for the shard. A follower tab has no socket
3866
+ * of its own: the status it reads is the leader's, which carried no part of the
3867
+ * request that just failed, so it never counts as open.
3868
+ */
3869
+ private ownSocketOpen;
3870
+ /**
3871
+ * Whether a write on `shardKey` would be queued if it failed right now, and
3872
+ * which gate would queue it. A follower tab has no `ShardConnection` of its own —
3873
+ * `connectionGateState` derives the same triple from the mirrored leader status.
3874
+ */
3875
+ private writeQueueGate;
3824
3876
  /**
3825
3877
  * Unwind a direct write's optimistic layers after its RPC threw — or keep
3826
3878
  * them, when it threw only because a COMMITTED result did not decode: the
@@ -5049,4 +5101,4 @@ declare class LunoraClient {
5049
5101
  */
5050
5102
  private settleReplayBatchSlots;
5051
5103
  }
5052
- export { SchedulerStatus as $, ActionCallOptions as A, BookmarkStorage as B, ConnectionStatus as C, DEFAULT_MAX_BUFFER as D, OutboxMutation as E, FunctionArgumentDescriptor as F, GlobalFacetResult as G, HttpStreamRef as H, OutboxSink as I, PersistedMutation as J, ReplayCredential as K, LunoraClient as L, MutationCallOptions as M, ReplayIdentityVerdict as N, OfflineQueueOptions as O, Preloaded as P, QueryCacheAdapter as Q, ReconnectOptions as R, SubscriptionError as S, RoomRef as T, User as U, RowOp as V, RpcEnvelope as W, RpcResponseBody as X, ScheduleRecord as Y, ScheduleRetryPolicy as Z, SchedulerPoolStatus as _, Unsubscribe as a, ServerMessage as a0, ServerPokeEndMessage as a1, ServerPokePartMessage as a2, ServerPokeStartMessage as a3, ShardTrafficEntry as a4, ShardTrafficResult as a5, StorageListPage as a6, StorageObject as a7, StoredQuery as a8, StreamHandle as a9, SubscriptionCallback as aa, SubscriptionRegistry as ab, SubscriptionState as ac, SyncStatus as ad, SyncWatermark as ae, WorkflowInstanceAction as af, WorkflowInstanceDetail as ag, WorkflowInstancePage as ah, WorkflowInstanceStatus as ai, WorkflowInstanceSummary as aj, WorkflowStepDetail as ak, WsTokenProvider as al, createClientQuery as am, createLocalStore as an, createStream as ao, SubscriptionErrorCallback as b, PersistenceAdapter as c, HttpStreamArgsOf as d, HttpStreamChunkOf as e, StreamIterable as f, BatchSlot as g, CachedQuery as h, ClientDebugShard as i, ClientDebugSnapshot as j, ClientDebugSubscription as k, ClientMessage as l, ClientQueryRef as m, ClientShapeSubscribeMessage as n, ClientShapeUnsubscribeMessage as o, FunctionDescriptor as p, GlobalFacetValue as q, GlobalFilterClause as r, GlobalTableInfo as s, GlobalTablePage as t, HttpStreamCallArgs as u, LunoraClientError as v, LunoraClientOptions as w, MutationSettledEvent as x, OptimisticLocalStore as y, OptimisticUpdate as z };
5104
+ export { SchedulerPoolStatus as $, ActionCallOptions as A, BookmarkStorage as B, ConnectionStatus as C, DEFAULT_MAX_BUFFER as D, OptimisticUpdate as E, FunctionArgumentDescriptor as F, GlobalFacetResult as G, HttpStreamRef as H, OutboxMutation as I, OutboxSink as J, PersistedMutation as K, LunoraClient as L, MutationCallOptions as M, ReplayCredential as N, OfflineQueueOptions as O, Preloaded as P, QueryCacheAdapter as Q, ReconnectOptions as R, SubscriptionError as S, ReplayIdentityVerdict as T, User as U, RoomRef as V, RowOp as W, RpcEnvelope as X, RpcResponseBody as Y, ScheduleRecord as Z, ScheduleRetryPolicy as _, Unsubscribe as a, SchedulerStatus as a0, ServerMessage as a1, ServerPokeEndMessage as a2, ServerPokePartMessage as a3, ServerPokeStartMessage as a4, ShardTrafficEntry as a5, ShardTrafficResult as a6, StorageListPage as a7, StorageObject as a8, StoredQuery as a9, StreamHandle as aa, SubscriptionCallback as ab, SubscriptionRegistry as ac, SubscriptionState as ad, SyncStatus as ae, SyncWatermark as af, WorkflowInstanceAction as ag, WorkflowInstanceDetail as ah, WorkflowInstancePage as ai, WorkflowInstanceStatus as aj, WorkflowInstanceSummary as ak, WorkflowStepDetail as al, WsTokenProvider as am, createClientQuery as an, createLocalStore as ao, createStream as ap, SubscriptionErrorCallback as b, PersistenceAdapter as c, HttpStreamArgsOf as d, HttpStreamChunkOf as e, StreamIterable as f, BatchSlot as g, CachedQuery as h, ClientDebugShard as i, ClientDebugSnapshot as j, ClientDebugSubscription as k, ClientMessage as l, ClientQueryRef as m, ClientShapeSubscribeMessage as n, ClientShapeUnsubscribeMessage as o, FunctionDescriptor as p, GlobalFacetValue as q, GlobalFilterClause as r, GlobalTableInfo as s, GlobalTablePage as t, HttpStreamCallArgs as u, LunoraClientError as v, LunoraClientOptions as w, MutationSettledEvent as x, OnlineOnlyOption as y, OptimisticLocalStore as z };
@@ -1,6 +1,18 @@
1
1
  import { LunoraErrorCodeInput, LunoraErrorCode } from '@lunora/errors';
2
2
  import { F as FunctionReference, A as ArgsOf, R as ReturnOf } from "./function-reference.d-Br_hsKje.mjs";
3
3
  import { CronJobInfo, VectorIndexSummary, VectorQueryMatch, PipelineLogQuery, PipelineLogPage, KvNamespaceSummary, KvKeyListResult, KvValueResult, AuthUser, AuthPage, AuthImpersonation, AuthCapabilities, AuthConfigInfo, AuthSession } from '@lunora/runtime';
4
+ /**
5
+ * The `onlineOnly` option a call to the function reference `F` may take. A
6
+ * function with a `v.sensitive` argument is emitted as `… & { readonly sensitive:
7
+ * true }`, and is always online-only: its arguments never reach the offline queue,
8
+ * the outbox or a persistence adapter. For it the option may be omitted or `true`;
9
+ * `false` is a type error. Every other reference is unchanged.
10
+ */
11
+ type OnlineOnlyOption<F> = F extends {
12
+ readonly sensitive: true;
13
+ } ? {
14
+ onlineOnly?: true;
15
+ } : unknown;
4
16
  /**
5
17
  * Typed reference to an HTTP-SSE stream route (`httpRoute.<verb>(path).stream()`)
6
18
  * emitted by `@lunora/codegen` as `httpStreams.<namespace>.<name>`.
@@ -1133,6 +1145,8 @@ interface FunctionArgumentDescriptor {
1133
1145
  name: string;
1134
1146
  /** True when the arg is wrapped in `v.optional(...)`. */
1135
1147
  optional: boolean;
1148
+ /** True when the arg is marked `v.sensitive` — a secret the caller supplies, never queued offline. */
1149
+ sensitive?: true;
1136
1150
  /** Target table for an `id` arg (`v.id("table")`). */
1137
1151
  table?: string;
1138
1152
  }
@@ -1726,6 +1740,23 @@ interface MutationCallOptions<TCurrent = unknown, TValue = unknown, TArgs = unkn
1726
1740
  * each then gets a fresh key.
1727
1741
  */
1728
1742
  mutationId?: string;
1743
+ /**
1744
+ * Never queue, persist or replay this write. When the shard's connection is
1745
+ * down or reconnecting — the states in which a normal write is queued — the
1746
+ * call rejects at once with `OFFLINE_NOT_QUEUED`, and its args never reach the
1747
+ * offline queue, the persistence adapter or the outbox. Use it for a write whose
1748
+ * arguments must not sit on disk: a credential a person typed in, a one-time
1749
+ * token. A function with a `v.sensitive` argument is always online-only, whatever
1750
+ * this option says: the client forces it on, and `false` is refused.
1751
+ *
1752
+ * Ordering: an online-only call neither waits for a queue flush nor queues
1753
+ * behind writes already queued for its shard. When it is sent it can overtake
1754
+ * them, so it may land on the server before an older queued write to the same
1755
+ * document. Optimistic layers are in-memory and are not applied to a refused call.
1756
+ *
1757
+ * Omit for normal calls, which queue as usual.
1758
+ */
1759
+ onlineOnly?: boolean;
1729
1760
  /**
1730
1761
  * Single-query shortcut: the transform is layered onto the subscription
1731
1762
  * registered under **this write's own** `(functionPath, args, shardKey)`, and
@@ -2910,7 +2941,8 @@ declare class LunoraClient {
2910
2941
  * (`wasEverConnected`), so the registry / resubscribe handshake has run.
2911
2942
  * Mutations issued before the very first WS connect to a shard fail fast.
2912
2943
  * Opt into queueing-before-first-connect via
2913
- * `OfflineQueueOptions.queueBeforeFirstConnect`.
2944
+ * `OfflineQueueOptions.queueBeforeFirstConnect`. Pass `onlineOnly: true` to
2945
+ * refuse a write instead of queueing it — see {@link MutationCallOptions.onlineOnly}.
2914
2946
  *
2915
2947
  * **Return-value caveat — the queued paths do not carry the server's result.**
2916
2948
  * The declared `Promise<ReturnOf<F>>` only holds when the write goes straight
@@ -2928,7 +2960,7 @@ declare class LunoraClient {
2928
2960
  * on a mutation's return value in an offline-capable app —
2929
2961
  * {@link LunoraClient.importRows} documents the same caveat for its counts.
2930
2962
  */
2931
- mutation<F extends FunctionReference>(function_: F, args: ArgsOf<F>, options?: MutationCallOptions<unknown, unknown, ArgsOf<F>>): Promise<ReturnOf<F>>;
2963
+ mutation<F extends FunctionReference>(function_: F, args: ArgsOf<F>, options?: MutationCallOptions<unknown, unknown, ArgsOf<F>> & OnlineOnlyOption<F>): Promise<ReturnOf<F>>;
2932
2964
  /**
2933
2965
  * Whether a {@link mutation} on `shardKey` would be queued (offline queue or
2934
2966
  * durable outbox) rather than fail when the network is down. `false` before
@@ -3821,6 +3853,26 @@ declare class LunoraClient {
3821
3853
  * with no server result.
3822
3854
  */
3823
3855
  private runMutation;
3856
+ /**
3857
+ * Refuses an `onlineOnly` write whose shard's connection is down or reconnecting,
3858
+ * the states in which a normal write is queued. Reads the gate synchronously, so
3859
+ * the refusal is immediate. Called again after the optimistic updates have been
3860
+ * applied, which is user code and may have dropped the shard: `optimisticRollbacks`
3861
+ * unwinds those layers before the refusal.
3862
+ */
3863
+ private refuseOnlineOnlyWhenDown;
3864
+ /**
3865
+ * Whether this tab's own socket is open for the shard. A follower tab has no socket
3866
+ * of its own: the status it reads is the leader's, which carried no part of the
3867
+ * request that just failed, so it never counts as open.
3868
+ */
3869
+ private ownSocketOpen;
3870
+ /**
3871
+ * Whether a write on `shardKey` would be queued if it failed right now, and
3872
+ * which gate would queue it. A follower tab has no `ShardConnection` of its own —
3873
+ * `connectionGateState` derives the same triple from the mirrored leader status.
3874
+ */
3875
+ private writeQueueGate;
3824
3876
  /**
3825
3877
  * Unwind a direct write's optimistic layers after its RPC threw — or keep
3826
3878
  * them, when it threw only because a COMMITTED result did not decode: the
@@ -5049,4 +5101,4 @@ declare class LunoraClient {
5049
5101
  */
5050
5102
  private settleReplayBatchSlots;
5051
5103
  }
5052
- export { SchedulerStatus as $, ActionCallOptions as A, BookmarkStorage as B, ConnectionStatus as C, DEFAULT_MAX_BUFFER as D, OutboxMutation as E, FunctionArgumentDescriptor as F, GlobalFacetResult as G, HttpStreamRef as H, OutboxSink as I, PersistedMutation as J, ReplayCredential as K, LunoraClient as L, MutationCallOptions as M, ReplayIdentityVerdict as N, OfflineQueueOptions as O, Preloaded as P, QueryCacheAdapter as Q, ReconnectOptions as R, SubscriptionError as S, RoomRef as T, User as U, RowOp as V, RpcEnvelope as W, RpcResponseBody as X, ScheduleRecord as Y, ScheduleRetryPolicy as Z, SchedulerPoolStatus as _, Unsubscribe as a, ServerMessage as a0, ServerPokeEndMessage as a1, ServerPokePartMessage as a2, ServerPokeStartMessage as a3, ShardTrafficEntry as a4, ShardTrafficResult as a5, StorageListPage as a6, StorageObject as a7, StoredQuery as a8, StreamHandle as a9, SubscriptionCallback as aa, SubscriptionRegistry as ab, SubscriptionState as ac, SyncStatus as ad, SyncWatermark as ae, WorkflowInstanceAction as af, WorkflowInstanceDetail as ag, WorkflowInstancePage as ah, WorkflowInstanceStatus as ai, WorkflowInstanceSummary as aj, WorkflowStepDetail as ak, WsTokenProvider as al, createClientQuery as am, createLocalStore as an, createStream as ao, SubscriptionErrorCallback as b, PersistenceAdapter as c, HttpStreamArgsOf as d, HttpStreamChunkOf as e, StreamIterable as f, BatchSlot as g, CachedQuery as h, ClientDebugShard as i, ClientDebugSnapshot as j, ClientDebugSubscription as k, ClientMessage as l, ClientQueryRef as m, ClientShapeSubscribeMessage as n, ClientShapeUnsubscribeMessage as o, FunctionDescriptor as p, GlobalFacetValue as q, GlobalFilterClause as r, GlobalTableInfo as s, GlobalTablePage as t, HttpStreamCallArgs as u, LunoraClientError as v, LunoraClientOptions as w, MutationSettledEvent as x, OptimisticLocalStore as y, OptimisticUpdate as z };
5104
+ export { SchedulerPoolStatus as $, ActionCallOptions as A, BookmarkStorage as B, ConnectionStatus as C, DEFAULT_MAX_BUFFER as D, OptimisticUpdate as E, FunctionArgumentDescriptor as F, GlobalFacetResult as G, HttpStreamRef as H, OutboxMutation as I, OutboxSink as J, PersistedMutation as K, LunoraClient as L, MutationCallOptions as M, ReplayCredential as N, OfflineQueueOptions as O, Preloaded as P, QueryCacheAdapter as Q, ReconnectOptions as R, SubscriptionError as S, ReplayIdentityVerdict as T, User as U, RoomRef as V, RowOp as W, RpcEnvelope as X, RpcResponseBody as Y, ScheduleRecord as Z, ScheduleRetryPolicy as _, Unsubscribe as a, SchedulerStatus as a0, ServerMessage as a1, ServerPokeEndMessage as a2, ServerPokePartMessage as a3, ServerPokeStartMessage as a4, ShardTrafficEntry as a5, ShardTrafficResult as a6, StorageListPage as a7, StorageObject as a8, StoredQuery as a9, StreamHandle as aa, SubscriptionCallback as ab, SubscriptionRegistry as ac, SubscriptionState as ad, SyncStatus as ae, SyncWatermark as af, WorkflowInstanceAction as ag, WorkflowInstanceDetail as ah, WorkflowInstancePage as ai, WorkflowInstanceStatus as aj, WorkflowInstanceSummary as ak, WorkflowStepDetail as al, WsTokenProvider as am, createClientQuery as an, createLocalStore as ao, createStream as ap, SubscriptionErrorCallback as b, PersistenceAdapter as c, HttpStreamArgsOf as d, HttpStreamChunkOf as e, StreamIterable as f, BatchSlot as g, CachedQuery as h, ClientDebugShard as i, ClientDebugSnapshot as j, ClientDebugSubscription as k, ClientMessage as l, ClientQueryRef as m, ClientShapeSubscribeMessage as n, ClientShapeUnsubscribeMessage as o, FunctionDescriptor as p, GlobalFacetValue as q, GlobalFilterClause as r, GlobalTableInfo as s, GlobalTablePage as t, HttpStreamCallArgs as u, LunoraClientError as v, LunoraClientOptions as w, MutationSettledEvent as x, OnlineOnlyOption as y, OptimisticLocalStore as z };
@@ -1,4 +1,4 @@
1
- import { L as LunoraClient, P as Preloaded } from "./lunora-client.d-D7gNlYT7.mjs";
1
+ import { L as LunoraClient, P as Preloaded } from "./lunora-client.d-DZ9gzk9p.mjs";
2
2
  import { F as FunctionReference, A as ArgsOf, R as ReturnOf } from "./function-reference.d-Br_hsKje.mjs";
3
3
  /**
4
4
  * Run a query once on the server (during SSR) and capture its result in a
@@ -1,4 +1,4 @@
1
- import { L as LunoraClient, P as Preloaded } from "./lunora-client.d-DTJ5zJKH.js";
1
+ import { L as LunoraClient, P as Preloaded } from "./lunora-client.d-CZ9TlyaL.js";
2
2
  import { F as FunctionReference, A as ArgsOf, R as ReturnOf } from "./function-reference.d-Br_hsKje.js";
3
3
  /**
4
4
  * Run a query once on the server (during SSR) and capture its result in a
@@ -1,4 +1,4 @@
1
- import { S as SubscriptionError, L as LunoraClient, a as Unsubscribe } from "../packem_shared/lunora-client.d-D7gNlYT7.mjs";
1
+ import { S as SubscriptionError, L as LunoraClient, a as Unsubscribe } from "../packem_shared/lunora-client.d-DZ9gzk9p.mjs";
2
2
  export type {
3
3
  /**
4
4
  * `@lunora/client/query` — the framework-neutral live-query state machine shared
@@ -10,7 +10,7 @@ export type {
10
10
  * framework — each adapter supplies thin sinks that write into its own ref /
11
11
  * store / signal / cache.
12
12
  */
13
- b as SubscriptionErrorCallback } from "../packem_shared/lunora-client.d-D7gNlYT7.mjs";
13
+ b as SubscriptionErrorCallback } from "../packem_shared/lunora-client.d-DZ9gzk9p.mjs";
14
14
  import { F as FunctionReference, A as ArgsOf, R as ReturnOf } from "../packem_shared/function-reference.d-Br_hsKje.mjs";
15
15
  import '@lunora/errors';
16
16
  import '@lunora/runtime';
@@ -1,4 +1,4 @@
1
- import { S as SubscriptionError, L as LunoraClient, a as Unsubscribe } from "../packem_shared/lunora-client.d-DTJ5zJKH.js";
1
+ import { S as SubscriptionError, L as LunoraClient, a as Unsubscribe } from "../packem_shared/lunora-client.d-CZ9TlyaL.js";
2
2
  export type {
3
3
  /**
4
4
  * `@lunora/client/query` — the framework-neutral live-query state machine shared
@@ -10,7 +10,7 @@ export type {
10
10
  * framework — each adapter supplies thin sinks that write into its own ref /
11
11
  * store / signal / cache.
12
12
  */
13
- b as SubscriptionErrorCallback } from "../packem_shared/lunora-client.d-DTJ5zJKH.js";
13
+ b as SubscriptionErrorCallback } from "../packem_shared/lunora-client.d-CZ9TlyaL.js";
14
14
  import { F as FunctionReference, A as ArgsOf, R as ReturnOf } from "../packem_shared/function-reference.d-Br_hsKje.js";
15
15
  import '@lunora/errors';
16
16
  import '@lunora/runtime';
@@ -1,4 +1,4 @@
1
- import { P as Preloaded, L as LunoraClient } from "../packem_shared/lunora-client.d-D7gNlYT7.mjs";
1
+ import { P as Preloaded, L as LunoraClient } from "../packem_shared/lunora-client.d-DZ9gzk9p.mjs";
2
2
  export type { A as ArgsOf, F as FunctionReference, R as ReturnOf } from "../packem_shared/function-reference.d-Br_hsKje.mjs";
3
3
  export {
4
4
  /**
@@ -20,7 +20,7 @@ p as preloadQuery,
20
20
  * WebSocket or touches a UI framework, so it is safe to import from any SSR
21
21
  * loader.
22
22
  */
23
- a as preloadedQueryResult } from "../packem_shared/preload.d-B0FFchsh.mjs";
23
+ a as preloadedQueryResult } from "../packem_shared/preload.d-BOpEnFP8.mjs";
24
24
  import '@lunora/errors';
25
25
  import '@lunora/runtime';
26
26
  /**
@@ -1,4 +1,4 @@
1
- import { P as Preloaded, L as LunoraClient } from "../packem_shared/lunora-client.d-DTJ5zJKH.js";
1
+ import { P as Preloaded, L as LunoraClient } from "../packem_shared/lunora-client.d-CZ9TlyaL.js";
2
2
  export type { A as ArgsOf, F as FunctionReference, R as ReturnOf } from "../packem_shared/function-reference.d-Br_hsKje.js";
3
3
  export {
4
4
  /**
@@ -20,7 +20,7 @@ p as preloadQuery,
20
20
  * WebSocket or touches a UI framework, so it is safe to import from any SSR
21
21
  * loader.
22
22
  */
23
- a as preloadedQueryResult } from "../packem_shared/preload.d-d05S6fB-.js";
23
+ a as preloadedQueryResult } from "../packem_shared/preload.d-CXUIU6pE.js";
24
24
  import '@lunora/errors';
25
25
  import '@lunora/runtime';
26
26
  /**
@@ -1 +1 @@
1
- import{getServerSession as o}from"../packem_shared/getServerSession-BaOoo1p6.mjs";import{deserializePreloaded as l,serializePreloaded as t}from"../packem_shared/deserializePreloaded-CyFK_cv6.mjs";import{createServerClient as i}from"../packem_shared/createServerClient-CwEIYb-6.mjs";import{preloadQuery as s,preloadedQueryResult as f}from"../packem_shared/preloadQuery-uFy24PCR.mjs";export{i as createServerClient,l as deserializePreloaded,o as getServerSession,s as preloadQuery,f as preloadedQueryResult,t as serializePreloaded};
1
+ import{getServerSession as o}from"../packem_shared/getServerSession-BaOoo1p6.mjs";import{deserializePreloaded as l,serializePreloaded as t}from"../packem_shared/deserializePreloaded-CyFK_cv6.mjs";import{createServerClient as i}from"../packem_shared/createServerClient-B0TsbJkS.mjs";import{preloadQuery as s,preloadedQueryResult as f}from"../packem_shared/preloadQuery-uFy24PCR.mjs";export{i as createServerClient,l as deserializePreloaded,o as getServerSession,s as preloadQuery,f as preloadedQueryResult,t as serializePreloaded};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@lunora/client",
3
- "version": "1.0.0-alpha.233",
3
+ "version": "1.0.0-alpha.235",
4
4
  "description": "Lunora browser SDK: WebSocket transport, optimistic updates, and an offline mutation queue",
5
5
  "keywords": [
6
6
  "cloudflare",
@@ -71,7 +71,7 @@
71
71
  },
72
72
  "dependencies": {
73
73
  "@lunora/errors": ">=1.0.0-alpha.51 <2.0.0-0",
74
- "@lunora/wire": "1.0.0-alpha.1",
74
+ "@lunora/wire": "1.0.0-alpha.2",
75
75
  "@visulima/storage-client": "1.0.9"
76
76
  },
77
77
  "peerDependencies": {
@@ -1 +0,0 @@
1
- import{LunoraError as S}from"@lunora/errors";import{encodeWire as B,decodeWire as k,stableWireKey as he}from"@lunora/wire";import{r as Be,U as De,P as Qe}from"./delta-merge-Ls3DED4g.mjs";import{w as v,b as re,j as C,d as ue,p as le,s as fe}from"./client-urls-BHLUjjcG.mjs";import qe from"./createInMemoryBookmarkStorage-BooZhW0n.mjs";import{s as Z,a as Ke,e as D,r as je,b as pe,w as Ge,c as $e,d as me,u as Ve}from"./wire-errors-BTLdHNoh.mjs";import{ClientQueryStore as ze}from"./createClientQuery-B8Nfj-7o.mjs";import{D as Je,a as Ye,b as Xe,c as Ze,d as et,S as ye,M as tt,I as st,Q as it,R as rt,e as nt,f as ot,g as at}from"./client-tuning-C10B2KCO.mjs";import{TabCoordinator as ct}from"./TabCoordinator-DBuR7Dwv.mjs";import{TransportError as M,getRetryAfterMs as dt,AUTH_REPLAY_ERROR_CODES as ht,isAuthReplayFailure as Q}from"./CONFLICT_ERROR_CODE-B7qNZMMk.mjs";import{httpStream as ut}from"./httpStream-DceAMeMf.mjs";import{d as ee,r as F,a as N,b as lt,c as ft,e as pt,f as mt}from"./local-store-fqWV2n_Z.mjs";import{O as yt,n as Se,i as St}from"./offline-queue-Dt_um8sR.mjs";import{resolvePersistenceAdapter as bt}from"./createInMemoryPersistence-BfgXApi_.mjs";import{w as W,a as be,b as vt}from"./stream-idle-C7CsIT_m.mjs";import{resolveQueryCacheAdapter as gt,queryCacheKey as P}from"./createInMemoryQueryCache-B5wX-gTy.mjs";import{createReconnect as ve}from"./createReconnect-CjTmjJDH.mjs";import{fanSubscriptionError as I,SubscriptionRegistry as E,wrapSubscriber as $}from"./SubscriptionRegistry-DKIXE7M7.mjs";import Tt from"./createSnapshotPrecondition-CLkxVeN1.mjs";import{createStream as kt}from"./DEFAULT_MAX_BUFFER-Bd-_iyiV.mjs";const V=500,_e=(r,e)=>{if(r.size<e)return;const t=r.keys().next().value;t!==void 0&&r.delete(t)},_="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_",Ct=r=>{let e="",t=0;const s=r.length-2;for(;t<s;t+=3){const n=r[t]<<16|r[t+1]<<8|r[t+2];e+=_.charAt(n>>18&63)+_.charAt(n>>12&63)+_.charAt(n>>6&63)+_.charAt(n&63)}const i=r.length-t;if(i===1){const n=r[t]<<16;e+=_.charAt(n>>18&63)+_.charAt(n>>12&63)}else if(i===2){const n=r[t]<<16|r[t+1]<<8;e+=_.charAt(n>>18&63)+_.charAt(n>>12&63)+_.charAt(n>>6&63)}return e};new TextDecoder;const wt=new TextEncoder,At=r=>Ct(wt.encode(JSON.stringify(r))),Et="x-lunora-expect-subject",_t=r=>At({subject:r}),ge=Symbol.for("lunora:session-change"),It="lunora:session-change",Ot="better-auth.message",Rt="signout",Ie=()=>{const r=globalThis;let e=r[ge];return e===void 0&&(e={detach:void 0,listeners:new Set,tab:`${Date.now().toString(36)}-${Math.random().toString(36).slice(2)}`},r[ge]=e),e},Pt=()=>"document"in globalThis,Ft=async()=>{const r=[];for(const e of Ie().listeners)try{r.push(e())}catch{}await Promise.allSettled(r)},Lt=(r,e)=>{if(r!==Ot||e===null)return!1;try{const t=JSON.parse(e);return t?.event==="session"&&t.data?.trigger===Rt}catch{return!1}},Mt=r=>{const e=[],t=()=>{Ft().catch(()=>{})};let s;try{s=typeof BroadcastChannel=="function"?new BroadcastChannel(It):void 0}catch{s=void 0}if(s!==void 0){const n=s;n.addEventListener("message",a=>{a.data?.type==="lunora:session-change"&&a.data.tab!==r&&t()}),e.push(()=>{n.close()})}const i=globalThis;if(typeof i.addEventListener=="function"){const n=a=>{Lt(a.key,a.newValue)&&t()};i.addEventListener("storage",n),e.push(()=>{i.removeEventListener?.("storage",n)})}return()=>{for(const n of e)n()}},Ht=r=>{const e=Ie();return e.listeners.add(r),e.detach===void 0&&Pt()&&(e.detach=Mt(e.tab)),()=>{e.listeners.delete(r),e.listeners.size===0&&(e.detach?.(),e.detach=void 0)}},Ut="/_lunora/rpc",z="/_lunora/rpc-batch",J="/_lunora/ws",Nt="/_lunora/admin/shard-traffic",xt="/_lunora/admin/scheduled",Wt="/_lunora/admin/scheduled/status",Bt="/_lunora/admin/scheduled/ws",Dt="/_lunora/admin/scheduled/cancel",Te="/_lunora/admin/scheduled/dead",Qt="/_lunora/admin/scheduled/dead/retry",qt="/_lunora/admin/scheduled/dead/cancel",Kt="/_lunora/admin/workflows/instances",jt="/_lunora/admin/workflows/instance",Gt="/_lunora/admin/workflows/status",ne="/_lunora/admin/storage",$t="/_lunora/admin/storage/url",Vt="/_lunora/admin/storage/buckets",zt="/_lunora/admin/functions",Jt="/_lunora/admin/cron-jobs",Yt="/_lunora/admin/cron-jobs/run",Xt="/_lunora/admin/architecture",Zt="/_lunora/admin/openapi",es="/_lunora/admin/openrpc",ts="/_lunora/admin/global/tables",ss="/_lunora/admin/global/table",is="/_lunora/admin/global/facet",rs="/_lunora/admin/vector/indexes",ns="/_lunora/admin/vector/query",os="/_lunora/admin/logs/archive",as="/_lunora/admin/kv/namespaces",cs="/_lunora/admin/kv/keys",oe="/_lunora/admin/kv/value",ds="/_lunora/admin/auth/users",hs="/_lunora/admin/auth/sessions",us="/_lunora/admin/auth/users/create",ls="/_lunora/admin/auth/users/role",fs="/_lunora/admin/auth/users/ban",ps="/_lunora/admin/auth/users/unban",ms="/_lunora/admin/auth/users/password",ys="/_lunora/admin/auth/users/remove",Ss="/_lunora/admin/auth/users/impersonate",bs="/_lunora/admin/auth/sessions/revoke",vs="/_lunora/admin/auth/sessions/revoke-all",gs="/_lunora/admin/auth/capabilities",Ts="/_lunora/admin/auth/users/update",ks="/_lunora/admin/auth/accounts",Cs="/_lunora/admin/auth/accounts/unlink",ws="/_lunora/admin/auth/passkeys",As="/_lunora/admin/auth/passkeys/delete",Es="/_lunora/admin/auth/two-factor/disable",_s="/_lunora/admin/auth/organizations",Is="/_lunora/admin/auth/organizations/members",Os="/_lunora/admin/auth/organizations/invitations",Rs="/_lunora/admin/auth/organizations/members/remove",Ps="/_lunora/admin/auth/organizations/invitations/cancel",Fs="/_lunora/admin/auth/config",Ls="/_lunora/admin/auth/sign-up-invitations",Ms="/_lunora/admin/auth/sign-up-invitations/create",Hs="/_lunora/admin/auth/sign-up-invitations/revoke",Us="/_lunora/admin/auth/organizations/create",Ns="/_lunora/admin/auth/organizations/update",xs="/_lunora/admin/auth/organizations/remove",Ws="/_lunora/admin/auth/organizations/members/add",Bs="/_lunora/admin/auth/organizations/members/invite",Ds="/_lunora/admin/auth/organizations/members/role",Qs="/_lunora/admin/auth/organizations/teams",qs="/_lunora/admin/auth/organizations/teams/create",Ks="/_lunora/admin/auth/organizations/teams/update",js="/_lunora/admin/auth/organizations/teams/remove",Gs="/_lunora/admin/auth/organizations/teams/members",$s="/_lunora/admin/auth/organizations/teams/members/add",Vs="/_lunora/admin/auth/organizations/teams/members/remove",zs="/_lunora/admin/auth/organizations/roles",Js="/_lunora/admin/auth/organizations/roles/create",Ys="/_lunora/admin/auth/organizations/roles/update",Xs="/_lunora/admin/auth/organizations/roles/remove",Zs="/api/auth",ei="/get-session",ti="lunora-ping",si=async r=>(r.assertOpen(),(await r.adminFetch(zt,"GET")).functions??[]),ii=async r=>(r.assertOpen(),(await r.adminFetch(Jt,"GET")).jobs??[]),ri=async(r,e)=>{r.assertOpen();const t=await r.adminFetch(Yt,"POST",{name:e});return{name:t.name??e,ran:t.ran===!0}},ni=async r=>(r.assertOpen(),await r.adminFetch(Zt,"GET")),oi=async r=>(r.assertOpen(),await r.adminFetch(Xt,"GET")),ai=async r=>(r.assertOpen(),await r.adminFetch(es,"GET")),ci=async r=>(r.assertOpen(),await r.adminFetch(ts,"GET")),di=async(r,e)=>{r.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(B(e.filters))),k(await r.adminFetch(`${ss}?${t.toString()}`,"GET"))},hi=async(r,e)=>{r.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(B(e.filters))),k(await r.adminFetch(`${is}?${t.toString()}`,"GET"))},ui=async r=>(r.assertOpen(),(await r.adminFetch(as,"GET")).namespaces??[]),li=async(r,e)=>{r.assertOpen();const t=v(cs,{cursor:e.cursor,limit:e.limit,namespace:e.namespace,prefix:e.prefix});return await r.adminFetch(t,"GET")},fi=async(r,e)=>{r.assertOpen();const t=v(oe,{key:e.key,namespace:e.namespace});return await r.adminFetch(t,"GET")},pi=async(r,e)=>{r.assertOpen(),await r.adminFetch(oe,"PUT",e)},mi=async(r,e)=>{r.assertOpen();const t=v(oe,{key:e.key,namespace:e.namespace});await r.adminFetch(t,"DELETE")},yi=async(r,e)=>{r.assertOpen();const t=await r.adminFetch(Nt,"POST",{table:e});return{failed:t.failed??0,ok:t.ok??0,shards:t.shards??[]}},Si=async(r,e={})=>{r.assertOpen();const t=await r.adminFetch(os,"POST",e);return{nextCursor:t.nextCursor,rows:t.rows??[]}},bi=async r=>{const e=[];let t;for(;;){const s=await r(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=r=>"args"in r?{...r,args:k(r.args)}:r,vi=async r=>(r.assertOpen(),((await r.adminFetch(xt,"GET")).records??[]).map(t=>ae(t))),gi=async r=>{r.assertOpen();const e=await r.adminFetch(Wt,"GET");return{backlog:e.backlog??0,inFlight:e.inFlight??0,pools:e.pools??[]}},Ti=async(r,e)=>(r.assertOpen(),{cancelled:(await r.adminFetch(Dt,"POST",{id:e})).cancelled===!0}),ki=async r=>(r.assertOpen(),(await bi(async t=>await r.adminFetch(t===void 0?Te:`${Te}?cursor=${encodeURIComponent(t)}`,"GET"))).map(t=>ae(t))),Ci=async(r,e)=>(r.assertOpen(),{retried:(await r.adminFetch(Qt,"POST",{id:e})).retried===!0}),wi=async(r,e)=>(r.assertOpen(),{removed:(await r.adminFetch(qt,"POST",{id:e})).removed===!0}),Ai=async(r,e)=>{r.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 r.adminFetch(`${Kt}?${t.toString()}`,"GET");return{configured:s.configured,instances:s.instances??[],page:s.page??1,perPage:s.perPage??e.perPage??0,totalCount:s.totalCount}},Ei=async(r,e)=>{r.assertOpen();const t=new URLSearchParams({id:e.id,name:e.name}),s=await r.adminFetch(`${jt}?${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??[]}},_i=async(r,e)=>(r.assertOpen(),{status:(await r.adminFetch(Gt,"POST",{action:e.action,id:e.id,name:e.name})).status??"unknown"}),Ii=async(r,e={})=>{r.assertOpen();const t=v(ne,{bucket:e.bucket,cursor:e.cursor,limit:e.limit,prefix:e.prefix}),s=await r.adminFetch(t,"GET");return{cursor:s.cursor,objects:s.objects??[]}},Oi=async(r,e,t)=>{r.assertOpen();const s=`${ne}?key=${encodeURIComponent(e)}${re(t?.bucket)}`,i=await r.adminFetch(s,"DELETE");return{deleted:i.deleted===!0,key:i.key??e}},Ri=async r=>(r.assertOpen(),(await r.adminFetch(Vt,"GET")).buckets??[]),Pi=async(r,e)=>{r.assertOpen();const t=`${ne}?key=${encodeURIComponent(e.key)}${re(e.bucket)}`,s=await r.adminFetch(t,"PUT",e.body,e.contentType);return{etag:s.etag,key:s.key??e.key}},Fi=async(r,e,t)=>{r.assertOpen();const s=t?.expiresInSeconds,i=s===void 0?"":`&expiresIn=${encodeURIComponent(s.toString())}`,n=`${$t}?key=${encodeURIComponent(e)}${i}${re(t?.bucket)}`,a=await r.adminFetch(n,"GET");if(typeof a.url!="string")throw new TypeError("LunoraClient: storage URL endpoint returned no `url`");return a.url},Li=async r=>(r.assertOpen(),(await r.adminFetch(rs,"GET")).indexes??[]),Mi=async(r,e)=>(r.assertOpen(),(await r.adminFetch(ns,"POST",e)).matches??[]),w=(r,e)=>{try{return B(r)}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)}},ke=r=>{try{return B(r),!0}catch{return!1}},Oe=r=>r!==null&&typeof r=="object"&&("error"in r||"result"in r),Hi=(r,e)=>{const t=Array.from({length:e});for(const s of r){if(typeof s.id!="number"||s.id<0||s.id>=e)continue;if(!Oe(s.body)){t[s.id]={error:Z({}),ok:!1};continue}const i=s.body;t[s.id]="error"in i?{error:Z(i),ok:!1}:{ok:!0,value:k(i.result)}}return t.map(s=>s??{error:new Error("batch call returned no result"),ok:!1})},Y=(r,e)=>e!==null?{}:r===null?{expectSubject:null}:r?.startsWith("subj:")===!0?{expectSubject:r.slice(5)}:{},q=r=>r==="connected"||r==="polling",l=r=>r??"",T=(r,e)=>{if(!r.socket||r.wsState!=="open")return!1;try{return r.socket.send(JSON.stringify(e)),!0}catch{return!1}},Ui=r=>{if(!r.pendingStreams||r.pendingStreams.length===0)return;const e=r.pendingStreams;r.pendingStreams=[];for(const t of e)T(r,t)},Ni=new TextDecoder,xi=r=>{if(typeof r=="string")return r;if(r instanceof ArrayBuffer)return Ni.decode(r)};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 L=r=>{r.heartbeatTimer!==void 0&&(clearInterval(r.heartbeatTimer),r.heartbeatTimer=void 0)},Wi=(r,e,t)=>{L(r),!(e<=0)&&(r.heartbeatTimer=setInterval(()=>{if(!r.socket)return;const{socket:s}=r;if(Date.now()-r.lastFrameAt>e*2.5){try{s.close()}catch{}t();return}try{s.send(ti)}catch{}},e))},Ce=(r,e,t,s)=>{const{WebSocketImpl:i,connectTimeoutMs:n,heartbeatIntervalMs:a}=t;if(i===void 0)throw new S("INTERNAL","no WebSocket implementation available");const o=new i(e);r.socket=o;const c=()=>{L(r),r.connectTimer!==void 0&&(clearTimeout(r.connectTimer),r.connectTimer=void 0),r.socket===o&&(r.socket=void 0)},h=d=>{c(),s.onClose(d)};n>0&&(r.connectTimer=setTimeout(()=>{if(r.connectTimer=void 0,r.socket===o){try{o.close()}catch{}h()}},n)),o.addEventListener("open",()=>{if(r.socket===o){r.connectTimer!==void 0&&(clearTimeout(r.connectTimer),r.connectTimer=void 0),r.lastFrameAt=Date.now();try{s.onOpen?.()}catch(d){console.error("[lunora] connection open handler threw",d)}r.socket===o&&Wi(r,a,h)}}),o.addEventListener("message",d=>{if(r.socket===o){r.lastFrameAt=Date.now();try{s.onMessage(d)}catch(u){console.error("[lunora] server frame handler threw",u)}}}),o.addEventListener("close",d=>{r.socket===o&&h(d)}),o.addEventListener("error",()=>{r.socket===o&&h()})},Bi=r=>{const{afterFailedAttempts:e,intervalMs:t,onReachable:s,onStateChange:i,poll:n}=r,a=t>0&&e>0;let o=0,c,h=!1,d=!1;const u=()=>{c!==void 0&&(clearInterval(c),c=void 0,h=!1,i())},p=m=>{if(c!==void 0){if(!m){u();return}h||(h=!0,i()),s()}},f=()=>{d||(d=!0,n().then(p).finally(()=>{d=!1}).catch(()=>{}))};return{isPolling:()=>c!==void 0&&h,noteFailedOpen:()=>{o+=1,!(!a||c!==void 0||o<e)&&(c=setInterval(f,t),i(),f())},noteOpen:()=>{o=0,u()},stop:u}},Di=1e4,we=async r=>W(Di,void 0,r,()=>new TypeError("LunoraClient: poll timed out")),Re=new Set(["DELIVERY_FENCED","RATE_LIMITED","SHARD_ERROR","SHARD_UNAVAILABLE","TOO_MANY_REQUESTS"]),Ae=r=>{if(r instanceof M)return!0;const e=r?.code;return e===void 0||Re.has(e)||ht.has(e)},Qi=1e3,Pe=6e4,qi={401:"UNAUTHORIZED",403:"FORBIDDEN",404:"NOT_FOUND",413:"PAYLOAD_TOO_LARGE",429:"TOO_MANY_REQUESTS"},x=(r,e,t)=>{const s=Ke(t),i=s===void 0?void 0:{retryAfterMs:s},n=`LunoraClient: response carried no error envelope (status ${r.toString()}${e?` ${e}`:""})`;return r<400||r>=500||r===408?new M(n,i):new S(qi[r]??"BAD_REQUEST",n,{data:i})},te=(r,e=Math.random)=>{const t=Math.min(Qi*2**Math.max(r-1,0),Pe);return Math.round(t*(.5+e()*.5))},Ki=r=>{const e=r?.code;return r instanceof M||e===void 0||Re.has(e)},ji=(r,e,t)=>{const s=dt(r);return s!==void 0&&s>0?Math.min(s,Pe):Ki(r)?te(e,t):void 0},Gi=983040,$i=r=>typeof TextEncoder>"u"?r.length:new TextEncoder().encode(r).length,Fe=new WeakSet,Le=r=>{const e=new S("WIRE_DECODE_FAILED",`LunoraClient: the call succeeded but its result could not be decoded (a mutation has still committed) — ${r instanceof Error?r.message:String(r)}`,{cause:r});return Fe.add(e),e},K=r=>r instanceof Error&&Fe.has(r),Vi=r=>{const e=new Map;for(const t of r)typeof t.id=="number"&&Oe(t.body)&&e.set(t.id,t.body);return e},zi=r=>{if(r===void 0)return{kind:"unanswered"};if("error"in r)return{error:Z(r),kind:"errored"};try{return{commitCursor:r.commitCursor,kind:"committed",value:k(r.result)}}catch(e){return{commitCursor:r.commitCursor,error:Le(e),kind:"undecodable"}}},X=(r,e)=>`${l(r)}\0${e}`,Ji=(r,e)=>{for(const t of e)t.op==="delete"?r.delete(t.key):t.value!==void 0&&r.set(t.key,t.value)};class Yi{constructor(e){this.maxBuffers=e}maxBuffers;buffers=new Map;start(e,t){_e(this.buffers,this.maxBuffers),this.buffers.set(X(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(X(e,t.pokeId));if(!s)return;const i=[];try{for(const o of t.rowsPatch)i.push(o.value===void 0?o:{...o,value:k(o.value)})}catch(o){s.undecodable.set(t.shapeId,o);return}const n=s.parts.get(t.shapeId)??[];for(const o of i)n.push(o);s.parts.set(t.shapeId,n),t.lastMutationId!==void 0&&s.lastMutationId.set(t.shapeId,t.lastMutationId);const a=t.baseCheckpoint??s.baseCheckpoint;a!==void 0&&s.bases.set(t.shapeId,a),t.reset===!0&&s.resets.add(t.shapeId)}end(e,t){const s=X(e,t),i=this.buffers.get(s);return i&&this.buffers.delete(s),i}clear(){this.buffers.clear()}}const Xi=(r,e,t)=>{const s=e.parts.get(r.id)??[],i=e.resets.has(r.id),n=e.bases.get(r.id),a=e.epoch!==void 0&&r.serverEpoch!==void 0&&e.epoch!==r.serverEpoch,o=n!==void 0&&r.serverCursor!==void 0&&r.serverCursor!==n;if(!i&&(a||o))return r.rows.clear(),r.serverCursor=void 0,r.serverEpoch=void 0,r.answered=!1,"reseed";i&&r.rows.clear(),Ji(r.rows,s),r.answered=!0,t.checkpoint!==void 0&&(r.serverCursor=t.checkpoint),t.epoch!==void 0&&(r.serverEpoch=t.epoch);const c=e.lastMutationId.get(r.id);return c!==void 0&&(r.lastMutationId=c),"applied"},Ee=r=>{const e=[...r.rows.values()];for(const t of r.callbacks)try{t(e)}catch{}},Zi=(r,e)=>{for(const[t,s]of e.undecodable){const i=r.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=(r,e)=>{r.lastMutationId=Math.max(r.lastMutationId??0,e)},ie=(r,e=!1)=>{for(const t of r.checkpointCallbacks)t({checkpoint:r.serverCursor,mutationId:r.lastMutationId,...e&&{rowsFollow:!0}})},Me=(r,e,t)=>{r.serverBase=e,t.cursor!==void 0&&(r.serverCursor=t.cursor),t.epoch!==void 0&&(r.serverEpoch=t.epoch)},er=(r,e)=>e.cursor!==void 0&&r.serverCursor!==void 0&&r.serverBase!==void 0&&e.epoch!==void 0&&e.epoch===r.serverEpoch&&e.cursor<r.serverCursor,j=(r,e)=>r!==void 0&&r!==e,tr=(r,e)=>e==="connected"&&r!=="connected"||e==="polling"&&r!=="connected"&&r!=="polling",sr=r=>{for(const e of r.activeSubscriptions())e.valueReceived=!1,r.ensureSocket(e.shardKey),r.queueResubscribe(e);for(const e of r.activeShapes())e.answered=!1,r.ensureSocket(e.shardKey);for(const e of r.queuedShardKeys())r.ensureSocket(e);r.broadcastStatus(r.computeStatus(),r.identityFingerprint()),r.emitConnectionStatus()},ir=r=>{r.closeConnections();const e=r.leader;e.status=void 0,e.wasEverConnected=!1;for(const t of r.activeSubscriptions())t.acked=!1,t.valueReceived=!1;for(const t of r.activeShapes())t.answered=!1;r.emitConnectionStatus()},rr=(r,e,t)=>{if(j(t,r.identityFingerprint()))return;const s=r.leader,i=tr(s.status,e);s.status=e,e==="connected"&&(s.wasEverConnected=!0),r.emitConnectionStatus(),i&&r.flushOfflineQueues()},nr=r=>{r.isLeader()&&r.broadcastStatus(r.computeStatus(),r.identityFingerprint())},or=(r,e,t,s,i,n)=>{if(j(n,r.identityFingerprint()))return;const a=r.subscription(e);if(!a)return;r.dropCacheSeed(e);const o=!a.valueReceived;a.valueReceived=!0,Me(a,t,s===void 0?{}:{cursor:s,epoch:i}),s!==void 0&&ee(a,s),F(a,t),o&&r.emitConnectionStatus()},ar=(r,e,t,s)=>{if(j(s,r.identityFingerprint()))return;const i=r.subscription(e);if(i){const n=!i.valueReceived;i.valueReceived=!0,I(i.errorCallbacks,t),n&&r.emitConnectionStatus()}},cr=(r,e,t,s,i,n,a)=>{if(j(a,r.identityFingerprint()))return;const o=r.subscription(e);o&&(r.ackAndAdvanceCursor(o,t,s),i!==void 0&&n===r.clientIdentifier()&&se(o,i),ie(o))},dr=(r,e,t)=>r!==null||e&&t===null,hr=[Qe],ur=100,He=1e4,lr=async(r,e,t,s)=>{const i=new AbortController,n=setTimeout(()=>{i.abort()},He);try{const a=await r(e,{body:t,credentials:"include",headers:s,method:"POST",signal:i.signal});return await a.text(),a.status}finally{clearTimeout(n)}},fr=Promise.resolve();class Ue{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 E;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 Yi(Ue.MAX_POKE_BUFFERS);nextShapeId=0;constructor(e){this.url=e.url,this.wsUrl=e.wsUrl??C(ue(e.url),J),this.wsToken=e.wsToken;const t=e.authBasePath??Zs;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??qe(),this.reconnectOptions=e.reconnect,this.heartbeatIntervalMs=e.heartbeatIntervalMs??Je,this.connectTimeoutMs=e.connectTimeoutMs??Ye,this.rpcTimeoutMs=e.rpcTimeoutMs??Xe,this.managedSocketOptions={connectTimeoutMs:this.connectTimeoutMs,heartbeatIntervalMs:this.heartbeatIntervalMs,WebSocketImpl:this.WebSocketImpl},this.pollingFallbackIntervalMs=e.pollingFallback?.intervalMs??Ze,this.pollingFallbackAfterFailedAttempts=e.pollingFallback?.afterFailedAttempts??et,this.defaultConnectionContext=e.connectionContext,this.persistence=bt(e.persistence,e.outbox===void 0),this.persistenceVersion=e.persistenceVersion,this.queryCache=gt(e.queryCache),this.clientQueryStore=new ze,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=fr),this.offlineQueue=new yt(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-${Se()}`,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=Ht(async()=>{!this.closed&&this.authToken===null&&await this.getCurrentUser().catch(()=>{})}))}setAuthToken(e,t){const s=this.authToken!==e,i=this.identityFingerprint(),n=this.authSubject===void 0||this.subjectToken===this.authToken,a=this.subjectAwaitingReconfirm(),o=this.isKnownNobody(),c=this.authToken;this.authToken=e,this.applySubject(e,t);const h=this.identityFingerprint();h!==i&&(!s&&e!==null&&n?(this.restampQueuedIdentity(i,h),this.restampWatermarks(i,h),this.restampConnectionIdentity(i,h),this.reseedFromHydratedCache()):!s&&e===null&&i===null&&n&&!o?(this.restampWatermarks(i,h),this.restampConnectionIdentity(i,h),this.reseedFromHydratedCache()):(this.rejectQueuedForIdentityChange(i),this.warnRefreshWithoutSubject(c,e),dr(i,o,e)&&this.evictPreviousIdentitySession()),this.restartTabCoordinatorForIdentity()),this.syncReadCacheToCredential(a),s&&this.authTokenListeners.emit(e),(h!==i||s||a)&&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 S("INTERNAL",`callMutator: clientSeq must be a positive integer, got ${String(i)}`);const n=s?.shardKey??"",a=this.identityFingerprint();let o,c,h;try{c=await this.rpc(e,t,s?.shardKey,{captureBookmark:!0,clientId:this.clientId,clientSeq:i,onMutationAck:u=>{o=u}})}catch(u){if(!K(u))throw u;h=u}if(o!==void 0&&o>(this.clientWatermarks.get(a??"")?.get(n)??0)){let u=this.clientWatermarks.get(a??"");u===void 0&&(_e(this.clientWatermarks,at),u=new Map,this.clientWatermarks.set(a??"",u)),u.set(n,o)}if(h!==void 0)throw h;return{applied:o===void 0||o===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}${ei}`),{credentials:"include",headers:e,method:"GET"});if(!i.ok)return this.identitySettled=!0,i.status===401&&this.adoptResolvedSubject(t,null,s),null;const a=(await i.json())?.user??null;return this.identitySettled=!0,this.adoptResolvedSubject(t,a,s),a}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},n=this.connectionContextHolders.get(s);n?n.push(i):this.connectionContextHolders.set(s,[i]),this.refreshConnectionContext(s);let a=!1;return()=>{if(a)return;a=!0;const o=this.connectionContextHolders.get(s);if(!o)return;const c=o.indexOf(i);c!==-1&&o.splice(c,1),o.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 n=this.whisperHandlers.get(i);n||(n=new Map,this.whisperHandlers.set(i,n));let a=n.get(e);const o=a===void 0;if(a||(a=new Set,n.set(e,a)),a.add(t),this.ensureSocket(s.shardKey),o){const c=this.getConnection(s.shardKey);c&&this.sendWhisperJoin(c,i,e)}return()=>{const c=this.whisperHandlers.get(i),h=c?.get(e);if(!h?.delete(t)||h.size>0)return;c?.delete(e),c?.size===0&&this.whisperHandlers.delete(i);const d=this.getConnection(s.shardKey);d&&T(d,{topic:e,type:"whisper_unsubscribe"}),this.releaseWhisperJoin(i,e),this.releaseIdleShard(s.shardKey)}}subscribeLiveTopic(e){const{onError:t,onEvent:s,shardKey:i,stream:n,topic:a}=e;if(a.length===0)throw new S("INTERNAL","LunoraClient: subscribeLiveTopic needs a non-empty topic");this.nextLiveSocketId+=1;const o=`ws-live-${String(this.nextLiveSocketId)}`,c=l(i),h=`/live/${n}/control`;let u=this.whisperSubscribe(a,()=>{},{shardKey:i});const p=()=>{const y=u;u=void 0,y?.()};let f=this.liveSocketGrants.get(c);f===void 0&&(f=new Map,this.liveSocketGrants.set(c,f)),f.set(o,{onError:t,onEvent:s,release:p,stream:n,topic:a});const m=this.getConnection(i)?.connectionId;m!==void 0&&this.grantWhenJoined(i,o,m);let b=!1;return()=>{if(b)return;b=!0;const y=this.liveSocketGrants.get(c),O=y?.delete(o)===!0;y?.size===0&&this.liveSocketGrants.delete(c);const g=this.getConnection(i)?.connectionId;O&&g!==void 0&&this.postLiveControl(h,i,{action:"unsubscribe",connectionId:g,stream:n,subscriptionId:o,topic:a}),p()}}whisper(e,t,s={}){return this.assertLeaderOwnedSurface("whisper"),this.sendEncodedWhisper(e,w(t??null,`whisper data for topic '${e}'`),s)}connectRoom(e,t,s={}){const i=`room:${e.name}`,n=this.whisperSubscribe(i,p=>{t.onMessage(p)},s);let a=!1;const o=[],c=()=>{o.length=0},h=()=>{for(;o.length>0&&this.roomSendsAdmitted(s.shardKey);){if(!this.sendEncodedWhisper(i,o[0],s))return;o.shift()}},d=l(s.shardKey),u=this.roomFlushes.get(d)??new Set;return u.add(h),this.roomFlushes.set(d,u),this.roomIdentityResets.add(c),{close:()=>{a=!0,o.length=0,u.delete(h),u.size===0&&this.roomFlushes.delete(d),this.roomIdentityResets.delete(c),n()},send:p=>{if(a||this.closed||this.WebSocketImpl===void 0)return!1;const f=w(p,`room message for '${i}'`),m=typeof structuredClone=="function"?structuredClone(f):JSON.parse(JSON.stringify(f));return h(),o.length===0&&this.roomSendsAdmitted(s.shardKey)&&this.sendEncodedWhisper(i,m,s)?!0:o.length>=ur?!1:(o.push(m),!0)}}}connectWebSocket(e,t,s={}){if(this.assertLeaderOwnedSurface("connectWebSocket"),this.WebSocketImpl===void 0||this.closed)return{close:()=>{},send:()=>{}};const i=o=>{try{o?.()}catch(c){console.error("[lunora] socket route handler threw",c)}};let n;const a=this.openSupplementarySocket(this.supplementaryUrl(e),{onClose:()=>{clearTimeout(n),i(t.onClose)},onMessage:o=>{let c;try{c=JSON.parse(typeof o.data=="string"?o.data:"")}catch{return}c.type==="message"&&(a.resetBackoff(),i(()=>{t.onMessage(k(c.data))}))},onOpen:()=>{clearTimeout(n);const o=a.socket();n=setTimeout(()=>{a.socket()===o&&a.resetBackoff()},ye),i(t.onOpen)},shardKey:s.shardKey});return{close:()=>{clearTimeout(n),a.close()},send:o=>{const c=JSON.stringify(w(o,`socket message for '${e}'`)),h=a.socket();if(h!==void 0)try{h.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 n of this.subscriptions.all())(t||this.connectionGateState(n.shardKey).polling?n.valueReceived:n.acked)||(s+=1);for(const n of this.shapeSubscriptions.values())n.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 n of s){const a=this.connections.get(n);e.push({confirmedMutationWatermark:t?.get(n)??0,hasSocket:a?.socket!==void 0,shardKey:n===""?void 0:n,wasEverConnected:a?.wasEverConnected??!1,wsState:a?.wsState??"idle"})}const i=this.subscriptions.all().map(n=>({acked:n.acked,functionPath:n.fn.__lunoraRef,id:n.id,kind:"query",lastMutationId:n.lastMutationId,pendingOptimisticLayers:n.optimisticLayers.length,serverCursor:n.serverCursor,shardKey:n.shardKey,subscriberCount:n.callbacks.size}));for(const n of this.shapeSubscriptions.values())i.push({acked:n.answered,functionPath:`shape:${n.name}`,id:n.id,kind:"shape",lastMutationId:n.lastMutationId,pendingOptimisticLayers:0,rowCount:n.rows.size,serverCursor:n.serverCursor,shardKey:n.shardKey,subscriberCount:n.callbacks.size});return{clientId:this.clientId,closed:this.closed,connectionStatus:this.computeStatus(),pendingWrites:this.offlineQueue.size,shards:e.toSorted((n,a)=>(n.shardKey??"").localeCompare(a.shardKey??"")),subscriptions:i.toSorted((n,a)=>n.functionPath.localeCompare(a.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 Tt(this,e,t,s)}whenReady(e={}){return e.signal===void 0?this.readyPromise:be(this.readyPromise,e.signal)}get isReady(){return this.readyResolved}peekHydratedQuery(e,t,s){return this.peekHydratedQueryByKey(e,he(t),s)}peekHydratedQueryByKey(e,t,s){if(!this.readyResolved)return;const i=P(e,t,s),n=this.hydratedQueryCache.get(i);if(n!==void 0)return this.cachedQueryMatchesIdentity(n)?n.value:void 0}peekActiveQuerySnapshot(e,t,s){const i=E.key(e,t,s),n=this.subscriptions.get(i);return{present:n!==void 0,value:n?.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 vt(s.signal);const{value:i}=await be(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)),n=s.toArgs??(d=>({rows:d})),a=t.length;let o=0,c=0,h=0;for(let d=0;d<a;d+=i){const u=t.slice(d,d+i),p=h,{committed:f}=await this.runMutation(e,n(u),{...s.importId===void 0?{}:{mutationId:`${s.importId}:${String(p)}`},shardKey:s.shardKey});h+=1,o+=u.length,f&&(c+=u.length),s.onProgress?.({done:o,total:a})}return{chunks:h,imported:c,queued:o-c}}async shardTraffic(e){return yi(this.adminHost,e)}async listScheduledJobs(){return vi(this.adminHost)}async schedulerStatus(){return gi(this.adminHost)}async cancelScheduledJob(e){return Ti(this.adminHost,e)}async listDeadJobs(){return ki(this.adminHost)}async retryDeadJob(e){return Ci(this.adminHost,e)}async removeDeadJob(e){return wi(this.adminHost,e)}async listWorkflowInstances(e){return Ai(this.adminHost,e)}async getWorkflowInstance(e){return Ei(this.adminHost,e)}async setWorkflowInstanceStatus(e){return _i(this.adminHost,e)}subscribeScheduledJobs(e){if(this.assertOpen(),this.WebSocketImpl===void 0)return()=>{};const t=this.openSupplementarySocket(C(ue(this.url),Bt),{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(n=>ae(n))))}});return t.close}async listFunctions(){return si(this.adminHost)}async getCronJobs(){return ii(this.adminHost)}async runCronJob(e){return ri(this.adminHost,e)}async fetchOpenApi(){return ni(this.adminHost)}async fetchArchitecture(){return oi(this.adminHost)}async fetchOpenRpc(){return ai(this.adminHost)}async listStorageObjects(e={}){return Ii(this.adminHost,e)}async deleteStorageObject(e,t){return Oi(this.adminHost,e,t)}async listStorageBuckets(){return Ri(this.adminHost)}async uploadStorageObject(e){return Pi(this.adminHost,e)}async signedStorageUrl(e,t){return Fi(this.adminHost,e,t)}async listGlobalTables(){return ci(this.adminHost)}async readGlobalTablePage(e){return di(this.adminHost,e)}async facetGlobalColumn(e){return hi(this.adminHost,e)}async listVectorIndexes(){return Li(this.adminHost)}async queryVectorIndex(e){return Mi(this.adminHost,e)}async queryLogArchive(e={}){return Si(this.adminHost,e)}async listKvNamespaces(){return ui(this.adminHost)}async listKvKeys(e){return li(this.adminHost,e)}async getKvValue(e){return fi(this.adminHost,e)}async putKvValue(e){return pi(this.adminHost,e)}async deleteKvKey(e){return mi(this.adminHost,e)}async listAuthUsers(e={}){this.assertOpen();const t=v(ds,{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(us,"POST",e)}async setAuthUserRole(e){return this.assertOpen(),await this.adminFetch(ls,"POST",e)}async banAuthUser(e){return this.assertOpen(),await this.adminFetch(fs,"POST",e)}async unbanAuthUser(e){return this.assertOpen(),await this.adminFetch(ps,"POST",e)}async setAuthUserPassword(e){this.assertOpen(),await this.adminFetch(ms,"POST",e)}async removeAuthUser(e){this.assertOpen(),await this.adminFetch(ys,"POST",e)}async impersonateAuthUser(e){return this.assertOpen(),await this.adminFetch(Ss,"POST",e)}async revokeAuthSession(e){this.assertOpen(),await this.adminFetch(bs,"POST",e)}async revokeAuthUserSessions(e){this.assertOpen(),await this.adminFetch(vs,"POST",e)}async getAuthCapabilities(){return this.assertOpen(),await this.adminFetch(gs,"GET")}async updateAuthUser(e){return this.assertOpen(),await this.adminFetch(Ts,"POST",e)}async listAuthAccounts(e){return this.assertOpen(),await this.adminFetch(v(ks,{userId:e.userId}),"GET")}async unlinkAuthAccount(e){this.assertOpen(),await this.adminFetch(Cs,"POST",e)}async listAuthPasskeys(e){return this.assertOpen(),await this.adminFetch(v(ws,{userId:e.userId}),"GET")}async deleteAuthPasskey(e){this.assertOpen(),await this.adminFetch(As,"POST",e)}async disableAuthTwoFactor(e){this.assertOpen(),await this.adminFetch(Es,"POST",e)}async listAuthOrganizations(e={}){return this.assertOpen(),await this.adminFetch(v(_s,{limit:e.limit,offset:e.offset}),"GET")}async listAuthOrgMembers(e){this.assertOpen();const t=v(Is,{limit:e.limit,offset:e.offset,organizationId:e.organizationId});return await this.adminFetch(t,"GET")}async listAuthOrgInvitations(e){this.assertOpen();const t=v(Os,{limit:e.limit,offset:e.offset,organizationId:e.organizationId});return await this.adminFetch(t,"GET")}async listAuthSignUpInvitations(e={}){this.assertOpen();const t=v(Ls,{limit:e.limit,offset:e.offset});return await this.adminFetch(t,"GET")}async createAuthSignUpInvitation(e){return this.assertOpen(),await this.adminFetch(Ms,"POST",e)}async revokeAuthSignUpInvitation(e){this.assertOpen(),await this.adminFetch(Hs,"POST",e)}async removeAuthOrgMember(e){this.assertOpen(),await this.adminFetch(Rs,"POST",e)}async cancelAuthOrgInvitation(e){this.assertOpen(),await this.adminFetch(Ps,"POST",e)}async getAuthConfig(){return this.assertOpen(),await this.adminFetch(Fs,"GET")}async createAuthOrganization(e){return this.assertOpen(),await this.adminFetch(Us,"POST",e)}async updateAuthOrganization(e){return this.assertOpen(),await this.adminFetch(Ns,"POST",e)}async deleteAuthOrganization(e){this.assertOpen(),await this.adminFetch(xs,"POST",e)}async addAuthOrgMember(e){return this.assertOpen(),await this.adminFetch(Ws,"POST",e)}async inviteAuthOrgMember(e){return this.assertOpen(),await this.adminFetch(Bs,"POST",e)}async setAuthOrgMemberRole(e){return this.assertOpen(),await this.adminFetch(Ds,"POST",e)}async listAuthOrgTeams(e){this.assertOpen();const t=v(Qs,{limit:e.limit,offset:e.offset,organizationId:e.organizationId});return await this.adminFetch(t,"GET")}async createAuthOrgTeam(e){return this.assertOpen(),await this.adminFetch(qs,"POST",e)}async updateAuthOrgTeam(e){return this.assertOpen(),await this.adminFetch(Ks,"POST",e)}async removeAuthOrgTeam(e){this.assertOpen(),await this.adminFetch(js,"POST",e)}async listAuthOrgTeamMembers(e){this.assertOpen();const t=v(Gs,{limit:e.limit,offset:e.offset,teamId:e.teamId});return await this.adminFetch(t,"GET")}async addAuthOrgTeamMember(e){return this.assertOpen(),await this.adminFetch($s,"POST",e)}async removeAuthOrgTeamMember(e){this.assertOpen(),await this.adminFetch(Vs,"POST",e)}async listAuthOrgRoles(e){this.assertOpen();const t=v(zs,{limit:e.limit,offset:e.offset,organizationId:e.organizationId});return await this.adminFetch(t,"GET")}async createAuthOrgRole(e){return this.assertOpen(),await this.adminFetch(Js,"POST",e)}async updateAuthOrgRole(e){return this.assertOpen(),await this.adminFetch(Ys,"POST",e)}async deleteAuthOrgRole(e){this.assertOpen(),await this.adminFetch(Xs,"POST",e)}async listAuthSessions(e={}){this.assertOpen();const t=v(hs,{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 n=t??{},a=E.key(e.__lunoraRef,n,i.shardKey);let o=this.subscriptions.get(a);const c=$(s),h=$(i.onError),d=$(i.onCheckpoint);if(!o){this.nextSubId+=1;const m=`sub_${this.nextSubId.toString()}`,b=he(n),y=this.takeHydratedCache(e.__lunoraRef,b,i.shardKey);o={acked:!1,args:n,argsKey:b,callbacks:new Set,checkpointCallbacks:new Set,errorCallbacks:new Set,fn:e,id:m,lastValue:y?.value,optimisticLayers:[],serverBase:y?.value,serverCursor:y?.serverCursor,shardKey:i.shardKey,valueReceived:!1,wireArgs:w(n,`args for '${e.__lunoraRef}'`),...y?.serverEpoch===void 0?{}:{serverEpoch:y.serverEpoch}},this.subscriptions.add(o),this.emitSyncStatus(),y!==void 0&&this.cacheSeededQueries.set(a,y)}if(o.callbacks.add(c),h&&o.errorCallbacks.add(h),d&&o.checkpointCallbacks.add(d),o.lastValue!==void 0)try{c(o.lastValue)}catch{}this.ensureSocket(i.shardKey),this.sendSubscribeIfOpen(o);const u=o;let p=!1;const f=()=>{if(!p&&(p=!0,i.signal?.removeEventListener("abort",f),u.callbacks.delete(c),h&&u.errorCallbacks.delete(h),d&&u.checkpointCallbacks.delete(d),u.callbacks.size===0)){this.sendOrQueueUnsubscribe(u.shardKey,u.id,"unsubscribe"),this.returnCacheSeed(E.keyOf(u)),this.subscriptions.remove(u);const m=this.getConnection(u.shardKey);m&&this.settleSubscribeWatchdog(m,u.id),this.releaseIdleShard(u.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:a}=s;return a!==void 0&&queueMicrotask(()=>{a({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()}`,n={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:w(e.args,`shape args for '${e.name}'`)};return this.shapeSubscriptions.set(i,n),this.emitSyncStatus(),this.ensureSocket(s.shardKey),this.sendShapeSubscribeIfOpen(n),()=>{this.shapeSubscriptions.delete(i),this.sendOrQueueUnsubscribe(n.shardKey,i,"shape_unsubscribe"),this.releaseIdleShard(n.shardKey),this.emitSyncStatus()}}stream(e,t,s={}){if(this.assertOpen(),this.WebSocketImpl===void 0)throw new S("INTERNAL","LunoraClient: streams require a WebSocket implementation");this.nextStreamId+=1;const i=`stream_${this.nextStreamId.toString()}`,{shardKey:n}=s,a=t??{},{handle:o,iterable:c}=kt({maxBuffer:s.maxBuffer,onCancel:()=>{this.cancelStream(i,n)}});this.ensureSocket(n);const h=this.getConnection(n),d={id:i,query:{args:w(a,`stream args for '${e.__lunoraRef}'`),functionPath:e.__lunoraRef,shardKey:n},type:"stream"},u={durable:s.durable===!0,generation:void 0,handle:o,lastSeq:0,message:d,shardKey:n};this.streams.set(i,u);const p=h?.wsState==="open"&&T(h,d);if(!p&&h===void 0)return this.forgetStream(i),o.fail(new S("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(h.pendingStreams=h.pendingStreams??[];h.pendingStreams.length>=tt;){const m=h.pendingStreams.shift()?.id,b=m?this.streams.get(m):void 0;b&&(b.handle.fail(new S("STREAM_QUEUE_OVERFLOW","stream-start frame evicted while socket was unreachable")),this.forgetStream(m))}h.pendingStreams.push(d)}return c}httpStream(e,t,s={}){if(this.closed)throw new S("CLIENT_CLOSED","LunoraClient is closed");if(!this.fetchImpl)throw new S("INTERNAL","LunoraClient: no `fetch` implementation available");const i={...this.authToken?{authorization:`Bearer ${this.authToken}`}:{},...s.headers};return ut(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 S("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 S("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 S("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())},st))}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,n]of this.streams)l(n.shardKey)===t&&(n.handle.fail(new S("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,L(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,n)=>{this.ackAndAdvanceCursor(s,i,n)},subscription:s=>this.subscriptions.get(s)};return new ct({channelName:e,onBecomeLeader:()=>{sr(t)},onStopBeingLeader:()=>{ir(t)},onConnectionStatus:(s,i)=>{rr(t,s,i)},onSubscriptionData:(s,i,n,a,o)=>{or(t,s,i,n,a,o)},onLeaderClaimAnswered:()=>{nr(t)},onSubscriptionError:(s,i,n)=>{ar(t,s,i,n)},onSubscriptionSettled:(s,i,n,a,o,c)=>{cr(t,s,i,n,a,o,c)}})}async sendBatch(e,t){if(this.assertOpen(),!this.fetchImpl)throw new S("INTERNAL","LunoraClient: no `fetch` implementation available");if(e.length===0)return[];const s=await this.fetchImpl(C(this.url,z),{body:JSON.stringify({calls:e.map((o,c)=>({args:w(o.args??{},`args for batch call '${o.fn.__lunoraRef}'`),functionPath:o.fn.__lunoraRef,id:c,shardKey:o.shardKey}))}),headers:this.rpcRequestHeaders({attachBookmark:!0}),method:"POST",signal:t}),i=s.headers.get("x-d1-bookmark");i&&this.bookmark.set(i);let n;try{n=await s.json()}catch{throw new S("INTERNAL",`LunoraClient: batch response was not JSON (status ${s.status.toString()})`)}const a=D(n);if(!s.ok||a!==void 0&&!n.results)throw a!==void 0?je(a):new S("INTERNAL",`LunoraClient: batch request failed (status ${s.status.toString()})`);for(const o of n.results??[]){const c=o.body?.commitCursor;typeof o.id=="number"&&typeof c=="number"&&this.recordShardCursor(e[o.id]?.shardKey,c)}return Hi(n.results??[],e.length)}async runMutation(e,t,s){this.assertOpen();const i=t,n=s.mutationId??Se();this.mutationIssueCounter+=1;const a=this.mutationIssueCounter,o=this.takeReplayCredential(s.replayCredential),c=s.replayBaseline===void 0?this.baselineCursorFor(s.shardKey):s.replayBaseline??void 0,{confirms:h,rollbacks:d}=this.applyOptimisticUpdates(e.__lunoraRef,i,s.shardKey,s.optimistic);s.optimisticUpdate&&this.applyOptimisticUpdate(s.optimisticUpdate,t,s.shardKey,d,h);const u=this.offlineFlushes.get(l(s.shardKey));u!==void 0&&await u;const{hasSocket:p,idleClosed:f,polling:m,wasEverConnected:b,wsState:y}=this.connectionGateState(s.shardKey),{queueBeforeFirstConnect:O}=this.offlineQueue,g=b||O,H=this.WebSocketImpl!==void 0&&g,ce=m||f,Ne=y==="connecting"&&g&&!ce,xe=y!=="open"&&!p&&H&&!ce,We=H&&s.replayBaseline===void 0&&this.hasPendingWriteAhead(s.shardKey),de=async(A=!1)=>this.enqueueOfflineMutation(e,i,s.shardKey,c,n,d,h,A?void 0:s.precondition,s.mutationId,o?.stamp,A,a);if(xe||Ne||We)return de();let G;try{const A=await this.rpc(e.__lunoraRef,i,s.shardKey,{baselineSeq:c,captureBookmark:!0,...o?.flags,mutationId:n,onCommitCursor:U=>{G=U}});for(const U of h)U(G);return{committed:!0,value:A}}catch(A){if(H&&this.fetchImpl!==void 0&&!this.outbox&&s.replayBaseline===void 0&&(A instanceof TypeError||A instanceof M)&&ke(i)){const U=de(!0);return this.noteHeldRetryDelay(s.shardKey),this.scheduleRateLimitedRetry(s.shardKey),U}throw this.settleFailedDirectWrite(A,G,h,d,o?.flags.authToken),A}}settleFailedDirectWrite(e,t,s,i,n){if(this.noteIdentityMismatch(e),n!==void 0&&this.noteReplayAuthRefusal(e,n),K(e)){for(const a of s)a(t);return}N(i)}async enqueueOfflineMutation(e,t,s,i,n,a,o,c,h,d,u,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:h??`${this.clientId}:${String(b)}`,identity:f,mutationId:b,...a.length>0&&{onRejected:()=>{N(a)}},shardKey:s})}catch(y){throw N(a),y instanceof Error?y:new Error(String(y))}for(const y of o)y(void 0);return{committed:!1,value:void 0}}return{committed:!0,value:await new Promise((b,y)=>{const O={ambiguousSend:u,args:t,functionPath:e.__lunoraRef,liveAwaiter:!0,baselineSeq:i,id:n,issueSeq:p,clientId:this.clientId,identity:f,precondition:c,onCommit:g=>{for(const H of o)H(g)},reject:g=>{this.queuedIdentities.delete(n),K(g)||N(a),y(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(P(s.fn.__lunoraRef,s.argsKey,s.shardKey),s);for(const{key:s,...i}of e){if(St(this.persistenceVersion,i.version)){this.queryCache.remove(s).catch(()=>{});continue}const n=t.get(s);if(n&&this.cachedQueryMatchesIdentity(i)){this.seedSubscriptionFromCache(n,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(P(e.fn.__lunoraRef,e.argsKey,e.shardKey),t),F(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,F(s,void 0)),this.hydratedQueryCache.set(e,t)}this.cacheSeededQueries.clear()}}takeHydratedCache(e,t,s){const i=P(e,t,s),n=this.hydratedQueryCache.get(i);if(!(n===void 0||!this.cachedQueryMatchesIdentity(n)))return this.hydratedQueryCache.delete(i),n}reseedFromHydratedCache(){if(this.hydratedQueryCache.size!==0)for(const e of this.subscriptions.all()){const t=P(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=P(e.fn.__lunoraRef,e.argsKey,e.shardKey),i=this.getConnection(e.shardKey)?.identity,n=i===void 0?this.identityFingerprint():i;n===null&&this.identityUnresolved()||(this.pendingCacheWrites.set(s,{identity:n,serverCursor:e.serverCursor,ts:Date.now(),value:t,...n===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(()=>{})},it))}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 o of this.subscriptions.all())l(o.shardKey)===t&&(ke(o.args)?s.push(o):(this.markQueryRejected(o,!0),I(o.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=mt(),n=this.identityFingerprint();let a;try{a=await we(async o=>this.sendBatch(s.map(c=>({args:c.args,fn:c.fn,shardKey:c.shardKey})),o))}catch(o){return!(o instanceof TypeError)}if(this.identityFingerprint()!==n)return!0;for(const[o,c]of s.entries()){const h=a[o];if(h!==void 0){if(!h.ok){this.markQueryRejected(c,!0),I(c.errorCallbacks,{code:h.error.code,message:h.error.message});continue}this.handleDataMessage({data:B(h.value),id:c.id,type:"data"},i)}}return!0}async probeOrigin(){const{fetchImpl:e}=this;if(!e)return!1;try{return await we(async t=>e(C(this.url,z),{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 n=[],a=[];if(!i)return{confirms:n,rollbacks:a};const o=E.key(e,t,s),c=this.subscriptions.get(o);if(c){const h=lt(c,i);h&&(n.push(h.confirm),a.push(h.rollback))}return{confirms:n,rollbacks:a}}applyOptimisticUpdate(e,t,s,i,n){const{confirms:a,rollbacks:o,store:c}=ft(this.subscriptions,s);try{e(c,t)}catch{N(o);return}i.push(...o),n.push(...a)}getConnection(e){return this.connections.get(l(e))}sendOrQueueUnsubscribe(e,t,s){const i=this.getConnection(e);i&&!T(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:Bi({afterFailedAttempts:this.pollingFallbackAfterFailedAttempts,intervalMs:this.pollingFallbackIntervalMs,onReachable:()=>{this.flushOfflineQueue(e).catch(()=>{})},onStateChange:()=>{this.emitConnectionStatus()},poll:async()=>this.pollSubscriptions(e)}),reconnect:ve(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=ve(this.reconnectOptions),i={connectTimer:void 0,heartbeatTimer:void 0,lastFrameAt:0,socket:void 0};let n,a=!1;const o=()=>{a||this.closed||(n=setTimeout(d,s.next()))},c=f=>{a||this.WebSocketImpl===void 0||Ce(i,this.wsUrlFor(t.shardKey,f,e),this.managedSocketOptions,{onClose:()=>{o(),t.onClose?.()},onMessage:t.onMessage,...t.onOpen===void 0?{}:{onOpen:t.onOpen}})},h=async f=>{const m=this.wsTokenGeneration;let b;try{b=await f()}catch{o();return}if(m!==this.wsTokenGeneration){d();return}c(b)},d=()=>{if(a||this.WebSocketImpl===void 0)return;const{wsToken:f}=this;if(typeof f=="function"){h(f).catch(()=>{});return}c(f)};d();const u=()=>{a=!0,n!==void 0&&(clearTimeout(n),n=void 0),i.connectTimer!==void 0&&(clearTimeout(i.connectTimer),i.connectTimer=void 0),L(i);const{socket:f}=i;i.socket=void 0;try{f?.close()}catch{}};this.adminSocketTeardowns.add(u);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),L(i);try{f.close()}catch{}t.onClose?.(),o()}};return this.supplementaryBounces.add(p),{close:()=>{u(),this.adminSocketTeardowns.delete(u),this.supplementaryBounces.delete(p)},resetBackoff:()=>{s.reset()},socket:()=>i.socket}}supplementaryUrl(e){const t=le(this.wsUrl),s=t.pathname.endsWith(J)?t.pathname.slice(0,-J.length):t.pathname;return t.pathname=C(s,e),fe(t,this.wsUrl)}wsUrlFor(e,t,s=this.wsUrl){if(e===void 0&&t===void 0)return s;const i=le(s),n=new Set([...e===void 0?[]:["shard"],...t===void 0?[]:["token"]]),a=[...i.searchParams].filter(([o])=>!n.has(o)).map(([o,c])=>`${encodeURIComponent(o)}=${encodeURIComponent(c)}`);return e!==void 0&&a.push(`shard=${encodeURIComponent(e)}`),t!==void 0&&a.push(`token=${encodeURIComponent(t)}`),i.search=a.join("&"),fe(i,s)}rpcRequestHeaders(e,t){const s={"content-type":"application/json"};e.expectSubject!==void 0&&(s[Et]=_t(e.expectSubject));const i=this.shardCursors.get(this.cursorKeyFor(t));i!==void 0&&(s["x-lunora-min-seq"]=i.toString());const n=e.authToken===void 0?this.authToken:e.authToken;if(n&&(s.authorization=`Bearer ${n}`),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 a=this.bookmark.get();a&&(s["x-d1-bookmark"]=a)}return s}async rpc(e,t,s,i={}){const{fetchImpl:n}=this;if(!n)throw new M("LunoraClient: no `fetch` implementation available");const a=this.rpcRequestHeaders(i,s),o=i.authToken===void 0?this.authToken:i.authToken,c=JSON.stringify({args:w(t,`args for '${e}'`),functionPath:e,shardKey:s}),{body:h,response:d}=await W(i.unbounded?0:this.rpcTimeoutMs,i.signal,async f=>{const m=await n(C(this.url,Ut),{body:c,headers:a,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(h===void 0)throw x(d.status,d.statusText,d.headers.get("retry-after"));const u=h;if(typeof u!="object"||u===null||Array.isArray(u))throw x(d.status,d.statusText,d.headers.get("retry-after"));const p=D(h);if(p!==void 0)throw pe(p,d.headers.get("retry-after"));if(!d.ok)throw x(d.status,d.statusText,d.headers.get("retry-after"));i.onMutationAck?.(h.lastMutationId),i.onCommitCursor?.(h.commitCursor),this.noteCredentialAccepted(o),this.learnDefaultShardKey(d,s),this.recordShardCursor(s,h.commitCursor);try{return k(h.result)}catch(f){throw Le(f)}}async adminFetch(e,t,s,i){if(!this.fetchImpl)throw new S("INTERNAL","LunoraClient: no `fetch` implementation available");const n={};this.authToken&&(n.authorization=`Bearer ${this.authToken}`);const a=s instanceof ArrayBuffer||s instanceof Blob;let o;s===void 0?o=void 0:a?(o=s,i!==void 0&&(n["content-type"]=i)):(o=JSON.stringify(s),n["content-type"]="application/json");const c=await this.fetchImpl(C(this.url,e),{body:o,headers:n,method:t});let h;try{h=await c.json()}catch{const u=c.statusText?` ${c.statusText}`:"";throw new S("INTERNAL",`LunoraClient: response was not JSON (status ${c.status.toString()}${u})`)}const d=D(h);if(d!==void 0){const u=new Error(d.message??"admin request failed");throw Object.assign(u,{code:d.code},Ge(d)),u}if(!c.ok){const u=c.statusText?` ${c.statusText}`:"";throw new S("INTERNAL",`LunoraClient: admin request failed (status ${c.status.toString()}${u})`)}return h}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));T(e,{caps:hr,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,n=Symbol("ws-token-attempt");let a;e.providerAttempt=n;try{a=await W(this.connectTimeoutMs,void 0,async()=>s(),()=>new Error("LunoraClient: wsToken provider timed out"))}catch{e.providerAttempt===n&&(e.providerAttempt=void 0,this.handleDisconnect(e));return}if(e.providerAttempt===n&&(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,a)}}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,Ce(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()},ye),this.markShardPendingAck(t,!0),this.emitConnectionStatus(),this.sendConnectEnvelope(e),this.clearResubscribeQueue(e);for(const a of this.subscriptions.all())l(a.shardKey)===l(t)&&this.queueResubscribe(a);if(this.resendShapeSubscriptions(t),e.pendingUnsubscribes.length>0){const a=e.pendingUnsubscribes;e.pendingUnsubscribes=[];for(const{id:o,type:c}of a)T(e,{id:o,type:c});this.releaseIdleShard(t)}Ui(e);const i=l(t),n=this.whisperHandlers.get(i);if(this.dropWhisperJoinWaiters(i),this.whisperJoins.set(i,new Map),n)for(const a of n.keys())this.sendWhisperJoin(e,i,a);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),T(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(),L(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,n]of this.streams)if(!(l(n.shardKey)!==l(e.shardKey)||t.has(i))){if(n.durable){const a={...n.message,...n.generation===void 0?{}:{generation:n.generation},sinceChunk:n.lastSeq};n.message=a,e.pendingStreams=[...(e.pendingStreams??[]).filter(o=>o.id!==i),a];continue}n.handle.fail(new S("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<rt;){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,n=T(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 n&&!t&&this.armUnackedWatchdog(s,e),n}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)},nt))}sendShapeSubscribeIfOpen(e){const t=this.getConnection(e.shardKey);t?.wsState==="open"&&T(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=xi(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 n=this.getConnection(t);if(n){const{id:a}=i;this.settleSubscribeWatchdog(n,a)}}switch(i.type){case"ack":{const n=this.subscriptions.getById(i.id);n&&this.ackAndAdvanceCursor(n,void 0,void 0);return}case"chunk":{const{data:n,generation:a,id:o,seq:c}=i,h=this.streams.get(o);h&&typeof c=="number"&&(h.lastSeq=c,typeof a=="number"&&(h.generation=a),h.durable=!0),h?.handle.push(k(n));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($e(e)),this.forgetStream(s);return}const n=s===void 0?void 0:this.subscriptions.getById(s);if(n){const o=me(e),c=this.identityFingerprint(),h=E.keyOf(n);this.markQueryRejected(n),I(n.errorCallbacks,o),this.tabCoordinator?.isLeader()&&this.tabCoordinator.broadcastSubscriptionError(h,o,c);return}const a=s===void 0?void 0:this.shapeSubscriptions.get(s);a&&(a.answered||(a.answered=!0,this.emitSyncStatus()),I(a.errorCallbacks,me(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){Zi(this.shapeSubscriptions,s);for(const i of s.parts.keys()){const n=this.shapeSubscriptions.get(i);n&&!s.undecodable.has(i)&&this.applyPokePart(n,s,e)}}}applyPokePart(e,t,s){const i=e.answered,n=Xi(e,t,s);if(e.answered!==i&&this.emitSyncStatus(),Ee(e),n==="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"&&er(i,e))return;let n;try{n=Be(e,i.serverBase)}catch(o){I(i.errorCallbacks,{code:"WIRE_DECODE_FAILED",message:`could not decode a server frame for this subscription — ${o instanceof Error?o.message:String(o)}`});return}if(n===De){this.resnapshotSubscription(i);return}this.dropCacheSeed(E.keyOf(i));const a=t!==void 0&&!i.valueReceived;if(Me(i,n,{cursor:e.cursor,epoch:e.epoch}),a&&(i.valueReceived=!0,this.emitSyncStatus()),e.lastMutationId!==void 0&&(se(i,e.lastMutationId),ie(i,!0)),this.persistQueryValue(i),ee(i,i.serverCursor),t!==void 0&&pt(i,t),F(i,n),this.tabCoordinator?.isLeader()){const o=E.keyOf(i);this.tabCoordinator.broadcastSubscriptionData(o,n,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=E.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),ee(e,e.serverCursor)&&F(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),n=this.liveSocketGrants.get(i)?.get(t);if(n===void 0)return;const{stream:a,topic:o}=n,c=()=>{this.liveSocketGrants.get(i)?.get(t)===void 0||this.getConnection(e)?.connectionId!==s||this.postLiveControl(`/live/${a}/control`,e,{action:"subscribe",connectionId:s,stream:a,subscriptionId:t,topic:o},d=>{this.refuseLiveGrant(e,t,d,s)})};this.getConnection(e)?.whisperAck===!0?this.whenWhisperJoined(i,o,c):c()}sendWhisperJoin(e,t,s){const i=this.whisperJoinState(t,s);i.pending+=1,i.joined=!1,T(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 n of i.waiters.splice(0))clearTimeout(n.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 n={run:s,timer:void 0};n.timer=setTimeout(()=>{i.waiters=i.waiters.filter(a=>a!==n),s()},He),i.waiters.push(n)}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 n=l(e),a=this.liveSocketGrants.get(n),o=a?.get(t);a===void 0||o===void 0||this.getConnection(e)?.connectionId!==i||(a.delete(t),a.size===0&&this.liveSocketGrants.delete(n),o.release(),o.onError?.({status:s,topic:o.topic}))}postLiveControl(e,t,s,i){const{fetchImpl:n}=this;if(!n)return;const a=JSON.stringify(t===void 0?s:{...s,shardKey:t}),o=this.rpcRequestHeaders({},t);this.liveControlChain=this.liveControlChain.then(()=>lr(n,C(this.url,e),a,o)).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=k(e.data);for(const n of s.values())if(!(n.stream!==e.stream||n.topic!==e.topic))try{n.onEvent(i)}catch{}}dispatchWhisper(e,t){const s=this.whisperHandlers.get(l(t))?.get(e.topic);if(!s)return;const i=k(e.data);for(const n of s)try{n(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 n=e.charCodeAt(i);t^=n,t=Math.imul(t,16777619),s=Math.imul(s,33)+n}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),n=i!==void 0&&T(i,{data:t,topic:e,type:"whisper"});return this.releaseIdleShard(s.shardKey),n}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 n=new Error("offline mutation discarded: auth identity changed before replay");n.code="OFFLINE_IDENTITY_CHANGED",i.reject(n),this.emitItemSettled(i,"rejected",n)}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 n=t??"",a=this.clientWatermarks.get(n);if(a===void 0)this.clientWatermarks.set(n,i);else for(const[o,c]of i)a.set(o,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,F(e,void 0);for(const e of this.shapeSubscriptions.values())e.rows.clear(),e.serverCursor=void 0,e.serverEpoch=void 0,e.answered=!1,Ee(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:n}=this;try{await this.drainOfflineQueue(e,n)}catch{}!this.closed&&this.authToken!==n&&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 u=new Error("offline mutation skipped: precondition failed before replay");u.code="OFFLINE_PRECONDITION_FAILED",this.emitItemSettled(d,"rejected",u)}const i=l(e),n=this.offlineQueue.drain(d=>l(d.shardKey)===i);if(n.length===0)return;const a=[],o=[];for(const d of n){const u=this.replayGateVerdict(d);u==="send"?a.push(d):u==="hold"&&o.push(d)}if(this.offlineQueue.requeue(o),o.length>0&&this.subjectAwaitingReconfirm()&&(this.getCurrentUser().catch(()=>{}),this.noteHeldRetryDelay(e)),a.length===0){this.scheduleRateLimitedRetry(e);return}const c=this.encodableOrSettleTerminal(a);if(c.length===0){this.scheduleRateLimitedRetry(e);return}if(c.length===1){await this.replaySequential(c,e,t),this.scheduleRateLimitedRetry(e);return}const h=[];for(let d=0;d<c.length;d+=V){const u=c.slice(d,d+V),p=await this.replayBatched(u,e,t);if(h.push(...p.requeue),p.stop||p.requeue.length>0){h.push(...c.slice(d+V));break}}h.length>0&&this.offlineQueue.requeue(h),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),n=this.replayRetryState.get(i),a=(n?.attempts??0)+1,o=ji(t,a)??(s===null&&Q(t)?te(a):void 0);this.replayRetryState.set(i,{attempts:a,delayMs:o===void 0?n?.delayMs:Math.max(n?.delayMs??0,o)})}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 n=this.replayRetryTimers.get(t);n!==void 0&&clearTimeout(n),this.replayRetryTimers.set(t,setTimeout(()=>{this.replayRetryTimers.delete(t),this.flushOfflineQueue(e).catch(()=>{})},i))}encodableOrSettleTerminal(e){const t=[];for(const s of e)try{w(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)||Ae(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,...Y(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"||!Ae(t))return!1;const i=(this.replayAttempts.get(e.id)??0)+1;return this.replayAttempts.set(e.id,i),i>=ot}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 n=e[i];if(!n)continue;let a;try{const o=await this.rpc(n.functionPath,n.args,n.shardKey,{authToken:s,baselineSeq:n.baselineSeq,captureBookmark:!0,clientId:n.clientId??this.clientId,...Y(n.identity,s),mutationId:n.id,onCommitCursor:c=>{a=c}});this.settleReplaySuccess(n,o,a)}catch(o){if(K(o)){this.settleReplayUndecodable(n,o,a);continue}if(!this.shouldRequeueReplayFailure(o,s)||this.spendsLastReplayAttempt(n,o)){this.settleReplayTerminal(n,o);continue}this.noteReplayRetryDelay(t,o,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,u)=>({args:w(d.args,`args for '${d.functionPath}'`),baselineSeq:d.baselineSeq,functionPath:d.functionPath,id:u,clientId:d.clientId??this.clientId,mutationId:d.id,shardKey:d.shardKey}))});if(e.length>1&&$i(i)>Gi)return await this.replayBatchedHalves(e,t,s);const{fetchImpl:n}=this;let a,o;try{({payload:o,response:a}=await W(this.rpcTimeoutMs,void 0,async d=>{const u=await n(C(this.url,z),{body:i,headers:this.rpcRequestHeaders({attachBookmark:!0,authToken:s,...Y(e.find(p=>p.identity!==void 0)?.identity,s)}),method:"POST",signal:d});if(u.status===413&&e.length>1)return{payload:void 0,response:u};try{return{payload:await u.json(),response:u}}catch{return{payload:void 0,response:u}}}))}catch(d){return this.noteReplayRetryDelay(t,d,s),{requeue:this.keepUnexhaustedAmbiguousWrites(e,d),stop:!0}}const c=a.headers.get("x-d1-bookmark");if(c&&this.bookmark.set(c),a.status===413&&e.length>1)return await this.replayBatchedHalves(e,t,s);const h=a.headers.get("retry-after");if(!o)return this.settleWholeBatchError(e,x(a.status,a.statusText,h),t,s);if(!Array.isArray(o.results)){const d=D(o),u=d===void 0?x(a.status,a.statusText,h):pe(d,h);return this.settleWholeBatchError(e,u,t,s)}return{requeue:this.settleReplayBatchSlots(e,o.results,t,s),stop:!1}}settleWholeBatchError(e,t,s,i){if(t instanceof M||t.code!==void 0&&this.shouldRequeueReplayFailure(t,i))return this.noteReplayRetryDelay(s,t,i),{requeue:this.keepUnexhaustedAmbiguousWrites(e,t),stop:!0};for(const n of e)this.settleReplayTerminal(n,t);return{requeue:[],stop:!1}}async replayBatchedHalves(e,t,s){const i=Math.ceil(e.length/2),n=await this.replayBatched(e.slice(0,i),t,s);if(n.stop||n.requeue.length>0)return{requeue:[...n.requeue,...e.slice(i)],stop:!0};const a=await this.replayBatched(e.slice(i),t,s);return{requeue:[...n.requeue,...a.requeue],stop:a.stop}}settleReplayBatchSlots(e,t,s,i){const n=Vi(t),a=[];let o=!1,c=!1;for(const[h,d]of e.entries()){const u=zi(n.get(h));switch(u.kind){case"committed":{o=!0,this.settleReplaySuccess(d,u.value,u.commitCursor);break}case"errored":{c||=Q(u.error),this.shouldRequeueReplayFailure(u.error,i)&&!this.spendsLastReplayAttempt(d,u.error)?(this.noteReplayRetryDelay(s,u.error,i),a.push(d)):this.settleReplayTerminal(d,u.error);break}case"unanswered":{const p=Ve();if(this.spendsLastReplayAttempt(d,p)){this.settleReplayTerminal(d,p);break}this.noteReplayRetryDelay(s,p,i),a.push(d);break}default:o=!0,this.settleReplayUndecodable(d,u.error,u.commitCursor)}}return o&&!c&&this.noteCredentialAccepted(i),a}}export{Ue as LunoraClient};