@eventualize/dynamodb-storage-adapter 1.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 +15 -2
- package/dist/DynamoDbClient.js +10 -19
- package/dist/DynamoDbClient.js.map +1 -1
- package/dist/EvDBDynamoDBAdmin.d.ts +10 -5
- package/dist/EvDBDynamoDBAdmin.js +16 -14
- package/dist/EvDBDynamoDBAdmin.js.map +1 -1
- package/dist/EvDbDynamoDbStorageAdapter.d.ts +30 -42
- package/dist/EvDbDynamoDbStorageAdapter.js +45 -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 +17 -2
- package/models/events-table-schema.json +0 -50
- package/models/messages-table-schema.json +0 -24
- package/models/snapshots-table-schema.json +0 -24
- package/src/DynamoDbClient.ts +0 -32
- package/src/EvDBDynamoDBAdmin.ts +0 -115
- package/src/EvDbDynamoDbStorageAdapter.ts +0 -250
- package/src/EvDbDynamoDbStorageAdapterQueries.ts +0 -210
- package/src/dbModel.json +0 -215
- package/tsconfig.json +0 -21
package/dist/DynamoDbClient.d.ts
CHANGED
|
@@ -1,3 +1,16 @@
|
|
|
1
1
|
import { DynamoDBClient } from "@aws-sdk/client-dynamodb";
|
|
2
|
-
|
|
3
|
-
|
|
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
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Creates a DynamoDB client.
|
|
14
|
+
* @param options - Optional configuration. Falls back to environment variables if not provided.
|
|
15
|
+
*/
|
|
16
|
+
export declare function createDynamoDBClient(options?: DynamoDBClientOptions): DynamoDBClient;
|
package/dist/DynamoDbClient.js
CHANGED
|
@@ -1,22 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
console.error("Error listing tables:", error);
|
|
12
|
-
throw error;
|
|
13
|
-
}
|
|
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';
|
|
1
|
+
import { DynamoDBClient } from "@aws-sdk/client-dynamodb";
|
|
2
|
+
/**
|
|
3
|
+
* Creates a DynamoDB client.
|
|
4
|
+
* @param options - Optional configuration. Falls back to environment variables if not provided.
|
|
5
|
+
*/
|
|
6
|
+
export function createDynamoDBClient(options) {
|
|
7
|
+
const endpoint = options?.endpoint ?? process.env.DYNAMODB_CONNECTION;
|
|
8
|
+
const accessKeyId = options?.accessKeyId ?? process.env.AWS_ACCESS_KEY_ID;
|
|
9
|
+
const secretAccessKey = options?.secretAccessKey ?? process.env.AWS_SECRET_ACCESS_KEY;
|
|
10
|
+
const region = options?.region ?? process.env.AWS_REGION ?? "us-east-1";
|
|
20
11
|
if (!endpoint || !accessKeyId || !secretAccessKey) {
|
|
21
12
|
const envVars = { endpoint, accessKeyId, secretAccessKey };
|
|
22
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,12 +1,17 @@
|
|
|
1
|
-
import IEvDbStorageAdmin from "@eventualize/types/IEvDbStorageAdmin";
|
|
1
|
+
import type IEvDbStorageAdmin from "@eventualize/types/adapters/IEvDbStorageAdmin";
|
|
2
|
+
import type { DynamoDBClientOptions } from "./DynamoDbClient.js";
|
|
2
3
|
export default class EvDbDynamoDbAdmin implements IEvDbStorageAdmin {
|
|
3
4
|
private dynamoDbClient;
|
|
4
|
-
|
|
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
|
-
|
|
8
|
-
|
|
9
|
-
|
|
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
|
+
*/
|
|
10
15
|
private clearTableItems;
|
|
11
16
|
createEnvironmentAsync(): Promise<void>;
|
|
12
17
|
destroyEnvironmentAsync(): Promise<void>;
|
|
@@ -1,17 +1,20 @@
|
|
|
1
1
|
import { BatchWriteItemCommand, ScanCommand } from "@aws-sdk/client-dynamodb";
|
|
2
2
|
import { createDynamoDBClient } from "./DynamoDbClient.js";
|
|
3
3
|
export default class EvDbDynamoDbAdmin {
|
|
4
|
-
|
|
5
|
-
|
|
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
|
-
return items.map(item => {
|
|
13
|
+
return items.map((item) => {
|
|
11
14
|
const deleteRequest = {
|
|
12
15
|
DeleteRequest: {
|
|
13
|
-
Key: {} // Must build the Key object manually
|
|
14
|
-
}
|
|
16
|
+
Key: {}, // Must build the Key object manually
|
|
17
|
+
},
|
|
15
18
|
};
|
|
16
19
|
if (tableName === "events") {
|
|
17
20
|
deleteRequest.DeleteRequest.Key["stream_address"] = item["stream_address"];
|
|
@@ -30,9 +33,9 @@ export default class EvDbDynamoDbAdmin {
|
|
|
30
33
|
});
|
|
31
34
|
}
|
|
32
35
|
/**
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
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
|
+
*/
|
|
36
39
|
async clearTableItems(tableName) {
|
|
37
40
|
let items;
|
|
38
41
|
let exclusiveStartKey = undefined;
|
|
@@ -49,7 +52,8 @@ export default class EvDbDynamoDbAdmin {
|
|
|
49
52
|
projectionExpression = "view_address, #o";
|
|
50
53
|
expressionAttributeNames = { "#o": "offset" };
|
|
51
54
|
}
|
|
52
|
-
else {
|
|
55
|
+
else {
|
|
56
|
+
// "messages" table
|
|
53
57
|
projectionExpression = "message_address, captured_at";
|
|
54
58
|
// No offset in the projection for messages table, so no #o alias is needed
|
|
55
59
|
}
|
|
@@ -67,15 +71,13 @@ export default class EvDbDynamoDbAdmin {
|
|
|
67
71
|
const deleteRequests = this.extractKeys(tableName, items);
|
|
68
72
|
const batchWriteCommand = new BatchWriteItemCommand({
|
|
69
73
|
RequestItems: {
|
|
70
|
-
[tableName]: deleteRequests
|
|
71
|
-
}
|
|
74
|
+
[tableName]: deleteRequests,
|
|
75
|
+
},
|
|
72
76
|
});
|
|
73
77
|
await this.dynamoDbClient.send(batchWriteCommand);
|
|
74
|
-
console.log(`Deleted ${items.length} items from ${tableName}.`);
|
|
75
78
|
}
|
|
76
79
|
exclusiveStartKey = scanResult.LastEvaluatedKey;
|
|
77
80
|
} while (exclusiveStartKey);
|
|
78
|
-
console.log(`Finished item deletion for table: ${tableName}`);
|
|
79
81
|
}
|
|
80
82
|
createEnvironmentAsync() {
|
|
81
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,48 +1,36 @@
|
|
|
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 { DynamoDBClient } from '@aws-sdk/client-dynamodb';
|
|
17
|
-
export interface EvDbEventRecord extends IEvDbEventMetadata {
|
|
18
|
-
id: string;
|
|
19
|
-
payload: IEvDbPayloadData;
|
|
20
|
-
}
|
|
21
|
-
export interface EvDbSnapshotRecord {
|
|
22
|
-
id: string;
|
|
23
|
-
streamType: string;
|
|
24
|
-
streamId: string;
|
|
25
|
-
viewName: string;
|
|
26
|
-
offset: bigint;
|
|
27
|
-
state: IEvDbPayloadData;
|
|
28
|
-
}
|
|
29
|
-
export interface IEvDbOutboxTransformer {
|
|
30
|
-
transform(message: EvDbMessage): EvDbMessage;
|
|
31
|
-
}
|
|
32
|
-
export interface EvDbStorageContext {
|
|
33
|
-
schema?: string;
|
|
34
|
-
shortId: string;
|
|
35
|
-
id: string;
|
|
36
|
-
}
|
|
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";
|
|
37
16
|
/**
|
|
38
|
-
*
|
|
39
|
-
* Replaces SQL Server-specific adapter with database-agnostic Prisma implementation
|
|
17
|
+
* DynamoDB storage adapter for EvDb
|
|
40
18
|
*/
|
|
41
19
|
export default class EvDbDynamoDbStorageAdapter implements IEvDbStorageSnapshotAdapter, IEvDbStorageStreamAdapter {
|
|
42
20
|
private dynamoDbClient;
|
|
21
|
+
/**
|
|
22
|
+
* Creates a DynamoDB storage adapter.
|
|
23
|
+
* @param dynamoDbClientOrOptions - Either a DynamoDBClient instance or configuration options.
|
|
24
|
+
* If options are provided, a new client will be created. Falls back to env vars if not provided.
|
|
25
|
+
*/
|
|
43
26
|
constructor(dynamoDbClient?: DynamoDBClient);
|
|
44
|
-
|
|
45
|
-
|
|
27
|
+
/**
|
|
28
|
+
* Factory method to create adapter with configuration options.
|
|
29
|
+
* @param options - DynamoDB client configuration options.
|
|
30
|
+
*/
|
|
31
|
+
static withOptions(options: DynamoDBClientOptions): EvDbDynamoDbStorageAdapter;
|
|
32
|
+
getFromOutbox(_filter: EvDbMessageFilter, _options?: EvDbContinuousFetchOptions | null): Promise<AsyncIterable<EvDbMessage>>;
|
|
33
|
+
getFromOutboxAsync(_shard: EvDbShardName, _filter: EvDbMessageFilter, _options?: EvDbContinuousFetchOptions | null, _cancellation?: AbortSignal): AsyncIterable<EvDbMessage>;
|
|
46
34
|
getRecordsFromOutboxAsync(filter: EvDbMessageFilter, options?: EvDbContinuousFetchOptions | null, cancellation?: AbortSignal): AsyncIterable<EvDbMessage>;
|
|
47
35
|
getRecordsFromOutboxAsync(shard: EvDbShardName, filter: EvDbMessageFilter, options?: EvDbContinuousFetchOptions | null, cancellation?: AbortSignal): AsyncIterable<EvDbMessage>;
|
|
48
36
|
subscribeToMessageAsync(handler: (message: EvDbMessage) => Promise<void>, filter: EvDbMessageFilter, options?: EvDbContinuousFetchOptions | null): Promise<void>;
|
|
@@ -54,7 +42,7 @@ export default class EvDbDynamoDbStorageAdapter implements IEvDbStorageSnapshotA
|
|
|
54
42
|
/**
|
|
55
43
|
* Store outbox messages in a transaction
|
|
56
44
|
*/
|
|
57
|
-
storeOutboxMessagesAsync(
|
|
45
|
+
storeOutboxMessagesAsync(_shardName: EvDbShardName, _records: EvDbMessage[]): Promise<number>;
|
|
58
46
|
/**
|
|
59
47
|
* Get the last offset for a stream
|
|
60
48
|
*/
|
|
@@ -62,7 +50,7 @@ export default class EvDbDynamoDbStorageAdapter implements IEvDbStorageSnapshotA
|
|
|
62
50
|
/**
|
|
63
51
|
* Get events for a stream since a specific offset
|
|
64
52
|
*/
|
|
65
|
-
getEventsAsync(streamCursor: EvDbStreamCursor,
|
|
53
|
+
getEventsAsync(streamCursor: EvDbStreamCursor, _pageSize?: number): AsyncGenerator<EvDbEvent, void, undefined>;
|
|
66
54
|
/**
|
|
67
55
|
* Get snapshot for a stream view
|
|
68
56
|
*/
|
|
@@ -1,45 +1,48 @@
|
|
|
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 {
|
|
12
|
+
/**
|
|
13
|
+
* Creates a DynamoDB storage adapter.
|
|
14
|
+
* @param dynamoDbClientOrOptions - Either a DynamoDBClient instance or configuration options.
|
|
15
|
+
* If options are provided, a new client will be created. Falls back to env vars if not provided.
|
|
16
|
+
*/
|
|
20
17
|
constructor(dynamoDbClient = createDynamoDBClient()) {
|
|
21
18
|
this.dynamoDbClient = dynamoDbClient;
|
|
22
19
|
}
|
|
23
|
-
|
|
24
|
-
|
|
20
|
+
/**
|
|
21
|
+
* Factory method to create adapter with configuration options.
|
|
22
|
+
* @param options - DynamoDB client configuration options.
|
|
23
|
+
*/
|
|
24
|
+
static withOptions(options) {
|
|
25
|
+
return new EvDbDynamoDbStorageAdapter(createDynamoDBClient(options));
|
|
26
|
+
}
|
|
27
|
+
getFromOutbox(_filter, _options) {
|
|
28
|
+
throw new Error("Method not implemented.");
|
|
25
29
|
}
|
|
26
|
-
getFromOutboxAsync(
|
|
27
|
-
throw new Error(
|
|
30
|
+
getFromOutboxAsync(_shard, _filter, _options, _cancellation) {
|
|
31
|
+
throw new Error("Method not implemented.");
|
|
28
32
|
}
|
|
29
|
-
getRecordsFromOutboxAsync(
|
|
30
|
-
throw new Error(
|
|
33
|
+
getRecordsFromOutboxAsync(_shard, _filter, _options, _cancellation) {
|
|
34
|
+
throw new Error("Method not implemented.");
|
|
31
35
|
}
|
|
32
|
-
subscribeToMessageAsync(
|
|
33
|
-
throw new Error(
|
|
36
|
+
subscribeToMessageAsync(_handler, _shard, _filter, _options) {
|
|
37
|
+
throw new Error("Method not implemented.");
|
|
34
38
|
}
|
|
35
39
|
/**
|
|
36
40
|
* Store stream events in a transaction
|
|
37
41
|
*/
|
|
38
42
|
async storeStreamAsync(events, messages) {
|
|
39
43
|
try {
|
|
40
|
-
await listTables(this.dynamoDbClient);
|
|
41
44
|
const eventsToInsert = events.map((event) => EventRecord.createFromEvent(event));
|
|
42
|
-
const messagesToInsert = messages.map(message => {
|
|
45
|
+
const messagesToInsert = messages.map((message) => {
|
|
43
46
|
return {
|
|
44
47
|
id: crypto.randomUUID(),
|
|
45
48
|
stream_cursor: message.streamCursor,
|
|
@@ -57,13 +60,12 @@ export default class EvDbDynamoDbStorageAdapter {
|
|
|
57
60
|
const command = new TransactWriteItemsCommand(transactItems);
|
|
58
61
|
await this.dynamoDbClient.send(command);
|
|
59
62
|
const numEvents = eventsToInsert.length;
|
|
60
|
-
const numMessages = messagesToInsert
|
|
61
|
-
.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 }), {});
|
|
62
64
|
return new StreamStoreAffected(numEvents, new Map(Object.entries(numMessages)));
|
|
63
65
|
}
|
|
64
66
|
catch (error) {
|
|
65
67
|
if (this.isOccException(error)) {
|
|
66
|
-
throw new Error(
|
|
68
|
+
throw new Error("OPTIMISTIC_CONCURRENCY_VIOLATION");
|
|
67
69
|
}
|
|
68
70
|
throw error;
|
|
69
71
|
}
|
|
@@ -71,8 +73,8 @@ export default class EvDbDynamoDbStorageAdapter {
|
|
|
71
73
|
/**
|
|
72
74
|
* Store outbox messages in a transaction
|
|
73
75
|
*/
|
|
74
|
-
async storeOutboxMessagesAsync(
|
|
75
|
-
throw new Error(
|
|
76
|
+
async storeOutboxMessagesAsync(_shardName, _records) {
|
|
77
|
+
throw new Error("Method not implemented.");
|
|
76
78
|
}
|
|
77
79
|
/**
|
|
78
80
|
* Get the last offset for a stream
|
|
@@ -83,12 +85,12 @@ export default class EvDbDynamoDbStorageAdapter {
|
|
|
83
85
|
if (!response.Items) {
|
|
84
86
|
return -1;
|
|
85
87
|
}
|
|
86
|
-
return parseInt(response.Items[0]?.offset.N ??
|
|
88
|
+
return parseInt(response.Items[0]?.offset.N ?? "-1", 10);
|
|
87
89
|
}
|
|
88
90
|
/**
|
|
89
91
|
* Get events for a stream since a specific offset
|
|
90
92
|
*/
|
|
91
|
-
async *getEventsAsync(streamCursor,
|
|
93
|
+
async *getEventsAsync(streamCursor, _pageSize = 100) {
|
|
92
94
|
let queryCursor = undefined;
|
|
93
95
|
do {
|
|
94
96
|
const getEventsCommand = QueryProvider.getEvents(streamCursor);
|
|
@@ -108,31 +110,20 @@ export default class EvDbDynamoDbStorageAdapter {
|
|
|
108
110
|
* Get snapshot for a stream view
|
|
109
111
|
*/
|
|
110
112
|
async getSnapshotAsync(viewAddress) {
|
|
111
|
-
const
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
if (!response.Items) {
|
|
116
|
-
return EvDbStoredSnapshotResultRaw.Empty;
|
|
117
|
-
}
|
|
118
|
-
const snapshot = unmarshall(response.Items[0]);
|
|
119
|
-
return new EvDbStoredSnapshotResultRaw(snapshot.offset, new Date(Number(snapshot.stored_at)), snapshot.state);
|
|
120
|
-
}
|
|
121
|
-
catch (error) {
|
|
122
|
-
throw error;
|
|
113
|
+
const query = QueryProvider.getSnapshot(viewAddress);
|
|
114
|
+
const response = await this.dynamoDbClient.send(query);
|
|
115
|
+
if (!response.Items) {
|
|
116
|
+
return EvDbStoredSnapshotResultRaw.Empty;
|
|
123
117
|
}
|
|
118
|
+
const snapshot = unmarshall(response.Items[0]);
|
|
119
|
+
return new EvDbStoredSnapshotResultRaw(snapshot.offset, new Date(Number(snapshot.stored_at)), snapshot.state);
|
|
124
120
|
}
|
|
125
121
|
/**
|
|
126
122
|
* Save a snapshot
|
|
127
123
|
*/
|
|
128
124
|
async storeSnapshotAsync(record) {
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
await this.dynamoDbClient.send(command);
|
|
132
|
-
}
|
|
133
|
-
catch (error) {
|
|
134
|
-
throw error;
|
|
135
|
-
}
|
|
125
|
+
const command = QueryProvider.saveSnapshot(record);
|
|
126
|
+
await this.dynamoDbClient.send(command);
|
|
136
127
|
}
|
|
137
128
|
/**
|
|
138
129
|
* Check if an exception is an optimistic concurrency conflict
|
|
@@ -141,14 +132,13 @@ export default class EvDbDynamoDbStorageAdapter {
|
|
|
141
132
|
if (!(error instanceof TransactionCanceledException)) {
|
|
142
133
|
return false;
|
|
143
134
|
}
|
|
144
|
-
return !!error
|
|
145
|
-
.CancellationReasons?.some(({ Code }) => Code === 'ConditionalCheckFailed');
|
|
135
|
+
return !!error.CancellationReasons?.some(({ Code }) => Code === "ConditionalCheckFailed");
|
|
146
136
|
}
|
|
147
137
|
/**
|
|
148
138
|
* Get table name for shard
|
|
149
139
|
*/
|
|
150
|
-
getTableNameForShard(
|
|
151
|
-
throw new Error(
|
|
140
|
+
getTableNameForShard(_shardName) {
|
|
141
|
+
throw new Error("Method not implemented.");
|
|
152
142
|
}
|
|
153
143
|
/**
|
|
154
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;
|