@lunora/client 1.0.0-alpha.138 → 1.0.0-alpha.139
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/auth/index.d.mts +1 -1
- package/dist/auth/index.d.ts +1 -1
- package/dist/auth/index.mjs +1 -1
- package/dist/index.d.mts +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.mjs +1 -1
- package/dist/packem_shared/LunoraClient-DSEbwI7V.mjs +1 -0
- package/dist/packem_shared/{SubscriptionRegistry-CS-AFUI9.mjs → SubscriptionRegistry-C3kLqped.mjs} +1 -1
- package/dist/packem_shared/applyDelta-CIjpZ5h9.mjs +1 -0
- package/dist/packem_shared/{createAsyncStorageQueryCache-BfZkthAE.mjs → createAsyncStorageQueryCache-Dpszf7UD.mjs} +1 -1
- package/dist/packem_shared/createLocalStore-0ARUZ892.mjs +1 -0
- package/dist/packem_shared/{createServerClient-C0jOZaix.mjs → createServerClient-DqNe__QI.mjs} +1 -1
- package/dist/packem_shared/{createSnapshotPrecondition-GRVKxPsh.mjs → createSnapshotPrecondition-5GQ_5fFu.mjs} +1 -1
- package/dist/packem_shared/{delta-merge-vxvH3PvF.mjs → delta-merge-D_5ChS-C.mjs} +1 -1
- package/dist/packem_shared/{deserializePreloaded-C6NTQdFa.mjs → deserializePreloaded-Bffy70Wm.mjs} +1 -1
- package/dist/packem_shared/{httpStream-BWdNJzId.mjs → httpStream-v4etRV7m.mjs} +1 -1
- package/dist/packem_shared/{local-store-CWeFEk6w.mjs → local-store-DDppw8Qr.mjs} +1 -1
- package/dist/packem_shared/{lunora-client.d-DWo4CzIH.d.mts → lunora-client.d-CxU0UvII.d.mts} +150 -15
- package/dist/packem_shared/{lunora-client.d-WFeiiO0Z.d.ts → lunora-client.d-DlMXZMfR.d.ts} +150 -15
- package/dist/packem_shared/{preload.d-CVB-TzK6.d.ts → preload.d-BNFe_NYM.d.ts} +1 -1
- package/dist/packem_shared/{preload.d-6E3-9j1g.d.mts → preload.d-C3Nbhx4m.d.mts} +1 -1
- package/dist/packem_shared/wire-codec-BeIi1K-T.mjs +1 -0
- package/dist/packem_shared/{wire-key-HsUDTlQ7.mjs → wire-key-DCPYV4t8.mjs} +1 -1
- package/dist/query/index.d.mts +2 -2
- package/dist/query/index.d.ts +2 -2
- package/dist/service.mjs +1 -1
- package/dist/ssr/index.d.mts +2 -2
- package/dist/ssr/index.d.ts +2 -2
- package/dist/ssr/index.mjs +1 -1
- package/package.json +2 -2
- package/dist/packem_shared/LunoraClient-Cj6Z6KeC.mjs +0 -1
- package/dist/packem_shared/applyDelta-DwcQmRsV.mjs +0 -1
- package/dist/packem_shared/createLocalStore-BmKEBUWU.mjs +0 -1
- package/dist/packem_shared/wire-codec-Sw1rAu-Z.mjs +0 -1
package/dist/auth/index.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { U as User, L as LunoraClient } from "../packem_shared/lunora-client.d-
|
|
1
|
+
import { U as User, L as LunoraClient } from "../packem_shared/lunora-client.d-CxU0UvII.mjs";
|
|
2
2
|
import '@lunora/errors';
|
|
3
3
|
import "../packem_shared/function-reference.d-Br_hsKje.mjs";
|
|
4
4
|
import '@lunora/runtime';
|
package/dist/auth/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { U as User, L as LunoraClient } from "../packem_shared/lunora-client.d-
|
|
1
|
+
import { U as User, L as LunoraClient } from "../packem_shared/lunora-client.d-DlMXZMfR.js";
|
|
2
2
|
import '@lunora/errors';
|
|
3
3
|
import "../packem_shared/function-reference.d-Br_hsKje.js";
|
|
4
4
|
import '@lunora/runtime';
|
package/dist/auth/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
const
|
|
1
|
+
const b=["authenticated","loading","unauthenticated","unreachable"],y=t=>t==="authenticated"||t==="unreachable",A=t=>t==="loading",f=new WeakMap,S=t=>{const n=new Set;let u=null,s="loading",c=!1,h=!1,a;const g=()=>{for(const e of n)e()};let i=0;const r=(e,o)=>{(s!==e||u!==o)&&(s=e,u=o,g())},l=(e=!1)=>{i+=1;const o=i;if(!e&&t.getAuthToken()===null&&h){r("unauthenticated",null);return}r(u===null?"loading":"authenticated",u),t.getCurrentUser().then(d=>{o===i&&(h=!0,r(d===null?"unauthenticated":"authenticated",d),d!==null&&a===`subj:${d.id}`&&(a=void 0))}).catch(()=>{a=void 0,o===i&&r("unreachable",u)})};return t.expectIdentityResolution(),t.onAuthTokenChange(()=>{l()}),t.onIdentityChange(()=>{if(!c||t.getAuthToken()!==null)return;const e=t.currentIdentity();e===null?r("unauthenticated",null):e!==a&&(a=e,l(!0))}),t.onConnectionStatus(e=>{e==="connected"&&s==="unreachable"&&l(!0)}),{getStatus:()=>s,getUser:()=>u,subscribe:e=>(n.add(e),c||(c=!0,l()),()=>{n.delete(e)})}},T=t=>{let n=f.get(t);return n||(n=S(t),f.set(t,n)),n};export{b as AUTH_STATUSES,T as getIdentityStore,y as isAuthenticatedStatus,A as isLoadingStatus};
|
package/dist/index.d.mts
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { 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, R as ReconnectOptions, L as LunoraClient } from "./packem_shared/lunora-client.d-
|
|
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 RowOp, type N as RpcEnvelope, type T as RpcResponseBody, type V as ScheduleRecord, type W as ScheduleRetryPolicy, type X as SchedulerPoolStatus, type Y as SchedulerStatus, type Z as ServerMessage, type _ as ServerPokeEndMessage, type $ as ServerPokePartMessage, type a0 as ServerPokeStartMessage, type a1 as ShardTrafficEntry, type a2 as ShardTrafficResult, type a3 as StorageListPage, type a4 as StorageObject, type a5 as StoredQuery, type a6 as StreamHandle, type a7 as SubscriptionCallback, type b as SubscriptionErrorCallback, a8 as SubscriptionRegistry, type a9 as SubscriptionState, type aa as SyncWatermark, type a as Unsubscribe, type U as User, type ab as WorkflowInstanceAction, type ac as WorkflowInstanceDetail, type ad as WorkflowInstancePage, type ae as WorkflowInstanceStatus, type af as WorkflowInstanceSummary, type ag as WorkflowStepDetail, type ah as WsTokenProvider, ai as createClientQuery, aj as createLocalStore, ak as createStream } from "./packem_shared/lunora-client.d-
|
|
1
|
+
import { 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, R as ReconnectOptions, L as LunoraClient } from "./packem_shared/lunora-client.d-CxU0UvII.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 RowOp, type N as RpcEnvelope, type T as RpcResponseBody, type V as ScheduleRecord, type W as ScheduleRetryPolicy, type X as SchedulerPoolStatus, type Y as SchedulerStatus, type Z as ServerMessage, type _ as ServerPokeEndMessage, type $ as ServerPokePartMessage, type a0 as ServerPokeStartMessage, type a1 as ShardTrafficEntry, type a2 as ShardTrafficResult, type a3 as StorageListPage, type a4 as StorageObject, type a5 as StoredQuery, type a6 as StreamHandle, type a7 as SubscriptionCallback, type b as SubscriptionErrorCallback, a8 as SubscriptionRegistry, type a9 as SubscriptionState, type aa as SyncWatermark, type a as Unsubscribe, type U as User, type ab as WorkflowInstanceAction, type ac as WorkflowInstanceDetail, type ad as WorkflowInstancePage, type ae as WorkflowInstanceStatus, type af as WorkflowInstanceSummary, type ag as WorkflowStepDetail, type ah as WsTokenProvider, ai as createClientQuery, aj as createLocalStore, ak as createStream } from "./packem_shared/lunora-client.d-CxU0UvII.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-
|
|
5
|
+
export { p as preloadQuery, a as preloadedQueryResult } from "./packem_shared/preload.d-C3Nbhx4m.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 { 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, R as ReconnectOptions, L as LunoraClient } from "./packem_shared/lunora-client.d-
|
|
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 RowOp, type N as RpcEnvelope, type T as RpcResponseBody, type V as ScheduleRecord, type W as ScheduleRetryPolicy, type X as SchedulerPoolStatus, type Y as SchedulerStatus, type Z as ServerMessage, type _ as ServerPokeEndMessage, type $ as ServerPokePartMessage, type a0 as ServerPokeStartMessage, type a1 as ShardTrafficEntry, type a2 as ShardTrafficResult, type a3 as StorageListPage, type a4 as StorageObject, type a5 as StoredQuery, type a6 as StreamHandle, type a7 as SubscriptionCallback, type b as SubscriptionErrorCallback, a8 as SubscriptionRegistry, type a9 as SubscriptionState, type aa as SyncWatermark, type a as Unsubscribe, type U as User, type ab as WorkflowInstanceAction, type ac as WorkflowInstanceDetail, type ad as WorkflowInstancePage, type ae as WorkflowInstanceStatus, type af as WorkflowInstanceSummary, type ag as WorkflowStepDetail, type ah as WsTokenProvider, ai as createClientQuery, aj as createLocalStore, ak as createStream } from "./packem_shared/lunora-client.d-
|
|
1
|
+
import { 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, R as ReconnectOptions, L as LunoraClient } from "./packem_shared/lunora-client.d-DlMXZMfR.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 RowOp, type N as RpcEnvelope, type T as RpcResponseBody, type V as ScheduleRecord, type W as ScheduleRetryPolicy, type X as SchedulerPoolStatus, type Y as SchedulerStatus, type Z as ServerMessage, type _ as ServerPokeEndMessage, type $ as ServerPokePartMessage, type a0 as ServerPokeStartMessage, type a1 as ShardTrafficEntry, type a2 as ShardTrafficResult, type a3 as StorageListPage, type a4 as StorageObject, type a5 as StoredQuery, type a6 as StreamHandle, type a7 as SubscriptionCallback, type b as SubscriptionErrorCallback, a8 as SubscriptionRegistry, type a9 as SubscriptionState, type aa as SyncWatermark, type a as Unsubscribe, type U as User, type ab as WorkflowInstanceAction, type ac as WorkflowInstanceDetail, type ad as WorkflowInstancePage, type ae as WorkflowInstanceStatus, type af as WorkflowInstanceSummary, type ag as WorkflowStepDetail, type ah as WsTokenProvider, ai as createClientQuery, aj as createLocalStore, ak as createStream } from "./packem_shared/lunora-client.d-DlMXZMfR.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-
|
|
5
|
+
export { p as preloadQuery, a as preloadedQueryResult } from "./packem_shared/preload.d-BNFe_NYM.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{anyApi as o}from"./packem_shared/anyApi-CBOws2ZA.mjs";import{RETIRE_AFTER_DURABLE_SEQ_ADVANCE as a,maxSeq as c,reconcileOptimistic as p}from"./packem_shared/RETIRE_AFTER_DURABLE_SEQ_ADVANCE-DoEHtuR8.mjs";import{createAsyncStoragePersistence as m}from"./packem_shared/createAsyncStoragePersistence-CeUW9NTj.mjs";import{createAsyncStorageQueryCache as f}from"./packem_shared/createAsyncStorageQueryCache-
|
|
1
|
+
import{anyApi as o}from"./packem_shared/anyApi-CBOws2ZA.mjs";import{RETIRE_AFTER_DURABLE_SEQ_ADVANCE as a,maxSeq as c,reconcileOptimistic as p}from"./packem_shared/RETIRE_AFTER_DURABLE_SEQ_ADVANCE-DoEHtuR8.mjs";import{createAsyncStoragePersistence as m}from"./packem_shared/createAsyncStoragePersistence-CeUW9NTj.mjs";import{createAsyncStorageQueryCache as f}from"./packem_shared/createAsyncStorageQueryCache-Dpszf7UD.mjs";import{default as x}from"./packem_shared/createInMemoryBookmarkStorage-BooZhW0n.mjs";import{createCallRunner as l}from"./packem_shared/createCallRunner-Bwcrfh76.mjs";import{createClientQuery as d}from"./packem_shared/createClientQuery-B8Nfj-7o.mjs";import{TabCoordinator as R}from"./packem_shared/TabCoordinator-CXD7vulJ.mjs";import{a as S,i as A}from"./packem_shared/delta-merge-D_5ChS-C.mjs";import{CONFLICT_ERROR_CODE as Q,TransportError as _,getErrorCode as h,getRetryAfterMs as I,isConflictError as M,isForbiddenError as T,isRateLimitedError as g,isUnauthorizedError as F}from"./packem_shared/CONFLICT_ERROR_CODE-BOeeP_Wl.mjs";import{httpStream as O}from"./packem_shared/httpStream-v4etRV7m.mjs";import{c as P}from"./packem_shared/local-store-DDppw8Qr.mjs";import{LunoraClient as k}from"./packem_shared/LunoraClient-DSEbwI7V.mjs";import{createMutatorRunner as q}from"./packem_shared/createMutatorRunner-CuMRJpUx.mjs";import{O as v}from"./packem_shared/offline-queue-D_fr-uQ3.mjs";import{createInMemoryPersistence as z,createIndexedDbPersistence as K}from"./packem_shared/createInMemoryPersistence-Cz2W6XVj.mjs";import{preloadQuery as W,preloadedQueryResult as X}from"./packem_shared/preloadQuery-uFy24PCR.mjs";import{createInMemoryQueryCache as G,createIndexedDbQueryCache as H,queryCacheKey as J}from"./packem_shared/createInMemoryQueryCache-D2uNHLfM.mjs";import{createReconnect as Z}from"./packem_shared/createReconnect-CjTmjJDH.mjs";import{default as ee}from"./packem_shared/createSnapshotPrecondition-5GQ_5fFu.mjs";import{DEFAULT_MAX_BUFFER as oe,createStream as te}from"./packem_shared/DEFAULT_MAX_BUFFER-D3QH2iaq.mjs";import{SubscriptionRegistry as ce}from"./packem_shared/SubscriptionRegistry-C3kLqped.mjs";import{ClientServiceWorker as ne}from"./packem_shared/ClientServiceWorker-DXnBXeWK.mjs";import{createReply as ie,sendToSw as fe}from"./packem_shared/createReply-CwFABEJs.mjs";export{Q as CONFLICT_ERROR_CODE,ne as ClientServiceWorker,oe as DEFAULT_MAX_BUFFER,k as LunoraClient,v as OfflineQueue,a as RETIRE_AFTER_DURABLE_SEQ_ADVANCE,ce as SubscriptionRegistry,R as TabCoordinator,_ as TransportError,o as anyApi,S as applyDelta,m as createAsyncStoragePersistence,f as createAsyncStorageQueryCache,l as createCallRunner,d as createClientQuery,x as createInMemoryBookmarkStorage,z as createInMemoryPersistence,G as createInMemoryQueryCache,K as createIndexedDbPersistence,H as createIndexedDbQueryCache,P as createLocalStore,q as createMutatorRunner,Z as createReconnect,ie as createReply,ee as createSnapshotPrecondition,te as createStream,h as getErrorCode,I as getRetryAfterMs,O as httpStream,M as isConflictError,T as isForbiddenError,A as isMutationDelta,g as isRateLimitedError,F as isUnauthorizedError,c as maxSeq,W as preloadQuery,X as preloadedQueryResult,J as queryCacheKey,p as reconcileOptimistic,fe as sendToSw};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{LunoraError as y}from"@lunora/errors";import{t as fe,e as M,d as g}from"./wire-codec-BeIi1K-T.mjs";import{i as pe,a as me,P as ye}from"./delta-merge-D_5ChS-C.mjs";import{s as j}from"./wire-key-DCPYV4t8.mjs";import be from"./createInMemoryBookmarkStorage-BooZhW0n.mjs";import{ClientQueryStore as Se}from"./createClientQuery-B8Nfj-7o.mjs";import{TabCoordinator as ve}from"./TabCoordinator-CXD7vulJ.mjs";import{TransportError as G}from"./CONFLICT_ERROR_CODE-BOeeP_Wl.mjs";import{httpStream as ge}from"./httpStream-v4etRV7m.mjs";import{d as U,n as _,f as I,a as Te,c as Ce,b as ke,e as we}from"./local-store-DDppw8Qr.mjs";import{O as Ee,n as z,i as Ae,r as _e}from"./offline-queue-D_fr-uQ3.mjs";import{resolvePersistenceAdapter as Ie}from"./createInMemoryPersistence-Cz2W6XVj.mjs";import{resolveQueryCacheAdapter as Oe,queryCacheKey as O}from"./createInMemoryQueryCache-D2uNHLfM.mjs";import{createReconnect as V}from"./createReconnect-CjTmjJDH.mjs";import{e as F,u as L,d as Re,r as Pe,i as Fe,a as Me,b as Le,M as He,c as Ue,f as xe}from"./replay-DYdPvn3o.mjs";import Ne from"./createSnapshotPrecondition-5GQ_5fFu.mjs";import{createStream as Qe}from"./DEFAULT_MAX_BUFFER-D3QH2iaq.mjs";import{SubscriptionRegistry as T}from"./SubscriptionRegistry-C3kLqped.mjs";const x=500,Be=async c=>{const e=[];let t;for(;;){const s=await c(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}},J=(c,e)=>{if(c.size<e)return;const t=c.keys().next().value;t!==void 0&&c.delete(t)};new TextDecoder;const De=new TextEncoder,qe=c=>fe(De.encode(JSON.stringify(c))),Ke="x-lunora-expect-subject",We=c=>qe({subject:c}),Y=Symbol.for("lunora:session-change-listeners"),$e=()=>{const c=globalThis;let e=c[Y];return e===void 0&&(e=new Set,c[Y]=e),e},je=c=>{const e=$e();return e.add(c),()=>{e.delete(c)}};class R{listeners=new Set;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 Ge=c=>{const{afterFailedAttempts:e,intervalMs:t,onReachable:s,onStateChange:r,poll:i}=c,n=t>0&&e>0;let a=0,o,h=!1,d=!1;const u=()=>{o!==void 0&&(clearInterval(o),o=void 0,h=!1,r())},f=m=>{if(o!==void 0){if(!m){u();return}h||(h=!0,r()),s()}},p=()=>{d||(d=!0,i().then(f).finally(()=>{d=!1}).catch(()=>{}))};return{isPolling:()=>o!==void 0&&h,noteFailedOpen:()=>{a+=1,!(!n||o!==void 0||a<e)&&(o=setInterval(p,t),r(),p())},noteOpen:()=>{a=0,u()},stop:u}},ze="/_lunora/rpc",N="/_lunora/rpc-batch",Ve="/_lunora/ws",Q=c=>c===void 0||c===""?"":`&bucket=${encodeURIComponent(c)}`,P=c=>{for(let e=c.length-1;e>=0;e-=1)c[e]?.()},X=Symbol("lunora.unmergeableDelta"),Je=(c,e)=>{for(const t of e)t.op==="delete"?c.delete(t.key):t.value!==void 0&&c.set(t.key,t.value)},Ye="lunora-ping",Xe=3e4,Ze=1e4,et=5e3,tt=3,st=250,rt=5e3,it=64,nt=3,at=1e4,ot=8,ct="/_lunora/admin/shard-traffic",ht="/_lunora/admin/scheduled",dt="/_lunora/admin/scheduled/status",ut="/_lunora/admin/scheduled/ws",lt="/_lunora/admin/scheduled/cancel",Z="/_lunora/admin/scheduled/dead",ft="/_lunora/admin/scheduled/dead/retry",pt="/_lunora/admin/scheduled/dead/cancel",mt="/_lunora/admin/workflows/instances",yt="/_lunora/admin/workflows/instance",bt="/_lunora/admin/workflows/status",B="/_lunora/admin/storage",St="/_lunora/admin/storage/url",vt="/_lunora/admin/storage/buckets",gt="/_lunora/admin/functions",Tt="/_lunora/admin/cron-jobs",Ct="/_lunora/admin/cron-jobs/run",kt="/_lunora/admin/openapi",wt="/_lunora/admin/openrpc",Et="/_lunora/admin/global/tables",At="/_lunora/admin/global/table",_t="/_lunora/admin/global/facet",It="/_lunora/admin/vector/indexes",Ot="/_lunora/admin/vector/query",Rt="/_lunora/admin/logs/archive",Pt="/_lunora/admin/kv/namespaces",Ft="/_lunora/admin/kv/keys",D="/_lunora/admin/kv/value",Mt="/_lunora/admin/auth/users",Lt="/_lunora/admin/auth/sessions",Ht="/_lunora/admin/auth/users/create",Ut="/_lunora/admin/auth/users/role",xt="/_lunora/admin/auth/users/ban",Nt="/_lunora/admin/auth/users/unban",Qt="/_lunora/admin/auth/users/password",Bt="/_lunora/admin/auth/users/remove",Dt="/_lunora/admin/auth/users/impersonate",qt="/_lunora/admin/auth/sessions/revoke",Kt="/_lunora/admin/auth/sessions/revoke-all",Wt="/_lunora/admin/auth/capabilities",$t="/_lunora/admin/auth/users/update",jt="/_lunora/admin/auth/accounts",Gt="/_lunora/admin/auth/accounts/unlink",zt="/_lunora/admin/auth/passkeys",Vt="/_lunora/admin/auth/passkeys/delete",Jt="/_lunora/admin/auth/two-factor/disable",Yt="/_lunora/admin/auth/organizations",Xt="/_lunora/admin/auth/organizations/members",Zt="/_lunora/admin/auth/organizations/invitations",es="/_lunora/admin/auth/organizations/members/remove",ts="/_lunora/admin/auth/organizations/invitations/cancel",ss="/_lunora/admin/auth/config",rs="/_lunora/admin/auth/sign-up-invitations",is="/_lunora/admin/auth/sign-up-invitations/create",ns="/_lunora/admin/auth/sign-up-invitations/revoke",as="/_lunora/admin/auth/organizations/create",os="/_lunora/admin/auth/organizations/update",cs="/_lunora/admin/auth/organizations/remove",hs="/_lunora/admin/auth/organizations/members/add",ds="/_lunora/admin/auth/organizations/members/invite",us="/_lunora/admin/auth/organizations/members/role",ls="/_lunora/admin/auth/organizations/teams",fs="/_lunora/admin/auth/organizations/teams/create",ps="/_lunora/admin/auth/organizations/teams/update",ms="/_lunora/admin/auth/organizations/teams/remove",ys="/_lunora/admin/auth/organizations/teams/members",bs="/_lunora/admin/auth/organizations/teams/members/add",Ss="/_lunora/admin/auth/organizations/teams/members/remove",vs="/_lunora/admin/auth/organizations/roles",gs="/_lunora/admin/auth/organizations/roles/create",Ts="/_lunora/admin/auth/organizations/roles/update",Cs="/_lunora/admin/auth/organizations/roles/remove",ks="/api/auth",ws="/get-session",ee=c=>c==="connected"||c==="polling",Es=(c,e,t)=>c!==null||e&&t===null,te=c=>c.startsWith("https://")?`wss://${c.slice(8)}`:c.startsWith("http://")?`ws://${c.slice(7)}`:c,C=(c,e)=>`${c.endsWith("/")?c.slice(0,-1):c}${e}`,S=(c,e)=>{const t=new URLSearchParams;for(const[r,i]of Object.entries(e))i!==void 0&&i!==""&&t.set(r,String(i));const s=t.toString();return s===""?c:`${c}?${s}`},As=[ye],l=c=>c??"",ae=(c,e)=>{const t=c.error,s=typeof t?.code=="string"?t.code:void 0,r=typeof t?.message=="string"?t.message:void 0;return{code:s,messageText:(typeof c.message=="string"?c.message:void 0)??r??e}},_s=c=>{const{code:e,messageText:t}=ae(c,"stream error");return e===void 0?new Error(t):new y(e,t)},se=c=>{const{code:e,messageText:t}=ae(c,"subscription error");return{message:t,...e===void 0?{}:{code:e}}};function q(c){if(c!==void 0)return e=>{c(e)}}const E=(c,e)=>{for(const t of c)try{t(e)}catch{}},Is=new TextDecoder,Os=c=>{if(typeof c=="string")return c;if(c instanceof ArrayBuffer)return Is.decode(c)},v=(c,e)=>{if(!c.socket||c.wsState!=="open")return!1;try{return c.socket.send(JSON.stringify(e)),!0}catch{return!1}},W=c=>{const e=new Error(c.message??"request failed");return e.code=c.code,c.data!==void 0&&(e.data=g(c.data)),c.hint!==void 0&&(e.hint=c.hint),c.docsUrl!==void 0&&(e.docsUrl=c.docsUrl),e},re=(c,e)=>{const t=W(c),s=Ue(t,e);return s!==void 0&&(t.data=s),t},k=(c,e)=>{try{return M(c)}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)}},Rs=1e4,ie=async c=>{const e=new AbortController;let t;const s=new Promise((r,i)=>{t=setTimeout(()=>{e.abort(),i(new TypeError("LunoraClient: poll timed out"))},Rs)});try{return await Promise.race([c(e.signal),s])}catch(r){throw e.signal.aborted?new TypeError("LunoraClient: poll timed out"):r}finally{clearTimeout(t)}},ne=c=>{try{return M(c),!0}catch{return!1}},K=c=>"args"in c?{...c,args:g(c.args)}:c,oe=c=>{const e=F(c);return e===void 0?xe():W(e)},Ps=(c,e)=>{const t=Array.from({length:e});for(const s of c){if(typeof s.id!="number"||s.id<0||s.id>=e)continue;const r=s.body;t[s.id]=r!==void 0&&"error"in r?{error:oe(r),ok:!1}:{ok:!0,value:g(r?.result)}}return t.map(s=>s??{error:new Error("batch call returned no result"),ok:!1})},Fs=Promise.resolve();class ce{static MAX_POKE_BUFFERS=256;static createClientQuery(e,t){return{defaultValue:t,key:e}}url;wsUrl;clientQueryStore;wsToken;authBasePath;fetchImpl;WebSocketImpl;bookmark;reconnectOptions;connectTimeoutMs;heartbeatIntervalMs;pollingFallbackAfterFailedAttempts;pollingFallbackIntervalMs;offlineQueue;outbox;clientId;shardCursors=new Map;defaultShardKey;readyResolved=!1;readyResolve;readyPromise;clientWatermarks=new Map;outboxMutationCounter=0;onPersistenceError;persistence;persistenceVersion;outboxLeaderRelease;queryCache;hydratedQueryCache=new Map;cacheSeededQueries=new Map;pendingCacheWrites=new Map;cacheFlushTimer;subscriptions=new T;tabCoordinator;leaderStatus;leaderWasEverConnected=!1;connections=new Map;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;tokenExpiredListeners=new R;identityChangeListeners=new R;authRefusalNotifiedFor;mutationSettledListeners=new R;pendingChangeListeners=new R;whisperHandlers=new Map;lastStatus="idle";nextSubId=0;nextStreamId=0;streams=new Map;adminSocketTeardowns=new Set;offlineFlushes=new Map;replayRetryState=new Map;replayRetryTimers=new Map;shapeSubscriptions=new Map;pokeBuffers=new Map;nextShapeId=0;constructor(e){this.url=e.url,this.wsUrl=e.wsUrl??C(te(e.url),Ve),this.wsToken=e.wsToken;const t=e.authBasePath??ks;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??Xe,this.connectTimeoutMs=e.connectTimeoutMs??Ze,this.pollingFallbackIntervalMs=e.pollingFallback?.intervalMs??et,this.pollingFallbackAfterFailedAttempts=e.pollingFallback?.afterFailedAttempts??tt,this.defaultConnectionContext=e.connectionContext,this.persistence=Ie(e.persistence,e.outbox===void 0),this.persistenceVersion=e.persistenceVersion,this.queryCache=Oe(e.queryCache),this.onPersistenceError=e.offlineQueue?.onPersistenceError,this.clientQueryStore=new Se,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=Fs),this.offlineQueue=new Ee(e.offlineQueue,{onEvict:(s,r)=>{this.emitItemSettled(s,"rejected",r)},onSizeChange:s=>{this.pendingChangeListeners.emit(s)},persistence:this.persistence,version:e.persistenceVersion}),this.outbox=e.outbox,this.clientId=e.clientId??`client-${z()}`,this.persistence&&queueMicrotask(()=>{this.hydrateAsOutboxLeader()}),this.queryCache&&queueMicrotask(()=>{(async()=>{try{await this.hydrateQueryCache()}catch{}finally{this.readyResolved=!0,this.readyResolve?.()}})().catch(()=>{})}),"document"in globalThis&&(this.releaseSessionChangeListener=je(async()=>{!this.closed&&this.authToken===null&&await this.getCurrentUser().catch(()=>{})}))}setAuthToken(e,t){const s=this.authToken!==e,r=this.identityFingerprint(),i=this.authSubject===void 0||this.subjectToken===this.authToken,n=this.subjectAwaitingReconfirm(),a=this.isKnownNobody();this.authToken=e,this.applySubject(e,t);const o=this.identityFingerprint();o!==r&&(!s&&e!==null&&i?(this.restampQueuedIdentity(r,o),this.restampWatermarks(r,o),this.restampConnectionIdentity(r,o),this.reseedFromHydratedCache()):!s&&e===null&&r===null&&i&&!a?(this.restampWatermarks(r,o),this.restampConnectionIdentity(r,o),this.reseedFromHydratedCache()):(this.rejectQueuedForIdentityChange(r),Es(r,a,e)&&this.evictPreviousIdentitySession()),this.restartTabCoordinatorForIdentity()),this.syncReadCacheToCredential(n),s&&this.authTokenListeners.emit(e),(o!==r||s||n)&&this.offlineQueue.size>0&&ee(this.computeStatus())&&this.flushAllOfflineQueues()}getAuthToken(){return this.authToken}currentIdentity(){return this.identityFingerprint()}expectIdentityResolution(){this.identityResolutionExpected=!0}currentBaseline(e){return this.baselineCursorFor(e)}replayIdentityVerdict(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"}clientIdentifier(){return this.clientId}confirmedMutationWatermark(e){return this.clientWatermarks.get(this.identityFingerprint()??"")?.get(e??"")??0}async callMutator(e,t,s){const r=s?.clientSeq;if(r!==void 0&&(!Number.isInteger(r)||r<=0))throw new y("INTERNAL",`callMutator: clientSeq must be a positive integer, got ${String(r)}`);const i=s?.shardKey??"",n=this.identityFingerprint();let a;const o=await this.rpc(e,t,s?.shardKey,{captureBookmark:!0,clientId:this.clientId,clientSeq:r,onMutationAck:d=>{a=d}});if(a!==void 0&&a>(this.clientWatermarks.get(n??"")?.get(i)??0)){let d=this.clientWatermarks.get(n??"");d===void 0&&(J(this.clientWatermarks,ot),d=new Map,this.clientWatermarks.set(n??"",d)),d.set(i,a)}return{applied:a===void 0||a===r,result:o}}onAuthTokenChange(e){return this.authTokenListeners.add(e)}onIdentityChange(e){return this.identityChangeListeners.add(e)}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 r=await this.fetchImpl(C(this.url,`${this.authBasePath}${ws}`),{credentials:"include",headers:e,method:"GET"});if(!r.ok)return this.identitySettled=!0,r.status===401&&this.adoptResolvedSubject(t,null,s),null;const n=(await r.json())?.user??null;return this.identitySettled=!0,this.adoptResolvedSubject(t,n,s),n}finally{this.releaseSessionProbe()}}setWsToken(e){this.wsToken!==e&&(this.wsToken=e,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)}acquireConnectionContext(e,t={}){if(this.followsAnotherTab())return()=>{};const s=l(t.shardKey),r={context:e},i=this.connectionContextHolders.get(s);i?i.push(r):this.connectionContextHolders.set(s,[r]),this.refreshConnectionContext(s);let n=!1;return()=>{if(n)return;n=!0;const a=this.connectionContextHolders.get(s);if(!a)return;const o=a.indexOf(r);o!==-1&&a.splice(o,1),a.length===0&&this.connectionContextHolders.delete(s),this.refreshConnectionContext(s)}}whisperSubscribe(e,t,s={}){this.assertLeaderOwnedSurface("whisperSubscribe");const r=l(s.shardKey);let i=this.whisperHandlers.get(r);i||(i=new Map,this.whisperHandlers.set(r,i));let n=i.get(e);const a=n===void 0;if(n||(n=new Set,i.set(e,n)),n.add(t),this.ensureSocket(s.shardKey),a){const o=this.getConnection(s.shardKey);o&&v(o,{topic:e,type:"whisper_subscribe"})}return()=>{const o=this.whisperHandlers.get(r),h=o?.get(e);if(!h?.delete(t)||h.size>0)return;o?.delete(e),o?.size===0&&this.whisperHandlers.delete(r);const d=this.getConnection(s.shardKey);d&&v(d,{topic:e,type:"whisper_unsubscribe"})}}whisper(e,t,s={}){this.assertLeaderOwnedSurface("whisper"),this.ensureSocket(s.shardKey);const r=this.getConnection(s.shardKey);r&&v(r,{data:k(t??null,`whisper data for topic '${e}'`),topic:e,type:"whisper"})}onTokenExpired(e){return this.tokenExpiredListeners.add(e)}connectionStatus(){return this.computeStatus()}onConnectionStatus(e){const t=this.statusListeners.add(e);return e(this.computeStatus()),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 i of s){const n=this.connections.get(i);e.push({confirmedMutationWatermark:t?.get(i)??0,hasSocket:n?.socket!==void 0,shardKey:i===""?void 0:i,wasEverConnected:n?.wasEverConnected??!1,wsState:n?.wsState??"idle"})}const r=this.subscriptions.all().map(i=>({acked:i.acked,functionPath:i.fn.__lunoraRef,id:i.id,kind:"query",lastMutationId:i.lastMutationId,pendingOptimisticLayers:i.optimisticLayers.length,serverCursor:i.serverCursor,shardKey:i.shardKey,subscriberCount:i.callbacks.size}));for(const i of this.shapeSubscriptions.values())r.push({acked:i.serverCursor!==void 0,functionPath:`shape:${i.name}`,id:i.id,kind:"shape",lastMutationId:i.lastMutationId,pendingOptimisticLayers:0,rowCount:i.rows.size,serverCursor:i.serverCursor,shardKey:i.shardKey,subscriberCount:i.callbacks.size});return{clientId:this.clientId,closed:this.closed,connectionStatus:this.computeStatus(),pendingWrites:this.offlineQueue.size,shards:e.toSorted((i,n)=>(i.shardKey??"").localeCompare(n.shardKey??"")),subscriptions:r.toSorted((i,n)=>i.functionPath.localeCompare(n.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 Ne(this,e,t,s)}whenReady(){return this.readyPromise}get isReady(){return this.readyResolved}peekHydratedQuery(e,t,s){if(!this.readyResolved)return;const r=j(t),i=O(e,r,s),n=this.hydratedQueryCache.get(i);if(n!==void 0)return this.cachedQueryMatchesIdentity(n)?n.value:void 0}peekActiveQuerySnapshot(e,t,s){const r=T.key(e,t,s),i=this.subscriptions.get(r);return{present:i!==void 0,value:i?.lastValue}}async query(e,t,s={}){return this.assertOpen(),await this.rpc(e.__lunoraRef,t,s.shardKey,{attachBookmark:!0})}async batch(e){return this.sendBatch(e)}async mutation(e,t,s={}){const{value:r}=await this.runMutation(e,t,s);return r}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})}async importRows(e,t,s={}){this.assertOpen();const r=Math.max(1,Math.trunc(s.chunkSize??500)),i=s.toArgs??(d=>({rows:d})),n=t.length;let a=0,o=0,h=0;for(let d=0;d<n;d+=r){const u=t.slice(d,d+r),f=h,{committed:p}=await this.runMutation(e,i(u),{...s.importId===void 0?{}:{mutationId:`${s.importId}:${String(f)}`},shardKey:s.shardKey});h+=1,a+=u.length,p&&(o+=u.length),s.onProgress?.({done:a,total:n})}return{chunks:h,imported:o,queued:a-o}}async shardTraffic(e){this.assertOpen();const t=await this.adminFetch(ct,"POST",{table:e});return{failed:t.failed??0,ok:t.ok??0,shards:t.shards??[]}}async listScheduledJobs(){return this.assertOpen(),((await this.adminFetch(ht,"GET")).records??[]).map(t=>K(t))}async schedulerStatus(){this.assertOpen();const e=await this.adminFetch(dt,"GET");return{backlog:e.backlog??0,inFlight:e.inFlight??0,pools:e.pools??[]}}async cancelScheduledJob(e){return this.assertOpen(),{cancelled:(await this.adminFetch(lt,"POST",{id:e})).cancelled===!0}}async listDeadJobs(){return this.assertOpen(),(await Be(async t=>await this.adminFetch(t===void 0?Z:`${Z}?cursor=${encodeURIComponent(t)}`,"GET"))).map(t=>K(t))}async retryDeadJob(e){return this.assertOpen(),{retried:(await this.adminFetch(ft,"POST",{id:e})).retried===!0}}async removeDeadJob(e){return this.assertOpen(),{removed:(await this.adminFetch(pt,"POST",{id:e})).removed===!0}}async listWorkflowInstances(e){this.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 this.adminFetch(`${mt}?${t.toString()}`,"GET");return{configured:s.configured,instances:s.instances??[],page:s.page??1,perPage:s.perPage??e.perPage??0,totalCount:s.totalCount}}async getWorkflowInstance(e){this.assertOpen();const t=new URLSearchParams({id:e.id,name:e.name}),s=await this.adminFetch(`${yt}?${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??[]}}async setWorkflowInstanceStatus(e){return this.assertOpen(),{status:(await this.adminFetch(bt,"POST",{action:e.action,id:e.id,name:e.name})).status??"unknown"}}subscribeScheduledJobs(e){if(this.assertOpen(),this.WebSocketImpl===void 0)return()=>{};const t=C(te(this.url),ut),s=V(this.reconnectOptions),r={connectTimer:void 0,heartbeatTimer:void 0,lastFrameAt:0,socket:void 0};let i,n=!1;const a=()=>{n||this.closed||(i=setTimeout(d,s.next()))},o=f=>{if(n||this.WebSocketImpl===void 0)return;const p=f===void 0?t:`${t}?token=${encodeURIComponent(f)}`;this.openManagedSocket(r,p,this.connectTimeoutMs,{onClose:()=>{a()},onMessage:m=>{let b;try{b=JSON.parse(typeof m.data=="string"?m.data:"")}catch{return}b.type==="jobs"&&Array.isArray(b.records)&&(s.reset(),e(b.records.map(w=>K(w))))}})},h=async f=>{let p;try{p=await f()}catch{a();return}o(p)},d=()=>{if(n||this.WebSocketImpl===void 0)return;const{wsToken:f}=this;if(typeof f=="function"){h(f).catch(()=>{});return}o(f)};d();const u=()=>{n=!0,i!==void 0&&(clearTimeout(i),i=void 0),r.connectTimer!==void 0&&(clearTimeout(r.connectTimer),r.connectTimer=void 0),this.stopHeartbeat(r),r.socket?.close(),r.socket=void 0};return this.adminSocketTeardowns.add(u),()=>{this.adminSocketTeardowns.delete(u),u()}}async listFunctions(){return this.assertOpen(),(await this.adminFetch(gt,"GET")).functions??[]}async getCronJobs(){return this.assertOpen(),(await this.adminFetch(Tt,"GET")).jobs??[]}async runCronJob(e){this.assertOpen();const t=await this.adminFetch(Ct,"POST",{name:e});return{name:t.name??e,ran:t.ran===!0}}async fetchOpenApi(){return this.assertOpen(),await this.adminFetch(kt,"GET")}async fetchOpenRpc(){return this.assertOpen(),await this.adminFetch(wt,"GET")}async listStorageObjects(e={}){this.assertOpen();const t=S(B,{bucket:e.bucket,cursor:e.cursor,limit:e.limit,prefix:e.prefix}),s=await this.adminFetch(t,"GET");return{cursor:s.cursor,objects:s.objects??[]}}async deleteStorageObject(e,t){this.assertOpen();const s=`${B}?key=${encodeURIComponent(e)}${Q(t?.bucket)}`,r=await this.adminFetch(s,"DELETE");return{deleted:r.deleted===!0,key:r.key??e}}async listStorageBuckets(){return this.assertOpen(),(await this.adminFetch(vt,"GET")).buckets??[]}async uploadStorageObject(e){this.assertOpen();const t=`${B}?key=${encodeURIComponent(e.key)}${Q(e.bucket)}`,s=await this.adminFetch(t,"PUT",e.body,e.contentType);return{etag:s.etag,key:s.key??e.key}}async signedStorageUrl(e,t){this.assertOpen();const s=t?.expiresInSeconds,r=s===void 0?"":`&expiresIn=${encodeURIComponent(s.toString())}`,i=`${St}?key=${encodeURIComponent(e)}${r}${Q(t?.bucket)}`,n=await this.adminFetch(i,"GET");if(typeof n.url!="string")throw new TypeError("LunoraClient: storage URL endpoint returned no `url`");return n.url}async listGlobalTables(){return this.assertOpen(),await this.adminFetch(Et,"GET")}async readGlobalTablePage(e){this.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(M(e.filters))),g(await this.adminFetch(`${At}?${t.toString()}`,"GET"))}async facetGlobalColumn(e){this.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(M(e.filters))),g(await this.adminFetch(`${_t}?${t.toString()}`,"GET"))}async listVectorIndexes(){return this.assertOpen(),(await this.adminFetch(It,"GET")).indexes??[]}async queryVectorIndex(e){return this.assertOpen(),(await this.adminFetch(Ot,"POST",e)).matches??[]}async queryLogArchive(e={}){this.assertOpen();const t=await this.adminFetch(Rt,"POST",e);return{nextCursor:t.nextCursor,rows:t.rows??[]}}async listKvNamespaces(){return this.assertOpen(),(await this.adminFetch(Pt,"GET")).namespaces??[]}async listKvKeys(e){this.assertOpen();const t=S(Ft,{cursor:e.cursor,limit:e.limit,namespace:e.namespace,prefix:e.prefix});return await this.adminFetch(t,"GET")}async getKvValue(e){this.assertOpen();const t=S(D,{key:e.key,namespace:e.namespace});return await this.adminFetch(t,"GET")}async putKvValue(e){this.assertOpen(),await this.adminFetch(D,"PUT",e)}async deleteKvKey(e){this.assertOpen();const t=S(D,{key:e.key,namespace:e.namespace});await this.adminFetch(t,"DELETE")}async listAuthUsers(e={}){this.assertOpen();const t=S(Mt,{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 await this.adminFetch(Ht,"POST",e)}async setAuthUserRole(e){return await this.adminFetch(Ut,"POST",e)}async banAuthUser(e){return await this.adminFetch(xt,"POST",e)}async unbanAuthUser(e){return await this.adminFetch(Nt,"POST",e)}async setAuthUserPassword(e){await this.adminFetch(Qt,"POST",e)}async removeAuthUser(e){await this.adminFetch(Bt,"POST",e)}async impersonateAuthUser(e){return await this.adminFetch(Dt,"POST",e)}async revokeAuthSession(e){await this.adminFetch(qt,"POST",e)}async revokeAuthUserSessions(e){await this.adminFetch(Kt,"POST",e)}async getAuthCapabilities(){return await this.adminFetch(Wt,"GET")}async updateAuthUser(e){return await this.adminFetch($t,"POST",e)}async listAuthAccounts(e){return await this.adminFetch(S(jt,{userId:e.userId}),"GET")}async unlinkAuthAccount(e){await this.adminFetch(Gt,"POST",e)}async listAuthPasskeys(e){return await this.adminFetch(S(zt,{userId:e.userId}),"GET")}async deleteAuthPasskey(e){await this.adminFetch(Vt,"POST",e)}async disableAuthTwoFactor(e){await this.adminFetch(Jt,"POST",e)}async listAuthOrganizations(e={}){return await this.adminFetch(S(Yt,{limit:e.limit,offset:e.offset}),"GET")}async listAuthOrgMembers(e){const t=S(Xt,{limit:e.limit,offset:e.offset,organizationId:e.organizationId});return await this.adminFetch(t,"GET")}async listAuthOrgInvitations(e){const t=S(Zt,{limit:e.limit,offset:e.offset,organizationId:e.organizationId});return await this.adminFetch(t,"GET")}async listAuthSignUpInvitations(e={}){const t=S(rs,{limit:e.limit,offset:e.offset});return await this.adminFetch(t,"GET")}async createAuthSignUpInvitation(e){return await this.adminFetch(is,"POST",e)}async revokeAuthSignUpInvitation(e){await this.adminFetch(ns,"POST",e)}async removeAuthOrgMember(e){await this.adminFetch(es,"POST",e)}async cancelAuthOrgInvitation(e){await this.adminFetch(ts,"POST",e)}async getAuthConfig(){return await this.adminFetch(ss,"GET")}async createAuthOrganization(e){return await this.adminFetch(as,"POST",e)}async updateAuthOrganization(e){return await this.adminFetch(os,"POST",e)}async deleteAuthOrganization(e){await this.adminFetch(cs,"POST",e)}async addAuthOrgMember(e){return await this.adminFetch(hs,"POST",e)}async inviteAuthOrgMember(e){return await this.adminFetch(ds,"POST",e)}async setAuthOrgMemberRole(e){return await this.adminFetch(us,"POST",e)}async listAuthOrgTeams(e){const t=S(ls,{limit:e.limit,offset:e.offset,organizationId:e.organizationId});return await this.adminFetch(t,"GET")}async createAuthOrgTeam(e){return await this.adminFetch(fs,"POST",e)}async updateAuthOrgTeam(e){return await this.adminFetch(ps,"POST",e)}async removeAuthOrgTeam(e){await this.adminFetch(ms,"POST",e)}async listAuthOrgTeamMembers(e){const t=S(ys,{limit:e.limit,offset:e.offset,teamId:e.teamId});return await this.adminFetch(t,"GET")}async addAuthOrgTeamMember(e){return await this.adminFetch(bs,"POST",e)}async removeAuthOrgTeamMember(e){await this.adminFetch(Ss,"POST",e)}async listAuthOrgRoles(e){const t=S(vs,{limit:e.limit,offset:e.offset,organizationId:e.organizationId});return await this.adminFetch(t,"GET")}async createAuthOrgRole(e){return await this.adminFetch(gs,"POST",e)}async updateAuthOrgRole(e){return await this.adminFetch(Ts,"POST",e)}async deleteAuthOrgRole(e){await this.adminFetch(Cs,"POST",e)}async listAuthSessions(e={}){this.assertOpen();const t=S(Lt,{limit:e.limit,offset:e.offset,userId:e.userId});return await this.adminFetch(t,"GET")}subscribe(e,t,s,r={}){this.assertOpen();const i=t??{},n=T.key(e.__lunoraRef,i,r.shardKey);let a=this.subscriptions.get(n);const o=q(s),h=q(r.onError),d=q(r.onCheckpoint);if(!a){this.nextSubId+=1;const f=`sub_${this.nextSubId.toString()}`,p=j(i),m=this.takeHydratedCache(e.__lunoraRef,p,r.shardKey);a={acked:!1,args:i,argsKey:p,callbacks:new Set,checkpointCallbacks:new Set,errorCallbacks:new Set,fn:e,id:f,lastValue:m?.value,optimisticLayers:[],serverBase:m?.value,serverCursor:m?.serverCursor,shardKey:r.shardKey,wireArgs:k(i,`args for '${e.__lunoraRef}'`),...m?.serverEpoch===void 0?{}:{serverEpoch:m.serverEpoch}},this.subscriptions.add(a),m!==void 0&&this.cacheSeededQueries.set(n,m)}if(a.callbacks.add(o),h&&a.errorCallbacks.add(h),d&&a.checkpointCallbacks.add(d),a.lastValue!==void 0)try{o(a.lastValue)}catch{}this.ensureSocket(r.shardKey),this.sendSubscribeIfOpen(a);const u=a;return()=>{u.callbacks.delete(o),h&&u.errorCallbacks.delete(h),d&&u.checkpointCallbacks.delete(d),u.callbacks.size===0&&(this.sendOrQueueUnsubscribe(u.shardKey,u.id,"unsubscribe"),this.returnCacheSeed(T.keyOf(u)),this.subscriptions.remove(u))}}subscribeShape(e,t,s={}){if(this.assertOpen(),this.followsAnotherTab()){const{onError:n}=s;return n!==void 0&&queueMicrotask(()=>{n({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 r=`shape_${this.nextShapeId.toString()}`,i={args:e.args,callbacks:new Set([t]),errorCallbacks:s.onError?new Set([s.onError]):new Set,id:r,name:e.name,onCheckpoint:s.onCheckpoint,rows:new Map,shardKey:s.shardKey,wireArgs:e.args===void 0?void 0:k(e.args,`shape args for '${e.name}'`)};return this.shapeSubscriptions.set(r,i),this.ensureSocket(s.shardKey),this.sendShapeSubscribeIfOpen(i),()=>{this.shapeSubscriptions.delete(r),this.sendOrQueueUnsubscribe(i.shardKey,r,"shape_unsubscribe")}}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 r=`stream_${this.nextStreamId.toString()}`,{shardKey:i}=s,n=t??{},{handle:a,iterable:o}=Qe({maxBuffer:s.maxBuffer,onCancel:()=>{this.cancelStream(r,i)}});this.ensureSocket(i);const h=this.getConnection(i),d={id:r,query:{args:k(n,`stream args for '${e.__lunoraRef}'`),functionPath:e.__lunoraRef,shardKey:i},type:"stream"},u={durable:s.durable===!0,generation:void 0,handle:a,lastSeq:0,message:d,shardKey:i,started:!1};this.streams.set(r,u);const f=h?.wsState==="open"&&v(h,d);if(u.started=f,!f&&h===void 0)return this.streams.delete(r),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")),o;if(!f){for(h.pendingStreams=h.pendingStreams??[];h.pendingStreams.length>=it;){const m=h.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.streams.delete(m))}h.pendingStreams.push(d)}return o}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 r={...this.authToken?{authorization:`Bearer ${this.authToken}`}:{},...s.headers};return ge(e,t,{baseUrl:this.url,fetch:this.fetchImpl,headers:r,maxBuffer:s.maxBuffer,signal:s.signal})}close(){this.closed=!0,this.releaseSessionChangeListener?.(),this.releaseSessionChangeListener=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();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.whisperHandlers.clear(),this.shapeSubscriptions.clear(),this.pokeBuffers.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}teardownConnection(e){e.polling.stop();const t=l(e.shardKey);for(const[s,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(s));if(e.pendingStreams=void 0,e.pendingUnsubscribes=[],this.clearResubscribeQueue(e),this.clearConnectionTimers(e),this.stopHeartbeat(e),e.socket){try{e.socket.close()}catch{}e.socket=void 0}e.wsState="closed"}createTabCoordinator(){const e=`lunora-bridge::${this.url}::${this.identityFingerprint()??"anon"}`;return new ve({channelName:e,onBecomeLeader:()=>{for(const t of this.subscriptions.all())this.ensureSocket(t.shardKey),this.queueResubscribe(t);for(const t of this.queuedOfflineShardKeys)this.ensureSocket(t);this.tabCoordinator?.broadcastConnectionStatus(this.computeStatus(),this.identityFingerprint())},onStopBeingLeader:()=>{for(const[t,s]of this.connections)this.teardownConnection(s),this.connections.delete(t);this.leaderStatus=void 0,this.leaderWasEverConnected=!1},onConnectionStatus:(t,s)=>{if(s!==void 0&&s!==this.identityFingerprint())return;const r=t==="connected"&&this.leaderStatus!=="connected"||t==="polling"&&this.leaderStatus!=="connected"&&this.leaderStatus!=="polling";this.leaderStatus=t,t==="connected"&&(this.leaderWasEverConnected=!0),this.emitConnectionStatus(),r&&this.flushAllOfflineQueues()},onSubscriptionData:(t,s,r,i,n)=>{if(n!==void 0&&n!==this.identityFingerprint())return;const a=this.subscriptions.get(t);a&&(a.serverBase=s,this.dropCacheSeed(t),r!==void 0&&(a.serverCursor=r,i!==void 0&&(a.serverEpoch=i),U(a,r)),_(a,I(s,a.optimisticLayers)))},onLeaderClaimAnswered:()=>{this.tabCoordinator?.isLeader()&&this.tabCoordinator.broadcastConnectionStatus(this.computeStatus(),this.identityFingerprint())},onSubscriptionError:(t,s,r)=>{if(r!==void 0&&r!==this.identityFingerprint())return;const i=this.subscriptions.get(t);i&&E(i.errorCallbacks,s)},onSubscriptionSettled:(t,s,r,i,n,a)=>{if(a!==void 0&&a!==this.identityFingerprint())return;const o=this.subscriptions.get(t);if(o){this.ackAndAdvanceCursor(o,s,r),i!==void 0&&n===this.clientId&&(o.lastMutationId=Math.max(o.lastMutationId??0,i));for(const h of o.checkpointCallbacks)h({checkpoint:o.serverCursor,mutationId:o.lastMutationId})}}})}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,N),{body:JSON.stringify({calls:e.map((a,o)=>({args:k(a.args??{},`args for batch call '${a.fn.__lunoraRef}'`),functionPath:a.fn.__lunoraRef,id:o,shardKey:a.shardKey}))}),headers:this.rpcRequestHeaders({attachBookmark:!0}),method:"POST",signal:t}),r=s.headers.get("x-d1-bookmark");r&&this.bookmark.set(r);let i;try{i=await s.json()}catch{throw new y("INTERNAL",`LunoraClient: batch response was not JSON (status ${s.status.toString()})`)}const n=F(i);if(!s.ok||n!==void 0&&!i.results)throw n!==void 0?W(n):new y("INTERNAL",`LunoraClient: batch request failed (status ${s.status.toString()})`);for(const a of i.results??[]){const o=a.body?.commitCursor;typeof a.id=="number"&&typeof o=="number"&&this.recordShardCursor(e[a.id]?.shardKey,o)}return Ps(i.results??[],e.length)}async runMutation(e,t,s){this.assertOpen();const r=t,i=s.mutationId??z(),n=s.replayBaseline===void 0?this.baselineCursorFor(s.shardKey):s.replayBaseline??void 0,{confirms:a,rollbacks:o}=this.applyOptimisticUpdates(e.__lunoraRef,r,s.shardKey,s.optimistic);s.optimisticUpdate&&this.applyOptimisticUpdate(s.optimisticUpdate,t,s.shardKey,o,a);const h=this.offlineFlushes.get(l(s.shardKey));h!==void 0&&await h;const{hasSocket:d,polling:u,wasEverConnected:f,wsState:p}=this.connectionGateState(s.shardKey),{queueBeforeFirstConnect:m}=this.offlineQueue,b=f||m,w=this.WebSocketImpl!==void 0&&b,he=p==="connecting"&&b&&!u,de=p!=="open"&&!d&&w&&!u,ue=w&&s.replayBaseline===void 0&&this.hasPendingWriteAhead(s.shardKey),$=async()=>this.enqueueOfflineMutation(e,r,s.shardKey,n,i,o,a,s.precondition,s.mutationId);if(de||he||ue)return $();try{let A;const le=await this.rpc(e.__lunoraRef,r,s.shardKey,{baselineSeq:n,captureBookmark:!0,...this.replayExpectation(s.replayIdentity),mutationId:i,onCommitCursor:H=>{A=H}});for(const H of a)H(A);return{committed:!0,value:le}}catch(A){if(u&&w&&A instanceof TypeError&&ne(r))return $();throw this.noteIdentityMismatch(A),P(o),A}}async enqueueOfflineMutation(e,t,s,r,i,n,a,o,h){const d=this.identityFingerprint();if(this.outbox){this.outboxMutationCounter+=1;const f=this.outboxMutationCounter;try{await this.outbox.enqueue({args:t,baselineSeq:r,clientId:this.clientId,functionPath:e.__lunoraRef,idempotencyKey:h??`${this.clientId}:${String(f)}`,identity:d,mutationId:f,...n.length>0&&{onRejected:()=>{P(n)}},shardKey:s})}catch(p){throw P(n),p instanceof Error?p:new Error(String(p))}for(const p of a)p(void 0);return{committed:!1,value:void 0}}return{committed:!0,value:await new Promise((f,p)=>{const m={args:t,functionPath:e.__lunoraRef,liveAwaiter:!0,baselineSeq:r,id:i,clientId:this.clientId,identity:d,precondition:o,onCommit:b=>{for(const w of a)w(b)},reject:b=>{this.queuedIdentities.delete(i),P(n),p(b instanceof Error?b:new Error(String(b)))},resolve:f,shardKey:s};this.offlineQueue.enqueue(m),this.queuedOfflineShardKeys.add(s),m.id!==void 0&&this.queuedIdentities.set(m.id,d)})}}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(O(s.fn.__lunoraRef,s.argsKey,s.shardKey),s);for(const{key:s,...r}of e){if(Ae(this.persistenceVersion,r.version)){this.queryCache.remove(s).catch(()=>{});continue}const i=t.get(s);if(i&&this.cachedQueryMatchesIdentity(r)){this.seedSubscriptionFromCache(i,r);continue}this.hydratedQueryCache.set(s,r)}}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(O(e.fn.__lunoraRef,e.argsKey,e.shardKey),t),_(e,I(t.value,e.optimisticLayers)))}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,_(s,I(void 0,s.optimisticLayers))),this.hydratedQueryCache.set(e,t)}this.cacheSeededQueries.clear()}}takeHydratedCache(e,t,s){const r=O(e,t,s),i=this.hydratedQueryCache.get(r);if(!(i===void 0||!this.cachedQueryMatchesIdentity(i)))return this.hydratedQueryCache.delete(r),i}reseedFromHydratedCache(){if(this.hydratedQueryCache.size!==0)for(const e of this.subscriptions.all()){const t=O(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=O(e.fn.__lunoraRef,e.argsKey,e.shardKey),r=this.getConnection(e.shardKey)?.identity,i=r===void 0?this.identityFingerprint():r;i===null&&this.identityUnresolved()||(this.pendingCacheWrites.set(s,{identity:i,serverCursor:e.serverCursor,ts:Date.now(),value:t,...i===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(()=>{})},st))}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,r])=>e.put(s,r)))}computeStatus(){if(this.tabCoordinator&&!this.tabCoordinator.isLeader())return this.leaderStatus??"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 r of this.subscriptions.all())l(r.shardKey)!==t||r.serverCursor===void 0||(s=s===void 0?r.serverCursor:Math.max(s,r.serverCursor));return s}async pollSubscriptions(e){const t=l(e),s=[];for(const a of this.subscriptions.all())l(a.shardKey)===t&&(ne(a.args)?s.push(a):E(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 r=we(),i=this.identityFingerprint();let n;try{n=await ie(async a=>this.sendBatch(s.map(o=>({args:o.args,fn:o.fn,shardKey:o.shardKey})),a))}catch(a){return!(a instanceof TypeError)}if(this.identityFingerprint()!==i)return!0;for(const[a,o]of s.entries()){const h=n[a];if(h!==void 0){if(!h.ok){E(o.errorCallbacks,{code:h.error.code,message:h.error.message});continue}this.handleDataMessage({data:M(h.value),id:o.id,type:"data"},r)}}return!0}async probeOrigin(){const{fetchImpl:e}=this;if(!e)return!1;try{return await ie(async t=>e(C(this.url,N),{body:JSON.stringify({calls:[]}),headers:this.rpcRequestHeaders({}),method:"POST",signal:t})),!0}catch{return!1}}emitConnectionStatus(){const e=this.computeStatus();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,r){const i=[],n=[];if(!r)return{confirms:i,rollbacks:n};const a=T.key(e,t,s),o=this.subscriptions.get(a);if(o){const h=Te(o,r);h&&(i.push(h.confirm),n.push(h.rollback))}return{confirms:i,rollbacks:n}}applyOptimisticUpdate(e,t,s,r,i){const{confirms:n,rollbacks:a,store:o}=Ce(this.subscriptions,s);try{e(o,t)}catch{P(a);return}r.push(...a),i.push(...n)}getConnection(e){return this.connections.get(l(e))}sendOrQueueUnsubscribe(e,t,s){const r=this.getConnection(e);r&&!v(r,{id:t,type:s})&&r.pendingUnsubscribes.push({id:t,type:s})}connectionGateState(e){if(this.tabCoordinator&&!this.tabCoordinator.isLeader()){let s="idle";return this.leaderStatus==="connected"?s="open":this.leaderStatus==="connecting"&&(s="connecting"),{hasSocket:!1,polling:this.leaderStatus==="polling",wasEverConnected:this.leaderWasEverConnected,wsState:s}}const t=this.getConnection(e);return{hasSocket:t?.socket!==void 0,polling:t?.polling.isPolling()??!1,wasEverConnected:t?.wasEverConnected??!1,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:Ge({afterFailedAttempts:this.pollingFallbackAfterFailedAttempts,intervalMs:this.pollingFallbackIntervalMs,onReachable:()=>{this.flushOfflineQueue(e).catch(()=>{})},onStateChange:()=>{this.emitConnectionStatus()},poll:async()=>this.pollSubscriptions(e)}),reconnect:V(this.reconnectOptions),reconnectTimer:void 0,resubscribePending:new Map,resubscribeQueue:[],shardKey:e,socket:void 0,stableTimer:void 0,wasEverConnected:!1,wsState:"idle"},this.connections.set(t,s)),s}wsUrlFor(e,t){const s=[];if(e!==void 0&&s.push(`shard=${encodeURIComponent(e)}`),t!==void 0&&s.push(`token=${encodeURIComponent(t)}`),s.length===0)return this.wsUrl;const r=this.wsUrl.includes("?")?"&":"?";return`${this.wsUrl}${r}${s.join("&")}`}rpcRequestHeaders(e,t){const s={"content-type":"application/json"};e.expectSubject!==void 0&&(s[Ke]=We(e.expectSubject));const r=this.shardCursors.get(this.cursorKeyFor(t));if(r!==void 0&&(s["x-lunora-min-seq"]=r.toString()),this.authToken&&(s.authorization=`Bearer ${this.authToken}`),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 i=this.bookmark.get();i&&(s["x-d1-bookmark"]=i)}return s}async rpc(e,t,s,r={}){if(!this.fetchImpl)throw new G("LunoraClient: no `fetch` implementation available");const i=this.rpcRequestHeaders(r,s),n=await this.fetchImpl(C(this.url,ze),{body:JSON.stringify({args:k(t,`args for '${e}'`),functionPath:e,shardKey:s}),headers:i,method:"POST"});if(r.captureBookmark){const h=n.headers.get("x-d1-bookmark");h&&this.bookmark.set(h)}let a;try{a=await n.json()}catch{throw L(n.status,n.statusText,n.headers.get("retry-after"))}const o=F(a);if(o!==void 0)throw re(o,n.headers.get("retry-after"));if(!n.ok)throw L(n.status,n.statusText,n.headers.get("retry-after"));return r.onMutationAck?.(a.lastMutationId),r.onCommitCursor?.(a.commitCursor),this.learnDefaultShardKey(n,s),this.recordShardCursor(s,a.commitCursor),g(a.result)}async adminFetch(e,t,s,r){if(!this.fetchImpl)throw new y("INTERNAL","LunoraClient: no `fetch` implementation available");const i={};this.authToken&&(i.authorization=`Bearer ${this.authToken}`);const n=s instanceof ArrayBuffer||s instanceof Blob;let a;s===void 0?a=void 0:n?(a=s,r!==void 0&&(i["content-type"]=r)):(a=JSON.stringify(s),i["content-type"]="application/json");const o=await this.fetchImpl(C(this.url,e),{body:a,headers:i,method:t});let h;try{h=await o.json()}catch{const u=o.statusText?` ${o.statusText}`:"";throw new y("INTERNAL",`LunoraClient: response was not JSON (status ${o.status.toString()}${u})`)}const d=F(h);if(d!==void 0){const u=new Error(d.message??"admin request failed");throw u.code=d.code,u}if(!o.ok){const u=o.statusText?` ${o.statusText}`:"";throw new y("INTERNAL",`LunoraClient: admin request failed (status ${o.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));v(e,{caps:As,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){let r;try{r=await s()}catch{this.handleDisconnect(e);return}this.closed||this.WebSocketImpl===void 0||e.wsState!=="connecting"||e.socket!==void 0||this.openSocket(e,t,r)}openManagedSocket(e,t,s,r){const{WebSocketImpl:i}=this;if(i===void 0)throw new y("INTERNAL","no WebSocket implementation available");const n=new i(t);e.socket=n;const a=()=>{this.stopHeartbeat(e),e.connectTimer!==void 0&&(clearTimeout(e.connectTimer),e.connectTimer=void 0),e.socket===n&&(e.socket=void 0)},o=h=>{a(),r.onClose(h)};s>0&&(e.connectTimer=setTimeout(()=>{if(e.connectTimer=void 0,e.socket===n){try{n.close()}catch{}o()}},s)),n.addEventListener("open",()=>{if(e.socket===n){e.connectTimer!==void 0&&(clearTimeout(e.connectTimer),e.connectTimer=void 0),e.lastFrameAt=Date.now();try{r.onOpen?.()}catch(h){console.error("[lunora] connection open handler threw",h)}this.startHeartbeat(e,o)}}),n.addEventListener("message",h=>{if(e.socket===n){e.lastFrameAt=Date.now();try{r.onMessage(h)}catch(d){console.error("[lunora] server frame handler threw",d)}}}),n.addEventListener("close",h=>{e.socket===n&&o(h)}),n.addEventListener("error",()=>{e.socket===n&&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,this.openManagedSocket(e,this.wsUrlFor(t,s),this.connectTimeoutMs,{onClose:r=>{r?.code===4001&&this.notifyTokenExpired(),this.handleDisconnect(e)},onMessage:r=>{e.retired!==!0&&this.handleServerMessage(r.data,t)},onOpen:()=>{e.wsState="open",e.wasEverConnected=!0,e.polling.noteOpen(),clearTimeout(e.stableTimer),e.stableTimer=setTimeout(()=>{e.wsState==="open"&&e.reconnect.reset()},rt),this.emitConnectionStatus(),this.sendConnectEnvelope(e),this.markShardPendingAck(t),this.clearResubscribeQueue(e);for(const i of this.subscriptions.all())l(i.shardKey)===l(t)&&this.queueResubscribe(i);if(this.resendShapeSubscriptions(t),e.pendingUnsubscribes.length>0){const i=e.pendingUnsubscribes;e.pendingUnsubscribes=[];for(const{id:n,type:a}of i)v(e,{id:n,type:a})}this.flushPendingStreams(e);const r=this.whisperHandlers.get(l(t));if(r)for(const i of r.keys())v(e,{topic:i,type:"whisper_subscribe"});this.flushOfflineQueue(t).catch(()=>{})}}))}flushPendingStreams(e){if(!e.pendingStreams||e.pendingStreams.length===0)return;const t=e.pendingStreams;e.pendingStreams=[];for(const s of t){const r=v(e,s)?this.streams.get(String(s.id)):void 0;r&&(r.started=!0)}}cancelStream(e,t){const s=this.getConnection(t),r=this.streams.get(e);s&&(s.pendingStreams=s.pendingStreams?.filter(i=>i.id!==e),!v(s,{id:e,type:"unsubscribe"})&&r?.durable===!0&&r.started&&s.pendingUnsubscribes.push({id:e,type:"unsubscribe"})),this.streams.delete(e)}handleDisconnect(e){if(this.closed||e.wsState==="idle"||e.wsState==="closed")return;e.wsState==="connecting"&&e.polling.noteFailedOpen(),this.stopHeartbeat(e),this.clearConnectionTimers(e),e.socket=void 0,e.wsState="idle",this.emitConnectionStatus(),this.markShardPendingAck(e.shardKey),this.clearResubscribeQueue(e);const t=new Set((e.pendingStreams??[]).map(r=>r.id));for(const[r,i]of this.streams)if(!(l(i.shardKey)!==l(e.shardKey)||t.has(r))){if(i.durable){const n={...i.message,...i.generation===void 0?{}:{generation:i.generation},sinceChunk:i.lastSeq};i.message=n,e.pendingStreams=[...(e.pendingStreams??[]).filter(a=>a.id!==r),n];continue}i.handle.fail(new y("STREAM_DISCONNECTED","stream terminated: WebSocket disconnected")),this.streams.delete(r)}if(this.WebSocketImpl===void 0)return;const s=e.reconnect.next();e.reconnectTimer=setTimeout(()=>{e.reconnectTimer=void 0,this.ensureSocket(e.shardKey)},s)}startHeartbeat(e,t){this.stopHeartbeat(e),!(this.heartbeatIntervalMs<=0)&&(e.heartbeatTimer=setInterval(()=>{if(!e.socket)return;const{socket:s}=e;if(Date.now()-e.lastFrameAt>this.heartbeatIntervalMs*2.5){try{s.close()}catch{}t();return}try{s.send(Ye)}catch{}},this.heartbeatIntervalMs))}stopHeartbeat(e){e.heartbeatTimer!==void 0&&(clearInterval(e.heartbeatTimer),e.heartbeatTimer=void 0)}markShardPendingAck(e){const t=l(e);for(const s of this.subscriptions.all())l(s.shardKey)===t&&(s.acked=!1)}queueResubscribe(e){const t=this.getConnection(e.shardKey);t&&(t.resubscribeQueue.push(e),this.drainResubscribeQueue(t))}drainResubscribeQueue(e){for(;e.resubscribePending.size<nt;){const t=e.resubscribeQueue.shift();if(!t)return;this.subscriptions.getById(t.id)&&this.sendSubscribeIfOpen(t)&&e.resubscribePending.set(t.id,setTimeout(()=>{this.releaseResubscribeSlot(e,t.id)},at))}}releaseResubscribeSlot(e,t){const s=e.resubscribePending.get(t);s!==void 0&&(clearTimeout(s),e.resubscribePending.delete(t),this.drainResubscribeQueue(e))}clearResubscribeQueue(e){for(const t of e.resubscribePending.values())clearTimeout(t);e.resubscribePending.clear(),e.resubscribeQueue=[]}sendSubscribeIfOpen(e){const t=this.getConnection(e.shardKey);if(t?.wsState!=="open"||e.acked)return!1;const s=e.serverCursor!==void 0&&e.serverBase!==void 0;return v(t,{id:e.id,query:{args:e.wireArgs,functionPath:e.fn.__lunoraRef,table:e.fn.__lunoraRef,...s?{sinceSeq:e.serverCursor}:{},...s&&e.serverEpoch!==void 0?{sinceEpoch:e.serverEpoch}:{}},type:"subscribe"})}sendShapeSubscribeIfOpen(e){const t=this.getConnection(e.shardKey);t?.wsState==="open"&&v(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=Os(e);if(s===void 0)return;let r;try{r=JSON.parse(s)}catch{return}if(r.type!=="error"&&this.getConnection(t)?.reconnect.reset(),typeof r.id=="string"){const i=this.getConnection(t);i&&this.releaseResubscribeSlot(i,r.id)}switch(r.type){case"ack":{const i=this.subscriptions.getById(r.id);i&&(i.acked=!0);return}case"chunk":{const{data:i,generation:n,id:a,seq:o}=r,h=this.streams.get(a);h&&typeof o=="number"&&(h.lastSeq=o,typeof n=="number"&&(h.generation=n),h.durable=!0),h?.handle.push(g(i));return}case"complete":{this.handleCompleteMessage(r.id);return}case"data":case"delta":{this.handleDataMessage(r);return}case"error":{this.handleErrorMessage(r);break}case"identity":{this.handleIdentityFrame(r,t);break}case"pokeEnd":{this.handlePokeEnd(r,t);break}case"pokePart":{this.handlePokePart(r,t);break}case"pokeStart":{this.handlePokeStart(r,t);break}case"resume":{this.handleResumeMessage(r);break}case"settled":{this.handleSettledMessage(r);break}case"whisper":{this.dispatchWhisper(r,t);break}}}handleErrorMessage(e){if(e.error?.code==="TOKEN_EXPIRED"){this.notifyTokenExpired();return}const{id:s}=e,r=s===void 0?void 0:this.streams.get(s);if(r&&s!==void 0){r.handle.fail(_s(e)),this.streams.delete(s);return}const i=s===void 0?void 0:this.subscriptions.getById(s);if(i){const a=se(e),o=this.identityFingerprint(),h=T.keyOf(i);E(i.errorCallbacks,a),this.tabCoordinator?.isLeader()&&this.tabCoordinator.broadcastSubscriptionError(h,a,o);return}const n=s===void 0?void 0:this.shapeSubscriptions.get(s);n&&E(n.errorCallbacks,se(e))}pokeBufferKey(e,t){return`${l(e)}\0${t}`}handlePokeStart(e,t){J(this.pokeBuffers,ce.MAX_POKE_BUFFERS),this.pokeBuffers.set(this.pokeBufferKey(t,e.pokeId),{baseCheckpoint:e.baseCheckpoint,bases:new Map,epoch:e.epoch,lastMutationId:new Map,parts:new Map,resets:new Set})}handlePokePart(e,t){const s=this.pokeBuffers.get(this.pokeBufferKey(t,e.pokeId));if(!s)return;const r=s.parts.get(e.shapeId)??[];for(const n of e.rowsPatch)r.push(n.value===void 0?n:{...n,value:g(n.value)});s.parts.set(e.shapeId,r),e.lastMutationId!==void 0&&s.lastMutationId.set(e.shapeId,e.lastMutationId);const i=e.baseCheckpoint??s.baseCheckpoint;i!==void 0&&s.bases.set(e.shapeId,i),e.reset===!0&&s.resets.add(e.shapeId)}handlePokeEnd(e,t){const s=this.pokeBufferKey(t,e.pokeId),r=this.pokeBuffers.get(s);if(r){this.pokeBuffers.delete(s);for(const i of r.parts.keys()){const n=this.shapeSubscriptions.get(i);n&&this.applyPokePart(n,r,e)}}}applyPokePart(e,t,s){const r=t.parts.get(e.id)??[],i=t.resets.has(e.id),n=t.bases.get(e.id),a=t.epoch!==void 0&&e.serverEpoch!==void 0&&t.epoch!==e.serverEpoch,o=n!==void 0&&e.serverCursor!==void 0&&e.serverCursor!==n;if(!i&&(a||o)){e.rows.clear(),e.serverCursor=void 0,e.serverEpoch=void 0,this.emitShapeRows(e),this.sendShapeSubscribeIfOpen(e);return}i&&e.rows.clear(),Je(e.rows,r),s.checkpoint!==void 0&&(e.serverCursor=s.checkpoint),s.epoch!==void 0&&(e.serverEpoch=s.epoch);const h=t.lastMutationId.get(e.id);h!==void 0&&(e.lastMutationId=h),this.emitShapeRows(e),e.onCheckpoint?.({checkpoint:e.serverCursor,mutationId:e.lastMutationId})}resnapshotSubscription(e){e.acked=!1,e.serverCursor=void 0,e.serverEpoch=void 0,console.warn("[lunora] could not merge a row delta into the cached result; re-subscribing for a full snapshot"),this.sendSubscribeIfOpen(e)}emitShapeRows(e){const t=[...e.rows.values()];for(const s of e.callbacks)try{s(t)}catch{}}handleDataMessage(e,t){const{id:s}=e,r=s?this.subscriptions.getById(s):void 0;if(!r)return;let i;try{i=this.resolveDataPayload(e,r)}catch(n){E(r.errorCallbacks,{code:"WIRE_DECODE_FAILED",message:`could not decode a server frame for this subscription — ${n instanceof Error?n.message:String(n)}`});return}if(i===X){this.resnapshotSubscription(r);return}if(r.serverBase=i,this.dropCacheSeed(T.keyOf(r)),e.cursor!==void 0&&(r.serverCursor=e.cursor),e.epoch!==void 0&&(r.serverEpoch=e.epoch),e.lastMutationId!==void 0){r.lastMutationId=Math.max(r.lastMutationId??0,e.lastMutationId);for(const n of r.checkpointCallbacks)n({checkpoint:r.serverCursor,mutationId:r.lastMutationId,rowsFollow:!0})}if(this.persistQueryValue(r),U(r,r.serverCursor),t!==void 0&&ke(r,t),_(r,I(i,r.optimisticLayers)),this.tabCoordinator?.isLeader()){const n=T.keyOf(r);this.tabCoordinator.broadcastSubscriptionData(n,i,r.serverCursor,r.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&&(t.lastMutationId=Math.max(t.lastMutationId??0,e.lastMutationId));for(const s of t.checkpointCallbacks)s({checkpoint:t.serverCursor,mutationId:t.lastMutationId});if(this.tabCoordinator?.isLeader()){const s=T.keyOf(t);this.tabCoordinator.broadcastSubscriptionSettled(s,t.serverCursor,t.serverEpoch,t.lastMutationId,this.clientId,this.identityFingerprint())}}}ackAndAdvanceCursor(e,t,s){e.acked=!0,(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),U(e,e.serverCursor)&&_(e,I(e.serverBase,e.optimisticLayers)))}resolveDataPayload(e,t){if("data"in e&&e.data!==void 0)return g(e.data);const s=g(e.delta);return pe(s)?t.serverBase===void 0?s:me(t.serverBase,s)??X:s}dispatchWhisper(e,t){const s=this.whisperHandlers.get(l(t))?.get(e.topic);if(!s)return;const r=g(e.data);for(const i of s)try{i(r,e.from)}catch{}}notifyTokenExpired(){this.tokenExpiredListeners.emit()}handleCompleteMessage(e){const t=this.streams.get(e);if(t){t.handle.complete(),this.streams.delete(e);return}const s=this.subscriptions.getById(e);s&&(s.acked=!1,E(s.errorCallbacks,{code:"SUBSCRIPTION_CANCELLED",message:"subscription was cancelled by the server"}))}unpersist(e){e&&this.persistence?.remove(e).catch(t=>{_e(this.onPersistenceError,"remove",t,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 r=0;r<e.length;r+=1){const i=e.charCodeAt(r);t^=i,t=Math.imul(t,16777619),s=Math.imul(s,33)+i}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&&ee(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)}handleIdentityFrame(e,t){const s=this.getConnection(t)?.identityQuestion,{subject:r}=e;s===void 0||r!==null&&typeof r!="string"||this.adoptCookieSubject(r,s)||!this.closed&&this.authToken===null&&(r===null?null:`subj:${r}`)!==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}rejectQueuedForIdentityChange(e){const t=this.offlineQueue.drain(),s=[];for(const r of t){if(this.replayIdentityVerdict(this.stampOf(r))!=="mismatch"){s.push(r);continue}this.queuedIdentities.delete(r.id??""),this.unpersist(r.id);const i=new Error("offline mutation discarded: auth identity changed before replay");i.code="OFFLINE_IDENTITY_CHANGED",r.reject(i),this.emitItemSettled(r,"rejected",i)}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,r]of this.queuedIdentities)r===e&&this.queuedIdentities.set(s,t);this.offlineQueue.restampIdentity(e,t)}restampWatermarks(e,t){const s=e??"",r=this.clientWatermarks.get(s);if(r===void 0)return;this.clientWatermarks.delete(s);const i=t??"",n=this.clientWatermarks.get(i);if(n===void 0)this.clientWatermarks.set(i,r);else for(const[a,o]of r)n.set(a,o)}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.revokeCacheSeededValues();for(const e of this.subscriptions.all())e.serverBase=void 0,e.serverCursor=void 0,e.serverEpoch=void 0,e.acked=!1,_(e,I(void 0,e.optimisticLayers));for(const e of this.shapeSubscriptions.values())e.rows.clear(),e.serverCursor=void 0,e.serverEpoch=void 0,this.emitShapeRows(e);this.bounceShardSockets(),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()}bounceShardSockets(){for(const e of this.connections.values())if(e.socket){e.retired=!0;try{e.socket.close()}catch{}}}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 r=(async()=>{await(s??Promise.resolve());try{await this.drainOfflineQueue(e)}catch{}})();this.offlineFlushes.set(t,r),await r,this.offlineFlushes.get(t)===r&&this.offlineFlushes.delete(t)}async drainOfflineQueue(e){const t=this.offlineQueue.drainConflict();for(const h of t){this.unpersist(h.id),this.queuedIdentities.delete(h.id??"");const d=new Error("offline mutation skipped: precondition failed before replay");d.code="OFFLINE_PRECONDITION_FAILED",this.emitItemSettled(h,"rejected",d)}const s=l(e),r=this.offlineQueue.drain(h=>l(h.shardKey)===s);if(r.length===0)return;const i=[],n=[];for(const h of r){const d=this.replayGateVerdict(h);d==="send"?i.push(h):d==="hold"&&n.push(h)}if(this.offlineQueue.requeue(n),n.length>0&&this.subjectAwaitingReconfirm()&&(this.getCurrentUser().catch(()=>{}),this.noteHeldRetryDelay(e)),i.length===0){this.scheduleRateLimitedRetry(e);return}const a=this.encodableOrSettleTerminal(i);if(a.length===0){this.scheduleRateLimitedRetry(e);return}if(a.length===1){await this.replaySequential(a,e),this.scheduleRateLimitedRetry(e);return}const o=[];for(let h=0;h<a.length;h+=x){const d=a.slice(h,h+x),u=await this.replayBatched(d,e);if(o.push(...u.requeue),u.stop){o.push(...a.slice(h+x));break}}o.length>0&&this.offlineQueue.requeue(o),this.scheduleRateLimitedRetry(e)}noteHeldRetryDelay(e){const t=l(e),s=this.replayRetryState.get(t),r=(s?.attempts??0)+1;this.replayRetryState.set(t,{attempts:r,delayMs:Math.max(s?.delayMs??0,Re(r))})}noteReplayRetryDelay(e,t){const s=l(e),r=this.replayRetryState.get(s),i=(r?.attempts??0)+1,n=Pe(t,i);this.replayRetryState.set(s,{attempts:i,delayMs:n===void 0?r?.delayMs:Math.max(r?.delayMs??0,n)})}scheduleRateLimitedRetry(e){const t=l(e),s=this.replayRetryState.get(t),r=s?.delayMs;if(s===void 0||r===void 0||this.closed||this.offlineQueue.size===0){this.replayRetryState.delete(t);return}s.delayMs=void 0;const i=this.replayRetryTimers.get(t);i!==void 0&&clearTimeout(i),this.replayRetryTimers.set(t,setTimeout(()=>{this.replayRetryTimers.delete(t),this.flushOfflineQueue(e).catch(()=>{})},r))}encodableOrSettleTerminal(e){const t=[];for(const s of e)try{k(s.args,`args for '${s.functionPath}'`),t.push(s)}catch(r){this.settleReplayTerminal(s,r instanceof Error?r:new Error(String(r)))}return t}replayGateVerdict(e){const t=this.stampOf(e);if(t===void 0)return this.queuedIdentities.delete(e.id??""),"send";const s=this.replayIdentityVerdict(t);if(s==="unknown")return"hold";if(this.queuedIdentities.delete(e.id??""),s==="match")return"send";this.unpersist(e.id);const r=new Error("offline mutation skipped: auth identity changed before replay");return r.code="OFFLINE_IDENTITY_CHANGED",e.reject(r),this.emitItemSettled(e,"rejected",r),"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 r=this.shardCursors.get("");r!==void 0&&(this.shardCursors.set(s,Math.max(this.shardCursors.get(s)??0,r)),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){if(this.noteIdentityMismatch(e))return!0;if(Fe(e)){const t=this.hashToken(this.authToken??"");return this.authRefusalNotifiedFor!==t&&(this.authRefusalNotifiedFor=t,this.notifyTokenExpired()),!0}return Me(e)}replayExpectation(e){return this.authToken!==null?{}:e===null?{expectSubject:null}:e?.startsWith("subj:")===!0?{expectSubject:e.slice(5)}:{}}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}settleReplayTerminal(e,t){this.unpersist(e.id),e.reject(t),this.emitItemSettled(e,"rejected",t)}async replaySequential(e,t){for(let s=0;s<e.length;s+=1){const r=e[s];if(r)try{let i;const n=await this.rpc(r.functionPath,r.args,r.shardKey,{baselineSeq:r.baselineSeq,captureBookmark:!0,clientId:r.clientId??this.clientId,...this.replayExpectation(r.identity),mutationId:r.id,onCommitCursor:a=>{i=a}});this.settleReplaySuccess(r,n,i)}catch(i){if(!this.shouldRequeueReplayFailure(i)){this.settleReplayTerminal(r,i);continue}this.noteReplayRetryDelay(t,i),this.offlineQueue.requeue(e.slice(s));return}}}async replayBatched(e,t){if(!this.fetchImpl)return{requeue:e,stop:!0};const s=JSON.stringify({calls:e.map((o,h)=>({args:k(o.args,`args for '${o.functionPath}'`),baselineSeq:o.baselineSeq,functionPath:o.functionPath,id:h,clientId:o.clientId??this.clientId,mutationId:o.id,shardKey:o.shardKey}))});if(e.length>1&&Le(s)>He)return await this.replayBatchedHalves(e,t);let r;try{r=await this.fetchImpl(C(this.url,N),{body:s,headers:this.rpcRequestHeaders({attachBookmark:!0,...this.replayExpectation(e.find(o=>o.identity!==void 0)?.identity)}),method:"POST"})}catch{return{requeue:e,stop:!0}}const i=r.headers.get("x-d1-bookmark");if(i&&this.bookmark.set(i),r.status===413&&e.length>1)return await this.replayBatchedHalves(e,t);let n;const a=r.headers.get("retry-after");try{n=await r.json()}catch{return this.settleWholeBatchError(e,L(r.status,r.statusText,a),t)}if(!n.results){const o=F(n),h=o===void 0?L(r.status,r.statusText,a):re(o,a);return this.settleWholeBatchError(e,h,t)}return{requeue:this.settleReplayBatchSlots(e,n.results,t),stop:!1}}settleWholeBatchError(e,t,s){if(t instanceof G||t.code!==void 0&&this.shouldRequeueReplayFailure(t))return this.noteReplayRetryDelay(s,t),{requeue:e,stop:!0};for(const r of e)this.settleReplayTerminal(r,t);return{requeue:[],stop:!1}}async replayBatchedHalves(e,t){const s=Math.ceil(e.length/2),r=await this.replayBatched(e.slice(0,s),t);if(r.stop)return{requeue:[...r.requeue,...e.slice(s)],stop:!0};const i=await this.replayBatched(e.slice(s),t);return{requeue:[...r.requeue,...i.requeue],stop:i.stop}}settleReplayBatchSlots(e,t,s){const r=new Map;for(const n of t)typeof n.id=="number"&&n.body!==void 0&&r.set(n.id,n.body);const i=[];for(const[n,a]of e.entries()){const o=r.get(n);if(o===void 0)i.push(a);else if("error"in o){const h=oe(o);this.shouldRequeueReplayFailure(h)?(this.noteReplayRetryDelay(s,h),i.push(a)):this.settleReplayTerminal(a,h)}else this.settleReplaySuccess(a,g(o.result),o.commitCursor)}return i}}export{ce as LunoraClient};
|
package/dist/packem_shared/{SubscriptionRegistry-CS-AFUI9.mjs → SubscriptionRegistry-C3kLqped.mjs}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{s as i}from"./wire-key-
|
|
1
|
+
import{s as i}from"./wire-key-DCPYV4t8.mjs";class r{static key(e,y,t){return`${e}::${i(y)}::${t??""}`}static keyOf(e){return`${e.fn.__lunoraRef}::${e.argsKey}::${e.shardKey??""}`}byKey=new Map;byId=new Map;get(e){return this.byKey.get(e)}getById(e){return this.byId.get(e)}add(e){this.byKey.set(r.keyOf(e),e),this.byId.set(e.id,e)}remove(e){const y=r.keyOf(e);this.byKey.get(y)===e&&this.byKey.delete(y),this.byId.delete(e.id)}all(){return[...this.byKey.values()]}clear(){this.byKey.clear(),this.byId.clear()}}export{r as SubscriptionRegistry};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{a as e,i}from"./delta-merge-D_5ChS-C.mjs";export{e as applyDelta,i as isMutationDelta};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{d,e as y}from"./wire-codec-
|
|
1
|
+
import{d,e as y}from"./wire-codec-BeIi1K-T.mjs";import{assertMaxEntries as u}from"./createInMemoryQueryCache-D2uNHLfM.mjs";import{s as f}from"./single-blob-store-DrhzObic.mjs";const m="lunora:query-cache",w=50,p=s=>{const c=u(s.maxEntries??w,"createAsyncStorageQueryCache"),t=f(s.storage,s.key??m),o=async()=>{const e=d(await t.read());return typeof e=="object"&&e!==null&&!Array.isArray(e)?new Map(Object.entries(e)):new Map},n=e=>t.write(y(Object.fromEntries(e))),i=e=>{if(e.size<=c)return;const a=[...e.values()].toSorted((r,l)=>r.ts-l.ts);for(const r of a){if(e.size<=c)break;e.delete(r.key)}};return{clear:t.clear,load:()=>t.serialize(async()=>[...(await o()).values()]),put:(e,a)=>t.serialize(async()=>{const r=await o();r.set(e,{...a,key:e}),i(r),await n(r)}),remove:e=>t.serialize(async()=>{const a=await o();a.delete(e)&&await n(a)})}};export{p as createAsyncStorageQueryCache};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
import{c as t}from"./local-store-DDppw8Qr.mjs";import"./SubscriptionRegistry-C3kLqped.mjs";export{t as createLocalStore};
|
package/dist/packem_shared/{createServerClient-C0jOZaix.mjs → createServerClient-DqNe__QI.mjs}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{LunoraClient as r}from"./LunoraClient-
|
|
1
|
+
import{LunoraClient as r}from"./LunoraClient-DSEbwI7V.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 +1 @@
|
|
|
1
|
-
import{s as a}from"./wire-key-
|
|
1
|
+
import{s as a}from"./wire-key-DCPYV4t8.mjs";const c=(t,r,n,o)=>{const e=t.peekActiveQuerySnapshot(r.__lunoraRef,n,o),p=e.present?a(e.value):void 0;return()=>{const s=t.peekActiveQuerySnapshot(r.__lunoraRef,n,o);return!e.present||!s.present?!0:a(s.value)===p}};export{c as default};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{i as g}from"./wire-codec-
|
|
1
|
+
import{i as g}from"./wire-codec-BeIi1K-T.mjs";const c="_id",d="_creationTime",u="page",m="pageDelta",y=t=>{if(Array.isArray(t))return t;if(g(t)&&Array.isArray(t[u]))return t[u]},l=t=>{let e;for(const n of t){const o=n[d];if(typeof o=="number"){if(e!==void 0){if(o<e)return!0;if(o>e)return!1}e=o}}return!1},x=(t,e)=>{const n=e[d];if(typeof n!="number")return t.length;const o=l(t);for(const[f,s]of t.entries()){const r=s[d];if(typeof r=="number"&&(o?r<n:r>n))return f}return t.length},A=t=>{if(typeof t!="object"||t===null)return;const e=t[c];return typeof e=="string"?e:void 0},b=t=>{if(typeof t!="object"||t===null)return!1;const e=t;return typeof e.key=="string"&&typeof e.table=="string"&&(e.op==="insert"||e.op==="update"||e.op==="delete")},I=(t,e)=>{const n=[];for(const i of t){if(A(i)===void 0)return;n.push(i)}const{key:o,op:f,row:s}=e;if(f==="delete"){const i=n.filter(p=>p[c]!==o);return i.length===n.length?[...n]:i}if(s===void 0)return;const r=[...n],a=n.findIndex(i=>i[c]===o);return a===-1?r.splice(x(n,s),0,s):r[a]=s,r},E=(t,e)=>{const n=y(t);if(n===void 0)return;const o=I(n,e);return o===void 0||Array.isArray(t)?o:{...t,[u]:o}};export{m as P,E as a,b as i};
|
package/dist/packem_shared/{deserializePreloaded-C6NTQdFa.mjs → deserializePreloaded-Bffy70Wm.mjs}
RENAMED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{d as r,e as i}from"./wire-codec-
|
|
1
|
+
import{d as r,e as i}from"./wire-codec-BeIi1K-T.mjs";const d=e=>JSON.stringify(i(e)).replaceAll("<",String.raw`\u003c`),o=e=>r(JSON.parse(e));export{o as deserializePreloaded,d as serializePreloaded};
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import{LunoraError as f}from"@lunora/errors";import{d as p}from"./wire-codec-
|
|
1
|
+
import{LunoraError as f}from"@lunora/errors";import{d as p}from"./wire-codec-BeIi1K-T.mjs";import{createStream as u}from"./DEFAULT_MAX_BUFFER-D3QH2iaq.mjs";const m=/^ /u,h=t=>typeof t=="object"&&t!==null?JSON.stringify(t):String(t),S=t=>{let s="";const e=[];for(const o of t.split(`
|
|
2
2
|
`))o.startsWith("event:")?s=o.slice(6).replace(m,""):o.startsWith("data:")&&e.push(o.slice(5).replace(m,""));return{data:e.join(`
|
|
3
3
|
`),event:s}},T=(t,s,e)=>{const o=s.params??{},c=t.path.split("/").map(a=>{if(!a.startsWith(":"))return a;const n=a.slice(1),r=o[n];if(r===void 0)throw new f("HTTP_STREAM_MISSING_PARAM",`httpStream: missing path param ":${n}" for route ${t.path}`);return encodeURIComponent(h(r))}).join("/"),i=new URLSearchParams;for(const[a,n]of Object.entries(s.searchParams??{}))n!==void 0&&i.set(a,h(n));const l=i.toString();return`${e.endsWith("/")?e.slice(0,-1):e}${c}${l===""?"":`?${l}`}`},E=(t,s)=>{if(t.event==="complete")return s.complete(),!0;if(t.event==="error"){let e={};try{e=JSON.parse(t.data)}catch{}const o=typeof e.message=="string"?e.message:"stream error",c=typeof e.code=="string"?e.code:"HTTP_STREAM_ERROR";return s.fail(new f(c,o)),!0}if((t.event===""||t.event==="message")&&t.data!=="")try{s.push(p(JSON.parse(t.data)))}catch{return s.fail(new f("HTTP_STREAM_BAD_CHUNK","httpStream: malformed SSE chunk (invalid JSON)")),!0}return!1},b=async(t,s)=>{const e=t.getReader(),o=new TextDecoder;let c="",i=!1;const l=a=>{let n=i?`\r${a}`:a;i=n.endsWith("\r"),i&&(n=n.slice(0,-1)),c+=n.replaceAll(`\r
|
|
4
4
|
`,`
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{SubscriptionRegistry as m}from"./SubscriptionRegistry-
|
|
1
|
+
import{SubscriptionRegistry as m}from"./SubscriptionRegistry-C3kLqped.mjs";let f=0;const L=()=>f,p=(r,e)=>{let t=r;for(const i of e)try{t=i.transform(t)}catch{}return t},d=(r,e)=>{if(e!==r.lastValue){r.lastValue=e;for(const t of r.callbacks)try{t(e)}catch{}}},y=(r,e)=>{let t;try{t=e(r.lastValue)}catch{return}const i={id:Symbol("optimistic"),transform:e};let c=!1;r.optimisticLayers.push(i),d(r,t);const a=()=>{const o=r.optimisticLayers.findIndex(n=>n.id===i.id);return o===-1?!1:(r.optimisticLayers.splice(o,1),!0)},s=()=>{d(r,p(r.serverBase,r.optimisticLayers))};return{confirm:o=>{if(o===void 0){a();return}i.commitCursor=o,f+=1,i.acknowledgedAt=f,r.serverCursor!==void 0&&r.serverCursor>=o&&a()&&s()},rollback:()=>{c||(c=!0,a(),s())}}},k=(r,e)=>{if(e===void 0||r.optimisticLayers.length===0)return!1;const t=r.optimisticLayers.length;return r.optimisticLayers=r.optimisticLayers.filter(i=>i.commitCursor===void 0||i.commitCursor>e),r.optimisticLayers.length!==t},h=(r,e)=>{r.optimisticLayers.length!==0&&(r.optimisticLayers=r.optimisticLayers.filter(t=>t.acknowledgedAt===void 0||t.acknowledgedAt>e))},v=(r,e)=>{const t=[],i=[],c=(s,o)=>r.get(m.key(s,o,e));return{confirms:t,rollbacks:i,store:{getAllQueries:s=>{const o=[];for(const n of r.all())n.fn.__lunoraRef===s.__lunoraRef&&(n.shardKey??"")===(e??"")&&o.push({args:n.args,value:n.lastValue});return o},getQuery:(s,o)=>c(s.__lunoraRef,o??{})?.lastValue,setQuery:(s,o,n)=>{const u=c(s.__lunoraRef,o??{});if(!u)return;const l=y(u,()=>n);l&&(t.push(l.confirm),i.push(l.rollback))}}}};export{y as a,h as b,v as c,k as d,L as e,p as f,d as n};
|
package/dist/packem_shared/{lunora-client.d-DWo4CzIH.d.mts → lunora-client.d-CxU0UvII.d.mts}
RENAMED
|
@@ -870,6 +870,16 @@ interface ServerWhisperMessage {
|
|
|
870
870
|
topic: string;
|
|
871
871
|
type: "whisper";
|
|
872
872
|
}
|
|
873
|
+
/**
|
|
874
|
+
* The user the shard authenticated this socket as, sent in reply to every
|
|
875
|
+
* `connect` frame. `subject` is the resolved user id, or `null` when the socket
|
|
876
|
+
* is anonymous. A cookie-session client reads it to learn who it is — a
|
|
877
|
+
* sign-out or another user's sign-in changes nothing else it can see.
|
|
878
|
+
*/
|
|
879
|
+
interface ServerIdentityMessage {
|
|
880
|
+
subject: null | string;
|
|
881
|
+
type: "identity";
|
|
882
|
+
}
|
|
873
883
|
/**
|
|
874
884
|
* One row-level change in a shape's replication stream — the wire form of the
|
|
875
885
|
* DO's `__cdc_log` `CdcChange`. `insert`/`update` carry the post-image in
|
|
@@ -949,7 +959,7 @@ interface ServerPokeEndMessage {
|
|
|
949
959
|
pokeId: string;
|
|
950
960
|
type: "pokeEnd";
|
|
951
961
|
}
|
|
952
|
-
type ServerMessage = ServerAckMessage | ServerChunkMessage | ServerCompleteMessage | ServerDataMessage | ServerErrorMessage | ServerPokeEndMessage | ServerPokePartMessage | ServerPokeStartMessage | ServerResumeMessage | ServerSettledMessage | ServerWhisperMessage;
|
|
962
|
+
type ServerMessage = ServerAckMessage | ServerChunkMessage | ServerCompleteMessage | ServerDataMessage | ServerErrorMessage | ServerIdentityMessage | ServerPokeEndMessage | ServerPokePartMessage | ServerPokeStartMessage | ServerResumeMessage | ServerSettledMessage | ServerWhisperMessage;
|
|
953
963
|
/**
|
|
954
964
|
* The authenticated user as exposed client-side, mirroring better-auth's
|
|
955
965
|
* `user` row (the `user` field of the `get-session` response). Kept minimal
|
|
@@ -1653,6 +1663,16 @@ interface MutationCallOptions<TCurrent = unknown, TValue = unknown, TArgs = unkn
|
|
|
1653
1663
|
* Omit for normal calls.
|
|
1654
1664
|
*/
|
|
1655
1665
|
replayBaseline?: null | number;
|
|
1666
|
+
/**
|
|
1667
|
+
* The identity stamp a durable write was queued under
|
|
1668
|
+
* ({@link import("./types").OutboxMutation.identity}), handed back by the
|
|
1669
|
+
* sink's replay. Under a cookie session the request then names that user,
|
|
1670
|
+
* and the worker refuses it with `IDENTITY_MISMATCH` when the cookie now
|
|
1671
|
+
* belongs to someone else — the check {@link LunoraClient.replayIdentityVerdict}
|
|
1672
|
+
* cannot make, because the client cannot see the cookie. Omit for normal
|
|
1673
|
+
* calls.
|
|
1674
|
+
*/
|
|
1675
|
+
replayIdentity?: null | string;
|
|
1656
1676
|
shardKey?: string;
|
|
1657
1677
|
}
|
|
1658
1678
|
/** Callback a shape subscription invokes with its materialized rowset on every applied poke. */
|
|
@@ -1915,6 +1935,25 @@ declare class LunoraClient {
|
|
|
1915
1935
|
* the token cannot: is this still the current question?
|
|
1916
1936
|
*/
|
|
1917
1937
|
private sessionProbeGeneration;
|
|
1938
|
+
/**
|
|
1939
|
+
* Monotonic id of every question this client asks the server about who it
|
|
1940
|
+
* is: each `/get-session` probe, and each cookie-authenticated socket upgrade
|
|
1941
|
+
* (answered by the `identity` frame the shard sends on `connect`). Probes
|
|
1942
|
+
* take their `sessionProbeGeneration` from it, so both kinds of
|
|
1943
|
+
* answer share one order.
|
|
1944
|
+
*/
|
|
1945
|
+
private identityQuestions;
|
|
1946
|
+
/**
|
|
1947
|
+
* The `identityQuestions` id of the newest answer adopted so far. A
|
|
1948
|
+
* cookie-session answer older than it describes an older cookie — a socket
|
|
1949
|
+
* upgraded before a probe that has since answered — and may not move the
|
|
1950
|
+
* identity back. See `adoptCookieSubject`.
|
|
1951
|
+
*/
|
|
1952
|
+
private identityAnsweredAt;
|
|
1953
|
+
/** Unregisters this client from the page's session-change signal (`shared/session-change.ts`); set in the constructor. */
|
|
1954
|
+
private releaseSessionChangeListener;
|
|
1955
|
+
/** Whether the one-time `IDENTITY_MISMATCH` configuration warning has been logged (see `noteIdentityMismatch`). */
|
|
1956
|
+
private warnedIdentityDisagreement;
|
|
1918
1957
|
/**
|
|
1919
1958
|
* Whether anything resolves this client's identity at all.
|
|
1920
1959
|
*
|
|
@@ -2205,9 +2244,17 @@ declare class LunoraClient {
|
|
|
2205
2244
|
/**
|
|
2206
2245
|
* Subscribe to a user switch or sign-out: fired after {@link setAuthToken}
|
|
2207
2246
|
* retires the previous identity's session, i.e. every live subscription has
|
|
2208
|
-
* just been blanked to `undefined` and its socket closed. Not fired when
|
|
2209
|
-
* identity is first established from signed-out (nothing is
|
|
2210
|
-
* when a subject is attached to the same credential
|
|
2247
|
+
* just been blanked to `undefined` and its socket closed. Not fired when a
|
|
2248
|
+
* bearer identity is first established from signed-out (nothing is
|
|
2249
|
+
* retired), nor when a subject is attached to the same credential, nor on
|
|
2250
|
+
* a cookie session's first answer after page load.
|
|
2251
|
+
*
|
|
2252
|
+
* A cookie session fires it on every change the server reports — sign-out,
|
|
2253
|
+
* a sign-in after a known sign-out, a different user — whether the answer
|
|
2254
|
+
* came from {@link getCurrentUser} or from a socket's `identity` frame. Its
|
|
2255
|
+
* sign-out changes nothing the client can observe on its own; in a browser
|
|
2256
|
+
* the client also re-resolves whenever `@lunora/auth-ui` or the
|
|
2257
|
+
* `lunoraSessionSync()` better-auth plugin reports a session change.
|
|
2211
2258
|
*
|
|
2212
2259
|
* For caches layered on top of the client. A subscriber only hears the
|
|
2213
2260
|
* blank for queries it still subscribes to, so a cache that keeps values for
|
|
@@ -2239,6 +2286,10 @@ declare class LunoraClient {
|
|
|
2239
2286
|
* knows the answer — leaving it to each adapter is what left the sticky-subject
|
|
2240
2287
|
* contract unreached in every shipped one, so a routine JWT refresh read as a
|
|
2241
2288
|
* user switch and discarded the user's own queued writes and read cache.
|
|
2289
|
+
*
|
|
2290
|
+
* Under a cookie session (no token held) the answer is adopted whatever it
|
|
2291
|
+
* is, "no session" included, and a change from the identity already known
|
|
2292
|
+
* retires the previous session — see {@link onIdentityChange}.
|
|
2242
2293
|
*/
|
|
2243
2294
|
getCurrentUser(): Promise<User | null>;
|
|
2244
2295
|
/**
|
|
@@ -3732,7 +3783,8 @@ declare class LunoraClient {
|
|
|
3732
3783
|
* once per socket open, so the server's `onConnect` hooks fire symmetrically
|
|
3733
3784
|
* with `onDisconnect` (which the DO dispatches unconditionally at close for
|
|
3734
3785
|
* every lifecycle-aware socket). The DO no-ops cheaply when no `onConnect`
|
|
3735
|
-
* hooks are registered,
|
|
3786
|
+
* hooks are registered, and answers with the socket's `identity` frame
|
|
3787
|
+
* (see `handleIdentityFrame`).
|
|
3736
3788
|
*
|
|
3737
3789
|
* The shard's registered context (or the client-wide default) rides along
|
|
3738
3790
|
* when one is set — the DO records it on the attachment for replay to
|
|
@@ -4074,19 +4126,78 @@ declare class LunoraClient {
|
|
|
4074
4126
|
* Key the offline-queue identity on the resolved user id rather than the
|
|
4075
4127
|
* token bytes, so the NEXT token refresh keeps the same identity.
|
|
4076
4128
|
*
|
|
4077
|
-
*
|
|
4078
|
-
* empty session resolves `null` for reasons that say nothing about who
|
|
4079
|
-
*
|
|
4080
|
-
*
|
|
4081
|
-
*
|
|
4129
|
+
* Under a bearer token only a resolved user labels anything. A 401 or an
|
|
4130
|
+
* empty session resolves `null` for reasons that say nothing about who holds
|
|
4131
|
+
* the token, so the established label is left alone rather than cleared
|
|
4132
|
+
* (which would look like an identity change and drop the queue). A token
|
|
4133
|
+
* that rotated mid-flight belongs to a session this answer predates and is
|
|
4134
|
+
* ignored for the same reason.
|
|
4082
4135
|
*
|
|
4083
|
-
*
|
|
4084
|
-
*
|
|
4085
|
-
*
|
|
4086
|
-
*
|
|
4087
|
-
*
|
|
4136
|
+
* Under a cookie session (no token) the answer is the identity, `null`
|
|
4137
|
+
* included: nothing on the client changes when the user signs out, so "the
|
|
4138
|
+
* server found no session" is the only sign-out this client will ever see.
|
|
4139
|
+
* See {@link adoptCookieSubject}.
|
|
4140
|
+
*
|
|
4141
|
+
* A superseded probe is ignored too, and the token check cannot see it: on a
|
|
4142
|
+
* cookie app both `requestToken`s are `null`, so a slow answer from an OLDER
|
|
4143
|
+
* probe passed that check and overwrote the subject a newer one had already
|
|
4144
|
+
* established. `requestGeneration` is the question's id — it must still be
|
|
4145
|
+
* the current one at the moment of the write.
|
|
4088
4146
|
*/
|
|
4089
4147
|
private adoptResolvedSubject;
|
|
4148
|
+
/**
|
|
4149
|
+
* Adopt the user a cookie session resolved to — `null` for nobody — as this
|
|
4150
|
+
* client's identity, from either source the server answers through: a
|
|
4151
|
+
* `/get-session` probe, or a socket's `identity` frame.
|
|
4152
|
+
*
|
|
4153
|
+
* Three states, told apart by `authSubject`: `undefined` is not known yet
|
|
4154
|
+
* (every page load until the first answer), `null` is known to be nobody,
|
|
4155
|
+
* and a string is that user. {@link setAuthToken} retires the previous
|
|
4156
|
+
* session on every change between two KNOWN states — `A → nobody`,
|
|
4157
|
+
* `nobody → B`, `A → B` — and on none out of `undefined`, so the first
|
|
4158
|
+
* answer after a page load never evicts what the page is already showing
|
|
4159
|
+
* for the session it was loaded under.
|
|
4160
|
+
*
|
|
4161
|
+
* `question` orders the answers: one older than the answer in force
|
|
4162
|
+
* describes an older cookie and is dropped. Returns whether it was adopted.
|
|
4163
|
+
*/
|
|
4164
|
+
private adoptCookieSubject;
|
|
4165
|
+
/**
|
|
4166
|
+
* A cookie socket's `identity` frame: the user the shard authenticated this
|
|
4167
|
+
* socket as, sent in reply to every `connect`.
|
|
4168
|
+
*
|
|
4169
|
+
* Adopted like a probe's answer when it is the newest one
|
|
4170
|
+
* ({@link adoptCookieSubject}). An OLDER one that disagrees with the
|
|
4171
|
+
* identity in force means this socket was upgraded on a cookie that has
|
|
4172
|
+
* since changed hands, and is still delivering that user's rows: the
|
|
4173
|
+
* session it belongs to is retired, which replaces the socket.
|
|
4174
|
+
*
|
|
4175
|
+
* Ignored for a socket that authenticated with a token rather than the
|
|
4176
|
+
* cookie (see `ShardConnection.identityQuestion`) — its answer is about that
|
|
4177
|
+
* token, not about the cookie session this client's identity tracks.
|
|
4178
|
+
*/
|
|
4179
|
+
private handleIdentityFrame;
|
|
4180
|
+
/**
|
|
4181
|
+
* The subject half of {@link setAuthToken}.
|
|
4182
|
+
*
|
|
4183
|
+
* Sticky: only an explicit value (incl. `null` = signed out) changes the
|
|
4184
|
+
* subject; omitting it keeps the established one. Two exceptions, both about
|
|
4185
|
+
* a subject that must not outlive the credential it described:
|
|
4186
|
+
*
|
|
4187
|
+
* - Clearing the token clears a user subject — see `setAuthToken`'s
|
|
4188
|
+
* docblock. A `null` one stays: a cookie session known to be nobody's is
|
|
4189
|
+
* still nobody's.
|
|
4190
|
+
* - A token arriving on a session known to be nobody's drops the `null`,
|
|
4191
|
+
* so the identity falls back to the token itself rather than staying
|
|
4192
|
+
* "nobody" while a credential is held.
|
|
4193
|
+
*/
|
|
4194
|
+
private applySubject;
|
|
4195
|
+
/**
|
|
4196
|
+
* A cookie session the server has answered "nobody" for — see
|
|
4197
|
+
* {@link adoptCookieSubject}. Distinct from a subject not known YET
|
|
4198
|
+
* (`undefined`).
|
|
4199
|
+
*/
|
|
4200
|
+
private isKnownNobody;
|
|
4090
4201
|
/**
|
|
4091
4202
|
* True while an established subject labels a credential it was never checked
|
|
4092
4203
|
* against — see the `subjectToken` field. Every replay verdict is
|
|
@@ -4373,6 +4484,30 @@ declare class LunoraClient {
|
|
|
4373
4484
|
* answer.
|
|
4374
4485
|
*/
|
|
4375
4486
|
private shouldRequeueReplayFailure;
|
|
4487
|
+
/**
|
|
4488
|
+
* The `expectSubject` a replayed write carries: the user its identity stamp
|
|
4489
|
+
* names, so the worker refuses it when the request resolves to anyone else.
|
|
4490
|
+
*
|
|
4491
|
+
* The replay gate compares the stamp with what this client believes, and
|
|
4492
|
+
* under a cookie session that belief can be stale — a sign-out and another
|
|
4493
|
+
* user's sign-in change no token, and the socket's `open` flush runs before
|
|
4494
|
+
* its `identity` frame lands. Only the server sees the cookie the write is
|
|
4495
|
+
* about to ride, so it is the server that has to check.
|
|
4496
|
+
*
|
|
4497
|
+
* Sent on every replay made without a bearer token, whatever resolved the
|
|
4498
|
+
* stamp — a socket's `identity` frame labels the session in apps that never
|
|
4499
|
+
* call `getCurrentUser()` too. An app without auth stamps `null` and its
|
|
4500
|
+
* requests resolve to nobody, so the header always passes there. A bearer
|
|
4501
|
+
* request states its credential explicitly and the gate already matched it;
|
|
4502
|
+
* a token-hash or missing stamp names no user.
|
|
4503
|
+
*/
|
|
4504
|
+
private replayExpectation;
|
|
4505
|
+
/**
|
|
4506
|
+
* Whether `failure` is the worker's `IDENTITY_MISMATCH` refusal, and if so,
|
|
4507
|
+
* ask who is signed in now: the answer is what re-runs the replay gate
|
|
4508
|
+
* ({@link setAuthToken}), and nothing else would on a cookie session.
|
|
4509
|
+
*/
|
|
4510
|
+
private noteIdentityMismatch;
|
|
4376
4511
|
/** Settle a write the server reached a coded verdict on: replaying would re-trigger the same failure (a poison-message loop), so drop it. */
|
|
4377
4512
|
private settleReplayTerminal;
|
|
4378
4513
|
/**
|
|
@@ -870,6 +870,16 @@ interface ServerWhisperMessage {
|
|
|
870
870
|
topic: string;
|
|
871
871
|
type: "whisper";
|
|
872
872
|
}
|
|
873
|
+
/**
|
|
874
|
+
* The user the shard authenticated this socket as, sent in reply to every
|
|
875
|
+
* `connect` frame. `subject` is the resolved user id, or `null` when the socket
|
|
876
|
+
* is anonymous. A cookie-session client reads it to learn who it is — a
|
|
877
|
+
* sign-out or another user's sign-in changes nothing else it can see.
|
|
878
|
+
*/
|
|
879
|
+
interface ServerIdentityMessage {
|
|
880
|
+
subject: null | string;
|
|
881
|
+
type: "identity";
|
|
882
|
+
}
|
|
873
883
|
/**
|
|
874
884
|
* One row-level change in a shape's replication stream — the wire form of the
|
|
875
885
|
* DO's `__cdc_log` `CdcChange`. `insert`/`update` carry the post-image in
|
|
@@ -949,7 +959,7 @@ interface ServerPokeEndMessage {
|
|
|
949
959
|
pokeId: string;
|
|
950
960
|
type: "pokeEnd";
|
|
951
961
|
}
|
|
952
|
-
type ServerMessage = ServerAckMessage | ServerChunkMessage | ServerCompleteMessage | ServerDataMessage | ServerErrorMessage | ServerPokeEndMessage | ServerPokePartMessage | ServerPokeStartMessage | ServerResumeMessage | ServerSettledMessage | ServerWhisperMessage;
|
|
962
|
+
type ServerMessage = ServerAckMessage | ServerChunkMessage | ServerCompleteMessage | ServerDataMessage | ServerErrorMessage | ServerIdentityMessage | ServerPokeEndMessage | ServerPokePartMessage | ServerPokeStartMessage | ServerResumeMessage | ServerSettledMessage | ServerWhisperMessage;
|
|
953
963
|
/**
|
|
954
964
|
* The authenticated user as exposed client-side, mirroring better-auth's
|
|
955
965
|
* `user` row (the `user` field of the `get-session` response). Kept minimal
|
|
@@ -1653,6 +1663,16 @@ interface MutationCallOptions<TCurrent = unknown, TValue = unknown, TArgs = unkn
|
|
|
1653
1663
|
* Omit for normal calls.
|
|
1654
1664
|
*/
|
|
1655
1665
|
replayBaseline?: null | number;
|
|
1666
|
+
/**
|
|
1667
|
+
* The identity stamp a durable write was queued under
|
|
1668
|
+
* ({@link import("./types").OutboxMutation.identity}), handed back by the
|
|
1669
|
+
* sink's replay. Under a cookie session the request then names that user,
|
|
1670
|
+
* and the worker refuses it with `IDENTITY_MISMATCH` when the cookie now
|
|
1671
|
+
* belongs to someone else — the check {@link LunoraClient.replayIdentityVerdict}
|
|
1672
|
+
* cannot make, because the client cannot see the cookie. Omit for normal
|
|
1673
|
+
* calls.
|
|
1674
|
+
*/
|
|
1675
|
+
replayIdentity?: null | string;
|
|
1656
1676
|
shardKey?: string;
|
|
1657
1677
|
}
|
|
1658
1678
|
/** Callback a shape subscription invokes with its materialized rowset on every applied poke. */
|
|
@@ -1915,6 +1935,25 @@ declare class LunoraClient {
|
|
|
1915
1935
|
* the token cannot: is this still the current question?
|
|
1916
1936
|
*/
|
|
1917
1937
|
private sessionProbeGeneration;
|
|
1938
|
+
/**
|
|
1939
|
+
* Monotonic id of every question this client asks the server about who it
|
|
1940
|
+
* is: each `/get-session` probe, and each cookie-authenticated socket upgrade
|
|
1941
|
+
* (answered by the `identity` frame the shard sends on `connect`). Probes
|
|
1942
|
+
* take their `sessionProbeGeneration` from it, so both kinds of
|
|
1943
|
+
* answer share one order.
|
|
1944
|
+
*/
|
|
1945
|
+
private identityQuestions;
|
|
1946
|
+
/**
|
|
1947
|
+
* The `identityQuestions` id of the newest answer adopted so far. A
|
|
1948
|
+
* cookie-session answer older than it describes an older cookie — a socket
|
|
1949
|
+
* upgraded before a probe that has since answered — and may not move the
|
|
1950
|
+
* identity back. See `adoptCookieSubject`.
|
|
1951
|
+
*/
|
|
1952
|
+
private identityAnsweredAt;
|
|
1953
|
+
/** Unregisters this client from the page's session-change signal (`shared/session-change.ts`); set in the constructor. */
|
|
1954
|
+
private releaseSessionChangeListener;
|
|
1955
|
+
/** Whether the one-time `IDENTITY_MISMATCH` configuration warning has been logged (see `noteIdentityMismatch`). */
|
|
1956
|
+
private warnedIdentityDisagreement;
|
|
1918
1957
|
/**
|
|
1919
1958
|
* Whether anything resolves this client's identity at all.
|
|
1920
1959
|
*
|
|
@@ -2205,9 +2244,17 @@ declare class LunoraClient {
|
|
|
2205
2244
|
/**
|
|
2206
2245
|
* Subscribe to a user switch or sign-out: fired after {@link setAuthToken}
|
|
2207
2246
|
* retires the previous identity's session, i.e. every live subscription has
|
|
2208
|
-
* just been blanked to `undefined` and its socket closed. Not fired when
|
|
2209
|
-
* identity is first established from signed-out (nothing is
|
|
2210
|
-
* when a subject is attached to the same credential
|
|
2247
|
+
* just been blanked to `undefined` and its socket closed. Not fired when a
|
|
2248
|
+
* bearer identity is first established from signed-out (nothing is
|
|
2249
|
+
* retired), nor when a subject is attached to the same credential, nor on
|
|
2250
|
+
* a cookie session's first answer after page load.
|
|
2251
|
+
*
|
|
2252
|
+
* A cookie session fires it on every change the server reports — sign-out,
|
|
2253
|
+
* a sign-in after a known sign-out, a different user — whether the answer
|
|
2254
|
+
* came from {@link getCurrentUser} or from a socket's `identity` frame. Its
|
|
2255
|
+
* sign-out changes nothing the client can observe on its own; in a browser
|
|
2256
|
+
* the client also re-resolves whenever `@lunora/auth-ui` or the
|
|
2257
|
+
* `lunoraSessionSync()` better-auth plugin reports a session change.
|
|
2211
2258
|
*
|
|
2212
2259
|
* For caches layered on top of the client. A subscriber only hears the
|
|
2213
2260
|
* blank for queries it still subscribes to, so a cache that keeps values for
|
|
@@ -2239,6 +2286,10 @@ declare class LunoraClient {
|
|
|
2239
2286
|
* knows the answer — leaving it to each adapter is what left the sticky-subject
|
|
2240
2287
|
* contract unreached in every shipped one, so a routine JWT refresh read as a
|
|
2241
2288
|
* user switch and discarded the user's own queued writes and read cache.
|
|
2289
|
+
*
|
|
2290
|
+
* Under a cookie session (no token held) the answer is adopted whatever it
|
|
2291
|
+
* is, "no session" included, and a change from the identity already known
|
|
2292
|
+
* retires the previous session — see {@link onIdentityChange}.
|
|
2242
2293
|
*/
|
|
2243
2294
|
getCurrentUser(): Promise<User | null>;
|
|
2244
2295
|
/**
|
|
@@ -3732,7 +3783,8 @@ declare class LunoraClient {
|
|
|
3732
3783
|
* once per socket open, so the server's `onConnect` hooks fire symmetrically
|
|
3733
3784
|
* with `onDisconnect` (which the DO dispatches unconditionally at close for
|
|
3734
3785
|
* every lifecycle-aware socket). The DO no-ops cheaply when no `onConnect`
|
|
3735
|
-
* hooks are registered,
|
|
3786
|
+
* hooks are registered, and answers with the socket's `identity` frame
|
|
3787
|
+
* (see `handleIdentityFrame`).
|
|
3736
3788
|
*
|
|
3737
3789
|
* The shard's registered context (or the client-wide default) rides along
|
|
3738
3790
|
* when one is set — the DO records it on the attachment for replay to
|
|
@@ -4074,19 +4126,78 @@ declare class LunoraClient {
|
|
|
4074
4126
|
* Key the offline-queue identity on the resolved user id rather than the
|
|
4075
4127
|
* token bytes, so the NEXT token refresh keeps the same identity.
|
|
4076
4128
|
*
|
|
4077
|
-
*
|
|
4078
|
-
* empty session resolves `null` for reasons that say nothing about who
|
|
4079
|
-
*
|
|
4080
|
-
*
|
|
4081
|
-
*
|
|
4129
|
+
* Under a bearer token only a resolved user labels anything. A 401 or an
|
|
4130
|
+
* empty session resolves `null` for reasons that say nothing about who holds
|
|
4131
|
+
* the token, so the established label is left alone rather than cleared
|
|
4132
|
+
* (which would look like an identity change and drop the queue). A token
|
|
4133
|
+
* that rotated mid-flight belongs to a session this answer predates and is
|
|
4134
|
+
* ignored for the same reason.
|
|
4082
4135
|
*
|
|
4083
|
-
*
|
|
4084
|
-
*
|
|
4085
|
-
*
|
|
4086
|
-
*
|
|
4087
|
-
*
|
|
4136
|
+
* Under a cookie session (no token) the answer is the identity, `null`
|
|
4137
|
+
* included: nothing on the client changes when the user signs out, so "the
|
|
4138
|
+
* server found no session" is the only sign-out this client will ever see.
|
|
4139
|
+
* See {@link adoptCookieSubject}.
|
|
4140
|
+
*
|
|
4141
|
+
* A superseded probe is ignored too, and the token check cannot see it: on a
|
|
4142
|
+
* cookie app both `requestToken`s are `null`, so a slow answer from an OLDER
|
|
4143
|
+
* probe passed that check and overwrote the subject a newer one had already
|
|
4144
|
+
* established. `requestGeneration` is the question's id — it must still be
|
|
4145
|
+
* the current one at the moment of the write.
|
|
4088
4146
|
*/
|
|
4089
4147
|
private adoptResolvedSubject;
|
|
4148
|
+
/**
|
|
4149
|
+
* Adopt the user a cookie session resolved to — `null` for nobody — as this
|
|
4150
|
+
* client's identity, from either source the server answers through: a
|
|
4151
|
+
* `/get-session` probe, or a socket's `identity` frame.
|
|
4152
|
+
*
|
|
4153
|
+
* Three states, told apart by `authSubject`: `undefined` is not known yet
|
|
4154
|
+
* (every page load until the first answer), `null` is known to be nobody,
|
|
4155
|
+
* and a string is that user. {@link setAuthToken} retires the previous
|
|
4156
|
+
* session on every change between two KNOWN states — `A → nobody`,
|
|
4157
|
+
* `nobody → B`, `A → B` — and on none out of `undefined`, so the first
|
|
4158
|
+
* answer after a page load never evicts what the page is already showing
|
|
4159
|
+
* for the session it was loaded under.
|
|
4160
|
+
*
|
|
4161
|
+
* `question` orders the answers: one older than the answer in force
|
|
4162
|
+
* describes an older cookie and is dropped. Returns whether it was adopted.
|
|
4163
|
+
*/
|
|
4164
|
+
private adoptCookieSubject;
|
|
4165
|
+
/**
|
|
4166
|
+
* A cookie socket's `identity` frame: the user the shard authenticated this
|
|
4167
|
+
* socket as, sent in reply to every `connect`.
|
|
4168
|
+
*
|
|
4169
|
+
* Adopted like a probe's answer when it is the newest one
|
|
4170
|
+
* ({@link adoptCookieSubject}). An OLDER one that disagrees with the
|
|
4171
|
+
* identity in force means this socket was upgraded on a cookie that has
|
|
4172
|
+
* since changed hands, and is still delivering that user's rows: the
|
|
4173
|
+
* session it belongs to is retired, which replaces the socket.
|
|
4174
|
+
*
|
|
4175
|
+
* Ignored for a socket that authenticated with a token rather than the
|
|
4176
|
+
* cookie (see `ShardConnection.identityQuestion`) — its answer is about that
|
|
4177
|
+
* token, not about the cookie session this client's identity tracks.
|
|
4178
|
+
*/
|
|
4179
|
+
private handleIdentityFrame;
|
|
4180
|
+
/**
|
|
4181
|
+
* The subject half of {@link setAuthToken}.
|
|
4182
|
+
*
|
|
4183
|
+
* Sticky: only an explicit value (incl. `null` = signed out) changes the
|
|
4184
|
+
* subject; omitting it keeps the established one. Two exceptions, both about
|
|
4185
|
+
* a subject that must not outlive the credential it described:
|
|
4186
|
+
*
|
|
4187
|
+
* - Clearing the token clears a user subject — see `setAuthToken`'s
|
|
4188
|
+
* docblock. A `null` one stays: a cookie session known to be nobody's is
|
|
4189
|
+
* still nobody's.
|
|
4190
|
+
* - A token arriving on a session known to be nobody's drops the `null`,
|
|
4191
|
+
* so the identity falls back to the token itself rather than staying
|
|
4192
|
+
* "nobody" while a credential is held.
|
|
4193
|
+
*/
|
|
4194
|
+
private applySubject;
|
|
4195
|
+
/**
|
|
4196
|
+
* A cookie session the server has answered "nobody" for — see
|
|
4197
|
+
* {@link adoptCookieSubject}. Distinct from a subject not known YET
|
|
4198
|
+
* (`undefined`).
|
|
4199
|
+
*/
|
|
4200
|
+
private isKnownNobody;
|
|
4090
4201
|
/**
|
|
4091
4202
|
* True while an established subject labels a credential it was never checked
|
|
4092
4203
|
* against — see the `subjectToken` field. Every replay verdict is
|
|
@@ -4373,6 +4484,30 @@ declare class LunoraClient {
|
|
|
4373
4484
|
* answer.
|
|
4374
4485
|
*/
|
|
4375
4486
|
private shouldRequeueReplayFailure;
|
|
4487
|
+
/**
|
|
4488
|
+
* The `expectSubject` a replayed write carries: the user its identity stamp
|
|
4489
|
+
* names, so the worker refuses it when the request resolves to anyone else.
|
|
4490
|
+
*
|
|
4491
|
+
* The replay gate compares the stamp with what this client believes, and
|
|
4492
|
+
* under a cookie session that belief can be stale — a sign-out and another
|
|
4493
|
+
* user's sign-in change no token, and the socket's `open` flush runs before
|
|
4494
|
+
* its `identity` frame lands. Only the server sees the cookie the write is
|
|
4495
|
+
* about to ride, so it is the server that has to check.
|
|
4496
|
+
*
|
|
4497
|
+
* Sent on every replay made without a bearer token, whatever resolved the
|
|
4498
|
+
* stamp — a socket's `identity` frame labels the session in apps that never
|
|
4499
|
+
* call `getCurrentUser()` too. An app without auth stamps `null` and its
|
|
4500
|
+
* requests resolve to nobody, so the header always passes there. A bearer
|
|
4501
|
+
* request states its credential explicitly and the gate already matched it;
|
|
4502
|
+
* a token-hash or missing stamp names no user.
|
|
4503
|
+
*/
|
|
4504
|
+
private replayExpectation;
|
|
4505
|
+
/**
|
|
4506
|
+
* Whether `failure` is the worker's `IDENTITY_MISMATCH` refusal, and if so,
|
|
4507
|
+
* ask who is signed in now: the answer is what re-runs the replay gate
|
|
4508
|
+
* ({@link setAuthToken}), and nothing else would on a cookie session.
|
|
4509
|
+
*/
|
|
4510
|
+
private noteIdentityMismatch;
|
|
4376
4511
|
/** Settle a write the server reached a coded verdict on: replaying would re-trigger the same failure (a poison-message loop), so drop it. */
|
|
4377
4512
|
private settleReplayTerminal;
|
|
4378
4513
|
/**
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { L as LunoraClient, P as Preloaded } from "./lunora-client.d-
|
|
1
|
+
import { L as LunoraClient, P as Preloaded } from "./lunora-client.d-DlMXZMfR.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 { L as LunoraClient, P as Preloaded } from "./lunora-client.d-
|
|
1
|
+
import { L as LunoraClient, P as Preloaded } from "./lunora-client.d-CxU0UvII.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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
const w=e=>{let t="";for(let o=0;o<e.length;o+=32768)t+=String.fromCharCode(...e.subarray(o,o+32768));return btoa(t)},p=e=>{const t=atob(e),i=new Uint8Array(t.length);for(let o=0;o<t.length;o+=1)i[o]=t.codePointAt(o)??0;return i},b="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_",h=e=>{let t="",i=0;const o=e.length-2;for(;i<o;i+=3){const r=e[i]<<16|e[i+1]<<8|e[i+2];t+=b.charAt(r>>18&63)+b.charAt(r>>12&63)+b.charAt(r>>6&63)+b.charAt(r&63)}const a=e.length-i;if(a===1){const r=e[i]<<16;t+=b.charAt(r>>18&63)+b.charAt(r>>12&63)}else if(a===2){const r=e[i]<<16|e[i+1]<<8;t+=b.charAt(r>>18&63)+b.charAt(r>>12&63)+b.charAt(r>>6&63)}return t},c="$lunora.wire$";const g="__proto__",A={BigInt64Array,BigUint64Array,Float32Array,Float64Array,Int8Array,Int16Array,Int32Array,Uint8Array,Uint8ClampedArray,Uint16Array,Uint32Array},l={Error,EvalError,RangeError,ReferenceError,SyntaxError,TypeError,URIError},E=e=>{if(e===null||typeof e!="object")return!1;const t=Object.getPrototypeOf(e);return t===null||t===Object.prototype},d=(e,t=0)=>{if(t>64)throw new RangeError("wire-codec: value nesting exceeds the 64-level limit");if(e===void 0)return[c,"undefined"];if(e===null)return null;const i=typeof e;if(i==="bigint")return[c,"bigint",e.toString()];if(i==="number"){const r=e;return Number.isNaN(r)?[c,"nan"]:r===1/0?[c,"inf"]:r===-1/0?[c,"-inf"]:r}if(i!=="object")return e;if(e instanceof Date)return[c,"date",d(e.getTime(),t+1)];if(e instanceof Error){const r=e,n={};for(const s of Object.keys(r)){if(r[s]===void 0)continue;const y=d(r[s],t+1);s===g?Object.defineProperty(n,s,{configurable:!0,enumerable:!0,value:y,writable:!0}):n[s]=y}const f=[c,"error",String(r.name),String(r.message),n];return r.cause!==void 0&&f.push(d(r.cause,t+1)),f}if(e instanceof URL)return[c,"url",e.href];if(e instanceof Map)return[c,"map",[...e.entries()].map(([r,n])=>[d(r,t+1),d(n,t+1)])];if(e instanceof Set)return[c,"set",[...e].map(r=>d(r,t+1))];if(e instanceof ArrayBuffer)return[c,"bytes",w(new Uint8Array(e)),"ArrayBuffer"];if(ArrayBuffer.isView(e)){const r=e,n=r.constructor.name,f=new Uint8Array(r.buffer,r.byteOffset,r.byteLength);return n==="Uint8Array"?[c,"bytes",w(f)]:[c,"bytes",w(f),n]}if(Array.isArray(e)){const r=e.map(n=>d(n,t+1));return r.length>0&&r[0]===c?[c,"arr",r]:r}if(!E(e)){const r=e.constructor?.name??"value";throw new TypeError(`wire-codec: cannot encode a ${r} over the Lunora wire — only plain objects, arrays, and the supported built-ins (Date, Error, URL, Map, Set, ArrayBuffer/typed arrays, bigint) round-trip`)}const o=e,a={};for(const r of Object.keys(o)){const n=o[r];if(n===void 0)continue;const f=d(n,t+1);r===g?Object.defineProperty(a,r,{configurable:!0,enumerable:!0,value:f,writable:!0}):a[r]=f}return a},u=(e,t=0)=>{if(t>64)throw new RangeError("wire-codec: value nesting exceeds the 64-level limit");if(e===null||typeof e!="object")return e;if(Array.isArray(e)){if(e[0]===c)switch(e[1]){case"-inf":return-1/0;case"arr":return e[2].map(r=>u(r,t+1));case"bigint":{const r=e[2];if(typeof r!="string"||r.length>1024||!/^-?\d+$/.test(r))throw new RangeError("wire-codec: invalid or over-long bigint (max 1024 digits)");return BigInt(r)}case"date":{const r=u(e[2],t+1);if(typeof r!="number")throw new TypeError("wire-codec: malformed date — epoch must be a number");return new Date(r)}case"map":{const r=e[2];return new Map(r.map(n=>{if(!Array.isArray(n)||n.length!==2)throw new TypeError("wire-codec: malformed map entry — expected a [key, value] pair");return[u(n[0],t+1),u(n[1],t+1)]}))}case"set":return new Set(e[2].map(r=>u(r,t+1)));case"url":{const r=e[2];if(typeof r!="string")throw new TypeError("wire-codec: malformed url — href must be a string");return new URL(r)}case"error":{const r=e[2],n=e[3];if(typeof r!="string"||typeof n!="string")throw new TypeError("wire-codec: malformed error — name and message must be strings");const f=(Object.hasOwn(l,r)?l[r]:void 0)??Error,s=new f(n);s.name!==r&&Object.defineProperty(s,"name",{configurable:!0,value:r,writable:!0});const y=u(e[4],t+1);if(y===null||typeof y!="object"||Array.isArray(y))throw new TypeError("wire-codec: malformed error — props must be an object");for(const m of Object.keys(y))m===g?Object.defineProperty(s,m,{configurable:!0,enumerable:!0,value:y[m],writable:!0}):s[m]=y[m];return e.length>5&&Object.defineProperty(s,"cause",{configurable:!0,value:u(e[5],t+1),writable:!0}),s}case"bytes":{const r=e[2];if(typeof r!="string")throw new TypeError("wire-codec: malformed bytes — payload must be a base64 string");const n=p(r);if(w(n)!==r)throw new TypeError("wire-codec: malformed bytes — payload must be canonical padded base64");const f=e[3]??"Uint8Array";if(f==="ArrayBuffer")return n.buffer.byteLength===n.byteLength?n.buffer:n.slice().buffer;const s=Object.hasOwn(A,f)?A[f]:void 0;return s?new s(n.slice().buffer):n}case"inf":return 1/0;case"nan":return Number.NaN;case"undefined":return;default:return e.map(r=>u(r,t+1))}return e.map(a=>u(a,t+1))}const i=e,o={};for(const a of Object.keys(i)){const r=u(i[a],t+1);a===g?Object.defineProperty(o,a,{configurable:!0,enumerable:!0,value:r,writable:!0}):o[a]=r}return o},T=(e,t,i)=>{try{return d(i)}catch(o){throw new TypeError(`${e}: cannot encode args for '${t}' — ${o instanceof Error?o.message:String(o)}`,o instanceof Error?{cause:o}:void 0)}};export{T as a,u as d,d as e,E as i,h as t};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
import{e as a}from"./wire-codec-
|
|
1
|
+
import{e as a}from"./wire-codec-BeIi1K-T.mjs";const b=/["\\\u0000-\u001F\uD800-\uDFFF]/,y=t=>b.test(t)?JSON.stringify(t):`"${t}"`,i=t=>{if(t===void 0)return"null";if(typeof t=="bigint")throw new TypeError("stableStringify: cannot use a bigint in a stable JSON cache key — pass it as a string, or use stableWireKey");if(typeof t=="number"){if(Number.isNaN(t))return"nan";if(t===1/0)return"inf";if(t===-1/0)return"-inf";if(Object.is(t,-0))return"-0"}if(typeof t=="string")return y(t);if(t===null||typeof t!="object")return JSON.stringify(t);if(Array.isArray(t)){let r="[";for(let e=0;e<t.length;e++)e>0&&(r+=","),r+=i(t[e]);return r+"]"}const o=Object.getPrototypeOf(t);if(o!==null&&o!==Object.prototype){const r=t.constructor?.name??"value";throw new TypeError(`stableStringify: cannot use a ${r} in a stable JSON cache key — only plain objects, arrays, and JSON primitives are supported (wire-typed values key via stableWireKey)`)}const s=t,c=Object.keys(s).sort();let n="{",f=!0;for(const r of c){const e=s[r];e!==void 0&&(f?f=!1:n+=",",n+=y(r),n+=":",n+=i(e))}return n+"}"},u=t=>i(a(t));export{u as s};
|
package/dist/query/index.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { S as SubscriptionError, L as LunoraClient, a as Unsubscribe } from "../packem_shared/lunora-client.d-
|
|
1
|
+
import { S as SubscriptionError, L as LunoraClient, a as Unsubscribe } from "../packem_shared/lunora-client.d-CxU0UvII.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-
|
|
13
|
+
b as SubscriptionErrorCallback } from "../packem_shared/lunora-client.d-CxU0UvII.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';
|
package/dist/query/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { S as SubscriptionError, L as LunoraClient, a as Unsubscribe } from "../packem_shared/lunora-client.d-
|
|
1
|
+
import { S as SubscriptionError, L as LunoraClient, a as Unsubscribe } from "../packem_shared/lunora-client.d-DlMXZMfR.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-
|
|
13
|
+
b as SubscriptionErrorCallback } from "../packem_shared/lunora-client.d-DlMXZMfR.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';
|
package/dist/service.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{LunoraError as i}from"@lunora/errors";import{a as p,d}from"./packem_shared/wire-codec-
|
|
1
|
+
import{LunoraError as i}from"@lunora/errors";import{a as p,d}from"./packem_shared/wire-codec-BeIi1K-T.mjs";import{e as w}from"./packem_shared/replay-DYdPvn3o.mjs";const v="/_lunora/rpc",N="https://lunora.internal",$=e=>{const t=new Error(e.message??"request failed");return t.code=e.code,e.data!==void 0&&(t.data=d(e.data)),e.hint!==void 0&&(t.hint=e.hint),e.docsUrl!==void 0&&(t.docsUrl=e.docsUrl),t},c=async(e,t,n,s,u)=>{const o=n.__lunoraRef,f=JSON.stringify({args:p("@lunora/client/service",o,s??{}),functionPath:o,...u?.shardKey===void 0?{}:{shardKey:u.shardKey}}),a=await e.fetch(new Request(`${N}${v}`,{body:f,headers:{"content-type":"application/json"},method:"POST"}));let r;try{r=await a.json()}catch{throw new i("INTERNAL",`@lunora/client/service: ${t} "${o}" got a non-JSON response (status ${a.status.toString()}). Check the service binding points at the Lunora Worker that declares this function.`,{status:a.status})}if(r===null||typeof r!="object")throw new i("INTERNAL",`@lunora/client/service: ${t} "${o}" returned a JSON body that is not an object (status ${a.status.toString()}). Check the service binding points at the Lunora Worker that declares this function.`,{status:a.status});const l=r,h=w(l);if(h!==void 0)throw $(h);if(!a.ok)throw new i("INTERNAL",`@lunora/client/service: ${t} "${o}" failed with status ${a.status.toString()} and no error envelope.`,{status:a.status});return d(l.result)},E=e=>({action:async(t,n,s)=>await c(e,"action",t,n,s),mutation:async(t,n,s)=>await c(e,"mutation",t,n,s),query:async(t,n,s)=>await c(e,"query",t,n,s)});export{v as RPC_PATH,E as createServiceClient};
|
package/dist/ssr/index.d.mts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { P as Preloaded, L as LunoraClient } from "../packem_shared/lunora-client.d-
|
|
1
|
+
import { P as Preloaded, L as LunoraClient } from "../packem_shared/lunora-client.d-CxU0UvII.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-
|
|
23
|
+
a as preloadedQueryResult } from "../packem_shared/preload.d-C3Nbhx4m.mjs";
|
|
24
24
|
import '@lunora/errors';
|
|
25
25
|
import '@lunora/runtime';
|
|
26
26
|
/**
|
package/dist/ssr/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { P as Preloaded, L as LunoraClient } from "../packem_shared/lunora-client.d-
|
|
1
|
+
import { P as Preloaded, L as LunoraClient } from "../packem_shared/lunora-client.d-DlMXZMfR.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-
|
|
23
|
+
a as preloadedQueryResult } from "../packem_shared/preload.d-BNFe_NYM.js";
|
|
24
24
|
import '@lunora/errors';
|
|
25
25
|
import '@lunora/runtime';
|
|
26
26
|
/**
|
package/dist/ssr/index.mjs
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{getServerSession as o}from"../packem_shared/getServerSession-BaOoo1p6.mjs";import{deserializePreloaded as l,serializePreloaded as t}from"../packem_shared/deserializePreloaded-
|
|
1
|
+
import{getServerSession as o}from"../packem_shared/getServerSession-BaOoo1p6.mjs";import{deserializePreloaded as l,serializePreloaded as t}from"../packem_shared/deserializePreloaded-Bffy70Wm.mjs";import{createServerClient as i}from"../packem_shared/createServerClient-DqNe__QI.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.
|
|
3
|
+
"version": "1.0.0-alpha.139",
|
|
4
4
|
"description": "Lunora browser SDK: WebSocket transport, optimistic updates, and an offline mutation queue",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"cloudflare",
|
|
@@ -70,7 +70,7 @@
|
|
|
70
70
|
"access": "public"
|
|
71
71
|
},
|
|
72
72
|
"dependencies": {
|
|
73
|
-
"@lunora/errors": "1.0.0-alpha.
|
|
73
|
+
"@lunora/errors": "1.0.0-alpha.43",
|
|
74
74
|
"@visulima/storage-client": "1.0.3"
|
|
75
75
|
},
|
|
76
76
|
"peerDependencies": {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{LunoraError as y}from"@lunora/errors";import{i as le,a as fe,P as pe}from"./delta-merge-vxvH3PvF.mjs";import{e as M,d as g}from"./wire-codec-Sw1rAu-Z.mjs";import{s as G}from"./wire-key-HsUDTlQ7.mjs";import me from"./createInMemoryBookmarkStorage-BooZhW0n.mjs";import{ClientQueryStore as ye}from"./createClientQuery-B8Nfj-7o.mjs";import{TabCoordinator as be}from"./TabCoordinator-CXD7vulJ.mjs";import{TransportError as j}from"./CONFLICT_ERROR_CODE-BOeeP_Wl.mjs";import{httpStream as Se}from"./httpStream-BWdNJzId.mjs";import{d as U,n as _,f as A,a as ve,c as ge,b as Te,e as ke}from"./local-store-CWeFEk6w.mjs";import{O as Ce,n as z,i as we,r as Ee}from"./offline-queue-D_fr-uQ3.mjs";import{resolvePersistenceAdapter as _e}from"./createInMemoryPersistence-Cz2W6XVj.mjs";import{resolveQueryCacheAdapter as Ae,queryCacheKey as I}from"./createInMemoryQueryCache-D2uNHLfM.mjs";import{createReconnect as V}from"./createReconnect-CjTmjJDH.mjs";import{e as F,u as L,d as Ie,r as Oe,i as Re,a as Pe,b as Fe,M as Me,c as Le,f as He}from"./replay-DYdPvn3o.mjs";import Ue from"./createSnapshotPrecondition-GRVKxPsh.mjs";import{createStream as xe}from"./DEFAULT_MAX_BUFFER-D3QH2iaq.mjs";import{SubscriptionRegistry as T}from"./SubscriptionRegistry-CS-AFUI9.mjs";const x=500,Ne=async h=>{const e=[];let t;for(;;){const s=await h(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}},J=(h,e)=>{if(h.size<e)return;const t=h.keys().next().value;t!==void 0&&h.delete(t)};class O{listeners=new Set;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 Be=h=>{const{afterFailedAttempts:e,intervalMs:t,onReachable:s,onStateChange:r,poll:i}=h,n=t>0&&e>0;let a=0,o,c=!1,d=!1;const u=()=>{o!==void 0&&(clearInterval(o),o=void 0,c=!1,r())},f=m=>{if(o!==void 0){if(!m){u();return}c||(c=!0,r()),s()}},p=()=>{d||(d=!0,i().then(f).finally(()=>{d=!1}).catch(()=>{}))};return{isPolling:()=>o!==void 0&&c,noteFailedOpen:()=>{a+=1,!(!n||o!==void 0||a<e)&&(o=setInterval(p,t),r(),p())},noteOpen:()=>{a=0,u()},stop:u}},Qe="/_lunora/rpc",N="/_lunora/rpc-batch",qe="/_lunora/ws",B=h=>h===void 0||h===""?"":`&bucket=${encodeURIComponent(h)}`,P=h=>{for(let e=h.length-1;e>=0;e-=1)h[e]?.()},Y=Symbol("lunora.unmergeableDelta"),De=(h,e)=>{for(const t of e)t.op==="delete"?h.delete(t.key):t.value!==void 0&&h.set(t.key,t.value)},Ke="lunora-ping",We=3e4,$e=1e4,Ge=5e3,je=3,ze=250,Ve=5e3,Je=64,Ye=3,Xe=1e4,Ze=8,et="/_lunora/admin/shard-traffic",tt="/_lunora/admin/scheduled",st="/_lunora/admin/scheduled/status",rt="/_lunora/admin/scheduled/ws",it="/_lunora/admin/scheduled/cancel",X="/_lunora/admin/scheduled/dead",nt="/_lunora/admin/scheduled/dead/retry",at="/_lunora/admin/scheduled/dead/cancel",ot="/_lunora/admin/workflows/instances",ct="/_lunora/admin/workflows/instance",ht="/_lunora/admin/workflows/status",Q="/_lunora/admin/storage",dt="/_lunora/admin/storage/url",ut="/_lunora/admin/storage/buckets",lt="/_lunora/admin/functions",ft="/_lunora/admin/cron-jobs",pt="/_lunora/admin/cron-jobs/run",mt="/_lunora/admin/openapi",yt="/_lunora/admin/openrpc",bt="/_lunora/admin/global/tables",St="/_lunora/admin/global/table",vt="/_lunora/admin/global/facet",gt="/_lunora/admin/vector/indexes",Tt="/_lunora/admin/vector/query",kt="/_lunora/admin/logs/archive",Ct="/_lunora/admin/kv/namespaces",wt="/_lunora/admin/kv/keys",q="/_lunora/admin/kv/value",Et="/_lunora/admin/auth/users",_t="/_lunora/admin/auth/sessions",At="/_lunora/admin/auth/users/create",It="/_lunora/admin/auth/users/role",Ot="/_lunora/admin/auth/users/ban",Rt="/_lunora/admin/auth/users/unban",Pt="/_lunora/admin/auth/users/password",Ft="/_lunora/admin/auth/users/remove",Mt="/_lunora/admin/auth/users/impersonate",Lt="/_lunora/admin/auth/sessions/revoke",Ht="/_lunora/admin/auth/sessions/revoke-all",Ut="/_lunora/admin/auth/capabilities",xt="/_lunora/admin/auth/users/update",Nt="/_lunora/admin/auth/accounts",Bt="/_lunora/admin/auth/accounts/unlink",Qt="/_lunora/admin/auth/passkeys",qt="/_lunora/admin/auth/passkeys/delete",Dt="/_lunora/admin/auth/two-factor/disable",Kt="/_lunora/admin/auth/organizations",Wt="/_lunora/admin/auth/organizations/members",$t="/_lunora/admin/auth/organizations/invitations",Gt="/_lunora/admin/auth/organizations/members/remove",jt="/_lunora/admin/auth/organizations/invitations/cancel",zt="/_lunora/admin/auth/config",Vt="/_lunora/admin/auth/sign-up-invitations",Jt="/_lunora/admin/auth/sign-up-invitations/create",Yt="/_lunora/admin/auth/sign-up-invitations/revoke",Xt="/_lunora/admin/auth/organizations/create",Zt="/_lunora/admin/auth/organizations/update",es="/_lunora/admin/auth/organizations/remove",ts="/_lunora/admin/auth/organizations/members/add",ss="/_lunora/admin/auth/organizations/members/invite",rs="/_lunora/admin/auth/organizations/members/role",is="/_lunora/admin/auth/organizations/teams",ns="/_lunora/admin/auth/organizations/teams/create",as="/_lunora/admin/auth/organizations/teams/update",os="/_lunora/admin/auth/organizations/teams/remove",cs="/_lunora/admin/auth/organizations/teams/members",hs="/_lunora/admin/auth/organizations/teams/members/add",ds="/_lunora/admin/auth/organizations/teams/members/remove",us="/_lunora/admin/auth/organizations/roles",ls="/_lunora/admin/auth/organizations/roles/create",fs="/_lunora/admin/auth/organizations/roles/update",ps="/_lunora/admin/auth/organizations/roles/remove",ms="/api/auth",ys="/get-session",Z=h=>h==="connected"||h==="polling",ee=h=>h.startsWith("https://")?`wss://${h.slice(8)}`:h.startsWith("http://")?`ws://${h.slice(7)}`:h,k=(h,e)=>`${h.endsWith("/")?h.slice(0,-1):h}${e}`,S=(h,e)=>{const t=new URLSearchParams;for(const[r,i]of Object.entries(e))i!==void 0&&i!==""&&t.set(r,String(i));const s=t.toString();return s===""?h:`${h}?${s}`},bs=[pe],l=h=>h??"",ne=(h,e)=>{const t=h.error,s=typeof t?.code=="string"?t.code:void 0,r=typeof t?.message=="string"?t.message:void 0;return{code:s,messageText:(typeof h.message=="string"?h.message:void 0)??r??e}},Ss=h=>{const{code:e,messageText:t}=ne(h,"stream error");return e===void 0?new Error(t):new y(e,t)},te=h=>{const{code:e,messageText:t}=ne(h,"subscription error");return{message:t,...e===void 0?{}:{code:e}}};function D(h){if(h!==void 0)return e=>{h(e)}}const E=(h,e)=>{for(const t of h)try{t(e)}catch{}},vs=new TextDecoder,gs=h=>{if(typeof h=="string")return h;if(h instanceof ArrayBuffer)return vs.decode(h)},v=(h,e)=>{if(!h.socket||h.wsState!=="open")return!1;try{return h.socket.send(JSON.stringify(e)),!0}catch{return!1}},W=h=>{const e=new Error(h.message??"request failed");return e.code=h.code,h.data!==void 0&&(e.data=g(h.data)),h.hint!==void 0&&(e.hint=h.hint),h.docsUrl!==void 0&&(e.docsUrl=h.docsUrl),e},se=(h,e)=>{const t=W(h),s=Le(t,e);return s!==void 0&&(t.data=s),t},C=(h,e)=>{try{return M(h)}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)}},Ts=1e4,re=async h=>{const e=new AbortController;let t;const s=new Promise((r,i)=>{t=setTimeout(()=>{e.abort(),i(new TypeError("LunoraClient: poll timed out"))},Ts)});try{return await Promise.race([h(e.signal),s])}catch(r){throw e.signal.aborted?new TypeError("LunoraClient: poll timed out"):r}finally{clearTimeout(t)}},ie=h=>{try{return M(h),!0}catch{return!1}},K=h=>"args"in h?{...h,args:g(h.args)}:h,ae=h=>{const e=F(h);return e===void 0?He():W(e)},ks=(h,e)=>{const t=Array.from({length:e});for(const s of h){if(typeof s.id!="number"||s.id<0||s.id>=e)continue;const r=s.body;t[s.id]=r!==void 0&&"error"in r?{error:ae(r),ok:!1}:{ok:!0,value:g(r?.result)}}return t.map(s=>s??{error:new Error("batch call returned no result"),ok:!1})},Cs=Promise.resolve();class oe{static MAX_POKE_BUFFERS=256;static createClientQuery(e,t){return{defaultValue:t,key:e}}url;wsUrl;clientQueryStore;wsToken;authBasePath;fetchImpl;WebSocketImpl;bookmark;reconnectOptions;connectTimeoutMs;heartbeatIntervalMs;pollingFallbackAfterFailedAttempts;pollingFallbackIntervalMs;offlineQueue;outbox;clientId;shardCursors=new Map;defaultShardKey;readyResolved=!1;readyResolve;readyPromise;clientWatermarks=new Map;outboxMutationCounter=0;onPersistenceError;persistence;persistenceVersion;outboxLeaderRelease;queryCache;hydratedQueryCache=new Map;cacheSeededQueries=new Map;pendingCacheWrites=new Map;cacheFlushTimer;subscriptions=new T;tabCoordinator;leaderStatus;leaderWasEverConnected=!1;connections=new Map;defaultConnectionContext;connectionContexts=new Map;connectionContextHolders=new Map;authToken=null;authSubject=void 0;subjectToken=null;sessionProbesInFlight=0;sessionProbeGeneration=0;identityResolutionExpected=!1;identitySettled=!1;queuedIdentities=new Map;queuedOfflineShardKeys=new Set;closed=!1;authTokenListeners=new O;statusListeners=new O;tokenExpiredListeners=new O;identityChangeListeners=new O;authRefusalNotifiedFor;mutationSettledListeners=new O;pendingChangeListeners=new O;whisperHandlers=new Map;lastStatus="idle";nextSubId=0;nextStreamId=0;streams=new Map;adminSocketTeardowns=new Set;offlineFlushes=new Map;replayRetryState=new Map;replayRetryTimers=new Map;shapeSubscriptions=new Map;pokeBuffers=new Map;nextShapeId=0;constructor(e){this.url=e.url,this.wsUrl=e.wsUrl??k(ee(e.url),qe),this.wsToken=e.wsToken;const t=e.authBasePath??ms;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??me(),this.reconnectOptions=e.reconnect,this.heartbeatIntervalMs=e.heartbeatIntervalMs??We,this.connectTimeoutMs=e.connectTimeoutMs??$e,this.pollingFallbackIntervalMs=e.pollingFallback?.intervalMs??Ge,this.pollingFallbackAfterFailedAttempts=e.pollingFallback?.afterFailedAttempts??je,this.defaultConnectionContext=e.connectionContext,this.persistence=_e(e.persistence,e.outbox===void 0),this.persistenceVersion=e.persistenceVersion,this.queryCache=Ae(e.queryCache),this.onPersistenceError=e.offlineQueue?.onPersistenceError,this.clientQueryStore=new ye,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=Cs),this.offlineQueue=new Ce(e.offlineQueue,{onEvict:(s,r)=>{this.emitItemSettled(s,"rejected",r)},onSizeChange:s=>{this.pendingChangeListeners.emit(s)},persistence:this.persistence,version:e.persistenceVersion}),this.outbox=e.outbox,this.clientId=e.clientId??`client-${z()}`,this.persistence&&queueMicrotask(()=>{this.hydrateAsOutboxLeader()}),this.queryCache&&queueMicrotask(()=>{(async()=>{try{await this.hydrateQueryCache()}catch{}finally{this.readyResolved=!0,this.readyResolve?.()}})().catch(()=>{})})}setAuthToken(e,t){const s=this.authToken!==e,r=this.identityFingerprint(),i=this.authSubject===void 0||this.subjectToken===this.authToken,n=this.subjectAwaitingReconfirm();this.authToken=e,t!==void 0?(this.authSubject=t,this.subjectToken=e):e===null&&(this.authSubject=void 0,this.subjectToken=null);const a=this.identityFingerprint();a!==r&&(!s&&e!==null&&i?(this.restampQueuedIdentity(r,a),this.restampWatermarks(r,a),this.restampConnectionIdentity(r,a),this.reseedFromHydratedCache()):!s&&e===null&&r===null&&i?(this.restampWatermarks(r,a),this.restampConnectionIdentity(r,a),this.reseedFromHydratedCache()):(this.rejectQueuedForIdentityChange(r),r!==null&&this.evictPreviousIdentitySession()),this.restartTabCoordinatorForIdentity()),this.syncReadCacheToCredential(n),s&&this.authTokenListeners.emit(e),this.offlineQueue.size>0&&Z(this.computeStatus())&&this.flushAllOfflineQueues()}getAuthToken(){return this.authToken}currentIdentity(){return this.identityFingerprint()}expectIdentityResolution(){this.identityResolutionExpected=!0}currentBaseline(e){return this.baselineCursorFor(e)}replayIdentityVerdict(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"}clientIdentifier(){return this.clientId}confirmedMutationWatermark(e){return this.clientWatermarks.get(this.identityFingerprint()??"")?.get(e??"")??0}async callMutator(e,t,s){const r=s?.clientSeq;if(r!==void 0&&(!Number.isInteger(r)||r<=0))throw new y("INTERNAL",`callMutator: clientSeq must be a positive integer, got ${String(r)}`);const i=s?.shardKey??"",n=this.identityFingerprint();let a;const o=await this.rpc(e,t,s?.shardKey,{captureBookmark:!0,clientId:this.clientId,clientSeq:r,onMutationAck:d=>{a=d}});if(a!==void 0&&a>(this.clientWatermarks.get(n??"")?.get(i)??0)){let d=this.clientWatermarks.get(n??"");d===void 0&&(J(this.clientWatermarks,Ze),d=new Map,this.clientWatermarks.set(n??"",d)),d.set(i,a)}return{applied:a===void 0||a===r,result:o}}onAuthTokenChange(e){return this.authTokenListeners.add(e)}onIdentityChange(e){return this.identityChangeListeners.add(e)}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.sessionProbeGeneration+=1;const s=this.sessionProbeGeneration;try{const r=await this.fetchImpl(k(this.url,`${this.authBasePath}${ys}`),{credentials:"include",headers:e,method:"GET"});if(!r.ok)return this.identitySettled=!0,null;const n=(await r.json())?.user??null;return this.identitySettled=!0,this.adoptResolvedSubject(t,n,s),n}finally{this.releaseSessionProbe()}}setWsToken(e){this.wsToken!==e&&(this.wsToken=e,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)}acquireConnectionContext(e,t={}){if(this.followsAnotherTab())return()=>{};const s=l(t.shardKey),r={context:e},i=this.connectionContextHolders.get(s);i?i.push(r):this.connectionContextHolders.set(s,[r]),this.refreshConnectionContext(s);let n=!1;return()=>{if(n)return;n=!0;const a=this.connectionContextHolders.get(s);if(!a)return;const o=a.indexOf(r);o!==-1&&a.splice(o,1),a.length===0&&this.connectionContextHolders.delete(s),this.refreshConnectionContext(s)}}whisperSubscribe(e,t,s={}){this.assertLeaderOwnedSurface("whisperSubscribe");const r=l(s.shardKey);let i=this.whisperHandlers.get(r);i||(i=new Map,this.whisperHandlers.set(r,i));let n=i.get(e);const a=n===void 0;if(n||(n=new Set,i.set(e,n)),n.add(t),this.ensureSocket(s.shardKey),a){const o=this.getConnection(s.shardKey);o&&v(o,{topic:e,type:"whisper_subscribe"})}return()=>{const o=this.whisperHandlers.get(r),c=o?.get(e);if(!c?.delete(t)||c.size>0)return;o?.delete(e),o?.size===0&&this.whisperHandlers.delete(r);const d=this.getConnection(s.shardKey);d&&v(d,{topic:e,type:"whisper_unsubscribe"})}}whisper(e,t,s={}){this.assertLeaderOwnedSurface("whisper"),this.ensureSocket(s.shardKey);const r=this.getConnection(s.shardKey);r&&v(r,{data:C(t??null,`whisper data for topic '${e}'`),topic:e,type:"whisper"})}onTokenExpired(e){return this.tokenExpiredListeners.add(e)}connectionStatus(){return this.computeStatus()}onConnectionStatus(e){const t=this.statusListeners.add(e);return e(this.computeStatus()),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 i of s){const n=this.connections.get(i);e.push({confirmedMutationWatermark:t?.get(i)??0,hasSocket:n?.socket!==void 0,shardKey:i===""?void 0:i,wasEverConnected:n?.wasEverConnected??!1,wsState:n?.wsState??"idle"})}const r=this.subscriptions.all().map(i=>({acked:i.acked,functionPath:i.fn.__lunoraRef,id:i.id,kind:"query",lastMutationId:i.lastMutationId,pendingOptimisticLayers:i.optimisticLayers.length,serverCursor:i.serverCursor,shardKey:i.shardKey,subscriberCount:i.callbacks.size}));for(const i of this.shapeSubscriptions.values())r.push({acked:i.serverCursor!==void 0,functionPath:`shape:${i.name}`,id:i.id,kind:"shape",lastMutationId:i.lastMutationId,pendingOptimisticLayers:0,rowCount:i.rows.size,serverCursor:i.serverCursor,shardKey:i.shardKey,subscriberCount:i.callbacks.size});return{clientId:this.clientId,closed:this.closed,connectionStatus:this.computeStatus(),pendingWrites:this.offlineQueue.size,shards:e.toSorted((i,n)=>(i.shardKey??"").localeCompare(n.shardKey??"")),subscriptions:r.toSorted((i,n)=>i.functionPath.localeCompare(n.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 Ue(this,e,t,s)}whenReady(){return this.readyPromise}get isReady(){return this.readyResolved}peekHydratedQuery(e,t,s){if(!this.readyResolved)return;const r=G(t),i=I(e,r,s),n=this.hydratedQueryCache.get(i);if(n!==void 0)return this.cachedQueryMatchesIdentity(n)?n.value:void 0}peekActiveQuerySnapshot(e,t,s){const r=T.key(e,t,s),i=this.subscriptions.get(r);return{present:i!==void 0,value:i?.lastValue}}async query(e,t,s={}){return this.assertOpen(),await this.rpc(e.__lunoraRef,t,s.shardKey,{attachBookmark:!0})}async batch(e){return this.sendBatch(e)}async mutation(e,t,s={}){const{value:r}=await this.runMutation(e,t,s);return r}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})}async importRows(e,t,s={}){this.assertOpen();const r=Math.max(1,Math.trunc(s.chunkSize??500)),i=s.toArgs??(d=>({rows:d})),n=t.length;let a=0,o=0,c=0;for(let d=0;d<n;d+=r){const u=t.slice(d,d+r),f=c,{committed:p}=await this.runMutation(e,i(u),{...s.importId===void 0?{}:{mutationId:`${s.importId}:${String(f)}`},shardKey:s.shardKey});c+=1,a+=u.length,p&&(o+=u.length),s.onProgress?.({done:a,total:n})}return{chunks:c,imported:o,queued:a-o}}async shardTraffic(e){this.assertOpen();const t=await this.adminFetch(et,"POST",{table:e});return{failed:t.failed??0,ok:t.ok??0,shards:t.shards??[]}}async listScheduledJobs(){return this.assertOpen(),((await this.adminFetch(tt,"GET")).records??[]).map(t=>K(t))}async schedulerStatus(){this.assertOpen();const e=await this.adminFetch(st,"GET");return{backlog:e.backlog??0,inFlight:e.inFlight??0,pools:e.pools??[]}}async cancelScheduledJob(e){return this.assertOpen(),{cancelled:(await this.adminFetch(it,"POST",{id:e})).cancelled===!0}}async listDeadJobs(){return this.assertOpen(),(await Ne(async t=>await this.adminFetch(t===void 0?X:`${X}?cursor=${encodeURIComponent(t)}`,"GET"))).map(t=>K(t))}async retryDeadJob(e){return this.assertOpen(),{retried:(await this.adminFetch(nt,"POST",{id:e})).retried===!0}}async removeDeadJob(e){return this.assertOpen(),{removed:(await this.adminFetch(at,"POST",{id:e})).removed===!0}}async listWorkflowInstances(e){this.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 this.adminFetch(`${ot}?${t.toString()}`,"GET");return{configured:s.configured,instances:s.instances??[],page:s.page??1,perPage:s.perPage??e.perPage??0,totalCount:s.totalCount}}async getWorkflowInstance(e){this.assertOpen();const t=new URLSearchParams({id:e.id,name:e.name}),s=await this.adminFetch(`${ct}?${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??[]}}async setWorkflowInstanceStatus(e){return this.assertOpen(),{status:(await this.adminFetch(ht,"POST",{action:e.action,id:e.id,name:e.name})).status??"unknown"}}subscribeScheduledJobs(e){if(this.assertOpen(),this.WebSocketImpl===void 0)return()=>{};const t=k(ee(this.url),rt),s=V(this.reconnectOptions),r={connectTimer:void 0,heartbeatTimer:void 0,lastFrameAt:0,socket:void 0};let i,n=!1;const a=()=>{n||this.closed||(i=setTimeout(d,s.next()))},o=f=>{if(n||this.WebSocketImpl===void 0)return;const p=f===void 0?t:`${t}?token=${encodeURIComponent(f)}`;this.openManagedSocket(r,p,this.connectTimeoutMs,{onClose:()=>{a()},onMessage:m=>{let b;try{b=JSON.parse(typeof m.data=="string"?m.data:"")}catch{return}b.type==="jobs"&&Array.isArray(b.records)&&(s.reset(),e(b.records.map(w=>K(w))))}})},c=async f=>{let p;try{p=await f()}catch{a();return}o(p)},d=()=>{if(n||this.WebSocketImpl===void 0)return;const{wsToken:f}=this;if(typeof f=="function"){c(f).catch(()=>{});return}o(f)};d();const u=()=>{n=!0,i!==void 0&&(clearTimeout(i),i=void 0),r.connectTimer!==void 0&&(clearTimeout(r.connectTimer),r.connectTimer=void 0),this.stopHeartbeat(r),r.socket?.close(),r.socket=void 0};return this.adminSocketTeardowns.add(u),()=>{this.adminSocketTeardowns.delete(u),u()}}async listFunctions(){return this.assertOpen(),(await this.adminFetch(lt,"GET")).functions??[]}async getCronJobs(){return this.assertOpen(),(await this.adminFetch(ft,"GET")).jobs??[]}async runCronJob(e){this.assertOpen();const t=await this.adminFetch(pt,"POST",{name:e});return{name:t.name??e,ran:t.ran===!0}}async fetchOpenApi(){return this.assertOpen(),await this.adminFetch(mt,"GET")}async fetchOpenRpc(){return this.assertOpen(),await this.adminFetch(yt,"GET")}async listStorageObjects(e={}){this.assertOpen();const t=S(Q,{bucket:e.bucket,cursor:e.cursor,limit:e.limit,prefix:e.prefix}),s=await this.adminFetch(t,"GET");return{cursor:s.cursor,objects:s.objects??[]}}async deleteStorageObject(e,t){this.assertOpen();const s=`${Q}?key=${encodeURIComponent(e)}${B(t?.bucket)}`,r=await this.adminFetch(s,"DELETE");return{deleted:r.deleted===!0,key:r.key??e}}async listStorageBuckets(){return this.assertOpen(),(await this.adminFetch(ut,"GET")).buckets??[]}async uploadStorageObject(e){this.assertOpen();const t=`${Q}?key=${encodeURIComponent(e.key)}${B(e.bucket)}`,s=await this.adminFetch(t,"PUT",e.body,e.contentType);return{etag:s.etag,key:s.key??e.key}}async signedStorageUrl(e,t){this.assertOpen();const s=t?.expiresInSeconds,r=s===void 0?"":`&expiresIn=${encodeURIComponent(s.toString())}`,i=`${dt}?key=${encodeURIComponent(e)}${r}${B(t?.bucket)}`,n=await this.adminFetch(i,"GET");if(typeof n.url!="string")throw new TypeError("LunoraClient: storage URL endpoint returned no `url`");return n.url}async listGlobalTables(){return this.assertOpen(),await this.adminFetch(bt,"GET")}async readGlobalTablePage(e){this.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(M(e.filters))),g(await this.adminFetch(`${St}?${t.toString()}`,"GET"))}async facetGlobalColumn(e){this.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(M(e.filters))),g(await this.adminFetch(`${vt}?${t.toString()}`,"GET"))}async listVectorIndexes(){return this.assertOpen(),(await this.adminFetch(gt,"GET")).indexes??[]}async queryVectorIndex(e){return this.assertOpen(),(await this.adminFetch(Tt,"POST",e)).matches??[]}async queryLogArchive(e={}){this.assertOpen();const t=await this.adminFetch(kt,"POST",e);return{nextCursor:t.nextCursor,rows:t.rows??[]}}async listKvNamespaces(){return this.assertOpen(),(await this.adminFetch(Ct,"GET")).namespaces??[]}async listKvKeys(e){this.assertOpen();const t=S(wt,{cursor:e.cursor,limit:e.limit,namespace:e.namespace,prefix:e.prefix});return await this.adminFetch(t,"GET")}async getKvValue(e){this.assertOpen();const t=S(q,{key:e.key,namespace:e.namespace});return await this.adminFetch(t,"GET")}async putKvValue(e){this.assertOpen(),await this.adminFetch(q,"PUT",e)}async deleteKvKey(e){this.assertOpen();const t=S(q,{key:e.key,namespace:e.namespace});await this.adminFetch(t,"DELETE")}async listAuthUsers(e={}){this.assertOpen();const t=S(Et,{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 await this.adminFetch(At,"POST",e)}async setAuthUserRole(e){return await this.adminFetch(It,"POST",e)}async banAuthUser(e){return await this.adminFetch(Ot,"POST",e)}async unbanAuthUser(e){return await this.adminFetch(Rt,"POST",e)}async setAuthUserPassword(e){await this.adminFetch(Pt,"POST",e)}async removeAuthUser(e){await this.adminFetch(Ft,"POST",e)}async impersonateAuthUser(e){return await this.adminFetch(Mt,"POST",e)}async revokeAuthSession(e){await this.adminFetch(Lt,"POST",e)}async revokeAuthUserSessions(e){await this.adminFetch(Ht,"POST",e)}async getAuthCapabilities(){return await this.adminFetch(Ut,"GET")}async updateAuthUser(e){return await this.adminFetch(xt,"POST",e)}async listAuthAccounts(e){return await this.adminFetch(S(Nt,{userId:e.userId}),"GET")}async unlinkAuthAccount(e){await this.adminFetch(Bt,"POST",e)}async listAuthPasskeys(e){return await this.adminFetch(S(Qt,{userId:e.userId}),"GET")}async deleteAuthPasskey(e){await this.adminFetch(qt,"POST",e)}async disableAuthTwoFactor(e){await this.adminFetch(Dt,"POST",e)}async listAuthOrganizations(e={}){return await this.adminFetch(S(Kt,{limit:e.limit,offset:e.offset}),"GET")}async listAuthOrgMembers(e){const t=S(Wt,{limit:e.limit,offset:e.offset,organizationId:e.organizationId});return await this.adminFetch(t,"GET")}async listAuthOrgInvitations(e){const t=S($t,{limit:e.limit,offset:e.offset,organizationId:e.organizationId});return await this.adminFetch(t,"GET")}async listAuthSignUpInvitations(e={}){const t=S(Vt,{limit:e.limit,offset:e.offset});return await this.adminFetch(t,"GET")}async createAuthSignUpInvitation(e){return await this.adminFetch(Jt,"POST",e)}async revokeAuthSignUpInvitation(e){await this.adminFetch(Yt,"POST",e)}async removeAuthOrgMember(e){await this.adminFetch(Gt,"POST",e)}async cancelAuthOrgInvitation(e){await this.adminFetch(jt,"POST",e)}async getAuthConfig(){return await this.adminFetch(zt,"GET")}async createAuthOrganization(e){return await this.adminFetch(Xt,"POST",e)}async updateAuthOrganization(e){return await this.adminFetch(Zt,"POST",e)}async deleteAuthOrganization(e){await this.adminFetch(es,"POST",e)}async addAuthOrgMember(e){return await this.adminFetch(ts,"POST",e)}async inviteAuthOrgMember(e){return await this.adminFetch(ss,"POST",e)}async setAuthOrgMemberRole(e){return await this.adminFetch(rs,"POST",e)}async listAuthOrgTeams(e){const t=S(is,{limit:e.limit,offset:e.offset,organizationId:e.organizationId});return await this.adminFetch(t,"GET")}async createAuthOrgTeam(e){return await this.adminFetch(ns,"POST",e)}async updateAuthOrgTeam(e){return await this.adminFetch(as,"POST",e)}async removeAuthOrgTeam(e){await this.adminFetch(os,"POST",e)}async listAuthOrgTeamMembers(e){const t=S(cs,{limit:e.limit,offset:e.offset,teamId:e.teamId});return await this.adminFetch(t,"GET")}async addAuthOrgTeamMember(e){return await this.adminFetch(hs,"POST",e)}async removeAuthOrgTeamMember(e){await this.adminFetch(ds,"POST",e)}async listAuthOrgRoles(e){const t=S(us,{limit:e.limit,offset:e.offset,organizationId:e.organizationId});return await this.adminFetch(t,"GET")}async createAuthOrgRole(e){return await this.adminFetch(ls,"POST",e)}async updateAuthOrgRole(e){return await this.adminFetch(fs,"POST",e)}async deleteAuthOrgRole(e){await this.adminFetch(ps,"POST",e)}async listAuthSessions(e={}){this.assertOpen();const t=S(_t,{limit:e.limit,offset:e.offset,userId:e.userId});return await this.adminFetch(t,"GET")}subscribe(e,t,s,r={}){this.assertOpen();const i=t??{},n=T.key(e.__lunoraRef,i,r.shardKey);let a=this.subscriptions.get(n);const o=D(s),c=D(r.onError),d=D(r.onCheckpoint);if(!a){this.nextSubId+=1;const f=`sub_${this.nextSubId.toString()}`,p=G(i),m=this.takeHydratedCache(e.__lunoraRef,p,r.shardKey);a={acked:!1,args:i,argsKey:p,callbacks:new Set,checkpointCallbacks:new Set,errorCallbacks:new Set,fn:e,id:f,lastValue:m?.value,optimisticLayers:[],serverBase:m?.value,serverCursor:m?.serverCursor,shardKey:r.shardKey,wireArgs:C(i,`args for '${e.__lunoraRef}'`),...m?.serverEpoch===void 0?{}:{serverEpoch:m.serverEpoch}},this.subscriptions.add(a),m!==void 0&&this.cacheSeededQueries.set(n,m)}if(a.callbacks.add(o),c&&a.errorCallbacks.add(c),d&&a.checkpointCallbacks.add(d),a.lastValue!==void 0)try{o(a.lastValue)}catch{}this.ensureSocket(r.shardKey),this.sendSubscribeIfOpen(a);const u=a;return()=>{u.callbacks.delete(o),c&&u.errorCallbacks.delete(c),d&&u.checkpointCallbacks.delete(d),u.callbacks.size===0&&(this.sendOrQueueUnsubscribe(u.shardKey,u.id,"unsubscribe"),this.returnCacheSeed(T.keyOf(u)),this.subscriptions.remove(u))}}subscribeShape(e,t,s={}){if(this.assertOpen(),this.followsAnotherTab()){const{onError:n}=s;return n!==void 0&&queueMicrotask(()=>{n({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 r=`shape_${this.nextShapeId.toString()}`,i={args:e.args,callbacks:new Set([t]),errorCallbacks:s.onError?new Set([s.onError]):new Set,id:r,name:e.name,onCheckpoint:s.onCheckpoint,rows:new Map,shardKey:s.shardKey,wireArgs:e.args===void 0?void 0:C(e.args,`shape args for '${e.name}'`)};return this.shapeSubscriptions.set(r,i),this.ensureSocket(s.shardKey),this.sendShapeSubscribeIfOpen(i),()=>{this.shapeSubscriptions.delete(r),this.sendOrQueueUnsubscribe(i.shardKey,r,"shape_unsubscribe")}}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 r=`stream_${this.nextStreamId.toString()}`,{shardKey:i}=s,n=t??{},{handle:a,iterable:o}=xe({maxBuffer:s.maxBuffer,onCancel:()=>{this.cancelStream(r,i)}});this.ensureSocket(i);const c=this.getConnection(i),d={id:r,query:{args:C(n,`stream args for '${e.__lunoraRef}'`),functionPath:e.__lunoraRef,shardKey:i},type:"stream"},u={durable:s.durable===!0,generation:void 0,handle:a,lastSeq:0,message:d,shardKey:i,started:!1};this.streams.set(r,u);const f=c?.wsState==="open"&&v(c,d);if(u.started=f,!f&&c===void 0)return this.streams.delete(r),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")),o;if(!f){for(c.pendingStreams=c.pendingStreams??[];c.pendingStreams.length>=Je;){const m=c.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.streams.delete(m))}c.pendingStreams.push(d)}return o}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 r={...this.authToken?{authorization:`Bearer ${this.authToken}`}:{},...s.headers};return Se(e,t,{baseUrl:this.url,fetch:this.fetchImpl,headers:r,maxBuffer:s.maxBuffer,signal:s.signal})}close(){this.closed=!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();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.whisperHandlers.clear(),this.shapeSubscriptions.clear(),this.pokeBuffers.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}teardownConnection(e){e.polling.stop();const t=l(e.shardKey);for(const[s,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(s));if(e.pendingStreams=void 0,e.pendingUnsubscribes=[],this.clearResubscribeQueue(e),this.clearConnectionTimers(e),this.stopHeartbeat(e),e.socket){try{e.socket.close()}catch{}e.socket=void 0}e.wsState="closed"}createTabCoordinator(){const e=`lunora-bridge::${this.url}::${this.identityFingerprint()??"anon"}`;return new be({channelName:e,onBecomeLeader:()=>{for(const t of this.subscriptions.all())this.ensureSocket(t.shardKey),this.queueResubscribe(t);for(const t of this.queuedOfflineShardKeys)this.ensureSocket(t);this.tabCoordinator?.broadcastConnectionStatus(this.computeStatus(),this.identityFingerprint())},onStopBeingLeader:()=>{for(const[t,s]of this.connections)this.teardownConnection(s),this.connections.delete(t);this.leaderStatus=void 0,this.leaderWasEverConnected=!1},onConnectionStatus:(t,s)=>{if(s!==void 0&&s!==this.identityFingerprint())return;const r=t==="connected"&&this.leaderStatus!=="connected"||t==="polling"&&this.leaderStatus!=="connected"&&this.leaderStatus!=="polling";this.leaderStatus=t,t==="connected"&&(this.leaderWasEverConnected=!0),this.emitConnectionStatus(),r&&this.flushAllOfflineQueues()},onSubscriptionData:(t,s,r,i,n)=>{if(n!==void 0&&n!==this.identityFingerprint())return;const a=this.subscriptions.get(t);a&&(a.serverBase=s,this.dropCacheSeed(t),r!==void 0&&(a.serverCursor=r,i!==void 0&&(a.serverEpoch=i),U(a,r)),_(a,A(s,a.optimisticLayers)))},onLeaderClaimAnswered:()=>{this.tabCoordinator?.isLeader()&&this.tabCoordinator.broadcastConnectionStatus(this.computeStatus(),this.identityFingerprint())},onSubscriptionError:(t,s,r)=>{if(r!==void 0&&r!==this.identityFingerprint())return;const i=this.subscriptions.get(t);i&&E(i.errorCallbacks,s)},onSubscriptionSettled:(t,s,r,i,n,a)=>{if(a!==void 0&&a!==this.identityFingerprint())return;const o=this.subscriptions.get(t);if(o){this.ackAndAdvanceCursor(o,s,r),i!==void 0&&n===this.clientId&&(o.lastMutationId=Math.max(o.lastMutationId??0,i));for(const c of o.checkpointCallbacks)c({checkpoint:o.serverCursor,mutationId:o.lastMutationId})}}})}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(k(this.url,N),{body:JSON.stringify({calls:e.map((a,o)=>({args:C(a.args??{},`args for batch call '${a.fn.__lunoraRef}'`),functionPath:a.fn.__lunoraRef,id:o,shardKey:a.shardKey}))}),headers:this.rpcRequestHeaders({attachBookmark:!0}),method:"POST",signal:t}),r=s.headers.get("x-d1-bookmark");r&&this.bookmark.set(r);let i;try{i=await s.json()}catch{throw new y("INTERNAL",`LunoraClient: batch response was not JSON (status ${s.status.toString()})`)}const n=F(i);if(!s.ok||n!==void 0&&!i.results)throw n!==void 0?W(n):new y("INTERNAL",`LunoraClient: batch request failed (status ${s.status.toString()})`);for(const a of i.results??[]){const o=a.body?.commitCursor;typeof a.id=="number"&&typeof o=="number"&&this.recordShardCursor(e[a.id]?.shardKey,o)}return ks(i.results??[],e.length)}async runMutation(e,t,s){this.assertOpen();const r=t,i=s.mutationId??z(),n=s.replayBaseline===void 0?this.baselineCursorFor(s.shardKey):s.replayBaseline??void 0,{confirms:a,rollbacks:o}=this.applyOptimisticUpdates(e.__lunoraRef,r,s.shardKey,s.optimistic);s.optimisticUpdate&&this.applyOptimisticUpdate(s.optimisticUpdate,t,s.shardKey,o,a);const c=this.offlineFlushes.get(l(s.shardKey));c!==void 0&&await c;const{hasSocket:d,polling:u,wasEverConnected:f,wsState:p}=this.connectionGateState(s.shardKey),{queueBeforeFirstConnect:m}=this.offlineQueue,b=f||m,w=this.WebSocketImpl!==void 0&&b,ce=p==="connecting"&&b&&!u,he=p!=="open"&&!d&&w&&!u,de=w&&s.replayBaseline===void 0&&this.hasPendingWriteAhead(s.shardKey),$=async()=>this.enqueueOfflineMutation(e,r,s.shardKey,n,i,o,a,s.precondition,s.mutationId);if(he||ce||de)return $();try{let R;const ue=await this.rpc(e.__lunoraRef,r,s.shardKey,{baselineSeq:n,captureBookmark:!0,mutationId:i,onCommitCursor:H=>{R=H}});for(const H of a)H(R);return{committed:!0,value:ue}}catch(R){if(u&&w&&R instanceof TypeError&&ie(r))return $();throw P(o),R}}async enqueueOfflineMutation(e,t,s,r,i,n,a,o,c){const d=this.identityFingerprint();if(this.outbox){this.outboxMutationCounter+=1;const f=this.outboxMutationCounter;try{await this.outbox.enqueue({args:t,baselineSeq:r,clientId:this.clientId,functionPath:e.__lunoraRef,idempotencyKey:c??`${this.clientId}:${String(f)}`,identity:d,mutationId:f,...n.length>0&&{onRejected:()=>{P(n)}},shardKey:s})}catch(p){throw P(n),p instanceof Error?p:new Error(String(p))}for(const p of a)p(void 0);return{committed:!1,value:void 0}}return{committed:!0,value:await new Promise((f,p)=>{const m={args:t,functionPath:e.__lunoraRef,liveAwaiter:!0,baselineSeq:r,id:i,clientId:this.clientId,identity:d,precondition:o,onCommit:b=>{for(const w of a)w(b)},reject:b=>{this.queuedIdentities.delete(i),P(n),p(b instanceof Error?b:new Error(String(b)))},resolve:f,shardKey:s};this.offlineQueue.enqueue(m),this.queuedOfflineShardKeys.add(s),m.id!==void 0&&this.queuedIdentities.set(m.id,d)})}}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(I(s.fn.__lunoraRef,s.argsKey,s.shardKey),s);for(const{key:s,...r}of e){if(we(this.persistenceVersion,r.version)){this.queryCache.remove(s).catch(()=>{});continue}const i=t.get(s);if(i&&this.cachedQueryMatchesIdentity(r)){this.seedSubscriptionFromCache(i,r);continue}this.hydratedQueryCache.set(s,r)}}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(I(e.fn.__lunoraRef,e.argsKey,e.shardKey),t),_(e,A(t.value,e.optimisticLayers)))}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,_(s,A(void 0,s.optimisticLayers))),this.hydratedQueryCache.set(e,t)}this.cacheSeededQueries.clear()}}takeHydratedCache(e,t,s){const r=I(e,t,s),i=this.hydratedQueryCache.get(r);if(!(i===void 0||!this.cachedQueryMatchesIdentity(i)))return this.hydratedQueryCache.delete(r),i}reseedFromHydratedCache(){if(this.hydratedQueryCache.size!==0)for(const e of this.subscriptions.all()){const t=I(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=I(e.fn.__lunoraRef,e.argsKey,e.shardKey),r=this.getConnection(e.shardKey)?.identity,i=r===void 0?this.identityFingerprint():r;i===null&&this.identityUnresolved()||(this.pendingCacheWrites.set(s,{identity:i,serverCursor:e.serverCursor,ts:Date.now(),value:t,...i===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(()=>{})},ze))}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,r])=>e.put(s,r)))}computeStatus(){if(this.tabCoordinator&&!this.tabCoordinator.isLeader())return this.leaderStatus??"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 r of this.subscriptions.all())l(r.shardKey)!==t||r.serverCursor===void 0||(s=s===void 0?r.serverCursor:Math.max(s,r.serverCursor));return s}async pollSubscriptions(e){const t=l(e),s=[];for(const a of this.subscriptions.all())l(a.shardKey)===t&&(ie(a.args)?s.push(a):E(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 r=ke(),i=this.identityFingerprint();let n;try{n=await re(async a=>this.sendBatch(s.map(o=>({args:o.args,fn:o.fn,shardKey:o.shardKey})),a))}catch(a){return!(a instanceof TypeError)}if(this.identityFingerprint()!==i)return!0;for(const[a,o]of s.entries()){const c=n[a];if(c!==void 0){if(!c.ok){E(o.errorCallbacks,{code:c.error.code,message:c.error.message});continue}this.handleDataMessage({data:M(c.value),id:o.id,type:"data"},r)}}return!0}async probeOrigin(){const{fetchImpl:e}=this;if(!e)return!1;try{return await re(async t=>e(k(this.url,N),{body:JSON.stringify({calls:[]}),headers:this.rpcRequestHeaders({}),method:"POST",signal:t})),!0}catch{return!1}}emitConnectionStatus(){const e=this.computeStatus();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,r){const i=[],n=[];if(!r)return{confirms:i,rollbacks:n};const a=T.key(e,t,s),o=this.subscriptions.get(a);if(o){const c=ve(o,r);c&&(i.push(c.confirm),n.push(c.rollback))}return{confirms:i,rollbacks:n}}applyOptimisticUpdate(e,t,s,r,i){const{confirms:n,rollbacks:a,store:o}=ge(this.subscriptions,s);try{e(o,t)}catch{P(a);return}r.push(...a),i.push(...n)}getConnection(e){return this.connections.get(l(e))}sendOrQueueUnsubscribe(e,t,s){const r=this.getConnection(e);r&&!v(r,{id:t,type:s})&&r.pendingUnsubscribes.push({id:t,type:s})}connectionGateState(e){if(this.tabCoordinator&&!this.tabCoordinator.isLeader()){let s="idle";return this.leaderStatus==="connected"?s="open":this.leaderStatus==="connecting"&&(s="connecting"),{hasSocket:!1,polling:this.leaderStatus==="polling",wasEverConnected:this.leaderWasEverConnected,wsState:s}}const t=this.getConnection(e);return{hasSocket:t?.socket!==void 0,polling:t?.polling.isPolling()??!1,wasEverConnected:t?.wasEverConnected??!1,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:Be({afterFailedAttempts:this.pollingFallbackAfterFailedAttempts,intervalMs:this.pollingFallbackIntervalMs,onReachable:()=>{this.flushOfflineQueue(e).catch(()=>{})},onStateChange:()=>{this.emitConnectionStatus()},poll:async()=>this.pollSubscriptions(e)}),reconnect:V(this.reconnectOptions),reconnectTimer:void 0,resubscribePending:new Map,resubscribeQueue:[],shardKey:e,socket:void 0,stableTimer:void 0,wasEverConnected:!1,wsState:"idle"},this.connections.set(t,s)),s}wsUrlFor(e,t){const s=[];if(e!==void 0&&s.push(`shard=${encodeURIComponent(e)}`),t!==void 0&&s.push(`token=${encodeURIComponent(t)}`),s.length===0)return this.wsUrl;const r=this.wsUrl.includes("?")?"&":"?";return`${this.wsUrl}${r}${s.join("&")}`}rpcRequestHeaders(e,t){const s={"content-type":"application/json"},r=this.shardCursors.get(this.cursorKeyFor(t));if(r!==void 0&&(s["x-lunora-min-seq"]=r.toString()),this.authToken&&(s.authorization=`Bearer ${this.authToken}`),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 i=this.bookmark.get();i&&(s["x-d1-bookmark"]=i)}return s}async rpc(e,t,s,r={}){if(!this.fetchImpl)throw new j("LunoraClient: no `fetch` implementation available");const i=this.rpcRequestHeaders(r,s),n=await this.fetchImpl(k(this.url,Qe),{body:JSON.stringify({args:C(t,`args for '${e}'`),functionPath:e,shardKey:s}),headers:i,method:"POST"});if(r.captureBookmark){const c=n.headers.get("x-d1-bookmark");c&&this.bookmark.set(c)}let a;try{a=await n.json()}catch{throw L(n.status,n.statusText,n.headers.get("retry-after"))}const o=F(a);if(o!==void 0)throw se(o,n.headers.get("retry-after"));if(!n.ok)throw L(n.status,n.statusText,n.headers.get("retry-after"));return r.onMutationAck?.(a.lastMutationId),r.onCommitCursor?.(a.commitCursor),this.learnDefaultShardKey(n,s),this.recordShardCursor(s,a.commitCursor),g(a.result)}async adminFetch(e,t,s,r){if(!this.fetchImpl)throw new y("INTERNAL","LunoraClient: no `fetch` implementation available");const i={};this.authToken&&(i.authorization=`Bearer ${this.authToken}`);const n=s instanceof ArrayBuffer||s instanceof Blob;let a;s===void 0?a=void 0:n?(a=s,r!==void 0&&(i["content-type"]=r)):(a=JSON.stringify(s),i["content-type"]="application/json");const o=await this.fetchImpl(k(this.url,e),{body:a,headers:i,method:t});let c;try{c=await o.json()}catch{const u=o.statusText?` ${o.statusText}`:"";throw new y("INTERNAL",`LunoraClient: response was not JSON (status ${o.status.toString()}${u})`)}const d=F(c);if(d!==void 0){const u=new Error(d.message??"admin request failed");throw u.code=d.code,u}if(!o.ok){const u=o.statusText?` ${o.statusText}`:"";throw new y("INTERNAL",`LunoraClient: admin request failed (status ${o.status.toString()}${u})`)}return c}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));v(e,{caps:bs,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){let r;try{r=await s()}catch{this.handleDisconnect(e);return}this.closed||this.WebSocketImpl===void 0||e.wsState!=="connecting"||e.socket!==void 0||this.openSocket(e,t,r)}openManagedSocket(e,t,s,r){const{WebSocketImpl:i}=this;if(i===void 0)throw new y("INTERNAL","no WebSocket implementation available");const n=new i(t);e.socket=n;const a=()=>{this.stopHeartbeat(e),e.connectTimer!==void 0&&(clearTimeout(e.connectTimer),e.connectTimer=void 0),e.socket===n&&(e.socket=void 0)},o=c=>{a(),r.onClose(c)};s>0&&(e.connectTimer=setTimeout(()=>{if(e.connectTimer=void 0,e.socket===n){try{n.close()}catch{}o()}},s)),n.addEventListener("open",()=>{if(e.socket===n){e.connectTimer!==void 0&&(clearTimeout(e.connectTimer),e.connectTimer=void 0),e.lastFrameAt=Date.now();try{r.onOpen?.()}catch(c){console.error("[lunora] connection open handler threw",c)}this.startHeartbeat(e,o)}}),n.addEventListener("message",c=>{if(e.socket===n){e.lastFrameAt=Date.now();try{r.onMessage(c)}catch(d){console.error("[lunora] server frame handler threw",d)}}}),n.addEventListener("close",c=>{e.socket===n&&o(c)}),n.addEventListener("error",()=>{e.socket===n&&o()})}openSocket(e,t,s){this.WebSocketImpl!==void 0&&(e.identity=this.identityFingerprint(),e.retired=!1,this.openManagedSocket(e,this.wsUrlFor(t,s),this.connectTimeoutMs,{onClose:r=>{r?.code===4001&&this.notifyTokenExpired(),this.handleDisconnect(e)},onMessage:r=>{e.retired!==!0&&this.handleServerMessage(r.data,t)},onOpen:()=>{e.wsState="open",e.wasEverConnected=!0,e.polling.noteOpen(),clearTimeout(e.stableTimer),e.stableTimer=setTimeout(()=>{e.wsState==="open"&&e.reconnect.reset()},Ve),this.emitConnectionStatus(),this.sendConnectEnvelope(e),this.markShardPendingAck(t),this.clearResubscribeQueue(e);for(const i of this.subscriptions.all())l(i.shardKey)===l(t)&&this.queueResubscribe(i);if(this.resendShapeSubscriptions(t),e.pendingUnsubscribes.length>0){const i=e.pendingUnsubscribes;e.pendingUnsubscribes=[];for(const{id:n,type:a}of i)v(e,{id:n,type:a})}this.flushPendingStreams(e);const r=this.whisperHandlers.get(l(t));if(r)for(const i of r.keys())v(e,{topic:i,type:"whisper_subscribe"});this.flushOfflineQueue(t).catch(()=>{})}}))}flushPendingStreams(e){if(!e.pendingStreams||e.pendingStreams.length===0)return;const t=e.pendingStreams;e.pendingStreams=[];for(const s of t){const r=v(e,s)?this.streams.get(String(s.id)):void 0;r&&(r.started=!0)}}cancelStream(e,t){const s=this.getConnection(t),r=this.streams.get(e);s&&(s.pendingStreams=s.pendingStreams?.filter(i=>i.id!==e),!v(s,{id:e,type:"unsubscribe"})&&r?.durable===!0&&r.started&&s.pendingUnsubscribes.push({id:e,type:"unsubscribe"})),this.streams.delete(e)}handleDisconnect(e){if(this.closed||e.wsState==="idle"||e.wsState==="closed")return;e.wsState==="connecting"&&e.polling.noteFailedOpen(),this.stopHeartbeat(e),this.clearConnectionTimers(e),e.socket=void 0,e.wsState="idle",this.emitConnectionStatus(),this.markShardPendingAck(e.shardKey),this.clearResubscribeQueue(e);const t=new Set((e.pendingStreams??[]).map(r=>r.id));for(const[r,i]of this.streams)if(!(l(i.shardKey)!==l(e.shardKey)||t.has(r))){if(i.durable){const n={...i.message,...i.generation===void 0?{}:{generation:i.generation},sinceChunk:i.lastSeq};i.message=n,e.pendingStreams=[...(e.pendingStreams??[]).filter(a=>a.id!==r),n];continue}i.handle.fail(new y("STREAM_DISCONNECTED","stream terminated: WebSocket disconnected")),this.streams.delete(r)}if(this.WebSocketImpl===void 0)return;const s=e.reconnect.next();e.reconnectTimer=setTimeout(()=>{e.reconnectTimer=void 0,this.ensureSocket(e.shardKey)},s)}startHeartbeat(e,t){this.stopHeartbeat(e),!(this.heartbeatIntervalMs<=0)&&(e.heartbeatTimer=setInterval(()=>{if(!e.socket)return;const{socket:s}=e;if(Date.now()-e.lastFrameAt>this.heartbeatIntervalMs*2.5){try{s.close()}catch{}t();return}try{s.send(Ke)}catch{}},this.heartbeatIntervalMs))}stopHeartbeat(e){e.heartbeatTimer!==void 0&&(clearInterval(e.heartbeatTimer),e.heartbeatTimer=void 0)}markShardPendingAck(e){const t=l(e);for(const s of this.subscriptions.all())l(s.shardKey)===t&&(s.acked=!1)}queueResubscribe(e){const t=this.getConnection(e.shardKey);t&&(t.resubscribeQueue.push(e),this.drainResubscribeQueue(t))}drainResubscribeQueue(e){for(;e.resubscribePending.size<Ye;){const t=e.resubscribeQueue.shift();if(!t)return;this.subscriptions.getById(t.id)&&this.sendSubscribeIfOpen(t)&&e.resubscribePending.set(t.id,setTimeout(()=>{this.releaseResubscribeSlot(e,t.id)},Xe))}}releaseResubscribeSlot(e,t){const s=e.resubscribePending.get(t);s!==void 0&&(clearTimeout(s),e.resubscribePending.delete(t),this.drainResubscribeQueue(e))}clearResubscribeQueue(e){for(const t of e.resubscribePending.values())clearTimeout(t);e.resubscribePending.clear(),e.resubscribeQueue=[]}sendSubscribeIfOpen(e){const t=this.getConnection(e.shardKey);if(t?.wsState!=="open"||e.acked)return!1;const s=e.serverCursor!==void 0&&e.serverBase!==void 0;return v(t,{id:e.id,query:{args:e.wireArgs,functionPath:e.fn.__lunoraRef,table:e.fn.__lunoraRef,...s?{sinceSeq:e.serverCursor}:{},...s&&e.serverEpoch!==void 0?{sinceEpoch:e.serverEpoch}:{}},type:"subscribe"})}sendShapeSubscribeIfOpen(e){const t=this.getConnection(e.shardKey);t?.wsState==="open"&&v(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=gs(e);if(s===void 0)return;let r;try{r=JSON.parse(s)}catch{return}if(r.type!=="error"&&this.getConnection(t)?.reconnect.reset(),typeof r.id=="string"){const i=this.getConnection(t);i&&this.releaseResubscribeSlot(i,r.id)}switch(r.type){case"ack":{const i=this.subscriptions.getById(r.id);i&&(i.acked=!0);return}case"chunk":{const{data:i,generation:n,id:a,seq:o}=r,c=this.streams.get(a);c&&typeof o=="number"&&(c.lastSeq=o,typeof n=="number"&&(c.generation=n),c.durable=!0),c?.handle.push(g(i));return}case"complete":{this.handleCompleteMessage(r.id);return}case"data":case"delta":{this.handleDataMessage(r);return}case"error":{this.handleErrorMessage(r);break}case"pokeEnd":{this.handlePokeEnd(r,t);break}case"pokePart":{this.handlePokePart(r,t);break}case"pokeStart":{this.handlePokeStart(r,t);break}case"resume":{this.handleResumeMessage(r);break}case"settled":{this.handleSettledMessage(r);break}case"whisper":{this.dispatchWhisper(r,t);break}}}handleErrorMessage(e){if(e.error?.code==="TOKEN_EXPIRED"){this.notifyTokenExpired();return}const{id:s}=e,r=s===void 0?void 0:this.streams.get(s);if(r&&s!==void 0){r.handle.fail(Ss(e)),this.streams.delete(s);return}const i=s===void 0?void 0:this.subscriptions.getById(s);if(i){const a=te(e),o=this.identityFingerprint(),c=T.keyOf(i);E(i.errorCallbacks,a),this.tabCoordinator?.isLeader()&&this.tabCoordinator.broadcastSubscriptionError(c,a,o);return}const n=s===void 0?void 0:this.shapeSubscriptions.get(s);n&&E(n.errorCallbacks,te(e))}pokeBufferKey(e,t){return`${l(e)}\0${t}`}handlePokeStart(e,t){J(this.pokeBuffers,oe.MAX_POKE_BUFFERS),this.pokeBuffers.set(this.pokeBufferKey(t,e.pokeId),{baseCheckpoint:e.baseCheckpoint,bases:new Map,epoch:e.epoch,lastMutationId:new Map,parts:new Map,resets:new Set})}handlePokePart(e,t){const s=this.pokeBuffers.get(this.pokeBufferKey(t,e.pokeId));if(!s)return;const r=s.parts.get(e.shapeId)??[];for(const n of e.rowsPatch)r.push(n.value===void 0?n:{...n,value:g(n.value)});s.parts.set(e.shapeId,r),e.lastMutationId!==void 0&&s.lastMutationId.set(e.shapeId,e.lastMutationId);const i=e.baseCheckpoint??s.baseCheckpoint;i!==void 0&&s.bases.set(e.shapeId,i),e.reset===!0&&s.resets.add(e.shapeId)}handlePokeEnd(e,t){const s=this.pokeBufferKey(t,e.pokeId),r=this.pokeBuffers.get(s);if(r){this.pokeBuffers.delete(s);for(const i of r.parts.keys()){const n=this.shapeSubscriptions.get(i);n&&this.applyPokePart(n,r,e)}}}applyPokePart(e,t,s){const r=t.parts.get(e.id)??[],i=t.resets.has(e.id),n=t.bases.get(e.id),a=t.epoch!==void 0&&e.serverEpoch!==void 0&&t.epoch!==e.serverEpoch,o=n!==void 0&&e.serverCursor!==void 0&&e.serverCursor!==n;if(!i&&(a||o)){e.rows.clear(),e.serverCursor=void 0,e.serverEpoch=void 0,this.emitShapeRows(e),this.sendShapeSubscribeIfOpen(e);return}i&&e.rows.clear(),De(e.rows,r),s.checkpoint!==void 0&&(e.serverCursor=s.checkpoint),s.epoch!==void 0&&(e.serverEpoch=s.epoch);const c=t.lastMutationId.get(e.id);c!==void 0&&(e.lastMutationId=c),this.emitShapeRows(e),e.onCheckpoint?.({checkpoint:e.serverCursor,mutationId:e.lastMutationId})}resnapshotSubscription(e){e.acked=!1,e.serverCursor=void 0,e.serverEpoch=void 0,console.warn("[lunora] could not merge a row delta into the cached result; re-subscribing for a full snapshot"),this.sendSubscribeIfOpen(e)}emitShapeRows(e){const t=[...e.rows.values()];for(const s of e.callbacks)try{s(t)}catch{}}handleDataMessage(e,t){const{id:s}=e,r=s?this.subscriptions.getById(s):void 0;if(!r)return;let i;try{i=this.resolveDataPayload(e,r)}catch(n){E(r.errorCallbacks,{code:"WIRE_DECODE_FAILED",message:`could not decode a server frame for this subscription — ${n instanceof Error?n.message:String(n)}`});return}if(i===Y){this.resnapshotSubscription(r);return}if(r.serverBase=i,this.dropCacheSeed(T.keyOf(r)),e.cursor!==void 0&&(r.serverCursor=e.cursor),e.epoch!==void 0&&(r.serverEpoch=e.epoch),e.lastMutationId!==void 0){r.lastMutationId=Math.max(r.lastMutationId??0,e.lastMutationId);for(const n of r.checkpointCallbacks)n({checkpoint:r.serverCursor,mutationId:r.lastMutationId,rowsFollow:!0})}if(this.persistQueryValue(r),U(r,r.serverCursor),t!==void 0&&Te(r,t),_(r,A(i,r.optimisticLayers)),this.tabCoordinator?.isLeader()){const n=T.keyOf(r);this.tabCoordinator.broadcastSubscriptionData(n,i,r.serverCursor,r.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&&(t.lastMutationId=Math.max(t.lastMutationId??0,e.lastMutationId));for(const s of t.checkpointCallbacks)s({checkpoint:t.serverCursor,mutationId:t.lastMutationId});if(this.tabCoordinator?.isLeader()){const s=T.keyOf(t);this.tabCoordinator.broadcastSubscriptionSettled(s,t.serverCursor,t.serverEpoch,t.lastMutationId,this.clientId,this.identityFingerprint())}}}ackAndAdvanceCursor(e,t,s){e.acked=!0,(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),U(e,e.serverCursor)&&_(e,A(e.serverBase,e.optimisticLayers)))}resolveDataPayload(e,t){if("data"in e&&e.data!==void 0)return g(e.data);const s=g(e.delta);return le(s)?t.serverBase===void 0?s:fe(t.serverBase,s)??Y:s}dispatchWhisper(e,t){const s=this.whisperHandlers.get(l(t))?.get(e.topic);if(!s)return;const r=g(e.data);for(const i of s)try{i(r,e.from)}catch{}}notifyTokenExpired(){this.tokenExpiredListeners.emit()}handleCompleteMessage(e){const t=this.streams.get(e);if(t){t.handle.complete(),this.streams.delete(e);return}const s=this.subscriptions.getById(e);s&&(s.acked=!1,E(s.errorCallbacks,{code:"SUBSCRIPTION_CANCELLED",message:"subscription was cancelled by the server"}))}unpersist(e){e&&this.persistence?.remove(e).catch(t=>{Ee(this.onPersistenceError,"remove",t,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 r=0;r<e.length;r+=1){const i=e.charCodeAt(r);t^=i,t=Math.imul(t,16777619),s=Math.imul(s,33)+i}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&&Z(this.computeStatus())&&this.flushAllOfflineQueues()}identityUnresolved(){return this.sessionProbesInFlight>0?!0:this.identityResolutionExpected&&!this.identitySettled}adoptResolvedSubject(e,t,s){this.closed||t===null||this.authToken!==e||s!==this.sessionProbeGeneration||this.setAuthToken(e,t.id)}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}rejectQueuedForIdentityChange(e){const t=this.offlineQueue.drain(),s=[];for(const r of t){if(this.replayIdentityVerdict(this.stampOf(r))!=="mismatch"){s.push(r);continue}this.queuedIdentities.delete(r.id??""),this.unpersist(r.id);const i=new Error("offline mutation discarded: auth identity changed before replay");i.code="OFFLINE_IDENTITY_CHANGED",r.reject(i),this.emitItemSettled(r,"rejected",i)}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,r]of this.queuedIdentities)r===e&&this.queuedIdentities.set(s,t);this.offlineQueue.restampIdentity(e,t)}restampWatermarks(e,t){const s=e??"",r=this.clientWatermarks.get(s);if(r===void 0)return;this.clientWatermarks.delete(s);const i=t??"",n=this.clientWatermarks.get(i);if(n===void 0)this.clientWatermarks.set(i,r);else for(const[a,o]of r)n.set(a,o)}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.revokeCacheSeededValues();for(const e of this.subscriptions.all())e.serverBase=void 0,e.serverCursor=void 0,e.serverEpoch=void 0,e.acked=!1,_(e,A(void 0,e.optimisticLayers));for(const e of this.shapeSubscriptions.values())e.rows.clear(),e.serverCursor=void 0,e.serverEpoch=void 0,this.emitShapeRows(e);this.bounceShardSockets(),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()}bounceShardSockets(){for(const e of this.connections.values())if(e.socket){e.retired=!0;try{e.socket.close()}catch{}}}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 r=(async()=>{await(s??Promise.resolve());try{await this.drainOfflineQueue(e)}catch{}})();this.offlineFlushes.set(t,r),await r,this.offlineFlushes.get(t)===r&&this.offlineFlushes.delete(t)}async drainOfflineQueue(e){const t=this.offlineQueue.drainConflict();for(const c of t){this.unpersist(c.id),this.queuedIdentities.delete(c.id??"");const d=new Error("offline mutation skipped: precondition failed before replay");d.code="OFFLINE_PRECONDITION_FAILED",this.emitItemSettled(c,"rejected",d)}const s=l(e),r=this.offlineQueue.drain(c=>l(c.shardKey)===s);if(r.length===0)return;const i=[],n=[];for(const c of r){const d=this.replayGateVerdict(c);d==="send"?i.push(c):d==="hold"&&n.push(c)}if(this.offlineQueue.requeue(n),n.length>0&&this.subjectAwaitingReconfirm()&&(this.getCurrentUser().catch(()=>{}),this.noteHeldRetryDelay(e)),i.length===0){this.scheduleRateLimitedRetry(e);return}const a=this.encodableOrSettleTerminal(i);if(a.length===0){this.scheduleRateLimitedRetry(e);return}if(a.length===1){await this.replaySequential(a,e),this.scheduleRateLimitedRetry(e);return}const o=[];for(let c=0;c<a.length;c+=x){const d=a.slice(c,c+x),u=await this.replayBatched(d,e);if(o.push(...u.requeue),u.stop){o.push(...a.slice(c+x));break}}o.length>0&&this.offlineQueue.requeue(o),this.scheduleRateLimitedRetry(e)}noteHeldRetryDelay(e){const t=l(e),s=this.replayRetryState.get(t),r=(s?.attempts??0)+1;this.replayRetryState.set(t,{attempts:r,delayMs:Math.max(s?.delayMs??0,Ie(r))})}noteReplayRetryDelay(e,t){const s=l(e),r=this.replayRetryState.get(s),i=(r?.attempts??0)+1,n=Oe(t,i);this.replayRetryState.set(s,{attempts:i,delayMs:n===void 0?r?.delayMs:Math.max(r?.delayMs??0,n)})}scheduleRateLimitedRetry(e){const t=l(e),s=this.replayRetryState.get(t),r=s?.delayMs;if(s===void 0||r===void 0||this.closed||this.offlineQueue.size===0){this.replayRetryState.delete(t);return}s.delayMs=void 0;const i=this.replayRetryTimers.get(t);i!==void 0&&clearTimeout(i),this.replayRetryTimers.set(t,setTimeout(()=>{this.replayRetryTimers.delete(t),this.flushOfflineQueue(e).catch(()=>{})},r))}encodableOrSettleTerminal(e){const t=[];for(const s of e)try{C(s.args,`args for '${s.functionPath}'`),t.push(s)}catch(r){this.settleReplayTerminal(s,r instanceof Error?r:new Error(String(r)))}return t}replayGateVerdict(e){const t=this.stampOf(e);if(t===void 0)return this.queuedIdentities.delete(e.id??""),"send";const s=this.replayIdentityVerdict(t);if(s==="unknown")return"hold";if(this.queuedIdentities.delete(e.id??""),s==="match")return"send";this.unpersist(e.id);const r=new Error("offline mutation skipped: auth identity changed before replay");return r.code="OFFLINE_IDENTITY_CHANGED",e.reject(r),this.emitItemSettled(e,"rejected",r),"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 r=this.shardCursors.get("");r!==void 0&&(this.shardCursors.set(s,Math.max(this.shardCursors.get(s)??0,r)),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){if(Re(e)){const t=this.hashToken(this.authToken??"");return this.authRefusalNotifiedFor!==t&&(this.authRefusalNotifiedFor=t,this.notifyTokenExpired()),!0}return Pe(e)}settleReplayTerminal(e,t){this.unpersist(e.id),e.reject(t),this.emitItemSettled(e,"rejected",t)}async replaySequential(e,t){for(let s=0;s<e.length;s+=1){const r=e[s];if(r)try{let i;const n=await this.rpc(r.functionPath,r.args,r.shardKey,{baselineSeq:r.baselineSeq,captureBookmark:!0,clientId:r.clientId??this.clientId,mutationId:r.id,onCommitCursor:a=>{i=a}});this.settleReplaySuccess(r,n,i)}catch(i){if(!this.shouldRequeueReplayFailure(i)){this.settleReplayTerminal(r,i);continue}this.noteReplayRetryDelay(t,i),this.offlineQueue.requeue(e.slice(s));return}}}async replayBatched(e,t){if(!this.fetchImpl)return{requeue:e,stop:!0};const s=JSON.stringify({calls:e.map((o,c)=>({args:C(o.args,`args for '${o.functionPath}'`),baselineSeq:o.baselineSeq,functionPath:o.functionPath,id:c,clientId:o.clientId??this.clientId,mutationId:o.id,shardKey:o.shardKey}))});if(e.length>1&&Fe(s)>Me)return await this.replayBatchedHalves(e,t);let r;try{r=await this.fetchImpl(k(this.url,N),{body:s,headers:this.rpcRequestHeaders({attachBookmark:!0}),method:"POST"})}catch{return{requeue:e,stop:!0}}const i=r.headers.get("x-d1-bookmark");if(i&&this.bookmark.set(i),r.status===413&&e.length>1)return await this.replayBatchedHalves(e,t);let n;const a=r.headers.get("retry-after");try{n=await r.json()}catch{return this.settleWholeBatchError(e,L(r.status,r.statusText,a),t)}if(!n.results){const o=F(n),c=o===void 0?L(r.status,r.statusText,a):se(o,a);return this.settleWholeBatchError(e,c,t)}return{requeue:this.settleReplayBatchSlots(e,n.results,t),stop:!1}}settleWholeBatchError(e,t,s){if(t instanceof j||t.code!==void 0&&this.shouldRequeueReplayFailure(t))return this.noteReplayRetryDelay(s,t),{requeue:e,stop:!0};for(const r of e)this.settleReplayTerminal(r,t);return{requeue:[],stop:!1}}async replayBatchedHalves(e,t){const s=Math.ceil(e.length/2),r=await this.replayBatched(e.slice(0,s),t);if(r.stop)return{requeue:[...r.requeue,...e.slice(s)],stop:!0};const i=await this.replayBatched(e.slice(s),t);return{requeue:[...r.requeue,...i.requeue],stop:i.stop}}settleReplayBatchSlots(e,t,s){const r=new Map;for(const n of t)typeof n.id=="number"&&n.body!==void 0&&r.set(n.id,n.body);const i=[];for(const[n,a]of e.entries()){const o=r.get(n);if(o===void 0)i.push(a);else if("error"in o){const c=ae(o);this.shouldRequeueReplayFailure(c)?(this.noteReplayRetryDelay(s,c),i.push(a)):this.settleReplayTerminal(a,c)}else this.settleReplaySuccess(a,g(o.result),o.commitCursor)}return i}}export{oe as LunoraClient};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{a as e,i}from"./delta-merge-vxvH3PvF.mjs";export{e as applyDelta,i as isMutationDelta};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{c as t}from"./local-store-CWeFEk6w.mjs";import"./SubscriptionRegistry-CS-AFUI9.mjs";export{t as createLocalStore};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
const m=e=>{let t="";for(let o=0;o<e.length;o+=32768)t+=String.fromCharCode(...e.subarray(o,o+32768));return btoa(t)},A=e=>{const t=atob(e),a=new Uint8Array(t.length);for(let o=0;o<t.length;o+=1)a[o]=t.codePointAt(o)??0;return a},i="$lunora.wire$";const w="__proto__",g={BigInt64Array,BigUint64Array,Float32Array,Float64Array,Int8Array,Int16Array,Int32Array,Uint8Array,Uint8ClampedArray,Uint16Array,Uint32Array},p={Error,EvalError,RangeError,ReferenceError,SyntaxError,TypeError,URIError},l=e=>{if(e===null||typeof e!="object")return!1;const t=Object.getPrototypeOf(e);return t===null||t===Object.prototype},b=(e,t=0)=>{if(t>64)throw new RangeError("wire-codec: value nesting exceeds the 64-level limit");if(e===void 0)return[i,"undefined"];if(e===null)return null;const a=typeof e;if(a==="bigint")return[i,"bigint",e.toString()];if(a==="number"){const r=e;return Number.isNaN(r)?[i,"nan"]:r===1/0?[i,"inf"]:r===-1/0?[i,"-inf"]:r}if(a!=="object")return e;if(e instanceof Date)return[i,"date",b(e.getTime(),t+1)];if(e instanceof Error){const r=e,n={};for(const c of Object.keys(r)){if(r[c]===void 0)continue;const u=b(r[c],t+1);c===w?Object.defineProperty(n,c,{configurable:!0,enumerable:!0,value:u,writable:!0}):n[c]=u}const s=[i,"error",String(r.name),String(r.message),n];return r.cause!==void 0&&s.push(b(r.cause,t+1)),s}if(e instanceof URL)return[i,"url",e.href];if(e instanceof Map)return[i,"map",[...e.entries()].map(([r,n])=>[b(r,t+1),b(n,t+1)])];if(e instanceof Set)return[i,"set",[...e].map(r=>b(r,t+1))];if(e instanceof ArrayBuffer)return[i,"bytes",m(new Uint8Array(e)),"ArrayBuffer"];if(ArrayBuffer.isView(e)){const r=e,n=r.constructor.name,s=new Uint8Array(r.buffer,r.byteOffset,r.byteLength);return n==="Uint8Array"?[i,"bytes",m(s)]:[i,"bytes",m(s),n]}if(Array.isArray(e)){const r=e.map(n=>b(n,t+1));return r.length>0&&r[0]===i?[i,"arr",r]:r}if(!l(e)){const r=e.constructor?.name??"value";throw new TypeError(`wire-codec: cannot encode a ${r} over the Lunora wire — only plain objects, arrays, and the supported built-ins (Date, Error, URL, Map, Set, ArrayBuffer/typed arrays, bigint) round-trip`)}const o=e,f={};for(const r of Object.keys(o)){const n=o[r];if(n===void 0)continue;const s=b(n,t+1);r===w?Object.defineProperty(f,r,{configurable:!0,enumerable:!0,value:s,writable:!0}):f[r]=s}return f},y=(e,t=0)=>{if(t>64)throw new RangeError("wire-codec: value nesting exceeds the 64-level limit");if(e===null||typeof e!="object")return e;if(Array.isArray(e)){if(e[0]===i)switch(e[1]){case"-inf":return-1/0;case"arr":return e[2].map(r=>y(r,t+1));case"bigint":{const r=e[2];if(typeof r!="string"||r.length>1024||!/^-?\d+$/.test(r))throw new RangeError("wire-codec: invalid or over-long bigint (max 1024 digits)");return BigInt(r)}case"date":{const r=y(e[2],t+1);if(typeof r!="number")throw new TypeError("wire-codec: malformed date — epoch must be a number");return new Date(r)}case"map":{const r=e[2];return new Map(r.map(n=>{if(!Array.isArray(n)||n.length!==2)throw new TypeError("wire-codec: malformed map entry — expected a [key, value] pair");return[y(n[0],t+1),y(n[1],t+1)]}))}case"set":return new Set(e[2].map(r=>y(r,t+1)));case"url":{const r=e[2];if(typeof r!="string")throw new TypeError("wire-codec: malformed url — href must be a string");return new URL(r)}case"error":{const r=e[2],n=e[3];if(typeof r!="string"||typeof n!="string")throw new TypeError("wire-codec: malformed error — name and message must be strings");const s=(Object.hasOwn(p,r)?p[r]:void 0)??Error,c=new s(n);c.name!==r&&Object.defineProperty(c,"name",{configurable:!0,value:r,writable:!0});const u=y(e[4],t+1);if(u===null||typeof u!="object"||Array.isArray(u))throw new TypeError("wire-codec: malformed error — props must be an object");for(const d of Object.keys(u))d===w?Object.defineProperty(c,d,{configurable:!0,enumerable:!0,value:u[d],writable:!0}):c[d]=u[d];return e.length>5&&Object.defineProperty(c,"cause",{configurable:!0,value:y(e[5],t+1),writable:!0}),c}case"bytes":{const r=e[2];if(typeof r!="string")throw new TypeError("wire-codec: malformed bytes — payload must be a base64 string");const n=A(r);if(m(n)!==r)throw new TypeError("wire-codec: malformed bytes — payload must be canonical padded base64");const s=e[3]??"Uint8Array";if(s==="ArrayBuffer")return n.buffer.byteLength===n.byteLength?n.buffer:n.slice().buffer;const c=Object.hasOwn(g,s)?g[s]:void 0;return c?new c(n.slice().buffer):n}case"inf":return 1/0;case"nan":return Number.NaN;case"undefined":return;default:return e.map(r=>y(r,t+1))}return e.map(f=>y(f,t+1))}const a=e,o={};for(const f of Object.keys(a)){const r=y(a[f],t+1);f===w?Object.defineProperty(o,f,{configurable:!0,enumerable:!0,value:r,writable:!0}):o[f]=r}return o},E=(e,t,a)=>{try{return b(a)}catch(o){throw new TypeError(`${e}: cannot encode args for '${t}' — ${o instanceof Error?o.message:String(o)}`,o instanceof Error?{cause:o}:void 0)}};export{E as a,y as d,b as e,l as i};
|