dynamodb-reactive 0.2.3 → 0.2.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/dist/infra.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../infra/src/handlers/lambda-handlers.ts","../../core/src/schema.ts","../../infra/src/tables.ts","../../infra/src/engine.ts"],"names":["cdk","Construct","dynamodb2"],"mappings":"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","file":"infra.js","sourcesContent":["/**\n * Entry point code generator for the reactive Lambda handlers.\n *\n * No user code is imported - the handlers use only environment variables\n * and stored query metadata for all operations.\n */\n\n/**\n * Generate the entry point code for Lambda functions.\n * This is called by the CDK construct to create the bundled entry file.\n */\nexport function generateEntryPointCode(): string {\n return `// Auto-generated entry point for reactive Lambda handlers\n// No user code required - all configuration comes from environment variables\nimport { createLambdaHandlers } from 'dynamodb-reactive/server';\n\nconst handlers = createLambdaHandlers();\n\nexport const connectHandler = handlers.connectHandler;\nexport const disconnectHandler = handlers.disconnectHandler;\nexport const messageHandler = handlers.messageHandler;\nexport const streamHandler = handlers.streamHandler;\n`;\n}\n","import { z } from 'zod';\n\nimport type { FilterCondition } from './types.js';\n\nexport const FilterConditionSchema: z.ZodType<FilterCondition> = z.lazy(() => {\n const comparison = z\n .object({\n type: z.literal('comparison'),\n operator: z.enum(['eq', 'ne', 'gt', 'gte', 'lt', 'lte']),\n field: z.string().min(1),\n value: z.unknown(),\n })\n .strict();\n const queryFunction = z.union([\n z\n .object({\n type: z.literal('function'),\n operator: z.literal('between'),\n field: z.string().min(1),\n value: z.unknown(),\n value2: z.unknown(),\n })\n .strict(),\n z\n .object({\n type: z.literal('function'),\n operator: z.enum(['beginsWith', 'contains']),\n field: z.string().min(1),\n value: z.unknown(),\n })\n .strict(),\n ]);\n const logical = z\n .object({\n type: z.literal('logical'),\n operator: z.enum(['and', 'or', 'not']),\n conditions: z.array(FilterConditionSchema).min(1),\n })\n .strict()\n .superRefine((condition, context) => {\n if (condition.operator === 'not' && condition.conditions.length !== 1) {\n context.addIssue({\n code: 'custom',\n path: ['conditions'],\n message: 'not requires exactly one condition',\n });\n }\n });\n return z.union([comparison, queryFunction, logical]);\n});\n\nexport const QueryMetadataSchema = z\n .object({\n planVersion: z.literal(1),\n tableName: z.string().min(1),\n indexName: z.string().min(1).optional(),\n indexPkField: z.string().min(1).optional(),\n indexSkField: z.string().min(1).optional(),\n filterConditions: z.array(FilterConditionSchema),\n sortField: z.string().min(1).optional(),\n sortOrder: z.enum(['asc', 'desc']).optional(),\n limit: z.number().int().positive().optional(),\n })\n .strict()\n .superRefine((metadata, context) => {\n if (metadata.indexName && !metadata.indexPkField) {\n context.addIssue({\n code: 'custom',\n path: ['indexPkField'],\n message: 'Index metadata requires its partition key field',\n });\n }\n if (!metadata.indexName && (metadata.indexPkField || metadata.indexSkField)) {\n context.addIssue({\n code: 'custom',\n path: ['indexName'],\n message: 'Index key fields require an index name',\n });\n }\n if (Boolean(metadata.sortField) !== Boolean(metadata.sortOrder)) {\n context.addIssue({\n code: 'custom',\n path: ['sortOrder'],\n message: 'Sort field and order must be specified together',\n });\n }\n });\n\nconst DeliveryVersionSchema = z.object({\n generation: z.number().int().nonnegative(),\n fromVersion: z.number().int().nonnegative(),\n toVersion: z.number().int().positive(),\n messageId: z.string().min(1),\n});\n\nexport const PendingDeliverySchema = z.discriminatedUnion('type', [\n DeliveryVersionSchema.extend({\n type: z.literal('patch'),\n patches: z.array(\n z.object({\n op: z.enum(['add', 'remove', 'replace', 'move', 'copy', 'test']),\n path: z.string(),\n value: z.unknown().optional(),\n from: z.string().optional(),\n }),\n ),\n }),\n DeliveryVersionSchema.extend({\n type: z.literal('resync'),\n }).strict(),\n]);\n\n/**\n * System table schemas for the reactive engine\n */\nexport const SystemSchemas = {\n /**\n * ReactiveConnectionsV2 - Tracks active WebSocket connections\n */\n connections: z.object({\n connectionId: z.string(),\n status: z.enum(['open', 'closed']),\n context: z.record(z.string(), z.unknown()).optional(),\n authorizerContext: z.record(z.string(), z.unknown()).optional(),\n requestIdentity: z.record(z.string(), z.unknown()).optional(),\n connectedAt: z.number(),\n ttl: z.number(),\n }),\n\n /**\n * ReactiveDependenciesV2 - The inverted index for O(1) lookups\n */\n dependencies: z.object({\n pk: z.string(), // Versioned encoded dependency key\n sk: z.string(), // ConnectionID#SubscriptionID\n connectionId: z.string(),\n subscriptionId: z.string(),\n tableName: z.string(),\n fieldName: z.string(),\n fieldValue: z.string(),\n generation: z.number().int().nonnegative(),\n registrationId: z.string().min(1),\n ttl: z.number(),\n }),\n\n /**\n * ReactiveConnectionQueriesV2 - Stores subscription state for diffing\n */\n queries: z.object({\n pk: z.string(), // ConnectionID\n sk: z.string(), // SubscriptionID\n connectionId: z.string(),\n subscriptionId: z.string(),\n status: z.enum(['registering', 'active', 'cancelled', 'faulted']),\n generation: z.number().int().nonnegative(),\n registrationId: z.string().min(1),\n queryMetadata: QueryMetadataSchema,\n lastResult: z.array(z.unknown()),\n dependencies: z.array(z.string()),\n version: z.number().int().nonnegative(),\n pendingDelivery: PendingDeliverySchema.optional(),\n createdAt: z.number(),\n updatedAt: z.number(),\n ttl: z.number(),\n }),\n};\n\n/** Storage/protocol generation used by all reactive system tables. */\nexport const SYSTEM_TABLE_PROTOCOL_VERSION = 2 as const;\n\n/**\n * Versioned system table names. The V2 suffix intentionally prevents state\n * written by the incompatible 0.1.x dependency protocol from being reused.\n */\nexport const SystemTableNames = {\n connections: 'ReactiveConnectionsV2',\n dependencies: 'ReactiveDependenciesV2',\n queries: 'ReactiveConnectionQueriesV2',\n} as const;\n","import { SystemTableNames } from '@dynamodb-reactive/core';\nimport * as cdk from 'aws-cdk-lib';\nimport * as dynamodb from 'aws-cdk-lib/aws-dynamodb';\nimport { Construct } from 'constructs';\n\n/**\n * Provisioning mode for DynamoDB tables\n * - \"ON_DEMAND\": Pay-per-request billing (default)\n * - { readWrite: number }: Provisioned capacity with specified RCU/WCU\n */\nexport type ProvisioningMode = 'ON_DEMAND' | { readWrite: number };\n\n/**\n * Props for ReactiveSystemTables\n */\nexport interface ReactiveSystemTablesProps {\n /**\n * Nonempty, concrete prefix for the fixed physical table names.\n * Use the same value as the application's `tablePrefix`.\n */\n tablePrefix: string;\n\n /**\n * Provisioning mode for tables\n * @default \"ON_DEMAND\"\n */\n provisioningMode?: ProvisioningMode;\n\n /**\n * Policy applied when a system table is removed or replaced.\n * Set to RemovalPolicy.DESTROY only for disposable environments.\n * Retained tables have fixed names, so recreating a stack with the same\n * prefix requires importing or manually removing any retained tables first.\n * @default RemovalPolicy.RETAIN\n */\n removalPolicy?: cdk.RemovalPolicy;\n}\n\n/**\n * Creates the three system tables for the reactive engine\n */\nexport class ReactiveSystemTables extends Construct {\n /**\n * ReactiveConnections table - tracks WebSocket connections\n */\n public readonly connectionsTable: dynamodb.Table;\n\n /**\n * ReactiveDependencies table - the inverted index\n */\n public readonly dependenciesTable: dynamodb.Table;\n\n /**\n * ReactiveConnectionQueries table - stores subscription state\n */\n public readonly queriesTable: dynamodb.Table;\n\n constructor(\n scope: Construct,\n id: string,\n props: ReactiveSystemTablesProps,\n ) {\n super(scope, id);\n\n if (\n cdk.Token.isUnresolved(props.tablePrefix) ||\n !/^[A-Za-z0-9][A-Za-z0-9_-]*$/.test(props.tablePrefix) ||\n props.tablePrefix.length > 229\n ) {\n throw new Error(\n 'ReactiveSystemTables tablePrefix must be a nonempty concrete value of at most 229 letters, numbers, hyphens, or underscores, starting with a letter or number.',\n );\n }\n\n const tableName = (name: string): string =>\n `${props.tablePrefix}-${name}`;\n const provisioningMode = props.provisioningMode ?? 'ON_DEMAND';\n const removalPolicy = props.removalPolicy ?? cdk.RemovalPolicy.RETAIN;\n\n // Determine billing/capacity settings\n const isOnDemand = provisioningMode === 'ON_DEMAND';\n const capacityProps = isOnDemand\n ? { billingMode: dynamodb.BillingMode.PAY_PER_REQUEST }\n : {\n billingMode: dynamodb.BillingMode.PROVISIONED,\n readCapacity: provisioningMode.readWrite,\n writeCapacity: provisioningMode.readWrite,\n };\n\n // ReactiveConnections Table\n // Tracks active WebSocket connections and user context\n this.connectionsTable = new dynamodb.Table(this, 'ConnectionsTable', {\n tableName: tableName(SystemTableNames.connections),\n partitionKey: {\n name: 'connectionId',\n type: dynamodb.AttributeType.STRING,\n },\n ...capacityProps,\n removalPolicy,\n timeToLiveAttribute: 'ttl',\n });\n\n // ReactiveDependencies Table (The Inverted Index)\n // Maps Field#Value -> ConnectionID for O(1) lookups\n this.dependenciesTable = new dynamodb.Table(this, 'DependenciesTable', {\n tableName: tableName(SystemTableNames.dependencies),\n partitionKey: {\n name: 'pk', // Format: \"TableName#FieldName#FieldValue\"\n type: dynamodb.AttributeType.STRING,\n },\n sortKey: {\n name: 'sk', // Format: \"ConnectionID#SubscriptionID\"\n type: dynamodb.AttributeType.STRING,\n },\n ...capacityProps,\n removalPolicy,\n timeToLiveAttribute: 'ttl',\n });\n\n // Add GSI for querying by connectionId (for cleanup)\n // For provisioned mode, GSI needs its own capacity\n const gsiProps = isOnDemand\n ? {}\n : {\n readCapacity: provisioningMode.readWrite,\n writeCapacity: provisioningMode.readWrite,\n };\n\n this.dependenciesTable.addGlobalSecondaryIndex({\n indexName: 'byConnectionId',\n partitionKey: {\n name: 'connectionId',\n type: dynamodb.AttributeType.STRING,\n },\n projectionType: dynamodb.ProjectionType.KEYS_ONLY,\n ...gsiProps,\n });\n\n // ReactiveConnectionQueries Table\n // Stores subscription state for diffing\n this.queriesTable = new dynamodb.Table(this, 'QueriesTable', {\n tableName: tableName(SystemTableNames.queries),\n partitionKey: {\n name: 'pk', // ConnectionID\n type: dynamodb.AttributeType.STRING,\n },\n sortKey: {\n name: 'sk', // SubscriptionID\n type: dynamodb.AttributeType.STRING,\n },\n ...capacityProps,\n removalPolicy,\n timeToLiveAttribute: 'ttl',\n });\n }\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\n\nimport type { AnyDynamoTable } from '@dynamodb-reactive/core';\nimport * as cdk from 'aws-cdk-lib';\nimport * as apigatewayv2 from 'aws-cdk-lib/aws-apigatewayv2';\nimport * as apigatewayv2Integrations from 'aws-cdk-lib/aws-apigatewayv2-integrations';\nimport * as dynamodb from 'aws-cdk-lib/aws-dynamodb';\nimport * as iam from 'aws-cdk-lib/aws-iam';\nimport * as lambda from 'aws-cdk-lib/aws-lambda';\nimport * as nodejs from 'aws-cdk-lib/aws-lambda-nodejs';\nimport * as logs from 'aws-cdk-lib/aws-logs';\nimport { Construct } from 'constructs';\n\nimport { generateEntryPointCode } from './handlers/lambda-handlers.js';\nimport {\n ReactiveSystemTables,\n type ReactiveSystemTablesProps,\n} from './tables.js';\n\nconst PARTIQL_ACTIONS = [\n 'dynamodb:PartiQLInsert',\n 'dynamodb:PartiQLUpdate',\n 'dynamodb:PartiQLDelete',\n];\n\n/** Associates an application table definition with its deployed CDK table. */\nexport interface ReactiveTableBinding {\n readonly definition: AnyDynamoTable;\n\n /**\n * Deployed table with DynamoDB Streams configured for NEW_AND_OLD_IMAGES.\n * Imported ITable resources must supply tableStreamArn; CDK cannot expose\n * their stream view type, so callers remain responsible for that setting.\n */\n readonly table: dynamodb.ITable;\n}\n\n/** Props for ReactiveEngine construct. */\nexport interface ReactiveEngineProps {\n /** User-defined tables and their deployed CDK resources. */\n tables: readonly ReactiveTableBinding[];\n\n /**\n * Authorizer applied to the WebSocket $connect route.\n * WebSocketIamAuthorizer is supported; its requestContext.identity is\n * persisted with the connection. Lambda authorizer context is also persisted.\n * Authorizers whose bind result uses NONE authorization are rejected.\n */\n connectAuthorizer?: apigatewayv2.IWebSocketRouteAuthorizer;\n\n /**\n * Explicitly permit unauthenticated WebSocket connections.\n * Cannot be combined with connectAuthorizer.\n * @default false\n */\n allowUnauthenticatedConnections?: boolean;\n\n /**\n * Nonempty, concrete prefix for physical resource names. Pass this same value\n * as the server application's `tablePrefix`.\n */\n resourcePrefix: string;\n\n /** System tables configuration. */\n systemTablesProps?: Omit<ReactiveSystemTablesProps, 'tablePrefix'>;\n\n /** Environment variables for Lambda functions. */\n environment?: Record<string, string>;\n}\n\n/** Main CDK construct for the reactive DynamoDB system. */\nexport class ReactiveEngine extends Construct {\n public readonly tables: readonly ReactiveTableBinding[];\n public readonly systemTables: ReactiveSystemTables;\n public readonly webSocketApi: apigatewayv2.WebSocketApi;\n public readonly webSocketStage: apigatewayv2.WebSocketStage;\n public readonly connectHandler: lambda.Function;\n public readonly disconnectHandler: lambda.Function;\n public readonly messageHandler: lambda.Function;\n public readonly streamHandler: lambda.Function;\n public readonly webSocketUrl: string;\n public readonly callbackUrl: string;\n\n constructor(scope: Construct, id: string, props: ReactiveEngineProps) {\n super(scope, id);\n\n if (\n cdk.Token.isUnresolved(props.resourcePrefix) ||\n !/^[A-Za-z0-9][A-Za-z0-9_-]*$/.test(props.resourcePrefix) ||\n props.resourcePrefix.length > 45\n ) {\n throw new Error(\n 'ReactiveEngine resourcePrefix must be a nonempty concrete value of at most 45 letters, numbers, hyphens, or underscores, starting with a letter or number.',\n );\n }\n\n if (props.connectAuthorizer && props.allowUnauthenticatedConnections) {\n throw new Error(\n 'Specify either connectAuthorizer or allowUnauthenticatedConnections, not both.',\n );\n }\n if (\n props.connectAuthorizer instanceof apigatewayv2.WebSocketNoneAuthorizer\n ) {\n throw new Error(\n 'WebSocketNoneAuthorizer does not authenticate connections. Set allowUnauthenticatedConnections to true instead.',\n );\n }\n if (!props.connectAuthorizer && !props.allowUnauthenticatedConnections) {\n throw new Error(\n 'WebSocket authentication is required. Provide connectAuthorizer or explicitly set allowUnauthenticatedConnections to true.',\n );\n }\n\n for (const binding of props.tables) {\n this.validateTableName(binding);\n this.validateStream(binding);\n }\n this.tables = [...props.tables];\n\n const resourceName = (name: string): string =>\n `${props.resourcePrefix}-${name}`;\n const memorySize = 128;\n const timeout = cdk.Duration.seconds(30);\n\n this.systemTables = new ReactiveSystemTables(this, 'SystemTables', {\n ...props.systemTablesProps,\n tablePrefix: props.resourcePrefix,\n });\n\n this.webSocketApi = new apigatewayv2.WebSocketApi(this, 'WebSocketApi', {\n apiName: resourceName('ReactiveWebSocket'),\n });\n\n this.webSocketStage = new apigatewayv2.WebSocketStage(\n this,\n 'WebSocketStage',\n {\n webSocketApi: this.webSocketApi,\n stageName: 'prod',\n autoDeploy: true,\n },\n );\n\n this.webSocketUrl = this.webSocketStage.url;\n this.callbackUrl = this.webSocketStage.callbackUrl;\n\n // Every engine uses the same generated source, so its path and asset are stable.\n const cdkOutDir = path.join(process.cwd(), 'cdk.out', '.generated');\n fs.mkdirSync(cdkOutDir, { recursive: true });\n const entryPointPath = path.join(cdkOutDir, 'reactive-entry.ts');\n fs.writeFileSync(entryPointPath, generateEntryPointCode());\n\n const environment: Record<string, string> = {\n ...props.environment,\n CONNECTIONS_TABLE: this.systemTables.connectionsTable.tableName,\n DEPENDENCIES_TABLE: this.systemTables.dependenciesTable.tableName,\n QUERIES_TABLE: this.systemTables.queriesTable.tableName,\n WEBSOCKET_ENDPOINT: this.callbackUrl,\n LOG_LEVEL: props.environment?.LOG_LEVEL ?? 'INFO',\n };\n const bundling: nodejs.BundlingOptions = {\n format: nodejs.OutputFormat.CJS,\n minify: true,\n sourceMap: false,\n target: 'node24',\n };\n\n this.connectHandler = new nodejs.NodejsFunction(this, 'ConnectHandler', {\n functionName: resourceName('ReactiveConnect'),\n runtime: lambda.Runtime.NODEJS_24_X,\n handler: 'connectHandler',\n entry: entryPointPath,\n bundling,\n environment,\n memorySize,\n timeout,\n logGroup: this.createLogGroup('ConnectLogGroup'),\n });\n\n this.disconnectHandler = new nodejs.NodejsFunction(\n this,\n 'DisconnectHandler',\n {\n functionName: resourceName('ReactiveDisconnect'),\n runtime: lambda.Runtime.NODEJS_24_X,\n handler: 'disconnectHandler',\n entry: entryPointPath,\n bundling,\n environment,\n memorySize,\n timeout,\n logGroup: this.createLogGroup('DisconnectLogGroup'),\n },\n );\n\n this.messageHandler = new nodejs.NodejsFunction(this, 'MessageHandler', {\n functionName: resourceName('ReactiveMessage'),\n runtime: lambda.Runtime.NODEJS_24_X,\n handler: 'messageHandler',\n entry: entryPointPath,\n bundling,\n environment,\n memorySize,\n timeout,\n logGroup: this.createLogGroup('MessageLogGroup'),\n });\n\n this.streamHandler = new nodejs.NodejsFunction(this, 'StreamHandler', {\n functionName: resourceName('ReactiveStream'),\n runtime: lambda.Runtime.NODEJS_24_X,\n handler: 'streamHandler',\n entry: entryPointPath,\n bundling,\n environment: {\n ...environment,\n USER_TABLES: props.tables\n .map(({ definition }) => definition.tableName)\n .join(','),\n },\n memorySize,\n timeout,\n logGroup: this.createLogGroup('StreamLogGroup'),\n });\n\n iam.Grant.addToPrincipal({\n grantee: this.connectHandler,\n actions: ['dynamodb:PutItem'],\n resourceArns: [this.systemTables.connectionsTable.tableArn],\n });\n iam.Grant.addToPrincipal({\n grantee: this.disconnectHandler,\n actions: ['dynamodb:UpdateItem'],\n resourceArns: [this.systemTables.connectionsTable.tableArn],\n });\n iam.Grant.addToPrincipal({\n grantee: this.disconnectHandler,\n actions: ['dynamodb:Query', 'dynamodb:UpdateItem'],\n resourceArns: [this.systemTables.queriesTable.tableArn],\n });\n iam.Grant.addToPrincipal({\n grantee: this.disconnectHandler,\n actions: ['dynamodb:DeleteItem'],\n resourceArns: [this.systemTables.dependenciesTable.tableArn],\n });\n iam.Grant.addToPrincipal({\n grantee: this.messageHandler,\n actions: ['dynamodb:UpdateItem'],\n resourceArns: [this.systemTables.connectionsTable.tableArn],\n });\n iam.Grant.addToPrincipal({\n grantee: this.streamHandler,\n actions: ['dynamodb:UpdateItem'],\n resourceArns: [this.systemTables.connectionsTable.tableArn],\n });\n iam.Grant.addToPrincipal({\n grantee: this.streamHandler,\n actions: ['dynamodb:Query', 'dynamodb:DeleteItem'],\n resourceArns: [this.systemTables.dependenciesTable.tableArn],\n });\n iam.Grant.addToPrincipal({\n grantee: this.streamHandler,\n actions: [\n 'dynamodb:GetItem',\n 'dynamodb:Query',\n 'dynamodb:UpdateItem',\n ],\n resourceArns: [this.systemTables.queriesTable.tableArn],\n });\n\n const managementPolicy = new iam.PolicyStatement({\n actions: ['execute-api:ManageConnections'],\n resources: [\n cdk.Stack.of(this).formatArn({\n service: 'execute-api',\n resource: this.webSocketApi.apiId,\n resourceName: `${this.webSocketStage.stageName}/POST/@connections/*`,\n arnFormat: cdk.ArnFormat.SLASH_RESOURCE_NAME,\n }),\n ],\n });\n this.messageHandler.addToRolePolicy(managementPolicy);\n this.streamHandler.addToRolePolicy(managementPolicy);\n\n const connectAuthorizer = props.connectAuthorizer\n ? {\n bind: (\n options: apigatewayv2.WebSocketRouteAuthorizerBindOptions,\n ): apigatewayv2.WebSocketRouteAuthorizerConfig => {\n const config = props.connectAuthorizer!.bind(options);\n if (config.authorizationType === 'NONE') {\n throw new Error(\n 'The connectAuthorizer bind result uses NONE authorization. Set allowUnauthenticatedConnections to true instead.',\n );\n }\n return config;\n },\n }\n : undefined;\n\n this.webSocketApi.addRoute('$connect', {\n authorizer: connectAuthorizer,\n integration: new apigatewayv2Integrations.WebSocketLambdaIntegration(\n 'ConnectIntegration',\n this.connectHandler,\n ),\n });\n this.webSocketApi.addRoute('$disconnect', {\n integration: new apigatewayv2Integrations.WebSocketLambdaIntegration(\n 'DisconnectIntegration',\n this.disconnectHandler,\n ),\n });\n this.webSocketApi.addRoute('$default', {\n integration: new apigatewayv2Integrations.WebSocketLambdaIntegration(\n 'DefaultIntegration',\n this.messageHandler,\n ),\n });\n\n for (const [index, binding] of props.tables.entries()) {\n this.setupStreamProcessing(binding, index);\n }\n\n new cdk.CfnOutput(this, 'WebSocketUrl', {\n value: this.webSocketUrl,\n description: 'WebSocket URL for reactive connections',\n });\n }\n\n /** Grant an external application handler access to reactive and user data. */\n public grantApplicationAccess(grantee: iam.IGrantable): void {\n this.systemTables.connectionsTable.grantReadWriteData(grantee);\n this.systemTables.dependenciesTable.grantReadWriteData(grantee);\n this.systemTables.queriesTable.grantReadWriteData(grantee);\n iam.Grant.addToPrincipal({\n grantee,\n actions: ['dynamodb:TransactWriteItems'],\n resourceArns: [\n this.systemTables.connectionsTable.tableArn,\n this.systemTables.dependenciesTable.tableArn,\n this.systemTables.queriesTable.tableArn,\n ],\n });\n\n for (const { table } of this.tables) {\n table.grantReadWriteData(grantee);\n iam.Grant.addToPrincipal({\n grantee,\n actions: ['dynamodb:PartiQLSelect'],\n resourceArns: [table.tableArn, `${table.tableArn}/index/*`],\n });\n iam.Grant.addToPrincipal({\n grantee,\n actions: PARTIQL_ACTIONS,\n resourceArns: [table.tableArn],\n });\n }\n }\n\n private setupStreamProcessing(\n binding: ReactiveTableBinding,\n index: number,\n ): void {\n const { table } = binding;\n table.grantStreamRead(this.streamHandler);\n iam.Grant.addToPrincipal({\n grantee: this.streamHandler,\n actions: ['dynamodb:PartiQLSelect'],\n resourceArns: [table.tableArn, `${table.tableArn}/index/*`],\n });\n\n new lambda.EventSourceMapping(this, `UserTableStream${index}`, {\n target: this.streamHandler,\n eventSourceArn: table.tableStreamArn!,\n startingPosition: lambda.StartingPosition.TRIM_HORIZON,\n batchSize: 100,\n maxBatchingWindow: cdk.Duration.seconds(5),\n bisectBatchOnError: true,\n reportBatchItemFailures: true,\n });\n }\n\n private createLogGroup(id: string): logs.LogGroup {\n return new logs.LogGroup(this, id, {\n retention: logs.RetentionDays.ONE_DAY,\n removalPolicy: cdk.RemovalPolicy.DESTROY,\n });\n }\n\n private validateStream(binding: ReactiveTableBinding): void {\n const { definition, table } = binding;\n if (!table.tableStreamArn) {\n throw new Error(\n `Table ${definition.tableName} does not have DynamoDB Streams enabled. NEW_AND_OLD_IMAGES is required.`,\n );\n }\n\n const child = table.node.defaultChild;\n if (\n !(child instanceof dynamodb.CfnTable) &&\n !(child instanceof dynamodb.CfnGlobalTable)\n ) {\n return;\n }\n\n const specification = cdk.Stack.of(this).resolve(\n child.streamSpecification,\n ) as unknown;\n if (\n !specification ||\n cdk.Token.isUnresolved(specification) ||\n typeof specification !== 'object' ||\n !('streamViewType' in specification)\n ) {\n return;\n }\n\n const streamViewType = specification.streamViewType;\n if (\n !cdk.Token.isUnresolved(streamViewType) &&\n streamViewType !== dynamodb.StreamViewType.NEW_AND_OLD_IMAGES\n ) {\n throw new Error(\n `Table ${definition.tableName} uses stream view ${streamViewType}; NEW_AND_OLD_IMAGES is required.`,\n );\n }\n }\n\n private validateTableName(binding: ReactiveTableBinding): void {\n const { definition, table } = binding;\n const child = table.node.defaultChild;\n const childTableName =\n child && typeof child === 'object' && 'tableName' in child\n ? (child as { tableName?: string }).tableName\n : undefined;\n const physicalTableName = !cdk.Token.isUnresolved(table.tableName)\n ? table.tableName\n : childTableName && !cdk.Token.isUnresolved(childTableName)\n ? childTableName\n : table.tableName;\n\n if (!physicalTableName || cdk.Token.isUnresolved(physicalTableName)) {\n throw new Error(\n `Table ${definition.tableName} has an unresolved physical table name. Set an explicit tableName equal to definition.tableName; separately bundled application code cannot coordinate CloudFormation-generated names.`,\n );\n }\n if (physicalTableName !== definition.tableName) {\n throw new Error(\n `Table binding name mismatch: definition.tableName is \"${definition.tableName}\" but the physical table name is \"${physicalTableName}\". Set an explicit matching tableName.`,\n );\n }\n }\n}\n"]}
1
+ {"version":3,"sources":["../../infra/src/handlers/lambda-handlers.ts","../../core/src/schema.ts","../../infra/src/tables.ts","../../infra/src/engine.ts"],"names":["cdk","Construct","dynamodb2"],"mappings":"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","file":"infra.js","sourcesContent":["/**\n * Entry point code generator for the reactive Lambda handlers.\n *\n * No user code is imported - the handlers use only environment variables\n * and stored query metadata for all operations.\n */\n\n/**\n * Generate the entry point code for Lambda functions.\n * This is called by the CDK construct to create the bundled entry file.\n */\nexport function generateEntryPointCode(): string {\n return `// Auto-generated entry point for reactive Lambda handlers\n// No user code required - all configuration comes from environment variables\nimport { createLambdaHandlers } from 'dynamodb-reactive/server';\n\nconst handlers = createLambdaHandlers();\n\nexport const connectHandler = handlers.connectHandler;\nexport const disconnectHandler = handlers.disconnectHandler;\nexport const messageHandler = handlers.messageHandler;\nexport const streamHandler = handlers.streamHandler;\n`;\n}\n","import { z } from 'zod';\n\nimport type { FilterCondition } from './types.js';\n\nexport const FilterConditionSchema: z.ZodType<FilterCondition> = z.lazy(() => {\n const comparison = z\n .object({\n type: z.literal('comparison'),\n operator: z.enum(['eq', 'ne', 'gt', 'gte', 'lt', 'lte']),\n field: z.string().min(1),\n value: z.unknown(),\n })\n .strict();\n const queryFunction = z.union([\n z\n .object({\n type: z.literal('function'),\n operator: z.literal('between'),\n field: z.string().min(1),\n value: z.unknown(),\n value2: z.unknown(),\n })\n .strict(),\n z\n .object({\n type: z.literal('function'),\n operator: z.enum(['beginsWith', 'contains']),\n field: z.string().min(1),\n value: z.unknown(),\n })\n .strict(),\n ]);\n const logical = z\n .object({\n type: z.literal('logical'),\n operator: z.enum(['and', 'or', 'not']),\n conditions: z.array(FilterConditionSchema).min(1),\n })\n .strict()\n .superRefine((condition, context) => {\n if (condition.operator === 'not' && condition.conditions.length !== 1) {\n context.addIssue({\n code: 'custom',\n path: ['conditions'],\n message: 'not requires exactly one condition',\n });\n }\n });\n return z.union([comparison, queryFunction, logical]);\n});\n\nexport const QueryMetadataSchema = z\n .object({\n planVersion: z.literal(1),\n tableName: z.string().min(1),\n indexName: z.string().min(1).optional(),\n indexPkField: z.string().min(1).optional(),\n indexSkField: z.string().min(1).optional(),\n filterConditions: z.array(FilterConditionSchema),\n sortField: z.string().min(1).optional(),\n sortOrder: z.enum(['asc', 'desc']).optional(),\n limit: z.number().int().positive().optional(),\n })\n .strict()\n .superRefine((metadata, context) => {\n if (metadata.indexName && !metadata.indexPkField) {\n context.addIssue({\n code: 'custom',\n path: ['indexPkField'],\n message: 'Index metadata requires its partition key field',\n });\n }\n if (!metadata.indexName && (metadata.indexPkField || metadata.indexSkField)) {\n context.addIssue({\n code: 'custom',\n path: ['indexName'],\n message: 'Index key fields require an index name',\n });\n }\n if (Boolean(metadata.sortField) !== Boolean(metadata.sortOrder)) {\n context.addIssue({\n code: 'custom',\n path: ['sortOrder'],\n message: 'Sort field and order must be specified together',\n });\n }\n });\n\nconst DeliveryVersionSchema = z.object({\n generation: z.number().int().nonnegative(),\n fromVersion: z.number().int().nonnegative(),\n toVersion: z.number().int().positive(),\n messageId: z.string().min(1),\n});\n\nexport const PendingDeliverySchema = z.discriminatedUnion('type', [\n DeliveryVersionSchema.extend({\n type: z.literal('patch'),\n patches: z.array(\n z.object({\n op: z.enum(['add', 'remove', 'replace', 'move', 'copy', 'test']),\n path: z.string(),\n value: z.unknown().optional(),\n from: z.string().optional(),\n }),\n ),\n }),\n DeliveryVersionSchema.extend({\n type: z.literal('resync'),\n }).strict(),\n]);\n\n/**\n * System table schemas for the reactive engine\n */\nexport const SystemSchemas = {\n /**\n * ReactiveConnectionsV2 - Tracks active WebSocket connections\n */\n connections: z.object({\n connectionId: z.string(),\n status: z.enum(['open', 'closed']),\n context: z.record(z.string(), z.unknown()).optional(),\n authorizerContext: z.record(z.string(), z.unknown()).optional(),\n requestIdentity: z.record(z.string(), z.unknown()).optional(),\n connectedAt: z.number(),\n ttl: z.number(),\n }),\n\n /**\n * ReactiveDependenciesV2 - The inverted index for O(1) lookups\n */\n dependencies: z.object({\n pk: z.string(), // Versioned encoded dependency key\n sk: z.string(), // ConnectionID#SubscriptionID\n connectionId: z.string(),\n subscriptionId: z.string(),\n tableName: z.string(),\n fieldName: z.string(),\n fieldValue: z.string(),\n generation: z.number().int().nonnegative(),\n registrationId: z.string().min(1),\n ttl: z.number(),\n }),\n\n /**\n * ReactiveConnectionQueriesV2 - Stores subscription state for diffing\n */\n queries: z.object({\n pk: z.string(), // ConnectionID\n sk: z.string(), // SubscriptionID\n connectionId: z.string(),\n subscriptionId: z.string(),\n status: z.enum(['registering', 'active', 'cancelled', 'faulted']),\n generation: z.number().int().nonnegative(),\n registrationId: z.string().min(1),\n queryMetadata: QueryMetadataSchema,\n lastResult: z.array(z.unknown()),\n dependencies: z.array(z.string()),\n version: z.number().int().nonnegative(),\n pendingDelivery: PendingDeliverySchema.optional(),\n createdAt: z.number(),\n updatedAt: z.number(),\n ttl: z.number(),\n }),\n};\n\n/** Storage/protocol generation used by all reactive system tables. */\nexport const SYSTEM_TABLE_PROTOCOL_VERSION = 2 as const;\n\n/**\n * Versioned system table names. The V2 suffix intentionally prevents state\n * written by the incompatible 0.1.x dependency protocol from being reused.\n */\nexport const SystemTableNames = {\n connections: 'ReactiveConnectionsV2',\n dependencies: 'ReactiveDependenciesV2',\n queries: 'ReactiveConnectionQueriesV2',\n} as const;\n","import { SystemTableNames } from '@dynamodb-reactive/core';\nimport * as cdk from 'aws-cdk-lib';\nimport * as dynamodb from 'aws-cdk-lib/aws-dynamodb';\nimport { Construct } from 'constructs';\n\n/**\n * Provisioning mode for DynamoDB tables\n * - \"ON_DEMAND\": Pay-per-request billing (default)\n * - { readWrite: number }: Provisioned capacity with specified RCU/WCU\n */\nexport type ProvisioningMode = 'ON_DEMAND' | { readWrite: number };\n\n/**\n * Props for ReactiveSystemTables\n */\nexport interface ReactiveSystemTablesProps {\n /**\n * Nonempty, concrete prefix for the fixed physical table names.\n * Use the same value as the application's `tablePrefix`.\n */\n tablePrefix: string;\n\n /**\n * Provisioning mode for tables\n * @default \"ON_DEMAND\"\n */\n provisioningMode?: ProvisioningMode;\n\n /**\n * Policy applied when a system table is removed or replaced.\n * Set to RemovalPolicy.DESTROY only for disposable environments.\n * Retained tables have fixed names, so recreating a stack with the same\n * prefix requires importing or manually removing any retained tables first.\n * @default RemovalPolicy.RETAIN\n */\n removalPolicy?: cdk.RemovalPolicy;\n}\n\n/**\n * Creates the three system tables for the reactive engine\n */\nexport class ReactiveSystemTables extends Construct {\n /**\n * ReactiveConnections table - tracks WebSocket connections\n */\n public readonly connectionsTable: dynamodb.Table;\n\n /**\n * ReactiveDependencies table - the inverted index\n */\n public readonly dependenciesTable: dynamodb.Table;\n\n /**\n * ReactiveConnectionQueries table - stores subscription state\n */\n public readonly queriesTable: dynamodb.Table;\n\n constructor(\n scope: Construct,\n id: string,\n props: ReactiveSystemTablesProps,\n ) {\n super(scope, id);\n\n if (\n cdk.Token.isUnresolved(props.tablePrefix) ||\n !/^[A-Za-z0-9][A-Za-z0-9_-]*$/.test(props.tablePrefix) ||\n props.tablePrefix.length > 229\n ) {\n throw new Error(\n 'ReactiveSystemTables tablePrefix must be a nonempty concrete value of at most 229 letters, numbers, hyphens, or underscores, starting with a letter or number.',\n );\n }\n\n const tableName = (name: string): string =>\n `${props.tablePrefix}-${name}`;\n const provisioningMode = props.provisioningMode ?? 'ON_DEMAND';\n const removalPolicy = props.removalPolicy ?? cdk.RemovalPolicy.RETAIN;\n\n // Determine billing/capacity settings\n const isOnDemand = provisioningMode === 'ON_DEMAND';\n const capacityProps = isOnDemand\n ? { billingMode: dynamodb.BillingMode.PAY_PER_REQUEST }\n : {\n billingMode: dynamodb.BillingMode.PROVISIONED,\n readCapacity: provisioningMode.readWrite,\n writeCapacity: provisioningMode.readWrite,\n };\n\n // ReactiveConnections Table\n // Tracks active WebSocket connections and user context\n this.connectionsTable = new dynamodb.Table(this, 'ConnectionsTable', {\n tableName: tableName(SystemTableNames.connections),\n partitionKey: {\n name: 'connectionId',\n type: dynamodb.AttributeType.STRING,\n },\n ...capacityProps,\n removalPolicy,\n timeToLiveAttribute: 'ttl',\n });\n\n // ReactiveDependencies Table (The Inverted Index)\n // Maps Field#Value -> ConnectionID for O(1) lookups\n this.dependenciesTable = new dynamodb.Table(this, 'DependenciesTable', {\n tableName: tableName(SystemTableNames.dependencies),\n partitionKey: {\n name: 'pk', // Format: \"TableName#FieldName#FieldValue\"\n type: dynamodb.AttributeType.STRING,\n },\n sortKey: {\n name: 'sk', // Format: \"ConnectionID#SubscriptionID\"\n type: dynamodb.AttributeType.STRING,\n },\n ...capacityProps,\n removalPolicy,\n timeToLiveAttribute: 'ttl',\n });\n\n // Add GSI for querying by connectionId (for cleanup)\n // For provisioned mode, GSI needs its own capacity\n const gsiProps = isOnDemand\n ? {}\n : {\n readCapacity: provisioningMode.readWrite,\n writeCapacity: provisioningMode.readWrite,\n };\n\n this.dependenciesTable.addGlobalSecondaryIndex({\n indexName: 'byConnectionId',\n partitionKey: {\n name: 'connectionId',\n type: dynamodb.AttributeType.STRING,\n },\n projectionType: dynamodb.ProjectionType.KEYS_ONLY,\n ...gsiProps,\n });\n\n // ReactiveConnectionQueries Table\n // Stores subscription state for diffing\n this.queriesTable = new dynamodb.Table(this, 'QueriesTable', {\n tableName: tableName(SystemTableNames.queries),\n partitionKey: {\n name: 'pk', // ConnectionID\n type: dynamodb.AttributeType.STRING,\n },\n sortKey: {\n name: 'sk', // SubscriptionID\n type: dynamodb.AttributeType.STRING,\n },\n ...capacityProps,\n removalPolicy,\n timeToLiveAttribute: 'ttl',\n });\n }\n}\n","import * as fs from 'node:fs';\nimport * as path from 'node:path';\n\nimport type { AnyDynamoTable } from '@dynamodb-reactive/core';\nimport * as cdk from 'aws-cdk-lib';\nimport * as apigatewayv2 from 'aws-cdk-lib/aws-apigatewayv2';\nimport * as apigatewayv2Integrations from 'aws-cdk-lib/aws-apigatewayv2-integrations';\nimport * as dynamodb from 'aws-cdk-lib/aws-dynamodb';\nimport * as iam from 'aws-cdk-lib/aws-iam';\nimport * as lambda from 'aws-cdk-lib/aws-lambda';\nimport * as nodejs from 'aws-cdk-lib/aws-lambda-nodejs';\nimport * as logs from 'aws-cdk-lib/aws-logs';\nimport { Construct } from 'constructs';\n\nimport { generateEntryPointCode } from './handlers/lambda-handlers.js';\nimport {\n ReactiveSystemTables,\n type ReactiveSystemTablesProps,\n} from './tables.js';\n\nconst PARTIQL_ACTIONS = [\n 'dynamodb:PartiQLInsert',\n 'dynamodb:PartiQLUpdate',\n 'dynamodb:PartiQLDelete',\n];\nconst DEFAULT_STREAM_BATCH_SIZE = 100;\nconst MAX_STREAM_BATCH_SIZE = 1_000;\n\n/** Resource limits that can be tuned for the DynamoDB stream processor. */\nexport type ReactiveStreamHandlerProps = Pick<\n nodejs.NodejsFunctionProps,\n 'memorySize' | 'timeout'\n>;\n\n/** Associates an application table definition with its deployed CDK table. */\nexport interface ReactiveTableBinding {\n readonly definition: AnyDynamoTable;\n\n /**\n * Deployed table with DynamoDB Streams configured for NEW_AND_OLD_IMAGES.\n * Imported ITable resources must supply tableStreamArn; CDK cannot expose\n * their stream view type, so callers remain responsible for that setting.\n */\n readonly table: dynamodb.ITable;\n}\n\n/** Props for ReactiveEngine construct. */\nexport interface ReactiveEngineProps {\n /** User-defined tables and their deployed CDK resources. */\n tables: readonly ReactiveTableBinding[];\n\n /**\n * Authorizer applied to the WebSocket $connect route.\n * WebSocketIamAuthorizer is supported; its requestContext.identity is\n * persisted with the connection. Lambda authorizer context is also persisted.\n * Authorizers whose bind result uses NONE authorization are rejected.\n */\n connectAuthorizer?: apigatewayv2.IWebSocketRouteAuthorizer;\n\n /**\n * Explicitly permit unauthenticated WebSocket connections.\n * Cannot be combined with connectAuthorizer.\n * @default false\n */\n allowUnauthenticatedConnections?: boolean;\n\n /**\n * Nonempty, concrete prefix for physical resource names. Pass this same value\n * as the server application's `tablePrefix`.\n */\n resourcePrefix: string;\n\n /** System tables configuration. */\n systemTablesProps?: Omit<ReactiveSystemTablesProps, 'tablePrefix'>;\n\n /** Environment variables for Lambda functions. */\n environment?: Record<string, string>;\n\n /** Memory and timeout overrides for the DynamoDB stream processor. */\n streamHandlerProps?: ReactiveStreamHandlerProps;\n\n /** Number of DynamoDB stream records delivered in one invocation. @default 100 */\n streamBatchSize?: number;\n}\n\n/** Main CDK construct for the reactive DynamoDB system. */\nexport class ReactiveEngine extends Construct {\n public readonly tables: readonly ReactiveTableBinding[];\n public readonly systemTables: ReactiveSystemTables;\n public readonly webSocketApi: apigatewayv2.WebSocketApi;\n public readonly webSocketStage: apigatewayv2.WebSocketStage;\n public readonly connectHandler: lambda.Function;\n public readonly disconnectHandler: lambda.Function;\n public readonly messageHandler: lambda.Function;\n public readonly streamHandler: lambda.Function;\n public readonly webSocketUrl: string;\n public readonly callbackUrl: string;\n\n constructor(scope: Construct, id: string, props: ReactiveEngineProps) {\n super(scope, id);\n\n if (\n cdk.Token.isUnresolved(props.resourcePrefix) ||\n !/^[A-Za-z0-9][A-Za-z0-9_-]*$/.test(props.resourcePrefix) ||\n props.resourcePrefix.length > 45\n ) {\n throw new Error(\n 'ReactiveEngine resourcePrefix must be a nonempty concrete value of at most 45 letters, numbers, hyphens, or underscores, starting with a letter or number.',\n );\n }\n\n if (props.connectAuthorizer && props.allowUnauthenticatedConnections) {\n throw new Error(\n 'Specify either connectAuthorizer or allowUnauthenticatedConnections, not both.',\n );\n }\n if (\n props.connectAuthorizer instanceof apigatewayv2.WebSocketNoneAuthorizer\n ) {\n throw new Error(\n 'WebSocketNoneAuthorizer does not authenticate connections. Set allowUnauthenticatedConnections to true instead.',\n );\n }\n if (!props.connectAuthorizer && !props.allowUnauthenticatedConnections) {\n throw new Error(\n 'WebSocket authentication is required. Provide connectAuthorizer or explicitly set allowUnauthenticatedConnections to true.',\n );\n }\n if (\n props.streamBatchSize !== undefined &&\n (!Number.isInteger(props.streamBatchSize) ||\n props.streamBatchSize < 1 ||\n props.streamBatchSize > MAX_STREAM_BATCH_SIZE)\n ) {\n throw new Error(\n `ReactiveEngine streamBatchSize must be an integer from 1 to ${MAX_STREAM_BATCH_SIZE}.`,\n );\n }\n\n for (const binding of props.tables) {\n this.validateTableName(binding);\n this.validateStream(binding);\n }\n this.tables = [...props.tables];\n\n const resourceName = (name: string): string =>\n `${props.resourcePrefix}-${name}`;\n const memorySize = 128;\n const timeout = cdk.Duration.seconds(30);\n\n this.systemTables = new ReactiveSystemTables(this, 'SystemTables', {\n ...props.systemTablesProps,\n tablePrefix: props.resourcePrefix,\n });\n\n this.webSocketApi = new apigatewayv2.WebSocketApi(this, 'WebSocketApi', {\n apiName: resourceName('ReactiveWebSocket'),\n });\n\n this.webSocketStage = new apigatewayv2.WebSocketStage(\n this,\n 'WebSocketStage',\n {\n webSocketApi: this.webSocketApi,\n stageName: 'prod',\n autoDeploy: true,\n },\n );\n\n this.webSocketUrl = this.webSocketStage.url;\n this.callbackUrl = this.webSocketStage.callbackUrl;\n\n // Every engine uses the same generated source, so its path and asset are stable.\n const cdkOutDir = path.join(process.cwd(), 'cdk.out', '.generated');\n fs.mkdirSync(cdkOutDir, { recursive: true });\n const entryPointPath = path.join(cdkOutDir, 'reactive-entry.ts');\n fs.writeFileSync(entryPointPath, generateEntryPointCode());\n\n const environment: Record<string, string> = {\n ...props.environment,\n CONNECTIONS_TABLE: this.systemTables.connectionsTable.tableName,\n DEPENDENCIES_TABLE: this.systemTables.dependenciesTable.tableName,\n QUERIES_TABLE: this.systemTables.queriesTable.tableName,\n WEBSOCKET_ENDPOINT: this.callbackUrl,\n LOG_LEVEL: props.environment?.LOG_LEVEL ?? 'INFO',\n };\n const bundling: nodejs.BundlingOptions = {\n format: nodejs.OutputFormat.CJS,\n minify: true,\n sourceMap: false,\n target: 'node24',\n };\n\n this.connectHandler = new nodejs.NodejsFunction(this, 'ConnectHandler', {\n functionName: resourceName('ReactiveConnect'),\n runtime: lambda.Runtime.NODEJS_24_X,\n handler: 'connectHandler',\n entry: entryPointPath,\n bundling,\n environment,\n memorySize,\n timeout,\n logGroup: this.createLogGroup('ConnectLogGroup'),\n });\n\n this.disconnectHandler = new nodejs.NodejsFunction(\n this,\n 'DisconnectHandler',\n {\n functionName: resourceName('ReactiveDisconnect'),\n runtime: lambda.Runtime.NODEJS_24_X,\n handler: 'disconnectHandler',\n entry: entryPointPath,\n bundling,\n environment,\n memorySize,\n timeout,\n logGroup: this.createLogGroup('DisconnectLogGroup'),\n },\n );\n\n this.messageHandler = new nodejs.NodejsFunction(this, 'MessageHandler', {\n functionName: resourceName('ReactiveMessage'),\n runtime: lambda.Runtime.NODEJS_24_X,\n handler: 'messageHandler',\n entry: entryPointPath,\n bundling,\n environment,\n memorySize,\n timeout,\n logGroup: this.createLogGroup('MessageLogGroup'),\n });\n\n this.streamHandler = new nodejs.NodejsFunction(this, 'StreamHandler', {\n functionName: resourceName('ReactiveStream'),\n runtime: lambda.Runtime.NODEJS_24_X,\n handler: 'streamHandler',\n entry: entryPointPath,\n bundling,\n environment: {\n ...environment,\n USER_TABLES: props.tables\n .map(({ definition }) => definition.tableName)\n .join(','),\n },\n memorySize: props.streamHandlerProps?.memorySize ?? memorySize,\n timeout: props.streamHandlerProps?.timeout ?? timeout,\n logGroup: this.createLogGroup('StreamLogGroup'),\n });\n\n iam.Grant.addToPrincipal({\n grantee: this.connectHandler,\n actions: ['dynamodb:PutItem'],\n resourceArns: [this.systemTables.connectionsTable.tableArn],\n });\n iam.Grant.addToPrincipal({\n grantee: this.disconnectHandler,\n actions: ['dynamodb:UpdateItem'],\n resourceArns: [this.systemTables.connectionsTable.tableArn],\n });\n iam.Grant.addToPrincipal({\n grantee: this.disconnectHandler,\n actions: ['dynamodb:Query', 'dynamodb:UpdateItem'],\n resourceArns: [this.systemTables.queriesTable.tableArn],\n });\n iam.Grant.addToPrincipal({\n grantee: this.disconnectHandler,\n actions: ['dynamodb:DeleteItem'],\n resourceArns: [this.systemTables.dependenciesTable.tableArn],\n });\n iam.Grant.addToPrincipal({\n grantee: this.messageHandler,\n actions: ['dynamodb:UpdateItem'],\n resourceArns: [this.systemTables.connectionsTable.tableArn],\n });\n iam.Grant.addToPrincipal({\n grantee: this.streamHandler,\n actions: ['dynamodb:UpdateItem'],\n resourceArns: [this.systemTables.connectionsTable.tableArn],\n });\n iam.Grant.addToPrincipal({\n grantee: this.streamHandler,\n actions: ['dynamodb:Query', 'dynamodb:DeleteItem'],\n resourceArns: [this.systemTables.dependenciesTable.tableArn],\n });\n iam.Grant.addToPrincipal({\n grantee: this.streamHandler,\n actions: [\n 'dynamodb:GetItem',\n 'dynamodb:Query',\n 'dynamodb:UpdateItem',\n ],\n resourceArns: [this.systemTables.queriesTable.tableArn],\n });\n\n const managementPolicy = new iam.PolicyStatement({\n actions: ['execute-api:ManageConnections'],\n resources: [\n cdk.Stack.of(this).formatArn({\n service: 'execute-api',\n resource: this.webSocketApi.apiId,\n resourceName: `${this.webSocketStage.stageName}/POST/@connections/*`,\n arnFormat: cdk.ArnFormat.SLASH_RESOURCE_NAME,\n }),\n ],\n });\n this.messageHandler.addToRolePolicy(managementPolicy);\n this.streamHandler.addToRolePolicy(managementPolicy);\n\n const connectAuthorizer = props.connectAuthorizer\n ? {\n bind: (\n options: apigatewayv2.WebSocketRouteAuthorizerBindOptions,\n ): apigatewayv2.WebSocketRouteAuthorizerConfig => {\n const config = props.connectAuthorizer!.bind(options);\n if (config.authorizationType === 'NONE') {\n throw new Error(\n 'The connectAuthorizer bind result uses NONE authorization. Set allowUnauthenticatedConnections to true instead.',\n );\n }\n return config;\n },\n }\n : undefined;\n\n this.webSocketApi.addRoute('$connect', {\n authorizer: connectAuthorizer,\n integration: new apigatewayv2Integrations.WebSocketLambdaIntegration(\n 'ConnectIntegration',\n this.connectHandler,\n ),\n });\n this.webSocketApi.addRoute('$disconnect', {\n integration: new apigatewayv2Integrations.WebSocketLambdaIntegration(\n 'DisconnectIntegration',\n this.disconnectHandler,\n ),\n });\n this.webSocketApi.addRoute('$default', {\n integration: new apigatewayv2Integrations.WebSocketLambdaIntegration(\n 'DefaultIntegration',\n this.messageHandler,\n ),\n });\n\n for (const [index, binding] of props.tables.entries()) {\n this.setupStreamProcessing(\n binding,\n index,\n props.streamBatchSize ?? DEFAULT_STREAM_BATCH_SIZE,\n );\n }\n\n new cdk.CfnOutput(this, 'WebSocketUrl', {\n value: this.webSocketUrl,\n description: 'WebSocket URL for reactive connections',\n });\n }\n\n /** Grant an external application handler access to reactive and user data. */\n public grantApplicationAccess(grantee: iam.IGrantable): void {\n this.systemTables.connectionsTable.grantReadWriteData(grantee);\n this.systemTables.dependenciesTable.grantReadWriteData(grantee);\n this.systemTables.queriesTable.grantReadWriteData(grantee);\n iam.Grant.addToPrincipal({\n grantee,\n actions: ['dynamodb:TransactWriteItems'],\n resourceArns: [\n this.systemTables.connectionsTable.tableArn,\n this.systemTables.dependenciesTable.tableArn,\n this.systemTables.queriesTable.tableArn,\n ],\n });\n\n for (const { table } of this.tables) {\n table.grantReadWriteData(grantee);\n iam.Grant.addToPrincipal({\n grantee,\n actions: ['dynamodb:PartiQLSelect'],\n resourceArns: [table.tableArn, `${table.tableArn}/index/*`],\n });\n iam.Grant.addToPrincipal({\n grantee,\n actions: PARTIQL_ACTIONS,\n resourceArns: [table.tableArn],\n });\n }\n }\n\n private setupStreamProcessing(\n binding: ReactiveTableBinding,\n index: number,\n batchSize: number,\n ): void {\n const { table } = binding;\n table.grantStreamRead(this.streamHandler);\n iam.Grant.addToPrincipal({\n grantee: this.streamHandler,\n actions: ['dynamodb:PartiQLSelect'],\n resourceArns: [table.tableArn, `${table.tableArn}/index/*`],\n });\n\n new lambda.EventSourceMapping(this, `UserTableStream${index}`, {\n target: this.streamHandler,\n eventSourceArn: table.tableStreamArn!,\n startingPosition: lambda.StartingPosition.TRIM_HORIZON,\n batchSize,\n maxBatchingWindow: cdk.Duration.seconds(5),\n bisectBatchOnError: true,\n reportBatchItemFailures: true,\n });\n }\n\n private createLogGroup(id: string): logs.LogGroup {\n return new logs.LogGroup(this, id, {\n retention: logs.RetentionDays.ONE_DAY,\n removalPolicy: cdk.RemovalPolicy.DESTROY,\n });\n }\n\n private validateStream(binding: ReactiveTableBinding): void {\n const { definition, table } = binding;\n if (!table.tableStreamArn) {\n throw new Error(\n `Table ${definition.tableName} does not have DynamoDB Streams enabled. NEW_AND_OLD_IMAGES is required.`,\n );\n }\n\n const child = table.node.defaultChild;\n if (\n !(child instanceof dynamodb.CfnTable) &&\n !(child instanceof dynamodb.CfnGlobalTable)\n ) {\n return;\n }\n\n const specification = cdk.Stack.of(this).resolve(\n child.streamSpecification,\n ) as unknown;\n if (\n !specification ||\n cdk.Token.isUnresolved(specification) ||\n typeof specification !== 'object' ||\n !('streamViewType' in specification)\n ) {\n return;\n }\n\n const streamViewType = specification.streamViewType;\n if (\n !cdk.Token.isUnresolved(streamViewType) &&\n streamViewType !== dynamodb.StreamViewType.NEW_AND_OLD_IMAGES\n ) {\n throw new Error(\n `Table ${definition.tableName} uses stream view ${streamViewType}; NEW_AND_OLD_IMAGES is required.`,\n );\n }\n }\n\n private validateTableName(binding: ReactiveTableBinding): void {\n const { definition, table } = binding;\n const child = table.node.defaultChild;\n const childTableName =\n child && typeof child === 'object' && 'tableName' in child\n ? (child as { tableName?: string }).tableName\n : undefined;\n const physicalTableName = !cdk.Token.isUnresolved(table.tableName)\n ? table.tableName\n : childTableName && !cdk.Token.isUnresolved(childTableName)\n ? childTableName\n : table.tableName;\n\n if (!physicalTableName || cdk.Token.isUnresolved(physicalTableName)) {\n throw new Error(\n `Table ${definition.tableName} has an unresolved physical table name. Set an explicit tableName equal to definition.tableName; separately bundled application code cannot coordinate CloudFormation-generated names.`,\n );\n }\n if (physicalTableName !== definition.tableName) {\n throw new Error(\n `Table binding name mismatch: definition.tableName is \"${definition.tableName}\" but the physical table name is \"${physicalTableName}\". Set an explicit matching tableName.`,\n );\n }\n }\n}\n"]}
package/dist/server.cjs CHANGED
@@ -2074,7 +2074,7 @@ async function mapWithConcurrency(values, concurrency, mapper) {
2074
2074
  await Promise.all(workers);
2075
2075
  return results;
2076
2076
  }
2077
- async function processRecord(record, utils) {
2077
+ function extractRecordAffectedKeys(record) {
2078
2078
  const tableName = extractTableName(record);
2079
2079
  if (!tableName || !record.dynamodb) {
2080
2080
  throw new Error("Malformed DynamoDB stream record");
@@ -2085,53 +2085,84 @@ async function processRecord(record, utils) {
2085
2085
  const item = utilDynamodb.unmarshall(image);
2086
2086
  for (const key of extractAffectedKeys(tableName, item)) affectedKeys.add(key);
2087
2087
  }
2088
- const subscriptions = /* @__PURE__ */ new Map();
2089
- const lookupResults = await mapWithConcurrency(
2090
- [...affectedKeys],
2091
- MAX_FANOUT_CONCURRENCY,
2092
- (key) => utils.findAffectedSubscriptions(key)
2093
- );
2094
- for (const result of lookupResults) {
2095
- for (const subscription of result) {
2096
- subscriptions.set(
2097
- `${subscription.connectionId}\0${subscription.subscriptionId}`,
2098
- subscription
2099
- );
2088
+ return affectedKeys;
2089
+ }
2090
+ function subscriptionKey(subscription) {
2091
+ return JSON.stringify([
2092
+ subscription.connectionId,
2093
+ subscription.subscriptionId
2094
+ ]);
2095
+ }
2096
+ function failureIdentifier(record, cause) {
2097
+ const itemIdentifier = record.dynamodb?.SequenceNumber;
2098
+ if (!itemIdentifier) {
2099
+ throw new Error("Failed DynamoDB stream record has no sequence number", {
2100
+ cause
2101
+ });
2102
+ }
2103
+ return itemIdentifier;
2104
+ }
2105
+ async function processStreamEvent(event, utils) {
2106
+ const failures = /* @__PURE__ */ new Map();
2107
+ const dependencies = /* @__PURE__ */ new Map();
2108
+ for (const [recordIndex, record] of event.Records.entries()) {
2109
+ try {
2110
+ for (const dependencyKey of extractRecordAffectedKeys(record)) {
2111
+ const recordIndexes = dependencies.get(dependencyKey) ?? /* @__PURE__ */ new Set();
2112
+ recordIndexes.add(recordIndex);
2113
+ dependencies.set(dependencyKey, recordIndexes);
2114
+ }
2115
+ } catch (error2) {
2116
+ error("[stream] Record dependency extraction failed:", error2);
2117
+ failures.set(recordIndex, error2);
2100
2118
  }
2101
2119
  }
2120
+ const subscriptions = /* @__PURE__ */ new Map();
2102
2121
  await mapWithConcurrency(
2103
- [...subscriptions.values()],
2122
+ [...dependencies],
2104
2123
  MAX_FANOUT_CONCURRENCY,
2105
- ({ connectionId, subscriptionId }) => utils.processSubscription(connectionId, subscriptionId)
2124
+ async ([dependencyKey, recordIndexes]) => {
2125
+ try {
2126
+ const affectedSubscriptions = await utils.findAffectedSubscriptions(dependencyKey);
2127
+ for (const subscription of affectedSubscriptions) {
2128
+ const key = subscriptionKey(subscription);
2129
+ const work = subscriptions.get(key) ?? {
2130
+ ...subscription,
2131
+ recordIndexes: /* @__PURE__ */ new Set()
2132
+ };
2133
+ for (const recordIndex of recordIndexes) {
2134
+ work.recordIndexes.add(recordIndex);
2135
+ }
2136
+ subscriptions.set(key, work);
2137
+ }
2138
+ } catch (error2) {
2139
+ error("[stream] Subscription dependency lookup failed:", error2);
2140
+ for (const recordIndex of recordIndexes) {
2141
+ failures.set(recordIndex, error2);
2142
+ }
2143
+ }
2144
+ }
2106
2145
  );
2107
- }
2108
- async function processStreamEvent(event, utils) {
2109
- const results = await mapWithConcurrency(
2110
- event.Records,
2146
+ await mapWithConcurrency(
2147
+ [...subscriptions.values()],
2111
2148
  MAX_FANOUT_CONCURRENCY,
2112
- async (record) => {
2149
+ async ({ connectionId, subscriptionId, recordIndexes }) => {
2113
2150
  try {
2114
- await processRecord(record, utils);
2115
- return null;
2151
+ await utils.processSubscription(connectionId, subscriptionId);
2116
2152
  } catch (error2) {
2117
- error("[stream] Record failed:", error2);
2118
- const itemIdentifier = record.dynamodb?.SequenceNumber;
2119
- if (!itemIdentifier) {
2120
- throw new Error(
2121
- "Failed DynamoDB stream record has no sequence number",
2122
- { cause: error2 }
2123
- );
2153
+ error("[stream] Subscription refresh failed:", error2);
2154
+ for (const recordIndex of recordIndexes) {
2155
+ failures.set(recordIndex, error2);
2124
2156
  }
2125
- return {
2126
- itemIdentifier
2127
- };
2128
2157
  }
2129
2158
  }
2130
2159
  );
2131
2160
  return {
2132
- batchItemFailures: results.filter(
2133
- (failure) => failure !== null
2134
- )
2161
+ batchItemFailures: event.Records.flatMap((record, recordIndex) => {
2162
+ if (!failures.has(recordIndex)) return [];
2163
+ const cause = failures.get(recordIndex);
2164
+ return [{ itemIdentifier: failureIdentifier(record, cause) }];
2165
+ })
2135
2166
  };
2136
2167
  }
2137
2168
  function clients(config) {