@eventualize/core 2.0.0 → 3.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/EvDbStream.test.js +10 -16
- package/dist/EvDbStream.test.js.map +1 -1
- package/dist/adapters/IEvDbStorageAdapter.d.ts +7 -0
- package/dist/adapters/IEvDbStorageAdapter.js +2 -0
- package/dist/adapters/IEvDbStorageAdapter.js.map +1 -0
- package/dist/codegen/generateStreamFactory.d.ts +18 -0
- package/dist/codegen/generateStreamFactory.js +97 -0
- package/dist/codegen/generateStreamFactory.js.map +1 -0
- package/dist/factories/EvDbStreamFactory.d.ts +51 -0
- package/dist/factories/EvDbStreamFactory.js +103 -0
- package/dist/factories/EvDbStreamFactory.js.map +1 -0
- package/dist/factories/EvDbStreamFactoryTypes.d.ts +20 -0
- package/dist/factories/EvDbStreamFactoryTypes.js +2 -0
- package/dist/factories/EvDbStreamFactoryTypes.js.map +1 -0
- package/dist/factories/EvDbViewFactory.d.ts +24 -0
- package/dist/{EvDbViewFactory.js → factories/EvDbViewFactory.js} +4 -4
- package/dist/factories/EvDbViewFactory.js.map +1 -0
- package/dist/factories/EvDbViewFactoryTypes.d.ts +24 -0
- package/dist/factories/EvDbViewFactoryTypes.js +2 -0
- package/dist/factories/EvDbViewFactoryTypes.js.map +1 -0
- package/dist/factories/IEvDbStreamFactory.d.ts +13 -0
- package/dist/factories/IEvDbStreamFactory.js +2 -0
- package/dist/factories/IEvDbStreamFactory.js.map +1 -0
- package/dist/factories/StreamFactoryBuilder.d.ts +35 -0
- package/dist/factories/StreamFactoryBuilder.js +67 -0
- package/dist/factories/StreamFactoryBuilder.js.map +1 -0
- package/dist/store/EvDbStream.d.ts +150 -0
- package/dist/store/EvDbStream.js +192 -0
- package/dist/store/EvDbStream.js.map +1 -0
- package/dist/stream/IEvDbStream.d.ts +0 -0
- package/dist/stream/IEvDbStream.js +2 -0
- package/dist/stream/IEvDbStream.js.map +1 -0
- package/dist/view/EvDbView.d.ts +19 -0
- package/dist/view/EvDbView.js +26 -0
- package/dist/view/EvDbView.js.map +1 -0
- package/dist/view/EvDbViewRaw.d.ts +22 -0
- package/dist/view/EvDbViewRaw.js +41 -0
- package/dist/view/EvDbViewRaw.js.map +1 -0
- package/package.json +2 -2
- package/dist/EvDbEventStore.d.ts +0 -123
- package/dist/EvDbEventStore.js +0 -182
- package/dist/EvDbEventStore.js.map +0 -1
- package/dist/EvDbStream.d.ts +0 -49
- package/dist/EvDbStream.js +0 -115
- package/dist/EvDbStream.js.map +0 -1
- package/dist/EvDbStreamFactory.d.ts +0 -97
- package/dist/EvDbStreamFactory.js +0 -155
- package/dist/EvDbStreamFactory.js.map +0 -1
- package/dist/EvDbView.d.ts +0 -34
- package/dist/EvDbView.js +0 -64
- package/dist/EvDbView.js.map +0 -1
- package/dist/EvDbViewFactory.d.ts +0 -45
- package/dist/EvDbViewFactory.js.map +0 -1
package/dist/EvDbEventStore.js
DELETED
|
@@ -1,182 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Store class - manages stream creation with configured adapters and factories
|
|
3
|
-
*/
|
|
4
|
-
class BaseStore {
|
|
5
|
-
constructor(storage, streamFactories) {
|
|
6
|
-
this.streamFactories = {};
|
|
7
|
-
this.storage = storage;
|
|
8
|
-
this.streamFactories = streamFactories;
|
|
9
|
-
}
|
|
10
|
-
/**
|
|
11
|
-
* Create a stream instance by stream type and ID
|
|
12
|
-
*/
|
|
13
|
-
createStream(streamType, streamId) {
|
|
14
|
-
const factory = this.streamFactories[streamType];
|
|
15
|
-
if (!factory) {
|
|
16
|
-
throw new Error(`No stream factory registered for stream type: ${streamType}. ` +
|
|
17
|
-
`Available types: ${Object.keys(this.streamFactories).join(', ')}`);
|
|
18
|
-
}
|
|
19
|
-
const stream = factory.create(streamId, this.storage.streamAdapter, this.storage.snapshotAdapter);
|
|
20
|
-
return stream;
|
|
21
|
-
}
|
|
22
|
-
/**
|
|
23
|
-
* Get a stream instance from the event store by stream type and ID
|
|
24
|
-
*/
|
|
25
|
-
async getStream(streamType, streamId) {
|
|
26
|
-
const factory = this.streamFactories[streamType];
|
|
27
|
-
if (!factory) {
|
|
28
|
-
throw new Error(`No stream factory registered for stream type: ${streamType}. ` +
|
|
29
|
-
`Available types: ${Object.keys(this.streamFactories).join(', ')}`);
|
|
30
|
-
}
|
|
31
|
-
return factory.get(streamId, this.storage.streamAdapter, this.storage.snapshotAdapter);
|
|
32
|
-
}
|
|
33
|
-
/**
|
|
34
|
-
* Check if a stream type is registered
|
|
35
|
-
*/
|
|
36
|
-
hasStreamType(streamType) {
|
|
37
|
-
return streamType in this.streamFactories;
|
|
38
|
-
}
|
|
39
|
-
/**
|
|
40
|
-
* Get all registered stream types
|
|
41
|
-
*/
|
|
42
|
-
getStreamTypes() {
|
|
43
|
-
return Object.keys(this.streamFactories);
|
|
44
|
-
}
|
|
45
|
-
/**
|
|
46
|
-
* Create a builder for configuring the store
|
|
47
|
-
*/
|
|
48
|
-
static builder() {
|
|
49
|
-
return new BaseStoreBuilder();
|
|
50
|
-
}
|
|
51
|
-
async close() {
|
|
52
|
-
await Promise.all([this.storage.snapshotAdapter.close(), this.storage.streamAdapter.close()]);
|
|
53
|
-
return;
|
|
54
|
-
}
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* Builder for creating Store instances
|
|
58
|
-
*/
|
|
59
|
-
class BaseStoreBuilder {
|
|
60
|
-
constructor() {
|
|
61
|
-
this.streamFactories = {};
|
|
62
|
-
}
|
|
63
|
-
/**
|
|
64
|
-
* Configure with separate stream and snapshot adapters
|
|
65
|
-
*/
|
|
66
|
-
withAdapters(streamAdapter, snapshotAdapter) {
|
|
67
|
-
this.streamAdapter = streamAdapter;
|
|
68
|
-
this.snapshotAdapter = snapshotAdapter;
|
|
69
|
-
return this;
|
|
70
|
-
}
|
|
71
|
-
/**
|
|
72
|
-
* Configure with a combined adapter that implements both interfaces
|
|
73
|
-
*/
|
|
74
|
-
withAdapter(adapter) {
|
|
75
|
-
this.streamAdapter = adapter;
|
|
76
|
-
this.snapshotAdapter = adapter;
|
|
77
|
-
return this;
|
|
78
|
-
}
|
|
79
|
-
/**
|
|
80
|
-
* Register a stream factory
|
|
81
|
-
*/
|
|
82
|
-
withStreamFactory(factory) {
|
|
83
|
-
const streamType = factory.getStreamType();
|
|
84
|
-
if (this.streamFactories[streamType]) {
|
|
85
|
-
throw new Error(`Stream factory for type '${streamType}' is already registered`);
|
|
86
|
-
}
|
|
87
|
-
this.streamFactories[streamType] = factory;
|
|
88
|
-
return this;
|
|
89
|
-
}
|
|
90
|
-
/**
|
|
91
|
-
* Register multiple stream factories at once
|
|
92
|
-
*/
|
|
93
|
-
withStreamFactories(factories) {
|
|
94
|
-
factories.forEach(factory => {
|
|
95
|
-
this.withStreamFactory(factory);
|
|
96
|
-
});
|
|
97
|
-
return this;
|
|
98
|
-
}
|
|
99
|
-
/**
|
|
100
|
-
* Build the store instance
|
|
101
|
-
*/
|
|
102
|
-
build() {
|
|
103
|
-
if (!this.streamAdapter || !this.snapshotAdapter) {
|
|
104
|
-
throw new Error('Storage adapters must be configured. Use withAdapter() or withAdapters()');
|
|
105
|
-
}
|
|
106
|
-
if (Object.keys(this.streamFactories).length === 0) {
|
|
107
|
-
console.warn('Store created with no stream factories registered');
|
|
108
|
-
}
|
|
109
|
-
return new BaseStore({
|
|
110
|
-
streamAdapter: this.streamAdapter,
|
|
111
|
-
snapshotAdapter: this.snapshotAdapter
|
|
112
|
-
}, this.streamFactories);
|
|
113
|
-
}
|
|
114
|
-
}
|
|
115
|
-
/**
|
|
116
|
-
* Type-safe store that knows about specific stream types
|
|
117
|
-
*/
|
|
118
|
-
export class EvDbEventStore {
|
|
119
|
-
constructor(store) {
|
|
120
|
-
this.store = store;
|
|
121
|
-
// Create dynamic methods for each stream type
|
|
122
|
-
this.createDynamicMethods();
|
|
123
|
-
}
|
|
124
|
-
/**
|
|
125
|
-
* Create a stream with type-safe stream type parameter (fallback method)
|
|
126
|
-
*/
|
|
127
|
-
createStream(streamType, streamId) {
|
|
128
|
-
return this.store.createStream(streamType, streamId);
|
|
129
|
-
}
|
|
130
|
-
/**
|
|
131
|
-
* Fetch a stream from the event store with type-safe stream type parameter (fallback method)
|
|
132
|
-
*/
|
|
133
|
-
getStream(streamType, streamId) {
|
|
134
|
-
return this.store.getStream(streamType, streamId);
|
|
135
|
-
}
|
|
136
|
-
/**
|
|
137
|
-
* Create dynamic methods for each registered stream factory
|
|
138
|
-
*/
|
|
139
|
-
createDynamicMethods() {
|
|
140
|
-
const streamTypes = this.store.getStreamTypes();
|
|
141
|
-
for (const streamType of streamTypes) {
|
|
142
|
-
const methodName = `create${streamType}`;
|
|
143
|
-
// Create the dynamic method
|
|
144
|
-
this[methodName] = (streamId) => {
|
|
145
|
-
return this.store.createStream(streamType, streamId);
|
|
146
|
-
};
|
|
147
|
-
}
|
|
148
|
-
}
|
|
149
|
-
/**
|
|
150
|
-
* Get the underlying store
|
|
151
|
-
*/
|
|
152
|
-
getStore() {
|
|
153
|
-
return this.store;
|
|
154
|
-
}
|
|
155
|
-
}
|
|
156
|
-
/**
|
|
157
|
-
* Type-safe store builder
|
|
158
|
-
*/
|
|
159
|
-
export class EvDbEventStoreBuilder {
|
|
160
|
-
constructor() {
|
|
161
|
-
this.builder = BaseStore.builder();
|
|
162
|
-
}
|
|
163
|
-
withAdapters(streamAdapter, snapshotAdapter) {
|
|
164
|
-
this.builder.withAdapters(streamAdapter, snapshotAdapter);
|
|
165
|
-
return this;
|
|
166
|
-
}
|
|
167
|
-
withAdapter(adapter) {
|
|
168
|
-
this.builder.withAdapter(adapter);
|
|
169
|
-
return this;
|
|
170
|
-
}
|
|
171
|
-
// Track stream type in generics
|
|
172
|
-
withStreamFactory(factory) {
|
|
173
|
-
this.builder.withStreamFactory(factory);
|
|
174
|
-
// return as the new type that tracks K
|
|
175
|
-
return this;
|
|
176
|
-
}
|
|
177
|
-
build() {
|
|
178
|
-
const store = new EvDbEventStore(this.builder.build());
|
|
179
|
-
return store;
|
|
180
|
-
}
|
|
181
|
-
}
|
|
182
|
-
//# sourceMappingURL=EvDbEventStore.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"EvDbEventStore.js","sourceRoot":"","sources":["../src/EvDbEventStore.ts"],"names":[],"mappings":"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"}
|
package/dist/EvDbStream.d.ts
DELETED
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
import EvDbEvent from "@eventualize/types/EvDbEvent";
|
|
2
|
-
import EvDbMessage from "@eventualize/types/EvDbMessage";
|
|
3
|
-
import IEvDbStorageStreamAdapter from "@eventualize/types/IEvDbStorageStreamAdapter";
|
|
4
|
-
import IEvDbView from "@eventualize/types/IEvDbView";
|
|
5
|
-
import EvDbStreamAddress from "@eventualize/types/EvDbStreamAddress";
|
|
6
|
-
import IEvDbStreamStore from "@eventualize/types/IEvDbStreamStore";
|
|
7
|
-
import IEvDbStreamStoreData from "@eventualize/types/IEvDbStreamStoreData";
|
|
8
|
-
import IEvDbEventPayload from "@eventualize/types/IEvDbEventPayload";
|
|
9
|
-
import StreamStoreAffected from "@eventualize/types/StreamStoreAffected";
|
|
10
|
-
import IEvDbEventMetadata from "@eventualize/types/IEvDbEventMetadata";
|
|
11
|
-
import { EvDbStreamType } from "@eventualize/types/primitiveTypes";
|
|
12
|
-
import EVDbMessagesProducer from "@eventualize/types/EvDbMessagesProducer";
|
|
13
|
-
import { EvDbView } from "./EvDbView.js";
|
|
14
|
-
type ImmutableIEvDbView = Readonly<EvDbView<unknown>>;
|
|
15
|
-
export type ImmutableIEvDbViewMap = Readonly<Record<string, ImmutableIEvDbView>>;
|
|
16
|
-
export default class EvDbStream implements IEvDbStreamStore, IEvDbStreamStoreData {
|
|
17
|
-
protected messagesProducer: EVDbMessagesProducer;
|
|
18
|
-
protected _pendingEvents: ReadonlyArray<EvDbEvent>;
|
|
19
|
-
protected _pendingMessages: ReadonlyArray<EvDbMessage>;
|
|
20
|
-
private static readonly ASSEMBLY_NAME;
|
|
21
|
-
private static readonly DEFAULT_CAPTURE_BY;
|
|
22
|
-
private readonly _storageAdapter;
|
|
23
|
-
protected readonly _views: ImmutableIEvDbViewMap;
|
|
24
|
-
getViews(): ImmutableIEvDbViewMap;
|
|
25
|
-
getView(viewName: string): Readonly<IEvDbView> | undefined;
|
|
26
|
-
/**
|
|
27
|
-
* Unspecialized events
|
|
28
|
-
*/
|
|
29
|
-
getEvents(): ReadonlyArray<EvDbEvent>;
|
|
30
|
-
streamAddress: EvDbStreamAddress;
|
|
31
|
-
storedOffset: number;
|
|
32
|
-
constructor(streamType: EvDbStreamType, views: ImmutableIEvDbView[], storageAdapter: IEvDbStorageStreamAdapter, streamId: string, lastStoredOffset: number, messagesProducer: EVDbMessagesProducer);
|
|
33
|
-
protected appendEvent(payload: IEvDbEventPayload, capturedBy?: string | null): IEvDbEventMetadata;
|
|
34
|
-
private getNextCursor;
|
|
35
|
-
/**
|
|
36
|
-
* Put a row into the publication (out-box pattern).
|
|
37
|
-
*/
|
|
38
|
-
appendToOutbox(e: EvDbMessage): void;
|
|
39
|
-
store(): Promise<StreamStoreAffected>;
|
|
40
|
-
/**
|
|
41
|
-
* number of events that were not stored yet.
|
|
42
|
-
*/
|
|
43
|
-
get countOfPendingEvents(): number;
|
|
44
|
-
/**
|
|
45
|
-
* Unspecialized messages
|
|
46
|
-
*/
|
|
47
|
-
getMessages(): ReadonlyArray<EvDbMessage>;
|
|
48
|
-
}
|
|
49
|
-
export {};
|
package/dist/EvDbStream.js
DELETED
|
@@ -1,115 +0,0 @@
|
|
|
1
|
-
import EvDbEvent from "@eventualize/types/EvDbEvent";
|
|
2
|
-
import EvDbStreamAddress from "@eventualize/types/EvDbStreamAddress";
|
|
3
|
-
import StreamStoreAffected from "@eventualize/types/StreamStoreAffected";
|
|
4
|
-
import EvDbStreamCursor from "@eventualize/types/EvDbStreamCursor";
|
|
5
|
-
import OCCException from "@eventualize/types/OCCException";
|
|
6
|
-
class EvDbStream {
|
|
7
|
-
getViews() {
|
|
8
|
-
return this._views;
|
|
9
|
-
}
|
|
10
|
-
getView(viewName) {
|
|
11
|
-
return this._views[viewName];
|
|
12
|
-
}
|
|
13
|
-
// Events
|
|
14
|
-
/**
|
|
15
|
-
* Unspecialized events
|
|
16
|
-
*/
|
|
17
|
-
getEvents() {
|
|
18
|
-
return this._pendingEvents;
|
|
19
|
-
}
|
|
20
|
-
// Constructor
|
|
21
|
-
constructor(streamType, views, storageAdapter, streamId, lastStoredOffset, messagesProducer) {
|
|
22
|
-
this.messagesProducer = messagesProducer;
|
|
23
|
-
this._pendingEvents = [];
|
|
24
|
-
this._pendingMessages = [];
|
|
25
|
-
this._views = views.reduce((acc, view) => {
|
|
26
|
-
const viewName = view.address.viewName;
|
|
27
|
-
acc[viewName] = view;
|
|
28
|
-
return acc;
|
|
29
|
-
}, {});
|
|
30
|
-
this._storageAdapter = storageAdapter;
|
|
31
|
-
this.streamAddress = new EvDbStreamAddress(streamType, streamId);
|
|
32
|
-
this.storedOffset = lastStoredOffset;
|
|
33
|
-
}
|
|
34
|
-
appendEvent(payload, capturedBy) {
|
|
35
|
-
capturedBy = capturedBy ?? EvDbStream.DEFAULT_CAPTURE_BY;
|
|
36
|
-
// const json = JSON.stringify(payload); // Or use custom serializer
|
|
37
|
-
const cursor = this.getNextCursor(this._pendingEvents);
|
|
38
|
-
const e = new EvDbEvent(payload.payloadType, cursor, payload, new Date(), capturedBy);
|
|
39
|
-
this._pendingEvents = [...this._pendingEvents, e];
|
|
40
|
-
// Apply to views
|
|
41
|
-
for (const view of Object.values(this._views)) {
|
|
42
|
-
view.applyEvent(e);
|
|
43
|
-
}
|
|
44
|
-
// Outbox producer
|
|
45
|
-
const viewsStates = Object.fromEntries(Object.entries(this._views)
|
|
46
|
-
.map(([k, v]) => {
|
|
47
|
-
return [k, v.state];
|
|
48
|
-
}));
|
|
49
|
-
const producedMessages = this.messagesProducer(e, viewsStates);
|
|
50
|
-
this._pendingMessages = [...this._pendingMessages, ...producedMessages];
|
|
51
|
-
return e;
|
|
52
|
-
}
|
|
53
|
-
getNextCursor(events) {
|
|
54
|
-
if (events.length === 0) {
|
|
55
|
-
return new EvDbStreamCursor(this.streamAddress, this.storedOffset + 1);
|
|
56
|
-
}
|
|
57
|
-
const lastEvent = events[events.length - 1];
|
|
58
|
-
const offset = lastEvent.streamCursor.offset;
|
|
59
|
-
return new EvDbStreamCursor(this.streamAddress, offset + 1);
|
|
60
|
-
}
|
|
61
|
-
// AppendToOutbox
|
|
62
|
-
/**
|
|
63
|
-
* Put a row into the publication (out-box pattern).
|
|
64
|
-
*/
|
|
65
|
-
appendToOutbox(e) {
|
|
66
|
-
this._pendingMessages = [...this._pendingMessages, e];
|
|
67
|
-
}
|
|
68
|
-
// StoreAsync
|
|
69
|
-
async store() {
|
|
70
|
-
// Telemetry
|
|
71
|
-
// const tags = this.streamAddress.toOtelTags();
|
|
72
|
-
// const duration = EvDbStream._sysMeters.measureStoreEventsDuration(tags);
|
|
73
|
-
// const activity = EvDbStream._trace.startActivity(tags, 'EvDb.Store');
|
|
74
|
-
try {
|
|
75
|
-
if (this._pendingEvents.length === 0) {
|
|
76
|
-
return StreamStoreAffected.Empty;
|
|
77
|
-
}
|
|
78
|
-
const affected = await this._storageAdapter.storeStreamAsync(this._pendingEvents, this._pendingMessages);
|
|
79
|
-
const lastEvent = this._pendingEvents[this._pendingEvents.length - 1];
|
|
80
|
-
this.storedOffset = lastEvent.streamCursor.offset;
|
|
81
|
-
this._pendingEvents = [];
|
|
82
|
-
this._pendingMessages = [];
|
|
83
|
-
const viewSaveTasks = Object.values(this._views).map(v => v.store());
|
|
84
|
-
await Promise.all(viewSaveTasks);
|
|
85
|
-
return affected;
|
|
86
|
-
}
|
|
87
|
-
catch (error) {
|
|
88
|
-
if (error instanceof OCCException) {
|
|
89
|
-
throw error;
|
|
90
|
-
}
|
|
91
|
-
throw error;
|
|
92
|
-
}
|
|
93
|
-
}
|
|
94
|
-
// CountOfPendingEvents
|
|
95
|
-
/**
|
|
96
|
-
* number of events that were not stored yet.
|
|
97
|
-
*/
|
|
98
|
-
get countOfPendingEvents() {
|
|
99
|
-
return this._pendingEvents.length;
|
|
100
|
-
}
|
|
101
|
-
// Notifications
|
|
102
|
-
/**
|
|
103
|
-
* Unspecialized messages
|
|
104
|
-
*/
|
|
105
|
-
getMessages() {
|
|
106
|
-
return this._pendingMessages;
|
|
107
|
-
}
|
|
108
|
-
}
|
|
109
|
-
EvDbStream.ASSEMBLY_NAME = {
|
|
110
|
-
name: 'evdb-core',
|
|
111
|
-
version: '1.0.0'
|
|
112
|
-
};
|
|
113
|
-
EvDbStream.DEFAULT_CAPTURE_BY = `${EvDbStream.ASSEMBLY_NAME.name}-${EvDbStream.ASSEMBLY_NAME.version}`;
|
|
114
|
-
export default EvDbStream;
|
|
115
|
-
//# sourceMappingURL=EvDbStream.js.map
|
package/dist/EvDbStream.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"EvDbStream.js","sourceRoot":"","sources":["../src/EvDbStream.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,97 +0,0 @@
|
|
|
1
|
-
import IEvDbStorageSnapshotAdapter from '@eventualize/types/IEvDbStorageSnapshotAdapter';
|
|
2
|
-
import IEvDbStorageStreamAdapter from '@eventualize/types/IEvDbStorageStreamAdapter';
|
|
3
|
-
import IEvDbEventPayload from "@eventualize/types/IEvDbEventPayload";
|
|
4
|
-
import EVDbMessagesProducer from '@eventualize/types/EvDbMessagesProducer';
|
|
5
|
-
import EvDbStream from './EvDbStream.js';
|
|
6
|
-
import { EvDbView } from './EvDbView.js';
|
|
7
|
-
import { ViewFactory, EvDbStreamEventHandlersMap } from './EvDbViewFactory.js';
|
|
8
|
-
/**
|
|
9
|
-
* Configuration for creating a stream factory
|
|
10
|
-
*/
|
|
11
|
-
export interface EvDbStreamFactoryConfig<TEvents extends IEvDbEventPayload, TStreamType extends string> {
|
|
12
|
-
streamType: TStreamType;
|
|
13
|
-
viewFactories: ViewFactory<any, TEvents>[];
|
|
14
|
-
eventTypes: EventTypeConfig<TEvents>[];
|
|
15
|
-
viewNames: string[];
|
|
16
|
-
}
|
|
17
|
-
/**
|
|
18
|
-
* Configuration for each event type
|
|
19
|
-
*/
|
|
20
|
-
export interface EventTypeConfig<TEvent extends IEvDbEventPayload> {
|
|
21
|
-
eventClass: new (...args: any[]) => TEvent;
|
|
22
|
-
eventName: string;
|
|
23
|
-
eventMessagesProducer?: EVDbMessagesProducer;
|
|
24
|
-
}
|
|
25
|
-
/**
|
|
26
|
-
* Type helper to extract event methods
|
|
27
|
-
*/
|
|
28
|
-
type EventMethods<TEvents extends IEvDbEventPayload> = {
|
|
29
|
-
[K in TEvents as `appendEvent${K['payloadType']}`]: (event: K) => Promise<void>;
|
|
30
|
-
};
|
|
31
|
-
/**
|
|
32
|
-
* Type helper to create view accessors map
|
|
33
|
-
*/
|
|
34
|
-
type ViewAccessors<TViews extends Record<string, EvDbView<any>>> = {
|
|
35
|
-
readonly views: TViews;
|
|
36
|
-
};
|
|
37
|
-
/**
|
|
38
|
-
* Combined stream type with event methods and view accessors
|
|
39
|
-
*/
|
|
40
|
-
export type StreamWithEventMethods<TEvents extends IEvDbEventPayload, TViews extends Record<string, EvDbView<any>> = {}> = EvDbStream & EventMethods<TEvents> & ViewAccessors<TViews>;
|
|
41
|
-
/**
|
|
42
|
-
* Stream Factory - creates stream instances with configured views and dynamic event methods
|
|
43
|
-
*/
|
|
44
|
-
export declare class EvDbStreamFactory<TEvents extends IEvDbEventPayload, TStreamType extends string, TViews extends Record<string, EvDbView<any>> = {}> {
|
|
45
|
-
private readonly config;
|
|
46
|
-
private DynamicStreamClass;
|
|
47
|
-
constructor(config: EvDbStreamFactoryConfig<TEvents, TStreamType>);
|
|
48
|
-
/**
|
|
49
|
-
* Creates a dynamic stream class with event-specific methods and view accessors
|
|
50
|
-
*/
|
|
51
|
-
private createDynamicStreamClass;
|
|
52
|
-
/**
|
|
53
|
-
* Creates a stream instance with all configured views and dynamic event methods
|
|
54
|
-
*/
|
|
55
|
-
create(streamId: string, streamStorageAdapter: IEvDbStorageStreamAdapter, snapshotStorageAdapter: IEvDbStorageSnapshotAdapter, lastStreamOffset?: number): StreamWithEventMethods<TEvents, TViews>;
|
|
56
|
-
private createViews;
|
|
57
|
-
private getViews;
|
|
58
|
-
/**
|
|
59
|
-
* Fetches from storage a stream instance with all configured views and dynamic event methods
|
|
60
|
-
*/
|
|
61
|
-
get(streamId: string, streamStorageAdapter: IEvDbStorageStreamAdapter, snapshotStorageAdapter: IEvDbStorageSnapshotAdapter): Promise<StreamWithEventMethods<TEvents, TViews>>;
|
|
62
|
-
getStreamType(): TStreamType;
|
|
63
|
-
}
|
|
64
|
-
/**
|
|
65
|
-
* Factory function to create a StreamFactory
|
|
66
|
-
*/
|
|
67
|
-
export declare function createEvDbStreamFactory<TEvents extends IEvDbEventPayload, TStreamType extends string, TViews extends Record<string, EvDbView<any>> = {}>(config: EvDbStreamFactoryConfig<TEvents, TStreamType>): EvDbStreamFactory<TEvents, TStreamType, TViews>;
|
|
68
|
-
/**
|
|
69
|
-
* Fluent builder for creating stream factories with inferred event types
|
|
70
|
-
*/
|
|
71
|
-
export declare class StreamFactoryBuilder<TStreamType extends string, TEvents extends IEvDbEventPayload = never, TViews extends Record<string, EvDbView<any>> = {}> {
|
|
72
|
-
private streamType;
|
|
73
|
-
private viewFactories;
|
|
74
|
-
private eventTypes;
|
|
75
|
-
private viewNames;
|
|
76
|
-
constructor(streamType: TStreamType);
|
|
77
|
-
/**
|
|
78
|
-
* Register event type for dynamic method generation - infers the event name from class name
|
|
79
|
-
*/
|
|
80
|
-
withEventType<TEvent extends IEvDbEventPayload>(eventClass: new (...args: any[]) => TEvent, eventMessagesProducer?: EVDbMessagesProducer): StreamFactoryBuilder<TStreamType, TEvents | TEvent, TViews>;
|
|
81
|
-
/**
|
|
82
|
-
* Add a view with inline handler definition
|
|
83
|
-
* This can only be called AFTER withEventType calls to ensure type safety
|
|
84
|
-
*/
|
|
85
|
-
withView<TViewName extends string, TState>(viewName: TViewName, stateClass: new (...args: any[]) => TState, handlers: EvDbStreamEventHandlersMap<TState, TEvents>): StreamFactoryBuilder<TStreamType, TEvents, TViews & Record<TViewName, EvDbView<TState>>>;
|
|
86
|
-
/**
|
|
87
|
-
* Add a pre-created view factory (legacy support)
|
|
88
|
-
*/
|
|
89
|
-
withViewFactory<TViewName extends string, TState>(viewName: TViewName, viewFactory: ViewFactory<TState, TEvents>): StreamFactoryBuilder<TStreamType, TEvents, TViews & Record<TViewName, EvDbView<TState>>>;
|
|
90
|
-
/**
|
|
91
|
-
* Build the stream factory
|
|
92
|
-
*/
|
|
93
|
-
build(): EvDbStreamFactory<TEvents, TStreamType, TViews> & {
|
|
94
|
-
StreamType: StreamWithEventMethods<TEvents, TViews>;
|
|
95
|
-
};
|
|
96
|
-
}
|
|
97
|
-
export {};
|
|
@@ -1,155 +0,0 @@
|
|
|
1
|
-
import EvDbStreamCursor from '@eventualize/types/EvDbStreamCursor';
|
|
2
|
-
import EvDbStreamAddress from '@eventualize/types/EvDbStreamAddress';
|
|
3
|
-
import EvDbStream from './EvDbStream.js';
|
|
4
|
-
import { createViewFactory } from './EvDbViewFactory.js';
|
|
5
|
-
/**
|
|
6
|
-
* Stream Factory - creates stream instances with configured views and dynamic event methods
|
|
7
|
-
*/
|
|
8
|
-
export class EvDbStreamFactory {
|
|
9
|
-
constructor(config) {
|
|
10
|
-
this.config = config;
|
|
11
|
-
this.DynamicStreamClass = this.createDynamicStreamClass();
|
|
12
|
-
}
|
|
13
|
-
/**
|
|
14
|
-
* Creates a dynamic stream class with event-specific methods and view accessors
|
|
15
|
-
*/
|
|
16
|
-
createDynamicStreamClass() {
|
|
17
|
-
const eventTypes = this.config.eventTypes;
|
|
18
|
-
const viewNames = this.config.viewNames;
|
|
19
|
-
const messagesProducer = (event, viewsState) => {
|
|
20
|
-
const eventType = eventTypes.find(e => e.eventName === event.eventType);
|
|
21
|
-
if (!eventType || !eventType.eventMessagesProducer)
|
|
22
|
-
return [];
|
|
23
|
-
return eventType.eventMessagesProducer(event, viewsState);
|
|
24
|
-
};
|
|
25
|
-
class DynamicStream extends EvDbStream {
|
|
26
|
-
constructor(streamType, views, streamStorageAdapter, streamId, lastStreamOffset) {
|
|
27
|
-
super(streamType, views, streamStorageAdapter, streamId, lastStreamOffset, messagesProducer);
|
|
28
|
-
this.views = {};
|
|
29
|
-
// Create view accessors
|
|
30
|
-
views.forEach((view, index) => {
|
|
31
|
-
const viewName = viewNames[index];
|
|
32
|
-
if (viewName) {
|
|
33
|
-
this.views[viewName] = view;
|
|
34
|
-
}
|
|
35
|
-
});
|
|
36
|
-
}
|
|
37
|
-
}
|
|
38
|
-
// Add dynamic methods for each event type
|
|
39
|
-
eventTypes.forEach(({ eventName }) => {
|
|
40
|
-
const methodName = `appendEvent${eventName}`;
|
|
41
|
-
DynamicStream.prototype[methodName] = async function (event) {
|
|
42
|
-
return this.appendEvent(event);
|
|
43
|
-
};
|
|
44
|
-
});
|
|
45
|
-
return DynamicStream;
|
|
46
|
-
}
|
|
47
|
-
/**
|
|
48
|
-
* Creates a stream instance with all configured views and dynamic event methods
|
|
49
|
-
*/
|
|
50
|
-
create(streamId, streamStorageAdapter, snapshotStorageAdapter, lastStreamOffset = 0) {
|
|
51
|
-
const views = this.createViews(streamId, snapshotStorageAdapter);
|
|
52
|
-
return new this.DynamicStreamClass(this.config.streamType, views, streamStorageAdapter, streamId, lastStreamOffset);
|
|
53
|
-
}
|
|
54
|
-
createViews(streamId, snapshotStorageAdapter) {
|
|
55
|
-
const views = this.config.viewFactories.map(factory => factory.create(streamId, snapshotStorageAdapter));
|
|
56
|
-
return views;
|
|
57
|
-
}
|
|
58
|
-
getViews(streamId, snapshotStorageAdapter) {
|
|
59
|
-
const getViewPromises = this.config.viewFactories.map(viewFactory => viewFactory.get(streamId, snapshotStorageAdapter));
|
|
60
|
-
return getViewPromises;
|
|
61
|
-
}
|
|
62
|
-
/**
|
|
63
|
-
* Fetches from storage a stream instance with all configured views and dynamic event methods
|
|
64
|
-
*/
|
|
65
|
-
async get(streamId, streamStorageAdapter, snapshotStorageAdapter) {
|
|
66
|
-
const streamAddress = new EvDbStreamAddress(this.config.streamType, streamId);
|
|
67
|
-
const views = await Promise.all(this.getViews(streamId, snapshotStorageAdapter));
|
|
68
|
-
if (!views.length) {
|
|
69
|
-
const lastStreamOffset = await streamStorageAdapter.getLastOffsetAsync(streamAddress);
|
|
70
|
-
const stream = this.create(streamId, streamStorageAdapter, snapshotStorageAdapter, lastStreamOffset);
|
|
71
|
-
return stream;
|
|
72
|
-
}
|
|
73
|
-
const lowestViewOffset = views.reduce((lowestOffset, currentView) => Math.min(lowestOffset, currentView.storeOffset), Number.MAX_VALUE);
|
|
74
|
-
const streamCursor = new EvDbStreamCursor(streamAddress, lowestViewOffset + 1);
|
|
75
|
-
const events = await streamStorageAdapter.getEventsAsync(streamCursor);
|
|
76
|
-
let streamOffset = lowestViewOffset;
|
|
77
|
-
for await (const event of events) {
|
|
78
|
-
views.forEach(view => view.applyEvent(event));
|
|
79
|
-
streamOffset = event.streamCursor.offset;
|
|
80
|
-
}
|
|
81
|
-
return new this.DynamicStreamClass(this.config.streamType, views, streamStorageAdapter, streamId, streamOffset);
|
|
82
|
-
}
|
|
83
|
-
getStreamType() {
|
|
84
|
-
return this.config.streamType;
|
|
85
|
-
}
|
|
86
|
-
}
|
|
87
|
-
/**
|
|
88
|
-
* Factory function to create a StreamFactory
|
|
89
|
-
*/
|
|
90
|
-
export function createEvDbStreamFactory(config) {
|
|
91
|
-
return new EvDbStreamFactory(config);
|
|
92
|
-
}
|
|
93
|
-
/**
|
|
94
|
-
* Fluent builder for creating stream factories with inferred event types
|
|
95
|
-
*/
|
|
96
|
-
export class StreamFactoryBuilder {
|
|
97
|
-
constructor(streamType) {
|
|
98
|
-
this.streamType = streamType;
|
|
99
|
-
this.viewFactories = [];
|
|
100
|
-
this.eventTypes = [];
|
|
101
|
-
this.viewNames = [];
|
|
102
|
-
}
|
|
103
|
-
/**
|
|
104
|
-
* Register event type for dynamic method generation - infers the event name from class name
|
|
105
|
-
*/
|
|
106
|
-
withEventType(eventClass, eventMessagesProducer) {
|
|
107
|
-
// Use the class name as the event name
|
|
108
|
-
const eventName = eventClass.name;
|
|
109
|
-
this.eventTypes.push({ eventClass, eventName, eventMessagesProducer });
|
|
110
|
-
return this;
|
|
111
|
-
}
|
|
112
|
-
/**
|
|
113
|
-
* Add a view with inline handler definition
|
|
114
|
-
* This can only be called AFTER withEventType calls to ensure type safety
|
|
115
|
-
*/
|
|
116
|
-
withView(viewName, stateClass, handlers) {
|
|
117
|
-
// Create default state instance
|
|
118
|
-
const defaultState = new stateClass();
|
|
119
|
-
// Create the view factory
|
|
120
|
-
const viewFactory = createViewFactory({
|
|
121
|
-
viewName,
|
|
122
|
-
streamType: this.streamType,
|
|
123
|
-
defaultState,
|
|
124
|
-
handlers
|
|
125
|
-
});
|
|
126
|
-
this.viewFactories.push(viewFactory);
|
|
127
|
-
this.viewNames.push(viewName);
|
|
128
|
-
return this;
|
|
129
|
-
}
|
|
130
|
-
/**
|
|
131
|
-
* Add a pre-created view factory (legacy support)
|
|
132
|
-
*/
|
|
133
|
-
withViewFactory(viewName, viewFactory) {
|
|
134
|
-
this.viewFactories.push(viewFactory);
|
|
135
|
-
this.viewNames.push(viewName);
|
|
136
|
-
return this;
|
|
137
|
-
}
|
|
138
|
-
/**
|
|
139
|
-
* Build the stream factory
|
|
140
|
-
*/
|
|
141
|
-
build() {
|
|
142
|
-
const factory = new EvDbStreamFactory({
|
|
143
|
-
streamType: this.streamType,
|
|
144
|
-
viewFactories: this.viewFactories,
|
|
145
|
-
eventTypes: this.eventTypes,
|
|
146
|
-
viewNames: this.viewNames
|
|
147
|
-
});
|
|
148
|
-
// Return factory with type helper for stream type extraction
|
|
149
|
-
return Object.assign(factory, {
|
|
150
|
-
// This is a type-only property for extracting the stream type
|
|
151
|
-
StreamType: null
|
|
152
|
-
});
|
|
153
|
-
}
|
|
154
|
-
}
|
|
155
|
-
//# sourceMappingURL=EvDbStreamFactory.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"EvDbStreamFactory.js","sourceRoot":"","sources":["../src/EvDbStreamFactory.ts"],"names":[],"mappings":"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"}
|
package/dist/EvDbView.d.ts
DELETED
|
@@ -1,34 +0,0 @@
|
|
|
1
|
-
import IEvDbViewStore, { IEvDbViewStoreGeneric } from "@eventualize/types/IEvDbViewStore";
|
|
2
|
-
import EvDbViewAddress from "@eventualize/types/EvDbViewAddress";
|
|
3
|
-
import IEvDbStorageSnapshotAdapter from "@eventualize/types/IEvDbStorageSnapshotAdapter";
|
|
4
|
-
import EvDbEvent from "@eventualize/types/src/EvDbEvent";
|
|
5
|
-
import { EvDbStoredSnapshotData } from "@eventualize/types/EvDbStoredSnapshotData";
|
|
6
|
-
import { EvDbStoredSnapshotResult } from "@eventualize/types/EvDbStoredSnapshotResult";
|
|
7
|
-
import IEvDbEventMetadata from "@eventualize/types/IEvDbEventMetadata";
|
|
8
|
-
import IEvDbEventPayload from "@eventualize/types/IEvDbEventPayload";
|
|
9
|
-
export declare abstract class EvDbViewRaw implements IEvDbViewStore {
|
|
10
|
-
private readonly _storageAdapter;
|
|
11
|
-
readonly address: EvDbViewAddress;
|
|
12
|
-
private _memoryOffset;
|
|
13
|
-
private _storeOffset;
|
|
14
|
-
private _storedAt;
|
|
15
|
-
protected constructor(_storageAdapter: IEvDbStorageSnapshotAdapter, address: EvDbViewAddress, snapshot: EvDbStoredSnapshotResult<any>);
|
|
16
|
-
abstract getSnapshotData(): EvDbStoredSnapshotData;
|
|
17
|
-
get storedAt(): Date;
|
|
18
|
-
get storeOffset(): number;
|
|
19
|
-
get memoryOffset(): number;
|
|
20
|
-
shouldStoreSnapshot(offsetGapFromLastSave: number, durationSinceLastSaveMs: number): boolean;
|
|
21
|
-
applyEvent(e: EvDbEvent): void;
|
|
22
|
-
store(): Promise<void>;
|
|
23
|
-
protected abstract onApplyEvent(e: EvDbEvent): void;
|
|
24
|
-
}
|
|
25
|
-
export declare abstract class EvDbView<TState> extends EvDbViewRaw implements IEvDbViewStoreGeneric<TState> {
|
|
26
|
-
readonly defaultState: TState;
|
|
27
|
-
protected getDefaultState(): TState;
|
|
28
|
-
protected _state: TState;
|
|
29
|
-
get state(): TState;
|
|
30
|
-
constructor(address: EvDbViewAddress, storageAdapter: IEvDbStorageSnapshotAdapter, snapshot: EvDbStoredSnapshotResult<TState>, defaultState: TState);
|
|
31
|
-
getSnapshotData(): EvDbStoredSnapshotData;
|
|
32
|
-
abstract handleOnApply(oldState: TState, event: IEvDbEventPayload, metadata: IEvDbEventMetadata): TState;
|
|
33
|
-
protected onApplyEvent(e: EvDbEvent): void;
|
|
34
|
-
}
|