dynamodb-reactive 0.2.3 → 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +43 -1
- package/dist/cluster.cjs +1166 -0
- package/dist/cluster.cjs.map +1 -0
- package/dist/cluster.d.cts +152 -0
- package/dist/cluster.d.ts +152 -0
- package/dist/cluster.js +1154 -0
- package/dist/cluster.js.map +1 -0
- package/dist/infra.cjs +16 -5
- package/dist/infra.cjs.map +1 -1
- package/dist/infra.d.cts +8 -1
- package/dist/infra.d.ts +8 -1
- package/dist/infra.js +16 -5
- package/dist/infra.js.map +1 -1
- package/dist/server.cjs +66 -35
- package/dist/server.cjs.map +1 -1
- package/dist/server.js +66 -35
- package/dist/server.js.map +1 -1
- package/package.json +11 -1
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../client/src/canonical.ts","../../client/src/patcher.ts","../../client/src/log.ts","../../client/src/websocket.ts","../../client/src/client.ts","../../client/src/cluster.ts"],"names":["key","error"],"mappings":"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","file":"cluster.js","sourcesContent":["function canonicalize(\n value: unknown,\n seen: Set<object>,\n key: string,\n arrayItem = false,\n applyToJSON = true,\n): string | undefined {\n if (value === null) return 'null';\n\n switch (typeof value) {\n case 'string':\n case 'boolean':\n return JSON.stringify(value);\n case 'number':\n return Number.isFinite(value) ? JSON.stringify(value) : 'null';\n case 'undefined':\n return arrayItem ? 'null' : undefined;\n case 'object': {\n if (\n applyToJSON &&\n 'toJSON' in value &&\n typeof value.toJSON === 'function'\n ) {\n return canonicalize(value.toJSON(key), seen, key, arrayItem, false);\n }\n if (seen.has(value)) {\n throw new TypeError('Query input must not contain circular references');\n }\n\n seen.add(value);\n try {\n if (Array.isArray(value)) {\n const items: string[] = [];\n for (let index = 0; index < value.length; index++) {\n items.push(\n canonicalize(value[index], seen, String(index), true) ?? 'null',\n );\n }\n return `[${items.join(',')}]`;\n }\n\n const object = value as Record<string, unknown>;\n const entries: string[] = [];\n for (const key of Object.keys(object).sort()) {\n const item = canonicalize(object[key], seen, key);\n if (item !== undefined) {\n entries.push(`${JSON.stringify(key)}:${item}`);\n }\n }\n return `{${entries.join(',')}}`;\n } finally {\n seen.delete(value);\n }\n }\n default:\n throw new TypeError(`Unsupported query input value: ${typeof value}`);\n }\n}\n\n/** Return the stable identity used for subscription sharing and targeting. */\nexport function getQueryKey(path: string, input?: unknown): string {\n return `${JSON.stringify(path)}:${canonicalize(input, new Set(), '') ?? 'undefined'}`;\n}\n","import jsonpatch, { type Operation } from 'fast-json-patch';\n\nimport type { JsonPatch } from './protocol.js';\n\nconst { applyPatch } = jsonpatch;\n\n/**\n * Apply JSON patches to a document\n */\nexport function applyPatches<T>(document: T, patches: JsonPatch[]): T {\n if (patches.length === 0) {\n return document;\n }\n\n const operations: Operation[] = patches.map((patch) => {\n const op: Operation = {\n op: patch.op,\n path: patch.path,\n } as Operation;\n\n if ('value' in patch && patch.value !== undefined) {\n (op as { value: unknown }).value = patch.value;\n }\n if ('from' in patch && patch.from !== undefined) {\n (op as { from: string }).from = patch.from;\n }\n\n return op;\n });\n\n try {\n const result = applyPatch(\n structuredClone(document),\n operations,\n true, // Validate operations\n false, // Don't mutate the original\n );\n\n return result.newDocument as T;\n } catch (error) {\n throw new Error('Failed to apply patches', { cause: error });\n }\n}\n","/* eslint-disable no-console */\ntype DebugGlobal = typeof globalThis & {\n __DYNAMODB_REACTIVE_DEBUG__?: boolean;\n};\n\nexport function debug(...values: unknown[]): void {\n if ((globalThis as DebugGlobal).__DYNAMODB_REACTIVE_DEBUG__) {\n console.debug(...values);\n }\n}\n\nexport function warn(...values: unknown[]): void {\n console.warn(...values);\n}\n\nexport function error(...values: unknown[]): void {\n console.error(...values);\n}\n","import { error as logError } from './log.js';\nimport type { WebSocketEvent } from './protocol.js';\nimport type { ConnectionState, ReactiveClientConfig } from './types.js';\n\ninterface ConnectionWaitOptions {\n signal?: AbortSignal;\n timeoutMs?: number;\n}\n\ninterface ConnectionWaiter {\n resolve: (id: string) => void;\n reject: (error: Error) => void;\n cleanup: () => void;\n}\n\ntype ManagerConfig = Required<\n Pick<\n ReactiveClientConfig,\n | 'autoReconnect'\n | 'connectionTimeout'\n | 'handshakeTimeout'\n | 'maxReconnectAttempts'\n | 'reconnectDelay'\n >\n> &\n ReactiveClientConfig;\n\nconst HEARTBEAT_INTERVAL_MS = 5 * 60 * 1000;\n\nfunction withDefaults(config: ReactiveClientConfig): ManagerConfig {\n return {\n autoReconnect: true,\n connectionTimeout: 10000,\n handshakeTimeout: 10000,\n maxReconnectAttempts: 10,\n reconnectDelay: 1000,\n ...config,\n };\n}\n\n/** WebSocket manager with generation-fenced events and reconnection. */\nexport class WebSocketManager {\n private config: ManagerConfig;\n private ws: WebSocket | null = null;\n private state: ConnectionState = 'disconnected';\n private reconnectAttempts = 0;\n private reconnectTimer: ReturnType<typeof setTimeout> | null = null;\n private handshakeTimer: ReturnType<typeof setTimeout> | null = null;\n private heartbeatTimer: ReturnType<typeof setInterval> | null = null;\n private messageHandlers = new Set<(message: WebSocketEvent) => void>();\n private stateHandlers = new Set<(state: ConnectionState) => void>();\n private handshakeHandlers = new Set<(generation: number) => void>();\n private _connectionId: string | null = null;\n private connectionWaiters = new Set<ConnectionWaiter>();\n private socketGeneration = 0;\n private intentionalDisconnect = false;\n private lastConnectionError: Error | undefined;\n\n constructor(config: ReactiveClientConfig) {\n this.config = withDefaults(config);\n }\n\n /** Apply settings used by future requests/events without replacing the socket. */\n configure(config: ReactiveClientConfig): void {\n this.config = withDefaults(config);\n }\n\n get connectionId(): string | null {\n return this._connectionId;\n }\n\n get generation(): number {\n return this.socketGeneration;\n }\n\n waitForConnectionId(options: ConnectionWaitOptions = {}): Promise<string> {\n if (this._connectionId && this.state === 'connected') {\n return Promise.resolve(this._connectionId);\n }\n if (options.signal?.aborted) {\n return Promise.reject(new Error('Connection wait aborted'));\n }\n\n const timeoutMs = options.timeoutMs ?? this.config.connectionTimeout;\n return new Promise((resolve, reject) => {\n let timeout: ReturnType<typeof setTimeout> | undefined;\n const abort = () => finish(new Error('Connection wait aborted'));\n const waiter: ConnectionWaiter = {\n resolve,\n reject,\n cleanup: () => {\n if (timeout) clearTimeout(timeout);\n options.signal?.removeEventListener('abort', abort);\n },\n };\n const finish = (failure: Error) => {\n if (!this.connectionWaiters.delete(waiter)) return;\n waiter.cleanup();\n reject(failure);\n };\n\n this.connectionWaiters.add(waiter);\n options.signal?.addEventListener('abort', abort, { once: true });\n timeout = setTimeout(\n () =>\n finish(\n new Error(`Connection timed out after ${timeoutMs}ms`, {\n cause: this.lastConnectionError,\n }),\n ),\n timeoutMs,\n );\n });\n }\n\n getState(): ConnectionState {\n return this.state;\n }\n\n async connect(): Promise<void> {\n if (this.state === 'connected') return;\n if (this.state === 'connecting') {\n await this.waitForConnectionId();\n return;\n }\n\n if (this.state !== 'reconnecting') this.lastConnectionError = undefined;\n this.intentionalDisconnect = false;\n const generation = ++this.socketGeneration;\n this.setState('connecting');\n let socket: WebSocket | undefined;\n let retryable = true;\n\n try {\n if (!this.config.webSocketFactory && typeof globalThis.WebSocket !== 'function') {\n retryable = false;\n throw new Error(\n 'WebSocket is unavailable in this runtime. Enable the native WebSocket API ' +\n '(Node 20: --experimental-websocket), use Node 22 or newer, or configure webSocketFactory.',\n );\n }\n const url = await this.buildUrl();\n if (generation !== this.socketGeneration || this.intentionalDisconnect) {\n return;\n }\n\n let nextSocket: WebSocket;\n try {\n nextSocket = this.config.webSocketFactory\n ? this.config.webSocketFactory(url)\n : new globalThis.WebSocket(url);\n } catch (cause) {\n // Retrying cannot repair missing APIs, malformed URLs or a factory\n // that cannot construct a socket. Preserve its original error.\n retryable = false;\n throw cause;\n }\n socket = nextSocket;\n this.ws = nextSocket;\n this.startHandshakeTimer(nextSocket, generation);\n\n nextSocket.onopen = () => {\n if (!this.isCurrent(nextSocket, generation)) return;\n nextSocket.send(JSON.stringify({ type: 'init' }));\n };\n\n nextSocket.onclose = () => {\n if (!this.isCurrent(nextSocket, generation)) return;\n this.clearConnectionTimers();\n this.ws = null;\n this._connectionId = null;\n this.setState('disconnected');\n this.invokeLifecycleCallback('onDisconnect', this.config.onDisconnect);\n\n if (this.config.autoReconnect && !this.intentionalDisconnect) {\n this.scheduleReconnect();\n } else {\n this.rejectWaiters(new Error('WebSocket disconnected'));\n }\n };\n\n nextSocket.onerror = () => {\n if (!this.isCurrent(nextSocket, generation)) return;\n const failure = new Error('WebSocket error');\n this.lastConnectionError = failure;\n this.invokeLifecycleCallback('onError', this.config.onError, failure);\n };\n\n nextSocket.onmessage = (event) => {\n if (!this.isCurrent(nextSocket, generation)) return;\n this.receiveMessage(nextSocket, generation, event.data);\n };\n } catch (cause) {\n if (generation !== this.socketGeneration) return;\n const failure = cause instanceof Error ? cause : new Error(String(cause));\n this.lastConnectionError = failure;\n this.clearConnectionTimers();\n if (!retryable) {\n this.clearTimers();\n this.reconnectAttempts = 0;\n }\n if (socket && this.ws === socket) socket.close();\n this.ws = null;\n this._connectionId = null;\n this.setState('disconnected');\n this.invokeLifecycleCallback('onError', this.config.onError, failure);\n\n if (retryable && this.config.autoReconnect && !this.intentionalDisconnect) {\n this.scheduleReconnect();\n await this.waitForConnectionId();\n return;\n }\n this.rejectWaiters(failure);\n throw failure;\n }\n\n await this.waitForConnectionId();\n }\n\n disconnect(): void {\n this.intentionalDisconnect = true;\n ++this.socketGeneration;\n this.clearTimers();\n\n const socket = this.ws;\n this.ws = null;\n socket?.close(1000, 'Client disconnect');\n this._connectionId = null;\n this.setState('disconnected');\n this.rejectWaiters(new Error('WebSocket disconnected'));\n }\n\n forceReconnect(): void {\n this.intentionalDisconnect = false;\n ++this.socketGeneration;\n this.clearTimers();\n\n const socket = this.ws;\n this.ws = null;\n socket?.close(1000, 'Force reconnect');\n this._connectionId = null;\n this.reconnectAttempts = 0;\n this.setState('disconnected');\n void this.connect().catch(() => undefined);\n }\n\n onMessage(handler: (message: WebSocketEvent) => void): () => void {\n this.messageHandlers.add(handler);\n return () => this.messageHandlers.delete(handler);\n }\n\n onStateChange(handler: (state: ConnectionState) => void): () => void {\n this.stateHandlers.add(handler);\n return () => this.stateHandlers.delete(handler);\n }\n\n onHandshake(handler: (generation: number) => void): () => void {\n this.handshakeHandlers.add(handler);\n return () => this.handshakeHandlers.delete(handler);\n }\n\n private async buildUrl(): Promise<string> {\n let url = this.config.url;\n if (!this.config.auth) return url;\n\n const token =\n typeof this.config.auth === 'function' ? await this.config.auth() : this.config.auth;\n const separator = url.includes('?') ? '&' : '?';\n url = `${url}${separator}token=${encodeURIComponent(token)}`;\n return url;\n }\n\n private receiveMessage(socket: WebSocket, generation: number, rawData: unknown): void {\n try {\n const message = JSON.parse(String(rawData)) as WebSocketEvent;\n if (message.type === 'connected') {\n if (this._connectionId) return;\n this._connectionId = message.connectionId;\n socket.send(JSON.stringify({ type: 'ping' }));\n return;\n }\n\n if (message.type === 'pong') {\n if (!this._connectionId || this.state === 'connected') return;\n this.clearHandshakeTimer();\n this.lastConnectionError = undefined;\n this.reconnectAttempts = 0;\n this.setState('connected');\n this.startHeartbeat(socket, generation);\n this.invokeLifecycleCallback('onConnect', this.config.onConnect);\n this.resolveWaiters(this._connectionId);\n for (const handler of this.handshakeHandlers) handler(generation);\n return;\n }\n\n for (const handler of this.messageHandlers) handler(message);\n } catch (cause) {\n logError('Failed to parse WebSocket message:', cause);\n }\n }\n\n private startHandshakeTimer(socket: WebSocket, generation: number): void {\n this.clearHandshakeTimer();\n this.handshakeTimer = setTimeout(() => {\n if (!this.isCurrent(socket, generation) || this.state === 'connected') {\n return;\n }\n const failure = new Error('WebSocket handshake timed out');\n this.lastConnectionError = failure;\n this.invokeLifecycleCallback('onError', this.config.onError, failure);\n socket.close(4000, 'Handshake timeout');\n }, this.config.handshakeTimeout);\n }\n\n private startHeartbeat(socket: WebSocket, generation: number): void {\n this.clearHeartbeatTimer();\n this.heartbeatTimer = setInterval(() => {\n if (\n !this.isCurrent(socket, generation) ||\n this.state !== 'connected' ||\n socket.readyState !== socket.OPEN\n ) {\n return;\n }\n socket.send(JSON.stringify({ type: 'ping' }));\n }, HEARTBEAT_INTERVAL_MS);\n }\n\n private isCurrent(socket: WebSocket, generation: number): boolean {\n return this.ws === socket && this.socketGeneration === generation;\n }\n\n private setState(state: ConnectionState): void {\n if (this.state === state) return;\n this.state = state;\n for (const handler of this.stateHandlers) handler(state);\n }\n\n private scheduleReconnect(): void {\n if (this.reconnectTimer || this.intentionalDisconnect) return;\n if (this.reconnectAttempts >= this.config.maxReconnectAttempts) {\n const failure = new Error('Max reconnection attempts reached', {\n cause: this.lastConnectionError,\n });\n logError(failure.message);\n this.setState('disconnected');\n this.rejectWaiters(failure);\n this.invokeLifecycleCallback('onError', this.config.onError, failure);\n return;\n }\n\n this.setState('reconnecting');\n this.reconnectAttempts++;\n const delay =\n Math.min(this.config.reconnectDelay * 2 ** (this.reconnectAttempts - 1), 30000) *\n (0.5 + Math.random() * 0.5);\n\n this.reconnectTimer = setTimeout(() => {\n this.reconnectTimer = null;\n void this.connect().catch(() => undefined);\n }, delay);\n }\n\n private resolveWaiters(connectionId: string): void {\n const waiters = [...this.connectionWaiters];\n this.connectionWaiters.clear();\n for (const waiter of waiters) {\n waiter.cleanup();\n waiter.resolve(connectionId);\n }\n }\n\n private invokeLifecycleCallback<TArguments extends unknown[]>(\n name: 'onConnect' | 'onDisconnect' | 'onError',\n callback: ((...args: TArguments) => void) | undefined,\n ...args: TArguments\n ): void {\n if (!callback) return;\n try {\n callback(...args);\n } catch (cause) {\n try {\n logError(`[dynamodb-reactive] ${name} callback failed:`, cause);\n } catch {\n // Reporting must not let user callbacks re-enter socket lifecycle paths.\n }\n }\n }\n\n private rejectWaiters(failure: Error): void {\n const waiters = [...this.connectionWaiters];\n this.connectionWaiters.clear();\n for (const waiter of waiters) {\n waiter.cleanup();\n waiter.reject(failure);\n }\n }\n\n private clearHandshakeTimer(): void {\n if (!this.handshakeTimer) return;\n clearTimeout(this.handshakeTimer);\n this.handshakeTimer = null;\n }\n\n private clearHeartbeatTimer(): void {\n if (!this.heartbeatTimer) return;\n clearInterval(this.heartbeatTimer);\n this.heartbeatTimer = null;\n }\n\n private clearConnectionTimers(): void {\n this.clearHandshakeTimer();\n this.clearHeartbeatTimer();\n }\n\n private clearTimers(): void {\n this.clearConnectionTimers();\n if (!this.reconnectTimer) return;\n clearTimeout(this.reconnectTimer);\n this.reconnectTimer = null;\n }\n}\n","import { getQueryKey } from './canonical.js';\nimport { applyPatches } from './patcher.js';\nimport type {\n ErrorResponse,\n PatchEvent,\n SnapshotResponse,\n WebSocketEvent,\n} from './protocol.js';\nimport type {\n ConnectionState,\n MutationOptions,\n ReactiveClientConfig,\n Subscription,\n SubscriptionOptions,\n} from './types.js';\nimport { WebSocketManager } from './websocket.js';\n\nconst DEFAULT_HTTP_URL = '/api/reactive';\n\nfunction generateId(): string {\n return `${Date.now()}-${Math.random().toString(36).slice(2, 11)}`;\n}\n\ntype OptimisticUpdater = (data: unknown) => unknown;\n\ninterface OptimisticLayer {\n updater: OptimisticUpdater;\n settledRevision?: number;\n}\n\ninterface SubscriptionObserver {\n onData?: (data: unknown) => void;\n onError?: (error: Error) => void;\n}\n\ninterface SubscriptionState<TData> {\n id: string;\n key: string;\n path: string;\n input: unknown;\n authoritativeData: unknown;\n data: TData | undefined;\n loading: boolean;\n stale: boolean;\n error: Error | undefined;\n listeners: Set<() => void>;\n observers: Map<string, SubscriptionObserver>;\n active: boolean;\n hasRegistered: boolean;\n generation: number;\n registrationId: string | undefined;\n registrationConnectionId: string | undefined;\n registrationSocketGeneration: number | undefined;\n registrationPromise: Promise<void> | undefined;\n version: number | undefined;\n patchBuffer: Map<string, PatchEvent>;\n appliedMessageIds: Set<string>;\n resyncPromise: Promise<void> | undefined;\n resyncGeneration: number | undefined;\n optimisticLayers: Map<string, OptimisticLayer>;\n settlementRevision: number;\n registrationSettlementRevision: number;\n revision: number;\n}\n\ntype HttpResult = SnapshotResponse | ErrorResponse;\n\n/** Reactive client for shared, versioned subscriptions. */\nexport class ReactiveClient {\n private wsManager: WebSocketManager;\n private httpUrl: string;\n private authGetter?: () => string | Promise<string>;\n private headersGetter?: () =>\n | Record<string, string>\n | Promise<Record<string, string>>;\n private subscriptionsById = new Map<\n string,\n SubscriptionState<unknown>\n >();\n private subscriptionsByKey = new Map<\n string,\n SubscriptionState<unknown>\n >();\n private connectionState: ConnectionState = 'disconnected';\n private stateListeners = new Set<(state: ConnectionState) => void>();\n\n constructor(config: ReactiveClientConfig) {\n this.wsManager = new WebSocketManager(config);\n this.httpUrl = config.httpUrl ?? DEFAULT_HTTP_URL;\n this.setAuth(config.auth);\n this.setInitialHeaders(config.headers);\n\n this.wsManager.onMessage((message) => this.handleMessage(message));\n this.wsManager.onStateChange((state) => {\n this.connectionState = state;\n this.notifyStateListeners();\n if (state === 'disconnected' || state === 'reconnecting') {\n this.markSubscriptionsStale();\n }\n });\n this.wsManager.onHandshake((socketGeneration) => {\n this.registerActiveSubscriptions(socketGeneration);\n });\n }\n\n /** Apply live configuration without replacing subscription caches or the socket. */\n configure(config: ReactiveClientConfig): void {\n this.httpUrl = config.httpUrl ?? DEFAULT_HTTP_URL;\n this.authGetter = this.toAuthGetter(config.auth);\n this.headersGetter = this.toHeadersGetter(config.headers);\n this.wsManager.configure(config);\n }\n\n async connect(): Promise<void> {\n await this.wsManager.connect();\n }\n\n disconnect(): void {\n this.wsManager.disconnect();\n }\n\n forceReconnect(): void {\n this.wsManager.forceReconnect();\n }\n\n getConnectionState(): ConnectionState {\n return this.connectionState;\n }\n\n onConnectionStateChange(\n listener: (state: ConnectionState) => void,\n ): () => void {\n this.stateListeners.add(listener);\n return () => this.stateListeners.delete(listener);\n }\n\n subscribe<TData, TInput = unknown>(\n path: string,\n options: SubscriptionOptions<TInput, TData> = {},\n ): Subscription<TData> {\n const key = getQueryKey(path, options.input);\n let shared = this.subscriptionsByKey.get(key);\n\n if (!shared) {\n shared = {\n id: generateId(),\n key,\n path,\n input: options.input,\n authoritativeData: undefined,\n data: undefined,\n loading: true,\n stale: true,\n error: undefined,\n listeners: new Set(),\n observers: new Map(),\n active: true,\n hasRegistered: false,\n generation: 0,\n registrationId: undefined,\n registrationConnectionId: undefined,\n registrationSocketGeneration: undefined,\n registrationPromise: undefined,\n version: undefined,\n patchBuffer: new Map(),\n appliedMessageIds: new Set(),\n resyncPromise: undefined,\n resyncGeneration: undefined,\n optimisticLayers: new Map(),\n settlementRevision: 0,\n registrationSettlementRevision: 0,\n revision: 0,\n };\n this.subscriptionsByKey.set(key, shared);\n this.subscriptionsById.set(shared.id, shared);\n if (this.connectionState === 'connected') {\n void this.ensureRegistered(\n shared,\n this.wsManager.generation,\n ).catch(() => undefined);\n }\n }\n\n const leaseId = generateId();\n shared.observers.set(leaseId, {\n onData: options.onData\n ? (data) => options.onData?.(data as TData)\n : undefined,\n onError: options.onError,\n });\n if (\n this.connectionState === 'connected' &&\n (!shared.hasRegistered || shared.stale) &&\n !shared.registrationPromise\n ) {\n void this.ensureRegistered(shared, this.wsManager.generation).catch(\n () => undefined,\n );\n }\n const state = shared as SubscriptionState<TData>;\n let released = false;\n\n return {\n id: state.id,\n key: state.key,\n get data() {\n return state.data;\n },\n get loading() {\n return state.loading;\n },\n get stale() {\n return state.stale;\n },\n get error() {\n return state.error;\n },\n unsubscribe: () => {\n if (released) return;\n released = true;\n this.releaseSubscription(state, leaseId);\n },\n refetch: () => this.refetch(state),\n };\n }\n\n async call<TInput, TOutput>(\n path: string,\n input: TInput,\n options?: MutationOptions<TInput, TOutput>,\n ): Promise<TOutput> {\n const mutationId = generateId();\n const layers: SubscriptionState<unknown>[] = [];\n\n try {\n this.createMutationLayers(mutationId, input, options, layers);\n const connectionId = await this.wsManager.waitForConnectionId();\n const headers = await this.buildHeaders();\n const response = await fetch(this.httpUrl, {\n method: 'POST',\n headers,\n body: JSON.stringify({ type: 'call', connectionId, path, input }),\n });\n if (!response.ok) {\n throw new Error(`Call failed: ${response.status} ${response.statusText}`);\n }\n\n const result = (await response.json()) as {\n type: string;\n message?: string;\n data?: unknown;\n };\n if (result.type === 'error') {\n throw new Error(result.message ?? 'Unknown error');\n }\n\n const data = result.data as TOutput;\n this.settleMutationLayers(mutationId, input, data, options, layers);\n return data;\n } catch (cause) {\n this.removeMutationLayers(mutationId, layers);\n throw cause;\n }\n }\n\n addSubscriptionListener(id: string, listener: () => void): () => void {\n const state = this.subscriptionsById.get(id);\n if (!state) return () => undefined;\n state.listeners.add(listener);\n return () => state.listeners.delete(listener);\n }\n\n getSubscriptionRevision(id: string): number {\n return this.subscriptionsById.get(id)?.revision ?? -1;\n }\n\n applyOptimisticUpdate(\n subscriptionId: string,\n updater: (data: unknown) => unknown,\n ): void {\n const state = this.subscriptionsById.get(subscriptionId);\n if (!state || state.data === undefined) return;\n state.optimisticLayers.set(`local-${generateId()}`, {\n updater,\n });\n this.recomputeData(state);\n this.notifySubscription(state, true);\n }\n\n private setAuth(auth: ReactiveClientConfig['auth']): void {\n this.authGetter = this.toAuthGetter(auth);\n }\n\n private setInitialHeaders(headers: ReactiveClientConfig['headers']): void {\n this.headersGetter = this.toHeadersGetter(headers);\n }\n\n private toAuthGetter(\n auth: ReactiveClientConfig['auth'],\n ): (() => string | Promise<string>) | undefined {\n if (!auth) return undefined;\n return typeof auth === 'function' ? auth : () => auth;\n }\n\n private toHeadersGetter(\n headers: ReactiveClientConfig['headers'],\n ):\n | (() => Record<string, string> | Promise<Record<string, string>>)\n | undefined {\n if (!headers) return undefined;\n return typeof headers === 'function' ? headers : () => headers;\n }\n\n private registerActiveSubscriptions(socketGeneration: number): void {\n for (const state of this.subscriptionsByKey.values()) {\n if (state.active) {\n void this.ensureRegistered(state, socketGeneration).catch(\n () => undefined,\n );\n }\n }\n }\n\n private ensureRegistered(\n state: SubscriptionState<unknown>,\n socketGeneration: number,\n force = false,\n ): Promise<void> {\n if (\n !force &&\n state.registrationSocketGeneration === socketGeneration &&\n state.registrationPromise\n ) {\n return state.registrationPromise;\n }\n\n state.generation++;\n state.registrationSettlementRevision = state.settlementRevision;\n state.registrationId = generateId();\n state.registrationSocketGeneration = socketGeneration;\n state.registrationConnectionId = undefined;\n state.registrationPromise = undefined;\n state.resyncPromise = undefined;\n state.resyncGeneration = undefined;\n state.hasRegistered = false;\n state.version = undefined;\n state.patchBuffer.clear();\n state.appliedMessageIds.clear();\n state.loading = true;\n state.stale = true;\n state.error = undefined;\n this.notifySubscription(state);\n\n const generation = state.generation;\n const registrationId = state.registrationId;\n const isCurrent = () =>\n state.active &&\n state.generation === generation &&\n state.registrationId === registrationId &&\n state.registrationSocketGeneration === socketGeneration &&\n this.wsManager.generation === socketGeneration;\n let requestIssued = false;\n let registrationConnectionId: string | undefined;\n let request!: Promise<void>;\n request = (async () => {\n try {\n const connectionId = await this.wsManager.waitForConnectionId();\n if (!isCurrent()) return;\n registrationConnectionId = connectionId;\n state.registrationConnectionId = connectionId;\n const headers = await this.buildHeaders();\n if (!isCurrent()) return;\n requestIssued = true;\n const response = await fetch(this.httpUrl, {\n method: 'POST',\n headers,\n body: JSON.stringify({\n type: 'subscribe',\n connectionId,\n subscriptionId: state.id,\n generation,\n registrationId,\n path: state.path,\n input: state.input,\n }),\n });\n if (!response.ok) {\n throw new Error(\n `Subscribe failed: ${response.status} ${response.statusText}`,\n );\n }\n\n const result = (await response.json()) as HttpResult;\n if (result.type === 'error') {\n throw new Error(result.message);\n }\n if (!isCurrent()) return;\n this.handleSnapshot(result);\n if (isCurrent()) state.hasRegistered = true;\n } catch (cause) {\n if (isCurrent()) {\n const failure =\n cause instanceof Error ? cause : new Error(String(cause));\n state.error = failure;\n state.loading = this.hasSettledLayers(state);\n this.notifySubscription(state, false, failure);\n }\n throw cause;\n } finally {\n if ((!state.active || !isCurrent()) && requestIssued) {\n void this.sendUnsubscribe(\n registrationConnectionId,\n state.id,\n generation,\n registrationId,\n );\n }\n if (state.registrationPromise === request) {\n state.registrationPromise = undefined;\n }\n }\n })();\n state.registrationPromise = request;\n return request;\n }\n\n private releaseSubscription(\n state: SubscriptionState<unknown>,\n leaseId: string,\n ): void {\n state.observers.delete(leaseId);\n if (state.observers.size > 0) return;\n\n state.active = false;\n this.subscriptionsById.delete(state.id);\n this.subscriptionsByKey.delete(state.key);\n if (\n state.registrationId &&\n state.registrationConnectionId &&\n state.hasRegistered\n ) {\n void this.sendUnsubscribe(\n state.registrationConnectionId,\n state.id,\n state.generation,\n state.registrationId,\n );\n }\n }\n\n private async sendUnsubscribe(\n connectionId: string | undefined,\n subscriptionId: string,\n generation: number,\n registrationId: string,\n ): Promise<void> {\n if (!connectionId) return;\n try {\n const headers = await this.buildHeaders();\n await fetch(this.httpUrl, {\n method: 'POST',\n headers,\n body: JSON.stringify({\n type: 'unsubscribe',\n connectionId,\n subscriptionId,\n generation,\n registrationId,\n }),\n });\n } catch {\n // Connection cleanup is the fallback when an unsubscribe cannot be sent.\n }\n }\n\n private async refetch(state: SubscriptionState<unknown>): Promise<void> {\n if (!state.active) return;\n if (!state.registrationId) {\n await this.ensureRegistered(state, this.wsManager.generation);\n return;\n }\n await this.requestResync(state);\n }\n\n private handleMessage(message: WebSocketEvent): void {\n switch (message.type) {\n case 'patch':\n this.handlePatch(message);\n break;\n case 'resync': {\n const state = this.subscriptionsById.get(message.subscriptionId);\n if (state?.generation === message.generation) {\n void this.requestResync(state).catch(() => undefined);\n }\n break;\n }\n case 'connected':\n case 'pong':\n break;\n }\n }\n\n private handleSnapshot(message: SnapshotResponse): void {\n const state = this.subscriptionsById.get(message.subscriptionId);\n if (!state || message.generation !== state.generation) return;\n if (state.version !== undefined && message.version <= state.version) return;\n\n state.authoritativeData = message.data;\n state.version = message.version;\n state.error = undefined;\n\n const coveredRevision = state.registrationSettlementRevision;\n for (const [layerId, layer] of state.optimisticLayers) {\n if (\n layer.settledRevision !== undefined &&\n layer.settledRevision <= coveredRevision\n ) {\n state.optimisticLayers.delete(layerId);\n }\n }\n const awaitingReconciliation = this.hasSettledLayers(state);\n state.loading = awaitingReconciliation;\n state.stale = awaitingReconciliation;\n this.recomputeData(state);\n this.discardStalePatches(state);\n this.notifySubscription(state, true);\n this.drainPatchBuffer(state);\n }\n\n private handlePatch(message: PatchEvent): void {\n const state = this.subscriptionsById.get(message.subscriptionId);\n if (!state || message.generation !== state.generation) return;\n if (\n state.appliedMessageIds.has(message.messageId) ||\n state.patchBuffer.has(message.messageId)\n ) {\n return;\n }\n if (state.version !== undefined && message.toVersion <= state.version) {\n state.appliedMessageIds.add(message.messageId);\n return;\n }\n\n state.patchBuffer.set(message.messageId, message);\n if (state.version === undefined) return;\n this.drainPatchBuffer(state);\n }\n\n private drainPatchBuffer(state: SubscriptionState<unknown>): void {\n if (state.version === undefined || state.authoritativeData === undefined) {\n return;\n }\n\n this.discardStalePatches(state);\n while (true) {\n const next = [...state.patchBuffer.values()]\n .filter((patch) => patch.fromVersion === state.version)\n .sort((left, right) => left.toVersion - right.toVersion)[0];\n if (!next) break;\n\n state.patchBuffer.delete(next.messageId);\n try {\n state.authoritativeData = applyPatches(\n state.authoritativeData,\n next.patches,\n );\n state.version = next.toVersion;\n state.appliedMessageIds.add(next.messageId);\n const awaitingReconciliation = this.hasSettledLayers(state);\n state.loading = awaitingReconciliation;\n state.stale = awaitingReconciliation;\n state.error = undefined;\n this.recomputeData(state);\n this.notifySubscription(state, true);\n this.discardStalePatches(state);\n } catch {\n void this.requestResync(state).catch(() => undefined);\n return;\n }\n }\n\n if (\n [...state.patchBuffer.values()].some(\n (patch) =>\n patch.toVersion > state.version! &&\n patch.fromVersion !== state.version,\n )\n ) {\n void this.requestResync(state).catch(() => undefined);\n }\n }\n\n private discardStalePatches(state: SubscriptionState<unknown>): void {\n if (state.version === undefined) return;\n for (const [messageId, patch] of state.patchBuffer) {\n if (patch.toVersion <= state.version) {\n state.patchBuffer.delete(messageId);\n state.appliedMessageIds.add(messageId);\n }\n }\n }\n\n private requestResync(\n state: SubscriptionState<unknown>,\n ): Promise<void> {\n if (\n state.resyncPromise &&\n state.resyncGeneration === state.generation\n ) {\n return state.resyncPromise;\n }\n if (!state.active || !state.registrationId) return Promise.resolve();\n\n state.stale = true;\n state.loading = true;\n this.notifySubscription(state);\n let request!: Promise<void>;\n request = this.ensureRegistered(\n state,\n this.wsManager.generation,\n true,\n )\n .finally(() => {\n if (state.resyncPromise === request) {\n state.resyncPromise = undefined;\n state.resyncGeneration = undefined;\n }\n })\n .then(() => {\n if (state.active && this.hasSettledLayers(state)) {\n return this.requestResync(state);\n }\n return undefined;\n });\n state.resyncPromise = request;\n state.resyncGeneration = state.generation;\n return request;\n }\n\n private createMutationLayers<TInput, TOutput>(\n mutationId: string,\n input: TInput,\n options: MutationOptions<TInput, TOutput> | undefined,\n layered: SubscriptionState<unknown>[],\n ): void {\n const targets = this.findMutationTargets(options);\n for (const state of targets) {\n const updater = this.createOptimisticUpdater(input, options);\n if (!updater || state.authoritativeData === undefined) continue;\n state.optimisticLayers.set(mutationId, {\n updater,\n });\n layered.push(state);\n this.recomputeData(state);\n this.notifySubscription(state, true);\n }\n }\n\n private findMutationTargets<TInput, TOutput>(\n options: MutationOptions<TInput, TOutput> | undefined,\n ): SubscriptionState<unknown>[] {\n if (options?.queryKey) {\n const exact = this.subscriptionsByKey.get(options.queryKey);\n return exact ? [exact] : [];\n }\n if (typeof options?.invalidates === 'object') {\n const exact = this.subscriptionsByKey.get(\n getQueryKey(options.invalidates.path, options.invalidates.input),\n );\n return exact ? [exact] : [];\n }\n if (typeof options?.invalidates === 'string') {\n return [...this.subscriptionsByKey.values()].filter(\n (state) => state.path === options.invalidates,\n );\n }\n return [];\n }\n\n private createOptimisticUpdater<TInput, TOutput>(\n input: TInput,\n options: MutationOptions<TInput, TOutput> | undefined,\n result?: TOutput,\n settled = false,\n ): OptimisticUpdater | undefined {\n const update = options?.optimisticUpdate;\n if (typeof update === 'function') {\n return (data) =>\n Array.isArray(data) ? update(data, input, result) : data;\n }\n\n const itemId =\n typeof input === 'object' && input !== null\n ? (input as { id?: unknown }).id\n : undefined;\n if (update === 'remove' && itemId !== undefined) {\n return (data) =>\n Array.isArray(data)\n ? data.filter((item) => (item as { id?: unknown }).id !== itemId)\n : data;\n }\n if (update !== 'merge') return undefined;\n\n if (itemId !== undefined) {\n const resultFields =\n settled && typeof result === 'object' && result !== null ? result : {};\n return (data) => {\n if (!Array.isArray(data)) return data;\n return data.map((item) =>\n (item as { id?: unknown }).id === itemId\n ? { ...item, ...input, ...resultFields }\n : item,\n );\n };\n }\n if (options?.optimisticData === undefined) return undefined;\n\n return (data) => {\n if (!Array.isArray(data)) return data;\n const optimistic = settled\n ? result === undefined\n ? typeof options.optimisticData === 'function'\n ? (\n options.optimisticData as (\n optimisticInput: TInput,\n currentData: unknown[],\n ) => TOutput | undefined\n )(input, data)\n : options.optimisticData\n : result\n : typeof options.optimisticData === 'function'\n ? (\n options.optimisticData as (\n optimisticInput: TInput,\n currentData: unknown[],\n ) => TOutput | undefined\n )(input, data)\n : options.optimisticData;\n if (settled && optimistic !== null && typeof optimistic === 'object') {\n const optimisticId = (optimistic as { id?: unknown }).id;\n if (\n optimisticId !== undefined &&\n data.some(\n (item) =>\n typeof item === 'object' &&\n item !== null &&\n (item as { id?: unknown }).id === optimisticId,\n )\n ) {\n return data;\n }\n }\n return optimistic === undefined ? data : [optimistic, ...data];\n };\n }\n\n private settleMutationLayers<TInput, TOutput>(\n mutationId: string,\n input: TInput,\n result: TOutput,\n options: MutationOptions<TInput, TOutput> | undefined,\n states: SubscriptionState<unknown>[],\n ): void {\n for (const state of states) {\n const layer = state.optimisticLayers.get(mutationId);\n const updater = this.createOptimisticUpdater(\n input,\n options,\n result,\n true,\n );\n if (!layer || !updater) continue;\n layer.updater = updater;\n layer.settledRevision = ++state.settlementRevision;\n state.loading = true;\n state.stale = true;\n this.recomputeData(state);\n this.notifySubscription(state, true);\n void this.requestResync(state).catch(() => undefined);\n }\n }\n\n private removeMutationLayers(\n mutationId: string,\n states: SubscriptionState<unknown>[],\n ): void {\n for (const state of states) {\n if (!state.optimisticLayers.delete(mutationId)) continue;\n this.recomputeData(state);\n this.notifySubscription(state, true);\n }\n }\n\n private recomputeData(state: SubscriptionState<unknown>): void {\n let data = state.authoritativeData;\n for (const layer of state.optimisticLayers.values()) {\n data = layer.updater(data);\n }\n state.data = data;\n }\n\n private hasSettledLayers(state: SubscriptionState<unknown>): boolean {\n for (const layer of state.optimisticLayers.values()) {\n if (layer.settledRevision !== undefined) return true;\n }\n return false;\n }\n\n private async buildHeaders(): Promise<Record<string, string>> {\n const headers: Record<string, string> = {\n 'Content-Type': 'application/json',\n };\n if (this.headersGetter) Object.assign(headers, await this.headersGetter());\n if (this.authGetter) {\n headers['Authorization'] = `Bearer ${await this.authGetter()}`;\n }\n return headers;\n }\n\n private markSubscriptionsStale(): void {\n for (const state of this.subscriptionsByKey.values()) {\n if (!state.active) continue;\n state.stale = true;\n state.loading = true;\n this.notifySubscription(state);\n }\n }\n\n private notifySubscription(\n state: SubscriptionState<unknown>,\n dataChanged = false,\n failure?: Error,\n ): void {\n if (!state.active) return;\n state.revision++;\n for (const listener of state.listeners) listener();\n if (dataChanged) {\n for (const observer of state.observers.values()) {\n observer.onData?.(state.data);\n }\n }\n if (failure) {\n for (const observer of state.observers.values()) {\n observer.onError?.(failure);\n }\n }\n }\n\n private notifyStateListeners(): void {\n for (const listener of this.stateListeners) {\n listener(this.connectionState);\n }\n }\n}\n\ntype ProcedureInput<T> = T extends { inputSchema?: { _output: infer TInput } }\n ? TInput\n : undefined;\n\ntype ProcedureOutput<T> = T extends {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- resolver parameter variance prevents `unknown`\n resolver: (...args: any[]) => infer TReturn;\n}\n ? Awaited<TReturn>\n : unknown;\n\ntype ExtractRouterDefinition<T> = T extends { definition: infer TDefinition }\n ? TDefinition\n : T;\n\ntype QueryProcedure<T> = [ProcedureInput<T>] extends [undefined]\n ? {\n useSubscription: (\n input?: undefined,\n options?: Omit<\n SubscriptionOptions<undefined, ProcedureOutput<T>>,\n 'input'\n >,\n ) => Subscription<ProcedureOutput<T>>;\n }\n : {\n useSubscription: (\n input: ProcedureInput<T>,\n options?: Omit<\n SubscriptionOptions<ProcedureInput<T>, ProcedureOutput<T>>,\n 'input'\n >,\n ) => Subscription<ProcedureOutput<T>>;\n };\n\ntype MutationProcedure<T> = [ProcedureInput<T>] extends [undefined]\n ? {\n mutate: (\n input?: undefined,\n options?: MutationOptions<undefined, ProcedureOutput<T>>,\n ) => Promise<ProcedureOutput<T>>;\n }\n : {\n mutate: (\n input: ProcedureInput<T>,\n options?: MutationOptions<ProcedureInput<T>, ProcedureOutput<T>>,\n ) => Promise<ProcedureOutput<T>>;\n };\n\ntype TypedReactiveClientTree<T> = T extends { type: 'query' }\n ? QueryProcedure<T>\n : T extends { type: 'mutation' }\n ? MutationProcedure<T>\n : { [K in keyof T]: TypedReactiveClientTree<T[K]> };\n\nexport type TypedReactiveClient<TRouter> = TypedReactiveClientTree<\n ExtractRouterDefinition<TRouter>\n> & {\n connect: () => Promise<void>;\n disconnect: () => void;\n};\n\nexport function createReactiveClient<TRouter>(\n config: ReactiveClientConfig,\n): TypedReactiveClient<TRouter> {\n const client = new ReactiveClient(config);\n return createTypedProxy(client, []) as TypedReactiveClient<TRouter>;\n}\n\nfunction createTypedProxy(client: ReactiveClient, path: string[]): unknown {\n return new Proxy(\n {},\n {\n get(_target, property) {\n if (property === 'connect') return () => client.connect();\n if (property === 'disconnect') return () => client.disconnect();\n if (typeof property !== 'string') return undefined;\n\n if (property === 'useSubscription') {\n return (input?: unknown, options?: SubscriptionOptions) =>\n client.subscribe(path.join('.'), { ...options, input });\n }\n if (property === 'mutate') {\n return (\n input: unknown,\n options?: MutationOptions<unknown, unknown>,\n ) => client.call(path.join('.'), input, options);\n }\n return createTypedProxy(client, [...path, property]);\n },\n },\n );\n}\n","import { ReactiveClient } from './client.js';\nimport type { ReactiveClientConfig } from './types.js';\n\n/**\n * Cluster workers run on machines with no inbound access. They authenticate\n * outbound with a long-lived runner token, exchange it for a short-lived ticket,\n * and hold a reactive WebSocket that pushes work to them. These helpers use only\n * Web standards (fetch, WebSocket, Web Crypto), so the same code runs in Node and\n * in Workers runtimes, whichever backend serves the reactive protocol.\n */\n\nexport const DEFAULT_CLUSTER_TICKET_PATH = '/api/cluster/token';\nexport const DEFAULT_CLUSTER_HTTP_PATH = '/api/reactive';\nconst DEFAULT_RETRY_DELAY_MS = 10_000;\nconst DEFAULT_REQUEST_TIMEOUT_MS = 10_000;\nconst DEFAULT_TICKET_LIFETIME_SECONDS = 60;\n\n/** Short-lived credential returned by the ticket endpoint. */\nexport interface ClusterTicket {\n /** Sent as the WebSocket `token` query parameter and the HTTP bearer token. */\n token: string;\n /** Expiry in epoch seconds. */\n expiresAt: number;\n /** `wss:` URL of the reactive WebSocket. */\n url: string;\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return typeof value === 'object' && value !== null;\n}\n\n/** Validates a ticket endpoint response; the socket URL must use `wss:`. */\nexport function parseClusterTicket(value: unknown): ClusterTicket {\n if (\n !isRecord(value) ||\n typeof value.token !== 'string' ||\n value.token.length === 0 ||\n typeof value.expiresAt !== 'number' ||\n !Number.isFinite(value.expiresAt) ||\n typeof value.url !== 'string'\n ) {\n throw new Error('Cluster ticket response is invalid');\n }\n const url = new URL(value.url);\n if (url.protocol !== 'wss:') throw new Error('Cluster ticket URL must use WSS');\n return { token: value.token, expiresAt: value.expiresAt, url: url.toString() };\n}\n\nexport interface ClusterWorkerConfig {\n /** Origin of the application that serves the ticket and reactive HTTP endpoints. */\n baseUrl: string;\n /** Long-lived runner credential exchanged for tickets. */\n runnerToken: string | (() => string | Promise<string>);\n /** Ticket endpoint path. Defaults to `/api/cluster/token`. */\n ticketPath?: string;\n /** Reactive HTTP endpoint path. Defaults to `/api/reactive`. */\n httpPath?: string;\n /** Delay between ticket, connect, and reconnect attempts. Defaults to 10 seconds. */\n retryDelay?: number;\n /** Ticket request timeout. Defaults to 10 seconds. */\n requestTimeout?: number;\n /** Stops retrying when aborted. */\n signal?: AbortSignal;\n /** Called with each failed ticket or connect attempt before the next retry. */\n onRetry?: (error: Error) => void;\n /** Extra client options; the URL, HTTP URL, and auth are managed here. */\n client?: Omit<ReactiveClientConfig, 'url' | 'httpUrl' | 'auth'>;\n /** Fetch implementation for ticket requests. Defaults to the global fetch. */\n fetch?: typeof fetch;\n}\n\nfunction toError(cause: unknown): Error {\n return cause instanceof Error ? cause : new Error(String(cause));\n}\n\nfunction abortError(signal: AbortSignal): Error {\n return toError(signal.reason ?? new Error('Cluster worker connection aborted'));\n}\n\nfunction wait(milliseconds: number, signal?: AbortSignal): Promise<void> {\n return new Promise((resolve, reject) => {\n if (signal?.aborted) {\n reject(abortError(signal));\n return;\n }\n const onAbort = () => {\n clearTimeout(timer);\n reject(abortError(signal!));\n };\n const timer = setTimeout(() => {\n signal?.removeEventListener('abort', onAbort);\n resolve();\n }, milliseconds);\n signal?.addEventListener('abort', onAbort, { once: true });\n });\n}\n\n/** Requests a ticket from the application using the runner token. */\nexport async function fetchClusterTicket(\n config: Pick<\n ClusterWorkerConfig,\n 'baseUrl' | 'runnerToken' | 'ticketPath' | 'requestTimeout' | 'fetch'\n >,\n): Promise<ClusterTicket> {\n const runnerToken =\n typeof config.runnerToken === 'function'\n ? await config.runnerToken()\n : config.runnerToken;\n const endpoint = new URL(\n config.ticketPath ?? DEFAULT_CLUSTER_TICKET_PATH,\n config.baseUrl,\n );\n const response = await (config.fetch ?? fetch)(endpoint, {\n method: 'POST',\n headers: { authorization: `Bearer ${runnerToken}` },\n signal: AbortSignal.timeout(config.requestTimeout ?? DEFAULT_REQUEST_TIMEOUT_MS),\n });\n if (!response.ok) {\n throw new Error(`Cluster ticket request failed: HTTP ${response.status}`);\n }\n return parseClusterTicket(await response.json());\n}\n\n/**\n * Connects a cluster worker, retrying ticket and connect failures until it\n * succeeds or `signal` aborts. Each (re)connect fetches a fresh ticket. The\n * returned client keeps reconnecting on its own; subscribe to work with\n * `client.subscribe(...)` and stop with `client.disconnect()`.\n */\nexport async function connectClusterWorker(\n config: ClusterWorkerConfig,\n): Promise<ReactiveClient> {\n const retryDelay = config.retryDelay ?? DEFAULT_RETRY_DELAY_MS;\n const httpUrl = new URL(\n config.httpPath ?? DEFAULT_CLUSTER_HTTP_PATH,\n config.baseUrl,\n ).toString();\n for (;;) {\n if (config.signal?.aborted) throw abortError(config.signal);\n let client: ReactiveClient | undefined;\n try {\n // The first ticket only supplies the socket URL; the client fetches its own\n // ticket for every connection so reconnects never reuse an expired one.\n // oxlint-disable-next-line no-await-in-loop -- Attempts retry serially.\n const ticket = await fetchClusterTicket(config);\n client = new ReactiveClient({\n reconnectDelay: retryDelay,\n maxReconnectAttempts: Number.MAX_SAFE_INTEGER,\n ...config.client,\n url: ticket.url,\n httpUrl,\n auth: async () => (await fetchClusterTicket(config)).token,\n });\n // oxlint-disable-next-line no-await-in-loop -- Attempts retry serially.\n await client.connect();\n return client;\n } catch (cause) {\n // connect() keeps reconnecting after it rejects; stop it before retrying.\n client?.disconnect();\n if (config.signal?.aborted) throw abortError(config.signal);\n config.onRetry?.(toError(cause));\n // oxlint-disable-next-line no-await-in-loop -- Backoff belongs to the retry loop.\n await wait(retryDelay, config.signal);\n }\n }\n}\n\nconst encoder = new TextEncoder();\n\nfunction base64UrlEncode(bytes: Uint8Array): string {\n let binary = '';\n for (const byte of bytes) binary += String.fromCharCode(byte);\n return btoa(binary).replaceAll('+', '-').replaceAll('/', '_').replace(/=+$/u, '');\n}\n\nfunction base64UrlDecode(value: string): Uint8Array<ArrayBuffer> {\n const padded = value.replaceAll('-', '+').replaceAll('_', '/');\n const binary = atob(padded + '='.repeat((4 - (padded.length % 4)) % 4));\n const bytes = new Uint8Array(new ArrayBuffer(binary.length));\n for (let index = 0; index < binary.length; index += 1) bytes[index] = binary.charCodeAt(index);\n return bytes;\n}\n\nfunction hmacKey(secret: string, usage: 'sign' | 'verify'): Promise<CryptoKey> {\n return crypto.subtle.importKey(\n 'raw',\n encoder.encode(secret),\n { name: 'HMAC', hash: 'SHA-256' },\n false,\n [usage],\n );\n}\n\nexport interface SignedClusterTicketOptions {\n /** HMAC secret shared only by the servers that mint and verify tickets. */\n secret: string;\n /** Service principal the ticket authenticates as. */\n principal: string;\n /** `wss:` URL returned to the worker. */\n url: string;\n /** Ticket lifetime. Defaults to 60 seconds. */\n lifetimeSeconds?: number;\n /** Current time in milliseconds, for tests. */\n now?: number;\n}\n\n/**\n * Mints a stateless HMAC-signed ticket. Verifying it needs no storage read,\n * which keeps reconnect storms off the database.\n */\nexport async function createSignedClusterTicket(\n options: SignedClusterTicketOptions,\n): Promise<ClusterTicket> {\n const expiresAt =\n Math.floor((options.now ?? Date.now()) / 1000) +\n (options.lifetimeSeconds ?? DEFAULT_TICKET_LIFETIME_SECONDS);\n const payload = base64UrlEncode(\n encoder.encode(JSON.stringify({ p: options.principal, exp: expiresAt })),\n );\n const signature = new Uint8Array(\n await crypto.subtle.sign('HMAC', await hmacKey(options.secret, 'sign'), encoder.encode(payload)),\n );\n return parseClusterTicket({\n token: `${payload}.${base64UrlEncode(signature)}`,\n expiresAt,\n url: options.url,\n });\n}\n\n/** Returns the ticket's principal, or `undefined` when it is forged, malformed, or expired. */\nexport async function verifySignedClusterTicket(\n token: string,\n secret: string,\n now = Date.now(),\n): Promise<string | undefined> {\n const [payload, signature, extra] = token.split('.');\n if (!payload || !signature || extra !== undefined) return undefined;\n try {\n // crypto.subtle.verify compares in constant time.\n const valid = await crypto.subtle.verify(\n 'HMAC',\n await hmacKey(secret, 'verify'),\n base64UrlDecode(signature),\n encoder.encode(payload),\n );\n if (!valid) return undefined;\n const claims: unknown = JSON.parse(new TextDecoder().decode(base64UrlDecode(payload)));\n if (\n !isRecord(claims) ||\n typeof claims.p !== 'string' ||\n typeof claims.exp !== 'number' ||\n claims.exp <= Math.floor(now / 1000)\n ) {\n return undefined;\n }\n return claims.p;\n } catch {\n return undefined;\n }\n}\n"]}
|
package/dist/infra.cjs
CHANGED
|
@@ -301,6 +301,8 @@ var PARTIQL_ACTIONS = [
|
|
|
301
301
|
"dynamodb:PartiQLUpdate",
|
|
302
302
|
"dynamodb:PartiQLDelete"
|
|
303
303
|
];
|
|
304
|
+
var DEFAULT_STREAM_BATCH_SIZE = 100;
|
|
305
|
+
var MAX_STREAM_BATCH_SIZE = 1e3;
|
|
304
306
|
var ReactiveEngine = class extends constructs.Construct {
|
|
305
307
|
tables;
|
|
306
308
|
systemTables;
|
|
@@ -334,6 +336,11 @@ var ReactiveEngine = class extends constructs.Construct {
|
|
|
334
336
|
"WebSocket authentication is required. Provide connectAuthorizer or explicitly set allowUnauthenticatedConnections to true."
|
|
335
337
|
);
|
|
336
338
|
}
|
|
339
|
+
if (props.streamBatchSize !== void 0 && (!Number.isInteger(props.streamBatchSize) || props.streamBatchSize < 1 || props.streamBatchSize > MAX_STREAM_BATCH_SIZE)) {
|
|
340
|
+
throw new Error(
|
|
341
|
+
`ReactiveEngine streamBatchSize must be an integer from 1 to ${MAX_STREAM_BATCH_SIZE}.`
|
|
342
|
+
);
|
|
343
|
+
}
|
|
337
344
|
for (const binding of props.tables) {
|
|
338
345
|
this.validateTableName(binding);
|
|
339
346
|
this.validateStream(binding);
|
|
@@ -425,8 +432,8 @@ var ReactiveEngine = class extends constructs.Construct {
|
|
|
425
432
|
...environment,
|
|
426
433
|
USER_TABLES: props.tables.map(({ definition }) => definition.tableName).join(",")
|
|
427
434
|
},
|
|
428
|
-
memorySize,
|
|
429
|
-
timeout,
|
|
435
|
+
memorySize: props.streamHandlerProps?.memorySize ?? memorySize,
|
|
436
|
+
timeout: props.streamHandlerProps?.timeout ?? timeout,
|
|
430
437
|
logGroup: this.createLogGroup("StreamLogGroup")
|
|
431
438
|
});
|
|
432
439
|
iam__namespace.Grant.addToPrincipal({
|
|
@@ -517,7 +524,11 @@ var ReactiveEngine = class extends constructs.Construct {
|
|
|
517
524
|
)
|
|
518
525
|
});
|
|
519
526
|
for (const [index, binding] of props.tables.entries()) {
|
|
520
|
-
this.setupStreamProcessing(
|
|
527
|
+
this.setupStreamProcessing(
|
|
528
|
+
binding,
|
|
529
|
+
index,
|
|
530
|
+
props.streamBatchSize ?? DEFAULT_STREAM_BATCH_SIZE
|
|
531
|
+
);
|
|
521
532
|
}
|
|
522
533
|
new cdk2__namespace.CfnOutput(this, "WebSocketUrl", {
|
|
523
534
|
value: this.webSocketUrl,
|
|
@@ -552,7 +563,7 @@ var ReactiveEngine = class extends constructs.Construct {
|
|
|
552
563
|
});
|
|
553
564
|
}
|
|
554
565
|
}
|
|
555
|
-
setupStreamProcessing(binding, index) {
|
|
566
|
+
setupStreamProcessing(binding, index, batchSize) {
|
|
556
567
|
const { table } = binding;
|
|
557
568
|
table.grantStreamRead(this.streamHandler);
|
|
558
569
|
iam__namespace.Grant.addToPrincipal({
|
|
@@ -564,7 +575,7 @@ var ReactiveEngine = class extends constructs.Construct {
|
|
|
564
575
|
target: this.streamHandler,
|
|
565
576
|
eventSourceArn: table.tableStreamArn,
|
|
566
577
|
startingPosition: lambda__namespace.StartingPosition.TRIM_HORIZON,
|
|
567
|
-
batchSize
|
|
578
|
+
batchSize,
|
|
568
579
|
maxBatchingWindow: cdk2__namespace.Duration.seconds(5),
|
|
569
580
|
bisectBatchOnError: true,
|
|
570
581
|
reportBatchItemFailures: true
|
package/dist/infra.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../infra/src/handlers/lambda-handlers.ts","../../core/src/schema.ts","../../infra/src/tables.ts","../../infra/src/engine.ts"],"names":["z","Construct","cdk","dynamodb","cdk2","apigatewayv2","path","fs","nodejs","lambda","iam","apigatewayv2Integrations","logs","dynamodb2"],"mappings":"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","file":"infra.cjs","sourcesContent":["/**\n * Entry point code generator for the reactive Lambda handlers.\n *\n * No user code is imported - the handlers use only environment variables\n * and stored query metadata for all operations.\n */\n\n/**\n * Generate the entry point code for Lambda functions.\n * This is called by the CDK construct to create the bundled entry file.\n */\nexport function generateEntryPointCode(): string {\n return `// Auto-generated entry point for reactive Lambda handlers\n// No user code required - all configuration comes from environment variables\nimport { createLambdaHandlers } from 'dynamodb-reactive/server';\n\nconst handlers = createLambdaHandlers();\n\nexport const connectHandler = handlers.connectHandler;\nexport const disconnectHandler = handlers.disconnectHandler;\nexport const messageHandler = handlers.messageHandler;\nexport const streamHandler = handlers.streamHandler;\n`;\n}\n","import { z } from 'zod';\n\nimport type { FilterCondition } from './types.js';\n\nexport const FilterConditionSchema: z.ZodType<FilterCondition> = z.lazy(() => {\n const comparison = z\n .object({\n type: z.literal('comparison'),\n operator: z.enum(['eq', 'ne', 'gt', 'gte', 'lt', 'lte']),\n field: z.string().min(1),\n value: z.unknown(),\n })\n .strict();\n const queryFunction = z.union([\n z\n .object({\n type: z.literal('function'),\n operator: z.literal('between'),\n field: z.string().min(1),\n value: z.unknown(),\n value2: z.unknown(),\n })\n .strict(),\n z\n .object({\n type: z.literal('function'),\n operator: z.enum(['beginsWith', 'contains']),\n field: z.string().min(1),\n value: z.unknown(),\n })\n .strict(),\n ]);\n const logical = z\n .object({\n type: z.literal('logical'),\n operator: z.enum(['and', 'or', 'not']),\n conditions: z.array(FilterConditionSchema).min(1),\n })\n .strict()\n .superRefine((condition, context) => {\n if (condition.operator === 'not' && condition.conditions.length !== 1) {\n context.addIssue({\n code: 'custom',\n path: ['conditions'],\n message: 'not requires exactly one condition',\n });\n }\n });\n return z.union([comparison, queryFunction, logical]);\n});\n\nexport const QueryMetadataSchema = z\n .object({\n planVersion: z.literal(1),\n tableName: z.string().min(1),\n indexName: z.string().min(1).optional(),\n indexPkField: z.string().min(1).optional(),\n indexSkField: z.string().min(1).optional(),\n filterConditions: z.array(FilterConditionSchema),\n sortField: z.string().min(1).optional(),\n sortOrder: z.enum(['asc', 'desc']).optional(),\n limit: z.number().int().positive().optional(),\n })\n .strict()\n .superRefine((metadata, context) => {\n if (metadata.indexName && !metadata.indexPkField) {\n context.addIssue({\n code: 'custom',\n path: ['indexPkField'],\n message: 'Index metadata requires its partition key field',\n });\n }\n if (!metadata.indexName && (metadata.indexPkField || metadata.indexSkField)) {\n context.addIssue({\n code: 'custom',\n path: ['indexName'],\n message: 'Index key fields require an index name',\n });\n }\n if (Boolean(metadata.sortField) !== Boolean(metadata.sortOrder)) {\n context.addIssue({\n code: 'custom',\n path: ['sortOrder'],\n message: 'Sort field and order must be specified together',\n });\n }\n });\n\nconst DeliveryVersionSchema = z.object({\n generation: z.number().int().nonnegative(),\n fromVersion: z.number().int().nonnegative(),\n toVersion: z.number().int().positive(),\n messageId: z.string().min(1),\n});\n\nexport const PendingDeliverySchema = z.discriminatedUnion('type', [\n DeliveryVersionSchema.extend({\n type: z.literal('patch'),\n patches: z.array(\n z.object({\n op: z.enum(['add', 'remove', 'replace', 'move', 'copy', 'test']),\n path: z.string(),\n value: z.unknown().optional(),\n from: z.string().optional(),\n }),\n ),\n }),\n DeliveryVersionSchema.extend({\n type: z.literal('resync'),\n }).strict(),\n]);\n\n/**\n * System table schemas for the reactive engine\n */\nexport const SystemSchemas = {\n /**\n * ReactiveConnectionsV2 - Tracks active WebSocket connections\n */\n connections: z.object({\n connectionId: z.string(),\n status: z.enum(['open', 'closed']),\n context: z.record(z.string(), z.unknown()).optional(),\n authorizerContext: z.record(z.string(), z.unknown()).optional(),\n requestIdentity: z.record(z.string(), z.unknown()).optional(),\n connectedAt: z.number(),\n ttl: z.number(),\n }),\n\n /**\n * ReactiveDependenciesV2 - The inverted index for O(1) lookups\n */\n dependencies: z.object({\n pk: z.string(), // Versioned encoded dependency key\n sk: z.string(), // ConnectionID#SubscriptionID\n connectionId: z.string(),\n subscriptionId: z.string(),\n tableName: z.string(),\n fieldName: z.string(),\n fieldValue: z.string(),\n generation: z.number().int().nonnegative(),\n registrationId: z.string().min(1),\n ttl: z.number(),\n }),\n\n /**\n * ReactiveConnectionQueriesV2 - Stores subscription state for diffing\n */\n queries: z.object({\n pk: z.string(), // ConnectionID\n sk: z.string(), // SubscriptionID\n connectionId: z.string(),\n subscriptionId: z.string(),\n status: z.enum(['registering', 'active', 'cancelled', 'faulted']),\n generation: z.number().int().nonnegative(),\n registrationId: z.string().min(1),\n queryMetadata: QueryMetadataSchema,\n lastResult: z.array(z.unknown()),\n dependencies: z.array(z.string()),\n version: z.number().int().nonnegative(),\n pendingDelivery: PendingDeliverySchema.optional(),\n createdAt: z.number(),\n updatedAt: z.number(),\n ttl: z.number(),\n }),\n};\n\n/** Storage/protocol generation used by all reactive system tables. */\nexport const SYSTEM_TABLE_PROTOCOL_VERSION = 2 as const;\n\n/**\n * Versioned system table names. The V2 suffix intentionally prevents state\n * written by the incompatible 0.1.x dependency protocol from being reused.\n */\nexport const SystemTableNames = {\n connections: 'ReactiveConnectionsV2',\n dependencies: 'ReactiveDependenciesV2',\n queries: 'ReactiveConnectionQueriesV2',\n} as const;\n","import { SystemTableNames } from '@dynamodb-reactive/core';\nimport * as cdk from 'aws-cdk-lib';\nimport * as dynamodb from 'aws-cdk-lib/aws-dynamodb';\nimport { Construct } from 'constructs';\n\n/**\n * Provisioning mode for DynamoDB tables\n * - \"ON_DEMAND\": Pay-per-request billing (default)\n * - { readWrite: number }: Provisioned capacity with specified RCU/WCU\n */\nexport type ProvisioningMode = 'ON_DEMAND' | { readWrite: number };\n\n/**\n * Props for ReactiveSystemTables\n */\nexport interface ReactiveSystemTablesProps {\n /**\n * Nonempty, concrete prefix for the fixed physical table names.\n * Use the same value as the application's `tablePrefix`.\n */\n tablePrefix: string;\n\n /**\n * Provisioning mode for tables\n * @default \"ON_DEMAND\"\n */\n provisioningMode?: ProvisioningMode;\n\n /**\n * Policy applied when a system table is removed or replaced.\n * Set to RemovalPolicy.DESTROY only for disposable environments.\n * Retained tables have fixed names, so recreating a stack with the same\n * prefix requires importing or manually removing any retained tables first.\n * @default RemovalPolicy.RETAIN\n */\n removalPolicy?: cdk.RemovalPolicy;\n}\n\n/**\n * Creates the three system tables for the reactive engine\n */\nexport class ReactiveSystemTables extends Construct {\n /**\n * ReactiveConnections table - tracks WebSocket connections\n */\n public readonly connectionsTable: dynamodb.Table;\n\n /**\n * ReactiveDependencies table - the inverted index\n */\n public readonly dependenciesTable: dynamodb.Table;\n\n /**\n * ReactiveConnectionQueries table - stores subscription state\n */\n public readonly queriesTable: dynamodb.Table;\n\n constructor(\n scope: Construct,\n id: string,\n props: ReactiveSystemTablesProps,\n ) {\n super(scope, id);\n\n if (\n cdk.Token.isUnresolved(props.tablePrefix) ||\n !/^[A-Za-z0-9][A-Za-z0-9_-]*$/.test(props.tablePrefix) ||\n props.tablePrefix.length > 229\n ) {\n throw new Error(\n 'ReactiveSystemTables tablePrefix must be a nonempty concrete value of at most 229 letters, numbers, hyphens, or underscores, starting with a letter or number.',\n );\n }\n\n const tableName = (name: string): string =>\n `${props.tablePrefix}-${name}`;\n const provisioningMode = props.provisioningMode ?? 'ON_DEMAND';\n const removalPolicy = props.removalPolicy ?? cdk.RemovalPolicy.RETAIN;\n\n // Determine billing/capacity settings\n const isOnDemand = provisioningMode === 'ON_DEMAND';\n const capacityProps = isOnDemand\n ? { billingMode: dynamodb.BillingMode.PAY_PER_REQUEST }\n : {\n billingMode: dynamodb.BillingMode.PROVISIONED,\n readCapacity: provisioningMode.readWrite,\n writeCapacity: provisioningMode.readWrite,\n };\n\n // ReactiveConnections Table\n // Tracks active WebSocket connections and user context\n this.connectionsTable = new dynamodb.Table(this, 'ConnectionsTable', {\n tableName: tableName(SystemTableNames.connections),\n partitionKey: {\n name: 'connectionId',\n type: dynamodb.AttributeType.STRING,\n },\n ...capacityProps,\n removalPolicy,\n timeToLiveAttribute: 'ttl',\n });\n\n // ReactiveDependencies Table (The Inverted Index)\n // Maps Field#Value -> ConnectionID for O(1) lookups\n this.dependenciesTable = new dynamodb.Table(this, 'DependenciesTable', {\n tableName: tableName(SystemTableNames.dependencies),\n partitionKey: {\n name: 'pk', // Format: \"TableName#FieldName#FieldValue\"\n type: dynamodb.AttributeType.STRING,\n },\n sortKey: {\n name: 'sk', // Format: \"ConnectionID#SubscriptionID\"\n type: dynamodb.AttributeType.STRING,\n },\n ...capacityProps,\n removalPolicy,\n timeToLiveAttribute: 'ttl',\n });\n\n // Add GSI for querying by connectionId (for cleanup)\n // For provisioned mode, GSI needs its own capacity\n const gsiProps = isOnDemand\n ? {}\n : {\n readCapacity: provisioningMode.readWrite,\n writeCapacity: provisioningMode.readWrite,\n };\n\n this.dependenciesTable.addGlobalSecondaryIndex({\n indexName: 'byConnectionId',\n partitionKey: {\n name: 'connectionId',\n type: dynamodb.AttributeType.STRING,\n },\n projectionType: dynamodb.ProjectionType.KEYS_ONLY,\n ...gsiProps,\n });\n\n // ReactiveConnectionQueries Table\n // Stores subscription state for diffing\n this.queriesTable = new dynamodb.Table(this, 'QueriesTable', {\n tableName: tableName(SystemTableNames.queries),\n partitionKey: {\n name: 'pk', // ConnectionID\n type: dynamodb.AttributeType.STRING,\n },\n sortKey: {\n name: 'sk', // SubscriptionID\n type: dynamodb.AttributeType.STRING,\n },\n ...capacityProps,\n removalPolicy,\n timeToLiveAttribute: 'ttl',\n });\n }\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\n\nimport type { AnyDynamoTable } from '@dynamodb-reactive/core';\nimport * as cdk from 'aws-cdk-lib';\nimport * as apigatewayv2 from 'aws-cdk-lib/aws-apigatewayv2';\nimport * as apigatewayv2Integrations from 'aws-cdk-lib/aws-apigatewayv2-integrations';\nimport * as dynamodb from 'aws-cdk-lib/aws-dynamodb';\nimport * as iam from 'aws-cdk-lib/aws-iam';\nimport * as lambda from 'aws-cdk-lib/aws-lambda';\nimport * as nodejs from 'aws-cdk-lib/aws-lambda-nodejs';\nimport * as logs from 'aws-cdk-lib/aws-logs';\nimport { Construct } from 'constructs';\n\nimport { generateEntryPointCode } from './handlers/lambda-handlers.js';\nimport {\n ReactiveSystemTables,\n type ReactiveSystemTablesProps,\n} from './tables.js';\n\nconst PARTIQL_ACTIONS = [\n 'dynamodb:PartiQLInsert',\n 'dynamodb:PartiQLUpdate',\n 'dynamodb:PartiQLDelete',\n];\n\n/** Associates an application table definition with its deployed CDK table. */\nexport interface ReactiveTableBinding {\n readonly definition: AnyDynamoTable;\n\n /**\n * Deployed table with DynamoDB Streams configured for NEW_AND_OLD_IMAGES.\n * Imported ITable resources must supply tableStreamArn; CDK cannot expose\n * their stream view type, so callers remain responsible for that setting.\n */\n readonly table: dynamodb.ITable;\n}\n\n/** Props for ReactiveEngine construct. */\nexport interface ReactiveEngineProps {\n /** User-defined tables and their deployed CDK resources. */\n tables: readonly ReactiveTableBinding[];\n\n /**\n * Authorizer applied to the WebSocket $connect route.\n * WebSocketIamAuthorizer is supported; its requestContext.identity is\n * persisted with the connection. Lambda authorizer context is also persisted.\n * Authorizers whose bind result uses NONE authorization are rejected.\n */\n connectAuthorizer?: apigatewayv2.IWebSocketRouteAuthorizer;\n\n /**\n * Explicitly permit unauthenticated WebSocket connections.\n * Cannot be combined with connectAuthorizer.\n * @default false\n */\n allowUnauthenticatedConnections?: boolean;\n\n /**\n * Nonempty, concrete prefix for physical resource names. Pass this same value\n * as the server application's `tablePrefix`.\n */\n resourcePrefix: string;\n\n /** System tables configuration. */\n systemTablesProps?: Omit<ReactiveSystemTablesProps, 'tablePrefix'>;\n\n /** Environment variables for Lambda functions. */\n environment?: Record<string, string>;\n}\n\n/** Main CDK construct for the reactive DynamoDB system. */\nexport class ReactiveEngine extends Construct {\n public readonly tables: readonly ReactiveTableBinding[];\n public readonly systemTables: ReactiveSystemTables;\n public readonly webSocketApi: apigatewayv2.WebSocketApi;\n public readonly webSocketStage: apigatewayv2.WebSocketStage;\n public readonly connectHandler: lambda.Function;\n public readonly disconnectHandler: lambda.Function;\n public readonly messageHandler: lambda.Function;\n public readonly streamHandler: lambda.Function;\n public readonly webSocketUrl: string;\n public readonly callbackUrl: string;\n\n constructor(scope: Construct, id: string, props: ReactiveEngineProps) {\n super(scope, id);\n\n if (\n cdk.Token.isUnresolved(props.resourcePrefix) ||\n !/^[A-Za-z0-9][A-Za-z0-9_-]*$/.test(props.resourcePrefix) ||\n props.resourcePrefix.length > 45\n ) {\n throw new Error(\n 'ReactiveEngine resourcePrefix must be a nonempty concrete value of at most 45 letters, numbers, hyphens, or underscores, starting with a letter or number.',\n );\n }\n\n if (props.connectAuthorizer && props.allowUnauthenticatedConnections) {\n throw new Error(\n 'Specify either connectAuthorizer or allowUnauthenticatedConnections, not both.',\n );\n }\n if (\n props.connectAuthorizer instanceof apigatewayv2.WebSocketNoneAuthorizer\n ) {\n throw new Error(\n 'WebSocketNoneAuthorizer does not authenticate connections. Set allowUnauthenticatedConnections to true instead.',\n );\n }\n if (!props.connectAuthorizer && !props.allowUnauthenticatedConnections) {\n throw new Error(\n 'WebSocket authentication is required. Provide connectAuthorizer or explicitly set allowUnauthenticatedConnections to true.',\n );\n }\n\n for (const binding of props.tables) {\n this.validateTableName(binding);\n this.validateStream(binding);\n }\n this.tables = [...props.tables];\n\n const resourceName = (name: string): string =>\n `${props.resourcePrefix}-${name}`;\n const memorySize = 128;\n const timeout = cdk.Duration.seconds(30);\n\n this.systemTables = new ReactiveSystemTables(this, 'SystemTables', {\n ...props.systemTablesProps,\n tablePrefix: props.resourcePrefix,\n });\n\n this.webSocketApi = new apigatewayv2.WebSocketApi(this, 'WebSocketApi', {\n apiName: resourceName('ReactiveWebSocket'),\n });\n\n this.webSocketStage = new apigatewayv2.WebSocketStage(\n this,\n 'WebSocketStage',\n {\n webSocketApi: this.webSocketApi,\n stageName: 'prod',\n autoDeploy: true,\n },\n );\n\n this.webSocketUrl = this.webSocketStage.url;\n this.callbackUrl = this.webSocketStage.callbackUrl;\n\n // Every engine uses the same generated source, so its path and asset are stable.\n const cdkOutDir = path.join(process.cwd(), 'cdk.out', '.generated');\n fs.mkdirSync(cdkOutDir, { recursive: true });\n const entryPointPath = path.join(cdkOutDir, 'reactive-entry.ts');\n fs.writeFileSync(entryPointPath, generateEntryPointCode());\n\n const environment: Record<string, string> = {\n ...props.environment,\n CONNECTIONS_TABLE: this.systemTables.connectionsTable.tableName,\n DEPENDENCIES_TABLE: this.systemTables.dependenciesTable.tableName,\n QUERIES_TABLE: this.systemTables.queriesTable.tableName,\n WEBSOCKET_ENDPOINT: this.callbackUrl,\n LOG_LEVEL: props.environment?.LOG_LEVEL ?? 'INFO',\n };\n const bundling: nodejs.BundlingOptions = {\n format: nodejs.OutputFormat.CJS,\n minify: true,\n sourceMap: false,\n target: 'node24',\n };\n\n this.connectHandler = new nodejs.NodejsFunction(this, 'ConnectHandler', {\n functionName: resourceName('ReactiveConnect'),\n runtime: lambda.Runtime.NODEJS_24_X,\n handler: 'connectHandler',\n entry: entryPointPath,\n bundling,\n environment,\n memorySize,\n timeout,\n logGroup: this.createLogGroup('ConnectLogGroup'),\n });\n\n this.disconnectHandler = new nodejs.NodejsFunction(\n this,\n 'DisconnectHandler',\n {\n functionName: resourceName('ReactiveDisconnect'),\n runtime: lambda.Runtime.NODEJS_24_X,\n handler: 'disconnectHandler',\n entry: entryPointPath,\n bundling,\n environment,\n memorySize,\n timeout,\n logGroup: this.createLogGroup('DisconnectLogGroup'),\n },\n );\n\n this.messageHandler = new nodejs.NodejsFunction(this, 'MessageHandler', {\n functionName: resourceName('ReactiveMessage'),\n runtime: lambda.Runtime.NODEJS_24_X,\n handler: 'messageHandler',\n entry: entryPointPath,\n bundling,\n environment,\n memorySize,\n timeout,\n logGroup: this.createLogGroup('MessageLogGroup'),\n });\n\n this.streamHandler = new nodejs.NodejsFunction(this, 'StreamHandler', {\n functionName: resourceName('ReactiveStream'),\n runtime: lambda.Runtime.NODEJS_24_X,\n handler: 'streamHandler',\n entry: entryPointPath,\n bundling,\n environment: {\n ...environment,\n USER_TABLES: props.tables\n .map(({ definition }) => definition.tableName)\n .join(','),\n },\n memorySize,\n timeout,\n logGroup: this.createLogGroup('StreamLogGroup'),\n });\n\n iam.Grant.addToPrincipal({\n grantee: this.connectHandler,\n actions: ['dynamodb:PutItem'],\n resourceArns: [this.systemTables.connectionsTable.tableArn],\n });\n iam.Grant.addToPrincipal({\n grantee: this.disconnectHandler,\n actions: ['dynamodb:UpdateItem'],\n resourceArns: [this.systemTables.connectionsTable.tableArn],\n });\n iam.Grant.addToPrincipal({\n grantee: this.disconnectHandler,\n actions: ['dynamodb:Query', 'dynamodb:UpdateItem'],\n resourceArns: [this.systemTables.queriesTable.tableArn],\n });\n iam.Grant.addToPrincipal({\n grantee: this.disconnectHandler,\n actions: ['dynamodb:DeleteItem'],\n resourceArns: [this.systemTables.dependenciesTable.tableArn],\n });\n iam.Grant.addToPrincipal({\n grantee: this.messageHandler,\n actions: ['dynamodb:UpdateItem'],\n resourceArns: [this.systemTables.connectionsTable.tableArn],\n });\n iam.Grant.addToPrincipal({\n grantee: this.streamHandler,\n actions: ['dynamodb:UpdateItem'],\n resourceArns: [this.systemTables.connectionsTable.tableArn],\n });\n iam.Grant.addToPrincipal({\n grantee: this.streamHandler,\n actions: ['dynamodb:Query', 'dynamodb:DeleteItem'],\n resourceArns: [this.systemTables.dependenciesTable.tableArn],\n });\n iam.Grant.addToPrincipal({\n grantee: this.streamHandler,\n actions: [\n 'dynamodb:GetItem',\n 'dynamodb:Query',\n 'dynamodb:UpdateItem',\n ],\n resourceArns: [this.systemTables.queriesTable.tableArn],\n });\n\n const managementPolicy = new iam.PolicyStatement({\n actions: ['execute-api:ManageConnections'],\n resources: [\n cdk.Stack.of(this).formatArn({\n service: 'execute-api',\n resource: this.webSocketApi.apiId,\n resourceName: `${this.webSocketStage.stageName}/POST/@connections/*`,\n arnFormat: cdk.ArnFormat.SLASH_RESOURCE_NAME,\n }),\n ],\n });\n this.messageHandler.addToRolePolicy(managementPolicy);\n this.streamHandler.addToRolePolicy(managementPolicy);\n\n const connectAuthorizer = props.connectAuthorizer\n ? {\n bind: (\n options: apigatewayv2.WebSocketRouteAuthorizerBindOptions,\n ): apigatewayv2.WebSocketRouteAuthorizerConfig => {\n const config = props.connectAuthorizer!.bind(options);\n if (config.authorizationType === 'NONE') {\n throw new Error(\n 'The connectAuthorizer bind result uses NONE authorization. Set allowUnauthenticatedConnections to true instead.',\n );\n }\n return config;\n },\n }\n : undefined;\n\n this.webSocketApi.addRoute('$connect', {\n authorizer: connectAuthorizer,\n integration: new apigatewayv2Integrations.WebSocketLambdaIntegration(\n 'ConnectIntegration',\n this.connectHandler,\n ),\n });\n this.webSocketApi.addRoute('$disconnect', {\n integration: new apigatewayv2Integrations.WebSocketLambdaIntegration(\n 'DisconnectIntegration',\n this.disconnectHandler,\n ),\n });\n this.webSocketApi.addRoute('$default', {\n integration: new apigatewayv2Integrations.WebSocketLambdaIntegration(\n 'DefaultIntegration',\n this.messageHandler,\n ),\n });\n\n for (const [index, binding] of props.tables.entries()) {\n this.setupStreamProcessing(binding, index);\n }\n\n new cdk.CfnOutput(this, 'WebSocketUrl', {\n value: this.webSocketUrl,\n description: 'WebSocket URL for reactive connections',\n });\n }\n\n /** Grant an external application handler access to reactive and user data. */\n public grantApplicationAccess(grantee: iam.IGrantable): void {\n this.systemTables.connectionsTable.grantReadWriteData(grantee);\n this.systemTables.dependenciesTable.grantReadWriteData(grantee);\n this.systemTables.queriesTable.grantReadWriteData(grantee);\n iam.Grant.addToPrincipal({\n grantee,\n actions: ['dynamodb:TransactWriteItems'],\n resourceArns: [\n this.systemTables.connectionsTable.tableArn,\n this.systemTables.dependenciesTable.tableArn,\n this.systemTables.queriesTable.tableArn,\n ],\n });\n\n for (const { table } of this.tables) {\n table.grantReadWriteData(grantee);\n iam.Grant.addToPrincipal({\n grantee,\n actions: ['dynamodb:PartiQLSelect'],\n resourceArns: [table.tableArn, `${table.tableArn}/index/*`],\n });\n iam.Grant.addToPrincipal({\n grantee,\n actions: PARTIQL_ACTIONS,\n resourceArns: [table.tableArn],\n });\n }\n }\n\n private setupStreamProcessing(\n binding: ReactiveTableBinding,\n index: number,\n ): void {\n const { table } = binding;\n table.grantStreamRead(this.streamHandler);\n iam.Grant.addToPrincipal({\n grantee: this.streamHandler,\n actions: ['dynamodb:PartiQLSelect'],\n resourceArns: [table.tableArn, `${table.tableArn}/index/*`],\n });\n\n new lambda.EventSourceMapping(this, `UserTableStream${index}`, {\n target: this.streamHandler,\n eventSourceArn: table.tableStreamArn!,\n startingPosition: lambda.StartingPosition.TRIM_HORIZON,\n batchSize: 100,\n maxBatchingWindow: cdk.Duration.seconds(5),\n bisectBatchOnError: true,\n reportBatchItemFailures: true,\n });\n }\n\n private createLogGroup(id: string): logs.LogGroup {\n return new logs.LogGroup(this, id, {\n retention: logs.RetentionDays.ONE_DAY,\n removalPolicy: cdk.RemovalPolicy.DESTROY,\n });\n }\n\n private validateStream(binding: ReactiveTableBinding): void {\n const { definition, table } = binding;\n if (!table.tableStreamArn) {\n throw new Error(\n `Table ${definition.tableName} does not have DynamoDB Streams enabled. NEW_AND_OLD_IMAGES is required.`,\n );\n }\n\n const child = table.node.defaultChild;\n if (\n !(child instanceof dynamodb.CfnTable) &&\n !(child instanceof dynamodb.CfnGlobalTable)\n ) {\n return;\n }\n\n const specification = cdk.Stack.of(this).resolve(\n child.streamSpecification,\n ) as unknown;\n if (\n !specification ||\n cdk.Token.isUnresolved(specification) ||\n typeof specification !== 'object' ||\n !('streamViewType' in specification)\n ) {\n return;\n }\n\n const streamViewType = specification.streamViewType;\n if (\n !cdk.Token.isUnresolved(streamViewType) &&\n streamViewType !== dynamodb.StreamViewType.NEW_AND_OLD_IMAGES\n ) {\n throw new Error(\n `Table ${definition.tableName} uses stream view ${streamViewType}; NEW_AND_OLD_IMAGES is required.`,\n );\n }\n }\n\n private validateTableName(binding: ReactiveTableBinding): void {\n const { definition, table } = binding;\n const child = table.node.defaultChild;\n const childTableName =\n child && typeof child === 'object' && 'tableName' in child\n ? (child as { tableName?: string }).tableName\n : undefined;\n const physicalTableName = !cdk.Token.isUnresolved(table.tableName)\n ? table.tableName\n : childTableName && !cdk.Token.isUnresolved(childTableName)\n ? childTableName\n : table.tableName;\n\n if (!physicalTableName || cdk.Token.isUnresolved(physicalTableName)) {\n throw new Error(\n `Table ${definition.tableName} has an unresolved physical table name. Set an explicit tableName equal to definition.tableName; separately bundled application code cannot coordinate CloudFormation-generated names.`,\n );\n }\n if (physicalTableName !== definition.tableName) {\n throw new Error(\n `Table binding name mismatch: definition.tableName is \"${definition.tableName}\" but the physical table name is \"${physicalTableName}\". Set an explicit matching tableName.`,\n );\n }\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../infra/src/handlers/lambda-handlers.ts","../../core/src/schema.ts","../../infra/src/tables.ts","../../infra/src/engine.ts"],"names":["z","Construct","cdk","dynamodb","cdk2","apigatewayv2","path","fs","nodejs","lambda","iam","apigatewayv2Integrations","logs","dynamodb2"],"mappings":"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","file":"infra.cjs","sourcesContent":["/**\n * Entry point code generator for the reactive Lambda handlers.\n *\n * No user code is imported - the handlers use only environment variables\n * and stored query metadata for all operations.\n */\n\n/**\n * Generate the entry point code for Lambda functions.\n * This is called by the CDK construct to create the bundled entry file.\n */\nexport function generateEntryPointCode(): string {\n return `// Auto-generated entry point for reactive Lambda handlers\n// No user code required - all configuration comes from environment variables\nimport { createLambdaHandlers } from 'dynamodb-reactive/server';\n\nconst handlers = createLambdaHandlers();\n\nexport const connectHandler = handlers.connectHandler;\nexport const disconnectHandler = handlers.disconnectHandler;\nexport const messageHandler = handlers.messageHandler;\nexport const streamHandler = handlers.streamHandler;\n`;\n}\n","import { z } from 'zod';\n\nimport type { FilterCondition } from './types.js';\n\nexport const FilterConditionSchema: z.ZodType<FilterCondition> = z.lazy(() => {\n const comparison = z\n .object({\n type: z.literal('comparison'),\n operator: z.enum(['eq', 'ne', 'gt', 'gte', 'lt', 'lte']),\n field: z.string().min(1),\n value: z.unknown(),\n })\n .strict();\n const queryFunction = z.union([\n z\n .object({\n type: z.literal('function'),\n operator: z.literal('between'),\n field: z.string().min(1),\n value: z.unknown(),\n value2: z.unknown(),\n })\n .strict(),\n z\n .object({\n type: z.literal('function'),\n operator: z.enum(['beginsWith', 'contains']),\n field: z.string().min(1),\n value: z.unknown(),\n })\n .strict(),\n ]);\n const logical = z\n .object({\n type: z.literal('logical'),\n operator: z.enum(['and', 'or', 'not']),\n conditions: z.array(FilterConditionSchema).min(1),\n })\n .strict()\n .superRefine((condition, context) => {\n if (condition.operator === 'not' && condition.conditions.length !== 1) {\n context.addIssue({\n code: 'custom',\n path: ['conditions'],\n message: 'not requires exactly one condition',\n });\n }\n });\n return z.union([comparison, queryFunction, logical]);\n});\n\nexport const QueryMetadataSchema = z\n .object({\n planVersion: z.literal(1),\n tableName: z.string().min(1),\n indexName: z.string().min(1).optional(),\n indexPkField: z.string().min(1).optional(),\n indexSkField: z.string().min(1).optional(),\n filterConditions: z.array(FilterConditionSchema),\n sortField: z.string().min(1).optional(),\n sortOrder: z.enum(['asc', 'desc']).optional(),\n limit: z.number().int().positive().optional(),\n })\n .strict()\n .superRefine((metadata, context) => {\n if (metadata.indexName && !metadata.indexPkField) {\n context.addIssue({\n code: 'custom',\n path: ['indexPkField'],\n message: 'Index metadata requires its partition key field',\n });\n }\n if (!metadata.indexName && (metadata.indexPkField || metadata.indexSkField)) {\n context.addIssue({\n code: 'custom',\n path: ['indexName'],\n message: 'Index key fields require an index name',\n });\n }\n if (Boolean(metadata.sortField) !== Boolean(metadata.sortOrder)) {\n context.addIssue({\n code: 'custom',\n path: ['sortOrder'],\n message: 'Sort field and order must be specified together',\n });\n }\n });\n\nconst DeliveryVersionSchema = z.object({\n generation: z.number().int().nonnegative(),\n fromVersion: z.number().int().nonnegative(),\n toVersion: z.number().int().positive(),\n messageId: z.string().min(1),\n});\n\nexport const PendingDeliverySchema = z.discriminatedUnion('type', [\n DeliveryVersionSchema.extend({\n type: z.literal('patch'),\n patches: z.array(\n z.object({\n op: z.enum(['add', 'remove', 'replace', 'move', 'copy', 'test']),\n path: z.string(),\n value: z.unknown().optional(),\n from: z.string().optional(),\n }),\n ),\n }),\n DeliveryVersionSchema.extend({\n type: z.literal('resync'),\n }).strict(),\n]);\n\n/**\n * System table schemas for the reactive engine\n */\nexport const SystemSchemas = {\n /**\n * ReactiveConnectionsV2 - Tracks active WebSocket connections\n */\n connections: z.object({\n connectionId: z.string(),\n status: z.enum(['open', 'closed']),\n context: z.record(z.string(), z.unknown()).optional(),\n authorizerContext: z.record(z.string(), z.unknown()).optional(),\n requestIdentity: z.record(z.string(), z.unknown()).optional(),\n connectedAt: z.number(),\n ttl: z.number(),\n }),\n\n /**\n * ReactiveDependenciesV2 - The inverted index for O(1) lookups\n */\n dependencies: z.object({\n pk: z.string(), // Versioned encoded dependency key\n sk: z.string(), // ConnectionID#SubscriptionID\n connectionId: z.string(),\n subscriptionId: z.string(),\n tableName: z.string(),\n fieldName: z.string(),\n fieldValue: z.string(),\n generation: z.number().int().nonnegative(),\n registrationId: z.string().min(1),\n ttl: z.number(),\n }),\n\n /**\n * ReactiveConnectionQueriesV2 - Stores subscription state for diffing\n */\n queries: z.object({\n pk: z.string(), // ConnectionID\n sk: z.string(), // SubscriptionID\n connectionId: z.string(),\n subscriptionId: z.string(),\n status: z.enum(['registering', 'active', 'cancelled', 'faulted']),\n generation: z.number().int().nonnegative(),\n registrationId: z.string().min(1),\n queryMetadata: QueryMetadataSchema,\n lastResult: z.array(z.unknown()),\n dependencies: z.array(z.string()),\n version: z.number().int().nonnegative(),\n pendingDelivery: PendingDeliverySchema.optional(),\n createdAt: z.number(),\n updatedAt: z.number(),\n ttl: z.number(),\n }),\n};\n\n/** Storage/protocol generation used by all reactive system tables. */\nexport const SYSTEM_TABLE_PROTOCOL_VERSION = 2 as const;\n\n/**\n * Versioned system table names. The V2 suffix intentionally prevents state\n * written by the incompatible 0.1.x dependency protocol from being reused.\n */\nexport const SystemTableNames = {\n connections: 'ReactiveConnectionsV2',\n dependencies: 'ReactiveDependenciesV2',\n queries: 'ReactiveConnectionQueriesV2',\n} as const;\n","import { SystemTableNames } from '@dynamodb-reactive/core';\nimport * as cdk from 'aws-cdk-lib';\nimport * as dynamodb from 'aws-cdk-lib/aws-dynamodb';\nimport { Construct } from 'constructs';\n\n/**\n * Provisioning mode for DynamoDB tables\n * - \"ON_DEMAND\": Pay-per-request billing (default)\n * - { readWrite: number }: Provisioned capacity with specified RCU/WCU\n */\nexport type ProvisioningMode = 'ON_DEMAND' | { readWrite: number };\n\n/**\n * Props for ReactiveSystemTables\n */\nexport interface ReactiveSystemTablesProps {\n /**\n * Nonempty, concrete prefix for the fixed physical table names.\n * Use the same value as the application's `tablePrefix`.\n */\n tablePrefix: string;\n\n /**\n * Provisioning mode for tables\n * @default \"ON_DEMAND\"\n */\n provisioningMode?: ProvisioningMode;\n\n /**\n * Policy applied when a system table is removed or replaced.\n * Set to RemovalPolicy.DESTROY only for disposable environments.\n * Retained tables have fixed names, so recreating a stack with the same\n * prefix requires importing or manually removing any retained tables first.\n * @default RemovalPolicy.RETAIN\n */\n removalPolicy?: cdk.RemovalPolicy;\n}\n\n/**\n * Creates the three system tables for the reactive engine\n */\nexport class ReactiveSystemTables extends Construct {\n /**\n * ReactiveConnections table - tracks WebSocket connections\n */\n public readonly connectionsTable: dynamodb.Table;\n\n /**\n * ReactiveDependencies table - the inverted index\n */\n public readonly dependenciesTable: dynamodb.Table;\n\n /**\n * ReactiveConnectionQueries table - stores subscription state\n */\n public readonly queriesTable: dynamodb.Table;\n\n constructor(\n scope: Construct,\n id: string,\n props: ReactiveSystemTablesProps,\n ) {\n super(scope, id);\n\n if (\n cdk.Token.isUnresolved(props.tablePrefix) ||\n !/^[A-Za-z0-9][A-Za-z0-9_-]*$/.test(props.tablePrefix) ||\n props.tablePrefix.length > 229\n ) {\n throw new Error(\n 'ReactiveSystemTables tablePrefix must be a nonempty concrete value of at most 229 letters, numbers, hyphens, or underscores, starting with a letter or number.',\n );\n }\n\n const tableName = (name: string): string =>\n `${props.tablePrefix}-${name}`;\n const provisioningMode = props.provisioningMode ?? 'ON_DEMAND';\n const removalPolicy = props.removalPolicy ?? cdk.RemovalPolicy.RETAIN;\n\n // Determine billing/capacity settings\n const isOnDemand = provisioningMode === 'ON_DEMAND';\n const capacityProps = isOnDemand\n ? { billingMode: dynamodb.BillingMode.PAY_PER_REQUEST }\n : {\n billingMode: dynamodb.BillingMode.PROVISIONED,\n readCapacity: provisioningMode.readWrite,\n writeCapacity: provisioningMode.readWrite,\n };\n\n // ReactiveConnections Table\n // Tracks active WebSocket connections and user context\n this.connectionsTable = new dynamodb.Table(this, 'ConnectionsTable', {\n tableName: tableName(SystemTableNames.connections),\n partitionKey: {\n name: 'connectionId',\n type: dynamodb.AttributeType.STRING,\n },\n ...capacityProps,\n removalPolicy,\n timeToLiveAttribute: 'ttl',\n });\n\n // ReactiveDependencies Table (The Inverted Index)\n // Maps Field#Value -> ConnectionID for O(1) lookups\n this.dependenciesTable = new dynamodb.Table(this, 'DependenciesTable', {\n tableName: tableName(SystemTableNames.dependencies),\n partitionKey: {\n name: 'pk', // Format: \"TableName#FieldName#FieldValue\"\n type: dynamodb.AttributeType.STRING,\n },\n sortKey: {\n name: 'sk', // Format: \"ConnectionID#SubscriptionID\"\n type: dynamodb.AttributeType.STRING,\n },\n ...capacityProps,\n removalPolicy,\n timeToLiveAttribute: 'ttl',\n });\n\n // Add GSI for querying by connectionId (for cleanup)\n // For provisioned mode, GSI needs its own capacity\n const gsiProps = isOnDemand\n ? {}\n : {\n readCapacity: provisioningMode.readWrite,\n writeCapacity: provisioningMode.readWrite,\n };\n\n this.dependenciesTable.addGlobalSecondaryIndex({\n indexName: 'byConnectionId',\n partitionKey: {\n name: 'connectionId',\n type: dynamodb.AttributeType.STRING,\n },\n projectionType: dynamodb.ProjectionType.KEYS_ONLY,\n ...gsiProps,\n });\n\n // ReactiveConnectionQueries Table\n // Stores subscription state for diffing\n this.queriesTable = new dynamodb.Table(this, 'QueriesTable', {\n tableName: tableName(SystemTableNames.queries),\n partitionKey: {\n name: 'pk', // ConnectionID\n type: dynamodb.AttributeType.STRING,\n },\n sortKey: {\n name: 'sk', // SubscriptionID\n type: dynamodb.AttributeType.STRING,\n },\n ...capacityProps,\n removalPolicy,\n timeToLiveAttribute: 'ttl',\n });\n }\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\n\nimport type { AnyDynamoTable } from '@dynamodb-reactive/core';\nimport * as cdk from 'aws-cdk-lib';\nimport * as apigatewayv2 from 'aws-cdk-lib/aws-apigatewayv2';\nimport * as apigatewayv2Integrations from 'aws-cdk-lib/aws-apigatewayv2-integrations';\nimport * as dynamodb from 'aws-cdk-lib/aws-dynamodb';\nimport * as iam from 'aws-cdk-lib/aws-iam';\nimport * as lambda from 'aws-cdk-lib/aws-lambda';\nimport * as nodejs from 'aws-cdk-lib/aws-lambda-nodejs';\nimport * as logs from 'aws-cdk-lib/aws-logs';\nimport { Construct } from 'constructs';\n\nimport { generateEntryPointCode } from './handlers/lambda-handlers.js';\nimport {\n ReactiveSystemTables,\n type ReactiveSystemTablesProps,\n} from './tables.js';\n\nconst PARTIQL_ACTIONS = [\n 'dynamodb:PartiQLInsert',\n 'dynamodb:PartiQLUpdate',\n 'dynamodb:PartiQLDelete',\n];\nconst DEFAULT_STREAM_BATCH_SIZE = 100;\nconst MAX_STREAM_BATCH_SIZE = 1_000;\n\n/** Resource limits that can be tuned for the DynamoDB stream processor. */\nexport type ReactiveStreamHandlerProps = Pick<\n nodejs.NodejsFunctionProps,\n 'memorySize' | 'timeout'\n>;\n\n/** Associates an application table definition with its deployed CDK table. */\nexport interface ReactiveTableBinding {\n readonly definition: AnyDynamoTable;\n\n /**\n * Deployed table with DynamoDB Streams configured for NEW_AND_OLD_IMAGES.\n * Imported ITable resources must supply tableStreamArn; CDK cannot expose\n * their stream view type, so callers remain responsible for that setting.\n */\n readonly table: dynamodb.ITable;\n}\n\n/** Props for ReactiveEngine construct. */\nexport interface ReactiveEngineProps {\n /** User-defined tables and their deployed CDK resources. */\n tables: readonly ReactiveTableBinding[];\n\n /**\n * Authorizer applied to the WebSocket $connect route.\n * WebSocketIamAuthorizer is supported; its requestContext.identity is\n * persisted with the connection. Lambda authorizer context is also persisted.\n * Authorizers whose bind result uses NONE authorization are rejected.\n */\n connectAuthorizer?: apigatewayv2.IWebSocketRouteAuthorizer;\n\n /**\n * Explicitly permit unauthenticated WebSocket connections.\n * Cannot be combined with connectAuthorizer.\n * @default false\n */\n allowUnauthenticatedConnections?: boolean;\n\n /**\n * Nonempty, concrete prefix for physical resource names. Pass this same value\n * as the server application's `tablePrefix`.\n */\n resourcePrefix: string;\n\n /** System tables configuration. */\n systemTablesProps?: Omit<ReactiveSystemTablesProps, 'tablePrefix'>;\n\n /** Environment variables for Lambda functions. */\n environment?: Record<string, string>;\n\n /** Memory and timeout overrides for the DynamoDB stream processor. */\n streamHandlerProps?: ReactiveStreamHandlerProps;\n\n /** Number of DynamoDB stream records delivered in one invocation. @default 100 */\n streamBatchSize?: number;\n}\n\n/** Main CDK construct for the reactive DynamoDB system. */\nexport class ReactiveEngine extends Construct {\n public readonly tables: readonly ReactiveTableBinding[];\n public readonly systemTables: ReactiveSystemTables;\n public readonly webSocketApi: apigatewayv2.WebSocketApi;\n public readonly webSocketStage: apigatewayv2.WebSocketStage;\n public readonly connectHandler: lambda.Function;\n public readonly disconnectHandler: lambda.Function;\n public readonly messageHandler: lambda.Function;\n public readonly streamHandler: lambda.Function;\n public readonly webSocketUrl: string;\n public readonly callbackUrl: string;\n\n constructor(scope: Construct, id: string, props: ReactiveEngineProps) {\n super(scope, id);\n\n if (\n cdk.Token.isUnresolved(props.resourcePrefix) ||\n !/^[A-Za-z0-9][A-Za-z0-9_-]*$/.test(props.resourcePrefix) ||\n props.resourcePrefix.length > 45\n ) {\n throw new Error(\n 'ReactiveEngine resourcePrefix must be a nonempty concrete value of at most 45 letters, numbers, hyphens, or underscores, starting with a letter or number.',\n );\n }\n\n if (props.connectAuthorizer && props.allowUnauthenticatedConnections) {\n throw new Error(\n 'Specify either connectAuthorizer or allowUnauthenticatedConnections, not both.',\n );\n }\n if (\n props.connectAuthorizer instanceof apigatewayv2.WebSocketNoneAuthorizer\n ) {\n throw new Error(\n 'WebSocketNoneAuthorizer does not authenticate connections. Set allowUnauthenticatedConnections to true instead.',\n );\n }\n if (!props.connectAuthorizer && !props.allowUnauthenticatedConnections) {\n throw new Error(\n 'WebSocket authentication is required. Provide connectAuthorizer or explicitly set allowUnauthenticatedConnections to true.',\n );\n }\n if (\n props.streamBatchSize !== undefined &&\n (!Number.isInteger(props.streamBatchSize) ||\n props.streamBatchSize < 1 ||\n props.streamBatchSize > MAX_STREAM_BATCH_SIZE)\n ) {\n throw new Error(\n `ReactiveEngine streamBatchSize must be an integer from 1 to ${MAX_STREAM_BATCH_SIZE}.`,\n );\n }\n\n for (const binding of props.tables) {\n this.validateTableName(binding);\n this.validateStream(binding);\n }\n this.tables = [...props.tables];\n\n const resourceName = (name: string): string =>\n `${props.resourcePrefix}-${name}`;\n const memorySize = 128;\n const timeout = cdk.Duration.seconds(30);\n\n this.systemTables = new ReactiveSystemTables(this, 'SystemTables', {\n ...props.systemTablesProps,\n tablePrefix: props.resourcePrefix,\n });\n\n this.webSocketApi = new apigatewayv2.WebSocketApi(this, 'WebSocketApi', {\n apiName: resourceName('ReactiveWebSocket'),\n });\n\n this.webSocketStage = new apigatewayv2.WebSocketStage(\n this,\n 'WebSocketStage',\n {\n webSocketApi: this.webSocketApi,\n stageName: 'prod',\n autoDeploy: true,\n },\n );\n\n this.webSocketUrl = this.webSocketStage.url;\n this.callbackUrl = this.webSocketStage.callbackUrl;\n\n // Every engine uses the same generated source, so its path and asset are stable.\n const cdkOutDir = path.join(process.cwd(), 'cdk.out', '.generated');\n fs.mkdirSync(cdkOutDir, { recursive: true });\n const entryPointPath = path.join(cdkOutDir, 'reactive-entry.ts');\n fs.writeFileSync(entryPointPath, generateEntryPointCode());\n\n const environment: Record<string, string> = {\n ...props.environment,\n CONNECTIONS_TABLE: this.systemTables.connectionsTable.tableName,\n DEPENDENCIES_TABLE: this.systemTables.dependenciesTable.tableName,\n QUERIES_TABLE: this.systemTables.queriesTable.tableName,\n WEBSOCKET_ENDPOINT: this.callbackUrl,\n LOG_LEVEL: props.environment?.LOG_LEVEL ?? 'INFO',\n };\n const bundling: nodejs.BundlingOptions = {\n format: nodejs.OutputFormat.CJS,\n minify: true,\n sourceMap: false,\n target: 'node24',\n };\n\n this.connectHandler = new nodejs.NodejsFunction(this, 'ConnectHandler', {\n functionName: resourceName('ReactiveConnect'),\n runtime: lambda.Runtime.NODEJS_24_X,\n handler: 'connectHandler',\n entry: entryPointPath,\n bundling,\n environment,\n memorySize,\n timeout,\n logGroup: this.createLogGroup('ConnectLogGroup'),\n });\n\n this.disconnectHandler = new nodejs.NodejsFunction(\n this,\n 'DisconnectHandler',\n {\n functionName: resourceName('ReactiveDisconnect'),\n runtime: lambda.Runtime.NODEJS_24_X,\n handler: 'disconnectHandler',\n entry: entryPointPath,\n bundling,\n environment,\n memorySize,\n timeout,\n logGroup: this.createLogGroup('DisconnectLogGroup'),\n },\n );\n\n this.messageHandler = new nodejs.NodejsFunction(this, 'MessageHandler', {\n functionName: resourceName('ReactiveMessage'),\n runtime: lambda.Runtime.NODEJS_24_X,\n handler: 'messageHandler',\n entry: entryPointPath,\n bundling,\n environment,\n memorySize,\n timeout,\n logGroup: this.createLogGroup('MessageLogGroup'),\n });\n\n this.streamHandler = new nodejs.NodejsFunction(this, 'StreamHandler', {\n functionName: resourceName('ReactiveStream'),\n runtime: lambda.Runtime.NODEJS_24_X,\n handler: 'streamHandler',\n entry: entryPointPath,\n bundling,\n environment: {\n ...environment,\n USER_TABLES: props.tables\n .map(({ definition }) => definition.tableName)\n .join(','),\n },\n memorySize: props.streamHandlerProps?.memorySize ?? memorySize,\n timeout: props.streamHandlerProps?.timeout ?? timeout,\n logGroup: this.createLogGroup('StreamLogGroup'),\n });\n\n iam.Grant.addToPrincipal({\n grantee: this.connectHandler,\n actions: ['dynamodb:PutItem'],\n resourceArns: [this.systemTables.connectionsTable.tableArn],\n });\n iam.Grant.addToPrincipal({\n grantee: this.disconnectHandler,\n actions: ['dynamodb:UpdateItem'],\n resourceArns: [this.systemTables.connectionsTable.tableArn],\n });\n iam.Grant.addToPrincipal({\n grantee: this.disconnectHandler,\n actions: ['dynamodb:Query', 'dynamodb:UpdateItem'],\n resourceArns: [this.systemTables.queriesTable.tableArn],\n });\n iam.Grant.addToPrincipal({\n grantee: this.disconnectHandler,\n actions: ['dynamodb:DeleteItem'],\n resourceArns: [this.systemTables.dependenciesTable.tableArn],\n });\n iam.Grant.addToPrincipal({\n grantee: this.messageHandler,\n actions: ['dynamodb:UpdateItem'],\n resourceArns: [this.systemTables.connectionsTable.tableArn],\n });\n iam.Grant.addToPrincipal({\n grantee: this.streamHandler,\n actions: ['dynamodb:UpdateItem'],\n resourceArns: [this.systemTables.connectionsTable.tableArn],\n });\n iam.Grant.addToPrincipal({\n grantee: this.streamHandler,\n actions: ['dynamodb:Query', 'dynamodb:DeleteItem'],\n resourceArns: [this.systemTables.dependenciesTable.tableArn],\n });\n iam.Grant.addToPrincipal({\n grantee: this.streamHandler,\n actions: [\n 'dynamodb:GetItem',\n 'dynamodb:Query',\n 'dynamodb:UpdateItem',\n ],\n resourceArns: [this.systemTables.queriesTable.tableArn],\n });\n\n const managementPolicy = new iam.PolicyStatement({\n actions: ['execute-api:ManageConnections'],\n resources: [\n cdk.Stack.of(this).formatArn({\n service: 'execute-api',\n resource: this.webSocketApi.apiId,\n resourceName: `${this.webSocketStage.stageName}/POST/@connections/*`,\n arnFormat: cdk.ArnFormat.SLASH_RESOURCE_NAME,\n }),\n ],\n });\n this.messageHandler.addToRolePolicy(managementPolicy);\n this.streamHandler.addToRolePolicy(managementPolicy);\n\n const connectAuthorizer = props.connectAuthorizer\n ? {\n bind: (\n options: apigatewayv2.WebSocketRouteAuthorizerBindOptions,\n ): apigatewayv2.WebSocketRouteAuthorizerConfig => {\n const config = props.connectAuthorizer!.bind(options);\n if (config.authorizationType === 'NONE') {\n throw new Error(\n 'The connectAuthorizer bind result uses NONE authorization. Set allowUnauthenticatedConnections to true instead.',\n );\n }\n return config;\n },\n }\n : undefined;\n\n this.webSocketApi.addRoute('$connect', {\n authorizer: connectAuthorizer,\n integration: new apigatewayv2Integrations.WebSocketLambdaIntegration(\n 'ConnectIntegration',\n this.connectHandler,\n ),\n });\n this.webSocketApi.addRoute('$disconnect', {\n integration: new apigatewayv2Integrations.WebSocketLambdaIntegration(\n 'DisconnectIntegration',\n this.disconnectHandler,\n ),\n });\n this.webSocketApi.addRoute('$default', {\n integration: new apigatewayv2Integrations.WebSocketLambdaIntegration(\n 'DefaultIntegration',\n this.messageHandler,\n ),\n });\n\n for (const [index, binding] of props.tables.entries()) {\n this.setupStreamProcessing(\n binding,\n index,\n props.streamBatchSize ?? DEFAULT_STREAM_BATCH_SIZE,\n );\n }\n\n new cdk.CfnOutput(this, 'WebSocketUrl', {\n value: this.webSocketUrl,\n description: 'WebSocket URL for reactive connections',\n });\n }\n\n /** Grant an external application handler access to reactive and user data. */\n public grantApplicationAccess(grantee: iam.IGrantable): void {\n this.systemTables.connectionsTable.grantReadWriteData(grantee);\n this.systemTables.dependenciesTable.grantReadWriteData(grantee);\n this.systemTables.queriesTable.grantReadWriteData(grantee);\n iam.Grant.addToPrincipal({\n grantee,\n actions: ['dynamodb:TransactWriteItems'],\n resourceArns: [\n this.systemTables.connectionsTable.tableArn,\n this.systemTables.dependenciesTable.tableArn,\n this.systemTables.queriesTable.tableArn,\n ],\n });\n\n for (const { table } of this.tables) {\n table.grantReadWriteData(grantee);\n iam.Grant.addToPrincipal({\n grantee,\n actions: ['dynamodb:PartiQLSelect'],\n resourceArns: [table.tableArn, `${table.tableArn}/index/*`],\n });\n iam.Grant.addToPrincipal({\n grantee,\n actions: PARTIQL_ACTIONS,\n resourceArns: [table.tableArn],\n });\n }\n }\n\n private setupStreamProcessing(\n binding: ReactiveTableBinding,\n index: number,\n batchSize: number,\n ): void {\n const { table } = binding;\n table.grantStreamRead(this.streamHandler);\n iam.Grant.addToPrincipal({\n grantee: this.streamHandler,\n actions: ['dynamodb:PartiQLSelect'],\n resourceArns: [table.tableArn, `${table.tableArn}/index/*`],\n });\n\n new lambda.EventSourceMapping(this, `UserTableStream${index}`, {\n target: this.streamHandler,\n eventSourceArn: table.tableStreamArn!,\n startingPosition: lambda.StartingPosition.TRIM_HORIZON,\n batchSize,\n maxBatchingWindow: cdk.Duration.seconds(5),\n bisectBatchOnError: true,\n reportBatchItemFailures: true,\n });\n }\n\n private createLogGroup(id: string): logs.LogGroup {\n return new logs.LogGroup(this, id, {\n retention: logs.RetentionDays.ONE_DAY,\n removalPolicy: cdk.RemovalPolicy.DESTROY,\n });\n }\n\n private validateStream(binding: ReactiveTableBinding): void {\n const { definition, table } = binding;\n if (!table.tableStreamArn) {\n throw new Error(\n `Table ${definition.tableName} does not have DynamoDB Streams enabled. NEW_AND_OLD_IMAGES is required.`,\n );\n }\n\n const child = table.node.defaultChild;\n if (\n !(child instanceof dynamodb.CfnTable) &&\n !(child instanceof dynamodb.CfnGlobalTable)\n ) {\n return;\n }\n\n const specification = cdk.Stack.of(this).resolve(\n child.streamSpecification,\n ) as unknown;\n if (\n !specification ||\n cdk.Token.isUnresolved(specification) ||\n typeof specification !== 'object' ||\n !('streamViewType' in specification)\n ) {\n return;\n }\n\n const streamViewType = specification.streamViewType;\n if (\n !cdk.Token.isUnresolved(streamViewType) &&\n streamViewType !== dynamodb.StreamViewType.NEW_AND_OLD_IMAGES\n ) {\n throw new Error(\n `Table ${definition.tableName} uses stream view ${streamViewType}; NEW_AND_OLD_IMAGES is required.`,\n );\n }\n }\n\n private validateTableName(binding: ReactiveTableBinding): void {\n const { definition, table } = binding;\n const child = table.node.defaultChild;\n const childTableName =\n child && typeof child === 'object' && 'tableName' in child\n ? (child as { tableName?: string }).tableName\n : undefined;\n const physicalTableName = !cdk.Token.isUnresolved(table.tableName)\n ? table.tableName\n : childTableName && !cdk.Token.isUnresolved(childTableName)\n ? childTableName\n : table.tableName;\n\n if (!physicalTableName || cdk.Token.isUnresolved(physicalTableName)) {\n throw new Error(\n `Table ${definition.tableName} has an unresolved physical table name. Set an explicit tableName equal to definition.tableName; separately bundled application code cannot coordinate CloudFormation-generated names.`,\n );\n }\n if (physicalTableName !== definition.tableName) {\n throw new Error(\n `Table binding name mismatch: definition.tableName is \"${definition.tableName}\" but the physical table name is \"${physicalTableName}\". Set an explicit matching tableName.`,\n );\n }\n }\n}\n"]}
|
package/dist/infra.d.cts
CHANGED
|
@@ -3,6 +3,7 @@ import * as apigatewayv2 from 'aws-cdk-lib/aws-apigatewayv2';
|
|
|
3
3
|
import * as dynamodb from 'aws-cdk-lib/aws-dynamodb';
|
|
4
4
|
import * as iam from 'aws-cdk-lib/aws-iam';
|
|
5
5
|
import * as lambda from 'aws-cdk-lib/aws-lambda';
|
|
6
|
+
import * as nodejs from 'aws-cdk-lib/aws-lambda-nodejs';
|
|
6
7
|
import { Construct } from 'constructs';
|
|
7
8
|
import * as cdk from 'aws-cdk-lib';
|
|
8
9
|
import 'zod';
|
|
@@ -57,6 +58,8 @@ declare class ReactiveSystemTables extends Construct {
|
|
|
57
58
|
constructor(scope: Construct, id: string, props: ReactiveSystemTablesProps);
|
|
58
59
|
}
|
|
59
60
|
|
|
61
|
+
/** Resource limits that can be tuned for the DynamoDB stream processor. */
|
|
62
|
+
type ReactiveStreamHandlerProps = Pick<nodejs.NodejsFunctionProps, 'memorySize' | 'timeout'>;
|
|
60
63
|
/** Associates an application table definition with its deployed CDK table. */
|
|
61
64
|
interface ReactiveTableBinding {
|
|
62
65
|
readonly definition: AnyDynamoTable;
|
|
@@ -93,6 +96,10 @@ interface ReactiveEngineProps {
|
|
|
93
96
|
systemTablesProps?: Omit<ReactiveSystemTablesProps, 'tablePrefix'>;
|
|
94
97
|
/** Environment variables for Lambda functions. */
|
|
95
98
|
environment?: Record<string, string>;
|
|
99
|
+
/** Memory and timeout overrides for the DynamoDB stream processor. */
|
|
100
|
+
streamHandlerProps?: ReactiveStreamHandlerProps;
|
|
101
|
+
/** Number of DynamoDB stream records delivered in one invocation. @default 100 */
|
|
102
|
+
streamBatchSize?: number;
|
|
96
103
|
}
|
|
97
104
|
/** Main CDK construct for the reactive DynamoDB system. */
|
|
98
105
|
declare class ReactiveEngine extends Construct {
|
|
@@ -116,4 +123,4 @@ declare class ReactiveEngine extends Construct {
|
|
|
116
123
|
}
|
|
117
124
|
|
|
118
125
|
export { ReactiveEngine };
|
|
119
|
-
export type { ReactiveEngineProps, ReactiveTableBinding };
|
|
126
|
+
export type { ReactiveEngineProps, ReactiveStreamHandlerProps, ReactiveTableBinding };
|
package/dist/infra.d.ts
CHANGED
|
@@ -3,6 +3,7 @@ import * as apigatewayv2 from 'aws-cdk-lib/aws-apigatewayv2';
|
|
|
3
3
|
import * as dynamodb from 'aws-cdk-lib/aws-dynamodb';
|
|
4
4
|
import * as iam from 'aws-cdk-lib/aws-iam';
|
|
5
5
|
import * as lambda from 'aws-cdk-lib/aws-lambda';
|
|
6
|
+
import * as nodejs from 'aws-cdk-lib/aws-lambda-nodejs';
|
|
6
7
|
import { Construct } from 'constructs';
|
|
7
8
|
import * as cdk from 'aws-cdk-lib';
|
|
8
9
|
import 'zod';
|
|
@@ -57,6 +58,8 @@ declare class ReactiveSystemTables extends Construct {
|
|
|
57
58
|
constructor(scope: Construct, id: string, props: ReactiveSystemTablesProps);
|
|
58
59
|
}
|
|
59
60
|
|
|
61
|
+
/** Resource limits that can be tuned for the DynamoDB stream processor. */
|
|
62
|
+
type ReactiveStreamHandlerProps = Pick<nodejs.NodejsFunctionProps, 'memorySize' | 'timeout'>;
|
|
60
63
|
/** Associates an application table definition with its deployed CDK table. */
|
|
61
64
|
interface ReactiveTableBinding {
|
|
62
65
|
readonly definition: AnyDynamoTable;
|
|
@@ -93,6 +96,10 @@ interface ReactiveEngineProps {
|
|
|
93
96
|
systemTablesProps?: Omit<ReactiveSystemTablesProps, 'tablePrefix'>;
|
|
94
97
|
/** Environment variables for Lambda functions. */
|
|
95
98
|
environment?: Record<string, string>;
|
|
99
|
+
/** Memory and timeout overrides for the DynamoDB stream processor. */
|
|
100
|
+
streamHandlerProps?: ReactiveStreamHandlerProps;
|
|
101
|
+
/** Number of DynamoDB stream records delivered in one invocation. @default 100 */
|
|
102
|
+
streamBatchSize?: number;
|
|
96
103
|
}
|
|
97
104
|
/** Main CDK construct for the reactive DynamoDB system. */
|
|
98
105
|
declare class ReactiveEngine extends Construct {
|
|
@@ -116,4 +123,4 @@ declare class ReactiveEngine extends Construct {
|
|
|
116
123
|
}
|
|
117
124
|
|
|
118
125
|
export { ReactiveEngine };
|
|
119
|
-
export type { ReactiveEngineProps, ReactiveTableBinding };
|
|
126
|
+
export type { ReactiveEngineProps, ReactiveStreamHandlerProps, ReactiveTableBinding };
|