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