@celerity-sdk/datastore 0.4.0 → 0.6.0

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.
@@ -0,0 +1,21 @@
1
+ import {
2
+ __name
3
+ } from "./chunk-7QVYU63E.js";
4
+
5
+ // src/providers/dynamodb/config.ts
6
+ function captureDynamoDBConfig() {
7
+ return {
8
+ region: process.env.AWS_REGION ?? process.env.AWS_DEFAULT_REGION,
9
+ endpoint: process.env.CELERITY_AWS_DYNAMODB_ENDPOINT ?? process.env.AWS_ENDPOINT_URL,
10
+ credentials: process.env.AWS_ACCESS_KEY_ID && process.env.AWS_SECRET_ACCESS_KEY ? {
11
+ accessKeyId: process.env.AWS_ACCESS_KEY_ID,
12
+ secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY
13
+ } : void 0
14
+ };
15
+ }
16
+ __name(captureDynamoDBConfig, "captureDynamoDBConfig");
17
+
18
+ export {
19
+ captureDynamoDBConfig
20
+ };
21
+ //# sourceMappingURL=chunk-3I3BMI7I.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/providers/dynamodb/config.ts"],"sourcesContent":["import type { DynamoDBDatastoreConfig } from \"./types\";\n\n/**\n * Captures DynamoDB configuration from environment variables.\n * This is the only place that reads `process.env` for DynamoDB config.\n */\nexport function captureDynamoDBConfig(): DynamoDBDatastoreConfig {\n return {\n region: process.env.AWS_REGION ?? process.env.AWS_DEFAULT_REGION,\n endpoint: process.env.CELERITY_AWS_DYNAMODB_ENDPOINT ?? process.env.AWS_ENDPOINT_URL,\n credentials:\n process.env.AWS_ACCESS_KEY_ID && process.env.AWS_SECRET_ACCESS_KEY\n ? {\n accessKeyId: process.env.AWS_ACCESS_KEY_ID,\n secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,\n }\n : undefined,\n };\n}\n"],"mappings":";;;;;AAMO,SAASA,wBAAAA;AACd,SAAO;IACLC,QAAQC,QAAQC,IAAIC,cAAcF,QAAQC,IAAIE;IAC9CC,UAAUJ,QAAQC,IAAII,kCAAkCL,QAAQC,IAAIK;IACpEC,aACEP,QAAQC,IAAIO,qBAAqBR,QAAQC,IAAIQ,wBACzC;MACEC,aAAaV,QAAQC,IAAIO;MACzBG,iBAAiBX,QAAQC,IAAIQ;IAC/B,IACAG;EACR;AACF;AAZgBd;","names":["captureDynamoDBConfig","region","process","env","AWS_REGION","AWS_DEFAULT_REGION","endpoint","CELERITY_AWS_DYNAMODB_ENDPOINT","AWS_ENDPOINT_URL","credentials","AWS_ACCESS_KEY_ID","AWS_SECRET_ACCESS_KEY","accessKeyId","secretAccessKey","undefined"]}
@@ -0,0 +1,7 @@
1
+ var __defProp = Object.defineProperty;
2
+ var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
3
+
4
+ export {
5
+ __name
6
+ };
7
+ //# sourceMappingURL=chunk-7QVYU63E.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,30 @@
1
+ import {
2
+ __name
3
+ } from "./chunk-7QVYU63E.js";
4
+
5
+ // src/errors.ts
6
+ var DatastoreError = class extends Error {
7
+ static {
8
+ __name(this, "DatastoreError");
9
+ }
10
+ table;
11
+ constructor(message, table, options) {
12
+ super(message, options), this.table = table;
13
+ this.name = "DatastoreError";
14
+ }
15
+ };
16
+ var ConditionalCheckFailedError = class extends DatastoreError {
17
+ static {
18
+ __name(this, "ConditionalCheckFailedError");
19
+ }
20
+ constructor(table, options) {
21
+ super(`Conditional check failed on table "${table}"`, table, options);
22
+ this.name = "ConditionalCheckFailedError";
23
+ }
24
+ };
25
+
26
+ export {
27
+ DatastoreError,
28
+ ConditionalCheckFailedError
29
+ };
30
+ //# sourceMappingURL=chunk-HHZJK2AK.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/errors.ts"],"sourcesContent":["export class DatastoreError extends Error {\n constructor(\n message: string,\n public readonly table: string,\n options?: { cause?: unknown },\n ) {\n super(message, options);\n this.name = \"DatastoreError\";\n }\n}\n\nexport class ConditionalCheckFailedError extends DatastoreError {\n constructor(table: string, options?: { cause?: unknown }) {\n super(`Conditional check failed on table \"${table}\"`, table, options);\n this.name = \"ConditionalCheckFailedError\";\n }\n}\n"],"mappings":";;;;;AAAO,IAAMA,iBAAN,cAA6BC,MAAAA;EAApC,OAAoCA;;;;EAClC,YACEC,SACgBC,OAChBC,SACA;AACA,UAAMF,SAASE,OAAAA,GAAAA,KAHCD,QAAAA;AAIhB,SAAKE,OAAO;EACd;AACF;AAEO,IAAMC,8BAAN,cAA0CN,eAAAA;EAXjD,OAWiDA;;;EAC/C,YAAYG,OAAeC,SAA+B;AACxD,UAAM,sCAAsCD,KAAAA,KAAUA,OAAOC,OAAAA;AAC7D,SAAKC,OAAO;EACd;AACF;","names":["DatastoreError","Error","message","table","options","name","ConditionalCheckFailedError"]}
@@ -0,0 +1,8 @@
1
+ import {
2
+ captureDynamoDBConfig
3
+ } from "./chunk-3I3BMI7I.js";
4
+ import "./chunk-7QVYU63E.js";
5
+ export {
6
+ captureDynamoDBConfig
7
+ };
8
+ //# sourceMappingURL=config-IXTAYSFF.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,463 @@
1
+ import {
2
+ ConditionalCheckFailedError,
3
+ DatastoreError
4
+ } from "./chunk-HHZJK2AK.js";
5
+ import {
6
+ captureDynamoDBConfig
7
+ } from "./chunk-3I3BMI7I.js";
8
+ import {
9
+ __name
10
+ } from "./chunk-7QVYU63E.js";
11
+
12
+ // src/providers/dynamodb/dynamodb-datastore-client.ts
13
+ import { DynamoDBClient } from "@aws-sdk/client-dynamodb";
14
+ import { DynamoDBDocumentClient } from "@aws-sdk/lib-dynamodb";
15
+
16
+ // src/providers/dynamodb/dynamodb-datastore.ts
17
+ import createDebug2 from "debug";
18
+ import { GetCommand, PutCommand, DeleteCommand, BatchGetCommand, BatchWriteCommand } from "@aws-sdk/lib-dynamodb";
19
+
20
+ // src/providers/dynamodb/dynamodb-item-listing.ts
21
+ import createDebug from "debug";
22
+ import { QueryCommand, ScanCommand } from "@aws-sdk/lib-dynamodb";
23
+
24
+ // src/providers/dynamodb/expressions.ts
25
+ var COMPARISON_OPERATORS = {
26
+ eq: "=",
27
+ ne: "<>",
28
+ lt: "<",
29
+ le: "<=",
30
+ gt: ">",
31
+ ge: ">="
32
+ };
33
+ function buildKeyConditionExpression(key, range) {
34
+ const names = {};
35
+ const values = {};
36
+ let counter = 0;
37
+ const pkName = `#k${counter}`;
38
+ const pkValue = `:k${counter}`;
39
+ names[pkName] = key.name;
40
+ values[pkValue] = key.value;
41
+ counter++;
42
+ let expression = `${pkName} = ${pkValue}`;
43
+ if (range) {
44
+ const skName = `#k${counter}`;
45
+ names[skName] = range.name;
46
+ switch (range.operator) {
47
+ case "eq":
48
+ case "lt":
49
+ case "le":
50
+ case "gt":
51
+ case "ge": {
52
+ const skValue = `:k${counter}`;
53
+ values[skValue] = range.value;
54
+ expression += ` AND ${skName} ${COMPARISON_OPERATORS[range.operator]} ${skValue}`;
55
+ break;
56
+ }
57
+ case "between": {
58
+ const lowVal = `:k${counter}a`;
59
+ const highVal = `:k${counter}b`;
60
+ values[lowVal] = range.low;
61
+ values[highVal] = range.high;
62
+ expression += ` AND ${skName} BETWEEN ${lowVal} AND ${highVal}`;
63
+ break;
64
+ }
65
+ case "startsWith": {
66
+ const skValue = `:k${counter}`;
67
+ values[skValue] = range.value;
68
+ expression += ` AND begins_with(${skName}, ${skValue})`;
69
+ break;
70
+ }
71
+ }
72
+ }
73
+ return {
74
+ expression,
75
+ names,
76
+ values
77
+ };
78
+ }
79
+ __name(buildKeyConditionExpression, "buildKeyConditionExpression");
80
+ function buildFilterExpression(conditions) {
81
+ const condArray = Array.isArray(conditions) ? conditions : [
82
+ conditions
83
+ ];
84
+ const names = {};
85
+ const values = {};
86
+ const parts = [];
87
+ let counter = 0;
88
+ for (const cond of condArray) {
89
+ const attrName = `#f${counter}`;
90
+ names[attrName] = cond.name;
91
+ switch (cond.operator) {
92
+ case "eq":
93
+ case "ne":
94
+ case "lt":
95
+ case "le":
96
+ case "gt":
97
+ case "ge": {
98
+ const valKey = `:f${counter}`;
99
+ values[valKey] = cond.value;
100
+ parts.push(`${attrName} ${COMPARISON_OPERATORS[cond.operator]} ${valKey}`);
101
+ break;
102
+ }
103
+ case "between": {
104
+ const lowVal = `:f${counter}a`;
105
+ const highVal = `:f${counter}b`;
106
+ values[lowVal] = cond.low;
107
+ values[highVal] = cond.high;
108
+ parts.push(`${attrName} BETWEEN ${lowVal} AND ${highVal}`);
109
+ break;
110
+ }
111
+ case "startsWith":
112
+ case "contains": {
113
+ const valKey = `:f${counter}`;
114
+ values[valKey] = cond.value;
115
+ const fnName = cond.operator === "startsWith" ? "begins_with" : "contains";
116
+ parts.push(`${fnName}(${attrName}, ${valKey})`);
117
+ break;
118
+ }
119
+ case "exists":
120
+ parts.push(`attribute_exists(${attrName})`);
121
+ break;
122
+ }
123
+ counter++;
124
+ }
125
+ return {
126
+ expression: parts.join(" AND "),
127
+ names,
128
+ values
129
+ };
130
+ }
131
+ __name(buildFilterExpression, "buildFilterExpression");
132
+
133
+ // src/providers/dynamodb/dynamodb-item-listing.ts
134
+ var debug = createDebug("celerity:datastore:dynamodb");
135
+ function encodeCursor(lastEvaluatedKey) {
136
+ const state = {
137
+ lastEvaluatedKey
138
+ };
139
+ return Buffer.from(JSON.stringify(state)).toString("base64url");
140
+ }
141
+ __name(encodeCursor, "encodeCursor");
142
+ function decodeCursor(cursor) {
143
+ return JSON.parse(Buffer.from(cursor, "base64url").toString("utf-8"));
144
+ }
145
+ __name(decodeCursor, "decodeCursor");
146
+ var DynamoDBItemListing = class {
147
+ static {
148
+ __name(this, "DynamoDBItemListing");
149
+ }
150
+ client;
151
+ tableName;
152
+ mode;
153
+ options;
154
+ tracer;
155
+ _cursor;
156
+ constructor(client, tableName, mode, options, tracer) {
157
+ this.client = client;
158
+ this.tableName = tableName;
159
+ this.mode = mode;
160
+ this.options = options;
161
+ this.tracer = tracer;
162
+ this._cursor = options.cursor;
163
+ }
164
+ get cursor() {
165
+ return this._cursor;
166
+ }
167
+ async *[Symbol.asyncIterator]() {
168
+ const cursorState = this._cursor ? decodeCursor(this._cursor) : void 0;
169
+ let exclusiveStartKey = cursorState?.lastEvaluatedKey;
170
+ do {
171
+ debug("%s page %s key=%o", this.mode, this.tableName, exclusiveStartKey ?? "(start)");
172
+ const response = await this.fetchPage(exclusiveStartKey);
173
+ for (const item of response.Items ?? []) {
174
+ yield item;
175
+ }
176
+ exclusiveStartKey = response.LastEvaluatedKey;
177
+ if (exclusiveStartKey) {
178
+ this._cursor = encodeCursor(exclusiveStartKey);
179
+ } else {
180
+ this._cursor = void 0;
181
+ }
182
+ } while (exclusiveStartKey);
183
+ }
184
+ async fetchPage(exclusiveStartKey) {
185
+ const command = this.mode === "query" ? this.buildQueryCommand(exclusiveStartKey) : this.buildScanCommand(exclusiveStartKey);
186
+ const doFetch = /* @__PURE__ */ __name(async () => {
187
+ try {
188
+ return await this.client.send(command);
189
+ } catch (error) {
190
+ throw new DatastoreError(`Failed to ${this.mode} table "${this.tableName}"`, this.tableName, {
191
+ cause: error
192
+ });
193
+ }
194
+ }, "doFetch");
195
+ if (!this.tracer) return doFetch();
196
+ return this.tracer.withSpan(`celerity.datastore.${this.mode}_page`, () => doFetch(), {
197
+ "datastore.table": this.tableName
198
+ });
199
+ }
200
+ buildQueryCommand(exclusiveStartKey) {
201
+ const opts = this.options;
202
+ const keyExpr = buildKeyConditionExpression(opts.key, opts.range);
203
+ const filterExpr = opts.filter ? buildFilterExpression(opts.filter) : void 0;
204
+ return new QueryCommand({
205
+ TableName: this.tableName,
206
+ IndexName: opts.indexName,
207
+ KeyConditionExpression: keyExpr.expression,
208
+ FilterExpression: filterExpr?.expression,
209
+ ExpressionAttributeNames: {
210
+ ...keyExpr.names,
211
+ ...filterExpr?.names
212
+ },
213
+ ExpressionAttributeValues: {
214
+ ...keyExpr.values,
215
+ ...filterExpr?.values
216
+ },
217
+ ScanIndexForward: opts.sortAscending,
218
+ Limit: opts.maxResults,
219
+ ExclusiveStartKey: exclusiveStartKey,
220
+ ConsistentRead: opts.consistentRead
221
+ });
222
+ }
223
+ buildScanCommand(exclusiveStartKey) {
224
+ const opts = this.options;
225
+ const filterExpr = opts.filter ? buildFilterExpression(opts.filter) : void 0;
226
+ return new ScanCommand({
227
+ TableName: this.tableName,
228
+ IndexName: opts.indexName,
229
+ FilterExpression: filterExpr?.expression,
230
+ ExpressionAttributeNames: filterExpr?.names && Object.keys(filterExpr.names).length > 0 ? filterExpr.names : void 0,
231
+ ExpressionAttributeValues: filterExpr?.values && Object.keys(filterExpr.values).length > 0 ? filterExpr.values : void 0,
232
+ Limit: opts.maxResults,
233
+ ExclusiveStartKey: exclusiveStartKey,
234
+ ConsistentRead: opts.consistentRead
235
+ });
236
+ }
237
+ };
238
+
239
+ // src/providers/dynamodb/errors.ts
240
+ function isConditionalCheckFailedError(error) {
241
+ if (!(error instanceof Error)) return false;
242
+ return error.name === "ConditionalCheckFailedException";
243
+ }
244
+ __name(isConditionalCheckFailedError, "isConditionalCheckFailedError");
245
+
246
+ // src/providers/dynamodb/dynamodb-datastore.ts
247
+ var debug2 = createDebug2("celerity:datastore:dynamodb");
248
+ var DynamoDBDatastore = class {
249
+ static {
250
+ __name(this, "DynamoDBDatastore");
251
+ }
252
+ tableName;
253
+ client;
254
+ tracer;
255
+ constructor(tableName, client, tracer) {
256
+ this.tableName = tableName;
257
+ this.client = client;
258
+ this.tracer = tracer;
259
+ }
260
+ async getItem(key, options) {
261
+ debug2("getItem %s %o", this.tableName, key);
262
+ return this.traced("celerity.datastore.get_item", {
263
+ "datastore.table": this.tableName
264
+ }, async () => {
265
+ try {
266
+ const response = await this.client.send(new GetCommand({
267
+ TableName: this.tableName,
268
+ Key: key,
269
+ ConsistentRead: options?.consistentRead
270
+ }));
271
+ return response.Item ?? null;
272
+ } catch (error) {
273
+ throw new DatastoreError(`Failed to get item from table "${this.tableName}"`, this.tableName, {
274
+ cause: error
275
+ });
276
+ }
277
+ });
278
+ }
279
+ async putItem(item, options) {
280
+ debug2("putItem %s", this.tableName);
281
+ return this.traced("celerity.datastore.put_item", {
282
+ "datastore.table": this.tableName
283
+ }, async () => {
284
+ try {
285
+ const conditionParams = options?.condition ? buildFilterExpression(options.condition) : void 0;
286
+ await this.client.send(new PutCommand({
287
+ TableName: this.tableName,
288
+ Item: item,
289
+ ConditionExpression: conditionParams?.expression,
290
+ ExpressionAttributeNames: conditionParams?.names,
291
+ ExpressionAttributeValues: conditionParams?.values
292
+ }));
293
+ } catch (error) {
294
+ if (isConditionalCheckFailedError(error)) {
295
+ throw new ConditionalCheckFailedError(this.tableName, {
296
+ cause: error
297
+ });
298
+ }
299
+ throw new DatastoreError(`Failed to put item in table "${this.tableName}"`, this.tableName, {
300
+ cause: error
301
+ });
302
+ }
303
+ });
304
+ }
305
+ async deleteItem(key, options) {
306
+ debug2("deleteItem %s %o", this.tableName, key);
307
+ return this.traced("celerity.datastore.delete_item", {
308
+ "datastore.table": this.tableName
309
+ }, async () => {
310
+ try {
311
+ const conditionParams = options?.condition ? buildFilterExpression(options.condition) : void 0;
312
+ await this.client.send(new DeleteCommand({
313
+ TableName: this.tableName,
314
+ Key: key,
315
+ ConditionExpression: conditionParams?.expression,
316
+ ExpressionAttributeNames: conditionParams?.names,
317
+ ExpressionAttributeValues: conditionParams?.values
318
+ }));
319
+ } catch (error) {
320
+ if (isConditionalCheckFailedError(error)) {
321
+ throw new ConditionalCheckFailedError(this.tableName, {
322
+ cause: error
323
+ });
324
+ }
325
+ throw new DatastoreError(`Failed to delete item from table "${this.tableName}"`, this.tableName, {
326
+ cause: error
327
+ });
328
+ }
329
+ });
330
+ }
331
+ query(options) {
332
+ debug2("query %s pk=%s", this.tableName, options.key.name);
333
+ return new DynamoDBItemListing(this.client, this.tableName, "query", options, this.tracer);
334
+ }
335
+ scan(options) {
336
+ debug2("scan %s", this.tableName);
337
+ return new DynamoDBItemListing(this.client, this.tableName, "scan", options ?? {}, this.tracer);
338
+ }
339
+ async batchGetItems(keys, options) {
340
+ debug2("batchGetItems %s count=%d", this.tableName, keys.length);
341
+ return this.traced("celerity.datastore.batch_get_items", {
342
+ "datastore.table": this.tableName,
343
+ "datastore.batch_size": keys.length
344
+ }, async () => {
345
+ try {
346
+ const response = await this.client.send(new BatchGetCommand({
347
+ RequestItems: {
348
+ [this.tableName]: {
349
+ Keys: keys,
350
+ ConsistentRead: options?.consistentRead
351
+ }
352
+ }
353
+ }));
354
+ const items = response.Responses?.[this.tableName] ?? [];
355
+ const unprocessedKeys = response.UnprocessedKeys?.[this.tableName]?.Keys ?? [];
356
+ return {
357
+ items,
358
+ unprocessedKeys
359
+ };
360
+ } catch (error) {
361
+ throw new DatastoreError(`Failed to batch get items from table "${this.tableName}"`, this.tableName, {
362
+ cause: error
363
+ });
364
+ }
365
+ });
366
+ }
367
+ async batchWriteItems(operations) {
368
+ debug2("batchWriteItems %s count=%d", this.tableName, operations.length);
369
+ return this.traced("celerity.datastore.batch_write_items", {
370
+ "datastore.table": this.tableName,
371
+ "datastore.batch_size": operations.length
372
+ }, async () => {
373
+ try {
374
+ const writeRequests = operations.map((op) => {
375
+ if (op.type === "put") {
376
+ return {
377
+ PutRequest: {
378
+ Item: op.item
379
+ }
380
+ };
381
+ }
382
+ return {
383
+ DeleteRequest: {
384
+ Key: op.key
385
+ }
386
+ };
387
+ });
388
+ const response = await this.client.send(new BatchWriteCommand({
389
+ RequestItems: {
390
+ [this.tableName]: writeRequests
391
+ }
392
+ }));
393
+ const unprocessedRequests = response.UnprocessedItems?.[this.tableName] ?? [];
394
+ const unprocessedOperations = unprocessedRequests.map((req) => {
395
+ if (req.PutRequest) {
396
+ return {
397
+ type: "put",
398
+ item: req.PutRequest.Item
399
+ };
400
+ }
401
+ return {
402
+ type: "delete",
403
+ key: req.DeleteRequest.Key
404
+ };
405
+ });
406
+ return {
407
+ unprocessedOperations
408
+ };
409
+ } catch (error) {
410
+ throw new DatastoreError(`Failed to batch write items to table "${this.tableName}"`, this.tableName, {
411
+ cause: error
412
+ });
413
+ }
414
+ });
415
+ }
416
+ traced(name, attributes, fn) {
417
+ if (!this.tracer) return fn();
418
+ return this.tracer.withSpan(name, (span) => fn(span), attributes);
419
+ }
420
+ };
421
+
422
+ // src/providers/dynamodb/dynamodb-datastore-client.ts
423
+ var DynamoDBDatastoreClient = class {
424
+ static {
425
+ __name(this, "DynamoDBDatastoreClient");
426
+ }
427
+ tracer;
428
+ client = null;
429
+ docClient = null;
430
+ config;
431
+ constructor(config, tracer) {
432
+ this.tracer = tracer;
433
+ this.config = config ?? captureDynamoDBConfig();
434
+ }
435
+ datastore(name) {
436
+ return new DynamoDBDatastore(name, this.getDocClient(), this.tracer);
437
+ }
438
+ close() {
439
+ this.docClient?.destroy();
440
+ this.client?.destroy();
441
+ this.docClient = null;
442
+ this.client = null;
443
+ }
444
+ getDocClient() {
445
+ if (!this.docClient) {
446
+ this.client = new DynamoDBClient({
447
+ region: this.config.region,
448
+ endpoint: this.config.endpoint,
449
+ credentials: this.config.credentials
450
+ });
451
+ this.docClient = DynamoDBDocumentClient.from(this.client, {
452
+ marshallOptions: {
453
+ removeUndefinedValues: true
454
+ }
455
+ });
456
+ }
457
+ return this.docClient;
458
+ }
459
+ };
460
+ export {
461
+ DynamoDBDatastoreClient
462
+ };
463
+ //# sourceMappingURL=dynamodb-datastore-client-LQH3GS6X.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/providers/dynamodb/dynamodb-datastore-client.ts","../src/providers/dynamodb/dynamodb-datastore.ts","../src/providers/dynamodb/dynamodb-item-listing.ts","../src/providers/dynamodb/expressions.ts","../src/providers/dynamodb/errors.ts"],"sourcesContent":["import { DynamoDBClient } from \"@aws-sdk/client-dynamodb\";\nimport { DynamoDBDocumentClient } from \"@aws-sdk/lib-dynamodb\";\nimport type { CelerityTracer } from \"@celerity-sdk/types\";\nimport type { DatastoreClient, Datastore } from \"../../types\";\nimport { DynamoDBDatastore } from \"./dynamodb-datastore\";\nimport type { DynamoDBDatastoreConfig } from \"./types\";\nimport { captureDynamoDBConfig } from \"./config\";\n\nexport class DynamoDBDatastoreClient implements DatastoreClient {\n private client: DynamoDBClient | null = null;\n private docClient: DynamoDBDocumentClient | null = null;\n private readonly config: DynamoDBDatastoreConfig;\n\n constructor(\n config?: DynamoDBDatastoreConfig,\n private readonly tracer?: CelerityTracer,\n ) {\n this.config = config ?? captureDynamoDBConfig();\n }\n\n datastore(name: string): Datastore {\n return new DynamoDBDatastore(name, this.getDocClient(), this.tracer);\n }\n\n close(): void {\n this.docClient?.destroy();\n this.client?.destroy();\n this.docClient = null;\n this.client = null;\n }\n\n private getDocClient(): DynamoDBDocumentClient {\n if (!this.docClient) {\n this.client = new DynamoDBClient({\n region: this.config.region,\n endpoint: this.config.endpoint,\n credentials: this.config.credentials,\n });\n this.docClient = DynamoDBDocumentClient.from(this.client, {\n marshallOptions: { removeUndefinedValues: true },\n });\n }\n return this.docClient;\n }\n}\n","import createDebug from \"debug\";\nimport {\n GetCommand,\n PutCommand,\n DeleteCommand,\n BatchGetCommand,\n BatchWriteCommand,\n type DynamoDBDocumentClient,\n} from \"@aws-sdk/lib-dynamodb\";\nimport type { CelerityTracer, CeleritySpan } from \"@celerity-sdk/types\";\nimport type {\n Datastore,\n ItemKey,\n GetItemOptions,\n PutItemOptions,\n DeleteItemOptions,\n QueryOptions,\n ScanOptions,\n ItemListing,\n BatchGetItemsOptions,\n BatchGetResult,\n BatchWriteOperation,\n BatchWriteResult,\n} from \"../../types\";\nimport { DatastoreError, ConditionalCheckFailedError } from \"../../errors\";\nimport { DynamoDBItemListing } from \"./dynamodb-item-listing\";\nimport { buildFilterExpression } from \"./expressions\";\nimport { isConditionalCheckFailedError } from \"./errors\";\n\nconst debug = createDebug(\"celerity:datastore:dynamodb\");\n\nexport class DynamoDBDatastore implements Datastore {\n constructor(\n private readonly tableName: string,\n private readonly client: DynamoDBDocumentClient,\n private readonly tracer?: CelerityTracer,\n ) {}\n\n async getItem<T = Record<string, unknown>>(\n key: ItemKey,\n options?: GetItemOptions,\n ): Promise<T | null> {\n debug(\"getItem %s %o\", this.tableName, key);\n return this.traced(\n \"celerity.datastore.get_item\",\n { \"datastore.table\": this.tableName },\n async () => {\n try {\n const response = await this.client.send(\n new GetCommand({\n TableName: this.tableName,\n Key: key,\n ConsistentRead: options?.consistentRead,\n }),\n );\n return (response.Item as T) ?? null;\n } catch (error) {\n throw new DatastoreError(\n `Failed to get item from table \"${this.tableName}\"`,\n this.tableName,\n { cause: error },\n );\n }\n },\n );\n }\n\n async putItem(item: Record<string, unknown>, options?: PutItemOptions): Promise<void> {\n debug(\"putItem %s\", this.tableName);\n return this.traced(\n \"celerity.datastore.put_item\",\n { \"datastore.table\": this.tableName },\n async () => {\n try {\n const conditionParams = options?.condition\n ? buildFilterExpression(options.condition)\n : undefined;\n\n await this.client.send(\n new PutCommand({\n TableName: this.tableName,\n Item: item,\n ConditionExpression: conditionParams?.expression,\n ExpressionAttributeNames: conditionParams?.names,\n ExpressionAttributeValues: conditionParams?.values,\n }),\n );\n } catch (error) {\n if (isConditionalCheckFailedError(error)) {\n throw new ConditionalCheckFailedError(this.tableName, { cause: error });\n }\n throw new DatastoreError(\n `Failed to put item in table \"${this.tableName}\"`,\n this.tableName,\n { cause: error },\n );\n }\n },\n );\n }\n\n async deleteItem(key: ItemKey, options?: DeleteItemOptions): Promise<void> {\n debug(\"deleteItem %s %o\", this.tableName, key);\n return this.traced(\n \"celerity.datastore.delete_item\",\n { \"datastore.table\": this.tableName },\n async () => {\n try {\n const conditionParams = options?.condition\n ? buildFilterExpression(options.condition)\n : undefined;\n\n await this.client.send(\n new DeleteCommand({\n TableName: this.tableName,\n Key: key,\n ConditionExpression: conditionParams?.expression,\n ExpressionAttributeNames: conditionParams?.names,\n ExpressionAttributeValues: conditionParams?.values,\n }),\n );\n } catch (error) {\n if (isConditionalCheckFailedError(error)) {\n throw new ConditionalCheckFailedError(this.tableName, { cause: error });\n }\n throw new DatastoreError(\n `Failed to delete item from table \"${this.tableName}\"`,\n this.tableName,\n { cause: error },\n );\n }\n },\n );\n }\n\n query<T = Record<string, unknown>>(options: QueryOptions): ItemListing<T> {\n debug(\"query %s pk=%s\", this.tableName, options.key.name);\n return new DynamoDBItemListing<T>(this.client, this.tableName, \"query\", options, this.tracer);\n }\n\n scan<T = Record<string, unknown>>(options?: ScanOptions): ItemListing<T> {\n debug(\"scan %s\", this.tableName);\n return new DynamoDBItemListing<T>(\n this.client,\n this.tableName,\n \"scan\",\n options ?? {},\n this.tracer,\n );\n }\n\n async batchGetItems<T = Record<string, unknown>>(\n keys: ItemKey[],\n options?: BatchGetItemsOptions,\n ): Promise<BatchGetResult<T>> {\n debug(\"batchGetItems %s count=%d\", this.tableName, keys.length);\n return this.traced(\n \"celerity.datastore.batch_get_items\",\n { \"datastore.table\": this.tableName, \"datastore.batch_size\": keys.length },\n async () => {\n try {\n const response = await this.client.send(\n new BatchGetCommand({\n RequestItems: {\n [this.tableName]: {\n Keys: keys,\n ConsistentRead: options?.consistentRead,\n },\n },\n }),\n );\n\n const items = (response.Responses?.[this.tableName] ?? []) as T[];\n const unprocessedKeys = (response.UnprocessedKeys?.[this.tableName]?.Keys ??\n []) as ItemKey[];\n\n return { items, unprocessedKeys };\n } catch (error) {\n throw new DatastoreError(\n `Failed to batch get items from table \"${this.tableName}\"`,\n this.tableName,\n { cause: error },\n );\n }\n },\n );\n }\n\n async batchWriteItems(operations: BatchWriteOperation[]): Promise<BatchWriteResult> {\n debug(\"batchWriteItems %s count=%d\", this.tableName, operations.length);\n return this.traced(\n \"celerity.datastore.batch_write_items\",\n { \"datastore.table\": this.tableName, \"datastore.batch_size\": operations.length },\n async () => {\n try {\n const writeRequests = operations.map((op) => {\n if (op.type === \"put\") {\n return { PutRequest: { Item: op.item } };\n }\n return { DeleteRequest: { Key: op.key } };\n });\n\n const response = await this.client.send(\n new BatchWriteCommand({\n RequestItems: { [this.tableName]: writeRequests },\n }),\n );\n\n const unprocessedRequests = response.UnprocessedItems?.[this.tableName] ?? [];\n const unprocessedOperations: BatchWriteOperation[] = unprocessedRequests.map((req) => {\n if (req.PutRequest) {\n return { type: \"put\" as const, item: req.PutRequest.Item! };\n }\n return { type: \"delete\" as const, key: req.DeleteRequest!.Key! as ItemKey };\n });\n\n return { unprocessedOperations };\n } catch (error) {\n throw new DatastoreError(\n `Failed to batch write items to table \"${this.tableName}\"`,\n this.tableName,\n { cause: error },\n );\n }\n },\n );\n }\n\n private traced<T>(\n name: string,\n attributes: Record<string, string | number | boolean>,\n fn: (span?: CeleritySpan) => Promise<T>,\n ): Promise<T> {\n if (!this.tracer) return fn();\n return this.tracer.withSpan(name, (span) => fn(span), attributes);\n }\n}\n","import createDebug from \"debug\";\nimport { QueryCommand, ScanCommand, type DynamoDBDocumentClient } from \"@aws-sdk/lib-dynamodb\";\nimport type { CelerityTracer } from \"@celerity-sdk/types\";\nimport type { ItemListing, QueryOptions, ScanOptions } from \"../../types\";\nimport { DatastoreError } from \"../../errors\";\nimport { buildKeyConditionExpression, buildFilterExpression } from \"./expressions\";\n\nconst debug = createDebug(\"celerity:datastore:dynamodb\");\n\ntype CursorState = {\n lastEvaluatedKey: Record<string, unknown>;\n};\n\nfunction encodeCursor(lastEvaluatedKey: Record<string, unknown>): string {\n const state: CursorState = { lastEvaluatedKey };\n return Buffer.from(JSON.stringify(state)).toString(\"base64url\");\n}\n\nfunction decodeCursor(cursor: string): CursorState {\n return JSON.parse(Buffer.from(cursor, \"base64url\").toString(\"utf-8\")) as CursorState;\n}\n\nexport class DynamoDBItemListing<T> implements ItemListing<T> {\n private _cursor: string | undefined;\n\n constructor(\n private readonly client: DynamoDBDocumentClient,\n private readonly tableName: string,\n private readonly mode: \"query\" | \"scan\",\n private readonly options: QueryOptions | ScanOptions,\n private readonly tracer?: CelerityTracer,\n ) {\n this._cursor = options.cursor;\n }\n\n get cursor(): string | undefined {\n return this._cursor;\n }\n\n async *[Symbol.asyncIterator](): AsyncIterator<T> {\n const cursorState = this._cursor ? decodeCursor(this._cursor) : undefined;\n let exclusiveStartKey: Record<string, unknown> | undefined = cursorState?.lastEvaluatedKey;\n\n do {\n debug(\"%s page %s key=%o\", this.mode, this.tableName, exclusiveStartKey ?? \"(start)\");\n\n const response = await this.fetchPage(exclusiveStartKey);\n\n for (const item of response.Items ?? []) {\n yield item as T;\n }\n\n exclusiveStartKey = response.LastEvaluatedKey as Record<string, unknown> | undefined;\n\n if (exclusiveStartKey) {\n this._cursor = encodeCursor(exclusiveStartKey);\n } else {\n this._cursor = undefined;\n }\n } while (exclusiveStartKey);\n }\n\n private async fetchPage(exclusiveStartKey?: Record<string, unknown>) {\n const command =\n this.mode === \"query\"\n ? this.buildQueryCommand(exclusiveStartKey)\n : this.buildScanCommand(exclusiveStartKey);\n\n const doFetch = async () => {\n try {\n return await this.client.send(command);\n } catch (error) {\n throw new DatastoreError(\n `Failed to ${this.mode} table \"${this.tableName}\"`,\n this.tableName,\n { cause: error },\n );\n }\n };\n\n if (!this.tracer) return doFetch();\n return this.tracer.withSpan(`celerity.datastore.${this.mode}_page`, () => doFetch(), {\n \"datastore.table\": this.tableName,\n });\n }\n\n private buildQueryCommand(exclusiveStartKey?: Record<string, unknown>) {\n const opts = this.options as QueryOptions;\n const keyExpr = buildKeyConditionExpression(opts.key, opts.range);\n\n const filterExpr = opts.filter ? buildFilterExpression(opts.filter) : undefined;\n\n return new QueryCommand({\n TableName: this.tableName,\n IndexName: opts.indexName,\n KeyConditionExpression: keyExpr.expression,\n FilterExpression: filterExpr?.expression,\n ExpressionAttributeNames: { ...keyExpr.names, ...filterExpr?.names },\n ExpressionAttributeValues: { ...keyExpr.values, ...filterExpr?.values },\n ScanIndexForward: opts.sortAscending,\n Limit: opts.maxResults,\n ExclusiveStartKey: exclusiveStartKey,\n ConsistentRead: opts.consistentRead,\n });\n }\n\n private buildScanCommand(exclusiveStartKey?: Record<string, unknown>) {\n const opts = this.options as ScanOptions;\n\n const filterExpr = opts.filter ? buildFilterExpression(opts.filter) : undefined;\n\n return new ScanCommand({\n TableName: this.tableName,\n IndexName: opts.indexName,\n FilterExpression: filterExpr?.expression,\n ExpressionAttributeNames:\n filterExpr?.names && Object.keys(filterExpr.names).length > 0\n ? filterExpr.names\n : undefined,\n ExpressionAttributeValues:\n filterExpr?.values && Object.keys(filterExpr.values).length > 0\n ? filterExpr.values\n : undefined,\n Limit: opts.maxResults,\n ExclusiveStartKey: exclusiveStartKey,\n ConsistentRead: opts.consistentRead,\n });\n }\n}\n","import type { KeyCondition, RangeCondition, ConditionExpression } from \"../../types\";\n\nexport type ExpressionResult = {\n expression: string;\n names: Record<string, string>;\n values: Record<string, unknown>;\n};\n\nconst COMPARISON_OPERATORS = {\n eq: \"=\",\n ne: \"<>\",\n lt: \"<\",\n le: \"<=\",\n gt: \">\",\n ge: \">=\",\n} as const;\n\n/**\n * Builds a DynamoDB KeyConditionExpression from a key condition and optional range condition.\n * Uses `#k`/`:k` prefixed placeholders to avoid collision with filter placeholders.\n */\nexport function buildKeyConditionExpression(\n key: KeyCondition,\n range?: RangeCondition,\n): ExpressionResult {\n const names: Record<string, string> = {};\n const values: Record<string, unknown> = {};\n let counter = 0;\n\n const pkName = `#k${counter}`;\n const pkValue = `:k${counter}`;\n names[pkName] = key.name;\n values[pkValue] = key.value;\n counter++;\n\n let expression = `${pkName} = ${pkValue}`;\n\n if (range) {\n const skName = `#k${counter}`;\n names[skName] = range.name;\n\n switch (range.operator) {\n case \"eq\":\n case \"lt\":\n case \"le\":\n case \"gt\":\n case \"ge\": {\n const skValue = `:k${counter}`;\n values[skValue] = range.value;\n expression += ` AND ${skName} ${COMPARISON_OPERATORS[range.operator]} ${skValue}`;\n break;\n }\n case \"between\": {\n const lowVal = `:k${counter}a`;\n const highVal = `:k${counter}b`;\n values[lowVal] = range.low;\n values[highVal] = range.high;\n expression += ` AND ${skName} BETWEEN ${lowVal} AND ${highVal}`;\n break;\n }\n case \"startsWith\": {\n const skValue = `:k${counter}`;\n values[skValue] = range.value;\n expression += ` AND begins_with(${skName}, ${skValue})`;\n break;\n }\n }\n }\n\n return { expression, names, values };\n}\n\n/**\n * Builds a DynamoDB FilterExpression (or ConditionExpression for writes)\n * from one or more Condition objects. Conditions are AND'd together.\n * Uses `#f`/`:f` prefixed placeholders to avoid collision with key placeholders.\n */\nexport function buildFilterExpression(conditions: ConditionExpression): ExpressionResult {\n const condArray = Array.isArray(conditions) ? conditions : [conditions];\n const names: Record<string, string> = {};\n const values: Record<string, unknown> = {};\n const parts: string[] = [];\n let counter = 0;\n\n for (const cond of condArray) {\n const attrName = `#f${counter}`;\n names[attrName] = cond.name;\n\n switch (cond.operator) {\n case \"eq\":\n case \"ne\":\n case \"lt\":\n case \"le\":\n case \"gt\":\n case \"ge\": {\n const valKey = `:f${counter}`;\n values[valKey] = cond.value;\n parts.push(`${attrName} ${COMPARISON_OPERATORS[cond.operator]} ${valKey}`);\n break;\n }\n case \"between\": {\n const lowVal = `:f${counter}a`;\n const highVal = `:f${counter}b`;\n values[lowVal] = cond.low;\n values[highVal] = cond.high;\n parts.push(`${attrName} BETWEEN ${lowVal} AND ${highVal}`);\n break;\n }\n case \"startsWith\":\n case \"contains\": {\n const valKey = `:f${counter}`;\n values[valKey] = cond.value;\n const fnName = cond.operator === \"startsWith\" ? \"begins_with\" : \"contains\";\n parts.push(`${fnName}(${attrName}, ${valKey})`);\n break;\n }\n case \"exists\":\n parts.push(`attribute_exists(${attrName})`);\n break;\n }\n\n counter++;\n }\n\n return { expression: parts.join(\" AND \"), names, values };\n}\n","/**\n * Checks if an error is a DynamoDB ConditionalCheckFailedException.\n */\nexport function isConditionalCheckFailedError(error: unknown): boolean {\n if (!(error instanceof Error)) return false;\n return (error as { name?: string }).name === \"ConditionalCheckFailedException\";\n}\n"],"mappings":"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","names":["DynamoDBClient","DynamoDBDocumentClient","createDebug","GetCommand","PutCommand","DeleteCommand","BatchGetCommand","BatchWriteCommand","createDebug","QueryCommand","ScanCommand","COMPARISON_OPERATORS","eq","ne","lt","le","gt","ge","buildKeyConditionExpression","key","range","names","values","counter","pkName","pkValue","name","value","expression","skName","operator","skValue","lowVal","highVal","low","high","buildFilterExpression","conditions","condArray","Array","isArray","parts","cond","attrName","valKey","push","fnName","join","debug","createDebug","encodeCursor","lastEvaluatedKey","state","Buffer","from","JSON","stringify","toString","decodeCursor","cursor","parse","DynamoDBItemListing","_cursor","client","tableName","mode","options","tracer","Symbol","asyncIterator","cursorState","undefined","exclusiveStartKey","response","fetchPage","item","Items","LastEvaluatedKey","command","buildQueryCommand","buildScanCommand","doFetch","send","error","DatastoreError","cause","withSpan","opts","keyExpr","buildKeyConditionExpression","key","range","filterExpr","filter","buildFilterExpression","QueryCommand","TableName","IndexName","indexName","KeyConditionExpression","expression","FilterExpression","ExpressionAttributeNames","names","ExpressionAttributeValues","values","ScanIndexForward","sortAscending","Limit","maxResults","ExclusiveStartKey","ConsistentRead","consistentRead","ScanCommand","Object","keys","length","isConditionalCheckFailedError","error","Error","name","debug","createDebug","DynamoDBDatastore","tableName","client","tracer","getItem","key","options","traced","response","send","GetCommand","TableName","Key","ConsistentRead","consistentRead","Item","error","DatastoreError","cause","putItem","item","conditionParams","condition","buildFilterExpression","undefined","PutCommand","ConditionExpression","expression","ExpressionAttributeNames","names","ExpressionAttributeValues","values","isConditionalCheckFailedError","ConditionalCheckFailedError","deleteItem","DeleteCommand","query","name","DynamoDBItemListing","scan","batchGetItems","keys","length","BatchGetCommand","RequestItems","Keys","items","Responses","unprocessedKeys","UnprocessedKeys","batchWriteItems","operations","writeRequests","map","op","type","PutRequest","DeleteRequest","BatchWriteCommand","unprocessedRequests","UnprocessedItems","unprocessedOperations","req","attributes","fn","withSpan","span","DynamoDBDatastoreClient","client","docClient","config","tracer","captureDynamoDBConfig","datastore","name","DynamoDBDatastore","getDocClient","close","destroy","DynamoDBClient","region","endpoint","credentials","DynamoDBDocumentClient","from","marshallOptions","removeUndefinedValues"]}