@eventualize/dynamodb-storage-adapter 2.0.0 → 2.1.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.
- package/dist/DynamoDbClient.d.ts +0 -1
- package/dist/DynamoDbClient.js +2 -15
- package/dist/DynamoDbClient.js.map +1 -1
- package/dist/EvDBDynamoDBAdmin.d.ts +5 -5
- package/dist/EvDBDynamoDBAdmin.js +10 -11
- package/dist/EvDBDynamoDBAdmin.js.map +1 -1
- package/dist/EvDbDynamoDbStorageAdapter.d.ts +20 -43
- package/dist/EvDbDynamoDbStorageAdapter.js +33 -55
- package/dist/EvDbDynamoDbStorageAdapter.js.map +1 -1
- package/dist/EvDbDynamoDbStorageAdapterQueries.d.ts +9 -7
- package/dist/EvDbDynamoDbStorageAdapterQueries.js +31 -31
- package/dist/EvDbDynamoDbStorageAdapterQueries.js.map +1 -1
- package/package.json +3 -2
package/dist/DynamoDbClient.d.ts
CHANGED
|
@@ -9,7 +9,6 @@ export interface DynamoDBClientOptions {
|
|
|
9
9
|
secretAccessKey?: string;
|
|
10
10
|
region?: string;
|
|
11
11
|
}
|
|
12
|
-
export declare function listTables(client: DynamoDBClient): Promise<string[] | undefined>;
|
|
13
12
|
/**
|
|
14
13
|
* Creates a DynamoDB client.
|
|
15
14
|
* @param options - Optional configuration. Falls back to environment variables if not provided.
|
package/dist/DynamoDbClient.js
CHANGED
|
@@ -1,17 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
import { DynamoDBClient, ListTablesCommand } from "@aws-sdk/client-dynamodb";
|
|
3
|
-
export async function listTables(client) {
|
|
4
|
-
try {
|
|
5
|
-
const command = new ListTablesCommand({});
|
|
6
|
-
const response = await client.send(command);
|
|
7
|
-
console.log("Tables in DynamoDB Local:", response.TableNames);
|
|
8
|
-
return response.TableNames;
|
|
9
|
-
}
|
|
10
|
-
catch (error) {
|
|
11
|
-
console.error("Error listing tables:", error);
|
|
12
|
-
throw error;
|
|
13
|
-
}
|
|
14
|
-
}
|
|
1
|
+
import { DynamoDBClient } from "@aws-sdk/client-dynamodb";
|
|
15
2
|
/**
|
|
16
3
|
* Creates a DynamoDB client.
|
|
17
4
|
* @param options - Optional configuration. Falls back to environment variables if not provided.
|
|
@@ -20,7 +7,7 @@ export function createDynamoDBClient(options) {
|
|
|
20
7
|
const endpoint = options?.endpoint ?? process.env.DYNAMODB_CONNECTION;
|
|
21
8
|
const accessKeyId = options?.accessKeyId ?? process.env.AWS_ACCESS_KEY_ID;
|
|
22
9
|
const secretAccessKey = options?.secretAccessKey ?? process.env.AWS_SECRET_ACCESS_KEY;
|
|
23
|
-
const region = options?.region ?? process.env.AWS_REGION ??
|
|
10
|
+
const region = options?.region ?? process.env.AWS_REGION ?? "us-east-1";
|
|
24
11
|
if (!endpoint || !accessKeyId || !secretAccessKey) {
|
|
25
12
|
const envVars = { endpoint, accessKeyId, secretAccessKey };
|
|
26
13
|
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":"
|
|
1
|
+
{"version":3,"file":"DynamoDbClient.js","sourceRoot":"","sources":["../src/DynamoDbClient.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAc1D;;;GAGG;AACH,MAAM,UAAU,oBAAoB,CAAC,OAA+B;IAClE,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;QAClD,MAAM,OAAO,GAAG,EAAE,QAAQ,EAAE,WAAW,EAAE,eAAe,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CACb,wDAAwD,GAAG,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,CACnF,CAAC;IACJ,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;AACpC,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import IEvDbStorageAdmin from "@eventualize/types/IEvDbStorageAdmin";
|
|
2
|
-
import { DynamoDBClientOptions } from "./DynamoDbClient.js";
|
|
1
|
+
import type IEvDbStorageAdmin from "@eventualize/types/adapters/IEvDbStorageAdmin";
|
|
2
|
+
import type { DynamoDBClientOptions } from "./DynamoDbClient.js";
|
|
3
3
|
export default class EvDbDynamoDbAdmin implements IEvDbStorageAdmin {
|
|
4
4
|
private dynamoDbClient;
|
|
5
5
|
/**
|
|
@@ -9,9 +9,9 @@ export default class EvDbDynamoDbAdmin implements IEvDbStorageAdmin {
|
|
|
9
9
|
constructor(options?: DynamoDBClientOptions);
|
|
10
10
|
private extractKeys;
|
|
11
11
|
/**
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
* Scans a table for all items and deletes them in batches of 25.
|
|
13
|
+
* @param tableName The name of the table to clear.
|
|
14
|
+
*/
|
|
15
15
|
private clearTableItems;
|
|
16
16
|
createEnvironmentAsync(): Promise<void>;
|
|
17
17
|
destroyEnvironmentAsync(): Promise<void>;
|
|
@@ -10,11 +10,11 @@ export default class EvDbDynamoDbAdmin {
|
|
|
10
10
|
}
|
|
11
11
|
// Helper function to extract keys in raw DynamoDB format
|
|
12
12
|
extractKeys(tableName, items) {
|
|
13
|
-
return items.map(item => {
|
|
13
|
+
return items.map((item) => {
|
|
14
14
|
const deleteRequest = {
|
|
15
15
|
DeleteRequest: {
|
|
16
|
-
Key: {} // Must build the Key object manually
|
|
17
|
-
}
|
|
16
|
+
Key: {}, // Must build the Key object manually
|
|
17
|
+
},
|
|
18
18
|
};
|
|
19
19
|
if (tableName === "events") {
|
|
20
20
|
deleteRequest.DeleteRequest.Key["stream_address"] = item["stream_address"];
|
|
@@ -33,9 +33,9 @@ export default class EvDbDynamoDbAdmin {
|
|
|
33
33
|
});
|
|
34
34
|
}
|
|
35
35
|
/**
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
36
|
+
* Scans a table for all items and deletes them in batches of 25.
|
|
37
|
+
* @param tableName The name of the table to clear.
|
|
38
|
+
*/
|
|
39
39
|
async clearTableItems(tableName) {
|
|
40
40
|
let items;
|
|
41
41
|
let exclusiveStartKey = undefined;
|
|
@@ -52,7 +52,8 @@ export default class EvDbDynamoDbAdmin {
|
|
|
52
52
|
projectionExpression = "view_address, #o";
|
|
53
53
|
expressionAttributeNames = { "#o": "offset" };
|
|
54
54
|
}
|
|
55
|
-
else {
|
|
55
|
+
else {
|
|
56
|
+
// "messages" table
|
|
56
57
|
projectionExpression = "message_address, captured_at";
|
|
57
58
|
// No offset in the projection for messages table, so no #o alias is needed
|
|
58
59
|
}
|
|
@@ -70,15 +71,13 @@ export default class EvDbDynamoDbAdmin {
|
|
|
70
71
|
const deleteRequests = this.extractKeys(tableName, items);
|
|
71
72
|
const batchWriteCommand = new BatchWriteItemCommand({
|
|
72
73
|
RequestItems: {
|
|
73
|
-
[tableName]: deleteRequests
|
|
74
|
-
}
|
|
74
|
+
[tableName]: deleteRequests,
|
|
75
|
+
},
|
|
75
76
|
});
|
|
76
77
|
await this.dynamoDbClient.send(batchWriteCommand);
|
|
77
|
-
console.log(`Deleted ${items.length} items from ${tableName}.`);
|
|
78
78
|
}
|
|
79
79
|
exclusiveStartKey = scanResult.LastEvaluatedKey;
|
|
80
80
|
} while (exclusiveStartKey);
|
|
81
|
-
console.log(`Finished item deletion for table: ${tableName}`);
|
|
82
81
|
}
|
|
83
82
|
createEnvironmentAsync() {
|
|
84
83
|
throw new Error("Method not implemented.");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EvDBDynamoDBAdmin.js","sourceRoot":"","sources":["../src/EvDBDynamoDBAdmin.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"EvDBDynamoDBAdmin.js","sourceRoot":"","sources":["../src/EvDBDynamoDBAdmin.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,43 +1,20 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
import
|
|
8
|
-
import
|
|
9
|
-
import
|
|
10
|
-
import
|
|
11
|
-
import
|
|
12
|
-
import
|
|
13
|
-
import
|
|
14
|
-
import
|
|
15
|
-
import {
|
|
16
|
-
import { DynamoDBClientOptions } from './DynamoDbClient.js';
|
|
17
|
-
import { DynamoDBClient } from '@aws-sdk/client-dynamodb';
|
|
18
|
-
export interface EvDbEventRecord extends IEvDbEventMetadata {
|
|
19
|
-
id: string;
|
|
20
|
-
payload: IEvDbPayloadData;
|
|
21
|
-
}
|
|
22
|
-
export interface EvDbSnapshotRecord {
|
|
23
|
-
id: string;
|
|
24
|
-
streamType: string;
|
|
25
|
-
streamId: string;
|
|
26
|
-
viewName: string;
|
|
27
|
-
offset: bigint;
|
|
28
|
-
state: IEvDbPayloadData;
|
|
29
|
-
}
|
|
30
|
-
export interface IEvDbOutboxTransformer {
|
|
31
|
-
transform(message: EvDbMessage): EvDbMessage;
|
|
32
|
-
}
|
|
33
|
-
export interface EvDbStorageContext {
|
|
34
|
-
schema?: string;
|
|
35
|
-
shortId: string;
|
|
36
|
-
id: string;
|
|
37
|
-
}
|
|
1
|
+
import EvDbStreamCursor from "@eventualize/types/stream/EvDbStreamCursor";
|
|
2
|
+
import type EvDbMessage from "@eventualize/types/messages/EvDbMessage";
|
|
3
|
+
import type IEvDbStorageSnapshotAdapter from "@eventualize/types/adapters/IEvDbStorageSnapshotAdapter";
|
|
4
|
+
import type IEvDbStorageStreamAdapter from "@eventualize/types/adapters/IEvDbStorageStreamAdapter";
|
|
5
|
+
import type EvDbStreamAddress from "@eventualize/types/stream/EvDbStreamAddress";
|
|
6
|
+
import type EvDbViewAddress from "@eventualize/types/view/EvDbViewAddress";
|
|
7
|
+
import { EvDbStoredSnapshotResultRaw } from "@eventualize/types/snapshots/EvDbStoredSnapshotResultRaw";
|
|
8
|
+
import type { EvDbStoredSnapshotData } from "@eventualize/types/snapshots/EvDbStoredSnapshotData";
|
|
9
|
+
import type EvDbEvent from "@eventualize/types/events/EvDbEvent";
|
|
10
|
+
import StreamStoreAffected from "@eventualize/types/stream/StreamStoreAffected";
|
|
11
|
+
import type EvDbContinuousFetchOptions from "@eventualize/types/primitives/EvDbContinuousFetchOptions";
|
|
12
|
+
import type EvDbMessageFilter from "@eventualize/types/messages/EvDbMessageFilter";
|
|
13
|
+
import type { EvDbShardName } from "@eventualize/types/primitives/EvDbShardName";
|
|
14
|
+
import type { DynamoDBClientOptions } from "./DynamoDbClient.js";
|
|
15
|
+
import type { DynamoDBClient } from "@aws-sdk/client-dynamodb";
|
|
38
16
|
/**
|
|
39
|
-
*
|
|
40
|
-
* Replaces SQL Server-specific adapter with database-agnostic Prisma implementation
|
|
17
|
+
* DynamoDB storage adapter for EvDb
|
|
41
18
|
*/
|
|
42
19
|
export default class EvDbDynamoDbStorageAdapter implements IEvDbStorageSnapshotAdapter, IEvDbStorageStreamAdapter {
|
|
43
20
|
private dynamoDbClient;
|
|
@@ -52,8 +29,8 @@ export default class EvDbDynamoDbStorageAdapter implements IEvDbStorageSnapshotA
|
|
|
52
29
|
* @param options - DynamoDB client configuration options.
|
|
53
30
|
*/
|
|
54
31
|
static withOptions(options: DynamoDBClientOptions): EvDbDynamoDbStorageAdapter;
|
|
55
|
-
getFromOutbox(
|
|
56
|
-
getFromOutboxAsync(
|
|
32
|
+
getFromOutbox(_filter: EvDbMessageFilter, _options?: EvDbContinuousFetchOptions | null): Promise<AsyncIterable<EvDbMessage>>;
|
|
33
|
+
getFromOutboxAsync(_shard: EvDbShardName, _filter: EvDbMessageFilter, _options?: EvDbContinuousFetchOptions | null, _cancellation?: AbortSignal): AsyncIterable<EvDbMessage>;
|
|
57
34
|
getRecordsFromOutboxAsync(filter: EvDbMessageFilter, options?: EvDbContinuousFetchOptions | null, cancellation?: AbortSignal): AsyncIterable<EvDbMessage>;
|
|
58
35
|
getRecordsFromOutboxAsync(shard: EvDbShardName, filter: EvDbMessageFilter, options?: EvDbContinuousFetchOptions | null, cancellation?: AbortSignal): AsyncIterable<EvDbMessage>;
|
|
59
36
|
subscribeToMessageAsync(handler: (message: EvDbMessage) => Promise<void>, filter: EvDbMessageFilter, options?: EvDbContinuousFetchOptions | null): Promise<void>;
|
|
@@ -65,7 +42,7 @@ export default class EvDbDynamoDbStorageAdapter implements IEvDbStorageSnapshotA
|
|
|
65
42
|
/**
|
|
66
43
|
* Store outbox messages in a transaction
|
|
67
44
|
*/
|
|
68
|
-
storeOutboxMessagesAsync(
|
|
45
|
+
storeOutboxMessagesAsync(_shardName: EvDbShardName, _records: EvDbMessage[]): Promise<number>;
|
|
69
46
|
/**
|
|
70
47
|
* Get the last offset for a stream
|
|
71
48
|
*/
|
|
@@ -73,7 +50,7 @@ export default class EvDbDynamoDbStorageAdapter implements IEvDbStorageSnapshotA
|
|
|
73
50
|
/**
|
|
74
51
|
* Get events for a stream since a specific offset
|
|
75
52
|
*/
|
|
76
|
-
getEventsAsync(streamCursor: EvDbStreamCursor,
|
|
53
|
+
getEventsAsync(streamCursor: EvDbStreamCursor, _pageSize?: number): AsyncGenerator<EvDbEvent, void, undefined>;
|
|
77
54
|
/**
|
|
78
55
|
* Get snapshot for a stream view
|
|
79
56
|
*/
|
|
@@ -1,20 +1,12 @@
|
|
|
1
1
|
import { unmarshall } from "@aws-sdk/util-dynamodb";
|
|
2
|
-
import EvDbStreamCursor from
|
|
3
|
-
import { EvDbStoredSnapshotResultRaw } from
|
|
4
|
-
import StreamStoreAffected from
|
|
5
|
-
import { createDynamoDBClient
|
|
6
|
-
import QueryProvider, { deserializeStreamAddress, EventRecord } from
|
|
7
|
-
import { TransactionCanceledException, TransactWriteItemsCommand } from
|
|
8
|
-
const serializePayload = (payload) => Buffer.from(JSON.stringify(payload), 'utf-8');
|
|
9
|
-
const deserializePayload = (payload) => {
|
|
10
|
-
if (!!payload && typeof payload == 'object') {
|
|
11
|
-
return payload;
|
|
12
|
-
}
|
|
13
|
-
return {};
|
|
14
|
-
};
|
|
2
|
+
import EvDbStreamCursor from "@eventualize/types/stream/EvDbStreamCursor";
|
|
3
|
+
import { EvDbStoredSnapshotResultRaw } from "@eventualize/types/snapshots/EvDbStoredSnapshotResultRaw";
|
|
4
|
+
import StreamStoreAffected from "@eventualize/types/stream/StreamStoreAffected";
|
|
5
|
+
import { createDynamoDBClient } from "./DynamoDbClient.js";
|
|
6
|
+
import QueryProvider, { deserializeStreamAddress, EventRecord, } from "./EvDbDynamoDbStorageAdapterQueries.js";
|
|
7
|
+
import { TransactionCanceledException, TransactWriteItemsCommand } from "@aws-sdk/client-dynamodb";
|
|
15
8
|
/**
|
|
16
|
-
*
|
|
17
|
-
* Replaces SQL Server-specific adapter with database-agnostic Prisma implementation
|
|
9
|
+
* DynamoDB storage adapter for EvDb
|
|
18
10
|
*/
|
|
19
11
|
export default class EvDbDynamoDbStorageAdapter {
|
|
20
12
|
/**
|
|
@@ -32,26 +24,25 @@ export default class EvDbDynamoDbStorageAdapter {
|
|
|
32
24
|
static withOptions(options) {
|
|
33
25
|
return new EvDbDynamoDbStorageAdapter(createDynamoDBClient(options));
|
|
34
26
|
}
|
|
35
|
-
getFromOutbox(
|
|
36
|
-
throw new Error(
|
|
27
|
+
getFromOutbox(_filter, _options) {
|
|
28
|
+
throw new Error("Method not implemented.");
|
|
37
29
|
}
|
|
38
|
-
getFromOutboxAsync(
|
|
39
|
-
throw new Error(
|
|
30
|
+
getFromOutboxAsync(_shard, _filter, _options, _cancellation) {
|
|
31
|
+
throw new Error("Method not implemented.");
|
|
40
32
|
}
|
|
41
|
-
getRecordsFromOutboxAsync(
|
|
42
|
-
throw new Error(
|
|
33
|
+
getRecordsFromOutboxAsync(_shard, _filter, _options, _cancellation) {
|
|
34
|
+
throw new Error("Method not implemented.");
|
|
43
35
|
}
|
|
44
|
-
subscribeToMessageAsync(
|
|
45
|
-
throw new Error(
|
|
36
|
+
subscribeToMessageAsync(_handler, _shard, _filter, _options) {
|
|
37
|
+
throw new Error("Method not implemented.");
|
|
46
38
|
}
|
|
47
39
|
/**
|
|
48
40
|
* Store stream events in a transaction
|
|
49
41
|
*/
|
|
50
42
|
async storeStreamAsync(events, messages) {
|
|
51
43
|
try {
|
|
52
|
-
await listTables(this.dynamoDbClient);
|
|
53
44
|
const eventsToInsert = events.map((event) => EventRecord.createFromEvent(event));
|
|
54
|
-
const messagesToInsert = messages.map(message => {
|
|
45
|
+
const messagesToInsert = messages.map((message) => {
|
|
55
46
|
return {
|
|
56
47
|
id: crypto.randomUUID(),
|
|
57
48
|
stream_cursor: message.streamCursor,
|
|
@@ -69,13 +60,12 @@ export default class EvDbDynamoDbStorageAdapter {
|
|
|
69
60
|
const command = new TransactWriteItemsCommand(transactItems);
|
|
70
61
|
await this.dynamoDbClient.send(command);
|
|
71
62
|
const numEvents = eventsToInsert.length;
|
|
72
|
-
const numMessages = messagesToInsert
|
|
73
|
-
.reduce((prev, { message_type: t }) => Object.assign(prev, { [t]: (prev[t] ?? 0) + 1 }), {});
|
|
63
|
+
const numMessages = messagesToInsert.reduce((prev, { message_type: t }) => Object.assign(prev, { [t]: (prev[t] ?? 0) + 1 }), {});
|
|
74
64
|
return new StreamStoreAffected(numEvents, new Map(Object.entries(numMessages)));
|
|
75
65
|
}
|
|
76
66
|
catch (error) {
|
|
77
67
|
if (this.isOccException(error)) {
|
|
78
|
-
throw new Error(
|
|
68
|
+
throw new Error("OPTIMISTIC_CONCURRENCY_VIOLATION");
|
|
79
69
|
}
|
|
80
70
|
throw error;
|
|
81
71
|
}
|
|
@@ -83,8 +73,8 @@ export default class EvDbDynamoDbStorageAdapter {
|
|
|
83
73
|
/**
|
|
84
74
|
* Store outbox messages in a transaction
|
|
85
75
|
*/
|
|
86
|
-
async storeOutboxMessagesAsync(
|
|
87
|
-
throw new Error(
|
|
76
|
+
async storeOutboxMessagesAsync(_shardName, _records) {
|
|
77
|
+
throw new Error("Method not implemented.");
|
|
88
78
|
}
|
|
89
79
|
/**
|
|
90
80
|
* Get the last offset for a stream
|
|
@@ -95,12 +85,12 @@ export default class EvDbDynamoDbStorageAdapter {
|
|
|
95
85
|
if (!response.Items) {
|
|
96
86
|
return -1;
|
|
97
87
|
}
|
|
98
|
-
return parseInt(response.Items[0]?.offset.N ??
|
|
88
|
+
return parseInt(response.Items[0]?.offset.N ?? "-1", 10);
|
|
99
89
|
}
|
|
100
90
|
/**
|
|
101
91
|
* Get events for a stream since a specific offset
|
|
102
92
|
*/
|
|
103
|
-
async *getEventsAsync(streamCursor,
|
|
93
|
+
async *getEventsAsync(streamCursor, _pageSize = 100) {
|
|
104
94
|
let queryCursor = undefined;
|
|
105
95
|
do {
|
|
106
96
|
const getEventsCommand = QueryProvider.getEvents(streamCursor);
|
|
@@ -120,31 +110,20 @@ export default class EvDbDynamoDbStorageAdapter {
|
|
|
120
110
|
* Get snapshot for a stream view
|
|
121
111
|
*/
|
|
122
112
|
async getSnapshotAsync(viewAddress) {
|
|
123
|
-
const
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
if (!response.Items) {
|
|
128
|
-
return EvDbStoredSnapshotResultRaw.Empty;
|
|
129
|
-
}
|
|
130
|
-
const snapshot = unmarshall(response.Items[0]);
|
|
131
|
-
return new EvDbStoredSnapshotResultRaw(snapshot.offset, new Date(Number(snapshot.stored_at)), snapshot.state);
|
|
132
|
-
}
|
|
133
|
-
catch (error) {
|
|
134
|
-
throw error;
|
|
113
|
+
const query = QueryProvider.getSnapshot(viewAddress);
|
|
114
|
+
const response = await this.dynamoDbClient.send(query);
|
|
115
|
+
if (!response.Items) {
|
|
116
|
+
return EvDbStoredSnapshotResultRaw.Empty;
|
|
135
117
|
}
|
|
118
|
+
const snapshot = unmarshall(response.Items[0]);
|
|
119
|
+
return new EvDbStoredSnapshotResultRaw(snapshot.offset, new Date(Number(snapshot.stored_at)), snapshot.state);
|
|
136
120
|
}
|
|
137
121
|
/**
|
|
138
122
|
* Save a snapshot
|
|
139
123
|
*/
|
|
140
124
|
async storeSnapshotAsync(record) {
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
await this.dynamoDbClient.send(command);
|
|
144
|
-
}
|
|
145
|
-
catch (error) {
|
|
146
|
-
throw error;
|
|
147
|
-
}
|
|
125
|
+
const command = QueryProvider.saveSnapshot(record);
|
|
126
|
+
await this.dynamoDbClient.send(command);
|
|
148
127
|
}
|
|
149
128
|
/**
|
|
150
129
|
* Check if an exception is an optimistic concurrency conflict
|
|
@@ -153,14 +132,13 @@ export default class EvDbDynamoDbStorageAdapter {
|
|
|
153
132
|
if (!(error instanceof TransactionCanceledException)) {
|
|
154
133
|
return false;
|
|
155
134
|
}
|
|
156
|
-
return !!error
|
|
157
|
-
.CancellationReasons?.some(({ Code }) => Code === 'ConditionalCheckFailed');
|
|
135
|
+
return !!error.CancellationReasons?.some(({ Code }) => Code === "ConditionalCheckFailed");
|
|
158
136
|
}
|
|
159
137
|
/**
|
|
160
138
|
* Get table name for shard
|
|
161
139
|
*/
|
|
162
|
-
getTableNameForShard(
|
|
163
|
-
throw new Error(
|
|
140
|
+
getTableNameForShard(_shardName) {
|
|
141
|
+
throw new Error("Method not implemented.");
|
|
164
142
|
}
|
|
165
143
|
/**
|
|
166
144
|
* Close the database connection
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EvDbDynamoDbStorageAdapter.js","sourceRoot":"","sources":["../src/EvDbDynamoDbStorageAdapter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"EvDbDynamoDbStorageAdapter.js","sourceRoot":"","sources":["../src/EvDbDynamoDbStorageAdapter.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,10 +1,12 @@
|
|
|
1
|
-
import
|
|
2
|
-
import
|
|
3
|
-
import
|
|
4
|
-
import
|
|
5
|
-
import
|
|
6
|
-
import
|
|
7
|
-
import
|
|
1
|
+
import type { IEvDbPayloadData } from "@eventualize/types/events/IEvDbPayloadData";
|
|
2
|
+
import type IEvDbEventPayload from "@eventualize/types/events/IEvDbEventPayload";
|
|
3
|
+
import type { TransactWriteItem } from "@aws-sdk/client-dynamodb";
|
|
4
|
+
import { PutItemCommand, QueryCommand } from "@aws-sdk/client-dynamodb";
|
|
5
|
+
import type EvDbStreamCursor from "@eventualize/types/stream/EvDbStreamCursor";
|
|
6
|
+
import EvDbStreamAddress from "@eventualize/types/stream/EvDbStreamAddress";
|
|
7
|
+
import EvDbEvent from "@eventualize/types/events/EvDbEvent";
|
|
8
|
+
import EvDbViewAddress from "@eventualize/types/view/EvDbViewAddress";
|
|
9
|
+
import type { EvDbStoredSnapshotData } from "@eventualize/types/snapshots/EvDbStoredSnapshotData";
|
|
8
10
|
export declare class EventRecord {
|
|
9
11
|
readonly id: string;
|
|
10
12
|
readonly stream_cursor: EvDbStreamCursor;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { PutItemCommand, QueryCommand } from "@aws-sdk/client-dynamodb";
|
|
2
|
-
import EvDbStreamAddress from "@eventualize/types/EvDbStreamAddress";
|
|
3
|
-
import EvDbEvent from "@eventualize/types/EvDbEvent";
|
|
4
|
-
import EvDbViewAddress from "@eventualize/types/EvDbViewAddress";
|
|
2
|
+
import EvDbStreamAddress from "@eventualize/types/stream/EvDbStreamAddress";
|
|
3
|
+
import EvDbEvent from "@eventualize/types/events/EvDbEvent";
|
|
4
|
+
import EvDbViewAddress from "@eventualize/types/view/EvDbViewAddress";
|
|
5
5
|
import { marshall } from "@aws-sdk/util-dynamodb";
|
|
6
6
|
export class EventRecord {
|
|
7
7
|
constructor(id, stream_cursor, event_type, captured_by, captured_at, payload, stored_at) {
|
|
@@ -24,7 +24,7 @@ const serializeStreamAddress = (streamAddress) => {
|
|
|
24
24
|
return `${streamAddress.streamType}::${streamAddress.streamId}`;
|
|
25
25
|
};
|
|
26
26
|
export const deserializeStreamAddress = (streamAddressStr) => {
|
|
27
|
-
const [streamType, streamId] = streamAddressStr.split(
|
|
27
|
+
const [streamType, streamId] = streamAddressStr.split("::");
|
|
28
28
|
return new EvDbStreamAddress(streamType, streamId);
|
|
29
29
|
};
|
|
30
30
|
const serializeMessageAddress = (m) => {
|
|
@@ -35,7 +35,7 @@ const serializeViewAddress = (viewAddress) => {
|
|
|
35
35
|
};
|
|
36
36
|
export default class EvDbDynamoDbStorageAdapterQueries {
|
|
37
37
|
static saveEvents(events) {
|
|
38
|
-
const TransactItems = events.map(e => ({
|
|
38
|
+
const TransactItems = events.map((e) => ({
|
|
39
39
|
Put: {
|
|
40
40
|
TableName: "events",
|
|
41
41
|
Item: {
|
|
@@ -47,22 +47,22 @@ export default class EvDbDynamoDbStorageAdapterQueries {
|
|
|
47
47
|
payload: {
|
|
48
48
|
M: marshall(e.payload, {
|
|
49
49
|
convertClassInstanceToMap: true,
|
|
50
|
-
removeUndefinedValues: true
|
|
51
|
-
})
|
|
50
|
+
removeUndefinedValues: true,
|
|
51
|
+
}),
|
|
52
52
|
},
|
|
53
|
-
stored_at: { S: Date.now().toString() }
|
|
53
|
+
stored_at: { S: Date.now().toString() },
|
|
54
54
|
},
|
|
55
55
|
ConditionExpression: "(attribute_not_exists(#sa)) Or (attribute_exists(#sa) And attribute_not_exists(#offset))",
|
|
56
56
|
ExpressionAttributeNames: {
|
|
57
57
|
"#sa": "stream_address",
|
|
58
|
-
"#offset": "offset"
|
|
59
|
-
}
|
|
60
|
-
}
|
|
58
|
+
"#offset": "offset",
|
|
59
|
+
},
|
|
60
|
+
},
|
|
61
61
|
}));
|
|
62
62
|
return TransactItems;
|
|
63
63
|
}
|
|
64
64
|
static saveMessages(messages) {
|
|
65
|
-
const TransactItems = messages.map(m => ({
|
|
65
|
+
const TransactItems = messages.map((m) => ({
|
|
66
66
|
Put: {
|
|
67
67
|
TableName: "messages",
|
|
68
68
|
Item: {
|
|
@@ -75,12 +75,12 @@ export default class EvDbDynamoDbStorageAdapterQueries {
|
|
|
75
75
|
payload: {
|
|
76
76
|
M: marshall(m.payload, {
|
|
77
77
|
convertClassInstanceToMap: true,
|
|
78
|
-
removeUndefinedValues: true
|
|
79
|
-
})
|
|
78
|
+
removeUndefinedValues: true,
|
|
79
|
+
}),
|
|
80
80
|
},
|
|
81
|
-
stored_at: { S: Date.now().toString() }
|
|
82
|
-
}
|
|
83
|
-
}
|
|
81
|
+
stored_at: { S: Date.now().toString() },
|
|
82
|
+
},
|
|
83
|
+
},
|
|
84
84
|
}));
|
|
85
85
|
return TransactItems;
|
|
86
86
|
}
|
|
@@ -89,10 +89,10 @@ export default class EvDbDynamoDbStorageAdapterQueries {
|
|
|
89
89
|
TableName: "events",
|
|
90
90
|
KeyConditionExpression: "stream_address = :pk",
|
|
91
91
|
ExpressionAttributeValues: {
|
|
92
|
-
":pk": { S: serializeStreamAddress(streamAddress) }
|
|
92
|
+
":pk": { S: serializeStreamAddress(streamAddress) },
|
|
93
93
|
},
|
|
94
94
|
ScanIndexForward: false,
|
|
95
|
-
Limit: 1
|
|
95
|
+
Limit: 1,
|
|
96
96
|
};
|
|
97
97
|
return new QueryCommand(queryParams);
|
|
98
98
|
}
|
|
@@ -103,15 +103,15 @@ export default class EvDbDynamoDbStorageAdapterQueries {
|
|
|
103
103
|
ExpressionAttributeNames: {
|
|
104
104
|
"#o": "offset",
|
|
105
105
|
"#sa": "stream_address",
|
|
106
|
-
"#cb": "captured_by"
|
|
106
|
+
"#cb": "captured_by",
|
|
107
107
|
},
|
|
108
108
|
ExpressionAttributeValues: {
|
|
109
109
|
":sa": { S: serializeStreamAddress(streamCursor) },
|
|
110
|
-
":offsetValue": { N: streamCursor.offset.toString() }
|
|
110
|
+
":offsetValue": { N: streamCursor.offset.toString() },
|
|
111
111
|
},
|
|
112
|
-
ProjectionExpression:
|
|
112
|
+
ProjectionExpression: "#sa, #o, id, event_type, captured_at, #cb, stored_at, payload",
|
|
113
113
|
Limit: pageSize,
|
|
114
|
-
ExclusiveStartKey: queryCursor
|
|
114
|
+
ExclusiveStartKey: queryCursor,
|
|
115
115
|
};
|
|
116
116
|
return new QueryCommand(queryParams);
|
|
117
117
|
}
|
|
@@ -122,13 +122,13 @@ export default class EvDbDynamoDbStorageAdapterQueries {
|
|
|
122
122
|
ExpressionAttributeValues: {
|
|
123
123
|
":sa": { S: serializeViewAddress(viewAddress) },
|
|
124
124
|
},
|
|
125
|
-
ProjectionExpression:
|
|
125
|
+
ProjectionExpression: "#o, #s, stored_at",
|
|
126
126
|
ExpressionAttributeNames: {
|
|
127
127
|
"#o": "offset",
|
|
128
|
-
"#s": "state"
|
|
128
|
+
"#s": "state",
|
|
129
129
|
},
|
|
130
130
|
ScanIndexForward: false, // false = descending order
|
|
131
|
-
Limit: 1
|
|
131
|
+
Limit: 1,
|
|
132
132
|
};
|
|
133
133
|
return new QueryCommand(queryParams);
|
|
134
134
|
}
|
|
@@ -142,16 +142,16 @@ export default class EvDbDynamoDbStorageAdapterQueries {
|
|
|
142
142
|
state: {
|
|
143
143
|
M: marshall(snapshot.state, {
|
|
144
144
|
convertClassInstanceToMap: true,
|
|
145
|
-
removeUndefinedValues: true
|
|
146
|
-
})
|
|
145
|
+
removeUndefinedValues: true,
|
|
146
|
+
}),
|
|
147
147
|
},
|
|
148
|
-
stored_at: { S: Date.now().toString() }
|
|
148
|
+
stored_at: { S: Date.now().toString() },
|
|
149
149
|
},
|
|
150
150
|
ConditionExpression: "(attribute_not_exists(#va)) Or (attribute_exists(#va) And attribute_not_exists(#offset))",
|
|
151
151
|
ExpressionAttributeNames: {
|
|
152
152
|
"#va": "view_address",
|
|
153
|
-
"#offset": "offset"
|
|
154
|
-
}
|
|
153
|
+
"#offset": "offset",
|
|
154
|
+
},
|
|
155
155
|
};
|
|
156
156
|
return new PutItemCommand(queryParams);
|
|
157
157
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EvDbDynamoDbStorageAdapterQueries.js","sourceRoot":"","sources":["../src/EvDbDynamoDbStorageAdapterQueries.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"EvDbDynamoDbStorageAdapterQueries.js","sourceRoot":"","sources":["../src/EvDbDynamoDbStorageAdapterQueries.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@eventualize/dynamodb-storage-adapter",
|
|
3
|
-
"version": "2.
|
|
3
|
+
"version": "2.1.0",
|
|
4
4
|
"description": "",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
7
7
|
"url": "https://github.com/outsidenote/eventualize-js",
|
|
8
|
-
"directory": "packages/dynamodb-storage-adapter"
|
|
8
|
+
"directory": "packages/adapters/dynamodb-storage-adapter"
|
|
9
9
|
},
|
|
10
10
|
"main": "dist/index.js",
|
|
11
11
|
"types": "dist/index.d.ts",
|
|
@@ -37,6 +37,7 @@
|
|
|
37
37
|
"dist"
|
|
38
38
|
],
|
|
39
39
|
"dependencies": {
|
|
40
|
+
"@eventualize/types": "^2.1.0",
|
|
40
41
|
"@aws-sdk/client-dynamodb": "^3.948.0",
|
|
41
42
|
"@aws-sdk/util-dynamodb": "^3.948.0"
|
|
42
43
|
}
|