dynamodb-reactive 0.1.21 → 0.2.1

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.
Files changed (46) hide show
  1. package/README.md +378 -153
  2. package/dist/client-r_tnzwqi.d.ts +224 -0
  3. package/dist/client.cjs +1023 -0
  4. package/dist/client.cjs.map +1 -0
  5. package/dist/client.d.cts +6 -0
  6. package/dist/client.d.ts +4 -70
  7. package/dist/client.js +1013 -1
  8. package/dist/client.js.map +1 -1
  9. package/dist/core.cjs +232 -0
  10. package/dist/core.cjs.map +1 -0
  11. package/dist/core.d.cts +4 -0
  12. package/dist/core.d.ts +3 -3
  13. package/dist/core.js +222 -1
  14. package/dist/core.js.map +1 -1
  15. package/dist/index.cjs +232 -0
  16. package/dist/index.cjs.map +1 -0
  17. package/dist/index.d.cts +157 -0
  18. package/dist/index.d.ts +103 -56
  19. package/dist/index.js +222 -1
  20. package/dist/index.js.map +1 -1
  21. package/dist/infra.cjs +623 -0
  22. package/dist/infra.cjs.map +1 -0
  23. package/dist/infra.d.cts +119 -0
  24. package/dist/infra.d.ts +50 -102
  25. package/dist/infra.js +371 -144
  26. package/dist/infra.js.map +1 -1
  27. package/dist/react.cjs +1250 -0
  28. package/dist/react.cjs.map +1 -0
  29. package/dist/react.d.cts +68 -0
  30. package/dist/react.d.ts +68 -3
  31. package/dist/react.js +1237 -1
  32. package/dist/react.js.map +1 -1
  33. package/dist/server.cjs +2351 -0
  34. package/dist/server.cjs.map +1 -0
  35. package/dist/server.d.cts +364 -0
  36. package/dist/server.d.ts +58 -313
  37. package/dist/server.js +1855 -1208
  38. package/dist/server.js.map +1 -1
  39. package/dist/{table-tN3D4Tm-.d.ts → table-BijJ73pX.d.ts} +2 -34
  40. package/dist/{types-ISMJfyIv.d.ts → types-LMLk8JVC.d.ts} +56 -30
  41. package/package.json +79 -41
  42. package/dist/chunk-2A7GJ2UO.js +0 -1088
  43. package/dist/chunk-2A7GJ2UO.js.map +0 -1
  44. package/dist/chunk-ZAJA4KBE.js +0 -150
  45. package/dist/chunk-ZAJA4KBE.js.map +0 -1
  46. package/dist/react-B2b5RIz_.d.ts +0 -549
