dynamodb-reactive 0.1.9 → 0.1.10
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/{chunk-MI2ZLLB2.js → chunk-BIEVX2SA.js} +7 -3
- package/dist/chunk-BIEVX2SA.js.map +1 -0
- package/dist/client.d.ts +2 -2
- package/dist/client.js +1 -1
- package/dist/{react-B8Q_XoCk.d.ts → react-DAVZIfsP.d.ts} +8 -2
- package/dist/react.d.ts +1 -1
- package/dist/react.js +1 -1
- package/dist/server.js +6 -0
- package/dist/server.js.map +1 -1
- package/package.json +1 -1
- package/dist/chunk-MI2ZLLB2.js.map +0 -1
|
@@ -113,11 +113,15 @@ var WebSocketManager = class {
|
|
|
113
113
|
const message = JSON.parse(event.data);
|
|
114
114
|
if (message.type === "connected") {
|
|
115
115
|
this._connectionId = message.connectionId;
|
|
116
|
+
this.ws?.send(JSON.stringify({ type: "ping" }));
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
if (message.type === "pong") {
|
|
116
120
|
this.setState("connected");
|
|
117
121
|
this.flushMessageQueue();
|
|
118
122
|
this.config.onConnect?.();
|
|
119
123
|
for (const resolve of this.connectionIdResolvers) {
|
|
120
|
-
resolve(
|
|
124
|
+
resolve(this._connectionId);
|
|
121
125
|
}
|
|
122
126
|
this.connectionIdResolvers = [];
|
|
123
127
|
return;
|
|
@@ -965,5 +969,5 @@ function createProcedureHooks(path) {
|
|
|
965
969
|
}
|
|
966
970
|
|
|
967
971
|
export { ReactiveClient, ReactiveClientProvider, WebSocketManager, applyPatches, createProcedureHooks, createReactiveClient, createReactiveHooks, useClient, useConnectionState, useMutation, useReactiveClient, useReactiveClientOrThrow, useSubscription };
|
|
968
|
-
//# sourceMappingURL=chunk-
|
|
969
|
-
//# sourceMappingURL=chunk-
|
|
972
|
+
//# sourceMappingURL=chunk-BIEVX2SA.js.map
|
|
973
|
+
//# sourceMappingURL=chunk-BIEVX2SA.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../client/src/patcher.ts","../../client/src/websocket.ts","../../client/src/client.ts","../../client/src/react.tsx"],"names":[],"mappings":"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","file":"chunk-BIEVX2SA.js","sourcesContent":["import jsonpatch, { type Operation } from 'fast-json-patch';\n\nimport type { JsonPatch } from './types.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 console.error('Failed to apply patches:', error);\n throw error;\n }\n}\n","/* eslint-disable no-console */\nimport type {\n ClientMessage,\n ConnectionState,\n ReactiveClientConfig,\n ServerMessage,\n} from './types.js';\n\n/**\n * WebSocket manager with automatic reconnection\n */\nexport class WebSocketManager {\n private config: Required<\n Omit<\n ReactiveClientConfig,\n 'auth' | 'httpUrl' | 'headers' | 'onConnect' | 'onDisconnect' | 'onError'\n >\n > &\n ReactiveClientConfig;\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 messageQueue: ClientMessage[] = [];\n private messageHandlers = new Set<(message: ServerMessage) => void>();\n private stateHandlers = new Set<(state: ConnectionState) => void>();\n private _connectionId: string | null = null;\n private connectionIdResolvers: Array<(id: string) => void> = [];\n\n constructor(config: ReactiveClientConfig) {\n this.config = {\n autoReconnect: true,\n reconnectDelay: 1000,\n maxReconnectAttempts: 10,\n ...config,\n };\n }\n\n /**\n * Get the current connection ID (null if not connected)\n */\n get connectionId(): string | null {\n return this._connectionId;\n }\n\n /**\n * Wait for the connection ID to be available\n */\n waitForConnectionId(): Promise<string> {\n if (this._connectionId) {\n return Promise.resolve(this._connectionId);\n }\n return new Promise((resolve) => {\n this.connectionIdResolvers.push(resolve);\n });\n }\n\n /**\n * Get current connection state\n */\n getState(): ConnectionState {\n return this.state;\n }\n\n /**\n * Connect to the WebSocket server\n */\n async connect(): Promise<void> {\n if (this.state === 'connected' || this.state === 'connecting') {\n return;\n }\n\n this.setState('connecting');\n\n try {\n const url = await this.buildUrl();\n this.ws = new WebSocket(url);\n\n this.ws.onopen = () => {\n this.reconnectAttempts = 0;\n // Send init message to get connectionId from server\n // Don't set state to 'connected' until we receive connectionId\n this.ws?.send(JSON.stringify({ type: 'init' }));\n };\n\n this.ws.onclose = (event) => {\n this.ws = null;\n this._connectionId = null;\n this.setState('disconnected');\n this.config.onDisconnect?.();\n\n if (this.config.autoReconnect && !event.wasClean) {\n this.scheduleReconnect();\n }\n };\n\n this.ws.onerror = () => {\n const error = new Error('WebSocket error');\n this.config.onError?.(error);\n };\n\n this.ws.onmessage = (event) => {\n try {\n const message = JSON.parse(event.data) as ServerMessage;\n\n // Handle 'connected' message - we got connectionId, now verify with ping/pong\n if (message.type === 'connected') {\n this._connectionId = message.connectionId;\n // Send ping to verify the connection is fully working\n this.ws?.send(JSON.stringify({ type: 'ping' }));\n return;\n }\n\n // Handle 'pong' message - connection is verified, now we're truly connected\n if (message.type === 'pong') {\n this.setState('connected');\n this.flushMessageQueue();\n this.config.onConnect?.();\n\n // Resolve any pending waitForConnectionId promises\n for (const resolve of this.connectionIdResolvers) {\n resolve(this._connectionId!);\n }\n this.connectionIdResolvers = [];\n return;\n }\n\n this.handleMessage(message);\n } catch (error) {\n console.error('Failed to parse WebSocket message:', error);\n }\n };\n } catch (error) {\n this.setState('disconnected');\n this.config.onError?.(\n error instanceof Error ? error : new Error(String(error)),\n );\n\n if (this.config.autoReconnect) {\n this.scheduleReconnect();\n }\n }\n }\n\n /**\n * Disconnect from the WebSocket server\n */\n disconnect(): void {\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n\n if (this.ws) {\n this.ws.close(1000, 'Client disconnect');\n this.ws = null;\n }\n\n this._connectionId = null;\n this.setState('disconnected');\n }\n\n /**\n * Send a message to the server\n */\n send(message: ClientMessage): void {\n // Check both our state and the actual WebSocket readyState\n if (this.state === 'connected' && this.ws?.readyState === WebSocket.OPEN) {\n this.ws.send(JSON.stringify(message));\n } else {\n // Queue message for when we reconnect\n this.messageQueue.push(message);\n }\n }\n\n /**\n * Subscribe to incoming messages\n */\n onMessage(handler: (message: ServerMessage) => void): () => void {\n this.messageHandlers.add(handler);\n return () => this.messageHandlers.delete(handler);\n }\n\n /**\n * Subscribe to connection state changes\n */\n onStateChange(handler: (state: ConnectionState) => void): () => void {\n this.stateHandlers.add(handler);\n return () => this.stateHandlers.delete(handler);\n }\n\n private async buildUrl(): Promise<string> {\n let url = this.config.url;\n\n if (this.config.auth) {\n const token =\n typeof this.config.auth === 'function'\n ? await this.config.auth()\n : this.config.auth;\n\n const separator = url.includes('?') ? '&' : '?';\n url = `${url}${separator}token=${encodeURIComponent(token)}`;\n }\n\n return url;\n }\n\n private setState(state: ConnectionState): void {\n this.state = state;\n for (const handler of this.stateHandlers) {\n handler(state);\n }\n }\n\n private handleMessage(message: ServerMessage): void {\n for (const handler of this.messageHandlers) {\n handler(message);\n }\n }\n\n private scheduleReconnect(): void {\n if (this.reconnectAttempts >= this.config.maxReconnectAttempts) {\n console.error('Max reconnection attempts reached');\n return;\n }\n\n this.setState('reconnecting');\n this.reconnectAttempts++;\n\n // Exponential backoff with jitter\n const delay =\n Math.min(\n this.config.reconnectDelay * Math.pow(2, this.reconnectAttempts - 1),\n 30000, // Max 30 seconds\n ) *\n (0.5 + Math.random() * 0.5);\n\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null;\n void this.connect();\n }, delay);\n }\n\n private flushMessageQueue(): void {\n const queue = this.messageQueue;\n this.messageQueue = [];\n\n for (const message of queue) {\n this.send(message);\n }\n }\n}\n","import { applyPatches } from './patcher.js';\nimport type {\n ConnectionState,\n JsonPatch,\n MutationOptions,\n ReactiveClientConfig,\n ServerMessage,\n Subscription,\n SubscriptionOptions,\n} from './types.js';\nimport { WebSocketManager } from './websocket.js';\n\n/**\n * Default HTTP URL for subscribe/call requests (Next.js API route)\n */\nconst DEFAULT_HTTP_URL = '/api/reactive';\n\n/**\n * Generate a unique subscription ID\n */\nfunction generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;\n}\n\n/**\n * Internal subscription state\n */\ninterface SubscriptionState<TData> {\n id: string;\n path: string;\n input: unknown;\n data: TData | undefined;\n loading: boolean;\n error: Error | undefined;\n listeners: Set<() => void>;\n options: SubscriptionOptions<unknown>;\n}\n\n/**\n * Pending call state\n */\ninterface PendingCall {\n resolve: (data: unknown) => void;\n reject: (error: Error) => void;\n}\n\n/**\n * Reactive client for type-safe subscriptions\n */\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 subscriptions = new Map<string, SubscriptionState<unknown>>();\n private pendingCalls = new Map<string, PendingCall>();\n private connectionState: ConnectionState = 'disconnected';\n private stateListeners = new Set<(state: ConnectionState) => void>();\n // Stores original data for rollback when optimistic updates fail\n private optimisticUpdates = new Map<string, unknown>();\n\n constructor(config: ReactiveClientConfig) {\n this.wsManager = new WebSocketManager(config);\n this.httpUrl = config.httpUrl ?? DEFAULT_HTTP_URL;\n\n // Store auth getter for HTTP requests\n if (typeof config.auth === 'function') {\n this.authGetter = config.auth;\n } else if (config.auth) {\n this.authGetter = () => config.auth as string;\n }\n\n // Store headers getter for HTTP requests\n if (typeof config.headers === 'function') {\n this.headersGetter = config.headers;\n } else if (config.headers) {\n this.headersGetter = () => config.headers as Record<string, string>;\n }\n\n // Handle incoming messages (patches come via WebSocket)\n this.wsManager.onMessage((message) => this.handleMessage(message));\n\n // Handle connection state changes\n this.wsManager.onStateChange((state) => {\n this.connectionState = state;\n this.notifyStateListeners();\n\n if (state === 'connected') {\n this.resubscribeAll();\n }\n });\n }\n\n /**\n * Connect to the server\n */\n async connect(): Promise<void> {\n await this.wsManager.connect();\n }\n\n /**\n * Disconnect from the server\n */\n disconnect(): void {\n this.wsManager.disconnect();\n }\n\n /**\n * Update the headers getter for HTTP requests.\n * Useful for dynamically setting auth or user context headers.\n */\n setHeaders(\n headers:\n | Record<string, string>\n | (() => Record<string, string> | Promise<Record<string, string>>),\n ): void {\n if (typeof headers === 'function') {\n this.headersGetter = headers;\n } else {\n this.headersGetter = () => headers;\n }\n }\n\n /**\n * Get current connection state\n */\n getConnectionState(): ConnectionState {\n return this.connectionState;\n }\n\n /**\n * Subscribe to connection state changes\n */\n onConnectionStateChange(\n listener: (state: ConnectionState) => void,\n ): () => void {\n this.stateListeners.add(listener);\n return () => this.stateListeners.delete(listener);\n }\n\n /**\n * Subscribe to a procedure via HTTP.\n * Snapshot is returned via HTTP, patches come via WebSocket.\n */\n subscribe<TData>(\n path: string,\n options: SubscriptionOptions<unknown> = {},\n ): Subscription<TData> {\n const id = generateId();\n\n const state: SubscriptionState<TData> = {\n id,\n path,\n input: options.input,\n data: undefined,\n loading: true,\n error: undefined,\n listeners: new Set(),\n options,\n };\n\n this.subscriptions.set(id, state as SubscriptionState<unknown>);\n\n // Send subscribe request via HTTP (async)\n this.sendSubscribeRequest(id, path, options.input).catch((error) => {\n state.error = error instanceof Error ? error : new Error(String(error));\n state.loading = false;\n this.notifySubscriptionListeners(id);\n options.onError?.(state.error);\n });\n\n const subscription: Subscription<TData> = {\n id,\n get data() {\n return state.data;\n },\n get loading() {\n return state.loading;\n },\n get error() {\n return state.error;\n },\n unsubscribe: () => this.unsubscribe(id),\n refetch: () => this.refetch(id),\n };\n\n return subscription;\n }\n\n /**\n * Send subscribe request via HTTP\n */\n private async sendSubscribeRequest(\n subscriptionId: string,\n path: string,\n input: unknown,\n ): Promise<void> {\n // Wait for connectionId to be available\n const connectionId = await this.wsManager.waitForConnectionId();\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n // Add custom headers if configured\n if (this.headersGetter) {\n const customHeaders = await this.headersGetter();\n Object.assign(headers, customHeaders);\n }\n\n // Add auth header if configured\n if (this.authGetter) {\n const token = await this.authGetter();\n headers['Authorization'] = `Bearer ${token}`;\n }\n\n const response = await fetch(this.httpUrl, {\n method: 'POST',\n headers,\n body: JSON.stringify({\n type: 'subscribe',\n connectionId,\n subscriptionId,\n path,\n input,\n }),\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 {\n type: string;\n message?: string;\n data?: unknown;\n };\n\n if (result.type === 'error') {\n throw new Error(result.message ?? 'Unknown error');\n }\n\n if (result.type === 'snapshot') {\n this.handleSnapshot(subscriptionId, result.data);\n }\n }\n\n /**\n * Call a mutation procedure via HTTP with optimistic update support.\n * All optimistic updates are applied INSTANTLY (before HTTP request).\n */\n async call<TInput, TOutput>(\n path: string,\n input: TInput,\n options?: MutationOptions<TInput, TOutput>,\n ): Promise<TOutput> {\n const invalidatesPath = options?.invalidates;\n const updateType = options?.optimisticUpdate;\n let targetSubscriptionId: string | undefined;\n\n // Find subscription to optimistically update\n if (invalidatesPath) {\n targetSubscriptionId = this.findSubscriptionByPath(invalidatesPath);\n }\n\n // Apply INSTANT optimistic update (before HTTP request)\n if (targetSubscriptionId) {\n const state = this.subscriptions.get(targetSubscriptionId);\n const currentData = state?.data;\n\n if (updateType === 'remove') {\n // Remove: filter out item by id\n const inputId = (input as { id?: string }).id;\n if (inputId) {\n this.applyOptimisticUpdate(targetSubscriptionId, (data) => {\n if (!Array.isArray(data)) return data;\n return data.filter((item: { id?: string }) => item.id !== inputId);\n });\n }\n } else if (updateType === 'merge') {\n // Merge: find item by id and merge input fields into it\n const inputWithId = input as { id?: string };\n if (inputWithId.id) {\n this.applyOptimisticUpdate(targetSubscriptionId, (data) => {\n if (!Array.isArray(data)) return data;\n const idx = data.findIndex(\n (item: { id?: string }) => item.id === inputWithId.id,\n );\n if (idx >= 0) {\n // Merge input into existing item\n return [\n ...data.slice(0, idx),\n { ...data[idx], ...input },\n ...data.slice(idx + 1),\n ];\n }\n return data;\n });\n } else if (options?.optimisticData) {\n // For creates without id, use provided optimisticData\n const optimistic =\n typeof options.optimisticData === 'function'\n ? (\n options.optimisticData as (\n input: TInput,\n data: unknown[],\n ) => TOutput\n )(input, Array.isArray(currentData) ? currentData : [])\n : options.optimisticData;\n if (optimistic) {\n this.applyOptimisticUpdate(targetSubscriptionId, (data) => {\n if (!Array.isArray(data)) return data;\n return [optimistic, ...data];\n });\n }\n }\n } else if (typeof updateType === 'function') {\n // Custom update function - apply instantly\n this.applyOptimisticUpdate(targetSubscriptionId, (data) => {\n if (!Array.isArray(data)) return data;\n return updateType(data, input, undefined);\n });\n }\n }\n\n // Wait for connectionId to be available\n const connectionId = await this.wsManager.waitForConnectionId();\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n // Add custom headers if configured\n if (this.headersGetter) {\n const customHeaders = await this.headersGetter();\n Object.assign(headers, customHeaders);\n }\n\n // Add auth header if configured\n if (this.authGetter) {\n const token = await this.authGetter();\n headers['Authorization'] = `Bearer ${token}`;\n }\n\n try {\n const response = await fetch(this.httpUrl, {\n method: 'POST',\n headers,\n body: JSON.stringify({\n type: 'call',\n connectionId,\n path,\n input,\n }),\n });\n\n if (!response.ok) {\n throw new Error(\n `Call failed: ${response.status} ${response.statusText}`,\n );\n }\n\n const result = (await response.json()) as {\n type: string;\n message?: string;\n data?: unknown;\n };\n\n if (result.type === 'error') {\n throw new Error(result.message ?? 'Unknown error');\n }\n\n const data = result.data as TOutput;\n\n // After HTTP success, reconcile with real server data\n if (targetSubscriptionId && updateType === 'merge') {\n const resultWithId = data as { id?: string };\n if (resultWithId && resultWithId.id) {\n this.applyOptimisticUpdate(targetSubscriptionId, (currentData) => {\n if (!Array.isArray(currentData)) return currentData;\n const idx = currentData.findIndex(\n (item: { id?: string }) => item.id === resultWithId.id,\n );\n if (idx >= 0) {\n // Update with real server data\n return [\n ...currentData.slice(0, idx),\n data,\n ...currentData.slice(idx + 1),\n ];\n } else {\n // New item - add it (and remove any temp items)\n return [\n data,\n ...currentData.filter(\n (item: { id?: string }) =>\n item.id && !item.id.startsWith('temp-'),\n ),\n ];\n }\n });\n }\n }\n\n return data;\n } catch (error) {\n // Rollback on error\n if (targetSubscriptionId) {\n this.rollbackOptimisticUpdate(targetSubscriptionId);\n }\n throw error;\n }\n }\n\n /**\n * Unsubscribe from a subscription\n */\n private unsubscribe(id: string): void {\n const state = this.subscriptions.get(id);\n if (!state) return;\n\n this.subscriptions.delete(id);\n\n this.wsManager.send({\n type: 'unsubscribe',\n subscriptionId: id,\n });\n }\n\n /**\n * Refetch a subscription via HTTP\n */\n private async refetch(id: string): Promise<void> {\n const state = this.subscriptions.get(id);\n if (!state) return;\n\n state.loading = true;\n this.notifySubscriptionListeners(id);\n\n try {\n await this.sendSubscribeRequest(id, state.path, state.input);\n } catch (error) {\n state.error = error instanceof Error ? error : new Error(String(error));\n state.loading = false;\n this.notifySubscriptionListeners(id);\n state.options.onError?.(state.error);\n }\n }\n\n /**\n * Handle incoming server messages.\n * Note: 'connected' messages are handled by WebSocketManager before reaching here.\n */\n private handleMessage(message: ServerMessage): void {\n switch (message.type) {\n case 'connected':\n // Handled by WebSocketManager - should not reach here\n break;\n\n case 'snapshot':\n this.handleSnapshot(message.subscriptionId, message.data);\n break;\n\n case 'patch':\n this.handlePatch(message.subscriptionId, message.patches);\n break;\n\n case 'result':\n this.handleResult(message.callId, message.data);\n break;\n\n case 'error':\n this.handleError(message);\n break;\n }\n }\n\n /**\n * Handle a snapshot message\n */\n private handleSnapshot(subscriptionId: string, data: unknown): void {\n const state = this.subscriptions.get(subscriptionId);\n if (!state) return;\n\n // Clear optimistic state since we have authoritative data\n this.clearOptimisticUpdate(subscriptionId);\n\n state.data = data;\n state.loading = false;\n state.error = undefined;\n\n this.notifySubscriptionListeners(subscriptionId);\n state.options.onData?.(data);\n }\n\n /**\n * Handle a patch message\n */\n private handlePatch(subscriptionId: string, patches: JsonPatch[]): void {\n const state = this.subscriptions.get(subscriptionId);\n if (!state || state.data === undefined) return;\n\n // If we have optimistic state, apply patch to the ORIGINAL data\n // This prevents conflicts when patch tries to modify already-modified data\n const originalData = this.optimisticUpdates.get(subscriptionId);\n const baseData = originalData !== undefined ? originalData : state.data;\n\n // Clear optimistic state since we have authoritative patch data\n this.clearOptimisticUpdate(subscriptionId);\n\n try {\n state.data = applyPatches(baseData, patches);\n this.notifySubscriptionListeners(subscriptionId);\n state.options.onData?.(state.data);\n } catch (error) {\n state.error = error instanceof Error ? error : new Error(String(error));\n this.notifySubscriptionListeners(subscriptionId);\n state.options.onError?.(state.error);\n }\n }\n\n /**\n * Handle a result message\n */\n private handleResult(callId: string, data: unknown): void {\n const pending = this.pendingCalls.get(callId);\n if (!pending) return;\n\n this.pendingCalls.delete(callId);\n pending.resolve(data);\n }\n\n /**\n * Handle an error message\n */\n private handleError(message: {\n message: string;\n subscriptionId?: string;\n callId?: string;\n }): void {\n const error = new Error(message.message);\n\n if (message.subscriptionId) {\n const state = this.subscriptions.get(message.subscriptionId);\n if (state) {\n state.error = error;\n state.loading = false;\n this.notifySubscriptionListeners(message.subscriptionId);\n state.options.onError?.(error);\n }\n }\n\n if (message.callId) {\n const pending = this.pendingCalls.get(message.callId);\n if (pending) {\n this.pendingCalls.delete(message.callId);\n pending.reject(error);\n }\n }\n }\n\n /**\n * Resubscribe to all subscriptions after reconnect via HTTP\n */\n private resubscribeAll(): void {\n for (const [id, state] of this.subscriptions) {\n if (state.options.resubscribeOnReconnect !== false) {\n state.loading = true;\n this.notifySubscriptionListeners(id);\n\n // Re-subscribe via HTTP\n this.sendSubscribeRequest(id, state.path, state.input).catch(\n (error) => {\n state.error =\n error instanceof Error ? error : new Error(String(error));\n state.loading = false;\n this.notifySubscriptionListeners(id);\n state.options.onError?.(state.error);\n },\n );\n }\n }\n }\n\n /**\n * Notify subscription listeners of state changes\n */\n private notifySubscriptionListeners(id: string): void {\n const state = this.subscriptions.get(id);\n if (!state) return;\n\n for (const listener of state.listeners) {\n listener();\n }\n }\n\n /**\n * Notify connection state listeners\n */\n private notifyStateListeners(): void {\n for (const listener of this.stateListeners) {\n listener(this.connectionState);\n }\n }\n\n /**\n * Add a listener for subscription state changes\n * Used internally by React hooks\n */\n addSubscriptionListener(id: string, listener: () => void): () => void {\n const state = this.subscriptions.get(id);\n if (!state) return () => {};\n\n state.listeners.add(listener);\n return () => state.listeners.delete(listener);\n }\n\n /**\n * Get subscription state\n * Used internally by React hooks\n */\n getSubscriptionState<TData>(\n id: string,\n ): SubscriptionState<TData> | undefined {\n return this.subscriptions.get(id) as SubscriptionState<TData> | undefined;\n }\n\n /**\n * Find subscription by path\n */\n private findSubscriptionByPath(path: string): string | undefined {\n for (const [id, state] of this.subscriptions) {\n if (state.path === path) {\n return id;\n }\n }\n return undefined;\n }\n\n /**\n * Apply an optimistic update to a subscription's data\n */\n private applyOptimisticUpdate(\n subscriptionId: string,\n updater: (data: unknown) => unknown,\n ): void {\n const state = this.subscriptions.get(subscriptionId);\n if (!state || state.data === undefined) return;\n\n // Store original data for rollback (only if not already stored)\n if (!this.optimisticUpdates.has(subscriptionId)) {\n this.optimisticUpdates.set(\n subscriptionId,\n JSON.parse(JSON.stringify(state.data)),\n );\n }\n\n // Apply the update\n state.data = updater(state.data);\n this.notifySubscriptionListeners(subscriptionId);\n }\n\n /**\n * Rollback an optimistic update\n */\n private rollbackOptimisticUpdate(subscriptionId: string): void {\n const original = this.optimisticUpdates.get(subscriptionId);\n if (original === undefined) return;\n\n const state = this.subscriptions.get(subscriptionId);\n if (state) {\n state.data = original;\n this.notifySubscriptionListeners(subscriptionId);\n }\n this.optimisticUpdates.delete(subscriptionId);\n }\n\n /**\n * Clear optimistic state (called when real data arrives)\n */\n private clearOptimisticUpdate(subscriptionId: string): void {\n this.optimisticUpdates.delete(subscriptionId);\n }\n}\n\n/**\n * Create a type-safe reactive client\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\n/**\n * Type-safe client proxy type\n */\nexport type TypedReactiveClient<TRouter> = {\n [K in keyof TRouter]: TRouter[K] extends { query: any }\n ? {\n useSubscription: <TData = unknown>(\n input?: unknown,\n options?: Omit<SubscriptionOptions<unknown>, 'input'>,\n ) => Subscription<TData>;\n }\n : TRouter[K] extends { mutation: any }\n ? {\n mutate: <TInput, TOutput>(input: TInput) => Promise<TOutput>;\n }\n : TypedReactiveClient<TRouter[K]>;\n} & {\n _client: ReactiveClient;\n connect: () => Promise<void>;\n disconnect: () => void;\n};\n\n/**\n * Create a typed proxy for path-based access\n */\nfunction createTypedProxy(client: ReactiveClient, path: string[]): unknown {\n return new Proxy(\n {},\n {\n get(_target, prop) {\n if (prop === '_client') return client;\n if (prop === 'connect') return () => client.connect();\n if (prop === 'disconnect') return () => client.disconnect();\n\n if (typeof prop !== 'string') return undefined;\n\n const newPath = [...path, prop];\n\n // Check if this is a subscription or mutation\n if (prop === 'useSubscription') {\n return (input?: unknown, options?: SubscriptionOptions<unknown>) => {\n const parentPath = path.join('.');\n return client.subscribe(parentPath, { ...options, input });\n };\n }\n\n if (prop === 'mutate') {\n return async (input: unknown) => {\n const parentPath = path.join('.');\n // Auto-detect invalidates path: 'todos.toggle' → 'todos.list'\n const invalidatesPath =\n path.length >= 2\n ? `${path.slice(0, -1).join('.')}.list`\n : undefined;\n // Auto-detect update type: '*.delete' → 'remove', others → 'merge'\n const updateType = parentPath.endsWith('.delete')\n ? ('remove' as const)\n : ('merge' as const);\n return client.call(parentPath, input, {\n invalidates: invalidatesPath,\n optimisticUpdate: updateType,\n });\n };\n }\n\n return createTypedProxy(client, newPath);\n },\n },\n );\n}\n","/* eslint-disable no-console */\nimport {\n createContext,\n type ReactNode,\n useContext,\n useEffect,\n useRef,\n useState,\n useSyncExternalStore,\n} from 'react';\n\nimport { ReactiveClient } from './client.js';\nimport type {\n ConnectionState,\n MutationOptions,\n ReactiveClientConfig,\n Subscription,\n SubscriptionOptions,\n} from './types.js';\n\n/**\n * Context for the reactive client\n */\nconst ReactiveClientContext = createContext<ReactiveClient | null>(null);\n\n/**\n * Provider component for the reactive client\n *\n * If no config.url or client is provided, WebSocket features are disabled\n * and children are rendered without the reactive context.\n */\nexport function ReactiveClientProvider({\n children,\n config,\n client: externalClient,\n}: {\n children: ReactNode;\n config?: ReactiveClientConfig;\n client?: ReactiveClient;\n}) {\n // Extract URL for stable dependency\n const url = config?.url;\n const hasUrl = Boolean(url);\n\n // Always start with null to avoid hydration mismatch\n // Client will be created in useEffect after hydration\n const [client, setClient] = useState<ReactiveClient | null>(\n externalClient ?? null,\n );\n\n // Create client after mount (avoids hydration mismatch)\n useEffect(() => {\n // Skip if we have an external client or no URL\n if (externalClient || !url) return;\n\n // Create client if we don't have one\n if (!client) {\n const newClient = new ReactiveClient({ ...config, url });\n setClient(newClient);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [url, externalClient]);\n\n // Connect/disconnect effect\n useEffect(() => {\n if (!client) return;\n\n void client.connect();\n\n return () => {\n client.disconnect();\n };\n }, [client]);\n\n // Log warning if no URL configured (only once in dev)\n useEffect(() => {\n if (!hasUrl && process.env.NODE_ENV === 'development') {\n console.warn(\n '[dynamodb-reactive] WebSocket URL not configured, real-time features disabled',\n );\n }\n }, [hasUrl]);\n\n // Always render with context provider - hooks will handle null client\n return (\n <ReactiveClientContext.Provider value={client}>\n {children}\n </ReactiveClientContext.Provider>\n );\n}\n\n/**\n * Hook to get the reactive client\n * Returns null if WebSocket is not configured\n */\nexport function useReactiveClient(): ReactiveClient | null {\n return useContext(ReactiveClientContext);\n}\n\n/**\n * Hook to get the reactive client, throwing if not available\n */\nexport function useReactiveClientOrThrow(): ReactiveClient {\n const client = useContext(ReactiveClientContext);\n if (!client) {\n throw new Error(\n 'useReactiveClientOrThrow must be used within a ReactiveClientProvider with a configured URL',\n );\n }\n return client;\n}\n\n/**\n * Hook to get the connection state\n * Returns 'disabled' if WebSocket is not configured\n */\nexport function useConnectionState(): ConnectionState | 'disabled' {\n const client = useReactiveClient();\n\n return useSyncExternalStore(\n (callback) => {\n if (!client) return () => {};\n return client.onConnectionStateChange(callback);\n },\n () => (client ? client.getConnectionState() : 'disabled'),\n () => 'disabled' as const,\n );\n}\n\n/**\n * Hook for reactive subscriptions\n * Returns disabled state if WebSocket is not configured\n */\nexport function useSubscription<TData>(\n path: string,\n options: SubscriptionOptions<unknown> = {},\n): {\n data: TData | undefined;\n loading: boolean;\n error: Error | undefined;\n disabled: boolean;\n refetch: () => Promise<void>;\n} {\n const client = useReactiveClient();\n const subscriptionRef = useRef<Subscription<TData> | null>(null);\n const [state, setState] = useState<{\n data: TData | undefined;\n loading: boolean;\n error: Error | undefined;\n }>({\n data: undefined,\n loading: !client ? false : true,\n error: undefined,\n });\n\n // Serialize options for dependency comparison\n const inputKey = JSON.stringify(options.input);\n // Store callbacks in refs to avoid re-subscribing when they change\n const onDataRef = useRef(options.onData);\n const onErrorRef = useRef(options.onError);\n onDataRef.current = options.onData;\n onErrorRef.current = options.onError;\n\n useEffect(() => {\n if (!client) return;\n\n // Parse input from inputKey to ensure we use the serialized value\n const input = inputKey ? JSON.parse(inputKey) : undefined;\n\n const subscription = client.subscribe<TData>(path, {\n input,\n onData: (data) => {\n setState((prev) => ({\n ...prev,\n data: data as TData,\n loading: false,\n error: undefined,\n }));\n onDataRef.current?.(data);\n },\n onError: (error) => {\n setState((prev) => ({\n ...prev,\n error,\n loading: false,\n }));\n onErrorRef.current?.(error);\n },\n });\n\n subscriptionRef.current = subscription;\n\n // Register a listener for optimistic updates (notifySubscriptionListeners)\n // This ensures React state updates when optimistic changes happen\n const unregisterListener = client.addSubscriptionListener(\n subscription.id,\n () => {\n // Re-read current state from subscription\n setState({\n data: subscription.data,\n loading: subscription.loading,\n error: subscription.error,\n });\n },\n );\n\n // Update state from subscription\n setState({\n data: subscription.data,\n loading: subscription.loading,\n error: subscription.error,\n });\n\n return () => {\n unregisterListener();\n subscription.unsubscribe();\n subscriptionRef.current = null;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [client, path, inputKey]);\n\n const refetch = async () => {\n if (subscriptionRef.current) {\n setState((prev) => ({ ...prev, loading: true }));\n await subscriptionRef.current.refetch();\n }\n };\n\n return {\n ...state,\n disabled: !client,\n refetch,\n };\n}\n\n/**\n * Hook for mutations with automatic optimistic updates\n *\n * Auto-detection:\n * - `invalidates`: Auto-detected from path (e.g., 'todos.toggle' -> 'todos.list')\n * - `optimisticUpdate`: Auto-detected from path ('*.delete' -> 'remove', others -> 'merge')\n *\n * You can override these with explicit options.\n */\nexport function useMutation<TInput, TOutput>(\n path: string,\n options?: MutationOptions<TInput, TOutput>,\n): {\n mutate: (input: TInput) => Promise<TOutput>;\n data: TOutput | undefined;\n loading: boolean;\n error: Error | undefined;\n disabled: boolean;\n reset: () => void;\n} {\n const client = useReactiveClient();\n const [state, setState] = useState<{\n data: TOutput | undefined;\n loading: boolean;\n error: Error | undefined;\n }>({\n data: undefined,\n loading: false,\n error: undefined,\n });\n\n // Auto-detect invalidates path from mutation path\n // e.g., 'todos.toggle' -> 'todos.list', 'todos.create' -> 'todos.list'\n const autoInvalidates =\n options?.invalidates ??\n (() => {\n const parts = path.split('.');\n if (parts.length >= 2) {\n return `${parts.slice(0, -1).join('.')}.list`;\n }\n return undefined;\n })();\n\n // Auto-detect update type from path\n // '*.delete' -> 'remove', others -> 'merge'\n const autoUpdateType =\n options?.optimisticUpdate ??\n (path.endsWith('.delete') ? 'remove' : 'merge');\n\n const mutate = async (input: TInput): Promise<TOutput> => {\n if (!client) {\n throw new Error('WebSocket not configured - mutations are disabled');\n }\n\n setState((prev) => ({ ...prev, loading: true, error: undefined }));\n\n try {\n const result = await client.call<TInput, TOutput>(path, input, {\n invalidates: autoInvalidates,\n optimisticUpdate: autoUpdateType,\n });\n setState({ data: result, loading: false, error: undefined });\n return result;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n setState((prev) => ({ ...prev, loading: false, error: err }));\n throw err;\n }\n };\n\n const reset = () => {\n setState({ data: undefined, loading: false, error: undefined });\n };\n\n return {\n mutate,\n ...state,\n disabled: !client,\n reset,\n };\n}\n\n/**\n * Type helper for extracting procedure input type from ProcedureDefinition\n * Uses Zod's internal _output property to extract the parsed type\n * (Zod schemas have _input/_output as actual properties for type inference)\n */\ntype ProcedureInput<T> = T extends { inputSchema?: { _output: infer I } }\n ? I\n : undefined;\n\n/**\n * Type helper for extracting procedure output type from ProcedureDefinition\n * Extracts from resolver return type using any[] for flexible argument matching\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype ProcedureOutput<T> = T extends {\n resolver: (...args: any[]) => infer TReturn;\n}\n ? Awaited<TReturn>\n : unknown;\n\n/**\n * Typed client hooks for a router procedure\n * Provides both useQuery and useMutation - use whichever matches your procedure type\n */\ntype TypedProcedureHooks<TInput, TOutput> = {\n useQuery: (\n input: TInput,\n options?: Omit<SubscriptionOptions<TInput>, 'input'>,\n ) => {\n data: TOutput | undefined;\n loading: boolean;\n error: Error | undefined;\n disabled: boolean;\n refetch: () => Promise<void>;\n };\n useMutation: (options?: MutationOptions<TInput, TOutput>) => {\n mutate: (input: TInput) => Promise<TOutput>;\n data: TOutput | undefined;\n loading: boolean;\n error: Error | undefined;\n disabled: boolean;\n reset: () => void;\n };\n};\n\n/**\n * Extract router definition from Router class or use T directly\n */\ntype ExtractRouterDefinition<T> = T extends { definition: infer TDef }\n ? TDef\n : T;\n\n/**\n * Recursive type for typed client proxy\n * Checks for 'resolver' property to identify procedures (all procedures have it)\n */\ntype TypedClientProxyRecursive<T> = T extends { resolver: unknown }\n ? TypedProcedureHooks<ProcedureInput<T>, ProcedureOutput<T>>\n : { [K in keyof T]: TypedClientProxyRecursive<T[K]> };\n\n/**\n * Client utilities available at the root level\n */\ninterface ClientUtilities {\n /**\n * Set custom headers to be sent with HTTP requests.\n * Useful for auth context (e.g., user tokens, session info).\n */\n setHeaders: (\n headers:\n | Record<string, string>\n | (() => Record<string, string> | Promise<Record<string, string>>),\n ) => void;\n}\n\n/**\n * Typed client proxy combining router procedures and client utilities\n */\ntype TypedClientProxy<T> = TypedClientProxyRecursive<\n ExtractRouterDefinition<T>\n> &\n ClientUtilities;\n\n/**\n * Create a typed client proxy for use in React components.\n *\n * @example\n * ```tsx\n * const client = useClient<AppRouter>();\n *\n * // Queries (subscriptions)\n * const { data, loading } = client.todos.list.useQuery({});\n *\n * // Mutations\n * const { mutate, loading } = client.todos.toggle.useMutation();\n * await mutate({ id: '123' });\n *\n * // Set custom headers for HTTP requests (e.g., for auth context)\n * client.setHeaders({ 'Authorization': 'Bearer token' });\n * ```\n */\nexport function useClient<TRouter>(): TypedClientProxy<TRouter> {\n const client = useReactiveClient();\n\n function buildProxy(path: string[]): unknown {\n return new Proxy(\n {},\n {\n get(_target, prop: string) {\n if (prop === 'useQuery') {\n // Return a hook function for subscriptions\n return function useQueryHook(\n input?: unknown,\n options?: SubscriptionOptions<unknown>,\n ) {\n const pathStr = path.join('.');\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return useSubscription(pathStr, { ...options, input });\n };\n }\n\n if (prop === 'useMutation') {\n // Return a hook function for mutations\n return function useMutationHook(\n options?: MutationOptions<unknown, unknown>,\n ) {\n const pathStr = path.join('.');\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return useMutation(pathStr, options);\n };\n }\n\n // Expose setHeaders from the underlying client\n if (prop === 'setHeaders') {\n return (\n headers:\n | Record<string, string>\n | (() =>\n | Record<string, string>\n | Promise<Record<string, string>>),\n ) => {\n client?.setHeaders(headers);\n };\n }\n\n return buildProxy([...path, prop]);\n },\n },\n );\n }\n\n return buildProxy([]) as TypedClientProxy<TRouter>;\n}\n\n/**\n * @deprecated Use useClient<TRouter>() instead for typed proxy access\n */\nexport function createReactiveHooks() {\n return {\n useSubscription: <TPath extends string, TData = unknown>(\n path: TPath,\n options?: SubscriptionOptions<unknown>,\n ) => useSubscription<TData>(path, options),\n\n useMutation: <TPath extends string, TInput = unknown, TOutput = unknown>(\n path: TPath,\n options?: MutationOptions<TInput, TOutput>,\n ) => useMutation<TInput, TOutput>(path, options),\n\n useConnectionState,\n useReactiveClient,\n };\n}\n\n/**\n * @deprecated Use useClient<TRouter>() instead for typed proxy access\n */\nexport function createProcedureHooks<TInput, TOutput>(path: string) {\n return {\n useSubscription: (\n input?: TInput,\n options?: Omit<SubscriptionOptions<TInput>, 'input'>,\n ) => useSubscription<TOutput>(path, { ...options, input }),\n\n useMutation: (options?: MutationOptions<TInput, TOutput>) =>\n useMutation<TInput, TOutput>(path, options),\n };\n}\n"]}
|
package/dist/client.d.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { R as ReactiveClientConfig, C as ConnectionState, a as ClientMessage, S as ServerMessage, J as JsonPatch } from './react-
|
|
2
|
-
export { d as CallMessage, E as ErrorMessage, I as InferInput, e as InferOutput, M as MutationOptions, P as PatchMessage, b as ReactiveClient, m as ReactiveClientProvider, f as ResultMessage, g as SnapshotMessage, h as SubscribeMessage, i as Subscription, j as SubscriptionOptions, T as TypedReactiveClient, U as UnsubscribeMessage, k as createProcedureHooks, c as createReactiveClient, l as createReactiveHooks, u as useClient, n as useConnectionState, o as useMutation, p as useReactiveClient, q as useReactiveClientOrThrow, r as useSubscription } from './react-
|
|
1
|
+
import { R as ReactiveClientConfig, C as ConnectionState, a as ClientMessage, S as ServerMessage, J as JsonPatch } from './react-DAVZIfsP.js';
|
|
2
|
+
export { d as CallMessage, E as ErrorMessage, I as InferInput, e as InferOutput, M as MutationOptions, P as PatchMessage, b as ReactiveClient, m as ReactiveClientProvider, f as ResultMessage, g as SnapshotMessage, h as SubscribeMessage, i as Subscription, j as SubscriptionOptions, T as TypedReactiveClient, U as UnsubscribeMessage, k as createProcedureHooks, c as createReactiveClient, l as createReactiveHooks, u as useClient, n as useConnectionState, o as useMutation, p as useReactiveClient, q as useReactiveClientOrThrow, r as useSubscription } from './react-DAVZIfsP.js';
|
|
3
3
|
import 'react/jsx-runtime';
|
|
4
4
|
import 'react';
|
|
5
5
|
|
package/dist/client.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { ReactiveClient, ReactiveClientProvider, WebSocketManager, applyPatches, createProcedureHooks, createReactiveClient, createReactiveHooks, useClient, useConnectionState, useMutation, useReactiveClient, useReactiveClientOrThrow, useSubscription } from './chunk-
|
|
1
|
+
export { ReactiveClient, ReactiveClientProvider, WebSocketManager, applyPatches, createProcedureHooks, createReactiveClient, createReactiveHooks, useClient, useConnectionState, useMutation, useReactiveClient, useReactiveClientOrThrow, useSubscription } from './chunk-BIEVX2SA.js';
|
|
2
2
|
//# sourceMappingURL=client.js.map
|
|
3
3
|
//# sourceMappingURL=client.js.map
|
|
@@ -32,7 +32,10 @@ interface CallMessage {
|
|
|
32
32
|
interface InitMessage {
|
|
33
33
|
type: 'init';
|
|
34
34
|
}
|
|
35
|
-
|
|
35
|
+
interface PingMessage {
|
|
36
|
+
type: 'ping';
|
|
37
|
+
}
|
|
38
|
+
type ClientMessage = InitMessage | PingMessage | SubscribeMessage | UnsubscribeMessage | CallMessage;
|
|
36
39
|
/**
|
|
37
40
|
* Messages sent from server to client
|
|
38
41
|
*/
|
|
@@ -61,7 +64,10 @@ interface ErrorMessage {
|
|
|
61
64
|
subscriptionId?: string;
|
|
62
65
|
callId?: string;
|
|
63
66
|
}
|
|
64
|
-
|
|
67
|
+
interface PongMessage {
|
|
68
|
+
type: 'pong';
|
|
69
|
+
}
|
|
70
|
+
type ServerMessage = ConnectedMessage | PongMessage | SnapshotMessage | PatchMessage | ResultMessage | ErrorMessage;
|
|
65
71
|
/**
|
|
66
72
|
* Client configuration
|
|
67
73
|
*/
|
package/dist/react.d.ts
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { m as ReactiveClientProvider, k as createProcedureHooks, l as createReactiveHooks, u as useClient, n as useConnectionState, o as useMutation, p as useReactiveClient, q as useReactiveClientOrThrow, r as useSubscription } from './react-
|
|
1
|
+
export { m as ReactiveClientProvider, k as createProcedureHooks, l as createReactiveHooks, u as useClient, n as useConnectionState, o as useMutation, p as useReactiveClient, q as useReactiveClientOrThrow, r as useSubscription } from './react-DAVZIfsP.js';
|
|
2
2
|
import 'react/jsx-runtime';
|
|
3
3
|
import 'react';
|
package/dist/react.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { ReactiveClientProvider, createProcedureHooks, createReactiveHooks, useClient, useConnectionState, useMutation, useReactiveClient, useReactiveClientOrThrow, useSubscription } from './chunk-
|
|
1
|
+
export { ReactiveClientProvider, createProcedureHooks, createReactiveHooks, useClient, useConnectionState, useMutation, useReactiveClient, useReactiveClientOrThrow, useSubscription } from './chunk-BIEVX2SA.js';
|
|
2
2
|
//# sourceMappingURL=react.js.map
|
|
3
3
|
//# sourceMappingURL=react.js.map
|
package/dist/server.js
CHANGED
|
@@ -1368,6 +1368,12 @@ function createLambdaHandlers() {
|
|
|
1368
1368
|
};
|
|
1369
1369
|
break;
|
|
1370
1370
|
}
|
|
1371
|
+
case "ping": {
|
|
1372
|
+
response = {
|
|
1373
|
+
type: "pong"
|
|
1374
|
+
};
|
|
1375
|
+
break;
|
|
1376
|
+
}
|
|
1371
1377
|
case "unsubscribe": {
|
|
1372
1378
|
const subResponse = await docClient.send(
|
|
1373
1379
|
new GetCommand({
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../server/src/procedure.ts","../../server/src/router.ts","../../server/src/reactive.ts","../../server/src/partiql-builder.ts","../../server/src/query-builder.ts","../../server/src/db-context.ts","../../server/src/dependency-extractor.ts","../../server/src/patcher.ts","../../server/src/handlers/reactive-handler.ts","../../server/src/handlers/stream-handler.ts","../../server/src/handlers/lambda-handlers.ts","../../server/src/filter-evaluator.ts"],"names":["DynamoDBClient","DynamoDBDocumentClient","PutCommand","GetCommand","DeleteCommand","unmarshall","ExecuteStatementCommand","ApiGatewayManagementApiClient","PostToConnectionCommand","QueryCommand","GoneException"],"mappings":"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","file":"server.js","sourcesContent":["import type { z } from 'zod';\n\nimport type { DatabaseContext, ProcedureDefinition } from './types.js';\n\n/**\n * Procedure builder for creating type-safe procedures\n */\nexport class ProcedureBuilder<\n TContext,\n TInput extends z.ZodType = z.ZodUndefined,\n> {\n private inputSchema?: TInput;\n\n constructor(inputSchema?: TInput) {\n this.inputSchema = inputSchema;\n }\n\n /**\n * Define the input schema for the procedure\n */\n input<TNewInput extends z.ZodType>(\n schema: TNewInput,\n ): ProcedureBuilder<TContext, TNewInput> {\n return new ProcedureBuilder<TContext, TNewInput>(schema);\n }\n\n /**\n * Define a query procedure (read-only operation)\n */\n query<TOutput>(\n resolver: (opts: {\n ctx: TContext & { db: DatabaseContext };\n input: z.infer<TInput>;\n }) => Promise<TOutput> | TOutput,\n ): ProcedureDefinition<TContext, TInput, TOutput> {\n return {\n type: 'query',\n inputSchema: this.inputSchema,\n resolver,\n };\n }\n\n /**\n * Define a mutation procedure (write operation)\n */\n mutation<TOutput>(\n resolver: (opts: {\n ctx: TContext & { db: DatabaseContext };\n input: z.infer<TInput>;\n }) => Promise<TOutput> | TOutput,\n ): ProcedureDefinition<TContext, TInput, TOutput> {\n return {\n type: 'mutation',\n inputSchema: this.inputSchema,\n resolver,\n };\n }\n}\n\n/**\n * Check if a value is a procedure definition\n */\nexport function isProcedure(\n value: unknown,\n): value is ProcedureDefinition<any, any, any> {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'type' in value &&\n 'resolver' in value &&\n (value.type === 'query' || value.type === 'mutation')\n );\n}\n\n/**\n * Execute a procedure with the given context and input\n */\nexport async function executeProcedure<\n TContext,\n TInput extends z.ZodType,\n TOutput,\n>(\n procedure: ProcedureDefinition<TContext, TInput, TOutput>,\n ctx: TContext & { db: DatabaseContext },\n rawInput: unknown,\n): Promise<TOutput> {\n // Validate input if schema is defined\n let input: z.infer<TInput>;\n if (procedure.inputSchema) {\n const parseResult = procedure.inputSchema.safeParse(rawInput);\n if (!parseResult.success) {\n throw new Error(`Invalid input: ${parseResult.error.message}`);\n }\n input = parseResult.data;\n } else {\n input = rawInput as z.infer<TInput>;\n }\n\n // Execute the resolver\n return procedure.resolver({ ctx, input });\n}\n","import { executeProcedure, isProcedure } from './procedure.js';\nimport type {\n DatabaseContext,\n ProcedureDefinition,\n RouterDefinition,\n} from './types.js';\n\n/**\n * Router class for organizing procedures\n */\nexport class Router<TContext, TRouter extends RouterDefinition<TContext>> {\n public readonly definition: TRouter;\n\n constructor(definition: TRouter) {\n this.definition = definition;\n }\n\n /**\n * Get a procedure by its path (e.g., \"todos.list\")\n */\n getProcedure(path: string): ProcedureDefinition<TContext, any, any> | null {\n const parts = path.split('.');\n let current: unknown = this.definition;\n\n for (const part of parts) {\n if (typeof current !== 'object' || current === null) {\n return null;\n }\n current = (current as Record<string, unknown>)[part];\n }\n\n if (isProcedure(current)) {\n return current;\n }\n\n return null;\n }\n\n /**\n * Execute a procedure by its path\n */\n async execute(\n path: string,\n ctx: TContext & { db: DatabaseContext },\n input: unknown,\n ): Promise<unknown> {\n const procedure = this.getProcedure(path);\n if (!procedure) {\n throw new Error(`Procedure not found: ${path}`);\n }\n\n return executeProcedure(procedure, ctx, input);\n }\n\n /**\n * Get all procedure paths in the router\n */\n getProcedurePaths(): string[] {\n const paths: string[] = [];\n\n function traverse(obj: unknown, prefix: string) {\n if (typeof obj !== 'object' || obj === null) return;\n\n for (const [key, value] of Object.entries(obj)) {\n const path = prefix ? `${prefix}.${key}` : key;\n if (isProcedure(value)) {\n paths.push(path);\n } else {\n traverse(value, path);\n }\n }\n }\n\n traverse(this.definition, '');\n return paths;\n }\n\n /**\n * Check if a path is a query procedure\n */\n isQuery(path: string): boolean {\n const procedure = this.getProcedure(path);\n return procedure?.type === 'query';\n }\n\n /**\n * Check if a path is a mutation procedure\n */\n isMutation(path: string): boolean {\n const procedure = this.getProcedure(path);\n return procedure?.type === 'mutation';\n }\n}\n\n/**\n * Create a router from a definition\n */\nexport function createRouter<\n TContext,\n TRouter extends RouterDefinition<TContext>,\n>(definition: TRouter): Router<TContext, TRouter> {\n return new Router(definition);\n}\n\n/**\n * Merge multiple routers into one\n */\nexport function mergeRouters<TContext>(\n ...routers: Router<TContext, any>[]\n): Router<TContext, RouterDefinition<TContext>> {\n const merged: RouterDefinition<TContext> = {};\n\n for (const router of routers) {\n Object.assign(merged, router.definition);\n }\n\n return new Router(merged);\n}\n","import type { z } from 'zod';\n\nimport { ProcedureBuilder } from './procedure.js';\nimport type { Router } from './router.js';\nimport { createRouter } from './router.js';\nimport type { RouterDefinition } from './types.js';\n\n/**\n * ReactiveBuilder - The main builder returned by initReactive\n */\nexport interface ReactiveBuilder<TContext> {\n /**\n * Create a new procedure builder\n */\n procedure: ProcedureBuilder<TContext>;\n\n /**\n * Create a router from procedure definitions\n */\n router<TRouter extends RouterDefinition<TContext>>(\n definition: TRouter,\n ): Router<TContext, TRouter>;\n}\n\n/**\n * Initialize the reactive system with a context type\n *\n * @example\n * ```ts\n * const t = initReactive<{ userId: string }>();\n *\n * export const appRouter = t.router({\n * todos: {\n * list: t.procedure\n * .input(z.object({ taskListId: z.string() }))\n * .query(({ ctx, input }) => {\n * return ctx.db\n * .query(TodoTable)\n * .filter((q) => q.eq(TodoTable.field.taskListId, input.taskListId))\n * .take(50);\n * }),\n * }\n * });\n * ```\n */\nexport function initReactive<\n TContext = Record<string, unknown>,\n>(): ReactiveBuilder<TContext> {\n return {\n procedure: new ProcedureBuilder<TContext>(),\n\n router<TRouter extends RouterDefinition<TContext>>(\n definition: TRouter,\n ): Router<TContext, TRouter> {\n return createRouter(definition);\n },\n };\n}\n\n/**\n * Type helper to infer the router type\n */\nexport type InferRouterType<T> =\n T extends Router<infer TContext, infer TRouter>\n ? { context: TContext; router: TRouter }\n : never;\n\n/**\n * Type helper to get procedure input type\n */\nexport type InferProcedureInput<T> = T extends { inputSchema: infer TSchema }\n ? TSchema extends z.ZodType\n ? z.infer<TSchema>\n : undefined\n : undefined;\n\n/**\n * Type helper to get procedure output type\n */\nexport type InferProcedureOutput<T> = T extends {\n resolver: (...args: any) => infer TOutput;\n}\n ? Awaited<TOutput>\n : unknown;\n","import type { FilterCondition, TrackedQueryOperation } from './types.js';\n\n/**\n * PartiQL statement with parameters\n */\nexport interface PartiQLStatement {\n statement: string;\n parameters: unknown[];\n}\n\n/**\n * Converts a filter condition to PartiQL WHERE clause\n */\nfunction conditionToPartiQL(\n condition: FilterCondition,\n parameters: unknown[],\n): string {\n switch (condition.type) {\n case 'comparison': {\n parameters.push(condition.value);\n return `\"${condition.field}\" ${condition.operator} ?`;\n }\n\n case 'function': {\n if (condition.operator === 'BETWEEN') {\n parameters.push(condition.value);\n parameters.push(condition.value2);\n return `\"${condition.field}\" BETWEEN ? AND ?`;\n }\n\n if (condition.operator === 'begins_with') {\n parameters.push(condition.value);\n return `begins_with(\"${condition.field}\", ?)`;\n }\n\n if (condition.operator === 'contains') {\n parameters.push(condition.value);\n return `contains(\"${condition.field}\", ?)`;\n }\n\n throw new Error(`Unknown function operator: ${condition.operator}`);\n }\n\n case 'logical': {\n if (!condition.conditions || condition.conditions.length === 0) {\n throw new Error(\n 'Logical condition requires at least one sub-condition',\n );\n }\n\n if (condition.operator === 'NOT') {\n const subClause = conditionToPartiQL(\n condition.conditions[0],\n parameters,\n );\n return `NOT (${subClause})`;\n }\n\n const subClauses = condition.conditions.map((c) =>\n conditionToPartiQL(c, parameters),\n );\n return `(${subClauses.join(` ${condition.operator} `)})`;\n }\n\n default:\n throw new Error(`Unknown condition type: ${condition.type}`);\n }\n}\n\n/**\n * Build a PartiQL SELECT statement from a query operation\n */\nexport function buildSelectStatement(\n operation: TrackedQueryOperation,\n): PartiQLStatement {\n const parameters: unknown[] = [];\n let statement = `SELECT * FROM \"${operation.tableName}\"`;\n\n // Add index hint if using a GSI\n if (operation.indexName) {\n statement += `.\"${operation.indexName}\"`;\n }\n\n // Add WHERE clause if there are filters\n if (operation.filters.length > 0) {\n const whereClauses = operation.filters.map((f) =>\n conditionToPartiQL(f, parameters),\n );\n statement += ` WHERE ${whereClauses.join(' AND ')}`;\n }\n\n return { statement, parameters };\n}\n\n/**\n * Build a PartiQL INSERT statement\n */\nexport function buildInsertStatement(\n tableName: string,\n item: Record<string, unknown>,\n): PartiQLStatement {\n const parameters: unknown[] = [item];\n const statement = `INSERT INTO \"${tableName}\" VALUE ?`;\n return { statement, parameters };\n}\n\n/**\n * Build a PartiQL UPDATE statement\n */\nexport function buildUpdateStatement(\n tableName: string,\n key: Record<string, unknown>,\n updates: Record<string, unknown>,\n): PartiQLStatement {\n const parameters: unknown[] = [];\n const setClauses: string[] = [];\n\n for (const [field, value] of Object.entries(updates)) {\n // Skip key fields\n if (field in key) continue;\n setClauses.push(`\"${field}\" = ?`);\n parameters.push(value);\n }\n\n if (setClauses.length === 0) {\n throw new Error('No fields to update');\n }\n\n let statement = `UPDATE \"${tableName}\" SET ${setClauses.join(', ')}`;\n\n // Add WHERE clause for the key\n const whereClauses = Object.entries(key).map(([field, value]) => {\n parameters.push(value);\n return `\"${field}\" = ?`;\n });\n statement += ` WHERE ${whereClauses.join(' AND ')}`;\n\n return { statement, parameters };\n}\n\n/**\n * Build a PartiQL DELETE statement\n */\nexport function buildDeleteStatement(\n tableName: string,\n key: Record<string, unknown>,\n): PartiQLStatement {\n const parameters: unknown[] = [];\n const whereClauses = Object.entries(key).map(([field, value]) => {\n parameters.push(value);\n return `\"${field}\" = ?`;\n });\n\n const statement = `DELETE FROM \"${tableName}\" WHERE ${whereClauses.join(' AND ')}`;\n return { statement, parameters };\n}\n\n/**\n * Build a PartiQL GET statement (for single item by key)\n */\nexport function buildGetStatement(\n tableName: string,\n key: Record<string, unknown>,\n): PartiQLStatement {\n const parameters: unknown[] = [];\n const whereClauses = Object.entries(key).map(([field, value]) => {\n parameters.push(value);\n return `\"${field}\" = ?`;\n });\n\n const statement = `SELECT * FROM \"${tableName}\" WHERE ${whereClauses.join(' AND ')}`;\n return { statement, parameters };\n}\n","import type { FieldRef } from '@dynamodb-reactive/core';\n\nimport type {\n AnyDynamoTable,\n FilterBuilder,\n FilterCondition,\n QueryBuilder,\n TableItem,\n TableKeyInput,\n TrackedQueryOperation,\n} from './types.js';\n\n/**\n * Creates a filter condition\n */\nfunction createCondition(\n type: FilterCondition['type'],\n operator: string,\n field?: string,\n value?: unknown,\n value2?: unknown,\n): FilterCondition {\n return { type, operator, field, value, value2 };\n}\n\n/**\n * Implementation of FilterBuilder\n */\nclass FilterBuilderImpl<\n TTable extends AnyDynamoTable,\n> implements FilterBuilder<TTable> {\n eq<K extends keyof TableItem<TTable>>(\n field: FieldRef<K & string, TableItem<TTable>[K]>,\n value: TableItem<TTable>[K],\n ): FilterCondition {\n return createCondition('comparison', '=', field.fieldName, value);\n }\n\n ne<K extends keyof TableItem<TTable>>(\n field: FieldRef<K & string, TableItem<TTable>[K]>,\n value: TableItem<TTable>[K],\n ): FilterCondition {\n return createCondition('comparison', '<>', field.fieldName, value);\n }\n\n gt<K extends keyof TableItem<TTable>>(\n field: FieldRef<K & string, TableItem<TTable>[K]>,\n value: TableItem<TTable>[K],\n ): FilterCondition {\n return createCondition('comparison', '>', field.fieldName, value);\n }\n\n gte<K extends keyof TableItem<TTable>>(\n field: FieldRef<K & string, TableItem<TTable>[K]>,\n value: TableItem<TTable>[K],\n ): FilterCondition {\n return createCondition('comparison', '>=', field.fieldName, value);\n }\n\n lt<K extends keyof TableItem<TTable>>(\n field: FieldRef<K & string, TableItem<TTable>[K]>,\n value: TableItem<TTable>[K],\n ): FilterCondition {\n return createCondition('comparison', '<', field.fieldName, value);\n }\n\n lte<K extends keyof TableItem<TTable>>(\n field: FieldRef<K & string, TableItem<TTable>[K]>,\n value: TableItem<TTable>[K],\n ): FilterCondition {\n return createCondition('comparison', '<=', field.fieldName, value);\n }\n\n between<K extends keyof TableItem<TTable>>(\n field: FieldRef<K & string, TableItem<TTable>[K]>,\n lower: TableItem<TTable>[K],\n upper: TableItem<TTable>[K],\n ): FilterCondition {\n return createCondition(\n 'function',\n 'BETWEEN',\n field.fieldName,\n lower,\n upper,\n );\n }\n\n beginsWith<K extends keyof TableItem<TTable>>(\n field: FieldRef<K & string, string>,\n prefix: string,\n ): FilterCondition {\n return createCondition('function', 'begins_with', field.fieldName, prefix);\n }\n\n contains<K extends keyof TableItem<TTable>>(\n field: FieldRef<K & string, string>,\n substring: string,\n ): FilterCondition {\n return createCondition('function', 'contains', field.fieldName, substring);\n }\n\n and(...conditions: FilterCondition[]): FilterCondition {\n return { type: 'logical', operator: 'AND', conditions };\n }\n\n or(...conditions: FilterCondition[]): FilterCondition {\n return { type: 'logical', operator: 'OR', conditions };\n }\n\n not(condition: FilterCondition): FilterCondition {\n return { type: 'logical', operator: 'NOT', conditions: [condition] };\n }\n}\n\n/**\n * Query execution function type\n */\ntype QueryExecutor<TTable extends AnyDynamoTable> = (\n operation: TrackedQueryOperation,\n options: QueryOptions,\n) => Promise<TableItem<TTable>[]>;\n\n/**\n * Query options\n */\ninterface QueryOptions {\n limit?: number;\n startKey?: Record<string, unknown>;\n ascending: boolean;\n}\n\n/**\n * Implementation of QueryBuilder\n */\nexport class QueryBuilderImpl<\n TTable extends AnyDynamoTable,\n> implements QueryBuilder<TTable> {\n private table: TTable;\n private filters: FilterCondition[] = [];\n private indexName?: string;\n private limit?: number;\n private startKey?: TableKeyInput<TTable>;\n private ascending: boolean = true;\n private executor: QueryExecutor<TTable>;\n private operationTracker?: (op: TrackedQueryOperation) => void;\n\n constructor(\n table: TTable,\n executor: QueryExecutor<TTable>,\n operationTracker?: (op: TrackedQueryOperation) => void,\n ) {\n this.table = table;\n this.executor = executor;\n this.operationTracker = operationTracker;\n }\n\n filter(\n fn: (q: FilterBuilder<TTable>) => FilterCondition,\n ): QueryBuilder<TTable> {\n const builder = new FilterBuilderImpl<TTable>();\n const condition = fn(builder);\n this.filters.push(condition);\n return this;\n }\n\n useIndex(indexName: string): QueryBuilder<TTable> {\n this.indexName = indexName;\n return this;\n }\n\n take(limit: number): QueryBuilder<TTable> {\n this.limit = limit;\n return this;\n }\n\n startFrom(key: TableKeyInput<TTable>): QueryBuilder<TTable> {\n this.startKey = key;\n return this;\n }\n\n sortAscending(): QueryBuilder<TTable> {\n this.ascending = true;\n return this;\n }\n\n sortDescending(): QueryBuilder<TTable> {\n this.ascending = false;\n return this;\n }\n\n async execute(): Promise<TableItem<TTable>[]> {\n const operation: TrackedQueryOperation = {\n tableName: this.table.tableName,\n filters: this.filters,\n indexName: this.indexName,\n pkField: this.table.pk,\n skField: this.table.sk,\n sortField: this.table.sk, // Default sort by SK if available\n sortOrder: this.ascending ? 'asc' : 'desc',\n limit: this.limit,\n };\n\n // Track the operation for dependency extraction\n if (this.operationTracker) {\n this.operationTracker(operation);\n }\n\n const options: QueryOptions = {\n limit: this.limit,\n startKey: this.startKey as Record<string, unknown>,\n ascending: this.ascending,\n };\n\n return this.executor(operation, options);\n }\n\n /**\n * Get the current operation without executing\n * Used for dependency extraction\n */\n getOperation(): TrackedQueryOperation {\n return {\n tableName: this.table.tableName,\n filters: this.filters,\n indexName: this.indexName,\n pkField: this.table.pk,\n skField: this.table.sk,\n sortField: this.table.sk,\n sortOrder: this.ascending ? 'asc' : 'desc',\n limit: this.limit,\n };\n }\n}\n\n/**\n * Create a filter builder instance\n */\nexport function createFilterBuilder<\n TTable extends AnyDynamoTable,\n>(): FilterBuilder<TTable> {\n return new FilterBuilderImpl<TTable>();\n}\n","import {\n type AttributeValue,\n DynamoDBClient,\n ExecuteStatementCommand,\n} from '@aws-sdk/client-dynamodb';\nimport {\n DeleteCommand,\n DynamoDBDocumentClient,\n GetCommand,\n PutCommand,\n UpdateCommand,\n} from '@aws-sdk/lib-dynamodb';\nimport { unmarshall } from '@aws-sdk/util-dynamodb';\n\nimport type { DependencyTracker } from './dependency-extractor.js';\nimport {\n buildSelectStatement,\n type PartiQLStatement,\n} from './partiql-builder.js';\nimport { QueryBuilderImpl } from './query-builder.js';\nimport type {\n AnyDynamoTable,\n DatabaseContext,\n TableItem,\n TableKeyInput,\n TrackedQueryOperation,\n} from './types.js';\n\n/**\n * Configuration for creating a database context\n */\nexport interface DbContextConfig {\n client?: DynamoDBClient;\n region?: string;\n endpoint?: string;\n}\n\n/**\n * Create a DynamoDB Document client\n */\nfunction createDocClient(config: DbContextConfig): DynamoDBDocumentClient {\n const client =\n config.client ??\n new DynamoDBClient({\n region: config.region ?? process.env.AWS_REGION ?? 'us-east-1',\n endpoint: config.endpoint,\n });\n\n return DynamoDBDocumentClient.from(client, {\n marshallOptions: {\n removeUndefinedValues: true,\n convertEmptyValues: false,\n },\n unmarshallOptions: {\n wrapNumbers: false,\n },\n });\n}\n\n/**\n * Convert a JavaScript value to a DynamoDB AttributeValue\n */\nfunction toAttributeValue(value: unknown): AttributeValue {\n if (typeof value === 'string') return { S: value };\n if (typeof value === 'number') return { N: String(value) };\n if (typeof value === 'boolean') return { BOOL: value };\n if (value === null || value === undefined) return { NULL: true };\n if (Array.isArray(value)) {\n return { L: value.map(toAttributeValue) };\n }\n if (typeof value === 'object') {\n const m: Record<string, AttributeValue> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n m[k] = toAttributeValue(v);\n }\n return { M: m };\n }\n return { S: String(value) };\n}\n\n/**\n * Execute a PartiQL statement\n */\nasync function executePartiQL(\n docClient: DynamoDBDocumentClient,\n statement: PartiQLStatement,\n): Promise<Record<string, unknown>[]> {\n const command = new ExecuteStatementCommand({\n Statement: statement.statement,\n Parameters: statement.parameters.map(toAttributeValue),\n });\n\n const response = await docClient.send(command);\n // Unmarshall the DynamoDB AttributeValue format to plain JavaScript objects\n return (response.Items ?? []).map((item) =>\n unmarshall(item as Record<string, AttributeValue>),\n );\n}\n\n/**\n * Creates a database context for procedure execution\n */\nexport function createDbContext(\n config: DbContextConfig,\n dependencyTracker?: DependencyTracker,\n): DatabaseContext {\n const docClient = createDocClient(config);\n\n /**\n * Execute a query operation\n */\n async function executeQuery<TTable extends AnyDynamoTable>(\n operation: TrackedQueryOperation,\n options: {\n limit?: number;\n startKey?: Record<string, unknown>;\n ascending: boolean;\n },\n ): Promise<TableItem<TTable>[]> {\n const statement = buildSelectStatement(operation);\n\n const items = await executePartiQL(docClient, statement);\n\n // Apply limit client-side if needed (PartiQL doesn't support LIMIT directly)\n if (options.limit && items.length > options.limit) {\n return items.slice(0, options.limit) as TableItem<TTable>[];\n }\n\n return items as TableItem<TTable>[];\n }\n\n return {\n query<TTable extends AnyDynamoTable>(table: TTable) {\n return new QueryBuilderImpl<TTable>(\n table,\n executeQuery,\n dependencyTracker?.track.bind(dependencyTracker),\n );\n },\n\n async get<TItem = never, TTable extends AnyDynamoTable = AnyDynamoTable>(\n table: TTable,\n key: TableKeyInput<TTable>,\n ): Promise<([TItem] extends [never] ? TableItem<TTable> : TItem) | null> {\n const command = new GetCommand({\n TableName: table.tableName,\n Key: key as Record<string, unknown>,\n });\n\n const response = await docClient.send(command);\n return (\n (response.Item as [TItem] extends [never]\n ? TableItem<TTable>\n : TItem) ?? null\n );\n },\n\n async put<TTable extends AnyDynamoTable>(\n table: TTable,\n item: TableItem<TTable>,\n ): Promise<void> {\n // Validate the item against the schema\n table.validate(item);\n\n const command = new PutCommand({\n TableName: table.tableName,\n Item: item as Record<string, unknown>,\n });\n\n await docClient.send(command);\n },\n\n async delete<TTable extends AnyDynamoTable>(\n table: TTable,\n key: TableKeyInput<TTable>,\n ): Promise<void> {\n const command = new DeleteCommand({\n TableName: table.tableName,\n Key: key as Record<string, unknown>,\n });\n\n await docClient.send(command);\n },\n\n async update<TItem = never, TTable extends AnyDynamoTable = AnyDynamoTable>(\n table: TTable,\n key: TableKeyInput<TTable>,\n updates: Partial<[TItem] extends [never] ? TableItem<TTable> : TItem>,\n ): Promise<[TItem] extends [never] ? TableItem<TTable> : TItem> {\n type ResultType = [TItem] extends [never] ? TableItem<TTable> : TItem;\n\n const updateExpressions: string[] = [];\n const expressionAttributeNames: Record<string, string> = {};\n const expressionAttributeValues: Record<string, unknown> = {};\n\n let i = 0;\n for (const [field, value] of Object.entries(updates)) {\n if (field in (key as Record<string, unknown>)) continue;\n\n const nameKey = `#f${i}`;\n const valueKey = `:v${i}`;\n\n updateExpressions.push(`${nameKey} = ${valueKey}`);\n expressionAttributeNames[nameKey] = field;\n expressionAttributeValues[valueKey] = value;\n i++;\n }\n\n if (updateExpressions.length === 0) {\n // No updates, just return the current item\n const current = await this.get<TItem, TTable>(table, key);\n if (!current) {\n throw new Error('Item not found');\n }\n return current as ResultType;\n }\n\n const command = new UpdateCommand({\n TableName: table.tableName,\n Key: key as Record<string, unknown>,\n UpdateExpression: `SET ${updateExpressions.join(', ')}`,\n ExpressionAttributeNames: expressionAttributeNames,\n ExpressionAttributeValues: expressionAttributeValues,\n ReturnValues: 'ALL_NEW',\n });\n\n const response = await docClient.send(command);\n return response.Attributes as ResultType;\n },\n };\n}\n","import type { QueryMetadata } from '@dynamodb-reactive/core';\n\nimport type {\n FilterCondition,\n QueryDependency,\n TrackedQueryOperation,\n} from './types.js';\n\n/**\n * Extracts dependencies from a filter condition\n */\nfunction extractFromCondition(\n tableName: string,\n condition: FilterCondition,\n indexName?: string,\n): QueryDependency[] {\n const dependencies: QueryDependency[] = [];\n\n switch (condition.type) {\n case 'comparison': {\n // Only extract equality conditions as dependencies\n // These are the ones we can efficiently track\n if (\n condition.operator === '=' &&\n condition.field &&\n condition.value !== undefined\n ) {\n dependencies.push({\n tableName,\n fieldName: condition.field,\n fieldValue: String(condition.value),\n indexName,\n });\n }\n break;\n }\n\n case 'function': {\n // For begins_with, we can track the prefix as a dependency\n if (\n condition.operator === 'begins_with' &&\n condition.field &&\n condition.value\n ) {\n dependencies.push({\n tableName,\n fieldName: condition.field,\n fieldValue: `prefix:${String(condition.value)}`,\n indexName,\n });\n }\n break;\n }\n\n case 'logical': {\n // Recursively extract from logical conditions\n if (condition.conditions) {\n for (const subCondition of condition.conditions) {\n dependencies.push(\n ...extractFromCondition(tableName, subCondition, indexName),\n );\n }\n }\n break;\n }\n }\n\n return dependencies;\n}\n\n/**\n * Extract dependencies from a tracked query operation\n */\nexport function extractDependencies(\n operation: TrackedQueryOperation,\n): QueryDependency[] {\n const dependencies: QueryDependency[] = [];\n\n for (const filter of operation.filters) {\n dependencies.push(\n ...extractFromCondition(operation.tableName, filter, operation.indexName),\n );\n }\n\n return dependencies;\n}\n\n/**\n * Create a dependency key for the inverted index\n * Format: \"TableName#FieldName#FieldValue\"\n */\nexport function createDependencyKey(dependency: QueryDependency): string {\n return `${dependency.tableName}#${dependency.fieldName}#${dependency.fieldValue}`;\n}\n\n/**\n * Parse a dependency key back into its components\n */\nexport function parseDependencyKey(key: string): QueryDependency | null {\n const parts = key.split('#');\n if (parts.length < 3) return null;\n\n return {\n tableName: parts[0],\n fieldName: parts[1],\n fieldValue: parts.slice(2).join('#'), // Handle values that contain #\n };\n}\n\n/**\n * Extract affected dependency keys from a DynamoDB stream record\n * This finds all keys that might be affected by a change\n */\nexport function extractAffectedKeys(\n tableName: string,\n item: Record<string, unknown>,\n): string[] {\n const keys: string[] = [];\n\n for (const [fieldName, fieldValue] of Object.entries(item)) {\n if (fieldValue !== null && fieldValue !== undefined) {\n // Add exact match key\n keys.push(`${tableName}#${fieldName}#${String(fieldValue)}`);\n\n // Add prefix keys for string values (for begins_with queries)\n if (typeof fieldValue === 'string') {\n for (let i = 1; i <= fieldValue.length; i++) {\n keys.push(\n `${tableName}#${fieldName}#prefix:${fieldValue.substring(0, i)}`,\n );\n }\n }\n }\n }\n\n return keys;\n}\n\n/**\n * Convert a TrackedQueryOperation to QueryMetadata for storage.\n * Normalizes filter operators for evaluation.\n */\nexport function operationToQueryMetadata(\n operation: TrackedQueryOperation,\n): QueryMetadata {\n // Normalize operators to what the filter evaluator expects\n const normalizeFilters = (filters: FilterCondition[]): FilterCondition[] => {\n return filters.map((f) => normalizeFilter(f));\n };\n\n const normalizeFilter = (filter: FilterCondition): FilterCondition => {\n if (filter.type === 'comparison') {\n // Normalize operators: '=' -> 'eq', '<>' -> 'ne', etc.\n const operatorMap: Record<string, string> = {\n '=': 'eq',\n '<>': 'ne',\n '>': 'gt',\n '>=': 'gte',\n '<': 'lt',\n '<=': 'lte',\n };\n return {\n ...filter,\n operator: operatorMap[filter.operator ?? ''] ?? filter.operator,\n };\n }\n if (filter.type === 'function') {\n // Normalize function names\n const operatorMap: Record<string, string> = {\n begins_with: 'beginsWith',\n BETWEEN: 'between',\n };\n return {\n ...filter,\n operator: operatorMap[filter.operator ?? ''] ?? filter.operator,\n };\n }\n if (filter.type === 'logical' && filter.conditions) {\n // Normalize operators: 'AND' -> 'and', etc.\n const operatorMap: Record<string, string> = {\n AND: 'and',\n OR: 'or',\n NOT: 'not',\n };\n return {\n ...filter,\n operator: operatorMap[filter.operator ?? ''] ?? filter.operator,\n conditions: normalizeFilters(filter.conditions),\n };\n }\n return filter;\n };\n\n return {\n tableName: operation.tableName,\n indexName: operation.indexName,\n filterConditions: normalizeFilters(operation.filters),\n sortField: operation.sortField,\n sortOrder: operation.sortOrder,\n limit: operation.limit,\n };\n}\n\n/**\n * DependencyTracker - Tracks query operations during procedure execution\n */\nexport class DependencyTracker {\n private operations: TrackedQueryOperation[] = [];\n\n /**\n * Track a query operation\n */\n track(operation: TrackedQueryOperation): void {\n this.operations.push(operation);\n }\n\n /**\n * Get all tracked operations\n */\n getOperations(): TrackedQueryOperation[] {\n return [...this.operations];\n }\n\n /**\n * Extract all dependencies from tracked operations\n */\n extractAll(): QueryDependency[] {\n const dependencies: QueryDependency[] = [];\n\n for (const operation of this.operations) {\n dependencies.push(...extractDependencies(operation));\n }\n\n return dependencies;\n }\n\n /**\n * Get all dependency keys for the inverted index\n */\n getDependencyKeys(): string[] {\n return this.extractAll().map(createDependencyKey);\n }\n\n /**\n * Get query metadata for the first tracked operation.\n * Used for storing subscription state.\n */\n getQueryMetadata(): QueryMetadata | null {\n if (this.operations.length === 0) return null;\n // For now, we only support single-query subscriptions\n return operationToQueryMetadata(this.operations[0]);\n }\n\n /**\n * Get the primary key field from the first operation\n */\n getPkField(): string | null {\n if (this.operations.length === 0) return null;\n return this.operations[0].pkField;\n }\n\n /**\n * Get the sort key field from the first operation\n */\n getSkField(): string | undefined {\n if (this.operations.length === 0) return undefined;\n return this.operations[0].skField;\n }\n\n /**\n * Clear tracked operations\n */\n clear(): void {\n this.operations = [];\n }\n}\n","import type { JsonPatch } from '@dynamodb-reactive/core';\nimport jsonpatch, { type Operation } from 'fast-json-patch';\n\nconst { applyPatch, compare } = jsonpatch;\n\n/**\n * Generate JSON patches between two objects\n * Uses RFC 6902 JSON Patch format\n */\nexport function generatePatches(\n oldValue: unknown,\n newValue: unknown,\n): JsonPatch[] {\n const operations = compare(\n oldValue as Record<string, unknown>,\n newValue as Record<string, unknown>,\n );\n\n return operations.map((op) => ({\n op: op.op as JsonPatch['op'],\n path: op.path,\n value: 'value' in op ? op.value : undefined,\n from: 'from' in op ? op.from : undefined,\n }));\n}\n\n/**\n * Apply JSON patches to an object\n * Returns the patched result\n */\nexport function applyPatches<T>(document: T, patches: JsonPatch[]): T {\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 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}\n\n/**\n * Check if there are any changes between two values\n */\nexport function hasChanges(oldValue: unknown, newValue: unknown): boolean {\n const patches = generatePatches(oldValue, newValue);\n return patches.length > 0;\n}\n\n/**\n * Create a minimal patch that only includes necessary operations\n * Optimizes the patch by removing redundant operations\n */\nexport function optimizePatches(patches: JsonPatch[]): JsonPatch[] {\n // Filter out test operations and redundant operations\n const seen = new Set<string>();\n const optimized: JsonPatch[] = [];\n\n // Process patches in reverse to keep only the last operation for each path\n for (let i = patches.length - 1; i >= 0; i--) {\n const patch = patches[i];\n if (!seen.has(patch.path)) {\n seen.add(patch.path);\n optimized.unshift(patch);\n }\n }\n\n return optimized;\n}\n\n/**\n * Batch multiple patch sets into a single set\n */\nexport function batchPatches(patchSets: JsonPatch[][]): JsonPatch[] {\n const allPatches = patchSets.flat();\n return optimizePatches(allPatches);\n}\n","import { DynamoDBClient } from '@aws-sdk/client-dynamodb';\nimport {\n DeleteCommand,\n DynamoDBDocumentClient,\n GetCommand,\n PutCommand,\n} from '@aws-sdk/lib-dynamodb';\nimport type { ConnectionEntry, QueryEntry } from '@dynamodb-reactive/core';\nimport { SystemTableNames } from '@dynamodb-reactive/core';\n\nimport { createDbContext, type DbContextConfig } from '../db-context.js';\nimport { DependencyTracker } from '../dependency-extractor.js';\nimport type { Router } from '../router.js';\nimport type {\n DatabaseContext,\n RouterCaller,\n RouterDefinition,\n} from '../types.js';\n\n/**\n * Request types for the reactive handler.\n * All requests include connectionId from the WebSocket connection.\n */\nexport interface SubscribeRequest {\n type: 'subscribe';\n connectionId: string;\n subscriptionId: string;\n path: string;\n input: unknown;\n}\n\nexport interface UnsubscribeRequest {\n type: 'unsubscribe';\n connectionId: string;\n subscriptionId: string;\n}\n\nexport interface CallRequest {\n type: 'call';\n connectionId: string;\n path: string;\n input: unknown;\n}\n\nexport type ReactiveRequest =\n | SubscribeRequest\n | UnsubscribeRequest\n | CallRequest;\n\n/**\n * Response types for the reactive handler\n */\nexport interface SnapshotResponse {\n type: 'snapshot';\n subscriptionId: string;\n data: unknown;\n}\n\nexport interface PatchResponse {\n type: 'patch';\n subscriptionId: string;\n patches: unknown[];\n}\n\nexport interface ResultResponse {\n type: 'result';\n data: unknown;\n}\n\nexport interface ErrorResponse {\n type: 'error';\n message: string;\n /** HTTP status code (e.g., 400, 403, 404, 500) */\n code?: number;\n subscriptionId?: string;\n}\n\nexport type ReactiveResponse =\n | SnapshotResponse\n | PatchResponse\n | ResultResponse\n | ErrorResponse;\n\n/**\n * Request info passed to getContext for extracting user context\n */\nexport interface RequestInfo {\n connectionId: string;\n /** Headers from the HTTP request (for auth, user info, etc.) */\n headers?: Record<string, string>;\n}\n\n/**\n * Configuration for the reactive handler\n */\nexport interface ReactiveHandlerConfig<\n TContext,\n TRouter extends RouterDefinition<TContext> = RouterDefinition<TContext>,\n> {\n router: Router<TContext, TRouter>;\n dbConfig?: DbContextConfig;\n getContext: (requestInfo: RequestInfo) => Promise<TContext>;\n ttlSeconds?: number;\n /** Prefix for system table names (e.g., 'TodoApp' creates 'TodoApp-ReactiveConnections') */\n tablePrefix?: string;\n}\n\n/**\n * Create a reactive handler for Next.js API routes or other HTTP servers.\n * This handler is used for subscribe/call requests and stores queryMetadata\n * for the stream handler to use later.\n */\nexport function createReactiveHandler<\n TContext,\n TRouter extends RouterDefinition<TContext>,\n>(config: ReactiveHandlerConfig<TContext, TRouter>) {\n const ttlSeconds = config.ttlSeconds ?? 3600; // 1 hour default\n // Add dash after prefix like CDK does\n const prefix = config.tablePrefix ? `${config.tablePrefix}-` : '';\n const connectionsTable = `${prefix}${SystemTableNames.connections}`;\n const dependenciesTable = `${prefix}${SystemTableNames.dependencies}`;\n const queriesTable = `${prefix}${SystemTableNames.queries}`;\n\n // Create DynamoDB client\n const ddbClient = new DynamoDBClient({\n region: config.dbConfig?.region ?? process.env.AWS_REGION,\n });\n const docClient = DynamoDBDocumentClient.from(ddbClient, {\n marshallOptions: { removeUndefinedValues: true },\n });\n\n /**\n * Handle an incoming request.\n * The connectionId is now included in the request body from the client.\n * @param request The reactive request from the client\n * @param headers Optional HTTP headers for auth/user context\n */\n async function handleRequest(\n request: ReactiveRequest,\n headers?: Record<string, string>,\n ): Promise<ReactiveResponse> {\n try {\n const connectionId = request.connectionId;\n const ctx = await config.getContext({ connectionId, headers });\n const dependencyTracker = new DependencyTracker();\n const db = createDbContext(config.dbConfig ?? {}, dependencyTracker);\n const fullCtx = { ...ctx, db } as TContext & { db: DatabaseContext };\n\n switch (request.type) {\n case 'subscribe':\n return await handleSubscribe(\n connectionId,\n request,\n fullCtx,\n dependencyTracker,\n );\n\n case 'unsubscribe':\n return await handleUnsubscribe(connectionId, request);\n\n case 'call':\n return await handleCall(request, fullCtx);\n\n default:\n return {\n type: 'error',\n message: `Unknown request type: ${(request as { type: string }).type}`,\n };\n }\n } catch (error) {\n return {\n type: 'error',\n message: error instanceof Error ? error.message : 'Unknown error',\n code: (error as { code?: number }).code,\n subscriptionId:\n 'subscriptionId' in request ? request.subscriptionId : undefined,\n };\n }\n }\n\n /**\n * Handle a subscribe request.\n * Executes the query, stores queryMetadata for stream handler, returns initial data.\n */\n async function handleSubscribe(\n connectionId: string,\n request: SubscribeRequest,\n ctx: TContext & { db: DatabaseContext },\n dependencyTracker: DependencyTracker,\n ): Promise<ReactiveResponse> {\n // Execute the query to get initial data\n const result = await config.router.execute(\n request.path,\n ctx,\n request.input,\n );\n\n // Get query metadata and dependencies\n const queryMetadata = dependencyTracker.getQueryMetadata();\n const dependencyKeys = dependencyTracker.getDependencyKeys();\n\n if (!queryMetadata) {\n console.warn('No query metadata captured for subscription');\n }\n\n const now = Date.now();\n const ttl = Math.floor(now / 1000) + ttlSeconds;\n\n // Store the subscription with queryMetadata\n const queryEntry: QueryEntry = {\n pk: connectionId,\n sk: request.subscriptionId,\n connectionId,\n subscriptionId: request.subscriptionId,\n queryMetadata: queryMetadata ?? {\n tableName: '',\n filterConditions: [],\n },\n lastResult: Array.isArray(result) ? result : [result],\n dependencies: dependencyKeys,\n createdAt: now,\n updatedAt: now,\n ttl,\n };\n\n await docClient.send(\n new PutCommand({\n TableName: queriesTable,\n Item: queryEntry,\n }),\n );\n\n // Store dependency entries (inverted index)\n for (const key of dependencyKeys) {\n await docClient.send(\n new PutCommand({\n TableName: dependenciesTable,\n Item: {\n pk: key,\n sk: `${connectionId}#${request.subscriptionId}`,\n connectionId,\n subscriptionId: request.subscriptionId,\n ttl,\n },\n }),\n );\n }\n\n console.log('Subscription created:', {\n connectionId,\n subscriptionId: request.subscriptionId,\n queryMetadata: queryMetadata?.tableName,\n dependencies: dependencyKeys,\n });\n\n return {\n type: 'snapshot',\n subscriptionId: request.subscriptionId,\n data: result,\n };\n }\n\n /**\n * Handle an unsubscribe request\n */\n async function handleUnsubscribe(\n connectionId: string,\n request: UnsubscribeRequest,\n ): Promise<ReactiveResponse> {\n // Get the subscription to find its dependencies\n const subResponse = await docClient.send(\n new GetCommand({\n TableName: queriesTable,\n Key: { pk: connectionId, sk: request.subscriptionId },\n }),\n );\n\n if (subResponse.Item) {\n const queryEntry = subResponse.Item as QueryEntry;\n\n // Delete dependency entries\n for (const key of queryEntry.dependencies ?? []) {\n await docClient.send(\n new DeleteCommand({\n TableName: dependenciesTable,\n Key: { pk: key, sk: `${connectionId}#${request.subscriptionId}` },\n }),\n );\n }\n }\n\n // Delete the subscription\n await docClient.send(\n new DeleteCommand({\n TableName: queriesTable,\n Key: { pk: connectionId, sk: request.subscriptionId },\n }),\n );\n\n console.log('Subscription removed:', {\n connectionId,\n subscriptionId: request.subscriptionId,\n });\n\n return {\n type: 'result',\n data: { success: true },\n };\n }\n\n /**\n * Handle a call (mutation) request\n */\n async function handleCall(\n request: CallRequest,\n ctx: TContext & { db: DatabaseContext },\n ): Promise<ReactiveResponse> {\n const result = await config.router.execute(\n request.path,\n ctx,\n request.input,\n );\n\n return {\n type: 'result',\n data: result,\n };\n }\n\n /**\n * Register a new connection\n */\n async function registerConnection(\n connectionId: string,\n context?: Record<string, unknown>,\n ): Promise<void> {\n const now = Date.now();\n const ttl = Math.floor(now / 1000) + ttlSeconds;\n\n const connectionEntry: ConnectionEntry = {\n connectionId,\n context,\n connectedAt: now,\n ttl,\n };\n\n await docClient.send(\n new PutCommand({\n TableName: connectionsTable,\n Item: connectionEntry,\n }),\n );\n\n console.log('Connection registered:', connectionEntry);\n }\n\n /**\n * Unregister a connection and clean up subscriptions\n */\n async function unregisterConnection(connectionId: string): Promise<void> {\n // Delete the connection\n await docClient.send(\n new DeleteCommand({\n TableName: connectionsTable,\n Key: { connectionId },\n }),\n );\n\n // TODO: Clean up all subscriptions for this connection\n\n console.log('Connection unregistered:', connectionId);\n }\n\n /**\n * Execute a query without creating a subscription.\n * Useful for SSR or one-time data fetches.\n */\n async function query<T = unknown>(\n path: string,\n input?: unknown,\n headers?: Record<string, string>,\n ): Promise<T> {\n const ctx = await config.getContext({ connectionId: 'query', headers });\n const dependencyTracker = new DependencyTracker();\n const db = createDbContext(config.dbConfig ?? {}, dependencyTracker);\n const fullCtx = { ...ctx, db } as TContext & { db: DatabaseContext };\n\n return config.router.execute(path, fullCtx, input) as Promise<T>;\n }\n\n /**\n * Create a type-safe caller for server-side procedure execution.\n * Provides full type inference for procedure inputs and outputs.\n *\n * @example\n * ```ts\n * const caller = handler.createCaller();\n * const todos = await caller.todos.list({}); // Type-safe!\n * ```\n */\n function createCaller(): RouterCaller<TRouter> {\n function buildProxy(path: string[] = []): unknown {\n return new Proxy(() => {}, {\n get(_target, prop: string) {\n return buildProxy([...path, prop]);\n },\n apply(_target, _thisArg, args: unknown[]) {\n const procedurePath = path.join('.');\n return query(procedurePath, args[0]);\n },\n });\n }\n\n return buildProxy() as RouterCaller<TRouter>;\n }\n\n return {\n handleRequest,\n registerConnection,\n unregisterConnection,\n query,\n createCaller,\n };\n}\n","import {\n ApiGatewayManagementApiClient,\n GoneException,\n PostToConnectionCommand,\n} from '@aws-sdk/client-apigatewaymanagementapi';\nimport {\n type AttributeValue,\n DynamoDBClient,\n ExecuteStatementCommand,\n} from '@aws-sdk/client-dynamodb';\nimport {\n DeleteCommand,\n DynamoDBDocumentClient,\n GetCommand,\n QueryCommand,\n} from '@aws-sdk/lib-dynamodb';\nimport { unmarshall } from '@aws-sdk/util-dynamodb';\nimport type {\n FilterCondition,\n JsonPatch,\n QueryEntry,\n QueryMetadata,\n} from '@dynamodb-reactive/core';\nimport { SystemTableNames } from '@dynamodb-reactive/core';\nimport type { DynamoDBRecord, DynamoDBStreamEvent } from 'aws-lambda';\n\nimport type { DbContextConfig } from '../db-context.js';\nimport { extractAffectedKeys } from '../dependency-extractor.js';\nimport { generatePatches, hasChanges } from '../patcher.js';\n\n/**\n * Configuration for the stream handler.\n * NOTE: Router is no longer required - stream processing uses stored query metadata.\n */\nexport interface StreamHandlerConfig {\n dbConfig?: DbContextConfig;\n apiGatewayEndpoint: string;\n connectionsTableName?: string;\n dependenciesTableName?: string;\n queriesTableName?: string;\n}\n\n/**\n * Create a DynamoDB stream handler for AWS Lambda.\n * Uses stored query metadata to re-execute queries WITHOUT router code.\n */\nexport function createStreamHandler(config: StreamHandlerConfig) {\n const connectionsTable =\n config.connectionsTableName ?? SystemTableNames.connections;\n const dependenciesTable =\n config.dependenciesTableName ?? SystemTableNames.dependencies;\n const queriesTable = config.queriesTableName ?? SystemTableNames.queries;\n\n // Create DynamoDB client\n const ddbClient = new DynamoDBClient({\n region: config.dbConfig?.region ?? process.env.AWS_REGION,\n });\n const docClient = DynamoDBDocumentClient.from(ddbClient);\n\n // Create API Gateway Management client\n const apiClient = new ApiGatewayManagementApiClient({\n endpoint: config.apiGatewayEndpoint,\n });\n\n /**\n * Main Lambda handler\n */\n async function handler(event: DynamoDBStreamEvent): Promise<void> {\n const affectedSubscriptions = new Map<string, Set<string>>();\n\n // Process each record in the stream\n for (const record of event.Records) {\n if (!record.dynamodb) continue;\n\n const tableName = extractTableName(record);\n if (!tableName) continue;\n\n // Get the new and old images\n const newImage = record.dynamodb.NewImage\n ? unmarshall(record.dynamodb.NewImage as Record<string, AttributeValue>)\n : null;\n const oldImage = record.dynamodb.OldImage\n ? unmarshall(record.dynamodb.OldImage as Record<string, AttributeValue>)\n : null;\n\n // Extract affected dependency keys\n const affectedKeys = new Set<string>();\n if (newImage) {\n for (const key of extractAffectedKeys(tableName, newImage)) {\n affectedKeys.add(key);\n }\n }\n if (oldImage) {\n for (const key of extractAffectedKeys(tableName, oldImage)) {\n affectedKeys.add(key);\n }\n }\n\n // Find subscriptions affected by these keys\n for (const key of affectedKeys) {\n const subscriptions = await findAffectedSubscriptions(key);\n for (const sub of subscriptions) {\n const connId = sub.connectionId;\n const subId = sub.subscriptionId;\n if (!affectedSubscriptions.has(connId)) {\n affectedSubscriptions.set(connId, new Set());\n }\n affectedSubscriptions.get(connId)!.add(subId);\n }\n }\n }\n\n // Process each affected subscription\n const sendPromises: Promise<void>[] = [];\n for (const [connectionId, subscriptionIds] of affectedSubscriptions) {\n for (const subscriptionId of subscriptionIds) {\n sendPromises.push(processSubscription(connectionId, subscriptionId));\n }\n }\n\n await Promise.allSettled(sendPromises);\n }\n\n /**\n * Extract table name from a stream record\n */\n function extractTableName(record: DynamoDBRecord): string | null {\n // The table name is in the eventSourceARN\n const arn = record.eventSourceARN;\n if (!arn) return null;\n\n // ARN format: arn:aws:dynamodb:region:account:table/table-name/stream/...\n const match = arn.match(/table\\/([^/]+)/);\n return match ? match[1] : null;\n }\n\n /**\n * Find subscriptions affected by a dependency key\n */\n async function findAffectedSubscriptions(\n dependencyKey: string,\n ): Promise<{ connectionId: string; subscriptionId: string }[]> {\n try {\n const response = await docClient.send(\n new QueryCommand({\n TableName: dependenciesTable,\n KeyConditionExpression: 'pk = :pk',\n ExpressionAttributeValues: {\n ':pk': dependencyKey,\n },\n }),\n );\n\n return (response.Items ?? []).map((item) => ({\n connectionId: item.connectionId as string,\n subscriptionId: item.subscriptionId as string,\n }));\n } catch (error) {\n console.error('Error finding affected subscriptions:', error);\n return [];\n }\n }\n\n /**\n * Process a single subscription: re-execute query using metadata, diff, and send patch\n */\n async function processSubscription(\n connectionId: string,\n subscriptionId: string,\n ): Promise<void> {\n try {\n // Get the subscription state\n const queryState = await getQueryState(connectionId, subscriptionId);\n if (!queryState) {\n console.warn(\n `Subscription not found: ${connectionId}/${subscriptionId}`,\n );\n return;\n }\n\n // Re-execute the query using stored metadata\n const newResult = await executeQueryFromMetadata(\n queryState.queryMetadata,\n );\n\n // Check if there are changes\n if (!hasChanges(queryState.lastResult, newResult)) {\n return;\n }\n\n // Generate patches\n const patches = generatePatches(queryState.lastResult, newResult);\n\n // Update the stored state\n await updateQueryState(connectionId, subscriptionId, newResult);\n\n // Send the patch to the client\n await sendPatch(connectionId, subscriptionId, patches);\n } catch (error) {\n if (error instanceof GoneException) {\n // Connection is gone, clean up\n await cleanupConnection(connectionId);\n } else {\n console.error(\n `Error processing subscription ${connectionId}/${subscriptionId}:`,\n error,\n );\n }\n }\n }\n\n /**\n * Get the stored query state\n */\n async function getQueryState(\n connectionId: string,\n subscriptionId: string,\n ): Promise<QueryEntry | null> {\n try {\n const response = await docClient.send(\n new GetCommand({\n TableName: queriesTable,\n Key: {\n pk: connectionId,\n sk: subscriptionId,\n },\n }),\n );\n\n return (response.Item as QueryEntry) ?? null;\n } catch (error) {\n console.error('Error getting query state:', error);\n return null;\n }\n }\n\n /**\n * Execute a query using stored QueryMetadata.\n * Uses PartiQL to query DynamoDB directly without router code.\n */\n async function executeQueryFromMetadata(\n metadata: QueryMetadata,\n ): Promise<unknown[]> {\n const { tableName, filterConditions, sortOrder, limit } = metadata;\n\n // Build WHERE clause from filter conditions\n const whereClause = buildWhereClause(filterConditions);\n const orderClause = sortOrder === 'desc' ? 'ORDER BY SK DESC' : '';\n const limitClause = limit ? `LIMIT ${limit}` : '';\n\n const statement =\n `SELECT * FROM \"${tableName}\" ${whereClause} ${orderClause} ${limitClause}`.trim();\n\n try {\n const result = await ddbClient.send(\n new ExecuteStatementCommand({\n Statement: statement,\n }),\n );\n\n return (result.Items ?? []).map((item) =>\n unmarshall(item as Record<string, AttributeValue>),\n );\n } catch (error) {\n console.error('Error executing query from metadata:', error);\n console.error('Statement:', statement);\n return [];\n }\n }\n\n /**\n * Build WHERE clause from filter conditions.\n */\n function buildWhereClause(conditions: FilterCondition[]): string {\n if (conditions.length === 0) return '';\n\n const clauses = conditions\n .map((c) => buildConditionClause(c))\n .filter(Boolean);\n if (clauses.length === 0) return '';\n\n return `WHERE ${clauses.join(' AND ')}`;\n }\n\n /**\n * Build a single condition clause for PartiQL.\n */\n function buildConditionClause(condition: FilterCondition): string {\n const { type, operator, field, value, value2, conditions } = condition;\n\n if (type === 'comparison' && field) {\n const escapedValue = escapeValue(value);\n switch (operator) {\n case 'eq':\n return `\"${field}\" = ${escapedValue}`;\n case 'ne':\n return `\"${field}\" <> ${escapedValue}`;\n case 'gt':\n return `\"${field}\" > ${escapedValue}`;\n case 'gte':\n return `\"${field}\" >= ${escapedValue}`;\n case 'lt':\n return `\"${field}\" < ${escapedValue}`;\n case 'lte':\n return `\"${field}\" <= ${escapedValue}`;\n case 'between':\n return `\"${field}\" BETWEEN ${escapedValue} AND ${escapeValue(value2)}`;\n case undefined:\n default:\n return '';\n }\n }\n\n if (type === 'function' && field) {\n const escapedValue = escapeValue(value);\n switch (operator) {\n case 'beginsWith':\n return `begins_with(\"${field}\", ${escapedValue})`;\n case 'contains':\n return `contains(\"${field}\", ${escapedValue})`;\n case undefined:\n default:\n return '';\n }\n }\n\n if (type === 'logical' && conditions) {\n const subclauses = conditions\n .map((c) => buildConditionClause(c))\n .filter(Boolean);\n if (subclauses.length === 0) return '';\n\n switch (operator) {\n case 'and':\n return `(${subclauses.join(' AND ')})`;\n case 'or':\n return `(${subclauses.join(' OR ')})`;\n case 'not':\n return subclauses.length > 0 ? `NOT (${subclauses[0]})` : '';\n case undefined:\n default:\n return '';\n }\n }\n\n return '';\n }\n\n /**\n * Escape a value for PartiQL.\n */\n function escapeValue(value: unknown): string {\n if (value === null || value === undefined) return 'NULL';\n if (typeof value === 'string') return `'${value.replace(/'/g, \"''\")}'`;\n if (typeof value === 'number') return String(value);\n if (typeof value === 'boolean') return value ? 'TRUE' : 'FALSE';\n return `'${String(value).replace(/'/g, \"''\")}'`;\n }\n\n /**\n * Update the stored query state\n */\n async function updateQueryState(\n connectionId: string,\n subscriptionId: string,\n newResult: unknown[],\n ): Promise<void> {\n try {\n const existing = await getQueryState(connectionId, subscriptionId);\n if (!existing) return;\n\n await docClient.send(\n new GetCommand({\n TableName: queriesTable,\n Key: { pk: connectionId, sk: subscriptionId },\n }),\n );\n\n // Update with new result\n const { PutCommand } = await import('@aws-sdk/lib-dynamodb');\n await docClient.send(\n new PutCommand({\n TableName: queriesTable,\n Item: {\n ...existing,\n lastResult: newResult,\n updatedAt: Date.now(),\n },\n }),\n );\n } catch (error) {\n console.error('Error updating query state:', error);\n }\n }\n\n /**\n * Send a patch to the client via WebSocket\n */\n async function sendPatch(\n connectionId: string,\n subscriptionId: string,\n patches: JsonPatch[],\n ): Promise<void> {\n const message = JSON.stringify({\n type: 'patch',\n subscriptionId,\n patches,\n });\n\n try {\n await apiClient.send(\n new PostToConnectionCommand({\n ConnectionId: connectionId,\n Data: Buffer.from(message),\n }),\n );\n } catch (error) {\n if (error instanceof GoneException) {\n throw error; // Propagate to trigger cleanup\n }\n console.error(`Error sending patch to ${connectionId}:`, error);\n }\n }\n\n /**\n * Clean up a disconnected connection\n */\n async function cleanupConnection(connectionId: string): Promise<void> {\n console.log('Cleaning up disconnected connection:', connectionId);\n\n try {\n // 1. Get all subscriptions for this connection\n const queriesResponse = await docClient.send(\n new QueryCommand({\n TableName: queriesTable,\n KeyConditionExpression: 'pk = :pk',\n ExpressionAttributeValues: {\n ':pk': connectionId,\n },\n }),\n );\n\n const subscriptions = queriesResponse.Items ?? [];\n\n // 2. Delete dependencies for each subscription\n for (const sub of subscriptions) {\n const deps = (sub.dependencies as string[]) ?? [];\n for (const depKey of deps) {\n await docClient.send(\n new DeleteCommand({\n TableName: dependenciesTable,\n Key: {\n pk: depKey,\n sk: `${connectionId}#${sub.sk}`,\n },\n }),\n );\n }\n\n // 3. Delete the subscription\n await docClient.send(\n new DeleteCommand({\n TableName: queriesTable,\n Key: {\n pk: connectionId,\n sk: sub.sk as string,\n },\n }),\n );\n }\n\n // 4. Delete the connection entry\n await docClient.send(\n new DeleteCommand({\n TableName: connectionsTable,\n Key: {\n connectionId,\n },\n }),\n );\n\n console.log(\n `Cleaned up connection ${connectionId}: ${subscriptions.length} subscriptions removed`,\n );\n } catch (error) {\n console.error('Error cleaning up connection:', error);\n }\n }\n\n return { handler };\n}\n\n/**\n * WebSocket connection handler for $connect\n */\nexport function createConnectHandler(\n config: Pick<StreamHandlerConfig, 'dbConfig' | 'connectionsTableName'>,\n) {\n const connectionsTable =\n config.connectionsTableName ?? SystemTableNames.connections;\n const ddbClient = new DynamoDBClient({\n region: config.dbConfig?.region ?? process.env.AWS_REGION,\n });\n const docClient = DynamoDBDocumentClient.from(ddbClient);\n\n return async function handler(event: {\n requestContext: {\n connectionId: string;\n authorizer?: Record<string, unknown>;\n };\n }): Promise<{ statusCode: number }> {\n const connectionId = event.requestContext.connectionId;\n\n try {\n await docClient.send(\n new QueryCommand({\n TableName: connectionsTable,\n KeyConditionExpression: 'connectionId = :cid',\n ExpressionAttributeValues: {\n ':cid': connectionId,\n },\n }),\n );\n\n console.log('Connection established:', connectionId);\n return { statusCode: 200 };\n } catch (error) {\n console.error('Error creating connection:', error);\n return { statusCode: 500 };\n }\n };\n}\n\n/**\n * WebSocket disconnection handler for $disconnect\n */\nexport function createDisconnectHandler(\n config: Pick<\n StreamHandlerConfig,\n | 'dbConfig'\n | 'connectionsTableName'\n | 'queriesTableName'\n | 'dependenciesTableName'\n >,\n) {\n const connectionsTable =\n config.connectionsTableName ?? SystemTableNames.connections;\n const ddbClient = new DynamoDBClient({\n region: config.dbConfig?.region ?? process.env.AWS_REGION,\n });\n const docClient = DynamoDBDocumentClient.from(ddbClient);\n\n return async function handler(event: {\n requestContext: { connectionId: string };\n }): Promise<{ statusCode: number }> {\n const connectionId = event.requestContext.connectionId;\n\n try {\n await docClient.send(\n new DeleteCommand({\n TableName: connectionsTable,\n Key: { connectionId },\n }),\n );\n\n console.log('Connection removed:', connectionId);\n return { statusCode: 200 };\n } catch (error) {\n console.error('Error removing connection:', error);\n return { statusCode: 500 };\n }\n };\n}\n","/**\n * Lambda handler implementations for the reactive WebSocket system.\n *\n * These handlers process WebSocket events and DynamoDB stream events\n * WITHOUT requiring user router code at runtime.\n *\n * Stream processing uses stored query metadata to evaluate changes\n * directly, rather than re-executing queries through a router.\n */\n\nimport {\n ApiGatewayManagementApiClient,\n GoneException,\n PostToConnectionCommand,\n} from '@aws-sdk/client-apigatewaymanagementapi';\nimport { type AttributeValue, DynamoDBClient } from '@aws-sdk/client-dynamodb';\nimport {\n DeleteCommand,\n DynamoDBDocumentClient,\n GetCommand,\n PutCommand,\n QueryCommand,\n} from '@aws-sdk/lib-dynamodb';\nimport { unmarshall } from '@aws-sdk/util-dynamodb';\nimport type {\n ConnectionEntry,\n JsonPatch,\n QueryEntry,\n QueryMetadata,\n} from '@dynamodb-reactive/core';\nimport { SystemTableNames } from '@dynamodb-reactive/core';\nimport type {\n APIGatewayProxyEvent,\n APIGatewayProxyResult,\n DynamoDBRecord,\n DynamoDBStreamEvent,\n} from 'aws-lambda';\n\nimport { extractAffectedKeys } from '../dependency-extractor.js';\nimport { generatePatches, hasChanges } from '../patcher.js';\n\n/**\n * Create all Lambda handlers.\n * No user code required - all configuration comes from environment variables.\n * The stream handler uses stored query metadata (PartiQL), not router code.\n */\nexport function createLambdaHandlers() {\n // Get table names from environment\n const connectionsTable =\n process.env.CONNECTIONS_TABLE ?? SystemTableNames.connections;\n const dependenciesTable =\n process.env.DEPENDENCIES_TABLE ?? SystemTableNames.dependencies;\n const queriesTable = process.env.QUERIES_TABLE ?? SystemTableNames.queries;\n const wsEndpoint = process.env.WEBSOCKET_ENDPOINT ?? '';\n\n // Create DynamoDB client\n const ddbClient = new DynamoDBClient({\n region: process.env.AWS_REGION,\n });\n const docClient = DynamoDBDocumentClient.from(ddbClient);\n\n // Create API Gateway Management client (lazy to avoid endpoint issues during init)\n const getApiClient = () =>\n new ApiGatewayManagementApiClient({\n endpoint: wsEndpoint,\n });\n\n /**\n * $connect handler - Register new WebSocket connections\n */\n async function connectHandler(\n event: APIGatewayProxyEvent,\n ): Promise<APIGatewayProxyResult> {\n const connectionId = event.requestContext.connectionId!;\n const now = Date.now();\n const ttl = Math.floor(now / 1000) + 3600; // 1 hour TTL\n\n try {\n const connectionEntry: ConnectionEntry = {\n connectionId,\n context: event.requestContext.authorizer as\n | Record<string, unknown>\n | undefined,\n connectedAt: now,\n ttl,\n };\n\n await docClient.send(\n new PutCommand({\n TableName: connectionsTable,\n Item: connectionEntry,\n }),\n );\n\n console.log('Connection established:', connectionId);\n return { statusCode: 200, body: 'Connected' };\n } catch (error) {\n console.error('Error creating connection:', error);\n return { statusCode: 500, body: 'Failed to connect' };\n }\n }\n\n /**\n * $disconnect handler - Clean up disconnected connections\n */\n async function disconnectHandler(\n event: APIGatewayProxyEvent,\n ): Promise<APIGatewayProxyResult> {\n const connectionId = event.requestContext.connectionId!;\n\n try {\n // Delete the connection entry\n await docClient.send(\n new DeleteCommand({\n TableName: connectionsTable,\n Key: { connectionId },\n }),\n );\n\n // TODO: Clean up queries and dependencies for this connection\n\n console.log('Connection removed:', connectionId);\n return { statusCode: 200, body: 'Disconnected' };\n } catch (error) {\n console.error('Error removing connection:', error);\n return { statusCode: 500, body: 'Failed to disconnect' };\n }\n }\n\n /**\n * $default handler - Handle WebSocket messages\n * Handles: init (returns connectionId), unsubscribe\n * Subscribe/call are handled by the app's HTTP API route.\n */\n async function messageHandler(\n event: APIGatewayProxyEvent,\n ): Promise<APIGatewayProxyResult> {\n const connectionId = event.requestContext.connectionId!;\n\n try {\n const body = JSON.parse(event.body ?? '{}');\n const { type, subscriptionId } = body;\n\n let response: unknown;\n\n switch (type) {\n case 'init': {\n // Client requests its connectionId after WebSocket connects\n // This is needed so the client can include connectionId in HTTP requests\n response = {\n type: 'connected',\n connectionId,\n };\n break;\n }\n\n case 'unsubscribe': {\n // Get the subscription to find its dependencies\n const subResponse = await docClient.send(\n new GetCommand({\n TableName: queriesTable,\n Key: { pk: connectionId, sk: subscriptionId },\n }),\n );\n\n if (subResponse.Item) {\n const queryEntry = subResponse.Item as QueryEntry;\n\n // Delete dependency entries\n for (const key of queryEntry.dependencies ?? []) {\n await docClient.send(\n new DeleteCommand({\n TableName: dependenciesTable,\n Key: { pk: key, sk: `${connectionId}#${subscriptionId}` },\n }),\n );\n }\n }\n\n // Delete the subscription\n await docClient.send(\n new DeleteCommand({\n TableName: queriesTable,\n Key: { pk: connectionId, sk: subscriptionId },\n }),\n );\n\n response = { type: 'result', data: { success: true } };\n break;\n }\n\n default:\n // Subscribe and call are handled by the app's HTTP API route\n // which has access to the router\n response = {\n type: 'error',\n message: `Message type '${type}' should be handled by the app API route`,\n };\n }\n\n // Send response back through WebSocket\n const apiClient = getApiClient();\n await apiClient.send(\n new PostToConnectionCommand({\n ConnectionId: connectionId,\n Data: Buffer.from(JSON.stringify(response)),\n }),\n );\n\n return { statusCode: 200, body: 'OK' };\n } catch (error) {\n console.error('Error handling message:', error);\n return { statusCode: 500, body: 'Internal server error' };\n }\n }\n\n /**\n * DynamoDB Stream handler - Process changes and push updates.\n * Uses stored query metadata to evaluate changes WITHOUT router code.\n */\n async function streamHandler(event: DynamoDBStreamEvent): Promise<void> {\n const affectedSubscriptions = new Map<\n string,\n Map<\n string,\n {\n oldImage: Record<string, unknown> | null;\n newImage: Record<string, unknown> | null;\n }\n >\n >();\n\n // Process each record in the stream\n for (const record of event.Records) {\n if (!record.dynamodb) continue;\n\n const tableName = extractTableName(record);\n if (!tableName) continue;\n\n // Get the new and old images\n const newImage = record.dynamodb.NewImage\n ? unmarshall(record.dynamodb.NewImage as Record<string, AttributeValue>)\n : null;\n const oldImage = record.dynamodb.OldImage\n ? unmarshall(record.dynamodb.OldImage as Record<string, AttributeValue>)\n : null;\n\n // Extract affected dependency keys\n const affectedKeys = new Set<string>();\n if (newImage) {\n for (const key of extractAffectedKeys(tableName, newImage)) {\n affectedKeys.add(key);\n }\n }\n if (oldImage) {\n for (const key of extractAffectedKeys(tableName, oldImage)) {\n affectedKeys.add(key);\n }\n }\n\n // Find subscriptions affected by these keys\n for (const key of affectedKeys) {\n const subscriptions = await findAffectedSubscriptions(key);\n for (const sub of subscriptions) {\n const connId = sub.connectionId;\n const subId = sub.subscriptionId;\n\n if (!affectedSubscriptions.has(connId)) {\n affectedSubscriptions.set(connId, new Map());\n }\n const connSubs = affectedSubscriptions.get(connId)!;\n\n // Store the record change for this subscription\n // If already tracked, merge (for batch updates to same record)\n if (!connSubs.has(subId)) {\n connSubs.set(subId, { oldImage, newImage });\n }\n }\n }\n }\n\n // Process each affected subscription\n const sendPromises: Promise<void>[] = [];\n for (const [connectionId, subscriptions] of affectedSubscriptions) {\n for (const [subscriptionId] of subscriptions) {\n sendPromises.push(processSubscription(connectionId, subscriptionId));\n }\n }\n\n await Promise.allSettled(sendPromises);\n }\n\n /**\n * Extract table name from a stream record\n */\n function extractTableName(record: DynamoDBRecord): string | null {\n const arn = record.eventSourceARN;\n if (!arn) return null;\n const match = arn.match(/table\\/([^/]+)/);\n return match ? match[1] : null;\n }\n\n /**\n * Find subscriptions affected by a dependency key\n */\n async function findAffectedSubscriptions(\n dependencyKey: string,\n ): Promise<{ connectionId: string; subscriptionId: string }[]> {\n try {\n const response = await docClient.send(\n new QueryCommand({\n TableName: dependenciesTable,\n KeyConditionExpression: 'pk = :pk',\n ExpressionAttributeValues: {\n ':pk': dependencyKey,\n },\n }),\n );\n\n return (response.Items ?? []).map((item) => ({\n connectionId: item.connectionId as string,\n subscriptionId: item.subscriptionId as string,\n }));\n } catch (error) {\n console.error('Error finding affected subscriptions:', error);\n return [];\n }\n }\n\n /**\n * Process a single subscription by re-querying and diffing.\n * For now, we still re-query because applying changes directly is complex.\n * But we don't need router code - we use stored PartiQL or query metadata.\n */\n async function processSubscription(\n connectionId: string,\n subscriptionId: string,\n ): Promise<void> {\n try {\n // Get the subscription state\n const response = await docClient.send(\n new GetCommand({\n TableName: queriesTable,\n Key: { pk: connectionId, sk: subscriptionId },\n }),\n );\n\n const queryState = response.Item as QueryEntry | undefined;\n if (!queryState) {\n console.warn(\n `Subscription not found: ${connectionId}/${subscriptionId}`,\n );\n return;\n }\n\n // Re-execute the query using stored metadata\n const newResult = await executeQueryFromMetadata(\n queryState.queryMetadata,\n );\n\n // Check if there are changes\n if (!hasChanges(queryState.lastResult, newResult)) {\n return;\n }\n\n // Generate patches\n const patches = generatePatches(queryState.lastResult, newResult);\n\n // Update the stored state\n await docClient.send(\n new PutCommand({\n TableName: queriesTable,\n Item: {\n ...queryState,\n lastResult: newResult,\n updatedAt: Date.now(),\n },\n }),\n );\n\n // Send the patch to the client\n await sendPatch(connectionId, subscriptionId, patches);\n } catch (error) {\n if (error instanceof GoneException) {\n await cleanupConnection(connectionId);\n } else {\n console.error(\n `Error processing subscription ${connectionId}/${subscriptionId}:`,\n error,\n );\n }\n }\n }\n\n /**\n * Execute a query using stored QueryMetadata.\n * Uses PartiQL to query DynamoDB directly without router code.\n */\n async function executeQueryFromMetadata(\n metadata: QueryMetadata,\n ): Promise<unknown[]> {\n // Build PartiQL query from metadata\n const { tableName, filterConditions, sortOrder, limit } = metadata;\n\n // Build WHERE clause from filter conditions\n const whereClause = buildWhereClause(filterConditions);\n const orderClause = sortOrder === 'desc' ? 'ORDER BY SK DESC' : '';\n const limitClause = limit ? `LIMIT ${limit}` : '';\n\n const statement =\n `SELECT * FROM \"${tableName}\" ${whereClause} ${orderClause} ${limitClause}`.trim();\n\n try {\n // Use PartiQL to execute the query\n const { ExecuteStatementCommand } =\n await import('@aws-sdk/client-dynamodb');\n const result = await ddbClient.send(\n new ExecuteStatementCommand({\n Statement: statement,\n }),\n );\n\n // Unmarshall results\n return (result.Items ?? []).map((item) =>\n unmarshall(item as Record<string, AttributeValue>),\n );\n } catch (error) {\n console.error('Error executing query from metadata:', error);\n console.error('Statement:', statement);\n return [];\n }\n }\n\n /**\n * Build WHERE clause from filter conditions.\n */\n function buildWhereClause(\n conditions: QueryMetadata['filterConditions'],\n ): string {\n if (conditions.length === 0) return '';\n\n const clauses = conditions\n .map((c) => buildConditionClause(c))\n .filter(Boolean);\n if (clauses.length === 0) return '';\n\n return `WHERE ${clauses.join(' AND ')}`;\n }\n\n /**\n * Build a single condition clause for PartiQL.\n */\n function buildConditionClause(\n condition: QueryMetadata['filterConditions'][0],\n ): string {\n const { type, operator, field, value, value2, conditions } = condition;\n\n if (type === 'comparison' && field) {\n const escapedValue = escapeValue(value);\n switch (operator) {\n case 'eq':\n return `\"${field}\" = ${escapedValue}`;\n case 'ne':\n return `\"${field}\" <> ${escapedValue}`;\n case 'gt':\n return `\"${field}\" > ${escapedValue}`;\n case 'gte':\n return `\"${field}\" >= ${escapedValue}`;\n case 'lt':\n return `\"${field}\" < ${escapedValue}`;\n case 'lte':\n return `\"${field}\" <= ${escapedValue}`;\n case 'between':\n return `\"${field}\" BETWEEN ${escapedValue} AND ${escapeValue(value2)}`;\n case undefined:\n default:\n return '';\n }\n }\n\n if (type === 'function' && field) {\n const escapedValue = escapeValue(value);\n switch (operator) {\n case 'beginsWith':\n return `begins_with(\"${field}\", ${escapedValue})`;\n case 'contains':\n return `contains(\"${field}\", ${escapedValue})`;\n case undefined:\n default:\n return '';\n }\n }\n\n if (type === 'logical' && conditions) {\n const subclauses = conditions\n .map((c) => buildConditionClause(c))\n .filter(Boolean);\n if (subclauses.length === 0) return '';\n\n switch (operator) {\n case 'and':\n return `(${subclauses.join(' AND ')})`;\n case 'or':\n return `(${subclauses.join(' OR ')})`;\n case 'not':\n return subclauses.length > 0 ? `NOT (${subclauses[0]})` : '';\n case undefined:\n default:\n return '';\n }\n }\n\n return '';\n }\n\n /**\n * Escape a value for PartiQL.\n */\n function escapeValue(value: unknown): string {\n if (value === null || value === undefined) return 'NULL';\n if (typeof value === 'string') return `'${value.replace(/'/g, \"''\")}'`;\n if (typeof value === 'number') return String(value);\n if (typeof value === 'boolean') return value ? 'TRUE' : 'FALSE';\n return `'${String(value).replace(/'/g, \"''\")}'`;\n }\n\n /**\n * Send a patch to the client via WebSocket\n */\n async function sendPatch(\n connectionId: string,\n subscriptionId: string,\n patches: JsonPatch[],\n ): Promise<void> {\n const message = JSON.stringify({\n type: 'patch',\n subscriptionId,\n patches,\n });\n\n try {\n const apiClient = getApiClient();\n await apiClient.send(\n new PostToConnectionCommand({\n ConnectionId: connectionId,\n Data: Buffer.from(message),\n }),\n );\n } catch (error) {\n if (error instanceof GoneException) {\n throw error;\n }\n console.error(`Error sending patch to ${connectionId}:`, error);\n }\n }\n\n /**\n * Clean up a disconnected connection\n */\n async function cleanupConnection(connectionId: string): Promise<void> {\n console.log('Cleaning up disconnected connection:', connectionId);\n\n try {\n // Delete connection entry\n await docClient.send(\n new DeleteCommand({\n TableName: connectionsTable,\n Key: { connectionId },\n }),\n );\n\n // TODO: Delete all queries and dependencies for this connection\n } catch (error) {\n console.error('Error cleaning up connection:', error);\n }\n }\n\n return {\n connectHandler,\n disconnectHandler,\n messageHandler,\n streamHandler,\n };\n}\n","/**\n * Filter evaluator for evaluating FilterCondition against DynamoDB records.\n * Used by the stream handler to determine if a record matches a subscription's query.\n */\n\nimport type { FilterCondition } from '@dynamodb-reactive/core';\n\n/**\n * Evaluate a filter condition against a record.\n * Returns true if the record matches the filter.\n */\nexport function evaluateFilter(\n filter: FilterCondition,\n record: Record<string, unknown>,\n): boolean {\n switch (filter.type) {\n case 'comparison':\n return evaluateComparison(filter, record);\n case 'logical':\n return evaluateLogical(filter, record);\n case 'function':\n return evaluateFunction(filter, record);\n default:\n console.warn(`Unknown filter type: ${filter.type}`);\n return false;\n }\n}\n\n/**\n * Evaluate multiple filter conditions (all must match - AND logic).\n */\nexport function evaluateFilters(\n filters: FilterCondition[],\n record: Record<string, unknown>,\n): boolean {\n if (filters.length === 0) return true;\n return filters.every((filter) => evaluateFilter(filter, record));\n}\n\n/**\n * Evaluate a comparison filter (eq, ne, gt, gte, lt, lte, between).\n */\nfunction evaluateComparison(\n filter: FilterCondition,\n record: Record<string, unknown>,\n): boolean {\n const { operator, field, value, value2 } = filter;\n if (!field || !operator) return false;\n\n const fieldValue = getFieldValue(record, field);\n\n switch (operator) {\n case 'eq':\n return fieldValue === value;\n case 'ne':\n return fieldValue !== value;\n case 'gt':\n return compareValues(fieldValue, value) > 0;\n case 'gte':\n return compareValues(fieldValue, value) >= 0;\n case 'lt':\n return compareValues(fieldValue, value) < 0;\n case 'lte':\n return compareValues(fieldValue, value) <= 0;\n case 'between':\n return (\n compareValues(fieldValue, value) >= 0 &&\n compareValues(fieldValue, value2) <= 0\n );\n default:\n console.warn(`Unknown comparison operator: ${operator}`);\n return false;\n }\n}\n\n/**\n * Evaluate a logical filter (and, or, not).\n */\nfunction evaluateLogical(\n filter: FilterCondition,\n record: Record<string, unknown>,\n): boolean {\n const { operator, conditions } = filter;\n if (!operator || !conditions) return false;\n\n switch (operator) {\n case 'and':\n return conditions.every((c) => evaluateFilter(c, record));\n case 'or':\n return conditions.some((c) => evaluateFilter(c, record));\n case 'not':\n return conditions.length > 0 && !evaluateFilter(conditions[0], record);\n default:\n console.warn(`Unknown logical operator: ${operator}`);\n return false;\n }\n}\n\n/**\n * Evaluate a function filter (beginsWith, contains).\n */\nfunction evaluateFunction(\n filter: FilterCondition,\n record: Record<string, unknown>,\n): boolean {\n const { operator, field, value } = filter;\n if (!field || !operator) return false;\n\n const fieldValue = getFieldValue(record, field);\n\n switch (operator) {\n case 'beginsWith':\n return (\n typeof fieldValue === 'string' &&\n typeof value === 'string' &&\n fieldValue.startsWith(value)\n );\n case 'contains':\n return (\n typeof fieldValue === 'string' &&\n typeof value === 'string' &&\n fieldValue.includes(value)\n );\n default:\n console.warn(`Unknown function operator: ${operator}`);\n return false;\n }\n}\n\n/**\n * Get a field value from a record, supporting nested paths (e.g., \"user.name\").\n */\nfunction getFieldValue(\n record: Record<string, unknown>,\n field: string,\n): unknown {\n const parts = field.split('.');\n let value: unknown = record;\n\n for (const part of parts) {\n if (value === null || value === undefined) return undefined;\n if (typeof value !== 'object') return undefined;\n value = (value as Record<string, unknown>)[part];\n }\n\n return value;\n}\n\n/**\n * Compare two values for ordering.\n * Returns negative if a < b, positive if a > b, zero if equal.\n */\nfunction compareValues(a: unknown, b: unknown): number {\n // Handle null/undefined\n if (a === null || a === undefined) {\n return b === null || b === undefined ? 0 : -1;\n }\n if (b === null || b === undefined) {\n return 1;\n }\n\n // Numbers\n if (typeof a === 'number' && typeof b === 'number') {\n return a - b;\n }\n\n // Strings\n if (typeof a === 'string' && typeof b === 'string') {\n return a.localeCompare(b);\n }\n\n // Booleans\n if (typeof a === 'boolean' && typeof b === 'boolean') {\n return a === b ? 0 : a ? 1 : -1;\n }\n\n // Fallback: convert to string\n return String(a).localeCompare(String(b));\n}\n\n/**\n * Sort records by a field.\n */\nexport function sortRecords(\n records: Record<string, unknown>[],\n sortField?: string,\n sortOrder: 'asc' | 'desc' = 'asc',\n): Record<string, unknown>[] {\n if (!sortField) return records;\n\n return [...records].sort((a, b) => {\n const aValue = getFieldValue(a, sortField);\n const bValue = getFieldValue(b, sortField);\n const comparison = compareValues(aValue, bValue);\n return sortOrder === 'desc' ? -comparison : comparison;\n });\n}\n\n/**\n * Find the primary key value(s) from a record.\n * Used to identify records for update/removal.\n */\nexport function getRecordKey(\n record: Record<string, unknown>,\n pkField: string,\n skField?: string,\n): string {\n const pk = record[pkField];\n const sk = skField ? record[skField] : undefined;\n return sk !== undefined ? `${pk}#${sk}` : String(pk);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../server/src/procedure.ts","../../server/src/router.ts","../../server/src/reactive.ts","../../server/src/partiql-builder.ts","../../server/src/query-builder.ts","../../server/src/db-context.ts","../../server/src/dependency-extractor.ts","../../server/src/patcher.ts","../../server/src/handlers/reactive-handler.ts","../../server/src/handlers/stream-handler.ts","../../server/src/handlers/lambda-handlers.ts","../../server/src/filter-evaluator.ts"],"names":["DynamoDBClient","DynamoDBDocumentClient","PutCommand","GetCommand","DeleteCommand","unmarshall","ExecuteStatementCommand","ApiGatewayManagementApiClient","PostToConnectionCommand","QueryCommand","GoneException"],"mappings":"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","file":"server.js","sourcesContent":["import type { z } from 'zod';\n\nimport type { DatabaseContext, ProcedureDefinition } from './types.js';\n\n/**\n * Procedure builder for creating type-safe procedures\n */\nexport class ProcedureBuilder<\n TContext,\n TInput extends z.ZodType = z.ZodUndefined,\n> {\n private inputSchema?: TInput;\n\n constructor(inputSchema?: TInput) {\n this.inputSchema = inputSchema;\n }\n\n /**\n * Define the input schema for the procedure\n */\n input<TNewInput extends z.ZodType>(\n schema: TNewInput,\n ): ProcedureBuilder<TContext, TNewInput> {\n return new ProcedureBuilder<TContext, TNewInput>(schema);\n }\n\n /**\n * Define a query procedure (read-only operation)\n */\n query<TOutput>(\n resolver: (opts: {\n ctx: TContext & { db: DatabaseContext };\n input: z.infer<TInput>;\n }) => Promise<TOutput> | TOutput,\n ): ProcedureDefinition<TContext, TInput, TOutput> {\n return {\n type: 'query',\n inputSchema: this.inputSchema,\n resolver,\n };\n }\n\n /**\n * Define a mutation procedure (write operation)\n */\n mutation<TOutput>(\n resolver: (opts: {\n ctx: TContext & { db: DatabaseContext };\n input: z.infer<TInput>;\n }) => Promise<TOutput> | TOutput,\n ): ProcedureDefinition<TContext, TInput, TOutput> {\n return {\n type: 'mutation',\n inputSchema: this.inputSchema,\n resolver,\n };\n }\n}\n\n/**\n * Check if a value is a procedure definition\n */\nexport function isProcedure(\n value: unknown,\n): value is ProcedureDefinition<any, any, any> {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'type' in value &&\n 'resolver' in value &&\n (value.type === 'query' || value.type === 'mutation')\n );\n}\n\n/**\n * Execute a procedure with the given context and input\n */\nexport async function executeProcedure<\n TContext,\n TInput extends z.ZodType,\n TOutput,\n>(\n procedure: ProcedureDefinition<TContext, TInput, TOutput>,\n ctx: TContext & { db: DatabaseContext },\n rawInput: unknown,\n): Promise<TOutput> {\n // Validate input if schema is defined\n let input: z.infer<TInput>;\n if (procedure.inputSchema) {\n const parseResult = procedure.inputSchema.safeParse(rawInput);\n if (!parseResult.success) {\n throw new Error(`Invalid input: ${parseResult.error.message}`);\n }\n input = parseResult.data;\n } else {\n input = rawInput as z.infer<TInput>;\n }\n\n // Execute the resolver\n return procedure.resolver({ ctx, input });\n}\n","import { executeProcedure, isProcedure } from './procedure.js';\nimport type {\n DatabaseContext,\n ProcedureDefinition,\n RouterDefinition,\n} from './types.js';\n\n/**\n * Router class for organizing procedures\n */\nexport class Router<TContext, TRouter extends RouterDefinition<TContext>> {\n public readonly definition: TRouter;\n\n constructor(definition: TRouter) {\n this.definition = definition;\n }\n\n /**\n * Get a procedure by its path (e.g., \"todos.list\")\n */\n getProcedure(path: string): ProcedureDefinition<TContext, any, any> | null {\n const parts = path.split('.');\n let current: unknown = this.definition;\n\n for (const part of parts) {\n if (typeof current !== 'object' || current === null) {\n return null;\n }\n current = (current as Record<string, unknown>)[part];\n }\n\n if (isProcedure(current)) {\n return current;\n }\n\n return null;\n }\n\n /**\n * Execute a procedure by its path\n */\n async execute(\n path: string,\n ctx: TContext & { db: DatabaseContext },\n input: unknown,\n ): Promise<unknown> {\n const procedure = this.getProcedure(path);\n if (!procedure) {\n throw new Error(`Procedure not found: ${path}`);\n }\n\n return executeProcedure(procedure, ctx, input);\n }\n\n /**\n * Get all procedure paths in the router\n */\n getProcedurePaths(): string[] {\n const paths: string[] = [];\n\n function traverse(obj: unknown, prefix: string) {\n if (typeof obj !== 'object' || obj === null) return;\n\n for (const [key, value] of Object.entries(obj)) {\n const path = prefix ? `${prefix}.${key}` : key;\n if (isProcedure(value)) {\n paths.push(path);\n } else {\n traverse(value, path);\n }\n }\n }\n\n traverse(this.definition, '');\n return paths;\n }\n\n /**\n * Check if a path is a query procedure\n */\n isQuery(path: string): boolean {\n const procedure = this.getProcedure(path);\n return procedure?.type === 'query';\n }\n\n /**\n * Check if a path is a mutation procedure\n */\n isMutation(path: string): boolean {\n const procedure = this.getProcedure(path);\n return procedure?.type === 'mutation';\n }\n}\n\n/**\n * Create a router from a definition\n */\nexport function createRouter<\n TContext,\n TRouter extends RouterDefinition<TContext>,\n>(definition: TRouter): Router<TContext, TRouter> {\n return new Router(definition);\n}\n\n/**\n * Merge multiple routers into one\n */\nexport function mergeRouters<TContext>(\n ...routers: Router<TContext, any>[]\n): Router<TContext, RouterDefinition<TContext>> {\n const merged: RouterDefinition<TContext> = {};\n\n for (const router of routers) {\n Object.assign(merged, router.definition);\n }\n\n return new Router(merged);\n}\n","import type { z } from 'zod';\n\nimport { ProcedureBuilder } from './procedure.js';\nimport type { Router } from './router.js';\nimport { createRouter } from './router.js';\nimport type { RouterDefinition } from './types.js';\n\n/**\n * ReactiveBuilder - The main builder returned by initReactive\n */\nexport interface ReactiveBuilder<TContext> {\n /**\n * Create a new procedure builder\n */\n procedure: ProcedureBuilder<TContext>;\n\n /**\n * Create a router from procedure definitions\n */\n router<TRouter extends RouterDefinition<TContext>>(\n definition: TRouter,\n ): Router<TContext, TRouter>;\n}\n\n/**\n * Initialize the reactive system with a context type\n *\n * @example\n * ```ts\n * const t = initReactive<{ userId: string }>();\n *\n * export const appRouter = t.router({\n * todos: {\n * list: t.procedure\n * .input(z.object({ taskListId: z.string() }))\n * .query(({ ctx, input }) => {\n * return ctx.db\n * .query(TodoTable)\n * .filter((q) => q.eq(TodoTable.field.taskListId, input.taskListId))\n * .take(50);\n * }),\n * }\n * });\n * ```\n */\nexport function initReactive<\n TContext = Record<string, unknown>,\n>(): ReactiveBuilder<TContext> {\n return {\n procedure: new ProcedureBuilder<TContext>(),\n\n router<TRouter extends RouterDefinition<TContext>>(\n definition: TRouter,\n ): Router<TContext, TRouter> {\n return createRouter(definition);\n },\n };\n}\n\n/**\n * Type helper to infer the router type\n */\nexport type InferRouterType<T> =\n T extends Router<infer TContext, infer TRouter>\n ? { context: TContext; router: TRouter }\n : never;\n\n/**\n * Type helper to get procedure input type\n */\nexport type InferProcedureInput<T> = T extends { inputSchema: infer TSchema }\n ? TSchema extends z.ZodType\n ? z.infer<TSchema>\n : undefined\n : undefined;\n\n/**\n * Type helper to get procedure output type\n */\nexport type InferProcedureOutput<T> = T extends {\n resolver: (...args: any) => infer TOutput;\n}\n ? Awaited<TOutput>\n : unknown;\n","import type { FilterCondition, TrackedQueryOperation } from './types.js';\n\n/**\n * PartiQL statement with parameters\n */\nexport interface PartiQLStatement {\n statement: string;\n parameters: unknown[];\n}\n\n/**\n * Converts a filter condition to PartiQL WHERE clause\n */\nfunction conditionToPartiQL(\n condition: FilterCondition,\n parameters: unknown[],\n): string {\n switch (condition.type) {\n case 'comparison': {\n parameters.push(condition.value);\n return `\"${condition.field}\" ${condition.operator} ?`;\n }\n\n case 'function': {\n if (condition.operator === 'BETWEEN') {\n parameters.push(condition.value);\n parameters.push(condition.value2);\n return `\"${condition.field}\" BETWEEN ? AND ?`;\n }\n\n if (condition.operator === 'begins_with') {\n parameters.push(condition.value);\n return `begins_with(\"${condition.field}\", ?)`;\n }\n\n if (condition.operator === 'contains') {\n parameters.push(condition.value);\n return `contains(\"${condition.field}\", ?)`;\n }\n\n throw new Error(`Unknown function operator: ${condition.operator}`);\n }\n\n case 'logical': {\n if (!condition.conditions || condition.conditions.length === 0) {\n throw new Error(\n 'Logical condition requires at least one sub-condition',\n );\n }\n\n if (condition.operator === 'NOT') {\n const subClause = conditionToPartiQL(\n condition.conditions[0],\n parameters,\n );\n return `NOT (${subClause})`;\n }\n\n const subClauses = condition.conditions.map((c) =>\n conditionToPartiQL(c, parameters),\n );\n return `(${subClauses.join(` ${condition.operator} `)})`;\n }\n\n default:\n throw new Error(`Unknown condition type: ${condition.type}`);\n }\n}\n\n/**\n * Build a PartiQL SELECT statement from a query operation\n */\nexport function buildSelectStatement(\n operation: TrackedQueryOperation,\n): PartiQLStatement {\n const parameters: unknown[] = [];\n let statement = `SELECT * FROM \"${operation.tableName}\"`;\n\n // Add index hint if using a GSI\n if (operation.indexName) {\n statement += `.\"${operation.indexName}\"`;\n }\n\n // Add WHERE clause if there are filters\n if (operation.filters.length > 0) {\n const whereClauses = operation.filters.map((f) =>\n conditionToPartiQL(f, parameters),\n );\n statement += ` WHERE ${whereClauses.join(' AND ')}`;\n }\n\n return { statement, parameters };\n}\n\n/**\n * Build a PartiQL INSERT statement\n */\nexport function buildInsertStatement(\n tableName: string,\n item: Record<string, unknown>,\n): PartiQLStatement {\n const parameters: unknown[] = [item];\n const statement = `INSERT INTO \"${tableName}\" VALUE ?`;\n return { statement, parameters };\n}\n\n/**\n * Build a PartiQL UPDATE statement\n */\nexport function buildUpdateStatement(\n tableName: string,\n key: Record<string, unknown>,\n updates: Record<string, unknown>,\n): PartiQLStatement {\n const parameters: unknown[] = [];\n const setClauses: string[] = [];\n\n for (const [field, value] of Object.entries(updates)) {\n // Skip key fields\n if (field in key) continue;\n setClauses.push(`\"${field}\" = ?`);\n parameters.push(value);\n }\n\n if (setClauses.length === 0) {\n throw new Error('No fields to update');\n }\n\n let statement = `UPDATE \"${tableName}\" SET ${setClauses.join(', ')}`;\n\n // Add WHERE clause for the key\n const whereClauses = Object.entries(key).map(([field, value]) => {\n parameters.push(value);\n return `\"${field}\" = ?`;\n });\n statement += ` WHERE ${whereClauses.join(' AND ')}`;\n\n return { statement, parameters };\n}\n\n/**\n * Build a PartiQL DELETE statement\n */\nexport function buildDeleteStatement(\n tableName: string,\n key: Record<string, unknown>,\n): PartiQLStatement {\n const parameters: unknown[] = [];\n const whereClauses = Object.entries(key).map(([field, value]) => {\n parameters.push(value);\n return `\"${field}\" = ?`;\n });\n\n const statement = `DELETE FROM \"${tableName}\" WHERE ${whereClauses.join(' AND ')}`;\n return { statement, parameters };\n}\n\n/**\n * Build a PartiQL GET statement (for single item by key)\n */\nexport function buildGetStatement(\n tableName: string,\n key: Record<string, unknown>,\n): PartiQLStatement {\n const parameters: unknown[] = [];\n const whereClauses = Object.entries(key).map(([field, value]) => {\n parameters.push(value);\n return `\"${field}\" = ?`;\n });\n\n const statement = `SELECT * FROM \"${tableName}\" WHERE ${whereClauses.join(' AND ')}`;\n return { statement, parameters };\n}\n","import type { FieldRef } from '@dynamodb-reactive/core';\n\nimport type {\n AnyDynamoTable,\n FilterBuilder,\n FilterCondition,\n QueryBuilder,\n TableItem,\n TableKeyInput,\n TrackedQueryOperation,\n} from './types.js';\n\n/**\n * Creates a filter condition\n */\nfunction createCondition(\n type: FilterCondition['type'],\n operator: string,\n field?: string,\n value?: unknown,\n value2?: unknown,\n): FilterCondition {\n return { type, operator, field, value, value2 };\n}\n\n/**\n * Implementation of FilterBuilder\n */\nclass FilterBuilderImpl<\n TTable extends AnyDynamoTable,\n> implements FilterBuilder<TTable> {\n eq<K extends keyof TableItem<TTable>>(\n field: FieldRef<K & string, TableItem<TTable>[K]>,\n value: TableItem<TTable>[K],\n ): FilterCondition {\n return createCondition('comparison', '=', field.fieldName, value);\n }\n\n ne<K extends keyof TableItem<TTable>>(\n field: FieldRef<K & string, TableItem<TTable>[K]>,\n value: TableItem<TTable>[K],\n ): FilterCondition {\n return createCondition('comparison', '<>', field.fieldName, value);\n }\n\n gt<K extends keyof TableItem<TTable>>(\n field: FieldRef<K & string, TableItem<TTable>[K]>,\n value: TableItem<TTable>[K],\n ): FilterCondition {\n return createCondition('comparison', '>', field.fieldName, value);\n }\n\n gte<K extends keyof TableItem<TTable>>(\n field: FieldRef<K & string, TableItem<TTable>[K]>,\n value: TableItem<TTable>[K],\n ): FilterCondition {\n return createCondition('comparison', '>=', field.fieldName, value);\n }\n\n lt<K extends keyof TableItem<TTable>>(\n field: FieldRef<K & string, TableItem<TTable>[K]>,\n value: TableItem<TTable>[K],\n ): FilterCondition {\n return createCondition('comparison', '<', field.fieldName, value);\n }\n\n lte<K extends keyof TableItem<TTable>>(\n field: FieldRef<K & string, TableItem<TTable>[K]>,\n value: TableItem<TTable>[K],\n ): FilterCondition {\n return createCondition('comparison', '<=', field.fieldName, value);\n }\n\n between<K extends keyof TableItem<TTable>>(\n field: FieldRef<K & string, TableItem<TTable>[K]>,\n lower: TableItem<TTable>[K],\n upper: TableItem<TTable>[K],\n ): FilterCondition {\n return createCondition(\n 'function',\n 'BETWEEN',\n field.fieldName,\n lower,\n upper,\n );\n }\n\n beginsWith<K extends keyof TableItem<TTable>>(\n field: FieldRef<K & string, string>,\n prefix: string,\n ): FilterCondition {\n return createCondition('function', 'begins_with', field.fieldName, prefix);\n }\n\n contains<K extends keyof TableItem<TTable>>(\n field: FieldRef<K & string, string>,\n substring: string,\n ): FilterCondition {\n return createCondition('function', 'contains', field.fieldName, substring);\n }\n\n and(...conditions: FilterCondition[]): FilterCondition {\n return { type: 'logical', operator: 'AND', conditions };\n }\n\n or(...conditions: FilterCondition[]): FilterCondition {\n return { type: 'logical', operator: 'OR', conditions };\n }\n\n not(condition: FilterCondition): FilterCondition {\n return { type: 'logical', operator: 'NOT', conditions: [condition] };\n }\n}\n\n/**\n * Query execution function type\n */\ntype QueryExecutor<TTable extends AnyDynamoTable> = (\n operation: TrackedQueryOperation,\n options: QueryOptions,\n) => Promise<TableItem<TTable>[]>;\n\n/**\n * Query options\n */\ninterface QueryOptions {\n limit?: number;\n startKey?: Record<string, unknown>;\n ascending: boolean;\n}\n\n/**\n * Implementation of QueryBuilder\n */\nexport class QueryBuilderImpl<\n TTable extends AnyDynamoTable,\n> implements QueryBuilder<TTable> {\n private table: TTable;\n private filters: FilterCondition[] = [];\n private indexName?: string;\n private limit?: number;\n private startKey?: TableKeyInput<TTable>;\n private ascending: boolean = true;\n private executor: QueryExecutor<TTable>;\n private operationTracker?: (op: TrackedQueryOperation) => void;\n\n constructor(\n table: TTable,\n executor: QueryExecutor<TTable>,\n operationTracker?: (op: TrackedQueryOperation) => void,\n ) {\n this.table = table;\n this.executor = executor;\n this.operationTracker = operationTracker;\n }\n\n filter(\n fn: (q: FilterBuilder<TTable>) => FilterCondition,\n ): QueryBuilder<TTable> {\n const builder = new FilterBuilderImpl<TTable>();\n const condition = fn(builder);\n this.filters.push(condition);\n return this;\n }\n\n useIndex(indexName: string): QueryBuilder<TTable> {\n this.indexName = indexName;\n return this;\n }\n\n take(limit: number): QueryBuilder<TTable> {\n this.limit = limit;\n return this;\n }\n\n startFrom(key: TableKeyInput<TTable>): QueryBuilder<TTable> {\n this.startKey = key;\n return this;\n }\n\n sortAscending(): QueryBuilder<TTable> {\n this.ascending = true;\n return this;\n }\n\n sortDescending(): QueryBuilder<TTable> {\n this.ascending = false;\n return this;\n }\n\n async execute(): Promise<TableItem<TTable>[]> {\n const operation: TrackedQueryOperation = {\n tableName: this.table.tableName,\n filters: this.filters,\n indexName: this.indexName,\n pkField: this.table.pk,\n skField: this.table.sk,\n sortField: this.table.sk, // Default sort by SK if available\n sortOrder: this.ascending ? 'asc' : 'desc',\n limit: this.limit,\n };\n\n // Track the operation for dependency extraction\n if (this.operationTracker) {\n this.operationTracker(operation);\n }\n\n const options: QueryOptions = {\n limit: this.limit,\n startKey: this.startKey as Record<string, unknown>,\n ascending: this.ascending,\n };\n\n return this.executor(operation, options);\n }\n\n /**\n * Get the current operation without executing\n * Used for dependency extraction\n */\n getOperation(): TrackedQueryOperation {\n return {\n tableName: this.table.tableName,\n filters: this.filters,\n indexName: this.indexName,\n pkField: this.table.pk,\n skField: this.table.sk,\n sortField: this.table.sk,\n sortOrder: this.ascending ? 'asc' : 'desc',\n limit: this.limit,\n };\n }\n}\n\n/**\n * Create a filter builder instance\n */\nexport function createFilterBuilder<\n TTable extends AnyDynamoTable,\n>(): FilterBuilder<TTable> {\n return new FilterBuilderImpl<TTable>();\n}\n","import {\n type AttributeValue,\n DynamoDBClient,\n ExecuteStatementCommand,\n} from '@aws-sdk/client-dynamodb';\nimport {\n DeleteCommand,\n DynamoDBDocumentClient,\n GetCommand,\n PutCommand,\n UpdateCommand,\n} from '@aws-sdk/lib-dynamodb';\nimport { unmarshall } from '@aws-sdk/util-dynamodb';\n\nimport type { DependencyTracker } from './dependency-extractor.js';\nimport {\n buildSelectStatement,\n type PartiQLStatement,\n} from './partiql-builder.js';\nimport { QueryBuilderImpl } from './query-builder.js';\nimport type {\n AnyDynamoTable,\n DatabaseContext,\n TableItem,\n TableKeyInput,\n TrackedQueryOperation,\n} from './types.js';\n\n/**\n * Configuration for creating a database context\n */\nexport interface DbContextConfig {\n client?: DynamoDBClient;\n region?: string;\n endpoint?: string;\n}\n\n/**\n * Create a DynamoDB Document client\n */\nfunction createDocClient(config: DbContextConfig): DynamoDBDocumentClient {\n const client =\n config.client ??\n new DynamoDBClient({\n region: config.region ?? process.env.AWS_REGION ?? 'us-east-1',\n endpoint: config.endpoint,\n });\n\n return DynamoDBDocumentClient.from(client, {\n marshallOptions: {\n removeUndefinedValues: true,\n convertEmptyValues: false,\n },\n unmarshallOptions: {\n wrapNumbers: false,\n },\n });\n}\n\n/**\n * Convert a JavaScript value to a DynamoDB AttributeValue\n */\nfunction toAttributeValue(value: unknown): AttributeValue {\n if (typeof value === 'string') return { S: value };\n if (typeof value === 'number') return { N: String(value) };\n if (typeof value === 'boolean') return { BOOL: value };\n if (value === null || value === undefined) return { NULL: true };\n if (Array.isArray(value)) {\n return { L: value.map(toAttributeValue) };\n }\n if (typeof value === 'object') {\n const m: Record<string, AttributeValue> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n m[k] = toAttributeValue(v);\n }\n return { M: m };\n }\n return { S: String(value) };\n}\n\n/**\n * Execute a PartiQL statement\n */\nasync function executePartiQL(\n docClient: DynamoDBDocumentClient,\n statement: PartiQLStatement,\n): Promise<Record<string, unknown>[]> {\n const command = new ExecuteStatementCommand({\n Statement: statement.statement,\n Parameters: statement.parameters.map(toAttributeValue),\n });\n\n const response = await docClient.send(command);\n // Unmarshall the DynamoDB AttributeValue format to plain JavaScript objects\n return (response.Items ?? []).map((item) =>\n unmarshall(item as Record<string, AttributeValue>),\n );\n}\n\n/**\n * Creates a database context for procedure execution\n */\nexport function createDbContext(\n config: DbContextConfig,\n dependencyTracker?: DependencyTracker,\n): DatabaseContext {\n const docClient = createDocClient(config);\n\n /**\n * Execute a query operation\n */\n async function executeQuery<TTable extends AnyDynamoTable>(\n operation: TrackedQueryOperation,\n options: {\n limit?: number;\n startKey?: Record<string, unknown>;\n ascending: boolean;\n },\n ): Promise<TableItem<TTable>[]> {\n const statement = buildSelectStatement(operation);\n\n const items = await executePartiQL(docClient, statement);\n\n // Apply limit client-side if needed (PartiQL doesn't support LIMIT directly)\n if (options.limit && items.length > options.limit) {\n return items.slice(0, options.limit) as TableItem<TTable>[];\n }\n\n return items as TableItem<TTable>[];\n }\n\n return {\n query<TTable extends AnyDynamoTable>(table: TTable) {\n return new QueryBuilderImpl<TTable>(\n table,\n executeQuery,\n dependencyTracker?.track.bind(dependencyTracker),\n );\n },\n\n async get<TItem = never, TTable extends AnyDynamoTable = AnyDynamoTable>(\n table: TTable,\n key: TableKeyInput<TTable>,\n ): Promise<([TItem] extends [never] ? TableItem<TTable> : TItem) | null> {\n const command = new GetCommand({\n TableName: table.tableName,\n Key: key as Record<string, unknown>,\n });\n\n const response = await docClient.send(command);\n return (\n (response.Item as [TItem] extends [never]\n ? TableItem<TTable>\n : TItem) ?? null\n );\n },\n\n async put<TTable extends AnyDynamoTable>(\n table: TTable,\n item: TableItem<TTable>,\n ): Promise<void> {\n // Validate the item against the schema\n table.validate(item);\n\n const command = new PutCommand({\n TableName: table.tableName,\n Item: item as Record<string, unknown>,\n });\n\n await docClient.send(command);\n },\n\n async delete<TTable extends AnyDynamoTable>(\n table: TTable,\n key: TableKeyInput<TTable>,\n ): Promise<void> {\n const command = new DeleteCommand({\n TableName: table.tableName,\n Key: key as Record<string, unknown>,\n });\n\n await docClient.send(command);\n },\n\n async update<TItem = never, TTable extends AnyDynamoTable = AnyDynamoTable>(\n table: TTable,\n key: TableKeyInput<TTable>,\n updates: Partial<[TItem] extends [never] ? TableItem<TTable> : TItem>,\n ): Promise<[TItem] extends [never] ? TableItem<TTable> : TItem> {\n type ResultType = [TItem] extends [never] ? TableItem<TTable> : TItem;\n\n const updateExpressions: string[] = [];\n const expressionAttributeNames: Record<string, string> = {};\n const expressionAttributeValues: Record<string, unknown> = {};\n\n let i = 0;\n for (const [field, value] of Object.entries(updates)) {\n if (field in (key as Record<string, unknown>)) continue;\n\n const nameKey = `#f${i}`;\n const valueKey = `:v${i}`;\n\n updateExpressions.push(`${nameKey} = ${valueKey}`);\n expressionAttributeNames[nameKey] = field;\n expressionAttributeValues[valueKey] = value;\n i++;\n }\n\n if (updateExpressions.length === 0) {\n // No updates, just return the current item\n const current = await this.get<TItem, TTable>(table, key);\n if (!current) {\n throw new Error('Item not found');\n }\n return current as ResultType;\n }\n\n const command = new UpdateCommand({\n TableName: table.tableName,\n Key: key as Record<string, unknown>,\n UpdateExpression: `SET ${updateExpressions.join(', ')}`,\n ExpressionAttributeNames: expressionAttributeNames,\n ExpressionAttributeValues: expressionAttributeValues,\n ReturnValues: 'ALL_NEW',\n });\n\n const response = await docClient.send(command);\n return response.Attributes as ResultType;\n },\n };\n}\n","import type { QueryMetadata } from '@dynamodb-reactive/core';\n\nimport type {\n FilterCondition,\n QueryDependency,\n TrackedQueryOperation,\n} from './types.js';\n\n/**\n * Extracts dependencies from a filter condition\n */\nfunction extractFromCondition(\n tableName: string,\n condition: FilterCondition,\n indexName?: string,\n): QueryDependency[] {\n const dependencies: QueryDependency[] = [];\n\n switch (condition.type) {\n case 'comparison': {\n // Only extract equality conditions as dependencies\n // These are the ones we can efficiently track\n if (\n condition.operator === '=' &&\n condition.field &&\n condition.value !== undefined\n ) {\n dependencies.push({\n tableName,\n fieldName: condition.field,\n fieldValue: String(condition.value),\n indexName,\n });\n }\n break;\n }\n\n case 'function': {\n // For begins_with, we can track the prefix as a dependency\n if (\n condition.operator === 'begins_with' &&\n condition.field &&\n condition.value\n ) {\n dependencies.push({\n tableName,\n fieldName: condition.field,\n fieldValue: `prefix:${String(condition.value)}`,\n indexName,\n });\n }\n break;\n }\n\n case 'logical': {\n // Recursively extract from logical conditions\n if (condition.conditions) {\n for (const subCondition of condition.conditions) {\n dependencies.push(\n ...extractFromCondition(tableName, subCondition, indexName),\n );\n }\n }\n break;\n }\n }\n\n return dependencies;\n}\n\n/**\n * Extract dependencies from a tracked query operation\n */\nexport function extractDependencies(\n operation: TrackedQueryOperation,\n): QueryDependency[] {\n const dependencies: QueryDependency[] = [];\n\n for (const filter of operation.filters) {\n dependencies.push(\n ...extractFromCondition(operation.tableName, filter, operation.indexName),\n );\n }\n\n return dependencies;\n}\n\n/**\n * Create a dependency key for the inverted index\n * Format: \"TableName#FieldName#FieldValue\"\n */\nexport function createDependencyKey(dependency: QueryDependency): string {\n return `${dependency.tableName}#${dependency.fieldName}#${dependency.fieldValue}`;\n}\n\n/**\n * Parse a dependency key back into its components\n */\nexport function parseDependencyKey(key: string): QueryDependency | null {\n const parts = key.split('#');\n if (parts.length < 3) return null;\n\n return {\n tableName: parts[0],\n fieldName: parts[1],\n fieldValue: parts.slice(2).join('#'), // Handle values that contain #\n };\n}\n\n/**\n * Extract affected dependency keys from a DynamoDB stream record\n * This finds all keys that might be affected by a change\n */\nexport function extractAffectedKeys(\n tableName: string,\n item: Record<string, unknown>,\n): string[] {\n const keys: string[] = [];\n\n for (const [fieldName, fieldValue] of Object.entries(item)) {\n if (fieldValue !== null && fieldValue !== undefined) {\n // Add exact match key\n keys.push(`${tableName}#${fieldName}#${String(fieldValue)}`);\n\n // Add prefix keys for string values (for begins_with queries)\n if (typeof fieldValue === 'string') {\n for (let i = 1; i <= fieldValue.length; i++) {\n keys.push(\n `${tableName}#${fieldName}#prefix:${fieldValue.substring(0, i)}`,\n );\n }\n }\n }\n }\n\n return keys;\n}\n\n/**\n * Convert a TrackedQueryOperation to QueryMetadata for storage.\n * Normalizes filter operators for evaluation.\n */\nexport function operationToQueryMetadata(\n operation: TrackedQueryOperation,\n): QueryMetadata {\n // Normalize operators to what the filter evaluator expects\n const normalizeFilters = (filters: FilterCondition[]): FilterCondition[] => {\n return filters.map((f) => normalizeFilter(f));\n };\n\n const normalizeFilter = (filter: FilterCondition): FilterCondition => {\n if (filter.type === 'comparison') {\n // Normalize operators: '=' -> 'eq', '<>' -> 'ne', etc.\n const operatorMap: Record<string, string> = {\n '=': 'eq',\n '<>': 'ne',\n '>': 'gt',\n '>=': 'gte',\n '<': 'lt',\n '<=': 'lte',\n };\n return {\n ...filter,\n operator: operatorMap[filter.operator ?? ''] ?? filter.operator,\n };\n }\n if (filter.type === 'function') {\n // Normalize function names\n const operatorMap: Record<string, string> = {\n begins_with: 'beginsWith',\n BETWEEN: 'between',\n };\n return {\n ...filter,\n operator: operatorMap[filter.operator ?? ''] ?? filter.operator,\n };\n }\n if (filter.type === 'logical' && filter.conditions) {\n // Normalize operators: 'AND' -> 'and', etc.\n const operatorMap: Record<string, string> = {\n AND: 'and',\n OR: 'or',\n NOT: 'not',\n };\n return {\n ...filter,\n operator: operatorMap[filter.operator ?? ''] ?? filter.operator,\n conditions: normalizeFilters(filter.conditions),\n };\n }\n return filter;\n };\n\n return {\n tableName: operation.tableName,\n indexName: operation.indexName,\n filterConditions: normalizeFilters(operation.filters),\n sortField: operation.sortField,\n sortOrder: operation.sortOrder,\n limit: operation.limit,\n };\n}\n\n/**\n * DependencyTracker - Tracks query operations during procedure execution\n */\nexport class DependencyTracker {\n private operations: TrackedQueryOperation[] = [];\n\n /**\n * Track a query operation\n */\n track(operation: TrackedQueryOperation): void {\n this.operations.push(operation);\n }\n\n /**\n * Get all tracked operations\n */\n getOperations(): TrackedQueryOperation[] {\n return [...this.operations];\n }\n\n /**\n * Extract all dependencies from tracked operations\n */\n extractAll(): QueryDependency[] {\n const dependencies: QueryDependency[] = [];\n\n for (const operation of this.operations) {\n dependencies.push(...extractDependencies(operation));\n }\n\n return dependencies;\n }\n\n /**\n * Get all dependency keys for the inverted index\n */\n getDependencyKeys(): string[] {\n return this.extractAll().map(createDependencyKey);\n }\n\n /**\n * Get query metadata for the first tracked operation.\n * Used for storing subscription state.\n */\n getQueryMetadata(): QueryMetadata | null {\n if (this.operations.length === 0) return null;\n // For now, we only support single-query subscriptions\n return operationToQueryMetadata(this.operations[0]);\n }\n\n /**\n * Get the primary key field from the first operation\n */\n getPkField(): string | null {\n if (this.operations.length === 0) return null;\n return this.operations[0].pkField;\n }\n\n /**\n * Get the sort key field from the first operation\n */\n getSkField(): string | undefined {\n if (this.operations.length === 0) return undefined;\n return this.operations[0].skField;\n }\n\n /**\n * Clear tracked operations\n */\n clear(): void {\n this.operations = [];\n }\n}\n","import type { JsonPatch } from '@dynamodb-reactive/core';\nimport jsonpatch, { type Operation } from 'fast-json-patch';\n\nconst { applyPatch, compare } = jsonpatch;\n\n/**\n * Generate JSON patches between two objects\n * Uses RFC 6902 JSON Patch format\n */\nexport function generatePatches(\n oldValue: unknown,\n newValue: unknown,\n): JsonPatch[] {\n const operations = compare(\n oldValue as Record<string, unknown>,\n newValue as Record<string, unknown>,\n );\n\n return operations.map((op) => ({\n op: op.op as JsonPatch['op'],\n path: op.path,\n value: 'value' in op ? op.value : undefined,\n from: 'from' in op ? op.from : undefined,\n }));\n}\n\n/**\n * Apply JSON patches to an object\n * Returns the patched result\n */\nexport function applyPatches<T>(document: T, patches: JsonPatch[]): T {\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 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}\n\n/**\n * Check if there are any changes between two values\n */\nexport function hasChanges(oldValue: unknown, newValue: unknown): boolean {\n const patches = generatePatches(oldValue, newValue);\n return patches.length > 0;\n}\n\n/**\n * Create a minimal patch that only includes necessary operations\n * Optimizes the patch by removing redundant operations\n */\nexport function optimizePatches(patches: JsonPatch[]): JsonPatch[] {\n // Filter out test operations and redundant operations\n const seen = new Set<string>();\n const optimized: JsonPatch[] = [];\n\n // Process patches in reverse to keep only the last operation for each path\n for (let i = patches.length - 1; i >= 0; i--) {\n const patch = patches[i];\n if (!seen.has(patch.path)) {\n seen.add(patch.path);\n optimized.unshift(patch);\n }\n }\n\n return optimized;\n}\n\n/**\n * Batch multiple patch sets into a single set\n */\nexport function batchPatches(patchSets: JsonPatch[][]): JsonPatch[] {\n const allPatches = patchSets.flat();\n return optimizePatches(allPatches);\n}\n","import { DynamoDBClient } from '@aws-sdk/client-dynamodb';\nimport {\n DeleteCommand,\n DynamoDBDocumentClient,\n GetCommand,\n PutCommand,\n} from '@aws-sdk/lib-dynamodb';\nimport type { ConnectionEntry, QueryEntry } from '@dynamodb-reactive/core';\nimport { SystemTableNames } from '@dynamodb-reactive/core';\n\nimport { createDbContext, type DbContextConfig } from '../db-context.js';\nimport { DependencyTracker } from '../dependency-extractor.js';\nimport type { Router } from '../router.js';\nimport type {\n DatabaseContext,\n RouterCaller,\n RouterDefinition,\n} from '../types.js';\n\n/**\n * Request types for the reactive handler.\n * All requests include connectionId from the WebSocket connection.\n */\nexport interface SubscribeRequest {\n type: 'subscribe';\n connectionId: string;\n subscriptionId: string;\n path: string;\n input: unknown;\n}\n\nexport interface UnsubscribeRequest {\n type: 'unsubscribe';\n connectionId: string;\n subscriptionId: string;\n}\n\nexport interface CallRequest {\n type: 'call';\n connectionId: string;\n path: string;\n input: unknown;\n}\n\nexport type ReactiveRequest =\n | SubscribeRequest\n | UnsubscribeRequest\n | CallRequest;\n\n/**\n * Response types for the reactive handler\n */\nexport interface SnapshotResponse {\n type: 'snapshot';\n subscriptionId: string;\n data: unknown;\n}\n\nexport interface PatchResponse {\n type: 'patch';\n subscriptionId: string;\n patches: unknown[];\n}\n\nexport interface ResultResponse {\n type: 'result';\n data: unknown;\n}\n\nexport interface ErrorResponse {\n type: 'error';\n message: string;\n /** HTTP status code (e.g., 400, 403, 404, 500) */\n code?: number;\n subscriptionId?: string;\n}\n\nexport type ReactiveResponse =\n | SnapshotResponse\n | PatchResponse\n | ResultResponse\n | ErrorResponse;\n\n/**\n * Request info passed to getContext for extracting user context\n */\nexport interface RequestInfo {\n connectionId: string;\n /** Headers from the HTTP request (for auth, user info, etc.) */\n headers?: Record<string, string>;\n}\n\n/**\n * Configuration for the reactive handler\n */\nexport interface ReactiveHandlerConfig<\n TContext,\n TRouter extends RouterDefinition<TContext> = RouterDefinition<TContext>,\n> {\n router: Router<TContext, TRouter>;\n dbConfig?: DbContextConfig;\n getContext: (requestInfo: RequestInfo) => Promise<TContext>;\n ttlSeconds?: number;\n /** Prefix for system table names (e.g., 'TodoApp' creates 'TodoApp-ReactiveConnections') */\n tablePrefix?: string;\n}\n\n/**\n * Create a reactive handler for Next.js API routes or other HTTP servers.\n * This handler is used for subscribe/call requests and stores queryMetadata\n * for the stream handler to use later.\n */\nexport function createReactiveHandler<\n TContext,\n TRouter extends RouterDefinition<TContext>,\n>(config: ReactiveHandlerConfig<TContext, TRouter>) {\n const ttlSeconds = config.ttlSeconds ?? 3600; // 1 hour default\n // Add dash after prefix like CDK does\n const prefix = config.tablePrefix ? `${config.tablePrefix}-` : '';\n const connectionsTable = `${prefix}${SystemTableNames.connections}`;\n const dependenciesTable = `${prefix}${SystemTableNames.dependencies}`;\n const queriesTable = `${prefix}${SystemTableNames.queries}`;\n\n // Create DynamoDB client\n const ddbClient = new DynamoDBClient({\n region: config.dbConfig?.region ?? process.env.AWS_REGION,\n });\n const docClient = DynamoDBDocumentClient.from(ddbClient, {\n marshallOptions: { removeUndefinedValues: true },\n });\n\n /**\n * Handle an incoming request.\n * The connectionId is now included in the request body from the client.\n * @param request The reactive request from the client\n * @param headers Optional HTTP headers for auth/user context\n */\n async function handleRequest(\n request: ReactiveRequest,\n headers?: Record<string, string>,\n ): Promise<ReactiveResponse> {\n try {\n const connectionId = request.connectionId;\n const ctx = await config.getContext({ connectionId, headers });\n const dependencyTracker = new DependencyTracker();\n const db = createDbContext(config.dbConfig ?? {}, dependencyTracker);\n const fullCtx = { ...ctx, db } as TContext & { db: DatabaseContext };\n\n switch (request.type) {\n case 'subscribe':\n return await handleSubscribe(\n connectionId,\n request,\n fullCtx,\n dependencyTracker,\n );\n\n case 'unsubscribe':\n return await handleUnsubscribe(connectionId, request);\n\n case 'call':\n return await handleCall(request, fullCtx);\n\n default:\n return {\n type: 'error',\n message: `Unknown request type: ${(request as { type: string }).type}`,\n };\n }\n } catch (error) {\n return {\n type: 'error',\n message: error instanceof Error ? error.message : 'Unknown error',\n code: (error as { code?: number }).code,\n subscriptionId:\n 'subscriptionId' in request ? request.subscriptionId : undefined,\n };\n }\n }\n\n /**\n * Handle a subscribe request.\n * Executes the query, stores queryMetadata for stream handler, returns initial data.\n */\n async function handleSubscribe(\n connectionId: string,\n request: SubscribeRequest,\n ctx: TContext & { db: DatabaseContext },\n dependencyTracker: DependencyTracker,\n ): Promise<ReactiveResponse> {\n // Execute the query to get initial data\n const result = await config.router.execute(\n request.path,\n ctx,\n request.input,\n );\n\n // Get query metadata and dependencies\n const queryMetadata = dependencyTracker.getQueryMetadata();\n const dependencyKeys = dependencyTracker.getDependencyKeys();\n\n if (!queryMetadata) {\n console.warn('No query metadata captured for subscription');\n }\n\n const now = Date.now();\n const ttl = Math.floor(now / 1000) + ttlSeconds;\n\n // Store the subscription with queryMetadata\n const queryEntry: QueryEntry = {\n pk: connectionId,\n sk: request.subscriptionId,\n connectionId,\n subscriptionId: request.subscriptionId,\n queryMetadata: queryMetadata ?? {\n tableName: '',\n filterConditions: [],\n },\n lastResult: Array.isArray(result) ? result : [result],\n dependencies: dependencyKeys,\n createdAt: now,\n updatedAt: now,\n ttl,\n };\n\n await docClient.send(\n new PutCommand({\n TableName: queriesTable,\n Item: queryEntry,\n }),\n );\n\n // Store dependency entries (inverted index)\n for (const key of dependencyKeys) {\n await docClient.send(\n new PutCommand({\n TableName: dependenciesTable,\n Item: {\n pk: key,\n sk: `${connectionId}#${request.subscriptionId}`,\n connectionId,\n subscriptionId: request.subscriptionId,\n ttl,\n },\n }),\n );\n }\n\n console.log('Subscription created:', {\n connectionId,\n subscriptionId: request.subscriptionId,\n queryMetadata: queryMetadata?.tableName,\n dependencies: dependencyKeys,\n });\n\n return {\n type: 'snapshot',\n subscriptionId: request.subscriptionId,\n data: result,\n };\n }\n\n /**\n * Handle an unsubscribe request\n */\n async function handleUnsubscribe(\n connectionId: string,\n request: UnsubscribeRequest,\n ): Promise<ReactiveResponse> {\n // Get the subscription to find its dependencies\n const subResponse = await docClient.send(\n new GetCommand({\n TableName: queriesTable,\n Key: { pk: connectionId, sk: request.subscriptionId },\n }),\n );\n\n if (subResponse.Item) {\n const queryEntry = subResponse.Item as QueryEntry;\n\n // Delete dependency entries\n for (const key of queryEntry.dependencies ?? []) {\n await docClient.send(\n new DeleteCommand({\n TableName: dependenciesTable,\n Key: { pk: key, sk: `${connectionId}#${request.subscriptionId}` },\n }),\n );\n }\n }\n\n // Delete the subscription\n await docClient.send(\n new DeleteCommand({\n TableName: queriesTable,\n Key: { pk: connectionId, sk: request.subscriptionId },\n }),\n );\n\n console.log('Subscription removed:', {\n connectionId,\n subscriptionId: request.subscriptionId,\n });\n\n return {\n type: 'result',\n data: { success: true },\n };\n }\n\n /**\n * Handle a call (mutation) request\n */\n async function handleCall(\n request: CallRequest,\n ctx: TContext & { db: DatabaseContext },\n ): Promise<ReactiveResponse> {\n const result = await config.router.execute(\n request.path,\n ctx,\n request.input,\n );\n\n return {\n type: 'result',\n data: result,\n };\n }\n\n /**\n * Register a new connection\n */\n async function registerConnection(\n connectionId: string,\n context?: Record<string, unknown>,\n ): Promise<void> {\n const now = Date.now();\n const ttl = Math.floor(now / 1000) + ttlSeconds;\n\n const connectionEntry: ConnectionEntry = {\n connectionId,\n context,\n connectedAt: now,\n ttl,\n };\n\n await docClient.send(\n new PutCommand({\n TableName: connectionsTable,\n Item: connectionEntry,\n }),\n );\n\n console.log('Connection registered:', connectionEntry);\n }\n\n /**\n * Unregister a connection and clean up subscriptions\n */\n async function unregisterConnection(connectionId: string): Promise<void> {\n // Delete the connection\n await docClient.send(\n new DeleteCommand({\n TableName: connectionsTable,\n Key: { connectionId },\n }),\n );\n\n // TODO: Clean up all subscriptions for this connection\n\n console.log('Connection unregistered:', connectionId);\n }\n\n /**\n * Execute a query without creating a subscription.\n * Useful for SSR or one-time data fetches.\n */\n async function query<T = unknown>(\n path: string,\n input?: unknown,\n headers?: Record<string, string>,\n ): Promise<T> {\n const ctx = await config.getContext({ connectionId: 'query', headers });\n const dependencyTracker = new DependencyTracker();\n const db = createDbContext(config.dbConfig ?? {}, dependencyTracker);\n const fullCtx = { ...ctx, db } as TContext & { db: DatabaseContext };\n\n return config.router.execute(path, fullCtx, input) as Promise<T>;\n }\n\n /**\n * Create a type-safe caller for server-side procedure execution.\n * Provides full type inference for procedure inputs and outputs.\n *\n * @example\n * ```ts\n * const caller = handler.createCaller();\n * const todos = await caller.todos.list({}); // Type-safe!\n * ```\n */\n function createCaller(): RouterCaller<TRouter> {\n function buildProxy(path: string[] = []): unknown {\n return new Proxy(() => {}, {\n get(_target, prop: string) {\n return buildProxy([...path, prop]);\n },\n apply(_target, _thisArg, args: unknown[]) {\n const procedurePath = path.join('.');\n return query(procedurePath, args[0]);\n },\n });\n }\n\n return buildProxy() as RouterCaller<TRouter>;\n }\n\n return {\n handleRequest,\n registerConnection,\n unregisterConnection,\n query,\n createCaller,\n };\n}\n","import {\n ApiGatewayManagementApiClient,\n GoneException,\n PostToConnectionCommand,\n} from '@aws-sdk/client-apigatewaymanagementapi';\nimport {\n type AttributeValue,\n DynamoDBClient,\n ExecuteStatementCommand,\n} from '@aws-sdk/client-dynamodb';\nimport {\n DeleteCommand,\n DynamoDBDocumentClient,\n GetCommand,\n QueryCommand,\n} from '@aws-sdk/lib-dynamodb';\nimport { unmarshall } from '@aws-sdk/util-dynamodb';\nimport type {\n FilterCondition,\n JsonPatch,\n QueryEntry,\n QueryMetadata,\n} from '@dynamodb-reactive/core';\nimport { SystemTableNames } from '@dynamodb-reactive/core';\nimport type { DynamoDBRecord, DynamoDBStreamEvent } from 'aws-lambda';\n\nimport type { DbContextConfig } from '../db-context.js';\nimport { extractAffectedKeys } from '../dependency-extractor.js';\nimport { generatePatches, hasChanges } from '../patcher.js';\n\n/**\n * Configuration for the stream handler.\n * NOTE: Router is no longer required - stream processing uses stored query metadata.\n */\nexport interface StreamHandlerConfig {\n dbConfig?: DbContextConfig;\n apiGatewayEndpoint: string;\n connectionsTableName?: string;\n dependenciesTableName?: string;\n queriesTableName?: string;\n}\n\n/**\n * Create a DynamoDB stream handler for AWS Lambda.\n * Uses stored query metadata to re-execute queries WITHOUT router code.\n */\nexport function createStreamHandler(config: StreamHandlerConfig) {\n const connectionsTable =\n config.connectionsTableName ?? SystemTableNames.connections;\n const dependenciesTable =\n config.dependenciesTableName ?? SystemTableNames.dependencies;\n const queriesTable = config.queriesTableName ?? SystemTableNames.queries;\n\n // Create DynamoDB client\n const ddbClient = new DynamoDBClient({\n region: config.dbConfig?.region ?? process.env.AWS_REGION,\n });\n const docClient = DynamoDBDocumentClient.from(ddbClient);\n\n // Create API Gateway Management client\n const apiClient = new ApiGatewayManagementApiClient({\n endpoint: config.apiGatewayEndpoint,\n });\n\n /**\n * Main Lambda handler\n */\n async function handler(event: DynamoDBStreamEvent): Promise<void> {\n const affectedSubscriptions = new Map<string, Set<string>>();\n\n // Process each record in the stream\n for (const record of event.Records) {\n if (!record.dynamodb) continue;\n\n const tableName = extractTableName(record);\n if (!tableName) continue;\n\n // Get the new and old images\n const newImage = record.dynamodb.NewImage\n ? unmarshall(record.dynamodb.NewImage as Record<string, AttributeValue>)\n : null;\n const oldImage = record.dynamodb.OldImage\n ? unmarshall(record.dynamodb.OldImage as Record<string, AttributeValue>)\n : null;\n\n // Extract affected dependency keys\n const affectedKeys = new Set<string>();\n if (newImage) {\n for (const key of extractAffectedKeys(tableName, newImage)) {\n affectedKeys.add(key);\n }\n }\n if (oldImage) {\n for (const key of extractAffectedKeys(tableName, oldImage)) {\n affectedKeys.add(key);\n }\n }\n\n // Find subscriptions affected by these keys\n for (const key of affectedKeys) {\n const subscriptions = await findAffectedSubscriptions(key);\n for (const sub of subscriptions) {\n const connId = sub.connectionId;\n const subId = sub.subscriptionId;\n if (!affectedSubscriptions.has(connId)) {\n affectedSubscriptions.set(connId, new Set());\n }\n affectedSubscriptions.get(connId)!.add(subId);\n }\n }\n }\n\n // Process each affected subscription\n const sendPromises: Promise<void>[] = [];\n for (const [connectionId, subscriptionIds] of affectedSubscriptions) {\n for (const subscriptionId of subscriptionIds) {\n sendPromises.push(processSubscription(connectionId, subscriptionId));\n }\n }\n\n await Promise.allSettled(sendPromises);\n }\n\n /**\n * Extract table name from a stream record\n */\n function extractTableName(record: DynamoDBRecord): string | null {\n // The table name is in the eventSourceARN\n const arn = record.eventSourceARN;\n if (!arn) return null;\n\n // ARN format: arn:aws:dynamodb:region:account:table/table-name/stream/...\n const match = arn.match(/table\\/([^/]+)/);\n return match ? match[1] : null;\n }\n\n /**\n * Find subscriptions affected by a dependency key\n */\n async function findAffectedSubscriptions(\n dependencyKey: string,\n ): Promise<{ connectionId: string; subscriptionId: string }[]> {\n try {\n const response = await docClient.send(\n new QueryCommand({\n TableName: dependenciesTable,\n KeyConditionExpression: 'pk = :pk',\n ExpressionAttributeValues: {\n ':pk': dependencyKey,\n },\n }),\n );\n\n return (response.Items ?? []).map((item) => ({\n connectionId: item.connectionId as string,\n subscriptionId: item.subscriptionId as string,\n }));\n } catch (error) {\n console.error('Error finding affected subscriptions:', error);\n return [];\n }\n }\n\n /**\n * Process a single subscription: re-execute query using metadata, diff, and send patch\n */\n async function processSubscription(\n connectionId: string,\n subscriptionId: string,\n ): Promise<void> {\n try {\n // Get the subscription state\n const queryState = await getQueryState(connectionId, subscriptionId);\n if (!queryState) {\n console.warn(\n `Subscription not found: ${connectionId}/${subscriptionId}`,\n );\n return;\n }\n\n // Re-execute the query using stored metadata\n const newResult = await executeQueryFromMetadata(\n queryState.queryMetadata,\n );\n\n // Check if there are changes\n if (!hasChanges(queryState.lastResult, newResult)) {\n return;\n }\n\n // Generate patches\n const patches = generatePatches(queryState.lastResult, newResult);\n\n // Update the stored state\n await updateQueryState(connectionId, subscriptionId, newResult);\n\n // Send the patch to the client\n await sendPatch(connectionId, subscriptionId, patches);\n } catch (error) {\n if (error instanceof GoneException) {\n // Connection is gone, clean up\n await cleanupConnection(connectionId);\n } else {\n console.error(\n `Error processing subscription ${connectionId}/${subscriptionId}:`,\n error,\n );\n }\n }\n }\n\n /**\n * Get the stored query state\n */\n async function getQueryState(\n connectionId: string,\n subscriptionId: string,\n ): Promise<QueryEntry | null> {\n try {\n const response = await docClient.send(\n new GetCommand({\n TableName: queriesTable,\n Key: {\n pk: connectionId,\n sk: subscriptionId,\n },\n }),\n );\n\n return (response.Item as QueryEntry) ?? null;\n } catch (error) {\n console.error('Error getting query state:', error);\n return null;\n }\n }\n\n /**\n * Execute a query using stored QueryMetadata.\n * Uses PartiQL to query DynamoDB directly without router code.\n */\n async function executeQueryFromMetadata(\n metadata: QueryMetadata,\n ): Promise<unknown[]> {\n const { tableName, filterConditions, sortOrder, limit } = metadata;\n\n // Build WHERE clause from filter conditions\n const whereClause = buildWhereClause(filterConditions);\n const orderClause = sortOrder === 'desc' ? 'ORDER BY SK DESC' : '';\n const limitClause = limit ? `LIMIT ${limit}` : '';\n\n const statement =\n `SELECT * FROM \"${tableName}\" ${whereClause} ${orderClause} ${limitClause}`.trim();\n\n try {\n const result = await ddbClient.send(\n new ExecuteStatementCommand({\n Statement: statement,\n }),\n );\n\n return (result.Items ?? []).map((item) =>\n unmarshall(item as Record<string, AttributeValue>),\n );\n } catch (error) {\n console.error('Error executing query from metadata:', error);\n console.error('Statement:', statement);\n return [];\n }\n }\n\n /**\n * Build WHERE clause from filter conditions.\n */\n function buildWhereClause(conditions: FilterCondition[]): string {\n if (conditions.length === 0) return '';\n\n const clauses = conditions\n .map((c) => buildConditionClause(c))\n .filter(Boolean);\n if (clauses.length === 0) return '';\n\n return `WHERE ${clauses.join(' AND ')}`;\n }\n\n /**\n * Build a single condition clause for PartiQL.\n */\n function buildConditionClause(condition: FilterCondition): string {\n const { type, operator, field, value, value2, conditions } = condition;\n\n if (type === 'comparison' && field) {\n const escapedValue = escapeValue(value);\n switch (operator) {\n case 'eq':\n return `\"${field}\" = ${escapedValue}`;\n case 'ne':\n return `\"${field}\" <> ${escapedValue}`;\n case 'gt':\n return `\"${field}\" > ${escapedValue}`;\n case 'gte':\n return `\"${field}\" >= ${escapedValue}`;\n case 'lt':\n return `\"${field}\" < ${escapedValue}`;\n case 'lte':\n return `\"${field}\" <= ${escapedValue}`;\n case 'between':\n return `\"${field}\" BETWEEN ${escapedValue} AND ${escapeValue(value2)}`;\n case undefined:\n default:\n return '';\n }\n }\n\n if (type === 'function' && field) {\n const escapedValue = escapeValue(value);\n switch (operator) {\n case 'beginsWith':\n return `begins_with(\"${field}\", ${escapedValue})`;\n case 'contains':\n return `contains(\"${field}\", ${escapedValue})`;\n case undefined:\n default:\n return '';\n }\n }\n\n if (type === 'logical' && conditions) {\n const subclauses = conditions\n .map((c) => buildConditionClause(c))\n .filter(Boolean);\n if (subclauses.length === 0) return '';\n\n switch (operator) {\n case 'and':\n return `(${subclauses.join(' AND ')})`;\n case 'or':\n return `(${subclauses.join(' OR ')})`;\n case 'not':\n return subclauses.length > 0 ? `NOT (${subclauses[0]})` : '';\n case undefined:\n default:\n return '';\n }\n }\n\n return '';\n }\n\n /**\n * Escape a value for PartiQL.\n */\n function escapeValue(value: unknown): string {\n if (value === null || value === undefined) return 'NULL';\n if (typeof value === 'string') return `'${value.replace(/'/g, \"''\")}'`;\n if (typeof value === 'number') return String(value);\n if (typeof value === 'boolean') return value ? 'TRUE' : 'FALSE';\n return `'${String(value).replace(/'/g, \"''\")}'`;\n }\n\n /**\n * Update the stored query state\n */\n async function updateQueryState(\n connectionId: string,\n subscriptionId: string,\n newResult: unknown[],\n ): Promise<void> {\n try {\n const existing = await getQueryState(connectionId, subscriptionId);\n if (!existing) return;\n\n await docClient.send(\n new GetCommand({\n TableName: queriesTable,\n Key: { pk: connectionId, sk: subscriptionId },\n }),\n );\n\n // Update with new result\n const { PutCommand } = await import('@aws-sdk/lib-dynamodb');\n await docClient.send(\n new PutCommand({\n TableName: queriesTable,\n Item: {\n ...existing,\n lastResult: newResult,\n updatedAt: Date.now(),\n },\n }),\n );\n } catch (error) {\n console.error('Error updating query state:', error);\n }\n }\n\n /**\n * Send a patch to the client via WebSocket\n */\n async function sendPatch(\n connectionId: string,\n subscriptionId: string,\n patches: JsonPatch[],\n ): Promise<void> {\n const message = JSON.stringify({\n type: 'patch',\n subscriptionId,\n patches,\n });\n\n try {\n await apiClient.send(\n new PostToConnectionCommand({\n ConnectionId: connectionId,\n Data: Buffer.from(message),\n }),\n );\n } catch (error) {\n if (error instanceof GoneException) {\n throw error; // Propagate to trigger cleanup\n }\n console.error(`Error sending patch to ${connectionId}:`, error);\n }\n }\n\n /**\n * Clean up a disconnected connection\n */\n async function cleanupConnection(connectionId: string): Promise<void> {\n console.log('Cleaning up disconnected connection:', connectionId);\n\n try {\n // 1. Get all subscriptions for this connection\n const queriesResponse = await docClient.send(\n new QueryCommand({\n TableName: queriesTable,\n KeyConditionExpression: 'pk = :pk',\n ExpressionAttributeValues: {\n ':pk': connectionId,\n },\n }),\n );\n\n const subscriptions = queriesResponse.Items ?? [];\n\n // 2. Delete dependencies for each subscription\n for (const sub of subscriptions) {\n const deps = (sub.dependencies as string[]) ?? [];\n for (const depKey of deps) {\n await docClient.send(\n new DeleteCommand({\n TableName: dependenciesTable,\n Key: {\n pk: depKey,\n sk: `${connectionId}#${sub.sk}`,\n },\n }),\n );\n }\n\n // 3. Delete the subscription\n await docClient.send(\n new DeleteCommand({\n TableName: queriesTable,\n Key: {\n pk: connectionId,\n sk: sub.sk as string,\n },\n }),\n );\n }\n\n // 4. Delete the connection entry\n await docClient.send(\n new DeleteCommand({\n TableName: connectionsTable,\n Key: {\n connectionId,\n },\n }),\n );\n\n console.log(\n `Cleaned up connection ${connectionId}: ${subscriptions.length} subscriptions removed`,\n );\n } catch (error) {\n console.error('Error cleaning up connection:', error);\n }\n }\n\n return { handler };\n}\n\n/**\n * WebSocket connection handler for $connect\n */\nexport function createConnectHandler(\n config: Pick<StreamHandlerConfig, 'dbConfig' | 'connectionsTableName'>,\n) {\n const connectionsTable =\n config.connectionsTableName ?? SystemTableNames.connections;\n const ddbClient = new DynamoDBClient({\n region: config.dbConfig?.region ?? process.env.AWS_REGION,\n });\n const docClient = DynamoDBDocumentClient.from(ddbClient);\n\n return async function handler(event: {\n requestContext: {\n connectionId: string;\n authorizer?: Record<string, unknown>;\n };\n }): Promise<{ statusCode: number }> {\n const connectionId = event.requestContext.connectionId;\n\n try {\n await docClient.send(\n new QueryCommand({\n TableName: connectionsTable,\n KeyConditionExpression: 'connectionId = :cid',\n ExpressionAttributeValues: {\n ':cid': connectionId,\n },\n }),\n );\n\n console.log('Connection established:', connectionId);\n return { statusCode: 200 };\n } catch (error) {\n console.error('Error creating connection:', error);\n return { statusCode: 500 };\n }\n };\n}\n\n/**\n * WebSocket disconnection handler for $disconnect\n */\nexport function createDisconnectHandler(\n config: Pick<\n StreamHandlerConfig,\n | 'dbConfig'\n | 'connectionsTableName'\n | 'queriesTableName'\n | 'dependenciesTableName'\n >,\n) {\n const connectionsTable =\n config.connectionsTableName ?? SystemTableNames.connections;\n const ddbClient = new DynamoDBClient({\n region: config.dbConfig?.region ?? process.env.AWS_REGION,\n });\n const docClient = DynamoDBDocumentClient.from(ddbClient);\n\n return async function handler(event: {\n requestContext: { connectionId: string };\n }): Promise<{ statusCode: number }> {\n const connectionId = event.requestContext.connectionId;\n\n try {\n await docClient.send(\n new DeleteCommand({\n TableName: connectionsTable,\n Key: { connectionId },\n }),\n );\n\n console.log('Connection removed:', connectionId);\n return { statusCode: 200 };\n } catch (error) {\n console.error('Error removing connection:', error);\n return { statusCode: 500 };\n }\n };\n}\n","/**\n * Lambda handler implementations for the reactive WebSocket system.\n *\n * These handlers process WebSocket events and DynamoDB stream events\n * WITHOUT requiring user router code at runtime.\n *\n * Stream processing uses stored query metadata to evaluate changes\n * directly, rather than re-executing queries through a router.\n */\n\nimport {\n ApiGatewayManagementApiClient,\n GoneException,\n PostToConnectionCommand,\n} from '@aws-sdk/client-apigatewaymanagementapi';\nimport { type AttributeValue, DynamoDBClient } from '@aws-sdk/client-dynamodb';\nimport {\n DeleteCommand,\n DynamoDBDocumentClient,\n GetCommand,\n PutCommand,\n QueryCommand,\n} from '@aws-sdk/lib-dynamodb';\nimport { unmarshall } from '@aws-sdk/util-dynamodb';\nimport type {\n ConnectionEntry,\n JsonPatch,\n QueryEntry,\n QueryMetadata,\n} from '@dynamodb-reactive/core';\nimport { SystemTableNames } from '@dynamodb-reactive/core';\nimport type {\n APIGatewayProxyEvent,\n APIGatewayProxyResult,\n DynamoDBRecord,\n DynamoDBStreamEvent,\n} from 'aws-lambda';\n\nimport { extractAffectedKeys } from '../dependency-extractor.js';\nimport { generatePatches, hasChanges } from '../patcher.js';\n\n/**\n * Create all Lambda handlers.\n * No user code required - all configuration comes from environment variables.\n * The stream handler uses stored query metadata (PartiQL), not router code.\n */\nexport function createLambdaHandlers() {\n // Get table names from environment\n const connectionsTable =\n process.env.CONNECTIONS_TABLE ?? SystemTableNames.connections;\n const dependenciesTable =\n process.env.DEPENDENCIES_TABLE ?? SystemTableNames.dependencies;\n const queriesTable = process.env.QUERIES_TABLE ?? SystemTableNames.queries;\n const wsEndpoint = process.env.WEBSOCKET_ENDPOINT ?? '';\n\n // Create DynamoDB client\n const ddbClient = new DynamoDBClient({\n region: process.env.AWS_REGION,\n });\n const docClient = DynamoDBDocumentClient.from(ddbClient);\n\n // Create API Gateway Management client (lazy to avoid endpoint issues during init)\n const getApiClient = () =>\n new ApiGatewayManagementApiClient({\n endpoint: wsEndpoint,\n });\n\n /**\n * $connect handler - Register new WebSocket connections\n */\n async function connectHandler(\n event: APIGatewayProxyEvent,\n ): Promise<APIGatewayProxyResult> {\n const connectionId = event.requestContext.connectionId!;\n const now = Date.now();\n const ttl = Math.floor(now / 1000) + 3600; // 1 hour TTL\n\n try {\n const connectionEntry: ConnectionEntry = {\n connectionId,\n context: event.requestContext.authorizer as\n | Record<string, unknown>\n | undefined,\n connectedAt: now,\n ttl,\n };\n\n await docClient.send(\n new PutCommand({\n TableName: connectionsTable,\n Item: connectionEntry,\n }),\n );\n\n console.log('Connection established:', connectionId);\n return { statusCode: 200, body: 'Connected' };\n } catch (error) {\n console.error('Error creating connection:', error);\n return { statusCode: 500, body: 'Failed to connect' };\n }\n }\n\n /**\n * $disconnect handler - Clean up disconnected connections\n */\n async function disconnectHandler(\n event: APIGatewayProxyEvent,\n ): Promise<APIGatewayProxyResult> {\n const connectionId = event.requestContext.connectionId!;\n\n try {\n // Delete the connection entry\n await docClient.send(\n new DeleteCommand({\n TableName: connectionsTable,\n Key: { connectionId },\n }),\n );\n\n // TODO: Clean up queries and dependencies for this connection\n\n console.log('Connection removed:', connectionId);\n return { statusCode: 200, body: 'Disconnected' };\n } catch (error) {\n console.error('Error removing connection:', error);\n return { statusCode: 500, body: 'Failed to disconnect' };\n }\n }\n\n /**\n * $default handler - Handle WebSocket messages\n * Handles: init (returns connectionId), unsubscribe\n * Subscribe/call are handled by the app's HTTP API route.\n */\n async function messageHandler(\n event: APIGatewayProxyEvent,\n ): Promise<APIGatewayProxyResult> {\n const connectionId = event.requestContext.connectionId!;\n\n try {\n const body = JSON.parse(event.body ?? '{}');\n const { type, subscriptionId } = body;\n\n let response: unknown;\n\n switch (type) {\n case 'init': {\n // Client requests its connectionId after WebSocket connects\n // This is needed so the client can include connectionId in HTTP requests\n response = {\n type: 'connected',\n connectionId,\n };\n break;\n }\n\n case 'ping': {\n // Client verifies connection is fully working with ping/pong\n response = {\n type: 'pong',\n };\n break;\n }\n\n case 'unsubscribe': {\n // Get the subscription to find its dependencies\n const subResponse = await docClient.send(\n new GetCommand({\n TableName: queriesTable,\n Key: { pk: connectionId, sk: subscriptionId },\n }),\n );\n\n if (subResponse.Item) {\n const queryEntry = subResponse.Item as QueryEntry;\n\n // Delete dependency entries\n for (const key of queryEntry.dependencies ?? []) {\n await docClient.send(\n new DeleteCommand({\n TableName: dependenciesTable,\n Key: { pk: key, sk: `${connectionId}#${subscriptionId}` },\n }),\n );\n }\n }\n\n // Delete the subscription\n await docClient.send(\n new DeleteCommand({\n TableName: queriesTable,\n Key: { pk: connectionId, sk: subscriptionId },\n }),\n );\n\n response = { type: 'result', data: { success: true } };\n break;\n }\n\n default:\n // Subscribe and call are handled by the app's HTTP API route\n // which has access to the router\n response = {\n type: 'error',\n message: `Message type '${type}' should be handled by the app API route`,\n };\n }\n\n // Send response back through WebSocket\n const apiClient = getApiClient();\n await apiClient.send(\n new PostToConnectionCommand({\n ConnectionId: connectionId,\n Data: Buffer.from(JSON.stringify(response)),\n }),\n );\n\n return { statusCode: 200, body: 'OK' };\n } catch (error) {\n console.error('Error handling message:', error);\n return { statusCode: 500, body: 'Internal server error' };\n }\n }\n\n /**\n * DynamoDB Stream handler - Process changes and push updates.\n * Uses stored query metadata to evaluate changes WITHOUT router code.\n */\n async function streamHandler(event: DynamoDBStreamEvent): Promise<void> {\n const affectedSubscriptions = new Map<\n string,\n Map<\n string,\n {\n oldImage: Record<string, unknown> | null;\n newImage: Record<string, unknown> | null;\n }\n >\n >();\n\n // Process each record in the stream\n for (const record of event.Records) {\n if (!record.dynamodb) continue;\n\n const tableName = extractTableName(record);\n if (!tableName) continue;\n\n // Get the new and old images\n const newImage = record.dynamodb.NewImage\n ? unmarshall(record.dynamodb.NewImage as Record<string, AttributeValue>)\n : null;\n const oldImage = record.dynamodb.OldImage\n ? unmarshall(record.dynamodb.OldImage as Record<string, AttributeValue>)\n : null;\n\n // Extract affected dependency keys\n const affectedKeys = new Set<string>();\n if (newImage) {\n for (const key of extractAffectedKeys(tableName, newImage)) {\n affectedKeys.add(key);\n }\n }\n if (oldImage) {\n for (const key of extractAffectedKeys(tableName, oldImage)) {\n affectedKeys.add(key);\n }\n }\n\n // Find subscriptions affected by these keys\n for (const key of affectedKeys) {\n const subscriptions = await findAffectedSubscriptions(key);\n for (const sub of subscriptions) {\n const connId = sub.connectionId;\n const subId = sub.subscriptionId;\n\n if (!affectedSubscriptions.has(connId)) {\n affectedSubscriptions.set(connId, new Map());\n }\n const connSubs = affectedSubscriptions.get(connId)!;\n\n // Store the record change for this subscription\n // If already tracked, merge (for batch updates to same record)\n if (!connSubs.has(subId)) {\n connSubs.set(subId, { oldImage, newImage });\n }\n }\n }\n }\n\n // Process each affected subscription\n const sendPromises: Promise<void>[] = [];\n for (const [connectionId, subscriptions] of affectedSubscriptions) {\n for (const [subscriptionId] of subscriptions) {\n sendPromises.push(processSubscription(connectionId, subscriptionId));\n }\n }\n\n await Promise.allSettled(sendPromises);\n }\n\n /**\n * Extract table name from a stream record\n */\n function extractTableName(record: DynamoDBRecord): string | null {\n const arn = record.eventSourceARN;\n if (!arn) return null;\n const match = arn.match(/table\\/([^/]+)/);\n return match ? match[1] : null;\n }\n\n /**\n * Find subscriptions affected by a dependency key\n */\n async function findAffectedSubscriptions(\n dependencyKey: string,\n ): Promise<{ connectionId: string; subscriptionId: string }[]> {\n try {\n const response = await docClient.send(\n new QueryCommand({\n TableName: dependenciesTable,\n KeyConditionExpression: 'pk = :pk',\n ExpressionAttributeValues: {\n ':pk': dependencyKey,\n },\n }),\n );\n\n return (response.Items ?? []).map((item) => ({\n connectionId: item.connectionId as string,\n subscriptionId: item.subscriptionId as string,\n }));\n } catch (error) {\n console.error('Error finding affected subscriptions:', error);\n return [];\n }\n }\n\n /**\n * Process a single subscription by re-querying and diffing.\n * For now, we still re-query because applying changes directly is complex.\n * But we don't need router code - we use stored PartiQL or query metadata.\n */\n async function processSubscription(\n connectionId: string,\n subscriptionId: string,\n ): Promise<void> {\n try {\n // Get the subscription state\n const response = await docClient.send(\n new GetCommand({\n TableName: queriesTable,\n Key: { pk: connectionId, sk: subscriptionId },\n }),\n );\n\n const queryState = response.Item as QueryEntry | undefined;\n if (!queryState) {\n console.warn(\n `Subscription not found: ${connectionId}/${subscriptionId}`,\n );\n return;\n }\n\n // Re-execute the query using stored metadata\n const newResult = await executeQueryFromMetadata(\n queryState.queryMetadata,\n );\n\n // Check if there are changes\n if (!hasChanges(queryState.lastResult, newResult)) {\n return;\n }\n\n // Generate patches\n const patches = generatePatches(queryState.lastResult, newResult);\n\n // Update the stored state\n await docClient.send(\n new PutCommand({\n TableName: queriesTable,\n Item: {\n ...queryState,\n lastResult: newResult,\n updatedAt: Date.now(),\n },\n }),\n );\n\n // Send the patch to the client\n await sendPatch(connectionId, subscriptionId, patches);\n } catch (error) {\n if (error instanceof GoneException) {\n await cleanupConnection(connectionId);\n } else {\n console.error(\n `Error processing subscription ${connectionId}/${subscriptionId}:`,\n error,\n );\n }\n }\n }\n\n /**\n * Execute a query using stored QueryMetadata.\n * Uses PartiQL to query DynamoDB directly without router code.\n */\n async function executeQueryFromMetadata(\n metadata: QueryMetadata,\n ): Promise<unknown[]> {\n // Build PartiQL query from metadata\n const { tableName, filterConditions, sortOrder, limit } = metadata;\n\n // Build WHERE clause from filter conditions\n const whereClause = buildWhereClause(filterConditions);\n const orderClause = sortOrder === 'desc' ? 'ORDER BY SK DESC' : '';\n const limitClause = limit ? `LIMIT ${limit}` : '';\n\n const statement =\n `SELECT * FROM \"${tableName}\" ${whereClause} ${orderClause} ${limitClause}`.trim();\n\n try {\n // Use PartiQL to execute the query\n const { ExecuteStatementCommand } =\n await import('@aws-sdk/client-dynamodb');\n const result = await ddbClient.send(\n new ExecuteStatementCommand({\n Statement: statement,\n }),\n );\n\n // Unmarshall results\n return (result.Items ?? []).map((item) =>\n unmarshall(item as Record<string, AttributeValue>),\n );\n } catch (error) {\n console.error('Error executing query from metadata:', error);\n console.error('Statement:', statement);\n return [];\n }\n }\n\n /**\n * Build WHERE clause from filter conditions.\n */\n function buildWhereClause(\n conditions: QueryMetadata['filterConditions'],\n ): string {\n if (conditions.length === 0) return '';\n\n const clauses = conditions\n .map((c) => buildConditionClause(c))\n .filter(Boolean);\n if (clauses.length === 0) return '';\n\n return `WHERE ${clauses.join(' AND ')}`;\n }\n\n /**\n * Build a single condition clause for PartiQL.\n */\n function buildConditionClause(\n condition: QueryMetadata['filterConditions'][0],\n ): string {\n const { type, operator, field, value, value2, conditions } = condition;\n\n if (type === 'comparison' && field) {\n const escapedValue = escapeValue(value);\n switch (operator) {\n case 'eq':\n return `\"${field}\" = ${escapedValue}`;\n case 'ne':\n return `\"${field}\" <> ${escapedValue}`;\n case 'gt':\n return `\"${field}\" > ${escapedValue}`;\n case 'gte':\n return `\"${field}\" >= ${escapedValue}`;\n case 'lt':\n return `\"${field}\" < ${escapedValue}`;\n case 'lte':\n return `\"${field}\" <= ${escapedValue}`;\n case 'between':\n return `\"${field}\" BETWEEN ${escapedValue} AND ${escapeValue(value2)}`;\n case undefined:\n default:\n return '';\n }\n }\n\n if (type === 'function' && field) {\n const escapedValue = escapeValue(value);\n switch (operator) {\n case 'beginsWith':\n return `begins_with(\"${field}\", ${escapedValue})`;\n case 'contains':\n return `contains(\"${field}\", ${escapedValue})`;\n case undefined:\n default:\n return '';\n }\n }\n\n if (type === 'logical' && conditions) {\n const subclauses = conditions\n .map((c) => buildConditionClause(c))\n .filter(Boolean);\n if (subclauses.length === 0) return '';\n\n switch (operator) {\n case 'and':\n return `(${subclauses.join(' AND ')})`;\n case 'or':\n return `(${subclauses.join(' OR ')})`;\n case 'not':\n return subclauses.length > 0 ? `NOT (${subclauses[0]})` : '';\n case undefined:\n default:\n return '';\n }\n }\n\n return '';\n }\n\n /**\n * Escape a value for PartiQL.\n */\n function escapeValue(value: unknown): string {\n if (value === null || value === undefined) return 'NULL';\n if (typeof value === 'string') return `'${value.replace(/'/g, \"''\")}'`;\n if (typeof value === 'number') return String(value);\n if (typeof value === 'boolean') return value ? 'TRUE' : 'FALSE';\n return `'${String(value).replace(/'/g, \"''\")}'`;\n }\n\n /**\n * Send a patch to the client via WebSocket\n */\n async function sendPatch(\n connectionId: string,\n subscriptionId: string,\n patches: JsonPatch[],\n ): Promise<void> {\n const message = JSON.stringify({\n type: 'patch',\n subscriptionId,\n patches,\n });\n\n try {\n const apiClient = getApiClient();\n await apiClient.send(\n new PostToConnectionCommand({\n ConnectionId: connectionId,\n Data: Buffer.from(message),\n }),\n );\n } catch (error) {\n if (error instanceof GoneException) {\n throw error;\n }\n console.error(`Error sending patch to ${connectionId}:`, error);\n }\n }\n\n /**\n * Clean up a disconnected connection\n */\n async function cleanupConnection(connectionId: string): Promise<void> {\n console.log('Cleaning up disconnected connection:', connectionId);\n\n try {\n // Delete connection entry\n await docClient.send(\n new DeleteCommand({\n TableName: connectionsTable,\n Key: { connectionId },\n }),\n );\n\n // TODO: Delete all queries and dependencies for this connection\n } catch (error) {\n console.error('Error cleaning up connection:', error);\n }\n }\n\n return {\n connectHandler,\n disconnectHandler,\n messageHandler,\n streamHandler,\n };\n}\n","/**\n * Filter evaluator for evaluating FilterCondition against DynamoDB records.\n * Used by the stream handler to determine if a record matches a subscription's query.\n */\n\nimport type { FilterCondition } from '@dynamodb-reactive/core';\n\n/**\n * Evaluate a filter condition against a record.\n * Returns true if the record matches the filter.\n */\nexport function evaluateFilter(\n filter: FilterCondition,\n record: Record<string, unknown>,\n): boolean {\n switch (filter.type) {\n case 'comparison':\n return evaluateComparison(filter, record);\n case 'logical':\n return evaluateLogical(filter, record);\n case 'function':\n return evaluateFunction(filter, record);\n default:\n console.warn(`Unknown filter type: ${filter.type}`);\n return false;\n }\n}\n\n/**\n * Evaluate multiple filter conditions (all must match - AND logic).\n */\nexport function evaluateFilters(\n filters: FilterCondition[],\n record: Record<string, unknown>,\n): boolean {\n if (filters.length === 0) return true;\n return filters.every((filter) => evaluateFilter(filter, record));\n}\n\n/**\n * Evaluate a comparison filter (eq, ne, gt, gte, lt, lte, between).\n */\nfunction evaluateComparison(\n filter: FilterCondition,\n record: Record<string, unknown>,\n): boolean {\n const { operator, field, value, value2 } = filter;\n if (!field || !operator) return false;\n\n const fieldValue = getFieldValue(record, field);\n\n switch (operator) {\n case 'eq':\n return fieldValue === value;\n case 'ne':\n return fieldValue !== value;\n case 'gt':\n return compareValues(fieldValue, value) > 0;\n case 'gte':\n return compareValues(fieldValue, value) >= 0;\n case 'lt':\n return compareValues(fieldValue, value) < 0;\n case 'lte':\n return compareValues(fieldValue, value) <= 0;\n case 'between':\n return (\n compareValues(fieldValue, value) >= 0 &&\n compareValues(fieldValue, value2) <= 0\n );\n default:\n console.warn(`Unknown comparison operator: ${operator}`);\n return false;\n }\n}\n\n/**\n * Evaluate a logical filter (and, or, not).\n */\nfunction evaluateLogical(\n filter: FilterCondition,\n record: Record<string, unknown>,\n): boolean {\n const { operator, conditions } = filter;\n if (!operator || !conditions) return false;\n\n switch (operator) {\n case 'and':\n return conditions.every((c) => evaluateFilter(c, record));\n case 'or':\n return conditions.some((c) => evaluateFilter(c, record));\n case 'not':\n return conditions.length > 0 && !evaluateFilter(conditions[0], record);\n default:\n console.warn(`Unknown logical operator: ${operator}`);\n return false;\n }\n}\n\n/**\n * Evaluate a function filter (beginsWith, contains).\n */\nfunction evaluateFunction(\n filter: FilterCondition,\n record: Record<string, unknown>,\n): boolean {\n const { operator, field, value } = filter;\n if (!field || !operator) return false;\n\n const fieldValue = getFieldValue(record, field);\n\n switch (operator) {\n case 'beginsWith':\n return (\n typeof fieldValue === 'string' &&\n typeof value === 'string' &&\n fieldValue.startsWith(value)\n );\n case 'contains':\n return (\n typeof fieldValue === 'string' &&\n typeof value === 'string' &&\n fieldValue.includes(value)\n );\n default:\n console.warn(`Unknown function operator: ${operator}`);\n return false;\n }\n}\n\n/**\n * Get a field value from a record, supporting nested paths (e.g., \"user.name\").\n */\nfunction getFieldValue(\n record: Record<string, unknown>,\n field: string,\n): unknown {\n const parts = field.split('.');\n let value: unknown = record;\n\n for (const part of parts) {\n if (value === null || value === undefined) return undefined;\n if (typeof value !== 'object') return undefined;\n value = (value as Record<string, unknown>)[part];\n }\n\n return value;\n}\n\n/**\n * Compare two values for ordering.\n * Returns negative if a < b, positive if a > b, zero if equal.\n */\nfunction compareValues(a: unknown, b: unknown): number {\n // Handle null/undefined\n if (a === null || a === undefined) {\n return b === null || b === undefined ? 0 : -1;\n }\n if (b === null || b === undefined) {\n return 1;\n }\n\n // Numbers\n if (typeof a === 'number' && typeof b === 'number') {\n return a - b;\n }\n\n // Strings\n if (typeof a === 'string' && typeof b === 'string') {\n return a.localeCompare(b);\n }\n\n // Booleans\n if (typeof a === 'boolean' && typeof b === 'boolean') {\n return a === b ? 0 : a ? 1 : -1;\n }\n\n // Fallback: convert to string\n return String(a).localeCompare(String(b));\n}\n\n/**\n * Sort records by a field.\n */\nexport function sortRecords(\n records: Record<string, unknown>[],\n sortField?: string,\n sortOrder: 'asc' | 'desc' = 'asc',\n): Record<string, unknown>[] {\n if (!sortField) return records;\n\n return [...records].sort((a, b) => {\n const aValue = getFieldValue(a, sortField);\n const bValue = getFieldValue(b, sortField);\n const comparison = compareValues(aValue, bValue);\n return sortOrder === 'desc' ? -comparison : comparison;\n });\n}\n\n/**\n * Find the primary key value(s) from a record.\n * Used to identify records for update/removal.\n */\nexport function getRecordKey(\n record: Record<string, unknown>,\n pkField: string,\n skField?: string,\n): string {\n const pk = record[pkField];\n const sk = skField ? record[skField] : undefined;\n return sk !== undefined ? `${pk}#${sk}` : String(pk);\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../client/src/patcher.ts","../../client/src/websocket.ts","../../client/src/client.ts","../../client/src/react.tsx"],"names":[],"mappings":"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","file":"chunk-MI2ZLLB2.js","sourcesContent":["import jsonpatch, { type Operation } from 'fast-json-patch';\n\nimport type { JsonPatch } from './types.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 console.error('Failed to apply patches:', error);\n throw error;\n }\n}\n","/* eslint-disable no-console */\nimport type {\n ClientMessage,\n ConnectionState,\n ReactiveClientConfig,\n ServerMessage,\n} from './types.js';\n\n/**\n * WebSocket manager with automatic reconnection\n */\nexport class WebSocketManager {\n private config: Required<\n Omit<\n ReactiveClientConfig,\n 'auth' | 'httpUrl' | 'headers' | 'onConnect' | 'onDisconnect' | 'onError'\n >\n > &\n ReactiveClientConfig;\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 messageQueue: ClientMessage[] = [];\n private messageHandlers = new Set<(message: ServerMessage) => void>();\n private stateHandlers = new Set<(state: ConnectionState) => void>();\n private _connectionId: string | null = null;\n private connectionIdResolvers: Array<(id: string) => void> = [];\n\n constructor(config: ReactiveClientConfig) {\n this.config = {\n autoReconnect: true,\n reconnectDelay: 1000,\n maxReconnectAttempts: 10,\n ...config,\n };\n }\n\n /**\n * Get the current connection ID (null if not connected)\n */\n get connectionId(): string | null {\n return this._connectionId;\n }\n\n /**\n * Wait for the connection ID to be available\n */\n waitForConnectionId(): Promise<string> {\n if (this._connectionId) {\n return Promise.resolve(this._connectionId);\n }\n return new Promise((resolve) => {\n this.connectionIdResolvers.push(resolve);\n });\n }\n\n /**\n * Get current connection state\n */\n getState(): ConnectionState {\n return this.state;\n }\n\n /**\n * Connect to the WebSocket server\n */\n async connect(): Promise<void> {\n if (this.state === 'connected' || this.state === 'connecting') {\n return;\n }\n\n this.setState('connecting');\n\n try {\n const url = await this.buildUrl();\n this.ws = new WebSocket(url);\n\n this.ws.onopen = () => {\n this.reconnectAttempts = 0;\n // Send init message to get connectionId from server\n // Don't set state to 'connected' until we receive connectionId\n this.ws?.send(JSON.stringify({ type: 'init' }));\n };\n\n this.ws.onclose = (event) => {\n this.ws = null;\n this._connectionId = null;\n this.setState('disconnected');\n this.config.onDisconnect?.();\n\n if (this.config.autoReconnect && !event.wasClean) {\n this.scheduleReconnect();\n }\n };\n\n this.ws.onerror = () => {\n const error = new Error('WebSocket error');\n this.config.onError?.(error);\n };\n\n this.ws.onmessage = (event) => {\n try {\n const message = JSON.parse(event.data) as ServerMessage;\n\n // Handle 'connected' message specially - this gives us our connectionId\n if (message.type === 'connected') {\n this._connectionId = message.connectionId;\n this.setState('connected');\n this.flushMessageQueue();\n this.config.onConnect?.();\n\n // Resolve any pending waitForConnectionId promises\n for (const resolve of this.connectionIdResolvers) {\n resolve(message.connectionId);\n }\n this.connectionIdResolvers = [];\n return;\n }\n\n this.handleMessage(message);\n } catch (error) {\n console.error('Failed to parse WebSocket message:', error);\n }\n };\n } catch (error) {\n this.setState('disconnected');\n this.config.onError?.(\n error instanceof Error ? error : new Error(String(error)),\n );\n\n if (this.config.autoReconnect) {\n this.scheduleReconnect();\n }\n }\n }\n\n /**\n * Disconnect from the WebSocket server\n */\n disconnect(): void {\n if (this.reconnectTimer) {\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n\n if (this.ws) {\n this.ws.close(1000, 'Client disconnect');\n this.ws = null;\n }\n\n this._connectionId = null;\n this.setState('disconnected');\n }\n\n /**\n * Send a message to the server\n */\n send(message: ClientMessage): void {\n // Check both our state and the actual WebSocket readyState\n if (this.state === 'connected' && this.ws?.readyState === WebSocket.OPEN) {\n this.ws.send(JSON.stringify(message));\n } else {\n // Queue message for when we reconnect\n this.messageQueue.push(message);\n }\n }\n\n /**\n * Subscribe to incoming messages\n */\n onMessage(handler: (message: ServerMessage) => void): () => void {\n this.messageHandlers.add(handler);\n return () => this.messageHandlers.delete(handler);\n }\n\n /**\n * Subscribe to connection state changes\n */\n onStateChange(handler: (state: ConnectionState) => void): () => void {\n this.stateHandlers.add(handler);\n return () => this.stateHandlers.delete(handler);\n }\n\n private async buildUrl(): Promise<string> {\n let url = this.config.url;\n\n if (this.config.auth) {\n const token =\n typeof this.config.auth === 'function'\n ? await this.config.auth()\n : this.config.auth;\n\n const separator = url.includes('?') ? '&' : '?';\n url = `${url}${separator}token=${encodeURIComponent(token)}`;\n }\n\n return url;\n }\n\n private setState(state: ConnectionState): void {\n this.state = state;\n for (const handler of this.stateHandlers) {\n handler(state);\n }\n }\n\n private handleMessage(message: ServerMessage): void {\n for (const handler of this.messageHandlers) {\n handler(message);\n }\n }\n\n private scheduleReconnect(): void {\n if (this.reconnectAttempts >= this.config.maxReconnectAttempts) {\n console.error('Max reconnection attempts reached');\n return;\n }\n\n this.setState('reconnecting');\n this.reconnectAttempts++;\n\n // Exponential backoff with jitter\n const delay =\n Math.min(\n this.config.reconnectDelay * Math.pow(2, this.reconnectAttempts - 1),\n 30000, // Max 30 seconds\n ) *\n (0.5 + Math.random() * 0.5);\n\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null;\n void this.connect();\n }, delay);\n }\n\n private flushMessageQueue(): void {\n const queue = this.messageQueue;\n this.messageQueue = [];\n\n for (const message of queue) {\n this.send(message);\n }\n }\n}\n","import { applyPatches } from './patcher.js';\nimport type {\n ConnectionState,\n JsonPatch,\n MutationOptions,\n ReactiveClientConfig,\n ServerMessage,\n Subscription,\n SubscriptionOptions,\n} from './types.js';\nimport { WebSocketManager } from './websocket.js';\n\n/**\n * Default HTTP URL for subscribe/call requests (Next.js API route)\n */\nconst DEFAULT_HTTP_URL = '/api/reactive';\n\n/**\n * Generate a unique subscription ID\n */\nfunction generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).substring(2, 9)}`;\n}\n\n/**\n * Internal subscription state\n */\ninterface SubscriptionState<TData> {\n id: string;\n path: string;\n input: unknown;\n data: TData | undefined;\n loading: boolean;\n error: Error | undefined;\n listeners: Set<() => void>;\n options: SubscriptionOptions<unknown>;\n}\n\n/**\n * Pending call state\n */\ninterface PendingCall {\n resolve: (data: unknown) => void;\n reject: (error: Error) => void;\n}\n\n/**\n * Reactive client for type-safe subscriptions\n */\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 subscriptions = new Map<string, SubscriptionState<unknown>>();\n private pendingCalls = new Map<string, PendingCall>();\n private connectionState: ConnectionState = 'disconnected';\n private stateListeners = new Set<(state: ConnectionState) => void>();\n // Stores original data for rollback when optimistic updates fail\n private optimisticUpdates = new Map<string, unknown>();\n\n constructor(config: ReactiveClientConfig) {\n this.wsManager = new WebSocketManager(config);\n this.httpUrl = config.httpUrl ?? DEFAULT_HTTP_URL;\n\n // Store auth getter for HTTP requests\n if (typeof config.auth === 'function') {\n this.authGetter = config.auth;\n } else if (config.auth) {\n this.authGetter = () => config.auth as string;\n }\n\n // Store headers getter for HTTP requests\n if (typeof config.headers === 'function') {\n this.headersGetter = config.headers;\n } else if (config.headers) {\n this.headersGetter = () => config.headers as Record<string, string>;\n }\n\n // Handle incoming messages (patches come via WebSocket)\n this.wsManager.onMessage((message) => this.handleMessage(message));\n\n // Handle connection state changes\n this.wsManager.onStateChange((state) => {\n this.connectionState = state;\n this.notifyStateListeners();\n\n if (state === 'connected') {\n this.resubscribeAll();\n }\n });\n }\n\n /**\n * Connect to the server\n */\n async connect(): Promise<void> {\n await this.wsManager.connect();\n }\n\n /**\n * Disconnect from the server\n */\n disconnect(): void {\n this.wsManager.disconnect();\n }\n\n /**\n * Update the headers getter for HTTP requests.\n * Useful for dynamically setting auth or user context headers.\n */\n setHeaders(\n headers:\n | Record<string, string>\n | (() => Record<string, string> | Promise<Record<string, string>>),\n ): void {\n if (typeof headers === 'function') {\n this.headersGetter = headers;\n } else {\n this.headersGetter = () => headers;\n }\n }\n\n /**\n * Get current connection state\n */\n getConnectionState(): ConnectionState {\n return this.connectionState;\n }\n\n /**\n * Subscribe to connection state changes\n */\n onConnectionStateChange(\n listener: (state: ConnectionState) => void,\n ): () => void {\n this.stateListeners.add(listener);\n return () => this.stateListeners.delete(listener);\n }\n\n /**\n * Subscribe to a procedure via HTTP.\n * Snapshot is returned via HTTP, patches come via WebSocket.\n */\n subscribe<TData>(\n path: string,\n options: SubscriptionOptions<unknown> = {},\n ): Subscription<TData> {\n const id = generateId();\n\n const state: SubscriptionState<TData> = {\n id,\n path,\n input: options.input,\n data: undefined,\n loading: true,\n error: undefined,\n listeners: new Set(),\n options,\n };\n\n this.subscriptions.set(id, state as SubscriptionState<unknown>);\n\n // Send subscribe request via HTTP (async)\n this.sendSubscribeRequest(id, path, options.input).catch((error) => {\n state.error = error instanceof Error ? error : new Error(String(error));\n state.loading = false;\n this.notifySubscriptionListeners(id);\n options.onError?.(state.error);\n });\n\n const subscription: Subscription<TData> = {\n id,\n get data() {\n return state.data;\n },\n get loading() {\n return state.loading;\n },\n get error() {\n return state.error;\n },\n unsubscribe: () => this.unsubscribe(id),\n refetch: () => this.refetch(id),\n };\n\n return subscription;\n }\n\n /**\n * Send subscribe request via HTTP\n */\n private async sendSubscribeRequest(\n subscriptionId: string,\n path: string,\n input: unknown,\n ): Promise<void> {\n // Wait for connectionId to be available\n const connectionId = await this.wsManager.waitForConnectionId();\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n // Add custom headers if configured\n if (this.headersGetter) {\n const customHeaders = await this.headersGetter();\n Object.assign(headers, customHeaders);\n }\n\n // Add auth header if configured\n if (this.authGetter) {\n const token = await this.authGetter();\n headers['Authorization'] = `Bearer ${token}`;\n }\n\n const response = await fetch(this.httpUrl, {\n method: 'POST',\n headers,\n body: JSON.stringify({\n type: 'subscribe',\n connectionId,\n subscriptionId,\n path,\n input,\n }),\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 {\n type: string;\n message?: string;\n data?: unknown;\n };\n\n if (result.type === 'error') {\n throw new Error(result.message ?? 'Unknown error');\n }\n\n if (result.type === 'snapshot') {\n this.handleSnapshot(subscriptionId, result.data);\n }\n }\n\n /**\n * Call a mutation procedure via HTTP with optimistic update support.\n * All optimistic updates are applied INSTANTLY (before HTTP request).\n */\n async call<TInput, TOutput>(\n path: string,\n input: TInput,\n options?: MutationOptions<TInput, TOutput>,\n ): Promise<TOutput> {\n const invalidatesPath = options?.invalidates;\n const updateType = options?.optimisticUpdate;\n let targetSubscriptionId: string | undefined;\n\n // Find subscription to optimistically update\n if (invalidatesPath) {\n targetSubscriptionId = this.findSubscriptionByPath(invalidatesPath);\n }\n\n // Apply INSTANT optimistic update (before HTTP request)\n if (targetSubscriptionId) {\n const state = this.subscriptions.get(targetSubscriptionId);\n const currentData = state?.data;\n\n if (updateType === 'remove') {\n // Remove: filter out item by id\n const inputId = (input as { id?: string }).id;\n if (inputId) {\n this.applyOptimisticUpdate(targetSubscriptionId, (data) => {\n if (!Array.isArray(data)) return data;\n return data.filter((item: { id?: string }) => item.id !== inputId);\n });\n }\n } else if (updateType === 'merge') {\n // Merge: find item by id and merge input fields into it\n const inputWithId = input as { id?: string };\n if (inputWithId.id) {\n this.applyOptimisticUpdate(targetSubscriptionId, (data) => {\n if (!Array.isArray(data)) return data;\n const idx = data.findIndex(\n (item: { id?: string }) => item.id === inputWithId.id,\n );\n if (idx >= 0) {\n // Merge input into existing item\n return [\n ...data.slice(0, idx),\n { ...data[idx], ...input },\n ...data.slice(idx + 1),\n ];\n }\n return data;\n });\n } else if (options?.optimisticData) {\n // For creates without id, use provided optimisticData\n const optimistic =\n typeof options.optimisticData === 'function'\n ? (\n options.optimisticData as (\n input: TInput,\n data: unknown[],\n ) => TOutput\n )(input, Array.isArray(currentData) ? currentData : [])\n : options.optimisticData;\n if (optimistic) {\n this.applyOptimisticUpdate(targetSubscriptionId, (data) => {\n if (!Array.isArray(data)) return data;\n return [optimistic, ...data];\n });\n }\n }\n } else if (typeof updateType === 'function') {\n // Custom update function - apply instantly\n this.applyOptimisticUpdate(targetSubscriptionId, (data) => {\n if (!Array.isArray(data)) return data;\n return updateType(data, input, undefined);\n });\n }\n }\n\n // Wait for connectionId to be available\n const connectionId = await this.wsManager.waitForConnectionId();\n\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n\n // Add custom headers if configured\n if (this.headersGetter) {\n const customHeaders = await this.headersGetter();\n Object.assign(headers, customHeaders);\n }\n\n // Add auth header if configured\n if (this.authGetter) {\n const token = await this.authGetter();\n headers['Authorization'] = `Bearer ${token}`;\n }\n\n try {\n const response = await fetch(this.httpUrl, {\n method: 'POST',\n headers,\n body: JSON.stringify({\n type: 'call',\n connectionId,\n path,\n input,\n }),\n });\n\n if (!response.ok) {\n throw new Error(\n `Call failed: ${response.status} ${response.statusText}`,\n );\n }\n\n const result = (await response.json()) as {\n type: string;\n message?: string;\n data?: unknown;\n };\n\n if (result.type === 'error') {\n throw new Error(result.message ?? 'Unknown error');\n }\n\n const data = result.data as TOutput;\n\n // After HTTP success, reconcile with real server data\n if (targetSubscriptionId && updateType === 'merge') {\n const resultWithId = data as { id?: string };\n if (resultWithId && resultWithId.id) {\n this.applyOptimisticUpdate(targetSubscriptionId, (currentData) => {\n if (!Array.isArray(currentData)) return currentData;\n const idx = currentData.findIndex(\n (item: { id?: string }) => item.id === resultWithId.id,\n );\n if (idx >= 0) {\n // Update with real server data\n return [\n ...currentData.slice(0, idx),\n data,\n ...currentData.slice(idx + 1),\n ];\n } else {\n // New item - add it (and remove any temp items)\n return [\n data,\n ...currentData.filter(\n (item: { id?: string }) =>\n item.id && !item.id.startsWith('temp-'),\n ),\n ];\n }\n });\n }\n }\n\n return data;\n } catch (error) {\n // Rollback on error\n if (targetSubscriptionId) {\n this.rollbackOptimisticUpdate(targetSubscriptionId);\n }\n throw error;\n }\n }\n\n /**\n * Unsubscribe from a subscription\n */\n private unsubscribe(id: string): void {\n const state = this.subscriptions.get(id);\n if (!state) return;\n\n this.subscriptions.delete(id);\n\n this.wsManager.send({\n type: 'unsubscribe',\n subscriptionId: id,\n });\n }\n\n /**\n * Refetch a subscription via HTTP\n */\n private async refetch(id: string): Promise<void> {\n const state = this.subscriptions.get(id);\n if (!state) return;\n\n state.loading = true;\n this.notifySubscriptionListeners(id);\n\n try {\n await this.sendSubscribeRequest(id, state.path, state.input);\n } catch (error) {\n state.error = error instanceof Error ? error : new Error(String(error));\n state.loading = false;\n this.notifySubscriptionListeners(id);\n state.options.onError?.(state.error);\n }\n }\n\n /**\n * Handle incoming server messages.\n * Note: 'connected' messages are handled by WebSocketManager before reaching here.\n */\n private handleMessage(message: ServerMessage): void {\n switch (message.type) {\n case 'connected':\n // Handled by WebSocketManager - should not reach here\n break;\n\n case 'snapshot':\n this.handleSnapshot(message.subscriptionId, message.data);\n break;\n\n case 'patch':\n this.handlePatch(message.subscriptionId, message.patches);\n break;\n\n case 'result':\n this.handleResult(message.callId, message.data);\n break;\n\n case 'error':\n this.handleError(message);\n break;\n }\n }\n\n /**\n * Handle a snapshot message\n */\n private handleSnapshot(subscriptionId: string, data: unknown): void {\n const state = this.subscriptions.get(subscriptionId);\n if (!state) return;\n\n // Clear optimistic state since we have authoritative data\n this.clearOptimisticUpdate(subscriptionId);\n\n state.data = data;\n state.loading = false;\n state.error = undefined;\n\n this.notifySubscriptionListeners(subscriptionId);\n state.options.onData?.(data);\n }\n\n /**\n * Handle a patch message\n */\n private handlePatch(subscriptionId: string, patches: JsonPatch[]): void {\n const state = this.subscriptions.get(subscriptionId);\n if (!state || state.data === undefined) return;\n\n // If we have optimistic state, apply patch to the ORIGINAL data\n // This prevents conflicts when patch tries to modify already-modified data\n const originalData = this.optimisticUpdates.get(subscriptionId);\n const baseData = originalData !== undefined ? originalData : state.data;\n\n // Clear optimistic state since we have authoritative patch data\n this.clearOptimisticUpdate(subscriptionId);\n\n try {\n state.data = applyPatches(baseData, patches);\n this.notifySubscriptionListeners(subscriptionId);\n state.options.onData?.(state.data);\n } catch (error) {\n state.error = error instanceof Error ? error : new Error(String(error));\n this.notifySubscriptionListeners(subscriptionId);\n state.options.onError?.(state.error);\n }\n }\n\n /**\n * Handle a result message\n */\n private handleResult(callId: string, data: unknown): void {\n const pending = this.pendingCalls.get(callId);\n if (!pending) return;\n\n this.pendingCalls.delete(callId);\n pending.resolve(data);\n }\n\n /**\n * Handle an error message\n */\n private handleError(message: {\n message: string;\n subscriptionId?: string;\n callId?: string;\n }): void {\n const error = new Error(message.message);\n\n if (message.subscriptionId) {\n const state = this.subscriptions.get(message.subscriptionId);\n if (state) {\n state.error = error;\n state.loading = false;\n this.notifySubscriptionListeners(message.subscriptionId);\n state.options.onError?.(error);\n }\n }\n\n if (message.callId) {\n const pending = this.pendingCalls.get(message.callId);\n if (pending) {\n this.pendingCalls.delete(message.callId);\n pending.reject(error);\n }\n }\n }\n\n /**\n * Resubscribe to all subscriptions after reconnect via HTTP\n */\n private resubscribeAll(): void {\n for (const [id, state] of this.subscriptions) {\n if (state.options.resubscribeOnReconnect !== false) {\n state.loading = true;\n this.notifySubscriptionListeners(id);\n\n // Re-subscribe via HTTP\n this.sendSubscribeRequest(id, state.path, state.input).catch(\n (error) => {\n state.error =\n error instanceof Error ? error : new Error(String(error));\n state.loading = false;\n this.notifySubscriptionListeners(id);\n state.options.onError?.(state.error);\n },\n );\n }\n }\n }\n\n /**\n * Notify subscription listeners of state changes\n */\n private notifySubscriptionListeners(id: string): void {\n const state = this.subscriptions.get(id);\n if (!state) return;\n\n for (const listener of state.listeners) {\n listener();\n }\n }\n\n /**\n * Notify connection state listeners\n */\n private notifyStateListeners(): void {\n for (const listener of this.stateListeners) {\n listener(this.connectionState);\n }\n }\n\n /**\n * Add a listener for subscription state changes\n * Used internally by React hooks\n */\n addSubscriptionListener(id: string, listener: () => void): () => void {\n const state = this.subscriptions.get(id);\n if (!state) return () => {};\n\n state.listeners.add(listener);\n return () => state.listeners.delete(listener);\n }\n\n /**\n * Get subscription state\n * Used internally by React hooks\n */\n getSubscriptionState<TData>(\n id: string,\n ): SubscriptionState<TData> | undefined {\n return this.subscriptions.get(id) as SubscriptionState<TData> | undefined;\n }\n\n /**\n * Find subscription by path\n */\n private findSubscriptionByPath(path: string): string | undefined {\n for (const [id, state] of this.subscriptions) {\n if (state.path === path) {\n return id;\n }\n }\n return undefined;\n }\n\n /**\n * Apply an optimistic update to a subscription's data\n */\n private applyOptimisticUpdate(\n subscriptionId: string,\n updater: (data: unknown) => unknown,\n ): void {\n const state = this.subscriptions.get(subscriptionId);\n if (!state || state.data === undefined) return;\n\n // Store original data for rollback (only if not already stored)\n if (!this.optimisticUpdates.has(subscriptionId)) {\n this.optimisticUpdates.set(\n subscriptionId,\n JSON.parse(JSON.stringify(state.data)),\n );\n }\n\n // Apply the update\n state.data = updater(state.data);\n this.notifySubscriptionListeners(subscriptionId);\n }\n\n /**\n * Rollback an optimistic update\n */\n private rollbackOptimisticUpdate(subscriptionId: string): void {\n const original = this.optimisticUpdates.get(subscriptionId);\n if (original === undefined) return;\n\n const state = this.subscriptions.get(subscriptionId);\n if (state) {\n state.data = original;\n this.notifySubscriptionListeners(subscriptionId);\n }\n this.optimisticUpdates.delete(subscriptionId);\n }\n\n /**\n * Clear optimistic state (called when real data arrives)\n */\n private clearOptimisticUpdate(subscriptionId: string): void {\n this.optimisticUpdates.delete(subscriptionId);\n }\n}\n\n/**\n * Create a type-safe reactive client\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\n/**\n * Type-safe client proxy type\n */\nexport type TypedReactiveClient<TRouter> = {\n [K in keyof TRouter]: TRouter[K] extends { query: any }\n ? {\n useSubscription: <TData = unknown>(\n input?: unknown,\n options?: Omit<SubscriptionOptions<unknown>, 'input'>,\n ) => Subscription<TData>;\n }\n : TRouter[K] extends { mutation: any }\n ? {\n mutate: <TInput, TOutput>(input: TInput) => Promise<TOutput>;\n }\n : TypedReactiveClient<TRouter[K]>;\n} & {\n _client: ReactiveClient;\n connect: () => Promise<void>;\n disconnect: () => void;\n};\n\n/**\n * Create a typed proxy for path-based access\n */\nfunction createTypedProxy(client: ReactiveClient, path: string[]): unknown {\n return new Proxy(\n {},\n {\n get(_target, prop) {\n if (prop === '_client') return client;\n if (prop === 'connect') return () => client.connect();\n if (prop === 'disconnect') return () => client.disconnect();\n\n if (typeof prop !== 'string') return undefined;\n\n const newPath = [...path, prop];\n\n // Check if this is a subscription or mutation\n if (prop === 'useSubscription') {\n return (input?: unknown, options?: SubscriptionOptions<unknown>) => {\n const parentPath = path.join('.');\n return client.subscribe(parentPath, { ...options, input });\n };\n }\n\n if (prop === 'mutate') {\n return async (input: unknown) => {\n const parentPath = path.join('.');\n // Auto-detect invalidates path: 'todos.toggle' → 'todos.list'\n const invalidatesPath =\n path.length >= 2\n ? `${path.slice(0, -1).join('.')}.list`\n : undefined;\n // Auto-detect update type: '*.delete' → 'remove', others → 'merge'\n const updateType = parentPath.endsWith('.delete')\n ? ('remove' as const)\n : ('merge' as const);\n return client.call(parentPath, input, {\n invalidates: invalidatesPath,\n optimisticUpdate: updateType,\n });\n };\n }\n\n return createTypedProxy(client, newPath);\n },\n },\n );\n}\n","/* eslint-disable no-console */\nimport {\n createContext,\n type ReactNode,\n useContext,\n useEffect,\n useRef,\n useState,\n useSyncExternalStore,\n} from 'react';\n\nimport { ReactiveClient } from './client.js';\nimport type {\n ConnectionState,\n MutationOptions,\n ReactiveClientConfig,\n Subscription,\n SubscriptionOptions,\n} from './types.js';\n\n/**\n * Context for the reactive client\n */\nconst ReactiveClientContext = createContext<ReactiveClient | null>(null);\n\n/**\n * Provider component for the reactive client\n *\n * If no config.url or client is provided, WebSocket features are disabled\n * and children are rendered without the reactive context.\n */\nexport function ReactiveClientProvider({\n children,\n config,\n client: externalClient,\n}: {\n children: ReactNode;\n config?: ReactiveClientConfig;\n client?: ReactiveClient;\n}) {\n // Extract URL for stable dependency\n const url = config?.url;\n const hasUrl = Boolean(url);\n\n // Always start with null to avoid hydration mismatch\n // Client will be created in useEffect after hydration\n const [client, setClient] = useState<ReactiveClient | null>(\n externalClient ?? null,\n );\n\n // Create client after mount (avoids hydration mismatch)\n useEffect(() => {\n // Skip if we have an external client or no URL\n if (externalClient || !url) return;\n\n // Create client if we don't have one\n if (!client) {\n const newClient = new ReactiveClient({ ...config, url });\n setClient(newClient);\n }\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [url, externalClient]);\n\n // Connect/disconnect effect\n useEffect(() => {\n if (!client) return;\n\n void client.connect();\n\n return () => {\n client.disconnect();\n };\n }, [client]);\n\n // Log warning if no URL configured (only once in dev)\n useEffect(() => {\n if (!hasUrl && process.env.NODE_ENV === 'development') {\n console.warn(\n '[dynamodb-reactive] WebSocket URL not configured, real-time features disabled',\n );\n }\n }, [hasUrl]);\n\n // Always render with context provider - hooks will handle null client\n return (\n <ReactiveClientContext.Provider value={client}>\n {children}\n </ReactiveClientContext.Provider>\n );\n}\n\n/**\n * Hook to get the reactive client\n * Returns null if WebSocket is not configured\n */\nexport function useReactiveClient(): ReactiveClient | null {\n return useContext(ReactiveClientContext);\n}\n\n/**\n * Hook to get the reactive client, throwing if not available\n */\nexport function useReactiveClientOrThrow(): ReactiveClient {\n const client = useContext(ReactiveClientContext);\n if (!client) {\n throw new Error(\n 'useReactiveClientOrThrow must be used within a ReactiveClientProvider with a configured URL',\n );\n }\n return client;\n}\n\n/**\n * Hook to get the connection state\n * Returns 'disabled' if WebSocket is not configured\n */\nexport function useConnectionState(): ConnectionState | 'disabled' {\n const client = useReactiveClient();\n\n return useSyncExternalStore(\n (callback) => {\n if (!client) return () => {};\n return client.onConnectionStateChange(callback);\n },\n () => (client ? client.getConnectionState() : 'disabled'),\n () => 'disabled' as const,\n );\n}\n\n/**\n * Hook for reactive subscriptions\n * Returns disabled state if WebSocket is not configured\n */\nexport function useSubscription<TData>(\n path: string,\n options: SubscriptionOptions<unknown> = {},\n): {\n data: TData | undefined;\n loading: boolean;\n error: Error | undefined;\n disabled: boolean;\n refetch: () => Promise<void>;\n} {\n const client = useReactiveClient();\n const subscriptionRef = useRef<Subscription<TData> | null>(null);\n const [state, setState] = useState<{\n data: TData | undefined;\n loading: boolean;\n error: Error | undefined;\n }>({\n data: undefined,\n loading: !client ? false : true,\n error: undefined,\n });\n\n // Serialize options for dependency comparison\n const inputKey = JSON.stringify(options.input);\n // Store callbacks in refs to avoid re-subscribing when they change\n const onDataRef = useRef(options.onData);\n const onErrorRef = useRef(options.onError);\n onDataRef.current = options.onData;\n onErrorRef.current = options.onError;\n\n useEffect(() => {\n if (!client) return;\n\n // Parse input from inputKey to ensure we use the serialized value\n const input = inputKey ? JSON.parse(inputKey) : undefined;\n\n const subscription = client.subscribe<TData>(path, {\n input,\n onData: (data) => {\n setState((prev) => ({\n ...prev,\n data: data as TData,\n loading: false,\n error: undefined,\n }));\n onDataRef.current?.(data);\n },\n onError: (error) => {\n setState((prev) => ({\n ...prev,\n error,\n loading: false,\n }));\n onErrorRef.current?.(error);\n },\n });\n\n subscriptionRef.current = subscription;\n\n // Register a listener for optimistic updates (notifySubscriptionListeners)\n // This ensures React state updates when optimistic changes happen\n const unregisterListener = client.addSubscriptionListener(\n subscription.id,\n () => {\n // Re-read current state from subscription\n setState({\n data: subscription.data,\n loading: subscription.loading,\n error: subscription.error,\n });\n },\n );\n\n // Update state from subscription\n setState({\n data: subscription.data,\n loading: subscription.loading,\n error: subscription.error,\n });\n\n return () => {\n unregisterListener();\n subscription.unsubscribe();\n subscriptionRef.current = null;\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [client, path, inputKey]);\n\n const refetch = async () => {\n if (subscriptionRef.current) {\n setState((prev) => ({ ...prev, loading: true }));\n await subscriptionRef.current.refetch();\n }\n };\n\n return {\n ...state,\n disabled: !client,\n refetch,\n };\n}\n\n/**\n * Hook for mutations with automatic optimistic updates\n *\n * Auto-detection:\n * - `invalidates`: Auto-detected from path (e.g., 'todos.toggle' -> 'todos.list')\n * - `optimisticUpdate`: Auto-detected from path ('*.delete' -> 'remove', others -> 'merge')\n *\n * You can override these with explicit options.\n */\nexport function useMutation<TInput, TOutput>(\n path: string,\n options?: MutationOptions<TInput, TOutput>,\n): {\n mutate: (input: TInput) => Promise<TOutput>;\n data: TOutput | undefined;\n loading: boolean;\n error: Error | undefined;\n disabled: boolean;\n reset: () => void;\n} {\n const client = useReactiveClient();\n const [state, setState] = useState<{\n data: TOutput | undefined;\n loading: boolean;\n error: Error | undefined;\n }>({\n data: undefined,\n loading: false,\n error: undefined,\n });\n\n // Auto-detect invalidates path from mutation path\n // e.g., 'todos.toggle' -> 'todos.list', 'todos.create' -> 'todos.list'\n const autoInvalidates =\n options?.invalidates ??\n (() => {\n const parts = path.split('.');\n if (parts.length >= 2) {\n return `${parts.slice(0, -1).join('.')}.list`;\n }\n return undefined;\n })();\n\n // Auto-detect update type from path\n // '*.delete' -> 'remove', others -> 'merge'\n const autoUpdateType =\n options?.optimisticUpdate ??\n (path.endsWith('.delete') ? 'remove' : 'merge');\n\n const mutate = async (input: TInput): Promise<TOutput> => {\n if (!client) {\n throw new Error('WebSocket not configured - mutations are disabled');\n }\n\n setState((prev) => ({ ...prev, loading: true, error: undefined }));\n\n try {\n const result = await client.call<TInput, TOutput>(path, input, {\n invalidates: autoInvalidates,\n optimisticUpdate: autoUpdateType,\n });\n setState({ data: result, loading: false, error: undefined });\n return result;\n } catch (error) {\n const err = error instanceof Error ? error : new Error(String(error));\n setState((prev) => ({ ...prev, loading: false, error: err }));\n throw err;\n }\n };\n\n const reset = () => {\n setState({ data: undefined, loading: false, error: undefined });\n };\n\n return {\n mutate,\n ...state,\n disabled: !client,\n reset,\n };\n}\n\n/**\n * Type helper for extracting procedure input type from ProcedureDefinition\n * Uses Zod's internal _output property to extract the parsed type\n * (Zod schemas have _input/_output as actual properties for type inference)\n */\ntype ProcedureInput<T> = T extends { inputSchema?: { _output: infer I } }\n ? I\n : undefined;\n\n/**\n * Type helper for extracting procedure output type from ProcedureDefinition\n * Extracts from resolver return type using any[] for flexible argument matching\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype ProcedureOutput<T> = T extends {\n resolver: (...args: any[]) => infer TReturn;\n}\n ? Awaited<TReturn>\n : unknown;\n\n/**\n * Typed client hooks for a router procedure\n * Provides both useQuery and useMutation - use whichever matches your procedure type\n */\ntype TypedProcedureHooks<TInput, TOutput> = {\n useQuery: (\n input: TInput,\n options?: Omit<SubscriptionOptions<TInput>, 'input'>,\n ) => {\n data: TOutput | undefined;\n loading: boolean;\n error: Error | undefined;\n disabled: boolean;\n refetch: () => Promise<void>;\n };\n useMutation: (options?: MutationOptions<TInput, TOutput>) => {\n mutate: (input: TInput) => Promise<TOutput>;\n data: TOutput | undefined;\n loading: boolean;\n error: Error | undefined;\n disabled: boolean;\n reset: () => void;\n };\n};\n\n/**\n * Extract router definition from Router class or use T directly\n */\ntype ExtractRouterDefinition<T> = T extends { definition: infer TDef }\n ? TDef\n : T;\n\n/**\n * Recursive type for typed client proxy\n * Checks for 'resolver' property to identify procedures (all procedures have it)\n */\ntype TypedClientProxyRecursive<T> = T extends { resolver: unknown }\n ? TypedProcedureHooks<ProcedureInput<T>, ProcedureOutput<T>>\n : { [K in keyof T]: TypedClientProxyRecursive<T[K]> };\n\n/**\n * Client utilities available at the root level\n */\ninterface ClientUtilities {\n /**\n * Set custom headers to be sent with HTTP requests.\n * Useful for auth context (e.g., user tokens, session info).\n */\n setHeaders: (\n headers:\n | Record<string, string>\n | (() => Record<string, string> | Promise<Record<string, string>>),\n ) => void;\n}\n\n/**\n * Typed client proxy combining router procedures and client utilities\n */\ntype TypedClientProxy<T> = TypedClientProxyRecursive<\n ExtractRouterDefinition<T>\n> &\n ClientUtilities;\n\n/**\n * Create a typed client proxy for use in React components.\n *\n * @example\n * ```tsx\n * const client = useClient<AppRouter>();\n *\n * // Queries (subscriptions)\n * const { data, loading } = client.todos.list.useQuery({});\n *\n * // Mutations\n * const { mutate, loading } = client.todos.toggle.useMutation();\n * await mutate({ id: '123' });\n *\n * // Set custom headers for HTTP requests (e.g., for auth context)\n * client.setHeaders({ 'Authorization': 'Bearer token' });\n * ```\n */\nexport function useClient<TRouter>(): TypedClientProxy<TRouter> {\n const client = useReactiveClient();\n\n function buildProxy(path: string[]): unknown {\n return new Proxy(\n {},\n {\n get(_target, prop: string) {\n if (prop === 'useQuery') {\n // Return a hook function for subscriptions\n return function useQueryHook(\n input?: unknown,\n options?: SubscriptionOptions<unknown>,\n ) {\n const pathStr = path.join('.');\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return useSubscription(pathStr, { ...options, input });\n };\n }\n\n if (prop === 'useMutation') {\n // Return a hook function for mutations\n return function useMutationHook(\n options?: MutationOptions<unknown, unknown>,\n ) {\n const pathStr = path.join('.');\n // eslint-disable-next-line react-hooks/rules-of-hooks\n return useMutation(pathStr, options);\n };\n }\n\n // Expose setHeaders from the underlying client\n if (prop === 'setHeaders') {\n return (\n headers:\n | Record<string, string>\n | (() =>\n | Record<string, string>\n | Promise<Record<string, string>>),\n ) => {\n client?.setHeaders(headers);\n };\n }\n\n return buildProxy([...path, prop]);\n },\n },\n );\n }\n\n return buildProxy([]) as TypedClientProxy<TRouter>;\n}\n\n/**\n * @deprecated Use useClient<TRouter>() instead for typed proxy access\n */\nexport function createReactiveHooks() {\n return {\n useSubscription: <TPath extends string, TData = unknown>(\n path: TPath,\n options?: SubscriptionOptions<unknown>,\n ) => useSubscription<TData>(path, options),\n\n useMutation: <TPath extends string, TInput = unknown, TOutput = unknown>(\n path: TPath,\n options?: MutationOptions<TInput, TOutput>,\n ) => useMutation<TInput, TOutput>(path, options),\n\n useConnectionState,\n useReactiveClient,\n };\n}\n\n/**\n * @deprecated Use useClient<TRouter>() instead for typed proxy access\n */\nexport function createProcedureHooks<TInput, TOutput>(path: string) {\n return {\n useSubscription: (\n input?: TInput,\n options?: Omit<SubscriptionOptions<TInput>, 'input'>,\n ) => useSubscription<TOutput>(path, { ...options, input }),\n\n useMutation: (options?: MutationOptions<TInput, TOutput>) =>\n useMutation<TInput, TOutput>(path, options),\n };\n}\n"]}
|