effect-cqrs 0.1.0 → 0.2.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/README.md +34 -6
- package/dist/Aggregate.d.ts +47 -6
- package/dist/Aggregate.d.ts.map +1 -1
- package/dist/Aggregate.js +45 -1
- package/dist/Aggregate.js.map +1 -1
- package/dist/AggregateService.d.ts +83 -11
- package/dist/AggregateService.d.ts.map +1 -1
- package/dist/AggregateService.js +261 -35
- package/dist/AggregateService.js.map +1 -1
- package/dist/Causation.d.ts +34 -0
- package/dist/Causation.d.ts.map +1 -0
- package/dist/Causation.js +32 -0
- package/dist/Causation.js.map +1 -0
- package/dist/EventStore.d.ts +22 -0
- package/dist/EventStore.d.ts.map +1 -1
- package/dist/EventStore.js +30 -10
- package/dist/EventStore.js.map +1 -1
- package/dist/EventVersions.d.ts +64 -0
- package/dist/EventVersions.d.ts.map +1 -0
- package/dist/EventVersions.js +55 -0
- package/dist/EventVersions.js.map +1 -0
- package/dist/Fixture.d.ts +40 -5
- package/dist/Fixture.d.ts.map +1 -1
- package/dist/Fixture.js +44 -3
- package/dist/Fixture.js.map +1 -1
- package/dist/Metadata.d.ts +42 -0
- package/dist/Metadata.d.ts.map +1 -0
- package/dist/Metadata.js +39 -0
- package/dist/Metadata.js.map +1 -0
- package/dist/PostgresEventStore.d.ts.map +1 -1
- package/dist/PostgresEventStore.js +22 -13
- package/dist/PostgresEventStore.js.map +1 -1
- package/dist/Saga.d.ts +105 -0
- package/dist/Saga.d.ts.map +1 -0
- package/dist/Saga.js +97 -0
- package/dist/Saga.js.map +1 -0
- package/dist/SqliteEventStore.d.ts.map +1 -1
- package/dist/SqliteEventStore.js +32 -13
- package/dist/SqliteEventStore.js.map +1 -1
- package/dist/ViewModel.d.ts.map +1 -1
- package/dist/ViewModel.js +3 -1
- package/dist/ViewModel.js.map +1 -1
- package/dist/index.d.ts +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/package.json +5 -3
- package/src/Aggregate.ts +81 -9
- package/src/AggregateService.ts +418 -55
- package/src/Causation.ts +48 -0
- package/src/EventStore.ts +47 -10
- package/src/EventVersions.ts +104 -0
- package/src/Fixture.ts +92 -7
- package/src/Metadata.ts +52 -0
- package/src/PostgresEventStore.ts +24 -13
- package/src/Saga.ts +176 -0
- package/src/SqliteEventStore.ts +43 -13
- package/src/ViewModel.ts +3 -1
- package/src/index.ts +4 -0
package/dist/AggregateService.js
CHANGED
|
@@ -2,9 +2,13 @@
|
|
|
2
2
|
* Runs an aggregate against the {@link EventStore}: the `command`, `read-model`
|
|
3
3
|
* and `history` actions of moleculer-cqrs, as a typed service.
|
|
4
4
|
*/
|
|
5
|
-
import { Array as Arr, Effect, Schedule, Schema, Semaphore, Stream } from "effect";
|
|
5
|
+
import { Array as Arr, Cause, Context, Duration, Effect, Exit, FiberSet, Metric, Option, Predicate, Schedule, Schema, Semaphore, Stream } from "effect";
|
|
6
|
+
import { KeyValueStore } from "effect/persistence";
|
|
6
7
|
import * as Aggregate from "./Aggregate.js";
|
|
8
|
+
import { CurrentCausation } from "./Causation.js";
|
|
7
9
|
import { ConcurrencyConflict, EventStore } from "./EventStore.js";
|
|
10
|
+
import * as EventVersions from "./EventVersions.js";
|
|
11
|
+
import { CurrentMetadata, Metadata } from "./Metadata.js";
|
|
8
12
|
export class UnknownCommand extends Schema.TaggedError()("UnknownCommand", {
|
|
9
13
|
aggregateName: Schema.String,
|
|
10
14
|
type: Schema.String
|
|
@@ -16,42 +20,163 @@ export class InvalidCommand extends Schema.TaggedError()("InvalidCommand", {
|
|
|
16
20
|
message: Schema.String
|
|
17
21
|
}) {
|
|
18
22
|
}
|
|
19
|
-
/**
|
|
23
|
+
/**
|
|
24
|
+
* A stored event doesn't match the schema of its version, or was written in a
|
|
25
|
+
* version the aggregate doesn't declare. Old shapes are declared with `EventVersions`.
|
|
26
|
+
*/
|
|
20
27
|
export class EventDecodeError extends Schema.TaggedError()("EventDecodeError", {
|
|
21
28
|
aggregateName: Schema.String,
|
|
22
29
|
aggregateId: Schema.String,
|
|
23
30
|
version: Schema.Int,
|
|
24
31
|
type: Schema.String,
|
|
32
|
+
schemaVersion: Schema.Int,
|
|
25
33
|
message: Schema.String
|
|
26
34
|
}) {
|
|
27
35
|
}
|
|
28
36
|
const CommandEnvelope = Schema.Struct({
|
|
29
37
|
aggregateId: Schema.NonEmptyString,
|
|
30
38
|
type: Schema.String,
|
|
31
|
-
payload: Schema.Unknown
|
|
39
|
+
payload: Schema.Unknown,
|
|
40
|
+
/** Continues a correlation started elsewhere, see `Causation`. */
|
|
41
|
+
correlationId: Schema.optional(Schema.String),
|
|
42
|
+
causationId: Schema.optional(Schema.String),
|
|
43
|
+
/** Recorded on top of the current metadata, see `Metadata`. */
|
|
44
|
+
metadata: Schema.optional(Metadata)
|
|
32
45
|
});
|
|
33
|
-
|
|
46
|
+
const versionsOf = (aggregate) => Object.entries(aggregate.versions).flatMap(([tag, versions]) => versions === undefined ? [] : [[tag, versions]]);
|
|
47
|
+
/**
|
|
48
|
+
* Decodes a stored event with the schema of the aggregate it belongs to. An
|
|
49
|
+
* event stored in an older version is upcast to the current one on the way.
|
|
50
|
+
*/
|
|
34
51
|
export const makeEventDecoder = (aggregate) => {
|
|
35
|
-
const
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
message
|
|
42
|
-
|
|
52
|
+
const decodeCurrent = Schema.decodeUnknownEffect(Schema.toCodecJson(aggregate.events));
|
|
53
|
+
const upcasters = new Map(versionsOf(aggregate).map(([tag, versions]) => [tag, {
|
|
54
|
+
current: EventVersions.current(versions),
|
|
55
|
+
decoders: EventVersions.decoders(tag, versions).map((decoder) => Schema.decodeUnknownEffect(decoder))
|
|
56
|
+
}]));
|
|
57
|
+
return (stored) => {
|
|
58
|
+
const fail = (message) => new EventDecodeError({
|
|
59
|
+
aggregateName: stored.aggregateName,
|
|
60
|
+
aggregateId: stored.aggregateId,
|
|
61
|
+
version: stored.version,
|
|
62
|
+
type: stored.type,
|
|
63
|
+
schemaVersion: stored.schemaVersion,
|
|
64
|
+
message
|
|
65
|
+
});
|
|
66
|
+
const upcaster = upcasters.get(stored.type);
|
|
67
|
+
const current = upcaster?.current ?? 1;
|
|
68
|
+
const decode = stored.schemaVersion === current ? decodeCurrent : upcaster?.decoders[stored.schemaVersion - 1];
|
|
69
|
+
if (decode === undefined) {
|
|
70
|
+
return Effect.fail(fail(`${aggregate.name} knows ${stored.type} up to schema version ${current}`));
|
|
71
|
+
}
|
|
72
|
+
return decode(stored.payload).pipe(Effect.mapError((error) => fail(error.message)));
|
|
73
|
+
};
|
|
43
74
|
};
|
|
44
|
-
/** Encodes events into the JSON form the store keeps. */
|
|
75
|
+
/** Encodes events into the JSON form the store keeps, in the current version of their schema. */
|
|
45
76
|
export const makeEventEncoder = (aggregate) => {
|
|
46
77
|
const encode = Schema.encodeUnknownEffect(Schema.toCodecJson(aggregate.events));
|
|
78
|
+
const versions = new Map(versionsOf(aggregate).map(([tag, versions]) => [tag, EventVersions.current(versions)]));
|
|
47
79
|
return (event) => encode(event).pipe(
|
|
48
80
|
// Events come from the aggregate's own handlers, so this is a programming error.
|
|
49
|
-
Effect.orDie, Effect.map((payload) => ({
|
|
81
|
+
Effect.orDie, Effect.map((payload) => ({
|
|
82
|
+
type: event._tag,
|
|
83
|
+
payload: payload,
|
|
84
|
+
schemaVersion: versions.get(event._tag) ?? 1
|
|
85
|
+
})));
|
|
86
|
+
};
|
|
87
|
+
/**
|
|
88
|
+
* The names of the metrics every aggregate service records through Effect's
|
|
89
|
+
* `Metric` module. Each series carries an `aggregate` attribute with the
|
|
90
|
+
* aggregate's name. Read them with `Metric.snapshot`, or send them on with an
|
|
91
|
+
* exporter such as `OtlpMetrics` from `effect/observability`.
|
|
92
|
+
*/
|
|
93
|
+
export const MetricNames = {
|
|
94
|
+
/**
|
|
95
|
+
* Timer: how long a command took, including its wait for an earlier command on
|
|
96
|
+
* the same stream, by `command` and `outcome`. The outcome is `success`, the tag
|
|
97
|
+
* of the error, `defect` or `interrupted`. A payload that doesn't decode, or a
|
|
98
|
+
* type the aggregate doesn't know, fails before this point and isn't recorded.
|
|
99
|
+
*/
|
|
100
|
+
commandDuration: "cqrs_command_duration",
|
|
101
|
+
/**
|
|
102
|
+
* Counter: where loading the current state found a state to start from, by
|
|
103
|
+
* `source`: `memory`, `snapshot`, or `replay` when it starts from the first event.
|
|
104
|
+
*/
|
|
105
|
+
stateLoads: "cqrs_state_loads_total",
|
|
106
|
+
/** Histogram: how many events a load read from the store on top of that state. */
|
|
107
|
+
eventsReplayed: "cqrs_events_replayed",
|
|
108
|
+
/** Gauge: how many states are remembered in memory. */
|
|
109
|
+
stateCacheSize: "cqrs_state_cache_size",
|
|
110
|
+
/** Counter: states dropped from memory to make room for others, see `stateCacheSize`. */
|
|
111
|
+
stateCacheEvictions: "cqrs_state_cache_evictions_total",
|
|
112
|
+
/** Counter: snapshots saved, by `result`: `success` or `failure`. */
|
|
113
|
+
snapshotSaves: "cqrs_snapshot_saves_total",
|
|
114
|
+
/** Counter: snapshots that couldn't be read, so the stream was replayed instead. */
|
|
115
|
+
snapshotReadFailures: "cqrs_snapshot_read_failures_total",
|
|
116
|
+
/** Counter: appends that lost a race with a writer in another process. Each is retried until `maxRetries` runs out. */
|
|
117
|
+
concurrencyConflicts: "cqrs_concurrency_conflicts_total"
|
|
118
|
+
};
|
|
119
|
+
/**
|
|
120
|
+
* Builds each series once with its attributes: a metric's key is cached, while
|
|
121
|
+
* `Metric.withAttributes` would compute it again on every update.
|
|
122
|
+
*/
|
|
123
|
+
const makeMetrics = (aggregateName) => {
|
|
124
|
+
const attributes = { aggregate: aggregateName };
|
|
125
|
+
const counter = (name, description, extra) => Metric.counter(name, { description, incremental: true, attributes: { ...attributes, ...extra } });
|
|
126
|
+
const loads = (source) => counter(MetricNames.stateLoads, "Where loading an aggregate found a state to start from", { source });
|
|
127
|
+
const saves = (result) => counter(MetricNames.snapshotSaves, "Snapshots saved", { result });
|
|
128
|
+
const durations = new Map();
|
|
129
|
+
return {
|
|
130
|
+
loadedFromMemory: loads("memory"),
|
|
131
|
+
loadedFromSnapshot: loads("snapshot"),
|
|
132
|
+
loadedFromReplay: loads("replay"),
|
|
133
|
+
eventsReplayed: Metric.histogram(MetricNames.eventsReplayed, {
|
|
134
|
+
description: "Events read from the store to bring a state up to date",
|
|
135
|
+
attributes,
|
|
136
|
+
boundaries: [0, 1, 5, 10, 50, 100, 500, 1000, 5000, 10000]
|
|
137
|
+
}),
|
|
138
|
+
cacheSize: Metric.gauge(MetricNames.stateCacheSize, { description: "States remembered in memory", attributes }),
|
|
139
|
+
evictions: counter(MetricNames.stateCacheEvictions, "States dropped from memory to make room"),
|
|
140
|
+
snapshotSaved: saves("success"),
|
|
141
|
+
snapshotFailed: saves("failure"),
|
|
142
|
+
snapshotReadFailures: counter(MetricNames.snapshotReadFailures, "Snapshots that couldn't be read"),
|
|
143
|
+
conflicts: counter(MetricNames.concurrencyConflicts, "Appends that lost a race with another writer"),
|
|
144
|
+
duration: (command, outcome) => {
|
|
145
|
+
let byOutcome = durations.get(command);
|
|
146
|
+
if (byOutcome === undefined)
|
|
147
|
+
durations.set(command, byOutcome = new Map());
|
|
148
|
+
let timer = byOutcome.get(outcome);
|
|
149
|
+
if (timer === undefined) {
|
|
150
|
+
timer = Metric.timer(MetricNames.commandDuration, {
|
|
151
|
+
description: "How long commands take",
|
|
152
|
+
attributes: { ...attributes, command, outcome }
|
|
153
|
+
});
|
|
154
|
+
byOutcome.set(outcome, timer);
|
|
155
|
+
}
|
|
156
|
+
return timer;
|
|
157
|
+
}
|
|
158
|
+
};
|
|
159
|
+
};
|
|
160
|
+
/** Counts one occurrence and returns `value`, in a single step rather than an effect per update. */
|
|
161
|
+
const recording = (counter, value) => Effect.contextWith((context) => {
|
|
162
|
+
counter.updateUnsafe(1, context);
|
|
163
|
+
return Effect.succeed(value);
|
|
164
|
+
});
|
|
165
|
+
const outcomeOf = (exit) => {
|
|
166
|
+
if (Exit.isSuccess(exit))
|
|
167
|
+
return "success";
|
|
168
|
+
const error = Cause.findErrorOption(exit.cause);
|
|
169
|
+
if (Option.isSome(error)) {
|
|
170
|
+
const value = error.value;
|
|
171
|
+
return Predicate.hasProperty(value, "_tag") && Predicate.isString(value._tag) ? value._tag : "error";
|
|
172
|
+
}
|
|
173
|
+
return Cause.hasInterruptsOnly(exit.cause) ? "interrupted" : "defect";
|
|
50
174
|
};
|
|
51
175
|
/** Remembers recent states, dropping the least recently used. A `Map` iterates in insertion order. */
|
|
52
176
|
const makeStateCache = (capacity) => {
|
|
53
177
|
const entries = new Map();
|
|
54
178
|
return {
|
|
179
|
+
size: () => entries.size,
|
|
55
180
|
get: (aggregateId) => {
|
|
56
181
|
const entry = entries.get(aggregateId);
|
|
57
182
|
if (entry !== undefined) {
|
|
@@ -60,13 +185,16 @@ const makeStateCache = (capacity) => {
|
|
|
60
185
|
}
|
|
61
186
|
return entry;
|
|
62
187
|
},
|
|
188
|
+
/** Returns whether another state was dropped to make room. */
|
|
63
189
|
set: (aggregateId, loaded) => {
|
|
64
190
|
if (capacity === 0 || (entries.get(aggregateId)?.position ?? 0) > loaded.position)
|
|
65
|
-
return;
|
|
191
|
+
return false;
|
|
66
192
|
entries.delete(aggregateId);
|
|
67
193
|
entries.set(aggregateId, loaded);
|
|
68
|
-
if (entries.size
|
|
69
|
-
|
|
194
|
+
if (entries.size <= capacity)
|
|
195
|
+
return false;
|
|
196
|
+
entries.delete(entries.keys().next().value);
|
|
197
|
+
return true;
|
|
70
198
|
}
|
|
71
199
|
};
|
|
72
200
|
};
|
|
@@ -99,9 +227,29 @@ const makeTimeSlice = () => {
|
|
|
99
227
|
};
|
|
100
228
|
// Only a rival outside this service can cause a conflict, so give it room to finish.
|
|
101
229
|
const conflictBackoff = Schedule.exponential("10 millis").pipe(Schedule.jittered);
|
|
102
|
-
|
|
230
|
+
const makeSnapshots = (aggregateName, options, metrics) => Effect.gen(function* () {
|
|
231
|
+
const store = KeyValueStore.toSchemaStore(yield* KeyValueStore.KeyValueStore, Schema.Struct({ version: Schema.Int, position: Schema.Int, state: options.schema }));
|
|
232
|
+
const key = (aggregateId) => `effect-cqrs/snapshot/${JSON.stringify([aggregateName, String(options.version ?? 1), aggregateId])}`;
|
|
233
|
+
// A snapshot is only a shortcut, so a failure to read or save one falls back to the log.
|
|
234
|
+
const get = (aggregateId) => store.get(key(aggregateId)).pipe(Effect.map(Option.map((snapshot) => ({ ...snapshot, snapshotVersion: snapshot.version }))), Effect.catch((error) => Metric.update(metrics.snapshotReadFailures, 1).pipe(Effect.andThen(Effect.logWarning(`Ignoring the ${aggregateName} snapshot of ${aggregateId}`, error)), Effect.as(Option.none()))));
|
|
235
|
+
// Saves run beside the commands rather than in their way. Closing the service
|
|
236
|
+
// waits for the ones still running, so a clean shutdown keeps its last snapshots.
|
|
237
|
+
const saving = yield* FiberSet.make();
|
|
238
|
+
yield* Effect.addFinalizer(() => FiberSet.awaitEmpty(saving));
|
|
239
|
+
// Starts a save once `every` events have been folded since the last snapshot, and
|
|
240
|
+
// returns the state to remember. A failed save is not retried until `every` more.
|
|
241
|
+
const save = (aggregateId, loaded) => loaded.version - loaded.snapshotVersion < options.every
|
|
242
|
+
? Effect.succeed(loaded)
|
|
243
|
+
: FiberSet.run(saving, store.set(key(aggregateId), { version: loaded.version, position: loaded.position, state: loaded.state }).pipe(Effect.andThen(Metric.update(metrics.snapshotSaved, 1)), Effect.catch((error) => Effect.andThen(Metric.update(metrics.snapshotFailed, 1), Effect.logWarning(`Could not save the ${aggregateName} snapshot of ${aggregateId}`, error))))).pipe(Effect.as({ ...loaded, snapshotVersion: loaded.version }));
|
|
244
|
+
return { get, save };
|
|
245
|
+
});
|
|
246
|
+
const makeService = Effect.fnUntraced(function* (aggregate, options) {
|
|
103
247
|
const store = yield* EventStore;
|
|
104
248
|
const context = yield* Effect.context();
|
|
249
|
+
// Metadata provided where the service was built, such as the software version,
|
|
250
|
+
// reaches commands run where that layer isn't visible.
|
|
251
|
+
const builtWith = Context.get(context, CurrentMetadata);
|
|
252
|
+
const mergeMetadata = (current, given) => current === builtWith && given === undefined ? builtWith : { ...builtWith, ...current, ...given };
|
|
105
253
|
const maxRetries = options?.maxRetries ?? 5;
|
|
106
254
|
const aggregateName = aggregate.name;
|
|
107
255
|
const decodeEvent = makeEventDecoder(aggregate);
|
|
@@ -109,43 +257,111 @@ export const make = Effect.fnUntraced(function* (aggregate, options) {
|
|
|
109
257
|
const states = makeStateCache(options?.stateCacheSize ?? 10_000);
|
|
110
258
|
const lockStream = makeKeyedLock();
|
|
111
259
|
const timeSlice = makeTimeSlice();
|
|
260
|
+
const metrics = makeMetrics(aggregateName);
|
|
261
|
+
const snapshots = options?.snapshots === undefined
|
|
262
|
+
? undefined
|
|
263
|
+
: yield* makeSnapshots(aggregateName, options.snapshots, metrics);
|
|
112
264
|
const replay = (stream, initial, step) => stream.pipe(Stream.runFoldEffect(() => initial, (acc, stored) => Effect.map(decodeEvent(stored), (event) => step(acc, event, stored))));
|
|
113
265
|
const streamOf = (aggregateId, range) => store.read({ aggregateNames: [aggregateName], aggregateIds: [aggregateId], ...range });
|
|
114
|
-
const
|
|
266
|
+
const fold = (acc, event, stored) => ({
|
|
115
267
|
state: Aggregate.evolve(aggregate, acc.state, event, stored),
|
|
116
268
|
version: stored.version,
|
|
117
|
-
position: stored.position
|
|
118
|
-
|
|
119
|
-
|
|
269
|
+
position: stored.position,
|
|
270
|
+
snapshotVersion: acc.snapshotVersion
|
|
271
|
+
});
|
|
272
|
+
const replayFrom = (start, aggregateId, finishTime) => replay(streamOf(aggregateId, { finishTime, afterPosition: start.position, afterVersion: start.version }), start, fold);
|
|
273
|
+
const initial = {
|
|
274
|
+
state: aggregate.initial,
|
|
275
|
+
version: 0,
|
|
276
|
+
position: 0,
|
|
277
|
+
snapshotVersion: 0
|
|
278
|
+
};
|
|
279
|
+
// Remembered states come first, as they are the most recent. Without one the
|
|
280
|
+
// last snapshot saves replaying the start of the stream.
|
|
281
|
+
const start = (aggregateId) => {
|
|
282
|
+
const remembered = states.get(aggregateId);
|
|
283
|
+
if (remembered !== undefined)
|
|
284
|
+
return recording(metrics.loadedFromMemory, remembered);
|
|
285
|
+
if (snapshots === undefined)
|
|
286
|
+
return recording(metrics.loadedFromReplay, initial);
|
|
287
|
+
return Effect.flatMap(snapshots.get(aggregateId), Option.match({
|
|
288
|
+
onNone: () => recording(metrics.loadedFromReplay, initial),
|
|
289
|
+
onSome: (snapshot) => recording(metrics.loadedFromSnapshot, snapshot)
|
|
290
|
+
}));
|
|
291
|
+
};
|
|
292
|
+
// Returns the state as remembered, with the version of a snapshot it just started.
|
|
293
|
+
// `read` is how many events the load read from the store, when one did.
|
|
294
|
+
const remember = (aggregateId, loaded, read) => (snapshots === undefined ? Effect.succeed(loaded) : snapshots.save(aggregateId, loaded)).pipe(Effect.tap((remembered) => Effect.contextWith((context) => {
|
|
295
|
+
const evicted = states.set(aggregateId, remembered);
|
|
296
|
+
if (read !== undefined)
|
|
297
|
+
metrics.eventsReplayed.updateUnsafe(read, context);
|
|
298
|
+
metrics.cacheSize.updateUnsafe(states.size(), context);
|
|
299
|
+
if (evicted)
|
|
300
|
+
metrics.evictions.updateUnsafe(1, context);
|
|
301
|
+
return Effect.void;
|
|
302
|
+
})));
|
|
120
303
|
// Streams only grow, so a remembered state plus what came after it is the current
|
|
121
|
-
// state, even if another process wrote those events.
|
|
304
|
+
// state, even if another process wrote those events. Versions have no gaps, so the
|
|
305
|
+
// difference between two is the number of events read.
|
|
122
306
|
const load = (aggregateId, finishTime) => finishTime === undefined
|
|
123
|
-
?
|
|
307
|
+
? Effect.flatMap(start(aggregateId), (from) => Effect.flatMap(replayFrom(from, aggregateId), (loaded) => remember(aggregateId, loaded, loaded.version - from.version)))
|
|
124
308
|
: replayFrom(initial, aggregateId, finishTime);
|
|
125
|
-
|
|
126
|
-
|
|
309
|
+
// Measures from the moment the command asks for its turn on the stream.
|
|
310
|
+
const timed = (type) => (effect) => Effect.clockWith((clock) => {
|
|
311
|
+
const started = clock.currentTimeNanosUnsafe();
|
|
312
|
+
return Effect.onExit(effect, (exit) => Effect.contextWith((context) => {
|
|
313
|
+
const elapsed = Duration.nanos(clock.currentTimeNanosUnsafe() - started);
|
|
314
|
+
metrics.duration(type, outcomeOf(exit)).updateUnsafe(elapsed, context);
|
|
315
|
+
return Effect.void;
|
|
316
|
+
}));
|
|
317
|
+
});
|
|
318
|
+
// Folds what a command just wrote into the remembered state, so the next command
|
|
319
|
+
// finds nothing new to read. The events are decoded from what was stored, as a
|
|
320
|
+
// replay would, so the state is the one a restart would rebuild. If they don't
|
|
321
|
+
// decode, the state isn't remembered and the next load reports the error.
|
|
322
|
+
const rememberWritten = (aggregateId, before, written) => Effect.forEach(written, decodeEvent).pipe(Effect.flatMap((events) => remember(aggregateId, events.reduce((acc, event, index) => fold(acc, event, written[index]), before))), Effect.ignore);
|
|
323
|
+
const decide = Effect.fnUntraced(function* (type, aggregateId, payload, causation, metadata) {
|
|
324
|
+
const loaded = yield* load(aggregateId);
|
|
325
|
+
const { position, state, version } = loaded;
|
|
127
326
|
const { handler } = aggregate.commands[type];
|
|
128
327
|
const events = Arr.ensure(yield* handler(state, payload, { aggregateId, version }));
|
|
328
|
+
const { correlationId } = causation;
|
|
129
329
|
if (events.length === 0) {
|
|
130
|
-
return { aggregateName, aggregateId, version, position, events };
|
|
330
|
+
return { aggregateName, aggregateId, version, position, events, correlationId };
|
|
131
331
|
}
|
|
132
332
|
const stored = yield* store.append({
|
|
133
333
|
aggregateName,
|
|
134
334
|
aggregateId,
|
|
135
335
|
expectedVersion: version,
|
|
136
|
-
events: yield* Effect.forEach(events, encodeEvent)
|
|
336
|
+
events: yield* Effect.forEach(events, encodeEvent),
|
|
337
|
+
...causation,
|
|
338
|
+
metadata
|
|
137
339
|
});
|
|
340
|
+
yield* rememberWritten(aggregateId, loaded, stored);
|
|
138
341
|
const last = stored[stored.length - 1];
|
|
139
|
-
return { aggregateName, aggregateId, version: last.version, position: last.position, events };
|
|
342
|
+
return { aggregateName, aggregateId, version: last.version, position: last.position, events, correlationId };
|
|
140
343
|
});
|
|
141
344
|
// Commands on one stream take turns, so they can't race each other and only a
|
|
142
345
|
// rival in another process causes a conflict. A handler must not run a command on
|
|
143
346
|
// its own stream, which would wait for itself.
|
|
144
|
-
const execute = (type, aggregateId, payload) =>
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
347
|
+
const execute = (type, aggregateId, payload, given) =>
|
|
348
|
+
// Read outside the service's own context, which would hide the caller's.
|
|
349
|
+
Effect.contextWith((callerContext) => {
|
|
350
|
+
const current = Context.get(callerContext, CurrentCausation);
|
|
351
|
+
const correlationId = given?.correlationId ?? current?.correlationId;
|
|
352
|
+
const causationId = given?.causationId ?? current?.causationId;
|
|
353
|
+
// Without a cause the command starts its own correlation.
|
|
354
|
+
const id = correlationId ?? causationId ?? crypto.randomUUID();
|
|
355
|
+
const causation = { correlationId: correlationId ?? id, causationId: causationId ?? id };
|
|
356
|
+
const metadata = mergeMetadata(Context.get(callerContext, CurrentMetadata), given?.metadata);
|
|
357
|
+
return decide(type, aggregateId, payload, causation, metadata).pipe(Effect.tapError((error) => error instanceof ConcurrencyConflict ? Metric.update(metrics.conflicts, 1) : Effect.void), Effect.retry({
|
|
358
|
+
times: maxRetries,
|
|
359
|
+
while: (error) => error instanceof ConcurrencyConflict,
|
|
360
|
+
schedule: conflictBackoff
|
|
361
|
+
}), Effect.provideContext(context), lockStream(aggregateId), (decided) => Effect.andThen(timeSlice, decided), timed(type), Effect.withSpan(`${aggregateName}.${type}`, {
|
|
362
|
+
attributes: { "aggregate.id": aggregateId, "cqrs.correlation_id": causation.correlationId }
|
|
363
|
+
}));
|
|
364
|
+
});
|
|
149
365
|
const decodePayload = (type, schema, input) => Schema.decodeUnknownEffect(schema)(input).pipe(Effect.mapError((error) => new InvalidCommand({ aggregateName, type, message: error.message })));
|
|
150
366
|
const commands = Object.fromEntries(Object.entries(aggregate.commands).map(([type, command]) => [
|
|
151
367
|
type,
|
|
@@ -158,7 +374,7 @@ export const make = Effect.fnUntraced(function* (aggregate, options) {
|
|
|
158
374
|
return yield* new UnknownCommand({ aggregateName, type: envelope.type });
|
|
159
375
|
}
|
|
160
376
|
const payload = yield* decodePayload(envelope.type, Schema.toCodecJson(aggregate.commands[envelope.type].payload), envelope.payload);
|
|
161
|
-
return yield* execute(envelope.type, envelope.aggregateId, payload);
|
|
377
|
+
return yield* execute(envelope.type, envelope.aggregateId, payload, envelope);
|
|
162
378
|
});
|
|
163
379
|
const readModel = (aggregateId, options) => load(aggregateId, options?.finishTime).pipe(Effect.map(({ state }) => state), Effect.withSpan(`${aggregateName}.readModel`, { attributes: { "aggregate.id": aggregateId } }));
|
|
164
380
|
const history = (aggregateId, options) => replay(streamOf(aggregateId, { startTime: options?.startTime, finishTime: options?.finishTime }), [], (entries, event, stored) => {
|
|
@@ -166,6 +382,9 @@ export const make = Effect.fnUntraced(function* (aggregate, options) {
|
|
|
166
382
|
version: stored.version,
|
|
167
383
|
timestamp: stored.timestamp,
|
|
168
384
|
type: stored.type,
|
|
385
|
+
correlationId: stored.correlationId,
|
|
386
|
+
causationId: stored.causationId,
|
|
387
|
+
metadata: stored.metadata,
|
|
169
388
|
...(options?.payload === true ? { payload: event } : {})
|
|
170
389
|
});
|
|
171
390
|
return entries;
|
|
@@ -178,4 +397,11 @@ export const make = Effect.fnUntraced(function* (aggregate, options) {
|
|
|
178
397
|
history
|
|
179
398
|
};
|
|
180
399
|
});
|
|
400
|
+
/**
|
|
401
|
+
* Builds the service for one aggregate. With `snapshots` it saves states through
|
|
402
|
+
* a `KeyValueStore` from `effect/persistence`, which has layers for memory, files,
|
|
403
|
+
* SQL and the browser's `localStorage`. Saves run in the background, and closing
|
|
404
|
+
* the scope waits for the ones still running.
|
|
405
|
+
*/
|
|
406
|
+
export const make = makeService;
|
|
181
407
|
//# sourceMappingURL=AggregateService.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AggregateService.js","sourceRoot":"","sources":["../src/AggregateService.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"AggregateService.js","sourceRoot":"","sources":["../src/AggregateService.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Why an event was recorded. Every event carries two ids:
|
|
3
|
+
*
|
|
4
|
+
* - `correlationId` is shared by everything that follows from one original
|
|
5
|
+
* request, across aggregates and view models.
|
|
6
|
+
* - `causationId` names what directly caused the command that recorded it: the
|
|
7
|
+
* request, or the event a view model or saga was reacting to.
|
|
8
|
+
*
|
|
9
|
+
* They travel in the fiber's context rather than in payloads. A command run
|
|
10
|
+
* outside any causation starts a new correlation with a fresh id. Inside a view
|
|
11
|
+
* model handler the event being handled is the cause, so a chain of reactions
|
|
12
|
+
* can be drawn as a tree without passing ids around by hand.
|
|
13
|
+
*/
|
|
14
|
+
import { Context, Effect } from "effect";
|
|
15
|
+
import { type StoredEvent } from "./EventStore.ts";
|
|
16
|
+
export interface Causation {
|
|
17
|
+
readonly correlationId: string;
|
|
18
|
+
readonly causationId: string;
|
|
19
|
+
}
|
|
20
|
+
/** The causation of commands run in this fiber, `undefined` outside any. */
|
|
21
|
+
export declare const CurrentCausation: Context.Reference<Causation | undefined>;
|
|
22
|
+
/** Runs an effect with this causation, for instance the id of an incoming HTTP request. */
|
|
23
|
+
export declare const withCausation: {
|
|
24
|
+
(causation: Causation): <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>;
|
|
25
|
+
<A, E, R>(effect: Effect.Effect<A, E, R>, causation: Causation): Effect.Effect<A, E, R>;
|
|
26
|
+
};
|
|
27
|
+
/** The causation of commands run in reaction to a stored event. */
|
|
28
|
+
export declare const fromEvent: (event: StoredEvent) => Causation;
|
|
29
|
+
/**
|
|
30
|
+
* Runs an effect in reaction to a stored event, so commands it runs record that
|
|
31
|
+
* event as their cause. View models do this for their handlers already.
|
|
32
|
+
*/
|
|
33
|
+
export declare const causedBy: (event: StoredEvent) => <A, E, R>(effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>;
|
|
34
|
+
//# sourceMappingURL=Causation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Causation.d.ts","sourceRoot":"","sources":["../src/Causation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,EAAY,MAAM,QAAQ,CAAA;AAClD,OAAO,EAAW,KAAK,WAAW,EAAE,MAAM,iBAAiB,CAAA;AAE3D,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAA;IAC9B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAA;CAC7B;AAED,4EAA4E;AAC5E,eAAO,MAAM,gBAAgB,0CAE3B,CAAA;AAEF,2FAA2F;AAC3F,eAAO,MAAM,aAAa,EAAE;IAC1B,CAAC,SAAS,EAAE,SAAS,GAAG,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAAK,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;IAC3F,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,CAAA;CAKxF,CAAA;AAED,mEAAmE;AACnE,eAAO,MAAM,SAAS,UAAW,WAAW,KAAG,SAG9C,CAAA;AAED;;;GAGG;AACH,eAAO,MAAM,QAAQ,UAAW,WAAW,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,UAAU,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC,KAAG,MAAM,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,CAC7C,CAAA"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Why an event was recorded. Every event carries two ids:
|
|
3
|
+
*
|
|
4
|
+
* - `correlationId` is shared by everything that follows from one original
|
|
5
|
+
* request, across aggregates and view models.
|
|
6
|
+
* - `causationId` names what directly caused the command that recorded it: the
|
|
7
|
+
* request, or the event a view model or saga was reacting to.
|
|
8
|
+
*
|
|
9
|
+
* They travel in the fiber's context rather than in payloads. A command run
|
|
10
|
+
* outside any causation starts a new correlation with a fresh id. Inside a view
|
|
11
|
+
* model handler the event being handled is the cause, so a chain of reactions
|
|
12
|
+
* can be drawn as a tree without passing ids around by hand.
|
|
13
|
+
*/
|
|
14
|
+
import { Context, Effect, Function } from "effect";
|
|
15
|
+
import { eventId } from "./EventStore.js";
|
|
16
|
+
/** The causation of commands run in this fiber, `undefined` outside any. */
|
|
17
|
+
export const CurrentCausation = Context.Reference("effect-cqrs/Causation", {
|
|
18
|
+
defaultValue: () => undefined
|
|
19
|
+
});
|
|
20
|
+
/** Runs an effect with this causation, for instance the id of an incoming HTTP request. */
|
|
21
|
+
export const withCausation = Function.dual(2, (effect, causation) => Effect.provideService(effect, CurrentCausation, causation));
|
|
22
|
+
/** The causation of commands run in reaction to a stored event. */
|
|
23
|
+
export const fromEvent = (event) => {
|
|
24
|
+
const id = eventId(event);
|
|
25
|
+
return { correlationId: event.correlationId ?? id, causationId: id };
|
|
26
|
+
};
|
|
27
|
+
/**
|
|
28
|
+
* Runs an effect in reaction to a stored event, so commands it runs record that
|
|
29
|
+
* event as their cause. View models do this for their handlers already.
|
|
30
|
+
*/
|
|
31
|
+
export const causedBy = (event) => (effect) => Effect.provideService(effect, CurrentCausation, fromEvent(event));
|
|
32
|
+
//# sourceMappingURL=Causation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Causation.js","sourceRoot":"","sources":["../src/Causation.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AACH,OAAO,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAA;AAClD,OAAO,EAAE,OAAO,EAAoB,MAAM,iBAAiB,CAAA;AAO3D,4EAA4E;AAC5E,MAAM,CAAC,MAAM,gBAAgB,GAAG,OAAO,CAAC,SAAS,CAAwB,uBAAuB,EAAE;IAChG,YAAY,EAAE,GAAG,EAAE,CAAC,SAAS;CAC9B,CAAC,CAAA;AAEF,2FAA2F;AAC3F,MAAM,CAAC,MAAM,aAAa,GAGtB,QAAQ,CAAC,IAAI,CACf,CAAC,EACD,CAAU,MAA8B,EAAE,SAAoB,EAAE,EAAE,CAChE,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,gBAAgB,EAAE,SAAS,CAAC,CAC7D,CAAA;AAED,mEAAmE;AACnE,MAAM,CAAC,MAAM,SAAS,GAAG,CAAC,KAAkB,EAAa,EAAE;IACzD,MAAM,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,CAAA;IACzB,OAAO,EAAE,aAAa,EAAE,KAAK,CAAC,aAAa,IAAI,EAAE,EAAE,WAAW,EAAE,EAAE,EAAE,CAAA;AACtE,CAAC,CAAA;AAED;;;GAGG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAG,CAAC,KAAkB,EAAE,EAAE,CAAC,CAAU,MAA8B,EAA0B,EAAE,CAClH,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,gBAAgB,EAAE,SAAS,CAAC,KAAK,CAAC,CAAC,CAAA"}
|
package/dist/EventStore.d.ts
CHANGED
|
@@ -26,13 +26,23 @@ export declare const StoredEvent: Schema.Struct<{
|
|
|
26
26
|
readonly aggregateId: Schema.String;
|
|
27
27
|
readonly version: Schema.Int;
|
|
28
28
|
readonly type: Schema.String;
|
|
29
|
+
/** The version of the event's schema the payload was written with. Events from before versions existed are `1`. */
|
|
30
|
+
readonly schemaVersion: Schema.Int;
|
|
29
31
|
readonly payload: Schema.Codec<Schema.Json, Schema.Json, never, never>;
|
|
30
32
|
readonly timestamp: Schema.DateTimeUtcFromMillis;
|
|
33
|
+
/** Shared by everything that follows from one original request. */
|
|
34
|
+
readonly correlationId: Schema.NullOr<Schema.String>;
|
|
35
|
+
/** What directly caused the command that recorded the event: a request, a command or another event. */
|
|
36
|
+
readonly causationId: Schema.NullOr<Schema.String>;
|
|
37
|
+
/** What the command carried beside its payload, see `Metadata`. Events from before metadata existed have `{}`. */
|
|
38
|
+
readonly metadata: Schema.$Record<Schema.String, Schema.Codec<Schema.Json, Schema.Json, never, never>>;
|
|
31
39
|
}>;
|
|
32
40
|
export type StoredEvent = typeof StoredEvent.Type;
|
|
33
41
|
export interface NewEvent {
|
|
34
42
|
readonly type: string;
|
|
35
43
|
readonly payload: Schema.Json;
|
|
44
|
+
/** Defaults to `1`. */
|
|
45
|
+
readonly schemaVersion?: number | undefined;
|
|
36
46
|
}
|
|
37
47
|
export interface AppendInput {
|
|
38
48
|
readonly aggregateName: string;
|
|
@@ -40,7 +50,19 @@ export interface AppendInput {
|
|
|
40
50
|
/** The stream version the writer based its decision on, `0` for a new stream. */
|
|
41
51
|
readonly expectedVersion: number;
|
|
42
52
|
readonly events: ReadonlyArray<NewEvent>;
|
|
53
|
+
readonly correlationId?: string | undefined;
|
|
54
|
+
readonly causationId?: string | undefined;
|
|
55
|
+
/** Recorded on every event of the append. Defaults to `{}`. */
|
|
56
|
+
readonly metadata?: Schema.JsonObject | undefined;
|
|
43
57
|
}
|
|
58
|
+
/**
|
|
59
|
+
* Identifies an event wherever it is stored, as the `causationId` of what it causes:
|
|
60
|
+
* `account/alice@4`. Name and id are URI-encoded, so a `/` or `@` inside one can't
|
|
61
|
+
* make two events look alike.
|
|
62
|
+
*/
|
|
63
|
+
export declare const eventId: (event: Pick<StoredEvent, "aggregateName" | "aggregateId" | "version">) => string;
|
|
64
|
+
/** The columns every adapter stores for a new event, with the defaults filled in. */
|
|
65
|
+
export declare const toStored: (input: AppendInput, event: NewEvent, index: number, position: number, timestamp: DateTime.Utc) => StoredEvent;
|
|
44
66
|
/**
|
|
45
67
|
* Selects events by stream, type and time. Omitted fields match everything.
|
|
46
68
|
* `startTime` is inclusive and `finishTime` is exclusive, so adding one
|
package/dist/EventStore.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EventStore.d.ts","sourceRoot":"","sources":["../src/EventStore.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAe,MAAM,EAAE,MAAM,EAAmB,MAAM,QAAQ,CAAA;;;;;AAEvG,qBAAa,eAAgB,SAAQ,oBAGnC;CAAG;;;;;;AAEL,qBAAa,mBAAoB,SAAQ,wBAIvC;CAAG;AAEL,eAAO,MAAM,WAAW
|
|
1
|
+
{"version":3,"file":"EventStore.d.ts","sourceRoot":"","sources":["../src/EventStore.ts"],"names":[],"mappings":"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"}
|