@http-client-toolkit/store-dynamodb 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +15 -0
- package/README.md +270 -0
- package/lib/index.cjs +1807 -0
- package/lib/index.cjs.map +1 -0
- package/lib/index.d.cts +165 -0
- package/lib/index.d.ts +165 -0
- package/lib/index.js +1800 -0
- package/lib/index.js.map +1 -0
- package/package.json +76 -0
package/lib/index.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/dynamodb-utils.ts","../src/table-missing-error.ts","../src/table.ts","../src/dynamodb-cache-store.ts","../src/dynamodb-dedupe-store.ts","../src/dynamodb-rate-limit-store.ts","../src/dynamodb-adaptive-rate-limit-store.ts"],"names":["_a","DynamoDBDocumentClient","DynamoDBClient","GetCommand","PutCommand","DeleteCommand","ScanCommand","randomUUID","QueryCommand","TransactWriteCommand"],"mappings":"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","file":"index.js","sourcesContent":["import {\n BatchWriteCommand,\n QueryCommand,\n type DynamoDBDocumentClient,\n type QueryCommandInput,\n} from '@aws-sdk/lib-dynamodb';\n\ntype DynamoItem = Record<string, unknown>;\n\nconst MAX_BATCH_WRITE_RETRIES = 8;\nconst MAX_DYNAMO_KEY_PART_BYTES = 512;\n\nfunction sleep(ms: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, ms));\n}\n\nfunction getRetryDelayMs(attempt: number): number {\n const backoff = Math.min(1000, 50 * 2 ** attempt);\n const jitter = Math.floor(Math.random() * 25);\n return backoff + jitter;\n}\n\nexport async function batchDeleteWithRetries(\n docClient: DynamoDBDocumentClient,\n tableName: string,\n keys: Array<DynamoItem>,\n): Promise<void> {\n for (let i = 0; i < keys.length; i += 25) {\n const batch = keys.slice(i, i + 25);\n\n let pendingWrites = batch.map((key) => ({ DeleteRequest: { Key: key } }));\n\n for (let attempt = 0; pendingWrites.length > 0; attempt++) {\n const response = await docClient.send(\n new BatchWriteCommand({\n RequestItems: {\n [tableName]: pendingWrites,\n },\n }),\n );\n\n const unprocessed = response.UnprocessedItems?.[tableName] ?? [];\n\n if (unprocessed.length === 0) {\n break;\n }\n\n if (attempt >= MAX_BATCH_WRITE_RETRIES) {\n throw new Error(\n `Failed to delete all items from table \"${tableName}\" after ${MAX_BATCH_WRITE_RETRIES + 1} attempts`,\n );\n }\n\n pendingWrites = unprocessed\n .map((request) => request.DeleteRequest?.Key)\n .filter((key): key is DynamoItem => Boolean(key))\n .map((key) => ({ DeleteRequest: { Key: key } }));\n await sleep(getRetryDelayMs(attempt));\n }\n }\n}\n\nexport async function queryCountAllPages(\n docClient: DynamoDBDocumentClient,\n input: QueryCommandInput,\n): Promise<number> {\n let total = 0;\n let lastEvaluatedKey: DynamoItem | undefined;\n\n do {\n const result = await docClient.send(\n new QueryCommand({\n ...input,\n ExclusiveStartKey: lastEvaluatedKey,\n }),\n );\n\n total += result.Count ?? 0;\n lastEvaluatedKey = result.LastEvaluatedKey as DynamoItem | undefined;\n } while (lastEvaluatedKey);\n\n return total;\n}\n\nexport async function queryItemsAllPages(\n docClient: DynamoDBDocumentClient,\n input: QueryCommandInput,\n): Promise<Array<DynamoItem>> {\n const items: Array<DynamoItem> = [];\n let lastEvaluatedKey: DynamoItem | undefined;\n\n do {\n const result = await docClient.send(\n new QueryCommand({\n ...input,\n ExclusiveStartKey: lastEvaluatedKey,\n }),\n );\n\n if (result.Items?.length) {\n items.push(...(result.Items as Array<DynamoItem>));\n }\n\n lastEvaluatedKey = result.LastEvaluatedKey as DynamoItem | undefined;\n } while (lastEvaluatedKey);\n\n return items;\n}\n\nexport async function queryCountUpTo(\n docClient: DynamoDBDocumentClient,\n input: QueryCommandInput,\n maxCount: number,\n): Promise<{ count: number; reachedLimit: boolean }> {\n if (maxCount <= 0) {\n return { count: 0, reachedLimit: true };\n }\n\n let total = 0;\n let lastEvaluatedKey: DynamoItem | undefined;\n\n do {\n const remaining = maxCount - total;\n const result = await docClient.send(\n new QueryCommand({\n ...input,\n Select: 'COUNT',\n Limit: remaining,\n ExclusiveStartKey: lastEvaluatedKey,\n }),\n );\n\n total += result.Count ?? 0;\n if (total >= maxCount) {\n return { count: maxCount, reachedLimit: true };\n }\n\n lastEvaluatedKey = result.LastEvaluatedKey as DynamoItem | undefined;\n } while (lastEvaluatedKey);\n\n return { count: total, reachedLimit: false };\n}\n\nexport function isConditionalTransactionFailure(error: unknown): boolean {\n if (!error || typeof error !== 'object') {\n return false;\n }\n\n const maybeError = error as {\n name?: unknown;\n message?: unknown;\n CancellationReasons?: unknown;\n cancellationReasons?: unknown;\n };\n\n if (maybeError.name !== 'TransactionCanceledException') {\n return false;\n }\n\n const cancellationReasons =\n maybeError.CancellationReasons ?? maybeError.cancellationReasons;\n if (Array.isArray(cancellationReasons)) {\n return cancellationReasons.some((reason) => {\n if (!reason || typeof reason !== 'object') {\n return false;\n }\n\n return (\n 'Code' in reason &&\n (reason as { Code?: unknown }).Code === 'ConditionalCheckFailed'\n );\n });\n }\n\n return (\n typeof maybeError.message === 'string' &&\n maybeError.message.includes('ConditionalCheckFailed')\n );\n}\n\nexport function assertDynamoKeyPart(\n value: string,\n label: string,\n maxBytes = MAX_DYNAMO_KEY_PART_BYTES,\n): void {\n if (value.length === 0) {\n throw new Error(`${label} must not be empty`);\n }\n\n for (let i = 0; i < value.length; i++) {\n const charCode = value.charCodeAt(i);\n if (charCode < 0x20 || charCode === 0x7f) {\n throw new Error(`${label} contains unsupported control characters`);\n }\n }\n\n if (Buffer.byteLength(value, 'utf8') > maxBytes) {\n throw new Error(`${label} exceeds maximum length of ${maxBytes} bytes`);\n }\n}\n","import { ResourceNotFoundException } from '@aws-sdk/client-dynamodb';\n\nexport function throwIfDynamoTableMissing(\n error: unknown,\n tableName: string,\n): void {\n if (\n error instanceof ResourceNotFoundException ||\n (error &&\n typeof error === 'object' &&\n 'name' in error &&\n error.name === 'ResourceNotFoundException')\n ) {\n throw new Error(\n `DynamoDB table \"${tableName}\" was not found. Create the table using your infrastructure before using DynamoDB stores.`,\n );\n }\n}\n","import type {\n KeySchemaElement,\n AttributeDefinition,\n GlobalSecondaryIndex,\n} from '@aws-sdk/client-dynamodb';\n\nexport const DEFAULT_TABLE_NAME = 'http-client-toolkit';\n\nexport const TABLE_SCHEMA: {\n KeySchema: Array<KeySchemaElement>;\n AttributeDefinitions: Array<AttributeDefinition>;\n GlobalSecondaryIndexes: Array<GlobalSecondaryIndex>;\n} = {\n KeySchema: [\n { AttributeName: 'pk', KeyType: 'HASH' },\n { AttributeName: 'sk', KeyType: 'RANGE' },\n ],\n AttributeDefinitions: [\n { AttributeName: 'pk', AttributeType: 'S' },\n { AttributeName: 'sk', AttributeType: 'S' },\n { AttributeName: 'gsi1pk', AttributeType: 'S' },\n { AttributeName: 'gsi1sk', AttributeType: 'S' },\n ],\n GlobalSecondaryIndexes: [\n {\n IndexName: 'gsi1',\n KeySchema: [\n { AttributeName: 'gsi1pk', KeyType: 'HASH' },\n { AttributeName: 'gsi1sk', KeyType: 'RANGE' },\n ],\n Projection: { ProjectionType: 'ALL' },\n },\n ],\n};\n","import {\n DynamoDBClient,\n type DynamoDBClientConfig,\n} from '@aws-sdk/client-dynamodb';\nimport {\n DynamoDBDocumentClient,\n GetCommand,\n PutCommand,\n DeleteCommand,\n ScanCommand,\n} from '@aws-sdk/lib-dynamodb';\nimport type { CacheStore } from '@http-client-toolkit/core';\nimport {\n assertDynamoKeyPart,\n batchDeleteWithRetries,\n} from './dynamodb-utils.js';\nimport { throwIfDynamoTableMissing } from './table-missing-error.js';\nimport { DEFAULT_TABLE_NAME } from './table.js';\n\nexport interface DynamoDBCacheStoreOptions {\n client?: DynamoDBDocumentClient | DynamoDBClient;\n region?: string;\n tableName?: string;\n maxEntrySizeBytes?: number;\n}\n\nexport class DynamoDBCacheStore<T = unknown> implements CacheStore<T> {\n private readonly docClient: DynamoDBDocumentClient;\n private readonly rawClient: DynamoDBClient | undefined;\n private readonly isClientManaged: boolean;\n private readonly tableName: string;\n private readonly maxEntrySizeBytes: number;\n private isDestroyed = false;\n\n constructor({\n client,\n region,\n tableName = DEFAULT_TABLE_NAME,\n maxEntrySizeBytes = 390 * 1024,\n }: DynamoDBCacheStoreOptions = {}) {\n this.tableName = tableName;\n this.maxEntrySizeBytes = maxEntrySizeBytes;\n\n if (client instanceof DynamoDBDocumentClient) {\n this.docClient = client;\n this.isClientManaged = false;\n } else if (client instanceof DynamoDBClient) {\n this.docClient = DynamoDBDocumentClient.from(client);\n this.isClientManaged = false;\n } else {\n const config: DynamoDBClientConfig = {};\n if (region) config.region = region;\n this.rawClient = new DynamoDBClient(config);\n this.docClient = DynamoDBDocumentClient.from(this.rawClient);\n this.isClientManaged = true;\n }\n }\n\n async get(hash: string): Promise<T | undefined> {\n if (this.isDestroyed) {\n throw new Error('Cache store has been destroyed');\n }\n\n this.assertValidHash(hash);\n\n const pk = `CACHE#${hash}`;\n\n let result;\n try {\n result = await this.docClient.send(\n new GetCommand({\n TableName: this.tableName,\n Key: { pk, sk: pk },\n }),\n );\n } catch (error: unknown) {\n throwIfDynamoTableMissing(error, this.tableName);\n throw error;\n }\n\n if (!result.Item) {\n return undefined;\n }\n\n const now = Math.floor(Date.now() / 1000);\n if (result.Item['ttl'] > 0 && now >= result.Item['ttl']) {\n await this.delete(hash);\n return undefined;\n }\n\n try {\n const value = result.Item['value'] as string;\n if (value === '__UNDEFINED__') {\n return undefined;\n }\n return JSON.parse(value);\n } catch {\n await this.delete(hash);\n return undefined;\n }\n }\n\n async set(hash: string, value: T, ttlSeconds: number): Promise<void> {\n if (this.isDestroyed) {\n throw new Error('Cache store has been destroyed');\n }\n\n this.assertValidHash(hash);\n\n const now = Date.now();\n const nowEpoch = Math.floor(now / 1000);\n\n let ttl: number;\n if (ttlSeconds < 0) {\n ttl = nowEpoch;\n } else if (ttlSeconds === 0) {\n ttl = 0;\n } else {\n ttl = nowEpoch + ttlSeconds;\n }\n\n let serializedValue: string;\n try {\n if (value === undefined) {\n serializedValue = '__UNDEFINED__';\n } else {\n serializedValue = JSON.stringify(value);\n }\n } catch (error) {\n throw new Error(\n `Failed to serialize value: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n\n if (Buffer.byteLength(serializedValue, 'utf8') > this.maxEntrySizeBytes) {\n return;\n }\n\n const pk = `CACHE#${hash}`;\n\n try {\n await this.docClient.send(\n new PutCommand({\n TableName: this.tableName,\n Item: {\n pk,\n sk: pk,\n value: serializedValue,\n ttl,\n createdAt: now,\n },\n }),\n );\n } catch (error: unknown) {\n throwIfDynamoTableMissing(error, this.tableName);\n throw error;\n }\n }\n\n async delete(hash: string): Promise<void> {\n if (this.isDestroyed) {\n throw new Error('Cache store has been destroyed');\n }\n\n this.assertValidHash(hash);\n\n const pk = `CACHE#${hash}`;\n\n try {\n await this.docClient.send(\n new DeleteCommand({\n TableName: this.tableName,\n Key: { pk, sk: pk },\n }),\n );\n } catch (error: unknown) {\n throwIfDynamoTableMissing(error, this.tableName);\n throw error;\n }\n }\n\n async clear(): Promise<void> {\n if (this.isDestroyed) {\n throw new Error('Cache store has been destroyed');\n }\n\n let lastEvaluatedKey: Record<string, unknown> | undefined;\n\n do {\n let scanResult;\n try {\n scanResult = await this.docClient.send(\n new ScanCommand({\n TableName: this.tableName,\n FilterExpression: 'begins_with(pk, :prefix)',\n ExpressionAttributeValues: { ':prefix': 'CACHE#' },\n ProjectionExpression: 'pk, sk',\n ExclusiveStartKey: lastEvaluatedKey,\n }),\n );\n } catch (error: unknown) {\n throwIfDynamoTableMissing(error, this.tableName);\n throw error;\n }\n\n const items = scanResult.Items ?? [];\n if (items.length > 0) {\n try {\n await batchDeleteWithRetries(\n this.docClient,\n this.tableName,\n items.map((item) => ({ pk: item['pk'], sk: item['sk'] })),\n );\n } catch (error: unknown) {\n throwIfDynamoTableMissing(error, this.tableName);\n throw error;\n }\n }\n\n lastEvaluatedKey = scanResult.LastEvaluatedKey as\n | Record<string, unknown>\n | undefined;\n } while (lastEvaluatedKey);\n }\n\n async close(): Promise<void> {\n this.isDestroyed = true;\n\n if (this.isClientManaged && this.rawClient) {\n this.rawClient.destroy();\n }\n }\n\n destroy(): void {\n this.close();\n }\n\n private assertValidHash(hash: string): void {\n assertDynamoKeyPart(hash, 'hash');\n }\n}\n","import { randomUUID } from 'crypto';\nimport {\n DynamoDBClient,\n type DynamoDBClientConfig,\n} from '@aws-sdk/client-dynamodb';\nimport {\n DynamoDBDocumentClient,\n GetCommand,\n PutCommand,\n DeleteCommand,\n ScanCommand,\n UpdateCommand,\n} from '@aws-sdk/lib-dynamodb';\nimport type { DedupeStore } from '@http-client-toolkit/core';\nimport {\n assertDynamoKeyPart,\n batchDeleteWithRetries,\n} from './dynamodb-utils.js';\nimport { throwIfDynamoTableMissing } from './table-missing-error.js';\nimport { DEFAULT_TABLE_NAME } from './table.js';\n\nexport interface DynamoDBDedupeStoreOptions {\n client?: DynamoDBDocumentClient | DynamoDBClient;\n region?: string;\n tableName?: string;\n jobTimeoutMs?: number;\n pollIntervalMs?: number;\n}\n\nexport class DynamoDBDedupeStore<T = unknown> implements DedupeStore<T> {\n private readonly docClient: DynamoDBDocumentClient;\n private readonly rawClient: DynamoDBClient | undefined;\n private readonly isClientManaged: boolean;\n private readonly tableName: string;\n private readonly jobTimeoutMs: number;\n private readonly pollIntervalMs: number;\n private jobPromises = new Map<string, Promise<T | undefined>>();\n private jobSettlers = new Map<string, (value: T | undefined) => void>();\n private isDestroyed = false;\n\n constructor({\n client,\n region,\n tableName = DEFAULT_TABLE_NAME,\n jobTimeoutMs = 300_000,\n pollIntervalMs = 500,\n }: DynamoDBDedupeStoreOptions = {}) {\n this.tableName = tableName;\n this.jobTimeoutMs = jobTimeoutMs;\n this.pollIntervalMs = pollIntervalMs;\n\n if (client instanceof DynamoDBDocumentClient) {\n this.docClient = client;\n this.isClientManaged = false;\n } else if (client instanceof DynamoDBClient) {\n this.docClient = DynamoDBDocumentClient.from(client);\n this.isClientManaged = false;\n } else {\n const config: DynamoDBClientConfig = {};\n if (region) config.region = region;\n this.rawClient = new DynamoDBClient(config);\n this.docClient = DynamoDBDocumentClient.from(this.rawClient);\n this.isClientManaged = true;\n }\n }\n\n async waitFor(hash: string): Promise<T | undefined> {\n if (this.isDestroyed) {\n throw new Error('Dedupe store has been destroyed');\n }\n\n this.assertValidHash(hash);\n\n const existingPromise = this.jobPromises.get(hash);\n if (existingPromise) {\n return existingPromise;\n }\n\n const pk = `DEDUPE#${hash}`;\n\n let item: Record<string, unknown> | undefined;\n try {\n const result = await this.docClient.send(\n new GetCommand({\n TableName: this.tableName,\n Key: { pk, sk: pk },\n }),\n );\n item = result.Item as Record<string, unknown> | undefined;\n } catch (error: unknown) {\n throwIfDynamoTableMissing(error, this.tableName);\n throw error;\n }\n\n if (!item) {\n return undefined;\n }\n\n if (item['status'] === 'completed') {\n return this.deserializeResult(item['result']);\n }\n\n if (item['status'] === 'failed') {\n return undefined;\n }\n\n // Job is pending — poll DynamoDB for completion\n const promise = new Promise<T | undefined>((resolve) => {\n let settled = false;\n let timeoutHandle: NodeJS.Timeout | undefined;\n\n const settle = (value: T | undefined) => {\n if (settled) return;\n settled = true;\n\n if (timeoutHandle) clearTimeout(timeoutHandle);\n clearInterval(pollHandle);\n\n this.jobSettlers.delete(hash);\n this.jobPromises.delete(hash);\n resolve(value);\n };\n\n this.jobSettlers.set(hash, settle);\n\n const poll = async () => {\n if (this.isDestroyed) {\n settle(undefined);\n return;\n }\n\n try {\n const latest = await this.docClient.send(\n new GetCommand({\n TableName: this.tableName,\n Key: { pk, sk: pk },\n }),\n );\n\n const latestItem = latest.Item as Record<string, unknown> | undefined;\n if (!latestItem) {\n settle(undefined);\n return;\n }\n\n const isExpired =\n this.jobTimeoutMs > 0 &&\n Date.now() - (latestItem['createdAt'] as number) >=\n this.jobTimeoutMs;\n\n if (isExpired) {\n try {\n await this.docClient.send(\n new UpdateCommand({\n TableName: this.tableName,\n Key: { pk, sk: pk },\n UpdateExpression:\n 'SET #status = :failed, #error = :error, updatedAt = :now',\n ExpressionAttributeNames: {\n '#status': 'status',\n '#error': 'error',\n },\n ExpressionAttributeValues: {\n ':failed': 'failed',\n ':error': 'Job timed out',\n ':now': Date.now(),\n },\n }),\n );\n } catch {\n // Ignore update errors during timeout handling\n }\n settle(undefined);\n return;\n }\n\n if (latestItem['status'] === 'completed') {\n settle(this.deserializeResult(latestItem['result']));\n return;\n }\n\n if (latestItem['status'] === 'failed') {\n settle(undefined);\n }\n } catch {\n settle(undefined);\n }\n };\n\n let isPolling = false;\n\n const pollHandle = setInterval(() => {\n if (isPolling) {\n return;\n }\n\n isPolling = true;\n void poll().finally(() => {\n isPolling = false;\n });\n }, this.pollIntervalMs);\n\n if (typeof pollHandle.unref === 'function') {\n pollHandle.unref();\n }\n\n void poll();\n\n if (this.jobTimeoutMs > 0) {\n timeoutHandle = setTimeout(() => {\n if (this.isDestroyed) {\n settle(undefined);\n return;\n }\n\n void (async () => {\n try {\n await this.docClient.send(\n new UpdateCommand({\n TableName: this.tableName,\n Key: { pk, sk: pk },\n UpdateExpression:\n 'SET #status = :failed, #error = :error, updatedAt = :now',\n ExpressionAttributeNames: {\n '#status': 'status',\n '#error': 'error',\n },\n ExpressionAttributeValues: {\n ':failed': 'failed',\n ':error': 'Job timed out',\n ':now': Date.now(),\n },\n }),\n );\n } catch {\n // Ignore DB errors on timeout settlement\n } finally {\n settle(undefined);\n }\n })();\n }, this.jobTimeoutMs);\n\n if (typeof timeoutHandle.unref === 'function') {\n timeoutHandle.unref();\n }\n }\n });\n\n this.jobPromises.set(hash, promise);\n return promise;\n }\n\n async register(hash: string): Promise<string> {\n const registration = await this.registerOrJoin(hash);\n return registration.jobId;\n }\n\n async registerOrJoin(\n hash: string,\n ): Promise<{ jobId: string; isOwner: boolean }> {\n if (this.isDestroyed) {\n throw new Error('Dedupe store has been destroyed');\n }\n\n this.assertValidHash(hash);\n\n const pk = `DEDUPE#${hash}`;\n const maxAttempts = 3;\n\n for (let attempt = 0; attempt < maxAttempts; attempt++) {\n const candidateJobId = randomUUID();\n const now = Date.now();\n const ttl =\n this.jobTimeoutMs > 0\n ? Math.floor((now + this.jobTimeoutMs) / 1000)\n : 0;\n\n // Conditional put: only succeed if item doesn't exist or isn't pending\n try {\n await this.docClient.send(\n new PutCommand({\n TableName: this.tableName,\n Item: {\n pk,\n sk: pk,\n jobId: candidateJobId,\n status: 'pending',\n result: null,\n error: null,\n createdAt: now,\n updatedAt: now,\n ttl,\n },\n ConditionExpression:\n 'attribute_not_exists(pk) OR #status <> :pending',\n ExpressionAttributeNames: { '#status': 'status' },\n ExpressionAttributeValues: { ':pending': 'pending' },\n }),\n );\n\n return { jobId: candidateJobId, isOwner: true };\n } catch (error: unknown) {\n throwIfDynamoTableMissing(error, this.tableName);\n // ConditionalCheckFailedException means a pending job already exists\n if (\n error &&\n typeof error === 'object' &&\n 'name' in error &&\n error.name === 'ConditionalCheckFailedException'\n ) {\n // Read the existing item to get its jobId\n const existing = await this.docClient.send(\n new GetCommand({\n TableName: this.tableName,\n Key: { pk, sk: pk },\n }),\n );\n\n if (existing.Item) {\n return {\n jobId: existing.Item['jobId'] as string,\n isOwner: false,\n };\n }\n\n // Race condition: item was deleted between the failed put and the get\n // Retry on next iteration\n continue;\n }\n throw error;\n }\n }\n\n throw new Error(\n `Failed to register or join job for hash \"${hash}\" after ${maxAttempts} attempts`,\n );\n }\n\n async complete(hash: string, value: T | undefined): Promise<void> {\n if (this.isDestroyed) {\n throw new Error('Dedupe store has been destroyed');\n }\n\n this.assertValidHash(hash);\n\n let serializedResult: string;\n if (value === undefined) {\n serializedResult = '__UNDEFINED__';\n } else if (value === null) {\n serializedResult = '__NULL__';\n } else {\n try {\n serializedResult = JSON.stringify(value);\n } catch (error) {\n throw new Error(\n `Failed to serialize result: ${error instanceof Error ? error.message : String(error)}`,\n );\n }\n }\n\n const pk = `DEDUPE#${hash}`;\n\n try {\n await this.docClient.send(\n new UpdateCommand({\n TableName: this.tableName,\n Key: { pk, sk: pk },\n UpdateExpression:\n 'SET #status = :completed, #result = :result, updatedAt = :now',\n ConditionExpression: 'attribute_exists(pk) AND #status = :pending',\n ExpressionAttributeNames: {\n '#status': 'status',\n '#result': 'result',\n },\n ExpressionAttributeValues: {\n ':completed': 'completed',\n ':pending': 'pending',\n ':result': serializedResult,\n ':now': Date.now(),\n },\n }),\n );\n } catch (error: unknown) {\n throwIfDynamoTableMissing(error, this.tableName);\n // Already completed or failed — ignore\n if (\n error &&\n typeof error === 'object' &&\n 'name' in error &&\n error.name === 'ConditionalCheckFailedException'\n ) {\n return;\n }\n throw error;\n }\n\n // Resolve any waiting promises in this process immediately\n const settle = this.jobSettlers.get(hash);\n if (settle) {\n settle(value);\n }\n }\n\n async fail(hash: string, _error: Error): Promise<void> {\n if (this.isDestroyed) {\n throw new Error('Dedupe store has been destroyed');\n }\n\n this.assertValidHash(hash);\n\n const pk = `DEDUPE#${hash}`;\n\n try {\n await this.docClient.send(\n new UpdateCommand({\n TableName: this.tableName,\n Key: { pk, sk: pk },\n UpdateExpression:\n 'SET #status = :failed, #error = :error, updatedAt = :now',\n ExpressionAttributeNames: {\n '#status': 'status',\n '#error': 'error',\n },\n ExpressionAttributeValues: {\n ':failed': 'failed',\n ':error': 'Job failed',\n ':now': Date.now(),\n },\n }),\n );\n } catch (dynamoError: unknown) {\n throwIfDynamoTableMissing(dynamoError, this.tableName);\n throw dynamoError;\n }\n\n // Resolve waiters to undefined on failure\n const settle = this.jobSettlers.get(hash);\n if (settle) {\n settle(undefined);\n }\n }\n\n async isInProgress(hash: string): Promise<boolean> {\n if (this.isDestroyed) {\n throw new Error('Dedupe store has been destroyed');\n }\n\n this.assertValidHash(hash);\n\n const pk = `DEDUPE#${hash}`;\n\n let result;\n try {\n result = await this.docClient.send(\n new GetCommand({\n TableName: this.tableName,\n Key: { pk, sk: pk },\n }),\n );\n } catch (error: unknown) {\n throwIfDynamoTableMissing(error, this.tableName);\n throw error;\n }\n\n if (!result.Item) {\n return false;\n }\n\n const jobExpired =\n this.jobTimeoutMs > 0 &&\n Date.now() - (result.Item['createdAt'] as number) >= this.jobTimeoutMs;\n\n if (jobExpired) {\n await this.docClient.send(\n new DeleteCommand({\n TableName: this.tableName,\n Key: { pk, sk: pk },\n }),\n );\n return false;\n }\n\n return result.Item['status'] === 'pending';\n }\n\n async clear(): Promise<void> {\n if (this.isDestroyed) {\n throw new Error('Dedupe store has been destroyed');\n }\n\n let lastEvaluatedKey: Record<string, unknown> | undefined;\n\n do {\n let scanResult;\n try {\n scanResult = await this.docClient.send(\n new ScanCommand({\n TableName: this.tableName,\n FilterExpression: 'begins_with(pk, :prefix)',\n ExpressionAttributeValues: { ':prefix': 'DEDUPE#' },\n ProjectionExpression: 'pk, sk',\n ExclusiveStartKey: lastEvaluatedKey,\n }),\n );\n } catch (error: unknown) {\n throwIfDynamoTableMissing(error, this.tableName);\n throw error;\n }\n\n const items = scanResult.Items ?? [];\n if (items.length > 0) {\n try {\n await batchDeleteWithRetries(\n this.docClient,\n this.tableName,\n items.map((item) => ({ pk: item['pk'], sk: item['sk'] })),\n );\n } catch (error: unknown) {\n throwIfDynamoTableMissing(error, this.tableName);\n throw error;\n }\n }\n\n lastEvaluatedKey = scanResult.LastEvaluatedKey as\n | Record<string, unknown>\n | undefined;\n } while (lastEvaluatedKey);\n\n for (const settle of this.jobSettlers.values()) {\n settle(undefined);\n }\n this.jobPromises.clear();\n this.jobSettlers.clear();\n }\n\n async close(): Promise<void> {\n this.isDestroyed = true;\n\n for (const settle of this.jobSettlers.values()) {\n settle(undefined);\n }\n this.jobPromises.clear();\n this.jobSettlers.clear();\n\n if (this.isClientManaged && this.rawClient) {\n this.rawClient.destroy();\n }\n }\n\n destroy(): void {\n this.close();\n }\n\n private deserializeResult(serializedResult: unknown): T | undefined {\n try {\n if (serializedResult === '__UNDEFINED__') {\n return undefined;\n }\n if (serializedResult === '__NULL__') {\n return null as unknown as T;\n }\n if (serializedResult) {\n return JSON.parse(serializedResult as string);\n }\n return undefined;\n } catch {\n return undefined;\n }\n }\n\n private assertValidHash(hash: string): void {\n assertDynamoKeyPart(hash, 'hash');\n }\n}\n","import { randomUUID } from 'crypto';\nimport {\n DynamoDBClient,\n type DynamoDBClientConfig,\n} from '@aws-sdk/client-dynamodb';\nimport {\n DynamoDBDocumentClient,\n PutCommand,\n QueryCommand,\n ScanCommand,\n TransactWriteCommand,\n} from '@aws-sdk/lib-dynamodb';\nimport {\n type RateLimitConfig,\n type RateLimitStore,\n DEFAULT_RATE_LIMIT,\n} from '@http-client-toolkit/core';\nimport {\n assertDynamoKeyPart,\n batchDeleteWithRetries,\n isConditionalTransactionFailure,\n queryCountAllPages,\n queryCountUpTo,\n} from './dynamodb-utils.js';\nimport { throwIfDynamoTableMissing } from './table-missing-error.js';\nimport { DEFAULT_TABLE_NAME } from './table.js';\n\nexport interface DynamoDBRateLimitStoreOptions {\n client?: DynamoDBDocumentClient | DynamoDBClient;\n region?: string;\n tableName?: string;\n defaultConfig?: RateLimitConfig;\n resourceConfigs?: Map<string, RateLimitConfig>;\n}\n\nexport class DynamoDBRateLimitStore implements RateLimitStore {\n private readonly docClient: DynamoDBDocumentClient;\n private readonly rawClient: DynamoDBClient | undefined;\n private readonly isClientManaged: boolean;\n private readonly tableName: string;\n private defaultConfig: RateLimitConfig;\n private resourceConfigs: Map<string, RateLimitConfig>;\n private isDestroyed = false;\n\n constructor({\n client,\n region,\n tableName = DEFAULT_TABLE_NAME,\n defaultConfig = DEFAULT_RATE_LIMIT,\n resourceConfigs = new Map<string, RateLimitConfig>(),\n }: DynamoDBRateLimitStoreOptions = {}) {\n this.tableName = tableName;\n this.defaultConfig = defaultConfig;\n this.resourceConfigs = resourceConfigs;\n\n if (client instanceof DynamoDBDocumentClient) {\n this.docClient = client;\n this.isClientManaged = false;\n } else if (client instanceof DynamoDBClient) {\n this.docClient = DynamoDBDocumentClient.from(client);\n this.isClientManaged = false;\n } else {\n const config: DynamoDBClientConfig = {};\n if (region) config.region = region;\n this.rawClient = new DynamoDBClient(config);\n this.docClient = DynamoDBDocumentClient.from(this.rawClient);\n this.isClientManaged = true;\n }\n }\n\n async canProceed(resource: string): Promise<boolean> {\n if (this.isDestroyed) {\n throw new Error('Rate limit store has been destroyed');\n }\n\n this.assertValidResource(resource);\n\n const config = this.resourceConfigs.get(resource) ?? this.defaultConfig;\n const now = Date.now();\n const windowStart = now - config.windowMs;\n\n const hasCapacity = await this.hasCapacityInWindow(\n resource,\n windowStart,\n config.limit,\n );\n return hasCapacity;\n }\n\n async acquire(resource: string): Promise<boolean> {\n if (this.isDestroyed) {\n throw new Error('Rate limit store has been destroyed');\n }\n\n this.assertValidResource(resource);\n\n const config = this.resourceConfigs.get(resource) ?? this.defaultConfig;\n if (config.limit <= 0) {\n return false;\n }\n\n const now = Date.now();\n const windowStart = now - config.windowMs;\n const ttl = Math.floor((now + config.windowMs) / 1000);\n const eventId = randomUUID();\n const slotPrefix = `RATELIMIT_SLOT#${resource}`;\n const startSlot = Math.floor(Math.random() * config.limit);\n\n for (let offset = 0; offset < config.limit; offset++) {\n const slot = (startSlot + offset) % config.limit;\n\n try {\n await this.docClient.send(\n new TransactWriteCommand({\n TransactItems: [\n {\n Put: {\n TableName: this.tableName,\n Item: {\n pk: slotPrefix,\n sk: `SLOT#${slot}`,\n timestamp: now,\n ttl,\n },\n ConditionExpression:\n 'attribute_not_exists(pk) OR #timestamp < :windowStart',\n ExpressionAttributeNames: {\n '#timestamp': 'timestamp',\n },\n ExpressionAttributeValues: {\n ':windowStart': windowStart,\n },\n },\n },\n {\n Put: {\n TableName: this.tableName,\n Item: {\n pk: `RATELIMIT#${resource}`,\n sk: `TS#${now}#${eventId}`,\n ttl,\n timestamp: now,\n },\n },\n },\n ],\n }),\n );\n\n return true;\n } catch (error: unknown) {\n throwIfDynamoTableMissing(error, this.tableName);\n\n if (isConditionalTransactionFailure(error)) {\n continue;\n }\n\n throw error;\n }\n }\n\n return false;\n }\n\n async record(resource: string): Promise<void> {\n if (this.isDestroyed) {\n throw new Error('Rate limit store has been destroyed');\n }\n\n this.assertValidResource(resource);\n\n const now = Date.now();\n const config = this.resourceConfigs.get(resource) ?? this.defaultConfig;\n const ttl = Math.floor((now + config.windowMs) / 1000);\n const uuid = randomUUID();\n\n try {\n await this.docClient.send(\n new PutCommand({\n TableName: this.tableName,\n Item: {\n pk: `RATELIMIT#${resource}`,\n sk: `TS#${now}#${uuid}`,\n ttl,\n timestamp: now,\n },\n }),\n );\n } catch (error: unknown) {\n throwIfDynamoTableMissing(error, this.tableName);\n throw error;\n }\n }\n\n async getStatus(resource: string): Promise<{\n remaining: number;\n resetTime: Date;\n limit: number;\n }> {\n if (this.isDestroyed) {\n throw new Error('Rate limit store has been destroyed');\n }\n\n this.assertValidResource(resource);\n\n const config = this.resourceConfigs.get(resource) ?? this.defaultConfig;\n const now = Date.now();\n const windowStart = now - config.windowMs;\n\n const currentRequests = await this.countRequestsInWindow(\n resource,\n windowStart,\n );\n const remaining = Math.max(0, config.limit - currentRequests);\n\n return {\n remaining,\n resetTime: new Date(now + config.windowMs),\n limit: config.limit,\n };\n }\n\n async reset(resource: string): Promise<void> {\n if (this.isDestroyed) {\n throw new Error('Rate limit store has been destroyed');\n }\n\n this.assertValidResource(resource);\n\n await this.deleteResourceItems(resource);\n }\n\n async getWaitTime(resource: string): Promise<number> {\n if (this.isDestroyed) {\n throw new Error('Rate limit store has been destroyed');\n }\n\n this.assertValidResource(resource);\n\n const config = this.resourceConfigs.get(resource) ?? this.defaultConfig;\n\n if (config.limit === 0) {\n return config.windowMs;\n }\n\n const now = Date.now();\n const windowStart = now - config.windowMs;\n\n const hasCapacity = await this.hasCapacityInWindow(\n resource,\n windowStart,\n config.limit,\n );\n\n if (hasCapacity) {\n return 0;\n }\n\n // Find oldest request in window\n let result;\n try {\n result = await this.docClient.send(\n new QueryCommand({\n TableName: this.tableName,\n KeyConditionExpression: 'pk = :pk AND sk >= :skStart',\n ExpressionAttributeValues: {\n ':pk': `RATELIMIT#${resource}`,\n ':skStart': `TS#${windowStart}`,\n },\n Limit: 1,\n ScanIndexForward: true,\n }),\n );\n } catch (error: unknown) {\n throwIfDynamoTableMissing(error, this.tableName);\n throw error;\n }\n\n const oldestItem = result.Items?.[0];\n if (!oldestItem) {\n return 0;\n }\n\n const oldestTimestamp = oldestItem['timestamp'] as number | undefined;\n if (!oldestTimestamp) {\n return 0;\n }\n\n const timeUntilOldestExpires = oldestTimestamp + config.windowMs - now;\n return Math.max(0, timeUntilOldestExpires);\n }\n\n setResourceConfig(resource: string, config: RateLimitConfig): void {\n this.assertValidResource(resource);\n this.resourceConfigs.set(resource, config);\n }\n\n getResourceConfig(resource: string): RateLimitConfig {\n this.assertValidResource(resource);\n return this.resourceConfigs.get(resource) ?? this.defaultConfig;\n }\n\n async clear(): Promise<void> {\n if (this.isDestroyed) {\n throw new Error('Rate limit store has been destroyed');\n }\n\n let lastEvaluatedKey: Record<string, unknown> | undefined;\n\n do {\n let scanResult;\n try {\n scanResult = await this.docClient.send(\n new ScanCommand({\n TableName: this.tableName,\n FilterExpression:\n 'begins_with(pk, :prefix) OR begins_with(pk, :slotPrefix)',\n ExpressionAttributeValues: {\n ':prefix': 'RATELIMIT#',\n ':slotPrefix': 'RATELIMIT_SLOT#',\n },\n ProjectionExpression: 'pk, sk',\n ExclusiveStartKey: lastEvaluatedKey,\n }),\n );\n } catch (error: unknown) {\n throwIfDynamoTableMissing(error, this.tableName);\n throw error;\n }\n\n const items = scanResult.Items ?? [];\n if (items.length > 0) {\n try {\n await batchDeleteWithRetries(\n this.docClient,\n this.tableName,\n items.map((item) => ({ pk: item['pk'], sk: item['sk'] })),\n );\n } catch (error: unknown) {\n throwIfDynamoTableMissing(error, this.tableName);\n throw error;\n }\n }\n\n lastEvaluatedKey = scanResult.LastEvaluatedKey as\n | Record<string, unknown>\n | undefined;\n } while (lastEvaluatedKey);\n }\n\n async close(): Promise<void> {\n this.isDestroyed = true;\n\n if (this.isClientManaged && this.rawClient) {\n this.rawClient.destroy();\n }\n }\n\n destroy(): void {\n this.close();\n }\n\n private async countRequestsInWindow(\n resource: string,\n windowStart: number,\n ): Promise<number> {\n try {\n return await queryCountAllPages(this.docClient, {\n TableName: this.tableName,\n KeyConditionExpression: 'pk = :pk AND sk >= :skStart',\n ExpressionAttributeValues: {\n ':pk': `RATELIMIT#${resource}`,\n ':skStart': `TS#${windowStart}`,\n },\n Select: 'COUNT',\n });\n } catch (error: unknown) {\n throwIfDynamoTableMissing(error, this.tableName);\n throw error;\n }\n }\n\n private async hasCapacityInWindow(\n resource: string,\n windowStart: number,\n limit: number,\n ): Promise<boolean> {\n try {\n const { reachedLimit } = await queryCountUpTo(\n this.docClient,\n {\n TableName: this.tableName,\n KeyConditionExpression: 'pk = :pk AND sk >= :skStart',\n ExpressionAttributeValues: {\n ':pk': `RATELIMIT#${resource}`,\n ':skStart': `TS#${windowStart}`,\n },\n },\n limit,\n );\n\n return !reachedLimit;\n } catch (error: unknown) {\n throwIfDynamoTableMissing(error, this.tableName);\n throw error;\n }\n }\n\n private async deleteResourceItems(resource: string): Promise<void> {\n const partitionKeys = [\n `RATELIMIT#${resource}`,\n `RATELIMIT_SLOT#${resource}`,\n ];\n\n for (const pk of partitionKeys) {\n let lastEvaluatedKey: Record<string, unknown> | undefined;\n\n do {\n let queryResult;\n try {\n queryResult = await this.docClient.send(\n new QueryCommand({\n TableName: this.tableName,\n KeyConditionExpression: 'pk = :pk',\n ExpressionAttributeValues: { ':pk': pk },\n ProjectionExpression: 'pk, sk',\n ExclusiveStartKey: lastEvaluatedKey,\n }),\n );\n } catch (error: unknown) {\n throwIfDynamoTableMissing(error, this.tableName);\n throw error;\n }\n\n const items = queryResult.Items ?? [];\n if (items.length > 0) {\n try {\n await batchDeleteWithRetries(\n this.docClient,\n this.tableName,\n items.map((item) => ({ pk: item['pk'], sk: item['sk'] })),\n );\n } catch (error: unknown) {\n throwIfDynamoTableMissing(error, this.tableName);\n throw error;\n }\n }\n\n lastEvaluatedKey = queryResult.LastEvaluatedKey as\n | Record<string, unknown>\n | undefined;\n } while (lastEvaluatedKey);\n }\n }\n\n private assertValidResource(resource: string): void {\n assertDynamoKeyPart(resource, 'resource');\n }\n}\n","import { randomUUID } from 'crypto';\nimport {\n DynamoDBClient,\n type DynamoDBClientConfig,\n} from '@aws-sdk/client-dynamodb';\nimport {\n DynamoDBDocumentClient,\n PutCommand,\n QueryCommand,\n ScanCommand,\n TransactWriteCommand,\n} from '@aws-sdk/lib-dynamodb';\nimport {\n AdaptiveCapacityCalculator,\n type AdaptiveRateLimitStore as IAdaptiveRateLimitStore,\n type RequestPriority,\n type AdaptiveConfigSchema,\n type RateLimitConfig,\n type ActivityMetrics,\n type DynamicCapacityResult,\n} from '@http-client-toolkit/core';\nimport { z } from 'zod';\nimport {\n assertDynamoKeyPart,\n batchDeleteWithRetries,\n isConditionalTransactionFailure,\n queryCountAllPages,\n queryCountUpTo,\n queryItemsAllPages,\n} from './dynamodb-utils.js';\nimport { throwIfDynamoTableMissing } from './table-missing-error.js';\nimport { DEFAULT_TABLE_NAME } from './table.js';\n\nconst DEFAULT_ADAPTIVE_RATE_LIMIT: RateLimitConfig = {\n limit: 200,\n windowMs: 3600000, // 1 hour\n};\n\nexport interface DynamoDBAdaptiveRateLimitStoreOptions {\n client?: DynamoDBDocumentClient | DynamoDBClient;\n region?: string;\n tableName?: string;\n defaultConfig?: RateLimitConfig;\n resourceConfigs?: Map<string, RateLimitConfig>;\n adaptiveConfig?: Partial<z.input<typeof AdaptiveConfigSchema>>;\n}\n\nexport class DynamoDBAdaptiveRateLimitStore implements IAdaptiveRateLimitStore {\n private readonly docClient: DynamoDBDocumentClient;\n private readonly rawClient: DynamoDBClient | undefined;\n private readonly isClientManaged: boolean;\n private readonly tableName: string;\n private defaultConfig: RateLimitConfig;\n private resourceConfigs: Map<string, RateLimitConfig>;\n private isDestroyed = false;\n\n // Adaptive rate limiting components\n private capacityCalculator: AdaptiveCapacityCalculator;\n private activityMetrics = new Map<string, ActivityMetrics>();\n private lastCapacityUpdate = new Map<string, number>();\n private cachedCapacity = new Map<string, DynamicCapacityResult>();\n private readonly maxMetricSamples: number;\n\n constructor({\n client,\n region,\n tableName = DEFAULT_TABLE_NAME,\n defaultConfig = DEFAULT_ADAPTIVE_RATE_LIMIT,\n resourceConfigs = new Map<string, RateLimitConfig>(),\n adaptiveConfig = {},\n }: DynamoDBAdaptiveRateLimitStoreOptions = {}) {\n this.tableName = tableName;\n this.defaultConfig = defaultConfig;\n this.resourceConfigs = resourceConfigs;\n this.capacityCalculator = new AdaptiveCapacityCalculator(adaptiveConfig);\n this.maxMetricSamples = Math.max(\n 100,\n this.capacityCalculator.config.highActivityThreshold * 20,\n );\n\n if (client instanceof DynamoDBDocumentClient) {\n this.docClient = client;\n this.isClientManaged = false;\n } else if (client instanceof DynamoDBClient) {\n this.docClient = DynamoDBDocumentClient.from(client);\n this.isClientManaged = false;\n } else {\n const config: DynamoDBClientConfig = {};\n if (region) config.region = region;\n this.rawClient = new DynamoDBClient(config);\n this.docClient = DynamoDBDocumentClient.from(this.rawClient);\n this.isClientManaged = true;\n }\n }\n\n async canProceed(\n resource: string,\n priority: RequestPriority = 'background',\n ): Promise<boolean> {\n if (this.isDestroyed) {\n throw new Error('Rate limit store has been destroyed');\n }\n\n this.assertValidResource(resource);\n\n await this.ensureActivityMetrics(resource);\n const metrics = this.getOrCreateActivityMetrics(resource);\n const capacity = this.calculateCurrentCapacity(resource, metrics);\n\n if (priority === 'background' && capacity.backgroundPaused) {\n return false;\n }\n\n if (priority === 'user') {\n if (capacity.userReserved <= 0) {\n return false;\n }\n\n return this.hasPriorityCapacityInWindow(\n resource,\n 'user',\n capacity.userReserved,\n );\n } else {\n if (capacity.backgroundMax <= 0) {\n return false;\n }\n\n return this.hasPriorityCapacityInWindow(\n resource,\n 'background',\n capacity.backgroundMax,\n );\n }\n }\n\n async acquire(\n resource: string,\n priority: RequestPriority = 'background',\n ): Promise<boolean> {\n if (this.isDestroyed) {\n throw new Error('Rate limit store has been destroyed');\n }\n\n this.assertValidResource(resource);\n\n await this.ensureActivityMetrics(resource);\n const metrics = this.getOrCreateActivityMetrics(resource);\n const capacity = this.calculateCurrentCapacity(resource, metrics);\n\n if (priority === 'background' && capacity.backgroundPaused) {\n return false;\n }\n\n const limitForPriority =\n priority === 'user' ? capacity.userReserved : capacity.backgroundMax;\n\n if (limitForPriority <= 0) {\n return false;\n }\n\n const config = this.resourceConfigs.get(resource) ?? this.defaultConfig;\n const now = Date.now();\n const windowStart = now - config.windowMs;\n const ttl = Math.floor((now + config.windowMs) / 1000);\n const uuid = randomUUID();\n const slotPrefix = `RATELIMIT_SLOT#${resource}#${priority}`;\n const startSlot = Math.floor(Math.random() * limitForPriority);\n\n for (let offset = 0; offset < limitForPriority; offset++) {\n const slot = (startSlot + offset) % limitForPriority;\n\n try {\n await this.docClient.send(\n new TransactWriteCommand({\n TransactItems: [\n {\n Put: {\n TableName: this.tableName,\n Item: {\n pk: slotPrefix,\n sk: `SLOT#${slot}`,\n timestamp: now,\n ttl,\n },\n ConditionExpression:\n 'attribute_not_exists(pk) OR #timestamp < :windowStart',\n ExpressionAttributeNames: {\n '#timestamp': 'timestamp',\n },\n ExpressionAttributeValues: {\n ':windowStart': windowStart,\n },\n },\n },\n {\n Put: {\n TableName: this.tableName,\n Item: {\n pk: `RATELIMIT#${resource}`,\n sk: `TS#${now}#${uuid}`,\n gsi1pk: `RATELIMIT#${resource}#${priority}`,\n gsi1sk: `TS#${now}#${uuid}`,\n ttl,\n timestamp: now,\n priority,\n },\n },\n },\n ],\n }),\n );\n\n if (priority === 'user') {\n this.pushRecentRequest(metrics.recentUserRequests, now);\n } else {\n this.pushRecentRequest(metrics.recentBackgroundRequests, now);\n }\n\n metrics.userActivityTrend =\n this.capacityCalculator.calculateActivityTrend(\n metrics.recentUserRequests,\n );\n\n return true;\n } catch (error: unknown) {\n throwIfDynamoTableMissing(error, this.tableName);\n\n if (isConditionalTransactionFailure(error)) {\n continue;\n }\n\n throw error;\n }\n }\n\n return false;\n }\n\n async record(\n resource: string,\n priority: RequestPriority = 'background',\n ): Promise<void> {\n if (this.isDestroyed) {\n throw new Error('Rate limit store has been destroyed');\n }\n\n this.assertValidResource(resource);\n\n const now = Date.now();\n const config = this.resourceConfigs.get(resource) ?? this.defaultConfig;\n const ttl = Math.floor((now + config.windowMs) / 1000);\n const uuid = randomUUID();\n\n try {\n await this.docClient.send(\n new PutCommand({\n TableName: this.tableName,\n Item: {\n pk: `RATELIMIT#${resource}`,\n sk: `TS#${now}#${uuid}`,\n gsi1pk: `RATELIMIT#${resource}#${priority}`,\n gsi1sk: `TS#${now}#${uuid}`,\n ttl,\n timestamp: now,\n priority,\n },\n }),\n );\n } catch (error: unknown) {\n throwIfDynamoTableMissing(error, this.tableName);\n throw error;\n }\n\n // Update in-memory activity metrics\n const metrics = this.getOrCreateActivityMetrics(resource);\n\n if (priority === 'user') {\n this.pushRecentRequest(metrics.recentUserRequests, now);\n } else {\n this.pushRecentRequest(metrics.recentBackgroundRequests, now);\n }\n\n metrics.userActivityTrend = this.capacityCalculator.calculateActivityTrend(\n metrics.recentUserRequests,\n );\n }\n\n async getStatus(resource: string): Promise<{\n remaining: number;\n resetTime: Date;\n limit: number;\n adaptive?: {\n userReserved: number;\n backgroundMax: number;\n backgroundPaused: boolean;\n recentUserActivity: number;\n reason: string;\n };\n }> {\n if (this.isDestroyed) {\n throw new Error('Rate limit store has been destroyed');\n }\n\n this.assertValidResource(resource);\n\n await this.ensureActivityMetrics(resource);\n const metrics = this.getOrCreateActivityMetrics(resource);\n const capacity = this.calculateCurrentCapacity(resource, metrics);\n\n const [currentUserUsage, currentBackgroundUsage] = await Promise.all([\n this.getCurrentUsage(resource, 'user'),\n this.getCurrentUsage(resource, 'background'),\n ]);\n\n const config = this.resourceConfigs.get(resource) ?? this.defaultConfig;\n\n return {\n remaining:\n capacity.userReserved -\n currentUserUsage +\n (capacity.backgroundMax - currentBackgroundUsage),\n resetTime: new Date(Date.now() + config.windowMs),\n limit: this.getResourceLimit(resource),\n adaptive: {\n userReserved: capacity.userReserved,\n backgroundMax: capacity.backgroundMax,\n backgroundPaused: capacity.backgroundPaused,\n recentUserActivity: this.capacityCalculator.getRecentActivity(\n metrics.recentUserRequests,\n ),\n reason: capacity.reason,\n },\n };\n }\n\n async reset(resource: string): Promise<void> {\n if (this.isDestroyed) {\n throw new Error('Rate limit store has been destroyed');\n }\n\n this.assertValidResource(resource);\n\n await this.deleteResourceItems(resource);\n this.activityMetrics.delete(resource);\n this.cachedCapacity.delete(resource);\n this.lastCapacityUpdate.delete(resource);\n }\n\n async getWaitTime(\n resource: string,\n priority: RequestPriority = 'background',\n ): Promise<number> {\n if (this.isDestroyed) {\n throw new Error('Rate limit store has been destroyed');\n }\n\n this.assertValidResource(resource);\n\n const config = this.resourceConfigs.get(resource) ?? this.defaultConfig;\n\n if (config.limit === 0) {\n return config.windowMs;\n }\n\n const canProceed = await this.canProceed(resource, priority);\n if (canProceed) {\n return 0;\n }\n\n // For background requests that are paused, check back after recalculation interval\n await this.ensureActivityMetrics(resource);\n const metrics = this.getOrCreateActivityMetrics(resource);\n const capacity = this.calculateCurrentCapacity(resource, metrics);\n\n if (priority === 'background' && capacity.backgroundPaused) {\n return this.capacityCalculator.config.recalculationIntervalMs;\n }\n\n // Find the oldest request for this priority using GSI\n const now = Date.now();\n const windowStart = now - config.windowMs;\n\n let result;\n try {\n result = await this.docClient.send(\n new QueryCommand({\n TableName: this.tableName,\n IndexName: 'gsi1',\n KeyConditionExpression: 'gsi1pk = :gsi1pk AND gsi1sk >= :skStart',\n ExpressionAttributeValues: {\n ':gsi1pk': `RATELIMIT#${resource}#${priority}`,\n ':skStart': `TS#${windowStart}`,\n },\n Limit: 1,\n ScanIndexForward: true,\n }),\n );\n } catch (error: unknown) {\n throwIfDynamoTableMissing(error, this.tableName);\n throw error;\n }\n\n const oldestItem = result.Items?.[0];\n if (!oldestItem) {\n return 0;\n }\n\n const oldestTimestamp = oldestItem['timestamp'] as number | undefined;\n if (!oldestTimestamp) {\n return 0;\n }\n\n const timeUntilOldestExpires = oldestTimestamp + config.windowMs - now;\n return Math.max(0, timeUntilOldestExpires);\n }\n\n setResourceConfig(resource: string, config: RateLimitConfig): void {\n this.assertValidResource(resource);\n this.resourceConfigs.set(resource, config);\n }\n\n getResourceConfig(resource: string): RateLimitConfig {\n this.assertValidResource(resource);\n return this.resourceConfigs.get(resource) ?? this.defaultConfig;\n }\n\n async clear(): Promise<void> {\n if (this.isDestroyed) {\n throw new Error('Rate limit store has been destroyed');\n }\n\n let lastEvaluatedKey: Record<string, unknown> | undefined;\n\n do {\n let scanResult;\n try {\n scanResult = await this.docClient.send(\n new ScanCommand({\n TableName: this.tableName,\n FilterExpression:\n 'begins_with(pk, :prefix) OR begins_with(pk, :slotPrefix)',\n ExpressionAttributeValues: {\n ':prefix': 'RATELIMIT#',\n ':slotPrefix': 'RATELIMIT_SLOT#',\n },\n ProjectionExpression: 'pk, sk',\n ExclusiveStartKey: lastEvaluatedKey,\n }),\n );\n } catch (error: unknown) {\n throwIfDynamoTableMissing(error, this.tableName);\n throw error;\n }\n\n const items = scanResult.Items ?? [];\n if (items.length > 0) {\n try {\n await batchDeleteWithRetries(\n this.docClient,\n this.tableName,\n items.map((item) => ({ pk: item['pk'], sk: item['sk'] })),\n );\n } catch (error: unknown) {\n throwIfDynamoTableMissing(error, this.tableName);\n throw error;\n }\n }\n\n lastEvaluatedKey = scanResult.LastEvaluatedKey as\n | Record<string, unknown>\n | undefined;\n } while (lastEvaluatedKey);\n\n this.activityMetrics.clear();\n this.cachedCapacity.clear();\n this.lastCapacityUpdate.clear();\n }\n\n async close(): Promise<void> {\n this.isDestroyed = true;\n\n if (this.isClientManaged && this.rawClient) {\n this.rawClient.destroy();\n }\n }\n\n destroy(): void {\n this.close();\n }\n\n // Private helper methods\n\n private calculateCurrentCapacity(\n resource: string,\n metrics: ActivityMetrics,\n ): DynamicCapacityResult {\n const lastUpdate = this.lastCapacityUpdate.get(resource) ?? 0;\n const recalcInterval =\n this.capacityCalculator.config.recalculationIntervalMs;\n\n if (Date.now() - lastUpdate < recalcInterval) {\n return (\n this.cachedCapacity.get(resource) ?? this.getDefaultCapacity(resource)\n );\n }\n\n const totalLimit = this.getResourceLimit(resource);\n const capacity = this.capacityCalculator.calculateDynamicCapacity(\n resource,\n totalLimit,\n metrics,\n );\n\n this.cachedCapacity.set(resource, capacity);\n this.lastCapacityUpdate.set(resource, Date.now());\n\n return capacity;\n }\n\n private getOrCreateActivityMetrics(resource: string): ActivityMetrics {\n if (!this.activityMetrics.has(resource)) {\n this.activityMetrics.set(resource, {\n recentUserRequests: [],\n recentBackgroundRequests: [],\n userActivityTrend: 'none',\n });\n }\n return this.activityMetrics.get(resource)!;\n }\n\n private async ensureActivityMetrics(resource: string): Promise<void> {\n if (this.activityMetrics.has(resource)) {\n return;\n }\n\n // Load recent activity from DynamoDB to populate in-memory metrics\n const now = Date.now();\n const windowStart = now - this.capacityCalculator.config.monitoringWindowMs;\n\n let userItems: Array<Record<string, unknown>>;\n let backgroundItems: Array<Record<string, unknown>>;\n try {\n [userItems, backgroundItems] = await Promise.all([\n queryItemsAllPages(this.docClient, {\n TableName: this.tableName,\n IndexName: 'gsi1',\n KeyConditionExpression: 'gsi1pk = :gsi1pk AND gsi1sk >= :skStart',\n ExpressionAttributeValues: {\n ':gsi1pk': `RATELIMIT#${resource}#user`,\n ':skStart': `TS#${windowStart}`,\n },\n ProjectionExpression: '#ts',\n ExpressionAttributeNames: { '#ts': 'timestamp' },\n }),\n queryItemsAllPages(this.docClient, {\n TableName: this.tableName,\n IndexName: 'gsi1',\n KeyConditionExpression: 'gsi1pk = :gsi1pk AND gsi1sk >= :skStart',\n ExpressionAttributeValues: {\n ':gsi1pk': `RATELIMIT#${resource}#background`,\n ':skStart': `TS#${windowStart}`,\n },\n ProjectionExpression: '#ts',\n ExpressionAttributeNames: { '#ts': 'timestamp' },\n }),\n ]);\n } catch (error: unknown) {\n throwIfDynamoTableMissing(error, this.tableName);\n throw error;\n }\n\n const metrics: ActivityMetrics = {\n recentUserRequests: userItems\n .map((item) => item['timestamp'] as number)\n .slice(-this.maxMetricSamples),\n recentBackgroundRequests: backgroundItems\n .map((item) => item['timestamp'] as number)\n .slice(-this.maxMetricSamples),\n userActivityTrend: 'none',\n };\n\n this.cleanupOldRequests(metrics.recentUserRequests);\n this.cleanupOldRequests(metrics.recentBackgroundRequests);\n\n metrics.userActivityTrend = this.capacityCalculator.calculateActivityTrend(\n metrics.recentUserRequests,\n );\n\n this.activityMetrics.set(resource, metrics);\n }\n\n private async getCurrentUsage(\n resource: string,\n priority: RequestPriority,\n ): Promise<number> {\n const config = this.resourceConfigs.get(resource) ?? this.defaultConfig;\n const now = Date.now();\n const windowStart = now - config.windowMs;\n\n try {\n return await queryCountAllPages(this.docClient, {\n TableName: this.tableName,\n IndexName: 'gsi1',\n KeyConditionExpression: 'gsi1pk = :gsi1pk AND gsi1sk >= :skStart',\n ExpressionAttributeValues: {\n ':gsi1pk': `RATELIMIT#${resource}#${priority}`,\n ':skStart': `TS#${windowStart}`,\n },\n Select: 'COUNT',\n });\n } catch (error: unknown) {\n throwIfDynamoTableMissing(error, this.tableName);\n throw error;\n }\n }\n\n private async hasPriorityCapacityInWindow(\n resource: string,\n priority: RequestPriority,\n limit: number,\n ): Promise<boolean> {\n const config = this.resourceConfigs.get(resource) ?? this.defaultConfig;\n const now = Date.now();\n const windowStart = now - config.windowMs;\n\n try {\n const { reachedLimit } = await queryCountUpTo(\n this.docClient,\n {\n TableName: this.tableName,\n IndexName: 'gsi1',\n KeyConditionExpression: 'gsi1pk = :gsi1pk AND gsi1sk >= :skStart',\n ExpressionAttributeValues: {\n ':gsi1pk': `RATELIMIT#${resource}#${priority}`,\n ':skStart': `TS#${windowStart}`,\n },\n },\n limit,\n );\n\n return !reachedLimit;\n } catch (error: unknown) {\n throwIfDynamoTableMissing(error, this.tableName);\n throw error;\n }\n }\n\n private cleanupOldRequests(requests: Array<number>): void {\n const cutoff =\n Date.now() - this.capacityCalculator.config.monitoringWindowMs;\n const idx = requests.findIndex((t) => t >= cutoff);\n if (idx > 0) {\n requests.splice(0, idx);\n } else if (idx === -1 && requests.length > 0) {\n requests.length = 0;\n }\n }\n\n private pushRecentRequest(requests: Array<number>, timestamp: number): void {\n requests.push(timestamp);\n this.cleanupOldRequests(requests);\n\n const overflow = requests.length - this.maxMetricSamples;\n if (overflow > 0) {\n requests.splice(0, overflow);\n }\n }\n\n private getResourceLimit(resource: string): number {\n const config = this.resourceConfigs.get(resource) ?? this.defaultConfig;\n return config.limit;\n }\n\n private getDefaultCapacity(resource: string): DynamicCapacityResult {\n const limit = this.getResourceLimit(resource);\n const userReserved = Math.floor(limit * 0.3);\n const backgroundMax = Math.max(0, limit - userReserved);\n return {\n userReserved,\n backgroundMax,\n backgroundPaused: false,\n reason: 'Default capacity allocation',\n };\n }\n\n private async deleteResourceItems(resource: string): Promise<void> {\n const partitionKeys = [\n `RATELIMIT#${resource}`,\n `RATELIMIT_SLOT#${resource}#user`,\n `RATELIMIT_SLOT#${resource}#background`,\n ];\n\n for (const pk of partitionKeys) {\n let lastEvaluatedKey: Record<string, unknown> | undefined;\n\n do {\n let queryResult;\n try {\n queryResult = await this.docClient.send(\n new QueryCommand({\n TableName: this.tableName,\n KeyConditionExpression: 'pk = :pk',\n ExpressionAttributeValues: { ':pk': pk },\n ProjectionExpression: 'pk, sk',\n ExclusiveStartKey: lastEvaluatedKey,\n }),\n );\n } catch (error: unknown) {\n throwIfDynamoTableMissing(error, this.tableName);\n throw error;\n }\n\n const items = queryResult.Items ?? [];\n if (items.length > 0) {\n try {\n await batchDeleteWithRetries(\n this.docClient,\n this.tableName,\n items.map((item) => ({ pk: item['pk'], sk: item['sk'] })),\n );\n } catch (error: unknown) {\n throwIfDynamoTableMissing(error, this.tableName);\n throw error;\n }\n }\n\n lastEvaluatedKey = queryResult.LastEvaluatedKey as\n | Record<string, unknown>\n | undefined;\n } while (lastEvaluatedKey);\n }\n }\n\n private assertValidResource(resource: string): void {\n assertDynamoKeyPart(resource, 'resource');\n }\n}\n"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@http-client-toolkit/store-dynamodb",
|
|
3
|
+
"description": "DynamoDB store implementations for HTTP client toolkit caching, deduplication, and rate limiting",
|
|
4
|
+
"repository": {
|
|
5
|
+
"type": "git",
|
|
6
|
+
"url": "git+https://github.com/AllyMurray/http-client-toolkit.git"
|
|
7
|
+
},
|
|
8
|
+
"type": "module",
|
|
9
|
+
"version": "0.0.1",
|
|
10
|
+
"main": "./lib/index.cjs",
|
|
11
|
+
"module": "./lib/index.js",
|
|
12
|
+
"types": "./lib/index.d.ts",
|
|
13
|
+
"exports": {
|
|
14
|
+
".": {
|
|
15
|
+
"import": {
|
|
16
|
+
"types": "./lib/index.d.ts",
|
|
17
|
+
"default": "./lib/index.js"
|
|
18
|
+
},
|
|
19
|
+
"require": {
|
|
20
|
+
"types": "./lib/index.d.cts",
|
|
21
|
+
"default": "./lib/index.cjs"
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
},
|
|
25
|
+
"dependencies": {
|
|
26
|
+
"zod": "^3.23.8",
|
|
27
|
+
"@http-client-toolkit/core": "0.0.1"
|
|
28
|
+
},
|
|
29
|
+
"peerDependencies": {
|
|
30
|
+
"@aws-sdk/client-dynamodb": "^3.0.0",
|
|
31
|
+
"@aws-sdk/lib-dynamodb": "^3.0.0"
|
|
32
|
+
},
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"@aws-sdk/client-dynamodb": "^3.750.0",
|
|
35
|
+
"@aws-sdk/lib-dynamodb": "^3.750.0",
|
|
36
|
+
"aws-sdk-client-mock": "^4.1.0",
|
|
37
|
+
"aws-sdk-client-mock-vitest": "^6.2.1",
|
|
38
|
+
"@types/node": "20",
|
|
39
|
+
"eslint": "^9.39.0",
|
|
40
|
+
"tsup": "8.5.0",
|
|
41
|
+
"typescript": "5.8.3",
|
|
42
|
+
"vitest": "3.2.4",
|
|
43
|
+
"@repo/eslint-config": "0.0.1",
|
|
44
|
+
"@repo/vitest-config": "0.0.1",
|
|
45
|
+
"@repo/tsup-config": "0.0.1"
|
|
46
|
+
},
|
|
47
|
+
"sideEffects": false,
|
|
48
|
+
"files": [
|
|
49
|
+
"lib/**"
|
|
50
|
+
],
|
|
51
|
+
"engines": {
|
|
52
|
+
"node": ">= 20.0.0"
|
|
53
|
+
},
|
|
54
|
+
"homepage": "https://github.com/AllyMurray/http-client-toolkit#readme",
|
|
55
|
+
"bugs": {
|
|
56
|
+
"url": "https://github.com/AllyMurray/http-client-toolkit/issues"
|
|
57
|
+
},
|
|
58
|
+
"author": {
|
|
59
|
+
"name": "Ally Murray",
|
|
60
|
+
"email": "allymurray88@gmail.com",
|
|
61
|
+
"organization": false
|
|
62
|
+
},
|
|
63
|
+
"license": "ISC",
|
|
64
|
+
"publishConfig": {
|
|
65
|
+
"access": "public"
|
|
66
|
+
},
|
|
67
|
+
"scripts": {
|
|
68
|
+
"build": "tsup && npm run test",
|
|
69
|
+
"lint": "eslint --fix src && prettier --write .",
|
|
70
|
+
"test": "vitest run --dir=src",
|
|
71
|
+
"test:coverage": "vitest run --dir=src --coverage",
|
|
72
|
+
"test:watch": "vitest --dir=src",
|
|
73
|
+
"dev": "tsup --watch",
|
|
74
|
+
"clean": "rimraf lib dist node_modules .turbo"
|
|
75
|
+
}
|
|
76
|
+
}
|