@jzhuo3/dynamodb-lib 0.1.1 → 0.1.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +25 -0
- package/dist/cjs/index.d.ts +22 -0
- package/dist/cjs/index.js +70 -0
- package/dist/cjs/index.js.map +1 -1
- package/dist/esm/index.d.ts +22 -0
- package/dist/esm/index.js +71 -1
- package/dist/esm/index.js.map +1 -1
- package/package.json +1 -1
package/dist/esm/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { Agent } from 'https';\n\nimport {\n TransactionCanceledException,\n DynamoDBClient,\n type DynamoDBClientConfig,\n ScalarAttributeType,\n ReturnConsumedCapacity,\n ReturnValue,\n} from '@aws-sdk/client-dynamodb';\nimport {\n DynamoDBDocumentClient,\n GetCommand,\n BatchGetCommand,\n QueryCommand,\n QueryCommandInput,\n PutCommand,\n BatchWriteCommand,\n UpdateCommand,\n DeleteCommand,\n TransactGetCommand,\n TransactWriteCommand,\n TransactGetCommandInput,\n TransactWriteCommandInput,\n TransactGetCommandOutput,\n TransactWriteCommandOutput,\n} from '@aws-sdk/lib-dynamodb';\nimport { diff, camel, snake } from 'radash';\n\nexport type DynamoDBGSIConfig = {\n indexName: string;\n partitionKey: string;\n sortKey?: string;\n projectionType: 'ALL' | 'KEYS_ONLY' | 'INCLUDE';\n nonKeyAttributes?: string[];\n};\n\nexport type DynamoDBLSIConfig = {\n indexName: string;\n sortKey: string;\n projectionType: 'ALL' | 'KEYS_ONLY' | 'INCLUDE';\n nonKeyAttributes?: string[];\n};\n\nexport type DynamoDBTableDefinition = {\n name: string;\n partitionKey: string;\n partitionKeyType: ScalarAttributeType;\n sortKey?: string;\n sortKeyType?: ScalarAttributeType;\n nonKeyAttributeDefinitions?: {\n name: string;\n type: ScalarAttributeType;\n }[];\n localSecondaryIndexes?: DynamoDBLSIConfig[];\n globalSecondaryIndexes?: DynamoDBGSIConfig[];\n timeToLiveAttribute?: string;\n};\n\nexport interface DynamoDBLogger {\n debug(message: string, ...meta: any[]): unknown;\n warn(message: string, ...meta: any[]): unknown;\n error(message: string, ...meta: any[]): unknown;\n}\nconst silentLogger: DynamoDBLogger = { debug() {}, warn() {}, error() {} };\nexport class DynamoDBError extends Error {\n constructor(public readonly status: number, options: { message: string; cause?: unknown }) {\n super(options.message, { cause: options.cause });\n this.name = 'DynamoDBError';\n }\n}\nexport const ucFirst = (value: string): string => value.charAt(0).toUpperCase() + value.slice(1);\nexport const lcFirst = (value: string): string => value.charAt(0).toLowerCase() + value.slice(1);\nconst getUnixTime = (date: Date): number => Math.floor(date.getTime() / 1000);\n\nexport type DynamoDBConfig = {\n region?: DynamoDBClientConfig['region'];\n credentials?: DynamoDBClientConfig['credentials'];\n endpoint?: string;\n maxSockets?: number;\n requestTimeout?: number;\n txRetryLimit?: number;\n txRetryDelay?: number;\n tables: Map<string, DynamoDBTableDefinition>;\n};\n\nexport type DynamoDBFindOptions = {\n consistentRead?: boolean;\n projectionFields?: string[];\n returnConsumedCapacity?: ReturnConsumedCapacity;\n indexToScan?: string;\n limit?: number;\n ascending?: boolean;\n cursor?:\n | Record<string, string | number | Buffer>\n | string\n | number\n | Buffer\n | [string | number | Buffer, string | number | Buffer];\n};\n\nexport type DynamoDBFindResult<T> = {\n items: T[];\n cursor?:\n | Record<string, string | number | Buffer>\n | string\n | number\n | Buffer\n | [string | number | Buffer, string | number | Buffer];\n};\n\nexport type DynamoDBCreateOptions = {\n ttl?: number;\n returnConsumedCapacity?: ReturnConsumedCapacity;\n onConflict?: 'replace' | 'ignore'; // Default is 'replace'\n};\n\nexport type DynamoDBCreateOneResult = {\n created: boolean;\n replacedItem?: Record<string, any>;\n expiresAt?: number;\n};\n\nexport type DynamoDBCreateManyResult = {\n numberOfItems: number;\n expiresAt?: number;\n};\n\nexport type DynamoDBUpdateOptions = {\n returnValue?: ReturnValue;\n upsert?: boolean; // Default is true\n ttl?: number;\n returnConsumedCapacity?: ReturnConsumedCapacity;\n};\n\nexport type DynamoDBUpdateResult<T> = {\n updatedOrCreated: boolean;\n expiresAt?: number;\n item?: Partial<T>;\n};\n\nexport type DynamoDBDeleteOptions = {\n returnValue?: 'ALL_OLD' | 'NONE';\n returnConsumedCapacity?: ReturnConsumedCapacity;\n};\n\nexport type DynamoDBDeleteOneResult<T> = {\n deleted: boolean;\n item?: T;\n};\n\nexport type DynamoDBDeleteManyResult = {\n numberOfItems: number;\n};\n\nexport type DynamoDBTransactionOptions = {\n mode: DynamoDBTransactionMode;\n now?: number;\n returnConsumedCapacity?: ReturnConsumedCapacity;\n};\n\nexport type DynamoDBTransactionResult<T> = {\n items?: T[];\n numberOfTransactItems: number;\n};\n\nfunction isTransactionConflictError(error: Error): boolean {\n return (\n error.name === 'TransactionCanceledException' &&\n (error as TransactionCanceledException).CancellationReasons?.some(\n reason => reason.Code === 'TransactionConflict',\n ) === true\n );\n}\n\nconst MAX_UNPROCESSED_ATTEMPTS = 10;\n\nconst sleep = (ms: number): Promise<void> =>\n new Promise(resolve => setTimeout(resolve, ms));\n\nconst backoffDelayMs = (attempt: number): number =>\n Math.min(50 * 2 ** attempt, 1000);\n\nfunction serializeKey(key: unknown): string {\n return JSON.stringify((Array.isArray(key) ? key : [key]).map(value =>\n value instanceof Uint8Array ? ['binary', Buffer.from(value).toString('base64')] : [typeof value, value],\n ));\n}\n\nfunction transformExpressionAttribute(\n attribute: string,\n names: Map<string, string>,\n prefix = '#attr',\n): string {\n const parts = attribute.split(/(?<!\\\\)\\.(?!\\.)/);\n return parts.map((part, index) => {\n const indices = part.match(/(?<!\\\\)(?:\\[\\d+\\])+$/)?.[0] ?? '';\n const raw = (indices ? part.slice(0, -indices.length) : part).replace(/\\\\([.\\[\\]\\\\])/g, '$1');\n if (!raw) throw new Error('Attribute path must not contain empty segments');\n const name = index === 0 ? ucFirst(camel(raw)) : raw;\n let key = [...names].find(([, value]) => value === name)?.[0];\n if (!key) {\n let i = names.size;\n while (names.has(`${prefix}${i}`)) i++;\n key = `${prefix}${i}`;\n names.set(key, name);\n }\n return key + indices;\n }).join('.');\n}\n\nfunction createComparisonExpression<T>(\n operator: '=' | '<' | '<=' | '>' | '>=' | '<>',\n attribute: string,\n value: T,\n) {\n const expressionAttributeNameMap = new Map();\n const expressionAttributeValueMap = new Map();\n expressionAttributeValueMap.set(':val0', value);\n\n const expression = `${transformExpressionAttribute(\n attribute,\n expressionAttributeNameMap,\n )} ${operator} :val0`;\n\n return new DynamoDBExpression(\n expressionAttributeNameMap,\n expressionAttributeValueMap,\n expression,\n );\n}\n\nfunction createUpdateExpression(expressions: DynamoDBExpression[]) {\n const expressionAttributeNameMap = new Map();\n const expressionAttributeValueMap = new Map();\n const updateExpressionGroups: Map<\n 'SET' | 'REMOVE' | 'ADD' | 'DELETE',\n string[]\n > = new Map();\n expressions.forEach((expr, indx) => {\n if (expr.updateExpressionGroup === undefined) {\n throw new Error(\n 'Only expressions with updateExpressionGroup are allowed',\n );\n }\n expr.expressionAttributeNameMap.forEach((value, key) => {\n key = key.replace('#attr', `#attr${indx}_`);\n expressionAttributeNameMap.set(key, value);\n });\n let childExpression = expr.expression.replace(/#attr/g, `#attr${indx}_`);\n\n if (expr.expressionAttributeValueMap) {\n expr.expressionAttributeValueMap.forEach((value, key) => {\n key = key.replace(':val', `:val${indx}_`);\n expressionAttributeValueMap.set(key, value);\n });\n childExpression = childExpression.replace(/:val/g, `:val${indx}_`);\n }\n\n if (!updateExpressionGroups.has(expr.updateExpressionGroup)) {\n updateExpressionGroups.set(expr.updateExpressionGroup, [childExpression]);\n } else {\n updateExpressionGroups\n .get(expr.updateExpressionGroup)!\n .push(childExpression);\n }\n });\n\n const expression = Array.from(updateExpressionGroups)\n .map(([group, expressions]) => `${group} ${expressions.join(', ')}`)\n .join(' ');\n\n return new DynamoDBExpression(\n expressionAttributeNameMap,\n expressionAttributeValueMap,\n expression,\n );\n}\n\nexport function MoreThan<T>(attribute: string, value: T) {\n return createComparisonExpression<T>('>', attribute, value);\n}\n\nexport function MoreThanOrEqual<T>(attribute: string, value: T) {\n return createComparisonExpression<T>('>=', attribute, value);\n}\n\nexport function LessThan<T>(attribute: string, value: T) {\n return createComparisonExpression<T>('<', attribute, value);\n}\n\nexport function LessThanOrEqual<T>(attribute: string, value: T) {\n return createComparisonExpression<T>('<=', attribute, value);\n}\n\nexport function NotEqual<T>(attribute: string, value: T) {\n return createComparisonExpression<T>('<>', attribute, value);\n}\n\nexport function Equal<T>(attribute: string, value: T) {\n return createComparisonExpression<T>('=', attribute, value);\n}\n\nexport function Between<T>(attribute: string, lowerBound: T, upperBound: T) {\n if (\n typeof lowerBound === 'number' &&\n typeof upperBound === 'number' &&\n lowerBound > upperBound\n ) {\n throw new Error('Lower bound must be less than upper bound');\n }\n\n const expressionAttributeNameMap = new Map();\n const expressionAttributeValueMap = new Map();\n expressionAttributeValueMap.set(':val0', lowerBound);\n expressionAttributeValueMap.set(':val1', upperBound);\n\n const expression = `${transformExpressionAttribute(\n attribute,\n expressionAttributeNameMap,\n )} BETWEEN :val0 AND :val1`;\n\n return new DynamoDBExpression(\n expressionAttributeNameMap,\n expressionAttributeValueMap,\n expression,\n );\n}\n\nexport function In<T>(attribute: string, values: Array<T>) {\n if (values.length === 0 || values.length > 100) {\n throw new Error('Values must not be empty');\n }\n\n const expressionAttributeNameMap = new Map();\n const expressionAttributeValueMap = new Map();\n values.forEach((value, indx) => {\n expressionAttributeValueMap.set(`:val${indx}`, value);\n });\n\n const expression = `${transformExpressionAttribute(\n attribute,\n expressionAttributeNameMap,\n )} IN (${Array.from(expressionAttributeValueMap.keys()).join(', ')})`;\n\n return new DynamoDBExpression(\n expressionAttributeNameMap,\n expressionAttributeValueMap,\n expression,\n );\n}\n\nexport function AttributeExists(attribute: string) {\n const expressionAttributeNameMap = new Map();\n\n const expression = `attribute_exists(${transformExpressionAttribute(\n attribute,\n expressionAttributeNameMap,\n )})`;\n\n return new DynamoDBExpression(expressionAttributeNameMap, null, expression);\n}\n\nexport function AttributeNotExists(attribute: string) {\n const expressionAttributeNameMap = new Map();\n\n const expression = `attribute_not_exists(${transformExpressionAttribute(\n attribute,\n expressionAttributeNameMap,\n )})`;\n\n return new DynamoDBExpression(expressionAttributeNameMap, null, expression);\n}\n\nexport function AttributeType(\n attribute: string,\n valueType: 'S' | 'N' | 'B' | 'SS' | 'NS' | 'BS' | 'BOOL' | 'NULL' | 'L' | 'M',\n) {\n const expressionAttributeNameMap = new Map();\n const expressionAttributeValueMap = new Map();\n expressionAttributeValueMap.set(':val0', valueType);\n\n const expression = `attribute_type(${transformExpressionAttribute(\n attribute,\n expressionAttributeNameMap,\n )}, :val0)`;\n\n return new DynamoDBExpression(\n expressionAttributeNameMap,\n expressionAttributeValueMap,\n expression,\n );\n}\n\nexport function BeginsWith(attribute: string, prefix: string) {\n const expressionAttributeNameMap = new Map();\n const expressionAttributeValueMap = new Map();\n expressionAttributeValueMap.set(':val0', prefix);\n\n const expression = `begins_with(${transformExpressionAttribute(\n attribute,\n expressionAttributeNameMap,\n )}, :val0)`;\n\n return new DynamoDBExpression(\n expressionAttributeNameMap,\n expressionAttributeValueMap,\n expression,\n );\n}\n\nexport function Contains<T>(attribute: string, operand: T) {\n const expressionAttributeNameMap = new Map();\n const expressionAttributeValueMap = new Map();\n expressionAttributeValueMap.set(':val0', operand);\n\n const expression = `contains(${transformExpressionAttribute(\n attribute,\n expressionAttributeNameMap,\n )}, :val0)`;\n\n return new DynamoDBExpression(\n expressionAttributeNameMap,\n expressionAttributeValueMap,\n expression,\n );\n}\n\nexport function Size(\n attribute: string,\n operator: '=' | '<>' | '<' | '<=' | '>' | '>=',\n value: number,\n) {\n const expressionAttributeNameMap = new Map();\n const expressionAttributeValueMap = new Map();\n expressionAttributeValueMap.set(':val0', value);\n\n const expression = `size(${transformExpressionAttribute(\n attribute,\n expressionAttributeNameMap,\n )}) ${operator} :val0`;\n\n return new DynamoDBExpression(\n expressionAttributeNameMap,\n expressionAttributeValueMap,\n expression,\n );\n}\n\nexport function Not(expression: DynamoDBExpression) {\n let expr = expression.expression;\n if (\n (expr.includes(' OR ') || expr.includes(' AND ')) &&\n !expr.startsWith('(')\n ) {\n expr = `(${expr})`;\n }\n\n expr = `NOT ${expr}`;\n return new DynamoDBExpression(\n expression.expressionAttributeNameMap,\n expression.expressionAttributeValueMap,\n expr,\n );\n}\n\nexport function And(...expressions: DynamoDBExpression[]) {\n if (!expressions.length) throw new Error('At least one expression is required');\n const expressionAttributeNameMap = new Map();\n const expressionAttributeValueMap = new Map();\n const expression = expressions\n .map((expr, indx) => {\n expr.expressionAttributeNameMap.forEach((value, key) => {\n key = key.replace('#attr', `#attr${indx}_`);\n expressionAttributeNameMap.set(key, value);\n });\n let childExpression = expr.expression.replace(/#attr/g, `#attr${indx}_`);\n\n if (expr.expressionAttributeValueMap) {\n expr.expressionAttributeValueMap.forEach((value, key) => {\n key = key.replace(':val', `:val${indx}_`);\n expressionAttributeValueMap.set(key, value);\n });\n childExpression = childExpression.replace(/:val/g, `:val${indx}_`);\n }\n\n // If expression contains a `OR` or `AND` or `NOT` operator, wrap it in parentheses\n return (childExpression.includes(' OR ') ||\n childExpression.includes(' AND ')) &&\n !childExpression.startsWith('(')\n ? `(${childExpression})` // Wrap in parentheses\n : childExpression;\n })\n .join(' AND ');\n\n return new DynamoDBExpression(\n expressionAttributeNameMap,\n expressionAttributeValueMap,\n expression,\n );\n}\n\nexport function Or(...expressions: DynamoDBExpression[]) {\n if (!expressions.length) throw new Error('At least one expression is required');\n const expressionAttributeNameMap = new Map();\n const expressionAttributeValueMap = new Map();\n const expression = expressions\n .map((expr, indx) => {\n expr.expressionAttributeNameMap.forEach((value, key) => {\n key = key.replace('#attr', `#attr${indx}_`);\n expressionAttributeNameMap.set(key, value);\n });\n let childExpression = expr.expression.replace(/#attr/g, `#attr${indx}_`);\n\n if (expr.expressionAttributeValueMap) {\n expr.expressionAttributeValueMap.forEach((value, key) => {\n key = key.replace(':val', `:val${indx}_`);\n expressionAttributeValueMap.set(key, value);\n });\n childExpression = childExpression.replace(/:val/g, `:val${indx}_`);\n }\n\n // If expression contains a `OR` or `AND` operator, wrap it in parentheses\n return (childExpression.includes(' OR ') ||\n childExpression.includes(' AND ')) &&\n !childExpression.startsWith('(')\n ? `(${childExpression})` // Wrap in parentheses\n : childExpression;\n })\n .join(' OR ');\n\n return new DynamoDBExpression(\n expressionAttributeNameMap,\n expressionAttributeValueMap,\n expression,\n );\n}\n\nexport function Assign(attribute: string, value: any) {\n const expressionAttributeNameMap = new Map();\n const expressionAttributeValueMap = new Map();\n expressionAttributeValueMap.set(':val0', value);\n\n const expression = `${transformExpressionAttribute(\n attribute,\n expressionAttributeNameMap,\n )} = :val0`;\n\n return new DynamoDBExpression(\n expressionAttributeNameMap,\n expressionAttributeValueMap,\n expression,\n 'SET',\n );\n}\n\nexport function AssignIfNotExists(attribute: string, value: any) {\n const expressionAttributeNameMap = new Map();\n const expressionAttributeValueMap = new Map();\n expressionAttributeValueMap.set(':val0', value);\n\n const path = transformExpressionAttribute(\n attribute,\n expressionAttributeNameMap,\n );\n const expression = `${path} = if_not_exists(${path}, :val0)`;\n\n return new DynamoDBExpression(\n expressionAttributeNameMap,\n expressionAttributeValueMap,\n expression,\n 'SET',\n );\n}\n\nexport function Increment(attribute: string, value: number) {\n if (!Number.isFinite(value)) {\n throw new Error('Value must be a number');\n }\n\n const expressionAttributeNameMap = new Map();\n const expressionAttributeValueMap = new Map();\n expressionAttributeValueMap.set(':val0', value);\n\n const path = transformExpressionAttribute(\n attribute,\n expressionAttributeNameMap,\n );\n const expression = `${path} :val0`;\n\n return new DynamoDBExpression(\n expressionAttributeNameMap,\n expressionAttributeValueMap,\n expression,\n 'ADD',\n );\n}\n\nexport function Decrement(attribute: string, value: number) {\n if (!Number.isFinite(value)) {\n throw new Error('Value must be a number');\n }\n value = -value;\n return Increment(attribute, value);\n}\n\nexport function ListAppend(\n attribute: string,\n value: Array<any>,\n upsert = false,\n) {\n if (!Array.isArray(value)) {\n throw new Error('Value must be an array');\n }\n\n const expressionAttributeNameMap = new Map();\n const expressionAttributeValueMap = new Map();\n expressionAttributeValueMap.set(':val0', value);\n if (upsert) {\n expressionAttributeValueMap.set(':val1', []);\n }\n\n const path = transformExpressionAttribute(\n attribute,\n expressionAttributeNameMap,\n );\n\n const expression = upsert\n ? `${path} = list_append(if_not_exists(${path}, :val1), :val0)`\n : `${path} = list_append(${path}, :val0)`;\n\n return new DynamoDBExpression(\n expressionAttributeNameMap,\n expressionAttributeValueMap,\n expression,\n 'SET',\n );\n}\n\nexport function ListPrepend(\n attribute: string,\n value: Array<any>,\n upsert = false,\n) {\n if (!Array.isArray(value)) {\n throw new Error('Value must be an array');\n }\n\n const expressionAttributeNameMap = new Map();\n const expressionAttributeValueMap = new Map();\n expressionAttributeValueMap.set(':val0', value);\n if (upsert) {\n expressionAttributeValueMap.set(':val1', []);\n }\n\n const path = transformExpressionAttribute(\n attribute,\n expressionAttributeNameMap,\n );\n\n const expression = upsert\n ? `${path} = list_append(:val0, if_not_exists(${path}, :val1))`\n : `${path} = list_append(:val0, ${path})`;\n\n return new DynamoDBExpression(\n expressionAttributeNameMap,\n expressionAttributeValueMap,\n expression,\n 'SET',\n );\n}\n\nexport function Remove(attribute: string) {\n const expressionAttributeNameMap = new Map();\n\n const expression = transformExpressionAttribute(\n attribute,\n expressionAttributeNameMap,\n );\n\n return new DynamoDBExpression(\n expressionAttributeNameMap,\n null,\n expression,\n 'REMOVE',\n );\n}\n\nexport function SetAdd(attribute: string, value: Set<any>) {\n if (!(value instanceof Set) || value.size === 0) {\n throw new Error('Value must be a Set');\n }\n\n const expressionAttributeNameMap = new Map();\n const expressionAttributeValueMap = new Map();\n expressionAttributeValueMap.set(':val0', value);\n\n const path = transformExpressionAttribute(\n attribute,\n expressionAttributeNameMap,\n );\n\n const expression = `${path} :val0`;\n\n return new DynamoDBExpression(\n expressionAttributeNameMap,\n expressionAttributeValueMap,\n expression,\n 'ADD',\n );\n}\n\nexport function SetDelete(attribute: string, value: Set<any>) {\n if (!(value instanceof Set) || value.size === 0) {\n throw new Error('Value must be a Set');\n }\n\n const expressionAttributeNameMap = new Map();\n const expressionAttributeValueMap = new Map();\n expressionAttributeValueMap.set(':val0', value);\n\n const path = transformExpressionAttribute(\n attribute,\n expressionAttributeNameMap,\n );\n\n const expression = `${path} :val0`;\n\n return new DynamoDBExpression(\n expressionAttributeNameMap,\n expressionAttributeValueMap,\n expression,\n 'DELETE',\n );\n}\n\nexport class DynamoDBExpression {\n constructor(\n public expressionAttributeNameMap: Map<string, string> = new Map(), // e.g. #attr0 -> attribute\n public expressionAttributeValueMap: Map<string, any> | null = null, // e.g. :val0 -> value\n public expression: string = '',\n public updateExpressionGroup?: 'SET' | 'REMOVE' | 'ADD' | 'DELETE',\n ) { }\n}\n\nexport enum DynamoDBTransactionMode {\n READ = 'READ',\n WRITE = 'WRITE',\n}\n\nexport class DynamoDBTransaction {\n private transactGetItems: Exclude<\n TransactGetCommandInput['TransactItems'],\n undefined\n > = [];\n private transactWriteItems: Exclude<\n TransactWriteCommandInput['TransactItems'],\n undefined\n > = [];\n private itemIndxToCheckTTL: Set<number> = new Set();\n private itemIndxToTableKey: Map<number, string> = new Map();\n\n constructor(\n public mode: DynamoDBTransactionMode,\n private readonly ddbDocClient: DynamoDBDocumentClient,\n private readonly tables: Map<string, DynamoDBTableDefinition>,\n private readonly txRetryLimit: number,\n private readonly txRetryDelay: number,\n private readonly logger: DynamoDBLogger,\n private readonly now: number,\n private returnConsumedCapacity?: ReturnConsumedCapacity,\n ) {\n if (\n mode !== DynamoDBTransactionMode.READ &&\n mode !== DynamoDBTransactionMode.WRITE\n ) {\n throw new Error('Invalid transaction mode');\n }\n }\n\n async txConflictRetryWrapper(\n command: TransactGetCommand | TransactWriteCommand,\n retries: number,\n delay: number,\n ): Promise<\n TransactWriteCommandOutput | TransactGetCommandOutput | undefined\n > {\n retries = Math.max(1, Math.min(retries, 10)); // Limit retries to a maximum of 10\n delay = Math.max(delay, 50); // Ensure a minimum delay of 50ms\n for (let i = 0; i < retries; i++) {\n try {\n if (command instanceof TransactWriteCommand) {\n return await this.ddbDocClient.send(command);\n } else if (command instanceof TransactGetCommand) {\n return await this.ddbDocClient.send(command);\n }\n throw new Error(\n 'Only TransactWriteCommand and TransactGetCommand are supported to retry on conflict',\n );\n } catch (error) {\n if (error instanceof Error && isTransactionConflictError(error)) {\n if (i === retries - 1) {\n throw error;\n }\n this.logger.warn('DynamoDB retrying transaction conflict', { mode: this.mode, attempt: i + 1, maxAttempts: retries, delayMs: delay * (i + 1) });\n await new Promise(resolve => setTimeout(resolve, delay * (i + 1)));\n } else {\n throw error;\n }\n }\n }\n }\n\n _cleanup() {\n this.transactGetItems.length = 0;\n this.transactWriteItems.length = 0;\n this.itemIndxToCheckTTL.clear();\n this.itemIndxToTableKey.clear();\n }\n\n getOne(\n tableKey: string,\n primaryKey:\n | string\n | number\n | Buffer\n | [string | number | Buffer, string | number | Buffer],\n opts: Pick<DynamoDBFindOptions, 'projectionFields'> = {},\n ) {\n if (this.mode !== DynamoDBTransactionMode.READ) {\n throw new Error('Transaction mode is not READ');\n }\n\n if (this.transactGetItems.length >= 25) {\n throw new Error('Maximum number of items in a transaction is 25');\n }\n\n const table = this.tables.get(tableKey);\n if (!table) {\n throw new Error(`Table ${tableKey} not configured`);\n }\n\n const keys = Array.isArray(primaryKey)\n ? {\n [table.partitionKey]: primaryKey[0],\n [table.sortKey!]: primaryKey[1],\n }\n : {\n [table.partitionKey]: primaryKey,\n };\n\n let ProjectionExpression: string = '';\n let ExpressionAttributeNames: Record<string, string> | null = null;\n if (opts.projectionFields !== undefined) {\n const projectionFields = [...new Set(opts.projectionFields.map(field => field.includes('.') || field.includes('[') ? field : ucFirst(camel(field))))];\n const optIncludeTimeToLive =\n table.timeToLiveAttribute !== undefined &&\n projectionFields.includes(table.timeToLiveAttribute);\n if (table.timeToLiveAttribute !== undefined && !optIncludeTimeToLive) {\n projectionFields.push(table.timeToLiveAttribute);\n }\n const expressionAttributeNameMap = new Map();\n ProjectionExpression = projectionFields\n .map(field =>\n transformExpressionAttribute(field, expressionAttributeNameMap),\n )\n .join(', ');\n expressionAttributeNameMap.forEach(\n (attributeName, attributeNameVariable) => {\n if (ExpressionAttributeNames === null) {\n ExpressionAttributeNames = {};\n }\n ExpressionAttributeNames[attributeNameVariable] = attributeName;\n },\n );\n }\n\n this.transactGetItems.push({\n Get: {\n TableName: table.name,\n Key: keys,\n ...(ProjectionExpression !== '' ? { ProjectionExpression } : {}),\n ...(ExpressionAttributeNames !== null\n ? { ExpressionAttributeNames }\n : {}),\n },\n });\n\n if (table.timeToLiveAttribute !== undefined) {\n this.itemIndxToCheckTTL.add(this.transactGetItems.length - 1);\n this.itemIndxToTableKey.set(this.transactGetItems.length - 1, tableKey);\n }\n\n return this; // Chainable\n }\n\n check(\n tableKey: string,\n primaryKey:\n | string\n | number\n | Buffer\n | [string | number | Buffer, string | number | Buffer],\n filter: DynamoDBExpression,\n ) {\n if (this.mode !== DynamoDBTransactionMode.WRITE) {\n throw new Error('Transaction mode is not WRITE');\n }\n\n if (this.transactWriteItems.length >= 25) {\n throw new Error('Maximum number of items in a transaction is 25');\n }\n\n const table = this.tables.get(tableKey);\n if (!table) {\n throw new Error(`Table ${tableKey} not configured`);\n }\n\n if (filter.expression === '') {\n throw new Error('Filter expression is empty');\n }\n\n const keys = Array.isArray(primaryKey)\n ? {\n [table.partitionKey]: primaryKey[0],\n [table.sortKey!]: primaryKey[1],\n }\n : {\n [table.partitionKey]: primaryKey,\n };\n\n if (table.timeToLiveAttribute !== undefined) {\n filter = And(\n filter,\n Or(\n AttributeNotExists(table.timeToLiveAttribute),\n MoreThan(table.timeToLiveAttribute, this.now),\n ),\n );\n }\n\n const ConditionExpression: string = filter.expression;\n const ExpressionAttributeNames: Record<string, string> = Array.from(\n filter.expressionAttributeNameMap,\n ).reduce((acc, [key, value]) => {\n acc[key] = value;\n return acc;\n }, {} as Record<string, any>);\n const ExpressionAttributeValues: Record<string, any> | null =\n filter.expressionAttributeValueMap\n ? Array.from(filter.expressionAttributeValueMap).reduce(\n (acc, [key, value]) => {\n acc[key] = value;\n return acc;\n },\n {} as Record<string, any>,\n )\n : null;\n\n this.transactWriteItems.push({\n ConditionCheck: {\n TableName: table.name,\n Key: keys,\n ConditionExpression,\n ExpressionAttributeNames,\n ...(ExpressionAttributeValues !== null\n ? { ExpressionAttributeValues }\n : {}),\n },\n });\n\n return this; // Chainable\n }\n\n createOne(\n tableKey: string,\n primaryKey:\n | string\n | number\n | Buffer\n | [string | number | Buffer, string | number | Buffer],\n item: Record<string, any>,\n opts: Pick<DynamoDBCreateOptions, 'ttl' | 'onConflict'> = {},\n ) {\n if (this.mode !== DynamoDBTransactionMode.WRITE) {\n throw new Error('Transaction mode is not WRITE');\n }\n\n if (this.transactWriteItems.length >= 25) {\n throw new Error('Maximum number of items in a transaction is 25');\n }\n\n const table = this.tables.get(tableKey);\n if (!table) {\n throw new Error(`Table ${tableKey} not configured`);\n }\n\n const normalizedItem: Record<string, any> = {};\n Object.keys(item).forEach(key => {\n normalizedItem[ucFirst(camel(key))] = item[key];\n });\n\n if (table.sortKey) {\n if (!Array.isArray(primaryKey) || primaryKey.length !== 2) throw new Error('Composite primary key requires two values');\n normalizedItem[table.partitionKey] = primaryKey[0];\n normalizedItem[table.sortKey!] = primaryKey[1];\n } else {\n normalizedItem[table.partitionKey] = primaryKey;\n }\n\n if (table.timeToLiveAttribute !== undefined && opts.ttl && opts.ttl > 0) {\n normalizedItem[table.timeToLiveAttribute] = this.now + opts.ttl;\n }\n\n let ConditionExpression: string = '';\n let ExpressionAttributeNames: Record<string, string> | null = null;\n if (opts.onConflict === 'ignore') {\n const expression = table.sortKey\n ? And(\n AttributeNotExists(table.partitionKey),\n AttributeNotExists(table.sortKey),\n )\n : AttributeNotExists(table.partitionKey);\n ConditionExpression = expression.expression;\n expression.expressionAttributeNameMap.forEach((value, key) => {\n if (!ExpressionAttributeNames) {\n ExpressionAttributeNames = {};\n }\n ExpressionAttributeNames[key] = value;\n });\n }\n\n this.transactWriteItems.push({\n Put: {\n TableName: table.name,\n Item: normalizedItem,\n ...(ConditionExpression !== '' ? { ConditionExpression } : {}),\n ...(ExpressionAttributeNames !== null\n ? { ExpressionAttributeNames }\n : {}),\n },\n });\n\n return this; // Chainable\n }\n\n update(\n tableKey: string,\n primaryKey:\n | string\n | number\n | Buffer\n | [string | number | Buffer, string | number | Buffer],\n commands: DynamoDBExpression[],\n condition: DynamoDBExpression | null = null,\n opts: Pick<DynamoDBUpdateOptions, 'ttl' | 'upsert'> = {},\n ) {\n if (this.mode !== DynamoDBTransactionMode.WRITE) {\n throw new Error('Transaction mode is not WRITE');\n }\n\n if (this.transactWriteItems.length >= 25) {\n throw new Error('Maximum number of items in a transaction is 25');\n }\n\n const table = this.tables.get(tableKey);\n if (!table) {\n throw new Error(`Table ${tableKey} not configured`);\n }\n if (commands.length === 0 && opts.ttl === undefined) {\n throw new Error('No update commands provided');\n }\n\n const keys = Array.isArray(primaryKey)\n ? {\n [table.partitionKey]: primaryKey[0],\n [table.sortKey!]: primaryKey[1],\n }\n : {\n [table.partitionKey]: primaryKey,\n };\n\n commands = [...commands];\n if (table.timeToLiveAttribute && opts.ttl !== undefined) {\n if (opts.ttl > 0) {\n const expiresAt = this.now + opts.ttl;\n commands.push(Assign(table.timeToLiveAttribute, expiresAt));\n } else if (opts.ttl === 0) {\n commands.push(Remove(table.timeToLiveAttribute));\n }\n }\n\n const {\n expressionAttributeNameMap,\n expressionAttributeValueMap,\n expression: UpdateExpression,\n } = createUpdateExpression(commands);\n\n let ConditionExpression: string = '';\n if (table.timeToLiveAttribute && opts.upsert === false) {\n condition = condition\n ? And(\n condition,\n Or(\n AttributeNotExists(table.timeToLiveAttribute),\n MoreThan(table.timeToLiveAttribute, this.now),\n ),\n )\n : Or(\n AttributeNotExists(table.timeToLiveAttribute),\n MoreThan(table.timeToLiveAttribute, this.now),\n );\n }\n\n if (opts.upsert === false) {\n condition = table.sortKey\n ? condition\n ? And(\n condition,\n And(\n AttributeExists(table.partitionKey),\n AttributeExists(table.sortKey),\n ),\n )\n : And(\n AttributeExists(table.partitionKey),\n AttributeExists(table.sortKey),\n )\n : condition\n ? And(condition, AttributeExists(table.partitionKey))\n : AttributeExists(table.partitionKey);\n }\n\n if (condition) {\n condition.expressionAttributeNameMap.forEach((value, key) => {\n key = key.replace('#attr', `#condition_attr`);\n expressionAttributeNameMap.set(key, value);\n });\n if (condition.expressionAttributeValueMap) {\n condition.expressionAttributeValueMap.forEach((value, key) => {\n key = key.replace(':val', `:condition_val`);\n expressionAttributeValueMap!.set(key, value);\n });\n }\n\n ConditionExpression = condition.expression\n .replace(/#attr/g, `#condition_attr`)\n .replace(/:val/g, `:condition_val`);\n }\n\n let ExpressionAttributeNames: Record<string, string> | null = null;\n let ExpressionAttributeValues: Record<string, any> | null = null;\n\n expressionAttributeNameMap.forEach(\n (attributeName, attributeNameVariable) => {\n if (!ExpressionAttributeNames) {\n ExpressionAttributeNames = {};\n }\n ExpressionAttributeNames[attributeNameVariable] = attributeName;\n },\n );\n expressionAttributeValueMap!.forEach((value, attributeValueVariable) => {\n if (!ExpressionAttributeValues) {\n ExpressionAttributeValues = {};\n }\n ExpressionAttributeValues[attributeValueVariable] = value;\n });\n\n this.transactWriteItems.push({\n Update: {\n TableName: table.name,\n Key: keys,\n UpdateExpression,\n ...(ConditionExpression !== '' ? { ConditionExpression } : {}),\n ...(ExpressionAttributeNames !== null\n ? { ExpressionAttributeNames }\n : {}),\n ...(ExpressionAttributeValues !== null\n ? { ExpressionAttributeValues }\n : {}),\n },\n });\n\n return this; // Chainable\n }\n\n deleteOne(\n tableKey: string,\n primaryKey:\n | string\n | number\n | Buffer\n | [string | number | Buffer, string | number | Buffer],\n condition: DynamoDBExpression | null = null,\n ) {\n if (this.mode !== DynamoDBTransactionMode.WRITE) {\n throw new Error('Transaction mode is not WRITE');\n }\n\n if (this.transactWriteItems.length >= 25) {\n throw new Error('Maximum number of items in a transaction is 25');\n }\n\n const table = this.tables.get(tableKey);\n if (!table) {\n throw new Error(`Table ${tableKey} not configured`);\n }\n\n const keys = Array.isArray(primaryKey)\n ? {\n [table.partitionKey]: primaryKey[0],\n [table.sortKey!]: primaryKey[1],\n }\n : {\n [table.partitionKey]: primaryKey,\n };\n\n let ConditionExpression: string = '';\n let ExpressionAttributeNames: Record<string, string> | null = null;\n let ExpressionAttributeValues: Record<string, any> | null = null;\n\n if (condition) {\n condition.expressionAttributeNameMap.forEach(\n (attributeName, attributeNameVariable) => {\n if (!ExpressionAttributeNames) {\n ExpressionAttributeNames = {};\n }\n ExpressionAttributeNames[attributeNameVariable] = attributeName;\n },\n );\n if (condition.expressionAttributeValueMap) {\n condition.expressionAttributeValueMap.forEach(\n (value, attributeValueVariable) => {\n if (!ExpressionAttributeValues) {\n ExpressionAttributeValues = {};\n }\n ExpressionAttributeValues[attributeValueVariable] = value;\n },\n );\n }\n ConditionExpression = condition.expression;\n }\n\n this.transactWriteItems.push({\n Delete: {\n TableName: table.name,\n Key: keys,\n ...(ConditionExpression !== '' ? { ConditionExpression } : {}),\n ...(ExpressionAttributeNames !== null\n ? { ExpressionAttributeNames }\n : {}),\n ...(ExpressionAttributeValues !== null\n ? { ExpressionAttributeValues }\n : {}),\n },\n });\n\n return this; // Chainable\n }\n\n async commit<T>(camelOrSnake: 'camel' | 'snake' = 'camel'): Promise<DynamoDBTransactionResult<T | null>> {\n let command: TransactGetCommand | TransactWriteCommand;\n const result: DynamoDBTransactionResult<T | null> = {\n numberOfTransactItems: 0,\n };\n this.logger.debug('DynamoDB transaction started', { mode: this.mode, itemCount: this.mode === DynamoDBTransactionMode.READ ? this.transactGetItems.length : this.transactWriteItems.length });\n switch (this.mode) {\n case DynamoDBTransactionMode.READ:\n command = new TransactGetCommand({\n TransactItems: this.transactGetItems,\n ...(this.returnConsumedCapacity\n ? { ReturnConsumedCapacity: this.returnConsumedCapacity }\n : {}),\n });\n const { Responses } = (await this.txConflictRetryWrapper(\n command,\n this.txRetryLimit,\n this.txRetryDelay,\n ).catch((e: Error) => {\n this._cleanup();\n if (isTransactionConflictError(e)) {\n this.logger.error('DynamoDB transaction conflict retry limit reached', { errorName: e.name });\n throw new DynamoDBError(409, {\n message: e.message,\n cause: e,\n });\n } else if (e.name === 'TransactionCanceledException') {\n this.logger.error('DynamoDB transaction canceled', { errorName: e.name });\n throw new DynamoDBError(400, {\n message: e.message,\n cause: e,\n });\n } else {\n this.logger.error('Transaction failed', { errorName: e.name });\n throw new DynamoDBError(500, {\n message: e.message,\n cause: e,\n });\n }\n })) as TransactGetCommandOutput;\n result.numberOfTransactItems = this.transactGetItems.length;\n result.items = Responses!.map(({ Item }, indx) => {\n if (!Item) {\n return null;\n }\n if (this.itemIndxToCheckTTL.has(indx)) {\n const table = this.tables.get(this.itemIndxToTableKey.get(indx)!)!;\n if (\n Item[table.timeToLiveAttribute!] !== undefined &&\n Item[table.timeToLiveAttribute!] <= this.now\n ) {\n return null;\n }\n }\n // Convert keys back to camelCase if camelOrSnake is 'camel' or to snake_case if camelOrSnake is 'snake'\n if (camelOrSnake === 'camel') {\n const newItem: Record<string, any> = {};\n Object.keys(Item!).forEach(key => {\n const value = Item![key];\n newItem[lcFirst(key)] = value;\n });\n return newItem as T;\n } else {\n const newItem: Record<string, any> = {};\n Object.keys(Item!).forEach(key => {\n const value = Item![key];\n newItem[snake(lcFirst(key))] = value;\n });\n return newItem as T;\n }\n });\n this._cleanup();\n break;\n case DynamoDBTransactionMode.WRITE:\n command = new TransactWriteCommand({\n TransactItems: this.transactWriteItems,\n ...(this.returnConsumedCapacity\n ? { ReturnConsumedCapacity: this.returnConsumedCapacity }\n : {}),\n });\n await this.txConflictRetryWrapper(\n command,\n this.txRetryLimit,\n this.txRetryDelay,\n ).catch((e: Error) => {\n this._cleanup();\n if (isTransactionConflictError(e)) {\n this.logger.error('DynamoDB transaction conflict retry limit reached', { errorName: e.name });\n throw new DynamoDBError(409, {\n message: e.message,\n cause: e,\n });\n } else if (e.name === 'TransactionCanceledException') {\n this.logger.error('DynamoDB transaction canceled', { errorName: e.name });\n throw new DynamoDBError(400, {\n message: e.message,\n cause: e,\n });\n } else if (e.name === 'ValidationException') {\n this.logger.error('The request parameters are invalid', { errorName: e.name });\n throw new DynamoDBError(400, {\n message: 'Invalid request parameters',\n cause: e,\n });\n } else {\n this.logger.error('Transaction failed', { errorName: e.name });\n throw new DynamoDBError(500, {\n message: e.message,\n cause: e,\n });\n }\n });\n result.numberOfTransactItems = this.transactWriteItems.length;\n this._cleanup();\n break;\n default:\n throw new Error('Invalid transaction mode');\n }\n\n this.logger.debug('DynamoDB transaction completed', { mode: this.mode, itemCount: result.numberOfTransactItems });\n return result;\n }\n}\n\nexport default class DynamoDBService {\n private readonly ddbClient: DynamoDBClient;\n private readonly ddbDocClient: DynamoDBDocumentClient;\n constructor(\n private readonly options: DynamoDBConfig,\n private readonly logger: DynamoDBLogger = silentLogger,\n ) {\n // Check the tables configuration\n if (\n !options.tables ||\n options.tables.size === 0 ||\n Array.from(options.tables.values()).some(table => table.name === '')\n ) {\n throw new Error('DynamoDB tables are not configured properly');\n }\n\n this.ddbClient = new DynamoDBClient({\n region: options.region,\n credentials: options.credentials,\n requestHandler: {\n requestTimeout: this.options.requestTimeout,\n httpsAgent: new Agent({\n keepAlive: true,\n maxSockets: this.options.maxSockets ?? 50,\n }),\n },\n ...(this.options.endpoint ? { endpoint: this.options.endpoint } : {}), // For local development\n });\n this.ddbDocClient = DynamoDBDocumentClient.from(this.ddbClient);\n }\n\n /** Release connections when the application shuts down; reuse instances in Lambda. */\n destroy(): void { this.ddbClient.destroy(); }\n\n async getOne<T>(\n tableKey: string,\n primaryKey:\n | string\n | number\n | Buffer\n | [string | number | Buffer, string | number | Buffer],\n opts: Omit<\n DynamoDBFindOptions,\n 'cursor' | 'limit' | 'ascending' | 'indexToScan'\n > = {},\n camelOrSnake: 'camel' | 'snake' = 'camel',\n ): Promise<T | null> {\n const table = this.options.tables.get(tableKey);\n if (!table) {\n throw new Error(`Table ${tableKey} not configured`);\n }\n\n const keys = Array.isArray(primaryKey)\n ? {\n [table.partitionKey]: primaryKey[0],\n [table.sortKey!]: primaryKey[1],\n }\n : {\n [table.partitionKey]: primaryKey,\n };\n\n let optIncludeTimeToLive: boolean = false;\n let ProjectionExpression: string = '';\n let ExpressionAttributeNames: Record<string, string> | null = null;\n if (opts.projectionFields) {\n const projectionFields = [...new Set(opts.projectionFields.map(field => field.includes('.') || field.includes('[') ? field : ucFirst(camel(field))))];\n optIncludeTimeToLive =\n table.timeToLiveAttribute !== undefined &&\n projectionFields.includes(table.timeToLiveAttribute);\n if (table.timeToLiveAttribute && !optIncludeTimeToLive) {\n projectionFields.push(table.timeToLiveAttribute);\n }\n const expressionAttributeNameMap = new Map();\n ProjectionExpression = projectionFields\n .map(field =>\n transformExpressionAttribute(field, expressionAttributeNameMap),\n )\n .join(', ');\n expressionAttributeNameMap.forEach(\n (attributeName, attributeNameVariable) => {\n if (!ExpressionAttributeNames) {\n ExpressionAttributeNames = {};\n }\n ExpressionAttributeNames[attributeNameVariable] = attributeName;\n },\n );\n }\n\n this.logger.debug('DynamoDB request started', { operation: 'getOne', tableKey });\n const getCommand = new GetCommand({\n TableName: table.name,\n Key: keys,\n ConsistentRead: opts.consistentRead ?? false,\n ReturnConsumedCapacity:\n opts.returnConsumedCapacity ?? ReturnConsumedCapacity.NONE,\n ...(ProjectionExpression !== '' ? { ProjectionExpression } : {}),\n ...(ExpressionAttributeNames !== null\n ? { ExpressionAttributeNames }\n : {}),\n });\n\n const { Item: item } = await this.ddbDocClient\n .send(getCommand)\n .catch((e: Error) => {\n if (e.name === 'ValidationException') {\n this.logger.error('The request parameters are invalid', { errorName: e.name, tableKey });\n throw new DynamoDBError(400, {\n message: 'Invalid request parameters',\n cause: e,\n });\n } else {\n this.logger.error('Failed to get item', { errorName: e.name, tableKey });\n throw new DynamoDBError(500, {\n message: 'Failed to get item',\n cause: e,\n });\n }\n });\n // Filter expired item\n if (item && table.timeToLiveAttribute && item[table.timeToLiveAttribute] !== undefined) {\n const now = getUnixTime(new Date());\n if (item[table.timeToLiveAttribute] <= now) {\n this.logger.debug('DynamoDB getOne completed', { tableKey, outcome: 'expired' });\n return null;\n }\n\n // Delete the time to live attribute from the item if not requested\n if (optIncludeTimeToLive === false) {\n delete item[table.timeToLiveAttribute];\n }\n }\n this.logger.debug('DynamoDB getOne completed', { tableKey, outcome: item ? 'found' : 'not-found' });\n // Item will be undefined if not found\n // Convert keys back to camelCase if camelOrSnake is 'camel' or to snake_case if camelOrSnake is 'snake'\n if (item) {\n if (camelOrSnake === 'camel') {\n const newItem: Record<string, any> = {};\n Object.keys(item).forEach(key => {\n const value = item[key];\n newItem[lcFirst(key)] = value;\n });\n return newItem as T;\n } else {\n const newItem: Record<string, any> = {};\n Object.keys(item).forEach(key => {\n const value = item[key];\n newItem[snake(lcFirst(key))] = value;\n });\n return newItem as T;\n }\n } else {\n return null;\n }\n }\n\n async getMany<T>(\n tableKey: string,\n primaryKeys: (\n | string\n | number\n | Buffer\n | [string | number | Buffer, string | number | Buffer]\n )[],\n opts: Omit<\n DynamoDBFindOptions,\n 'cursor' | 'limit' | 'ascending' | 'indexToScan'\n > = {},\n camelOrSnake: 'camel' | 'snake' = 'camel',\n ): Promise<(T | null)[]> {\n const table = this.options.tables.get(tableKey);\n if (!table) {\n throw new Error(`Table ${tableKey} not configured`);\n }\n\n const pkIndexMap: Map<string, number> = new Map();\n const keys = primaryKeys.map((primaryKey, indx) => {\n const isArrayOfKeys = Array.isArray(primaryKey);\n const pkStr = serializeKey(primaryKey);\n\n if (pkIndexMap.has(pkStr)) {\n throw new Error(`Duplicate primary key: ${pkStr}`);\n }\n pkIndexMap.set(pkStr, indx);\n return isArrayOfKeys\n ? {\n [table.partitionKey]: primaryKey[0],\n [table.sortKey!]: primaryKey[1],\n }\n : {\n [table.partitionKey]: primaryKey,\n };\n });\n\n let optIncludeTimeToLive: boolean = false;\n let optIncludePartitionKey: boolean = true;\n let optIncludeSortKey: boolean = true;\n let ProjectionExpression: string = '';\n let ExpressionAttributeNames: Record<string, string> | null = null;\n if (opts.projectionFields) {\n const projectionFields = [...new Set(opts.projectionFields.map(field => field.includes('.') || field.includes('[') ? field : ucFirst(camel(field))))];\n optIncludeTimeToLive =\n table.timeToLiveAttribute !== undefined &&\n projectionFields.includes(table.timeToLiveAttribute);\n if (table.timeToLiveAttribute && !optIncludeTimeToLive) {\n projectionFields.push(table.timeToLiveAttribute);\n }\n // To help parse the response by item, include the primary key values for the items in your request in the ProjectionExpression parameter.\n optIncludePartitionKey = projectionFields.includes(\n table.partitionKey,\n );\n if (!optIncludePartitionKey) {\n projectionFields.push(table.partitionKey);\n }\n optIncludeSortKey =\n table.sortKey !== undefined &&\n projectionFields.includes(table.sortKey);\n if (table.sortKey && !optIncludeSortKey) {\n projectionFields.push(table.sortKey);\n }\n\n const expressionAttributeNameMap = new Map();\n ProjectionExpression = projectionFields\n .map(field =>\n transformExpressionAttribute(field, expressionAttributeNameMap),\n )\n .join(', ');\n expressionAttributeNameMap.forEach(\n (attributeName, attributeNameVariable) => {\n if (!ExpressionAttributeNames) {\n ExpressionAttributeNames = {};\n }\n ExpressionAttributeNames[attributeNameVariable] = attributeName;\n },\n );\n }\n\n const results = new Array(primaryKeys.length).fill(null);\n const now = getUnixTime(new Date());\n let unprocessedAttempt = 0;\n while (keys.length > 0) {\n const batch = keys.splice(0, 100);\n this.logger.debug('DynamoDB batch request started', { operation: 'getMany', tableKey, itemCount: batch.length });\n const batchGetCommand = new BatchGetCommand({\n RequestItems: {\n [table.name]: {\n Keys: batch,\n ConsistentRead: opts.consistentRead ?? false,\n ...(ProjectionExpression !== '' ? { ProjectionExpression } : {}),\n ...(ExpressionAttributeNames !== null\n ? { ExpressionAttributeNames }\n : {}),\n },\n },\n ReturnConsumedCapacity:\n opts.returnConsumedCapacity ?? ReturnConsumedCapacity.NONE,\n });\n\n const { Responses: responses, UnprocessedKeys: rawUnprocessedKeys } =\n await this.ddbDocClient.send(batchGetCommand).catch((error: Error) => {\n this.logger.error('Failed to get items', { tableKey, errorName: error.name });\n throw error;\n });\n const items =\n responses && responses[table.name] ? responses[table.name] : [];\n const unprocessedKeys =\n (rawUnprocessedKeys && rawUnprocessedKeys[table.name]?.Keys) || [];\n\n if (unprocessedKeys.length > 0) {\n if (unprocessedAttempt >= MAX_UNPROCESSED_ATTEMPTS) {\n this.logger.error('DynamoDB batch retry limit reached', { operation: 'getMany', tableKey, retryCount: unprocessedAttempt });\n throw new DynamoDBError(500, {\n message: 'Failed to retrieve items after multiple attempts',\n cause: new Error('Too many unprocessed items'),\n });\n }\n const delayMs = backoffDelayMs(unprocessedAttempt);\n this.logger.warn('DynamoDB retrying unprocessed batch items', { operation: 'getMany', tableKey, itemCount: unprocessedKeys.length, attempt: unprocessedAttempt + 1, delayMs });\n await sleep(delayMs);\n unprocessedAttempt += 1;\n } else {\n unprocessedAttempt = 0;\n }\n keys.push(...unprocessedKeys);\n\n // Filter expired items\n items?.forEach(item => {\n if (\n item &&\n table.timeToLiveAttribute &&\n item[table.timeToLiveAttribute] !== undefined\n ) {\n if (item[table.timeToLiveAttribute] <= now) {\n return;\n }\n // Delete the time to live attribute from the item if not requested\n if (optIncludeTimeToLive === false) {\n delete item[table.timeToLiveAttribute];\n }\n }\n\n const pkStr = serializeKey(table.sortKey\n ? [item[table.partitionKey], item[table.sortKey]]\n : item[table.partitionKey]);\n\n // Delete the primary key values from the item if not requested\n if (optIncludePartitionKey === false) {\n delete item[table.partitionKey];\n }\n if (optIncludeSortKey === false && table.sortKey) {\n delete item[table.sortKey];\n }\n\n // Convert keys back to camelCase if camelOrSnake is 'camel' or to snake_case if camelOrSnake is 'snake'\n if (camelOrSnake === 'camel') {\n const newItem: Record<string, any> = {};\n Object.keys(item).forEach(key => {\n const value = item[key];\n newItem[lcFirst(key)] = value;\n });\n results[pkIndexMap.get(pkStr)!] = newItem as T;\n } else {\n const newItem: Record<string, any> = {};\n Object.keys(item).forEach(key => {\n const value = item[key];\n newItem[snake(lcFirst(key))] = value;\n });\n results[pkIndexMap.get(pkStr)!] = newItem as T;\n }\n });\n }\n\n this.logger.debug('DynamoDB getMany completed', { tableKey, requestedCount: primaryKeys.length, returnedCount: results.filter(item => item !== null).length });\n return results;\n }\n\n async find<T>(\n tableKey: string,\n keyCondition:\n | DynamoDBExpression\n | [string | number | Buffer]\n | [\n string | number | Buffer,\n (\n | string\n | number\n | Buffer\n | ['BETWEEN', [string | number | Buffer, string | number | Buffer]]\n ),\n ]\n | [\n string | number | Buffer,\n string | number | Buffer | ['begins_with', string],\n ],\n filter: DynamoDBExpression | null = null,\n opts: DynamoDBFindOptions = {},\n camelOrSnake: 'camel' | 'snake' = 'camel',\n ) {\n const table = this.options.tables.get(tableKey);\n if (!table) {\n throw new Error(`Table ${tableKey} not configured`);\n }\n\n if (opts.limit !== undefined && (!Number.isInteger(opts.limit) || opts.limit <= 0)) throw new Error('Limit must be a positive integer');\n let indexInUse: 'GSI' | 'LSI' | null = null;\n let indexToScan: DynamoDBLSIConfig | DynamoDBGSIConfig | null = null;\n // Check the index existence and determine the index type if index name is provided\n if (opts.indexToScan !== undefined) {\n indexToScan =\n table.globalSecondaryIndexes?.find(\n gsi => gsi.indexName === opts.indexToScan,\n ) ||\n table.localSecondaryIndexes?.find(\n lsi => lsi.indexName === opts.indexToScan,\n ) ||\n null;\n if (!indexToScan) {\n throw new Error(\n `Index ${opts.indexToScan} not found in table ${tableKey}`,\n );\n }\n\n // Only GSI has partitionKey attribute\n if (indexToScan.hasOwnProperty('partitionKey')) {\n indexInUse = 'GSI';\n } else {\n indexInUse = 'LSI';\n }\n }\n let keyConditionExp: DynamoDBExpression | null = null;\n if (Array.isArray(keyCondition)) {\n if (!keyCondition.length || keyCondition.length > 2) {\n throw new Error('Invalid key condition array length');\n }\n\n switch (indexInUse) {\n case 'LSI':\n if (keyCondition.length !== 2) {\n throw new Error(\n 'For LSI, key condition must include both partition key and sort key conditions',\n );\n }\n break;\n case 'GSI':\n if (\n keyCondition.length === 2 &&\n (indexToScan as DynamoDBGSIConfig).sortKey === undefined\n ) {\n throw new Error(\n 'For GSI without sort key, key condition must only include partition key condition',\n );\n }\n break;\n case null:\n if (keyCondition.length === 2 && table.sortKey === undefined) {\n throw new Error(\n 'For table without sort key, key condition must only include partition key condition',\n );\n }\n break;\n }\n\n // If using LSI or no index, the partition key condition expression should be on the table partition key. If using GSI, the partition key condition expression should be on the GSI partition key\n const partitionKeyKeyConditionExpression: DynamoDBExpression = Equal(\n indexInUse === 'LSI' || indexInUse === null\n ? table.partitionKey\n : (indexToScan as DynamoDBGSIConfig).partitionKey,\n keyCondition[0],\n );\n\n if (keyCondition.length === 2) {\n let sortKeyKeyConditionExpression: DynamoDBExpression;\n if (Array.isArray(keyCondition[1])) {\n switch (keyCondition[1][0]) {\n case 'BETWEEN':\n sortKeyKeyConditionExpression = Between(\n indexInUse === null\n ? table.sortKey!\n : indexInUse === 'LSI'\n ? (indexToScan as DynamoDBLSIConfig).sortKey\n : (indexToScan as DynamoDBGSIConfig).sortKey!,\n keyCondition[1][1][0],\n keyCondition[1][1][1],\n );\n break;\n case 'begins_with':\n sortKeyKeyConditionExpression = BeginsWith(\n indexInUse === null\n ? table.sortKey!\n : indexInUse === 'LSI'\n ? (indexToScan as DynamoDBLSIConfig).sortKey\n : (indexToScan as DynamoDBGSIConfig).sortKey!,\n keyCondition[1][1],\n );\n break;\n default:\n throw new Error('Invalid sort key condition');\n }\n } else {\n sortKeyKeyConditionExpression = Equal(\n indexInUse === null\n ? table.sortKey!\n : indexInUse === 'LSI'\n ? (indexToScan as DynamoDBLSIConfig).sortKey\n : (indexToScan as DynamoDBGSIConfig).sortKey!,\n keyCondition[1],\n );\n }\n\n keyConditionExp = And(\n partitionKeyKeyConditionExpression,\n sortKeyKeyConditionExpression,\n );\n } else {\n keyConditionExp = partitionKeyKeyConditionExpression;\n }\n } else if (keyCondition instanceof DynamoDBExpression) {\n keyConditionExp = keyCondition;\n } else {\n throw new Error('Invalid key condition');\n }\n\n const expressionAttributeNameMap = new Map(keyConditionExp.expressionAttributeNameMap);\n const expressionAttributeValueMap = new Map(keyConditionExp.expressionAttributeValueMap);\n const KeyConditionExpression = keyConditionExp.expression;\n\n let FilterExpression: string = '';\n if (filter) {\n filter.expressionAttributeNameMap.forEach((value, key) => {\n key = key.replace('#attr', `#filter_attr`);\n expressionAttributeNameMap.set(key, value);\n });\n if (filter.expressionAttributeValueMap) {\n filter.expressionAttributeValueMap.forEach((value, key) => {\n key = key.replace(':val', `:filter_val`);\n expressionAttributeValueMap!.set(key, value); // partitionKeyKeyConditionExpression decides the attribute value map is not null\n });\n }\n\n FilterExpression = filter.expression\n .replace(/#attr/g, `#filter_attr`)\n .replace(/:val/g, `:filter_val`);\n }\n\n let optIncludeTimeToLive: boolean = false;\n let optIncludePartitionKey: boolean = true;\n let optIncludeSortKey: boolean = true;\n let ProjectionExpression: string = '';\n let ExpressionAttributeNames: Record<string, string> | null = null;\n let ExpressionAttributeValues: Record<string, any> | null = null;\n const now = getUnixTime(new Date());\n\n if (opts.projectionFields) {\n const projectionFields = [...new Set(opts.projectionFields.map(field => field.includes('.') || field.includes('[') ? field : ucFirst(camel(field))))];\n optIncludeTimeToLive =\n table.timeToLiveAttribute !== undefined &&\n projectionFields.includes(table.timeToLiveAttribute);\n if (table.timeToLiveAttribute !== undefined && !optIncludeTimeToLive) {\n projectionFields.push(table.timeToLiveAttribute);\n }\n\n if (indexInUse !== null) {\n for (const key of [table.partitionKey, table.sortKey]) {\n if (key && !projectionFields.includes(key)) projectionFields.push(key);\n }\n }\n // Validate the projection fields with the index in use if any\n // If the table has time to live attribute, personally insist to include that attribute in GSI or LSI projection.\n switch (indexInUse) {\n case 'LSI':\n let hasFieldNotInsideLSIProjection: boolean = false;\n if (\n (indexToScan as DynamoDBLSIConfig).projectionType === 'KEYS_ONLY'\n ) {\n hasFieldNotInsideLSIProjection =\n diff(projectionFields, [\n table.partitionKey,\n (indexToScan as DynamoDBLSIConfig).sortKey,\n ]).length > 0;\n } else if (\n (indexToScan as DynamoDBLSIConfig).projectionType === 'INCLUDE'\n ) {\n hasFieldNotInsideLSIProjection =\n diff(projectionFields, [\n table.partitionKey,\n (indexToScan as DynamoDBLSIConfig).sortKey,\n ...(indexToScan as DynamoDBLSIConfig).nonKeyAttributes!,\n ]).length > 0;\n }\n if (hasFieldNotInsideLSIProjection) {\n this.logger.warn(\n 'Some of the projection fields are not included in the LSI projection, which may cause additional read cost',\n {\n tableKey,\n indexName: (indexToScan as DynamoDBLSIConfig).indexName,\n projectionType: (indexToScan as DynamoDBLSIConfig)\n .projectionType,\n },\n );\n }\n break;\n case 'GSI':\n let hasFieldNotInsideGSIProjection: boolean = false;\n if (\n (indexToScan as DynamoDBGSIConfig).projectionType === 'KEYS_ONLY'\n ) {\n hasFieldNotInsideGSIProjection =\n diff(projectionFields, [\n table.partitionKey,\n ...(table.sortKey ? [table.sortKey] : []),\n (indexToScan as DynamoDBGSIConfig).partitionKey,\n ...((indexToScan as DynamoDBGSIConfig).sortKey !== undefined\n ? [(indexToScan as DynamoDBGSIConfig).sortKey]\n : []),\n ]).length > 0;\n } else if (\n (indexToScan as DynamoDBGSIConfig).projectionType === 'INCLUDE'\n ) {\n hasFieldNotInsideGSIProjection =\n diff(projectionFields, [\n table.partitionKey,\n ...(table.sortKey ? [table.sortKey] : []),\n (indexToScan as DynamoDBGSIConfig).partitionKey,\n ...((indexToScan as DynamoDBGSIConfig).sortKey !== undefined\n ? [(indexToScan as DynamoDBGSIConfig).sortKey]\n : []),\n ...(indexToScan as DynamoDBGSIConfig).nonKeyAttributes!,\n ]).length > 0;\n }\n if (hasFieldNotInsideGSIProjection) {\n this.logger.error(\n 'Some of the projection fields are not included in the GSI projection, so the query cannot be executed',\n {\n tableKey,\n indexName: (indexToScan as DynamoDBGSIConfig).indexName,\n projectionType: (indexToScan as DynamoDBGSIConfig)\n .projectionType,\n },\n );\n throw new Error(\n 'All projection fields must be included in the GSI projection',\n );\n }\n break;\n }\n // To help parse the response by item, include the primary key values for the items in your request in the ProjectionExpression parameter.\n optIncludePartitionKey = projectionFields.includes(\n indexInUse === null\n ? table.partitionKey\n : indexInUse === 'LSI'\n ? table.partitionKey\n : (indexToScan as DynamoDBGSIConfig).partitionKey,\n );\n if (!optIncludePartitionKey) {\n projectionFields.push(\n indexInUse === null\n ? table.partitionKey\n : indexInUse === 'LSI'\n ? table.partitionKey\n : (indexToScan as DynamoDBGSIConfig).partitionKey,\n );\n }\n optIncludeSortKey =\n (indexInUse === null &&\n table.sortKey !== undefined &&\n projectionFields.includes(table.sortKey)) ||\n (indexInUse === 'LSI' &&\n projectionFields.includes(\n (indexToScan as DynamoDBLSIConfig).sortKey,\n )) ||\n (indexInUse === 'GSI' &&\n (indexToScan as DynamoDBGSIConfig).sortKey !== undefined &&\n projectionFields.includes(\n (indexToScan as DynamoDBGSIConfig).sortKey!,\n ));\n if (\n indexInUse === null &&\n table.sortKey !== undefined &&\n !optIncludeSortKey\n ) {\n projectionFields.push(table.sortKey);\n } else if (indexInUse === 'LSI' && !optIncludeSortKey) {\n projectionFields.push((indexToScan as DynamoDBLSIConfig).sortKey);\n } else if (\n indexInUse === 'GSI' &&\n (indexToScan as DynamoDBGSIConfig).sortKey !== undefined &&\n !optIncludeSortKey\n ) {\n projectionFields.push((indexToScan as DynamoDBGSIConfig).sortKey!);\n }\n\n ProjectionExpression = projectionFields\n .map(field =>\n transformExpressionAttribute(\n field,\n expressionAttributeNameMap,\n '#proj_attr',\n ),\n )\n .join(', ');\n }\n\n expressionAttributeNameMap.forEach(\n (attributeName, attributeNameVariable) => {\n if (!ExpressionAttributeNames) {\n ExpressionAttributeNames = {};\n }\n ExpressionAttributeNames[attributeNameVariable] = attributeName;\n },\n );\n expressionAttributeValueMap!.forEach((value, attributeValueVariable) => {\n if (!ExpressionAttributeValues) {\n ExpressionAttributeValues = {};\n }\n ExpressionAttributeValues[attributeValueVariable] = value;\n });\n\n const numOfNeededItems = opts.limit; // May be undefined then no limit\n const result: DynamoDBFindResult<T> = {\n items: [],\n };\n\n if (opts.cursor !== undefined && !(typeof opts.cursor === 'object' && !Array.isArray(opts.cursor) && !Buffer.isBuffer(opts.cursor))) {\n // Validate cursor has correct number of elements based on context\n const needsTwoElements =\n (indexInUse === null && table.sortKey !== undefined) ||\n indexInUse === 'LSI' ||\n (indexInUse === 'GSI' &&\n (indexToScan as DynamoDBGSIConfig).sortKey !== undefined);\n if (Array.isArray(opts.cursor)) {\n if (opts.cursor.length !== 2 || !needsTwoElements) {\n throw new Error('Cursor array cannot have more than 2 elements');\n }\n } else {\n if (needsTwoElements) {\n throw new Error(\n 'Cursor array must have exactly 2 elements for composite key tables/indexes',\n );\n }\n }\n }\n\n const params: QueryCommandInput = {\n TableName: table.name,\n KeyConditionExpression,\n ...(indexToScan !== null ? { IndexName: indexToScan.indexName } : {}),\n ...(FilterExpression !== '' ? { FilterExpression } : {}),\n ...(ExpressionAttributeNames ? { ExpressionAttributeNames } : {}),\n ...(ExpressionAttributeValues ? { ExpressionAttributeValues } : {}),\n ConsistentRead:\n (opts.consistentRead ?? false) &&\n (indexInUse === null || indexInUse === 'LSI'),\n ReturnConsumedCapacity:\n opts.returnConsumedCapacity ?? ReturnConsumedCapacity.NONE,\n ...(ProjectionExpression ? { ProjectionExpression } : {}),\n ScanIndexForward: opts.ascending ?? true,\n ...(opts.cursor !== undefined\n ? {\n ExclusiveStartKey: typeof opts.cursor === 'object' && !Array.isArray(opts.cursor) && !Buffer.isBuffer(opts.cursor)\n ? opts.cursor\n : Array.isArray(opts.cursor)\n ? {\n [indexInUse === null\n ? table.partitionKey\n : indexInUse === 'LSI'\n ? table.partitionKey\n : (indexToScan as DynamoDBGSIConfig).partitionKey]:\n opts.cursor[0],\n [indexInUse === null\n ? table.sortKey!\n : indexInUse === 'LSI'\n ? (indexToScan as DynamoDBLSIConfig).sortKey\n : (indexToScan as DynamoDBGSIConfig).sortKey!]:\n opts.cursor[1],\n }\n : {\n [indexInUse === null\n ? table.partitionKey\n : indexInUse === 'LSI'\n ? table.partitionKey\n : (indexToScan as DynamoDBGSIConfig).partitionKey]:\n opts.cursor,\n },\n }\n : {}),\n };\n\n while (true) {\n this.logger.debug('DynamoDB query page requested', { tableKey, hasCursor: !!params.ExclusiveStartKey, hasFilter: !!params.FilterExpression });\n const { Items, LastEvaluatedKey } = await this.ddbDocClient\n .send(new QueryCommand(params))\n .catch((e: Error) => {\n if (e.name === 'ValidationException') {\n this.logger.error('The request parameters are invalid', { errorName: e.name, tableKey });\n throw new DynamoDBError(400, {\n message: 'Invalid request parameters',\n cause: e,\n });\n }\n this.logger.error('Failed to query items', { errorName: e.name, tableKey });\n throw new DynamoDBError(500, {\n message: 'Failed to query items',\n cause: e,\n });\n });\n\n this.logger.debug('DynamoDB query page received', { tableKey, itemCount: Items?.length ?? 0, hasMore: !!LastEvaluatedKey });\n if (LastEvaluatedKey) {\n params.ExclusiveStartKey = LastEvaluatedKey;\n }\n\n // Filter expired items\n let hasRemainsInCurrentBatch = false;\n Items?.forEach(item => {\n if (\n item &&\n table.timeToLiveAttribute &&\n item[table.timeToLiveAttribute] !== undefined\n ) {\n if (item[table.timeToLiveAttribute] <= now) {\n return;\n }\n // Delete the time to live attribute from the item if not requested\n if (optIncludeTimeToLive === false) {\n delete item[table.timeToLiveAttribute];\n }\n }\n\n // After filtering, check if any remaining item in the current batch when reaching the limit\n if (numOfNeededItems && result.items.length === numOfNeededItems) {\n hasRemainsInCurrentBatch = true;\n return;\n }\n\n if (numOfNeededItems && result.items.length + 1 === numOfNeededItems) {\n // The last item to reach the limit\n // Set the cursor to the last item for next query\n if (indexInUse === null) {\n result.cursor =\n table.sortKey !== undefined\n ? [item[table.partitionKey], item[table.sortKey]]\n : item[table.partitionKey];\n } else {\n result.cursor = Object.fromEntries(\n [table.partitionKey, table.sortKey, (indexToScan as DynamoDBGSIConfig).partitionKey, indexToScan!.sortKey]\n .filter((key): key is string => key !== undefined)\n .map(key => [key, item[key]]),\n );\n }\n }\n\n if (optIncludePartitionKey === false) {\n // Delete the primary key values from the item if not requested\n switch (indexInUse) {\n case null:\n delete item[table.partitionKey];\n break;\n case 'LSI':\n delete item[table.partitionKey];\n break;\n case 'GSI':\n delete item[(indexToScan as DynamoDBGSIConfig).partitionKey];\n break;\n }\n }\n if (optIncludeSortKey === false) {\n // Delete the sort key value from the item if not requested\n switch (indexInUse) {\n case null:\n if (table.sortKey !== undefined) {\n delete item[table.sortKey];\n }\n break;\n case 'LSI':\n delete item[(indexToScan as DynamoDBLSIConfig).sortKey];\n break;\n case 'GSI':\n if ((indexToScan as DynamoDBGSIConfig).sortKey !== undefined) {\n delete item[(indexToScan as DynamoDBGSIConfig).sortKey!];\n }\n break;\n }\n }\n\n if (indexInUse !== null && opts.projectionFields) {\n for (const key of [table.partitionKey, table.sortKey]) {\n if (key && !opts.projectionFields.some(field => ucFirst(camel(field)) === key)) delete item[key];\n }\n }\n // Convert keys back to camelCase if camelOrSnake is 'camel' or to snake_case if camelOrSnake is 'snake'\n if (camelOrSnake === 'camel') {\n const newItem: Record<string, any> = {};\n Object.keys(item).forEach(key => {\n const value = item[key];\n newItem[lcFirst(key)] = value;\n });\n result.items.push(newItem as T);\n } else {\n const newItem: Record<string, any> = {};\n Object.keys(item).forEach(key => {\n const value = item[key];\n newItem[snake(lcFirst(key))] = value;\n });\n result.items.push(newItem as T);\n }\n });\n\n if (numOfNeededItems && result.items.length === numOfNeededItems) {\n if (!hasRemainsInCurrentBatch && !LastEvaluatedKey) {\n delete result.cursor; // No more items for next query and also no remains in the last batch\n }\n break;\n } else if (!LastEvaluatedKey) {\n if (!hasRemainsInCurrentBatch) {\n delete result.cursor; // No more items for next query and also no remains in the last batch\n }\n break;\n }\n }\n\n return result;\n }\n\n async createOne(\n tableKey: string,\n primaryKey:\n | string\n | number\n | Buffer\n | [string | number | Buffer, string | number | Buffer],\n item: Record<string, any>,\n opts: DynamoDBCreateOptions = {},\n camelOrSnake: 'camel' | 'snake' = 'camel',\n ): Promise<DynamoDBCreateOneResult> {\n const table = this.options.tables.get(tableKey);\n if (!table) {\n throw new Error(`Table ${tableKey} not configured`);\n }\n const normalizedItem: Record<string, any> = {};\n Object.keys(item).forEach(key => {\n normalizedItem[ucFirst(camel(key))] = item[key];\n });\n\n if (table.sortKey) {\n if (!Array.isArray(primaryKey) || primaryKey.length !== 2) throw new Error('Composite primary key requires two values');\n normalizedItem[table.partitionKey] = primaryKey[0];\n normalizedItem[table.sortKey] = primaryKey[1];\n } else {\n normalizedItem[table.partitionKey] = primaryKey;\n }\n\n const now = getUnixTime(new Date());\n if (table.timeToLiveAttribute && opts.ttl && opts.ttl > 0) {\n normalizedItem[table.timeToLiveAttribute] = now + opts.ttl;\n }\n\n let ConditionExpression: string = '';\n let ExpressionAttributeNames: Record<string, string> | null = null;\n if (opts.onConflict === 'ignore') {\n const expression = table.sortKey\n ? And(\n AttributeNotExists(table.partitionKey),\n AttributeNotExists(table.sortKey),\n )\n : AttributeNotExists(table.partitionKey);\n ConditionExpression = expression.expression;\n expression.expressionAttributeNameMap.forEach((value, key) => {\n if (!ExpressionAttributeNames) {\n ExpressionAttributeNames = {};\n }\n ExpressionAttributeNames[key] = value;\n });\n }\n\n this.logger.debug('DynamoDB request started', { operation: 'createOne', tableKey });\n const putCommand = new PutCommand({\n TableName: table.name,\n Item: normalizedItem,\n ...(ConditionExpression !== '' ? { ConditionExpression } : {}),\n ...(ExpressionAttributeNames !== null\n ? { ExpressionAttributeNames }\n : {}),\n ReturnConsumedCapacity:\n opts.returnConsumedCapacity ?? ReturnConsumedCapacity.NONE,\n ReturnValues: opts.onConflict === 'ignore' ? 'NONE' : 'ALL_OLD',\n });\n\n const result: DynamoDBCreateOneResult = {\n created: true,\n };\n\n try {\n const { Attributes: replacedItem } =\n await this.ddbDocClient.send(putCommand);\n\n if (\n table.timeToLiveAttribute &&\n normalizedItem[table.timeToLiveAttribute]\n ) {\n result.expiresAt = normalizedItem[table.timeToLiveAttribute];\n }\n\n if (opts.onConflict !== 'ignore' && replacedItem !== undefined) {\n // Only not expired item will be considered as replaced item\n if (\n !(\n table.timeToLiveAttribute &&\n replacedItem[table.timeToLiveAttribute] &&\n replacedItem[table.timeToLiveAttribute] <= now\n )\n ) {\n result.created = false;\n if (table.timeToLiveAttribute) {\n delete replacedItem[table.timeToLiveAttribute]; // Delete the time to live attribute from the item\n }\n // Convert keys back to camelCase if camelOrSnake is 'camel' or to snake_case if camelOrSnake is 'snake'\n if (camelOrSnake === 'camel') {\n const newItem: Record<string, any> = {};\n Object.keys(replacedItem).forEach(key => {\n const value = replacedItem[key];\n newItem[lcFirst(key)] = value;\n });\n result.replacedItem = newItem as Record<string, any>;\n } else {\n const newItem: Record<string, any> = {};\n Object.keys(replacedItem).forEach(key => {\n const value = replacedItem[key];\n newItem[snake(lcFirst(key))] = value;\n });\n result.replacedItem = newItem as Record<string, any>;\n }\n }\n }\n } catch (e: any) {\n const error = e as Error;\n if (\n error.name === 'ConditionalCheckFailedException' &&\n opts.onConflict === 'ignore'\n ) {\n this.logger.debug('DynamoDB create skipped: item already exists', { tableKey });\n result.created = false;\n } else {\n this.logger.error('Failed to create item', { errorName: error.name, tableKey });\n throw new DynamoDBError(500, {\n message: 'Failed to create item',\n cause: error,\n });\n }\n }\n\n this.logger.debug('DynamoDB createOne completed', { tableKey, created: result.created });\n return result;\n }\n\n async createMany(\n tableKey: string,\n primaryKeys: (\n | string\n | number\n | Buffer\n | [string | number | Buffer, string | number | Buffer]\n )[],\n items: Record<string, any>[],\n opts: Omit<DynamoDBCreateOptions, 'onConflict'> = {},\n ): Promise<DynamoDBCreateManyResult> {\n const table = this.options.tables.get(tableKey);\n if (!table) {\n throw new Error(`Table ${tableKey} not configured`);\n }\n\n if (items.length === 0 || primaryKeys.length === 0) {\n throw new Error('No items to create');\n }\n\n if (primaryKeys.length !== items.length) {\n throw new Error('Primary keys and items length mismatch');\n }\n\n const now = getUnixTime(new Date());\n const normalizedItems = items.map((item, indx) => {\n const normalizedItem: Record<string, any> = {};\n Object.keys(item).forEach(key => {\n normalizedItem[ucFirst(camel(key))] = item[key];\n });\n\n const primaryKey = primaryKeys[indx];\n if (table.sortKey) {\n if (!Array.isArray(primaryKey) || primaryKey.length !== 2) throw new Error('Composite primary key requires two values');\n normalizedItem[table.partitionKey] = primaryKey![0];\n normalizedItem[table.sortKey] = primaryKey![1];\n } else {\n normalizedItem[table.partitionKey] = primaryKey;\n }\n\n if (table.timeToLiveAttribute && opts.ttl && opts.ttl > 0) {\n normalizedItem[table.timeToLiveAttribute] = now + opts.ttl;\n }\n\n return normalizedItem;\n });\n\n const result: DynamoDBCreateManyResult = {\n numberOfItems: normalizedItems.length,\n };\n\n if (\n table.timeToLiveAttribute &&\n normalizedItems[0][table.timeToLiveAttribute]\n ) {\n result.expiresAt = normalizedItems[0][table.timeToLiveAttribute];\n }\n\n let unprocessedAttempt = 0;\n while (normalizedItems.length > 0) {\n const batch = normalizedItems.splice(0, 25);\n\n this.logger.debug('DynamoDB batch request started', { operation: 'createMany', tableKey, itemCount: batch.length });\n const batchWriteCommand = new BatchWriteCommand({\n RequestItems: {\n [table.name]: batch.map(item => ({\n PutRequest: {\n Item: item,\n },\n })),\n },\n ReturnConsumedCapacity:\n opts.returnConsumedCapacity ?? ReturnConsumedCapacity.NONE,\n });\n\n const { UnprocessedItems } = await this.ddbDocClient\n .send(batchWriteCommand)\n .catch((e: Error) => {\n this.logger.error('Failed to create items', { errorName: e.name, tableKey });\n throw new DynamoDBError(500, {\n message: 'Failed to create items',\n cause: e,\n });\n });\n\n const unprocessedItems = UnprocessedItems?.[table.name];\n if (unprocessedItems !== undefined && unprocessedItems.length > 0) {\n if (unprocessedAttempt >= MAX_UNPROCESSED_ATTEMPTS) {\n this.logger.error('DynamoDB batch retry limit reached', { operation: 'createMany', tableKey, retryCount: unprocessedAttempt });\n throw new DynamoDBError(500, {\n message: 'Failed to create items after multiple attempts',\n cause: new Error('Too many unprocessed items'),\n });\n }\n const delayMs = backoffDelayMs(unprocessedAttempt);\n this.logger.warn('DynamoDB retrying unprocessed batch items', { operation: 'createMany', tableKey, itemCount: unprocessedItems.length, attempt: unprocessedAttempt + 1, delayMs });\n await sleep(delayMs);\n unprocessedAttempt += 1;\n normalizedItems.push(\n ...(unprocessedItems\n .map(item => item.PutRequest?.Item)\n .filter(item => item !== undefined) as Record<string, any>[]),\n );\n } else {\n unprocessedAttempt = 0;\n }\n }\n\n this.logger.debug('DynamoDB createMany completed', { tableKey, itemCount: result.numberOfItems });\n return result;\n }\n\n async update<T>(\n tableKey: string,\n primaryKey:\n | string\n | number\n | Buffer\n | [string | number | Buffer, string | number | Buffer],\n commands: DynamoDBExpression[],\n condition: DynamoDBExpression | null = null,\n opts: DynamoDBUpdateOptions = {},\n camelOrSnake: 'camel' | 'snake' = 'camel',\n ): Promise<DynamoDBUpdateResult<T>> {\n const table = this.options.tables.get(tableKey);\n if (!table) {\n throw new Error(`Table ${tableKey} not configured`);\n }\n if (commands.length === 0) {\n throw new Error('No update commands provided');\n }\n\n const keys = Array.isArray(primaryKey)\n ? {\n [table.partitionKey]: primaryKey[0],\n [table.sortKey!]: primaryKey[1],\n }\n : {\n [table.partitionKey]: primaryKey,\n };\n\n commands = [...commands];\n const now = getUnixTime(new Date());\n let expiresAt: number = 0;\n if (table.timeToLiveAttribute && opts.ttl !== undefined) {\n if (opts.ttl > 0) {\n expiresAt = now + opts.ttl;\n commands.push(Assign(table.timeToLiveAttribute, expiresAt));\n } else if (opts.ttl === 0) {\n commands.push(Remove(table.timeToLiveAttribute));\n }\n }\n\n const {\n expressionAttributeNameMap,\n expressionAttributeValueMap,\n expression: UpdateExpression,\n } = createUpdateExpression(commands);\n\n let ConditionExpression: string = '';\n if (table.timeToLiveAttribute && opts.upsert === false) {\n condition = condition\n ? And(\n condition,\n Or(\n AttributeNotExists(table.timeToLiveAttribute),\n MoreThan(table.timeToLiveAttribute, now),\n ),\n )\n : Or(\n AttributeNotExists(table.timeToLiveAttribute),\n MoreThan(table.timeToLiveAttribute, now),\n );\n }\n\n if (opts.upsert === false) {\n condition = table.sortKey\n ? condition\n ? And(\n condition,\n And(\n AttributeExists(table.partitionKey),\n AttributeExists(table.sortKey),\n ),\n )\n : And(\n AttributeExists(table.partitionKey),\n AttributeExists(table.sortKey),\n )\n : condition\n ? And(condition, AttributeExists(table.partitionKey))\n : AttributeExists(table.partitionKey);\n }\n\n if (condition) {\n condition.expressionAttributeNameMap.forEach((value, key) => {\n key = key.replace('#attr', `#condition_attr`);\n expressionAttributeNameMap.set(key, value);\n });\n if (condition.expressionAttributeValueMap) {\n condition.expressionAttributeValueMap.forEach((value, key) => {\n key = key.replace(':val', `:condition_val`);\n expressionAttributeValueMap!.set(key, value); // createUpdateExpression decides the attribute value map is not null\n });\n }\n\n ConditionExpression = condition.expression\n .replace(/#attr/g, `#condition_attr`)\n .replace(/:val/g, `:condition_val`);\n }\n\n let ExpressionAttributeNames: Record<string, string> | null = null;\n let ExpressionAttributeValues: Record<string, any> | null = null;\n\n expressionAttributeNameMap.forEach(\n (attributeName, attributeNameVariable) => {\n if (!ExpressionAttributeNames) {\n ExpressionAttributeNames = {};\n }\n ExpressionAttributeNames[attributeNameVariable] = attributeName;\n },\n );\n expressionAttributeValueMap!.forEach((value, attributeValueVariable) => {\n if (!ExpressionAttributeValues) {\n ExpressionAttributeValues = {};\n }\n ExpressionAttributeValues[attributeValueVariable] = value;\n });\n\n this.logger.debug('DynamoDB request started', { operation: 'update', tableKey });\n const updateCommand = new UpdateCommand({\n TableName: table.name,\n Key: keys,\n UpdateExpression,\n ...(ConditionExpression !== '' ? { ConditionExpression } : {}),\n ...(ExpressionAttributeNames !== null\n ? { ExpressionAttributeNames }\n : {}),\n ...(ExpressionAttributeValues !== null\n ? { ExpressionAttributeValues }\n : {}),\n ReturnConsumedCapacity:\n opts.returnConsumedCapacity ?? ReturnConsumedCapacity.NONE,\n ReturnValues: opts.returnValue ?? 'NONE',\n });\n\n const result: DynamoDBUpdateResult<T> = {\n updatedOrCreated: false,\n };\n try {\n const { Attributes: updatedItem } =\n await this.ddbDocClient.send(updateCommand);\n\n if (updatedItem !== undefined) {\n result.item = updatedItem as Partial<T>;\n }\n\n if (table.timeToLiveAttribute && expiresAt !== 0) {\n result.expiresAt = expiresAt;\n if (result.item) {\n delete (result.item as Record<string, any>)[table.timeToLiveAttribute]; // Delete the time to live attribute from the item\n }\n }\n\n result.updatedOrCreated = true;\n } catch (e: any) {\n const error = e as Error;\n if (error.name === 'ValidationException') {\n this.logger.error('The request parameters are invalid', { errorName: error.name, tableKey });\n throw new DynamoDBError(400, {\n message: 'Invalid request parameters',\n cause: e,\n });\n } else if (error.name === 'ConditionalCheckFailedException') {\n this.logger.debug('DynamoDB update skipped: condition not met', { tableKey });\n } else {\n this.logger.error('Failed to update item', { errorName: error.name, tableKey });\n throw new DynamoDBError(500, {\n message: 'Failed to update item',\n cause: e,\n });\n }\n }\n\n if (result.item) {\n // Convert keys back to camelCase if camelOrSnake is 'camel' or to snake_case if camelOrSnake is 'snake'\n if (camelOrSnake === 'camel') {\n const newItem: Record<string, any> = {};\n Object.keys(result.item).forEach(key => {\n const value = (result.item as Record<string, any>)[key];\n newItem[lcFirst(key)] = value;\n });\n result.item = newItem as T;\n } else {\n const newItem: Record<string, any> = {};\n Object.keys(result.item).forEach(key => {\n const value = (result.item as Record<string, any>)[key];\n newItem[snake(lcFirst(key))] = value;\n });\n result.item = newItem as T;\n }\n }\n\n this.logger.debug('DynamoDB update completed', { tableKey, updatedOrCreated: result.updatedOrCreated });\n return result;\n }\n\n async deleteOne<T>(\n tableKey: string,\n primaryKey:\n | string\n | number\n | Buffer\n | [string | number | Buffer, string | number | Buffer],\n condition: DynamoDBExpression | null = null,\n opts: DynamoDBDeleteOptions = {},\n camelOrSnake: 'camel' | 'snake' = 'camel',\n ): Promise<DynamoDBDeleteOneResult<T>> {\n const table = this.options.tables.get(tableKey);\n if (!table) {\n throw new Error(`Table ${tableKey} not configured`);\n }\n\n const keys = Array.isArray(primaryKey)\n ? {\n [table.partitionKey]: primaryKey[0],\n [table.sortKey!]: primaryKey[1],\n }\n : {\n [table.partitionKey]: primaryKey,\n };\n\n let ConditionExpression: string = '';\n let ExpressionAttributeNames: Record<string, string> | null = null;\n let ExpressionAttributeValues: Record<string, any> | null = null;\n\n if (condition) {\n condition.expressionAttributeNameMap.forEach(\n (attributeName, attributeNameVariable) => {\n if (!ExpressionAttributeNames) {\n ExpressionAttributeNames = {};\n }\n ExpressionAttributeNames[attributeNameVariable] = attributeName;\n },\n );\n if (condition.expressionAttributeValueMap) {\n condition.expressionAttributeValueMap.forEach(\n (value, attributeValueVariable) => {\n if (!ExpressionAttributeValues) {\n ExpressionAttributeValues = {};\n }\n ExpressionAttributeValues[attributeValueVariable] = value;\n },\n );\n }\n ConditionExpression = condition.expression;\n }\n\n this.logger.debug('DynamoDB request started', { operation: 'deleteOne', tableKey });\n const deleteCommand = new DeleteCommand({\n TableName: table.name,\n Key: keys,\n ...(ConditionExpression !== '' ? { ConditionExpression } : {}),\n ...(ExpressionAttributeNames !== null\n ? { ExpressionAttributeNames }\n : {}),\n ...(ExpressionAttributeValues !== null\n ? { ExpressionAttributeValues }\n : {}),\n ReturnConsumedCapacity:\n opts.returnConsumedCapacity ?? ReturnConsumedCapacity.NONE,\n ReturnValues: opts.returnValue ?? 'NONE',\n });\n\n const result: DynamoDBDeleteOneResult<T> = {\n deleted: false,\n };\n\n try {\n const { Attributes: deletedItem } =\n await this.ddbDocClient.send(deleteCommand);\n result.deleted = true;\n\n if (deletedItem !== undefined) {\n result.deleted = true;\n result.item = deletedItem as T;\n }\n } catch (e: any) {\n const error = e as Error;\n if (error.name === 'ValidationException') {\n this.logger.error('The request parameters are invalid', { errorName: error.name, tableKey });\n throw new DynamoDBError(400, {\n message: 'Invalid request parameters',\n cause: e,\n });\n } else if (error.name === 'ConditionalCheckFailedException') {\n this.logger.debug('DynamoDB delete skipped: condition not met', { tableKey });\n } else {\n this.logger.error('Failed to delete item', { errorName: error.name, tableKey });\n throw new DynamoDBError(500, {\n message: 'Failed to delete item',\n cause: e,\n });\n }\n }\n\n if (result.item) {\n // Convert keys back to camelCase if camelOrSnake is 'camel' or to snake_case if camelOrSnake is 'snake'\n if (camelOrSnake === 'camel') {\n const newItem: Record<string, any> = {};\n Object.keys(result.item).forEach(key => {\n const value = (result.item as Record<string, any>)[key];\n newItem[lcFirst(key)] = value;\n });\n result.item = newItem as T;\n } else {\n const newItem: Record<string, any> = {};\n Object.keys(result.item).forEach(key => {\n const value = (result.item as Record<string, any>)[key];\n newItem[snake(lcFirst(key))] = value;\n });\n result.item = newItem as T;\n }\n }\n\n this.logger.debug('DynamoDB deleteOne completed', { tableKey, deleted: result.deleted });\n return result;\n }\n\n async deleteMany(\n tableKey: string,\n primaryKeys: (\n | string\n | number\n | Buffer\n | [string | number | Buffer, string | number | Buffer]\n )[],\n opts: Omit<DynamoDBDeleteOptions, 'returnValue'> = {},\n ): Promise<DynamoDBDeleteManyResult> {\n const table = this.options.tables.get(tableKey);\n if (!table) {\n throw new Error(`Table ${tableKey} not configured`);\n }\n\n const keys = primaryKeys.map(primaryKey => {\n const isArrayOfKeys = Array.isArray(primaryKey);\n\n return isArrayOfKeys\n ? {\n [table.partitionKey]: primaryKey[0],\n [table.sortKey!]: primaryKey[1],\n }\n : {\n [table.partitionKey]: primaryKey,\n };\n });\n\n const result: DynamoDBDeleteManyResult = {\n numberOfItems: primaryKeys.length,\n };\n\n let unprocessedAttempt = 0;\n while (keys.length > 0) {\n const batch = keys.splice(0, 25);\n\n this.logger.debug('DynamoDB batch request started', { operation: 'deleteMany', tableKey, itemCount: batch.length });\n const batchWriteCommand = new BatchWriteCommand({\n RequestItems: {\n [table.name]: batch.map(key => ({\n DeleteRequest: {\n Key: key,\n },\n })),\n },\n ReturnConsumedCapacity:\n opts.returnConsumedCapacity ?? ReturnConsumedCapacity.NONE,\n });\n\n const { UnprocessedItems } = await this.ddbDocClient\n .send(batchWriteCommand)\n .catch((e: Error) => {\n this.logger.error('Failed to delete items', { errorName: e.name, tableKey });\n throw new DynamoDBError(500, {\n message: 'Failed to delete items',\n cause: e,\n });\n });\n\n const unprocessedItems = UnprocessedItems?.[table.name];\n if (unprocessedItems !== undefined && unprocessedItems.length > 0) {\n if (unprocessedAttempt >= MAX_UNPROCESSED_ATTEMPTS) {\n this.logger.error('DynamoDB batch retry limit reached', { operation: 'deleteMany', tableKey, retryCount: unprocessedAttempt });\n throw new DynamoDBError(500, {\n message: 'Failed to delete items after multiple attempts',\n cause: new Error('Too many unprocessed items'),\n });\n }\n const delayMs = backoffDelayMs(unprocessedAttempt);\n this.logger.warn('DynamoDB retrying unprocessed batch items', { operation: 'deleteMany', tableKey, itemCount: unprocessedItems.length, attempt: unprocessedAttempt + 1, delayMs });\n await sleep(delayMs);\n unprocessedAttempt += 1;\n keys.push(\n ...(unprocessedItems\n .map(item => item.DeleteRequest?.Key)\n .filter(key => key !== undefined) as Record<string, any>[]),\n );\n } else {\n unprocessedAttempt = 0;\n }\n }\n\n this.logger.debug('DynamoDB deleteMany completed', { tableKey, itemCount: result.numberOfItems });\n return result;\n }\n\n transaction(opts: DynamoDBTransactionOptions) {\n const { mode, now, returnConsumedCapacity } = opts;\n return new DynamoDBTransaction(\n mode,\n this.ddbDocClient,\n this.options.tables,\n this.options.txRetryLimit ?? 3,\n this.options.txRetryDelay ?? 50,\n this.logger,\n now ?? getUnixTime(new Date()),\n returnConsumedCapacity ?? ReturnConsumedCapacity.NONE,\n );\n }\n}\n\nexport { DynamoDBService };\n"]}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["import { Agent } from 'https';\n\nimport {\n TransactionCanceledException,\n DynamoDBClient,\n type DynamoDBClientConfig,\n ScalarAttributeType,\n ReturnConsumedCapacity,\n ReturnValue,\n} from '@aws-sdk/client-dynamodb';\nimport {\n DynamoDBDocumentClient,\n NumberValue,\n GetCommand,\n BatchGetCommand,\n QueryCommand,\n QueryCommandInput,\n PutCommand,\n BatchWriteCommand,\n UpdateCommand,\n DeleteCommand,\n TransactGetCommand,\n TransactWriteCommand,\n TransactGetCommandInput,\n TransactWriteCommandInput,\n TransactGetCommandOutput,\n TransactWriteCommandOutput,\n} from '@aws-sdk/lib-dynamodb';\nimport { diff, camel, snake } from 'radash';\n\nexport type DynamoDBGSIConfig = {\n indexName: string;\n partitionKey: string;\n sortKey?: string;\n projectionType: 'ALL' | 'KEYS_ONLY' | 'INCLUDE';\n nonKeyAttributes?: string[];\n};\n\nexport type DynamoDBLSIConfig = {\n indexName: string;\n sortKey: string;\n projectionType: 'ALL' | 'KEYS_ONLY' | 'INCLUDE';\n nonKeyAttributes?: string[];\n};\n\nexport type DynamoDBTableDefinition = {\n name: string;\n partitionKey: string;\n partitionKeyType: ScalarAttributeType;\n sortKey?: string;\n sortKeyType?: ScalarAttributeType;\n nonKeyAttributeDefinitions?: {\n name: string;\n type: ScalarAttributeType;\n }[];\n localSecondaryIndexes?: DynamoDBLSIConfig[];\n globalSecondaryIndexes?: DynamoDBGSIConfig[];\n timeToLiveAttribute?: string;\n};\n\nexport interface DynamoDBLogger {\n debug(message: string, ...meta: any[]): unknown;\n warn(message: string, ...meta: any[]): unknown;\n error(message: string, ...meta: any[]): unknown;\n}\nconst silentLogger: DynamoDBLogger = { debug() {}, warn() {}, error() {} };\nexport class DynamoDBError extends Error {\n constructor(public readonly status: number, options: { message: string; cause?: unknown }) {\n super(options.message, { cause: options.cause });\n this.name = 'DynamoDBError';\n }\n}\nexport const ucFirst = (value: string): string => value.charAt(0).toUpperCase() + value.slice(1);\nexport const lcFirst = (value: string): string => value.charAt(0).toLowerCase() + value.slice(1);\nconst getUnixTime = (date: Date): number => Math.floor(date.getTime() / 1000);\n\nexport type DynamoDBConfig = {\n region?: DynamoDBClientConfig['region'];\n credentials?: DynamoDBClientConfig['credentials'];\n endpoint?: string;\n maxSockets?: number;\n requestTimeout?: number;\n txRetryLimit?: number;\n txRetryDelay?: number;\n tables: Map<string, DynamoDBTableDefinition>;\n};\n\nexport type DynamoDBFindOptions = {\n consistentRead?: boolean;\n projectionFields?: string[];\n returnConsumedCapacity?: ReturnConsumedCapacity;\n indexToScan?: string;\n limit?: number;\n ascending?: boolean;\n cursor?:\n | Record<string, string | number | Buffer>\n | string\n | number\n | Buffer\n | [string | number | Buffer, string | number | Buffer];\n};\n\nexport type DynamoDBFindResult<T> = {\n items: T[];\n cursor?:\n | Record<string, string | number | Buffer>\n | string\n | number\n | Buffer\n | [string | number | Buffer, string | number | Buffer];\n};\n\nexport type DynamoDBCreateOptions = {\n ttl?: number;\n returnConsumedCapacity?: ReturnConsumedCapacity;\n onConflict?: 'replace' | 'ignore'; // Default is 'replace'\n};\n\nexport type DynamoDBCreateOneResult = {\n created: boolean;\n replacedItem?: Record<string, any>;\n expiresAt?: number;\n};\n\nexport type DynamoDBCreateManyResult = {\n numberOfItems: number;\n expiresAt?: number;\n};\n\nexport type DynamoDBUpdateOptions = {\n returnValue?: ReturnValue;\n upsert?: boolean; // Default is true\n ttl?: number;\n returnConsumedCapacity?: ReturnConsumedCapacity;\n};\n\nexport type DynamoDBUpdateResult<T> = {\n updatedOrCreated: boolean;\n expiresAt?: number;\n item?: Partial<T>;\n};\n\nexport type DynamoDBDeleteOptions = {\n returnValue?: 'ALL_OLD' | 'NONE';\n returnConsumedCapacity?: ReturnConsumedCapacity;\n};\n\nexport type DynamoDBDeleteOneResult<T> = {\n deleted: boolean;\n item?: T;\n};\n\nexport type DynamoDBDeleteManyResult = {\n numberOfItems: number;\n};\n\nexport type DynamoDBTransactionOptions = {\n mode: DynamoDBTransactionMode;\n now?: number;\n returnConsumedCapacity?: ReturnConsumedCapacity;\n};\n\nexport type DynamoDBTransactionResult<T> = {\n items?: T[];\n numberOfTransactItems: number;\n};\n\nfunction isTransactionConflictError(error: Error): boolean {\n return (\n error.name === 'TransactionCanceledException' &&\n (error as TransactionCanceledException).CancellationReasons?.some(\n reason => reason.Code === 'TransactionConflict',\n ) === true\n );\n}\n\nconst MAX_UNPROCESSED_ATTEMPTS = 10;\n\nconst sleep = (ms: number): Promise<void> =>\n new Promise(resolve => setTimeout(resolve, ms));\n\nconst backoffDelayMs = (attempt: number): number =>\n Math.min(50 * 2 ** attempt, 1000);\n\nfunction serializeKey(key: unknown): string {\n return JSON.stringify((Array.isArray(key) ? key : [key]).map(value =>\n value instanceof Uint8Array ? ['binary', Buffer.from(value).toString('base64')] : [typeof value, value],\n ));\n}\n\nfunction transformExpressionAttribute(\n attribute: string,\n names: Map<string, string>,\n prefix = '#attr',\n): string {\n const parts = attribute.split(/(?<!\\\\)\\.(?!\\.)/);\n return parts.map((part, index) => {\n const indices = part.match(/(?<!\\\\)(?:\\[\\d+\\])+$/)?.[0] ?? '';\n const raw = (indices ? part.slice(0, -indices.length) : part).replace(/\\\\([.\\[\\]\\\\])/g, '$1');\n if (!raw) throw new Error('Attribute path must not contain empty segments');\n const name = index === 0 ? ucFirst(camel(raw)) : raw;\n let key = [...names].find(([, value]) => value === name)?.[0];\n if (!key) {\n let i = names.size;\n while (names.has(`${prefix}${i}`)) i++;\n key = `${prefix}${i}`;\n names.set(key, name);\n }\n return key + indices;\n }).join('.');\n}\n\nfunction createComparisonExpression<T>(\n operator: '=' | '<' | '<=' | '>' | '>=' | '<>',\n attribute: string,\n value: T,\n) {\n const expressionAttributeNameMap = new Map();\n const expressionAttributeValueMap = new Map();\n expressionAttributeValueMap.set(':val0', value);\n\n const expression = `${transformExpressionAttribute(\n attribute,\n expressionAttributeNameMap,\n )} ${operator} :val0`;\n\n return new DynamoDBExpression(\n expressionAttributeNameMap,\n expressionAttributeValueMap,\n expression,\n );\n}\n\nfunction createUpdateExpression(expressions: DynamoDBExpression[]) {\n const expressionAttributeNameMap = new Map();\n const expressionAttributeValueMap = new Map();\n const updateExpressionGroups: Map<\n 'SET' | 'REMOVE' | 'ADD' | 'DELETE',\n string[]\n > = new Map();\n expressions.forEach((expr, indx) => {\n if (expr.updateExpressionGroup === undefined) {\n throw new Error(\n 'Only expressions with updateExpressionGroup are allowed',\n );\n }\n expr.expressionAttributeNameMap.forEach((value, key) => {\n key = key.replace('#attr', `#attr${indx}_`);\n expressionAttributeNameMap.set(key, value);\n });\n let childExpression = expr.expression.replace(/#attr/g, `#attr${indx}_`);\n\n if (expr.expressionAttributeValueMap) {\n expr.expressionAttributeValueMap.forEach((value, key) => {\n key = key.replace(':val', `:val${indx}_`);\n expressionAttributeValueMap.set(key, value);\n });\n childExpression = childExpression.replace(/:val/g, `:val${indx}_`);\n }\n\n if (!updateExpressionGroups.has(expr.updateExpressionGroup)) {\n updateExpressionGroups.set(expr.updateExpressionGroup, [childExpression]);\n } else {\n updateExpressionGroups\n .get(expr.updateExpressionGroup)!\n .push(childExpression);\n }\n });\n\n const expression = Array.from(updateExpressionGroups)\n .map(([group, expressions]) => `${group} ${expressions.join(', ')}`)\n .join(' ');\n\n return new DynamoDBExpression(\n expressionAttributeNameMap,\n expressionAttributeValueMap,\n expression,\n );\n}\n\nexport function MoreThan<T>(attribute: string, value: T) {\n return createComparisonExpression<T>('>', attribute, value);\n}\n\nexport function MoreThanOrEqual<T>(attribute: string, value: T) {\n return createComparisonExpression<T>('>=', attribute, value);\n}\n\nexport function LessThan<T>(attribute: string, value: T) {\n return createComparisonExpression<T>('<', attribute, value);\n}\n\nexport function LessThanOrEqual<T>(attribute: string, value: T) {\n return createComparisonExpression<T>('<=', attribute, value);\n}\n\nexport function NotEqual<T>(attribute: string, value: T) {\n return createComparisonExpression<T>('<>', attribute, value);\n}\n\nexport function Equal<T>(attribute: string, value: T) {\n return createComparisonExpression<T>('=', attribute, value);\n}\n\nexport function Between<T>(attribute: string, lowerBound: T, upperBound: T) {\n if (\n typeof lowerBound === 'number' &&\n typeof upperBound === 'number' &&\n lowerBound > upperBound\n ) {\n throw new Error('Lower bound must be less than upper bound');\n }\n\n const expressionAttributeNameMap = new Map();\n const expressionAttributeValueMap = new Map();\n expressionAttributeValueMap.set(':val0', lowerBound);\n expressionAttributeValueMap.set(':val1', upperBound);\n\n const expression = `${transformExpressionAttribute(\n attribute,\n expressionAttributeNameMap,\n )} BETWEEN :val0 AND :val1`;\n\n return new DynamoDBExpression(\n expressionAttributeNameMap,\n expressionAttributeValueMap,\n expression,\n );\n}\n\nexport function In<T>(attribute: string, values: Array<T>) {\n if (values.length === 0 || values.length > 100) {\n throw new Error('Values must not be empty');\n }\n\n const expressionAttributeNameMap = new Map();\n const expressionAttributeValueMap = new Map();\n values.forEach((value, indx) => {\n expressionAttributeValueMap.set(`:val${indx}`, value);\n });\n\n const expression = `${transformExpressionAttribute(\n attribute,\n expressionAttributeNameMap,\n )} IN (${Array.from(expressionAttributeValueMap.keys()).join(', ')})`;\n\n return new DynamoDBExpression(\n expressionAttributeNameMap,\n expressionAttributeValueMap,\n expression,\n );\n}\n\nexport function AttributeExists(attribute: string) {\n const expressionAttributeNameMap = new Map();\n\n const expression = `attribute_exists(${transformExpressionAttribute(\n attribute,\n expressionAttributeNameMap,\n )})`;\n\n return new DynamoDBExpression(expressionAttributeNameMap, null, expression);\n}\n\nexport function AttributeNotExists(attribute: string) {\n const expressionAttributeNameMap = new Map();\n\n const expression = `attribute_not_exists(${transformExpressionAttribute(\n attribute,\n expressionAttributeNameMap,\n )})`;\n\n return new DynamoDBExpression(expressionAttributeNameMap, null, expression);\n}\n\nexport function AttributeType(\n attribute: string,\n valueType: 'S' | 'N' | 'B' | 'SS' | 'NS' | 'BS' | 'BOOL' | 'NULL' | 'L' | 'M',\n) {\n const expressionAttributeNameMap = new Map();\n const expressionAttributeValueMap = new Map();\n expressionAttributeValueMap.set(':val0', valueType);\n\n const expression = `attribute_type(${transformExpressionAttribute(\n attribute,\n expressionAttributeNameMap,\n )}, :val0)`;\n\n return new DynamoDBExpression(\n expressionAttributeNameMap,\n expressionAttributeValueMap,\n expression,\n );\n}\n\nexport function BeginsWith(attribute: string, prefix: string) {\n const expressionAttributeNameMap = new Map();\n const expressionAttributeValueMap = new Map();\n expressionAttributeValueMap.set(':val0', prefix);\n\n const expression = `begins_with(${transformExpressionAttribute(\n attribute,\n expressionAttributeNameMap,\n )}, :val0)`;\n\n return new DynamoDBExpression(\n expressionAttributeNameMap,\n expressionAttributeValueMap,\n expression,\n );\n}\n\nexport function Contains<T>(attribute: string, operand: T) {\n const expressionAttributeNameMap = new Map();\n const expressionAttributeValueMap = new Map();\n expressionAttributeValueMap.set(':val0', operand);\n\n const expression = `contains(${transformExpressionAttribute(\n attribute,\n expressionAttributeNameMap,\n )}, :val0)`;\n\n return new DynamoDBExpression(\n expressionAttributeNameMap,\n expressionAttributeValueMap,\n expression,\n );\n}\n\nexport function Size(\n attribute: string,\n operator: '=' | '<>' | '<' | '<=' | '>' | '>=',\n value: number,\n) {\n const expressionAttributeNameMap = new Map();\n const expressionAttributeValueMap = new Map();\n expressionAttributeValueMap.set(':val0', value);\n\n const expression = `size(${transformExpressionAttribute(\n attribute,\n expressionAttributeNameMap,\n )}) ${operator} :val0`;\n\n return new DynamoDBExpression(\n expressionAttributeNameMap,\n expressionAttributeValueMap,\n expression,\n );\n}\n\nexport function Not(expression: DynamoDBExpression) {\n let expr = expression.expression;\n if (\n (expr.includes(' OR ') || expr.includes(' AND ')) &&\n !expr.startsWith('(')\n ) {\n expr = `(${expr})`;\n }\n\n expr = `NOT ${expr}`;\n return new DynamoDBExpression(\n expression.expressionAttributeNameMap,\n expression.expressionAttributeValueMap,\n expr,\n );\n}\n\nexport function And(...expressions: DynamoDBExpression[]) {\n if (!expressions.length) throw new Error('At least one expression is required');\n const expressionAttributeNameMap = new Map();\n const expressionAttributeValueMap = new Map();\n const expression = expressions\n .map((expr, indx) => {\n expr.expressionAttributeNameMap.forEach((value, key) => {\n key = key.replace('#attr', `#attr${indx}_`);\n expressionAttributeNameMap.set(key, value);\n });\n let childExpression = expr.expression.replace(/#attr/g, `#attr${indx}_`);\n\n if (expr.expressionAttributeValueMap) {\n expr.expressionAttributeValueMap.forEach((value, key) => {\n key = key.replace(':val', `:val${indx}_`);\n expressionAttributeValueMap.set(key, value);\n });\n childExpression = childExpression.replace(/:val/g, `:val${indx}_`);\n }\n\n // If expression contains a `OR` or `AND` or `NOT` operator, wrap it in parentheses\n return (childExpression.includes(' OR ') ||\n childExpression.includes(' AND ')) &&\n !childExpression.startsWith('(')\n ? `(${childExpression})` // Wrap in parentheses\n : childExpression;\n })\n .join(' AND ');\n\n return new DynamoDBExpression(\n expressionAttributeNameMap,\n expressionAttributeValueMap,\n expression,\n );\n}\n\nexport function Or(...expressions: DynamoDBExpression[]) {\n if (!expressions.length) throw new Error('At least one expression is required');\n const expressionAttributeNameMap = new Map();\n const expressionAttributeValueMap = new Map();\n const expression = expressions\n .map((expr, indx) => {\n expr.expressionAttributeNameMap.forEach((value, key) => {\n key = key.replace('#attr', `#attr${indx}_`);\n expressionAttributeNameMap.set(key, value);\n });\n let childExpression = expr.expression.replace(/#attr/g, `#attr${indx}_`);\n\n if (expr.expressionAttributeValueMap) {\n expr.expressionAttributeValueMap.forEach((value, key) => {\n key = key.replace(':val', `:val${indx}_`);\n expressionAttributeValueMap.set(key, value);\n });\n childExpression = childExpression.replace(/:val/g, `:val${indx}_`);\n }\n\n // If expression contains a `OR` or `AND` operator, wrap it in parentheses\n return (childExpression.includes(' OR ') ||\n childExpression.includes(' AND ')) &&\n !childExpression.startsWith('(')\n ? `(${childExpression})` // Wrap in parentheses\n : childExpression;\n })\n .join(' OR ');\n\n return new DynamoDBExpression(\n expressionAttributeNameMap,\n expressionAttributeValueMap,\n expression,\n );\n}\n\nexport function Assign(attribute: string, value: any) {\n const expressionAttributeNameMap = new Map();\n const expressionAttributeValueMap = new Map();\n expressionAttributeValueMap.set(':val0', value);\n\n const expression = `${transformExpressionAttribute(\n attribute,\n expressionAttributeNameMap,\n )} = :val0`;\n\n return new DynamoDBExpression(\n expressionAttributeNameMap,\n expressionAttributeValueMap,\n expression,\n 'SET',\n );\n}\n\nexport function AssignIfNotExists(attribute: string, value: any) {\n const expressionAttributeNameMap = new Map();\n const expressionAttributeValueMap = new Map();\n expressionAttributeValueMap.set(':val0', value);\n\n const path = transformExpressionAttribute(\n attribute,\n expressionAttributeNameMap,\n );\n const expression = `${path} = if_not_exists(${path}, :val0)`;\n\n return new DynamoDBExpression(\n expressionAttributeNameMap,\n expressionAttributeValueMap,\n expression,\n 'SET',\n );\n}\n\nexport function Increment(attribute: string, value: number) {\n if (!Number.isFinite(value)) {\n throw new Error('Value must be a number');\n }\n\n const expressionAttributeNameMap = new Map();\n const expressionAttributeValueMap = new Map();\n expressionAttributeValueMap.set(':val0', value);\n\n const path = transformExpressionAttribute(\n attribute,\n expressionAttributeNameMap,\n );\n const expression = `${path} :val0`;\n\n return new DynamoDBExpression(\n expressionAttributeNameMap,\n expressionAttributeValueMap,\n expression,\n 'ADD',\n );\n}\n\nexport function Decrement(attribute: string, value: number) {\n if (!Number.isFinite(value)) {\n throw new Error('Value must be a number');\n }\n value = -value;\n return Increment(attribute, value);\n}\n\nexport function ListAppend(\n attribute: string,\n value: Array<any>,\n upsert = false,\n) {\n if (!Array.isArray(value)) {\n throw new Error('Value must be an array');\n }\n\n const expressionAttributeNameMap = new Map();\n const expressionAttributeValueMap = new Map();\n expressionAttributeValueMap.set(':val0', value);\n if (upsert) {\n expressionAttributeValueMap.set(':val1', []);\n }\n\n const path = transformExpressionAttribute(\n attribute,\n expressionAttributeNameMap,\n );\n\n const expression = upsert\n ? `${path} = list_append(if_not_exists(${path}, :val1), :val0)`\n : `${path} = list_append(${path}, :val0)`;\n\n return new DynamoDBExpression(\n expressionAttributeNameMap,\n expressionAttributeValueMap,\n expression,\n 'SET',\n );\n}\n\nexport function ListPrepend(\n attribute: string,\n value: Array<any>,\n upsert = false,\n) {\n if (!Array.isArray(value)) {\n throw new Error('Value must be an array');\n }\n\n const expressionAttributeNameMap = new Map();\n const expressionAttributeValueMap = new Map();\n expressionAttributeValueMap.set(':val0', value);\n if (upsert) {\n expressionAttributeValueMap.set(':val1', []);\n }\n\n const path = transformExpressionAttribute(\n attribute,\n expressionAttributeNameMap,\n );\n\n const expression = upsert\n ? `${path} = list_append(:val0, if_not_exists(${path}, :val1))`\n : `${path} = list_append(:val0, ${path})`;\n\n return new DynamoDBExpression(\n expressionAttributeNameMap,\n expressionAttributeValueMap,\n expression,\n 'SET',\n );\n}\n\nexport function Remove(attribute: string) {\n const expressionAttributeNameMap = new Map();\n\n const expression = transformExpressionAttribute(\n attribute,\n expressionAttributeNameMap,\n );\n\n return new DynamoDBExpression(\n expressionAttributeNameMap,\n null,\n expression,\n 'REMOVE',\n );\n}\n\nexport function SetAdd(attribute: string, value: Set<any>) {\n if (!(value instanceof Set) || value.size === 0) {\n throw new Error('Value must be a Set');\n }\n\n const expressionAttributeNameMap = new Map();\n const expressionAttributeValueMap = new Map();\n expressionAttributeValueMap.set(':val0', value);\n\n const path = transformExpressionAttribute(\n attribute,\n expressionAttributeNameMap,\n );\n\n const expression = `${path} :val0`;\n\n return new DynamoDBExpression(\n expressionAttributeNameMap,\n expressionAttributeValueMap,\n expression,\n 'ADD',\n );\n}\n\nexport function SetDelete(attribute: string, value: Set<any>) {\n if (!(value instanceof Set) || value.size === 0) {\n throw new Error('Value must be a Set');\n }\n\n const expressionAttributeNameMap = new Map();\n const expressionAttributeValueMap = new Map();\n expressionAttributeValueMap.set(':val0', value);\n\n const path = transformExpressionAttribute(\n attribute,\n expressionAttributeNameMap,\n );\n\n const expression = `${path} :val0`;\n\n return new DynamoDBExpression(\n expressionAttributeNameMap,\n expressionAttributeValueMap,\n expression,\n 'DELETE',\n );\n}\n\n/** JSON-compatible value used by expression descriptions. */\nexport type DynamoDBExpressionSerializedValue =\n | null | boolean | number | string\n | DynamoDBExpressionSerializedValue[]\n | { [key: string]: DynamoDBExpressionSerializedValue };\n\nfunction serializeExpressionValue(\n value: unknown,\n ancestors = new Set<object>(),\n): DynamoDBExpressionSerializedValue {\n if (value === null || typeof value === 'string' || typeof value === 'boolean') return value;\n if (typeof value === 'number') {\n return Number.isFinite(value) ? value : { $type: 'Number', value: String(value) };\n }\n if (typeof value === 'bigint') return { $type: 'BigInt', value: value.toString() };\n if (value === undefined) return { $type: 'Undefined' };\n if (typeof value !== 'object') {\n throw new TypeError(`Cannot describe expression value of type ${typeof value}`);\n }\n if (ancestors.has(value)) throw new TypeError('Cannot describe circular expression value');\n ancestors.add(value);\n try {\n if (value instanceof NumberValue) return { $type: 'NumberValue', value: value.toString() };\n if (value instanceof ArrayBuffer || ArrayBuffer.isView(value)) {\n const bytes = value instanceof ArrayBuffer\n ? Buffer.from(value)\n : Buffer.from(value.buffer, value.byteOffset, value.byteLength);\n return { $type: 'Binary', encoding: 'base64', value: bytes.toString('base64') };\n }\n if (value instanceof Set) {\n return { $type: 'Set', values: Array.from(value, item => serializeExpressionValue(item, ancestors)) };\n }\n if (Array.isArray(value)) return Array.from(value, item => serializeExpressionValue(item, ancestors));\n if (value instanceof Map) {\n return { $type: 'Map', entries: Array.from(value, ([key, item]) => [\n serializeExpressionValue(key, ancestors), serializeExpressionValue(item, ancestors),\n ]) };\n }\n if (Object.getPrototypeOf(value) !== Object.prototype && Object.getPrototypeOf(value) !== null) {\n throw new TypeError('Cannot describe unsupported expression value object');\n }\n if (Object.getOwnPropertySymbols(value).some(key => Object.prototype.propertyIsEnumerable.call(value, key))) {\n throw new TypeError('Cannot describe expression value with symbol keys');\n }\n return Object.fromEntries(Object.entries(value).map(([key, item]) => [\n key, serializeExpressionValue(item, ancestors),\n ]));\n } finally {\n ancestors.delete(value);\n }\n}\n\nexport type DynamoDBExpressionDescription = {\n /** DynamoDB expression string, e.g. `#attr0 = :val0`. */\n expression: string;\n /** Placeholder -> attribute name (e.g. `#attr0` -> `VersionStamp`). */\n expressionAttributeNames: Record<string, string>;\n /** Placeholder -> JSON-compatible value; native non-JSON values use explicit `$type` tags. */\n expressionAttributeValues: Record<string, DynamoDBExpressionSerializedValue>;\n /** Which update clause the expression belongs to (SET/REMOVE/ADD/DELETE). */\n updateExpressionGroup?: 'SET' | 'REMOVE' | 'ADD' | 'DELETE';\n};\n\nexport class DynamoDBExpression {\n constructor(\n public expressionAttributeNameMap: Map<string, string> = new Map(), // e.g. #attr0 -> attribute\n public expressionAttributeValueMap: Map<string, any> | null = null, // e.g. :val0 -> value\n public expression: string = '',\n public updateExpressionGroup?: 'SET' | 'REMOVE' | 'ADD' | 'DELETE',\n ) { }\n\n /**\n * Detached, JSON-serializable description of the expression. Intended for logging,\n * debugging, and unit tests that need to assert on a built expression\n * without reaching into the internal Maps.\n * Sets, bigint, binary, Maps, NumberValue, undefined and non-finite numbers\n * use explicit `$type` tags. Circular and unsupported values throw TypeError.\n */\n describe(): DynamoDBExpressionDescription {\n return {\n expression: this.expression,\n expressionAttributeNames: Object.fromEntries(\n this.expressionAttributeNameMap,\n ),\n expressionAttributeValues: this.expressionAttributeValueMap\n ? Object.fromEntries(Array.from(this.expressionAttributeValueMap, ([key, value]) => [\n key, serializeExpressionValue(value),\n ]))\n : {},\n ...(this.updateExpressionGroup !== undefined\n ? { updateExpressionGroup: this.updateExpressionGroup }\n : {}),\n };\n }\n}\n\nexport enum DynamoDBTransactionMode {\n READ = 'READ',\n WRITE = 'WRITE',\n}\n\nexport class DynamoDBTransaction {\n private transactGetItems: Exclude<\n TransactGetCommandInput['TransactItems'],\n undefined\n > = [];\n private transactWriteItems: Exclude<\n TransactWriteCommandInput['TransactItems'],\n undefined\n > = [];\n private itemIndxToCheckTTL: Set<number> = new Set();\n private itemIndxToTableKey: Map<number, string> = new Map();\n\n constructor(\n public mode: DynamoDBTransactionMode,\n private readonly ddbDocClient: DynamoDBDocumentClient,\n private readonly tables: Map<string, DynamoDBTableDefinition>,\n private readonly txRetryLimit: number,\n private readonly txRetryDelay: number,\n private readonly logger: DynamoDBLogger,\n private readonly now: number,\n private returnConsumedCapacity?: ReturnConsumedCapacity,\n ) {\n if (\n mode !== DynamoDBTransactionMode.READ &&\n mode !== DynamoDBTransactionMode.WRITE\n ) {\n throw new Error('Invalid transaction mode');\n }\n }\n\n async txConflictRetryWrapper(\n command: TransactGetCommand | TransactWriteCommand,\n retries: number,\n delay: number,\n ): Promise<\n TransactWriteCommandOutput | TransactGetCommandOutput | undefined\n > {\n retries = Math.max(1, Math.min(retries, 10)); // Limit retries to a maximum of 10\n delay = Math.max(delay, 50); // Ensure a minimum delay of 50ms\n for (let i = 0; i < retries; i++) {\n try {\n if (command instanceof TransactWriteCommand) {\n return await this.ddbDocClient.send(command);\n } else if (command instanceof TransactGetCommand) {\n return await this.ddbDocClient.send(command);\n }\n throw new Error(\n 'Only TransactWriteCommand and TransactGetCommand are supported to retry on conflict',\n );\n } catch (error) {\n if (error instanceof Error && isTransactionConflictError(error)) {\n if (i === retries - 1) {\n throw error;\n }\n this.logger.warn('DynamoDB retrying transaction conflict', { mode: this.mode, attempt: i + 1, maxAttempts: retries, delayMs: delay * (i + 1) });\n await new Promise(resolve => setTimeout(resolve, delay * (i + 1)));\n } else {\n throw error;\n }\n }\n }\n }\n\n _cleanup() {\n this.transactGetItems.length = 0;\n this.transactWriteItems.length = 0;\n this.itemIndxToCheckTTL.clear();\n this.itemIndxToTableKey.clear();\n }\n\n getOne(\n tableKey: string,\n primaryKey:\n | string\n | number\n | Buffer\n | [string | number | Buffer, string | number | Buffer],\n opts: Pick<DynamoDBFindOptions, 'projectionFields'> = {},\n ) {\n if (this.mode !== DynamoDBTransactionMode.READ) {\n throw new Error('Transaction mode is not READ');\n }\n\n if (this.transactGetItems.length >= 25) {\n throw new Error('Maximum number of items in a transaction is 25');\n }\n\n const table = this.tables.get(tableKey);\n if (!table) {\n throw new Error(`Table ${tableKey} not configured`);\n }\n\n const keys = Array.isArray(primaryKey)\n ? {\n [table.partitionKey]: primaryKey[0],\n [table.sortKey!]: primaryKey[1],\n }\n : {\n [table.partitionKey]: primaryKey,\n };\n\n let ProjectionExpression: string = '';\n let ExpressionAttributeNames: Record<string, string> | null = null;\n if (opts.projectionFields !== undefined) {\n const projectionFields = [...new Set(opts.projectionFields.map(field => field.includes('.') || field.includes('[') ? field : ucFirst(camel(field))))];\n const optIncludeTimeToLive =\n table.timeToLiveAttribute !== undefined &&\n projectionFields.includes(table.timeToLiveAttribute);\n if (table.timeToLiveAttribute !== undefined && !optIncludeTimeToLive) {\n projectionFields.push(table.timeToLiveAttribute);\n }\n const expressionAttributeNameMap = new Map();\n ProjectionExpression = projectionFields\n .map(field =>\n transformExpressionAttribute(field, expressionAttributeNameMap),\n )\n .join(', ');\n expressionAttributeNameMap.forEach(\n (attributeName, attributeNameVariable) => {\n if (ExpressionAttributeNames === null) {\n ExpressionAttributeNames = {};\n }\n ExpressionAttributeNames[attributeNameVariable] = attributeName;\n },\n );\n }\n\n this.transactGetItems.push({\n Get: {\n TableName: table.name,\n Key: keys,\n ...(ProjectionExpression !== '' ? { ProjectionExpression } : {}),\n ...(ExpressionAttributeNames !== null\n ? { ExpressionAttributeNames }\n : {}),\n },\n });\n\n if (table.timeToLiveAttribute !== undefined) {\n this.itemIndxToCheckTTL.add(this.transactGetItems.length - 1);\n this.itemIndxToTableKey.set(this.transactGetItems.length - 1, tableKey);\n }\n\n return this; // Chainable\n }\n\n check(\n tableKey: string,\n primaryKey:\n | string\n | number\n | Buffer\n | [string | number | Buffer, string | number | Buffer],\n filter: DynamoDBExpression,\n ) {\n if (this.mode !== DynamoDBTransactionMode.WRITE) {\n throw new Error('Transaction mode is not WRITE');\n }\n\n if (this.transactWriteItems.length >= 25) {\n throw new Error('Maximum number of items in a transaction is 25');\n }\n\n const table = this.tables.get(tableKey);\n if (!table) {\n throw new Error(`Table ${tableKey} not configured`);\n }\n\n if (filter.expression === '') {\n throw new Error('Filter expression is empty');\n }\n\n const keys = Array.isArray(primaryKey)\n ? {\n [table.partitionKey]: primaryKey[0],\n [table.sortKey!]: primaryKey[1],\n }\n : {\n [table.partitionKey]: primaryKey,\n };\n\n if (table.timeToLiveAttribute !== undefined) {\n filter = And(\n filter,\n Or(\n AttributeNotExists(table.timeToLiveAttribute),\n MoreThan(table.timeToLiveAttribute, this.now),\n ),\n );\n }\n\n const ConditionExpression: string = filter.expression;\n const ExpressionAttributeNames: Record<string, string> = Array.from(\n filter.expressionAttributeNameMap,\n ).reduce((acc, [key, value]) => {\n acc[key] = value;\n return acc;\n }, {} as Record<string, any>);\n const ExpressionAttributeValues: Record<string, any> | null =\n filter.expressionAttributeValueMap\n ? Array.from(filter.expressionAttributeValueMap).reduce(\n (acc, [key, value]) => {\n acc[key] = value;\n return acc;\n },\n {} as Record<string, any>,\n )\n : null;\n\n this.transactWriteItems.push({\n ConditionCheck: {\n TableName: table.name,\n Key: keys,\n ConditionExpression,\n ExpressionAttributeNames,\n ...(ExpressionAttributeValues !== null\n ? { ExpressionAttributeValues }\n : {}),\n },\n });\n\n return this; // Chainable\n }\n\n createOne(\n tableKey: string,\n primaryKey:\n | string\n | number\n | Buffer\n | [string | number | Buffer, string | number | Buffer],\n item: Record<string, any>,\n opts: Pick<DynamoDBCreateOptions, 'ttl' | 'onConflict'> = {},\n ) {\n if (this.mode !== DynamoDBTransactionMode.WRITE) {\n throw new Error('Transaction mode is not WRITE');\n }\n\n if (this.transactWriteItems.length >= 25) {\n throw new Error('Maximum number of items in a transaction is 25');\n }\n\n const table = this.tables.get(tableKey);\n if (!table) {\n throw new Error(`Table ${tableKey} not configured`);\n }\n\n const normalizedItem: Record<string, any> = {};\n Object.keys(item).forEach(key => {\n normalizedItem[ucFirst(camel(key))] = item[key];\n });\n\n if (table.sortKey) {\n if (!Array.isArray(primaryKey) || primaryKey.length !== 2) throw new Error('Composite primary key requires two values');\n normalizedItem[table.partitionKey] = primaryKey[0];\n normalizedItem[table.sortKey!] = primaryKey[1];\n } else {\n normalizedItem[table.partitionKey] = primaryKey;\n }\n\n if (table.timeToLiveAttribute !== undefined && opts.ttl && opts.ttl > 0) {\n normalizedItem[table.timeToLiveAttribute] = this.now + opts.ttl;\n }\n\n let ConditionExpression: string = '';\n let ExpressionAttributeNames: Record<string, string> | null = null;\n if (opts.onConflict === 'ignore') {\n const expression = table.sortKey\n ? And(\n AttributeNotExists(table.partitionKey),\n AttributeNotExists(table.sortKey),\n )\n : AttributeNotExists(table.partitionKey);\n ConditionExpression = expression.expression;\n expression.expressionAttributeNameMap.forEach((value, key) => {\n if (!ExpressionAttributeNames) {\n ExpressionAttributeNames = {};\n }\n ExpressionAttributeNames[key] = value;\n });\n }\n\n this.transactWriteItems.push({\n Put: {\n TableName: table.name,\n Item: normalizedItem,\n ...(ConditionExpression !== '' ? { ConditionExpression } : {}),\n ...(ExpressionAttributeNames !== null\n ? { ExpressionAttributeNames }\n : {}),\n },\n });\n\n return this; // Chainable\n }\n\n update(\n tableKey: string,\n primaryKey:\n | string\n | number\n | Buffer\n | [string | number | Buffer, string | number | Buffer],\n commands: DynamoDBExpression[],\n condition: DynamoDBExpression | null = null,\n opts: Pick<DynamoDBUpdateOptions, 'ttl' | 'upsert'> = {},\n ) {\n if (this.mode !== DynamoDBTransactionMode.WRITE) {\n throw new Error('Transaction mode is not WRITE');\n }\n\n if (this.transactWriteItems.length >= 25) {\n throw new Error('Maximum number of items in a transaction is 25');\n }\n\n const table = this.tables.get(tableKey);\n if (!table) {\n throw new Error(`Table ${tableKey} not configured`);\n }\n if (commands.length === 0 && opts.ttl === undefined) {\n throw new Error('No update commands provided');\n }\n\n const keys = Array.isArray(primaryKey)\n ? {\n [table.partitionKey]: primaryKey[0],\n [table.sortKey!]: primaryKey[1],\n }\n : {\n [table.partitionKey]: primaryKey,\n };\n\n commands = [...commands];\n if (table.timeToLiveAttribute && opts.ttl !== undefined) {\n if (opts.ttl > 0) {\n const expiresAt = this.now + opts.ttl;\n commands.push(Assign(table.timeToLiveAttribute, expiresAt));\n } else if (opts.ttl === 0) {\n commands.push(Remove(table.timeToLiveAttribute));\n }\n }\n\n const {\n expressionAttributeNameMap,\n expressionAttributeValueMap,\n expression: UpdateExpression,\n } = createUpdateExpression(commands);\n\n let ConditionExpression: string = '';\n if (table.timeToLiveAttribute && opts.upsert === false) {\n condition = condition\n ? And(\n condition,\n Or(\n AttributeNotExists(table.timeToLiveAttribute),\n MoreThan(table.timeToLiveAttribute, this.now),\n ),\n )\n : Or(\n AttributeNotExists(table.timeToLiveAttribute),\n MoreThan(table.timeToLiveAttribute, this.now),\n );\n }\n\n if (opts.upsert === false) {\n condition = table.sortKey\n ? condition\n ? And(\n condition,\n And(\n AttributeExists(table.partitionKey),\n AttributeExists(table.sortKey),\n ),\n )\n : And(\n AttributeExists(table.partitionKey),\n AttributeExists(table.sortKey),\n )\n : condition\n ? And(condition, AttributeExists(table.partitionKey))\n : AttributeExists(table.partitionKey);\n }\n\n if (condition) {\n condition.expressionAttributeNameMap.forEach((value, key) => {\n key = key.replace('#attr', `#condition_attr`);\n expressionAttributeNameMap.set(key, value);\n });\n if (condition.expressionAttributeValueMap) {\n condition.expressionAttributeValueMap.forEach((value, key) => {\n key = key.replace(':val', `:condition_val`);\n expressionAttributeValueMap!.set(key, value);\n });\n }\n\n ConditionExpression = condition.expression\n .replace(/#attr/g, `#condition_attr`)\n .replace(/:val/g, `:condition_val`);\n }\n\n let ExpressionAttributeNames: Record<string, string> | null = null;\n let ExpressionAttributeValues: Record<string, any> | null = null;\n\n expressionAttributeNameMap.forEach(\n (attributeName, attributeNameVariable) => {\n if (!ExpressionAttributeNames) {\n ExpressionAttributeNames = {};\n }\n ExpressionAttributeNames[attributeNameVariable] = attributeName;\n },\n );\n expressionAttributeValueMap!.forEach((value, attributeValueVariable) => {\n if (!ExpressionAttributeValues) {\n ExpressionAttributeValues = {};\n }\n ExpressionAttributeValues[attributeValueVariable] = value;\n });\n\n this.transactWriteItems.push({\n Update: {\n TableName: table.name,\n Key: keys,\n UpdateExpression,\n ...(ConditionExpression !== '' ? { ConditionExpression } : {}),\n ...(ExpressionAttributeNames !== null\n ? { ExpressionAttributeNames }\n : {}),\n ...(ExpressionAttributeValues !== null\n ? { ExpressionAttributeValues }\n : {}),\n },\n });\n\n return this; // Chainable\n }\n\n deleteOne(\n tableKey: string,\n primaryKey:\n | string\n | number\n | Buffer\n | [string | number | Buffer, string | number | Buffer],\n condition: DynamoDBExpression | null = null,\n ) {\n if (this.mode !== DynamoDBTransactionMode.WRITE) {\n throw new Error('Transaction mode is not WRITE');\n }\n\n if (this.transactWriteItems.length >= 25) {\n throw new Error('Maximum number of items in a transaction is 25');\n }\n\n const table = this.tables.get(tableKey);\n if (!table) {\n throw new Error(`Table ${tableKey} not configured`);\n }\n\n const keys = Array.isArray(primaryKey)\n ? {\n [table.partitionKey]: primaryKey[0],\n [table.sortKey!]: primaryKey[1],\n }\n : {\n [table.partitionKey]: primaryKey,\n };\n\n let ConditionExpression: string = '';\n let ExpressionAttributeNames: Record<string, string> | null = null;\n let ExpressionAttributeValues: Record<string, any> | null = null;\n\n if (condition) {\n condition.expressionAttributeNameMap.forEach(\n (attributeName, attributeNameVariable) => {\n if (!ExpressionAttributeNames) {\n ExpressionAttributeNames = {};\n }\n ExpressionAttributeNames[attributeNameVariable] = attributeName;\n },\n );\n if (condition.expressionAttributeValueMap) {\n condition.expressionAttributeValueMap.forEach(\n (value, attributeValueVariable) => {\n if (!ExpressionAttributeValues) {\n ExpressionAttributeValues = {};\n }\n ExpressionAttributeValues[attributeValueVariable] = value;\n },\n );\n }\n ConditionExpression = condition.expression;\n }\n\n this.transactWriteItems.push({\n Delete: {\n TableName: table.name,\n Key: keys,\n ...(ConditionExpression !== '' ? { ConditionExpression } : {}),\n ...(ExpressionAttributeNames !== null\n ? { ExpressionAttributeNames }\n : {}),\n ...(ExpressionAttributeValues !== null\n ? { ExpressionAttributeValues }\n : {}),\n },\n });\n\n return this; // Chainable\n }\n\n async commit<T>(camelOrSnake: 'camel' | 'snake' = 'camel'): Promise<DynamoDBTransactionResult<T | null>> {\n let command: TransactGetCommand | TransactWriteCommand;\n const result: DynamoDBTransactionResult<T | null> = {\n numberOfTransactItems: 0,\n };\n this.logger.debug('DynamoDB transaction started', { mode: this.mode, itemCount: this.mode === DynamoDBTransactionMode.READ ? this.transactGetItems.length : this.transactWriteItems.length });\n switch (this.mode) {\n case DynamoDBTransactionMode.READ:\n command = new TransactGetCommand({\n TransactItems: this.transactGetItems,\n ...(this.returnConsumedCapacity\n ? { ReturnConsumedCapacity: this.returnConsumedCapacity }\n : {}),\n });\n const { Responses } = (await this.txConflictRetryWrapper(\n command,\n this.txRetryLimit,\n this.txRetryDelay,\n ).catch((e: Error) => {\n this._cleanup();\n if (isTransactionConflictError(e)) {\n this.logger.error('DynamoDB transaction conflict retry limit reached', { errorName: e.name });\n throw new DynamoDBError(409, {\n message: e.message,\n cause: e,\n });\n } else if (e.name === 'TransactionCanceledException') {\n this.logger.error('DynamoDB transaction canceled', { errorName: e.name });\n throw new DynamoDBError(400, {\n message: e.message,\n cause: e,\n });\n } else {\n this.logger.error('Transaction failed', { errorName: e.name });\n throw new DynamoDBError(500, {\n message: e.message,\n cause: e,\n });\n }\n })) as TransactGetCommandOutput;\n result.numberOfTransactItems = this.transactGetItems.length;\n result.items = Responses!.map(({ Item }, indx) => {\n if (!Item) {\n return null;\n }\n if (this.itemIndxToCheckTTL.has(indx)) {\n const table = this.tables.get(this.itemIndxToTableKey.get(indx)!)!;\n if (\n Item[table.timeToLiveAttribute!] !== undefined &&\n Item[table.timeToLiveAttribute!] <= this.now\n ) {\n return null;\n }\n }\n // Convert keys back to camelCase if camelOrSnake is 'camel' or to snake_case if camelOrSnake is 'snake'\n if (camelOrSnake === 'camel') {\n const newItem: Record<string, any> = {};\n Object.keys(Item!).forEach(key => {\n const value = Item![key];\n newItem[lcFirst(key)] = value;\n });\n return newItem as T;\n } else {\n const newItem: Record<string, any> = {};\n Object.keys(Item!).forEach(key => {\n const value = Item![key];\n newItem[snake(lcFirst(key))] = value;\n });\n return newItem as T;\n }\n });\n this._cleanup();\n break;\n case DynamoDBTransactionMode.WRITE:\n command = new TransactWriteCommand({\n TransactItems: this.transactWriteItems,\n ...(this.returnConsumedCapacity\n ? { ReturnConsumedCapacity: this.returnConsumedCapacity }\n : {}),\n });\n await this.txConflictRetryWrapper(\n command,\n this.txRetryLimit,\n this.txRetryDelay,\n ).catch((e: Error) => {\n this._cleanup();\n if (isTransactionConflictError(e)) {\n this.logger.error('DynamoDB transaction conflict retry limit reached', { errorName: e.name });\n throw new DynamoDBError(409, {\n message: e.message,\n cause: e,\n });\n } else if (e.name === 'TransactionCanceledException') {\n this.logger.error('DynamoDB transaction canceled', { errorName: e.name });\n throw new DynamoDBError(400, {\n message: e.message,\n cause: e,\n });\n } else if (e.name === 'ValidationException') {\n this.logger.error('The request parameters are invalid', { errorName: e.name });\n throw new DynamoDBError(400, {\n message: 'Invalid request parameters',\n cause: e,\n });\n } else {\n this.logger.error('Transaction failed', { errorName: e.name });\n throw new DynamoDBError(500, {\n message: e.message,\n cause: e,\n });\n }\n });\n result.numberOfTransactItems = this.transactWriteItems.length;\n this._cleanup();\n break;\n default:\n throw new Error('Invalid transaction mode');\n }\n\n this.logger.debug('DynamoDB transaction completed', { mode: this.mode, itemCount: result.numberOfTransactItems });\n return result;\n }\n}\n\nexport default class DynamoDBService {\n private readonly ddbClient: DynamoDBClient;\n private readonly ddbDocClient: DynamoDBDocumentClient;\n constructor(\n private readonly options: DynamoDBConfig,\n private readonly logger: DynamoDBLogger = silentLogger,\n ) {\n // Check the tables configuration\n if (\n !options.tables ||\n options.tables.size === 0 ||\n Array.from(options.tables.values()).some(table => table.name === '')\n ) {\n throw new Error('DynamoDB tables are not configured properly');\n }\n\n this.ddbClient = new DynamoDBClient({\n region: options.region,\n credentials: options.credentials,\n requestHandler: {\n requestTimeout: this.options.requestTimeout,\n httpsAgent: new Agent({\n keepAlive: true,\n maxSockets: this.options.maxSockets ?? 50,\n }),\n },\n ...(this.options.endpoint ? { endpoint: this.options.endpoint } : {}), // For local development\n });\n this.ddbDocClient = DynamoDBDocumentClient.from(this.ddbClient);\n }\n\n /** Release connections when the application shuts down; reuse instances in Lambda. */\n destroy(): void { this.ddbClient.destroy(); }\n\n async getOne<T>(\n tableKey: string,\n primaryKey:\n | string\n | number\n | Buffer\n | [string | number | Buffer, string | number | Buffer],\n opts: Omit<\n DynamoDBFindOptions,\n 'cursor' | 'limit' | 'ascending' | 'indexToScan'\n > = {},\n camelOrSnake: 'camel' | 'snake' = 'camel',\n ): Promise<T | null> {\n const table = this.options.tables.get(tableKey);\n if (!table) {\n throw new Error(`Table ${tableKey} not configured`);\n }\n\n const keys = Array.isArray(primaryKey)\n ? {\n [table.partitionKey]: primaryKey[0],\n [table.sortKey!]: primaryKey[1],\n }\n : {\n [table.partitionKey]: primaryKey,\n };\n\n let optIncludeTimeToLive: boolean = false;\n let ProjectionExpression: string = '';\n let ExpressionAttributeNames: Record<string, string> | null = null;\n if (opts.projectionFields) {\n const projectionFields = [...new Set(opts.projectionFields.map(field => field.includes('.') || field.includes('[') ? field : ucFirst(camel(field))))];\n optIncludeTimeToLive =\n table.timeToLiveAttribute !== undefined &&\n projectionFields.includes(table.timeToLiveAttribute);\n if (table.timeToLiveAttribute && !optIncludeTimeToLive) {\n projectionFields.push(table.timeToLiveAttribute);\n }\n const expressionAttributeNameMap = new Map();\n ProjectionExpression = projectionFields\n .map(field =>\n transformExpressionAttribute(field, expressionAttributeNameMap),\n )\n .join(', ');\n expressionAttributeNameMap.forEach(\n (attributeName, attributeNameVariable) => {\n if (!ExpressionAttributeNames) {\n ExpressionAttributeNames = {};\n }\n ExpressionAttributeNames[attributeNameVariable] = attributeName;\n },\n );\n }\n\n this.logger.debug('DynamoDB request started', { operation: 'getOne', tableKey });\n const getCommand = new GetCommand({\n TableName: table.name,\n Key: keys,\n ConsistentRead: opts.consistentRead ?? false,\n ReturnConsumedCapacity:\n opts.returnConsumedCapacity ?? ReturnConsumedCapacity.NONE,\n ...(ProjectionExpression !== '' ? { ProjectionExpression } : {}),\n ...(ExpressionAttributeNames !== null\n ? { ExpressionAttributeNames }\n : {}),\n });\n\n const { Item: item } = await this.ddbDocClient\n .send(getCommand)\n .catch((e: Error) => {\n if (e.name === 'ValidationException') {\n this.logger.error('The request parameters are invalid', { errorName: e.name, tableKey });\n throw new DynamoDBError(400, {\n message: 'Invalid request parameters',\n cause: e,\n });\n } else {\n this.logger.error('Failed to get item', { errorName: e.name, tableKey });\n throw new DynamoDBError(500, {\n message: 'Failed to get item',\n cause: e,\n });\n }\n });\n // Filter expired item\n if (item && table.timeToLiveAttribute && item[table.timeToLiveAttribute] !== undefined) {\n const now = getUnixTime(new Date());\n if (item[table.timeToLiveAttribute] <= now) {\n this.logger.debug('DynamoDB getOne completed', { tableKey, outcome: 'expired' });\n return null;\n }\n\n // Delete the time to live attribute from the item if not requested\n if (optIncludeTimeToLive === false) {\n delete item[table.timeToLiveAttribute];\n }\n }\n this.logger.debug('DynamoDB getOne completed', { tableKey, outcome: item ? 'found' : 'not-found' });\n // Item will be undefined if not found\n // Convert keys back to camelCase if camelOrSnake is 'camel' or to snake_case if camelOrSnake is 'snake'\n if (item) {\n if (camelOrSnake === 'camel') {\n const newItem: Record<string, any> = {};\n Object.keys(item).forEach(key => {\n const value = item[key];\n newItem[lcFirst(key)] = value;\n });\n return newItem as T;\n } else {\n const newItem: Record<string, any> = {};\n Object.keys(item).forEach(key => {\n const value = item[key];\n newItem[snake(lcFirst(key))] = value;\n });\n return newItem as T;\n }\n } else {\n return null;\n }\n }\n\n async getMany<T>(\n tableKey: string,\n primaryKeys: (\n | string\n | number\n | Buffer\n | [string | number | Buffer, string | number | Buffer]\n )[],\n opts: Omit<\n DynamoDBFindOptions,\n 'cursor' | 'limit' | 'ascending' | 'indexToScan'\n > = {},\n camelOrSnake: 'camel' | 'snake' = 'camel',\n ): Promise<(T | null)[]> {\n const table = this.options.tables.get(tableKey);\n if (!table) {\n throw new Error(`Table ${tableKey} not configured`);\n }\n\n const pkIndexMap: Map<string, number> = new Map();\n const keys = primaryKeys.map((primaryKey, indx) => {\n const isArrayOfKeys = Array.isArray(primaryKey);\n const pkStr = serializeKey(primaryKey);\n\n if (pkIndexMap.has(pkStr)) {\n throw new Error(`Duplicate primary key: ${pkStr}`);\n }\n pkIndexMap.set(pkStr, indx);\n return isArrayOfKeys\n ? {\n [table.partitionKey]: primaryKey[0],\n [table.sortKey!]: primaryKey[1],\n }\n : {\n [table.partitionKey]: primaryKey,\n };\n });\n\n let optIncludeTimeToLive: boolean = false;\n let optIncludePartitionKey: boolean = true;\n let optIncludeSortKey: boolean = true;\n let ProjectionExpression: string = '';\n let ExpressionAttributeNames: Record<string, string> | null = null;\n if (opts.projectionFields) {\n const projectionFields = [...new Set(opts.projectionFields.map(field => field.includes('.') || field.includes('[') ? field : ucFirst(camel(field))))];\n optIncludeTimeToLive =\n table.timeToLiveAttribute !== undefined &&\n projectionFields.includes(table.timeToLiveAttribute);\n if (table.timeToLiveAttribute && !optIncludeTimeToLive) {\n projectionFields.push(table.timeToLiveAttribute);\n }\n // To help parse the response by item, include the primary key values for the items in your request in the ProjectionExpression parameter.\n optIncludePartitionKey = projectionFields.includes(\n table.partitionKey,\n );\n if (!optIncludePartitionKey) {\n projectionFields.push(table.partitionKey);\n }\n optIncludeSortKey =\n table.sortKey !== undefined &&\n projectionFields.includes(table.sortKey);\n if (table.sortKey && !optIncludeSortKey) {\n projectionFields.push(table.sortKey);\n }\n\n const expressionAttributeNameMap = new Map();\n ProjectionExpression = projectionFields\n .map(field =>\n transformExpressionAttribute(field, expressionAttributeNameMap),\n )\n .join(', ');\n expressionAttributeNameMap.forEach(\n (attributeName, attributeNameVariable) => {\n if (!ExpressionAttributeNames) {\n ExpressionAttributeNames = {};\n }\n ExpressionAttributeNames[attributeNameVariable] = attributeName;\n },\n );\n }\n\n const results = new Array(primaryKeys.length).fill(null);\n const now = getUnixTime(new Date());\n let unprocessedAttempt = 0;\n while (keys.length > 0) {\n const batch = keys.splice(0, 100);\n this.logger.debug('DynamoDB batch request started', { operation: 'getMany', tableKey, itemCount: batch.length });\n const batchGetCommand = new BatchGetCommand({\n RequestItems: {\n [table.name]: {\n Keys: batch,\n ConsistentRead: opts.consistentRead ?? false,\n ...(ProjectionExpression !== '' ? { ProjectionExpression } : {}),\n ...(ExpressionAttributeNames !== null\n ? { ExpressionAttributeNames }\n : {}),\n },\n },\n ReturnConsumedCapacity:\n opts.returnConsumedCapacity ?? ReturnConsumedCapacity.NONE,\n });\n\n const { Responses: responses, UnprocessedKeys: rawUnprocessedKeys } =\n await this.ddbDocClient.send(batchGetCommand).catch((error: Error) => {\n this.logger.error('Failed to get items', { tableKey, errorName: error.name });\n throw error;\n });\n const items =\n responses && responses[table.name] ? responses[table.name] : [];\n const unprocessedKeys =\n (rawUnprocessedKeys && rawUnprocessedKeys[table.name]?.Keys) || [];\n\n if (unprocessedKeys.length > 0) {\n if (unprocessedAttempt >= MAX_UNPROCESSED_ATTEMPTS) {\n this.logger.error('DynamoDB batch retry limit reached', { operation: 'getMany', tableKey, retryCount: unprocessedAttempt });\n throw new DynamoDBError(500, {\n message: 'Failed to retrieve items after multiple attempts',\n cause: new Error('Too many unprocessed items'),\n });\n }\n const delayMs = backoffDelayMs(unprocessedAttempt);\n this.logger.warn('DynamoDB retrying unprocessed batch items', { operation: 'getMany', tableKey, itemCount: unprocessedKeys.length, attempt: unprocessedAttempt + 1, delayMs });\n await sleep(delayMs);\n unprocessedAttempt += 1;\n } else {\n unprocessedAttempt = 0;\n }\n keys.push(...unprocessedKeys);\n\n // Filter expired items\n items?.forEach(item => {\n if (\n item &&\n table.timeToLiveAttribute &&\n item[table.timeToLiveAttribute] !== undefined\n ) {\n if (item[table.timeToLiveAttribute] <= now) {\n return;\n }\n // Delete the time to live attribute from the item if not requested\n if (optIncludeTimeToLive === false) {\n delete item[table.timeToLiveAttribute];\n }\n }\n\n const pkStr = serializeKey(table.sortKey\n ? [item[table.partitionKey], item[table.sortKey]]\n : item[table.partitionKey]);\n\n // Delete the primary key values from the item if not requested\n if (optIncludePartitionKey === false) {\n delete item[table.partitionKey];\n }\n if (optIncludeSortKey === false && table.sortKey) {\n delete item[table.sortKey];\n }\n\n // Convert keys back to camelCase if camelOrSnake is 'camel' or to snake_case if camelOrSnake is 'snake'\n if (camelOrSnake === 'camel') {\n const newItem: Record<string, any> = {};\n Object.keys(item).forEach(key => {\n const value = item[key];\n newItem[lcFirst(key)] = value;\n });\n results[pkIndexMap.get(pkStr)!] = newItem as T;\n } else {\n const newItem: Record<string, any> = {};\n Object.keys(item).forEach(key => {\n const value = item[key];\n newItem[snake(lcFirst(key))] = value;\n });\n results[pkIndexMap.get(pkStr)!] = newItem as T;\n }\n });\n }\n\n this.logger.debug('DynamoDB getMany completed', { tableKey, requestedCount: primaryKeys.length, returnedCount: results.filter(item => item !== null).length });\n return results;\n }\n\n async find<T>(\n tableKey: string,\n keyCondition:\n | DynamoDBExpression\n | [string | number | Buffer]\n | [\n string | number | Buffer,\n (\n | string\n | number\n | Buffer\n | ['BETWEEN', [string | number | Buffer, string | number | Buffer]]\n ),\n ]\n | [\n string | number | Buffer,\n string | number | Buffer | ['begins_with', string],\n ],\n filter: DynamoDBExpression | null = null,\n opts: DynamoDBFindOptions = {},\n camelOrSnake: 'camel' | 'snake' = 'camel',\n ) {\n const table = this.options.tables.get(tableKey);\n if (!table) {\n throw new Error(`Table ${tableKey} not configured`);\n }\n\n if (opts.limit !== undefined && (!Number.isInteger(opts.limit) || opts.limit <= 0)) throw new Error('Limit must be a positive integer');\n let indexInUse: 'GSI' | 'LSI' | null = null;\n let indexToScan: DynamoDBLSIConfig | DynamoDBGSIConfig | null = null;\n // Check the index existence and determine the index type if index name is provided\n if (opts.indexToScan !== undefined) {\n indexToScan =\n table.globalSecondaryIndexes?.find(\n gsi => gsi.indexName === opts.indexToScan,\n ) ||\n table.localSecondaryIndexes?.find(\n lsi => lsi.indexName === opts.indexToScan,\n ) ||\n null;\n if (!indexToScan) {\n throw new Error(\n `Index ${opts.indexToScan} not found in table ${tableKey}`,\n );\n }\n\n // Only GSI has partitionKey attribute\n if (indexToScan.hasOwnProperty('partitionKey')) {\n indexInUse = 'GSI';\n } else {\n indexInUse = 'LSI';\n }\n }\n let keyConditionExp: DynamoDBExpression | null = null;\n if (Array.isArray(keyCondition)) {\n if (!keyCondition.length || keyCondition.length > 2) {\n throw new Error('Invalid key condition array length');\n }\n\n switch (indexInUse) {\n case 'LSI':\n if (keyCondition.length !== 2) {\n throw new Error(\n 'For LSI, key condition must include both partition key and sort key conditions',\n );\n }\n break;\n case 'GSI':\n if (\n keyCondition.length === 2 &&\n (indexToScan as DynamoDBGSIConfig).sortKey === undefined\n ) {\n throw new Error(\n 'For GSI without sort key, key condition must only include partition key condition',\n );\n }\n break;\n case null:\n if (keyCondition.length === 2 && table.sortKey === undefined) {\n throw new Error(\n 'For table without sort key, key condition must only include partition key condition',\n );\n }\n break;\n }\n\n // If using LSI or no index, the partition key condition expression should be on the table partition key. If using GSI, the partition key condition expression should be on the GSI partition key\n const partitionKeyKeyConditionExpression: DynamoDBExpression = Equal(\n indexInUse === 'LSI' || indexInUse === null\n ? table.partitionKey\n : (indexToScan as DynamoDBGSIConfig).partitionKey,\n keyCondition[0],\n );\n\n if (keyCondition.length === 2) {\n let sortKeyKeyConditionExpression: DynamoDBExpression;\n if (Array.isArray(keyCondition[1])) {\n switch (keyCondition[1][0]) {\n case 'BETWEEN':\n sortKeyKeyConditionExpression = Between(\n indexInUse === null\n ? table.sortKey!\n : indexInUse === 'LSI'\n ? (indexToScan as DynamoDBLSIConfig).sortKey\n : (indexToScan as DynamoDBGSIConfig).sortKey!,\n keyCondition[1][1][0],\n keyCondition[1][1][1],\n );\n break;\n case 'begins_with':\n sortKeyKeyConditionExpression = BeginsWith(\n indexInUse === null\n ? table.sortKey!\n : indexInUse === 'LSI'\n ? (indexToScan as DynamoDBLSIConfig).sortKey\n : (indexToScan as DynamoDBGSIConfig).sortKey!,\n keyCondition[1][1],\n );\n break;\n default:\n throw new Error('Invalid sort key condition');\n }\n } else {\n sortKeyKeyConditionExpression = Equal(\n indexInUse === null\n ? table.sortKey!\n : indexInUse === 'LSI'\n ? (indexToScan as DynamoDBLSIConfig).sortKey\n : (indexToScan as DynamoDBGSIConfig).sortKey!,\n keyCondition[1],\n );\n }\n\n keyConditionExp = And(\n partitionKeyKeyConditionExpression,\n sortKeyKeyConditionExpression,\n );\n } else {\n keyConditionExp = partitionKeyKeyConditionExpression;\n }\n } else if (keyCondition instanceof DynamoDBExpression) {\n keyConditionExp = keyCondition;\n } else {\n throw new Error('Invalid key condition');\n }\n\n const expressionAttributeNameMap = new Map(keyConditionExp.expressionAttributeNameMap);\n const expressionAttributeValueMap = new Map(keyConditionExp.expressionAttributeValueMap);\n const KeyConditionExpression = keyConditionExp.expression;\n\n let FilterExpression: string = '';\n if (filter) {\n filter.expressionAttributeNameMap.forEach((value, key) => {\n key = key.replace('#attr', `#filter_attr`);\n expressionAttributeNameMap.set(key, value);\n });\n if (filter.expressionAttributeValueMap) {\n filter.expressionAttributeValueMap.forEach((value, key) => {\n key = key.replace(':val', `:filter_val`);\n expressionAttributeValueMap!.set(key, value); // partitionKeyKeyConditionExpression decides the attribute value map is not null\n });\n }\n\n FilterExpression = filter.expression\n .replace(/#attr/g, `#filter_attr`)\n .replace(/:val/g, `:filter_val`);\n }\n\n let optIncludeTimeToLive: boolean = false;\n let optIncludePartitionKey: boolean = true;\n let optIncludeSortKey: boolean = true;\n let ProjectionExpression: string = '';\n let ExpressionAttributeNames: Record<string, string> | null = null;\n let ExpressionAttributeValues: Record<string, any> | null = null;\n const now = getUnixTime(new Date());\n\n if (opts.projectionFields) {\n const projectionFields = [...new Set(opts.projectionFields.map(field => field.includes('.') || field.includes('[') ? field : ucFirst(camel(field))))];\n optIncludeTimeToLive =\n table.timeToLiveAttribute !== undefined &&\n projectionFields.includes(table.timeToLiveAttribute);\n if (table.timeToLiveAttribute !== undefined && !optIncludeTimeToLive) {\n projectionFields.push(table.timeToLiveAttribute);\n }\n\n if (indexInUse !== null) {\n for (const key of [table.partitionKey, table.sortKey]) {\n if (key && !projectionFields.includes(key)) projectionFields.push(key);\n }\n }\n // Validate the projection fields with the index in use if any\n // If the table has time to live attribute, personally insist to include that attribute in GSI or LSI projection.\n switch (indexInUse) {\n case 'LSI':\n let hasFieldNotInsideLSIProjection: boolean = false;\n if (\n (indexToScan as DynamoDBLSIConfig).projectionType === 'KEYS_ONLY'\n ) {\n hasFieldNotInsideLSIProjection =\n diff(projectionFields, [\n table.partitionKey,\n (indexToScan as DynamoDBLSIConfig).sortKey,\n ]).length > 0;\n } else if (\n (indexToScan as DynamoDBLSIConfig).projectionType === 'INCLUDE'\n ) {\n hasFieldNotInsideLSIProjection =\n diff(projectionFields, [\n table.partitionKey,\n (indexToScan as DynamoDBLSIConfig).sortKey,\n ...(indexToScan as DynamoDBLSIConfig).nonKeyAttributes!,\n ]).length > 0;\n }\n if (hasFieldNotInsideLSIProjection) {\n this.logger.warn(\n 'Some of the projection fields are not included in the LSI projection, which may cause additional read cost',\n {\n tableKey,\n indexName: (indexToScan as DynamoDBLSIConfig).indexName,\n projectionType: (indexToScan as DynamoDBLSIConfig)\n .projectionType,\n },\n );\n }\n break;\n case 'GSI':\n let hasFieldNotInsideGSIProjection: boolean = false;\n if (\n (indexToScan as DynamoDBGSIConfig).projectionType === 'KEYS_ONLY'\n ) {\n hasFieldNotInsideGSIProjection =\n diff(projectionFields, [\n table.partitionKey,\n ...(table.sortKey ? [table.sortKey] : []),\n (indexToScan as DynamoDBGSIConfig).partitionKey,\n ...((indexToScan as DynamoDBGSIConfig).sortKey !== undefined\n ? [(indexToScan as DynamoDBGSIConfig).sortKey]\n : []),\n ]).length > 0;\n } else if (\n (indexToScan as DynamoDBGSIConfig).projectionType === 'INCLUDE'\n ) {\n hasFieldNotInsideGSIProjection =\n diff(projectionFields, [\n table.partitionKey,\n ...(table.sortKey ? [table.sortKey] : []),\n (indexToScan as DynamoDBGSIConfig).partitionKey,\n ...((indexToScan as DynamoDBGSIConfig).sortKey !== undefined\n ? [(indexToScan as DynamoDBGSIConfig).sortKey]\n : []),\n ...(indexToScan as DynamoDBGSIConfig).nonKeyAttributes!,\n ]).length > 0;\n }\n if (hasFieldNotInsideGSIProjection) {\n this.logger.error(\n 'Some of the projection fields are not included in the GSI projection, so the query cannot be executed',\n {\n tableKey,\n indexName: (indexToScan as DynamoDBGSIConfig).indexName,\n projectionType: (indexToScan as DynamoDBGSIConfig)\n .projectionType,\n },\n );\n throw new Error(\n 'All projection fields must be included in the GSI projection',\n );\n }\n break;\n }\n // To help parse the response by item, include the primary key values for the items in your request in the ProjectionExpression parameter.\n optIncludePartitionKey = projectionFields.includes(\n indexInUse === null\n ? table.partitionKey\n : indexInUse === 'LSI'\n ? table.partitionKey\n : (indexToScan as DynamoDBGSIConfig).partitionKey,\n );\n if (!optIncludePartitionKey) {\n projectionFields.push(\n indexInUse === null\n ? table.partitionKey\n : indexInUse === 'LSI'\n ? table.partitionKey\n : (indexToScan as DynamoDBGSIConfig).partitionKey,\n );\n }\n optIncludeSortKey =\n (indexInUse === null &&\n table.sortKey !== undefined &&\n projectionFields.includes(table.sortKey)) ||\n (indexInUse === 'LSI' &&\n projectionFields.includes(\n (indexToScan as DynamoDBLSIConfig).sortKey,\n )) ||\n (indexInUse === 'GSI' &&\n (indexToScan as DynamoDBGSIConfig).sortKey !== undefined &&\n projectionFields.includes(\n (indexToScan as DynamoDBGSIConfig).sortKey!,\n ));\n if (\n indexInUse === null &&\n table.sortKey !== undefined &&\n !optIncludeSortKey\n ) {\n projectionFields.push(table.sortKey);\n } else if (indexInUse === 'LSI' && !optIncludeSortKey) {\n projectionFields.push((indexToScan as DynamoDBLSIConfig).sortKey);\n } else if (\n indexInUse === 'GSI' &&\n (indexToScan as DynamoDBGSIConfig).sortKey !== undefined &&\n !optIncludeSortKey\n ) {\n projectionFields.push((indexToScan as DynamoDBGSIConfig).sortKey!);\n }\n\n ProjectionExpression = projectionFields\n .map(field =>\n transformExpressionAttribute(\n field,\n expressionAttributeNameMap,\n '#proj_attr',\n ),\n )\n .join(', ');\n }\n\n expressionAttributeNameMap.forEach(\n (attributeName, attributeNameVariable) => {\n if (!ExpressionAttributeNames) {\n ExpressionAttributeNames = {};\n }\n ExpressionAttributeNames[attributeNameVariable] = attributeName;\n },\n );\n expressionAttributeValueMap!.forEach((value, attributeValueVariable) => {\n if (!ExpressionAttributeValues) {\n ExpressionAttributeValues = {};\n }\n ExpressionAttributeValues[attributeValueVariable] = value;\n });\n\n const numOfNeededItems = opts.limit; // May be undefined then no limit\n const result: DynamoDBFindResult<T> = {\n items: [],\n };\n\n if (opts.cursor !== undefined && !(typeof opts.cursor === 'object' && !Array.isArray(opts.cursor) && !Buffer.isBuffer(opts.cursor))) {\n // Validate cursor has correct number of elements based on context\n const needsTwoElements =\n (indexInUse === null && table.sortKey !== undefined) ||\n indexInUse === 'LSI' ||\n (indexInUse === 'GSI' &&\n (indexToScan as DynamoDBGSIConfig).sortKey !== undefined);\n if (Array.isArray(opts.cursor)) {\n if (opts.cursor.length !== 2 || !needsTwoElements) {\n throw new Error('Cursor array cannot have more than 2 elements');\n }\n } else {\n if (needsTwoElements) {\n throw new Error(\n 'Cursor array must have exactly 2 elements for composite key tables/indexes',\n );\n }\n }\n }\n\n const params: QueryCommandInput = {\n TableName: table.name,\n KeyConditionExpression,\n ...(indexToScan !== null ? { IndexName: indexToScan.indexName } : {}),\n ...(FilterExpression !== '' ? { FilterExpression } : {}),\n ...(ExpressionAttributeNames ? { ExpressionAttributeNames } : {}),\n ...(ExpressionAttributeValues ? { ExpressionAttributeValues } : {}),\n ConsistentRead:\n (opts.consistentRead ?? false) &&\n (indexInUse === null || indexInUse === 'LSI'),\n ReturnConsumedCapacity:\n opts.returnConsumedCapacity ?? ReturnConsumedCapacity.NONE,\n ...(ProjectionExpression ? { ProjectionExpression } : {}),\n ScanIndexForward: opts.ascending ?? true,\n ...(opts.cursor !== undefined\n ? {\n ExclusiveStartKey: typeof opts.cursor === 'object' && !Array.isArray(opts.cursor) && !Buffer.isBuffer(opts.cursor)\n ? opts.cursor\n : Array.isArray(opts.cursor)\n ? {\n [indexInUse === null\n ? table.partitionKey\n : indexInUse === 'LSI'\n ? table.partitionKey\n : (indexToScan as DynamoDBGSIConfig).partitionKey]:\n opts.cursor[0],\n [indexInUse === null\n ? table.sortKey!\n : indexInUse === 'LSI'\n ? (indexToScan as DynamoDBLSIConfig).sortKey\n : (indexToScan as DynamoDBGSIConfig).sortKey!]:\n opts.cursor[1],\n }\n : {\n [indexInUse === null\n ? table.partitionKey\n : indexInUse === 'LSI'\n ? table.partitionKey\n : (indexToScan as DynamoDBGSIConfig).partitionKey]:\n opts.cursor,\n },\n }\n : {}),\n };\n\n while (true) {\n this.logger.debug('DynamoDB query page requested', { tableKey, hasCursor: !!params.ExclusiveStartKey, hasFilter: !!params.FilterExpression });\n const { Items, LastEvaluatedKey } = await this.ddbDocClient\n .send(new QueryCommand(params))\n .catch((e: Error) => {\n if (e.name === 'ValidationException') {\n this.logger.error('The request parameters are invalid', { errorName: e.name, tableKey });\n throw new DynamoDBError(400, {\n message: 'Invalid request parameters',\n cause: e,\n });\n }\n this.logger.error('Failed to query items', { errorName: e.name, tableKey });\n throw new DynamoDBError(500, {\n message: 'Failed to query items',\n cause: e,\n });\n });\n\n this.logger.debug('DynamoDB query page received', { tableKey, itemCount: Items?.length ?? 0, hasMore: !!LastEvaluatedKey });\n if (LastEvaluatedKey) {\n params.ExclusiveStartKey = LastEvaluatedKey;\n }\n\n // Filter expired items\n let hasRemainsInCurrentBatch = false;\n Items?.forEach(item => {\n if (\n item &&\n table.timeToLiveAttribute &&\n item[table.timeToLiveAttribute] !== undefined\n ) {\n if (item[table.timeToLiveAttribute] <= now) {\n return;\n }\n // Delete the time to live attribute from the item if not requested\n if (optIncludeTimeToLive === false) {\n delete item[table.timeToLiveAttribute];\n }\n }\n\n // After filtering, check if any remaining item in the current batch when reaching the limit\n if (numOfNeededItems && result.items.length === numOfNeededItems) {\n hasRemainsInCurrentBatch = true;\n return;\n }\n\n if (numOfNeededItems && result.items.length + 1 === numOfNeededItems) {\n // The last item to reach the limit\n // Set the cursor to the last item for next query\n if (indexInUse === null) {\n result.cursor =\n table.sortKey !== undefined\n ? [item[table.partitionKey], item[table.sortKey]]\n : item[table.partitionKey];\n } else {\n result.cursor = Object.fromEntries(\n [table.partitionKey, table.sortKey, (indexToScan as DynamoDBGSIConfig).partitionKey, indexToScan!.sortKey]\n .filter((key): key is string => key !== undefined)\n .map(key => [key, item[key]]),\n );\n }\n }\n\n if (optIncludePartitionKey === false) {\n // Delete the primary key values from the item if not requested\n switch (indexInUse) {\n case null:\n delete item[table.partitionKey];\n break;\n case 'LSI':\n delete item[table.partitionKey];\n break;\n case 'GSI':\n delete item[(indexToScan as DynamoDBGSIConfig).partitionKey];\n break;\n }\n }\n if (optIncludeSortKey === false) {\n // Delete the sort key value from the item if not requested\n switch (indexInUse) {\n case null:\n if (table.sortKey !== undefined) {\n delete item[table.sortKey];\n }\n break;\n case 'LSI':\n delete item[(indexToScan as DynamoDBLSIConfig).sortKey];\n break;\n case 'GSI':\n if ((indexToScan as DynamoDBGSIConfig).sortKey !== undefined) {\n delete item[(indexToScan as DynamoDBGSIConfig).sortKey!];\n }\n break;\n }\n }\n\n if (indexInUse !== null && opts.projectionFields) {\n for (const key of [table.partitionKey, table.sortKey]) {\n if (key && !opts.projectionFields.some(field => ucFirst(camel(field)) === key)) delete item[key];\n }\n }\n // Convert keys back to camelCase if camelOrSnake is 'camel' or to snake_case if camelOrSnake is 'snake'\n if (camelOrSnake === 'camel') {\n const newItem: Record<string, any> = {};\n Object.keys(item).forEach(key => {\n const value = item[key];\n newItem[lcFirst(key)] = value;\n });\n result.items.push(newItem as T);\n } else {\n const newItem: Record<string, any> = {};\n Object.keys(item).forEach(key => {\n const value = item[key];\n newItem[snake(lcFirst(key))] = value;\n });\n result.items.push(newItem as T);\n }\n });\n\n if (numOfNeededItems && result.items.length === numOfNeededItems) {\n if (!hasRemainsInCurrentBatch && !LastEvaluatedKey) {\n delete result.cursor; // No more items for next query and also no remains in the last batch\n }\n break;\n } else if (!LastEvaluatedKey) {\n if (!hasRemainsInCurrentBatch) {\n delete result.cursor; // No more items for next query and also no remains in the last batch\n }\n break;\n }\n }\n\n return result;\n }\n\n async createOne(\n tableKey: string,\n primaryKey:\n | string\n | number\n | Buffer\n | [string | number | Buffer, string | number | Buffer],\n item: Record<string, any>,\n opts: DynamoDBCreateOptions = {},\n camelOrSnake: 'camel' | 'snake' = 'camel',\n ): Promise<DynamoDBCreateOneResult> {\n const table = this.options.tables.get(tableKey);\n if (!table) {\n throw new Error(`Table ${tableKey} not configured`);\n }\n const normalizedItem: Record<string, any> = {};\n Object.keys(item).forEach(key => {\n normalizedItem[ucFirst(camel(key))] = item[key];\n });\n\n if (table.sortKey) {\n if (!Array.isArray(primaryKey) || primaryKey.length !== 2) throw new Error('Composite primary key requires two values');\n normalizedItem[table.partitionKey] = primaryKey[0];\n normalizedItem[table.sortKey] = primaryKey[1];\n } else {\n normalizedItem[table.partitionKey] = primaryKey;\n }\n\n const now = getUnixTime(new Date());\n if (table.timeToLiveAttribute && opts.ttl && opts.ttl > 0) {\n normalizedItem[table.timeToLiveAttribute] = now + opts.ttl;\n }\n\n let ConditionExpression: string = '';\n let ExpressionAttributeNames: Record<string, string> | null = null;\n if (opts.onConflict === 'ignore') {\n const expression = table.sortKey\n ? And(\n AttributeNotExists(table.partitionKey),\n AttributeNotExists(table.sortKey),\n )\n : AttributeNotExists(table.partitionKey);\n ConditionExpression = expression.expression;\n expression.expressionAttributeNameMap.forEach((value, key) => {\n if (!ExpressionAttributeNames) {\n ExpressionAttributeNames = {};\n }\n ExpressionAttributeNames[key] = value;\n });\n }\n\n this.logger.debug('DynamoDB request started', { operation: 'createOne', tableKey });\n const putCommand = new PutCommand({\n TableName: table.name,\n Item: normalizedItem,\n ...(ConditionExpression !== '' ? { ConditionExpression } : {}),\n ...(ExpressionAttributeNames !== null\n ? { ExpressionAttributeNames }\n : {}),\n ReturnConsumedCapacity:\n opts.returnConsumedCapacity ?? ReturnConsumedCapacity.NONE,\n ReturnValues: opts.onConflict === 'ignore' ? 'NONE' : 'ALL_OLD',\n });\n\n const result: DynamoDBCreateOneResult = {\n created: true,\n };\n\n try {\n const { Attributes: replacedItem } =\n await this.ddbDocClient.send(putCommand);\n\n if (\n table.timeToLiveAttribute &&\n normalizedItem[table.timeToLiveAttribute]\n ) {\n result.expiresAt = normalizedItem[table.timeToLiveAttribute];\n }\n\n if (opts.onConflict !== 'ignore' && replacedItem !== undefined) {\n // Only not expired item will be considered as replaced item\n if (\n !(\n table.timeToLiveAttribute &&\n replacedItem[table.timeToLiveAttribute] &&\n replacedItem[table.timeToLiveAttribute] <= now\n )\n ) {\n result.created = false;\n if (table.timeToLiveAttribute) {\n delete replacedItem[table.timeToLiveAttribute]; // Delete the time to live attribute from the item\n }\n // Convert keys back to camelCase if camelOrSnake is 'camel' or to snake_case if camelOrSnake is 'snake'\n if (camelOrSnake === 'camel') {\n const newItem: Record<string, any> = {};\n Object.keys(replacedItem).forEach(key => {\n const value = replacedItem[key];\n newItem[lcFirst(key)] = value;\n });\n result.replacedItem = newItem as Record<string, any>;\n } else {\n const newItem: Record<string, any> = {};\n Object.keys(replacedItem).forEach(key => {\n const value = replacedItem[key];\n newItem[snake(lcFirst(key))] = value;\n });\n result.replacedItem = newItem as Record<string, any>;\n }\n }\n }\n } catch (e: any) {\n const error = e as Error;\n if (\n error.name === 'ConditionalCheckFailedException' &&\n opts.onConflict === 'ignore'\n ) {\n this.logger.debug('DynamoDB create skipped: item already exists', { tableKey });\n result.created = false;\n } else {\n this.logger.error('Failed to create item', { errorName: error.name, tableKey });\n throw new DynamoDBError(500, {\n message: 'Failed to create item',\n cause: error,\n });\n }\n }\n\n this.logger.debug('DynamoDB createOne completed', { tableKey, created: result.created });\n return result;\n }\n\n async createMany(\n tableKey: string,\n primaryKeys: (\n | string\n | number\n | Buffer\n | [string | number | Buffer, string | number | Buffer]\n )[],\n items: Record<string, any>[],\n opts: Omit<DynamoDBCreateOptions, 'onConflict'> = {},\n ): Promise<DynamoDBCreateManyResult> {\n const table = this.options.tables.get(tableKey);\n if (!table) {\n throw new Error(`Table ${tableKey} not configured`);\n }\n\n if (items.length === 0 || primaryKeys.length === 0) {\n throw new Error('No items to create');\n }\n\n if (primaryKeys.length !== items.length) {\n throw new Error('Primary keys and items length mismatch');\n }\n\n const now = getUnixTime(new Date());\n const normalizedItems = items.map((item, indx) => {\n const normalizedItem: Record<string, any> = {};\n Object.keys(item).forEach(key => {\n normalizedItem[ucFirst(camel(key))] = item[key];\n });\n\n const primaryKey = primaryKeys[indx];\n if (table.sortKey) {\n if (!Array.isArray(primaryKey) || primaryKey.length !== 2) throw new Error('Composite primary key requires two values');\n normalizedItem[table.partitionKey] = primaryKey![0];\n normalizedItem[table.sortKey] = primaryKey![1];\n } else {\n normalizedItem[table.partitionKey] = primaryKey;\n }\n\n if (table.timeToLiveAttribute && opts.ttl && opts.ttl > 0) {\n normalizedItem[table.timeToLiveAttribute] = now + opts.ttl;\n }\n\n return normalizedItem;\n });\n\n const result: DynamoDBCreateManyResult = {\n numberOfItems: normalizedItems.length,\n };\n\n if (\n table.timeToLiveAttribute &&\n normalizedItems[0][table.timeToLiveAttribute]\n ) {\n result.expiresAt = normalizedItems[0][table.timeToLiveAttribute];\n }\n\n let unprocessedAttempt = 0;\n while (normalizedItems.length > 0) {\n const batch = normalizedItems.splice(0, 25);\n\n this.logger.debug('DynamoDB batch request started', { operation: 'createMany', tableKey, itemCount: batch.length });\n const batchWriteCommand = new BatchWriteCommand({\n RequestItems: {\n [table.name]: batch.map(item => ({\n PutRequest: {\n Item: item,\n },\n })),\n },\n ReturnConsumedCapacity:\n opts.returnConsumedCapacity ?? ReturnConsumedCapacity.NONE,\n });\n\n const { UnprocessedItems } = await this.ddbDocClient\n .send(batchWriteCommand)\n .catch((e: Error) => {\n this.logger.error('Failed to create items', { errorName: e.name, tableKey });\n throw new DynamoDBError(500, {\n message: 'Failed to create items',\n cause: e,\n });\n });\n\n const unprocessedItems = UnprocessedItems?.[table.name];\n if (unprocessedItems !== undefined && unprocessedItems.length > 0) {\n if (unprocessedAttempt >= MAX_UNPROCESSED_ATTEMPTS) {\n this.logger.error('DynamoDB batch retry limit reached', { operation: 'createMany', tableKey, retryCount: unprocessedAttempt });\n throw new DynamoDBError(500, {\n message: 'Failed to create items after multiple attempts',\n cause: new Error('Too many unprocessed items'),\n });\n }\n const delayMs = backoffDelayMs(unprocessedAttempt);\n this.logger.warn('DynamoDB retrying unprocessed batch items', { operation: 'createMany', tableKey, itemCount: unprocessedItems.length, attempt: unprocessedAttempt + 1, delayMs });\n await sleep(delayMs);\n unprocessedAttempt += 1;\n normalizedItems.push(\n ...(unprocessedItems\n .map(item => item.PutRequest?.Item)\n .filter(item => item !== undefined) as Record<string, any>[]),\n );\n } else {\n unprocessedAttempt = 0;\n }\n }\n\n this.logger.debug('DynamoDB createMany completed', { tableKey, itemCount: result.numberOfItems });\n return result;\n }\n\n async update<T>(\n tableKey: string,\n primaryKey:\n | string\n | number\n | Buffer\n | [string | number | Buffer, string | number | Buffer],\n commands: DynamoDBExpression[],\n condition: DynamoDBExpression | null = null,\n opts: DynamoDBUpdateOptions = {},\n camelOrSnake: 'camel' | 'snake' = 'camel',\n ): Promise<DynamoDBUpdateResult<T>> {\n const table = this.options.tables.get(tableKey);\n if (!table) {\n throw new Error(`Table ${tableKey} not configured`);\n }\n if (commands.length === 0) {\n throw new Error('No update commands provided');\n }\n\n const keys = Array.isArray(primaryKey)\n ? {\n [table.partitionKey]: primaryKey[0],\n [table.sortKey!]: primaryKey[1],\n }\n : {\n [table.partitionKey]: primaryKey,\n };\n\n commands = [...commands];\n const now = getUnixTime(new Date());\n let expiresAt: number = 0;\n if (table.timeToLiveAttribute && opts.ttl !== undefined) {\n if (opts.ttl > 0) {\n expiresAt = now + opts.ttl;\n commands.push(Assign(table.timeToLiveAttribute, expiresAt));\n } else if (opts.ttl === 0) {\n commands.push(Remove(table.timeToLiveAttribute));\n }\n }\n\n const {\n expressionAttributeNameMap,\n expressionAttributeValueMap,\n expression: UpdateExpression,\n } = createUpdateExpression(commands);\n\n let ConditionExpression: string = '';\n if (table.timeToLiveAttribute && opts.upsert === false) {\n condition = condition\n ? And(\n condition,\n Or(\n AttributeNotExists(table.timeToLiveAttribute),\n MoreThan(table.timeToLiveAttribute, now),\n ),\n )\n : Or(\n AttributeNotExists(table.timeToLiveAttribute),\n MoreThan(table.timeToLiveAttribute, now),\n );\n }\n\n if (opts.upsert === false) {\n condition = table.sortKey\n ? condition\n ? And(\n condition,\n And(\n AttributeExists(table.partitionKey),\n AttributeExists(table.sortKey),\n ),\n )\n : And(\n AttributeExists(table.partitionKey),\n AttributeExists(table.sortKey),\n )\n : condition\n ? And(condition, AttributeExists(table.partitionKey))\n : AttributeExists(table.partitionKey);\n }\n\n if (condition) {\n condition.expressionAttributeNameMap.forEach((value, key) => {\n key = key.replace('#attr', `#condition_attr`);\n expressionAttributeNameMap.set(key, value);\n });\n if (condition.expressionAttributeValueMap) {\n condition.expressionAttributeValueMap.forEach((value, key) => {\n key = key.replace(':val', `:condition_val`);\n expressionAttributeValueMap!.set(key, value); // createUpdateExpression decides the attribute value map is not null\n });\n }\n\n ConditionExpression = condition.expression\n .replace(/#attr/g, `#condition_attr`)\n .replace(/:val/g, `:condition_val`);\n }\n\n let ExpressionAttributeNames: Record<string, string> | null = null;\n let ExpressionAttributeValues: Record<string, any> | null = null;\n\n expressionAttributeNameMap.forEach(\n (attributeName, attributeNameVariable) => {\n if (!ExpressionAttributeNames) {\n ExpressionAttributeNames = {};\n }\n ExpressionAttributeNames[attributeNameVariable] = attributeName;\n },\n );\n expressionAttributeValueMap!.forEach((value, attributeValueVariable) => {\n if (!ExpressionAttributeValues) {\n ExpressionAttributeValues = {};\n }\n ExpressionAttributeValues[attributeValueVariable] = value;\n });\n\n this.logger.debug('DynamoDB request started', { operation: 'update', tableKey });\n const updateCommand = new UpdateCommand({\n TableName: table.name,\n Key: keys,\n UpdateExpression,\n ...(ConditionExpression !== '' ? { ConditionExpression } : {}),\n ...(ExpressionAttributeNames !== null\n ? { ExpressionAttributeNames }\n : {}),\n ...(ExpressionAttributeValues !== null\n ? { ExpressionAttributeValues }\n : {}),\n ReturnConsumedCapacity:\n opts.returnConsumedCapacity ?? ReturnConsumedCapacity.NONE,\n ReturnValues: opts.returnValue ?? 'NONE',\n });\n\n const result: DynamoDBUpdateResult<T> = {\n updatedOrCreated: false,\n };\n try {\n const { Attributes: updatedItem } =\n await this.ddbDocClient.send(updateCommand);\n\n if (updatedItem !== undefined) {\n result.item = updatedItem as Partial<T>;\n }\n\n if (table.timeToLiveAttribute && expiresAt !== 0) {\n result.expiresAt = expiresAt;\n if (result.item) {\n delete (result.item as Record<string, any>)[table.timeToLiveAttribute]; // Delete the time to live attribute from the item\n }\n }\n\n result.updatedOrCreated = true;\n } catch (e: any) {\n const error = e as Error;\n if (error.name === 'ValidationException') {\n this.logger.error('The request parameters are invalid', { errorName: error.name, tableKey });\n throw new DynamoDBError(400, {\n message: 'Invalid request parameters',\n cause: e,\n });\n } else if (error.name === 'ConditionalCheckFailedException') {\n this.logger.debug('DynamoDB update skipped: condition not met', { tableKey });\n } else {\n this.logger.error('Failed to update item', { errorName: error.name, tableKey });\n throw new DynamoDBError(500, {\n message: 'Failed to update item',\n cause: e,\n });\n }\n }\n\n if (result.item) {\n // Convert keys back to camelCase if camelOrSnake is 'camel' or to snake_case if camelOrSnake is 'snake'\n if (camelOrSnake === 'camel') {\n const newItem: Record<string, any> = {};\n Object.keys(result.item).forEach(key => {\n const value = (result.item as Record<string, any>)[key];\n newItem[lcFirst(key)] = value;\n });\n result.item = newItem as T;\n } else {\n const newItem: Record<string, any> = {};\n Object.keys(result.item).forEach(key => {\n const value = (result.item as Record<string, any>)[key];\n newItem[snake(lcFirst(key))] = value;\n });\n result.item = newItem as T;\n }\n }\n\n this.logger.debug('DynamoDB update completed', { tableKey, updatedOrCreated: result.updatedOrCreated });\n return result;\n }\n\n async deleteOne<T>(\n tableKey: string,\n primaryKey:\n | string\n | number\n | Buffer\n | [string | number | Buffer, string | number | Buffer],\n condition: DynamoDBExpression | null = null,\n opts: DynamoDBDeleteOptions = {},\n camelOrSnake: 'camel' | 'snake' = 'camel',\n ): Promise<DynamoDBDeleteOneResult<T>> {\n const table = this.options.tables.get(tableKey);\n if (!table) {\n throw new Error(`Table ${tableKey} not configured`);\n }\n\n const keys = Array.isArray(primaryKey)\n ? {\n [table.partitionKey]: primaryKey[0],\n [table.sortKey!]: primaryKey[1],\n }\n : {\n [table.partitionKey]: primaryKey,\n };\n\n let ConditionExpression: string = '';\n let ExpressionAttributeNames: Record<string, string> | null = null;\n let ExpressionAttributeValues: Record<string, any> | null = null;\n\n if (condition) {\n condition.expressionAttributeNameMap.forEach(\n (attributeName, attributeNameVariable) => {\n if (!ExpressionAttributeNames) {\n ExpressionAttributeNames = {};\n }\n ExpressionAttributeNames[attributeNameVariable] = attributeName;\n },\n );\n if (condition.expressionAttributeValueMap) {\n condition.expressionAttributeValueMap.forEach(\n (value, attributeValueVariable) => {\n if (!ExpressionAttributeValues) {\n ExpressionAttributeValues = {};\n }\n ExpressionAttributeValues[attributeValueVariable] = value;\n },\n );\n }\n ConditionExpression = condition.expression;\n }\n\n this.logger.debug('DynamoDB request started', { operation: 'deleteOne', tableKey });\n const deleteCommand = new DeleteCommand({\n TableName: table.name,\n Key: keys,\n ...(ConditionExpression !== '' ? { ConditionExpression } : {}),\n ...(ExpressionAttributeNames !== null\n ? { ExpressionAttributeNames }\n : {}),\n ...(ExpressionAttributeValues !== null\n ? { ExpressionAttributeValues }\n : {}),\n ReturnConsumedCapacity:\n opts.returnConsumedCapacity ?? ReturnConsumedCapacity.NONE,\n ReturnValues: opts.returnValue ?? 'NONE',\n });\n\n const result: DynamoDBDeleteOneResult<T> = {\n deleted: false,\n };\n\n try {\n const { Attributes: deletedItem } =\n await this.ddbDocClient.send(deleteCommand);\n result.deleted = true;\n\n if (deletedItem !== undefined) {\n result.deleted = true;\n result.item = deletedItem as T;\n }\n } catch (e: any) {\n const error = e as Error;\n if (error.name === 'ValidationException') {\n this.logger.error('The request parameters are invalid', { errorName: error.name, tableKey });\n throw new DynamoDBError(400, {\n message: 'Invalid request parameters',\n cause: e,\n });\n } else if (error.name === 'ConditionalCheckFailedException') {\n this.logger.debug('DynamoDB delete skipped: condition not met', { tableKey });\n } else {\n this.logger.error('Failed to delete item', { errorName: error.name, tableKey });\n throw new DynamoDBError(500, {\n message: 'Failed to delete item',\n cause: e,\n });\n }\n }\n\n if (result.item) {\n // Convert keys back to camelCase if camelOrSnake is 'camel' or to snake_case if camelOrSnake is 'snake'\n if (camelOrSnake === 'camel') {\n const newItem: Record<string, any> = {};\n Object.keys(result.item).forEach(key => {\n const value = (result.item as Record<string, any>)[key];\n newItem[lcFirst(key)] = value;\n });\n result.item = newItem as T;\n } else {\n const newItem: Record<string, any> = {};\n Object.keys(result.item).forEach(key => {\n const value = (result.item as Record<string, any>)[key];\n newItem[snake(lcFirst(key))] = value;\n });\n result.item = newItem as T;\n }\n }\n\n this.logger.debug('DynamoDB deleteOne completed', { tableKey, deleted: result.deleted });\n return result;\n }\n\n async deleteMany(\n tableKey: string,\n primaryKeys: (\n | string\n | number\n | Buffer\n | [string | number | Buffer, string | number | Buffer]\n )[],\n opts: Omit<DynamoDBDeleteOptions, 'returnValue'> = {},\n ): Promise<DynamoDBDeleteManyResult> {\n const table = this.options.tables.get(tableKey);\n if (!table) {\n throw new Error(`Table ${tableKey} not configured`);\n }\n\n const keys = primaryKeys.map(primaryKey => {\n const isArrayOfKeys = Array.isArray(primaryKey);\n\n return isArrayOfKeys\n ? {\n [table.partitionKey]: primaryKey[0],\n [table.sortKey!]: primaryKey[1],\n }\n : {\n [table.partitionKey]: primaryKey,\n };\n });\n\n const result: DynamoDBDeleteManyResult = {\n numberOfItems: primaryKeys.length,\n };\n\n let unprocessedAttempt = 0;\n while (keys.length > 0) {\n const batch = keys.splice(0, 25);\n\n this.logger.debug('DynamoDB batch request started', { operation: 'deleteMany', tableKey, itemCount: batch.length });\n const batchWriteCommand = new BatchWriteCommand({\n RequestItems: {\n [table.name]: batch.map(key => ({\n DeleteRequest: {\n Key: key,\n },\n })),\n },\n ReturnConsumedCapacity:\n opts.returnConsumedCapacity ?? ReturnConsumedCapacity.NONE,\n });\n\n const { UnprocessedItems } = await this.ddbDocClient\n .send(batchWriteCommand)\n .catch((e: Error) => {\n this.logger.error('Failed to delete items', { errorName: e.name, tableKey });\n throw new DynamoDBError(500, {\n message: 'Failed to delete items',\n cause: e,\n });\n });\n\n const unprocessedItems = UnprocessedItems?.[table.name];\n if (unprocessedItems !== undefined && unprocessedItems.length > 0) {\n if (unprocessedAttempt >= MAX_UNPROCESSED_ATTEMPTS) {\n this.logger.error('DynamoDB batch retry limit reached', { operation: 'deleteMany', tableKey, retryCount: unprocessedAttempt });\n throw new DynamoDBError(500, {\n message: 'Failed to delete items after multiple attempts',\n cause: new Error('Too many unprocessed items'),\n });\n }\n const delayMs = backoffDelayMs(unprocessedAttempt);\n this.logger.warn('DynamoDB retrying unprocessed batch items', { operation: 'deleteMany', tableKey, itemCount: unprocessedItems.length, attempt: unprocessedAttempt + 1, delayMs });\n await sleep(delayMs);\n unprocessedAttempt += 1;\n keys.push(\n ...(unprocessedItems\n .map(item => item.DeleteRequest?.Key)\n .filter(key => key !== undefined) as Record<string, any>[]),\n );\n } else {\n unprocessedAttempt = 0;\n }\n }\n\n this.logger.debug('DynamoDB deleteMany completed', { tableKey, itemCount: result.numberOfItems });\n return result;\n }\n\n transaction(opts: DynamoDBTransactionOptions) {\n const { mode, now, returnConsumedCapacity } = opts;\n return new DynamoDBTransaction(\n mode,\n this.ddbDocClient,\n this.options.tables,\n this.options.txRetryLimit ?? 3,\n this.options.txRetryDelay ?? 50,\n this.logger,\n now ?? getUnixTime(new Date()),\n returnConsumedCapacity ?? ReturnConsumedCapacity.NONE,\n );\n }\n}\n\nexport { DynamoDBService };\n"]}
|