@eventualize/dynamodb-storage-adapter 1.0.0 → 2.0.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.
@@ -1,3 +1,17 @@
1
1
  import { DynamoDBClient } from "@aws-sdk/client-dynamodb";
2
+ /**
3
+ * Configuration options for DynamoDB client.
4
+ * All properties are optional and fall back to environment variables if not provided.
5
+ */
6
+ export interface DynamoDBClientOptions {
7
+ endpoint?: string;
8
+ accessKeyId?: string;
9
+ secretAccessKey?: string;
10
+ region?: string;
11
+ }
2
12
  export declare function listTables(client: DynamoDBClient): Promise<string[] | undefined>;
3
- export declare function createDynamoDBClient(): DynamoDBClient;
13
+ /**
14
+ * Creates a DynamoDB client.
15
+ * @param options - Optional configuration. Falls back to environment variables if not provided.
16
+ */
17
+ export declare function createDynamoDBClient(options?: DynamoDBClientOptions): DynamoDBClient;
@@ -12,11 +12,15 @@ export async function listTables(client) {
12
12
  throw error;
13
13
  }
14
14
  }
15
- export function createDynamoDBClient() {
16
- const endpoint = process.env.DYNAMODB_URL;
17
- const accessKeyId = process.env.AWS_ACCESS_KEY_ID;
18
- const secretAccessKey = process.env.AWS_SECRET_ACCESS_KEY;
19
- const region = process.env.AWS_REGION || 'us-east-1';
15
+ /**
16
+ * Creates a DynamoDB client.
17
+ * @param options - Optional configuration. Falls back to environment variables if not provided.
18
+ */
19
+ export function createDynamoDBClient(options) {
20
+ const endpoint = options?.endpoint ?? process.env.DYNAMODB_CONNECTION;
21
+ const accessKeyId = options?.accessKeyId ?? process.env.AWS_ACCESS_KEY_ID;
22
+ const secretAccessKey = options?.secretAccessKey ?? process.env.AWS_SECRET_ACCESS_KEY;
23
+ const region = options?.region ?? process.env.AWS_REGION ?? 'us-east-1';
20
24
  if (!endpoint || !accessKeyId || !secretAccessKey) {
21
25
  const envVars = { endpoint, accessKeyId, secretAccessKey };
22
26
  throw new Error("AWS credentials are not set in environment variables: " + JSON.stringify(envVars));
@@ -1 +1 @@
1
- {"version":3,"file":"DynamoDbClient.js","sourceRoot":"","sources":["../src/DynamoDbClient.ts"],"names":[],"mappings":"AAAA,uBAAuB;AACvB,OAAO,EAAE,cAAc,EAAwB,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAEnG,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAsB;IACnD,IAAI,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,iBAAiB,CAAC,EAAE,CAAC,CAAC;QAC1C,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,2BAA2B,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC9D,OAAO,QAAQ,CAAC,UAAU,CAAC;IAC/B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;QAC9C,MAAM,KAAK,CAAC;IAChB,CAAC;AACL,CAAC;AAED,MAAM,UAAU,oBAAoB;IAChC,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;IAC1C,MAAM,WAAW,GAAG,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAClD,MAAM,eAAe,GAAG,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;IAC1D,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,WAAW,CAAC;IAErD,IAAI,CAAC,QAAQ,IAAI,CAAC,WAAW,IAAI,CAAC,eAAe,EAAE,CAAC;QAChD,MAAM,OAAO,GAAG,EAAE,QAAQ,EAAE,WAAW,EAAE,eAAe,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CAAC,wDAAwD,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IACxG,CAAC;IAED,MAAM,MAAM,GAAyB,EAAE,CAAC;IACxC,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,MAAM,CAAC,WAAW,GAAG,EAAE,WAAW,EAAE,eAAe,EAAE,CAAC;IACtD,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC;AACtC,CAAC"}
1
+ {"version":3,"file":"DynamoDbClient.js","sourceRoot":"","sources":["../src/DynamoDbClient.ts"],"names":[],"mappings":"AAAA,uBAAuB;AACvB,OAAO,EAAE,cAAc,EAAwB,iBAAiB,EAAE,MAAM,0BAA0B,CAAC;AAanG,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,MAAsB;IACnD,IAAI,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,iBAAiB,CAAC,EAAE,CAAC,CAAC;QAC1C,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,2BAA2B,EAAE,QAAQ,CAAC,UAAU,CAAC,CAAC;QAC9D,OAAO,QAAQ,CAAC,UAAU,CAAC;IAC/B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,OAAO,CAAC,KAAK,CAAC,uBAAuB,EAAE,KAAK,CAAC,CAAC;QAC9C,MAAM,KAAK,CAAC;IAChB,CAAC;AACL,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAA+B;IAChE,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,OAAO,CAAC,GAAG,CAAC,mBAAmB,CAAC;IACtE,MAAM,WAAW,GAAG,OAAO,EAAE,WAAW,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC;IAC1E,MAAM,eAAe,GAAG,OAAO,EAAE,eAAe,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC;IACtF,MAAM,MAAM,GAAG,OAAO,EAAE,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,UAAU,IAAI,WAAW,CAAC;IAExE,IAAI,CAAC,QAAQ,IAAI,CAAC,WAAW,IAAI,CAAC,eAAe,EAAE,CAAC;QAChD,MAAM,OAAO,GAAG,EAAE,QAAQ,EAAE,WAAW,EAAE,eAAe,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CAAC,wDAAwD,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,CAAC;IACxG,CAAC;IAED,MAAM,MAAM,GAAyB,EAAE,CAAC;IACxC,MAAM,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC3B,MAAM,CAAC,WAAW,GAAG,EAAE,WAAW,EAAE,eAAe,EAAE,CAAC;IACtD,MAAM,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,OAAO,IAAI,cAAc,CAAC,MAAM,CAAC,CAAC;AACtC,CAAC"}
@@ -1,7 +1,12 @@
1
1
  import IEvDbStorageAdmin from "@eventualize/types/IEvDbStorageAdmin";
2
+ import { DynamoDBClientOptions } from "./DynamoDbClient.js";
2
3
  export default class EvDbDynamoDbAdmin implements IEvDbStorageAdmin {
3
4
  private dynamoDbClient;
4
- constructor();
5
+ /**
6
+ * Creates a DynamoDB admin instance.
7
+ * @param options - Optional DynamoDB client configuration. Falls back to env vars if not provided.
8
+ */
9
+ constructor(options?: DynamoDBClientOptions);
5
10
  private extractKeys;
6
11
  /**
7
12
  * Scans a table for all items and deletes them in batches of 25.
@@ -1,10 +1,13 @@
1
1
  import { BatchWriteItemCommand, ScanCommand } from "@aws-sdk/client-dynamodb";
2
2
  import { createDynamoDBClient } from "./DynamoDbClient.js";
3
3
  export default class EvDbDynamoDbAdmin {
4
- constructor() {
5
- this.dynamoDbClient = createDynamoDBClient();
4
+ /**
5
+ * Creates a DynamoDB admin instance.
6
+ * @param options - Optional DynamoDB client configuration. Falls back to env vars if not provided.
7
+ */
8
+ constructor(options) {
9
+ this.dynamoDbClient = createDynamoDBClient(options);
6
10
  }
7
- ;
8
11
  // Helper function to extract keys in raw DynamoDB format
9
12
  extractKeys(tableName, items) {
10
13
  return items.map(item => {
@@ -1 +1 @@
1
- {"version":3,"file":"EvDBDynamoDBAdmin.js","sourceRoot":"","sources":["../src/EvDBDynamoDBAdmin.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"EvDBDynamoDBAdmin.js","sourceRoot":"","sources":["../src/EvDBDynamoDBAdmin.ts"],"names":[],"mappings":"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"}
@@ -13,6 +13,7 @@ import StreamStoreAffected from '@eventualize/types/StreamStoreAffected';
13
13
  import EvDbContinuousFetchOptions from '@eventualize/types/EvDbContinuousFetchOptions';
14
14
  import EvDbMessageFilter from '@eventualize/types/EvDbMessageFilter';
15
15
  import { EvDbShardName } from '@eventualize/types/primitiveTypes';
16
+ import { DynamoDBClientOptions } from './DynamoDbClient.js';
16
17
  import { DynamoDBClient } from '@aws-sdk/client-dynamodb';
17
18
  export interface EvDbEventRecord extends IEvDbEventMetadata {
18
19
  id: string;
@@ -40,7 +41,17 @@ export interface EvDbStorageContext {
40
41
  */
41
42
  export default class EvDbDynamoDbStorageAdapter implements IEvDbStorageSnapshotAdapter, IEvDbStorageStreamAdapter {
42
43
  private dynamoDbClient;
44
+ /**
45
+ * Creates a DynamoDB storage adapter.
46
+ * @param dynamoDbClientOrOptions - Either a DynamoDBClient instance or configuration options.
47
+ * If options are provided, a new client will be created. Falls back to env vars if not provided.
48
+ */
43
49
  constructor(dynamoDbClient?: DynamoDBClient);
50
+ /**
51
+ * Factory method to create adapter with configuration options.
52
+ * @param options - DynamoDB client configuration options.
53
+ */
54
+ static withOptions(options: DynamoDBClientOptions): EvDbDynamoDbStorageAdapter;
44
55
  getFromOutbox(filter: EvDbMessageFilter, options?: EvDbContinuousFetchOptions | null): Promise<AsyncIterable<EvDbMessage>>;
45
56
  getFromOutboxAsync(shard: EvDbShardName, filter: EvDbMessageFilter, options?: EvDbContinuousFetchOptions | null, cancellation?: AbortSignal): AsyncIterable<EvDbMessage>;
46
57
  getRecordsFromOutboxAsync(filter: EvDbMessageFilter, options?: EvDbContinuousFetchOptions | null, cancellation?: AbortSignal): AsyncIterable<EvDbMessage>;
@@ -17,9 +17,21 @@ const deserializePayload = (payload) => {
17
17
  * Replaces SQL Server-specific adapter with database-agnostic Prisma implementation
18
18
  */
19
19
  export default class EvDbDynamoDbStorageAdapter {
20
+ /**
21
+ * Creates a DynamoDB storage adapter.
22
+ * @param dynamoDbClientOrOptions - Either a DynamoDBClient instance or configuration options.
23
+ * If options are provided, a new client will be created. Falls back to env vars if not provided.
24
+ */
20
25
  constructor(dynamoDbClient = createDynamoDBClient()) {
21
26
  this.dynamoDbClient = dynamoDbClient;
22
27
  }
28
+ /**
29
+ * Factory method to create adapter with configuration options.
30
+ * @param options - DynamoDB client configuration options.
31
+ */
32
+ static withOptions(options) {
33
+ return new EvDbDynamoDbStorageAdapter(createDynamoDBClient(options));
34
+ }
23
35
  getFromOutbox(filter, options) {
24
36
  throw new Error('Method not implemented.');
25
37
  }
@@ -1 +1 @@
1
- {"version":3,"file":"EvDbDynamoDbStorageAdapter.js","sourceRoot":"","sources":["../src/EvDbDynamoDbStorageAdapter.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"EvDbDynamoDbStorageAdapter.js","sourceRoot":"","sources":["../src/EvDbDynamoDbStorageAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;AAIpD,OAAO,gBAAgB,MAAM,qCAAqC,CAAC;AAMnE,OAAO,EAAE,2BAA2B,EAAE,MAAM,6CAA6C,CAAC;AAG1F,OAAO,mBAAmB,MAAM,wCAAwC,CAAC;AAMzE,OAAO,EAAE,oBAAoB,EAAE,UAAU,EAAyB,MAAM,qBAAqB,CAAC;AAC9F,OAAO,aAAa,EAAE,EAAE,wBAAwB,EAAE,WAAW,EAAiB,MAAM,wCAAwC,CAAA;AAC5H,OAAO,EAAkB,4BAA4B,EAAE,yBAAyB,EAAE,MAAM,0BAA0B,CAAC;AA2BnH,MAAM,gBAAgB,GAAG,CAAC,OAAyB,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,OAAO,CAAC,CAAC;AACtG,MAAM,kBAAkB,GAAG,CAAC,OAAY,EAAoB,EAAE;IAC1D,IAAI,CAAC,CAAC,OAAO,IAAI,OAAO,OAAO,IAAI,QAAQ,EAAE,CAAC;QAC1C,OAAO,OAAO,CAAC;IACnB,CAAC;IACD,OAAO,EAAE,CAAC;AACd,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,OAAO,OAAO,0BAA0B;IAC3C;;;;OAIG;IACH,YAAoB,iBAAiC,oBAAoB,EAAE;QAAvD,mBAAc,GAAd,cAAc,CAAyC;IAC3E,CAAC;IAED;;;OAGG;IACH,MAAM,CAAC,WAAW,CAAC,OAA8B;QAC7C,OAAO,IAAI,0BAA0B,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,CAAC;IACzE,CAAC;IACD,aAAa,CAAC,MAAyB,EAAE,OAA2C;QAChF,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC/C,CAAC;IACD,kBAAkB,CAAC,KAAoB,EAAE,MAAyB,EAAE,OAA2C,EAAE,YAA0B;QACvI,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC/C,CAAC;IAGD,yBAAyB,CAAC,KAAc,EAAE,MAAgB,EAAE,OAAiB,EAAE,YAAsB;QACjG,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC/C,CAAC;IAGD,uBAAuB,CAAC,OAAgB,EAAE,KAAc,EAAE,MAAgB,EAAE,OAAiB;QACzF,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC/C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB,CAClB,MAAgC,EAChC,QAAoC;QAEpC,IAAI,CAAC;YACD,MAAM,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;YACtC,MAAM,cAAc,GAAkB,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CACvD,WAAW,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,CAAC;YAExC,MAAM,gBAAgB,GAAoB,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE;gBAC7D,OAAO;oBACH,EAAE,EAAE,MAAM,CAAC,UAAU,EAAE;oBACvB,aAAa,EAAE,OAAO,CAAC,YAAY;oBACnC,OAAO,EAAE,OAAO,CAAC,OAAO;oBACxB,YAAY,EAAE,OAAO,CAAC,WAAW;oBACjC,UAAU,EAAE,OAAO,CAAC,SAAS;oBAC7B,WAAW,EAAE,OAAO,CAAC,UAAU;oBAC/B,WAAW,EAAE,OAAO,CAAC,UAAU;oBAC/B,OAAO,EAAE,OAAO,CAAC,OAAO;iBAC3B,CAAA;YACL,CAAC,CAAC,CAAA;YAEF,MAAM,gBAAgB,GAAG,aAAa,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;YAClE,MAAM,kBAAkB,GAAG,aAAa,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC;YAExE,MAAM,aAAa,GAAG,EAAE,aAAa,EAAE,CAAC,GAAG,gBAAgB,EAAE,GAAG,kBAAkB,CAAC,EAAE,CAAC;YAEtF,MAAM,OAAO,GAAG,IAAI,yBAAyB,CAAC,aAAa,CAAC,CAAA;YAC5D,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAExC,MAAM,SAAS,GAAG,cAAc,CAAC,MAAM,CAAC;YACxC,MAAM,WAAW,GAAG,gBAAgB;iBAC/B,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,YAAY,EAAE,CAAC,EAAE,EAAE,EAAE,CAClC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE,EAA4B,CAAC,CAAC;YACxF,OAAO,IAAI,mBAAmB,CAAC,SAAS,EAAE,IAAI,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;QACpF,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,IAAI,IAAI,CAAC,cAAc,CAAC,KAAK,CAAC,EAAE,CAAC;gBAC7B,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;YACxD,CAAC;YACD,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,wBAAwB,CAC1B,SAAwB,EACxB,OAAsB;QAEtB,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC/C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,kBAAkB,CACpB,aAAgC;QAEhC,MAAM,KAAK,GAAG,aAAa,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC;QACzD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACvD,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;YAClB,OAAO,CAAC,CAAC,CAAC;QACd,CAAC;QACD,OAAO,QAAQ,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,IAAI,EAAE,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,CAAC,cAAc,CACjB,YAA8B,EAC9B,WAAmB,GAAG;QAEtB,IAAI,WAAW,GAAoC,SAAS,CAAC;QAE7D,GAAG,CAAC;YACA,MAAM,gBAAgB,GAAG,aAAa,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;YAC/D,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;YAElE,IAAI,QAAQ,CAAC,KAAK,IAAI,QAAQ,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC9C,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;oBAChC,MAAM,GAAG,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC;oBAC7B,MAAM,aAAa,GAAG,wBAAwB,CAAC,GAAG,CAAC,cAAc,CAAC,CAAA;oBAClE,MAAM,CAAC,GAAgB,IAAI,WAAW,CAClC,MAAM,CAAC,UAAU,EAAE,EACnB,IAAI,gBAAgB,CAAC,aAAa,CAAC,UAAU,EAAE,aAAa,CAAC,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,EAClF,GAAG,CAAC,UAAU,EACd,GAAG,CAAC,WAAW,EACf,IAAI,IAAI,CAAC,GAAG,CAAC,WAAW,CAAC,EACzB,GAAG,CAAC,OAAO,EACX,IAAI,IAAI,CAAC,GAAG,CAAC,SAAS,CAAC,CAC1B,CAAC;oBACF,MAAM,CAAC,CAAC,WAAW,EAAE,CAAC;gBAC1B,CAAC;YACL,CAAC;YAED,WAAW,GAAG,QAAQ,CAAC,gBAAgB,CAAC;QAE5C,CAAC,QAAQ,WAAW,EAAC;IACzB,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,gBAAgB,CAClB,WAA4B;QAE5B,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,QAAQ,EAAE,GAAG,WAAW,CAAC;QACvD,IAAI,CAAC;YACD,MAAM,KAAK,GAAG,aAAa,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;YACrD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAEvD,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;gBAClB,OAAO,2BAA2B,CAAC,KAAK,CAAC;YAC7C,CAAC;YAED,MAAM,QAAQ,GAAG,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC;YAE/C,OAAO,IAAI,2BAA2B,CAClC,QAAQ,CAAC,MAAM,EACf,IAAI,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,SAAS,CAAC,CAAC,EACpC,QAAQ,CAAC,KAAK,CACjB,CAAC;QACN,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,kBAAkB,CAAC,MAA8B;QACnD,IAAI,CAAC;YACD,MAAM,OAAO,GAAG,aAAa,CAAC,YAAY,CAAC,MAAM,CAAC,CAAC;YACnD,MAAM,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAE5C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,MAAM,KAAK,CAAC;QAChB,CAAC;IACL,CAAC;IAED;;OAEG;IACK,cAAc,CAAC,KAAc;QACjC,IAAI,CAAC,CAAC,KAAK,YAAY,4BAA4B,CAAC,EAAE,CAAC;YACnD,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,OAAO,CAAC,CAAE,KAAsC;aAC3C,mBAAmB,EAAE,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC,IAAI,KAAK,wBAAwB,CAAC,CAAA;IACnF,CAAC;IAED;;OAEG;IACK,oBAAoB,CAAC,SAAwB;QACjD,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;IAC/C,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,KAAK;QACP,OAAO;IACX,CAAC;CACJ"}
package/package.json CHANGED
@@ -1,7 +1,12 @@
1
1
  {
2
2
  "name": "@eventualize/dynamodb-storage-adapter",
3
- "version": "1.0.0",
3
+ "version": "2.0.0",
4
4
  "description": "",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "https://github.com/outsidenote/eventualize-js",
8
+ "directory": "packages/dynamodb-storage-adapter"
9
+ },
5
10
  "main": "dist/index.js",
6
11
  "types": "dist/index.d.ts",
7
12
  "exports": {
@@ -9,7 +14,13 @@
9
14
  "import": "./dist/index.js",
10
15
  "types": "./dist/index.d.ts"
11
16
  },
12
- "./*": "./dist/*.js"
17
+ "./*": {
18
+ "import": "./dist/*.js",
19
+ "types": "./dist/*.d.ts"
20
+ }
21
+ },
22
+ "publishConfig": {
23
+ "access": "public"
13
24
  },
14
25
  "scripts": {
15
26
  "build": "tsc --build",
@@ -22,6 +33,9 @@
22
33
  "devDependencies": {
23
34
  "@types/node": "^24.10.1"
24
35
  },
36
+ "files": [
37
+ "dist"
38
+ ],
25
39
  "dependencies": {
26
40
  "@aws-sdk/client-dynamodb": "^3.948.0",
27
41
  "@aws-sdk/util-dynamodb": "^3.948.0"
@@ -1,50 +0,0 @@
1
- {
2
- "TableName": "events",
3
- "AttributeDefinitions": [
4
- {
5
- "AttributeName": "stream_address",
6
- "AttributeType": "S"
7
- },
8
- {
9
- "AttributeName": "offset",
10
- "AttributeType": "N"
11
- },
12
- {
13
- "AttributeName": "event_type",
14
- "AttributeType": "S"
15
- },
16
- {
17
- "AttributeName": "captured_at",
18
- "AttributeType": "S"
19
- }
20
- ],
21
- "KeySchema": [
22
- {
23
- "AttributeName": "stream_address",
24
- "KeyType": "HASH"
25
- },
26
- {
27
- "AttributeName": "offset",
28
- "KeyType": "RANGE"
29
- }
30
- ],
31
- "BillingMode": "PAY_PER_REQUEST",
32
- "GlobalSecondaryIndexes": [
33
- {
34
- "IndexName": "event_type__captured_at",
35
- "KeySchema": [
36
- {
37
- "AttributeName": "event_type",
38
- "KeyType": "HASH"
39
- },
40
- {
41
- "AttributeName": "captured_at",
42
- "KeyType": "RANGE"
43
- }
44
- ],
45
- "Projection": {
46
- "ProjectionType": "ALL"
47
- }
48
- }
49
- ]
50
- }
@@ -1,24 +0,0 @@
1
- {
2
- "TableName": "messages",
3
- "AttributeDefinitions": [
4
- {
5
- "AttributeName": "message_addres",
6
- "AttributeType": "S"
7
- },
8
- {
9
- "AttributeName": "captured_at",
10
- "AttributeType": "S"
11
- }
12
- ],
13
- "KeySchema": [
14
- {
15
- "AttributeName": "message_addres",
16
- "KeyType": "HASH"
17
- },
18
- {
19
- "AttributeName": "captured_at",
20
- "KeyType": "RANGE"
21
- }
22
- ],
23
- "BillingMode": "PAY_PER_REQUEST"
24
- }
@@ -1,24 +0,0 @@
1
- {
2
- "TableName": "snapshots",
3
- "AttributeDefinitions": [
4
- {
5
- "AttributeName": "view_address",
6
- "AttributeType": "S"
7
- },
8
- {
9
- "AttributeName": "offset",
10
- "AttributeType": "N"
11
- }
12
- ],
13
- "KeySchema": [
14
- {
15
- "AttributeName": "view_address",
16
- "KeyType": "HASH"
17
- },
18
- {
19
- "AttributeName": "offset",
20
- "KeyType": "RANGE"
21
- }
22
- ],
23
- "BillingMode": "PAY_PER_REQUEST"
24
- }
@@ -1,32 +0,0 @@
1
- // src/dynamo-client.ts
2
- import { DynamoDBClient, DynamoDBClientConfig, ListTablesCommand } from "@aws-sdk/client-dynamodb";
3
-
4
- export async function listTables(client: DynamoDBClient) {
5
- try {
6
- const command = new ListTablesCommand({});
7
- const response = await client.send(command);
8
- console.log("Tables in DynamoDB Local:", response.TableNames);
9
- return response.TableNames;
10
- } catch (error) {
11
- console.error("Error listing tables:", error);
12
- throw error;
13
- }
14
- }
15
-
16
- export function createDynamoDBClient(): DynamoDBClient {
17
- const endpoint = process.env.DYNAMODB_URL;
18
- const accessKeyId = process.env.AWS_ACCESS_KEY_ID;
19
- const secretAccessKey = process.env.AWS_SECRET_ACCESS_KEY;
20
- const region = process.env.AWS_REGION || 'us-east-1';
21
-
22
- if (!endpoint || !accessKeyId || !secretAccessKey) {
23
- const envVars = { endpoint, accessKeyId, secretAccessKey };
24
- throw new Error("AWS credentials are not set in environment variables: " + JSON.stringify(envVars));
25
- }
26
-
27
- const config: DynamoDBClientConfig = {};
28
- config.endpoint = endpoint;
29
- config.credentials = { accessKeyId, secretAccessKey };
30
- config.region = region;
31
- return new DynamoDBClient(config);
32
- }
@@ -1,115 +0,0 @@
1
- import { AttributeValue, BatchWriteItemCommand, DynamoDBClient, ScanCommand, WriteRequest } from "@aws-sdk/client-dynamodb";
2
- import IEvDbStorageAdmin from "@eventualize/types/IEvDbStorageAdmin";
3
- import { createDynamoDBClient } from "./DynamoDbClient.js";
4
-
5
- export default class EvDbDynamoDbAdmin implements IEvDbStorageAdmin {
6
- private dynamoDbClient: DynamoDBClient
7
- constructor() {
8
- this.dynamoDbClient = createDynamoDBClient();
9
- };
10
-
11
- // Helper function to extract keys in raw DynamoDB format
12
- private extractKeys(tableName: string, items: Record<string, AttributeValue>[]): WriteRequest[] {
13
- return items.map(item => {
14
- const deleteRequest: WriteRequest = {
15
- DeleteRequest: {
16
- Key: {} // Must build the Key object manually
17
- }
18
- };
19
-
20
- if (tableName === "events") {
21
- deleteRequest.DeleteRequest!.Key!["stream_address"] = item["stream_address"];
22
- deleteRequest.DeleteRequest!.Key!["offset"] = item["offset"];
23
- } else if (tableName === "snapshots") {
24
- deleteRequest.DeleteRequest!.Key!["view_address"] = item["view_address"];
25
- deleteRequest.DeleteRequest!.Key!["offset"] = item["offset"];
26
- } else if (tableName === "messages") {
27
- // Assuming the schema typo was fixed to message_address
28
- deleteRequest.DeleteRequest!.Key!["message_address"] = item["message_address"];
29
- deleteRequest.DeleteRequest!.Key!["captured_at"] = item["captured_at"];
30
- }
31
-
32
- return deleteRequest;
33
- });
34
- }
35
-
36
- /**
37
- * Scans a table for all items and deletes them in batches of 25.
38
- * @param tableName The name of the table to clear.
39
- */
40
- private async clearTableItems(tableName: string): Promise<void> {
41
- let items;
42
- let exclusiveStartKey: Record<string, AttributeValue> | undefined = undefined;
43
- const BATCH_SIZE = 25;
44
-
45
- do {
46
- // Define ProjectionExpression and ExpressionAttributeNames dynamically
47
- let projectionExpression: string;
48
- let expressionAttributeNames: Record<string, string> | undefined = undefined;
49
-
50
- if (tableName === "events") {
51
- projectionExpression = "stream_address, #o";
52
- expressionAttributeNames = { "#o": "offset" };
53
- } else if (tableName === "snapshots") {
54
- projectionExpression = "view_address, #o";
55
- expressionAttributeNames = { "#o": "offset" };
56
- } else { // "messages" table
57
- projectionExpression = "message_address, captured_at";
58
- // No offset in the projection for messages table, so no #o alias is needed
59
- }
60
-
61
- const scanCommand: ScanCommand = new ScanCommand({
62
- TableName: tableName,
63
- ProjectionExpression: projectionExpression,
64
- ExpressionAttributeNames: expressionAttributeNames, // Pass the dynamic object
65
-
66
- Limit: BATCH_SIZE,
67
- ExclusiveStartKey: exclusiveStartKey,
68
- });
69
-
70
- // ... (rest of the function for scanning and batch writing remains the same) ...
71
- const scanResult = await this.dynamoDbClient.send(scanCommand);
72
- items = scanResult.Items;
73
-
74
- if (items && items.length > 0) {
75
- const deleteRequests = this.extractKeys(tableName, items);
76
-
77
- const batchWriteCommand = new BatchWriteItemCommand({
78
- RequestItems: {
79
- [tableName]: deleteRequests
80
- }
81
- });
82
- await this.dynamoDbClient.send(batchWriteCommand);
83
- console.log(`Deleted ${items.length} items from ${tableName}.`);
84
- }
85
-
86
- exclusiveStartKey = scanResult.LastEvaluatedKey;
87
-
88
- } while (exclusiveStartKey);
89
-
90
- console.log(`Finished item deletion for table: ${tableName}`);
91
- }
92
-
93
- createEnvironmentAsync(): Promise<void> {
94
- throw new Error("Method not implemented.");
95
- }
96
- destroyEnvironmentAsync(): Promise<void> {
97
- throw new Error("Method not implemented.");
98
- }
99
- public async clearEnvironmentAsync(): Promise<void> {
100
- await this.clearTableItems("events");
101
- await this.clearTableItems("snapshots");
102
- await this.clearTableItems("messages");
103
- }
104
- dispose?(): void {
105
- throw new Error("Method not implemented.");
106
- }
107
- disposeAsync(): Promise<void> {
108
- throw new Error("Method not implemented.");
109
- }
110
-
111
- public async close(): Promise<void> {
112
- return;
113
- }
114
-
115
- }
@@ -1,250 +0,0 @@
1
- import { unmarshall } from "@aws-sdk/util-dynamodb";
2
-
3
- import { IEvDbPayloadData } from '@eventualize/types/IEvDbEventPayload';
4
- import IEvDbEventMetadata from '@eventualize/types/IEvDbEventMetadata';
5
- import EvDbStreamCursor from '@eventualize/types/EvDbStreamCursor';
6
- import EvDbMessage from '@eventualize/types/EvDbMessage';
7
- import IEvDbStorageSnapshotAdapter from '@eventualize/types/IEvDbStorageSnapshotAdapter';
8
- import IEvDbStorageStreamAdapter from '@eventualize/types/IEvDbStorageStreamAdapter';
9
- import EvDbStreamAddress from '@eventualize/types/EvDbStreamAddress';
10
- import EvDbViewAddress from '@eventualize/types/EvDbViewAddress';
11
- import { EvDbStoredSnapshotResultRaw } from '@eventualize/types/EvDbStoredSnapshotResult';
12
- import { EvDbStoredSnapshotData } from '@eventualize/types/EvDbStoredSnapshotData';
13
- import EvDbEvent from '@eventualize/types/EvDbEvent';
14
- import StreamStoreAffected from '@eventualize/types/StreamStoreAffected';
15
- import EvDbContinuousFetchOptions from '@eventualize/types/EvDbContinuousFetchOptions';
16
- import EvDbMessageFilter from '@eventualize/types/EvDbMessageFilter';
17
- import { EvDbShardName } from '@eventualize/types/primitiveTypes';
18
-
19
-
20
- import { createDynamoDBClient, listTables } from './DynamoDbClient.js';
21
- import QueryProvider, { deserializeStreamAddress, EventRecord, MessageRecord } from './EvDbDynamoDbStorageAdapterQueries.js'
22
- import { DynamoDBClient, TransactionCanceledException, TransactWriteItemsCommand } from '@aws-sdk/client-dynamodb';
23
-
24
- // Type definitions for records
25
- export interface EvDbEventRecord extends IEvDbEventMetadata {
26
- id: string;
27
- payload: IEvDbPayloadData;
28
- }
29
-
30
- export interface EvDbSnapshotRecord {
31
- id: string;
32
- streamType: string;
33
- streamId: string;
34
- viewName: string;
35
- offset: bigint;
36
- state: IEvDbPayloadData;
37
- }
38
-
39
- export interface IEvDbOutboxTransformer {
40
- transform(message: EvDbMessage): EvDbMessage;
41
- }
42
-
43
- export interface EvDbStorageContext {
44
- schema?: string;
45
- shortId: string;
46
- id: string;
47
- }
48
-
49
- const serializePayload = (payload: IEvDbPayloadData) => Buffer.from(JSON.stringify(payload), 'utf-8');
50
- const deserializePayload = (payload: any): IEvDbPayloadData => {
51
- if (!!payload && typeof payload == 'object') {
52
- return payload;
53
- }
54
- return {};
55
- }
56
-
57
- /**
58
- * Prisma-based storage adapter for EvDb
59
- * Replaces SQL Server-specific adapter with database-agnostic Prisma implementation
60
- */
61
- export default class EvDbDynamoDbStorageAdapter implements IEvDbStorageSnapshotAdapter, IEvDbStorageStreamAdapter {
62
- constructor(private dynamoDbClient: DynamoDBClient = createDynamoDBClient()) {
63
- }
64
- getFromOutbox(filter: EvDbMessageFilter, options?: EvDbContinuousFetchOptions | null): Promise<AsyncIterable<EvDbMessage>> {
65
- throw new Error('Method not implemented.');
66
- }
67
- getFromOutboxAsync(shard: EvDbShardName, filter: EvDbMessageFilter, options?: EvDbContinuousFetchOptions | null, cancellation?: AbortSignal): AsyncIterable<EvDbMessage> {
68
- throw new Error('Method not implemented.');
69
- }
70
- getRecordsFromOutboxAsync(filter: EvDbMessageFilter, options?: EvDbContinuousFetchOptions | null, cancellation?: AbortSignal): AsyncIterable<EvDbMessage>;
71
- getRecordsFromOutboxAsync(shard: EvDbShardName, filter: EvDbMessageFilter, options?: EvDbContinuousFetchOptions | null, cancellation?: AbortSignal): AsyncIterable<EvDbMessage>;
72
- getRecordsFromOutboxAsync(shard: unknown, filter?: unknown, options?: unknown, cancellation?: unknown): AsyncIterable<EvDbMessage> {
73
- throw new Error('Method not implemented.');
74
- }
75
- subscribeToMessageAsync(handler: (message: EvDbMessage) => Promise<void>, filter: EvDbMessageFilter, options?: EvDbContinuousFetchOptions | null): Promise<void>;
76
- subscribeToMessageAsync(handler: (message: EvDbMessage) => Promise<void>, shard: EvDbShardName, filter: EvDbMessageFilter, options?: EvDbContinuousFetchOptions | null): Promise<void>;
77
- subscribeToMessageAsync(handler: unknown, shard: unknown, filter?: unknown, options?: unknown): Promise<void> {
78
- throw new Error('Method not implemented.');
79
- }
80
-
81
- /**
82
- * Store stream events in a transaction
83
- */
84
- async storeStreamAsync(
85
- events: ReadonlyArray<EvDbEvent>,
86
- messages: ReadonlyArray<EvDbMessage>,
87
- ): Promise<StreamStoreAffected> {
88
- try {
89
- await listTables(this.dynamoDbClient);
90
- const eventsToInsert: EventRecord[] = events.map((event) =>
91
- EventRecord.createFromEvent(event));
92
-
93
- const messagesToInsert: MessageRecord[] = messages.map(message => {
94
- return {
95
- id: crypto.randomUUID(),
96
- stream_cursor: message.streamCursor,
97
- channel: message.channel,
98
- message_type: message.messageType,
99
- event_type: message.eventType,
100
- captured_by: message.capturedBy,
101
- captured_at: message.capturedAt,
102
- payload: message.payload,
103
- }
104
- })
105
-
106
- const storeEventsQuery = QueryProvider.saveEvents(eventsToInsert);
107
- const storeMessagesQuery = QueryProvider.saveMessages(messagesToInsert);
108
-
109
- const transactItems = { TransactItems: [...storeEventsQuery, ...storeMessagesQuery] };
110
-
111
- const command = new TransactWriteItemsCommand(transactItems)
112
- await this.dynamoDbClient.send(command);
113
-
114
- const numEvents = eventsToInsert.length;
115
- const numMessages = messagesToInsert
116
- .reduce((prev, { message_type: t }) =>
117
- Object.assign(prev, { [t]: (prev[t] ?? 0) + 1 }), {} as Record<string, number>);
118
- return new StreamStoreAffected(numEvents, new Map(Object.entries(numMessages)));
119
- } catch (error) {
120
- if (this.isOccException(error)) {
121
- throw new Error('OPTIMISTIC_CONCURRENCY_VIOLATION');
122
- }
123
- throw error;
124
- }
125
- }
126
-
127
- /**
128
- * Store outbox messages in a transaction
129
- */
130
- async storeOutboxMessagesAsync(
131
- shardName: EvDbShardName,
132
- records: EvDbMessage[],
133
- ): Promise<number> {
134
- throw new Error('Method not implemented.');
135
- }
136
-
137
- /**
138
- * Get the last offset for a stream
139
- */
140
- async getLastOffsetAsync(
141
- streamAddress: EvDbStreamAddress
142
- ): Promise<number> {
143
- const query = QueryProvider.getLastOffset(streamAddress);
144
- const response = await this.dynamoDbClient.send(query);
145
- if (!response.Items) {
146
- return -1;
147
- }
148
- return parseInt(response.Items[0]?.offset.N ?? '-1', 10);
149
- }
150
-
151
- /**
152
- * Get events for a stream since a specific offset
153
- */
154
- async *getEventsAsync(
155
- streamCursor: EvDbStreamCursor,
156
- pageSize: number = 100
157
- ): AsyncGenerator<EvDbEvent, void, undefined> {
158
- let queryCursor: Record<string, any> | undefined = undefined;
159
-
160
- do {
161
- const getEventsCommand = QueryProvider.getEvents(streamCursor);
162
- const response = await this.dynamoDbClient.send(getEventsCommand);
163
-
164
- if (response.Items && response.Items.length > 0) {
165
- for (const item of response.Items) {
166
- const res = unmarshall(item);
167
- const streamAddress = deserializeStreamAddress(res.stream_address)
168
- const r: EventRecord = new EventRecord(
169
- crypto.randomUUID(),
170
- new EvDbStreamCursor(streamAddress.streamType, streamAddress.streamId, res.offset),
171
- res.event_type,
172
- res.captured_by,
173
- new Date(res.captured_at),
174
- res.payload,
175
- new Date(res.stored_at)
176
- );
177
- yield r.toEvDbEvent();
178
- }
179
- }
180
-
181
- queryCursor = response.LastEvaluatedKey;
182
-
183
- } while (queryCursor)
184
- }
185
-
186
- /**
187
- * Get snapshot for a stream view
188
- */
189
- async getSnapshotAsync(
190
- viewAddress: EvDbViewAddress
191
- ): Promise<EvDbStoredSnapshotResultRaw> {
192
- const { streamType, streamId, viewName } = viewAddress;
193
- try {
194
- const query = QueryProvider.getSnapshot(viewAddress);
195
- const response = await this.dynamoDbClient.send(query);
196
-
197
- if (!response.Items) {
198
- return EvDbStoredSnapshotResultRaw.Empty;
199
- }
200
-
201
- const snapshot = unmarshall(response.Items[0]);
202
-
203
- return new EvDbStoredSnapshotResultRaw(
204
- snapshot.offset,
205
- new Date(Number(snapshot.stored_at)),
206
- snapshot.state,
207
- );
208
- } catch (error) {
209
- throw error;
210
- }
211
- }
212
-
213
- /**
214
- * Save a snapshot
215
- */
216
- async storeSnapshotAsync(record: EvDbStoredSnapshotData): Promise<void> {
217
- try {
218
- const command = QueryProvider.saveSnapshot(record);
219
- await this.dynamoDbClient.send(command);
220
-
221
- } catch (error) {
222
- throw error;
223
- }
224
- }
225
-
226
- /**
227
- * Check if an exception is an optimistic concurrency conflict
228
- */
229
- private isOccException(error: unknown): boolean {
230
- if (!(error instanceof TransactionCanceledException)) {
231
- return false;
232
- }
233
- return !!(error as TransactionCanceledException)
234
- .CancellationReasons?.some(({ Code }) => Code === 'ConditionalCheckFailed')
235
- }
236
-
237
- /**
238
- * Get table name for shard
239
- */
240
- private getTableNameForShard(shardName: EvDbShardName): string {
241
- throw new Error('Method not implemented.');
242
- }
243
-
244
- /**
245
- * Close the database connection
246
- */
247
- async close(): Promise<void> {
248
- return;
249
- }
250
- }
@@ -1,210 +0,0 @@
1
- import IEvDbEventPayload, { IEvDbPayloadData } from "@eventualize/types/IEvDbEventPayload"
2
- import { AttributeValue, GetItemCommandInput, PutItemCommand, PutItemCommandInput, QueryCommand, QueryCommandInput, TransactWriteItem } from "@aws-sdk/client-dynamodb";
3
- import EvDbStreamCursor from "@eventualize/types/EvDbStreamCursor";
4
- import EvDbStreamAddress from "@eventualize/types/EvDbStreamAddress";
5
- import EvDbEvent from "@eventualize/types/EvDbEvent";
6
- import EvDbViewAddress from "@eventualize/types/EvDbViewAddress";
7
- import { EvDbStoredSnapshotData } from "@eventualize/types/EvDbStoredSnapshotData";
8
- import { marshall } from "@aws-sdk/util-dynamodb";
9
-
10
-
11
- export class EventRecord {
12
- constructor(
13
- public readonly id: string,
14
- public readonly stream_cursor: EvDbStreamCursor,
15
- public readonly event_type: string,
16
- public readonly captured_by: string,
17
- public readonly captured_at: Date,
18
- public readonly payload: IEvDbEventPayload,
19
- public readonly stored_at?: Date,
20
- ) { }
21
-
22
- public static createFromEvent(e: EvDbEvent): EventRecord {
23
- return new EventRecord(
24
- crypto.randomUUID(),
25
- e.streamCursor,
26
- e.eventType,
27
- e.capturedBy,
28
- e.capturedAt,
29
- e.payload,
30
- e.storedAt)
31
- }
32
-
33
- public toEvDbEvent(): EvDbEvent {
34
- return new EvDbEvent(
35
- this.event_type,
36
- this.stream_cursor,
37
- this.payload,
38
- this.captured_at,
39
- this.captured_by,
40
- new Date(Number(this.stored_at))
41
- )
42
- }
43
- }
44
-
45
- export type MessageRecord = {
46
- id: string
47
- stream_cursor: EvDbStreamCursor
48
- channel: string
49
- message_type: string
50
- event_type: string
51
- captured_by: string
52
- captured_at: Date
53
- payload: IEvDbPayloadData
54
- stored_at?: Date
55
- }
56
-
57
- const serializeStreamAddress = (streamAddress: EvDbStreamAddress) => {
58
- return `${streamAddress.streamType}::${streamAddress.streamId}`;
59
- }
60
-
61
- export const deserializeStreamAddress = (streamAddressStr: string): EvDbStreamAddress => {
62
- const [streamType, streamId] = streamAddressStr.split('::');
63
- return new EvDbStreamAddress(streamType, streamId);
64
- }
65
-
66
- const serializeMessageAddress = (m: MessageRecord) => {
67
- return `${m.channel}::${m.message_type}`;
68
- }
69
-
70
- const serializeViewAddress = (viewAddress: EvDbViewAddress) => {
71
- return `${serializeStreamAddress(viewAddress)}::${viewAddress.viewName}`;
72
- }
73
-
74
- export default class EvDbDynamoDbStorageAdapterQueries {
75
-
76
- public static saveEvents(events: EventRecord[]): TransactWriteItem[] {
77
- const TransactItems = events.map(e => ({
78
- Put: {
79
- TableName: "events",
80
- Item: {
81
- stream_address: { S: serializeStreamAddress(e.stream_cursor) } as AttributeValue,
82
- offset: { N: e.stream_cursor.offset.toString() },
83
- event_type: { S: e.event_type },
84
- captured_by: { S: e.captured_by },
85
- captured_at: { S: e.captured_at.getTime().toString() },
86
- payload: {
87
- M: marshall(e.payload, {
88
- convertClassInstanceToMap: true,
89
- removeUndefinedValues: true
90
- })
91
- },
92
- stored_at: { S: Date.now().toString() }
93
- },
94
- ConditionExpression: "(attribute_not_exists(#sa)) Or (attribute_exists(#sa) And attribute_not_exists(#offset))",
95
- ExpressionAttributeNames: {
96
- "#sa": "stream_address",
97
- "#offset": "offset"
98
- }
99
- }
100
- }));
101
-
102
- return TransactItems;
103
-
104
- }
105
-
106
- public static saveMessages(messages: MessageRecord[]): TransactWriteItem[] {
107
- const TransactItems = messages.map(m => ({
108
- Put: {
109
- TableName: "messages",
110
- Item: {
111
- message_address: { S: serializeMessageAddress(m) },
112
- stream_address: { S: serializeStreamAddress(m.stream_cursor) },
113
- offset: { N: m.stream_cursor.offset.toString() },
114
- event_type: { S: m.event_type },
115
- captured_by: { S: m.captured_by },
116
- captured_at: { S: `${m.captured_at.getTime().toString()}::${crypto.randomUUID()}` },
117
- payload: {
118
- M: marshall(m.payload, {
119
- convertClassInstanceToMap: true,
120
- removeUndefinedValues: true
121
- })
122
- },
123
- stored_at: { S: Date.now().toString() }
124
- }
125
- }
126
- }));
127
-
128
- return TransactItems;
129
- }
130
-
131
- public static getLastOffset(streamAddress: EvDbStreamAddress): QueryCommand {
132
- const queryParams = {
133
- TableName: "events",
134
- KeyConditionExpression: "stream_address = :pk",
135
- ExpressionAttributeValues: {
136
- ":pk": { S: serializeStreamAddress(streamAddress) }
137
- },
138
- ScanIndexForward: false,
139
- Limit: 1
140
- }
141
-
142
- return new QueryCommand(queryParams);
143
- }
144
-
145
- public static getEvents(streamCursor: EvDbStreamCursor, queryCursor: Record<string, any> | undefined = undefined, pageSize: number = 100) {
146
- const queryParams = {
147
- TableName: "events",
148
- KeyConditionExpression: "#sa = :sa AND #o >= :offsetValue",
149
- ExpressionAttributeNames: {
150
- "#o": "offset",
151
- "#sa": "stream_address",
152
- "#cb": "captured_by"
153
- },
154
- ExpressionAttributeValues: {
155
- ":sa": { S: serializeStreamAddress(streamCursor) },
156
- ":offsetValue": { N: streamCursor.offset.toString() }
157
- },
158
- ProjectionExpression: '#sa, #o, id, event_type, captured_at, #cb, stored_at, payload',
159
- Limit: pageSize,
160
- ExclusiveStartKey: queryCursor
161
- }
162
-
163
- return new QueryCommand(queryParams);
164
- }
165
-
166
- public static getSnapshot(viewAddress: EvDbViewAddress) {
167
- const queryParams = {
168
- TableName: "snapshots",
169
- KeyConditionExpression: "view_address = :sa",
170
-
171
- ExpressionAttributeValues: {
172
- ":sa": { S: serializeViewAddress(viewAddress) },
173
- },
174
- ProjectionExpression: '#o, #s, stored_at',
175
- ExpressionAttributeNames: {
176
- "#o": "offset",
177
- "#s": "state"
178
- },
179
- ScanIndexForward: false, // false = descending order
180
- Limit: 1
181
- }
182
-
183
- return new QueryCommand(queryParams);
184
- }
185
-
186
- public static saveSnapshot(snapshot: EvDbStoredSnapshotData): PutItemCommand {
187
- const viewAddress = new EvDbViewAddress(snapshot.streamType, snapshot.streamId, snapshot.viewName);
188
- const queryParams: PutItemCommandInput = {
189
- TableName: "snapshots",
190
- Item: {
191
- view_address: { S: serializeViewAddress(viewAddress) },
192
- offset: { N: snapshot.offset.toString() },
193
- state: {
194
- M: marshall(snapshot.state, {
195
- convertClassInstanceToMap: true,
196
- removeUndefinedValues: true
197
- })
198
- },
199
- stored_at: { S: Date.now().toString() }
200
- },
201
- ConditionExpression: "(attribute_not_exists(#va)) Or (attribute_exists(#va) And attribute_not_exists(#offset))",
202
- ExpressionAttributeNames: {
203
- "#va": "view_address",
204
- "#offset": "offset"
205
- }
206
- };
207
-
208
- return new PutItemCommand(queryParams);
209
- }
210
- }
package/src/dbModel.json DELETED
@@ -1,215 +0,0 @@
1
- {
2
- "ModelName": "Eventualize Events Table",
3
- "ModelMetadata": {
4
- "Author": "",
5
- "DateCreated": "Dec 12, 2025, 02:20 AM",
6
- "DateLastModified": "Dec 12, 2025, 02:33 AM",
7
- "Description": "",
8
- "AWSService": "Amazon DynamoDB",
9
- "Version": "3.0"
10
- },
11
- "DataModel": [
12
- {
13
- "TableName": "events",
14
- "KeyAttributes": {
15
- "PartitionKey": {
16
- "AttributeName": "stream_address",
17
- "AttributeType": "S"
18
- },
19
- "SortKey": {
20
- "AttributeName": "offset",
21
- "AttributeType": "N"
22
- }
23
- },
24
- "NonKeyAttributes": [
25
- {
26
- "AttributeName": "id",
27
- "AttributeType": "S"
28
- },
29
- {
30
- "AttributeName": "event_type",
31
- "AttributeType": "S"
32
- },
33
- {
34
- "AttributeName": "captured_at",
35
- "AttributeType": "S"
36
- },
37
- {
38
- "AttributeName": "captured_by",
39
- "AttributeType": "S"
40
- },
41
- {
42
- "AttributeName": "stored_at",
43
- "AttributeType": "S"
44
- },
45
- {
46
- "AttributeName": "payload",
47
- "AttributeType": "M"
48
- }
49
- ],
50
- "TableFacets": [],
51
- "GlobalSecondaryIndexes": [
52
- {
53
- "IndexName": "event_type__captured_at",
54
- "KeyAttributes": {
55
- "PartitionKey": {
56
- "AttributeName": "event_type",
57
- "AttributeType": "S"
58
- },
59
- "SortKey": {
60
- "AttributeName": "captured_at",
61
- "AttributeType": "S"
62
- }
63
- },
64
- "Projection": {
65
- "ProjectionType": "ALL"
66
- }
67
- }
68
- ],
69
- "TableData": [],
70
- "DataAccess": {
71
- "MySql": {}
72
- },
73
- "SampleDataFormats": {
74
- "offset": [
75
- "Int"
76
- ],
77
- "id": [
78
- "identifiers",
79
- "UUID"
80
- ],
81
- "event_type": [
82
- "dataTypes",
83
- "String"
84
- ],
85
- "captured_at": [
86
- "date",
87
- "Epoc/Unix date format"
88
- ],
89
- "captured_by": [
90
- "identifiers",
91
- "Domain"
92
- ],
93
- "stored_at": [
94
- "date",
95
- "Epoc/Unix date format"
96
- ]
97
- },
98
- "BillingMode": "PAY_PER_REQUEST"
99
- },
100
- {
101
- "TableName": "snapshots",
102
- "KeyAttributes": {
103
- "PartitionKey": {
104
- "AttributeName": "view_address",
105
- "AttributeType": "S"
106
- },
107
- "SortKey": {
108
- "AttributeName": "offset",
109
- "AttributeType": "N"
110
- }
111
- },
112
- "NonKeyAttributes": [
113
- {
114
- "AttributeName": "stored_at",
115
- "AttributeType": "S"
116
- },
117
- {
118
- "AttributeName": "state",
119
- "AttributeType": "M"
120
- }
121
- ],
122
- "TableFacets": [],
123
- "GlobalSecondaryIndexes": [],
124
- "TableData": [],
125
- "DataAccess": {
126
- "MySql": {}
127
- },
128
- "SampleDataFormats": {
129
- "offset": [
130
- "Int"
131
- ],
132
- "view_address": [
133
- "dataTypes",
134
- "String"
135
- ],
136
- "stored_at": [
137
- "date",
138
- "Epoc/Unix date format"
139
- ]
140
- },
141
- "BillingMode": "PAY_PER_REQUEST"
142
- },
143
- {
144
- "TableName": "messages",
145
- "KeyAttributes": {
146
- "PartitionKey": {
147
- "AttributeName": "message_addres",
148
- "AttributeType": "S"
149
- },
150
- "SortKey": {
151
- "AttributeName": "captured_at",
152
- "AttributeType": "S"
153
- }
154
- },
155
- "NonKeyAttributes": [
156
- {
157
- "AttributeName": "event_type",
158
- "AttributeType": "S"
159
- },
160
- {
161
- "AttributeName": "offset",
162
- "AttributeType": "N"
163
- },
164
- {
165
- "AttributeName": "stored_at",
166
- "AttributeType": "S"
167
- },
168
- {
169
- "AttributeName": "captured_by",
170
- "AttributeType": "S"
171
- },
172
- {
173
- "AttributeName": "payload",
174
- "AttributeType": "M"
175
- }
176
- ],
177
- "TableFacets": [],
178
- "GlobalSecondaryIndexes": [],
179
- "TableData": [],
180
- "DataAccess": {
181
- "MySql": {}
182
- },
183
- "SampleDataFormats": {
184
- "message_addres": [
185
- "dataTypes",
186
- "String"
187
- ],
188
- "captured_at": [
189
- "date",
190
- "Epoc/Unix date format"
191
- ],
192
- "event_type": [
193
- "dataTypes",
194
- "String"
195
- ],
196
- "offset": [
197
- "Int"
198
- ],
199
- "channel": [
200
- "dataTypes",
201
- "String"
202
- ],
203
- "stored_at": [
204
- "date",
205
- "Epoc/Unix date format"
206
- ],
207
- "captured_by": [
208
- "identifiers",
209
- "Domain"
210
- ]
211
- },
212
- "BillingMode": "PAY_PER_REQUEST"
213
- }
214
- ]
215
- }
package/tsconfig.json DELETED
@@ -1,21 +0,0 @@
1
- {
2
- "extends": "../../tsconfig.json",
3
- "compilerOptions": {
4
- "outDir": "./dist",
5
- "rootDir": "./src",
6
- "moduleResolution": "node",
7
- "module": "es2020",
8
- "target": "es2020",
9
- "strict": true,
10
- "esModuleInterop": true,
11
- },
12
- "references": [
13
- {
14
- "path": "../types"
15
- }
16
- ],
17
- "include": [
18
- "src/**/*.ts",
19
- "../prisma.config.ts",
20
- ]
21
- }