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.
Files changed (59) hide show
  1. package/README.md +34 -6
  2. package/dist/Aggregate.d.ts +47 -6
  3. package/dist/Aggregate.d.ts.map +1 -1
  4. package/dist/Aggregate.js +45 -1
  5. package/dist/Aggregate.js.map +1 -1
  6. package/dist/AggregateService.d.ts +83 -11
  7. package/dist/AggregateService.d.ts.map +1 -1
  8. package/dist/AggregateService.js +261 -35
  9. package/dist/AggregateService.js.map +1 -1
  10. package/dist/Causation.d.ts +34 -0
  11. package/dist/Causation.d.ts.map +1 -0
  12. package/dist/Causation.js +32 -0
  13. package/dist/Causation.js.map +1 -0
  14. package/dist/EventStore.d.ts +22 -0
  15. package/dist/EventStore.d.ts.map +1 -1
  16. package/dist/EventStore.js +30 -10
  17. package/dist/EventStore.js.map +1 -1
  18. package/dist/EventVersions.d.ts +64 -0
  19. package/dist/EventVersions.d.ts.map +1 -0
  20. package/dist/EventVersions.js +55 -0
  21. package/dist/EventVersions.js.map +1 -0
  22. package/dist/Fixture.d.ts +40 -5
  23. package/dist/Fixture.d.ts.map +1 -1
  24. package/dist/Fixture.js +44 -3
  25. package/dist/Fixture.js.map +1 -1
  26. package/dist/Metadata.d.ts +42 -0
  27. package/dist/Metadata.d.ts.map +1 -0
  28. package/dist/Metadata.js +39 -0
  29. package/dist/Metadata.js.map +1 -0
  30. package/dist/PostgresEventStore.d.ts.map +1 -1
  31. package/dist/PostgresEventStore.js +22 -13
  32. package/dist/PostgresEventStore.js.map +1 -1
  33. package/dist/Saga.d.ts +105 -0
  34. package/dist/Saga.d.ts.map +1 -0
  35. package/dist/Saga.js +97 -0
  36. package/dist/Saga.js.map +1 -0
  37. package/dist/SqliteEventStore.d.ts.map +1 -1
  38. package/dist/SqliteEventStore.js +32 -13
  39. package/dist/SqliteEventStore.js.map +1 -1
  40. package/dist/ViewModel.d.ts.map +1 -1
  41. package/dist/ViewModel.js +3 -1
  42. package/dist/ViewModel.js.map +1 -1
  43. package/dist/index.d.ts +4 -0
  44. package/dist/index.d.ts.map +1 -1
  45. package/dist/index.js +4 -0
  46. package/dist/index.js.map +1 -1
  47. package/package.json +5 -3
  48. package/src/Aggregate.ts +81 -9
  49. package/src/AggregateService.ts +418 -55
  50. package/src/Causation.ts +48 -0
  51. package/src/EventStore.ts +47 -10
  52. package/src/EventVersions.ts +104 -0
  53. package/src/Fixture.ts +92 -7
  54. package/src/Metadata.ts +52 -0
  55. package/src/PostgresEventStore.ts +24 -13
  56. package/src/Saga.ts +176 -0
  57. package/src/SqliteEventStore.ts +43 -13
  58. package/src/ViewModel.ts +3 -1
  59. package/src/index.ts +4 -0
@@ -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
- /** A stored event no longer matches the schema, which means the data needs a migration. */
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
- /** Decodes a stored event with the schema of the aggregate it belongs to. */
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 decode = Schema.decodeUnknownEffect(Schema.toCodecJson(aggregate.events));
36
- return (stored) => decode(stored.payload).pipe(Effect.mapError((error) => new EventDecodeError({
37
- aggregateName: stored.aggregateName,
38
- aggregateId: stored.aggregateId,
39
- version: stored.version,
40
- type: stored.type,
41
- message: error.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) => ({ type: event._tag, payload: 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 > capacity)
69
- entries.delete(entries.keys().next().value);
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
- export const make = Effect.fnUntraced(function* (aggregate, options) {
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 replayFrom = (start, aggregateId, finishTime) => replay(streamOf(aggregateId, { finishTime, afterPosition: start.position, afterVersion: start.version }), start, (acc, event, stored) => ({
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
- const initial = { state: aggregate.initial, version: 0, position: 0 };
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
- ? replayFrom(states.get(aggregateId) ?? initial, aggregateId).pipe(Effect.tap((loaded) => Effect.sync(() => states.set(aggregateId, loaded))))
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
- const decide = Effect.fnUntraced(function* (type, aggregateId, payload) {
126
- const { position, state, version } = yield* load(aggregateId);
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) => decide(type, aggregateId, payload).pipe(Effect.retry({
145
- times: maxRetries,
146
- while: (error) => error instanceof ConcurrencyConflict,
147
- schedule: conflictBackoff
148
- }), Effect.provideContext(context), lockStream(aggregateId), (decided) => Effect.andThen(timeSlice, decided), Effect.withSpan(`${aggregateName}.${type}`, { attributes: { "aggregate.id": aggregateId } }));
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"}
@@ -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
@@ -1 +1 @@
1
- {"version":3,"file":"EventStore.d.ts","sourceRoot":"","sources":["../src/EventStore.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"EventStore.d.ts","sourceRoot":"","sources":["../src/EventStore.ts"],"names":[],"mappings":"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"}