@arki/event-sourcing 0.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/LICENSE +21 -0
- package/README.md +124 -0
- package/dist/builders/command-handler.d.ts +48 -0
- package/dist/builders/command-handler.d.ts.map +1 -0
- package/dist/builders/command-handler.js +40 -0
- package/dist/builders/command-handler.js.map +1 -0
- package/dist/builders/command.d.ts +39 -0
- package/dist/builders/command.d.ts.map +1 -0
- package/dist/builders/command.js +44 -0
- package/dist/builders/command.js.map +1 -0
- package/dist/builders/decider.d.ts +188 -0
- package/dist/builders/decider.d.ts.map +1 -0
- package/dist/builders/decider.js +252 -0
- package/dist/builders/decider.js.map +1 -0
- package/dist/builders/event.d.ts +39 -0
- package/dist/builders/event.d.ts.map +1 -0
- package/dist/builders/event.js +42 -0
- package/dist/builders/event.js.map +1 -0
- package/dist/builders/index.d.ts +40 -0
- package/dist/builders/index.d.ts.map +1 -0
- package/dist/builders/index.js +40 -0
- package/dist/builders/index.js.map +1 -0
- package/dist/builders/process-manager.d.ts +94 -0
- package/dist/builders/process-manager.d.ts.map +1 -0
- package/dist/builders/process-manager.js +131 -0
- package/dist/builders/process-manager.js.map +1 -0
- package/dist/builders/projection.d.ts +92 -0
- package/dist/builders/projection.d.ts.map +1 -0
- package/dist/builders/projection.js +129 -0
- package/dist/builders/projection.js.map +1 -0
- package/dist/builders/stateful-process-manager.d.ts +181 -0
- package/dist/builders/stateful-process-manager.d.ts.map +1 -0
- package/dist/builders/stateful-process-manager.js +280 -0
- package/dist/builders/stateful-process-manager.js.map +1 -0
- package/dist/bus.d.ts +3 -0
- package/dist/bus.d.ts.map +1 -0
- package/dist/bus.js +2 -0
- package/dist/bus.js.map +1 -0
- package/dist/command-flow.d.ts +87 -0
- package/dist/command-flow.d.ts.map +1 -0
- package/dist/command-flow.js +233 -0
- package/dist/command-flow.js.map +1 -0
- package/dist/command.d.ts +38 -0
- package/dist/command.d.ts.map +1 -0
- package/dist/command.js +2 -0
- package/dist/command.js.map +1 -0
- package/dist/debug.d.ts +31 -0
- package/dist/debug.d.ts.map +1 -0
- package/dist/debug.js +31 -0
- package/dist/debug.js.map +1 -0
- package/dist/decide.d.ts +11 -0
- package/dist/decide.d.ts.map +1 -0
- package/dist/decide.js +2 -0
- package/dist/decide.js.map +1 -0
- package/dist/dot.d.ts +90 -0
- package/dist/dot.d.ts.map +1 -0
- package/dist/dot.js +91 -0
- package/dist/dot.js.map +1 -0
- package/dist/error.d.ts +2 -0
- package/dist/error.d.ts.map +1 -0
- package/dist/error.js +2 -0
- package/dist/error.js.map +1 -0
- package/dist/event-sourcing-features.d.ts +81 -0
- package/dist/event-sourcing-features.d.ts.map +1 -0
- package/dist/event-sourcing-features.js +139 -0
- package/dist/event-sourcing-features.js.map +1 -0
- package/dist/event.d.ts +25 -0
- package/dist/event.d.ts.map +1 -0
- package/dist/event.js +2 -0
- package/dist/event.js.map +1 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +6 -0
- package/dist/index.js.map +1 -0
- package/dist/package.json +5 -0
- package/dist/process-manager.d.ts +113 -0
- package/dist/process-manager.d.ts.map +1 -0
- package/dist/process-manager.js +155 -0
- package/dist/process-manager.js.map +1 -0
- package/dist/simple-process-manager.d.ts +37 -0
- package/dist/simple-process-manager.d.ts.map +1 -0
- package/dist/simple-process-manager.js +55 -0
- package/dist/simple-process-manager.js.map +1 -0
- package/dist/src/builders/command-handler.d.ts +48 -0
- package/dist/src/builders/command-handler.d.ts.map +1 -0
- package/dist/src/builders/command.d.ts +39 -0
- package/dist/src/builders/command.d.ts.map +1 -0
- package/dist/src/builders/decider.d.ts +188 -0
- package/dist/src/builders/decider.d.ts.map +1 -0
- package/dist/src/builders/event.d.ts +39 -0
- package/dist/src/builders/event.d.ts.map +1 -0
- package/dist/src/builders/index.d.ts +40 -0
- package/dist/src/builders/index.d.ts.map +1 -0
- package/dist/src/builders/process-manager.d.ts +94 -0
- package/dist/src/builders/process-manager.d.ts.map +1 -0
- package/dist/src/builders/projection.d.ts +92 -0
- package/dist/src/builders/projection.d.ts.map +1 -0
- package/dist/src/builders/stateful-process-manager.d.ts +181 -0
- package/dist/src/builders/stateful-process-manager.d.ts.map +1 -0
- package/dist/src/bus.d.ts +3 -0
- package/dist/src/bus.d.ts.map +1 -0
- package/dist/src/command-flow.d.ts +87 -0
- package/dist/src/command-flow.d.ts.map +1 -0
- package/dist/src/command.d.ts +16 -0
- package/dist/src/command.d.ts.map +1 -0
- package/dist/src/debug.d.ts +31 -0
- package/dist/src/debug.d.ts.map +1 -0
- package/dist/src/decide.d.ts +11 -0
- package/dist/src/decide.d.ts.map +1 -0
- package/dist/src/error.d.ts +2 -0
- package/dist/src/error.d.ts.map +1 -0
- package/dist/src/event.d.ts +25 -0
- package/dist/src/event.d.ts.map +1 -0
- package/dist/src/index.d.ts +5 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/process-manager.d.ts +113 -0
- package/dist/src/process-manager.d.ts.map +1 -0
- package/dist/src/store.d.ts +44 -0
- package/dist/src/store.d.ts.map +1 -0
- package/dist/src/types.d.ts +10 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/store.d.ts +44 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +94 -0
- package/dist/store.js.map +1 -0
- package/dist/types.d.ts +10 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +100 -0
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
import { debugBuilder } from '../debug.js';
|
|
2
|
+
/**
|
|
3
|
+
* StatefulProcessManagerBuilder - Fluent API for building type-safe stateful process managers (sagas)
|
|
4
|
+
*
|
|
5
|
+
* Provides an immutable builder pattern for creating stateful process managers with:
|
|
6
|
+
* - Type safety through TypeScript generics
|
|
7
|
+
* - Runtime validation through Zod schemas
|
|
8
|
+
* - ORPC-style API with .handler() as terminal method
|
|
9
|
+
* - Persistent state management with load/save operations
|
|
10
|
+
*
|
|
11
|
+
* A Stateful Process Manager (Saga) maintains state across events to coordinate complex,
|
|
12
|
+
* long-running business processes by:
|
|
13
|
+
* - name: Unique identifier for the stateful process manager
|
|
14
|
+
* - eventTypes: Array of event types this process manager handles
|
|
15
|
+
* - stateSchema: Schema for validating process manager state
|
|
16
|
+
* - contextSchema: Schema for validating execution context
|
|
17
|
+
* - getStateId: Function to extract state identifier from events
|
|
18
|
+
* - loadState: Function to load existing state from storage
|
|
19
|
+
* - saveState: Function to persist state to storage
|
|
20
|
+
* - handler: Function that processes individual events and returns updated state
|
|
21
|
+
*
|
|
22
|
+
* @example
|
|
23
|
+
* ```typescript
|
|
24
|
+
* type OrderState = {
|
|
25
|
+
* orderId: string;
|
|
26
|
+
* status: 'pending' | 'paid' | 'shipped' | 'completed';
|
|
27
|
+
* paymentId?: string;
|
|
28
|
+
* trackingId?: string;
|
|
29
|
+
* };
|
|
30
|
+
*
|
|
31
|
+
* const orderProcessManager = defineStatefulProcessManager<OrderEvent, OrderState>()
|
|
32
|
+
* .name('order-fulfillment')
|
|
33
|
+
* .eventTypes(['OrderPlaced', 'PaymentProcessed', 'OrderShipped'])
|
|
34
|
+
* .stateSchema(z.object({
|
|
35
|
+
* orderId: z.string(),
|
|
36
|
+
* status: z.enum(['pending', 'paid', 'shipped', 'completed']),
|
|
37
|
+
* paymentId: z.string().optional(),
|
|
38
|
+
* trackingId: z.string().optional(),
|
|
39
|
+
* }))
|
|
40
|
+
* .contextSchema(z.object({ messageBus: z.any(), repo: z.any() }))
|
|
41
|
+
* .getStateId(event => `order-${event.data.orderId}`)
|
|
42
|
+
* .loadState(async (stateId, context) => {
|
|
43
|
+
* return await context.repo.orderSagas.findById(stateId);
|
|
44
|
+
* })
|
|
45
|
+
* .saveState(async (stateId, state, context) => {
|
|
46
|
+
* await context.repo.orderSagas.upsert({ id: stateId, ...state });
|
|
47
|
+
* })
|
|
48
|
+
* .handler(async (event, state, context) => {
|
|
49
|
+
* if (event.type === 'OrderPlaced') {
|
|
50
|
+
* // Initialize state for new order
|
|
51
|
+
* return {
|
|
52
|
+
* orderId: event.data.orderId,
|
|
53
|
+
* status: 'pending',
|
|
54
|
+
* };
|
|
55
|
+
* } else if (event.type === 'PaymentProcessed') {
|
|
56
|
+
* // Update state after payment
|
|
57
|
+
* return {
|
|
58
|
+
* ...state!,
|
|
59
|
+
* status: 'paid',
|
|
60
|
+
* paymentId: event.data.paymentId,
|
|
61
|
+
* };
|
|
62
|
+
* } else if (event.type === 'OrderShipped') {
|
|
63
|
+
* // Update state after shipping
|
|
64
|
+
* return {
|
|
65
|
+
* ...state!,
|
|
66
|
+
* status: 'shipped',
|
|
67
|
+
* trackingId: event.data.trackingId,
|
|
68
|
+
* };
|
|
69
|
+
* }
|
|
70
|
+
* return state!;
|
|
71
|
+
* });
|
|
72
|
+
* ```
|
|
73
|
+
*/
|
|
74
|
+
class StatefulProcessManagerBuilder {
|
|
75
|
+
_name;
|
|
76
|
+
_eventTypes;
|
|
77
|
+
_stateSchema;
|
|
78
|
+
_contextSchema;
|
|
79
|
+
_getStateIdFn;
|
|
80
|
+
_loadStateFn;
|
|
81
|
+
_saveStateFn;
|
|
82
|
+
_handlerFn;
|
|
83
|
+
/**
|
|
84
|
+
* Creates a deep copy of the builder to ensure immutability
|
|
85
|
+
* @private
|
|
86
|
+
*/
|
|
87
|
+
clone() {
|
|
88
|
+
const builder = new StatefulProcessManagerBuilder();
|
|
89
|
+
builder._name = this._name;
|
|
90
|
+
builder._eventTypes = this._eventTypes;
|
|
91
|
+
builder._stateSchema = this._stateSchema;
|
|
92
|
+
builder._contextSchema = this._contextSchema;
|
|
93
|
+
builder._getStateIdFn = this._getStateIdFn;
|
|
94
|
+
builder._loadStateFn = this._loadStateFn;
|
|
95
|
+
builder._saveStateFn = this._saveStateFn;
|
|
96
|
+
builder._handlerFn = this._handlerFn;
|
|
97
|
+
return builder;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Sets the stateful process manager name
|
|
101
|
+
* @param name - Unique identifier for the stateful process manager
|
|
102
|
+
* @returns A new StatefulProcessManagerBuilder instance with the name set
|
|
103
|
+
*/
|
|
104
|
+
name(name) {
|
|
105
|
+
const builder = this.clone();
|
|
106
|
+
builder._name = name;
|
|
107
|
+
debugBuilder('[stateful-process-manager] Set name: %s', name);
|
|
108
|
+
return builder;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Sets the event types this stateful process manager can handle
|
|
112
|
+
* @param types - Array of event type strings
|
|
113
|
+
* @returns A new StatefulProcessManagerBuilder instance with the event types set
|
|
114
|
+
*/
|
|
115
|
+
eventTypes(types) {
|
|
116
|
+
const builder = this.clone();
|
|
117
|
+
builder._eventTypes = types;
|
|
118
|
+
debugBuilder('[stateful-process-manager:%s] Set event types: %o', this._name ?? 'unnamed', types);
|
|
119
|
+
return builder;
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Sets the state schema for validation
|
|
123
|
+
* @param schema - Zod schema for validating the stateful process manager state
|
|
124
|
+
* @returns A new StatefulProcessManagerBuilder instance with the state schema set
|
|
125
|
+
*/
|
|
126
|
+
stateSchema(schema) {
|
|
127
|
+
const builder = new StatefulProcessManagerBuilder();
|
|
128
|
+
builder._name = this._name;
|
|
129
|
+
builder._eventTypes = this._eventTypes;
|
|
130
|
+
builder._stateSchema = schema;
|
|
131
|
+
builder._contextSchema = this._contextSchema;
|
|
132
|
+
builder._getStateIdFn = this._getStateIdFn;
|
|
133
|
+
builder._loadStateFn = this._loadStateFn;
|
|
134
|
+
builder._saveStateFn = this._saveStateFn;
|
|
135
|
+
builder._handlerFn = this._handlerFn;
|
|
136
|
+
debugBuilder('[stateful-process-manager:%s] Set state schema', this._name ?? 'unnamed');
|
|
137
|
+
return builder;
|
|
138
|
+
}
|
|
139
|
+
/**
|
|
140
|
+
* Sets the context schema for validation
|
|
141
|
+
* @param schema - Zod schema for validating the execution context
|
|
142
|
+
* @returns A new StatefulProcessManagerBuilder instance with the context schema set
|
|
143
|
+
*/
|
|
144
|
+
contextSchema(schema) {
|
|
145
|
+
const builder = new StatefulProcessManagerBuilder();
|
|
146
|
+
builder._name = this._name;
|
|
147
|
+
builder._eventTypes = this._eventTypes;
|
|
148
|
+
builder._stateSchema = this._stateSchema;
|
|
149
|
+
builder._contextSchema = schema;
|
|
150
|
+
builder._getStateIdFn = this._getStateIdFn;
|
|
151
|
+
builder._loadStateFn = this._loadStateFn;
|
|
152
|
+
builder._saveStateFn = this._saveStateFn;
|
|
153
|
+
builder._handlerFn = this._handlerFn;
|
|
154
|
+
debugBuilder('[stateful-process-manager:%s] Set context schema', this._name ?? 'unnamed');
|
|
155
|
+
return builder;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Sets the function to extract state identifier from events
|
|
159
|
+
* @param fn - Function that extracts a unique state identifier from an event
|
|
160
|
+
* @returns A new StatefulProcessManagerBuilder instance with the getStateId function set
|
|
161
|
+
*/
|
|
162
|
+
getStateId(fn) {
|
|
163
|
+
const builder = this.clone();
|
|
164
|
+
builder._getStateIdFn = fn;
|
|
165
|
+
debugBuilder('[stateful-process-manager:%s] Set getStateId function', this._name ?? 'unnamed');
|
|
166
|
+
return builder;
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Sets the function to load existing state from storage
|
|
170
|
+
* @param fn - Function that loads state by identifier, returns null if state doesn't exist
|
|
171
|
+
* @returns A new StatefulProcessManagerBuilder instance with the loadState function set
|
|
172
|
+
*/
|
|
173
|
+
loadState(fn) {
|
|
174
|
+
const builder = this.clone();
|
|
175
|
+
builder._loadStateFn = fn;
|
|
176
|
+
debugBuilder('[stateful-process-manager:%s] Set loadState function', this._name ?? 'unnamed');
|
|
177
|
+
return builder;
|
|
178
|
+
}
|
|
179
|
+
/**
|
|
180
|
+
* Sets the function to persist state to storage
|
|
181
|
+
* @param fn - Function that saves state by identifier
|
|
182
|
+
* @returns A new StatefulProcessManagerBuilder instance with the saveState function set
|
|
183
|
+
*/
|
|
184
|
+
saveState(fn) {
|
|
185
|
+
const builder = this.clone();
|
|
186
|
+
builder._saveStateFn = fn;
|
|
187
|
+
debugBuilder('[stateful-process-manager:%s] Set saveState function', this._name ?? 'unnamed');
|
|
188
|
+
return builder;
|
|
189
|
+
}
|
|
190
|
+
/**
|
|
191
|
+
* Terminal method that creates the stateful process manager
|
|
192
|
+
*
|
|
193
|
+
* Validates that all required configuration is set and returns an object
|
|
194
|
+
* with three properties:
|
|
195
|
+
* - processorId: The stateful process manager identifier
|
|
196
|
+
* - canHandle: Array of event types to filter events
|
|
197
|
+
* - eachBatch: Function that validates context, loads state for each event,
|
|
198
|
+
* processes it through the handler, and saves the updated state
|
|
199
|
+
*
|
|
200
|
+
* @param fn - Function that processes individual events with their state and returns updated state
|
|
201
|
+
* @returns An object containing the stateful process manager configuration
|
|
202
|
+
* @throws Error if name, eventTypes, stateSchema, contextSchema, getStateId, loadState, or saveState are not defined
|
|
203
|
+
*/
|
|
204
|
+
handler(fn) {
|
|
205
|
+
if (!this._name ||
|
|
206
|
+
!this._eventTypes ||
|
|
207
|
+
!this._stateSchema ||
|
|
208
|
+
!this._contextSchema ||
|
|
209
|
+
!this._getStateIdFn ||
|
|
210
|
+
!this._loadStateFn ||
|
|
211
|
+
!this._saveStateFn) {
|
|
212
|
+
debugBuilder('[stateful-process-manager] ERROR: Missing required properties');
|
|
213
|
+
throw new Error('Stateful process manager must have all configuration methods called');
|
|
214
|
+
}
|
|
215
|
+
const name = this._name;
|
|
216
|
+
const eventTypes = this._eventTypes;
|
|
217
|
+
const stateSchema = this._stateSchema;
|
|
218
|
+
const contextSchema = this._contextSchema;
|
|
219
|
+
const getStateIdFn = this._getStateIdFn;
|
|
220
|
+
const loadStateFn = this._loadStateFn;
|
|
221
|
+
const saveStateFn = this._saveStateFn;
|
|
222
|
+
debugBuilder('[stateful-process-manager:%s] Building handler for event types: %o', name, eventTypes);
|
|
223
|
+
return {
|
|
224
|
+
processorId: name,
|
|
225
|
+
canHandle: eventTypes,
|
|
226
|
+
eachBatch: async (events, context) => {
|
|
227
|
+
debugBuilder('[stateful-process-manager:%s] Validating context', name);
|
|
228
|
+
const validatedContext = contextSchema.parse(context);
|
|
229
|
+
debugBuilder('[stateful-process-manager:%s] Processing batch of %d events', name, events.length);
|
|
230
|
+
for (const event of events) {
|
|
231
|
+
const stateId = getStateIdFn(event);
|
|
232
|
+
debugBuilder('[stateful-process-manager:%s] Processing event with stateId: %s', name, stateId);
|
|
233
|
+
// Load state
|
|
234
|
+
debugBuilder('[stateful-process-manager:%s] Loading state for: %s', name, stateId);
|
|
235
|
+
const state = await loadStateFn(stateId, validatedContext);
|
|
236
|
+
const validatedState = state ? stateSchema.parse(state) : null;
|
|
237
|
+
debugBuilder('[stateful-process-manager:%s] State loaded: %s', name, validatedState ? 'existing state' : 'no existing state');
|
|
238
|
+
// Handle event
|
|
239
|
+
debugBuilder('[stateful-process-manager:%s] Handling event', name);
|
|
240
|
+
const newState = await fn(event, validatedState, validatedContext);
|
|
241
|
+
const validatedNewState = stateSchema.parse(newState);
|
|
242
|
+
debugBuilder('[stateful-process-manager:%s] Event handled, new state computed', name);
|
|
243
|
+
// Save state
|
|
244
|
+
debugBuilder('[stateful-process-manager:%s] Saving state for: %s', name, stateId);
|
|
245
|
+
await saveStateFn(stateId, validatedNewState, validatedContext);
|
|
246
|
+
debugBuilder('[stateful-process-manager:%s] State saved successfully', name);
|
|
247
|
+
}
|
|
248
|
+
debugBuilder('[stateful-process-manager:%s] Batch processed successfully', name);
|
|
249
|
+
},
|
|
250
|
+
};
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* Factory function to create a new StatefulProcessManagerBuilder
|
|
255
|
+
*
|
|
256
|
+
* @example
|
|
257
|
+
* ```typescript
|
|
258
|
+
* const builder = defineStatefulProcessManager<MyEvent, MyState>()
|
|
259
|
+
* .name('my-stateful-process-manager')
|
|
260
|
+
* .eventTypes(['EventTypeA', 'EventTypeB'])
|
|
261
|
+
* .stateSchema(myStateSchema)
|
|
262
|
+
* .contextSchema(myContextSchema)
|
|
263
|
+
* .getStateId(event => `state-${event.data.id}`)
|
|
264
|
+
* .loadState(async (stateId, context) => {
|
|
265
|
+
* return await context.repo.findById(stateId);
|
|
266
|
+
* })
|
|
267
|
+
* .saveState(async (stateId, state, context) => {
|
|
268
|
+
* await context.repo.upsert({ id: stateId, ...state });
|
|
269
|
+
* })
|
|
270
|
+
* .handler(async (event, state, context) => {
|
|
271
|
+
* // Process event and return updated state
|
|
272
|
+
* return { ...state, updated: true };
|
|
273
|
+
* });
|
|
274
|
+
* ```
|
|
275
|
+
*/
|
|
276
|
+
export function defineStatefulProcessManager() {
|
|
277
|
+
debugBuilder('[stateful-process-manager] Creating new stateful process manager builder');
|
|
278
|
+
return new StatefulProcessManagerBuilder();
|
|
279
|
+
}
|
|
280
|
+
//# sourceMappingURL=stateful-process-manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stateful-process-manager.js","sourceRoot":"","sources":["../../src/builders/stateful-process-manager.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAQ3C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuEG;AACH,MAAM,6BAA6B;IACzB,KAAK,CAAU;IACf,WAAW,CAAuB;IAClC,YAAY,CAAoB;IAChC,cAAc,CAAsB;IACpC,aAAa,CAAgC;IAC7C,YAAY,CAAgE;IAC5E,YAAY,CAAsE;IAClF,UAAU,CAA+E;IAEjG;;;OAGG;IACK,KAAK;QACX,MAAM,OAAO,GAAG,IAAI,6BAA6B,EAA6B,CAAC;QAC/E,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QAC3B,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACvC,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;QACzC,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC;QAC7C,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;QAC3C,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;QACzC,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;QACzC,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC;QACrC,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;;OAIG;IACH,IAAI,CAAC,IAAY;QACf,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QAC7B,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC;QACrB,YAAY,CAAC,yCAAyC,EAAE,IAAI,CAAC,CAAC;QAC9D,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;;OAIG;IACH,UAAU,CAAC,KAA0B;QACnC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QAC7B,OAAO,CAAC,WAAW,GAAG,KAAK,CAAC;QAC5B,YAAY,CAAC,mDAAmD,EAAE,IAAI,CAAC,KAAK,IAAI,SAAS,EAAE,KAAK,CAAC,CAAC;QAClG,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;;OAIG;IACH,WAAW,CAAY,MAA4B;QACjD,MAAM,OAAO,GAAG,IAAI,6BAA6B,EAAiC,CAAC;QACnF,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QAC3B,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACvC,OAAO,CAAC,YAAY,GAAG,MAAM,CAAC;QAC9B,OAAO,CAAC,cAAc,GAAG,IAAI,CAAC,cAAc,CAAC;QAC7C,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,aAA2D,CAAC;QACzF,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,YAEf,CAAC;QACd,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,YAEf,CAAC;QACd,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,UAEb,CAAC;QACd,YAAY,CAAC,gDAAgD,EAAE,IAAI,CAAC,KAAK,IAAI,SAAS,CAAC,CAAC;QACxF,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;;OAIG;IACH,aAAa,CACX,MAA8B;QAE9B,MAAM,OAAO,GAAG,IAAI,6BAA6B,EAAiC,CAAC;QACnF,OAAO,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QAC3B,OAAO,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACvC,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;QACzC,OAAO,CAAC,cAAc,GAAG,MAAM,CAAC;QAChC,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,aAAa,CAAC;QAC3C,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,YAEf,CAAC;QACd,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC,YAEf,CAAC;QACd,OAAO,CAAC,UAAU,GAAG,IAAI,CAAC,UAEb,CAAC;QACd,YAAY,CAAC,kDAAkD,EAAE,IAAI,CAAC,KAAK,IAAI,SAAS,CAAC,CAAC;QAC1F,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;;OAIG;IACH,UAAU,CAAC,EAAgC;QACzC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QAC7B,OAAO,CAAC,aAAa,GAAG,EAAE,CAAC;QAC3B,YAAY,CAAC,uDAAuD,EAAE,IAAI,CAAC,KAAK,IAAI,SAAS,CAAC,CAAC;QAC/F,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;;OAIG;IACH,SAAS,CACP,EAAgE;QAEhE,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QAC7B,OAAO,CAAC,YAAY,GAAG,EAAE,CAAC;QAC1B,YAAY,CAAC,sDAAsD,EAAE,IAAI,CAAC,KAAK,IAAI,SAAS,CAAC,CAAC;QAC9F,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;;OAIG;IACH,SAAS,CACP,EAAsE;QAEtE,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;QAC7B,OAAO,CAAC,YAAY,GAAG,EAAE,CAAC;QAC1B,YAAY,CAAC,sDAAsD,EAAE,IAAI,CAAC,KAAK,IAAI,SAAS,CAAC,CAAC;QAC9F,OAAO,OAAO,CAAC;IACjB,CAAC;IAED;;;;;;;;;;;;;OAaG;IACH,OAAO,CAAC,EAA+E;QAKrF,IACE,CAAC,IAAI,CAAC,KAAK;YACX,CAAC,IAAI,CAAC,WAAW;YACjB,CAAC,IAAI,CAAC,YAAY;YAClB,CAAC,IAAI,CAAC,cAAc;YACpB,CAAC,IAAI,CAAC,aAAa;YACnB,CAAC,IAAI,CAAC,YAAY;YAClB,CAAC,IAAI,CAAC,YAAY,EAClB,CAAC;YACD,YAAY,CAAC,+DAA+D,CAAC,CAAC;YAC9E,MAAM,IAAI,KAAK,CAAC,qEAAqE,CAAC,CAAC;QACzF,CAAC;QAED,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC;QACxB,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC;QACpC,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC;QACtC,MAAM,aAAa,GAAG,IAAI,CAAC,cAAc,CAAC;QAC1C,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,CAAC;QACxC,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC;QACtC,MAAM,WAAW,GAAG,IAAI,CAAC,YAAY,CAAC;QAEtC,YAAY,CAAC,oEAAoE,EAAE,IAAI,EAAE,UAAU,CAAC,CAAC;QAErG,OAAO;YACL,WAAW,EAAE,IAAI;YACjB,SAAS,EAAE,UAAU;YACrB,SAAS,EAAE,KAAK,EAAE,MAAmB,EAAE,OAAgB,EAAE,EAAE;gBACzD,YAAY,CAAC,kDAAkD,EAAE,IAAI,CAAC,CAAC;gBACvE,MAAM,gBAAgB,GAAG,aAAa,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;gBACtD,YAAY,CAAC,6DAA6D,EAAE,IAAI,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC;gBAEjG,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE,CAAC;oBAC3B,MAAM,OAAO,GAAG,YAAY,CAAC,KAAK,CAAC,CAAC;oBACpC,YAAY,CAAC,iEAAiE,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;oBAE/F,aAAa;oBACb,YAAY,CAAC,qDAAqD,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;oBACnF,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,OAAO,EAAE,gBAAgB,CAAC,CAAC;oBAC3D,MAAM,cAAc,GAAG,KAAK,CAAC,CAAC,CAAC,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;oBAC/D,YAAY,CACV,gDAAgD,EAChD,IAAI,EACJ,cAAc,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC,CAAC,mBAAmB,CACxD,CAAC;oBAEF,eAAe;oBACf,YAAY,CAAC,8CAA8C,EAAE,IAAI,CAAC,CAAC;oBACnE,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,KAAK,EAAE,cAAc,EAAE,gBAAgB,CAAC,CAAC;oBACnE,MAAM,iBAAiB,GAAG,WAAW,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;oBACtD,YAAY,CAAC,iEAAiE,EAAE,IAAI,CAAC,CAAC;oBAEtF,aAAa;oBACb,YAAY,CAAC,oDAAoD,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC;oBAClF,MAAM,WAAW,CAAC,OAAO,EAAE,iBAAiB,EAAE,gBAAgB,CAAC,CAAC;oBAChE,YAAY,CAAC,wDAAwD,EAAE,IAAI,CAAC,CAAC;gBAC/E,CAAC;gBAED,YAAY,CAAC,4DAA4D,EAAE,IAAI,CAAC,CAAC;YACnF,CAAC;SACF,CAAC;IACJ,CAAC;CACF;AAED;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,MAAM,UAAU,4BAA4B;IAI1C,YAAY,CAAC,0EAA0E,CAAC,CAAC;IACzF,OAAO,IAAI,6BAA6B,EAA2B,CAAC;AACtE,CAAC"}
|
package/dist/bus.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bus.d.ts","sourceRoot":"","sources":["../src/bus.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAEhE,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC"}
|
package/dist/bus.js
ADDED
package/dist/bus.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bus.js","sourceRoot":"","sources":["../src/bus.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,yBAAyB,CAAC"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import type { Command, CommandHandlerResult, CommandHandlerRetryOptions, Decider, DefaultCommandMetadata, DefaultRecord, Event, EventStore, HandleOptions } from '@event-driven-io/emmett';
|
|
2
|
+
import type { z, ZodType, ZodTypeAny } from '@arki/contracts';
|
|
3
|
+
type BuildCommand<CommandType extends string, Data extends DefaultRecord, Metadata extends DefaultCommandMetadata | undefined> = Command<CommandType, Data, Metadata extends undefined ? undefined : Metadata>;
|
|
4
|
+
type HandlerMetadata<Metadata> = Metadata extends undefined ? undefined : Metadata;
|
|
5
|
+
type MetadataInput<Metadata> = Metadata extends undefined ? {
|
|
6
|
+
metadata?: undefined;
|
|
7
|
+
} : {
|
|
8
|
+
metadata: Metadata;
|
|
9
|
+
};
|
|
10
|
+
type StreamResolver<Context, CommandType> = (params: {
|
|
11
|
+
command: CommandType;
|
|
12
|
+
context: Context;
|
|
13
|
+
}) => string;
|
|
14
|
+
export type CommandFlowExecuteOptions<Context, Store extends EventStore, Input extends DefaultRecord, Metadata extends DefaultCommandMetadata | undefined> = {
|
|
15
|
+
context: Context;
|
|
16
|
+
eventStore: Store;
|
|
17
|
+
input: Input;
|
|
18
|
+
streamId?: string;
|
|
19
|
+
handleOptions?: HandleOptions<Store>;
|
|
20
|
+
} & MetadataInput<Metadata>;
|
|
21
|
+
export type CommandFlowHandlerArgs<Context, Store extends EventStore, CommandType, Input extends DefaultRecord, Metadata extends DefaultCommandMetadata | undefined, State, StreamEvent extends Event> = {
|
|
22
|
+
command: CommandType;
|
|
23
|
+
context: Context;
|
|
24
|
+
eventStore: Store;
|
|
25
|
+
input: Input;
|
|
26
|
+
metadata: HandlerMetadata<Metadata>;
|
|
27
|
+
streamId?: string;
|
|
28
|
+
handleOptions?: HandleOptions<Store>;
|
|
29
|
+
run: (streamId: string, options?: {
|
|
30
|
+
handleOptions?: HandleOptions<Store>;
|
|
31
|
+
}) => Promise<CommandHandlerResult<State, StreamEvent, Store>>;
|
|
32
|
+
};
|
|
33
|
+
export type CommandFlowHandler<Context, Store extends EventStore, CommandType, Input extends DefaultRecord, Metadata extends DefaultCommandMetadata | undefined, State, StreamEvent extends Event, ReturnType> = (args: CommandFlowHandlerArgs<Context, Store, CommandType, Input, Metadata, State, StreamEvent>) => Promise<ReturnType> | ReturnType;
|
|
34
|
+
type CommandFlowExecutor<Context, Store extends EventStore, Input extends DefaultRecord, Metadata extends DefaultCommandMetadata | undefined, ReturnType> = (options: CommandFlowExecuteOptions<Context, Store, Input, Metadata>) => Promise<ReturnType>;
|
|
35
|
+
export type CommandFlow<Context, Store extends EventStore, CommandType extends string, Input extends DefaultRecord, Metadata extends DefaultCommandMetadata | undefined, State, StreamEvent extends Event, ReturnType> = CommandFlowExecutor<Context, Store, Input, Metadata, ReturnType> & {
|
|
36
|
+
readonly commandType: CommandType;
|
|
37
|
+
readonly schemas: {
|
|
38
|
+
input: ZodTypeAny;
|
|
39
|
+
metadata?: ZodTypeAny;
|
|
40
|
+
event: ZodTypeAny;
|
|
41
|
+
state?: ZodTypeAny;
|
|
42
|
+
};
|
|
43
|
+
readonly decider: Decider<State, BuildCommand<CommandType, Input, Metadata>, StreamEvent>;
|
|
44
|
+
readonly createCommand: (input: Input, metadata?: HandlerMetadata<Metadata>) => BuildCommand<CommandType, Input, Metadata>;
|
|
45
|
+
readonly runCommand: (options: {
|
|
46
|
+
eventStore: Store;
|
|
47
|
+
command: BuildCommand<CommandType, Input, Metadata>;
|
|
48
|
+
streamId: string;
|
|
49
|
+
handleOptions?: HandleOptions<Store>;
|
|
50
|
+
}) => Promise<CommandHandlerResult<State, StreamEvent, Store>>;
|
|
51
|
+
readonly resolveStreamId?: StreamResolver<Context, BuildCommand<CommandType, Input, Metadata>>;
|
|
52
|
+
};
|
|
53
|
+
export declare class CommandFlowBuilder<Context, Store extends EventStore, CommandType extends string, Input extends DefaultRecord = DefaultRecord, Metadata extends DefaultCommandMetadata | undefined = undefined, State = unknown, StreamEvent extends Event = Event> {
|
|
54
|
+
private readonly commandType;
|
|
55
|
+
private inputSchema?;
|
|
56
|
+
private metadataSchema?;
|
|
57
|
+
private eventSchema?;
|
|
58
|
+
private stateSchema?;
|
|
59
|
+
private currentDecider?;
|
|
60
|
+
private streamResolver?;
|
|
61
|
+
private mapToStreamId?;
|
|
62
|
+
private retryOptions?;
|
|
63
|
+
constructor(commandType: CommandType);
|
|
64
|
+
input<Schema extends ZodType<DefaultRecord>>(schema: Schema): CommandFlowBuilder<Context, Store, CommandType, z.infer<Schema>, Metadata, State, StreamEvent>;
|
|
65
|
+
metadata<Schema extends ZodType<DefaultCommandMetadata>>(schema: Schema): CommandFlowBuilder<Context, Store, CommandType, Input, z.infer<Schema>, State, StreamEvent>;
|
|
66
|
+
events<Schema extends ZodType<Event>>(schema: Schema): CommandFlowBuilder<Context, Store, CommandType, Input, Metadata, State, z.infer<Schema>>;
|
|
67
|
+
state<Schema extends ZodType>(schema: Schema): CommandFlowBuilder<Context, Store, CommandType, Input, Metadata, z.infer<Schema>, StreamEvent>;
|
|
68
|
+
decider<NextState>(decider: Decider<NextState, BuildCommand<CommandType, Input, Metadata>, StreamEvent>): CommandFlowBuilder<Context, Store, CommandType, Input, Metadata, NextState, StreamEvent>;
|
|
69
|
+
stream(resolver: StreamResolver<Context, BuildCommand<CommandType, Input, Metadata>>): this;
|
|
70
|
+
mapStreamId(mapper: (id: string) => string): this;
|
|
71
|
+
retry(options: CommandHandlerRetryOptions): this;
|
|
72
|
+
handler<ReturnType = CommandHandlerResult<State, StreamEvent, Store>>(handler?: CommandFlowHandler<Context, Store, BuildCommand<CommandType, Input, Metadata>, Input, Metadata, State, StreamEvent, ReturnType>): CommandFlow<Context, Store, CommandType, Input, Metadata, State, StreamEvent, ReturnType>;
|
|
73
|
+
private ensureInputSchema;
|
|
74
|
+
private ensureEventSchema;
|
|
75
|
+
private ensureDecider;
|
|
76
|
+
}
|
|
77
|
+
type Toolkit<Context, Store extends EventStore> = {
|
|
78
|
+
command<CommandType extends string>(commandType: CommandType): CommandFlowBuilder<Context, Store, CommandType, DefaultRecord, undefined, unknown, Event>;
|
|
79
|
+
};
|
|
80
|
+
export declare const es: {
|
|
81
|
+
$context<Context, Store extends EventStore = EventStore<import("@event-driven-io/emmett").AnyRecordedMessageMetadata>>(): Toolkit<Context, Store>;
|
|
82
|
+
};
|
|
83
|
+
export declare const eventSourcing: {
|
|
84
|
+
$context<Context, Store extends EventStore = EventStore<import("@event-driven-io/emmett").AnyRecordedMessageMetadata>>(): Toolkit<Context, Store>;
|
|
85
|
+
};
|
|
86
|
+
export {};
|
|
87
|
+
//# sourceMappingURL=command-flow.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-flow.d.ts","sourceRoot":"","sources":["../src/command-flow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,233 @@
|
|
|
1
|
+
import { DeciderCommandHandler } from '@event-driven-io/emmett';
|
|
2
|
+
import { debugCommand } from './debug.js';
|
|
3
|
+
export class CommandFlowBuilder {
|
|
4
|
+
commandType;
|
|
5
|
+
inputSchema;
|
|
6
|
+
metadataSchema;
|
|
7
|
+
eventSchema;
|
|
8
|
+
stateSchema;
|
|
9
|
+
currentDecider;
|
|
10
|
+
streamResolver;
|
|
11
|
+
mapToStreamId;
|
|
12
|
+
retryOptions;
|
|
13
|
+
constructor(commandType) {
|
|
14
|
+
this.commandType = commandType;
|
|
15
|
+
debugCommand('Creating command flow builder for command: %s', commandType);
|
|
16
|
+
}
|
|
17
|
+
input(schema) {
|
|
18
|
+
this.inputSchema = schema;
|
|
19
|
+
debugCommand('[%s] Registered input schema', this.commandType);
|
|
20
|
+
return this;
|
|
21
|
+
}
|
|
22
|
+
metadata(schema) {
|
|
23
|
+
this.metadataSchema = schema;
|
|
24
|
+
debugCommand('[%s] Registered metadata schema', this.commandType);
|
|
25
|
+
return this;
|
|
26
|
+
}
|
|
27
|
+
events(schema) {
|
|
28
|
+
this.eventSchema = schema;
|
|
29
|
+
debugCommand('[%s] Registered event schema', this.commandType);
|
|
30
|
+
return this;
|
|
31
|
+
}
|
|
32
|
+
state(schema) {
|
|
33
|
+
this.stateSchema = schema;
|
|
34
|
+
debugCommand('[%s] Registered state schema', this.commandType);
|
|
35
|
+
return this;
|
|
36
|
+
}
|
|
37
|
+
decider(decider) {
|
|
38
|
+
this.currentDecider = decider;
|
|
39
|
+
debugCommand('[%s] Registered decider', this.commandType);
|
|
40
|
+
return this;
|
|
41
|
+
}
|
|
42
|
+
stream(resolver) {
|
|
43
|
+
this.streamResolver = resolver;
|
|
44
|
+
debugCommand('[%s] Registered stream resolver', this.commandType);
|
|
45
|
+
return this;
|
|
46
|
+
}
|
|
47
|
+
mapStreamId(mapper) {
|
|
48
|
+
this.mapToStreamId = mapper;
|
|
49
|
+
debugCommand('[%s] Registered stream ID mapper', this.commandType);
|
|
50
|
+
return this;
|
|
51
|
+
}
|
|
52
|
+
retry(options) {
|
|
53
|
+
this.retryOptions = options;
|
|
54
|
+
debugCommand('[%s] Configured retry options', this.commandType);
|
|
55
|
+
return this;
|
|
56
|
+
}
|
|
57
|
+
handler(handler) {
|
|
58
|
+
const inputSchema = this.ensureInputSchema();
|
|
59
|
+
const eventSchema = this.ensureEventSchema();
|
|
60
|
+
const metadataSchema = this.metadataSchema;
|
|
61
|
+
const stateSchema = this.stateSchema;
|
|
62
|
+
const decider = this.ensureDecider();
|
|
63
|
+
const streamResolver = this.streamResolver;
|
|
64
|
+
const mapToStreamId = this.mapToStreamId;
|
|
65
|
+
const retryOptions = this.retryOptions;
|
|
66
|
+
const validatedDecider = {
|
|
67
|
+
decide: (command, state) => {
|
|
68
|
+
const safeState = stateSchema ? stateSchema.parse(state) : state;
|
|
69
|
+
const result = decider.decide(command, safeState);
|
|
70
|
+
const events = Array.isArray(result) ? result : [result];
|
|
71
|
+
const parsed = events.map(evt => eventSchema.parse(evt));
|
|
72
|
+
return Array.isArray(result) ? parsed : parsed[0];
|
|
73
|
+
},
|
|
74
|
+
evolve: (state, event) => {
|
|
75
|
+
const parsedEvent = eventSchema.parse(event);
|
|
76
|
+
const nextState = decider.evolve(state, parsedEvent);
|
|
77
|
+
return stateSchema ? stateSchema.parse(nextState) : nextState;
|
|
78
|
+
},
|
|
79
|
+
initialState: () => {
|
|
80
|
+
const initial = decider.initialState();
|
|
81
|
+
return stateSchema ? stateSchema.parse(initial) : initial;
|
|
82
|
+
},
|
|
83
|
+
};
|
|
84
|
+
const runner = DeciderCommandHandler({
|
|
85
|
+
decide: validatedDecider.decide,
|
|
86
|
+
evolve: validatedDecider.evolve,
|
|
87
|
+
initialState: validatedDecider.initialState,
|
|
88
|
+
mapToStreamId,
|
|
89
|
+
retry: retryOptions,
|
|
90
|
+
});
|
|
91
|
+
const defaultHandler = async ({ command, context, run, streamId, handleOptions }) => {
|
|
92
|
+
if (!streamResolver && !streamId) {
|
|
93
|
+
debugCommand('[%s] ERROR: No stream resolver or streamId provided', this.commandType);
|
|
94
|
+
throw new Error(`No stream resolver provided for command "${this.commandType}". Call .stream(...) or provide streamId.`);
|
|
95
|
+
}
|
|
96
|
+
debugCommand('[%s] Resolving stream ID', this.commandType);
|
|
97
|
+
const resolvedStream = streamId ?? streamResolver?.({ command, context });
|
|
98
|
+
if (!resolvedStream) {
|
|
99
|
+
debugCommand('[%s] ERROR: Failed to resolve stream ID', this.commandType);
|
|
100
|
+
throw new Error(`Unable to resolve stream id for command "${this.commandType}". Provide a streamId when executing.`);
|
|
101
|
+
}
|
|
102
|
+
debugCommand('[%s] Stream resolved to: %s', this.commandType, resolvedStream);
|
|
103
|
+
return run(resolvedStream, { handleOptions });
|
|
104
|
+
};
|
|
105
|
+
const finalHandler = (handler ?? defaultHandler);
|
|
106
|
+
const flowExecutor = async (options) => {
|
|
107
|
+
const { context, eventStore, input, streamId, handleOptions } = options;
|
|
108
|
+
const metadataOption = options;
|
|
109
|
+
debugCommand('[%s] Executing command flow with input: %O', this.commandType, input);
|
|
110
|
+
const parsedInput = inputSchema.parse(input);
|
|
111
|
+
debugCommand('[%s] Input validation passed', this.commandType);
|
|
112
|
+
let parsedMetadata;
|
|
113
|
+
if (metadataSchema) {
|
|
114
|
+
if (!('metadata' in metadataOption)) {
|
|
115
|
+
debugCommand('[%s] ERROR: Metadata expected but not provided', this.commandType);
|
|
116
|
+
throw new Error(`Metadata expected for command "${this.commandType}" but none was provided.`);
|
|
117
|
+
}
|
|
118
|
+
const metadataValue = metadataOption.metadata;
|
|
119
|
+
parsedMetadata = metadataSchema.parse(metadataValue);
|
|
120
|
+
debugCommand('[%s] Metadata validation passed', this.commandType);
|
|
121
|
+
}
|
|
122
|
+
else {
|
|
123
|
+
parsedMetadata = undefined;
|
|
124
|
+
}
|
|
125
|
+
const command = (metadataSchema
|
|
126
|
+
? {
|
|
127
|
+
type: this.commandType,
|
|
128
|
+
data: parsedInput,
|
|
129
|
+
metadata: parsedMetadata,
|
|
130
|
+
kind: 'Command',
|
|
131
|
+
}
|
|
132
|
+
: {
|
|
133
|
+
type: this.commandType,
|
|
134
|
+
data: parsedInput,
|
|
135
|
+
kind: 'Command',
|
|
136
|
+
});
|
|
137
|
+
debugCommand('[%s] Command created successfully', this.commandType);
|
|
138
|
+
const run = (resolvedStreamId, runOptions) => {
|
|
139
|
+
debugCommand('[%s] Running command on stream: %s', this.commandType, resolvedStreamId);
|
|
140
|
+
return runner(eventStore, resolvedStreamId, command, runOptions?.handleOptions ?? handleOptions);
|
|
141
|
+
};
|
|
142
|
+
const result = await finalHandler({
|
|
143
|
+
command,
|
|
144
|
+
context,
|
|
145
|
+
eventStore,
|
|
146
|
+
input: parsedInput,
|
|
147
|
+
metadata: parsedMetadata,
|
|
148
|
+
streamId,
|
|
149
|
+
handleOptions,
|
|
150
|
+
run,
|
|
151
|
+
});
|
|
152
|
+
debugCommand('[%s] Command execution completed successfully', this.commandType);
|
|
153
|
+
return result;
|
|
154
|
+
};
|
|
155
|
+
const createCommand = (input, metadataValue) => {
|
|
156
|
+
const parsedInput = inputSchema.parse(input);
|
|
157
|
+
if (metadataSchema) {
|
|
158
|
+
if (metadataValue === undefined) {
|
|
159
|
+
throw new Error(`Metadata expected for command "${this.commandType}" but none was provided.`);
|
|
160
|
+
}
|
|
161
|
+
const parsedMetadata = metadataSchema.parse(metadataValue);
|
|
162
|
+
return {
|
|
163
|
+
type: this.commandType,
|
|
164
|
+
data: parsedInput,
|
|
165
|
+
metadata: parsedMetadata,
|
|
166
|
+
kind: 'Command',
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
if (metadataValue !== undefined) {
|
|
170
|
+
throw new Error(`Metadata value provided for command "${this.commandType}" without metadata schema. Add .metadata(...) to the builder.`);
|
|
171
|
+
}
|
|
172
|
+
return {
|
|
173
|
+
type: this.commandType,
|
|
174
|
+
data: parsedInput,
|
|
175
|
+
kind: 'Command',
|
|
176
|
+
};
|
|
177
|
+
};
|
|
178
|
+
const schemas = {
|
|
179
|
+
input: inputSchema,
|
|
180
|
+
...(metadataSchema ? { metadata: metadataSchema } : {}),
|
|
181
|
+
event: eventSchema,
|
|
182
|
+
...(stateSchema ? { state: stateSchema } : {}),
|
|
183
|
+
};
|
|
184
|
+
const runCommand = ({ eventStore, command, streamId, handleOptions, }) => {
|
|
185
|
+
if (!streamId) {
|
|
186
|
+
throw new Error(`Missing streamId when running command "${this.commandType}".`);
|
|
187
|
+
}
|
|
188
|
+
return runner(eventStore, streamId, command, handleOptions);
|
|
189
|
+
};
|
|
190
|
+
const flow = Object.assign(flowExecutor, {
|
|
191
|
+
commandType: this.commandType,
|
|
192
|
+
schemas,
|
|
193
|
+
decider: validatedDecider,
|
|
194
|
+
createCommand,
|
|
195
|
+
runCommand,
|
|
196
|
+
});
|
|
197
|
+
if (streamResolver) {
|
|
198
|
+
Object.assign(flow, {
|
|
199
|
+
resolveStreamId: (resolverParams) => streamResolver(resolverParams),
|
|
200
|
+
});
|
|
201
|
+
}
|
|
202
|
+
debugCommand('[%s] Command flow built successfully', this.commandType);
|
|
203
|
+
return flow;
|
|
204
|
+
}
|
|
205
|
+
ensureInputSchema() {
|
|
206
|
+
if (!this.inputSchema) {
|
|
207
|
+
throw new Error(`Command "${this.commandType}" is missing an input schema. Call .input(...) before defining the handler.`);
|
|
208
|
+
}
|
|
209
|
+
return this.inputSchema;
|
|
210
|
+
}
|
|
211
|
+
ensureEventSchema() {
|
|
212
|
+
if (!this.eventSchema) {
|
|
213
|
+
throw new Error(`Command "${this.commandType}" is missing an event schema. Call .events(...) before defining the handler.`);
|
|
214
|
+
}
|
|
215
|
+
return this.eventSchema;
|
|
216
|
+
}
|
|
217
|
+
ensureDecider() {
|
|
218
|
+
if (!this.currentDecider) {
|
|
219
|
+
throw new Error(`Command "${this.commandType}" is missing a decider definition. Call .decider(...) before defining the handler.`);
|
|
220
|
+
}
|
|
221
|
+
return this.currentDecider;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
const createToolkit = () => ({
|
|
225
|
+
command: commandType => new CommandFlowBuilder(commandType),
|
|
226
|
+
});
|
|
227
|
+
export const es = {
|
|
228
|
+
$context() {
|
|
229
|
+
return createToolkit();
|
|
230
|
+
},
|
|
231
|
+
};
|
|
232
|
+
export const eventSourcing = es;
|
|
233
|
+
//# sourceMappingURL=command-flow.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"command-flow.js","sourceRoot":"","sources":["../src/command-flow.ts"],"names":[],"mappings":"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"}
|