dynamodb-reactive 0.1.22 → 0.2.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +378 -153
- package/dist/client-r_tnzwqi.d.ts +224 -0
- package/dist/client.cjs +1023 -0
- package/dist/client.cjs.map +1 -0
- package/dist/client.d.cts +6 -0
- package/dist/client.d.ts +4 -70
- package/dist/client.js +1013 -1
- package/dist/client.js.map +1 -1
- package/dist/core.cjs +232 -0
- package/dist/core.cjs.map +1 -0
- package/dist/core.d.cts +4 -0
- package/dist/core.d.ts +3 -3
- package/dist/core.js +222 -1
- package/dist/core.js.map +1 -1
- package/dist/index.cjs +232 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +157 -0
- package/dist/index.d.ts +103 -56
- package/dist/index.js +222 -1
- package/dist/index.js.map +1 -1
- package/dist/infra.cjs +623 -0
- package/dist/infra.cjs.map +1 -0
- package/dist/infra.d.cts +119 -0
- package/dist/infra.d.ts +50 -102
- package/dist/infra.js +371 -144
- package/dist/infra.js.map +1 -1
- package/dist/react.cjs +1250 -0
- package/dist/react.cjs.map +1 -0
- package/dist/react.d.cts +68 -0
- package/dist/react.d.ts +68 -3
- package/dist/react.js +1237 -1
- package/dist/react.js.map +1 -1
- package/dist/server.cjs +2351 -0
- package/dist/server.cjs.map +1 -0
- package/dist/server.d.cts +364 -0
- package/dist/server.d.ts +58 -313
- package/dist/server.js +1855 -1208
- package/dist/server.js.map +1 -1
- package/dist/{table-tN3D4Tm-.d.ts → table-BijJ73pX.d.ts} +2 -34
- package/dist/{types-ISMJfyIv.d.ts → types-LMLk8JVC.d.ts} +56 -30
- package/package.json +79 -41
- package/dist/chunk-2KC44Q5I.js +0 -1103
- package/dist/chunk-2KC44Q5I.js.map +0 -1
- package/dist/chunk-ZAJA4KBE.js +0 -150
- package/dist/chunk-ZAJA4KBE.js.map +0 -1
- package/dist/react-D_NLHuuO.d.ts +0 -556
package/dist/client.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"client.js"}
|
|
1
|
+
{"version":3,"sources":["../../client/src/canonical.ts","../../client/src/patcher.ts","../../client/src/log.ts","../../client/src/websocket.ts","../../client/src/client.ts"],"names":["key","error"],"mappings":"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","file":"client.js","sourcesContent":["function canonicalize(\n value: unknown,\n seen: Set<object>,\n key: string,\n arrayItem = false,\n applyToJSON = true,\n): string | undefined {\n if (value === null) return 'null';\n\n switch (typeof value) {\n case 'string':\n case 'boolean':\n return JSON.stringify(value);\n case 'number':\n return Number.isFinite(value) ? JSON.stringify(value) : 'null';\n case 'undefined':\n return arrayItem ? 'null' : undefined;\n case 'object': {\n if (\n applyToJSON &&\n 'toJSON' in value &&\n typeof value.toJSON === 'function'\n ) {\n return canonicalize(value.toJSON(key), seen, key, arrayItem, false);\n }\n if (seen.has(value)) {\n throw new TypeError('Query input must not contain circular references');\n }\n\n seen.add(value);\n try {\n if (Array.isArray(value)) {\n const items: string[] = [];\n for (let index = 0; index < value.length; index++) {\n items.push(\n canonicalize(value[index], seen, String(index), true) ?? 'null',\n );\n }\n return `[${items.join(',')}]`;\n }\n\n const object = value as Record<string, unknown>;\n const entries: string[] = [];\n for (const key of Object.keys(object).sort()) {\n const item = canonicalize(object[key], seen, key);\n if (item !== undefined) {\n entries.push(`${JSON.stringify(key)}:${item}`);\n }\n }\n return `{${entries.join(',')}}`;\n } finally {\n seen.delete(value);\n }\n }\n default:\n throw new TypeError(`Unsupported query input value: ${typeof value}`);\n }\n}\n\n/** Return the stable identity used for subscription sharing and targeting. */\nexport function getQueryKey(path: string, input?: unknown): string {\n return `${JSON.stringify(path)}:${canonicalize(input, new Set(), '') ?? 'undefined'}`;\n}\n","import jsonpatch, { type Operation } from 'fast-json-patch';\n\nimport type { JsonPatch } from './protocol.js';\n\nconst { applyPatch } = jsonpatch;\n\n/**\n * Apply JSON patches to a document\n */\nexport function applyPatches<T>(document: T, patches: JsonPatch[]): T {\n if (patches.length === 0) {\n return document;\n }\n\n const operations: Operation[] = patches.map((patch) => {\n const op: Operation = {\n op: patch.op,\n path: patch.path,\n } as Operation;\n\n if ('value' in patch && patch.value !== undefined) {\n (op as { value: unknown }).value = patch.value;\n }\n if ('from' in patch && patch.from !== undefined) {\n (op as { from: string }).from = patch.from;\n }\n\n return op;\n });\n\n try {\n const result = applyPatch(\n structuredClone(document),\n operations,\n true, // Validate operations\n false, // Don't mutate the original\n );\n\n return result.newDocument as T;\n } catch (error) {\n throw new Error('Failed to apply patches', { cause: error });\n }\n}\n","/* eslint-disable no-console */\ntype DebugGlobal = typeof globalThis & {\n __DYNAMODB_REACTIVE_DEBUG__?: boolean;\n};\n\nexport function debug(...values: unknown[]): void {\n if ((globalThis as DebugGlobal).__DYNAMODB_REACTIVE_DEBUG__) {\n console.debug(...values);\n }\n}\n\nexport function warn(...values: unknown[]): void {\n console.warn(...values);\n}\n\nexport function error(...values: unknown[]): void {\n console.error(...values);\n}\n","import { error as logError } from './log.js';\nimport type { WebSocketEvent } from './protocol.js';\nimport type { ConnectionState, ReactiveClientConfig } from './types.js';\n\ninterface ConnectionWaitOptions {\n signal?: AbortSignal;\n timeoutMs?: number;\n}\n\ninterface ConnectionWaiter {\n resolve: (id: string) => void;\n reject: (error: Error) => void;\n cleanup: () => void;\n}\n\ntype ManagerConfig = Required<\n Pick<\n ReactiveClientConfig,\n | 'autoReconnect'\n | 'connectionTimeout'\n | 'handshakeTimeout'\n | 'maxReconnectAttempts'\n | 'reconnectDelay'\n >\n> &\n ReactiveClientConfig;\n\nconst HEARTBEAT_INTERVAL_MS = 5 * 60 * 1000;\n\nfunction withDefaults(config: ReactiveClientConfig): ManagerConfig {\n return {\n autoReconnect: true,\n connectionTimeout: 10000,\n handshakeTimeout: 10000,\n maxReconnectAttempts: 10,\n reconnectDelay: 1000,\n ...config,\n };\n}\n\n/** WebSocket manager with generation-fenced events and reconnection. */\nexport class WebSocketManager {\n private config: ManagerConfig;\n private ws: WebSocket | null = null;\n private state: ConnectionState = 'disconnected';\n private reconnectAttempts = 0;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private handshakeTimer: ReturnType<typeof setTimeout> | null = null;\n private heartbeatTimer: ReturnType<typeof setInterval> | null = null;\n private messageHandlers = new Set<(message: WebSocketEvent) => void>();\n private stateHandlers = new Set<(state: ConnectionState) => void>();\n private handshakeHandlers = new Set<(generation: number) => void>();\n private _connectionId: string | null = null;\n private connectionWaiters = new Set<ConnectionWaiter>();\n private socketGeneration = 0;\n private intentionalDisconnect = false;\n\n constructor(config: ReactiveClientConfig) {\n this.config = withDefaults(config);\n }\n\n /** Apply settings used by future requests/events without replacing the socket. */\n configure(config: ReactiveClientConfig): void {\n this.config = withDefaults(config);\n }\n\n get connectionId(): string | null {\n return this._connectionId;\n }\n\n get generation(): number {\n return this.socketGeneration;\n }\n\n waitForConnectionId(options: ConnectionWaitOptions = {}): Promise<string> {\n if (this._connectionId && this.state === 'connected') {\n return Promise.resolve(this._connectionId);\n }\n if (options.signal?.aborted) {\n return Promise.reject(new Error('Connection wait aborted'));\n }\n\n const timeoutMs = options.timeoutMs ?? this.config.connectionTimeout;\n return new Promise((resolve, reject) => {\n let timeout: ReturnType<typeof setTimeout> | undefined;\n const abort = () => finish(new Error('Connection wait aborted'));\n const waiter: ConnectionWaiter = {\n resolve,\n reject,\n cleanup: () => {\n if (timeout) clearTimeout(timeout);\n options.signal?.removeEventListener('abort', abort);\n },\n };\n const finish = (failure: Error) => {\n if (!this.connectionWaiters.delete(waiter)) return;\n waiter.cleanup();\n reject(failure);\n };\n\n this.connectionWaiters.add(waiter);\n options.signal?.addEventListener('abort', abort, { once: true });\n timeout = setTimeout(\n () => finish(new Error(`Connection timed out after ${timeoutMs}ms`)),\n timeoutMs,\n );\n });\n }\n\n getState(): ConnectionState {\n return this.state;\n }\n\n async connect(): Promise<void> {\n if (this.state === 'connected') return;\n if (this.state === 'connecting') {\n await this.waitForConnectionId();\n return;\n }\n\n this.intentionalDisconnect = false;\n const generation = ++this.socketGeneration;\n this.setState('connecting');\n let socket: WebSocket | undefined;\n\n try {\n const url = await this.buildUrl();\n if (\n generation !== this.socketGeneration ||\n this.intentionalDisconnect\n ) {\n return;\n }\n\n const nextSocket = new WebSocket(url);\n socket = nextSocket;\n this.ws = nextSocket;\n this.startHandshakeTimer(nextSocket, generation);\n\n nextSocket.onopen = () => {\n if (!this.isCurrent(nextSocket, generation)) return;\n nextSocket.send(JSON.stringify({ type: 'init' }));\n };\n\n nextSocket.onclose = () => {\n if (!this.isCurrent(nextSocket, generation)) return;\n this.clearConnectionTimers();\n this.ws = null;\n this._connectionId = null;\n this.setState('disconnected');\n this.invokeLifecycleCallback(\n 'onDisconnect',\n this.config.onDisconnect,\n );\n\n if (this.config.autoReconnect && !this.intentionalDisconnect) {\n this.scheduleReconnect();\n } else {\n this.rejectWaiters(new Error('WebSocket disconnected'));\n }\n };\n\n nextSocket.onerror = () => {\n if (!this.isCurrent(nextSocket, generation)) return;\n this.invokeLifecycleCallback(\n 'onError',\n this.config.onError,\n new Error('WebSocket error'),\n );\n };\n\n nextSocket.onmessage = (event) => {\n if (!this.isCurrent(nextSocket, generation)) return;\n this.receiveMessage(nextSocket, generation, event.data);\n };\n\n } catch (cause) {\n if (generation !== this.socketGeneration) return;\n const failure =\n cause instanceof Error ? cause : new Error(String(cause));\n this.clearConnectionTimers();\n if (socket && this.ws === socket) socket.close();\n this.ws = null;\n this._connectionId = null;\n this.setState('disconnected');\n this.invokeLifecycleCallback('onError', this.config.onError, failure);\n\n if (this.config.autoReconnect && !this.intentionalDisconnect) {\n this.scheduleReconnect();\n await this.waitForConnectionId();\n return;\n }\n this.rejectWaiters(failure);\n throw failure;\n }\n\n await this.waitForConnectionId();\n }\n\n disconnect(): void {\n this.intentionalDisconnect = true;\n ++this.socketGeneration;\n this.clearTimers();\n\n const socket = this.ws;\n this.ws = null;\n socket?.close(1000, 'Client disconnect');\n this._connectionId = null;\n this.setState('disconnected');\n this.rejectWaiters(new Error('WebSocket disconnected'));\n }\n\n forceReconnect(): void {\n this.intentionalDisconnect = false;\n ++this.socketGeneration;\n this.clearTimers();\n\n const socket = this.ws;\n this.ws = null;\n socket?.close(1000, 'Force reconnect');\n this._connectionId = null;\n this.reconnectAttempts = 0;\n this.setState('disconnected');\n void this.connect().catch(() => undefined);\n }\n\n onMessage(handler: (message: WebSocketEvent) => void): () => void {\n this.messageHandlers.add(handler);\n return () => this.messageHandlers.delete(handler);\n }\n\n onStateChange(handler: (state: ConnectionState) => void): () => void {\n this.stateHandlers.add(handler);\n return () => this.stateHandlers.delete(handler);\n }\n\n onHandshake(handler: (generation: number) => void): () => void {\n this.handshakeHandlers.add(handler);\n return () => this.handshakeHandlers.delete(handler);\n }\n\n private async buildUrl(): Promise<string> {\n let url = this.config.url;\n if (!this.config.auth) return url;\n\n const token =\n typeof this.config.auth === 'function'\n ? await this.config.auth()\n : this.config.auth;\n const separator = url.includes('?') ? '&' : '?';\n url = `${url}${separator}token=${encodeURIComponent(token)}`;\n return url;\n }\n\n private receiveMessage(\n socket: WebSocket,\n generation: number,\n rawData: unknown,\n ): void {\n try {\n const message = JSON.parse(String(rawData)) as WebSocketEvent;\n if (message.type === 'connected') {\n if (this._connectionId) return;\n this._connectionId = message.connectionId;\n socket.send(JSON.stringify({ type: 'ping' }));\n return;\n }\n\n if (message.type === 'pong') {\n if (!this._connectionId || this.state === 'connected') return;\n this.clearHandshakeTimer();\n this.reconnectAttempts = 0;\n this.setState('connected');\n this.startHeartbeat(socket, generation);\n this.invokeLifecycleCallback('onConnect', this.config.onConnect);\n this.resolveWaiters(this._connectionId);\n for (const handler of this.handshakeHandlers) handler(generation);\n return;\n }\n\n for (const handler of this.messageHandlers) handler(message);\n } catch (cause) {\n logError('Failed to parse WebSocket message:', cause);\n }\n }\n\n private startHandshakeTimer(socket: WebSocket, generation: number): void {\n this.clearHandshakeTimer();\n this.handshakeTimer = setTimeout(() => {\n if (!this.isCurrent(socket, generation) || this.state === 'connected') {\n return;\n }\n const failure = new Error('WebSocket handshake timed out');\n this.invokeLifecycleCallback('onError', this.config.onError, failure);\n socket.close(4000, 'Handshake timeout');\n }, this.config.handshakeTimeout);\n }\n\n private startHeartbeat(socket: WebSocket, generation: number): void {\n this.clearHeartbeatTimer();\n this.heartbeatTimer = setInterval(() => {\n if (\n !this.isCurrent(socket, generation) ||\n this.state !== 'connected' ||\n socket.readyState !== WebSocket.OPEN\n ) {\n return;\n }\n socket.send(JSON.stringify({ type: 'ping' }));\n }, HEARTBEAT_INTERVAL_MS);\n }\n\n private isCurrent(socket: WebSocket, generation: number): boolean {\n return this.ws === socket && this.socketGeneration === generation;\n }\n\n private setState(state: ConnectionState): void {\n if (this.state === state) return;\n this.state = state;\n for (const handler of this.stateHandlers) handler(state);\n }\n\n private scheduleReconnect(): void {\n if (this.reconnectTimer || this.intentionalDisconnect) return;\n if (this.reconnectAttempts >= this.config.maxReconnectAttempts) {\n const failure = new Error('Max reconnection attempts reached');\n logError(failure.message);\n this.setState('disconnected');\n this.rejectWaiters(failure);\n this.invokeLifecycleCallback('onError', this.config.onError, failure);\n return;\n }\n\n this.setState('reconnecting');\n this.reconnectAttempts++;\n const delay =\n Math.min(\n this.config.reconnectDelay * 2 ** (this.reconnectAttempts - 1),\n 30000,\n ) *\n (0.5 + Math.random() * 0.5);\n\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null;\n void this.connect().catch(() => undefined);\n }, delay);\n }\n\n private resolveWaiters(connectionId: string): void {\n const waiters = [...this.connectionWaiters];\n this.connectionWaiters.clear();\n for (const waiter of waiters) {\n waiter.cleanup();\n waiter.resolve(connectionId);\n }\n }\n\n private invokeLifecycleCallback<TArguments extends unknown[]>(\n name: 'onConnect' | 'onDisconnect' | 'onError',\n callback: ((...args: TArguments) => void) | undefined,\n ...args: TArguments\n ): void {\n if (!callback) return;\n try {\n callback(...args);\n } catch (cause) {\n try {\n logError(`[dynamodb-reactive] ${name} callback failed:`, cause);\n } catch {\n // Reporting must not let user callbacks re-enter socket lifecycle paths.\n }\n }\n }\n\n private rejectWaiters(failure: Error): void {\n const waiters = [...this.connectionWaiters];\n this.connectionWaiters.clear();\n for (const waiter of waiters) {\n waiter.cleanup();\n waiter.reject(failure);\n }\n }\n\n private clearHandshakeTimer(): void {\n if (!this.handshakeTimer) return;\n clearTimeout(this.handshakeTimer);\n this.handshakeTimer = null;\n }\n\n private clearHeartbeatTimer(): void {\n if (!this.heartbeatTimer) return;\n clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = null;\n }\n\n private clearConnectionTimers(): void {\n this.clearHandshakeTimer();\n this.clearHeartbeatTimer();\n }\n\n private clearTimers(): void {\n this.clearConnectionTimers();\n if (!this.reconnectTimer) return;\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n}\n","import { getQueryKey } from './canonical.js';\nimport { applyPatches } from './patcher.js';\nimport type {\n ErrorResponse,\n PatchEvent,\n SnapshotResponse,\n WebSocketEvent,\n} from './protocol.js';\nimport type {\n ConnectionState,\n MutationOptions,\n ReactiveClientConfig,\n Subscription,\n SubscriptionOptions,\n} from './types.js';\nimport { WebSocketManager } from './websocket.js';\n\nconst DEFAULT_HTTP_URL = '/api/reactive';\n\nfunction generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).slice(2, 11)}`;\n}\n\ntype OptimisticUpdater = (data: unknown) => unknown;\n\ninterface OptimisticLayer {\n updater: OptimisticUpdater;\n settledRevision?: number;\n}\n\ninterface SubscriptionObserver {\n onData?: (data: unknown) => void;\n onError?: (error: Error) => void;\n}\n\ninterface SubscriptionState<TData> {\n id: string;\n key: string;\n path: string;\n input: unknown;\n authoritativeData: unknown;\n data: TData | undefined;\n loading: boolean;\n stale: boolean;\n error: Error | undefined;\n listeners: Set<() => void>;\n observers: Map<string, SubscriptionObserver>;\n active: boolean;\n hasRegistered: boolean;\n generation: number;\n registrationId: string | undefined;\n registrationConnectionId: string | undefined;\n registrationSocketGeneration: number | undefined;\n registrationPromise: Promise<void> | undefined;\n version: number | undefined;\n patchBuffer: Map<string, PatchEvent>;\n appliedMessageIds: Set<string>;\n resyncPromise: Promise<void> | undefined;\n resyncGeneration: number | undefined;\n optimisticLayers: Map<string, OptimisticLayer>;\n settlementRevision: number;\n registrationSettlementRevision: number;\n revision: number;\n}\n\ntype HttpResult = SnapshotResponse | ErrorResponse;\n\n/** Reactive client for shared, versioned subscriptions. */\nexport class ReactiveClient {\n private wsManager: WebSocketManager;\n private httpUrl: string;\n private authGetter?: () => string | Promise<string>;\n private headersGetter?: () =>\n | Record<string, string>\n | Promise<Record<string, string>>;\n private subscriptionsById = new Map<\n string,\n SubscriptionState<unknown>\n >();\n private subscriptionsByKey = new Map<\n string,\n SubscriptionState<unknown>\n >();\n private connectionState: ConnectionState = 'disconnected';\n private stateListeners = new Set<(state: ConnectionState) => void>();\n\n constructor(config: ReactiveClientConfig) {\n this.wsManager = new WebSocketManager(config);\n this.httpUrl = config.httpUrl ?? DEFAULT_HTTP_URL;\n this.setAuth(config.auth);\n this.setInitialHeaders(config.headers);\n\n this.wsManager.onMessage((message) => this.handleMessage(message));\n this.wsManager.onStateChange((state) => {\n this.connectionState = state;\n this.notifyStateListeners();\n if (state === 'disconnected' || state === 'reconnecting') {\n this.markSubscriptionsStale();\n }\n });\n this.wsManager.onHandshake((socketGeneration) => {\n this.registerActiveSubscriptions(socketGeneration);\n });\n }\n\n /** Apply live configuration without replacing subscription caches or the socket. */\n configure(config: ReactiveClientConfig): void {\n this.httpUrl = config.httpUrl ?? DEFAULT_HTTP_URL;\n this.authGetter = this.toAuthGetter(config.auth);\n this.headersGetter = this.toHeadersGetter(config.headers);\n this.wsManager.configure(config);\n }\n\n async connect(): Promise<void> {\n await this.wsManager.connect();\n }\n\n disconnect(): void {\n this.wsManager.disconnect();\n }\n\n forceReconnect(): void {\n this.wsManager.forceReconnect();\n }\n\n getConnectionState(): ConnectionState {\n return this.connectionState;\n }\n\n onConnectionStateChange(\n listener: (state: ConnectionState) => void,\n ): () => void {\n this.stateListeners.add(listener);\n return () => this.stateListeners.delete(listener);\n }\n\n subscribe<TData, TInput = unknown>(\n path: string,\n options: SubscriptionOptions<TInput, TData> = {},\n ): Subscription<TData> {\n const key = getQueryKey(path, options.input);\n let shared = this.subscriptionsByKey.get(key);\n\n if (!shared) {\n shared = {\n id: generateId(),\n key,\n path,\n input: options.input,\n authoritativeData: undefined,\n data: undefined,\n loading: true,\n stale: true,\n error: undefined,\n listeners: new Set(),\n observers: new Map(),\n active: true,\n hasRegistered: false,\n generation: 0,\n registrationId: undefined,\n registrationConnectionId: undefined,\n registrationSocketGeneration: undefined,\n registrationPromise: undefined,\n version: undefined,\n patchBuffer: new Map(),\n appliedMessageIds: new Set(),\n resyncPromise: undefined,\n resyncGeneration: undefined,\n optimisticLayers: new Map(),\n settlementRevision: 0,\n registrationSettlementRevision: 0,\n revision: 0,\n };\n this.subscriptionsByKey.set(key, shared);\n this.subscriptionsById.set(shared.id, shared);\n if (this.connectionState === 'connected') {\n void this.ensureRegistered(\n shared,\n this.wsManager.generation,\n ).catch(() => undefined);\n }\n }\n\n const leaseId = generateId();\n shared.observers.set(leaseId, {\n onData: options.onData\n ? (data) => options.onData?.(data as TData)\n : undefined,\n onError: options.onError,\n });\n if (\n this.connectionState === 'connected' &&\n (!shared.hasRegistered || shared.stale) &&\n !shared.registrationPromise\n ) {\n void this.ensureRegistered(shared, this.wsManager.generation).catch(\n () => undefined,\n );\n }\n const state = shared as SubscriptionState<TData>;\n let released = false;\n\n return {\n id: state.id,\n key: state.key,\n get data() {\n return state.data;\n },\n get loading() {\n return state.loading;\n },\n get stale() {\n return state.stale;\n },\n get error() {\n return state.error;\n },\n unsubscribe: () => {\n if (released) return;\n released = true;\n this.releaseSubscription(state, leaseId);\n },\n refetch: () => this.refetch(state),\n };\n }\n\n async call<TInput, TOutput>(\n path: string,\n input: TInput,\n options?: MutationOptions<TInput, TOutput>,\n ): Promise<TOutput> {\n const mutationId = generateId();\n const layers: SubscriptionState<unknown>[] = [];\n\n try {\n this.createMutationLayers(mutationId, input, options, layers);\n const connectionId = await this.wsManager.waitForConnectionId();\n const headers = await this.buildHeaders();\n const response = await fetch(this.httpUrl, {\n method: 'POST',\n headers,\n body: JSON.stringify({ type: 'call', connectionId, path, input }),\n });\n if (!response.ok) {\n throw new Error(`Call failed: ${response.status} ${response.statusText}`);\n }\n\n const result = (await response.json()) as {\n type: string;\n message?: string;\n data?: unknown;\n };\n if (result.type === 'error') {\n throw new Error(result.message ?? 'Unknown error');\n }\n\n const data = result.data as TOutput;\n this.settleMutationLayers(mutationId, input, data, options, layers);\n return data;\n } catch (cause) {\n this.removeMutationLayers(mutationId, layers);\n throw cause;\n }\n }\n\n addSubscriptionListener(id: string, listener: () => void): () => void {\n const state = this.subscriptionsById.get(id);\n if (!state) return () => undefined;\n state.listeners.add(listener);\n return () => state.listeners.delete(listener);\n }\n\n getSubscriptionRevision(id: string): number {\n return this.subscriptionsById.get(id)?.revision ?? -1;\n }\n\n applyOptimisticUpdate(\n subscriptionId: string,\n updater: (data: unknown) => unknown,\n ): void {\n const state = this.subscriptionsById.get(subscriptionId);\n if (!state || state.data === undefined) return;\n state.optimisticLayers.set(`local-${generateId()}`, {\n updater,\n });\n this.recomputeData(state);\n this.notifySubscription(state, true);\n }\n\n private setAuth(auth: ReactiveClientConfig['auth']): void {\n this.authGetter = this.toAuthGetter(auth);\n }\n\n private setInitialHeaders(headers: ReactiveClientConfig['headers']): void {\n this.headersGetter = this.toHeadersGetter(headers);\n }\n\n private toAuthGetter(\n auth: ReactiveClientConfig['auth'],\n ): (() => string | Promise<string>) | undefined {\n if (!auth) return undefined;\n return typeof auth === 'function' ? auth : () => auth;\n }\n\n private toHeadersGetter(\n headers: ReactiveClientConfig['headers'],\n ):\n | (() => Record<string, string> | Promise<Record<string, string>>)\n | undefined {\n if (!headers) return undefined;\n return typeof headers === 'function' ? headers : () => headers;\n }\n\n private registerActiveSubscriptions(socketGeneration: number): void {\n for (const state of this.subscriptionsByKey.values()) {\n if (state.active) {\n void this.ensureRegistered(state, socketGeneration).catch(\n () => undefined,\n );\n }\n }\n }\n\n private ensureRegistered(\n state: SubscriptionState<unknown>,\n socketGeneration: number,\n force = false,\n ): Promise<void> {\n if (\n !force &&\n state.registrationSocketGeneration === socketGeneration &&\n state.registrationPromise\n ) {\n return state.registrationPromise;\n }\n\n state.generation++;\n state.registrationSettlementRevision = state.settlementRevision;\n state.registrationId = generateId();\n state.registrationSocketGeneration = socketGeneration;\n state.registrationConnectionId = undefined;\n state.registrationPromise = undefined;\n state.resyncPromise = undefined;\n state.resyncGeneration = undefined;\n state.hasRegistered = false;\n state.version = undefined;\n state.patchBuffer.clear();\n state.appliedMessageIds.clear();\n state.loading = true;\n state.stale = true;\n state.error = undefined;\n this.notifySubscription(state);\n\n const generation = state.generation;\n const registrationId = state.registrationId;\n const isCurrent = () =>\n state.active &&\n state.generation === generation &&\n state.registrationId === registrationId &&\n state.registrationSocketGeneration === socketGeneration &&\n this.wsManager.generation === socketGeneration;\n let requestIssued = false;\n let registrationConnectionId: string | undefined;\n let request!: Promise<void>;\n request = (async () => {\n try {\n const connectionId = await this.wsManager.waitForConnectionId();\n if (!isCurrent()) return;\n registrationConnectionId = connectionId;\n state.registrationConnectionId = connectionId;\n const headers = await this.buildHeaders();\n if (!isCurrent()) return;\n requestIssued = true;\n const response = await fetch(this.httpUrl, {\n method: 'POST',\n headers,\n body: JSON.stringify({\n type: 'subscribe',\n connectionId,\n subscriptionId: state.id,\n generation,\n registrationId,\n path: state.path,\n input: state.input,\n }),\n });\n if (!response.ok) {\n throw new Error(\n `Subscribe failed: ${response.status} ${response.statusText}`,\n );\n }\n\n const result = (await response.json()) as HttpResult;\n if (result.type === 'error') {\n throw new Error(result.message);\n }\n if (!isCurrent()) return;\n this.handleSnapshot(result);\n if (isCurrent()) state.hasRegistered = true;\n } catch (cause) {\n if (isCurrent()) {\n const failure =\n cause instanceof Error ? cause : new Error(String(cause));\n state.error = failure;\n state.loading = this.hasSettledLayers(state);\n this.notifySubscription(state, false, failure);\n }\n throw cause;\n } finally {\n if ((!state.active || !isCurrent()) && requestIssued) {\n void this.sendUnsubscribe(\n registrationConnectionId,\n state.id,\n generation,\n registrationId,\n );\n }\n if (state.registrationPromise === request) {\n state.registrationPromise = undefined;\n }\n }\n })();\n state.registrationPromise = request;\n return request;\n }\n\n private releaseSubscription(\n state: SubscriptionState<unknown>,\n leaseId: string,\n ): void {\n state.observers.delete(leaseId);\n if (state.observers.size > 0) return;\n\n state.active = false;\n this.subscriptionsById.delete(state.id);\n this.subscriptionsByKey.delete(state.key);\n if (\n state.registrationId &&\n state.registrationConnectionId &&\n state.hasRegistered\n ) {\n void this.sendUnsubscribe(\n state.registrationConnectionId,\n state.id,\n state.generation,\n state.registrationId,\n );\n }\n }\n\n private async sendUnsubscribe(\n connectionId: string | undefined,\n subscriptionId: string,\n generation: number,\n registrationId: string,\n ): Promise<void> {\n if (!connectionId) return;\n try {\n const headers = await this.buildHeaders();\n await fetch(this.httpUrl, {\n method: 'POST',\n headers,\n body: JSON.stringify({\n type: 'unsubscribe',\n connectionId,\n subscriptionId,\n generation,\n registrationId,\n }),\n });\n } catch {\n // Connection cleanup is the fallback when an unsubscribe cannot be sent.\n }\n }\n\n private async refetch(state: SubscriptionState<unknown>): Promise<void> {\n if (!state.active) return;\n if (!state.registrationId) {\n await this.ensureRegistered(state, this.wsManager.generation);\n return;\n }\n await this.requestResync(state);\n }\n\n private handleMessage(message: WebSocketEvent): void {\n switch (message.type) {\n case 'patch':\n this.handlePatch(message);\n break;\n case 'resync': {\n const state = this.subscriptionsById.get(message.subscriptionId);\n if (state?.generation === message.generation) {\n void this.requestResync(state).catch(() => undefined);\n }\n break;\n }\n case 'connected':\n case 'pong':\n break;\n }\n }\n\n private handleSnapshot(message: SnapshotResponse): void {\n const state = this.subscriptionsById.get(message.subscriptionId);\n if (!state || message.generation !== state.generation) return;\n if (state.version !== undefined && message.version <= state.version) return;\n\n state.authoritativeData = message.data;\n state.version = message.version;\n state.error = undefined;\n\n const coveredRevision = state.registrationSettlementRevision;\n for (const [layerId, layer] of state.optimisticLayers) {\n if (\n layer.settledRevision !== undefined &&\n layer.settledRevision <= coveredRevision\n ) {\n state.optimisticLayers.delete(layerId);\n }\n }\n const awaitingReconciliation = this.hasSettledLayers(state);\n state.loading = awaitingReconciliation;\n state.stale = awaitingReconciliation;\n this.recomputeData(state);\n this.discardStalePatches(state);\n this.notifySubscription(state, true);\n this.drainPatchBuffer(state);\n }\n\n private handlePatch(message: PatchEvent): void {\n const state = this.subscriptionsById.get(message.subscriptionId);\n if (!state || message.generation !== state.generation) return;\n if (\n state.appliedMessageIds.has(message.messageId) ||\n state.patchBuffer.has(message.messageId)\n ) {\n return;\n }\n if (state.version !== undefined && message.toVersion <= state.version) {\n state.appliedMessageIds.add(message.messageId);\n return;\n }\n\n state.patchBuffer.set(message.messageId, message);\n if (state.version === undefined) return;\n this.drainPatchBuffer(state);\n }\n\n private drainPatchBuffer(state: SubscriptionState<unknown>): void {\n if (state.version === undefined || state.authoritativeData === undefined) {\n return;\n }\n\n this.discardStalePatches(state);\n while (true) {\n const next = [...state.patchBuffer.values()]\n .filter((patch) => patch.fromVersion === state.version)\n .sort((left, right) => left.toVersion - right.toVersion)[0];\n if (!next) break;\n\n state.patchBuffer.delete(next.messageId);\n try {\n state.authoritativeData = applyPatches(\n state.authoritativeData,\n next.patches,\n );\n state.version = next.toVersion;\n state.appliedMessageIds.add(next.messageId);\n const awaitingReconciliation = this.hasSettledLayers(state);\n state.loading = awaitingReconciliation;\n state.stale = awaitingReconciliation;\n state.error = undefined;\n this.recomputeData(state);\n this.notifySubscription(state, true);\n this.discardStalePatches(state);\n } catch {\n void this.requestResync(state).catch(() => undefined);\n return;\n }\n }\n\n if (\n [...state.patchBuffer.values()].some(\n (patch) =>\n patch.toVersion > state.version! &&\n patch.fromVersion !== state.version,\n )\n ) {\n void this.requestResync(state).catch(() => undefined);\n }\n }\n\n private discardStalePatches(state: SubscriptionState<unknown>): void {\n if (state.version === undefined) return;\n for (const [messageId, patch] of state.patchBuffer) {\n if (patch.toVersion <= state.version) {\n state.patchBuffer.delete(messageId);\n state.appliedMessageIds.add(messageId);\n }\n }\n }\n\n private requestResync(\n state: SubscriptionState<unknown>,\n ): Promise<void> {\n if (\n state.resyncPromise &&\n state.resyncGeneration === state.generation\n ) {\n return state.resyncPromise;\n }\n if (!state.active || !state.registrationId) return Promise.resolve();\n\n state.stale = true;\n state.loading = true;\n this.notifySubscription(state);\n let request!: Promise<void>;\n request = this.ensureRegistered(\n state,\n this.wsManager.generation,\n true,\n )\n .finally(() => {\n if (state.resyncPromise === request) {\n state.resyncPromise = undefined;\n state.resyncGeneration = undefined;\n }\n })\n .then(() => {\n if (state.active && this.hasSettledLayers(state)) {\n return this.requestResync(state);\n }\n return undefined;\n });\n state.resyncPromise = request;\n state.resyncGeneration = state.generation;\n return request;\n }\n\n private createMutationLayers<TInput, TOutput>(\n mutationId: string,\n input: TInput,\n options: MutationOptions<TInput, TOutput> | undefined,\n layered: SubscriptionState<unknown>[],\n ): void {\n const targets = this.findMutationTargets(options);\n for (const state of targets) {\n const updater = this.createOptimisticUpdater(input, options);\n if (!updater || state.authoritativeData === undefined) continue;\n state.optimisticLayers.set(mutationId, {\n updater,\n });\n layered.push(state);\n this.recomputeData(state);\n this.notifySubscription(state, true);\n }\n }\n\n private findMutationTargets<TInput, TOutput>(\n options: MutationOptions<TInput, TOutput> | undefined,\n ): SubscriptionState<unknown>[] {\n if (options?.queryKey) {\n const exact = this.subscriptionsByKey.get(options.queryKey);\n return exact ? [exact] : [];\n }\n if (typeof options?.invalidates === 'object') {\n const exact = this.subscriptionsByKey.get(\n getQueryKey(options.invalidates.path, options.invalidates.input),\n );\n return exact ? [exact] : [];\n }\n if (typeof options?.invalidates === 'string') {\n return [...this.subscriptionsByKey.values()].filter(\n (state) => state.path === options.invalidates,\n );\n }\n return [];\n }\n\n private createOptimisticUpdater<TInput, TOutput>(\n input: TInput,\n options: MutationOptions<TInput, TOutput> | undefined,\n result?: TOutput,\n settled = false,\n ): OptimisticUpdater | undefined {\n const update = options?.optimisticUpdate;\n if (typeof update === 'function') {\n return (data) =>\n Array.isArray(data) ? update(data, input, result) : data;\n }\n\n const itemId =\n typeof input === 'object' && input !== null\n ? (input as { id?: unknown }).id\n : undefined;\n if (update === 'remove' && itemId !== undefined) {\n return (data) =>\n Array.isArray(data)\n ? data.filter((item) => (item as { id?: unknown }).id !== itemId)\n : data;\n }\n if (update !== 'merge') return undefined;\n\n if (itemId !== undefined) {\n const resultFields =\n settled && typeof result === 'object' && result !== null ? result : {};\n return (data) => {\n if (!Array.isArray(data)) return data;\n return data.map((item) =>\n (item as { id?: unknown }).id === itemId\n ? { ...item, ...input, ...resultFields }\n : item,\n );\n };\n }\n if (options?.optimisticData === undefined) return undefined;\n\n return (data) => {\n if (!Array.isArray(data)) return data;\n const optimistic = settled\n ? result === undefined\n ? typeof options.optimisticData === 'function'\n ? (\n options.optimisticData as (\n optimisticInput: TInput,\n currentData: unknown[],\n ) => TOutput | undefined\n )(input, data)\n : options.optimisticData\n : result\n : typeof options.optimisticData === 'function'\n ? (\n options.optimisticData as (\n optimisticInput: TInput,\n currentData: unknown[],\n ) => TOutput | undefined\n )(input, data)\n : options.optimisticData;\n if (settled && optimistic !== null && typeof optimistic === 'object') {\n const optimisticId = (optimistic as { id?: unknown }).id;\n if (\n optimisticId !== undefined &&\n data.some(\n (item) =>\n typeof item === 'object' &&\n item !== null &&\n (item as { id?: unknown }).id === optimisticId,\n )\n ) {\n return data;\n }\n }\n return optimistic === undefined ? data : [optimistic, ...data];\n };\n }\n\n private settleMutationLayers<TInput, TOutput>(\n mutationId: string,\n input: TInput,\n result: TOutput,\n options: MutationOptions<TInput, TOutput> | undefined,\n states: SubscriptionState<unknown>[],\n ): void {\n for (const state of states) {\n const layer = state.optimisticLayers.get(mutationId);\n const updater = this.createOptimisticUpdater(\n input,\n options,\n result,\n true,\n );\n if (!layer || !updater) continue;\n layer.updater = updater;\n layer.settledRevision = ++state.settlementRevision;\n state.loading = true;\n state.stale = true;\n this.recomputeData(state);\n this.notifySubscription(state, true);\n void this.requestResync(state).catch(() => undefined);\n }\n }\n\n private removeMutationLayers(\n mutationId: string,\n states: SubscriptionState<unknown>[],\n ): void {\n for (const state of states) {\n if (!state.optimisticLayers.delete(mutationId)) continue;\n this.recomputeData(state);\n this.notifySubscription(state, true);\n }\n }\n\n private recomputeData(state: SubscriptionState<unknown>): void {\n let data = state.authoritativeData;\n for (const layer of state.optimisticLayers.values()) {\n data = layer.updater(data);\n }\n state.data = data;\n }\n\n private hasSettledLayers(state: SubscriptionState<unknown>): boolean {\n for (const layer of state.optimisticLayers.values()) {\n if (layer.settledRevision !== undefined) return true;\n }\n return false;\n }\n\n private async buildHeaders(): Promise<Record<string, string>> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n if (this.headersGetter) Object.assign(headers, await this.headersGetter());\n if (this.authGetter) {\n headers['Authorization'] = `Bearer ${await this.authGetter()}`;\n }\n return headers;\n }\n\n private markSubscriptionsStale(): void {\n for (const state of this.subscriptionsByKey.values()) {\n if (!state.active) continue;\n state.stale = true;\n state.loading = true;\n this.notifySubscription(state);\n }\n }\n\n private notifySubscription(\n state: SubscriptionState<unknown>,\n dataChanged = false,\n failure?: Error,\n ): void {\n if (!state.active) return;\n state.revision++;\n for (const listener of state.listeners) listener();\n if (dataChanged) {\n for (const observer of state.observers.values()) {\n observer.onData?.(state.data);\n }\n }\n if (failure) {\n for (const observer of state.observers.values()) {\n observer.onError?.(failure);\n }\n }\n }\n\n private notifyStateListeners(): void {\n for (const listener of this.stateListeners) {\n listener(this.connectionState);\n }\n }\n}\n\ntype ProcedureInput<T> = T extends { inputSchema?: { _output: infer TInput } }\n ? TInput\n : undefined;\n\ntype ProcedureOutput<T> = T extends {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- resolver parameter variance prevents `unknown`\n resolver: (...args: any[]) => infer TReturn;\n}\n ? Awaited<TReturn>\n : unknown;\n\ntype ExtractRouterDefinition<T> = T extends { definition: infer TDefinition }\n ? TDefinition\n : T;\n\ntype QueryProcedure<T> = [ProcedureInput<T>] extends [undefined]\n ? {\n useSubscription: (\n input?: undefined,\n options?: Omit<\n SubscriptionOptions<undefined, ProcedureOutput<T>>,\n 'input'\n >,\n ) => Subscription<ProcedureOutput<T>>;\n }\n : {\n useSubscription: (\n input: ProcedureInput<T>,\n options?: Omit<\n SubscriptionOptions<ProcedureInput<T>, ProcedureOutput<T>>,\n 'input'\n >,\n ) => Subscription<ProcedureOutput<T>>;\n };\n\ntype MutationProcedure<T> = [ProcedureInput<T>] extends [undefined]\n ? {\n mutate: (\n input?: undefined,\n options?: MutationOptions<undefined, ProcedureOutput<T>>,\n ) => Promise<ProcedureOutput<T>>;\n }\n : {\n mutate: (\n input: ProcedureInput<T>,\n options?: MutationOptions<ProcedureInput<T>, ProcedureOutput<T>>,\n ) => Promise<ProcedureOutput<T>>;\n };\n\ntype TypedReactiveClientTree<T> = T extends { type: 'query' }\n ? QueryProcedure<T>\n : T extends { type: 'mutation' }\n ? MutationProcedure<T>\n : { [K in keyof T]: TypedReactiveClientTree<T[K]> };\n\nexport type TypedReactiveClient<TRouter> = TypedReactiveClientTree<\n ExtractRouterDefinition<TRouter>\n> & {\n connect: () => Promise<void>;\n disconnect: () => void;\n};\n\nexport function createReactiveClient<TRouter>(\n config: ReactiveClientConfig,\n): TypedReactiveClient<TRouter> {\n const client = new ReactiveClient(config);\n return createTypedProxy(client, []) as TypedReactiveClient<TRouter>;\n}\n\nfunction createTypedProxy(client: ReactiveClient, path: string[]): unknown {\n return new Proxy(\n {},\n {\n get(_target, property) {\n if (property === 'connect') return () => client.connect();\n if (property === 'disconnect') return () => client.disconnect();\n if (typeof property !== 'string') return undefined;\n\n if (property === 'useSubscription') {\n return (input?: unknown, options?: SubscriptionOptions) =>\n client.subscribe(path.join('.'), { ...options, input });\n }\n if (property === 'mutate') {\n return (\n input: unknown,\n options?: MutationOptions<unknown, unknown>,\n ) => client.call(path.join('.'), input, options);\n }\n return createTypedProxy(client, [...path, property]);\n },\n },\n );\n}\n"]}
|
package/dist/core.cjs
ADDED
|
@@ -0,0 +1,232 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var zod = require('zod');
|
|
4
|
+
|
|
5
|
+
// ../core/src/schema.ts
|
|
6
|
+
var FilterConditionSchema = zod.z.lazy(() => {
|
|
7
|
+
const comparison = zod.z.object({
|
|
8
|
+
type: zod.z.literal("comparison"),
|
|
9
|
+
operator: zod.z.enum(["eq", "ne", "gt", "gte", "lt", "lte"]),
|
|
10
|
+
field: zod.z.string().min(1),
|
|
11
|
+
value: zod.z.unknown()
|
|
12
|
+
}).strict();
|
|
13
|
+
const queryFunction = zod.z.union([
|
|
14
|
+
zod.z.object({
|
|
15
|
+
type: zod.z.literal("function"),
|
|
16
|
+
operator: zod.z.literal("between"),
|
|
17
|
+
field: zod.z.string().min(1),
|
|
18
|
+
value: zod.z.unknown(),
|
|
19
|
+
value2: zod.z.unknown()
|
|
20
|
+
}).strict(),
|
|
21
|
+
zod.z.object({
|
|
22
|
+
type: zod.z.literal("function"),
|
|
23
|
+
operator: zod.z.enum(["beginsWith", "contains"]),
|
|
24
|
+
field: zod.z.string().min(1),
|
|
25
|
+
value: zod.z.unknown()
|
|
26
|
+
}).strict()
|
|
27
|
+
]);
|
|
28
|
+
const logical = zod.z.object({
|
|
29
|
+
type: zod.z.literal("logical"),
|
|
30
|
+
operator: zod.z.enum(["and", "or", "not"]),
|
|
31
|
+
conditions: zod.z.array(FilterConditionSchema).min(1)
|
|
32
|
+
}).strict().superRefine((condition, context) => {
|
|
33
|
+
if (condition.operator === "not" && condition.conditions.length !== 1) {
|
|
34
|
+
context.addIssue({
|
|
35
|
+
code: "custom",
|
|
36
|
+
path: ["conditions"],
|
|
37
|
+
message: "not requires exactly one condition"
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
});
|
|
41
|
+
return zod.z.union([comparison, queryFunction, logical]);
|
|
42
|
+
});
|
|
43
|
+
var QueryMetadataSchema = zod.z.object({
|
|
44
|
+
planVersion: zod.z.literal(1),
|
|
45
|
+
tableName: zod.z.string().min(1),
|
|
46
|
+
indexName: zod.z.string().min(1).optional(),
|
|
47
|
+
indexPkField: zod.z.string().min(1).optional(),
|
|
48
|
+
indexSkField: zod.z.string().min(1).optional(),
|
|
49
|
+
filterConditions: zod.z.array(FilterConditionSchema),
|
|
50
|
+
sortField: zod.z.string().min(1).optional(),
|
|
51
|
+
sortOrder: zod.z.enum(["asc", "desc"]).optional(),
|
|
52
|
+
limit: zod.z.number().int().positive().optional()
|
|
53
|
+
}).strict().superRefine((metadata, context) => {
|
|
54
|
+
if (metadata.indexName && !metadata.indexPkField) {
|
|
55
|
+
context.addIssue({
|
|
56
|
+
code: "custom",
|
|
57
|
+
path: ["indexPkField"],
|
|
58
|
+
message: "Index metadata requires its partition key field"
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
if (!metadata.indexName && (metadata.indexPkField || metadata.indexSkField)) {
|
|
62
|
+
context.addIssue({
|
|
63
|
+
code: "custom",
|
|
64
|
+
path: ["indexName"],
|
|
65
|
+
message: "Index key fields require an index name"
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
if (Boolean(metadata.sortField) !== Boolean(metadata.sortOrder)) {
|
|
69
|
+
context.addIssue({
|
|
70
|
+
code: "custom",
|
|
71
|
+
path: ["sortOrder"],
|
|
72
|
+
message: "Sort field and order must be specified together"
|
|
73
|
+
});
|
|
74
|
+
}
|
|
75
|
+
});
|
|
76
|
+
var DeliveryVersionSchema = zod.z.object({
|
|
77
|
+
generation: zod.z.number().int().nonnegative(),
|
|
78
|
+
fromVersion: zod.z.number().int().nonnegative(),
|
|
79
|
+
toVersion: zod.z.number().int().positive(),
|
|
80
|
+
messageId: zod.z.string().min(1)
|
|
81
|
+
});
|
|
82
|
+
var PendingDeliverySchema = zod.z.discriminatedUnion("type", [
|
|
83
|
+
DeliveryVersionSchema.extend({
|
|
84
|
+
type: zod.z.literal("patch"),
|
|
85
|
+
patches: zod.z.array(
|
|
86
|
+
zod.z.object({
|
|
87
|
+
op: zod.z.enum(["add", "remove", "replace", "move", "copy", "test"]),
|
|
88
|
+
path: zod.z.string(),
|
|
89
|
+
value: zod.z.unknown().optional(),
|
|
90
|
+
from: zod.z.string().optional()
|
|
91
|
+
})
|
|
92
|
+
)
|
|
93
|
+
}),
|
|
94
|
+
DeliveryVersionSchema.extend({
|
|
95
|
+
type: zod.z.literal("resync")
|
|
96
|
+
}).strict()
|
|
97
|
+
]);
|
|
98
|
+
var SystemSchemas = {
|
|
99
|
+
/**
|
|
100
|
+
* ReactiveConnectionsV2 - Tracks active WebSocket connections
|
|
101
|
+
*/
|
|
102
|
+
connections: zod.z.object({
|
|
103
|
+
connectionId: zod.z.string(),
|
|
104
|
+
status: zod.z.enum(["open", "closed"]),
|
|
105
|
+
context: zod.z.record(zod.z.string(), zod.z.unknown()).optional(),
|
|
106
|
+
authorizerContext: zod.z.record(zod.z.string(), zod.z.unknown()).optional(),
|
|
107
|
+
requestIdentity: zod.z.record(zod.z.string(), zod.z.unknown()).optional(),
|
|
108
|
+
connectedAt: zod.z.number(),
|
|
109
|
+
ttl: zod.z.number()
|
|
110
|
+
}),
|
|
111
|
+
/**
|
|
112
|
+
* ReactiveDependenciesV2 - The inverted index for O(1) lookups
|
|
113
|
+
*/
|
|
114
|
+
dependencies: zod.z.object({
|
|
115
|
+
pk: zod.z.string(),
|
|
116
|
+
// Versioned encoded dependency key
|
|
117
|
+
sk: zod.z.string(),
|
|
118
|
+
// ConnectionID#SubscriptionID
|
|
119
|
+
connectionId: zod.z.string(),
|
|
120
|
+
subscriptionId: zod.z.string(),
|
|
121
|
+
tableName: zod.z.string(),
|
|
122
|
+
fieldName: zod.z.string(),
|
|
123
|
+
fieldValue: zod.z.string(),
|
|
124
|
+
generation: zod.z.number().int().nonnegative(),
|
|
125
|
+
registrationId: zod.z.string().min(1),
|
|
126
|
+
ttl: zod.z.number()
|
|
127
|
+
}),
|
|
128
|
+
/**
|
|
129
|
+
* ReactiveConnectionQueriesV2 - Stores subscription state for diffing
|
|
130
|
+
*/
|
|
131
|
+
queries: zod.z.object({
|
|
132
|
+
pk: zod.z.string(),
|
|
133
|
+
// ConnectionID
|
|
134
|
+
sk: zod.z.string(),
|
|
135
|
+
// SubscriptionID
|
|
136
|
+
connectionId: zod.z.string(),
|
|
137
|
+
subscriptionId: zod.z.string(),
|
|
138
|
+
status: zod.z.enum(["registering", "active", "cancelled", "faulted"]),
|
|
139
|
+
generation: zod.z.number().int().nonnegative(),
|
|
140
|
+
registrationId: zod.z.string().min(1),
|
|
141
|
+
queryMetadata: QueryMetadataSchema,
|
|
142
|
+
lastResult: zod.z.array(zod.z.unknown()),
|
|
143
|
+
dependencies: zod.z.array(zod.z.string()),
|
|
144
|
+
version: zod.z.number().int().nonnegative(),
|
|
145
|
+
pendingDelivery: PendingDeliverySchema.optional(),
|
|
146
|
+
createdAt: zod.z.number(),
|
|
147
|
+
updatedAt: zod.z.number(),
|
|
148
|
+
ttl: zod.z.number()
|
|
149
|
+
})
|
|
150
|
+
};
|
|
151
|
+
var SYSTEM_TABLE_PROTOCOL_VERSION = 2;
|
|
152
|
+
var SystemTableNames = {
|
|
153
|
+
connections: "ReactiveConnectionsV2",
|
|
154
|
+
dependencies: "ReactiveDependenciesV2",
|
|
155
|
+
queries: "ReactiveConnectionQueriesV2"
|
|
156
|
+
};
|
|
157
|
+
|
|
158
|
+
// ../core/src/table.ts
|
|
159
|
+
function getSchemaFields(schema) {
|
|
160
|
+
const fields = /* @__PURE__ */ new Set();
|
|
161
|
+
if ("options" in schema && Array.isArray(schema.options)) {
|
|
162
|
+
for (const option of schema.options) {
|
|
163
|
+
if ("shape" in option && typeof option.shape === "object") {
|
|
164
|
+
for (const key of Object.keys(option.shape)) {
|
|
165
|
+
fields.add(key);
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
} else if ("shape" in schema && typeof schema.shape === "object") {
|
|
170
|
+
for (const key of Object.keys(schema.shape)) {
|
|
171
|
+
fields.add(key);
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
return fields;
|
|
175
|
+
}
|
|
176
|
+
var DynamoTable = class {
|
|
177
|
+
tableName;
|
|
178
|
+
schema;
|
|
179
|
+
pk;
|
|
180
|
+
sk;
|
|
181
|
+
indexes;
|
|
182
|
+
field;
|
|
183
|
+
constructor(config) {
|
|
184
|
+
this.tableName = config.tableName;
|
|
185
|
+
this.schema = config.schema;
|
|
186
|
+
this.pk = config.pk;
|
|
187
|
+
this.sk = config.sk;
|
|
188
|
+
this.indexes = config.indexes ?? {};
|
|
189
|
+
this.field = this.createFieldRefs();
|
|
190
|
+
}
|
|
191
|
+
createFieldRefs() {
|
|
192
|
+
const fields = getSchemaFields(this.schema);
|
|
193
|
+
const refs = {};
|
|
194
|
+
for (const key of fields) {
|
|
195
|
+
refs[key] = {
|
|
196
|
+
fieldName: key,
|
|
197
|
+
_type: void 0
|
|
198
|
+
};
|
|
199
|
+
}
|
|
200
|
+
return refs;
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Validate an item against the schema
|
|
204
|
+
*/
|
|
205
|
+
validate(item) {
|
|
206
|
+
return this.schema.parse(item);
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Safely validate an item, returning a result object
|
|
210
|
+
*/
|
|
211
|
+
safeParse(item) {
|
|
212
|
+
return this.schema.safeParse(item);
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Get the list of field names in the schema
|
|
216
|
+
*/
|
|
217
|
+
getFieldNames() {
|
|
218
|
+
return Array.from(
|
|
219
|
+
getSchemaFields(this.schema)
|
|
220
|
+
);
|
|
221
|
+
}
|
|
222
|
+
};
|
|
223
|
+
|
|
224
|
+
exports.DynamoTable = DynamoTable;
|
|
225
|
+
exports.FilterConditionSchema = FilterConditionSchema;
|
|
226
|
+
exports.PendingDeliverySchema = PendingDeliverySchema;
|
|
227
|
+
exports.QueryMetadataSchema = QueryMetadataSchema;
|
|
228
|
+
exports.SYSTEM_TABLE_PROTOCOL_VERSION = SYSTEM_TABLE_PROTOCOL_VERSION;
|
|
229
|
+
exports.SystemSchemas = SystemSchemas;
|
|
230
|
+
exports.SystemTableNames = SystemTableNames;
|
|
231
|
+
//# sourceMappingURL=core.cjs.map
|
|
232
|
+
//# sourceMappingURL=core.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../core/src/schema.ts","../../core/src/table.ts"],"names":["z"],"mappings":"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","file":"core.cjs","sourcesContent":["import { z } from 'zod';\n\nimport type { FilterCondition } from './types.js';\n\nexport const FilterConditionSchema: z.ZodType<FilterCondition> = z.lazy(() => {\n const comparison = z\n .object({\n type: z.literal('comparison'),\n operator: z.enum(['eq', 'ne', 'gt', 'gte', 'lt', 'lte']),\n field: z.string().min(1),\n value: z.unknown(),\n })\n .strict();\n const queryFunction = z.union([\n z\n .object({\n type: z.literal('function'),\n operator: z.literal('between'),\n field: z.string().min(1),\n value: z.unknown(),\n value2: z.unknown(),\n })\n .strict(),\n z\n .object({\n type: z.literal('function'),\n operator: z.enum(['beginsWith', 'contains']),\n field: z.string().min(1),\n value: z.unknown(),\n })\n .strict(),\n ]);\n const logical = z\n .object({\n type: z.literal('logical'),\n operator: z.enum(['and', 'or', 'not']),\n conditions: z.array(FilterConditionSchema).min(1),\n })\n .strict()\n .superRefine((condition, context) => {\n if (condition.operator === 'not' && condition.conditions.length !== 1) {\n context.addIssue({\n code: 'custom',\n path: ['conditions'],\n message: 'not requires exactly one condition',\n });\n }\n });\n return z.union([comparison, queryFunction, logical]);\n});\n\nexport const QueryMetadataSchema = z\n .object({\n planVersion: z.literal(1),\n tableName: z.string().min(1),\n indexName: z.string().min(1).optional(),\n indexPkField: z.string().min(1).optional(),\n indexSkField: z.string().min(1).optional(),\n filterConditions: z.array(FilterConditionSchema),\n sortField: z.string().min(1).optional(),\n sortOrder: z.enum(['asc', 'desc']).optional(),\n limit: z.number().int().positive().optional(),\n })\n .strict()\n .superRefine((metadata, context) => {\n if (metadata.indexName && !metadata.indexPkField) {\n context.addIssue({\n code: 'custom',\n path: ['indexPkField'],\n message: 'Index metadata requires its partition key field',\n });\n }\n if (!metadata.indexName && (metadata.indexPkField || metadata.indexSkField)) {\n context.addIssue({\n code: 'custom',\n path: ['indexName'],\n message: 'Index key fields require an index name',\n });\n }\n if (Boolean(metadata.sortField) !== Boolean(metadata.sortOrder)) {\n context.addIssue({\n code: 'custom',\n path: ['sortOrder'],\n message: 'Sort field and order must be specified together',\n });\n }\n });\n\nconst DeliveryVersionSchema = z.object({\n generation: z.number().int().nonnegative(),\n fromVersion: z.number().int().nonnegative(),\n toVersion: z.number().int().positive(),\n messageId: z.string().min(1),\n});\n\nexport const PendingDeliverySchema = z.discriminatedUnion('type', [\n DeliveryVersionSchema.extend({\n type: z.literal('patch'),\n patches: z.array(\n z.object({\n op: z.enum(['add', 'remove', 'replace', 'move', 'copy', 'test']),\n path: z.string(),\n value: z.unknown().optional(),\n from: z.string().optional(),\n }),\n ),\n }),\n DeliveryVersionSchema.extend({\n type: z.literal('resync'),\n }).strict(),\n]);\n\n/**\n * System table schemas for the reactive engine\n */\nexport const SystemSchemas = {\n /**\n * ReactiveConnectionsV2 - Tracks active WebSocket connections\n */\n connections: z.object({\n connectionId: z.string(),\n status: z.enum(['open', 'closed']),\n context: z.record(z.string(), z.unknown()).optional(),\n authorizerContext: z.record(z.string(), z.unknown()).optional(),\n requestIdentity: z.record(z.string(), z.unknown()).optional(),\n connectedAt: z.number(),\n ttl: z.number(),\n }),\n\n /**\n * ReactiveDependenciesV2 - The inverted index for O(1) lookups\n */\n dependencies: z.object({\n pk: z.string(), // Versioned encoded dependency key\n sk: z.string(), // ConnectionID#SubscriptionID\n connectionId: z.string(),\n subscriptionId: z.string(),\n tableName: z.string(),\n fieldName: z.string(),\n fieldValue: z.string(),\n generation: z.number().int().nonnegative(),\n registrationId: z.string().min(1),\n ttl: z.number(),\n }),\n\n /**\n * ReactiveConnectionQueriesV2 - Stores subscription state for diffing\n */\n queries: z.object({\n pk: z.string(), // ConnectionID\n sk: z.string(), // SubscriptionID\n connectionId: z.string(),\n subscriptionId: z.string(),\n status: z.enum(['registering', 'active', 'cancelled', 'faulted']),\n generation: z.number().int().nonnegative(),\n registrationId: z.string().min(1),\n queryMetadata: QueryMetadataSchema,\n lastResult: z.array(z.unknown()),\n dependencies: z.array(z.string()),\n version: z.number().int().nonnegative(),\n pendingDelivery: PendingDeliverySchema.optional(),\n createdAt: z.number(),\n updatedAt: z.number(),\n ttl: z.number(),\n }),\n};\n\n/** Storage/protocol generation used by all reactive system tables. */\nexport const SYSTEM_TABLE_PROTOCOL_VERSION = 2 as const;\n\n/**\n * Versioned system table names. The V2 suffix intentionally prevents state\n * written by the incompatible 0.1.x dependency protocol from being reused.\n */\nexport const SystemTableNames = {\n connections: 'ReactiveConnectionsV2',\n dependencies: 'ReactiveDependenciesV2',\n queries: 'ReactiveConnectionQueriesV2',\n} as const;\n","import type { z } from 'zod';\n\nimport type {\n DynamoTableConfig,\n FieldRef,\n IndexDefinition,\n SupportedSchema,\n} from './types.js';\n\n/**\n * Extract all field names from a schema (handles both ZodObject and ZodDiscriminatedUnion)\n */\nfunction getSchemaFields(schema: SupportedSchema): Set<string> {\n const fields = new Set<string>();\n\n // Check if it's a discriminated union by looking for 'options' property\n if ('options' in schema && Array.isArray(schema.options)) {\n // It's a discriminated union - collect fields from all options\n for (const option of schema.options) {\n if ('shape' in option && typeof option.shape === 'object') {\n for (const key of Object.keys(option.shape)) {\n fields.add(key);\n }\n }\n }\n } else if ('shape' in schema && typeof schema.shape === 'object') {\n // It's a regular ZodObject\n for (const key of Object.keys(schema.shape)) {\n fields.add(key);\n }\n }\n\n return fields;\n}\n\n/**\n * Creates field references for type-safe query building\n */\ntype FieldRefs<TSchema extends SupportedSchema> = {\n [K in keyof z.infer<TSchema>]: FieldRef<K & string, z.infer<TSchema>[K]>;\n};\n\n/**\n * DynamoTable - Defines a DynamoDB table with type-safe schema\n *\n * Supports both ZodObject and ZodDiscriminatedUnion schemas for single-table design patterns.\n *\n * @example\n * ```ts\n * // Simple schema\n * const TodoTable = new DynamoTable({\n * tableName: 'prod-todo-table',\n * schema: z.object({\n * PK: z.string(),\n * SK: z.string(),\n * text: z.string(),\n * isDone: z.boolean(),\n * }),\n * pk: 'PK',\n * sk: 'SK',\n * });\n *\n * // Discriminated union for single-table design\n * const MultiEntityTable = new DynamoTable({\n * tableName: 'prod-entities',\n * schema: z.discriminatedUnion('entityType', [\n * z.object({ PK: z.string(), SK: z.string(), entityType: z.literal('USER'), name: z.string() }),\n * z.object({ PK: z.string(), SK: z.string(), entityType: z.literal('ITEM'), title: z.string() }),\n * ]),\n * pk: 'PK',\n * sk: 'SK',\n * });\n * ```\n */\nexport class DynamoTable<\n TSchema extends SupportedSchema,\n TPk extends keyof z.infer<TSchema>,\n TSk extends keyof z.infer<TSchema> | undefined = undefined,\n TIndexes extends Record<string, IndexDefinition> = Record<\n string,\n IndexDefinition\n >,\n> {\n public readonly tableName: string;\n public readonly schema: TSchema;\n public readonly pk: TPk;\n public readonly sk: TSk;\n public readonly indexes: TIndexes;\n public readonly field: FieldRefs<TSchema>;\n\n constructor(config: DynamoTableConfig<TSchema, TPk, TSk, TIndexes>) {\n this.tableName = config.tableName;\n this.schema = config.schema;\n this.pk = config.pk;\n this.sk = config.sk as TSk;\n this.indexes = (config.indexes ?? {}) as TIndexes;\n\n // Create field references for query building\n this.field = this.createFieldRefs();\n }\n\n private createFieldRefs(): FieldRefs<TSchema> {\n const fields = getSchemaFields(this.schema);\n const refs: Record<string, FieldRef<string, unknown>> = {};\n\n for (const key of fields) {\n refs[key] = {\n fieldName: key,\n _type: undefined as unknown,\n };\n }\n\n return refs as FieldRefs<TSchema>;\n }\n\n /**\n * Validate an item against the schema\n */\n validate(item: unknown): z.infer<TSchema> {\n return this.schema.parse(item) as z.infer<TSchema>;\n }\n\n /**\n * Safely validate an item, returning a result object\n */\n safeParse(item: unknown): z.ZodSafeParseResult<z.infer<TSchema>> {\n return this.schema.safeParse(item) as z.ZodSafeParseResult<\n z.infer<TSchema>\n >;\n }\n\n /**\n * Get the list of field names in the schema\n */\n getFieldNames(): (keyof z.infer<TSchema>)[] {\n return Array.from(\n getSchemaFields(this.schema),\n ) as (keyof z.infer<TSchema>)[];\n }\n\n}\n"]}
|
package/dist/core.d.cts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export { FilterConditionSchema, PendingDeliverySchema, QueryMetadataSchema, SYSTEM_TABLE_PROTOCOL_VERSION, SystemSchemas, SystemTableNames } from './index.cjs';
|
|
2
|
+
export { D as DynamoTable } from './table-BijJ73pX.js';
|
|
3
|
+
export { A as AnyDynamoTable, C as ConnectionEntry, b as DependencyEntry, D as DynamoTableConfig, F as FieldRef, a as FilterCondition, I as IndexDefinition, J as JsonPatch, P as PendingDelivery, c as QueryEntry, Q as QueryMetadata, S as SupportedSchema } from './types-LMLk8JVC.js';
|
|
4
|
+
import 'zod';
|
package/dist/core.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export { SystemSchemas, SystemTableNames
|
|
2
|
-
export { D as DynamoTable
|
|
3
|
-
export { A as AnyDynamoTable, C as ConnectionEntry, b as DependencyEntry, D as DynamoTableConfig, F as FieldRef, a as FilterCondition, I as IndexDefinition,
|
|
1
|
+
export { FilterConditionSchema, PendingDeliverySchema, QueryMetadataSchema, SYSTEM_TABLE_PROTOCOL_VERSION, SystemSchemas, SystemTableNames } from './index.js';
|
|
2
|
+
export { D as DynamoTable } from './table-BijJ73pX.js';
|
|
3
|
+
export { A as AnyDynamoTable, C as ConnectionEntry, b as DependencyEntry, D as DynamoTableConfig, F as FieldRef, a as FilterCondition, I as IndexDefinition, J as JsonPatch, P as PendingDelivery, c as QueryEntry, Q as QueryMetadata, S as SupportedSchema } from './types-LMLk8JVC.js';
|
|
4
4
|
import 'zod';
|