@eventualize/types 1.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.
- package/dist/DelayStrategy.d.ts +6 -0
- package/dist/DelayStrategy.js +18 -0
- package/dist/DelayStrategy.js.map +1 -0
- package/dist/EvDbContinuousFetchOptions.d.ts +10 -0
- package/dist/EvDbContinuousFetchOptions.js +16 -0
- package/dist/EvDbContinuousFetchOptions.js.map +1 -0
- package/dist/EvDbEvent.d.ts +12 -0
- package/dist/EvDbEvent.js +11 -0
- package/dist/EvDbEvent.js.map +1 -0
- package/dist/EvDbMessage.d.ts +21 -0
- package/dist/EvDbMessage.js +27 -0
- package/dist/EvDbMessage.js.map +1 -0
- package/dist/EvDbMessageFilter.d.ts +43 -0
- package/dist/EvDbMessageFilter.js +54 -0
- package/dist/EvDbMessageFilter.js.map +1 -0
- package/dist/EvDbMessagesProducer.d.ts +4 -0
- package/dist/EvDbMessagesProducer.js +2 -0
- package/dist/EvDbMessagesProducer.js.map +1 -0
- package/dist/EvDbSnapshotCursor.d.ts +24 -0
- package/dist/EvDbSnapshotCursor.js +58 -0
- package/dist/EvDbSnapshotCursor.js.map +1 -0
- package/dist/EvDbStoredSnapshotData.d.ts +24 -0
- package/dist/EvDbStoredSnapshotData.js +65 -0
- package/dist/EvDbStoredSnapshotData.js.map +1 -0
- package/dist/EvDbStoredSnapshotResult.d.ts +11 -0
- package/dist/EvDbStoredSnapshotResult.js +18 -0
- package/dist/EvDbStoredSnapshotResult.js.map +1 -0
- package/dist/EvDbStoredSnapshotResultBase.d.ts +6 -0
- package/dist/EvDbStoredSnapshotResultBase.js +9 -0
- package/dist/EvDbStoredSnapshotResultBase.js.map +1 -0
- package/dist/EvDbStreamAddress.d.ts +7 -0
- package/dist/EvDbStreamAddress.js +11 -0
- package/dist/EvDbStreamAddress.js.map +1 -0
- package/dist/EvDbStreamCursor.d.ts +19 -0
- package/dist/EvDbStreamCursor.js +45 -0
- package/dist/EvDbStreamCursor.js.map +1 -0
- package/dist/EvDbViewAddress.d.ts +5 -0
- package/dist/EvDbViewAddress.js +22 -0
- package/dist/EvDbViewAddress.js.map +1 -0
- package/dist/IEvDbChangeStream.d.ts +58 -0
- package/dist/IEvDbChangeStream.js +2 -0
- package/dist/IEvDbChangeStream.js.map +1 -0
- package/dist/IEvDbEventMetadata.d.ts +20 -0
- package/dist/IEvDbEventMetadata.js +2 -0
- package/dist/IEvDbEventMetadata.js.map +1 -0
- package/dist/IEvDbEventPayload.d.ts +6 -0
- package/dist/IEvDbEventPayload.js +2 -0
- package/dist/IEvDbEventPayload.js.map +1 -0
- package/dist/IEvDbEventsSet.d.ts +7 -0
- package/dist/IEvDbEventsSet.js +2 -0
- package/dist/IEvDbEventsSet.js.map +1 -0
- package/dist/IEvDbStorageAdmin.d.ts +30 -0
- package/dist/IEvDbStorageAdmin.js +2 -0
- package/dist/IEvDbStorageAdmin.js.map +1 -0
- package/dist/IEvDbStorageSnapshotAdapter.d.ts +26 -0
- package/dist/IEvDbStorageSnapshotAdapter.js +2 -0
- package/dist/IEvDbStorageSnapshotAdapter.js.map +1 -0
- package/dist/IEvDbStorageStreamAdapter.d.ts +34 -0
- package/dist/IEvDbStorageStreamAdapter.js +2 -0
- package/dist/IEvDbStorageStreamAdapter.js.map +1 -0
- package/dist/IEvDbStreamStore.d.ts +16 -0
- package/dist/IEvDbStreamStore.js +2 -0
- package/dist/IEvDbStreamStore.js.map +1 -0
- package/dist/IEvDbStreamStoreData.d.ts +20 -0
- package/dist/IEvDbStreamStoreData.js +2 -0
- package/dist/IEvDbStreamStoreData.js.map +1 -0
- package/dist/IEvDbView.d.ts +15 -0
- package/dist/IEvDbView.js +2 -0
- package/dist/IEvDbView.js.map +1 -0
- package/dist/IEvDbViewAppliesSet.d.ts +6 -0
- package/dist/IEvDbViewAppliesSet.js +2 -0
- package/dist/IEvDbViewAppliesSet.js.map +1 -0
- package/dist/IEvDbViewStore.d.ts +28 -0
- package/dist/IEvDbViewStore.js +2 -0
- package/dist/IEvDbViewStore.js.map +1 -0
- package/dist/OCCException.d.ts +13 -0
- package/dist/OCCException.js +26 -0
- package/dist/OCCException.js.map +1 -0
- package/dist/StreamStoreAffected.d.ts +11 -0
- package/dist/StreamStoreAffected.js +12 -0
- package/dist/StreamStoreAffected.js.map +1 -0
- package/dist/primitiveTypes.d.ts +7 -0
- package/dist/primitiveTypes.js +2 -0
- package/dist/primitiveTypes.js.map +1 -0
- package/package.json +27 -0
- package/src/DelayStrategy.ts +23 -0
- package/src/EvDbContinuousFetchOptions.ts +22 -0
- package/src/EvDbEvent.ts +15 -0
- package/src/EvDbMessage.ts +105 -0
- package/src/EvDbMessageFilter.ts +86 -0
- package/src/EvDbMessagesProducer.ts +5 -0
- package/src/EvDbSnapshotCursor.ts +91 -0
- package/src/EvDbStoredSnapshotData.ts +106 -0
- package/src/EvDbStoredSnapshotResult.ts +44 -0
- package/src/EvDbStoredSnapshotResultBase.ts +11 -0
- package/src/EvDbStreamAddress.ts +10 -0
- package/src/EvDbStreamCursor.ts +52 -0
- package/src/EvDbViewAddress.ts +26 -0
- package/src/IEvDbChangeStream.ts +92 -0
- package/src/IEvDbEventMetadata.ts +32 -0
- package/src/IEvDbEventPayload.ts +8 -0
- package/src/IEvDbEventsSet.ts +10 -0
- package/src/IEvDbStorageAdmin.ts +35 -0
- package/src/IEvDbStorageSnapshotAdapter.ts +29 -0
- package/src/IEvDbStorageStreamAdapter.ts +43 -0
- package/src/IEvDbStreamStore.ts +22 -0
- package/src/IEvDbStreamStoreData.ts +27 -0
- package/src/IEvDbView.ts +18 -0
- package/src/IEvDbViewAppliesSet.ts +8 -0
- package/src/IEvDbViewStore.ts +38 -0
- package/src/OCCException.ts +34 -0
- package/src/StreamStoreAffected.ts +20 -0
- package/src/primitiveTypes.ts +7 -0
- package/tsconfig.json +15 -0
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import EvDbEvent from "./EvDbEvent.js";
|
|
2
|
+
import EvDbStreamCursor from "./EvDbStreamCursor.js";
|
|
3
|
+
import IEvDbEventPayload, { IEvDbPayloadData } from "./IEvDbEventPayload.js";
|
|
4
|
+
|
|
5
|
+
export default class EvDbMessage {
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
public static readonly Empty: EvDbMessage = EvDbMessage.createWithId(
|
|
9
|
+
'',
|
|
10
|
+
'',
|
|
11
|
+
'',
|
|
12
|
+
'',
|
|
13
|
+
'',
|
|
14
|
+
'',
|
|
15
|
+
new Date(0),
|
|
16
|
+
'',
|
|
17
|
+
{} as EvDbStreamCursor,
|
|
18
|
+
undefined
|
|
19
|
+
);
|
|
20
|
+
|
|
21
|
+
private constructor(
|
|
22
|
+
public readonly id: string,
|
|
23
|
+
public readonly eventType: string,
|
|
24
|
+
public readonly channel: string,
|
|
25
|
+
public readonly shardName: string,
|
|
26
|
+
public readonly messageType: string,
|
|
27
|
+
public readonly serializeType: string,
|
|
28
|
+
public readonly capturedAt: Date,
|
|
29
|
+
public readonly capturedBy: string,
|
|
30
|
+
public readonly streamCursor: EvDbStreamCursor,
|
|
31
|
+
public readonly payload: IEvDbPayloadData,
|
|
32
|
+
public readonly storedAt?: Date
|
|
33
|
+
) { }
|
|
34
|
+
|
|
35
|
+
public static createWithId(
|
|
36
|
+
id: string,
|
|
37
|
+
eventType: string,
|
|
38
|
+
channel: string,
|
|
39
|
+
shardName: string,
|
|
40
|
+
messageType: string,
|
|
41
|
+
serializeType: string,
|
|
42
|
+
capturedAt: Date,
|
|
43
|
+
capturedBy: string,
|
|
44
|
+
streamCursor: EvDbStreamCursor,
|
|
45
|
+
payload: any
|
|
46
|
+
): EvDbMessage {
|
|
47
|
+
return new EvDbMessage(
|
|
48
|
+
id,
|
|
49
|
+
eventType,
|
|
50
|
+
channel,
|
|
51
|
+
shardName,
|
|
52
|
+
messageType,
|
|
53
|
+
serializeType,
|
|
54
|
+
capturedAt,
|
|
55
|
+
capturedBy,
|
|
56
|
+
streamCursor,
|
|
57
|
+
payload
|
|
58
|
+
);
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
public static create(
|
|
62
|
+
eventType: string,
|
|
63
|
+
channel: string,
|
|
64
|
+
shardName: string,
|
|
65
|
+
messageType: string,
|
|
66
|
+
serializeType: string,
|
|
67
|
+
capturedAt: Date,
|
|
68
|
+
capturedBy: string,
|
|
69
|
+
streamCursor: EvDbStreamCursor,
|
|
70
|
+
payload: any
|
|
71
|
+
): EvDbMessage {
|
|
72
|
+
return new EvDbMessage(
|
|
73
|
+
crypto.randomUUID(),
|
|
74
|
+
eventType,
|
|
75
|
+
channel,
|
|
76
|
+
shardName,
|
|
77
|
+
messageType,
|
|
78
|
+
serializeType,
|
|
79
|
+
capturedAt,
|
|
80
|
+
capturedBy,
|
|
81
|
+
streamCursor,
|
|
82
|
+
payload
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
public static createFromEvent(
|
|
87
|
+
event: EvDbEvent,
|
|
88
|
+
payload: IEvDbEventPayload,
|
|
89
|
+
channel: string = 'default',
|
|
90
|
+
serializeType: string = 'json'
|
|
91
|
+
): EvDbMessage {
|
|
92
|
+
return new EvDbMessage(
|
|
93
|
+
crypto.randomUUID(),
|
|
94
|
+
event.eventType,
|
|
95
|
+
channel,
|
|
96
|
+
'default',
|
|
97
|
+
payload.payloadType,
|
|
98
|
+
serializeType,
|
|
99
|
+
event.capturedAt,
|
|
100
|
+
event.capturedBy,
|
|
101
|
+
event.streamCursor,
|
|
102
|
+
payload
|
|
103
|
+
);
|
|
104
|
+
}
|
|
105
|
+
}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
import { EvDbChannelName, EvDbMessageTypeName } from "../../types/src/primitiveTypes.js";
|
|
2
|
+
|
|
3
|
+
export default class EvDbMessageFilter {
|
|
4
|
+
public readonly since: Date;
|
|
5
|
+
public readonly channels: ReadonlyArray<EvDbChannelName>;
|
|
6
|
+
public readonly messageTypes: ReadonlyArray<EvDbMessageTypeName>;
|
|
7
|
+
|
|
8
|
+
constructor(
|
|
9
|
+
since: Date = new Date(0),
|
|
10
|
+
channels: ReadonlyArray<EvDbChannelName> = [],
|
|
11
|
+
messageTypes: ReadonlyArray<EvDbMessageTypeName> = []
|
|
12
|
+
) {
|
|
13
|
+
this.since = since;
|
|
14
|
+
this.channels = channels;
|
|
15
|
+
this.messageTypes = messageTypes;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Creates a filter with the specified since date
|
|
20
|
+
*/
|
|
21
|
+
public static create(since: Date): EvDbMessageFilter {
|
|
22
|
+
return new EvDbMessageFilter(since);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Creates a filter from a Date
|
|
27
|
+
*/
|
|
28
|
+
public static fromDate(date: Date): EvDbMessageFilter {
|
|
29
|
+
return new EvDbMessageFilter(date);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* Creates a filter from a channel name
|
|
34
|
+
*/
|
|
35
|
+
public static fromChannel(channel: EvDbChannelName): EvDbMessageFilter {
|
|
36
|
+
return new EvDbMessageFilter(new Date(0), [channel]);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Creates a filter from a message type name
|
|
41
|
+
*/
|
|
42
|
+
public static fromMessageType(messageType: EvDbMessageTypeName): EvDbMessageFilter {
|
|
43
|
+
return new EvDbMessageFilter(new Date(0), [], [messageType]);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Adds a channel to the filter
|
|
48
|
+
* Restrict the messages to those that match the specified channels.
|
|
49
|
+
* Ignore this property if you want to get all messages.
|
|
50
|
+
*/
|
|
51
|
+
public addChannel(channel: EvDbChannelName): EvDbMessageFilter {
|
|
52
|
+
return new EvDbMessageFilter(
|
|
53
|
+
this.since,
|
|
54
|
+
[...this.channels, channel],
|
|
55
|
+
this.messageTypes
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Adds a message type to the filter
|
|
61
|
+
* Restrict the messages to those that match the specified message-types.
|
|
62
|
+
* Ignore this property if you want to get all messages.
|
|
63
|
+
*/
|
|
64
|
+
public addMessageType(messageType: EvDbMessageTypeName): EvDbMessageFilter {
|
|
65
|
+
return new EvDbMessageFilter(
|
|
66
|
+
this.since,
|
|
67
|
+
this.channels,
|
|
68
|
+
[...this.messageTypes, messageType]
|
|
69
|
+
);
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Creates a new filter with updated properties (similar to C# 'with' expression)
|
|
74
|
+
*/
|
|
75
|
+
public with(updates: {
|
|
76
|
+
since?: Date;
|
|
77
|
+
channels?: ReadonlyArray<EvDbChannelName>;
|
|
78
|
+
messageTypes?: ReadonlyArray<EvDbMessageTypeName>;
|
|
79
|
+
}): EvDbMessageFilter {
|
|
80
|
+
return new EvDbMessageFilter(
|
|
81
|
+
updates.since ?? this.since,
|
|
82
|
+
updates.channels ?? this.channels,
|
|
83
|
+
updates.messageTypes ?? this.messageTypes
|
|
84
|
+
);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import EvDbStreamAddress from "./EvDbStreamAddress.js";
|
|
2
|
+
import EvDbViewAddress from "@eventualize/types/EvDbViewAddress";
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
export default class EvDbSnapshotCursor {
|
|
6
|
+
readonly streamType: string;
|
|
7
|
+
readonly streamId: string;
|
|
8
|
+
readonly viewName: string;
|
|
9
|
+
readonly offset: number;
|
|
10
|
+
|
|
11
|
+
constructor(
|
|
12
|
+
streamType: string,
|
|
13
|
+
streamId: string,
|
|
14
|
+
viewName: string,
|
|
15
|
+
offset: number = 0
|
|
16
|
+
) {
|
|
17
|
+
this.streamType = streamType;
|
|
18
|
+
this.streamId = streamId;
|
|
19
|
+
this.viewName = viewName;
|
|
20
|
+
this.offset = offset;
|
|
21
|
+
|
|
22
|
+
Object.freeze(this); // mimic C# record struct immutability
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
// Equivalent to: public static readonly EvDbSnapshotCursor Empty
|
|
26
|
+
static readonly Empty = new EvDbSnapshotCursor("N/A", "N/A", "N/A", 0);
|
|
27
|
+
|
|
28
|
+
// Alternative constructor: (EvDbStreamAddress, viewName, offset)
|
|
29
|
+
static fromStreamAddress(
|
|
30
|
+
address: EvDbStreamAddress,
|
|
31
|
+
viewName: string,
|
|
32
|
+
offset: number = 0
|
|
33
|
+
): EvDbSnapshotCursor {
|
|
34
|
+
return new EvDbSnapshotCursor(address.streamType, address.streamId, viewName, offset);
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// --------------------------
|
|
38
|
+
// Equality helpers
|
|
39
|
+
// --------------------------
|
|
40
|
+
|
|
41
|
+
private equalsViewAddress(address: EvDbViewAddress): boolean {
|
|
42
|
+
return (
|
|
43
|
+
this.streamType === address.streamType &&
|
|
44
|
+
this.streamId === address.streamId &&
|
|
45
|
+
this.viewName === address.viewName
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
private equalsStreamAddress(address: EvDbStreamAddress): boolean {
|
|
50
|
+
return (
|
|
51
|
+
this.streamType === address.streamType &&
|
|
52
|
+
this.streamId === address.streamId
|
|
53
|
+
);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
// C# operator == equivalents
|
|
57
|
+
equalsAddress(address: any): boolean {
|
|
58
|
+
if ("viewName" in address) return this.equalsViewAddress(address);
|
|
59
|
+
return this.equalsStreamAddress(address);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// --------------------------
|
|
63
|
+
// "Implicit cast" equivalents
|
|
64
|
+
// --------------------------
|
|
65
|
+
|
|
66
|
+
toStreamAddress(): { streamType: string; streamId: string } {
|
|
67
|
+
return new EvDbStreamAddress(this.streamType, this.streamId);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
toViewAddress(): { streamType: string; streamId: string; viewName: string } {
|
|
71
|
+
return new EvDbViewAddress(
|
|
72
|
+
new EvDbStreamAddress(this.streamType, this.streamId),
|
|
73
|
+
this.viewName
|
|
74
|
+
);
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// --------------------------
|
|
78
|
+
// toString & filter string
|
|
79
|
+
// --------------------------
|
|
80
|
+
|
|
81
|
+
toString(): string {
|
|
82
|
+
// Format: Type:Id:View:000_000_000_000
|
|
83
|
+
const formattedOffset = this.offset.toString().padStart(12, "0");
|
|
84
|
+
return `${this.streamType}:${this.streamId}:${this.viewName}:${formattedOffset}`;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
toFilterString(): string {
|
|
88
|
+
// Format without offset: Type:Id:View:
|
|
89
|
+
return `${this.streamType}:${this.streamId}:${this.viewName}:`;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
@@ -0,0 +1,106 @@
|
|
|
1
|
+
import EvDbStreamAddress from "./EvDbStreamAddress.js";
|
|
2
|
+
import { EvDbStoredSnapshotResultRaw } from "./EvDbStoredSnapshotResult";
|
|
3
|
+
import EvDbViewAddress from "./EvDbViewAddress";
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
// Base class equivalent
|
|
8
|
+
export abstract class EvDbStoredSnapshotDataBase {
|
|
9
|
+
constructor(
|
|
10
|
+
public readonly id: string,
|
|
11
|
+
public readonly streamType: string,
|
|
12
|
+
public readonly streamId: string,
|
|
13
|
+
public readonly viewName: string,
|
|
14
|
+
public readonly offset: number,
|
|
15
|
+
public readonly storeOffset: number,
|
|
16
|
+
public readonly storedAt: Date = new Date()
|
|
17
|
+
) { }
|
|
18
|
+
|
|
19
|
+
toStreamAddress(): EvDbStreamAddress {
|
|
20
|
+
return new EvDbStreamAddress(this.streamType, this.streamId);
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
export class EvDbStoredSnapshotData extends EvDbStoredSnapshotDataBase {
|
|
25
|
+
readonly state: any;
|
|
26
|
+
|
|
27
|
+
// Primary constructor equivalent
|
|
28
|
+
constructor(
|
|
29
|
+
id: string,
|
|
30
|
+
streamType: string,
|
|
31
|
+
streamId: string,
|
|
32
|
+
viewName: string,
|
|
33
|
+
offset: number,
|
|
34
|
+
storeOffset: number,
|
|
35
|
+
state: any
|
|
36
|
+
) {
|
|
37
|
+
super(id, streamType, streamId, viewName, offset, storeOffset);
|
|
38
|
+
this.state = state;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
// Secondary constructor (overload)
|
|
42
|
+
static fromAddress(
|
|
43
|
+
address: EvDbViewAddress,
|
|
44
|
+
offset: number,
|
|
45
|
+
storeOffset: number,
|
|
46
|
+
state: any
|
|
47
|
+
): EvDbStoredSnapshotData {
|
|
48
|
+
return new EvDbStoredSnapshotData(
|
|
49
|
+
crypto.randomUUID(),
|
|
50
|
+
address.streamType,
|
|
51
|
+
address.streamId,
|
|
52
|
+
address.viewName,
|
|
53
|
+
offset,
|
|
54
|
+
storeOffset,
|
|
55
|
+
state
|
|
56
|
+
);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
// ------------------------------------------------------------------------------------
|
|
60
|
+
// Equality helpers (TypeScript cannot overload ==, so explicit methods are used)
|
|
61
|
+
// ------------------------------------------------------------------------------------
|
|
62
|
+
|
|
63
|
+
private isEquals(obj: EvDbStoredSnapshotResultRaw): boolean {
|
|
64
|
+
if (this.offset !== obj.offset) return false;
|
|
65
|
+
|
|
66
|
+
// Compare any references (same as C# byte[] reference equality)
|
|
67
|
+
if (this.state !== obj.state) return false;
|
|
68
|
+
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
equalsSnapshotResult(result: EvDbStoredSnapshotResultRaw): boolean {
|
|
73
|
+
return this.isEquals(result);
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// TODO: is this needed?
|
|
77
|
+
// equalsSnapshotCursor(cursor: EvDbSnapshotCursor): boolean {
|
|
78
|
+
// return this.isEquals(cursor);
|
|
79
|
+
// }
|
|
80
|
+
|
|
81
|
+
equalsStreamAddress(address: EvDbStreamAddress): boolean {
|
|
82
|
+
return (
|
|
83
|
+
this.streamType === address.streamType &&
|
|
84
|
+
this.streamId === address.streamId
|
|
85
|
+
);
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
equalsViewAddress(address: EvDbViewAddress): boolean {
|
|
89
|
+
return (
|
|
90
|
+
this.streamType === address.streamType &&
|
|
91
|
+
this.streamId === address.streamId &&
|
|
92
|
+
this.viewName === address.viewName
|
|
93
|
+
);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
// ------------------------------------------------------------------------------------
|
|
97
|
+
// Casting Overload (implicit operator in C# → explicit method in TS)
|
|
98
|
+
// ------------------------------------------------------------------------------------
|
|
99
|
+
toSnapshotResult(): EvDbStoredSnapshotResultRaw {
|
|
100
|
+
return {
|
|
101
|
+
offset: this.offset,
|
|
102
|
+
storedAt: this.storedAt,
|
|
103
|
+
state: this.state
|
|
104
|
+
};
|
|
105
|
+
}
|
|
106
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import EvDbStoredSnapshotResultBase from "./EvDbStoredSnapshotResultBase.js"
|
|
2
|
+
|
|
3
|
+
export class EvDbStoredSnapshotResultRaw extends EvDbStoredSnapshotResultBase {
|
|
4
|
+
public readonly state: any;
|
|
5
|
+
|
|
6
|
+
constructor(
|
|
7
|
+
offset: number,
|
|
8
|
+
storedAt: Date | undefined,
|
|
9
|
+
state: any
|
|
10
|
+
) {
|
|
11
|
+
super(offset, storedAt);
|
|
12
|
+
this.state = state;
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
static readonly Empty = new EvDbStoredSnapshotResultRaw(
|
|
16
|
+
0,
|
|
17
|
+
undefined,
|
|
18
|
+
undefined
|
|
19
|
+
);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
export class EvDbStoredSnapshotResult<TState>
|
|
24
|
+
extends EvDbStoredSnapshotResultBase
|
|
25
|
+
{
|
|
26
|
+
public readonly state: TState;
|
|
27
|
+
|
|
28
|
+
constructor(
|
|
29
|
+
offset: number,
|
|
30
|
+
storedAt: Date | undefined,
|
|
31
|
+
state: TState
|
|
32
|
+
) {
|
|
33
|
+
super(offset, storedAt);
|
|
34
|
+
this.state = state;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
static getEmptyState<TState>(): EvDbStoredSnapshotResult<TState> {
|
|
38
|
+
return new EvDbStoredSnapshotResult<TState>(
|
|
39
|
+
0,
|
|
40
|
+
undefined,
|
|
41
|
+
undefined as unknown as TState
|
|
42
|
+
);
|
|
43
|
+
}
|
|
44
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export default class EvDbStoredSnapshotResultBase {
|
|
2
|
+
public readonly offset: number;
|
|
3
|
+
public readonly storedAt: Date | undefined;
|
|
4
|
+
|
|
5
|
+
protected constructor(offset: number, storedAt: Date | undefined) {
|
|
6
|
+
this.offset = offset;
|
|
7
|
+
this.storedAt = storedAt;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
static readonly None = new EvDbStoredSnapshotResultBase(0, undefined);
|
|
11
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import EvDbStreamCursor from "./EvDbStreamCursor.js";
|
|
2
|
+
|
|
3
|
+
export default class EvDbStreamAddress {
|
|
4
|
+
constructor(public readonly streamType: string, public readonly streamId: string) { }
|
|
5
|
+
|
|
6
|
+
equals(other: EvDbStreamCursor): boolean {
|
|
7
|
+
return this.streamType === other.streamType &&
|
|
8
|
+
this.streamId === other.streamId;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import EvDbStreamAddress from "./EvDbStreamAddress.js";
|
|
2
|
+
|
|
3
|
+
export default class EvDbStreamCursor extends EvDbStreamAddress {
|
|
4
|
+
public readonly offset: number;
|
|
5
|
+
|
|
6
|
+
constructor(streamType: string, streamId: string, offset: number);
|
|
7
|
+
constructor(streamAddress: EvDbStreamAddress, offset: number);
|
|
8
|
+
|
|
9
|
+
constructor(streamTypeOrAddress: string | EvDbStreamAddress, streamIdOrOffset: string | number, offset?: number) {
|
|
10
|
+
if (typeof streamTypeOrAddress === 'string' && typeof streamIdOrOffset === 'string' && (!offset || typeof offset === 'number')) {
|
|
11
|
+
const streamType = streamTypeOrAddress;
|
|
12
|
+
const streamId = streamIdOrOffset;
|
|
13
|
+
super(streamType, streamId);
|
|
14
|
+
this.offset = offset ?? 0;
|
|
15
|
+
} else if (streamTypeOrAddress instanceof EvDbStreamAddress && (!streamIdOrOffset || typeof streamIdOrOffset === 'number')) {
|
|
16
|
+
const streamType = streamTypeOrAddress.streamType;
|
|
17
|
+
const streamId = streamTypeOrAddress.streamId;
|
|
18
|
+
super(streamType, streamId);
|
|
19
|
+
this.offset = streamIdOrOffset as number ?? 0;
|
|
20
|
+
} else {
|
|
21
|
+
throw new Error('Invalid constructor arguments for EvDbStreamCursor');
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Checks if cursor matches the given stream type
|
|
27
|
+
*/
|
|
28
|
+
equals(other: EvDbStreamCursor): boolean {
|
|
29
|
+
return this.streamType === other.streamType &&
|
|
30
|
+
this.streamId === other.streamId &&
|
|
31
|
+
this.offset === other.offset;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
public isEqualsStreamType(streamType: string): boolean {
|
|
35
|
+
return this.streamType === streamType;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/**
|
|
39
|
+
* Checks if cursor matches the given stream address
|
|
40
|
+
*/
|
|
41
|
+
public isEqualsAddress(address: EvDbStreamAddress): boolean {
|
|
42
|
+
return this.streamType === address.streamType &&
|
|
43
|
+
this.streamId === address.streamId;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/**
|
|
47
|
+
* Converts cursor to stream address
|
|
48
|
+
*/
|
|
49
|
+
public toStreamAddress(): EvDbStreamAddress {
|
|
50
|
+
return new EvDbStreamAddress(this.streamType, this.streamId);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import EvDbStreamAddress from "@eventualize/types/EvDbStreamAddress";
|
|
2
|
+
|
|
3
|
+
export default class EvDbViewAddress extends EvDbStreamAddress {
|
|
4
|
+
public readonly viewName: string;
|
|
5
|
+
constructor(streamAddressOrType: EvDbStreamAddress | string, viewNameOrStreamId: string, viewName?: string) {
|
|
6
|
+
if (streamAddressOrType instanceof EvDbStreamAddress &&
|
|
7
|
+
typeof viewNameOrStreamId === "string" &&
|
|
8
|
+
!viewName
|
|
9
|
+
) {
|
|
10
|
+
const streamAddress = streamAddressOrType as EvDbStreamAddress;
|
|
11
|
+
super(streamAddress.streamType, streamAddress.streamId);
|
|
12
|
+
this.viewName = viewNameOrStreamId;
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
if (typeof streamAddressOrType === 'string' &&
|
|
16
|
+
typeof viewNameOrStreamId === 'string' &&
|
|
17
|
+
typeof viewName === 'string'
|
|
18
|
+
) {
|
|
19
|
+
super(streamAddressOrType, viewNameOrStreamId);
|
|
20
|
+
this.viewName = viewName;
|
|
21
|
+
return;
|
|
22
|
+
}
|
|
23
|
+
throw new Error('Unsupported set or arguments')
|
|
24
|
+
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
import { EvDbShardName } from "./primitiveTypes.js";
|
|
2
|
+
import EvDbMessageFilter from "./EvDbMessageFilter.js";
|
|
3
|
+
import EvDbContinuousFetchOptions from "./EvDbContinuousFetchOptions.js";
|
|
4
|
+
import EvDbMessage from "./EvDbMessage.js";
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
export default interface IEvDbChangeStream {
|
|
9
|
+
/**
|
|
10
|
+
* Gets stream of stored messages.
|
|
11
|
+
* @param filter - filtering options use `EvDbMessageFilter.Builder` for the filter creation.
|
|
12
|
+
* @param options - Options for the continuous fetch.
|
|
13
|
+
* @returns Stream of messages
|
|
14
|
+
*/
|
|
15
|
+
getFromOutbox(
|
|
16
|
+
filter: EvDbMessageFilter,
|
|
17
|
+
options?: EvDbContinuousFetchOptions | null,
|
|
18
|
+
): Promise<AsyncIterable<EvDbMessage>>;
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Gets stream of stored messages.
|
|
22
|
+
* @param shard - The shard (table/collection) of the messages
|
|
23
|
+
* @param filter - filtering options use `EvDbMessageFilter.Builder` for the filter creation.
|
|
24
|
+
* @param options - Options for the continuous fetch.
|
|
25
|
+
* @param cancellation - The cancellation.
|
|
26
|
+
* @returns Stream of messages
|
|
27
|
+
*/
|
|
28
|
+
getFromOutboxAsync(
|
|
29
|
+
shard: EvDbShardName,
|
|
30
|
+
filter: EvDbMessageFilter,
|
|
31
|
+
options?: EvDbContinuousFetchOptions | null,
|
|
32
|
+
cancellation?: AbortSignal
|
|
33
|
+
): AsyncIterable<EvDbMessage>;
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Gets stored messages.
|
|
37
|
+
* @param filter - filtering options use `EvDbMessageFilter.Builder` for the filter creation.
|
|
38
|
+
* @param options - Options for the continuous fetch.
|
|
39
|
+
* @param cancellation - The cancellation.
|
|
40
|
+
* @returns Stream of messages
|
|
41
|
+
*/
|
|
42
|
+
getRecordsFromOutboxAsync(
|
|
43
|
+
filter: EvDbMessageFilter,
|
|
44
|
+
options?: EvDbContinuousFetchOptions | null,
|
|
45
|
+
cancellation?: AbortSignal
|
|
46
|
+
): AsyncIterable<EvDbMessage>;
|
|
47
|
+
|
|
48
|
+
/**
|
|
49
|
+
* Gets stream of stored messages.
|
|
50
|
+
* @param shard - The shard (table/collection) of the messages
|
|
51
|
+
* @param filter - filtering options use `EvDbMessageFilter.Builder` for the filter creation.
|
|
52
|
+
* @param options - Options for the continuous fetch.
|
|
53
|
+
* @param cancellation - The cancellation.
|
|
54
|
+
* @returns Stream of messages
|
|
55
|
+
*/
|
|
56
|
+
getRecordsFromOutboxAsync(
|
|
57
|
+
shard: EvDbShardName,
|
|
58
|
+
filter: EvDbMessageFilter,
|
|
59
|
+
options?: EvDbContinuousFetchOptions | null,
|
|
60
|
+
cancellation?: AbortSignal
|
|
61
|
+
): AsyncIterable<EvDbMessage>;
|
|
62
|
+
|
|
63
|
+
/**
|
|
64
|
+
* Subscribe to a stream of stored messages into via Dataflow Block.
|
|
65
|
+
* You can control the concurrency and back pressure of the Dataflow Block to control how many messages will be processed in parallel and BoundedCapacity.
|
|
66
|
+
* Complete the Dataflow Block when the stream is completed or cancelled.
|
|
67
|
+
* @param handler - The subscription handler
|
|
68
|
+
* @param filter - filtering options use `EvDbMessageFilter.Builder` for the filter creation.
|
|
69
|
+
* @param options - Options for the continuous fetch.
|
|
70
|
+
*/
|
|
71
|
+
subscribeToMessageAsync(
|
|
72
|
+
handler: (message: EvDbMessage) => Promise<void>,
|
|
73
|
+
filter: EvDbMessageFilter,
|
|
74
|
+
options?: EvDbContinuousFetchOptions | null,
|
|
75
|
+
): Promise<void>;
|
|
76
|
+
|
|
77
|
+
/**
|
|
78
|
+
* Subscribe to a stream of stored messages into via Dataflow Block.
|
|
79
|
+
* You can control the concurrency and back pressure of the Dataflow Block to control how many messages will be processed in parallel and BoundedCapacity.
|
|
80
|
+
* Complete the Dataflow Block when the stream is completed or cancelled.
|
|
81
|
+
* @param handler - The subscription handler
|
|
82
|
+
* @param shard - The shard (table/collection) of the messages
|
|
83
|
+
* @param filter - filtering options use `EvDbMessageFilter.Builder` for the filter creation.
|
|
84
|
+
* @param options - Options for the continuous fetch.
|
|
85
|
+
*/
|
|
86
|
+
subscribeToMessageAsync(
|
|
87
|
+
handler: (message: EvDbMessage) => Promise<void>,
|
|
88
|
+
shard: EvDbShardName,
|
|
89
|
+
filter: EvDbMessageFilter,
|
|
90
|
+
options?: EvDbContinuousFetchOptions | null,
|
|
91
|
+
): Promise<void>;
|
|
92
|
+
}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
import EvDbStreamCursor from "./EvDbStreamCursor.js";
|
|
2
|
+
|
|
3
|
+
export default interface IEvDbEventMetadata {
|
|
4
|
+
/**
|
|
5
|
+
* The full address of the stream including the offset
|
|
6
|
+
*/
|
|
7
|
+
readonly streamCursor: EvDbStreamCursor;
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* The type of the event
|
|
11
|
+
*/
|
|
12
|
+
readonly eventType: string;
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* The time of capturing the event (client side time)
|
|
16
|
+
*/
|
|
17
|
+
readonly capturedAt: Date;
|
|
18
|
+
|
|
19
|
+
readonly storedAt?: Date | null;
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* The user that captured the event
|
|
23
|
+
*/
|
|
24
|
+
readonly capturedBy: string;
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Json format of the Trace (Open Telemetry) propagated context at the persistent time.
|
|
28
|
+
* The value will be null if the Trace is null when persisting the record or before persistent.
|
|
29
|
+
*/
|
|
30
|
+
// TODO: implement telemetry context
|
|
31
|
+
// readonly telemetryContext: EvDbTelemetryContextName;
|
|
32
|
+
}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import IEvDbEventPayload from "./IEvDbEventPayload.js";
|
|
2
|
+
import IEvDbEventMetadata from "./IEvDbEventMetadata.js";
|
|
3
|
+
|
|
4
|
+
type EvDbStreamEventHandler = (event: IEvDbEventPayload, capturedBy?: string) => Promise<IEvDbEventMetadata>
|
|
5
|
+
|
|
6
|
+
type EvDbStreamEventHandlersMap<TEvents extends IEvDbEventPayload> = Partial<{
|
|
7
|
+
[E in TEvents as `apply${E['payloadType']}`]: EvDbStreamEventHandler;
|
|
8
|
+
}>;
|
|
9
|
+
|
|
10
|
+
export default EvDbStreamEventHandlersMap;
|