@baselinejs/dynamodb
Version:
DynamoDB library for simple and optimized way to use AWS DynamoDB
1 lines • 39.9 kB
Source Map (JSON)
{"version":3,"sources":["../src/index.ts","../src/utils/utils.ts"],"sourcesContent":["import {\n AttributeValue,\n DynamoDB,\n DynamoDBClientConfig,\n} from '@aws-sdk/client-dynamodb';\nimport {\n BatchWriteCommandInput,\n BatchGetCommandInput,\n DeleteCommandInput,\n DynamoDBDocument,\n GetCommandInput,\n PutCommandInput,\n QueryCommandInput,\n ScanCommandInput,\n UpdateCommandInput,\n} from '@aws-sdk/lib-dynamodb';\nimport {\n NativeAttributeValue,\n marshall,\n marshallOptions,\n unmarshall,\n unmarshallOptions,\n} from '@aws-sdk/util-dynamodb';\nimport {\n sleep,\n buildConditionExpression,\n decorrelatedJitterBackoff,\n ConditionExpressionArgs,\n ConditionExpressionQueryArgs,\n} from './utils/utils';\n\n// Re export useful util types\nexport { type ConditionExpressionArgs, type ConditionExpressionQueryArgs };\nexport type DynamoClientConfig = DynamoDBClientConfig & { region: string };\n\n/**\n * Provided to get around conflicting versions of DynamoDBDocument from @aws-sdk/lib-dynamodb\n */\nexport type DynamoDbDocumentClient = DynamoDBDocument;\n\nconst IS_OFFLINE = process.env.IS_OFFLINE;\nconst FORCE_ONLINE = process.env.FORCE_ONLINE;\n\n/**\n * Creates a DynamoDBDocument connection.\n *\n * Must specify a region.\n *\n * Uses a local connection if IS_OFFLINE is set to \"true\" and FORCE_ONLINE is not set to \"true\".\n */\nexport function getDynamodbConnection(\n config: DynamoClientConfig,\n): DynamoDbDocumentClient {\n let newConnection: DynamoDbDocumentClient;\n if (IS_OFFLINE === 'true' && FORCE_ONLINE !== 'true') {\n newConnection = DynamoDBDocument.from(\n new DynamoDB({\n region: 'localhost',\n endpoint: 'http://localhost:8000',\n }),\n );\n } else {\n newConnection = DynamoDBDocument.from(new DynamoDB(config));\n }\n return newConnection;\n}\n\nexport interface PutItemParams<T extends Record<string, NativeAttributeValue>> {\n dynamoDb: DynamoDbDocumentClient;\n table: string;\n item: T;\n /**\n * Array of conditions to apply to the create.\n * Conditions are combined with AND.\n */\n conditions?: ConditionExpressionArgs[];\n}\n\n/**\n * Create a new item.\n */\nexport const putItem = async <T extends Record<string, NativeAttributeValue>>(\n params: PutItemParams<T>,\n): Promise<T> => {\n const dynamoDb = params.dynamoDb;\n\n const putItemInput: PutCommandInput = {\n TableName: params.table,\n Item: params.item,\n ReturnValuesOnConditionCheckFailure: 'ALL_OLD',\n };\n\n const conditionalData = buildConditionExpression(params.conditions);\n if (conditionalData?.attributeNames) {\n putItemInput.ExpressionAttributeNames = conditionalData.attributeNames;\n }\n\n if (conditionalData?.attributeValues) {\n putItemInput.ExpressionAttributeValues = conditionalData.attributeValues;\n }\n\n if (conditionalData?.conditionExpression) {\n putItemInput.ConditionExpression = conditionalData.conditionExpression;\n }\n\n await dynamoDb.put(putItemInput);\n return params.item;\n};\n\ninterface UpdateItem {\n name: string;\n attributeName: string;\n attributeValue: NativeAttributeValue;\n ref: string;\n}\n\nexport interface UpdateItemParams<\n T extends Record<string, NativeAttributeValue>,\n> {\n dynamoDb: DynamoDbDocumentClient;\n table: string;\n key: Record<string, NativeAttributeValue>;\n /**\n * Record of fields to update.\n * Attributes from the \"key\" will be automatically removed from fields to prevent \"This attribute is part of the key\" errors.\n */\n fields?: Partial<Record<keyof T, NativeAttributeValue>>;\n /**\n * Array of attributes to remove from the item.\n */\n removeFields?: Extract<keyof T, string>[];\n /**\n * Array of conditions to apply to the update.\n * Conditions are combined with AND.\n */\n conditions?: ConditionExpressionArgs[];\n}\n\n/**\n * Update attributes on an item.\n *\n * Specify \"fields\" for the attributes to update.\n *\n * Specify \"removeFields\" for the attributes to remove from the item.\n *\n * Either \"fields\", \"removeFields\" or both must be specified.\n */\nexport const updateItem = async <\n T extends Record<string, NativeAttributeValue>,\n>(\n params: UpdateItemParams<T>,\n): Promise<T> => {\n const updateItems: UpdateItem[] = [];\n\n let count = 0;\n\n const keyNames = Object.keys(params.key);\n for (const element in params.fields) {\n const attributeValue = params.fields[element];\n if (attributeValue !== undefined && !keyNames.includes(element)) {\n updateItems.push({\n name: element,\n attributeName: `#attr${count}`,\n attributeValue,\n ref: `:attr${count}`,\n });\n count++;\n }\n }\n\n const removeAttributeItems: { name: keyof T; attributeName: string }[] = [];\n for (const field of params.removeFields || []) {\n if (field !== undefined && !keyNames.includes(field)) {\n removeAttributeItems.push({\n name: field,\n attributeName: `#attr${count}`,\n });\n count++;\n }\n }\n\n if (!updateItems.length && !removeAttributeItems.length) {\n throw new Error('No fields or removeFields provided to updateItem');\n }\n\n let updateExpression = '';\n if (updateItems.length) {\n updateExpression =\n 'SET ' + updateItems.map((i) => `${i.attributeName}=${i.ref}`).join(', ');\n }\n\n if (removeAttributeItems.length) {\n updateExpression +=\n (updateExpression.length > 1 ? ' REMOVE ' : 'REMOVE') +\n removeAttributeItems.map((i) => i.attributeName).join(', ');\n }\n\n const expressionAttributeValues = updateItems.reduce(\n (p, c: UpdateItem) => {\n p[`${c.ref}`] = c.attributeValue;\n return p;\n },\n {} as Record<string, NativeAttributeValue>,\n );\n\n const expressionAttributeNames = [\n ...updateItems,\n ...removeAttributeItems,\n ].reduce(\n (p, c) => {\n p[`${c.attributeName}`] = c.name;\n return p;\n },\n {} as Record<string, NativeAttributeValue>,\n );\n\n const updateItemInput: UpdateCommandInput = {\n TableName: params.table || '',\n Key: params.key,\n UpdateExpression: updateExpression,\n ReturnValues: 'ALL_NEW',\n ExpressionAttributeNames: expressionAttributeNames,\n ExpressionAttributeValues: expressionAttributeValues,\n ReturnValuesOnConditionCheckFailure: 'ALL_OLD',\n };\n\n const conditionalData = buildConditionExpression(params.conditions);\n if (conditionalData?.attributeNames) {\n updateItemInput.ExpressionAttributeNames = {\n ...updateItemInput.ExpressionAttributeNames,\n ...conditionalData.attributeNames,\n };\n }\n\n if (conditionalData?.attributeValues) {\n updateItemInput.ExpressionAttributeValues = {\n ...updateItemInput.ExpressionAttributeValues,\n ...conditionalData.attributeValues,\n };\n }\n\n if (conditionalData?.conditionExpression) {\n updateItemInput.ConditionExpression = conditionalData.conditionExpression;\n }\n\n const result = await params.dynamoDb.update(updateItemInput);\n return result.Attributes as T;\n};\n\nexport interface DeleteItemParams {\n dynamoDb: DynamoDbDocumentClient;\n table: string;\n key: Record<string, NativeAttributeValue>;\n /**\n * Array of conditions to apply to the delete.\n * Conditions are combined with AND.\n */\n conditions?: ConditionExpressionArgs[];\n}\n\nexport const deleteItem = async (\n params: DeleteItemParams,\n): Promise<boolean> => {\n const deleteInput: DeleteCommandInput = {\n TableName: `${params.table}`,\n Key: params.key,\n ReturnValuesOnConditionCheckFailure: 'ALL_OLD',\n };\n\n const conditionalData = buildConditionExpression(params.conditions);\n if (conditionalData?.attributeNames) {\n deleteInput.ExpressionAttributeNames = conditionalData.attributeNames;\n }\n\n if (conditionalData?.attributeValues) {\n deleteInput.ExpressionAttributeValues = conditionalData.attributeValues;\n }\n\n if (conditionalData?.conditionExpression) {\n deleteInput.ConditionExpression = conditionalData.conditionExpression;\n }\n\n await params.dynamoDb.delete(deleteInput);\n return true;\n};\n\nexport interface GetItemParams<K> {\n dynamoDb: DynamoDbDocumentClient;\n table: string;\n key: Record<string, NativeAttributeValue>;\n consistentRead?: boolean;\n /**\n * Specific attributes to be returned on the item.\n *\n * When using this provide the K type including each of these attributes.\n */\n projectionExpression?: K[];\n}\n\n/**\n * Get a single item.\n */\nexport function getItem<T extends Record<string, NativeAttributeValue>>(\n params: GetItemParams<keyof T>,\n): Promise<T>;\n\n/**\n * Get a single item.\n *\n * Specify K when using a projectionExpression\n */\nexport function getItem<\n T extends Record<string, NativeAttributeValue>,\n K extends keyof T,\n>(params: GetItemParams<K>): Promise<Pick<T, K>>;\n\n/**\n * Get a single item.\n *\n * Specify K type when using a projectionExpression\n */\nexport async function getItem<\n T extends Record<string, NativeAttributeValue>,\n K extends keyof T,\n>(params: GetItemParams<K>): Promise<T> {\n const getItemInput: GetCommandInput = {\n TableName: params.table || '',\n Key: params.key,\n };\n\n if (params.consistentRead) {\n getItemInput.ConsistentRead = params.consistentRead;\n }\n\n const result = await params.dynamoDb.get(getItemInput);\n return result.Item as T;\n}\n\nexport interface GetAllItemsParams<K> {\n dynamoDb: DynamoDbDocumentClient;\n table: string;\n /**\n * Limit the number of items returned.\n * This will continue fetching items until the limit is reached or there are no more items.\n */\n limit?: number;\n consistentRead?: boolean;\n /**\n * Array of conditions to apply to the scan.\n * Conditions are combined with AND.\n */\n filterConditions?: ConditionExpressionArgs[];\n /**\n * Specific attributes to be returned on each item.\n *\n * When using this provide the K type including each of these attributes.\n */\n projectionExpression?: K[];\n exclusiveStartKey?: Record<string, NativeAttributeValue>;\n}\n\n// Overload for when K is not provided, using keyof T as the default for K\n// Allows for a return type of T[] when K is not provided.\n\n/**\n * Scan items from a table.\n */\nexport function getAllItems<T extends Record<string, NativeAttributeValue>>(\n params: GetAllItemsParams<keyof T>,\n): Promise<T[]>;\n\n/**\n * Scan items from a table.\n */\nexport function getAllItems<\n T extends Record<string, NativeAttributeValue>,\n K extends keyof T,\n>(params: GetAllItemsParams<K>): Promise<Pick<T, K>[]>;\n\n/**\n * Scan items from a table.\n */\nexport async function getAllItems<\n T extends Record<string, NativeAttributeValue>,\n>(params: GetAllItemsParams<keyof T>): Promise<T[]> {\n const scanInput: ScanCommandInput = {\n TableName: params.table || '',\n };\n\n if (params.consistentRead) {\n scanInput.ConsistentRead = params.consistentRead;\n }\n\n if (params.limit) {\n scanInput.Limit = params.limit;\n }\n\n if (params.projectionExpression) {\n scanInput.ProjectionExpression = params.projectionExpression.join(',');\n }\n\n if (params.exclusiveStartKey) {\n scanInput.ExclusiveStartKey = params.exclusiveStartKey;\n }\n\n const conditionalData = buildConditionExpression(params.filterConditions);\n if (conditionalData?.attributeNames) {\n scanInput.ExpressionAttributeNames = conditionalData.attributeNames;\n }\n\n if (conditionalData?.attributeValues) {\n scanInput.ExpressionAttributeValues = conditionalData.attributeValues;\n }\n\n if (conditionalData?.conditionExpression) {\n scanInput.FilterExpression = conditionalData.conditionExpression;\n }\n\n const allRecords: T[] = [];\n let lastKey: Record<string, NativeAttributeValue> | undefined = undefined;\n do {\n const result = await params.dynamoDb.scan(scanInput);\n const resultRecords = result.Items as T[];\n allRecords.push(...resultRecords);\n lastKey = result.LastEvaluatedKey;\n scanInput.ExclusiveStartKey = lastKey;\n } while (lastKey && (params.limit ? allRecords.length < params.limit : true));\n\n return allRecords;\n}\n\nexport interface BatchGetItemsParams {\n dynamoDb: DynamoDbDocumentClient;\n table: string;\n /**\n * Keys of items to get.\n * Automatically handles chunking the keys by 100.\n */\n keys: Record<string, NativeAttributeValue>[];\n}\n\n/**\n * Batch get items from a table.\n * Automatically handles chunking the keys by 100.\n * Items are returned in an arbitrary order.\n */\nexport const batchGetItems = async <\n T extends Record<string, NativeAttributeValue>,\n>(\n params: BatchGetItemsParams,\n): Promise<T[]> => {\n if (!params.keys.length) {\n return [];\n }\n\n const unique = new Map<string, Record<string, NativeAttributeValue>>();\n\n for (const item of params.keys) {\n const key = JSON.stringify(item);\n if (!unique.has(key)) {\n unique.set(key, item);\n }\n }\n\n const uniqueIds = Array.from(unique.values());\n\n const totalBatches = Math.ceil(uniqueIds.length / 100);\n const keyBatches: Record<string, any>[][] = [];\n for (let index = 0; index < totalBatches; index++) {\n const start = index * 100;\n const end = start + 100 > uniqueIds.length ? uniqueIds.length : start + 100;\n const batch = uniqueIds.slice(start, end);\n keyBatches.push(batch);\n }\n\n const initialPromises = keyBatches.map((keyBatch) => {\n const batchGetInput: BatchGetCommandInput = {\n RequestItems: {\n [params.table]: {\n Keys: keyBatch,\n },\n },\n };\n return params.dynamoDb.batchGet(batchGetInput);\n });\n\n const initialResults = await Promise.all(initialPromises);\n let allRecords: T[] = [];\n for (const result of initialResults) {\n const records = result.Responses?.[params.table] as T[];\n allRecords = allRecords.concat(records);\n\n let unprocessedKeys = result.UnprocessedKeys?.[params.table]?.Keys;\n while (unprocessedKeys && unprocessedKeys.length) {\n const batchGetInput: BatchGetCommandInput = {\n RequestItems: {\n [params.table]: {\n Keys: unprocessedKeys,\n },\n },\n };\n const retryResult = await params.dynamoDb.batchGet(batchGetInput);\n const retryRecords = retryResult.Responses?.[params.table] as T[];\n allRecords = allRecords.concat(retryRecords);\n unprocessedKeys = retryResult.UnprocessedKeys?.[params.table]?.Keys;\n }\n }\n\n return allRecords;\n};\n\nexport interface QueryItemsParams<K> {\n dynamoDb: DynamoDbDocumentClient;\n table: string;\n keyName: string;\n keyValue: NativeAttributeValue;\n /**\n * Which GSI or LSI to query.\n */\n indexName?: string;\n /**\n * Specify as false to query in reverse order.\n */\n scanIndexForward?: boolean;\n /**\n * Consistent reads for queries can only be done with no index specified or an LSI.\n */\n consistentRead?: boolean;\n /**\n * Limit the number of items returned.\n * This will continue fetching items until the limit is reached or there are no more items.\n */\n limit?: number;\n /**\n * Condition to be applied to the sort key.\n */\n rangeCondition?: ConditionExpressionQueryArgs;\n /**\n * Specific attributes to be returned on each item.\n *\n * When using this provide the K type including each of these attributes.\n */\n projectionExpression?: K[];\n exclusiveStartKey?: Record<string, NativeAttributeValue>;\n}\n\n/**\n * Query items from a table.\n */\nexport function queryItems<T extends Record<string, NativeAttributeValue>>(\n params: QueryItemsParams<keyof T>,\n): Promise<T[]>;\n\n/**\n * Query items from a table.\n */\nexport function queryItems<\n T extends Record<string, NativeAttributeValue>,\n K extends keyof T,\n>(params: QueryItemsParams<K>): Promise<Pick<T, K>[]>;\n\n/**\n * Query items from a table.\n */\nexport async function queryItems<\n T extends Record<string, NativeAttributeValue>,\n>(params: QueryItemsParams<keyof T>): Promise<T[]> {\n const queryInput: QueryCommandInput = {\n TableName: params.table,\n KeyConditionExpression: `#a = :b`,\n ExpressionAttributeNames: {\n '#a': params.keyName,\n },\n ExpressionAttributeValues: {\n ':b': params.keyValue,\n },\n };\n\n if (params?.indexName) {\n queryInput.IndexName = params?.indexName;\n }\n\n if (params?.exclusiveStartKey) {\n queryInput.ExclusiveStartKey = params?.exclusiveStartKey;\n }\n\n if (params.consistentRead) {\n queryInput.ConsistentRead = params.consistentRead;\n }\n\n if (params?.scanIndexForward === false) {\n queryInput.ScanIndexForward = false;\n }\n\n if (params?.limit) {\n queryInput.Limit = params.limit;\n }\n\n if (params.projectionExpression) {\n queryInput.ProjectionExpression = params.projectionExpression.join(',');\n }\n\n const rangeData = buildConditionExpression(\n params.rangeCondition ? [params.rangeCondition] : undefined,\n );\n if (rangeData?.attributeNames) {\n queryInput.ExpressionAttributeNames = {\n ...queryInput.ExpressionAttributeNames,\n ...rangeData.attributeNames,\n };\n }\n\n if (rangeData?.attributeValues) {\n queryInput.ExpressionAttributeValues = {\n ...queryInput.ExpressionAttributeValues,\n ...rangeData.attributeValues,\n };\n }\n\n if (rangeData?.conditionExpression) {\n queryInput.KeyConditionExpression = `${queryInput.KeyConditionExpression} AND ${rangeData?.conditionExpression}`;\n }\n\n const allRecords: T[] = [];\n let lastKey: Record<string, NativeAttributeValue> | undefined = undefined;\n do {\n const result = await params.dynamoDb.query(queryInput);\n const resultRecords = result.Items as T[];\n allRecords.push(...resultRecords);\n lastKey = result.LastEvaluatedKey;\n queryInput.ExclusiveStartKey = lastKey;\n } while (lastKey && (params.limit ? allRecords.length < params.limit : true));\n\n return allRecords;\n}\n\nexport interface QueryRangeParams<K>\n extends Omit<QueryItemsParams<K>, 'rangeCondition'> {\n rangeKeyName: string;\n rangeKeyValue: NativeAttributeValue;\n /**\n * Specify as true to use a begins_with condition on the sort key.\n * Specify as falsy to use an equals condition on the sort key.\n */\n fuzzy?: boolean;\n}\n\n/**\n * A wrapper for dynamoQuery that simplifies the usage of the sort key with an equals or begins_with condition.\n */\nexport function queryItemsRange<T extends Record<string, NativeAttributeValue>>(\n params: QueryRangeParams<keyof T>,\n): Promise<T[]>;\n\n/**\n * A wrapper for dynamoQuery that simplifies the usage of the sort key with an equals or begins_with condition.\n */\nexport function queryItemsRange<\n T extends Record<string, NativeAttributeValue>,\n K extends keyof T,\n>(params: QueryRangeParams<K>): Promise<Pick<T, K>[]>;\n\n/**\n * A wrapper for dynamoQuery that simplifies the usage of the sort key with an equals or begins_with condition.\n */\nexport async function queryItemsRange<\n T extends Record<string, NativeAttributeValue>,\n>(params: QueryRangeParams<keyof T>): Promise<T[]> {\n const result = await queryItems<T>({\n ...params,\n rangeCondition: {\n operator: params.fuzzy ? 'BeginsWith' : 'Equal',\n field: params.rangeKeyName,\n value: params.rangeKeyValue,\n },\n });\n\n return result;\n}\n\nexport interface QueryItemsRangeBetweenParams<K>\n extends Omit<QueryItemsParams<K>, 'rangeCondition'> {\n rangeKeyName: string;\n rangeKeyValueMin: NativeAttributeValue;\n rangeKeyValueMax: NativeAttributeValue;\n}\n\n/**\n * A wrapper for dynamoQuery that simplifies the usage of the sort key with a 'between' condition\n */\nexport function queryItemsRangeBetween<\n T extends Record<string, NativeAttributeValue>,\n>(params: QueryItemsRangeBetweenParams<keyof T>): Promise<T[]>;\n\n/**\n * A wrapper for dynamoQuery that simplifies the usage of the sort key with a 'between' condition\n */\nexport function queryItemsRangeBetween<\n T extends Record<string, NativeAttributeValue>,\n K extends keyof T,\n>(params: QueryItemsRangeBetweenParams<K>): Promise<Pick<T, K>[]>;\n\n/**\n * A wrapper for dynamoQuery that simplifies the usage of the sort key with a 'between' condition\n */\nexport async function queryItemsRangeBetween<\n T extends Record<string, NativeAttributeValue>,\n>(params: QueryItemsRangeBetweenParams<keyof T>): Promise<T[]> {\n const result = await queryItems<T>({\n ...params,\n rangeCondition: {\n operator: 'Between',\n field: params.rangeKeyName,\n value: params.rangeKeyValueMin,\n betweenSecondValue: params.rangeKeyValueMax,\n },\n });\n\n return result;\n}\n\nexport interface BatchPutItems<T extends Record<string, NativeAttributeValue>> {\n dynamoDb: DynamoDbDocumentClient;\n table: string;\n /**\n * Items to create.\n * Automatically handles chunking the items by 25.\n */\n items: T[];\n}\n\n/**\n * Batch create items into a table.\n * Automatically handles chunking the items by 25.\n */\nexport const batchPutItems = async <\n T extends Record<string, NativeAttributeValue>,\n>(\n params: BatchPutItems<T>,\n): Promise<T[]> => {\n const totalBatches = Math.ceil(params.items.length / 25);\n const itemBatches: Record<string, any>[][] = [];\n for (let index = 0; index < totalBatches; index++) {\n const start = index * 25;\n const end =\n start + 25 > params.items.length ? params.items.length : start + 25;\n const batch = params.items.slice(start, end);\n itemBatches.push(batch);\n }\n\n const initialPromises = itemBatches.map((itemsBatch) => {\n const batchWriteInput: BatchWriteCommandInput = {\n RequestItems: {\n [params.table]: itemsBatch.map((item) => ({\n PutRequest: {\n Item: item,\n },\n })),\n },\n };\n return params.dynamoDb.batchWrite(batchWriteInput);\n });\n\n const initialResults = await Promise.all(initialPromises);\n\n let previousDelay = 0;\n for (const result of initialResults) {\n let unprocessedItems = result.UnprocessedItems;\n while (Object.keys(unprocessedItems || {}).length > 0) {\n const batchWriteInput: BatchWriteCommandInput = {\n RequestItems: unprocessedItems,\n };\n\n // https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Programming.Errors.html#Programming.Errors.BatchOperations\n const delay = decorrelatedJitterBackoff(previousDelay);\n await sleep(delay);\n\n const retryResult = await params.dynamoDb.batchWrite(batchWriteInput);\n unprocessedItems = retryResult.UnprocessedItems;\n }\n }\n\n return params.items;\n};\n\nexport interface BatchDeleteItemsParams {\n dynamoDb: DynamoDbDocumentClient;\n table: string;\n /**\n * Items to delete.\n * Automatically handles chunking the items by 25.\n */\n keys: Record<string, NativeAttributeValue>[];\n}\n\n/**\n * Batch delete items from a table.\n * Automatically handles chunking the keys by 25.\n */\nexport const batchDeleteItems = async (\n params: BatchDeleteItemsParams,\n): Promise<boolean> => {\n const totalBatches = Math.ceil(params.keys.length / 25);\n const keyBatches: Record<string, any>[][] = [];\n for (let index = 0; index < totalBatches; index++) {\n const start = index * 25;\n const end =\n start + 25 > params.keys.length ? params.keys.length : start + 25;\n const batch = params.keys.slice(start, end);\n keyBatches.push(batch);\n }\n\n const initialPromises = keyBatches.map((keysBatch) => {\n const batchWriteInput: BatchWriteCommandInput = {\n RequestItems: {\n [params.table]: keysBatch.map((item) => ({\n DeleteRequest: {\n Key: item,\n },\n })),\n },\n };\n return params.dynamoDb.batchWrite(batchWriteInput);\n });\n\n const initialResults = await Promise.all(initialPromises);\n\n let previousDelay = 0;\n for (const result of initialResults) {\n let unprocessedItems = result.UnprocessedItems;\n while (Object.keys(unprocessedItems || {}).length > 0) {\n const batchWriteInput: BatchWriteCommandInput = {\n RequestItems: unprocessedItems,\n };\n\n // https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Programming.Errors.html#Programming.Errors.BatchOperations\n const delay = decorrelatedJitterBackoff(previousDelay);\n await sleep(delay);\n\n const retryResult = await params.dynamoDb.batchWrite(batchWriteInput);\n unprocessedItems = retryResult.UnprocessedItems;\n }\n }\n\n return true;\n};\n\n/**\n * Unmarshalling is used to convert a DynamoDB record into a JavaScript object.\n */\nexport const unmarshallItem = <T extends Record<string, NativeAttributeValue>>(\n item: Record<string, AttributeValue>,\n options?: unmarshallOptions,\n): T => {\n const unmarshallItem = unmarshall(item, options);\n return unmarshallItem as T;\n};\n\n/**\n * Marshalling is used to convert a JavaScript object into a DynamoDB record.\n */\nexport const marshallItem = <T extends Record<string, NativeAttributeValue>>(\n item: T,\n options?: marshallOptions,\n): Record<string, AttributeValue> => {\n const unmarshallItem = marshall(item, options);\n return unmarshallItem;\n};\n","import { NativeAttributeValue } from '@aws-sdk/util-dynamodb';\n\nexport type OperatorQueryType =\n | 'BeginsWith'\n | 'LessThan'\n | 'GreaterThan'\n | 'LessThanEqual'\n | 'GreaterThanEqual'\n | 'Equal'\n | 'NotEqual'\n | 'Between';\n\n/**\n * These additional operators are valid for condition expressions but not query expressions.\n */\nexport type OperatorType =\n | OperatorQueryType\n | 'AttributeExists'\n | 'AttributeNotExists';\n\nexport interface ConditionExpressionArgs {\n operator: OperatorType;\n field: string;\n value?: NativeAttributeValue;\n /** Used only for Between comparison */\n betweenSecondValue?: NativeAttributeValue;\n}\n\nexport interface ConditionExpressionQueryArgs {\n operator: OperatorQueryType;\n field: string;\n value?: NativeAttributeValue;\n /** Used only for Between comparison */\n betweenSecondValue?: NativeAttributeValue;\n}\n\nexport const sleep = (ms: number) =>\n new Promise((resolve) => setTimeout(resolve, ms));\n\n// https://aws.amazon.com/blogs/architecture/exponential-backoff-and-jitter/\nexport const decorrelatedJitterBackoff = (previousDelay: number) => {\n const maxDelayMiliseconds = 4000;\n const baseMiliseconds = 50;\n\n const nextDelay = Math.min(\n maxDelayMiliseconds,\n Math.random() * previousDelay * 3 + baseMiliseconds,\n );\n return nextDelay;\n};\n\nconst buildCondition = (args: ConditionExpressionArgs): string => {\n const { operator, value, betweenSecondValue, field } = args;\n let conditionExpression = '';\n\n switch (operator) {\n case 'BeginsWith':\n conditionExpression = `begins_with(${field}, ${value})`;\n break;\n case 'Equal':\n conditionExpression = `${field} = ${value}`;\n break;\n case 'NotEqual':\n conditionExpression = `${field} <> ${value}`;\n break;\n case 'GreaterThan':\n conditionExpression = `${field} > ${value}`;\n break;\n case 'GreaterThanEqual':\n conditionExpression = `${field} >= ${value}`;\n break;\n case 'LessThan':\n conditionExpression = `${field} < ${value}`;\n break;\n case 'LessThanEqual':\n conditionExpression = `${field} <= ${value}`;\n break;\n case 'Between':\n conditionExpression = `${field} BETWEEN ${value} AND ${betweenSecondValue}`;\n break;\n case 'AttributeExists':\n conditionExpression = `attribute_exists(${field})`;\n break;\n case 'AttributeNotExists':\n conditionExpression = `attribute_not_exists(${field})`;\n break;\n default:\n throw new Error('Unknown Query Condition type');\n }\n return conditionExpression;\n};\n\ninterface ConditionExpressData {\n conditionExpression: string;\n attributeNames: Record<string, string> | null;\n attributeValues: Record<string, NativeAttributeValue> | null;\n}\n\nexport const buildConditionExpression = (\n conditions?: ConditionExpressionArgs[],\n): ConditionExpressData | null => {\n if (!conditions?.length) {\n return null;\n }\n\n let count = 0;\n const attributeNames: Record<string, string> = {};\n const attributeValues: Record<string, NativeAttributeValue> = {};\n let conditionExpression = '';\n\n conditions.forEach((values: ConditionExpressionArgs) => {\n if (conditionExpression?.length) {\n conditionExpression += ' AND ';\n }\n conditionExpression += buildCondition({\n field: `#field${count}`,\n value: `:val${count}`,\n operator: values.operator,\n betweenSecondValue: `:val${count + 1}`,\n });\n attributeNames[`#field${count}`] = values.field;\n\n if (values.value !== undefined) {\n attributeValues[`:val${count}`] = values.value;\n }\n\n if (values.betweenSecondValue !== undefined) {\n attributeValues[`:val${count + 1}`] = values.betweenSecondValue;\n }\n count += 2;\n });\n\n if (!conditionExpression?.length) {\n return null;\n }\n\n return {\n conditionExpression,\n attributeNames: Object.keys(attributeNames).length ? attributeNames : null,\n attributeValues: Object.keys(attributeValues).length\n ? attributeValues\n : null,\n };\n};\n"],"mappings":"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","names":["unmarshallItem"]}