package/dist/infra.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../infra/src/handlers/lambda-handlers.ts","../../infra/src/tables.ts","../../infra/src/engine.ts","../../infra/src/stream-source.ts"],"names":["cdk","Construct","cdk3","lambda2"],"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 { 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 * Prefix for table names\n * @default - no prefix\n */\n tablePrefix?: string;\n\n /**\n * Provisioning mode for tables\n * @default \"ON_DEMAND\"\n */\n provisioningMode?: ProvisioningMode;\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 const prefix = props.tablePrefix ? `${props.tablePrefix}-` : '';\n const provisioningMode = props.provisioningMode ?? 'ON_DEMAND';\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: `${prefix}${SystemTableNames.connections}`,\n partitionKey: {\n name: 'connectionId',\n type: dynamodb.AttributeType.STRING,\n },\n ...capacityProps,\n removalPolicy: cdk.RemovalPolicy.DESTROY,\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: `${prefix}${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: cdk.RemovalPolicy.DESTROY,\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: `${prefix}${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: cdk.RemovalPolicy.DESTROY,\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 type * 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\n/**\n * Props for ReactiveEngine construct\n */\nexport interface ReactiveEngineProps {\n /**\n * User-defined DynamoDB tables to enable reactive updates on\n */\n tables: AnyDynamoTable[];\n\n /**\n * Prefix for all resource names\n * @default - no prefix\n */\n resourcePrefix?: string;\n\n /**\n * System tables configuration\n */\n systemTablesProps?: ReactiveSystemTablesProps;\n /**\n * Environment variables for Lambda functions\n */\n environment?: Record<string, string>;\n}\n\n/**\n * ReactiveEngine - Main CDK construct for the reactive DynamoDB system\n */\nexport class ReactiveEngine extends Construct {\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 const prefix = props.resourcePrefix ?? '';\n const memorySize = 128;\n const timeout = cdk.Duration.seconds(30);\n const logRetention = logs.RetentionDays.ONE_DAY;\n\n // Create system tables\n this.systemTables = new ReactiveSystemTables(this, 'SystemTables', {\n tablePrefix: prefix,\n ...props.systemTablesProps,\n });\n\n // Create WebSocket API\n this.webSocketApi = new apigatewayv2.WebSocketApi(this, 'WebSocketApi', {\n apiName: `${prefix}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 // Generate the entry point file (no user code required)\n // Write to cdk.out directory to avoid path resolution issues with temp directories\n const entryPointCode = generateEntryPointCode();\n const cdkOutDir = path.join(process.cwd(), 'cdk.out', '.generated');\n fs.mkdirSync(cdkOutDir, { recursive: true });\n const entryPointPath = path.join(\n cdkOutDir,\n `reactive-entry-${id}-${Date.now()}.ts`,\n );\n fs.writeFileSync(entryPointPath, entryPointCode);\n\n // Common environment variables\n const environment: Record<string, string> = {\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 ...props.environment,\n LOG_LEVEL: props.environment?.LOG_LEVEL ?? 'INFO',\n };\n\n // Create handlers using NodejsFunction with the generated entry point\n this.connectHandler = new nodejs.NodejsFunction(this, 'ConnectHandler', {\n functionName: `${prefix}ReactiveConnect`,\n runtime: lambda.Runtime.NODEJS_LATEST,\n handler: 'connectHandler',\n entry: entryPointPath,\n environment,\n memorySize,\n timeout,\n logRetention,\n });\n\n this.disconnectHandler = new nodejs.NodejsFunction(\n this,\n 'DisconnectHandler',\n {\n functionName: `${prefix}ReactiveDisconnect`,\n runtime: lambda.Runtime.NODEJS_LATEST,\n handler: 'disconnectHandler',\n entry: entryPointPath,\n environment,\n memorySize,\n timeout,\n logRetention,\n },\n );\n\n this.messageHandler = new nodejs.NodejsFunction(this, 'MessageHandler', {\n functionName: `${prefix}ReactiveMessage`,\n runtime: lambda.Runtime.NODEJS_LATEST,\n handler: 'messageHandler',\n entry: entryPointPath,\n environment,\n memorySize,\n timeout,\n logRetention,\n });\n\n this.streamHandler = new nodejs.NodejsFunction(this, 'StreamHandler', {\n functionName: `${prefix}ReactiveStream`,\n runtime: lambda.Runtime.NODEJS_LATEST,\n handler: 'streamHandler',\n entry: entryPointPath,\n environment: {\n ...environment,\n USER_TABLES: props.tables.map((t) => t.tableName).join(','),\n },\n memorySize,\n timeout,\n logRetention,\n });\n\n // Grant permissions for system tables\n this.systemTables.connectionsTable.grantReadWriteData(this.connectHandler);\n this.systemTables.connectionsTable.grantReadWriteData(\n this.disconnectHandler,\n );\n this.systemTables.connectionsTable.grantReadWriteData(this.messageHandler);\n this.systemTables.connectionsTable.grantReadWriteData(this.streamHandler);\n\n this.systemTables.dependenciesTable.grantReadWriteData(this.messageHandler);\n this.systemTables.dependenciesTable.grantReadWriteData(this.streamHandler);\n\n this.systemTables.queriesTable.grantReadWriteData(this.messageHandler);\n this.systemTables.queriesTable.grantReadWriteData(this.streamHandler);\n\n // Grant WebSocket management permissions\n const managementPolicy = new iam.PolicyStatement({\n actions: ['execute-api:ManageConnections'],\n resources: [\n `arn:aws:execute-api:${cdk.Stack.of(this).region}:${cdk.Stack.of(this).account}:${this.webSocketApi.apiId}/${this.webSocketStage.stageName}/POST/@connections/*`,\n ],\n });\n\n this.messageHandler.addToRolePolicy(managementPolicy);\n this.streamHandler.addToRolePolicy(managementPolicy);\n\n // Set up WebSocket routes\n this.webSocketApi.addRoute('$connect', {\n integration: new apigatewayv2Integrations.WebSocketLambdaIntegration(\n 'ConnectIntegration',\n this.connectHandler,\n ),\n });\n\n this.webSocketApi.addRoute('$disconnect', {\n integration: new apigatewayv2Integrations.WebSocketLambdaIntegration(\n 'DisconnectIntegration',\n this.disconnectHandler,\n ),\n });\n\n this.webSocketApi.addRoute('$default', {\n integration: new apigatewayv2Integrations.WebSocketLambdaIntegration(\n 'DefaultIntegration',\n this.messageHandler,\n ),\n });\n\n // Set up DynamoDB stream processing for user tables\n for (const table of props.tables) {\n this.setupStreamProcessing(table);\n }\n\n // Output the WebSocket URL\n new cdk.CfnOutput(this, 'WebSocketUrl', {\n value: this.webSocketUrl,\n description: 'WebSocket URL for reactive connections',\n });\n }\n\n private setupStreamProcessing(table: AnyDynamoTable): void {\n const tableArn = `arn:aws:dynamodb:${cdk.Stack.of(this).region}:${cdk.Stack.of(this).account}:table/${table.tableName}`;\n const streamArn = `${tableArn}/stream/*`;\n\n // Stream handler needs stream access\n this.streamHandler.addToRolePolicy(\n new iam.PolicyStatement({\n actions: [\n 'dynamodb:GetRecords',\n 'dynamodb:GetShardIterator',\n 'dynamodb:DescribeStream',\n 'dynamodb:ListStreams',\n ],\n resources: [streamArn],\n }),\n );\n\n // Both handlers need read access to user tables (including PartiQL for queries)\n const tableReadPolicy = new iam.PolicyStatement({\n actions: [\n 'dynamodb:Query',\n 'dynamodb:Scan',\n 'dynamodb:GetItem',\n 'dynamodb:BatchGetItem',\n 'dynamodb:PartiQLSelect',\n ],\n resources: [tableArn, `${tableArn}/index/*`],\n });\n\n this.streamHandler.addToRolePolicy(tableReadPolicy);\n this.messageHandler.addToRolePolicy(tableReadPolicy);\n\n // Message handler also needs write access for mutations\n this.messageHandler.addToRolePolicy(\n new iam.PolicyStatement({\n actions: [\n 'dynamodb:PutItem',\n 'dynamodb:UpdateItem',\n 'dynamodb:DeleteItem',\n 'dynamodb:BatchWriteItem',\n 'dynamodb:PartiQLInsert',\n 'dynamodb:PartiQLUpdate',\n 'dynamodb:PartiQLDelete',\n ],\n resources: [tableArn, `${tableArn}/index/*`],\n }),\n );\n }\n\n public addTable(table: dynamodb.ITable): void {\n if (!table.tableStreamArn) {\n throw new Error(`Table ${table.tableName} does not have streams enabled`);\n }\n\n table.grantStreamRead(this.streamHandler);\n table.grantReadData(this.streamHandler);\n\n new lambda.EventSourceMapping(this, `Stream-${table.tableName}`, {\n target: this.streamHandler,\n eventSourceArn: table.tableStreamArn,\n startingPosition: lambda.StartingPosition.TRIM_HORIZON,\n batchSize: 100,\n maxBatchingWindow: cdk.Duration.seconds(5),\n });\n }\n}\n","import * as cdk from 'aws-cdk-lib';\nimport type * as dynamodb from 'aws-cdk-lib/aws-dynamodb';\nimport * as lambda from 'aws-cdk-lib/aws-lambda';\nimport { Construct } from 'constructs';\n\n/**\n * Props for DynamoDBStreamSource\n */\nexport interface DynamoDBStreamSourceProps {\n /**\n * The DynamoDB table to create a stream source for\n */\n table: dynamodb.ITable;\n\n /**\n * The Lambda function to receive stream events\n */\n target: lambda.IFunction;\n\n /**\n * Batch size for stream processing\n * @default 100\n */\n batchSize?: number;\n\n /**\n * Maximum batching window\n * @default Duration.seconds(5)\n */\n maxBatchingWindow?: cdk.Duration;\n\n /**\n * Starting position for reading the stream\n * @default TRIM_HORIZON\n */\n startingPosition?: lambda.StartingPosition;\n\n /**\n * Enable parallel processing with multiple batches\n * @default 1\n */\n parallelizationFactor?: number;\n\n /**\n * Maximum record age to process\n * @default Duration.days(1)\n */\n maxRecordAge?: cdk.Duration;\n\n /**\n * Number of retries on failure\n * @default 3\n */\n retryAttempts?: number;\n\n /**\n * Filter patterns for the event source\n */\n filters?: lambda.FilterCriteria[];\n}\n\n/**\n * Helper construct for setting up DynamoDB stream event sources\n */\nexport class DynamoDBStreamSource extends Construct {\n public readonly eventSourceMapping: lambda.EventSourceMapping;\n\n constructor(scope: Construct, id: string, props: DynamoDBStreamSourceProps) {\n super(scope, id);\n\n const {\n table,\n target,\n batchSize = 100,\n maxBatchingWindow = cdk.Duration.seconds(5),\n startingPosition = lambda.StartingPosition.TRIM_HORIZON,\n parallelizationFactor = 1,\n maxRecordAge = cdk.Duration.days(1),\n retryAttempts = 3,\n filters,\n } = props;\n\n if (!table.tableStreamArn) {\n throw new Error(\n `Table ${table.tableName} does not have DynamoDB Streams enabled. ` +\n 'Enable streams with streamSpecification when creating the table.',\n );\n }\n\n // Grant stream read permissions\n table.grantStreamRead(target);\n\n // Create the event source mapping\n this.eventSourceMapping = new lambda.EventSourceMapping(\n this,\n 'EventSource',\n {\n target,\n eventSourceArn: table.tableStreamArn,\n startingPosition,\n batchSize,\n maxBatchingWindow,\n parallelizationFactor,\n maxRecordAge,\n retryAttempts,\n bisectBatchOnError: true,\n reportBatchItemFailures: true,\n filters,\n },\n );\n }\n}\n\n/**\n * Create a filter criteria for DynamoDB streams\n */\nexport function createStreamFilter(options: {\n /**\n * Filter by event name (INSERT, MODIFY, REMOVE)\n */\n eventName?: ('INSERT' | 'MODIFY' | 'REMOVE')[];\n\n /**\n * Custom filter patterns\n */\n patterns?: Record<string, unknown>[];\n}): lambda.FilterCriteria[] {\n const filters: Record<string, unknown>[] = [];\n\n if (options.eventName) {\n filters.push({\n eventName: options.eventName,\n });\n }\n\n if (options.patterns) {\n filters.push(...options.patterns);\n }\n\n if (filters.length === 0) {\n return [];\n }\n\n return [lambda.FilterCriteria.filter({ filters })];\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];\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"]}