@kronos-ts/eventsourcing 0.2.0 → 0.2.2

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.
@@ -1 +1 @@
1
- {"version":3,"file":"append.d.ts","sourceRoot":"","sources":["../src/append.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,QAAQ,EACb,KAAK,WAAW,EACjB,MAAM,mBAAmB,CAAA;AAM1B,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAC5B,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAExF,uEAAuE;AACvE,MAAM,WAAW,cAAc;IAC7B,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAA;IAC3E,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAA;CAChG;AAOD,+DAA+D;AAC/D,eAAO,MAAM,mBAAmB,EAAE,WAAW,CAAC,YAAY,EAAE,CAAiC,CAAA;AAE7F,uEAAuE;AACvE,eAAO,MAAM,kBAAkB,EAAE,WAAW,CAAC,KAAK,CAAC;IAAE,QAAQ,EAAE,aAAa,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAAC,CACzE,CAAA;AAE9B,2EAA2E;AAC3E,eAAO,MAAM,eAAe,EAAE,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAA6B,CAAA;AAEpG,oFAAoF;AACpF,eAAO,MAAM,iBAAiB,EAAE,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE;IAAE,MAAM,EAAE,GAAG,CAAC;IAAC,EAAE,EAAE,OAAO,CAAA;CAAE,CAAC,CACxD,CAAA;AAE7B;;;;;;;;GAQG;AACH,eAAO,MAAM,MAAM,EAAE,cAiDD,CAAA"}
1
+ {"version":3,"file":"append.d.ts","sourceRoot":"","sources":["../src/append.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,QAAQ,EACb,KAAK,WAAW,EACjB,MAAM,mBAAmB,CAAA;AAO1B,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAC5B,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAA;AAExF,uEAAuE;AACvE,MAAM,WAAW,cAAc;IAC7B,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,IAAI,CAAA;IAC3E,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,QAAQ,GAAG,IAAI,CAAA;CAChG;AAOD,+DAA+D;AAC/D,eAAO,MAAM,mBAAmB,EAAE,WAAW,CAAC,YAAY,EAAE,CAAiC,CAAA;AAE7F,uEAAuE;AACvE,eAAO,MAAM,kBAAkB,EAAE,WAAW,CAAC,KAAK,CAAC;IAAE,QAAQ,EAAE,aAAa,CAAC;IAAC,cAAc,EAAE,MAAM,CAAA;CAAE,CAAC,CACzE,CAAA;AAE9B,2EAA2E;AAC3E,eAAO,MAAM,eAAe,EAAE,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC,CAA6B,CAAA;AAEpG,oFAAoF;AACpF,eAAO,MAAM,iBAAiB,EAAE,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE;IAAE,MAAM,EAAE,GAAG,CAAC;IAAC,EAAE,EAAE,OAAO,CAAA;CAAE,CAAC,CACxD,CAAA;AAE7B;;;;;;;;GAQG;AACH,eAAO,MAAM,MAAM,EAAE,cA+DD,CAAA"}
package/dist/append.js CHANGED
@@ -1,5 +1,6 @@
1
- import { resourceKey, qualifiedNameToString, generateIdentifier, } from "@kronos-ts/common";
1
+ import { resourceKey, qualifiedNameToString, generateIdentifier, mergeMetadata, } from "@kronos-ts/common";
2
2
  import { getResource, computeIfAbsent, requireInvocationPhase, } from "@kronos-ts/messaging/processing-state";
3
+ import { CORRELATION_DATA_KEY } from "@kronos-ts/messaging/correlation-data";
3
4
  // ---------------------------------------------------------------------------
4
5
  // Resource keys (owned by append — open-question #1 resolved: keys live with
5
6
  // the helper that writes them)
@@ -25,12 +26,23 @@ export const append = ((eventDescriptor, eventPayload, eventMetadata) => {
25
26
  const state = requireInvocationPhase(); // D-43 mutator guard
26
27
  const events = computeIfAbsent(BUFFERED_EVENTS_KEY, () => []);
27
28
  const tags = eventDescriptor.tags ? eventDescriptor.tags(eventPayload) : [];
29
+ // Apply the active UnitOfWork's correlation data to the appended event so it
30
+ // carries the correct correlationId/causationId of the message currently
31
+ // being handled. Merges over the base metadata (explicit arg, else UoW
32
+ // metadata). No-op when no correlation data is set — keeps events untouched
33
+ // for apps that don't configure correlation providers.
34
+ const baseMetadata = eventMetadata ?? state.metadata; // fallback to UoW metadata when caller omits
35
+ const correlationData = getResource(CORRELATION_DATA_KEY);
36
+ const metadata = correlationData && Object.keys(correlationData).length > 0
37
+ ? mergeMetadata(baseMetadata, correlationData)
38
+ : baseMetadata;
28
39
  const eventMessage = {
40
+ kind: "event",
29
41
  identifier: generateIdentifier(),
30
42
  name: eventDescriptor.name,
31
43
  version: eventDescriptor.version,
32
44
  payload: eventPayload,
33
- metadata: eventMetadata ?? state.metadata, // fallback to UoW metadata when caller omits
45
+ metadata,
34
46
  timestamp: Date.now(),
35
47
  tags,
36
48
  };
@@ -1 +1 @@
1
- {"version":3,"file":"append.js","sourceRoot":"","sources":["../src/append.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,WAAW,EACX,qBAAqB,EACrB,kBAAkB,GAGnB,MAAM,mBAAmB,CAAA;AAC1B,OAAO,EACL,WAAW,EACX,eAAe,EACf,sBAAsB,GACvB,MAAM,uCAAuC,CAAA;AAU9C,8EAA8E;AAC9E,6EAA6E;AAC7E,+BAA+B;AAC/B,8EAA8E;AAE9E,+DAA+D;AAC/D,MAAM,CAAC,MAAM,mBAAmB,GAAgC,WAAW,CAAC,gBAAgB,CAAC,CAAA;AAE7F,uEAAuE;AACvE,MAAM,CAAC,MAAM,kBAAkB,GAC7B,WAAW,CAAC,eAAe,CAAC,CAAA;AAE9B,2EAA2E;AAC3E,MAAM,CAAC,MAAM,eAAe,GAA+C,WAAW,CAAC,YAAY,CAAC,CAAA;AAEpG,oFAAoF;AACpF,MAAM,CAAC,MAAM,iBAAiB,GAC5B,WAAW,CAAC,cAAc,CAAC,CAAA;AAE7B;;;;;;;;GAQG;AACH,MAAM,CAAC,MAAM,MAAM,GAAmB,CAAC,CACrC,eAAqC,EACrC,YAAqB,EACrB,aAAwB,EACxB,EAAE;IACF,MAAM,KAAK,GAAG,sBAAsB,EAAE,CAAA,CAAC,qBAAqB;IAC5D,MAAM,MAAM,GAAG,eAAe,CAAC,mBAAmB,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAA;IAC7D,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;IAC3E,MAAM,YAAY,GAAiB;QACjC,UAAU,EAAE,kBAAkB,EAAE;QAChC,IAAI,EAAE,eAAe,CAAC,IAAI;QAC1B,OAAO,EAAE,eAAe,CAAC,OAAO;QAChC,OAAO,EAAE,YAAY;QACrB,QAAQ,EAAE,aAAa,IAAI,KAAK,CAAC,QAAQ,EAAE,6CAA6C;QACxF,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,IAAI;KACL,CAAA;IACD,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;IAEzB,qDAAqD;IACrD,4EAA4E;IAC5E,gFAAgF;IAChF,2BAA2B;IAC3B,MAAM,KAAK,GAAG,WAAW,CAAC,eAAe,CAAC,CAAA;IAC1C,MAAM,OAAO,GAAG,WAAW,CAAC,iBAAiB,CAAC,CAAA;IAC9C,IAAI,KAAK,IAAI,OAAO,EAAE,CAAC;QACrB,MAAM,SAAS,GAAG,qBAAqB,CAAC,eAAe,CAAC,IAAI,CAAC,CAAA;QAC7D,KAAK,MAAM,CAAC,QAAQ,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,IAAI,OAAO,EAAE,CAAC;YACjD,MAAM,aAAa,GAAG,KAAK,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAA;YACzC,IAAI,CAAC,aAAa;gBAAE,SAAQ;YAC5B,MAAM,QAAQ,GAAI,MAAc,CAAC,QAGnB,CAAA;YACd,IAAI,CAAC,QAAQ;gBAAE,SAAQ;YACvB,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE,CAAC;gBAC/B,IAAI,qBAAqB,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,SAAS,EAAE,CAAC;oBACjE,KAAK,CAAC,GAAG,CACP,QAAQ,EACR,aAAa,CAAC,IAAI,CAAC,CAAC,MAAW,EAAE,EAAE,CAAC,CAAC;wBACnC,GAAG,MAAM;wBACT,KAAK,EAAE,OAAO,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,YAAY,CAAC;qBAClD,CAAC,CAAC,CACJ,CAAA;oBACD,MAAK;gBACP,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC;AACH,CAAC,CAAmB,CAAA"}
1
+ {"version":3,"file":"append.js","sourceRoot":"","sources":["../src/append.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"schedule.d.ts","sourceRoot":"","sources":["../src/schedule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,QAAQ,EAAe,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAEpG,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAC5B,OAAO,KAAK,EACV,eAAe,EAEf,cAAc,EACd,aAAa,EACb,YAAY,EACb,MAAM,sBAAsB,CAAA;AAE7B;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,EAAE,WAAW,CAAC,cAAc,CAAiC,CAAA;AAE7F,iEAAiE;AACjE,MAAM,WAAW,gBAAgB;IAC/B,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,CAAA;IACvG,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAClB,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,EACzB,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EACnB,EAAE,EAAE,IAAI,EACR,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,aAAa,CAAC,CAAA;CAC1B;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,QAAQ,EAAE,gBAoBD,CAAA;AAEtB,uEAAuE;AACvE,MAAM,WAAW,qBAAqB;IACpC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAA;IAC9G,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAClB,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,EACzB,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EACnB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,aAAa,CAAC,CAAA;CAC1B;AAED;;;GAGG;AACH,eAAO,MAAM,aAAa,EAAE,qBAKiF,CAAA;AAE7G;;;;GAIG;AACH,eAAO,MAAM,cAAc,GAAU,OAAO,aAAa,KAAG,OAAO,CAAC,YAAY,CAK/E,CAAA"}
1
+ {"version":3,"file":"schedule.d.ts","sourceRoot":"","sources":["../src/schedule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,KAAK,QAAQ,EAAe,KAAK,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAEpG,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAC5B,OAAO,KAAK,EACV,eAAe,EAEf,cAAc,EACd,aAAa,EACb,YAAY,EACb,MAAM,sBAAsB,CAAA;AAE7B;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,EAAE,WAAW,CAAC,cAAc,CAAiC,CAAA;AAE7F,iEAAiE;AACjE,MAAM,WAAW,gBAAgB;IAC/B,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,CAAA;IACvG,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAClB,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,EACzB,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EACnB,EAAE,EAAE,IAAI,EACR,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,aAAa,CAAC,CAAA;CAC1B;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,eAAO,MAAM,QAAQ,EAAE,gBA8BD,CAAA;AAEtB,uEAAuE;AACvE,MAAM,WAAW,qBAAqB;IACpC,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAAE,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC,CAAA;IAC9G,CAAC,CAAC,SAAS,CAAC,CAAC,OAAO,EAClB,KAAK,EAAE,eAAe,CAAC,CAAC,CAAC,EACzB,OAAO,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EACnB,OAAO,EAAE,MAAM,EACf,QAAQ,EAAE,QAAQ,GACjB,OAAO,CAAC,aAAa,CAAC,CAAA;CAC1B;AAED;;;GAGG;AACH,eAAO,MAAM,aAAa,EAAE,qBAaD,CAAA;AAE3B;;;;GAIG;AACH,eAAO,MAAM,cAAc,GAAU,OAAO,aAAa,KAAG,OAAO,CAAC,YAAY,CAK/E,CAAA"}
package/dist/schedule.js CHANGED
@@ -29,7 +29,16 @@ export const schedule = (async (event, payload, at, metadata) => {
29
29
  const scheduler = state.resources.get(EVENT_SCHEDULER_KEY.symbol);
30
30
  if (!scheduler)
31
31
  throw new Error("No event scheduler configured");
32
+ // Reject malformed fire times. A past-but-valid `at` is allowed — it fires
33
+ // ASAP, which is the intended deadline semantic — but an Invalid Date is a
34
+ // caller bug that otherwise behaves inconsistently across schedulers (the
35
+ // in-memory one fires immediately; the postgres one throws on toISOString at
36
+ // insert time). Fail fast and uniformly here instead.
37
+ if (!(at instanceof Date) || Number.isNaN(at.getTime())) {
38
+ throw new Error(`schedule: \`at\` must be a valid Date, received ${String(at)}`);
39
+ }
32
40
  const eventMessage = {
41
+ kind: "event",
33
42
  identifier: generateIdentifier(),
34
43
  name: event.name,
35
44
  version: event.version,
@@ -44,7 +53,15 @@ export const schedule = (async (event, payload, at, metadata) => {
44
53
  * Convenience wrapper over {@link schedule}: fire `delayMs` milliseconds from
45
54
  * now instead of at an absolute {@link Date}.
46
55
  */
47
- export const scheduleAfter = ((event, payload, delayMs, metadata) => schedule(event, payload, new Date(Date.now() + delayMs), metadata));
56
+ export const scheduleAfter = (async (event, payload, delayMs, metadata) => {
57
+ // A non-finite delay (NaN/Infinity) would produce an Invalid Date; reject it
58
+ // here so the error names the actual offending argument. A negative delay is
59
+ // allowed — it resolves to a past time and fires ASAP.
60
+ if (!Number.isFinite(delayMs)) {
61
+ throw new Error(`scheduleAfter: \`delayMs\` must be a finite number, received ${String(delayMs)}`);
62
+ }
63
+ return schedule(event, payload, new Date(Date.now() + delayMs), metadata);
64
+ });
48
65
  /**
49
66
  * Attempt to cancel a previously {@link schedule}d event from inside a handler.
50
67
  * UoW-aware: joins the active transaction, so cancelling then throwing does not
@@ -1 +1 @@
1
- {"version":3,"file":"schedule.js","sourceRoot":"","sources":["../src/schedule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAiB,WAAW,EAAoB,MAAM,mBAAmB,CAAA;AACpG,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAA;AAU9E;;;;;GAKG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAgC,WAAW,CAAC,gBAAgB,CAAC,CAAA;AAa7F;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAqB,CAAC,KAAK,EAC9C,KAAyB,EACzB,OAAmB,EACnB,EAAQ,EACR,QAAmB,EACK,EAAE;IAC1B,MAAM,KAAK,GAAG,sBAAsB,EAAE,CAAA,CAAC,qBAAqB;IAC5D,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,mBAAmB,CAAC,MAAM,CAA+B,CAAA;IAC/F,IAAI,CAAC,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAA;IAEhE,MAAM,YAAY,GAAiB;QACjC,UAAU,EAAE,kBAAkB,EAAE;QAChC,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,OAAO;QACP,QAAQ,EAAE,QAAQ,IAAI,KAAK,CAAC,QAAQ;QACpC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE;KAC5C,CAAA;IACD,OAAO,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,EAAE,CAAC,CAAA;AAC7C,CAAC,CAAqB,CAAA;AAatB;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAA0B,CAAC,CACnD,KAA2B,EAC3B,OAAgB,EAChB,OAAe,EACf,QAAmB,EACnB,EAAE,CAAC,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,EAAE,QAAoB,CAAC,CAA0B,CAAA;AAE7G;;;;GAIG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EAAE,KAAoB,EAAyB,EAAE;IAClF,MAAM,KAAK,GAAG,sBAAsB,EAAE,CAAA,CAAC,qBAAqB;IAC5D,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,mBAAmB,CAAC,MAAM,CAA+B,CAAA;IAC/F,IAAI,CAAC,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAA;IAChE,OAAO,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AAChC,CAAC,CAAA"}
1
+ {"version":3,"file":"schedule.js","sourceRoot":"","sources":["../src/schedule.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAiB,WAAW,EAAoB,MAAM,mBAAmB,CAAA;AACpG,OAAO,EAAE,sBAAsB,EAAE,MAAM,uCAAuC,CAAA;AAU9E;;;;;GAKG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAgC,WAAW,CAAC,gBAAgB,CAAC,CAAA;AAa7F;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,CAAC,MAAM,QAAQ,GAAqB,CAAC,KAAK,EAC9C,KAAyB,EACzB,OAAmB,EACnB,EAAQ,EACR,QAAmB,EACK,EAAE;IAC1B,MAAM,KAAK,GAAG,sBAAsB,EAAE,CAAA,CAAC,qBAAqB;IAC5D,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,mBAAmB,CAAC,MAAM,CAA+B,CAAA;IAC/F,IAAI,CAAC,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAA;IAEhE,2EAA2E;IAC3E,2EAA2E;IAC3E,0EAA0E;IAC1E,6EAA6E;IAC7E,sDAAsD;IACtD,IAAI,CAAC,CAAC,EAAE,YAAY,IAAI,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,EAAE,CAAC;QACxD,MAAM,IAAI,KAAK,CAAC,mDAAmD,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC,CAAA;IAClF,CAAC;IAED,MAAM,YAAY,GAAiB;QACjC,IAAI,EAAE,OAAO;QACb,UAAU,EAAE,kBAAkB,EAAE;QAChC,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,OAAO;QACP,QAAQ,EAAE,QAAQ,IAAI,KAAK,CAAC,QAAQ;QACpC,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE;QACrB,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE;KAC5C,CAAA;IACD,OAAO,SAAS,CAAC,QAAQ,CAAC,YAAY,EAAE,EAAE,CAAC,CAAA;AAC7C,CAAC,CAAqB,CAAA;AAatB;;;GAGG;AACH,MAAM,CAAC,MAAM,aAAa,GAA0B,CAAC,KAAK,EACxD,KAA2B,EAC3B,OAAgB,EAChB,OAAe,EACf,QAAmB,EACnB,EAAE;IACF,6EAA6E;IAC7E,6EAA6E;IAC7E,uDAAuD;IACvD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9B,MAAM,IAAI,KAAK,CAAC,gEAAgE,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IACpG,CAAC;IACD,OAAO,QAAQ,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,OAAO,CAAC,EAAE,QAAoB,CAAC,CAAA;AACvF,CAAC,CAA0B,CAAA;AAE3B;;;;GAIG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG,KAAK,EAAE,KAAoB,EAAyB,EAAE;IAClF,MAAM,KAAK,GAAG,sBAAsB,EAAE,CAAA,CAAC,qBAAqB;IAC5D,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,GAAG,CAAC,mBAAmB,CAAC,MAAM,CAA+B,CAAA;IAC/F,IAAI,CAAC,SAAS;QAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,CAAC,CAAA;IAChE,OAAO,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;AAChC,CAAC,CAAA"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kronos-ts/eventsourcing",
3
- "version": "0.2.0",
3
+ "version": "0.2.2",
4
4
  "description": "Event sourcing for Kronos — dynamic-consistency-boundary event store with load/append.",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -48,11 +48,11 @@
48
48
  },
49
49
  "dependencies": {
50
50
  "@kronos-ts/common": "0.1.1",
51
- "@kronos-ts/messaging": "0.5.0",
52
- "@kronos-ts/modelling": "0.2.3",
51
+ "@kronos-ts/messaging": "0.6.0",
52
+ "@kronos-ts/modelling": "0.2.5",
53
53
  "zod": "^4.3.6"
54
54
  },
55
55
  "devDependencies": {
56
- "@kronos-ts/app": "0.3.3"
56
+ "@kronos-ts/app": "0.4.0"
57
57
  }
58
58
  }
package/src/append.ts CHANGED
@@ -2,6 +2,7 @@ import {
2
2
  resourceKey,
3
3
  qualifiedNameToString,
4
4
  generateIdentifier,
5
+ mergeMetadata,
5
6
  type Metadata,
6
7
  type ResourceKey,
7
8
  } from "@kronos-ts/common"
@@ -10,6 +11,7 @@ import {
10
11
  computeIfAbsent,
11
12
  requireInvocationPhase,
12
13
  } from "@kronos-ts/messaging/processing-state"
14
+ import { CORRELATION_DATA_KEY } from "@kronos-ts/messaging/correlation-data"
13
15
  import type { z } from "zod"
14
16
  import type { EventDescriptor, EventMessage, EventCriteria } from "@kronos-ts/messaging"
15
17
 
@@ -55,12 +57,26 @@ export const append: AppendFunction = ((
55
57
  const state = requireInvocationPhase() // D-43 mutator guard
56
58
  const events = computeIfAbsent(BUFFERED_EVENTS_KEY, () => [])
57
59
  const tags = eventDescriptor.tags ? eventDescriptor.tags(eventPayload) : []
60
+
61
+ // Apply the active UnitOfWork's correlation data to the appended event so it
62
+ // carries the correct correlationId/causationId of the message currently
63
+ // being handled. Merges over the base metadata (explicit arg, else UoW
64
+ // metadata). No-op when no correlation data is set — keeps events untouched
65
+ // for apps that don't configure correlation providers.
66
+ const baseMetadata = eventMetadata ?? state.metadata // fallback to UoW metadata when caller omits
67
+ const correlationData = getResource(CORRELATION_DATA_KEY)
68
+ const metadata =
69
+ correlationData && Object.keys(correlationData).length > 0
70
+ ? mergeMetadata(baseMetadata, correlationData)
71
+ : baseMetadata
72
+
58
73
  const eventMessage: EventMessage = {
74
+ kind: "event",
59
75
  identifier: generateIdentifier(),
60
76
  name: eventDescriptor.name,
61
77
  version: eventDescriptor.version,
62
78
  payload: eventPayload,
63
- metadata: eventMetadata ?? state.metadata, // fallback to UoW metadata when caller omits
79
+ metadata,
64
80
  timestamp: Date.now(),
65
81
  tags,
66
82
  }
package/src/schedule.ts CHANGED
@@ -55,7 +55,17 @@ export const schedule: ScheduleFunction = (async <P extends z.ZodType>(
55
55
  const scheduler = state.resources.get(EVENT_SCHEDULER_KEY.symbol) as EventScheduler | undefined
56
56
  if (!scheduler) throw new Error("No event scheduler configured")
57
57
 
58
+ // Reject malformed fire times. A past-but-valid `at` is allowed — it fires
59
+ // ASAP, which is the intended deadline semantic — but an Invalid Date is a
60
+ // caller bug that otherwise behaves inconsistently across schedulers (the
61
+ // in-memory one fires immediately; the postgres one throws on toISOString at
62
+ // insert time). Fail fast and uniformly here instead.
63
+ if (!(at instanceof Date) || Number.isNaN(at.getTime())) {
64
+ throw new Error(`schedule: \`at\` must be a valid Date, received ${String(at)}`)
65
+ }
66
+
58
67
  const eventMessage: EventMessage = {
68
+ kind: "event",
59
69
  identifier: generateIdentifier(),
60
70
  name: event.name,
61
71
  version: event.version,
@@ -82,12 +92,20 @@ export interface ScheduleAfterFunction {
82
92
  * Convenience wrapper over {@link schedule}: fire `delayMs` milliseconds from
83
93
  * now instead of at an absolute {@link Date}.
84
94
  */
85
- export const scheduleAfter: ScheduleAfterFunction = ((
95
+ export const scheduleAfter: ScheduleAfterFunction = (async (
86
96
  event: EventDescriptor<any>,
87
97
  payload: unknown,
88
98
  delayMs: number,
89
99
  metadata?: Metadata,
90
- ) => schedule(event, payload, new Date(Date.now() + delayMs), metadata as Metadata)) as ScheduleAfterFunction
100
+ ) => {
101
+ // A non-finite delay (NaN/Infinity) would produce an Invalid Date; reject it
102
+ // here so the error names the actual offending argument. A negative delay is
103
+ // allowed — it resolves to a past time and fires ASAP.
104
+ if (!Number.isFinite(delayMs)) {
105
+ throw new Error(`scheduleAfter: \`delayMs\` must be a finite number, received ${String(delayMs)}`)
106
+ }
107
+ return schedule(event, payload, new Date(Date.now() + delayMs), metadata as Metadata)
108
+ }) as ScheduleAfterFunction
91
109
 
92
110
  /**
93
111
  * Attempt to cancel a previously {@link schedule}d event from inside a handler.