dynamodb-reactive 0.1.22 → 0.2.2
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 +437 -153
- package/dist/client-r_tnzwqi.d.ts +224 -0
- package/dist/client.cjs +1023 -0
- package/dist/client.cjs.map +1 -0
- package/dist/client.d.cts +6 -0
- package/dist/client.d.ts +4 -70
- package/dist/client.js +1013 -1
- package/dist/client.js.map +1 -1
- package/dist/core.cjs +232 -0
- package/dist/core.cjs.map +1 -0
- package/dist/core.d.cts +4 -0
- package/dist/core.d.ts +3 -3
- package/dist/core.js +222 -1
- package/dist/core.js.map +1 -1
- package/dist/index.cjs +232 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +157 -0
- package/dist/index.d.ts +103 -56
- package/dist/index.js +222 -1
- package/dist/index.js.map +1 -1
- package/dist/infra.cjs +634 -0
- package/dist/infra.cjs.map +1 -0
- package/dist/infra.d.cts +126 -0
- package/dist/infra.d.ts +57 -102
- package/dist/infra.js +385 -147
- package/dist/infra.js.map +1 -1
- package/dist/react.cjs +1250 -0
- package/dist/react.cjs.map +1 -0
- package/dist/react.d.cts +68 -0
- package/dist/react.d.ts +68 -3
- package/dist/react.js +1237 -1
- package/dist/react.js.map +1 -1
- package/dist/server.cjs +2382 -0
- package/dist/server.cjs.map +1 -0
- package/dist/server.d.cts +364 -0
- package/dist/server.d.ts +58 -313
- package/dist/server.js +1882 -1204
- package/dist/server.js.map +1 -1
- package/dist/{table-tN3D4Tm-.d.ts → table-BijJ73pX.d.ts} +2 -34
- package/dist/{types-ISMJfyIv.d.ts → types-LMLk8JVC.d.ts} +56 -30
- package/package.json +79 -41
- package/dist/chunk-2KC44Q5I.js +0 -1103
- package/dist/chunk-2KC44Q5I.js.map +0 -1
- package/dist/chunk-ZAJA4KBE.js +0 -150
- package/dist/chunk-ZAJA4KBE.js.map +0 -1
- package/dist/react-D_NLHuuO.d.ts +0 -556
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../server/src/procedure.ts","../../server/src/router.ts","../../server/src/reactive.ts","../../server/src/partiql-builder.ts","../../server/src/query-builder.ts","../../server/src/db-context.ts","../../server/src/dependency-extractor.ts","../../server/src/patcher.ts","../../server/src/handlers/reactive-handler.ts","../../server/src/handlers/stream-utils.ts","../../server/src/handlers/stream-handler.ts","../../server/src/handlers/lambda-handlers.ts","../../server/src/filter-evaluator.ts"],"names":["DynamoDBClient","DynamoDBDocumentClient","PutCommand","GetCommand","DeleteCommand","QueryCommand","error","logError","ExecuteStatementCommand","unmarshall","warn","info","debug","ApiGatewayManagementApiClient","PostToConnectionCommand"],"mappings":"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","file":"server.js","sourcesContent":["import type { z } from 'zod';\n\nimport type { DatabaseContext, ProcedureDefinition } from './types.js';\n\n/**\n * Procedure builder for creating type-safe procedures\n */\nexport class ProcedureBuilder<\n TContext,\n TInput extends z.ZodType = z.ZodUndefined,\n> {\n private inputSchema?: TInput;\n\n constructor(inputSchema?: TInput) {\n this.inputSchema = inputSchema;\n }\n\n /**\n * Define the input schema for the procedure\n */\n input<TNewInput extends z.ZodType>(\n schema: TNewInput,\n ): ProcedureBuilder<TContext, TNewInput> {\n return new ProcedureBuilder<TContext, TNewInput>(schema);\n }\n\n /**\n * Define a query procedure (read-only operation)\n */\n query<TOutput>(\n resolver: (opts: {\n ctx: TContext & { db: DatabaseContext };\n input: z.infer<TInput>;\n }) => Promise<TOutput> | TOutput,\n ): ProcedureDefinition<TContext, TInput, TOutput> {\n return {\n type: 'query',\n inputSchema: this.inputSchema,\n resolver,\n };\n }\n\n /**\n * Define a mutation procedure (write operation)\n */\n mutation<TOutput>(\n resolver: (opts: {\n ctx: TContext & { db: DatabaseContext };\n input: z.infer<TInput>;\n }) => Promise<TOutput> | TOutput,\n ): ProcedureDefinition<TContext, TInput, TOutput> {\n return {\n type: 'mutation',\n inputSchema: this.inputSchema,\n resolver,\n };\n }\n}\n\n/**\n * Check if a value is a procedure definition\n */\nexport function isProcedure(\n value: unknown,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any -- type guard requires `any` for variance compatibility\n): value is ProcedureDefinition<any, any, any> {\n return (\n typeof value === 'object' &&\n value !== null &&\n 'type' in value &&\n 'resolver' in value &&\n (value.type === 'query' || value.type === 'mutation')\n );\n}\n\n/**\n * Execute a procedure with the given context and input\n */\nexport async function executeProcedure<\n TContext,\n TInput extends z.ZodType,\n TOutput,\n>(\n procedure: ProcedureDefinition<TContext, TInput, TOutput>,\n ctx: TContext & { db: DatabaseContext },\n rawInput: unknown,\n): Promise<TOutput> {\n // Validate input if schema is defined\n let input: z.infer<TInput>;\n if (procedure.inputSchema) {\n const parseResult = procedure.inputSchema.safeParse(rawInput);\n if (!parseResult.success) {\n throw new Error(`Invalid input: ${parseResult.error.message}`);\n }\n input = parseResult.data;\n } else {\n input = rawInput as z.infer<TInput>;\n }\n\n // Execute the resolver\n return procedure.resolver({ ctx, input });\n}\n","import { executeProcedure, isProcedure } from './procedure.js';\nimport type {\n 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 * Get all procedure paths in the router\n */\n getProcedurePaths(): string[] {\n const paths: string[] = [];\n\n function traverse(obj: unknown, prefix: string) {\n if (typeof obj !== 'object' || obj === null) return;\n\n for (const [key, value] of Object.entries(obj)) {\n const path = prefix ? `${prefix}.${key}` : key;\n if (isProcedure(value)) {\n paths.push(path);\n } else {\n traverse(value, path);\n }\n }\n }\n\n traverse(this.definition, '');\n return paths;\n }\n\n /**\n * Check if a path is a query procedure\n */\n isQuery(path: string): boolean {\n const procedure = this.getProcedure(path);\n return procedure?.type === 'query';\n }\n\n /**\n * Check if a path is a mutation procedure\n */\n isMutation(path: string): boolean {\n const procedure = this.getProcedure(path);\n return procedure?.type === 'mutation';\n }\n}\n\n/**\n * Create a router from a definition\n */\nexport function createRouter<\n TContext,\n TRouter extends RouterDefinition<TContext>,\n>(definition: TRouter): Router<TContext, TRouter> {\n return new Router(definition);\n}\n\n/**\n * Merge multiple routers into one\n */\nexport function mergeRouters<TContext>(\n ...routers: Router<TContext, RouterDefinition<TContext>>[]\n): Router<TContext, RouterDefinition<TContext>> {\n const merged: RouterDefinition<TContext> = {};\n\n for (const router of routers) {\n Object.assign(merged, router.definition);\n }\n\n return new Router(merged);\n}\n","import type { z } from 'zod';\n\nimport { ProcedureBuilder } from './procedure.js';\nimport type { Router } from './router.js';\nimport { createRouter } from './router.js';\nimport type { RouterDefinition } from './types.js';\n\n/**\n * ReactiveBuilder - The main builder returned by initReactive\n */\nexport interface ReactiveBuilder<TContext> {\n /**\n * Create a new procedure builder\n */\n procedure: ProcedureBuilder<TContext>;\n\n /**\n * Create a router from procedure definitions\n */\n router<TRouter extends RouterDefinition<TContext>>(\n definition: TRouter,\n ): Router<TContext, TRouter>;\n}\n\n/**\n * Initialize the reactive system with a context type\n *\n * @example\n * ```ts\n * const t = initReactive<{ userId: string }>();\n *\n * export const appRouter = t.router({\n * todos: {\n * list: t.procedure\n * .input(z.object({ taskListId: z.string() }))\n * .query(({ ctx, input }) => {\n * return ctx.db\n * .query(TodoTable)\n * .filter((q) => q.eq(TodoTable.field.taskListId, input.taskListId))\n * .take(50);\n * }),\n * }\n * });\n * ```\n */\nexport function initReactive<\n TContext = Record<string, unknown>,\n>(): ReactiveBuilder<TContext> {\n return {\n procedure: new ProcedureBuilder<TContext>(),\n\n router<TRouter extends RouterDefinition<TContext>>(\n definition: TRouter,\n ): Router<TContext, TRouter> {\n return createRouter(definition);\n },\n };\n}\n\n/**\n * Type helper to infer the router type\n */\nexport type InferRouterType<T> =\n T extends Router<infer TContext, infer TRouter>\n ? { context: TContext; router: TRouter }\n : never;\n\n/**\n * Type helper to get procedure input type\n */\nexport type InferProcedureInput<T> = T extends { inputSchema: infer TSchema }\n ? TSchema extends z.ZodType\n ? z.infer<TSchema>\n : undefined\n : undefined;\n\n/**\n * Type helper to get procedure output type\n */\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 { FilterCondition, TrackedQueryOperation } from './types.js';\n\n/**\n * PartiQL statement with parameters\n */\nexport interface PartiQLStatement {\n statement: string;\n parameters: unknown[];\n}\n\n/**\n * Converts a filter condition to PartiQL WHERE clause\n */\nfunction conditionToPartiQL(\n condition: FilterCondition,\n parameters: unknown[],\n): string {\n switch (condition.type) {\n case 'comparison': {\n parameters.push(condition.value);\n return `\"${condition.field}\" ${condition.operator} ?`;\n }\n\n case 'function': {\n if (condition.operator === 'BETWEEN') {\n parameters.push(condition.value);\n parameters.push(condition.value2);\n return `\"${condition.field}\" BETWEEN ? AND ?`;\n }\n\n if (condition.operator === 'begins_with') {\n parameters.push(condition.value);\n return `begins_with(\"${condition.field}\", ?)`;\n }\n\n if (condition.operator === 'contains') {\n parameters.push(condition.value);\n return `contains(\"${condition.field}\", ?)`;\n }\n\n throw new Error(`Unknown function operator: ${condition.operator}`);\n }\n\n case 'logical': {\n if (!condition.conditions || condition.conditions.length === 0) {\n throw new Error(\n 'Logical condition requires at least one sub-condition',\n );\n }\n\n if (condition.operator === 'NOT') {\n const subClause = conditionToPartiQL(\n condition.conditions[0],\n parameters,\n );\n return `NOT (${subClause})`;\n }\n\n const subClauses = condition.conditions.map((c) =>\n conditionToPartiQL(c, parameters),\n );\n return `(${subClauses.join(` ${condition.operator} `)})`;\n }\n\n default:\n throw new Error(`Unknown condition type: ${condition.type}`);\n }\n}\n\n/**\n * Build a PartiQL SELECT statement from a query operation\n */\nexport function buildSelectStatement(\n operation: TrackedQueryOperation,\n): PartiQLStatement {\n const parameters: unknown[] = [];\n let statement = `SELECT * FROM \"${operation.tableName}\"`;\n\n // Add index hint if using a GSI\n if (operation.indexName) {\n statement += `.\"${operation.indexName}\"`;\n }\n\n // Add WHERE clause if there are filters\n if (operation.filters.length > 0) {\n const whereClauses = operation.filters.map((f) =>\n conditionToPartiQL(f, parameters),\n );\n statement += ` WHERE ${whereClauses.join(' AND ')}`;\n }\n\n return { statement, parameters };\n}\n\n/**\n * Build a PartiQL INSERT statement\n */\nexport function buildInsertStatement(\n tableName: string,\n item: Record<string, unknown>,\n): PartiQLStatement {\n const parameters: unknown[] = [item];\n const statement = `INSERT INTO \"${tableName}\" VALUE ?`;\n return { statement, parameters };\n}\n\n/**\n * Build a PartiQL UPDATE statement\n */\nexport function buildUpdateStatement(\n tableName: string,\n key: Record<string, unknown>,\n updates: Record<string, unknown>,\n): PartiQLStatement {\n const parameters: unknown[] = [];\n const setClauses: string[] = [];\n\n for (const [field, value] of Object.entries(updates)) {\n // Skip key fields\n if (field in key) continue;\n setClauses.push(`\"${field}\" = ?`);\n parameters.push(value);\n }\n\n if (setClauses.length === 0) {\n throw new Error('No fields to update');\n }\n\n let statement = `UPDATE \"${tableName}\" SET ${setClauses.join(', ')}`;\n\n // Add WHERE clause for the key\n const whereClauses = Object.entries(key).map(([field, value]) => {\n parameters.push(value);\n return `\"${field}\" = ?`;\n });\n statement += ` WHERE ${whereClauses.join(' AND ')}`;\n\n return { statement, parameters };\n}\n\n/**\n * Build a PartiQL DELETE statement\n */\nexport function buildDeleteStatement(\n tableName: string,\n key: Record<string, unknown>,\n): PartiQLStatement {\n const parameters: unknown[] = [];\n const whereClauses = Object.entries(key).map(([field, value]) => {\n parameters.push(value);\n return `\"${field}\" = ?`;\n });\n\n const statement = `DELETE FROM \"${tableName}\" WHERE ${whereClauses.join(' AND ')}`;\n return { statement, parameters };\n}\n\n/**\n * Build a PartiQL GET statement (for single item by key)\n */\nexport function buildGetStatement(\n tableName: string,\n key: Record<string, unknown>,\n): PartiQLStatement {\n const parameters: unknown[] = [];\n const whereClauses = Object.entries(key).map(([field, value]) => {\n parameters.push(value);\n return `\"${field}\" = ?`;\n });\n\n const statement = `SELECT * FROM \"${tableName}\" WHERE ${whereClauses.join(' AND ')}`;\n return { statement, parameters };\n}\n","import type { FieldRef } from '@dynamodb-reactive/core';\n\nimport type {\n AnyDynamoTable,\n FilterBuilder,\n FilterCondition,\n QueryBuilder,\n TableItem,\n TableKeyInput,\n TrackedQueryOperation,\n} from './types.js';\n\n/**\n * Creates a filter condition\n */\nfunction createCondition(\n type: FilterCondition['type'],\n operator: string,\n field?: string,\n value?: unknown,\n value2?: unknown,\n): FilterCondition {\n return { type, operator, field, value, value2 };\n}\n\n/**\n * Implementation of FilterBuilder\n */\nclass FilterBuilderImpl<\n TTable extends AnyDynamoTable,\n> implements FilterBuilder<TTable> {\n eq<K extends keyof TableItem<TTable>>(\n field: FieldRef<K & string, TableItem<TTable>[K]>,\n value: TableItem<TTable>[K],\n ): FilterCondition {\n return createCondition('comparison', '=', field.fieldName, value);\n }\n\n ne<K extends keyof TableItem<TTable>>(\n field: FieldRef<K & string, TableItem<TTable>[K]>,\n value: TableItem<TTable>[K],\n ): FilterCondition {\n return createCondition('comparison', '<>', field.fieldName, value);\n }\n\n gt<K extends keyof TableItem<TTable>>(\n field: FieldRef<K & string, TableItem<TTable>[K]>,\n value: TableItem<TTable>[K],\n ): FilterCondition {\n return createCondition('comparison', '>', field.fieldName, value);\n }\n\n gte<K extends keyof TableItem<TTable>>(\n field: FieldRef<K & string, TableItem<TTable>[K]>,\n value: TableItem<TTable>[K],\n ): FilterCondition {\n return createCondition('comparison', '>=', field.fieldName, value);\n }\n\n lt<K extends keyof TableItem<TTable>>(\n field: FieldRef<K & string, TableItem<TTable>[K]>,\n value: TableItem<TTable>[K],\n ): FilterCondition {\n return createCondition('comparison', '<', field.fieldName, value);\n }\n\n lte<K extends keyof TableItem<TTable>>(\n field: FieldRef<K & string, TableItem<TTable>[K]>,\n value: TableItem<TTable>[K],\n ): FilterCondition {\n return createCondition('comparison', '<=', field.fieldName, value);\n }\n\n between<K extends keyof TableItem<TTable>>(\n field: FieldRef<K & string, TableItem<TTable>[K]>,\n lower: TableItem<TTable>[K],\n upper: TableItem<TTable>[K],\n ): FilterCondition {\n return createCondition(\n 'function',\n 'BETWEEN',\n field.fieldName,\n lower,\n upper,\n );\n }\n\n beginsWith<K extends keyof TableItem<TTable>>(\n field: FieldRef<K & string, string>,\n prefix: string,\n ): FilterCondition {\n return createCondition('function', 'begins_with', field.fieldName, prefix);\n }\n\n contains<K extends keyof TableItem<TTable>>(\n field: FieldRef<K & string, string>,\n substring: string,\n ): FilterCondition {\n return createCondition('function', 'contains', field.fieldName, substring);\n }\n\n and(...conditions: FilterCondition[]): FilterCondition {\n return { type: 'logical', operator: 'AND', conditions };\n }\n\n or(...conditions: FilterCondition[]): FilterCondition {\n return { type: 'logical', operator: 'OR', conditions };\n }\n\n not(condition: FilterCondition): FilterCondition {\n return { type: 'logical', operator: 'NOT', conditions: [condition] };\n }\n}\n\n/**\n * Query execution function type\n */\ntype QueryExecutor<TTable extends AnyDynamoTable> = (\n operation: TrackedQueryOperation,\n options: QueryOptions,\n) => Promise<TableItem<TTable>[]>;\n\n/**\n * Query options\n */\ninterface QueryOptions {\n limit?: number;\n startKey?: Record<string, unknown>;\n ascending: boolean;\n}\n\n/**\n * Implementation of QueryBuilder\n */\nexport class QueryBuilderImpl<\n TTable extends AnyDynamoTable,\n> implements QueryBuilder<TTable> {\n private table: TTable;\n private filters: FilterCondition[] = [];\n private indexName?: string;\n private limit?: number;\n private startKey?: TableKeyInput<TTable>;\n private ascending: boolean = true;\n private executor: QueryExecutor<TTable>;\n private operationTracker?: (op: TrackedQueryOperation) => void;\n\n constructor(\n table: TTable,\n executor: QueryExecutor<TTable>,\n operationTracker?: (op: TrackedQueryOperation) => void,\n ) {\n this.table = table;\n this.executor = executor;\n this.operationTracker = operationTracker;\n }\n\n filter(\n fn: (q: FilterBuilder<TTable>) => FilterCondition,\n ): QueryBuilder<TTable> {\n const builder = new FilterBuilderImpl<TTable>();\n const condition = fn(builder);\n this.filters.push(condition);\n return this;\n }\n\n useIndex(indexName: string): QueryBuilder<TTable> {\n this.indexName = indexName;\n return this;\n }\n\n take(limit: number): QueryBuilder<TTable> {\n this.limit = limit;\n return this;\n }\n\n startFrom(key: TableKeyInput<TTable>): QueryBuilder<TTable> {\n this.startKey = key;\n return this;\n }\n\n sortAscending(): QueryBuilder<TTable> {\n this.ascending = true;\n return this;\n }\n\n sortDescending(): QueryBuilder<TTable> {\n this.ascending = false;\n return this;\n }\n\n async execute(): Promise<TableItem<TTable>[]> {\n const operation: TrackedQueryOperation = {\n tableName: this.table.tableName,\n filters: this.filters,\n indexName: this.indexName,\n pkField: this.table.pk,\n skField: this.table.sk,\n sortField: this.table.sk, // Default sort by SK if available\n sortOrder: this.ascending ? 'asc' : 'desc',\n limit: this.limit,\n };\n\n // Track the operation for dependency extraction\n if (this.operationTracker) {\n this.operationTracker(operation);\n }\n\n const options: QueryOptions = {\n limit: this.limit,\n startKey: this.startKey as Record<string, unknown>,\n ascending: this.ascending,\n };\n\n return this.executor(operation, options);\n }\n\n /**\n * Get the current operation without executing\n * Used for dependency extraction\n */\n getOperation(): TrackedQueryOperation {\n return {\n tableName: this.table.tableName,\n filters: this.filters,\n indexName: this.indexName,\n pkField: this.table.pk,\n skField: this.table.sk,\n sortField: this.table.sk,\n sortOrder: this.ascending ? 'asc' : 'desc',\n limit: this.limit,\n };\n }\n}\n\n/**\n * Create a filter builder instance\n */\nexport function createFilterBuilder<\n TTable extends AnyDynamoTable,\n>(): FilterBuilder<TTable> {\n return new FilterBuilderImpl<TTable>();\n}\n","import {\n type AttributeValue,\n DynamoDBClient,\n ExecuteStatementCommand,\n} from '@aws-sdk/client-dynamodb';\nimport {\n DeleteCommand,\n DynamoDBDocumentClient,\n GetCommand,\n PutCommand,\n UpdateCommand,\n} from '@aws-sdk/lib-dynamodb';\nimport { unmarshall } from '@aws-sdk/util-dynamodb';\n\nimport type { DependencyTracker } from './dependency-extractor.js';\nimport {\n buildSelectStatement,\n type PartiQLStatement,\n} from './partiql-builder.js';\nimport { QueryBuilderImpl } from './query-builder.js';\nimport type {\n AnyDynamoTable,\n DatabaseContext,\n TableItem,\n TableKeyInput,\n TrackedQueryOperation,\n} from './types.js';\n\n/**\n * Configuration for creating a database context\n */\nexport interface DbContextConfig {\n client?: DynamoDBClient;\n region?: string;\n endpoint?: string;\n}\n\n/**\n * Create a DynamoDB Document client\n */\nfunction createDocClient(config: DbContextConfig): DynamoDBDocumentClient {\n const client =\n config.client ??\n new DynamoDBClient({\n region: config.region ?? process.env.AWS_REGION ?? 'us-east-1',\n endpoint: config.endpoint,\n });\n\n return DynamoDBDocumentClient.from(client, {\n marshallOptions: {\n removeUndefinedValues: true,\n convertEmptyValues: false,\n },\n unmarshallOptions: {\n wrapNumbers: false,\n },\n });\n}\n\n/**\n * Convert a JavaScript value to a DynamoDB AttributeValue\n */\nfunction toAttributeValue(value: unknown): AttributeValue {\n if (typeof value === 'string') return { S: value };\n if (typeof value === 'number') return { N: String(value) };\n if (typeof value === 'boolean') return { BOOL: value };\n if (value === null || value === undefined) return { NULL: true };\n if (Array.isArray(value)) {\n return { L: value.map(toAttributeValue) };\n }\n if (typeof value === 'object') {\n const m: Record<string, AttributeValue> = {};\n for (const [k, v] of Object.entries(value as Record<string, unknown>)) {\n m[k] = toAttributeValue(v);\n }\n return { M: m };\n }\n return { S: String(value) };\n}\n\n/**\n * Execute a PartiQL statement\n */\nasync function executePartiQL(\n docClient: DynamoDBDocumentClient,\n statement: PartiQLStatement,\n): Promise<Record<string, unknown>[]> {\n const command = new ExecuteStatementCommand({\n Statement: statement.statement,\n Parameters: statement.parameters.map(toAttributeValue),\n });\n\n const response = await docClient.send(command);\n // Unmarshall the DynamoDB AttributeValue format to plain JavaScript objects\n return (response.Items ?? []).map((item) =>\n unmarshall(item as Record<string, AttributeValue>),\n );\n}\n\n/**\n * Creates a database context for procedure execution\n */\nexport function createDbContext(\n config: DbContextConfig,\n dependencyTracker?: DependencyTracker,\n): DatabaseContext {\n const docClient = createDocClient(config);\n\n /**\n * Execute a query operation\n */\n async function executeQuery<TTable extends AnyDynamoTable>(\n operation: TrackedQueryOperation,\n options: {\n limit?: number;\n startKey?: Record<string, unknown>;\n ascending: boolean;\n },\n ): Promise<TableItem<TTable>[]> {\n const statement = buildSelectStatement(operation);\n\n const items = await executePartiQL(docClient, statement);\n\n // Apply limit client-side if needed (PartiQL doesn't support LIMIT directly)\n if (options.limit && items.length > options.limit) {\n return items.slice(0, options.limit) as TableItem<TTable>[];\n }\n\n return items as TableItem<TTable>[];\n }\n\n return {\n query<TTable extends AnyDynamoTable>(table: TTable) {\n return new QueryBuilderImpl<TTable>(\n table,\n executeQuery,\n dependencyTracker?.track.bind(dependencyTracker),\n );\n },\n\n async get<TItem = never, TTable extends AnyDynamoTable = AnyDynamoTable>(\n table: TTable,\n key: TableKeyInput<TTable>,\n ): Promise<([TItem] extends [never] ? TableItem<TTable> : TItem) | null> {\n const command = new GetCommand({\n TableName: table.tableName,\n Key: key as Record<string, unknown>,\n });\n\n const response = await docClient.send(command);\n return response.Item\n ? (response.Item as [TItem] extends [never] ? TableItem<TTable> : TItem)\n : null;\n },\n\n async put<TTable extends AnyDynamoTable>(\n table: TTable,\n item: TableItem<TTable>,\n ): Promise<void> {\n // Validate the item against the schema\n table.validate(item);\n\n const command = new PutCommand({\n TableName: table.tableName,\n Item: item as Record<string, unknown>,\n });\n\n await docClient.send(command);\n },\n\n async delete<TTable extends AnyDynamoTable>(\n table: TTable,\n key: TableKeyInput<TTable>,\n ): Promise<void> {\n const command = new DeleteCommand({\n TableName: table.tableName,\n Key: key as Record<string, unknown>,\n });\n\n await docClient.send(command);\n },\n\n async update<TItem = never, TTable extends AnyDynamoTable = AnyDynamoTable>(\n table: TTable,\n key: TableKeyInput<TTable>,\n updates: Partial<[TItem] extends [never] ? TableItem<TTable> : TItem>,\n ): Promise<[TItem] extends [never] ? TableItem<TTable> : TItem> {\n type ResultType = [TItem] extends [never] ? TableItem<TTable> : TItem;\n\n const updateExpressions: string[] = [];\n const expressionAttributeNames: Record<string, string> = {};\n const expressionAttributeValues: Record<string, unknown> = {};\n\n let i = 0;\n for (const [field, value] of Object.entries(updates)) {\n if (field in (key as Record<string, unknown>)) continue;\n\n const nameKey = `#f${i}`;\n const valueKey = `:v${i}`;\n\n updateExpressions.push(`${nameKey} = ${valueKey}`);\n expressionAttributeNames[nameKey] = field;\n expressionAttributeValues[valueKey] = value;\n i++;\n }\n\n if (updateExpressions.length === 0) {\n // No updates, just return the current item\n const current = await this.get<TItem, TTable>(table, key);\n if (!current) {\n throw new Error('Item not found');\n }\n return current as ResultType;\n }\n\n const command = new UpdateCommand({\n TableName: table.tableName,\n Key: key as Record<string, unknown>,\n UpdateExpression: `SET ${updateExpressions.join(', ')}`,\n ExpressionAttributeNames: expressionAttributeNames,\n ExpressionAttributeValues: expressionAttributeValues,\n ReturnValues: 'ALL_NEW',\n });\n\n const response = await docClient.send(command);\n return response.Attributes as ResultType;\n },\n };\n}\n","import type { QueryMetadata } from '@dynamodb-reactive/core';\n\nimport type {\n FilterCondition,\n QueryDependency,\n TrackedQueryOperation,\n} from './types.js';\n\n/**\n * Extracts dependencies from a filter condition\n */\nfunction extractFromCondition(\n tableName: string,\n condition: FilterCondition,\n indexName?: string,\n): QueryDependency[] {\n const dependencies: QueryDependency[] = [];\n\n switch (condition.type) {\n case 'comparison': {\n // Only extract equality conditions as dependencies\n // These are the ones we can efficiently track\n if (\n condition.operator === '=' &&\n condition.field &&\n condition.value !== undefined\n ) {\n dependencies.push({\n tableName,\n fieldName: condition.field,\n fieldValue: String(condition.value),\n indexName,\n });\n }\n break;\n }\n\n case 'function': {\n // For begins_with, we can track the prefix as a dependency\n if (\n condition.operator === 'begins_with' &&\n condition.field &&\n condition.value\n ) {\n dependencies.push({\n tableName,\n fieldName: condition.field,\n fieldValue: `prefix:${String(condition.value)}`,\n indexName,\n });\n }\n break;\n }\n\n case 'logical': {\n // Recursively extract from logical conditions\n if (condition.conditions) {\n for (const subCondition of condition.conditions) {\n dependencies.push(\n ...extractFromCondition(tableName, subCondition, indexName),\n );\n }\n }\n break;\n }\n }\n\n return dependencies;\n}\n\n/**\n * Extract dependencies from a tracked query operation\n */\nexport function extractDependencies(\n operation: TrackedQueryOperation,\n): QueryDependency[] {\n const dependencies: QueryDependency[] = [];\n\n for (const filter of operation.filters) {\n dependencies.push(\n ...extractFromCondition(operation.tableName, filter, operation.indexName),\n );\n }\n\n return dependencies;\n}\n\n/**\n * Create a dependency key for the inverted index\n * Format: \"TableName#FieldName#FieldValue\"\n */\nexport function createDependencyKey(dependency: QueryDependency): string {\n return `${dependency.tableName}#${dependency.fieldName}#${dependency.fieldValue}`;\n}\n\n/**\n * Parse a dependency key back into its components\n */\nexport function parseDependencyKey(key: string): QueryDependency | null {\n const parts = key.split('#');\n if (parts.length < 3) return null;\n\n return {\n tableName: parts[0],\n fieldName: parts[1],\n fieldValue: parts.slice(2).join('#'), // Handle values that contain #\n };\n}\n\n/**\n * Extract affected dependency keys from a DynamoDB stream record\n * This finds all keys that might be affected by a change\n */\nexport function extractAffectedKeys(\n tableName: string,\n item: Record<string, unknown>,\n): string[] {\n const keys: string[] = [];\n\n for (const [fieldName, fieldValue] of Object.entries(item)) {\n if (fieldValue !== null && fieldValue !== undefined) {\n // Add exact match key\n keys.push(`${tableName}#${fieldName}#${String(fieldValue)}`);\n\n // Add prefix keys for string values (for begins_with queries)\n // Limit to first 10 characters to avoid key explosion on long strings\n if (typeof fieldValue === 'string') {\n const maxPrefixLen = Math.min(fieldValue.length, 10);\n for (let i = 1; i <= maxPrefixLen; i++) {\n keys.push(\n `${tableName}#${fieldName}#prefix:${fieldValue.substring(0, i)}`,\n );\n }\n }\n }\n }\n\n return keys;\n}\n\n/**\n * Convert a TrackedQueryOperation to QueryMetadata for storage.\n * Normalizes filter operators for evaluation.\n */\nexport function operationToQueryMetadata(\n operation: TrackedQueryOperation,\n): QueryMetadata {\n // Normalize operators to what the filter evaluator expects\n const normalizeFilters = (filters: FilterCondition[]): FilterCondition[] => {\n return filters.map((f) => normalizeFilter(f));\n };\n\n const normalizeFilter = (filter: FilterCondition): FilterCondition => {\n if (filter.type === 'comparison') {\n // Normalize operators: '=' -> 'eq', '<>' -> 'ne', etc.\n const operatorMap: Record<string, string> = {\n '=': 'eq',\n '<>': 'ne',\n '>': 'gt',\n '>=': 'gte',\n '<': 'lt',\n '<=': 'lte',\n };\n return {\n ...filter,\n operator: operatorMap[filter.operator] ?? filter.operator,\n };\n }\n if (filter.type === 'function') {\n // Normalize function names\n const operatorMap: Record<string, string> = {\n begins_with: 'beginsWith',\n BETWEEN: 'between',\n };\n return {\n ...filter,\n operator: operatorMap[filter.operator] ?? filter.operator,\n };\n }\n if (filter.conditions) {\n // Normalize operators: 'AND' -> 'and', etc.\n const operatorMap: Record<string, string> = {\n AND: 'and',\n OR: 'or',\n NOT: 'not',\n };\n return {\n ...filter,\n operator: operatorMap[filter.operator] ?? filter.operator,\n conditions: normalizeFilters(filter.conditions),\n };\n }\n return filter;\n };\n\n return {\n tableName: operation.tableName,\n indexName: operation.indexName,\n filterConditions: normalizeFilters(operation.filters),\n sortField: operation.sortField,\n sortOrder: operation.sortOrder,\n limit: operation.limit,\n };\n}\n\n/**\n * DependencyTracker - Tracks query operations during procedure execution\n */\nexport class DependencyTracker {\n private operations: TrackedQueryOperation[] = [];\n\n /**\n * Track a query operation\n */\n track(operation: TrackedQueryOperation): void {\n this.operations.push(operation);\n }\n\n /**\n * Get all tracked operations\n */\n getOperations(): TrackedQueryOperation[] {\n return [...this.operations];\n }\n\n /**\n * Extract all dependencies from tracked operations\n */\n extractAll(): QueryDependency[] {\n const dependencies: QueryDependency[] = [];\n\n for (const operation of this.operations) {\n dependencies.push(...extractDependencies(operation));\n }\n\n return dependencies;\n }\n\n /**\n * Get all dependency keys for the inverted index\n */\n getDependencyKeys(): string[] {\n return this.extractAll().map(createDependencyKey);\n }\n\n /**\n * Get query metadata for the first tracked operation.\n * Used for storing subscription state.\n */\n getQueryMetadata(): QueryMetadata | null {\n if (this.operations.length === 0) return null;\n // For now, we only support single-query subscriptions\n return operationToQueryMetadata(this.operations[0]);\n }\n\n /**\n * Get the primary key field from the first operation\n */\n getPkField(): string | null {\n if (this.operations.length === 0) return null;\n return this.operations[0].pkField;\n }\n\n /**\n * Get the sort key field from the first operation\n */\n getSkField(): string | undefined {\n if (this.operations.length === 0) return undefined;\n return this.operations[0].skField;\n }\n\n /**\n * Clear tracked operations\n */\n clear(): void {\n this.operations = [];\n }\n}\n","import type { JsonPatch } from '@dynamodb-reactive/core';\nimport jsonpatch, { type Operation } from 'fast-json-patch';\n\nconst { applyPatch, compare } = jsonpatch;\n\n/**\n * Generate JSON patches between two objects\n * Uses RFC 6902 JSON Patch format\n */\nexport function generatePatches(\n oldValue: unknown,\n newValue: unknown,\n): JsonPatch[] {\n const operations = compare(\n oldValue as Record<string, unknown>,\n newValue as Record<string, unknown>,\n );\n\n return operations.map((op) => ({\n op: op.op as JsonPatch['op'],\n path: op.path,\n value: 'value' in op ? op.value : undefined,\n from: 'from' in op ? op.from : undefined,\n }));\n}\n\n/**\n * Apply JSON patches to an object\n * Returns the patched result\n */\nexport function applyPatches<T>(document: T, patches: JsonPatch[]): T {\n const operations: Operation[] = patches.map((patch) => {\n const op: Operation = {\n op: patch.op,\n path: patch.path,\n } as Operation;\n\n if ('value' in patch && patch.value !== undefined) {\n (op as { value: unknown }).value = patch.value;\n }\n if ('from' in patch && patch.from !== undefined) {\n (op as { from: string }).from = patch.from;\n }\n\n return op;\n });\n\n const result = applyPatch(\n structuredClone(document),\n operations,\n true, // Validate operations\n false, // Don't mutate the original\n );\n\n return result.newDocument as T;\n}\n\n/**\n * Check if there are any changes between two values\n */\nexport function hasChanges(oldValue: unknown, newValue: unknown): boolean {\n const patches = generatePatches(oldValue, newValue);\n return patches.length > 0;\n}\n\n/**\n * Create a minimal patch that only includes necessary operations\n * Optimizes the patch by removing redundant operations\n */\nexport function optimizePatches(patches: JsonPatch[]): JsonPatch[] {\n // Filter out test operations and redundant operations\n const seen = new Set<string>();\n const optimized: JsonPatch[] = [];\n\n // Process patches in reverse to keep only the last operation for each path\n for (let i = patches.length - 1; i >= 0; i--) {\n const patch = patches[i];\n if (!seen.has(patch.path)) {\n seen.add(patch.path);\n optimized.unshift(patch);\n }\n }\n\n return optimized;\n}\n\n/**\n * Batch multiple patch sets into a single set\n */\nexport function batchPatches(patchSets: JsonPatch[][]): JsonPatch[] {\n const allPatches = patchSets.flat();\n return optimizePatches(allPatches);\n}\n","import { DynamoDBClient } from '@aws-sdk/client-dynamodb';\nimport {\n DeleteCommand,\n DynamoDBDocumentClient,\n GetCommand,\n PutCommand,\n QueryCommand,\n} from '@aws-sdk/lib-dynamodb';\nimport type { ConnectionEntry, QueryEntry } from '@dynamodb-reactive/core';\nimport { SystemTableNames } from '@dynamodb-reactive/core';\nimport { debug, warn } from 'ag-common/dist/common/helpers/log';\n\nimport { createDbContext, type DbContextConfig } from '../db-context.js';\nimport { DependencyTracker } from '../dependency-extractor.js';\nimport type { Router } from '../router.js';\nimport type {\n DatabaseContext,\n RouterCaller,\n RouterDefinition,\n} from '../types.js';\n\n/**\n * Request types for the reactive handler.\n * All requests include connectionId from the WebSocket connection.\n */\nexport interface SubscribeRequest {\n type: 'subscribe';\n connectionId: string;\n subscriptionId: string;\n path: string;\n input: unknown;\n}\n\nexport interface UnsubscribeRequest {\n type: 'unsubscribe';\n connectionId: string;\n subscriptionId: string;\n}\n\nexport interface CallRequest {\n type: 'call';\n connectionId: string;\n path: string;\n input: unknown;\n}\n\nexport type ReactiveRequest =\n | SubscribeRequest\n | UnsubscribeRequest\n | CallRequest;\n\n/**\n * Response types for the reactive handler\n */\nexport interface SnapshotResponse {\n type: 'snapshot';\n subscriptionId: string;\n data: unknown;\n}\n\nexport interface PatchResponse {\n type: 'patch';\n subscriptionId: string;\n patches: unknown[];\n}\n\nexport interface ResultResponse {\n type: 'result';\n data: unknown;\n}\n\nexport interface ErrorResponse {\n type: 'error';\n message: string;\n /** HTTP status code (e.g., 400, 403, 404, 500) */\n code?: number;\n subscriptionId?: string;\n}\n\nexport type ReactiveResponse =\n | SnapshotResponse\n | PatchResponse\n | ResultResponse\n | ErrorResponse;\n\n/**\n * Request info passed to getContext for extracting user context\n */\nexport interface RequestInfo {\n connectionId: string;\n /** Headers from the HTTP request (for auth, user info, etc.) */\n headers?: Record<string, string>;\n}\n\n/**\n * Configuration for the reactive handler\n */\nexport interface ReactiveHandlerConfig<\n TContext,\n TRouter extends RouterDefinition<TContext> = RouterDefinition<TContext>,\n> {\n router: Router<TContext, TRouter>;\n dbConfig?: DbContextConfig;\n getContext: (requestInfo: RequestInfo) => Promise<TContext>;\n ttlSeconds?: number;\n /** Prefix for system table names (e.g., 'TodoApp' creates 'TodoApp-ReactiveConnections') */\n tablePrefix?: string;\n}\n\n/**\n * Create a reactive handler for Next.js API routes or other HTTP servers.\n * This handler is used for subscribe/call requests and stores queryMetadata\n * for the stream handler to use later.\n */\nexport function createReactiveHandler<\n TContext,\n TRouter extends RouterDefinition<TContext>,\n>(config: ReactiveHandlerConfig<TContext, TRouter>) {\n const ttlSeconds = config.ttlSeconds ?? 3600; // 1 hour default\n // Add dash after prefix like CDK does\n const prefix = config.tablePrefix ? `${config.tablePrefix}-` : '';\n const connectionsTable = `${prefix}${SystemTableNames.connections}`;\n const dependenciesTable = `${prefix}${SystemTableNames.dependencies}`;\n const queriesTable = `${prefix}${SystemTableNames.queries}`;\n\n // Create DynamoDB client\n const ddbClient = new DynamoDBClient({\n region: config.dbConfig?.region ?? process.env.AWS_REGION,\n });\n const docClient = DynamoDBDocumentClient.from(ddbClient, {\n marshallOptions: { removeUndefinedValues: true },\n });\n\n /**\n * Handle an incoming request.\n * The connectionId is now included in the request body from the client.\n * @param request The reactive request from the client\n * @param headers Optional HTTP headers for auth/user context\n */\n async function handleRequest(\n request: ReactiveRequest,\n headers?: Record<string, string>,\n ): Promise<ReactiveResponse> {\n try {\n const connectionId = request.connectionId;\n debug('[reactive-handler] handleRequest:', {\n type: request.type,\n connectionId,\n path: 'path' in request ? request.path : undefined,\n });\n\n const ctx = await config.getContext({ connectionId, headers });\n const dependencyTracker = new DependencyTracker();\n const db = createDbContext(config.dbConfig ?? {}, dependencyTracker);\n const fullCtx = { ...ctx, db } as TContext & { db: DatabaseContext };\n\n switch (request.type) {\n case 'subscribe':\n return await handleSubscribe(\n connectionId,\n request,\n fullCtx,\n dependencyTracker,\n );\n\n case 'unsubscribe':\n return await handleUnsubscribe(connectionId, request);\n\n case 'call':\n return await handleCall(request, fullCtx);\n\n default:\n return {\n type: 'error',\n message: `Unknown request type: ${(request as { type: string }).type}`,\n };\n }\n } catch (error) {\n return {\n type: 'error',\n message: error instanceof Error ? error.message : 'Unknown error',\n code: (error as { code?: number }).code,\n subscriptionId:\n 'subscriptionId' in request ? request.subscriptionId : undefined,\n };\n }\n }\n\n /**\n * Handle a subscribe request.\n * Executes the query, stores queryMetadata for stream handler, returns initial data.\n */\n async function handleSubscribe(\n connectionId: string,\n request: SubscribeRequest,\n ctx: TContext & { db: DatabaseContext },\n dependencyTracker: DependencyTracker,\n ): Promise<ReactiveResponse> {\n // Execute the query to get initial data\n const result = await config.router.execute(\n request.path,\n ctx,\n request.input,\n );\n\n // Get query metadata and dependencies\n const queryMetadata = dependencyTracker.getQueryMetadata();\n const dependencyKeys = dependencyTracker.getDependencyKeys();\n\n if (!queryMetadata) {\n warn('[reactive-handler] No query metadata captured for subscription');\n }\n\n const now = Date.now();\n const ttl = Math.floor(now / 1000) + ttlSeconds;\n\n // Store the subscription with queryMetadata\n // IMPORTANT: Store result as-is (not wrapped) so patches match client data structure\n const queryEntry: QueryEntry = {\n pk: connectionId,\n sk: request.subscriptionId,\n connectionId,\n subscriptionId: request.subscriptionId,\n queryMetadata: queryMetadata ?? {\n tableName: '',\n filterConditions: [],\n },\n lastResult: result,\n dependencies: dependencyKeys,\n version: 0,\n createdAt: now,\n updatedAt: now,\n ttl,\n };\n\n await docClient.send(\n new PutCommand({\n TableName: queriesTable,\n Item: queryEntry,\n }),\n );\n\n // Store dependency entries (inverted index)\n await Promise.all(\n dependencyKeys.map((key) =>\n docClient.send(\n new PutCommand({\n TableName: dependenciesTable,\n Item: {\n pk: key,\n sk: `${connectionId}#${request.subscriptionId}`,\n connectionId,\n subscriptionId: request.subscriptionId,\n ttl,\n },\n }),\n ),\n ),\n );\n\n debug('[reactive-handler] Subscription created:', {\n connectionId,\n subscriptionId: request.subscriptionId,\n tableName: queryMetadata?.tableName,\n filterConditions: queryMetadata?.filterConditions,\n dependencies: dependencyKeys,\n isArrayResult: Array.isArray(result),\n resultCount: Array.isArray(result) ? result.length : 1,\n });\n\n return {\n type: 'snapshot',\n subscriptionId: request.subscriptionId,\n data: result,\n };\n }\n\n /**\n * Handle an unsubscribe request\n */\n async function handleUnsubscribe(\n connectionId: string,\n request: UnsubscribeRequest,\n ): Promise<ReactiveResponse> {\n // Get the subscription to find its dependencies\n const subResponse = await docClient.send(\n new GetCommand({\n TableName: queriesTable,\n Key: { pk: connectionId, sk: request.subscriptionId },\n }),\n );\n\n if (subResponse.Item) {\n const queryEntry = subResponse.Item as QueryEntry;\n\n // Delete dependency entries\n await Promise.all(\n queryEntry.dependencies.map((key) =>\n docClient.send(\n new DeleteCommand({\n TableName: dependenciesTable,\n Key: {\n pk: key,\n sk: `${connectionId}#${request.subscriptionId}`,\n },\n }),\n ),\n ),\n );\n }\n\n // Delete the subscription\n await docClient.send(\n new DeleteCommand({\n TableName: queriesTable,\n Key: { pk: connectionId, sk: request.subscriptionId },\n }),\n );\n\n debug('[reactive-handler] Subscription removed:', {\n connectionId,\n subscriptionId: request.subscriptionId,\n });\n\n return {\n type: 'result',\n data: { success: true },\n };\n }\n\n /**\n * Handle a call (mutation) request\n */\n async function handleCall(\n request: CallRequest,\n ctx: TContext & { db: DatabaseContext },\n ): Promise<ReactiveResponse> {\n const result = await config.router.execute(\n request.path,\n ctx,\n request.input,\n );\n\n return {\n type: 'result',\n data: result,\n };\n }\n\n /**\n * Register a new connection\n */\n async function registerConnection(\n connectionId: string,\n context?: Record<string, unknown>,\n ): Promise<void> {\n const now = Date.now();\n const ttl = Math.floor(now / 1000) + ttlSeconds;\n\n const connectionEntry: ConnectionEntry = {\n connectionId,\n context,\n connectedAt: now,\n ttl,\n };\n\n await docClient.send(\n new PutCommand({\n TableName: connectionsTable,\n Item: connectionEntry,\n }),\n );\n\n debug('[reactive-handler] Connection registered:', connectionEntry);\n }\n\n /**\n * Unregister a connection and clean up all its subscriptions and dependencies\n */\n async function unregisterConnection(connectionId: string): Promise<void> {\n const subsResponse = await docClient.send(\n new QueryCommand({\n TableName: queriesTable,\n KeyConditionExpression: 'pk = :pk',\n ExpressionAttributeValues: { ':pk': connectionId },\n }),\n );\n\n const subscriptions = subsResponse.Items ?? [];\n\n await Promise.all(\n subscriptions.map(async (sub) => {\n const deps = Array.isArray(sub.dependencies)\n ? (sub.dependencies as string[])\n : [];\n await Promise.all([\n ...deps.map((depKey) =>\n docClient.send(\n new DeleteCommand({\n TableName: dependenciesTable,\n Key: { pk: depKey, sk: `${connectionId}#${sub.sk}` },\n }),\n ),\n ),\n docClient.send(\n new DeleteCommand({\n TableName: queriesTable,\n Key: { pk: connectionId, sk: sub.sk },\n }),\n ),\n ]);\n }),\n );\n\n await docClient.send(\n new DeleteCommand({\n TableName: connectionsTable,\n Key: { connectionId },\n }),\n );\n\n debug(\n '[reactive-handler] Connection unregistered:',\n connectionId,\n `(${subscriptions.length} subscriptions removed)`,\n );\n }\n\n /**\n * Execute a query without creating a subscription.\n * Useful for SSR or one-time data fetches.\n */\n async function query<T = unknown>(\n path: string,\n input?: unknown,\n headers?: Record<string, string>,\n ): Promise<T> {\n const ctx = await config.getContext({ connectionId: 'query', headers });\n const dependencyTracker = new DependencyTracker();\n const db = createDbContext(config.dbConfig ?? {}, dependencyTracker);\n const fullCtx = { ...ctx, db } as TContext & { db: DatabaseContext };\n\n return config.router.execute(path, fullCtx, input) as Promise<T>;\n }\n\n /**\n * Create a type-safe caller for server-side procedure execution.\n * Provides full type inference for procedure inputs and outputs.\n *\n * @example\n * ```ts\n * const caller = handler.createCaller();\n * const todos = await caller.todos.list({}); // Type-safe!\n * ```\n */\n function createCaller(): RouterCaller<TRouter> {\n function buildProxy(path: string[] = []): unknown {\n return new Proxy(() => {}, {\n get(_target, prop: string) {\n return buildProxy([...path, prop]);\n },\n apply(_target, _thisArg, args: unknown[]) {\n const procedurePath = path.join('.');\n return query(procedurePath, args[0]);\n },\n });\n }\n\n return buildProxy() as RouterCaller<TRouter>;\n }\n\n return {\n handleRequest,\n registerConnection,\n unregisterConnection,\n query,\n createCaller,\n };\n}\n","import {\n ApiGatewayManagementApiClient,\n GoneException,\n PostToConnectionCommand,\n} from '@aws-sdk/client-apigatewaymanagementapi';\nimport type { DynamoDBClient } from '@aws-sdk/client-dynamodb';\nimport {\n type AttributeValue,\n ExecuteStatementCommand,\n} from '@aws-sdk/client-dynamodb';\nimport type { DynamoDBDocumentClient } from '@aws-sdk/lib-dynamodb';\nimport {\n DeleteCommand,\n GetCommand,\n PutCommand,\n QueryCommand,\n} from '@aws-sdk/lib-dynamodb';\nimport { unmarshall } from '@aws-sdk/util-dynamodb';\nimport type {\n FilterCondition,\n JsonPatch,\n QueryEntry,\n QueryMetadata,\n} from '@dynamodb-reactive/core';\nimport {\n error as logError,\n info,\n warn,\n} from 'ag-common/dist/common/helpers/log';\nimport type { DynamoDBRecord } from 'aws-lambda';\n\nimport { generatePatches, hasChanges } from '../patcher.js';\n\n// ---------------------------------------------------------------------------\n// Pure helpers (no dependencies)\n// ---------------------------------------------------------------------------\n\n/**\n * Extract table name from a DynamoDB stream record's event source ARN.\n */\nexport function extractTableName(record: DynamoDBRecord): string | null {\n const arn = record.eventSourceARN;\n if (!arn) return null;\n const match = arn.match(/table\\/([^/]+)/);\n return match ? match[1] : null;\n}\n\n/**\n * Build a PartiQL WHERE clause from filter conditions.\n */\nexport function buildWhereClause(conditions: FilterCondition[]): string {\n if (conditions.length === 0) return '';\n\n const clauses = conditions\n .map((c) => buildConditionClause(c))\n .filter(Boolean);\n if (clauses.length === 0) return '';\n\n return `WHERE ${clauses.join(' AND ')}`;\n}\n\nfunction buildConditionClause(condition: FilterCondition): string {\n const { type, operator, field, value, value2, conditions } = condition;\n\n if (type === 'comparison' && field) {\n const escapedValue = escapeValue(value);\n switch (operator) {\n case 'eq':\n return `\"${field}\" = ${escapedValue}`;\n case 'ne':\n return `\"${field}\" <> ${escapedValue}`;\n case 'gt':\n return `\"${field}\" > ${escapedValue}`;\n case 'gte':\n return `\"${field}\" >= ${escapedValue}`;\n case 'lt':\n return `\"${field}\" < ${escapedValue}`;\n case 'lte':\n return `\"${field}\" <= ${escapedValue}`;\n case 'between':\n return `\"${field}\" BETWEEN ${escapedValue} AND ${escapeValue(value2)}`;\n default:\n return '';\n }\n }\n\n if (type === 'function' && field) {\n const escapedValue = escapeValue(value);\n switch (operator) {\n case 'beginsWith':\n return `begins_with(\"${field}\", ${escapedValue})`;\n case 'contains':\n return `contains(\"${field}\", ${escapedValue})`;\n default:\n return '';\n }\n }\n\n if (type === 'logical' && conditions) {\n const subclauses = conditions\n .map((c) => buildConditionClause(c))\n .filter(Boolean);\n if (subclauses.length === 0) return '';\n\n switch (operator) {\n case 'and':\n return `(${subclauses.join(' AND ')})`;\n case 'or':\n return `(${subclauses.join(' OR ')})`;\n case 'not':\n return subclauses.length > 0 ? `NOT (${subclauses[0]})` : '';\n default:\n return '';\n }\n }\n\n return '';\n}\n\nfunction escapeValue(value: unknown): string {\n if (value === null || value === undefined) return 'NULL';\n if (typeof value === 'string') return `'${value.replace(/'/g, \"''\")}'`;\n if (typeof value === 'number') return String(value);\n if (typeof value === 'boolean') return value ? 'TRUE' : 'FALSE';\n return `'${String(value).replace(/'/g, \"''\")}'`;\n}\n\n// ---------------------------------------------------------------------------\n// Factory for DB-dependent helpers\n// ---------------------------------------------------------------------------\n\nexport interface StreamUtilsConfig {\n ddbClient: DynamoDBClient;\n docClient: DynamoDBDocumentClient;\n apiGatewayEndpoint: string;\n connectionsTable: string;\n dependenciesTable: string;\n queriesTable: string;\n}\n\nexport function createStreamUtils(config: StreamUtilsConfig) {\n const {\n ddbClient,\n docClient,\n connectionsTable,\n dependenciesTable,\n queriesTable,\n } = config;\n\n const getApiClient = (() => {\n let client: ApiGatewayManagementApiClient | undefined;\n return () => {\n client ??= new ApiGatewayManagementApiClient({\n endpoint: config.apiGatewayEndpoint,\n });\n return client;\n };\n })();\n\n /**\n * Find subscriptions affected by a dependency key.\n */\n async function findAffectedSubscriptions(\n dependencyKey: string,\n ): Promise<{ connectionId: string; subscriptionId: string }[]> {\n try {\n const response = await docClient.send(\n new QueryCommand({\n TableName: dependenciesTable,\n KeyConditionExpression: 'pk = :pk',\n ExpressionAttributeValues: { ':pk': dependencyKey },\n }),\n );\n\n return (response.Items ?? []).map((item) => ({\n connectionId: item.connectionId as string,\n subscriptionId: item.subscriptionId as string,\n }));\n } catch (error) {\n logError('Error finding affected subscriptions:', error);\n return [];\n }\n }\n\n /**\n * Execute a query using stored QueryMetadata via PartiQL.\n */\n async function executeQueryFromMetadata(\n metadata: QueryMetadata,\n ): Promise<unknown[]> {\n const { tableName, filterConditions, sortOrder, limit } = metadata;\n\n const whereClause = buildWhereClause(filterConditions);\n const orderClause = sortOrder === 'desc' ? 'ORDER BY SK DESC' : '';\n const limitClause = limit ? `LIMIT ${limit}` : '';\n\n const statement =\n `SELECT * FROM \"${tableName}\" ${whereClause} ${orderClause} ${limitClause}`.trim();\n\n try {\n const result = await ddbClient.send(\n new ExecuteStatementCommand({ Statement: statement }),\n );\n\n return (result.Items ?? []).map((item) =>\n unmarshall(item as Record<string, AttributeValue>),\n );\n } catch (error) {\n logError('Error executing query from metadata:', error);\n logError('Statement:', statement);\n return [];\n }\n }\n\n /**\n * Send a JSON Patch to the client via WebSocket.\n * Throws GoneException if the connection is dead (caller should clean up).\n */\n async function sendPatch(\n connectionId: string,\n subscriptionId: string,\n patches: JsonPatch[],\n ): Promise<void> {\n const message = JSON.stringify({\n type: 'patch',\n subscriptionId,\n patches,\n });\n\n try {\n await getApiClient().send(\n new PostToConnectionCommand({\n ConnectionId: connectionId,\n Data: Buffer.from(message),\n }),\n );\n } catch (error) {\n if (error instanceof GoneException) {\n throw error;\n }\n logError(`Error sending patch to ${connectionId}:`, error);\n }\n }\n\n /**\n * Process a single subscription: re-query via stored metadata, diff, send patch.\n * Uses optimistic locking (version field) to prevent race conditions between\n * concurrent Lambda invocations processing the same stream events.\n */\n async function processSubscription(\n connectionId: string,\n subscriptionId: string,\n ): Promise<void> {\n try {\n const response = await docClient.send(\n new GetCommand({\n TableName: queriesTable,\n Key: { pk: connectionId, sk: subscriptionId },\n }),\n );\n\n const queryState = response.Item as QueryEntry | undefined;\n if (!queryState) {\n warn(`Subscription not found: ${connectionId}/${subscriptionId}`);\n return;\n }\n\n // Re-execute the query using stored metadata\n const rawNewResult = await executeQueryFromMetadata(\n queryState.queryMetadata,\n );\n\n // If the original result was a single item, extract first item for comparison\n // so patches are generated for the same data structure the client has\n const isSingleItemResult = !Array.isArray(queryState.lastResult);\n const newResult = isSingleItemResult\n ? (rawNewResult[0] ?? null)\n : rawNewResult;\n\n if (!hasChanges(queryState.lastResult, newResult)) {\n info(\n `[stream] No changes for ${subscriptionId} (version ${queryState.version ?? 0})`,\n );\n return;\n }\n\n const patches = generatePatches(queryState.lastResult, newResult);\n\n info(\n `[stream] ${subscriptionId}: ${patches.length} patch ops, version ${queryState.version ?? 0} → ${(queryState.version ?? 0) + 1}`,\n {\n ops: patches.map((p) => `${p.op} ${p.path}`).join(', '),\n },\n );\n\n // Conditional write — only the first invocation succeeds, others skip\n const currentVersion = queryState.version ?? 0;\n try {\n await docClient.send(\n new PutCommand({\n TableName: queriesTable,\n Item: {\n ...queryState,\n lastResult: newResult,\n version: currentVersion + 1,\n updatedAt: Date.now(),\n },\n ConditionExpression:\n 'attribute_not_exists(version) OR version = :v',\n ExpressionAttributeValues: { ':v': currentVersion },\n }),\n );\n } catch (error) {\n if (\n error instanceof Error &&\n error.name === 'ConditionalCheckFailedException'\n ) {\n info(\n `[stream] Version conflict for ${subscriptionId} at version ${currentVersion}, skipping (another invocation won)`,\n );\n return;\n }\n throw error;\n }\n\n await sendPatch(connectionId, subscriptionId, patches);\n } catch (error) {\n if (error instanceof GoneException) {\n await cleanupConnection(connectionId);\n } else {\n logError(\n `Error processing subscription ${connectionId}/${subscriptionId}:`,\n error,\n );\n }\n }\n }\n\n /**\n * Remove a connection and all its subscriptions + dependency entries.\n * Parallelises deletes for performance.\n */\n async function cleanupConnection(connectionId: string): Promise<void> {\n info('Cleaning up disconnected connection:', connectionId);\n\n try {\n const subsResponse = await docClient.send(\n new QueryCommand({\n TableName: queriesTable,\n KeyConditionExpression: 'pk = :pk',\n ExpressionAttributeValues: { ':pk': connectionId },\n }),\n );\n\n const subscriptions = subsResponse.Items ?? [];\n\n // Delete all dependencies + subscriptions in parallel\n await Promise.all(\n subscriptions.map(async (sub) => {\n const deps = Array.isArray(sub.dependencies)\n ? (sub.dependencies as string[])\n : [];\n await Promise.all([\n ...deps.map((depKey) =>\n docClient.send(\n new DeleteCommand({\n TableName: dependenciesTable,\n Key: { pk: depKey, sk: `${connectionId}#${sub.sk}` },\n }),\n ),\n ),\n docClient.send(\n new DeleteCommand({\n TableName: queriesTable,\n Key: { pk: connectionId, sk: sub.sk },\n }),\n ),\n ]);\n }),\n );\n\n await docClient.send(\n new DeleteCommand({\n TableName: connectionsTable,\n Key: { connectionId },\n }),\n );\n\n info(\n 'Connection cleaned up:',\n connectionId,\n `(${subscriptions.length} subscriptions removed)`,\n );\n } catch (error) {\n logError('Error cleaning up connection:', error);\n }\n }\n\n return {\n findAffectedSubscriptions,\n executeQueryFromMetadata,\n sendPatch,\n processSubscription,\n cleanupConnection,\n };\n}\n","import { 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 { SystemTableNames } from '@dynamodb-reactive/core';\nimport {\n debug,\n error as logError,\n info,\n} from 'ag-common/dist/common/helpers/log';\nimport type { DynamoDBStreamEvent } from 'aws-lambda';\n\nimport type { DbContextConfig } from '../db-context.js';\nimport { extractAffectedKeys } from '../dependency-extractor.js';\nimport { createStreamUtils, extractTableName } from './stream-utils.js';\n\n/**\n * Configuration for the stream handler.\n * NOTE: Router is no longer required - stream processing uses stored query metadata.\n */\nexport interface StreamHandlerConfig {\n dbConfig?: DbContextConfig;\n apiGatewayEndpoint: string;\n connectionsTableName?: string;\n dependenciesTableName?: string;\n queriesTableName?: string;\n}\n\n/**\n * Create a DynamoDB stream handler for AWS Lambda.\n * Uses stored query metadata to re-execute queries WITHOUT router code.\n */\nexport function createStreamHandler(config: StreamHandlerConfig) {\n const connectionsTable =\n config.connectionsTableName ?? SystemTableNames.connections;\n const dependenciesTable =\n config.dependenciesTableName ?? SystemTableNames.dependencies;\n const queriesTable = config.queriesTableName ?? SystemTableNames.queries;\n\n const ddbClient = new DynamoDBClient({\n region: config.dbConfig?.region ?? process.env.AWS_REGION,\n });\n const docClient = DynamoDBDocumentClient.from(ddbClient);\n\n const utils = createStreamUtils({\n ddbClient,\n docClient,\n apiGatewayEndpoint: config.apiGatewayEndpoint,\n connectionsTable,\n dependenciesTable,\n queriesTable,\n });\n\n async function handler(event: DynamoDBStreamEvent): Promise<void> {\n info(\n `[stream] Processing ${event.Records.length} records from DynamoDB stream`,\n );\n\n const affectedSubscriptions = new Map<string, Set<string>>();\n\n // Collect affected dependency keys from all records\n const affectedKeys = new Set<string>();\n for (const record of event.Records) {\n if (!record.dynamodb) continue;\n\n const tableName = extractTableName(record);\n if (!tableName) continue;\n\n const newImage = record.dynamodb.NewImage\n ? unmarshall(record.dynamodb.NewImage as Record<string, AttributeValue>)\n : null;\n const oldImage = record.dynamodb.OldImage\n ? unmarshall(record.dynamodb.OldImage as Record<string, AttributeValue>)\n : null;\n\n if (newImage) {\n for (const key of extractAffectedKeys(tableName, newImage)) {\n affectedKeys.add(key);\n }\n }\n if (oldImage) {\n for (const key of extractAffectedKeys(tableName, oldImage)) {\n affectedKeys.add(key);\n }\n }\n }\n\n debug('[stream] Affected keys:', affectedKeys.size);\n\n // Parallel dependency lookups\n const lookupResults = await Promise.all(\n [...affectedKeys].map((key) => utils.findAffectedSubscriptions(key)),\n );\n\n for (const subscriptions of lookupResults) {\n for (const sub of subscriptions) {\n if (!affectedSubscriptions.has(sub.connectionId)) {\n affectedSubscriptions.set(sub.connectionId, new Set());\n }\n affectedSubscriptions.get(sub.connectionId)!.add(sub.subscriptionId);\n }\n }\n\n let totalSubs = 0;\n for (const [, subs] of affectedSubscriptions) {\n totalSubs += subs.size;\n }\n info(\n `[stream] Found ${affectedSubscriptions.size} affected connections, ${totalSubs} subscriptions`,\n );\n\n const sendPromises: Promise<void>[] = [];\n for (const [connectionId, subscriptionIds] of affectedSubscriptions) {\n for (const subscriptionId of subscriptionIds) {\n sendPromises.push(\n utils.processSubscription(connectionId, subscriptionId),\n );\n }\n }\n\n await Promise.allSettled(sendPromises);\n info('[stream] Processing complete');\n }\n\n return { handler };\n}\n\n/**\n * WebSocket connection handler for $connect\n */\nexport function createConnectHandler(\n config: Pick<StreamHandlerConfig, 'dbConfig' | 'connectionsTableName'>,\n) {\n const connectionsTable =\n config.connectionsTableName ?? SystemTableNames.connections;\n const ddbClient = new DynamoDBClient({\n region: config.dbConfig?.region ?? process.env.AWS_REGION,\n });\n const docClient = DynamoDBDocumentClient.from(ddbClient);\n\n return async function handler(event: {\n requestContext: {\n connectionId: string;\n authorizer?: Record<string, unknown>;\n };\n }): Promise<{ statusCode: number }> {\n const connectionId = event.requestContext.connectionId;\n const now = Date.now();\n const ttl = Math.floor(now / 1000) + 3600;\n\n try {\n const connectionEntry: ConnectionEntry = {\n connectionId,\n context: event.requestContext.authorizer,\n connectedAt: now,\n ttl,\n };\n\n await docClient.send(\n new PutCommand({\n TableName: connectionsTable,\n Item: connectionEntry,\n }),\n );\n\n debug('[stream] Connection established:', connectionId);\n return { statusCode: 200 };\n } catch (error) {\n logError('Error creating connection:', error);\n return { statusCode: 500 };\n }\n };\n}\n\n/**\n * WebSocket disconnection handler for $disconnect.\n * Fully cleans up connection entry, subscriptions, and dependencies.\n */\nexport function createDisconnectHandler(\n config: Pick<\n StreamHandlerConfig,\n | 'dbConfig'\n | 'connectionsTableName'\n | 'queriesTableName'\n | 'dependenciesTableName'\n | 'apiGatewayEndpoint'\n >,\n) {\n const connectionsTable =\n config.connectionsTableName ?? SystemTableNames.connections;\n const dependenciesTable =\n config.dependenciesTableName ?? SystemTableNames.dependencies;\n const queriesTable = config.queriesTableName ?? SystemTableNames.queries;\n\n const ddbClient = new DynamoDBClient({\n region: config.dbConfig?.region ?? process.env.AWS_REGION,\n });\n const docClient = DynamoDBDocumentClient.from(ddbClient);\n\n const utils = createStreamUtils({\n ddbClient,\n docClient,\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 const connectionId = event.requestContext.connectionId;\n\n try {\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","/**\n * Lambda handler implementations for the reactive WebSocket system.\n *\n * These handlers process WebSocket events and DynamoDB stream events\n * WITHOUT requiring user router code at runtime.\n *\n * Stream processing uses stored query metadata to evaluate changes\n * directly, rather than re-executing queries through a router.\n */\n\nimport {\n ApiGatewayManagementApiClient,\n PostToConnectionCommand,\n} from '@aws-sdk/client-apigatewaymanagementapi';\nimport { type AttributeValue, DynamoDBClient } from '@aws-sdk/client-dynamodb';\nimport {\n DeleteCommand,\n DynamoDBDocumentClient,\n GetCommand,\n PutCommand,\n} from '@aws-sdk/lib-dynamodb';\nimport { unmarshall } from '@aws-sdk/util-dynamodb';\nimport type { ConnectionEntry, QueryEntry } from '@dynamodb-reactive/core';\nimport { SystemTableNames } from '@dynamodb-reactive/core';\nimport { error as logError, info } from 'ag-common/dist/common/helpers/log';\nimport type {\n APIGatewayProxyEvent,\n APIGatewayProxyResult,\n DynamoDBStreamEvent,\n} from 'aws-lambda';\n\nimport { extractAffectedKeys } from '../dependency-extractor.js';\nimport { createStreamUtils, extractTableName } from './stream-utils.js';\n\n/**\n * Create all Lambda handlers.\n * No user code required - all configuration comes from environment variables.\n * The stream handler uses stored query metadata (PartiQL), not router code.\n */\nexport function createLambdaHandlers() {\n // Get table names from environment\n const connectionsTable =\n process.env.CONNECTIONS_TABLE ?? SystemTableNames.connections;\n const dependenciesTable =\n process.env.DEPENDENCIES_TABLE ?? SystemTableNames.dependencies;\n const queriesTable = process.env.QUERIES_TABLE ?? SystemTableNames.queries;\n const wsEndpoint = process.env.WEBSOCKET_ENDPOINT ?? '';\n\n // Create DynamoDB client\n const ddbClient = new DynamoDBClient({\n region: process.env.AWS_REGION,\n });\n const docClient = DynamoDBDocumentClient.from(ddbClient);\n\n const utils = createStreamUtils({\n ddbClient,\n docClient,\n apiGatewayEndpoint: wsEndpoint,\n connectionsTable,\n dependenciesTable,\n queriesTable,\n });\n\n // Create API Gateway Management client (lazy to avoid endpoint issues during init)\n const getApiClient = () =>\n new ApiGatewayManagementApiClient({\n endpoint: wsEndpoint,\n });\n\n /**\n * $connect handler - Register new WebSocket connections\n */\n async function connectHandler(\n event: APIGatewayProxyEvent,\n ): Promise<APIGatewayProxyResult> {\n const connectionId = event.requestContext.connectionId!;\n const now = Date.now();\n const ttl = Math.floor(now / 1000) + 3600; // 1 hour TTL\n\n try {\n const connectionEntry: ConnectionEntry = {\n connectionId,\n context: event.requestContext.authorizer as\n | Record<string, unknown>\n | undefined,\n connectedAt: now,\n ttl,\n };\n\n await docClient.send(\n new PutCommand({\n TableName: connectionsTable,\n Item: connectionEntry,\n }),\n );\n\n info('Connection established:', connectionId);\n return { statusCode: 200, body: 'Connected' };\n } catch (error) {\n logError('Error creating connection:', error);\n return { statusCode: 500, body: 'Failed to connect' };\n }\n }\n\n /**\n * $disconnect handler - Clean up disconnected connections\n */\n async function disconnectHandler(\n event: APIGatewayProxyEvent,\n ): Promise<APIGatewayProxyResult> {\n const connectionId = event.requestContext.connectionId!;\n\n try {\n await utils.cleanupConnection(connectionId);\n return { statusCode: 200, body: 'Disconnected' };\n } catch (error) {\n logError('Error removing connection:', error);\n return { statusCode: 500, body: 'Failed to disconnect' };\n }\n }\n\n /**\n * $default handler - Handle WebSocket messages\n * Handles: init (returns connectionId), unsubscribe\n * Subscribe/call are handled by the app's HTTP API route.\n */\n async function messageHandler(\n event: APIGatewayProxyEvent,\n ): Promise<APIGatewayProxyResult> {\n const connectionId = event.requestContext.connectionId!;\n\n try {\n const body = JSON.parse(event.body ?? '{}');\n const { type, subscriptionId } = body;\n\n let response: unknown;\n\n switch (type) {\n case 'init': {\n // Client requests its connectionId after WebSocket connects\n // This is needed so the client can include connectionId in HTTP requests\n response = {\n type: 'connected',\n connectionId,\n };\n break;\n }\n\n case 'ping': {\n // Client verifies connection is fully working with ping/pong\n response = {\n type: 'pong',\n };\n break;\n }\n\n case 'unsubscribe': {\n // Get the subscription to find its dependencies\n const subResponse = await docClient.send(\n new GetCommand({\n TableName: queriesTable,\n Key: { pk: connectionId, sk: subscriptionId },\n }),\n );\n\n if (subResponse.Item) {\n const queryEntry = subResponse.Item as QueryEntry;\n\n await Promise.all(\n queryEntry.dependencies.map((key) =>\n docClient.send(\n new DeleteCommand({\n TableName: dependenciesTable,\n Key: { pk: key, sk: `${connectionId}#${subscriptionId}` },\n }),\n ),\n ),\n );\n }\n\n await docClient.send(\n new DeleteCommand({\n TableName: queriesTable,\n Key: { pk: connectionId, sk: subscriptionId },\n }),\n );\n\n response = { type: 'result', data: { success: true } };\n break;\n }\n\n default:\n // Subscribe and call are handled by the app's HTTP API route\n // which has access to the router\n response = {\n type: 'error',\n message: `Message type '${type}' should be handled by the app API route`,\n };\n }\n\n // Send response back through WebSocket\n const apiClient = getApiClient();\n await apiClient.send(\n new PostToConnectionCommand({\n ConnectionId: connectionId,\n Data: Buffer.from(JSON.stringify(response)),\n }),\n );\n\n return { statusCode: 200, body: 'OK' };\n } catch (error) {\n logError('Error handling message:', error);\n return { statusCode: 500, body: 'Internal server error' };\n }\n }\n\n /**\n * DynamoDB Stream handler - Process changes and push updates.\n * Uses stored query metadata to evaluate changes WITHOUT router code.\n */\n async function streamHandler(event: DynamoDBStreamEvent): Promise<void> {\n info(\n `[stream] Processing ${event.Records.length} records from DynamoDB stream`,\n );\n\n const affectedSubscriptions = new Map<string, Set<string>>();\n\n // Collect affected dependency keys from all records\n const affectedKeys = new Set<string>();\n for (const record of event.Records) {\n if (!record.dynamodb) continue;\n\n const tableName = extractTableName(record);\n if (!tableName) continue;\n\n const newImage = record.dynamodb.NewImage\n ? unmarshall(record.dynamodb.NewImage as Record<string, AttributeValue>)\n : null;\n const oldImage = record.dynamodb.OldImage\n ? unmarshall(record.dynamodb.OldImage as Record<string, AttributeValue>)\n : null;\n\n if (newImage) {\n for (const key of extractAffectedKeys(tableName, newImage)) {\n affectedKeys.add(key);\n }\n }\n if (oldImage) {\n for (const key of extractAffectedKeys(tableName, oldImage)) {\n affectedKeys.add(key);\n }\n }\n }\n\n // Find subscriptions affected by these keys (parallel lookups)\n const lookupResults = await Promise.all(\n [...affectedKeys].map((key) => utils.findAffectedSubscriptions(key)),\n );\n\n for (const subscriptions of lookupResults) {\n for (const sub of subscriptions) {\n if (!affectedSubscriptions.has(sub.connectionId)) {\n affectedSubscriptions.set(sub.connectionId, new Set());\n }\n affectedSubscriptions.get(sub.connectionId)!.add(sub.subscriptionId);\n }\n }\n\n // Count total subscriptions across all connections\n let totalSubs = 0;\n for (const [, subs] of affectedSubscriptions) {\n totalSubs += subs.size;\n }\n info(\n `[stream] Found ${affectedSubscriptions.size} affected connections, ${totalSubs} subscriptions`,\n );\n\n // Process each affected subscription\n const sendPromises: Promise<void>[] = [];\n for (const [connectionId, subscriptionIds] of affectedSubscriptions) {\n for (const subscriptionId of subscriptionIds) {\n sendPromises.push(\n utils.processSubscription(connectionId, subscriptionId),\n );\n }\n }\n\n await Promise.allSettled(sendPromises);\n info('[stream] Processing complete');\n }\n\n return {\n connectHandler,\n disconnectHandler,\n messageHandler,\n streamHandler,\n };\n}\n","/**\n * Filter evaluator for evaluating FilterCondition against DynamoDB records.\n * Used by the stream handler to determine if a record matches a subscription's query.\n */\n\nimport type { FilterCondition } from '@dynamodb-reactive/core';\nimport { warn } from 'ag-common/dist/common/helpers/log';\n\n/**\n * Evaluate a filter condition against a record.\n * Returns true if the record matches the filter.\n */\nexport function evaluateFilter(\n filter: FilterCondition,\n record: Record<string, unknown>,\n): boolean {\n switch (filter.type) {\n case 'comparison':\n return evaluateComparison(filter, record);\n case 'logical':\n return evaluateLogical(filter, record);\n case 'function':\n return evaluateFunction(filter, record);\n default:\n warn(`Unknown filter type: ${filter.type}`);\n return false;\n }\n}\n\n/**\n * Evaluate multiple filter conditions (all must match - AND logic).\n */\nexport function evaluateFilters(\n filters: FilterCondition[],\n record: Record<string, unknown>,\n): boolean {\n if (filters.length === 0) return true;\n return filters.every((filter) => evaluateFilter(filter, record));\n}\n\n/**\n * Evaluate a comparison filter (eq, ne, gt, gte, lt, lte, between).\n */\nfunction evaluateComparison(\n filter: FilterCondition,\n record: Record<string, unknown>,\n): boolean {\n const { operator, field, value, value2 } = filter;\n if (!field || !operator) return false;\n\n const fieldValue = getFieldValue(record, field);\n\n switch (operator) {\n case 'eq':\n return fieldValue === value;\n case 'ne':\n return fieldValue !== value;\n case 'gt':\n return compareValues(fieldValue, value) > 0;\n case 'gte':\n return compareValues(fieldValue, value) >= 0;\n case 'lt':\n return compareValues(fieldValue, value) < 0;\n case 'lte':\n return compareValues(fieldValue, value) <= 0;\n case 'between':\n return (\n compareValues(fieldValue, value) >= 0 &&\n compareValues(fieldValue, value2) <= 0\n );\n default:\n warn(`Unknown comparison operator: ${operator}`);\n return false;\n }\n}\n\n/**\n * Evaluate a logical filter (and, or, not).\n */\nfunction evaluateLogical(\n filter: FilterCondition,\n record: Record<string, unknown>,\n): boolean {\n const { operator, conditions } = filter;\n if (!operator || !conditions) return false;\n\n switch (operator) {\n case 'and':\n return conditions.every((c) => evaluateFilter(c, record));\n case 'or':\n return conditions.some((c) => evaluateFilter(c, record));\n case 'not':\n return conditions.length > 0 && !evaluateFilter(conditions[0], record);\n default:\n warn(`Unknown logical operator: ${operator}`);\n return false;\n }\n}\n\n/**\n * Evaluate a function filter (beginsWith, contains).\n */\nfunction evaluateFunction(\n filter: FilterCondition,\n record: Record<string, unknown>,\n): boolean {\n const { operator, field, value } = filter;\n if (!field || !operator) return false;\n\n const fieldValue = getFieldValue(record, field);\n\n switch (operator) {\n case 'beginsWith':\n return (\n typeof fieldValue === 'string' &&\n typeof value === 'string' &&\n fieldValue.startsWith(value)\n );\n case 'contains':\n return (\n typeof fieldValue === 'string' &&\n typeof value === 'string' &&\n fieldValue.includes(value)\n );\n default:\n warn(`Unknown function operator: ${operator}`);\n return false;\n }\n}\n\n/**\n * Get a field value from a record, supporting nested paths (e.g., \"user.name\").\n */\nfunction getFieldValue(\n record: Record<string, unknown>,\n field: string,\n): unknown {\n const parts = field.split('.');\n let value: unknown = record;\n\n for (const part of parts) {\n if (value === null || value === undefined) return undefined;\n if (typeof value !== 'object') return undefined;\n value = (value as Record<string, unknown>)[part];\n }\n\n return value;\n}\n\n/**\n * Compare two values for ordering.\n * Returns negative if a < b, positive if a > b, zero if equal.\n */\nfunction compareValues(a: unknown, b: unknown): number {\n // Handle null/undefined\n if (a === null || a === undefined) {\n return b === null || b === undefined ? 0 : -1;\n }\n if (b === null || b === undefined) {\n return 1;\n }\n\n // Numbers\n if (typeof a === 'number' && typeof b === 'number') {\n return a - b;\n }\n\n // Strings\n if (typeof a === 'string' && typeof b === 'string') {\n return a.localeCompare(b);\n }\n\n // Booleans\n if (typeof a === 'boolean' && typeof b === 'boolean') {\n return a === b ? 0 : a ? 1 : -1;\n }\n\n // Fallback: convert to string\n return String(a).localeCompare(String(b));\n}\n\n/**\n * Sort records by a field.\n */\nexport function sortRecords(\n records: Record<string, unknown>[],\n sortField?: string,\n sortOrder: 'asc' | 'desc' = 'asc',\n): Record<string, unknown>[] {\n if (!sortField) return records;\n\n return [...records].sort((a, b) => {\n const aValue = getFieldValue(a, sortField);\n const bValue = getFieldValue(b, sortField);\n const comparison = compareValues(aValue, bValue);\n return sortOrder === 'desc' ? -comparison : comparison;\n });\n}\n\n/**\n * Find the primary key value(s) from a record.\n * Used to identify records for update/removal.\n */\nexport function getRecordKey(\n record: Record<string, unknown>,\n pkField: string,\n skField?: string,\n): string {\n const pk = record[pkField];\n const sk = skField ? record[skField] : undefined;\n return sk !== undefined ? `${pk}#${sk}` : String(pk);\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../../server/src/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"]}
|