dynamodb-reactive 0.2.2 → 0.2.3
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 +9 -16
- package/dist/{client-r_tnzwqi.d.ts → client-Zb67giI5.d.ts} +5 -0
- package/dist/client.cjs +38 -18
- package/dist/client.cjs.map +1 -1
- package/dist/client.d.cts +1 -1
- package/dist/client.d.ts +1 -1
- package/dist/client.js +38 -18
- package/dist/client.js.map +1 -1
- package/dist/infra.cjs +5 -16
- package/dist/infra.cjs.map +1 -1
- package/dist/infra.d.cts +1 -8
- package/dist/infra.d.ts +1 -8
- package/dist/infra.js +5 -16
- package/dist/infra.js.map +1 -1
- package/dist/react.cjs +38 -18
- package/dist/react.cjs.map +1 -1
- package/dist/react.js +38 -18
- package/dist/react.js.map +1 -1
- package/dist/server.cjs +35 -66
- package/dist/server.cjs.map +1 -1
- package/dist/server.js +35 -66
- package/dist/server.js.map +1 -1
- package/package.json +1 -1
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../server/src/errors.ts","../../server/src/procedure.ts","../../server/src/router.ts","../../server/src/reactive.ts","../../server/src/dependency-extractor.ts","../../server/src/query-builder.ts","../../core/src/schema.ts","../../server/src/query-metadata.ts","../../server/src/db-context.ts","../../server/src/log.ts","../../server/src/handlers/reactive-handler.ts","../../server/src/patcher.ts","../../server/src/handlers/stream-utils.ts","../../server/src/handlers/stream-handler.ts","../../server/src/handlers/lambda-handlers.ts"],"names":["error","nestedValue","DYNAMODB_PARTITION_KEY_MAX_BYTES","DynamoDBClient","DynamoDBDocumentClient","GetCommand","query","DeleteCommand","PutCommand","MAX_QUERY_ENTRY_BYTES","QueryCommand","UpdateCommand","unmarshall","ApiGatewayManagementApiClient","PostToConnectionCommand"],"mappings":"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","file":"server.js","sourcesContent":["/** An error whose status and message are safe to return to an API caller. */\nexport class SafeRequestError extends Error {\n readonly statusCode: number;\n\n constructor(message: string, statusCode: number) {\n super(message);\n this.name = 'SafeRequestError';\n this.statusCode = statusCode;\n }\n}\n\n/** Generic public error for malformed procedure input; Zod details stay private. */\nexport class InvalidInputError extends SafeRequestError {\n constructor() {\n super('Invalid input', 400);\n this.name = 'InvalidInputError';\n }\n}\n\nexport function isSafeRequestError(error: unknown): error is SafeRequestError {\n return error instanceof SafeRequestError;\n}\n","import type { z } from 'zod';\n\nimport type { DatabaseContext, ProcedureDefinition } from './types.js';\nimport { InvalidInputError } from './errors.js';\n\n/**\n * Procedure builder for creating type-safe procedures\n */\nexport class ProcedureBuilder<\n TContext,\n TInput extends z.ZodType = z.ZodUndefined,\n> {\n private inputSchema?: TInput;\n\n constructor(inputSchema?: TInput) {\n this.inputSchema = inputSchema;\n }\n\n /**\n * Define the input schema for the procedure\n */\n input<TNewInput extends z.ZodType>(\n schema: TNewInput,\n ): ProcedureBuilder<TContext, TNewInput> {\n return new ProcedureBuilder<TContext, TNewInput>(schema);\n }\n\n /**\n * Define a query procedure (read-only operation)\n */\n query<TOutput>(\n resolver: (opts: {\n ctx: TContext & { db: DatabaseContext };\n input: z.infer<TInput>;\n }) => Promise<TOutput> | TOutput,\n ): ProcedureDefinition<TContext, TInput, TOutput, 'query'> {\n return {\n type: 'query',\n inputSchema: this.inputSchema,\n resolver,\n };\n }\n\n /**\n * Define a mutation procedure (write operation)\n */\n mutation<TOutput>(\n resolver: (opts: {\n ctx: TContext & { db: DatabaseContext };\n input: z.infer<TInput>;\n }) => Promise<TOutput> | TOutput,\n ): ProcedureDefinition<TContext, TInput, TOutput, 'mutation'> {\n return {\n type: 'mutation',\n inputSchema: this.inputSchema,\n resolver,\n };\n }\n}\n\n/**\n * Check if a value is a procedure definition\n */\nexport function isProcedure(\n value: unknown,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- type guard requires `any` for variance compatibility\n): value is ProcedureDefinition<any, any, any, 'query' | 'mutation'> {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'type' in value &&\n 'resolver' in value &&\n (value.type === 'query' || value.type === 'mutation')\n );\n}\n\n/**\n * Execute a procedure with the given context and input\n */\nexport async function executeProcedure<\n TContext,\n TInput extends z.ZodType,\n TOutput,\n TType extends 'query' | 'mutation',\n>(\n procedure: ProcedureDefinition<TContext, TInput, TOutput, TType>,\n ctx: TContext & { db: DatabaseContext },\n rawInput: unknown,\n): Promise<TOutput> {\n // Validate input if schema is defined\n let input: z.infer<TInput>;\n if (procedure.inputSchema) {\n const parseResult = procedure.inputSchema.safeParse(rawInput);\n if (!parseResult.success) {\n throw new InvalidInputError();\n }\n input = parseResult.data;\n } else {\n input = rawInput as z.infer<TInput>;\n }\n\n // Execute the resolver\n return procedure.resolver({ ctx, input });\n}\n","import { executeProcedure, isProcedure } from './procedure.js';\nimport type {\n AnyProcedureDefinition,\n DatabaseContext,\n RouterDefinition,\n} from './types.js';\n\n/**\n * Router class for organizing procedures\n */\nexport class Router<TContext, TRouter extends RouterDefinition<TContext>> {\n public readonly definition: TRouter;\n\n constructor(definition: TRouter) {\n this.definition = definition;\n }\n\n /**\n * Get a procedure by its path (e.g., \"todos.list\")\n */\n getProcedure(path: string): AnyProcedureDefinition<TContext> | null {\n const parts = path.split('.');\n let current: unknown = this.definition;\n\n for (const part of parts) {\n if (typeof current !== 'object' || current === null) {\n return null;\n }\n current = (current as Record<string, unknown>)[part];\n }\n\n if (isProcedure(current)) {\n return current;\n }\n\n return null;\n }\n\n /**\n * Execute a procedure by its path\n */\n async execute(\n path: string,\n ctx: TContext & { db: DatabaseContext },\n input: unknown,\n ): Promise<unknown> {\n const procedure = this.getProcedure(path);\n if (!procedure) {\n throw new Error(`Procedure not found: ${path}`);\n }\n\n return executeProcedure(procedure, ctx, input);\n }\n\n}\n\n/**\n * Create a router from a definition\n */\nexport function createRouter<\n TContext,\n TRouter extends RouterDefinition<TContext>,\n>(definition: TRouter): Router<TContext, TRouter> {\n return new Router(definition);\n}\n","import type { z } from 'zod';\n\nimport { ProcedureBuilder } from './procedure.js';\nimport type { Router } from './router.js';\nimport { createRouter } from './router.js';\nimport type { RouterDefinition } from './types.js';\n\n/**\n * ReactiveBuilder - The main builder returned by initReactive\n */\nexport interface ReactiveBuilder<TContext> {\n /**\n * Create a new procedure builder\n */\n procedure: ProcedureBuilder<TContext>;\n\n /**\n * Create a router from procedure definitions\n */\n router<TRouter extends RouterDefinition<TContext>>(\n definition: TRouter,\n ): Router<TContext, TRouter>;\n}\n\n/**\n * Initialize the reactive system with a context type\n *\n * @example\n * ```ts\n * const t = initReactive<{ userId: string }>();\n *\n * export const appRouter = t.router({\n * todos: {\n * list: t.procedure\n * .input(z.object({ taskListId: z.string() }))\n * .query(({ ctx, input }) => {\n * return ctx.db\n * .query(TodoTable)\n * .filter((q) => q.eq(TodoTable.field.taskListId, input.taskListId))\n * .take(50);\n * }),\n * }\n * });\n * ```\n */\nexport function initReactive<\n TContext = Record<string, unknown>,\n>(): ReactiveBuilder<TContext> {\n return {\n procedure: new ProcedureBuilder<TContext>(),\n\n router<TRouter extends RouterDefinition<TContext>>(\n definition: TRouter,\n ): Router<TContext, TRouter> {\n return createRouter(definition);\n },\n };\n}\n\n/**\n * Type helper to infer the router type\n */\nexport type InferRouterType<T> =\n T extends Router<infer TContext, infer TRouter>\n ? { context: TContext; router: TRouter }\n : never;\n\n/**\n * Type helper to get procedure input type\n */\nexport type InferProcedureInput<T> = T extends { inputSchema: infer TSchema }\n ? TSchema extends z.ZodType\n ? z.infer<TSchema>\n : undefined\n : undefined;\n\n/**\n * Type helper to get procedure output type\n */\n\nexport type InferProcedureOutput<T> = T extends {\n resolver: (...args: any[]) => infer TOutput; // eslint-disable-line @typescript-eslint/no-explicit-any -- contravariance requires `any`\n}\n ? Awaited<TOutput>\n : unknown;\n","import type { QueryMetadata } from '@dynamodb-reactive/core';\nimport { createHash } from 'node:crypto';\n\nimport type {\n FilterCondition,\n QueryDependency,\n TrackedQueryOperation,\n} from './types.js';\n\n/** Prefixes through this length are indexed exactly; longer plans use wildcard invalidation. */\nexport const MAX_TRACKED_PREFIX_LENGTH = 64;\nconst TABLE_WILDCARD_FIELD = '*';\nconst DYNAMODB_PARTITION_KEY_MAX_BYTES = 2048;\nconst DEPENDENCY_KEY_VERSION = 'd1';\nconst HASHED_DEPENDENCY_KEY_VERSION = 'd1h';\nconst DEBUG_PREVIEW_BYTES = 96;\n\nfunction isPlainMap(value: object): value is Record<string, unknown> {\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\nfunction encodeStructuredValue(value: unknown, seen: Set<object>): string {\n if (value === null) return 'null';\n switch (typeof value) {\n case 'string':\n return `string:${JSON.stringify(value)}`;\n case 'number':\n return `number:${Object.is(value, -0) ? '-0' : String(value)}`;\n case 'boolean':\n return `boolean:${String(value)}`;\n case 'bigint':\n return `bigint:${String(value)}`;\n case 'undefined':\n return 'undefined';\n case 'symbol':\n return `symbol:${String(value.description)}`;\n case 'function':\n return `function:${String(value)}`;\n }\n\n if (ArrayBuffer.isView(value)) {\n return `binary:${Buffer.from(\n value.buffer,\n value.byteOffset,\n value.byteLength,\n ).toString('base64url')}`;\n }\n if (value instanceof ArrayBuffer) {\n return `binary:${Buffer.from(value).toString('base64url')}`;\n }\n if (value instanceof Date) {\n return `date:${\n Number.isNaN(value.getTime()) ? 'Invalid Date' : value.toISOString()\n }`;\n }\n\n if (seen.has(value)) return 'circular';\n seen.add(value);\n let encoded: string;\n if (Array.isArray(value)) {\n encoded = `array:${JSON.stringify(\n value.map((item) => encodeStructuredValue(item, seen)),\n )}`;\n } else if (value instanceof Set) {\n encoded = `set:${JSON.stringify(\n [...value].map((item) => encodeStructuredValue(item, seen)).sort(),\n )}`;\n } else if (isPlainMap(value)) {\n encoded = `map:${JSON.stringify(\n Object.keys(value)\n .sort()\n .map((key) => [key, encodeStructuredValue(value[key], seen)]),\n )}`;\n } else {\n encoded = `object:${Object.prototype.toString.call(value)}:${String(value)}`;\n }\n seen.delete(value);\n return encoded;\n}\n\nfunction encodeDependencyValue(value: unknown): string | null {\n if (value === null || value === undefined) return null;\n if (typeof value === 'string') return value;\n if (\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n typeof value === 'bigint'\n ) {\n return String(value);\n }\n if (typeof value === 'object' && isPlainMap(value)) return null;\n return encodeStructuredValue(value, new Set());\n}\n\nfunction wildcardDependency(tableName: string): QueryDependency {\n return { tableName, fieldName: TABLE_WILDCARD_FIELD, fieldValue: '*' };\n}\n\n/**\n * Extracts dependencies from a filter condition\n */\nfunction extractFromCondition(\n tableName: string,\n condition: FilterCondition,\n): { dependencies: QueryDependency[]; safe: boolean } {\n const dependencies: QueryDependency[] = [];\n\n switch (condition.type) {\n case 'comparison': {\n // Only extract equality conditions as dependencies\n // These are the ones we can efficiently track\n const fieldValue = encodeDependencyValue(condition.value);\n if (\n condition.operator === 'eq' &&\n typeof condition.field === 'string' &&\n fieldValue !== null\n ) {\n dependencies.push({\n tableName,\n fieldName: condition.field,\n fieldValue,\n });\n }\n return { dependencies, safe: dependencies.length === 1 };\n }\n\n case 'function': {\n // For begins_with, we can track the prefix as a dependency\n if (\n condition.operator === 'beginsWith' &&\n typeof condition.field === 'string' &&\n typeof condition.value === 'string' &&\n condition.value.length > 0 &&\n condition.value.length <= MAX_TRACKED_PREFIX_LENGTH\n ) {\n dependencies.push({\n tableName,\n fieldName: condition.field,\n fieldValue: `prefix:${String(condition.value)}`,\n });\n }\n return { dependencies, safe: dependencies.length === 1 };\n }\n\n case 'logical': {\n if (\n condition.operator === 'not' ||\n !condition.conditions ||\n condition.conditions.length === 0\n ) {\n return { dependencies, safe: false };\n }\n let safe = true;\n for (const subCondition of condition.conditions) {\n const extracted = extractFromCondition(\n tableName,\n subCondition,\n );\n dependencies.push(...extracted.dependencies);\n safe &&= extracted.safe;\n }\n return { dependencies, safe };\n }\n }\n\n return { dependencies, safe: false };\n}\n\n/**\n * Extract dependencies from a tracked query operation\n */\nexport function extractDependencies(\n operation: TrackedQueryOperation,\n): QueryDependency[] {\n const dependencies: QueryDependency[] = [];\n let safe = operation.filters.length > 0;\n\n for (const filter of operation.filters) {\n const extracted = extractFromCondition(operation.tableName, filter);\n dependencies.push(...extracted.dependencies);\n safe &&= extracted.safe;\n }\n\n if (!safe) dependencies.push(wildcardDependency(operation.tableName));\n\n const unique = new Map<string, QueryDependency>();\n for (const dependency of dependencies) {\n unique.set(createDependencyKey(dependency), dependency);\n }\n return [...unique.values()];\n}\n\n/**\n * Create a dependency key for the inverted index\n * Components are encoded to avoid delimiter collisions. Oversized keys use a\n * deterministic digest while retaining bounded previews for diagnostics.\n */\nexport function createDependencyKey(dependency: QueryDependency): string {\n const components = [\n dependency.tableName,\n dependency.fieldName,\n dependency.fieldValue,\n ];\n const encoded = components.map((component) =>\n Buffer.from(component, 'utf8').toString('base64url'),\n );\n const key = `${DEPENDENCY_KEY_VERSION}#${encoded.join('#')}`;\n if (Buffer.byteLength(key, 'utf8') <= DYNAMODB_PARTITION_KEY_MAX_BYTES) {\n return key;\n }\n\n const digest = createHash('sha256').update(key, 'utf8').digest('hex');\n const previews = components.map((component) =>\n Buffer.from(utf8Preview(component), 'utf8').toString('base64url'),\n );\n return `${HASHED_DEPENDENCY_KEY_VERSION}#${digest}#${previews.join('#')}`;\n}\n\nfunction utf8Preview(value: string): string {\n if (Buffer.byteLength(value, 'utf8') <= DEBUG_PREVIEW_BYTES) return value;\n let preview = '';\n for (const character of value) {\n if (\n Buffer.byteLength(`${preview}${character}`, 'utf8') > DEBUG_PREVIEW_BYTES\n ) {\n break;\n }\n preview += character;\n }\n return `${preview}...`;\n}\n\n/**\n * Parse a dependency key back into its components\n */\nexport function parseDependencyKey(key: string): QueryDependency | null {\n const parts = key.split('#');\n const decode = (encoded: string): string | null => {\n const buffer = Buffer.from(encoded, 'base64url');\n return buffer.toString('base64url') === encoded\n ? buffer.toString('utf8')\n : null;\n };\n if (parts[0] === DEPENDENCY_KEY_VERSION && parts.length === 4) {\n const decoded = parts.slice(1).map(decode);\n if (decoded.some((component) => component === null)) return null;\n return {\n tableName: decoded[0]!,\n fieldName: decoded[1]!,\n fieldValue: decoded[2]!,\n };\n }\n if (\n parts[0] === HASHED_DEPENDENCY_KEY_VERSION &&\n parts.length === 5 &&\n /^[a-f0-9]{64}$/.test(parts[1])\n ) {\n const decoded = parts.slice(2).map(decode);\n if (decoded.some((component) => component === null)) return null;\n return {\n tableName: decoded[0]!,\n fieldName: decoded[1]!,\n fieldValue: `${decoded[2]} [sha256:${parts[1]}]`,\n };\n }\n return null;\n}\n\n/**\n * Extract affected dependency keys from a DynamoDB stream record\n * This finds all keys that might be affected by a change\n */\nexport function extractAffectedKeys(\n tableName: string,\n item: Record<string, unknown>,\n): string[] {\n const keys = new Set<string>([\n createDependencyKey(wildcardDependency(tableName)),\n ]);\n\n const visit = (fieldName: string, fieldValue: unknown): void => {\n if (fieldValue !== null && fieldValue !== undefined) {\n const encodedValue = encodeDependencyValue(fieldValue);\n if (encodedValue !== null) {\n keys.add(\n createDependencyKey({\n tableName,\n fieldName,\n fieldValue: encodedValue,\n }),\n );\n }\n\n // Add prefix keys for string values (for begins_with queries)\n // Match the same documented bound used while extracting query plans.\n if (typeof fieldValue === 'string') {\n const maxPrefixLen = Math.min(\n fieldValue.length,\n MAX_TRACKED_PREFIX_LENGTH,\n );\n for (let i = 1; i <= maxPrefixLen; i++) {\n keys.add(\n createDependencyKey({\n tableName,\n fieldName,\n fieldValue: `prefix:${fieldValue.substring(0, i)}`,\n }),\n );\n }\n }\n\n if (\n typeof fieldValue === 'object' &&\n isPlainMap(fieldValue)\n ) {\n for (const [nestedName, nestedValue] of Object.entries(fieldValue)) {\n visit(`${fieldName}.${nestedName}`, nestedValue);\n }\n }\n }\n };\n\n for (const [fieldName, fieldValue] of Object.entries(item)) {\n visit(fieldName, fieldValue);\n }\n\n return [...keys];\n}\n\n/**\n * Convert a TrackedQueryOperation to QueryMetadata for storage.\n */\nexport function operationToQueryMetadata(\n operation: TrackedQueryOperation,\n): QueryMetadata {\n return {\n planVersion: 1,\n tableName: operation.tableName,\n indexName: operation.indexName,\n indexPkField: operation.indexPkField,\n indexSkField: operation.indexSkField,\n filterConditions: operation.filters,\n ...(operation.sortField && operation.sortOrder\n ? { sortField: operation.sortField, sortOrder: operation.sortOrder }\n : {}),\n limit: operation.limit,\n };\n}\n\n/**\n * DependencyTracker - Tracks query operations during procedure execution\n */\nexport class DependencyTracker {\n private operations: {\n operation: TrackedQueryOperation;\n resultReference: unknown[];\n resultSnapshot: unknown[];\n }[] = [];\n\n /**\n * Track a query operation\n */\n track(operation: TrackedQueryOperation, result: unknown[]): void {\n this.operations.push({\n operation,\n resultReference: result,\n resultSnapshot: structuredClone(result),\n });\n }\n\n /**\n * Get all tracked operations\n */\n getOperations(): TrackedQueryOperation[] {\n return this.operations.map(({ operation }) => operation);\n }\n\n /**\n * Extract all dependencies from tracked operations\n */\n extractAll(): QueryDependency[] {\n const dependencies: QueryDependency[] = [];\n\n for (const { operation } of this.operations) {\n dependencies.push(...extractDependencies(operation));\n }\n\n return dependencies;\n }\n\n /**\n * Get query metadata for the first tracked operation.\n * Used for storing subscription state.\n */\n getQueryMetadata(): QueryMetadata | null {\n if (this.operations.length === 0) return null;\n return operationToQueryMetadata(this.operations[0].operation);\n }\n\n getCapturedResult(): {\n reference: unknown[];\n snapshot: unknown[];\n } | null {\n if (this.operations.length !== 1) return null;\n return {\n reference: this.operations[0].resultReference,\n snapshot: structuredClone(this.operations[0].resultSnapshot),\n };\n }\n\n}\n","import type { FieldRef } from '@dynamodb-reactive/core';\n\nimport type {\n AnyDynamoTable,\n FilterBuilder,\n FilterCondition,\n QueryBuilder,\n TableItem,\n TrackedQueryOperation,\n} from './types.js';\n\n/**\n * Implementation of FilterBuilder\n */\nclass FilterBuilderImpl<\n TTable extends AnyDynamoTable,\n> implements FilterBuilder<TTable> {\n eq<K extends keyof TableItem<TTable>>(\n field: FieldRef<K & string, TableItem<TTable>[K]>,\n value: TableItem<TTable>[K],\n ): FilterCondition {\n return { type: 'comparison', operator: 'eq', field: field.fieldName, value };\n }\n\n ne<K extends keyof TableItem<TTable>>(\n field: FieldRef<K & string, TableItem<TTable>[K]>,\n value: TableItem<TTable>[K],\n ): FilterCondition {\n return { type: 'comparison', operator: 'ne', field: field.fieldName, value };\n }\n\n gt<K extends keyof TableItem<TTable>>(\n field: FieldRef<K & string, TableItem<TTable>[K]>,\n value: TableItem<TTable>[K],\n ): FilterCondition {\n return { type: 'comparison', operator: 'gt', field: field.fieldName, value };\n }\n\n gte<K extends keyof TableItem<TTable>>(\n field: FieldRef<K & string, TableItem<TTable>[K]>,\n value: TableItem<TTable>[K],\n ): FilterCondition {\n return { type: 'comparison', operator: 'gte', field: field.fieldName, value };\n }\n\n lt<K extends keyof TableItem<TTable>>(\n field: FieldRef<K & string, TableItem<TTable>[K]>,\n value: TableItem<TTable>[K],\n ): FilterCondition {\n return { type: 'comparison', operator: 'lt', field: field.fieldName, value };\n }\n\n lte<K extends keyof TableItem<TTable>>(\n field: FieldRef<K & string, TableItem<TTable>[K]>,\n value: TableItem<TTable>[K],\n ): FilterCondition {\n return { type: 'comparison', operator: 'lte', field: field.fieldName, value };\n }\n\n between<K extends keyof TableItem<TTable>>(\n field: FieldRef<K & string, TableItem<TTable>[K]>,\n lower: TableItem<TTable>[K],\n upper: TableItem<TTable>[K],\n ): FilterCondition {\n return {\n type: 'function',\n operator: 'between',\n field: field.fieldName,\n value: lower,\n value2: upper,\n };\n }\n\n beginsWith<K extends keyof TableItem<TTable>>(\n field: FieldRef<K & string, string>,\n prefix: string,\n ): FilterCondition {\n return {\n type: 'function',\n operator: 'beginsWith',\n field: field.fieldName,\n value: prefix,\n };\n }\n\n contains<K extends keyof TableItem<TTable>>(\n field: FieldRef<K & string, string>,\n substring: string,\n ): FilterCondition {\n return {\n type: 'function',\n operator: 'contains',\n field: field.fieldName,\n value: substring,\n };\n }\n\n and(...conditions: FilterCondition[]): FilterCondition {\n return { type: 'logical', operator: 'and', conditions };\n }\n\n or(...conditions: FilterCondition[]): FilterCondition {\n return { type: 'logical', operator: 'or', conditions };\n }\n\n not(condition: FilterCondition): FilterCondition {\n return { type: 'logical', operator: 'not', conditions: [condition] };\n }\n}\n\n/**\n * Query execution function type\n */\ntype QueryExecutor<TTable extends AnyDynamoTable> = (\n operation: TrackedQueryOperation,\n) => Promise<TableItem<TTable>[]>;\n\n/**\n * Implementation of QueryBuilder\n */\nexport class QueryBuilderImpl<\n TTable extends AnyDynamoTable,\n> implements QueryBuilder<TTable> {\n private table: TTable;\n private filters: FilterCondition[] = [];\n private indexName?: keyof TTable['indexes'] & string;\n private limit?: number;\n private ascending: boolean = true;\n private sortRequested = false;\n private executor: QueryExecutor<TTable>;\n private operationTracker?: (\n op: TrackedQueryOperation,\n result: TableItem<TTable>[],\n ) => void;\n\n constructor(\n table: TTable,\n executor: QueryExecutor<TTable>,\n operationTracker?: (\n op: TrackedQueryOperation,\n result: TableItem<TTable>[],\n ) => void,\n ) {\n this.table = table;\n this.executor = executor;\n this.operationTracker = operationTracker;\n }\n\n filter(\n fn: (q: FilterBuilder<TTable>) => FilterCondition,\n ): QueryBuilder<TTable> {\n const builder = new FilterBuilderImpl<TTable>();\n const condition = fn(builder);\n this.filters.push(condition);\n return this;\n }\n\n useIndex(\n indexName: keyof TTable['indexes'] & string,\n ): QueryBuilder<TTable> {\n if (!this.table.indexes[indexName]) {\n throw new Error(`Unknown index: ${indexName}`);\n }\n this.indexName = indexName;\n return this;\n }\n\n take(limit: number): QueryBuilder<TTable> {\n if (!Number.isInteger(limit) || limit <= 0) {\n throw new Error('take(limit) requires a positive integer');\n }\n this.limit = limit;\n return this;\n }\n\n sortAscending(): QueryBuilder<TTable> {\n this.ascending = true;\n this.sortRequested = true;\n return this;\n }\n\n sortDescending(): QueryBuilder<TTable> {\n this.ascending = false;\n this.sortRequested = true;\n return this;\n }\n\n async execute(): Promise<TableItem<TTable>[]> {\n const operation = this.getOperation();\n\n const result = await this.executor(operation);\n this.operationTracker?.(operation, result);\n return result;\n }\n\n /**\n * Get the current operation without executing\n * Used for dependency extraction\n */\n getOperation(): TrackedQueryOperation {\n const index = this.indexName\n ? this.table.indexes[this.indexName]\n : undefined;\n const selectedSortField = index ? index.sk : this.table.sk;\n const sortField = this.sortRequested ? selectedSortField : undefined;\n if (this.sortRequested && !sortField) {\n throw new Error('Sorting requires a table or index sort key');\n }\n return {\n tableName: this.table.tableName,\n filters: this.filters,\n indexName: index?.name,\n indexPkField: index?.pk,\n indexSkField: index?.sk,\n ...(sortField\n ? { sortField, sortOrder: this.ascending ? ('asc' as const) : ('desc' as const) }\n : {}),\n limit: this.limit,\n };\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 {\n type AttributeValue,\n type DynamoDBClient,\n ExecuteStatementCommand,\n type ExecuteStatementCommandInput,\n} from '@aws-sdk/client-dynamodb';\nimport {\n type FilterCondition,\n type QueryMetadata,\n QueryMetadataSchema,\n} from '@dynamodb-reactive/core';\nimport { unmarshall } from '@aws-sdk/util-dynamodb';\n\nexport class InvalidQueryMetadataError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'InvalidQueryMetadataError';\n }\n}\n\nfunction attributeValue(value: unknown): AttributeValue {\n if (value === null) return { NULL: true };\n if (value === undefined) {\n throw new InvalidQueryMetadataError('Query parameter values are required');\n }\n if (typeof value === 'string') return { S: value };\n if (typeof value === 'number') {\n if (!Number.isFinite(value)) {\n throw new InvalidQueryMetadataError('Query values must be finite numbers');\n }\n return { N: String(value) };\n }\n if (typeof value === 'boolean') return { BOOL: value };\n if (value instanceof Uint8Array) return { B: value };\n if (value instanceof Set) {\n const values = [...value];\n if (values.length === 0) {\n throw new InvalidQueryMetadataError('Query sets must not be empty');\n }\n if (values.every((item): item is string => typeof item === 'string')) {\n return { SS: values };\n }\n if (values.every((item): item is number => typeof item === 'number')) {\n if (values.some((item) => !Number.isFinite(item))) {\n throw new InvalidQueryMetadataError('Query values must be finite numbers');\n }\n return { NS: values.map(String) };\n }\n if (values.every((item): item is Uint8Array => item instanceof Uint8Array)) {\n return { BS: values };\n }\n throw new InvalidQueryMetadataError(\n 'Query sets must contain one supported DynamoDB scalar type',\n );\n }\n if (Array.isArray(value)) return { L: value.map(attributeValue) };\n if (typeof value === 'object') {\n return {\n M: Object.fromEntries(\n Object.entries(value as Record<string, unknown>).map(([key, item]) => [\n key,\n attributeValue(item),\n ]),\n ),\n };\n }\n throw new InvalidQueryMetadataError(\n `Unsupported query value type: ${typeof value}`,\n );\n}\n\nfunction quoteIdentifier(identifier: string): string {\n if (!identifier) {\n throw new InvalidQueryMetadataError('Identifier must not be empty');\n }\n return `\"${identifier.replace(/\"/g, '\"\"')}\"`;\n}\n\nfunction quotePath(path: string): string {\n if (!path || path.split('.').some((part) => !part)) {\n throw new InvalidQueryMetadataError(`Invalid field path: ${path}`);\n }\n return path\n .split('.')\n .map(quoteIdentifier)\n .join('.');\n}\n\nfunction compileCondition(\n condition: FilterCondition,\n parameters: AttributeValue[],\n): string {\n if (condition.type === 'comparison' && condition.field) {\n const operators: Record<string, string> = {\n eq: '=',\n ne: '<>',\n gt: '>',\n gte: '>=',\n lt: '<',\n lte: '<=',\n };\n const operator = operators[condition.operator];\n if (!operator) {\n throw new InvalidQueryMetadataError(\n `Unsupported comparison operator: ${condition.operator}`,\n );\n }\n parameters.push(attributeValue(condition.value));\n return `${quotePath(condition.field)} ${operator} ?`;\n }\n\n if (condition.type === 'function' && condition.field) {\n if (condition.operator === 'between') {\n parameters.push(attributeValue(condition.value));\n parameters.push(attributeValue(condition.value2));\n return `${quotePath(condition.field)} BETWEEN ? AND ?`;\n }\n if (condition.operator === 'beginsWith' || condition.operator === 'contains') {\n parameters.push(attributeValue(condition.value));\n const name = condition.operator === 'beginsWith' ? 'begins_with' : 'contains';\n return `${name}(${quotePath(condition.field)}, ?)`;\n }\n throw new InvalidQueryMetadataError(\n `Unsupported function operator: ${condition.operator}`,\n );\n }\n\n if (condition.type === 'logical' && condition.conditions?.length) {\n if (condition.operator === 'not') {\n if (condition.conditions.length !== 1) {\n throw new InvalidQueryMetadataError('NOT requires exactly one condition');\n }\n return `NOT (${compileCondition(condition.conditions[0], parameters)})`;\n }\n if (condition.operator === 'and' || condition.operator === 'or') {\n const operator = condition.operator.toUpperCase();\n return `(${condition.conditions\n .map((item) => compileCondition(item, parameters))\n .join(` ${operator} `)})`;\n }\n }\n\n throw new InvalidQueryMetadataError('Malformed query filter condition');\n}\n\nexport function parseQueryMetadata(metadata: unknown): QueryMetadata {\n const parsed = QueryMetadataSchema.safeParse(metadata);\n if (!parsed.success) {\n throw new InvalidQueryMetadataError(\n `Invalid query metadata: ${parsed.error.message}`,\n );\n }\n return parsed.data;\n}\n\nexport function compileQueryMetadata(\n metadataInput: unknown,\n nextToken?: string,\n): ExecuteStatementCommandInput {\n const metadata = parseQueryMetadata(metadataInput);\n const parameters: AttributeValue[] = [];\n let statement = `SELECT * FROM ${quoteIdentifier(metadata.tableName)}`;\n const predicates: string[] = [];\n if (metadata.indexPkField) {\n predicates.push(`${quotePath(metadata.indexPkField)} IS NOT MISSING`);\n }\n if (metadata.indexSkField) {\n predicates.push(`${quotePath(metadata.indexSkField)} IS NOT MISSING`);\n }\n if (metadata.filterConditions.length) {\n predicates.push(\n ...metadata.filterConditions.map((condition) =>\n compileCondition(condition, parameters),\n ),\n );\n }\n if (predicates.length) statement += ` WHERE ${predicates.join(' AND ')}`;\n\n return {\n Statement: statement,\n ConsistentRead: true,\n ...(parameters.length ? { Parameters: parameters } : {}),\n ...(nextToken ? { NextToken: nextToken } : {}),\n };\n}\n\nfunction nestedValue(item: Record<string, unknown>, path: string): unknown {\n return path.split('.').reduce<unknown>((value, part) => {\n if (!value || typeof value !== 'object') return undefined;\n return (value as Record<string, unknown>)[part];\n }, item);\n}\n\nfunction compareValues(left: unknown, right: unknown): number {\n if (left === right) return 0;\n if (typeof left === 'number' && typeof right === 'number') return left - right;\n if (typeof left === 'string' && typeof right === 'string') {\n return Buffer.compare(Buffer.from(left, 'utf8'), Buffer.from(right, 'utf8'));\n }\n if (left instanceof Uint8Array && right instanceof Uint8Array) {\n return Buffer.compare(Buffer.from(left), Buffer.from(right));\n }\n throw new InvalidQueryMetadataError(\n 'Sorted query fields must contain one consistent DynamoDB key type',\n );\n}\n\n/** Execute every page of the stored plan; failures are intentionally propagated. */\nexport async function executeQueryMetadata(\n client: Pick<DynamoDBClient, 'send'>,\n metadataInput: unknown,\n): Promise<Record<string, unknown>[]> {\n const metadata = parseQueryMetadata(metadataInput);\n const items: Record<string, unknown>[] = [];\n let nextToken: string | undefined;\n const seenTokens = new Set<string>();\n\n do {\n const response = await client.send(\n new ExecuteStatementCommand(compileQueryMetadata(metadata, nextToken)),\n );\n items.push(\n ...(response.Items ?? []).map((item) =>\n unmarshall(item as Record<string, AttributeValue>),\n ),\n );\n nextToken = response.NextToken;\n if (nextToken && seenTokens.has(nextToken)) {\n throw new Error('DynamoDB returned a repeated pagination token');\n }\n if (nextToken) seenTokens.add(nextToken);\n if (\n metadata.limit !== undefined &&\n !metadata.sortField &&\n items.length >= metadata.limit\n ) {\n break;\n }\n } while (nextToken);\n\n if (metadata.sortField) {\n items.sort((left, right) => {\n const result = compareValues(\n nestedValue(left, metadata.sortField!),\n nestedValue(right, metadata.sortField!),\n );\n return metadata.sortOrder === 'desc' ? -result : result;\n });\n }\n\n return metadata.limit === undefined ? items : items.slice(0, metadata.limit);\n}\n","import { DynamoDBClient } from '@aws-sdk/client-dynamodb';\nimport {\n DeleteCommand,\n DynamoDBDocumentClient,\n GetCommand,\n PutCommand,\n} from '@aws-sdk/lib-dynamodb';\nimport type { DependencyTracker } from './dependency-extractor.js';\nimport { operationToQueryMetadata } from './dependency-extractor.js';\nimport { QueryBuilderImpl } from './query-builder.js';\nimport { executeQueryMetadata } from './query-metadata.js';\nimport type {\n AnyDynamoTable,\n DatabaseContext,\n TableItem,\n TableKeyInput,\n TrackedQueryOperation,\n} from './types.js';\n\n/**\n * Configuration for creating a database context\n */\nexport interface DbContextConfig {\n client?: DynamoDBClient;\n docClient?: DynamoDBDocumentClient;\n region?: string;\n endpoint?: string;\n}\n\nconst MAX_CONDITION_EXPRESSION_BYTES = 4 * 1024;\nconst MAX_EXPRESSION_VARIABLE_BYTES = 2 * 1024 * 1024;\nconst MAX_CONDITION_OPERATORS = 300;\n\n/**\n * Create a DynamoDB Document client\n */\nfunction createClients(config: DbContextConfig): {\n client: DynamoDBClient;\n docClient: DynamoDBDocumentClient;\n} {\n const client = config.client ?? new DynamoDBClient({\n region: config.region ?? process.env.AWS_REGION ?? 'us-east-1',\n endpoint: config.endpoint,\n });\n\n const docClient = config.docClient ?? DynamoDBDocumentClient.from(client, {\n marshallOptions: {\n removeUndefinedValues: true,\n convertEmptyValues: false,\n },\n unmarshallOptions: {\n wrapNumbers: false,\n },\n });\n return { client, docClient };\n}\n\n/**\n * Creates a database context for procedure execution\n */\nexport function createDbContext(\n config: DbContextConfig,\n dependencyTracker?: DependencyTracker,\n): DatabaseContext {\n const { client, docClient } = createClients(config);\n\n /**\n * Execute a query operation\n */\n async function executeQuery<TTable extends AnyDynamoTable>(\n operation: TrackedQueryOperation,\n ): Promise<TableItem<TTable>[]> {\n return executeQueryMetadata(\n client,\n operationToQueryMetadata(operation),\n ) as Promise<TableItem<TTable>[]>;\n }\n\n return {\n query<TTable extends AnyDynamoTable>(table: TTable) {\n return new QueryBuilderImpl<TTable>(\n table,\n executeQuery,\n dependencyTracker?.track.bind(dependencyTracker),\n );\n },\n\n async get<TTable extends AnyDynamoTable>(\n table: TTable,\n key: TableKeyInput<TTable>,\n ): Promise<TableItem<TTable> | null> {\n const command = new GetCommand({\n TableName: table.tableName,\n Key: key as Record<string, unknown>,\n ConsistentRead: true,\n });\n\n const response = await docClient.send(command);\n return response.Item\n ? (response.Item as TableItem<TTable>)\n : null;\n },\n\n async put<TTable extends AnyDynamoTable>(\n table: TTable,\n item: TableItem<TTable>,\n ): Promise<void> {\n const parsedItem = table.validate(item);\n\n const command = new PutCommand({\n TableName: table.tableName,\n Item: parsedItem as Record<string, unknown>,\n });\n\n await docClient.send(command);\n },\n\n async delete<TTable extends AnyDynamoTable>(\n table: TTable,\n key: TableKeyInput<TTable>,\n ): Promise<void> {\n const command = new DeleteCommand({\n TableName: table.tableName,\n Key: key as Record<string, unknown>,\n });\n\n await docClient.send(command);\n },\n\n async update<TTable extends AnyDynamoTable>(\n table: TTable,\n key: TableKeyInput<TTable>,\n updates: Partial<TableItem<TTable>>,\n ): Promise<TableItem<TTable>> {\n const currentResponse = await docClient.send(\n new GetCommand({\n TableName: table.tableName,\n Key: key as Record<string, unknown>,\n ConsistentRead: true,\n }),\n );\n const current = currentResponse.Item as TableItem<TTable> | undefined;\n if (!current) throw new Error('Item not found');\n const parsed = table.validate({\n ...(current as Record<string, unknown>),\n ...(updates as Record<string, unknown>),\n ...(key as Record<string, unknown>),\n }) as Record<string, unknown>;\n\n const expected = current as Record<string, unknown>;\n const fields = [\n ...new Set([\n ...table.getFieldNames().map(String),\n ...Object.keys(expected),\n ]),\n ].sort();\n const conditions: string[] = [];\n const expressionAttributeNames: Record<string, string> = {};\n const expressionAttributeValues: Record<string, unknown> = {};\n\n for (const [i, field] of fields.entries()) {\n const nameKey = `#f${i}`;\n expressionAttributeNames[nameKey] = field;\n if (Object.prototype.hasOwnProperty.call(expected, field)) {\n const valueKey = `:e${i}`;\n conditions.push(`${nameKey} = ${valueKey}`);\n expressionAttributeValues[valueKey] = expected[field];\n } else {\n conditions.push(`attribute_not_exists(${nameKey})`);\n }\n }\n\n const conditionExpression = conditions.join(' AND ');\n const variableBytes = Buffer.byteLength(\n JSON.stringify({\n names: expressionAttributeNames,\n values: expressionAttributeValues,\n }),\n 'utf8',\n );\n if (\n Buffer.byteLength(conditionExpression, 'utf8') >\n MAX_CONDITION_EXPRESSION_BYTES ||\n conditions.length > MAX_CONDITION_OPERATORS ||\n variableBytes > MAX_EXPRESSION_VARIABLE_BYTES\n ) {\n throw new Error(\n 'Item is too complex to update with a safe compare-and-swap',\n );\n }\n\n const command = new PutCommand({\n TableName: table.tableName,\n Item: parsed,\n ConditionExpression: conditionExpression,\n ...(Object.keys(expressionAttributeNames).length\n ? { ExpressionAttributeNames: expressionAttributeNames }\n : {}),\n ...(Object.keys(expressionAttributeValues).length\n ? { ExpressionAttributeValues: expressionAttributeValues }\n : {}),\n });\n\n await docClient.send(command);\n return parsed as TableItem<TTable>;\n },\n };\n}\n","type LogMethod = (...values: unknown[]) => void;\n\nconst consoleLogger = globalThis.console;\nconst SAFE_ERROR_NAMES = new Set([\n 'ConditionalCheckFailedException',\n 'Error',\n 'GoneException',\n 'TransactionCanceledException',\n]);\n\nfunction sanitized(value: unknown): unknown {\n if (value instanceof Error) {\n return {\n errorName: SAFE_ERROR_NAMES.has(value.name) ? value.name : 'Error',\n };\n }\n if (value && typeof value === 'object') return { valueType: 'object' };\n return value;\n}\n\nfunction logger(method: 'debug' | 'info' | 'warn' | 'error'): LogMethod {\n return (...values) => consoleLogger[method](...values.map(sanitized));\n}\n\nexport const debug = logger('debug');\nexport const info = logger('info');\nexport const warn = logger('warn');\nexport const error = logger('error');\n","import { DynamoDBClient } from '@aws-sdk/client-dynamodb';\nimport {\n DeleteCommand,\n DynamoDBDocumentClient,\n GetCommand,\n PutCommand,\n QueryCommand,\n TransactWriteCommand,\n UpdateCommand,\n} from '@aws-sdk/lib-dynamodb';\nimport {\n type ConnectionEntry,\n type QueryEntry,\n SystemSchemas,\n SystemTableNames,\n} from '@dynamodb-reactive/core';\nimport { isDeepStrictEqual } from 'node:util';\n\nimport { createDbContext, type DbContextConfig } from '../db-context.js';\nimport {\n createDependencyKey,\n DependencyTracker,\n parseDependencyKey,\n} from '../dependency-extractor.js';\nimport { isSafeRequestError, SafeRequestError } from '../errors.js';\nimport { debug, error as logError } from '../log.js';\nimport { executeQueryMetadata } from '../query-metadata.js';\nimport type { Router } from '../router.js';\nimport type {\n DatabaseContext,\n RouterCaller,\n RouterDefinition,\n} from '../types.js';\n\nconst MAX_TRANSACTION_DEPENDENCIES = 90;\nconst MAX_QUERY_ENTRY_BYTES = 300 * 1024;\nconst DYNAMODB_PARTITION_KEY_MAX_BYTES = 2048;\nconst DYNAMODB_SORT_KEY_MAX_BYTES = 1024;\nconst MAX_TABLE_PREFIX_LENGTH = 227;\nexport const DEFAULT_CONNECTION_LEASE_SECONDS = 3 * 60 * 60;\n\nexport interface SubscribeRequest {\n type: 'subscribe';\n connectionId: string;\n subscriptionId: string;\n generation: number;\n registrationId: string;\n path: string;\n input: unknown;\n}\n\nexport interface UnsubscribeRequest {\n type: 'unsubscribe';\n connectionId: string;\n subscriptionId: string;\n generation: number;\n registrationId: string;\n}\n\nexport interface CallRequest {\n type: 'call';\n connectionId: string;\n path: string;\n input: unknown;\n}\n\nexport type ReactiveRequest = SubscribeRequest | UnsubscribeRequest | CallRequest;\n\nexport interface SnapshotResponse {\n type: 'snapshot';\n subscriptionId: string;\n generation: number;\n version: number;\n data: unknown[];\n}\n\nexport interface ResultResponse {\n type: 'result';\n data: unknown;\n}\n\nexport interface ErrorResponse {\n type: 'error';\n message: string;\n code?: number;\n subscriptionId?: string;\n}\n\nexport type ReactiveResponse =\n | SnapshotResponse\n | ResultResponse\n | ErrorResponse;\n\nexport interface RequestInfo {\n connectionId: string;\n headers?: Record<string, string>;\n}\n\nexport interface ConnectionAuthorization<TContext> {\n context: TContext;\n connection: ConnectionEntry;\n requestInfo: RequestInfo;\n}\n\nexport interface ReactiveHandlerConfig<\n TContext,\n TRouter extends RouterDefinition<TContext> = RouterDefinition<TContext>,\n> {\n router: Router<TContext, TRouter>;\n dbConfig?: DbContextConfig;\n getContext: (requestInfo: RequestInfo) => Promise<TContext>;\n authorizeConnection: (\n authorization: ConnectionAuthorization<TContext>,\n ) => boolean | Promise<boolean>;\n ttlSeconds?: number;\n tablePrefix: string;\n}\n\nfunction requestError(message: string, code: number): SafeRequestError {\n return new SafeRequestError(message, code);\n}\n\nfunction validateTablePrefix(tablePrefix: unknown): asserts tablePrefix is string {\n if (\n typeof tablePrefix !== 'string' ||\n !/^[A-Za-z0-9][A-Za-z0-9_-]*$/.test(tablePrefix) ||\n tablePrefix.length > MAX_TABLE_PREFIX_LENGTH\n ) {\n throw new Error(\n 'createReactiveHandler tablePrefix must be a nonempty concrete value of at most 227 letters, numbers, hyphens, or underscores, starting with a letter or number',\n );\n }\n}\n\nfunction validateKeyString(name: string, value: unknown, maxBytes: number): void {\n if (typeof value !== 'string' || value.length === 0) {\n throw requestError(`${name} must be a non-empty string`, 400);\n }\n if (Buffer.byteLength(value, 'utf8') > maxBytes) {\n throw requestError(`${name} exceeds DynamoDB's UTF-8 key length limit`, 400);\n }\n}\n\nfunction validateRequest(request: ReactiveRequest): void {\n validateKeyString(\n 'connectionId',\n request.connectionId,\n DYNAMODB_PARTITION_KEY_MAX_BYTES,\n );\n if (request.type === 'subscribe' || request.type === 'unsubscribe') {\n validateKeyString(\n 'subscriptionId',\n request.subscriptionId,\n DYNAMODB_SORT_KEY_MAX_BYTES,\n );\n validateKeyString(\n 'registrationId',\n request.registrationId,\n DYNAMODB_SORT_KEY_MAX_BYTES,\n );\n if (\n Buffer.byteLength(\n `${request.connectionId}#${request.subscriptionId}`,\n 'utf8',\n ) > DYNAMODB_SORT_KEY_MAX_BYTES\n ) {\n throw requestError(\n 'connectionId and subscriptionId exceed DynamoDB dependency key limits',\n 400,\n );\n }\n if (!Number.isInteger(request.generation) || request.generation < 0) {\n throw requestError('generation must be a non-negative integer', 400);\n }\n }\n}\n\nfunction assertEntrySize(entry: QueryEntry): void {\n if (Buffer.byteLength(JSON.stringify(entry), 'utf8') > MAX_QUERY_ENTRY_BYTES) {\n throw new Error('Subscription result is too large to store safely');\n }\n}\n\nexport function createReactiveHandler<\n TContext,\n TRouter extends RouterDefinition<TContext>,\n>(config: ReactiveHandlerConfig<TContext, TRouter>) {\n validateTablePrefix(config.tablePrefix);\n const ttlSeconds = config.ttlSeconds ?? DEFAULT_CONNECTION_LEASE_SECONDS;\n const prefix = `${config.tablePrefix}-`;\n const connectionsTable = `${prefix}${SystemTableNames.connections}`;\n const dependenciesTable = `${prefix}${SystemTableNames.dependencies}`;\n const queriesTable = `${prefix}${SystemTableNames.queries}`;\n const ddbClient =\n config.dbConfig?.client ??\n new DynamoDBClient({\n region: config.dbConfig?.region ?? process.env.AWS_REGION,\n endpoint: config.dbConfig?.endpoint,\n });\n const docClient =\n config.dbConfig?.docClient ??\n DynamoDBDocumentClient.from(ddbClient, {\n marshallOptions: { removeUndefinedValues: true },\n });\n const dbConfig: DbContextConfig = {\n ...config.dbConfig,\n client: ddbClient,\n docClient,\n };\n\n async function authorize(\n requestInfo: RequestInfo,\n context: TContext,\n ): Promise<ConnectionEntry> {\n const response = await docClient.send(\n new GetCommand({\n TableName: connectionsTable,\n Key: { connectionId: requestInfo.connectionId },\n ConsistentRead: true,\n }),\n );\n const parsed = SystemSchemas.connections.safeParse(response.Item);\n const now = Math.floor(Date.now() / 1000);\n if (!parsed.success || parsed.data.status !== 'open' || parsed.data.ttl <= now) {\n throw requestError('Connection is not open', 403);\n }\n if (\n !(await config.authorizeConnection({\n context,\n connection: parsed.data,\n requestInfo,\n }))\n ) {\n throw requestError('Connection is not authorized', 403);\n }\n const refreshedTtl = now + ttlSeconds;\n try {\n await docClient.send(\n new UpdateCommand({\n TableName: connectionsTable,\n Key: { connectionId: requestInfo.connectionId },\n UpdateExpression: 'SET #ttl = :ttl',\n ConditionExpression:\n '#status = :open AND #ttl > :now AND connectedAt = :connectedAt',\n ExpressionAttributeNames: { '#status': 'status', '#ttl': 'ttl' },\n ExpressionAttributeValues: {\n ':open': 'open',\n ':now': now,\n ':ttl': refreshedTtl,\n ':connectedAt': parsed.data.connectedAt,\n },\n }),\n );\n } catch (error) {\n if (\n error instanceof Error &&\n error.name === 'ConditionalCheckFailedException'\n ) {\n throw requestError('Connection is not open', 403);\n }\n throw error;\n }\n return { ...parsed.data, ttl: refreshedTtl };\n }\n\n async function handleRequest(\n request: ReactiveRequest,\n headers?: Record<string, string>,\n ): Promise<ReactiveResponse> {\n try {\n validateRequest(request);\n const requestInfo = { connectionId: request.connectionId, headers };\n const context = await config.getContext(requestInfo);\n const connection = await authorize(requestInfo, context);\n const tracker = new DependencyTracker();\n const db = createDbContext(dbConfig, tracker);\n const fullContext = { ...context, db } as TContext & {\n db: DatabaseContext;\n };\n\n if (request.type === 'subscribe') {\n return await handleSubscribe(request, fullContext, tracker, connection);\n }\n if (request.type === 'unsubscribe') {\n return await handleUnsubscribe(request);\n }\n return await handleCall(request, fullContext);\n } catch (error) {\n const safeError = isSafeRequestError(error) ? error : null;\n if (!safeError) logError('[reactive-handler] Request failed', error);\n return {\n type: 'error',\n message: safeError?.message ?? 'Internal server error',\n code: safeError?.statusCode ?? 500,\n ...('subscriptionId' in request\n ? { subscriptionId: request.subscriptionId }\n : {}),\n };\n }\n }\n\n async function activeSnapshot(\n request: SubscribeRequest,\n ): Promise<SnapshotResponse> {\n const response = await docClient.send(\n new GetCommand({\n TableName: queriesTable,\n Key: { pk: request.connectionId, sk: request.subscriptionId },\n ConsistentRead: true,\n }),\n );\n const query = SystemSchemas.queries.parse(response.Item) as QueryEntry;\n if (\n query.status !== 'active' ||\n query.generation !== request.generation ||\n query.registrationId !== request.registrationId\n ) {\n throw new Error('Subscription registration was superseded');\n }\n return {\n type: 'snapshot',\n subscriptionId: query.subscriptionId,\n generation: query.generation,\n version: query.version,\n data: query.lastResult,\n };\n }\n\n async function handleSubscribe(\n request: SubscribeRequest,\n context: TContext & { db: DatabaseContext },\n tracker: DependencyTracker,\n connection: ConnectionEntry,\n ): Promise<SnapshotResponse> {\n const procedure = config.router.getProcedure(request.path);\n if (!procedure) throw requestError(`Procedure not found: ${request.path}`, 404);\n if (procedure.type !== 'query') {\n throw requestError('Only query procedures can be subscribed to', 400);\n }\n\n const resolverResult = await config.router.execute(\n request.path,\n context,\n request.input,\n );\n const operations = tracker.getOperations();\n const capturedResult = tracker.getCapturedResult();\n if (operations.length !== 1 || !capturedResult) {\n throw requestError(\n 'A subscription must execute exactly one ctx.db query',\n 400,\n );\n }\n if (\n !Array.isArray(resolverResult) ||\n resolverResult !== capturedResult.reference ||\n !isDeepStrictEqual(resolverResult, capturedResult.snapshot)\n ) {\n throw requestError(\n 'A subscription resolver must return its ctx.db query result unchanged',\n 400,\n );\n }\n\n const queryMetadata = tracker.getQueryMetadata();\n if (!queryMetadata) throw new Error('Query metadata was not captured');\n const dependencies = tracker.extractAll();\n const uniqueDependencies = new Map(\n dependencies.map((dependency) => [createDependencyKey(dependency), dependency]),\n );\n const dependencyKeys = [...uniqueDependencies.keys()];\n if (uniqueDependencies.size > MAX_TRANSACTION_DEPENDENCIES) {\n throw requestError('Query has too many reactive dependencies', 400);\n }\n\n const now = Date.now();\n const ttl = Math.floor(now / 1000) + ttlSeconds;\n const registering: QueryEntry = {\n pk: request.connectionId,\n sk: request.subscriptionId,\n connectionId: request.connectionId,\n subscriptionId: request.subscriptionId,\n status: 'registering',\n generation: request.generation,\n registrationId: request.registrationId,\n queryMetadata,\n lastResult: [],\n dependencies: dependencyKeys,\n version: 0,\n createdAt: now,\n updatedAt: now,\n ttl,\n };\n let registrationEntry = registering;\n assertEntrySize(registering);\n\n const connectionCondition = {\n TableName: connectionsTable,\n Key: { connectionId: request.connectionId },\n ConditionExpression:\n '#connectionStatus = :open AND #connectionTtl > :now AND connectedAt = :connectedAt',\n ExpressionAttributeNames: {\n '#connectionStatus': 'status',\n '#connectionTtl': 'ttl',\n },\n ExpressionAttributeValues: {\n ':open': 'open',\n ':now': Math.floor(Date.now() / 1000),\n ':connectedAt': connection.connectedAt,\n },\n };\n\n async function renewRegistration(query: QueryEntry): Promise<void> {\n const dependencySk = `${request.connectionId}#${request.subscriptionId}`;\n await docClient.send(\n new TransactWriteCommand({\n TransactItems: [\n { ConditionCheck: connectionCondition },\n {\n Update: {\n TableName: queriesTable,\n Key: { pk: query.pk, sk: query.sk },\n UpdateExpression: 'SET #ttl = :ttl, updatedAt = :updatedAt',\n ConditionExpression:\n '#status = :status AND #generation = :generation AND registrationId = :registrationId',\n ExpressionAttributeNames: {\n '#status': 'status',\n '#generation': 'generation',\n '#ttl': 'ttl',\n },\n ExpressionAttributeValues: {\n ':status': query.status,\n ':generation': query.generation,\n ':registrationId': query.registrationId,\n ':ttl': ttl,\n ':updatedAt': Date.now(),\n },\n },\n },\n ...[...new Set(query.dependencies)].map((dependency) => ({\n Update: {\n TableName: dependenciesTable,\n Key: { pk: dependency, sk: dependencySk },\n UpdateExpression: 'SET #ttl = :ttl',\n ConditionExpression:\n '#generation = :generation AND registrationId = :registrationId',\n ExpressionAttributeNames: {\n '#generation': 'generation',\n '#ttl': 'ttl',\n },\n ExpressionAttributeValues: {\n ':generation': query.generation,\n ':registrationId': query.registrationId,\n ':ttl': ttl,\n },\n },\n })),\n ],\n }),\n );\n }\n\n try {\n await docClient.send(\n new TransactWriteCommand({\n TransactItems: [\n { ConditionCheck: connectionCondition },\n {\n Put: {\n TableName: queriesTable,\n Item: registering,\n ConditionExpression:\n 'attribute_not_exists(pk) OR #generation < :generation',\n ExpressionAttributeNames: {\n '#generation': 'generation',\n },\n ExpressionAttributeValues: {\n ':generation': request.generation,\n },\n },\n },\n ...[...uniqueDependencies].map(([key, dependency]) => {\n const debugMetadata = parseDependencyKey(key) ?? dependency;\n return {\n Put: {\n TableName: dependenciesTable,\n Item: {\n pk: key,\n sk: `${request.connectionId}#${request.subscriptionId}`,\n connectionId: request.connectionId,\n subscriptionId: request.subscriptionId,\n tableName: debugMetadata.tableName,\n fieldName: debugMetadata.fieldName,\n fieldValue: debugMetadata.fieldValue,\n generation: request.generation,\n registrationId: request.registrationId,\n ttl,\n },\n },\n };\n }),\n ],\n }),\n );\n } catch (error) {\n const existing = await docClient.send(\n new GetCommand({\n TableName: queriesTable,\n Key: { pk: request.connectionId, sk: request.subscriptionId },\n ConsistentRead: true,\n }),\n );\n const query = existing.Item as QueryEntry | undefined;\n if (\n !query ||\n query.generation !== request.generation ||\n query.registrationId !== request.registrationId ||\n (query.status !== 'registering' && query.status !== 'active')\n ) {\n throw error;\n }\n if (query.status === 'active') {\n await renewRegistration(query);\n return activeSnapshot(request);\n }\n registrationEntry = query;\n try {\n await renewRegistration(query);\n } catch (renewalError) {\n const winner = await matchingActiveSnapshot(request, connection);\n if (winner) return winner;\n throw renewalError;\n }\n }\n\n let baseline: Record<string, unknown>[];\n try {\n baseline = await executeQueryMetadata(\n ddbClient,\n registrationEntry.queryMetadata,\n );\n const active = {\n ...registrationEntry,\n status: 'active' as const,\n lastResult: baseline,\n };\n assertEntrySize(active);\n } catch (error) {\n const winner = await matchingActiveSnapshot(request, connection);\n if (winner) return winner;\n await faultRegistration(request);\n const winnerAfterFault = await matchingActiveSnapshot(request, connection);\n if (winnerAfterFault) return winnerAfterFault;\n throw error;\n }\n\n try {\n await docClient.send(\n new UpdateCommand({\n TableName: queriesTable,\n Key: { pk: request.connectionId, sk: request.subscriptionId },\n UpdateExpression:\n 'SET #status = :active, lastResult = :lastResult, updatedAt = :updatedAt',\n ConditionExpression:\n '#status = :registering AND #generation = :generation AND registrationId = :registrationId',\n ExpressionAttributeNames: {\n '#status': 'status',\n '#generation': 'generation',\n },\n ExpressionAttributeValues: {\n ':active': 'active',\n ':registering': 'registering',\n ':generation': request.generation,\n ':registrationId': request.registrationId,\n ':lastResult': baseline,\n ':updatedAt': Date.now(),\n },\n }),\n );\n } catch (error) {\n const winner = await matchingActiveSnapshot(request, connection);\n if (winner) return winner;\n await faultRegistration(request);\n const winnerAfterFault = await matchingActiveSnapshot(request, connection);\n if (winnerAfterFault) return winnerAfterFault;\n throw error;\n }\n\n return activeSnapshot(request);\n }\n\n async function matchingActiveSnapshot(\n request: SubscribeRequest,\n connection: ConnectionEntry,\n ): Promise<SnapshotResponse | null> {\n const [queryResponse, connectionResponse] = await Promise.all([\n docClient.send(\n new GetCommand({\n TableName: queriesTable,\n Key: { pk: request.connectionId, sk: request.subscriptionId },\n ConsistentRead: true,\n }),\n ),\n docClient.send(\n new GetCommand({\n TableName: connectionsTable,\n Key: { connectionId: request.connectionId },\n ConsistentRead: true,\n }),\n ),\n ]);\n const query = queryResponse.Item as QueryEntry | undefined;\n const currentConnection = SystemSchemas.connections.safeParse(\n connectionResponse.Item,\n );\n if (\n query?.status !== 'active' ||\n query.generation !== request.generation ||\n query.registrationId !== request.registrationId ||\n !currentConnection.success ||\n currentConnection.data.status !== 'open' ||\n currentConnection.data.connectedAt !== connection.connectedAt\n ) {\n return null;\n }\n return {\n type: 'snapshot',\n subscriptionId: query.subscriptionId,\n generation: query.generation,\n version: query.version,\n data: query.lastResult,\n };\n }\n\n async function faultRegistration(request: SubscribeRequest): Promise<void> {\n await docClient\n .send(\n new UpdateCommand({\n TableName: queriesTable,\n Key: { pk: request.connectionId, sk: request.subscriptionId },\n UpdateExpression: 'SET #status = :faulted, updatedAt = :updatedAt',\n ConditionExpression:\n '#status = :registering AND #generation = :generation AND registrationId = :registrationId',\n ExpressionAttributeNames: {\n '#status': 'status',\n '#generation': 'generation',\n },\n ExpressionAttributeValues: {\n ':faulted': 'faulted',\n ':registering': 'registering',\n ':generation': request.generation,\n ':registrationId': request.registrationId,\n ':updatedAt': Date.now(),\n },\n }),\n )\n .catch(() => undefined);\n }\n\n async function handleUnsubscribe(\n request: UnsubscribeRequest,\n ): Promise<ResultResponse> {\n const response = await docClient.send(\n new GetCommand({\n TableName: queriesTable,\n Key: { pk: request.connectionId, sk: request.subscriptionId },\n ConsistentRead: true,\n }),\n );\n const query = response.Item as QueryEntry | undefined;\n if (!query) return { type: 'result', data: { success: true } };\n if (\n query.generation !== request.generation ||\n query.registrationId !== request.registrationId\n ) {\n throw requestError('Unsubscribe generation is stale', 409);\n }\n\n await docClient.send(\n new UpdateCommand({\n TableName: queriesTable,\n Key: { pk: request.connectionId, sk: request.subscriptionId },\n UpdateExpression:\n 'SET #status = :cancelled, updatedAt = :updatedAt REMOVE pendingDelivery',\n ConditionExpression:\n '#generation = :generation AND registrationId = :registrationId',\n ExpressionAttributeNames: {\n '#status': 'status',\n '#generation': 'generation',\n },\n ExpressionAttributeValues: {\n ':cancelled': 'cancelled',\n ':generation': request.generation,\n ':registrationId': request.registrationId,\n ':updatedAt': Date.now(),\n },\n }),\n );\n\n await Promise.all(\n query.dependencies.map(async (key) => {\n try {\n await docClient.send(\n new DeleteCommand({\n TableName: dependenciesTable,\n Key: {\n pk: key,\n sk: `${request.connectionId}#${request.subscriptionId}`,\n },\n ConditionExpression: '#generation = :generation',\n ExpressionAttributeNames: { '#generation': 'generation' },\n ExpressionAttributeValues: { ':generation': request.generation },\n }),\n );\n } catch (error) {\n if (\n !(error instanceof Error) ||\n error.name !== 'ConditionalCheckFailedException'\n ) {\n throw error;\n }\n }\n }),\n );\n return { type: 'result', data: { success: true } };\n }\n\n async function handleCall(\n request: CallRequest,\n context: TContext & { db: DatabaseContext },\n ): Promise<ResultResponse> {\n const procedure = config.router.getProcedure(request.path);\n if (!procedure) throw requestError(`Procedure not found: ${request.path}`, 404);\n if (procedure.type !== 'mutation') {\n throw requestError('Call requests require a mutation procedure', 400);\n }\n return {\n type: 'result',\n data: await config.router.execute(request.path, context, request.input),\n };\n }\n\n async function registerConnection(\n connectionId: string,\n context?: Record<string, unknown>,\n ): Promise<void> {\n validateKeyString(\n 'connectionId',\n connectionId,\n DYNAMODB_PARTITION_KEY_MAX_BYTES,\n );\n const now = Date.now();\n await docClient.send(\n new PutCommand({\n TableName: connectionsTable,\n Item: {\n connectionId,\n status: 'open',\n context,\n connectedAt: now,\n ttl: Math.floor(now / 1000) + ttlSeconds,\n } satisfies ConnectionEntry,\n }),\n );\n }\n\n async function unregisterConnection(connectionId: string): Promise<void> {\n validateKeyString(\n 'connectionId',\n connectionId,\n DYNAMODB_PARTITION_KEY_MAX_BYTES,\n );\n await docClient.send(\n new UpdateCommand({\n TableName: connectionsTable,\n Key: { connectionId },\n UpdateExpression: 'SET #status = :closed',\n ConditionExpression: 'attribute_exists(connectionId)',\n ExpressionAttributeNames: { '#status': 'status' },\n ExpressionAttributeValues: { ':closed': 'closed' },\n }),\n );\n\n let lastKey: Record<string, unknown> | undefined;\n do {\n const response = await docClient.send(\n new QueryCommand({\n TableName: queriesTable,\n KeyConditionExpression: 'pk = :pk',\n ExpressionAttributeValues: { ':pk': connectionId },\n ConsistentRead: true,\n ExclusiveStartKey: lastKey,\n }),\n );\n for (const item of response.Items ?? []) {\n const query = item as QueryEntry;\n await handleUnsubscribe({\n type: 'unsubscribe',\n connectionId,\n subscriptionId: query.subscriptionId,\n generation: query.generation,\n registrationId: query.registrationId,\n });\n }\n lastKey = response.LastEvaluatedKey;\n } while (lastKey);\n\n debug('[reactive-handler] Connection unregistered');\n }\n\n async function query<T = unknown>(\n path: string,\n input?: unknown,\n headers?: Record<string, string>,\n ): Promise<T> {\n const procedure = config.router.getProcedure(path);\n if (!procedure) throw requestError(`Procedure not found: ${path}`, 404);\n if (procedure.type !== 'query') {\n throw requestError('One-time query requests require a query procedure', 400);\n }\n const context = await config.getContext({ connectionId: 'query', headers });\n const db = createDbContext(dbConfig);\n return config.router.execute(\n path,\n { ...context, db } as TContext & { db: DatabaseContext },\n input,\n ) as Promise<T>;\n }\n\n function createCaller(): RouterCaller<TRouter> {\n function buildProxy(path: string[] = []): unknown {\n return new Proxy(() => undefined, {\n get(_target, property: string) {\n return buildProxy([...path, property]);\n },\n apply(_target, _thisArg, args: unknown[]) {\n return query(path.join('.'), args[0]);\n },\n });\n }\n return buildProxy() as RouterCaller<TRouter>;\n }\n\n return {\n handleRequest,\n registerConnection,\n unregisterConnection,\n query,\n createCaller,\n };\n}\n","import type { JsonPatch } from '@dynamodb-reactive/core';\nimport jsonpatch from 'fast-json-patch';\n\nconst { compare } = jsonpatch;\n\n/**\n * Generate JSON patches between two objects\n * Uses RFC 6902 JSON Patch format\n */\nexport function generatePatches(\n oldValue: unknown,\n newValue: unknown,\n): JsonPatch[] {\n const operations = compare(\n oldValue as Record<string, unknown>,\n newValue as Record<string, unknown>,\n );\n\n return operations.map((op) => ({\n op: op.op as JsonPatch['op'],\n path: op.path,\n ...('value' in op ? { value: op.value } : {}),\n ...('from' in op ? { from: op.from } : {}),\n }));\n}\n","import {\n ApiGatewayManagementApiClient,\n GoneException,\n PostToConnectionCommand,\n} from '@aws-sdk/client-apigatewaymanagementapi';\nimport type { DynamoDBClient } from '@aws-sdk/client-dynamodb';\nimport type { DynamoDBDocumentClient } from '@aws-sdk/lib-dynamodb';\nimport {\n DeleteCommand,\n GetCommand,\n QueryCommand,\n UpdateCommand,\n} from '@aws-sdk/lib-dynamodb';\nimport type {\n PendingDelivery,\n QueryEntry,\n QueryMetadata,\n} from '@dynamodb-reactive/core';\nimport { randomUUID } from 'node:crypto';\nimport type { DynamoDBRecord } from 'aws-lambda';\n\nimport { info } from '../log.js';\nimport { generatePatches } from '../patcher.js';\nimport { executeQueryMetadata } from '../query-metadata.js';\n\nconst MAX_PATCH_MESSAGE_BYTES = 30 * 1024;\nconst MAX_QUERY_ENTRY_BYTES = 300 * 1024;\nconst MAX_PROCESS_ATTEMPTS = 4;\nconst REGISTRATION_WINDOW_MS = 60 * 1000;\n\nclass RetryableSubscriptionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'RetryableSubscriptionError';\n }\n}\n\nexport function extractTableName(record: DynamoDBRecord): string | null {\n const match = record.eventSourceARN?.match(/table\\/([^/]+)/);\n return match?.[1] ?? null;\n}\n\nexport interface StreamUtilsConfig {\n ddbClient: DynamoDBClient;\n docClient: DynamoDBDocumentClient;\n apiClient?: ApiGatewayManagementApiClient;\n apiGatewayEndpoint: string;\n connectionsTable: string;\n dependenciesTable: string;\n queriesTable: string;\n}\n\nfunction isConditionalFailure(error: unknown): boolean {\n return (\n error instanceof Error && error.name === 'ConditionalCheckFailedException'\n );\n}\n\nexport function createStreamUtils(config: StreamUtilsConfig) {\n const {\n ddbClient,\n docClient,\n connectionsTable,\n dependenciesTable,\n queriesTable,\n } = config;\n let apiClient = config.apiClient;\n\n function getApiClient(): ApiGatewayManagementApiClient {\n apiClient ??= new ApiGatewayManagementApiClient({\n endpoint: config.apiGatewayEndpoint,\n });\n return apiClient;\n }\n\n async function findAffectedSubscriptions(\n dependencyKey: string,\n ): Promise<{ connectionId: string; subscriptionId: string }[]> {\n const subscriptions: {\n connectionId: string;\n subscriptionId: string;\n }[] = [];\n let lastKey: Record<string, unknown> | undefined;\n do {\n const response = await docClient.send(\n new QueryCommand({\n TableName: dependenciesTable,\n KeyConditionExpression: 'pk = :pk',\n ExpressionAttributeValues: { ':pk': dependencyKey },\n ConsistentRead: true,\n ExclusiveStartKey: lastKey,\n }),\n );\n subscriptions.push(\n ...(response.Items ?? []).map((item) => ({\n connectionId: item.connectionId as string,\n subscriptionId: item.subscriptionId as string,\n })),\n );\n lastKey = response.LastEvaluatedKey;\n } while (lastKey);\n return subscriptions;\n }\n\n async function executeQueryFromMetadata(\n metadata: QueryMetadata,\n ): Promise<unknown[]> {\n return executeQueryMetadata(ddbClient, metadata);\n }\n\n function deliveryMessage(\n query: QueryEntry,\n delivery: PendingDelivery,\n ): Record<string, unknown> {\n return {\n type: delivery.type,\n subscriptionId: query.subscriptionId,\n generation: delivery.generation,\n fromVersion: delivery.fromVersion,\n toVersion: delivery.toVersion,\n messageId: delivery.messageId,\n ...(delivery.type === 'patch'\n ? { patches: delivery.patches }\n : {}),\n };\n }\n\n async function sendDelivery(\n query: QueryEntry,\n delivery: PendingDelivery,\n ): Promise<void> {\n await getApiClient().send(\n new PostToConnectionCommand({\n ConnectionId: query.connectionId,\n Data: Buffer.from(JSON.stringify(deliveryMessage(query, delivery))),\n }),\n );\n }\n\n async function clearDelivery(\n query: QueryEntry,\n delivery: PendingDelivery,\n ): Promise<void> {\n try {\n await docClient.send(\n new UpdateCommand({\n TableName: queriesTable,\n Key: { pk: query.pk, sk: query.sk },\n UpdateExpression: 'REMOVE pendingDelivery',\n ConditionExpression:\n '#status = :status AND #generation = :generation AND registrationId = :registrationId AND pendingDelivery.messageId = :messageId',\n ExpressionAttributeNames: {\n '#status': 'status',\n '#generation': 'generation',\n },\n ExpressionAttributeValues: {\n ':status': query.status,\n ':generation': query.generation,\n ':registrationId': query.registrationId,\n ':messageId': delivery.messageId,\n },\n }),\n );\n } catch (error) {\n if (!isConditionalFailure(error)) throw error;\n }\n }\n\n async function cleanupSubscriptionDependencies(query: QueryEntry): Promise<void> {\n await Promise.all(\n query.dependencies.map(async (dependency) => {\n try {\n await docClient.send(\n new DeleteCommand({\n TableName: dependenciesTable,\n Key: {\n pk: dependency,\n sk: `${query.connectionId}#${query.subscriptionId}`,\n },\n ConditionExpression:\n '#generation = :generation AND registrationId = :registrationId',\n ExpressionAttributeNames: { '#generation': 'generation' },\n ExpressionAttributeValues: {\n ':generation': query.generation,\n ':registrationId': query.registrationId,\n },\n }),\n );\n } catch (error) {\n if (!isConditionalFailure(error)) throw error;\n }\n }),\n );\n }\n\n async function processSubscription(\n connectionId: string,\n subscriptionId: string,\n ): Promise<void> {\n try {\n for (let attempt = 0; attempt < MAX_PROCESS_ATTEMPTS; attempt++) {\n const response = await docClient.send(\n new GetCommand({\n TableName: queriesTable,\n Key: { pk: connectionId, sk: subscriptionId },\n ConsistentRead: true,\n }),\n );\n const query = response.Item as QueryEntry | undefined;\n if (!query || query.status === 'cancelled') {\n return;\n }\n if (query.pendingDelivery) {\n await sendDelivery(query, query.pendingDelivery);\n await clearDelivery(query, query.pendingDelivery);\n if (query.status === 'faulted') {\n await cleanupSubscriptionDependencies(query);\n return;\n }\n continue;\n }\n if (query.status === 'faulted') {\n await cleanupSubscriptionDependencies(query);\n return;\n }\n if (query.status === 'registering') {\n if (query.createdAt <= Date.now() - REGISTRATION_WINDOW_MS) {\n try {\n await docClient.send(\n new UpdateCommand({\n TableName: queriesTable,\n Key: { pk: query.pk, sk: query.sk },\n UpdateExpression:\n 'SET #status = :faulted, updatedAt = :updatedAt',\n ConditionExpression:\n '#status = :registering AND #generation = :generation AND registrationId = :registrationId AND createdAt = :createdAt AND createdAt <= :registrationCutoff',\n ExpressionAttributeNames: {\n '#status': 'status',\n '#generation': 'generation',\n },\n ExpressionAttributeValues: {\n ':faulted': 'faulted',\n ':registering': 'registering',\n ':generation': query.generation,\n ':registrationId': query.registrationId,\n ':createdAt': query.createdAt,\n ':registrationCutoff': Date.now() - REGISTRATION_WINDOW_MS,\n ':updatedAt': Date.now(),\n },\n }),\n );\n return;\n } catch (error) {\n if (isConditionalFailure(error)) continue;\n throw error;\n }\n }\n throw new RetryableSubscriptionError(\n `Subscription ${connectionId}/${subscriptionId} is still registering`,\n );\n }\n\n const newResult = await executeQueryFromMetadata(query.queryMetadata);\n const patches = generatePatches(query.lastResult, newResult);\n if (patches.length === 0) return;\n const fromVersion = query.version;\n const toVersion = fromVersion + 1;\n const patchDelivery: PendingDelivery = {\n type: 'patch',\n generation: query.generation,\n fromVersion,\n toVersion,\n messageId: randomUUID(),\n patches,\n };\n const pendingDelivery: PendingDelivery =\n Buffer.byteLength(\n JSON.stringify(deliveryMessage(query, patchDelivery)),\n 'utf8',\n ) > MAX_PATCH_MESSAGE_BYTES\n ? {\n type: 'resync',\n generation: query.generation,\n fromVersion,\n toVersion,\n messageId: patchDelivery.messageId,\n }\n : patchDelivery;\n\n const persisted = {\n ...query,\n lastResult: newResult,\n version: toVersion,\n pendingDelivery,\n };\n if (\n Buffer.byteLength(JSON.stringify(persisted), 'utf8') >\n MAX_QUERY_ENTRY_BYTES\n ) {\n const faultDelivery: PendingDelivery = {\n type: 'resync',\n generation: query.generation,\n fromVersion,\n toVersion,\n messageId: pendingDelivery.messageId,\n };\n try {\n await docClient.send(\n new UpdateCommand({\n TableName: queriesTable,\n Key: { pk: query.pk, sk: query.sk },\n UpdateExpression:\n 'SET #status = :faulted, pendingDelivery = :pendingDelivery, updatedAt = :updatedAt',\n ConditionExpression:\n '#status = :active AND #generation = :generation AND registrationId = :registrationId AND #version = :fromVersion AND attribute_not_exists(pendingDelivery)',\n ExpressionAttributeNames: {\n '#status': 'status',\n '#generation': 'generation',\n '#version': 'version',\n },\n ExpressionAttributeValues: {\n ':active': 'active',\n ':faulted': 'faulted',\n ':generation': query.generation,\n ':registrationId': query.registrationId,\n ':fromVersion': fromVersion,\n ':pendingDelivery': faultDelivery,\n ':updatedAt': Date.now(),\n },\n }),\n );\n } catch (error) {\n if (isConditionalFailure(error)) {\n throw new RetryableSubscriptionError(\n `Subscription ${connectionId}/${subscriptionId} changed concurrently`,\n );\n }\n throw error;\n }\n continue;\n }\n\n try {\n await docClient.send(\n new UpdateCommand({\n TableName: queriesTable,\n Key: { pk: query.pk, sk: query.sk },\n UpdateExpression:\n 'SET lastResult = :lastResult, #version = :toVersion, pendingDelivery = :pendingDelivery, updatedAt = :updatedAt',\n ConditionExpression:\n '#status = :active AND #generation = :generation AND registrationId = :registrationId AND #version = :fromVersion AND attribute_not_exists(pendingDelivery)',\n ExpressionAttributeNames: {\n '#status': 'status',\n '#generation': 'generation',\n '#version': 'version',\n },\n ExpressionAttributeValues: {\n ':active': 'active',\n ':generation': query.generation,\n ':registrationId': query.registrationId,\n ':fromVersion': fromVersion,\n ':toVersion': toVersion,\n ':lastResult': newResult,\n ':pendingDelivery': pendingDelivery,\n ':updatedAt': Date.now(),\n },\n }),\n );\n } catch (error) {\n if (isConditionalFailure(error)) {\n throw new RetryableSubscriptionError(\n `Subscription ${connectionId}/${subscriptionId} changed concurrently`,\n );\n }\n throw error;\n }\n\n await sendDelivery(query, pendingDelivery);\n await clearDelivery(query, pendingDelivery);\n info('[stream] Delivery completed');\n return;\n }\n throw new RetryableSubscriptionError(\n `Subscription ${connectionId}/${subscriptionId} delivery did not settle`,\n );\n } catch (error) {\n if (error instanceof GoneException) {\n await cleanupConnection(connectionId);\n return;\n }\n throw error;\n }\n }\n\n async function cleanupConnection(connectionId: string): Promise<void> {\n try {\n await docClient.send(\n new UpdateCommand({\n TableName: connectionsTable,\n Key: { connectionId },\n UpdateExpression: 'SET #status = :closed',\n ConditionExpression: 'attribute_exists(connectionId)',\n ExpressionAttributeNames: { '#status': 'status' },\n ExpressionAttributeValues: { ':closed': 'closed' },\n }),\n );\n } catch (error) {\n if (!isConditionalFailure(error)) throw error;\n }\n\n let lastKey: Record<string, unknown> | undefined;\n do {\n const response = await docClient.send(\n new QueryCommand({\n TableName: queriesTable,\n KeyConditionExpression: 'pk = :pk',\n ExpressionAttributeValues: { ':pk': connectionId },\n ConsistentRead: true,\n ExclusiveStartKey: lastKey,\n }),\n );\n for (const item of response.Items ?? []) {\n const query = item as QueryEntry;\n if (query.status !== 'cancelled') {\n try {\n await docClient.send(\n new UpdateCommand({\n TableName: queriesTable,\n Key: { pk: query.pk, sk: query.sk },\n UpdateExpression:\n 'SET #status = :cancelled, updatedAt = :updatedAt REMOVE pendingDelivery',\n ConditionExpression:\n '#generation = :generation AND registrationId = :registrationId',\n ExpressionAttributeNames: {\n '#status': 'status',\n '#generation': 'generation',\n },\n ExpressionAttributeValues: {\n ':cancelled': 'cancelled',\n ':generation': query.generation,\n ':registrationId': query.registrationId,\n ':updatedAt': Date.now(),\n },\n }),\n );\n } catch (error) {\n if (!isConditionalFailure(error)) throw error;\n continue;\n }\n }\n await cleanupSubscriptionDependencies(query);\n }\n lastKey = response.LastEvaluatedKey;\n } while (lastKey);\n }\n\n return {\n findAffectedSubscriptions,\n executeQueryFromMetadata,\n sendDelivery,\n processSubscription,\n cleanupConnection,\n };\n}\n\nexport type StreamUtils = ReturnType<typeof createStreamUtils>;\n","import type { ApiGatewayManagementApiClient } from '@aws-sdk/client-apigatewaymanagementapi';\nimport { type AttributeValue, DynamoDBClient } from '@aws-sdk/client-dynamodb';\nimport { DynamoDBDocumentClient, PutCommand } from '@aws-sdk/lib-dynamodb';\nimport { unmarshall } from '@aws-sdk/util-dynamodb';\nimport type { ConnectionEntry } from '@dynamodb-reactive/core';\nimport type {\n DynamoDBBatchResponse,\n DynamoDBRecord,\n DynamoDBStreamEvent,\n} from 'aws-lambda';\n\nimport type { DbContextConfig } from '../db-context.js';\nimport { extractAffectedKeys } from '../dependency-extractor.js';\nimport { debug, error as logError } from '../log.js';\nimport { DEFAULT_CONNECTION_LEASE_SECONDS } from './reactive-handler.js';\nimport {\n createStreamUtils,\n extractTableName,\n type StreamUtils,\n} from './stream-utils.js';\n\ninterface StreamHandlerConfig {\n dbConfig?: DbContextConfig;\n apiClient?: ApiGatewayManagementApiClient;\n apiGatewayEndpoint: string;\n connectionsTableName: string;\n dependenciesTableName: string;\n queriesTableName: string;\n}\n\nconst MAX_FANOUT_CONCURRENCY = 10;\nconst DYNAMODB_PARTITION_KEY_MAX_BYTES = 2048;\n\nfunction assertConnectionId(connectionId: unknown): asserts connectionId is string {\n if (\n typeof connectionId !== 'string' ||\n connectionId.length === 0 ||\n Buffer.byteLength(connectionId, 'utf8') > DYNAMODB_PARTITION_KEY_MAX_BYTES\n ) {\n throw new Error('connectionId is not a valid DynamoDB partition key');\n }\n}\n\nasync function mapWithConcurrency<T, TResult>(\n values: readonly T[],\n concurrency: number,\n mapper: (value: T, index: number) => Promise<TResult>,\n): Promise<TResult[]> {\n const results = new Array<TResult>(values.length);\n let nextIndex = 0;\n const workers = Array.from(\n { length: Math.min(concurrency, values.length) },\n async () => {\n while (nextIndex < values.length) {\n const index = nextIndex++;\n results[index] = await mapper(values[index], index);\n }\n },\n );\n await Promise.all(workers);\n return results;\n}\n\ninterface SubscriptionReference {\n connectionId: string;\n subscriptionId: string;\n}\n\ninterface SubscriptionWork extends SubscriptionReference {\n recordIndexes: Set<number>;\n}\n\nfunction extractRecordAffectedKeys(record: DynamoDBRecord): Set<string> {\n const tableName = extractTableName(record);\n if (!tableName || !record.dynamodb) {\n throw new Error('Malformed DynamoDB stream record');\n }\n const affectedKeys = new Set(extractAffectedKeys(tableName, {}));\n for (const image of [record.dynamodb.NewImage, record.dynamodb.OldImage]) {\n if (!image) continue;\n const item = unmarshall(image as Record<string, AttributeValue>);\n for (const key of extractAffectedKeys(tableName, item)) affectedKeys.add(key);\n }\n return affectedKeys;\n}\n\nfunction subscriptionKey(subscription: SubscriptionReference): string {\n return JSON.stringify([\n subscription.connectionId,\n subscription.subscriptionId,\n ]);\n}\n\nfunction failureIdentifier(record: DynamoDBRecord, cause: unknown): string {\n const itemIdentifier = record.dynamodb?.SequenceNumber;\n if (!itemIdentifier) {\n throw new Error('Failed DynamoDB stream record has no sequence number', {\n cause,\n });\n }\n return itemIdentifier;\n}\n\nexport async function processStreamEvent(\n event: DynamoDBStreamEvent,\n utils: StreamUtils,\n): Promise<DynamoDBBatchResponse> {\n const failures = new Map<number, unknown>();\n const dependencies = new Map<string, Set<number>>();\n\n for (const [recordIndex, record] of event.Records.entries()) {\n try {\n for (const dependencyKey of extractRecordAffectedKeys(record)) {\n const recordIndexes = dependencies.get(dependencyKey) ?? new Set<number>();\n recordIndexes.add(recordIndex);\n dependencies.set(dependencyKey, recordIndexes);\n }\n } catch (error) {\n logError('[stream] Record dependency extraction failed:', error);\n failures.set(recordIndex, error);\n }\n }\n\n const subscriptions = new Map<string, SubscriptionWork>();\n await mapWithConcurrency(\n [...dependencies],\n MAX_FANOUT_CONCURRENCY,\n async ([dependencyKey, recordIndexes]) => {\n try {\n const affectedSubscriptions =\n await utils.findAffectedSubscriptions(dependencyKey);\n for (const subscription of affectedSubscriptions) {\n const key = subscriptionKey(subscription);\n const work = subscriptions.get(key) ?? {\n ...subscription,\n recordIndexes: new Set<number>(),\n };\n for (const recordIndex of recordIndexes) {\n work.recordIndexes.add(recordIndex);\n }\n subscriptions.set(key, work);\n }\n } catch (error) {\n logError('[stream] Subscription dependency lookup failed:', error);\n for (const recordIndex of recordIndexes) {\n failures.set(recordIndex, error);\n }\n }\n },\n );\n\n await mapWithConcurrency(\n [...subscriptions.values()],\n MAX_FANOUT_CONCURRENCY,\n async ({ connectionId, subscriptionId, recordIndexes }) => {\n try {\n await utils.processSubscription(connectionId, subscriptionId);\n } catch (error) {\n logError('[stream] Subscription refresh failed:', error);\n for (const recordIndex of recordIndexes) {\n failures.set(recordIndex, error);\n }\n }\n },\n );\n\n return {\n batchItemFailures: event.Records.flatMap((record, recordIndex) => {\n if (!failures.has(recordIndex)) return [];\n const cause = failures.get(recordIndex);\n return [{ itemIdentifier: failureIdentifier(record, cause) }];\n }),\n };\n}\n\nfunction clients(config: Pick<StreamHandlerConfig, 'dbConfig'>): {\n ddbClient: DynamoDBClient;\n docClient: DynamoDBDocumentClient;\n} {\n const ddbClient =\n config.dbConfig?.client ??\n new DynamoDBClient({\n region: config.dbConfig?.region ?? process.env.AWS_REGION,\n endpoint: config.dbConfig?.endpoint,\n });\n const docClient =\n config.dbConfig?.docClient ??\n DynamoDBDocumentClient.from(ddbClient, {\n marshallOptions: { removeUndefinedValues: true },\n });\n return { ddbClient, docClient };\n}\n\nexport function createConnectHandler(\n config: Pick<StreamHandlerConfig, 'dbConfig' | 'connectionsTableName'>,\n) {\n const connectionsTable = config.connectionsTableName;\n const { docClient } = clients(config);\n\n return async function handler(event: {\n requestContext: {\n connectionId: string;\n authorizer?: Record<string, unknown>;\n identity?: Record<string, unknown>;\n };\n }): Promise<{ statusCode: number }> {\n const connectionId = event.requestContext.connectionId;\n const now = Date.now();\n try {\n assertConnectionId(connectionId);\n const authorizerContext = jsonSafeRecord(event.requestContext.authorizer);\n const requestIdentity = jsonSafeRecord(event.requestContext.identity);\n const connectionEntry: ConnectionEntry = {\n connectionId,\n status: 'open',\n ...(authorizerContext ? { authorizerContext } : {}),\n ...(requestIdentity ? { requestIdentity } : {}),\n connectedAt: now,\n ttl: Math.floor(now / 1000) + DEFAULT_CONNECTION_LEASE_SECONDS,\n };\n await docClient.send(\n new PutCommand({ TableName: connectionsTable, Item: connectionEntry }),\n );\n debug('[stream] Connection established');\n return { statusCode: 200 };\n } catch (error) {\n logError('Error creating connection:', error);\n return { statusCode: 500 };\n }\n };\n}\n\nfunction jsonSafeRecord(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return undefined;\n try {\n const encoded = JSON.stringify(value, (_key, item: unknown) => {\n if (typeof item === 'bigint') return item.toString();\n if (\n typeof item === 'function' ||\n typeof item === 'symbol' ||\n item === undefined\n ) {\n return undefined;\n }\n return item;\n });\n if (!encoded) return undefined;\n return JSON.parse(encoded) as Record<string, unknown>;\n } catch {\n return undefined;\n }\n}\n\nexport function createDisconnectHandler(\n config: Pick<\n StreamHandlerConfig,\n | 'dbConfig'\n | 'apiClient'\n | 'connectionsTableName'\n | 'queriesTableName'\n | 'dependenciesTableName'\n | 'apiGatewayEndpoint'\n >,\n) {\n const connectionsTable = config.connectionsTableName;\n const dependenciesTable = config.dependenciesTableName;\n const queriesTable = config.queriesTableName;\n const { ddbClient, docClient } = clients(config);\n const utils = createStreamUtils({\n ddbClient,\n docClient,\n apiClient: config.apiClient,\n apiGatewayEndpoint: config.apiGatewayEndpoint,\n connectionsTable,\n dependenciesTable,\n queriesTable,\n });\n\n return async function handler(event: {\n requestContext: { connectionId: string };\n }): Promise<{ statusCode: number }> {\n try {\n const connectionId = event.requestContext.connectionId;\n assertConnectionId(connectionId);\n await utils.cleanupConnection(connectionId);\n return { statusCode: 200 };\n } catch (error) {\n logError('Error removing connection:', error);\n return { statusCode: 500 };\n }\n };\n}\n","import {\n ApiGatewayManagementApiClient,\n PostToConnectionCommand,\n} from '@aws-sdk/client-apigatewaymanagementapi';\nimport { DynamoDBClient } from '@aws-sdk/client-dynamodb';\nimport {\n DynamoDBDocumentClient,\n UpdateCommand,\n} from '@aws-sdk/lib-dynamodb';\nimport type {\n APIGatewayProxyEvent,\n APIGatewayProxyResult,\n DynamoDBStreamEvent,\n} from 'aws-lambda';\n\nimport type { DbContextConfig } from '../db-context.js';\nimport { error as logError } from '../log.js';\nimport {\n createConnectHandler,\n createDisconnectHandler,\n processStreamEvent,\n} from './stream-handler.js';\nimport { createStreamUtils } from './stream-utils.js';\nimport { DEFAULT_CONNECTION_LEASE_SECONDS } from './reactive-handler.js';\n\nexport interface LambdaHandlersConfig {\n dbConfig?: DbContextConfig;\n apiClient?: ApiGatewayManagementApiClient;\n connectionsTableName?: string;\n dependenciesTableName?: string;\n queriesTableName?: string;\n apiGatewayEndpoint?: string;\n}\n\nfunction requiredTableName(\n configured: string | undefined,\n environmentName: 'CONNECTIONS_TABLE' | 'DEPENDENCIES_TABLE' | 'QUERIES_TABLE',\n): string {\n const value = configured ?? process.env[environmentName];\n if (!value) throw new Error(`${environmentName} must name a system table`);\n return value;\n}\n\nfunction assertRequestKey(name: string, value: unknown, maxBytes: number): string {\n if (\n typeof value !== 'string' ||\n value.length === 0 ||\n Buffer.byteLength(value, 'utf8') > maxBytes\n ) {\n throw new Error(`${name} is not a valid DynamoDB key`);\n }\n return value;\n}\n\nexport function createLambdaHandlers(config: LambdaHandlersConfig = {}) {\n const connectionsTable = requiredTableName(\n config.connectionsTableName,\n 'CONNECTIONS_TABLE',\n );\n const dependenciesTable = requiredTableName(\n config.dependenciesTableName,\n 'DEPENDENCIES_TABLE',\n );\n const queriesTable = requiredTableName(\n config.queriesTableName,\n 'QUERIES_TABLE',\n );\n const apiGatewayEndpoint =\n config.apiGatewayEndpoint ?? process.env.WEBSOCKET_ENDPOINT ?? '';\n const ddbClient =\n config.dbConfig?.client ??\n new DynamoDBClient({\n region: config.dbConfig?.region ?? process.env.AWS_REGION,\n endpoint: config.dbConfig?.endpoint,\n });\n const docClient =\n config.dbConfig?.docClient ??\n DynamoDBDocumentClient.from(ddbClient, {\n marshallOptions: { removeUndefinedValues: true },\n });\n const apiClient =\n config.apiClient ??\n new ApiGatewayManagementApiClient({ endpoint: apiGatewayEndpoint });\n const sharedConfig = {\n dbConfig: { ...config.dbConfig, client: ddbClient, docClient },\n apiClient,\n apiGatewayEndpoint,\n connectionsTableName: connectionsTable,\n dependenciesTableName: dependenciesTable,\n queriesTableName: queriesTable,\n };\n const connect = createConnectHandler(sharedConfig);\n const disconnect = createDisconnectHandler(sharedConfig);\n const streamUtils = createStreamUtils({\n ddbClient,\n docClient,\n apiClient,\n apiGatewayEndpoint,\n connectionsTable,\n dependenciesTable,\n queriesTable,\n });\n\n async function connectHandler(\n event: APIGatewayProxyEvent,\n ): Promise<APIGatewayProxyResult> {\n const result = await connect({\n requestContext: {\n connectionId: event.requestContext.connectionId!,\n authorizer: event.requestContext.authorizer as\n | Record<string, unknown>\n | undefined,\n identity: event.requestContext.identity as unknown as\n | Record<string, unknown>\n | undefined,\n },\n });\n return {\n statusCode: result.statusCode,\n body: result.statusCode === 200 ? 'Connected' : 'Failed to connect',\n };\n }\n\n async function disconnectHandler(\n event: APIGatewayProxyEvent,\n ): Promise<APIGatewayProxyResult> {\n const result = await disconnect({\n requestContext: { connectionId: event.requestContext.connectionId! },\n });\n return {\n statusCode: result.statusCode,\n body: result.statusCode === 200 ? 'Disconnected' : 'Failed to disconnect',\n };\n }\n\n async function messageHandler(\n event: APIGatewayProxyEvent,\n ): Promise<APIGatewayProxyResult> {\n const connectionId = event.requestContext.connectionId!;\n try {\n assertRequestKey('connectionId', connectionId, 2048);\n const body = JSON.parse(event.body ?? '{}') as Record<string, unknown>;\n let response: unknown;\n if (body.type === 'init') {\n response = { type: 'connected', connectionId };\n } else if (body.type === 'ping') {\n const now = Math.floor(Date.now() / 1000);\n await docClient.send(\n new UpdateCommand({\n TableName: connectionsTable,\n Key: { connectionId },\n UpdateExpression: 'SET #ttl = :ttl',\n ConditionExpression: '#status = :open AND #ttl > :now',\n ExpressionAttributeNames: { '#status': 'status', '#ttl': 'ttl' },\n ExpressionAttributeValues: {\n ':open': 'open',\n ':now': now,\n ':ttl': now + DEFAULT_CONNECTION_LEASE_SECONDS,\n },\n }),\n );\n response = { type: 'pong' };\n } else {\n response = {\n type: 'error',\n message: 'Unsupported WebSocket message type',\n };\n }\n\n await apiClient.send(\n new PostToConnectionCommand({\n ConnectionId: connectionId,\n Data: Buffer.from(JSON.stringify(response)),\n }),\n );\n return { statusCode: 200, body: 'OK' };\n } catch (error) {\n logError('Error handling message:', error);\n return { statusCode: 500, body: 'Internal server error' };\n }\n }\n\n async function streamHandler(event: DynamoDBStreamEvent) {\n return processStreamEvent(event, streamUtils);\n }\n\n return { connectHandler, disconnectHandler, messageHandler, streamHandler };\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../server/src/errors.ts","../../server/src/procedure.ts","../../server/src/router.ts","../../server/src/reactive.ts","../../server/src/dependency-extractor.ts","../../server/src/query-builder.ts","../../core/src/schema.ts","../../server/src/query-metadata.ts","../../server/src/db-context.ts","../../server/src/log.ts","../../server/src/handlers/reactive-handler.ts","../../server/src/patcher.ts","../../server/src/handlers/stream-utils.ts","../../server/src/handlers/stream-handler.ts","../../server/src/handlers/lambda-handlers.ts"],"names":["error","nestedValue","DYNAMODB_PARTITION_KEY_MAX_BYTES","DynamoDBClient","DynamoDBDocumentClient","GetCommand","query","DeleteCommand","PutCommand","MAX_QUERY_ENTRY_BYTES","QueryCommand","UpdateCommand","unmarshall","ApiGatewayManagementApiClient","PostToConnectionCommand"],"mappings":"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","file":"server.js","sourcesContent":["/** An error whose status and message are safe to return to an API caller. */\nexport class SafeRequestError extends Error {\n readonly statusCode: number;\n\n constructor(message: string, statusCode: number) {\n super(message);\n this.name = 'SafeRequestError';\n this.statusCode = statusCode;\n }\n}\n\n/** Generic public error for malformed procedure input; Zod details stay private. */\nexport class InvalidInputError extends SafeRequestError {\n constructor() {\n super('Invalid input', 400);\n this.name = 'InvalidInputError';\n }\n}\n\nexport function isSafeRequestError(error: unknown): error is SafeRequestError {\n return error instanceof SafeRequestError;\n}\n","import type { z } from 'zod';\n\nimport type { DatabaseContext, ProcedureDefinition } from './types.js';\nimport { InvalidInputError } from './errors.js';\n\n/**\n * Procedure builder for creating type-safe procedures\n */\nexport class ProcedureBuilder<\n TContext,\n TInput extends z.ZodType = z.ZodUndefined,\n> {\n private inputSchema?: TInput;\n\n constructor(inputSchema?: TInput) {\n this.inputSchema = inputSchema;\n }\n\n /**\n * Define the input schema for the procedure\n */\n input<TNewInput extends z.ZodType>(\n schema: TNewInput,\n ): ProcedureBuilder<TContext, TNewInput> {\n return new ProcedureBuilder<TContext, TNewInput>(schema);\n }\n\n /**\n * Define a query procedure (read-only operation)\n */\n query<TOutput>(\n resolver: (opts: {\n ctx: TContext & { db: DatabaseContext };\n input: z.infer<TInput>;\n }) => Promise<TOutput> | TOutput,\n ): ProcedureDefinition<TContext, TInput, TOutput, 'query'> {\n return {\n type: 'query',\n inputSchema: this.inputSchema,\n resolver,\n };\n }\n\n /**\n * Define a mutation procedure (write operation)\n */\n mutation<TOutput>(\n resolver: (opts: {\n ctx: TContext & { db: DatabaseContext };\n input: z.infer<TInput>;\n }) => Promise<TOutput> | TOutput,\n ): ProcedureDefinition<TContext, TInput, TOutput, 'mutation'> {\n return {\n type: 'mutation',\n inputSchema: this.inputSchema,\n resolver,\n };\n }\n}\n\n/**\n * Check if a value is a procedure definition\n */\nexport function isProcedure(\n value: unknown,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- type guard requires `any` for variance compatibility\n): value is ProcedureDefinition<any, any, any, 'query' | 'mutation'> {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'type' in value &&\n 'resolver' in value &&\n (value.type === 'query' || value.type === 'mutation')\n );\n}\n\n/**\n * Execute a procedure with the given context and input\n */\nexport async function executeProcedure<\n TContext,\n TInput extends z.ZodType,\n TOutput,\n TType extends 'query' | 'mutation',\n>(\n procedure: ProcedureDefinition<TContext, TInput, TOutput, TType>,\n ctx: TContext & { db: DatabaseContext },\n rawInput: unknown,\n): Promise<TOutput> {\n // Validate input if schema is defined\n let input: z.infer<TInput>;\n if (procedure.inputSchema) {\n const parseResult = procedure.inputSchema.safeParse(rawInput);\n if (!parseResult.success) {\n throw new InvalidInputError();\n }\n input = parseResult.data;\n } else {\n input = rawInput as z.infer<TInput>;\n }\n\n // Execute the resolver\n return procedure.resolver({ ctx, input });\n}\n","import { executeProcedure, isProcedure } from './procedure.js';\nimport type {\n AnyProcedureDefinition,\n DatabaseContext,\n RouterDefinition,\n} from './types.js';\n\n/**\n * Router class for organizing procedures\n */\nexport class Router<TContext, TRouter extends RouterDefinition<TContext>> {\n public readonly definition: TRouter;\n\n constructor(definition: TRouter) {\n this.definition = definition;\n }\n\n /**\n * Get a procedure by its path (e.g., \"todos.list\")\n */\n getProcedure(path: string): AnyProcedureDefinition<TContext> | null {\n const parts = path.split('.');\n let current: unknown = this.definition;\n\n for (const part of parts) {\n if (typeof current !== 'object' || current === null) {\n return null;\n }\n current = (current as Record<string, unknown>)[part];\n }\n\n if (isProcedure(current)) {\n return current;\n }\n\n return null;\n }\n\n /**\n * Execute a procedure by its path\n */\n async execute(\n path: string,\n ctx: TContext & { db: DatabaseContext },\n input: unknown,\n ): Promise<unknown> {\n const procedure = this.getProcedure(path);\n if (!procedure) {\n throw new Error(`Procedure not found: ${path}`);\n }\n\n return executeProcedure(procedure, ctx, input);\n }\n\n}\n\n/**\n * Create a router from a definition\n */\nexport function createRouter<\n TContext,\n TRouter extends RouterDefinition<TContext>,\n>(definition: TRouter): Router<TContext, TRouter> {\n return new Router(definition);\n}\n","import type { z } from 'zod';\n\nimport { ProcedureBuilder } from './procedure.js';\nimport type { Router } from './router.js';\nimport { createRouter } from './router.js';\nimport type { RouterDefinition } from './types.js';\n\n/**\n * ReactiveBuilder - The main builder returned by initReactive\n */\nexport interface ReactiveBuilder<TContext> {\n /**\n * Create a new procedure builder\n */\n procedure: ProcedureBuilder<TContext>;\n\n /**\n * Create a router from procedure definitions\n */\n router<TRouter extends RouterDefinition<TContext>>(\n definition: TRouter,\n ): Router<TContext, TRouter>;\n}\n\n/**\n * Initialize the reactive system with a context type\n *\n * @example\n * ```ts\n * const t = initReactive<{ userId: string }>();\n *\n * export const appRouter = t.router({\n * todos: {\n * list: t.procedure\n * .input(z.object({ taskListId: z.string() }))\n * .query(({ ctx, input }) => {\n * return ctx.db\n * .query(TodoTable)\n * .filter((q) => q.eq(TodoTable.field.taskListId, input.taskListId))\n * .take(50);\n * }),\n * }\n * });\n * ```\n */\nexport function initReactive<\n TContext = Record<string, unknown>,\n>(): ReactiveBuilder<TContext> {\n return {\n procedure: new ProcedureBuilder<TContext>(),\n\n router<TRouter extends RouterDefinition<TContext>>(\n definition: TRouter,\n ): Router<TContext, TRouter> {\n return createRouter(definition);\n },\n };\n}\n\n/**\n * Type helper to infer the router type\n */\nexport type InferRouterType<T> =\n T extends Router<infer TContext, infer TRouter>\n ? { context: TContext; router: TRouter }\n : never;\n\n/**\n * Type helper to get procedure input type\n */\nexport type InferProcedureInput<T> = T extends { inputSchema: infer TSchema }\n ? TSchema extends z.ZodType\n ? z.infer<TSchema>\n : undefined\n : undefined;\n\n/**\n * Type helper to get procedure output type\n */\n\nexport type InferProcedureOutput<T> = T extends {\n resolver: (...args: any[]) => infer TOutput; // eslint-disable-line @typescript-eslint/no-explicit-any -- contravariance requires `any`\n}\n ? Awaited<TOutput>\n : unknown;\n","import type { QueryMetadata } from '@dynamodb-reactive/core';\nimport { createHash } from 'node:crypto';\n\nimport type {\n FilterCondition,\n QueryDependency,\n TrackedQueryOperation,\n} from './types.js';\n\n/** Prefixes through this length are indexed exactly; longer plans use wildcard invalidation. */\nexport const MAX_TRACKED_PREFIX_LENGTH = 64;\nconst TABLE_WILDCARD_FIELD = '*';\nconst DYNAMODB_PARTITION_KEY_MAX_BYTES = 2048;\nconst DEPENDENCY_KEY_VERSION = 'd1';\nconst HASHED_DEPENDENCY_KEY_VERSION = 'd1h';\nconst DEBUG_PREVIEW_BYTES = 96;\n\nfunction isPlainMap(value: object): value is Record<string, unknown> {\n const prototype = Object.getPrototypeOf(value);\n return prototype === Object.prototype || prototype === null;\n}\n\nfunction encodeStructuredValue(value: unknown, seen: Set<object>): string {\n if (value === null) return 'null';\n switch (typeof value) {\n case 'string':\n return `string:${JSON.stringify(value)}`;\n case 'number':\n return `number:${Object.is(value, -0) ? '-0' : String(value)}`;\n case 'boolean':\n return `boolean:${String(value)}`;\n case 'bigint':\n return `bigint:${String(value)}`;\n case 'undefined':\n return 'undefined';\n case 'symbol':\n return `symbol:${String(value.description)}`;\n case 'function':\n return `function:${String(value)}`;\n }\n\n if (ArrayBuffer.isView(value)) {\n return `binary:${Buffer.from(\n value.buffer,\n value.byteOffset,\n value.byteLength,\n ).toString('base64url')}`;\n }\n if (value instanceof ArrayBuffer) {\n return `binary:${Buffer.from(value).toString('base64url')}`;\n }\n if (value instanceof Date) {\n return `date:${\n Number.isNaN(value.getTime()) ? 'Invalid Date' : value.toISOString()\n }`;\n }\n\n if (seen.has(value)) return 'circular';\n seen.add(value);\n let encoded: string;\n if (Array.isArray(value)) {\n encoded = `array:${JSON.stringify(\n value.map((item) => encodeStructuredValue(item, seen)),\n )}`;\n } else if (value instanceof Set) {\n encoded = `set:${JSON.stringify(\n [...value].map((item) => encodeStructuredValue(item, seen)).sort(),\n )}`;\n } else if (isPlainMap(value)) {\n encoded = `map:${JSON.stringify(\n Object.keys(value)\n .sort()\n .map((key) => [key, encodeStructuredValue(value[key], seen)]),\n )}`;\n } else {\n encoded = `object:${Object.prototype.toString.call(value)}:${String(value)}`;\n }\n seen.delete(value);\n return encoded;\n}\n\nfunction encodeDependencyValue(value: unknown): string | null {\n if (value === null || value === undefined) return null;\n if (typeof value === 'string') return value;\n if (\n typeof value === 'number' ||\n typeof value === 'boolean' ||\n typeof value === 'bigint'\n ) {\n return String(value);\n }\n if (typeof value === 'object' && isPlainMap(value)) return null;\n return encodeStructuredValue(value, new Set());\n}\n\nfunction wildcardDependency(tableName: string): QueryDependency {\n return { tableName, fieldName: TABLE_WILDCARD_FIELD, fieldValue: '*' };\n}\n\n/**\n * Extracts dependencies from a filter condition\n */\nfunction extractFromCondition(\n tableName: string,\n condition: FilterCondition,\n): { dependencies: QueryDependency[]; safe: boolean } {\n const dependencies: QueryDependency[] = [];\n\n switch (condition.type) {\n case 'comparison': {\n // Only extract equality conditions as dependencies\n // These are the ones we can efficiently track\n const fieldValue = encodeDependencyValue(condition.value);\n if (\n condition.operator === 'eq' &&\n typeof condition.field === 'string' &&\n fieldValue !== null\n ) {\n dependencies.push({\n tableName,\n fieldName: condition.field,\n fieldValue,\n });\n }\n return { dependencies, safe: dependencies.length === 1 };\n }\n\n case 'function': {\n // For begins_with, we can track the prefix as a dependency\n if (\n condition.operator === 'beginsWith' &&\n typeof condition.field === 'string' &&\n typeof condition.value === 'string' &&\n condition.value.length > 0 &&\n condition.value.length <= MAX_TRACKED_PREFIX_LENGTH\n ) {\n dependencies.push({\n tableName,\n fieldName: condition.field,\n fieldValue: `prefix:${String(condition.value)}`,\n });\n }\n return { dependencies, safe: dependencies.length === 1 };\n }\n\n case 'logical': {\n if (\n condition.operator === 'not' ||\n !condition.conditions ||\n condition.conditions.length === 0\n ) {\n return { dependencies, safe: false };\n }\n let safe = true;\n for (const subCondition of condition.conditions) {\n const extracted = extractFromCondition(\n tableName,\n subCondition,\n );\n dependencies.push(...extracted.dependencies);\n safe &&= extracted.safe;\n }\n return { dependencies, safe };\n }\n }\n\n return { dependencies, safe: false };\n}\n\n/**\n * Extract dependencies from a tracked query operation\n */\nexport function extractDependencies(\n operation: TrackedQueryOperation,\n): QueryDependency[] {\n const dependencies: QueryDependency[] = [];\n let safe = operation.filters.length > 0;\n\n for (const filter of operation.filters) {\n const extracted = extractFromCondition(operation.tableName, filter);\n dependencies.push(...extracted.dependencies);\n safe &&= extracted.safe;\n }\n\n if (!safe) dependencies.push(wildcardDependency(operation.tableName));\n\n const unique = new Map<string, QueryDependency>();\n for (const dependency of dependencies) {\n unique.set(createDependencyKey(dependency), dependency);\n }\n return [...unique.values()];\n}\n\n/**\n * Create a dependency key for the inverted index\n * Components are encoded to avoid delimiter collisions. Oversized keys use a\n * deterministic digest while retaining bounded previews for diagnostics.\n */\nexport function createDependencyKey(dependency: QueryDependency): string {\n const components = [\n dependency.tableName,\n dependency.fieldName,\n dependency.fieldValue,\n ];\n const encoded = components.map((component) =>\n Buffer.from(component, 'utf8').toString('base64url'),\n );\n const key = `${DEPENDENCY_KEY_VERSION}#${encoded.join('#')}`;\n if (Buffer.byteLength(key, 'utf8') <= DYNAMODB_PARTITION_KEY_MAX_BYTES) {\n return key;\n }\n\n const digest = createHash('sha256').update(key, 'utf8').digest('hex');\n const previews = components.map((component) =>\n Buffer.from(utf8Preview(component), 'utf8').toString('base64url'),\n );\n return `${HASHED_DEPENDENCY_KEY_VERSION}#${digest}#${previews.join('#')}`;\n}\n\nfunction utf8Preview(value: string): string {\n if (Buffer.byteLength(value, 'utf8') <= DEBUG_PREVIEW_BYTES) return value;\n let preview = '';\n for (const character of value) {\n if (\n Buffer.byteLength(`${preview}${character}`, 'utf8') > DEBUG_PREVIEW_BYTES\n ) {\n break;\n }\n preview += character;\n }\n return `${preview}...`;\n}\n\n/**\n * Parse a dependency key back into its components\n */\nexport function parseDependencyKey(key: string): QueryDependency | null {\n const parts = key.split('#');\n const decode = (encoded: string): string | null => {\n const buffer = Buffer.from(encoded, 'base64url');\n return buffer.toString('base64url') === encoded\n ? buffer.toString('utf8')\n : null;\n };\n if (parts[0] === DEPENDENCY_KEY_VERSION && parts.length === 4) {\n const decoded = parts.slice(1).map(decode);\n if (decoded.some((component) => component === null)) return null;\n return {\n tableName: decoded[0]!,\n fieldName: decoded[1]!,\n fieldValue: decoded[2]!,\n };\n }\n if (\n parts[0] === HASHED_DEPENDENCY_KEY_VERSION &&\n parts.length === 5 &&\n /^[a-f0-9]{64}$/.test(parts[1])\n ) {\n const decoded = parts.slice(2).map(decode);\n if (decoded.some((component) => component === null)) return null;\n return {\n tableName: decoded[0]!,\n fieldName: decoded[1]!,\n fieldValue: `${decoded[2]} [sha256:${parts[1]}]`,\n };\n }\n return null;\n}\n\n/**\n * Extract affected dependency keys from a DynamoDB stream record\n * This finds all keys that might be affected by a change\n */\nexport function extractAffectedKeys(\n tableName: string,\n item: Record<string, unknown>,\n): string[] {\n const keys = new Set<string>([\n createDependencyKey(wildcardDependency(tableName)),\n ]);\n\n const visit = (fieldName: string, fieldValue: unknown): void => {\n if (fieldValue !== null && fieldValue !== undefined) {\n const encodedValue = encodeDependencyValue(fieldValue);\n if (encodedValue !== null) {\n keys.add(\n createDependencyKey({\n tableName,\n fieldName,\n fieldValue: encodedValue,\n }),\n );\n }\n\n // Add prefix keys for string values (for begins_with queries)\n // Match the same documented bound used while extracting query plans.\n if (typeof fieldValue === 'string') {\n const maxPrefixLen = Math.min(\n fieldValue.length,\n MAX_TRACKED_PREFIX_LENGTH,\n );\n for (let i = 1; i <= maxPrefixLen; i++) {\n keys.add(\n createDependencyKey({\n tableName,\n fieldName,\n fieldValue: `prefix:${fieldValue.substring(0, i)}`,\n }),\n );\n }\n }\n\n if (\n typeof fieldValue === 'object' &&\n isPlainMap(fieldValue)\n ) {\n for (const [nestedName, nestedValue] of Object.entries(fieldValue)) {\n visit(`${fieldName}.${nestedName}`, nestedValue);\n }\n }\n }\n };\n\n for (const [fieldName, fieldValue] of Object.entries(item)) {\n visit(fieldName, fieldValue);\n }\n\n return [...keys];\n}\n\n/**\n * Convert a TrackedQueryOperation to QueryMetadata for storage.\n */\nexport function operationToQueryMetadata(\n operation: TrackedQueryOperation,\n): QueryMetadata {\n return {\n planVersion: 1,\n tableName: operation.tableName,\n indexName: operation.indexName,\n indexPkField: operation.indexPkField,\n indexSkField: operation.indexSkField,\n filterConditions: operation.filters,\n ...(operation.sortField && operation.sortOrder\n ? { sortField: operation.sortField, sortOrder: operation.sortOrder }\n : {}),\n limit: operation.limit,\n };\n}\n\n/**\n * DependencyTracker - Tracks query operations during procedure execution\n */\nexport class DependencyTracker {\n private operations: {\n operation: TrackedQueryOperation;\n resultReference: unknown[];\n resultSnapshot: unknown[];\n }[] = [];\n\n /**\n * Track a query operation\n */\n track(operation: TrackedQueryOperation, result: unknown[]): void {\n this.operations.push({\n operation,\n resultReference: result,\n resultSnapshot: structuredClone(result),\n });\n }\n\n /**\n * Get all tracked operations\n */\n getOperations(): TrackedQueryOperation[] {\n return this.operations.map(({ operation }) => operation);\n }\n\n /**\n * Extract all dependencies from tracked operations\n */\n extractAll(): QueryDependency[] {\n const dependencies: QueryDependency[] = [];\n\n for (const { operation } of this.operations) {\n dependencies.push(...extractDependencies(operation));\n }\n\n return dependencies;\n }\n\n /**\n * Get query metadata for the first tracked operation.\n * Used for storing subscription state.\n */\n getQueryMetadata(): QueryMetadata | null {\n if (this.operations.length === 0) return null;\n return operationToQueryMetadata(this.operations[0].operation);\n }\n\n getCapturedResult(): {\n reference: unknown[];\n snapshot: unknown[];\n } | null {\n if (this.operations.length !== 1) return null;\n return {\n reference: this.operations[0].resultReference,\n snapshot: structuredClone(this.operations[0].resultSnapshot),\n };\n }\n\n}\n","import type { FieldRef } from '@dynamodb-reactive/core';\n\nimport type {\n AnyDynamoTable,\n FilterBuilder,\n FilterCondition,\n QueryBuilder,\n TableItem,\n TrackedQueryOperation,\n} from './types.js';\n\n/**\n * Implementation of FilterBuilder\n */\nclass FilterBuilderImpl<\n TTable extends AnyDynamoTable,\n> implements FilterBuilder<TTable> {\n eq<K extends keyof TableItem<TTable>>(\n field: FieldRef<K & string, TableItem<TTable>[K]>,\n value: TableItem<TTable>[K],\n ): FilterCondition {\n return { type: 'comparison', operator: 'eq', field: field.fieldName, value };\n }\n\n ne<K extends keyof TableItem<TTable>>(\n field: FieldRef<K & string, TableItem<TTable>[K]>,\n value: TableItem<TTable>[K],\n ): FilterCondition {\n return { type: 'comparison', operator: 'ne', field: field.fieldName, value };\n }\n\n gt<K extends keyof TableItem<TTable>>(\n field: FieldRef<K & string, TableItem<TTable>[K]>,\n value: TableItem<TTable>[K],\n ): FilterCondition {\n return { type: 'comparison', operator: 'gt', field: field.fieldName, value };\n }\n\n gte<K extends keyof TableItem<TTable>>(\n field: FieldRef<K & string, TableItem<TTable>[K]>,\n value: TableItem<TTable>[K],\n ): FilterCondition {\n return { type: 'comparison', operator: 'gte', field: field.fieldName, value };\n }\n\n lt<K extends keyof TableItem<TTable>>(\n field: FieldRef<K & string, TableItem<TTable>[K]>,\n value: TableItem<TTable>[K],\n ): FilterCondition {\n return { type: 'comparison', operator: 'lt', field: field.fieldName, value };\n }\n\n lte<K extends keyof TableItem<TTable>>(\n field: FieldRef<K & string, TableItem<TTable>[K]>,\n value: TableItem<TTable>[K],\n ): FilterCondition {\n return { type: 'comparison', operator: 'lte', field: field.fieldName, value };\n }\n\n between<K extends keyof TableItem<TTable>>(\n field: FieldRef<K & string, TableItem<TTable>[K]>,\n lower: TableItem<TTable>[K],\n upper: TableItem<TTable>[K],\n ): FilterCondition {\n return {\n type: 'function',\n operator: 'between',\n field: field.fieldName,\n value: lower,\n value2: upper,\n };\n }\n\n beginsWith<K extends keyof TableItem<TTable>>(\n field: FieldRef<K & string, string>,\n prefix: string,\n ): FilterCondition {\n return {\n type: 'function',\n operator: 'beginsWith',\n field: field.fieldName,\n value: prefix,\n };\n }\n\n contains<K extends keyof TableItem<TTable>>(\n field: FieldRef<K & string, string>,\n substring: string,\n ): FilterCondition {\n return {\n type: 'function',\n operator: 'contains',\n field: field.fieldName,\n value: substring,\n };\n }\n\n and(...conditions: FilterCondition[]): FilterCondition {\n return { type: 'logical', operator: 'and', conditions };\n }\n\n or(...conditions: FilterCondition[]): FilterCondition {\n return { type: 'logical', operator: 'or', conditions };\n }\n\n not(condition: FilterCondition): FilterCondition {\n return { type: 'logical', operator: 'not', conditions: [condition] };\n }\n}\n\n/**\n * Query execution function type\n */\ntype QueryExecutor<TTable extends AnyDynamoTable> = (\n operation: TrackedQueryOperation,\n) => Promise<TableItem<TTable>[]>;\n\n/**\n * Implementation of QueryBuilder\n */\nexport class QueryBuilderImpl<\n TTable extends AnyDynamoTable,\n> implements QueryBuilder<TTable> {\n private table: TTable;\n private filters: FilterCondition[] = [];\n private indexName?: keyof TTable['indexes'] & string;\n private limit?: number;\n private ascending: boolean = true;\n private sortRequested = false;\n private executor: QueryExecutor<TTable>;\n private operationTracker?: (\n op: TrackedQueryOperation,\n result: TableItem<TTable>[],\n ) => void;\n\n constructor(\n table: TTable,\n executor: QueryExecutor<TTable>,\n operationTracker?: (\n op: TrackedQueryOperation,\n result: TableItem<TTable>[],\n ) => void,\n ) {\n this.table = table;\n this.executor = executor;\n this.operationTracker = operationTracker;\n }\n\n filter(\n fn: (q: FilterBuilder<TTable>) => FilterCondition,\n ): QueryBuilder<TTable> {\n const builder = new FilterBuilderImpl<TTable>();\n const condition = fn(builder);\n this.filters.push(condition);\n return this;\n }\n\n useIndex(\n indexName: keyof TTable['indexes'] & string,\n ): QueryBuilder<TTable> {\n if (!this.table.indexes[indexName]) {\n throw new Error(`Unknown index: ${indexName}`);\n }\n this.indexName = indexName;\n return this;\n }\n\n take(limit: number): QueryBuilder<TTable> {\n if (!Number.isInteger(limit) || limit <= 0) {\n throw new Error('take(limit) requires a positive integer');\n }\n this.limit = limit;\n return this;\n }\n\n sortAscending(): QueryBuilder<TTable> {\n this.ascending = true;\n this.sortRequested = true;\n return this;\n }\n\n sortDescending(): QueryBuilder<TTable> {\n this.ascending = false;\n this.sortRequested = true;\n return this;\n }\n\n async execute(): Promise<TableItem<TTable>[]> {\n const operation = this.getOperation();\n\n const result = await this.executor(operation);\n this.operationTracker?.(operation, result);\n return result;\n }\n\n /**\n * Get the current operation without executing\n * Used for dependency extraction\n */\n getOperation(): TrackedQueryOperation {\n const index = this.indexName\n ? this.table.indexes[this.indexName]\n : undefined;\n const selectedSortField = index ? index.sk : this.table.sk;\n const sortField = this.sortRequested ? selectedSortField : undefined;\n if (this.sortRequested && !sortField) {\n throw new Error('Sorting requires a table or index sort key');\n }\n return {\n tableName: this.table.tableName,\n filters: this.filters,\n indexName: index?.name,\n indexPkField: index?.pk,\n indexSkField: index?.sk,\n ...(sortField\n ? { sortField, sortOrder: this.ascending ? ('asc' as const) : ('desc' as const) }\n : {}),\n limit: this.limit,\n };\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 {\n type AttributeValue,\n type DynamoDBClient,\n ExecuteStatementCommand,\n type ExecuteStatementCommandInput,\n} from '@aws-sdk/client-dynamodb';\nimport {\n type FilterCondition,\n type QueryMetadata,\n QueryMetadataSchema,\n} from '@dynamodb-reactive/core';\nimport { unmarshall } from '@aws-sdk/util-dynamodb';\n\nexport class InvalidQueryMetadataError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'InvalidQueryMetadataError';\n }\n}\n\nfunction attributeValue(value: unknown): AttributeValue {\n if (value === null) return { NULL: true };\n if (value === undefined) {\n throw new InvalidQueryMetadataError('Query parameter values are required');\n }\n if (typeof value === 'string') return { S: value };\n if (typeof value === 'number') {\n if (!Number.isFinite(value)) {\n throw new InvalidQueryMetadataError('Query values must be finite numbers');\n }\n return { N: String(value) };\n }\n if (typeof value === 'boolean') return { BOOL: value };\n if (value instanceof Uint8Array) return { B: value };\n if (value instanceof Set) {\n const values = [...value];\n if (values.length === 0) {\n throw new InvalidQueryMetadataError('Query sets must not be empty');\n }\n if (values.every((item): item is string => typeof item === 'string')) {\n return { SS: values };\n }\n if (values.every((item): item is number => typeof item === 'number')) {\n if (values.some((item) => !Number.isFinite(item))) {\n throw new InvalidQueryMetadataError('Query values must be finite numbers');\n }\n return { NS: values.map(String) };\n }\n if (values.every((item): item is Uint8Array => item instanceof Uint8Array)) {\n return { BS: values };\n }\n throw new InvalidQueryMetadataError(\n 'Query sets must contain one supported DynamoDB scalar type',\n );\n }\n if (Array.isArray(value)) return { L: value.map(attributeValue) };\n if (typeof value === 'object') {\n return {\n M: Object.fromEntries(\n Object.entries(value as Record<string, unknown>).map(([key, item]) => [\n key,\n attributeValue(item),\n ]),\n ),\n };\n }\n throw new InvalidQueryMetadataError(\n `Unsupported query value type: ${typeof value}`,\n );\n}\n\nfunction quoteIdentifier(identifier: string): string {\n if (!identifier) {\n throw new InvalidQueryMetadataError('Identifier must not be empty');\n }\n return `\"${identifier.replace(/\"/g, '\"\"')}\"`;\n}\n\nfunction quotePath(path: string): string {\n if (!path || path.split('.').some((part) => !part)) {\n throw new InvalidQueryMetadataError(`Invalid field path: ${path}`);\n }\n return path\n .split('.')\n .map(quoteIdentifier)\n .join('.');\n}\n\nfunction compileCondition(\n condition: FilterCondition,\n parameters: AttributeValue[],\n): string {\n if (condition.type === 'comparison' && condition.field) {\n const operators: Record<string, string> = {\n eq: '=',\n ne: '<>',\n gt: '>',\n gte: '>=',\n lt: '<',\n lte: '<=',\n };\n const operator = operators[condition.operator];\n if (!operator) {\n throw new InvalidQueryMetadataError(\n `Unsupported comparison operator: ${condition.operator}`,\n );\n }\n parameters.push(attributeValue(condition.value));\n return `${quotePath(condition.field)} ${operator} ?`;\n }\n\n if (condition.type === 'function' && condition.field) {\n if (condition.operator === 'between') {\n parameters.push(attributeValue(condition.value));\n parameters.push(attributeValue(condition.value2));\n return `${quotePath(condition.field)} BETWEEN ? AND ?`;\n }\n if (condition.operator === 'beginsWith' || condition.operator === 'contains') {\n parameters.push(attributeValue(condition.value));\n const name = condition.operator === 'beginsWith' ? 'begins_with' : 'contains';\n return `${name}(${quotePath(condition.field)}, ?)`;\n }\n throw new InvalidQueryMetadataError(\n `Unsupported function operator: ${condition.operator}`,\n );\n }\n\n if (condition.type === 'logical' && condition.conditions?.length) {\n if (condition.operator === 'not') {\n if (condition.conditions.length !== 1) {\n throw new InvalidQueryMetadataError('NOT requires exactly one condition');\n }\n return `NOT (${compileCondition(condition.conditions[0], parameters)})`;\n }\n if (condition.operator === 'and' || condition.operator === 'or') {\n const operator = condition.operator.toUpperCase();\n return `(${condition.conditions\n .map((item) => compileCondition(item, parameters))\n .join(` ${operator} `)})`;\n }\n }\n\n throw new InvalidQueryMetadataError('Malformed query filter condition');\n}\n\nexport function parseQueryMetadata(metadata: unknown): QueryMetadata {\n const parsed = QueryMetadataSchema.safeParse(metadata);\n if (!parsed.success) {\n throw new InvalidQueryMetadataError(\n `Invalid query metadata: ${parsed.error.message}`,\n );\n }\n return parsed.data;\n}\n\nexport function compileQueryMetadata(\n metadataInput: unknown,\n nextToken?: string,\n): ExecuteStatementCommandInput {\n const metadata = parseQueryMetadata(metadataInput);\n const parameters: AttributeValue[] = [];\n let statement = `SELECT * FROM ${quoteIdentifier(metadata.tableName)}`;\n const predicates: string[] = [];\n if (metadata.indexPkField) {\n predicates.push(`${quotePath(metadata.indexPkField)} IS NOT MISSING`);\n }\n if (metadata.indexSkField) {\n predicates.push(`${quotePath(metadata.indexSkField)} IS NOT MISSING`);\n }\n if (metadata.filterConditions.length) {\n predicates.push(\n ...metadata.filterConditions.map((condition) =>\n compileCondition(condition, parameters),\n ),\n );\n }\n if (predicates.length) statement += ` WHERE ${predicates.join(' AND ')}`;\n\n return {\n Statement: statement,\n ConsistentRead: true,\n ...(parameters.length ? { Parameters: parameters } : {}),\n ...(nextToken ? { NextToken: nextToken } : {}),\n };\n}\n\nfunction nestedValue(item: Record<string, unknown>, path: string): unknown {\n return path.split('.').reduce<unknown>((value, part) => {\n if (!value || typeof value !== 'object') return undefined;\n return (value as Record<string, unknown>)[part];\n }, item);\n}\n\nfunction compareValues(left: unknown, right: unknown): number {\n if (left === right) return 0;\n if (typeof left === 'number' && typeof right === 'number') return left - right;\n if (typeof left === 'string' && typeof right === 'string') {\n return Buffer.compare(Buffer.from(left, 'utf8'), Buffer.from(right, 'utf8'));\n }\n if (left instanceof Uint8Array && right instanceof Uint8Array) {\n return Buffer.compare(Buffer.from(left), Buffer.from(right));\n }\n throw new InvalidQueryMetadataError(\n 'Sorted query fields must contain one consistent DynamoDB key type',\n );\n}\n\n/** Execute every page of the stored plan; failures are intentionally propagated. */\nexport async function executeQueryMetadata(\n client: Pick<DynamoDBClient, 'send'>,\n metadataInput: unknown,\n): Promise<Record<string, unknown>[]> {\n const metadata = parseQueryMetadata(metadataInput);\n const items: Record<string, unknown>[] = [];\n let nextToken: string | undefined;\n const seenTokens = new Set<string>();\n\n do {\n const response = await client.send(\n new ExecuteStatementCommand(compileQueryMetadata(metadata, nextToken)),\n );\n items.push(\n ...(response.Items ?? []).map((item) =>\n unmarshall(item as Record<string, AttributeValue>),\n ),\n );\n nextToken = response.NextToken;\n if (nextToken && seenTokens.has(nextToken)) {\n throw new Error('DynamoDB returned a repeated pagination token');\n }\n if (nextToken) seenTokens.add(nextToken);\n if (\n metadata.limit !== undefined &&\n !metadata.sortField &&\n items.length >= metadata.limit\n ) {\n break;\n }\n } while (nextToken);\n\n if (metadata.sortField) {\n items.sort((left, right) => {\n const result = compareValues(\n nestedValue(left, metadata.sortField!),\n nestedValue(right, metadata.sortField!),\n );\n return metadata.sortOrder === 'desc' ? -result : result;\n });\n }\n\n return metadata.limit === undefined ? items : items.slice(0, metadata.limit);\n}\n","import { DynamoDBClient } from '@aws-sdk/client-dynamodb';\nimport {\n DeleteCommand,\n DynamoDBDocumentClient,\n GetCommand,\n PutCommand,\n} from '@aws-sdk/lib-dynamodb';\nimport type { DependencyTracker } from './dependency-extractor.js';\nimport { operationToQueryMetadata } from './dependency-extractor.js';\nimport { QueryBuilderImpl } from './query-builder.js';\nimport { executeQueryMetadata } from './query-metadata.js';\nimport type {\n AnyDynamoTable,\n DatabaseContext,\n TableItem,\n TableKeyInput,\n TrackedQueryOperation,\n} from './types.js';\n\n/**\n * Configuration for creating a database context\n */\nexport interface DbContextConfig {\n client?: DynamoDBClient;\n docClient?: DynamoDBDocumentClient;\n region?: string;\n endpoint?: string;\n}\n\nconst MAX_CONDITION_EXPRESSION_BYTES = 4 * 1024;\nconst MAX_EXPRESSION_VARIABLE_BYTES = 2 * 1024 * 1024;\nconst MAX_CONDITION_OPERATORS = 300;\n\n/**\n * Create a DynamoDB Document client\n */\nfunction createClients(config: DbContextConfig): {\n client: DynamoDBClient;\n docClient: DynamoDBDocumentClient;\n} {\n const client = config.client ?? new DynamoDBClient({\n region: config.region ?? process.env.AWS_REGION ?? 'us-east-1',\n endpoint: config.endpoint,\n });\n\n const docClient = config.docClient ?? DynamoDBDocumentClient.from(client, {\n marshallOptions: {\n removeUndefinedValues: true,\n convertEmptyValues: false,\n },\n unmarshallOptions: {\n wrapNumbers: false,\n },\n });\n return { client, docClient };\n}\n\n/**\n * Creates a database context for procedure execution\n */\nexport function createDbContext(\n config: DbContextConfig,\n dependencyTracker?: DependencyTracker,\n): DatabaseContext {\n const { client, docClient } = createClients(config);\n\n /**\n * Execute a query operation\n */\n async function executeQuery<TTable extends AnyDynamoTable>(\n operation: TrackedQueryOperation,\n ): Promise<TableItem<TTable>[]> {\n return executeQueryMetadata(\n client,\n operationToQueryMetadata(operation),\n ) as Promise<TableItem<TTable>[]>;\n }\n\n return {\n query<TTable extends AnyDynamoTable>(table: TTable) {\n return new QueryBuilderImpl<TTable>(\n table,\n executeQuery,\n dependencyTracker?.track.bind(dependencyTracker),\n );\n },\n\n async get<TTable extends AnyDynamoTable>(\n table: TTable,\n key: TableKeyInput<TTable>,\n ): Promise<TableItem<TTable> | null> {\n const command = new GetCommand({\n TableName: table.tableName,\n Key: key as Record<string, unknown>,\n ConsistentRead: true,\n });\n\n const response = await docClient.send(command);\n return response.Item\n ? (response.Item as TableItem<TTable>)\n : null;\n },\n\n async put<TTable extends AnyDynamoTable>(\n table: TTable,\n item: TableItem<TTable>,\n ): Promise<void> {\n const parsedItem = table.validate(item);\n\n const command = new PutCommand({\n TableName: table.tableName,\n Item: parsedItem as Record<string, unknown>,\n });\n\n await docClient.send(command);\n },\n\n async delete<TTable extends AnyDynamoTable>(\n table: TTable,\n key: TableKeyInput<TTable>,\n ): Promise<void> {\n const command = new DeleteCommand({\n TableName: table.tableName,\n Key: key as Record<string, unknown>,\n });\n\n await docClient.send(command);\n },\n\n async update<TTable extends AnyDynamoTable>(\n table: TTable,\n key: TableKeyInput<TTable>,\n updates: Partial<TableItem<TTable>>,\n ): Promise<TableItem<TTable>> {\n const currentResponse = await docClient.send(\n new GetCommand({\n TableName: table.tableName,\n Key: key as Record<string, unknown>,\n ConsistentRead: true,\n }),\n );\n const current = currentResponse.Item as TableItem<TTable> | undefined;\n if (!current) throw new Error('Item not found');\n const parsed = table.validate({\n ...(current as Record<string, unknown>),\n ...(updates as Record<string, unknown>),\n ...(key as Record<string, unknown>),\n }) as Record<string, unknown>;\n\n const expected = current as Record<string, unknown>;\n const fields = [\n ...new Set([\n ...table.getFieldNames().map(String),\n ...Object.keys(expected),\n ]),\n ].sort();\n const conditions: string[] = [];\n const expressionAttributeNames: Record<string, string> = {};\n const expressionAttributeValues: Record<string, unknown> = {};\n\n for (const [i, field] of fields.entries()) {\n const nameKey = `#f${i}`;\n expressionAttributeNames[nameKey] = field;\n if (Object.prototype.hasOwnProperty.call(expected, field)) {\n const valueKey = `:e${i}`;\n conditions.push(`${nameKey} = ${valueKey}`);\n expressionAttributeValues[valueKey] = expected[field];\n } else {\n conditions.push(`attribute_not_exists(${nameKey})`);\n }\n }\n\n const conditionExpression = conditions.join(' AND ');\n const variableBytes = Buffer.byteLength(\n JSON.stringify({\n names: expressionAttributeNames,\n values: expressionAttributeValues,\n }),\n 'utf8',\n );\n if (\n Buffer.byteLength(conditionExpression, 'utf8') >\n MAX_CONDITION_EXPRESSION_BYTES ||\n conditions.length > MAX_CONDITION_OPERATORS ||\n variableBytes > MAX_EXPRESSION_VARIABLE_BYTES\n ) {\n throw new Error(\n 'Item is too complex to update with a safe compare-and-swap',\n );\n }\n\n const command = new PutCommand({\n TableName: table.tableName,\n Item: parsed,\n ConditionExpression: conditionExpression,\n ...(Object.keys(expressionAttributeNames).length\n ? { ExpressionAttributeNames: expressionAttributeNames }\n : {}),\n ...(Object.keys(expressionAttributeValues).length\n ? { ExpressionAttributeValues: expressionAttributeValues }\n : {}),\n });\n\n await docClient.send(command);\n return parsed as TableItem<TTable>;\n },\n };\n}\n","type LogMethod = (...values: unknown[]) => void;\n\nconst consoleLogger = globalThis.console;\nconst SAFE_ERROR_NAMES = new Set([\n 'ConditionalCheckFailedException',\n 'Error',\n 'GoneException',\n 'TransactionCanceledException',\n]);\n\nfunction sanitized(value: unknown): unknown {\n if (value instanceof Error) {\n return {\n errorName: SAFE_ERROR_NAMES.has(value.name) ? value.name : 'Error',\n };\n }\n if (value && typeof value === 'object') return { valueType: 'object' };\n return value;\n}\n\nfunction logger(method: 'debug' | 'info' | 'warn' | 'error'): LogMethod {\n return (...values) => consoleLogger[method](...values.map(sanitized));\n}\n\nexport const debug = logger('debug');\nexport const info = logger('info');\nexport const warn = logger('warn');\nexport const error = logger('error');\n","import { DynamoDBClient } from '@aws-sdk/client-dynamodb';\nimport {\n DeleteCommand,\n DynamoDBDocumentClient,\n GetCommand,\n PutCommand,\n QueryCommand,\n TransactWriteCommand,\n UpdateCommand,\n} from '@aws-sdk/lib-dynamodb';\nimport {\n type ConnectionEntry,\n type QueryEntry,\n SystemSchemas,\n SystemTableNames,\n} from '@dynamodb-reactive/core';\nimport { isDeepStrictEqual } from 'node:util';\n\nimport { createDbContext, type DbContextConfig } from '../db-context.js';\nimport {\n createDependencyKey,\n DependencyTracker,\n parseDependencyKey,\n} from '../dependency-extractor.js';\nimport { isSafeRequestError, SafeRequestError } from '../errors.js';\nimport { debug, error as logError } from '../log.js';\nimport { executeQueryMetadata } from '../query-metadata.js';\nimport type { Router } from '../router.js';\nimport type {\n DatabaseContext,\n RouterCaller,\n RouterDefinition,\n} from '../types.js';\n\nconst MAX_TRANSACTION_DEPENDENCIES = 90;\nconst MAX_QUERY_ENTRY_BYTES = 300 * 1024;\nconst DYNAMODB_PARTITION_KEY_MAX_BYTES = 2048;\nconst DYNAMODB_SORT_KEY_MAX_BYTES = 1024;\nconst MAX_TABLE_PREFIX_LENGTH = 227;\nexport const DEFAULT_CONNECTION_LEASE_SECONDS = 3 * 60 * 60;\n\nexport interface SubscribeRequest {\n type: 'subscribe';\n connectionId: string;\n subscriptionId: string;\n generation: number;\n registrationId: string;\n path: string;\n input: unknown;\n}\n\nexport interface UnsubscribeRequest {\n type: 'unsubscribe';\n connectionId: string;\n subscriptionId: string;\n generation: number;\n registrationId: string;\n}\n\nexport interface CallRequest {\n type: 'call';\n connectionId: string;\n path: string;\n input: unknown;\n}\n\nexport type ReactiveRequest = SubscribeRequest | UnsubscribeRequest | CallRequest;\n\nexport interface SnapshotResponse {\n type: 'snapshot';\n subscriptionId: string;\n generation: number;\n version: number;\n data: unknown[];\n}\n\nexport interface ResultResponse {\n type: 'result';\n data: unknown;\n}\n\nexport interface ErrorResponse {\n type: 'error';\n message: string;\n code?: number;\n subscriptionId?: string;\n}\n\nexport type ReactiveResponse =\n | SnapshotResponse\n | ResultResponse\n | ErrorResponse;\n\nexport interface RequestInfo {\n connectionId: string;\n headers?: Record<string, string>;\n}\n\nexport interface ConnectionAuthorization<TContext> {\n context: TContext;\n connection: ConnectionEntry;\n requestInfo: RequestInfo;\n}\n\nexport interface ReactiveHandlerConfig<\n TContext,\n TRouter extends RouterDefinition<TContext> = RouterDefinition<TContext>,\n> {\n router: Router<TContext, TRouter>;\n dbConfig?: DbContextConfig;\n getContext: (requestInfo: RequestInfo) => Promise<TContext>;\n authorizeConnection: (\n authorization: ConnectionAuthorization<TContext>,\n ) => boolean | Promise<boolean>;\n ttlSeconds?: number;\n tablePrefix: string;\n}\n\nfunction requestError(message: string, code: number): SafeRequestError {\n return new SafeRequestError(message, code);\n}\n\nfunction validateTablePrefix(tablePrefix: unknown): asserts tablePrefix is string {\n if (\n typeof tablePrefix !== 'string' ||\n !/^[A-Za-z0-9][A-Za-z0-9_-]*$/.test(tablePrefix) ||\n tablePrefix.length > MAX_TABLE_PREFIX_LENGTH\n ) {\n throw new Error(\n 'createReactiveHandler tablePrefix must be a nonempty concrete value of at most 227 letters, numbers, hyphens, or underscores, starting with a letter or number',\n );\n }\n}\n\nfunction validateKeyString(name: string, value: unknown, maxBytes: number): void {\n if (typeof value !== 'string' || value.length === 0) {\n throw requestError(`${name} must be a non-empty string`, 400);\n }\n if (Buffer.byteLength(value, 'utf8') > maxBytes) {\n throw requestError(`${name} exceeds DynamoDB's UTF-8 key length limit`, 400);\n }\n}\n\nfunction validateRequest(request: ReactiveRequest): void {\n validateKeyString(\n 'connectionId',\n request.connectionId,\n DYNAMODB_PARTITION_KEY_MAX_BYTES,\n );\n if (request.type === 'subscribe' || request.type === 'unsubscribe') {\n validateKeyString(\n 'subscriptionId',\n request.subscriptionId,\n DYNAMODB_SORT_KEY_MAX_BYTES,\n );\n validateKeyString(\n 'registrationId',\n request.registrationId,\n DYNAMODB_SORT_KEY_MAX_BYTES,\n );\n if (\n Buffer.byteLength(\n `${request.connectionId}#${request.subscriptionId}`,\n 'utf8',\n ) > DYNAMODB_SORT_KEY_MAX_BYTES\n ) {\n throw requestError(\n 'connectionId and subscriptionId exceed DynamoDB dependency key limits',\n 400,\n );\n }\n if (!Number.isInteger(request.generation) || request.generation < 0) {\n throw requestError('generation must be a non-negative integer', 400);\n }\n }\n}\n\nfunction assertEntrySize(entry: QueryEntry): void {\n if (Buffer.byteLength(JSON.stringify(entry), 'utf8') > MAX_QUERY_ENTRY_BYTES) {\n throw new Error('Subscription result is too large to store safely');\n }\n}\n\nexport function createReactiveHandler<\n TContext,\n TRouter extends RouterDefinition<TContext>,\n>(config: ReactiveHandlerConfig<TContext, TRouter>) {\n validateTablePrefix(config.tablePrefix);\n const ttlSeconds = config.ttlSeconds ?? DEFAULT_CONNECTION_LEASE_SECONDS;\n const prefix = `${config.tablePrefix}-`;\n const connectionsTable = `${prefix}${SystemTableNames.connections}`;\n const dependenciesTable = `${prefix}${SystemTableNames.dependencies}`;\n const queriesTable = `${prefix}${SystemTableNames.queries}`;\n const ddbClient =\n config.dbConfig?.client ??\n new DynamoDBClient({\n region: config.dbConfig?.region ?? process.env.AWS_REGION,\n endpoint: config.dbConfig?.endpoint,\n });\n const docClient =\n config.dbConfig?.docClient ??\n DynamoDBDocumentClient.from(ddbClient, {\n marshallOptions: { removeUndefinedValues: true },\n });\n const dbConfig: DbContextConfig = {\n ...config.dbConfig,\n client: ddbClient,\n docClient,\n };\n\n async function authorize(\n requestInfo: RequestInfo,\n context: TContext,\n ): Promise<ConnectionEntry> {\n const response = await docClient.send(\n new GetCommand({\n TableName: connectionsTable,\n Key: { connectionId: requestInfo.connectionId },\n ConsistentRead: true,\n }),\n );\n const parsed = SystemSchemas.connections.safeParse(response.Item);\n const now = Math.floor(Date.now() / 1000);\n if (!parsed.success || parsed.data.status !== 'open' || parsed.data.ttl <= now) {\n throw requestError('Connection is not open', 403);\n }\n if (\n !(await config.authorizeConnection({\n context,\n connection: parsed.data,\n requestInfo,\n }))\n ) {\n throw requestError('Connection is not authorized', 403);\n }\n const refreshedTtl = now + ttlSeconds;\n try {\n await docClient.send(\n new UpdateCommand({\n TableName: connectionsTable,\n Key: { connectionId: requestInfo.connectionId },\n UpdateExpression: 'SET #ttl = :ttl',\n ConditionExpression:\n '#status = :open AND #ttl > :now AND connectedAt = :connectedAt',\n ExpressionAttributeNames: { '#status': 'status', '#ttl': 'ttl' },\n ExpressionAttributeValues: {\n ':open': 'open',\n ':now': now,\n ':ttl': refreshedTtl,\n ':connectedAt': parsed.data.connectedAt,\n },\n }),\n );\n } catch (error) {\n if (\n error instanceof Error &&\n error.name === 'ConditionalCheckFailedException'\n ) {\n throw requestError('Connection is not open', 403);\n }\n throw error;\n }\n return { ...parsed.data, ttl: refreshedTtl };\n }\n\n async function handleRequest(\n request: ReactiveRequest,\n headers?: Record<string, string>,\n ): Promise<ReactiveResponse> {\n try {\n validateRequest(request);\n const requestInfo = { connectionId: request.connectionId, headers };\n const context = await config.getContext(requestInfo);\n const connection = await authorize(requestInfo, context);\n const tracker = new DependencyTracker();\n const db = createDbContext(dbConfig, tracker);\n const fullContext = { ...context, db } as TContext & {\n db: DatabaseContext;\n };\n\n if (request.type === 'subscribe') {\n return await handleSubscribe(request, fullContext, tracker, connection);\n }\n if (request.type === 'unsubscribe') {\n return await handleUnsubscribe(request);\n }\n return await handleCall(request, fullContext);\n } catch (error) {\n const safeError = isSafeRequestError(error) ? error : null;\n if (!safeError) logError('[reactive-handler] Request failed', error);\n return {\n type: 'error',\n message: safeError?.message ?? 'Internal server error',\n code: safeError?.statusCode ?? 500,\n ...('subscriptionId' in request\n ? { subscriptionId: request.subscriptionId }\n : {}),\n };\n }\n }\n\n async function activeSnapshot(\n request: SubscribeRequest,\n ): Promise<SnapshotResponse> {\n const response = await docClient.send(\n new GetCommand({\n TableName: queriesTable,\n Key: { pk: request.connectionId, sk: request.subscriptionId },\n ConsistentRead: true,\n }),\n );\n const query = SystemSchemas.queries.parse(response.Item) as QueryEntry;\n if (\n query.status !== 'active' ||\n query.generation !== request.generation ||\n query.registrationId !== request.registrationId\n ) {\n throw new Error('Subscription registration was superseded');\n }\n return {\n type: 'snapshot',\n subscriptionId: query.subscriptionId,\n generation: query.generation,\n version: query.version,\n data: query.lastResult,\n };\n }\n\n async function handleSubscribe(\n request: SubscribeRequest,\n context: TContext & { db: DatabaseContext },\n tracker: DependencyTracker,\n connection: ConnectionEntry,\n ): Promise<SnapshotResponse> {\n const procedure = config.router.getProcedure(request.path);\n if (!procedure) throw requestError(`Procedure not found: ${request.path}`, 404);\n if (procedure.type !== 'query') {\n throw requestError('Only query procedures can be subscribed to', 400);\n }\n\n const resolverResult = await config.router.execute(\n request.path,\n context,\n request.input,\n );\n const operations = tracker.getOperations();\n const capturedResult = tracker.getCapturedResult();\n if (operations.length !== 1 || !capturedResult) {\n throw requestError(\n 'A subscription must execute exactly one ctx.db query',\n 400,\n );\n }\n if (\n !Array.isArray(resolverResult) ||\n resolverResult !== capturedResult.reference ||\n !isDeepStrictEqual(resolverResult, capturedResult.snapshot)\n ) {\n throw requestError(\n 'A subscription resolver must return its ctx.db query result unchanged',\n 400,\n );\n }\n\n const queryMetadata = tracker.getQueryMetadata();\n if (!queryMetadata) throw new Error('Query metadata was not captured');\n const dependencies = tracker.extractAll();\n const uniqueDependencies = new Map(\n dependencies.map((dependency) => [createDependencyKey(dependency), dependency]),\n );\n const dependencyKeys = [...uniqueDependencies.keys()];\n if (uniqueDependencies.size > MAX_TRANSACTION_DEPENDENCIES) {\n throw requestError('Query has too many reactive dependencies', 400);\n }\n\n const now = Date.now();\n const ttl = Math.floor(now / 1000) + ttlSeconds;\n const registering: QueryEntry = {\n pk: request.connectionId,\n sk: request.subscriptionId,\n connectionId: request.connectionId,\n subscriptionId: request.subscriptionId,\n status: 'registering',\n generation: request.generation,\n registrationId: request.registrationId,\n queryMetadata,\n lastResult: [],\n dependencies: dependencyKeys,\n version: 0,\n createdAt: now,\n updatedAt: now,\n ttl,\n };\n let registrationEntry = registering;\n assertEntrySize(registering);\n\n const connectionCondition = {\n TableName: connectionsTable,\n Key: { connectionId: request.connectionId },\n ConditionExpression:\n '#connectionStatus = :open AND #connectionTtl > :now AND connectedAt = :connectedAt',\n ExpressionAttributeNames: {\n '#connectionStatus': 'status',\n '#connectionTtl': 'ttl',\n },\n ExpressionAttributeValues: {\n ':open': 'open',\n ':now': Math.floor(Date.now() / 1000),\n ':connectedAt': connection.connectedAt,\n },\n };\n\n async function renewRegistration(query: QueryEntry): Promise<void> {\n const dependencySk = `${request.connectionId}#${request.subscriptionId}`;\n await docClient.send(\n new TransactWriteCommand({\n TransactItems: [\n { ConditionCheck: connectionCondition },\n {\n Update: {\n TableName: queriesTable,\n Key: { pk: query.pk, sk: query.sk },\n UpdateExpression: 'SET #ttl = :ttl, updatedAt = :updatedAt',\n ConditionExpression:\n '#status = :status AND #generation = :generation AND registrationId = :registrationId',\n ExpressionAttributeNames: {\n '#status': 'status',\n '#generation': 'generation',\n '#ttl': 'ttl',\n },\n ExpressionAttributeValues: {\n ':status': query.status,\n ':generation': query.generation,\n ':registrationId': query.registrationId,\n ':ttl': ttl,\n ':updatedAt': Date.now(),\n },\n },\n },\n ...[...new Set(query.dependencies)].map((dependency) => ({\n Update: {\n TableName: dependenciesTable,\n Key: { pk: dependency, sk: dependencySk },\n UpdateExpression: 'SET #ttl = :ttl',\n ConditionExpression:\n '#generation = :generation AND registrationId = :registrationId',\n ExpressionAttributeNames: {\n '#generation': 'generation',\n '#ttl': 'ttl',\n },\n ExpressionAttributeValues: {\n ':generation': query.generation,\n ':registrationId': query.registrationId,\n ':ttl': ttl,\n },\n },\n })),\n ],\n }),\n );\n }\n\n try {\n await docClient.send(\n new TransactWriteCommand({\n TransactItems: [\n { ConditionCheck: connectionCondition },\n {\n Put: {\n TableName: queriesTable,\n Item: registering,\n ConditionExpression:\n 'attribute_not_exists(pk) OR #generation < :generation',\n ExpressionAttributeNames: {\n '#generation': 'generation',\n },\n ExpressionAttributeValues: {\n ':generation': request.generation,\n },\n },\n },\n ...[...uniqueDependencies].map(([key, dependency]) => {\n const debugMetadata = parseDependencyKey(key) ?? dependency;\n return {\n Put: {\n TableName: dependenciesTable,\n Item: {\n pk: key,\n sk: `${request.connectionId}#${request.subscriptionId}`,\n connectionId: request.connectionId,\n subscriptionId: request.subscriptionId,\n tableName: debugMetadata.tableName,\n fieldName: debugMetadata.fieldName,\n fieldValue: debugMetadata.fieldValue,\n generation: request.generation,\n registrationId: request.registrationId,\n ttl,\n },\n },\n };\n }),\n ],\n }),\n );\n } catch (error) {\n const existing = await docClient.send(\n new GetCommand({\n TableName: queriesTable,\n Key: { pk: request.connectionId, sk: request.subscriptionId },\n ConsistentRead: true,\n }),\n );\n const query = existing.Item as QueryEntry | undefined;\n if (\n !query ||\n query.generation !== request.generation ||\n query.registrationId !== request.registrationId ||\n (query.status !== 'registering' && query.status !== 'active')\n ) {\n throw error;\n }\n if (query.status === 'active') {\n await renewRegistration(query);\n return activeSnapshot(request);\n }\n registrationEntry = query;\n try {\n await renewRegistration(query);\n } catch (renewalError) {\n const winner = await matchingActiveSnapshot(request, connection);\n if (winner) return winner;\n throw renewalError;\n }\n }\n\n let baseline: Record<string, unknown>[];\n try {\n baseline = await executeQueryMetadata(\n ddbClient,\n registrationEntry.queryMetadata,\n );\n const active = {\n ...registrationEntry,\n status: 'active' as const,\n lastResult: baseline,\n };\n assertEntrySize(active);\n } catch (error) {\n const winner = await matchingActiveSnapshot(request, connection);\n if (winner) return winner;\n await faultRegistration(request);\n const winnerAfterFault = await matchingActiveSnapshot(request, connection);\n if (winnerAfterFault) return winnerAfterFault;\n throw error;\n }\n\n try {\n await docClient.send(\n new UpdateCommand({\n TableName: queriesTable,\n Key: { pk: request.connectionId, sk: request.subscriptionId },\n UpdateExpression:\n 'SET #status = :active, lastResult = :lastResult, updatedAt = :updatedAt',\n ConditionExpression:\n '#status = :registering AND #generation = :generation AND registrationId = :registrationId',\n ExpressionAttributeNames: {\n '#status': 'status',\n '#generation': 'generation',\n },\n ExpressionAttributeValues: {\n ':active': 'active',\n ':registering': 'registering',\n ':generation': request.generation,\n ':registrationId': request.registrationId,\n ':lastResult': baseline,\n ':updatedAt': Date.now(),\n },\n }),\n );\n } catch (error) {\n const winner = await matchingActiveSnapshot(request, connection);\n if (winner) return winner;\n await faultRegistration(request);\n const winnerAfterFault = await matchingActiveSnapshot(request, connection);\n if (winnerAfterFault) return winnerAfterFault;\n throw error;\n }\n\n return activeSnapshot(request);\n }\n\n async function matchingActiveSnapshot(\n request: SubscribeRequest,\n connection: ConnectionEntry,\n ): Promise<SnapshotResponse | null> {\n const [queryResponse, connectionResponse] = await Promise.all([\n docClient.send(\n new GetCommand({\n TableName: queriesTable,\n Key: { pk: request.connectionId, sk: request.subscriptionId },\n ConsistentRead: true,\n }),\n ),\n docClient.send(\n new GetCommand({\n TableName: connectionsTable,\n Key: { connectionId: request.connectionId },\n ConsistentRead: true,\n }),\n ),\n ]);\n const query = queryResponse.Item as QueryEntry | undefined;\n const currentConnection = SystemSchemas.connections.safeParse(\n connectionResponse.Item,\n );\n if (\n query?.status !== 'active' ||\n query.generation !== request.generation ||\n query.registrationId !== request.registrationId ||\n !currentConnection.success ||\n currentConnection.data.status !== 'open' ||\n currentConnection.data.connectedAt !== connection.connectedAt\n ) {\n return null;\n }\n return {\n type: 'snapshot',\n subscriptionId: query.subscriptionId,\n generation: query.generation,\n version: query.version,\n data: query.lastResult,\n };\n }\n\n async function faultRegistration(request: SubscribeRequest): Promise<void> {\n await docClient\n .send(\n new UpdateCommand({\n TableName: queriesTable,\n Key: { pk: request.connectionId, sk: request.subscriptionId },\n UpdateExpression: 'SET #status = :faulted, updatedAt = :updatedAt',\n ConditionExpression:\n '#status = :registering AND #generation = :generation AND registrationId = :registrationId',\n ExpressionAttributeNames: {\n '#status': 'status',\n '#generation': 'generation',\n },\n ExpressionAttributeValues: {\n ':faulted': 'faulted',\n ':registering': 'registering',\n ':generation': request.generation,\n ':registrationId': request.registrationId,\n ':updatedAt': Date.now(),\n },\n }),\n )\n .catch(() => undefined);\n }\n\n async function handleUnsubscribe(\n request: UnsubscribeRequest,\n ): Promise<ResultResponse> {\n const response = await docClient.send(\n new GetCommand({\n TableName: queriesTable,\n Key: { pk: request.connectionId, sk: request.subscriptionId },\n ConsistentRead: true,\n }),\n );\n const query = response.Item as QueryEntry | undefined;\n if (!query) return { type: 'result', data: { success: true } };\n if (\n query.generation !== request.generation ||\n query.registrationId !== request.registrationId\n ) {\n throw requestError('Unsubscribe generation is stale', 409);\n }\n\n await docClient.send(\n new UpdateCommand({\n TableName: queriesTable,\n Key: { pk: request.connectionId, sk: request.subscriptionId },\n UpdateExpression:\n 'SET #status = :cancelled, updatedAt = :updatedAt REMOVE pendingDelivery',\n ConditionExpression:\n '#generation = :generation AND registrationId = :registrationId',\n ExpressionAttributeNames: {\n '#status': 'status',\n '#generation': 'generation',\n },\n ExpressionAttributeValues: {\n ':cancelled': 'cancelled',\n ':generation': request.generation,\n ':registrationId': request.registrationId,\n ':updatedAt': Date.now(),\n },\n }),\n );\n\n await Promise.all(\n query.dependencies.map(async (key) => {\n try {\n await docClient.send(\n new DeleteCommand({\n TableName: dependenciesTable,\n Key: {\n pk: key,\n sk: `${request.connectionId}#${request.subscriptionId}`,\n },\n ConditionExpression: '#generation = :generation',\n ExpressionAttributeNames: { '#generation': 'generation' },\n ExpressionAttributeValues: { ':generation': request.generation },\n }),\n );\n } catch (error) {\n if (\n !(error instanceof Error) ||\n error.name !== 'ConditionalCheckFailedException'\n ) {\n throw error;\n }\n }\n }),\n );\n return { type: 'result', data: { success: true } };\n }\n\n async function handleCall(\n request: CallRequest,\n context: TContext & { db: DatabaseContext },\n ): Promise<ResultResponse> {\n const procedure = config.router.getProcedure(request.path);\n if (!procedure) throw requestError(`Procedure not found: ${request.path}`, 404);\n if (procedure.type !== 'mutation') {\n throw requestError('Call requests require a mutation procedure', 400);\n }\n return {\n type: 'result',\n data: await config.router.execute(request.path, context, request.input),\n };\n }\n\n async function registerConnection(\n connectionId: string,\n context?: Record<string, unknown>,\n ): Promise<void> {\n validateKeyString(\n 'connectionId',\n connectionId,\n DYNAMODB_PARTITION_KEY_MAX_BYTES,\n );\n const now = Date.now();\n await docClient.send(\n new PutCommand({\n TableName: connectionsTable,\n Item: {\n connectionId,\n status: 'open',\n context,\n connectedAt: now,\n ttl: Math.floor(now / 1000) + ttlSeconds,\n } satisfies ConnectionEntry,\n }),\n );\n }\n\n async function unregisterConnection(connectionId: string): Promise<void> {\n validateKeyString(\n 'connectionId',\n connectionId,\n DYNAMODB_PARTITION_KEY_MAX_BYTES,\n );\n await docClient.send(\n new UpdateCommand({\n TableName: connectionsTable,\n Key: { connectionId },\n UpdateExpression: 'SET #status = :closed',\n ConditionExpression: 'attribute_exists(connectionId)',\n ExpressionAttributeNames: { '#status': 'status' },\n ExpressionAttributeValues: { ':closed': 'closed' },\n }),\n );\n\n let lastKey: Record<string, unknown> | undefined;\n do {\n const response = await docClient.send(\n new QueryCommand({\n TableName: queriesTable,\n KeyConditionExpression: 'pk = :pk',\n ExpressionAttributeValues: { ':pk': connectionId },\n ConsistentRead: true,\n ExclusiveStartKey: lastKey,\n }),\n );\n for (const item of response.Items ?? []) {\n const query = item as QueryEntry;\n await handleUnsubscribe({\n type: 'unsubscribe',\n connectionId,\n subscriptionId: query.subscriptionId,\n generation: query.generation,\n registrationId: query.registrationId,\n });\n }\n lastKey = response.LastEvaluatedKey;\n } while (lastKey);\n\n debug('[reactive-handler] Connection unregistered');\n }\n\n async function query<T = unknown>(\n path: string,\n input?: unknown,\n headers?: Record<string, string>,\n ): Promise<T> {\n const procedure = config.router.getProcedure(path);\n if (!procedure) throw requestError(`Procedure not found: ${path}`, 404);\n if (procedure.type !== 'query') {\n throw requestError('One-time query requests require a query procedure', 400);\n }\n const context = await config.getContext({ connectionId: 'query', headers });\n const db = createDbContext(dbConfig);\n return config.router.execute(\n path,\n { ...context, db } as TContext & { db: DatabaseContext },\n input,\n ) as Promise<T>;\n }\n\n function createCaller(): RouterCaller<TRouter> {\n function buildProxy(path: string[] = []): unknown {\n return new Proxy(() => undefined, {\n get(_target, property: string) {\n return buildProxy([...path, property]);\n },\n apply(_target, _thisArg, args: unknown[]) {\n return query(path.join('.'), args[0]);\n },\n });\n }\n return buildProxy() as RouterCaller<TRouter>;\n }\n\n return {\n handleRequest,\n registerConnection,\n unregisterConnection,\n query,\n createCaller,\n };\n}\n","import type { JsonPatch } from '@dynamodb-reactive/core';\nimport jsonpatch from 'fast-json-patch';\n\nconst { compare } = jsonpatch;\n\n/**\n * Generate JSON patches between two objects\n * Uses RFC 6902 JSON Patch format\n */\nexport function generatePatches(\n oldValue: unknown,\n newValue: unknown,\n): JsonPatch[] {\n const operations = compare(\n oldValue as Record<string, unknown>,\n newValue as Record<string, unknown>,\n );\n\n return operations.map((op) => ({\n op: op.op as JsonPatch['op'],\n path: op.path,\n ...('value' in op ? { value: op.value } : {}),\n ...('from' in op ? { from: op.from } : {}),\n }));\n}\n","import {\n ApiGatewayManagementApiClient,\n GoneException,\n PostToConnectionCommand,\n} from '@aws-sdk/client-apigatewaymanagementapi';\nimport type { DynamoDBClient } from '@aws-sdk/client-dynamodb';\nimport type { DynamoDBDocumentClient } from '@aws-sdk/lib-dynamodb';\nimport {\n DeleteCommand,\n GetCommand,\n QueryCommand,\n UpdateCommand,\n} from '@aws-sdk/lib-dynamodb';\nimport type {\n PendingDelivery,\n QueryEntry,\n QueryMetadata,\n} from '@dynamodb-reactive/core';\nimport { randomUUID } from 'node:crypto';\nimport type { DynamoDBRecord } from 'aws-lambda';\n\nimport { info } from '../log.js';\nimport { generatePatches } from '../patcher.js';\nimport { executeQueryMetadata } from '../query-metadata.js';\n\nconst MAX_PATCH_MESSAGE_BYTES = 30 * 1024;\nconst MAX_QUERY_ENTRY_BYTES = 300 * 1024;\nconst MAX_PROCESS_ATTEMPTS = 4;\nconst REGISTRATION_WINDOW_MS = 60 * 1000;\n\nclass RetryableSubscriptionError extends Error {\n constructor(message: string) {\n super(message);\n this.name = 'RetryableSubscriptionError';\n }\n}\n\nexport function extractTableName(record: DynamoDBRecord): string | null {\n const match = record.eventSourceARN?.match(/table\\/([^/]+)/);\n return match?.[1] ?? null;\n}\n\nexport interface StreamUtilsConfig {\n ddbClient: DynamoDBClient;\n docClient: DynamoDBDocumentClient;\n apiClient?: ApiGatewayManagementApiClient;\n apiGatewayEndpoint: string;\n connectionsTable: string;\n dependenciesTable: string;\n queriesTable: string;\n}\n\nfunction isConditionalFailure(error: unknown): boolean {\n return (\n error instanceof Error && error.name === 'ConditionalCheckFailedException'\n );\n}\n\nexport function createStreamUtils(config: StreamUtilsConfig) {\n const {\n ddbClient,\n docClient,\n connectionsTable,\n dependenciesTable,\n queriesTable,\n } = config;\n let apiClient = config.apiClient;\n\n function getApiClient(): ApiGatewayManagementApiClient {\n apiClient ??= new ApiGatewayManagementApiClient({\n endpoint: config.apiGatewayEndpoint,\n });\n return apiClient;\n }\n\n async function findAffectedSubscriptions(\n dependencyKey: string,\n ): Promise<{ connectionId: string; subscriptionId: string }[]> {\n const subscriptions: {\n connectionId: string;\n subscriptionId: string;\n }[] = [];\n let lastKey: Record<string, unknown> | undefined;\n do {\n const response = await docClient.send(\n new QueryCommand({\n TableName: dependenciesTable,\n KeyConditionExpression: 'pk = :pk',\n ExpressionAttributeValues: { ':pk': dependencyKey },\n ConsistentRead: true,\n ExclusiveStartKey: lastKey,\n }),\n );\n subscriptions.push(\n ...(response.Items ?? []).map((item) => ({\n connectionId: item.connectionId as string,\n subscriptionId: item.subscriptionId as string,\n })),\n );\n lastKey = response.LastEvaluatedKey;\n } while (lastKey);\n return subscriptions;\n }\n\n async function executeQueryFromMetadata(\n metadata: QueryMetadata,\n ): Promise<unknown[]> {\n return executeQueryMetadata(ddbClient, metadata);\n }\n\n function deliveryMessage(\n query: QueryEntry,\n delivery: PendingDelivery,\n ): Record<string, unknown> {\n return {\n type: delivery.type,\n subscriptionId: query.subscriptionId,\n generation: delivery.generation,\n fromVersion: delivery.fromVersion,\n toVersion: delivery.toVersion,\n messageId: delivery.messageId,\n ...(delivery.type === 'patch'\n ? { patches: delivery.patches }\n : {}),\n };\n }\n\n async function sendDelivery(\n query: QueryEntry,\n delivery: PendingDelivery,\n ): Promise<void> {\n await getApiClient().send(\n new PostToConnectionCommand({\n ConnectionId: query.connectionId,\n Data: Buffer.from(JSON.stringify(deliveryMessage(query, delivery))),\n }),\n );\n }\n\n async function clearDelivery(\n query: QueryEntry,\n delivery: PendingDelivery,\n ): Promise<void> {\n try {\n await docClient.send(\n new UpdateCommand({\n TableName: queriesTable,\n Key: { pk: query.pk, sk: query.sk },\n UpdateExpression: 'REMOVE pendingDelivery',\n ConditionExpression:\n '#status = :status AND #generation = :generation AND registrationId = :registrationId AND pendingDelivery.messageId = :messageId',\n ExpressionAttributeNames: {\n '#status': 'status',\n '#generation': 'generation',\n },\n ExpressionAttributeValues: {\n ':status': query.status,\n ':generation': query.generation,\n ':registrationId': query.registrationId,\n ':messageId': delivery.messageId,\n },\n }),\n );\n } catch (error) {\n if (!isConditionalFailure(error)) throw error;\n }\n }\n\n async function cleanupSubscriptionDependencies(query: QueryEntry): Promise<void> {\n await Promise.all(\n query.dependencies.map(async (dependency) => {\n try {\n await docClient.send(\n new DeleteCommand({\n TableName: dependenciesTable,\n Key: {\n pk: dependency,\n sk: `${query.connectionId}#${query.subscriptionId}`,\n },\n ConditionExpression:\n '#generation = :generation AND registrationId = :registrationId',\n ExpressionAttributeNames: { '#generation': 'generation' },\n ExpressionAttributeValues: {\n ':generation': query.generation,\n ':registrationId': query.registrationId,\n },\n }),\n );\n } catch (error) {\n if (!isConditionalFailure(error)) throw error;\n }\n }),\n );\n }\n\n async function processSubscription(\n connectionId: string,\n subscriptionId: string,\n ): Promise<void> {\n try {\n for (let attempt = 0; attempt < MAX_PROCESS_ATTEMPTS; attempt++) {\n const response = await docClient.send(\n new GetCommand({\n TableName: queriesTable,\n Key: { pk: connectionId, sk: subscriptionId },\n ConsistentRead: true,\n }),\n );\n const query = response.Item as QueryEntry | undefined;\n if (!query || query.status === 'cancelled') {\n return;\n }\n if (query.pendingDelivery) {\n await sendDelivery(query, query.pendingDelivery);\n await clearDelivery(query, query.pendingDelivery);\n if (query.status === 'faulted') {\n await cleanupSubscriptionDependencies(query);\n return;\n }\n continue;\n }\n if (query.status === 'faulted') {\n await cleanupSubscriptionDependencies(query);\n return;\n }\n if (query.status === 'registering') {\n if (query.createdAt <= Date.now() - REGISTRATION_WINDOW_MS) {\n try {\n await docClient.send(\n new UpdateCommand({\n TableName: queriesTable,\n Key: { pk: query.pk, sk: query.sk },\n UpdateExpression:\n 'SET #status = :faulted, updatedAt = :updatedAt',\n ConditionExpression:\n '#status = :registering AND #generation = :generation AND registrationId = :registrationId AND createdAt = :createdAt AND createdAt <= :registrationCutoff',\n ExpressionAttributeNames: {\n '#status': 'status',\n '#generation': 'generation',\n },\n ExpressionAttributeValues: {\n ':faulted': 'faulted',\n ':registering': 'registering',\n ':generation': query.generation,\n ':registrationId': query.registrationId,\n ':createdAt': query.createdAt,\n ':registrationCutoff': Date.now() - REGISTRATION_WINDOW_MS,\n ':updatedAt': Date.now(),\n },\n }),\n );\n return;\n } catch (error) {\n if (isConditionalFailure(error)) continue;\n throw error;\n }\n }\n throw new RetryableSubscriptionError(\n `Subscription ${connectionId}/${subscriptionId} is still registering`,\n );\n }\n\n const newResult = await executeQueryFromMetadata(query.queryMetadata);\n const patches = generatePatches(query.lastResult, newResult);\n if (patches.length === 0) return;\n const fromVersion = query.version;\n const toVersion = fromVersion + 1;\n const patchDelivery: PendingDelivery = {\n type: 'patch',\n generation: query.generation,\n fromVersion,\n toVersion,\n messageId: randomUUID(),\n patches,\n };\n const pendingDelivery: PendingDelivery =\n Buffer.byteLength(\n JSON.stringify(deliveryMessage(query, patchDelivery)),\n 'utf8',\n ) > MAX_PATCH_MESSAGE_BYTES\n ? {\n type: 'resync',\n generation: query.generation,\n fromVersion,\n toVersion,\n messageId: patchDelivery.messageId,\n }\n : patchDelivery;\n\n const persisted = {\n ...query,\n lastResult: newResult,\n version: toVersion,\n pendingDelivery,\n };\n if (\n Buffer.byteLength(JSON.stringify(persisted), 'utf8') >\n MAX_QUERY_ENTRY_BYTES\n ) {\n const faultDelivery: PendingDelivery = {\n type: 'resync',\n generation: query.generation,\n fromVersion,\n toVersion,\n messageId: pendingDelivery.messageId,\n };\n try {\n await docClient.send(\n new UpdateCommand({\n TableName: queriesTable,\n Key: { pk: query.pk, sk: query.sk },\n UpdateExpression:\n 'SET #status = :faulted, pendingDelivery = :pendingDelivery, updatedAt = :updatedAt',\n ConditionExpression:\n '#status = :active AND #generation = :generation AND registrationId = :registrationId AND #version = :fromVersion AND attribute_not_exists(pendingDelivery)',\n ExpressionAttributeNames: {\n '#status': 'status',\n '#generation': 'generation',\n '#version': 'version',\n },\n ExpressionAttributeValues: {\n ':active': 'active',\n ':faulted': 'faulted',\n ':generation': query.generation,\n ':registrationId': query.registrationId,\n ':fromVersion': fromVersion,\n ':pendingDelivery': faultDelivery,\n ':updatedAt': Date.now(),\n },\n }),\n );\n } catch (error) {\n if (isConditionalFailure(error)) {\n throw new RetryableSubscriptionError(\n `Subscription ${connectionId}/${subscriptionId} changed concurrently`,\n );\n }\n throw error;\n }\n continue;\n }\n\n try {\n await docClient.send(\n new UpdateCommand({\n TableName: queriesTable,\n Key: { pk: query.pk, sk: query.sk },\n UpdateExpression:\n 'SET lastResult = :lastResult, #version = :toVersion, pendingDelivery = :pendingDelivery, updatedAt = :updatedAt',\n ConditionExpression:\n '#status = :active AND #generation = :generation AND registrationId = :registrationId AND #version = :fromVersion AND attribute_not_exists(pendingDelivery)',\n ExpressionAttributeNames: {\n '#status': 'status',\n '#generation': 'generation',\n '#version': 'version',\n },\n ExpressionAttributeValues: {\n ':active': 'active',\n ':generation': query.generation,\n ':registrationId': query.registrationId,\n ':fromVersion': fromVersion,\n ':toVersion': toVersion,\n ':lastResult': newResult,\n ':pendingDelivery': pendingDelivery,\n ':updatedAt': Date.now(),\n },\n }),\n );\n } catch (error) {\n if (isConditionalFailure(error)) {\n throw new RetryableSubscriptionError(\n `Subscription ${connectionId}/${subscriptionId} changed concurrently`,\n );\n }\n throw error;\n }\n\n await sendDelivery(query, pendingDelivery);\n await clearDelivery(query, pendingDelivery);\n info('[stream] Delivery completed');\n return;\n }\n throw new RetryableSubscriptionError(\n `Subscription ${connectionId}/${subscriptionId} delivery did not settle`,\n );\n } catch (error) {\n if (error instanceof GoneException) {\n await cleanupConnection(connectionId);\n return;\n }\n throw error;\n }\n }\n\n async function cleanupConnection(connectionId: string): Promise<void> {\n try {\n await docClient.send(\n new UpdateCommand({\n TableName: connectionsTable,\n Key: { connectionId },\n UpdateExpression: 'SET #status = :closed',\n ConditionExpression: 'attribute_exists(connectionId)',\n ExpressionAttributeNames: { '#status': 'status' },\n ExpressionAttributeValues: { ':closed': 'closed' },\n }),\n );\n } catch (error) {\n if (!isConditionalFailure(error)) throw error;\n }\n\n let lastKey: Record<string, unknown> | undefined;\n do {\n const response = await docClient.send(\n new QueryCommand({\n TableName: queriesTable,\n KeyConditionExpression: 'pk = :pk',\n ExpressionAttributeValues: { ':pk': connectionId },\n ConsistentRead: true,\n ExclusiveStartKey: lastKey,\n }),\n );\n for (const item of response.Items ?? []) {\n const query = item as QueryEntry;\n if (query.status !== 'cancelled') {\n try {\n await docClient.send(\n new UpdateCommand({\n TableName: queriesTable,\n Key: { pk: query.pk, sk: query.sk },\n UpdateExpression:\n 'SET #status = :cancelled, updatedAt = :updatedAt REMOVE pendingDelivery',\n ConditionExpression:\n '#generation = :generation AND registrationId = :registrationId',\n ExpressionAttributeNames: {\n '#status': 'status',\n '#generation': 'generation',\n },\n ExpressionAttributeValues: {\n ':cancelled': 'cancelled',\n ':generation': query.generation,\n ':registrationId': query.registrationId,\n ':updatedAt': Date.now(),\n },\n }),\n );\n } catch (error) {\n if (!isConditionalFailure(error)) throw error;\n continue;\n }\n }\n await cleanupSubscriptionDependencies(query);\n }\n lastKey = response.LastEvaluatedKey;\n } while (lastKey);\n }\n\n return {\n findAffectedSubscriptions,\n executeQueryFromMetadata,\n sendDelivery,\n processSubscription,\n cleanupConnection,\n };\n}\n\nexport type StreamUtils = ReturnType<typeof createStreamUtils>;\n","import type { ApiGatewayManagementApiClient } from '@aws-sdk/client-apigatewaymanagementapi';\nimport { type AttributeValue, DynamoDBClient } from '@aws-sdk/client-dynamodb';\nimport { DynamoDBDocumentClient, PutCommand } from '@aws-sdk/lib-dynamodb';\nimport { unmarshall } from '@aws-sdk/util-dynamodb';\nimport type { ConnectionEntry } from '@dynamodb-reactive/core';\nimport type {\n DynamoDBBatchResponse,\n DynamoDBRecord,\n DynamoDBStreamEvent,\n} from 'aws-lambda';\n\nimport type { DbContextConfig } from '../db-context.js';\nimport { extractAffectedKeys } from '../dependency-extractor.js';\nimport { debug, error as logError } from '../log.js';\nimport { DEFAULT_CONNECTION_LEASE_SECONDS } from './reactive-handler.js';\nimport {\n createStreamUtils,\n extractTableName,\n type StreamUtils,\n} from './stream-utils.js';\n\ninterface StreamHandlerConfig {\n dbConfig?: DbContextConfig;\n apiClient?: ApiGatewayManagementApiClient;\n apiGatewayEndpoint: string;\n connectionsTableName: string;\n dependenciesTableName: string;\n queriesTableName: string;\n}\n\nconst MAX_FANOUT_CONCURRENCY = 10;\nconst DYNAMODB_PARTITION_KEY_MAX_BYTES = 2048;\n\nfunction assertConnectionId(connectionId: unknown): asserts connectionId is string {\n if (\n typeof connectionId !== 'string' ||\n connectionId.length === 0 ||\n Buffer.byteLength(connectionId, 'utf8') > DYNAMODB_PARTITION_KEY_MAX_BYTES\n ) {\n throw new Error('connectionId is not a valid DynamoDB partition key');\n }\n}\n\nasync function mapWithConcurrency<T, TResult>(\n values: readonly T[],\n concurrency: number,\n mapper: (value: T, index: number) => Promise<TResult>,\n): Promise<TResult[]> {\n const results = new Array<TResult>(values.length);\n let nextIndex = 0;\n const workers = Array.from(\n { length: Math.min(concurrency, values.length) },\n async () => {\n while (nextIndex < values.length) {\n const index = nextIndex++;\n results[index] = await mapper(values[index], index);\n }\n },\n );\n await Promise.all(workers);\n return results;\n}\n\nasync function processRecord(\n record: DynamoDBRecord,\n utils: StreamUtils,\n): Promise<void> {\n const tableName = extractTableName(record);\n if (!tableName || !record.dynamodb) {\n throw new Error('Malformed DynamoDB stream record');\n }\n const affectedKeys = new Set(extractAffectedKeys(tableName, {}));\n for (const image of [record.dynamodb.NewImage, record.dynamodb.OldImage]) {\n if (!image) continue;\n const item = unmarshall(image as Record<string, AttributeValue>);\n for (const key of extractAffectedKeys(tableName, item)) affectedKeys.add(key);\n }\n\n const subscriptions = new Map<string, { connectionId: string; subscriptionId: string }>();\n const lookupResults = await mapWithConcurrency(\n [...affectedKeys],\n MAX_FANOUT_CONCURRENCY,\n (key) => utils.findAffectedSubscriptions(key),\n );\n for (const result of lookupResults) {\n for (const subscription of result) {\n subscriptions.set(\n `${subscription.connectionId}\\0${subscription.subscriptionId}`,\n subscription,\n );\n }\n }\n await mapWithConcurrency(\n [...subscriptions.values()],\n MAX_FANOUT_CONCURRENCY,\n ({ connectionId, subscriptionId }) =>\n utils.processSubscription(connectionId, subscriptionId),\n );\n}\n\nexport async function processStreamEvent(\n event: DynamoDBStreamEvent,\n utils: StreamUtils,\n): Promise<DynamoDBBatchResponse> {\n const results = await mapWithConcurrency(\n event.Records,\n MAX_FANOUT_CONCURRENCY,\n async (record) => {\n try {\n await processRecord(record, utils);\n return null;\n } catch (error) {\n logError('[stream] Record failed:', error);\n const itemIdentifier = record.dynamodb?.SequenceNumber;\n if (!itemIdentifier) {\n throw new Error(\n 'Failed DynamoDB stream record has no sequence number',\n { cause: error },\n );\n }\n return {\n itemIdentifier,\n };\n }\n },\n );\n return {\n batchItemFailures: results.filter(\n (failure): failure is { itemIdentifier: string } => failure !== null,\n ),\n };\n}\n\nfunction clients(config: Pick<StreamHandlerConfig, 'dbConfig'>): {\n ddbClient: DynamoDBClient;\n docClient: DynamoDBDocumentClient;\n} {\n const ddbClient =\n config.dbConfig?.client ??\n new DynamoDBClient({\n region: config.dbConfig?.region ?? process.env.AWS_REGION,\n endpoint: config.dbConfig?.endpoint,\n });\n const docClient =\n config.dbConfig?.docClient ??\n DynamoDBDocumentClient.from(ddbClient, {\n marshallOptions: { removeUndefinedValues: true },\n });\n return { ddbClient, docClient };\n}\n\nexport function createConnectHandler(\n config: Pick<StreamHandlerConfig, 'dbConfig' | 'connectionsTableName'>,\n) {\n const connectionsTable = config.connectionsTableName;\n const { docClient } = clients(config);\n\n return async function handler(event: {\n requestContext: {\n connectionId: string;\n authorizer?: Record<string, unknown>;\n identity?: Record<string, unknown>;\n };\n }): Promise<{ statusCode: number }> {\n const connectionId = event.requestContext.connectionId;\n const now = Date.now();\n try {\n assertConnectionId(connectionId);\n const authorizerContext = jsonSafeRecord(event.requestContext.authorizer);\n const requestIdentity = jsonSafeRecord(event.requestContext.identity);\n const connectionEntry: ConnectionEntry = {\n connectionId,\n status: 'open',\n ...(authorizerContext ? { authorizerContext } : {}),\n ...(requestIdentity ? { requestIdentity } : {}),\n connectedAt: now,\n ttl: Math.floor(now / 1000) + DEFAULT_CONNECTION_LEASE_SECONDS,\n };\n await docClient.send(\n new PutCommand({ TableName: connectionsTable, Item: connectionEntry }),\n );\n debug('[stream] Connection established');\n return { statusCode: 200 };\n } catch (error) {\n logError('Error creating connection:', error);\n return { statusCode: 500 };\n }\n };\n}\n\nfunction jsonSafeRecord(value: unknown): Record<string, unknown> | undefined {\n if (!value || typeof value !== 'object' || Array.isArray(value)) return undefined;\n try {\n const encoded = JSON.stringify(value, (_key, item: unknown) => {\n if (typeof item === 'bigint') return item.toString();\n if (\n typeof item === 'function' ||\n typeof item === 'symbol' ||\n item === undefined\n ) {\n return undefined;\n }\n return item;\n });\n if (!encoded) return undefined;\n return JSON.parse(encoded) as Record<string, unknown>;\n } catch {\n return undefined;\n }\n}\n\nexport function createDisconnectHandler(\n config: Pick<\n StreamHandlerConfig,\n | 'dbConfig'\n | 'apiClient'\n | 'connectionsTableName'\n | 'queriesTableName'\n | 'dependenciesTableName'\n | 'apiGatewayEndpoint'\n >,\n) {\n const connectionsTable = config.connectionsTableName;\n const dependenciesTable = config.dependenciesTableName;\n const queriesTable = config.queriesTableName;\n const { ddbClient, docClient } = clients(config);\n const utils = createStreamUtils({\n ddbClient,\n docClient,\n apiClient: config.apiClient,\n apiGatewayEndpoint: config.apiGatewayEndpoint,\n connectionsTable,\n dependenciesTable,\n queriesTable,\n });\n\n return async function handler(event: {\n requestContext: { connectionId: string };\n }): Promise<{ statusCode: number }> {\n try {\n const connectionId = event.requestContext.connectionId;\n assertConnectionId(connectionId);\n await utils.cleanupConnection(connectionId);\n return { statusCode: 200 };\n } catch (error) {\n logError('Error removing connection:', error);\n return { statusCode: 500 };\n }\n };\n}\n","import {\n ApiGatewayManagementApiClient,\n PostToConnectionCommand,\n} from '@aws-sdk/client-apigatewaymanagementapi';\nimport { DynamoDBClient } from '@aws-sdk/client-dynamodb';\nimport {\n DynamoDBDocumentClient,\n UpdateCommand,\n} from '@aws-sdk/lib-dynamodb';\nimport type {\n APIGatewayProxyEvent,\n APIGatewayProxyResult,\n DynamoDBStreamEvent,\n} from 'aws-lambda';\n\nimport type { DbContextConfig } from '../db-context.js';\nimport { error as logError } from '../log.js';\nimport {\n createConnectHandler,\n createDisconnectHandler,\n processStreamEvent,\n} from './stream-handler.js';\nimport { createStreamUtils } from './stream-utils.js';\nimport { DEFAULT_CONNECTION_LEASE_SECONDS } from './reactive-handler.js';\n\nexport interface LambdaHandlersConfig {\n dbConfig?: DbContextConfig;\n apiClient?: ApiGatewayManagementApiClient;\n connectionsTableName?: string;\n dependenciesTableName?: string;\n queriesTableName?: string;\n apiGatewayEndpoint?: string;\n}\n\nfunction requiredTableName(\n configured: string | undefined,\n environmentName: 'CONNECTIONS_TABLE' | 'DEPENDENCIES_TABLE' | 'QUERIES_TABLE',\n): string {\n const value = configured ?? process.env[environmentName];\n if (!value) throw new Error(`${environmentName} must name a system table`);\n return value;\n}\n\nfunction assertRequestKey(name: string, value: unknown, maxBytes: number): string {\n if (\n typeof value !== 'string' ||\n value.length === 0 ||\n Buffer.byteLength(value, 'utf8') > maxBytes\n ) {\n throw new Error(`${name} is not a valid DynamoDB key`);\n }\n return value;\n}\n\nexport function createLambdaHandlers(config: LambdaHandlersConfig = {}) {\n const connectionsTable = requiredTableName(\n config.connectionsTableName,\n 'CONNECTIONS_TABLE',\n );\n const dependenciesTable = requiredTableName(\n config.dependenciesTableName,\n 'DEPENDENCIES_TABLE',\n );\n const queriesTable = requiredTableName(\n config.queriesTableName,\n 'QUERIES_TABLE',\n );\n const apiGatewayEndpoint =\n config.apiGatewayEndpoint ?? process.env.WEBSOCKET_ENDPOINT ?? '';\n const ddbClient =\n config.dbConfig?.client ??\n new DynamoDBClient({\n region: config.dbConfig?.region ?? process.env.AWS_REGION,\n endpoint: config.dbConfig?.endpoint,\n });\n const docClient =\n config.dbConfig?.docClient ??\n DynamoDBDocumentClient.from(ddbClient, {\n marshallOptions: { removeUndefinedValues: true },\n });\n const apiClient =\n config.apiClient ??\n new ApiGatewayManagementApiClient({ endpoint: apiGatewayEndpoint });\n const sharedConfig = {\n dbConfig: { ...config.dbConfig, client: ddbClient, docClient },\n apiClient,\n apiGatewayEndpoint,\n connectionsTableName: connectionsTable,\n dependenciesTableName: dependenciesTable,\n queriesTableName: queriesTable,\n };\n const connect = createConnectHandler(sharedConfig);\n const disconnect = createDisconnectHandler(sharedConfig);\n const streamUtils = createStreamUtils({\n ddbClient,\n docClient,\n apiClient,\n apiGatewayEndpoint,\n connectionsTable,\n dependenciesTable,\n queriesTable,\n });\n\n async function connectHandler(\n event: APIGatewayProxyEvent,\n ): Promise<APIGatewayProxyResult> {\n const result = await connect({\n requestContext: {\n connectionId: event.requestContext.connectionId!,\n authorizer: event.requestContext.authorizer as\n | Record<string, unknown>\n | undefined,\n identity: event.requestContext.identity as unknown as\n | Record<string, unknown>\n | undefined,\n },\n });\n return {\n statusCode: result.statusCode,\n body: result.statusCode === 200 ? 'Connected' : 'Failed to connect',\n };\n }\n\n async function disconnectHandler(\n event: APIGatewayProxyEvent,\n ): Promise<APIGatewayProxyResult> {\n const result = await disconnect({\n requestContext: { connectionId: event.requestContext.connectionId! },\n });\n return {\n statusCode: result.statusCode,\n body: result.statusCode === 200 ? 'Disconnected' : 'Failed to disconnect',\n };\n }\n\n async function messageHandler(\n event: APIGatewayProxyEvent,\n ): Promise<APIGatewayProxyResult> {\n const connectionId = event.requestContext.connectionId!;\n try {\n assertRequestKey('connectionId', connectionId, 2048);\n const body = JSON.parse(event.body ?? '{}') as Record<string, unknown>;\n let response: unknown;\n if (body.type === 'init') {\n response = { type: 'connected', connectionId };\n } else if (body.type === 'ping') {\n const now = Math.floor(Date.now() / 1000);\n await docClient.send(\n new UpdateCommand({\n TableName: connectionsTable,\n Key: { connectionId },\n UpdateExpression: 'SET #ttl = :ttl',\n ConditionExpression: '#status = :open AND #ttl > :now',\n ExpressionAttributeNames: { '#status': 'status', '#ttl': 'ttl' },\n ExpressionAttributeValues: {\n ':open': 'open',\n ':now': now,\n ':ttl': now + DEFAULT_CONNECTION_LEASE_SECONDS,\n },\n }),\n );\n response = { type: 'pong' };\n } else {\n response = {\n type: 'error',\n message: 'Unsupported WebSocket message type',\n };\n }\n\n await apiClient.send(\n new PostToConnectionCommand({\n ConnectionId: connectionId,\n Data: Buffer.from(JSON.stringify(response)),\n }),\n );\n return { statusCode: 200, body: 'OK' };\n } catch (error) {\n logError('Error handling message:', error);\n return { statusCode: 500, body: 'Internal server error' };\n }\n }\n\n async function streamHandler(event: DynamoDBStreamEvent) {\n return processStreamEvent(event, streamUtils);\n }\n\n return { connectHandler, disconnectHandler, messageHandler, streamHandler };\n}\n"]}
|