@schorts/shared-kernel 2.4.1 → 2.5.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 (95) hide show
  1. package/CHANGELOG +12 -0
  2. package/README.md +7 -0
  3. package/dist/cjs/domain-events/domain-event-registry.js +19 -0
  4. package/dist/cjs/domain-events/domain-event-registry.js.map +1 -0
  5. package/dist/cjs/domain-events/domain-event.js +5 -1
  6. package/dist/cjs/domain-events/domain-event.js.map +1 -1
  7. package/dist/cjs/domain-events/exceptions/domain-event-not-registered.js +13 -0
  8. package/dist/cjs/domain-events/exceptions/domain-event-not-registered.js.map +1 -0
  9. package/dist/cjs/domain-events/exceptions/index.js +6 -0
  10. package/dist/cjs/domain-events/exceptions/index.js.map +1 -0
  11. package/dist/cjs/domain-events/index.js +18 -1
  12. package/dist/cjs/domain-events/index.js.map +1 -1
  13. package/dist/cjs/event-bus/event-store.js +3 -0
  14. package/dist/cjs/event-bus/event-store.js.map +1 -0
  15. package/dist/cjs/event-bus/event-subscriber.js +3 -0
  16. package/dist/cjs/event-bus/event-subscriber.js.map +1 -0
  17. package/dist/cjs/event-bus/in-memory/async-in-memory-event-bus.js +57 -0
  18. package/dist/cjs/event-bus/in-memory/async-in-memory-event-bus.js.map +1 -0
  19. package/dist/cjs/event-bus/in-memory/in-memory-event-store.js +25 -0
  20. package/dist/cjs/event-bus/in-memory/in-memory-event-store.js.map +1 -0
  21. package/dist/cjs/event-bus/in-memory/index.js +8 -0
  22. package/dist/cjs/event-bus/in-memory/index.js.map +1 -0
  23. package/dist/cjs/event-bus/index.js +18 -0
  24. package/dist/cjs/event-bus/index.js.map +1 -0
  25. package/dist/cjs/index.js +1 -0
  26. package/dist/cjs/index.js.map +1 -1
  27. package/dist/cjs/json-api/json-api-connector.js.map +1 -1
  28. package/dist/esm/domain-events/domain-event-registry.js +19 -0
  29. package/dist/esm/domain-events/domain-event-registry.js.map +1 -0
  30. package/dist/esm/domain-events/domain-event.js +5 -1
  31. package/dist/esm/domain-events/domain-event.js.map +1 -1
  32. package/dist/esm/domain-events/exceptions/domain-event-not-registered.js +13 -0
  33. package/dist/esm/domain-events/exceptions/domain-event-not-registered.js.map +1 -0
  34. package/dist/esm/domain-events/exceptions/index.js +6 -0
  35. package/dist/esm/domain-events/exceptions/index.js.map +1 -0
  36. package/dist/esm/domain-events/index.js +18 -1
  37. package/dist/esm/domain-events/index.js.map +1 -1
  38. package/dist/esm/event-bus/event-store.js +3 -0
  39. package/dist/esm/event-bus/event-store.js.map +1 -0
  40. package/dist/esm/event-bus/event-subscriber.js +3 -0
  41. package/dist/esm/event-bus/event-subscriber.js.map +1 -0
  42. package/dist/esm/event-bus/in-memory/async-in-memory-event-bus.js +57 -0
  43. package/dist/esm/event-bus/in-memory/async-in-memory-event-bus.js.map +1 -0
  44. package/dist/esm/event-bus/in-memory/in-memory-event-store.js +25 -0
  45. package/dist/esm/event-bus/in-memory/in-memory-event-store.js.map +1 -0
  46. package/dist/esm/event-bus/in-memory/index.js +8 -0
  47. package/dist/esm/event-bus/in-memory/index.js.map +1 -0
  48. package/dist/esm/event-bus/index.js +18 -0
  49. package/dist/esm/event-bus/index.js.map +1 -0
  50. package/dist/esm/index.js +1 -0
  51. package/dist/esm/index.js.map +1 -1
  52. package/dist/esm/json-api/json-api-connector.js.map +1 -1
  53. package/dist/types/domain-events/domain-event-primitives.d.ts +3 -0
  54. package/dist/types/domain-events/domain-event-primitives.d.ts.map +1 -1
  55. package/dist/types/domain-events/domain-event-registry.d.ts +13 -0
  56. package/dist/types/domain-events/domain-event-registry.d.ts.map +1 -0
  57. package/dist/types/domain-events/domain-event.d.ts +8 -1
  58. package/dist/types/domain-events/domain-event.d.ts.map +1 -1
  59. package/dist/types/domain-events/exceptions/domain-event-not-registered.d.ts +5 -0
  60. package/dist/types/domain-events/exceptions/domain-event-not-registered.d.ts.map +1 -0
  61. package/dist/types/domain-events/exceptions/index.d.ts +2 -0
  62. package/dist/types/domain-events/exceptions/index.d.ts.map +1 -0
  63. package/dist/types/domain-events/index.d.ts +2 -0
  64. package/dist/types/domain-events/index.d.ts.map +1 -1
  65. package/dist/types/event-bus/event-store.d.ts +9 -0
  66. package/dist/types/event-bus/event-store.d.ts.map +1 -0
  67. package/dist/types/event-bus/event-subscriber.d.ts +5 -0
  68. package/dist/types/event-bus/event-subscriber.d.ts.map +1 -0
  69. package/dist/types/event-bus/in-memory/async-in-memory-event-bus.d.ts +14 -0
  70. package/dist/types/event-bus/in-memory/async-in-memory-event-bus.d.ts.map +1 -0
  71. package/dist/types/event-bus/in-memory/in-memory-event-store.d.ts +11 -0
  72. package/dist/types/event-bus/in-memory/in-memory-event-store.d.ts.map +1 -0
  73. package/dist/types/event-bus/in-memory/index.d.ts +3 -0
  74. package/dist/types/event-bus/in-memory/index.d.ts.map +1 -0
  75. package/dist/types/event-bus/index.d.ts +4 -0
  76. package/dist/types/event-bus/index.d.ts.map +1 -0
  77. package/dist/types/index.d.ts +1 -0
  78. package/dist/types/index.d.ts.map +1 -1
  79. package/dist/types/json-api/json-api-connector.d.ts +1 -0
  80. package/dist/types/json-api/json-api-connector.d.ts.map +1 -1
  81. package/package.json +6 -1
  82. package/src/domain-events/domain-event-primitives.ts +3 -0
  83. package/src/domain-events/domain-event-registry.ts +40 -0
  84. package/src/domain-events/domain-event.ts +4 -0
  85. package/src/domain-events/exceptions/domain-event-not-registered.ts +11 -0
  86. package/src/domain-events/exceptions/index.ts +1 -0
  87. package/src/domain-events/index.ts +2 -0
  88. package/src/event-bus/event-store.ts +9 -0
  89. package/src/event-bus/event-subscriber.ts +5 -0
  90. package/src/event-bus/in-memory/async-in-memory-event-bus.ts +67 -0
  91. package/src/event-bus/in-memory/in-memory-event-store.ts +28 -0
  92. package/src/event-bus/in-memory/index.ts +2 -0
  93. package/src/event-bus/index.ts +3 -0
  94. package/src/index.ts +1 -0
  95. package/src/json-api/json-api-connector.ts +1 -0
package/CHANGELOG CHANGED
@@ -5,6 +5,18 @@ All notable changes to this project will be documented in this file.
5
5
  The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/),
6
6
  and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
7
7
 
8
+ ## [2.5.0] - 2025-10-12
9
+
10
+ ### Added
11
+
12
+ _ Added `event-bus` with `in-memory` implementations.
13
+
14
+ ## [2.4.2] - 2025-10-12
15
+
16
+ ### Fixed
17
+
18
+ - Add `id` param to `create` method in the `JSONAPIConnector`.
19
+
8
20
  ## [2.4.1] - 2025-10-12
9
21
 
10
22
  ### Fixed
package/README.md CHANGED
@@ -32,6 +32,13 @@ npm install @schorts/shared-kernel --save
32
32
  - **Entity:** Base class for identity-based domain entities.
33
33
  - **EntityRegistry:** Dynamic registry for entity constructors, enabling polymorphic and type-safe instantiation of domain entities from serialized data.
34
34
 
35
+ ### 🔁 Event Bus
36
+
37
+ - **AsyncInMemoryEventBus:** Lightweight, in-memory event dispatcher with support for retries, acknowledgments, and requeueing. Designed for testing, local development, or as a foundation for more robust event-driven architectures.
38
+ - **DomainEventRegistry:** Centralized registry for hydrating polymorphic domain events from serialized primitives.
39
+ - **EventSubscriber:** Interface for subscribing to specific event types with clean, type-safe handlers.
40
+ - **InMemoryEventStore:** Simple event store for tracking and replaying events, with retry metadata and bounded requeue support.
41
+
35
42
  ### 🧹 Formatters
36
43
 
37
44
  - **PascalCamelToSnake:** Utility for converting PascalCase or camelCase to snake_case.
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DomainEventRegistry = void 0;
4
+ const exceptions_1 = require("./exceptions");
5
+ class DomainEventRegistry {
6
+ static registry = new Map();
7
+ static register(eventName, constructor) {
8
+ this.registry.set(eventName, constructor);
9
+ }
10
+ static create(primitives) {
11
+ const Constructor = this.registry.get(primitives.type);
12
+ if (!Constructor) {
13
+ throw new exceptions_1.DomainEventNotRegistered(primitives.type);
14
+ }
15
+ return new Constructor(primitives.id, new Date(primitives.occurred_at), primitives.type, primitives.version, primitives.payload, primitives.meta);
16
+ }
17
+ }
18
+ exports.DomainEventRegistry = DomainEventRegistry;
19
+ //# sourceMappingURL=domain-event-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domain-event-registry.js","sourceRoot":"","sources":["../../../src/domain-events/domain-event-registry.ts"],"names":[],"mappings":";;;AACA,6CAAwD;AAexD,MAAa,mBAAmB;IACtB,MAAM,CAAC,QAAQ,GAAG,IAAI,GAAG,EAAkC,CAAC;IAEpE,MAAM,CAAC,QAAQ,CAAC,SAAiB,EAAE,WAAmC;QACpE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAC5C,CAAC;IAED,MAAM,CAAC,MAAM,CAAC,UAAiC;QAC7C,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAEvD,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,IAAI,qCAAwB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACtD,CAAC;QAED,OAAO,IAAI,WAAW,CACpB,UAAU,CAAC,EAAE,EACb,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAChC,UAAU,CAAC,IAAI,EACf,UAAU,CAAC,OAAO,EAClB,UAAU,CAAC,OAAO,EAClB,UAAU,CAAC,IAAI,CAChB,CAAC;IACJ,CAAC;;AAtBH,kDAuBC"}
@@ -7,13 +7,17 @@ class DomainEvent {
7
7
  type;
8
8
  version;
9
9
  payload;
10
- constructor(id, occurredAt, type, version, payload) {
10
+ meta;
11
+ constructor(id, occurredAt, type, version, payload, meta = { retries: 0 }) {
11
12
  this.id = id;
12
13
  this.occurredAt = occurredAt;
13
14
  this.type = type;
14
15
  this.version = version;
15
16
  this.payload = payload;
17
+ this.meta = meta;
16
18
  }
19
+ ack;
20
+ requeue;
17
21
  }
18
22
  exports.DomainEvent = DomainEvent;
19
23
  //# sourceMappingURL=domain-event.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"domain-event.js","sourceRoot":"","sources":["../../../src/domain-events/domain-event.ts"],"names":[],"mappings":";;;AAGA,MAAsB,WAAW;IAEpB;IACA;IACA;IACA;IACA;IALX,YACW,EAAU,EACV,UAAgB,EAChB,IAAY,EACZ,OAAe,EACf,OAAsB;QAJtB,OAAE,GAAF,EAAE,CAAQ;QACV,eAAU,GAAV,UAAU,CAAM;QAChB,SAAI,GAAJ,IAAI,CAAQ;QACZ,YAAO,GAAP,OAAO,CAAQ;QACf,YAAO,GAAP,OAAO,CAAe;IAC9B,CAAC;CAIL;AAXD,kCAWC"}
1
+ {"version":3,"file":"domain-event.js","sourceRoot":"","sources":["../../../src/domain-events/domain-event.ts"],"names":[],"mappings":";;;AAGA,MAAsB,WAAW;IAEpB;IACA;IACA;IACA;IACA;IACF;IANT,YACW,EAAU,EACV,UAAgB,EAChB,IAAY,EACZ,OAAe,EACf,OAAsB,EACxB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE;QALnB,OAAE,GAAF,EAAE,CAAQ;QACV,eAAU,GAAV,UAAU,CAAM;QAChB,SAAI,GAAJ,IAAI,CAAQ;QACZ,YAAO,GAAP,OAAO,CAAQ;QACf,YAAO,GAAP,OAAO,CAAe;QACxB,SAAI,GAAJ,IAAI,CAAiB;IAC3B,CAAC;IAKJ,GAAG,CAAc;IACjB,OAAO,CAAc;CACtB;AAfD,kCAeC"}
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DomainEventNotRegistered = void 0;
4
+ class DomainEventNotRegistered extends Error {
5
+ constructor(domainEventName, translationResolver) {
6
+ const message = translationResolver
7
+ ? translationResolver.resolve("domain_events.errors.domain_event_not_registered")
8
+ : `DomainEvent Not Registered: ${domainEventName}`;
9
+ super(message);
10
+ }
11
+ }
12
+ exports.DomainEventNotRegistered = DomainEventNotRegistered;
13
+ //# sourceMappingURL=domain-event-not-registered.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domain-event-not-registered.js","sourceRoot":"","sources":["../../../../src/domain-events/exceptions/domain-event-not-registered.ts"],"names":[],"mappings":";;;AAEA,MAAa,wBAAyB,SAAQ,KAAK;IACjD,YAAY,eAAuB,EAAE,mBAAyC;QAC5E,MAAM,OAAO,GAAG,mBAAmB;YACjC,CAAC,CAAC,mBAAmB,CAAC,OAAO,CAAC,kDAAkD,CAAC;YACjF,CAAC,CAAC,+BAA+B,eAAe,EAAE,CAAC;QAErD,KAAK,CAAC,OAAO,CAAC,CAAC;IACjB,CAAC;CACF;AARD,4DAQC"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DomainEventNotRegistered = void 0;
4
+ var domain_event_not_registered_1 = require("./domain-event-not-registered");
5
+ Object.defineProperty(exports, "DomainEventNotRegistered", { enumerable: true, get: function () { return domain_event_not_registered_1.DomainEventNotRegistered; } });
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/domain-events/exceptions/index.ts"],"names":[],"mappings":";;;AAAA,6EAAyE;AAAhE,uIAAA,wBAAwB,OAAA"}
@@ -1,6 +1,23 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
2
16
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DomainEvent = void 0;
17
+ exports.DomainEventRegistry = exports.DomainEvent = void 0;
4
18
  var domain_event_1 = require("./domain-event");
5
19
  Object.defineProperty(exports, "DomainEvent", { enumerable: true, get: function () { return domain_event_1.DomainEvent; } });
20
+ __exportStar(require("./exceptions"), exports);
21
+ var domain_event_registry_1 = require("./domain-event-registry");
22
+ Object.defineProperty(exports, "DomainEventRegistry", { enumerable: true, get: function () { return domain_event_registry_1.DomainEventRegistry; } });
6
23
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/domain-events/index.ts"],"names":[],"mappings":";;;AAAA,+CAA6C;AAApC,2GAAA,WAAW,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/domain-events/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,+CAA6C;AAApC,2GAAA,WAAW,OAAA;AAEpB,+CAA6B;AAC7B,iEAA8D;AAArD,4HAAA,mBAAmB,OAAA"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=event-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-store.js","sourceRoot":"","sources":["../../../src/event-bus/event-store.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=event-subscriber.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-subscriber.js","sourceRoot":"","sources":["../../../src/event-bus/event-subscriber.ts"],"names":[],"mappings":""}
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AsyncInMemoryEventBus = void 0;
4
+ const domain_events_1 = require("../../domain-events");
5
+ const in_memory_event_store_1 = require("./in-memory-event-store");
6
+ class AsyncInMemoryEventBus {
7
+ subscribers = new Map();
8
+ store;
9
+ maxRetries;
10
+ constructor(store = new in_memory_event_store_1.InMemoryEventStore(), maxRetries = 3) {
11
+ this.store = store;
12
+ this.maxRetries = maxRetries;
13
+ }
14
+ subscribe(eventName, subscriber) {
15
+ if (!this.subscribers.has(eventName)) {
16
+ this.subscribers.set(eventName, []);
17
+ }
18
+ this.subscribers.get(eventName).push(subscriber);
19
+ }
20
+ async publish(event) {
21
+ const primitives = event.toPrimitives();
22
+ this.store.save(primitives);
23
+ await this.dispatch(event);
24
+ }
25
+ async dispatch(event) {
26
+ const eventName = event.getEventName();
27
+ const subs = this.subscribers.get(eventName) ?? [];
28
+ const primitives = event.toPrimitives();
29
+ event.ack = () => this.store.delete(event.id);
30
+ event.requeue = () => {
31
+ event.ack?.();
32
+ if (event.meta.retries < this.maxRetries) {
33
+ const updatedPrimitives = {
34
+ ...primitives,
35
+ meta: { ...primitives.meta, retries: event.meta.retries + 1 },
36
+ };
37
+ this.store.requeue(updatedPrimitives);
38
+ this.publish(domain_events_1.DomainEventRegistry.create(updatedPrimitives));
39
+ }
40
+ else {
41
+ console.warn(`Event ${event.id} exceeded max retries (${this.maxRetries}). Dropping.`);
42
+ }
43
+ };
44
+ for (const sub of subs) {
45
+ await sub.handle(event);
46
+ }
47
+ }
48
+ async replay() {
49
+ const events = this.store.all();
50
+ for (const primitives of events) {
51
+ const event = domain_events_1.DomainEventRegistry.create(primitives);
52
+ await this.dispatch(event);
53
+ }
54
+ }
55
+ }
56
+ exports.AsyncInMemoryEventBus = AsyncInMemoryEventBus;
57
+ //# sourceMappingURL=async-in-memory-event-bus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"async-in-memory-event-bus.js","sourceRoot":"","sources":["../../../../src/event-bus/in-memory/async-in-memory-event-bus.ts"],"names":[],"mappings":";;;AAAA,uDAAuE;AACvE,mEAA6D;AAI7D,MAAa,qBAAqB;IACf,WAAW,GAAG,IAAI,GAAG,EAA6B,CAAC;IACnD,KAAK,CAAa;IAClB,UAAU,CAAS;IAEpC,YAAY,QAAoB,IAAI,0CAAkB,EAAE,EAAE,UAAU,GAAG,CAAC;QACtE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;IAED,SAAS,CAA4B,SAAiB,EAAE,UAAkC;QACxF,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YACrC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACtC,CAAC;QAED,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,OAAO,CAA4B,KAAY;QACnD,MAAM,UAAU,GAAG,KAAK,CAAC,YAAY,EAAE,CAAC;QAExC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAE5B,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAEO,KAAK,CAAC,QAAQ,CAAC,KAAkB;QACvC,MAAM,SAAS,GAAG,KAAK,CAAC,YAAY,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QACnD,MAAM,UAAU,GAAG,KAAK,CAAC,YAAY,EAAE,CAAC;QAExC,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC9C,KAAK,CAAC,OAAO,GAAG,GAAG,EAAE;YACnB,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC;YAEd,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;gBACzC,MAAM,iBAAiB,GAAG;oBACxB,GAAG,UAAU;oBACb,IAAI,EAAE,EAAE,GAAG,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,EAAE;iBAC9D,CAAC;gBAEF,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;gBACtC,IAAI,CAAC,OAAO,CAAC,mCAAmB,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC;YAC9D,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC,SAAS,KAAK,CAAC,EAAE,0BAA0B,IAAI,CAAC,UAAU,cAAc,CAAC,CAAC;YACzF,CAAC;QACH,CAAC,CAAC;QAEF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM;QACV,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QAEhC,KAAK,MAAM,UAAU,IAAI,MAAM,EAAE,CAAC;YAChC,MAAM,KAAK,GAAG,mCAAmB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YACrD,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;CACF;AA7DD,sDA6DC"}
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InMemoryEventStore = void 0;
4
+ class InMemoryEventStore {
5
+ events = [];
6
+ save(primitives) {
7
+ this.events.push(primitives);
8
+ }
9
+ all() {
10
+ return [...this.events];
11
+ }
12
+ delete(id) {
13
+ const index = this.events.findIndex(e => e.id === id);
14
+ if (index !== -1)
15
+ this.events.splice(index, 1);
16
+ }
17
+ requeue(primitives) {
18
+ this.events.push(primitives);
19
+ }
20
+ clear() {
21
+ this.events.length = 0;
22
+ }
23
+ }
24
+ exports.InMemoryEventStore = InMemoryEventStore;
25
+ //# sourceMappingURL=in-memory-event-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-memory-event-store.js","sourceRoot":"","sources":["../../../../src/event-bus/in-memory/in-memory-event-store.ts"],"names":[],"mappings":";;;AAGA,MAAa,kBAAkB;IACZ,MAAM,GAA4B,EAAE,CAAC;IAEtD,IAAI,CAAC,UAAiC;QACpC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC/B,CAAC;IAED,GAAG;QACD,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC;IAED,MAAM,CAAC,EAAU;QACf,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAEtD,IAAI,KAAK,KAAK,CAAC,CAAC;YAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACjD,CAAC;IAED,OAAO,CAAC,UAAiC;QACvC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IACzB,CAAC;CACF;AAxBD,gDAwBC"}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AsyncInMemoryEventBus = exports.InMemoryEventStore = void 0;
4
+ var in_memory_event_store_1 = require("./in-memory-event-store");
5
+ Object.defineProperty(exports, "InMemoryEventStore", { enumerable: true, get: function () { return in_memory_event_store_1.InMemoryEventStore; } });
6
+ var async_in_memory_event_bus_1 = require("./async-in-memory-event-bus");
7
+ Object.defineProperty(exports, "AsyncInMemoryEventBus", { enumerable: true, get: function () { return async_in_memory_event_bus_1.AsyncInMemoryEventBus; } });
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/event-bus/in-memory/index.ts"],"names":[],"mappings":";;;AAAA,iEAA6D;AAApD,2HAAA,kBAAkB,OAAA;AAC3B,yEAAmE;AAA1D,kIAAA,qBAAqB,OAAA"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./in-memory"), exports);
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/event-bus/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAEA,8CAA4B"}
package/dist/cjs/index.js CHANGED
@@ -19,6 +19,7 @@ __exportStar(require("./criteria"), exports);
19
19
  __exportStar(require("./dao"), exports);
20
20
  __exportStar(require("./domain-events"), exports);
21
21
  __exportStar(require("./entities"), exports);
22
+ __exportStar(require("./event-bus"), exports);
22
23
  __exportStar(require("./formatters"), exports);
23
24
  __exportStar(require("./http"), exports);
24
25
  __exportStar(require("./i18n"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yCAAuB;AACvB,6CAA2B;AAC3B,wCAAsB;AACtB,kDAAgC;AAChC,6CAA2B;AAC3B,+CAA6B;AAC7B,yCAAuB;AACvB,yCAAuB;AACvB,6CAA2B;AAC3B,6CAA2B;AAC3B,2CAAyB;AACzB,yCAAuB;AACvB,2CAAyB;AACzB,kDAAgC;AAChC,iDAA+B;AAC/B,0CAAwB;AACxB,kDAAgC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yCAAuB;AACvB,6CAA2B;AAC3B,wCAAsB;AACtB,kDAAgC;AAChC,6CAA2B;AAC3B,8CAA4B;AAC5B,+CAA6B;AAC7B,yCAAuB;AACvB,yCAAuB;AACvB,6CAA2B;AAC3B,6CAA2B;AAC3B,2CAAyB;AACzB,yCAAuB;AACvB,2CAAyB;AACzB,kDAAgC;AAChC,iDAA+B;AAC/B,0CAAwB;AACxB,kDAAgC"}
@@ -1 +1 @@
1
- {"version":3,"file":"json-api-connector.js","sourceRoot":"","sources":["../../../src/json-api/json-api-connector.ts"],"names":[],"mappings":";;;AAAA,kCAAsD;AAGtD,iEAA4D;AAE5D,6CAA6C;AAE7C,MAAa,gBAAgB;IACP;IAApB,YAAoB,IAAkB;QAAlB,SAAI,GAAJ,IAAI,CAAc;IAAG,CAAC;IAE1C,KAAK,CAAC,OAAO,CACX,GAAQ,EACR,QAAmB,EACnB,OAAkB;QAElB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,yCAAkB,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC;YAEvE,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAChC,CAAC;QAAC,OAAM,KAAK,EAAE,CAAC;YACd,IAAI,KAAK,YAAY,oBAAa,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBACjD,MAAM,IAAI,0BAAa,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YAChD,CAAC;YAED,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,QAAQ,CACZ,GAAQ,EACR,QAAmB,EACnB,OAAkB;QAElB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,yCAAkB,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC;YAEvE,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAChC,CAAC;QAAC,OAAM,KAAK,EAAE,CAAC;YACd,IAAI,KAAK,YAAY,oBAAa,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBACjD,MAAM,IAAI,0BAAa,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YAChD,CAAC;YAED,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CACV,GAAQ,EACR,OAGC;QAED,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QAChD,CAAC;QAAC,OAAM,KAAK,EAAE,CAAC;YACd,IAAI,KAAK,YAAY,oBAAa,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBACjD,MAAM,IAAI,0BAAa,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YAChD,CAAC;YAED,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CACV,GAAQ,EACR,OAIC;QAED,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QACjD,CAAC;QAAC,OAAM,KAAK,EAAE,CAAC;YACd,IAAI,KAAK,YAAY,oBAAa,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBACjD,MAAM,IAAI,0BAAa,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YAChD,CAAC;YAED,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CACV,GAAQ;QAER,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC/B,CAAC;QAAC,OAAM,KAAK,EAAE,CAAC;YACd,IAAI,KAAK,YAAY,oBAAa,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBACjD,MAAM,IAAI,0BAAa,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YAChD,CAAC;YAED,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;CACF;AAzFD,4CAyFC"}
1
+ {"version":3,"file":"json-api-connector.js","sourceRoot":"","sources":["../../../src/json-api/json-api-connector.ts"],"names":[],"mappings":";;;AAAA,kCAAsD;AAGtD,iEAA4D;AAE5D,6CAA6C;AAE7C,MAAa,gBAAgB;IACP;IAApB,YAAoB,IAAkB;QAAlB,SAAI,GAAJ,IAAI,CAAc;IAAG,CAAC;IAE1C,KAAK,CAAC,OAAO,CACX,GAAQ,EACR,QAAmB,EACnB,OAAkB;QAElB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,yCAAkB,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC;YAEvE,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAChC,CAAC;QAAC,OAAM,KAAK,EAAE,CAAC;YACd,IAAI,KAAK,YAAY,oBAAa,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBACjD,MAAM,IAAI,0BAAa,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YAChD,CAAC;YAED,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,QAAQ,CACZ,GAAQ,EACR,QAAmB,EACnB,OAAkB;QAElB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,yCAAkB,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC;YAEvE,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAChC,CAAC;QAAC,OAAM,KAAK,EAAE,CAAC;YACd,IAAI,KAAK,YAAY,oBAAa,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBACjD,MAAM,IAAI,0BAAa,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YAChD,CAAC;YAED,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CACV,GAAQ,EACR,OAIC;QAED,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QAChD,CAAC;QAAC,OAAM,KAAK,EAAE,CAAC;YACd,IAAI,KAAK,YAAY,oBAAa,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBACjD,MAAM,IAAI,0BAAa,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YAChD,CAAC;YAED,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CACV,GAAQ,EACR,OAIC;QAED,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QACjD,CAAC;QAAC,OAAM,KAAK,EAAE,CAAC;YACd,IAAI,KAAK,YAAY,oBAAa,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBACjD,MAAM,IAAI,0BAAa,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YAChD,CAAC;YAED,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CACV,GAAQ;QAER,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC/B,CAAC;QAAC,OAAM,KAAK,EAAE,CAAC;YACd,IAAI,KAAK,YAAY,oBAAa,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBACjD,MAAM,IAAI,0BAAa,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YAChD,CAAC;YAED,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;CACF;AA1FD,4CA0FC"}
@@ -0,0 +1,19 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DomainEventRegistry = void 0;
4
+ const exceptions_1 = require("./exceptions");
5
+ class DomainEventRegistry {
6
+ static registry = new Map();
7
+ static register(eventName, constructor) {
8
+ this.registry.set(eventName, constructor);
9
+ }
10
+ static create(primitives) {
11
+ const Constructor = this.registry.get(primitives.type);
12
+ if (!Constructor) {
13
+ throw new exceptions_1.DomainEventNotRegistered(primitives.type);
14
+ }
15
+ return new Constructor(primitives.id, new Date(primitives.occurred_at), primitives.type, primitives.version, primitives.payload, primitives.meta);
16
+ }
17
+ }
18
+ exports.DomainEventRegistry = DomainEventRegistry;
19
+ //# sourceMappingURL=domain-event-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domain-event-registry.js","sourceRoot":"","sources":["../../../src/domain-events/domain-event-registry.ts"],"names":[],"mappings":";;;AACA,6CAAwD;AAexD,MAAa,mBAAmB;IACtB,MAAM,CAAC,QAAQ,GAAG,IAAI,GAAG,EAAkC,CAAC;IAEpE,MAAM,CAAC,QAAQ,CAAC,SAAiB,EAAE,WAAmC;QACpE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;IAC5C,CAAC;IAED,MAAM,CAAC,MAAM,CAAC,UAAiC;QAC7C,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QAEvD,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,IAAI,qCAAwB,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;QACtD,CAAC;QAED,OAAO,IAAI,WAAW,CACpB,UAAU,CAAC,EAAE,EACb,IAAI,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC,EAChC,UAAU,CAAC,IAAI,EACf,UAAU,CAAC,OAAO,EAClB,UAAU,CAAC,OAAO,EAClB,UAAU,CAAC,IAAI,CAChB,CAAC;IACJ,CAAC;;AAtBH,kDAuBC"}
@@ -7,13 +7,17 @@ class DomainEvent {
7
7
  type;
8
8
  version;
9
9
  payload;
10
- constructor(id, occurredAt, type, version, payload) {
10
+ meta;
11
+ constructor(id, occurredAt, type, version, payload, meta = { retries: 0 }) {
11
12
  this.id = id;
12
13
  this.occurredAt = occurredAt;
13
14
  this.type = type;
14
15
  this.version = version;
15
16
  this.payload = payload;
17
+ this.meta = meta;
16
18
  }
19
+ ack;
20
+ requeue;
17
21
  }
18
22
  exports.DomainEvent = DomainEvent;
19
23
  //# sourceMappingURL=domain-event.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"domain-event.js","sourceRoot":"","sources":["../../../src/domain-events/domain-event.ts"],"names":[],"mappings":";;;AAGA,MAAsB,WAAW;IAEpB;IACA;IACA;IACA;IACA;IALX,YACW,EAAU,EACV,UAAgB,EAChB,IAAY,EACZ,OAAe,EACf,OAAsB;QAJtB,OAAE,GAAF,EAAE,CAAQ;QACV,eAAU,GAAV,UAAU,CAAM;QAChB,SAAI,GAAJ,IAAI,CAAQ;QACZ,YAAO,GAAP,OAAO,CAAQ;QACf,YAAO,GAAP,OAAO,CAAe;IAC9B,CAAC;CAIL;AAXD,kCAWC"}
1
+ {"version":3,"file":"domain-event.js","sourceRoot":"","sources":["../../../src/domain-events/domain-event.ts"],"names":[],"mappings":";;;AAGA,MAAsB,WAAW;IAEpB;IACA;IACA;IACA;IACA;IACF;IANT,YACW,EAAU,EACV,UAAgB,EAChB,IAAY,EACZ,OAAe,EACf,OAAsB,EACxB,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE;QALnB,OAAE,GAAF,EAAE,CAAQ;QACV,eAAU,GAAV,UAAU,CAAM;QAChB,SAAI,GAAJ,IAAI,CAAQ;QACZ,YAAO,GAAP,OAAO,CAAQ;QACf,YAAO,GAAP,OAAO,CAAe;QACxB,SAAI,GAAJ,IAAI,CAAiB;IAC3B,CAAC;IAKJ,GAAG,CAAc;IACjB,OAAO,CAAc;CACtB;AAfD,kCAeC"}
@@ -0,0 +1,13 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DomainEventNotRegistered = void 0;
4
+ class DomainEventNotRegistered extends Error {
5
+ constructor(domainEventName, translationResolver) {
6
+ const message = translationResolver
7
+ ? translationResolver.resolve("domain_events.errors.domain_event_not_registered")
8
+ : `DomainEvent Not Registered: ${domainEventName}`;
9
+ super(message);
10
+ }
11
+ }
12
+ exports.DomainEventNotRegistered = DomainEventNotRegistered;
13
+ //# sourceMappingURL=domain-event-not-registered.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domain-event-not-registered.js","sourceRoot":"","sources":["../../../../src/domain-events/exceptions/domain-event-not-registered.ts"],"names":[],"mappings":";;;AAEA,MAAa,wBAAyB,SAAQ,KAAK;IACjD,YAAY,eAAuB,EAAE,mBAAyC;QAC5E,MAAM,OAAO,GAAG,mBAAmB;YACjC,CAAC,CAAC,mBAAmB,CAAC,OAAO,CAAC,kDAAkD,CAAC;YACjF,CAAC,CAAC,+BAA+B,eAAe,EAAE,CAAC;QAErD,KAAK,CAAC,OAAO,CAAC,CAAC;IACjB,CAAC;CACF;AARD,4DAQC"}
@@ -0,0 +1,6 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DomainEventNotRegistered = void 0;
4
+ var domain_event_not_registered_1 = require("./domain-event-not-registered");
5
+ Object.defineProperty(exports, "DomainEventNotRegistered", { enumerable: true, get: function () { return domain_event_not_registered_1.DomainEventNotRegistered; } });
6
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/domain-events/exceptions/index.ts"],"names":[],"mappings":";;;AAAA,6EAAyE;AAAhE,uIAAA,wBAAwB,OAAA"}
@@ -1,6 +1,23 @@
1
1
  "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
2
16
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.DomainEvent = void 0;
17
+ exports.DomainEventRegistry = exports.DomainEvent = void 0;
4
18
  var domain_event_1 = require("./domain-event");
5
19
  Object.defineProperty(exports, "DomainEvent", { enumerable: true, get: function () { return domain_event_1.DomainEvent; } });
20
+ __exportStar(require("./exceptions"), exports);
21
+ var domain_event_registry_1 = require("./domain-event-registry");
22
+ Object.defineProperty(exports, "DomainEventRegistry", { enumerable: true, get: function () { return domain_event_registry_1.DomainEventRegistry; } });
6
23
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/domain-events/index.ts"],"names":[],"mappings":";;;AAAA,+CAA6C;AAApC,2GAAA,WAAW,OAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/domain-events/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,+CAA6C;AAApC,2GAAA,WAAW,OAAA;AAEpB,+CAA6B;AAC7B,iEAA8D;AAArD,4HAAA,mBAAmB,OAAA"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=event-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-store.js","sourceRoot":"","sources":["../../../src/event-bus/event-store.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=event-subscriber.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-subscriber.js","sourceRoot":"","sources":["../../../src/event-bus/event-subscriber.ts"],"names":[],"mappings":""}
@@ -0,0 +1,57 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AsyncInMemoryEventBus = void 0;
4
+ const domain_events_1 = require("../../domain-events");
5
+ const in_memory_event_store_1 = require("./in-memory-event-store");
6
+ class AsyncInMemoryEventBus {
7
+ subscribers = new Map();
8
+ store;
9
+ maxRetries;
10
+ constructor(store = new in_memory_event_store_1.InMemoryEventStore(), maxRetries = 3) {
11
+ this.store = store;
12
+ this.maxRetries = maxRetries;
13
+ }
14
+ subscribe(eventName, subscriber) {
15
+ if (!this.subscribers.has(eventName)) {
16
+ this.subscribers.set(eventName, []);
17
+ }
18
+ this.subscribers.get(eventName).push(subscriber);
19
+ }
20
+ async publish(event) {
21
+ const primitives = event.toPrimitives();
22
+ this.store.save(primitives);
23
+ await this.dispatch(event);
24
+ }
25
+ async dispatch(event) {
26
+ const eventName = event.getEventName();
27
+ const subs = this.subscribers.get(eventName) ?? [];
28
+ const primitives = event.toPrimitives();
29
+ event.ack = () => this.store.delete(event.id);
30
+ event.requeue = () => {
31
+ event.ack?.();
32
+ if (event.meta.retries < this.maxRetries) {
33
+ const updatedPrimitives = {
34
+ ...primitives,
35
+ meta: { ...primitives.meta, retries: event.meta.retries + 1 },
36
+ };
37
+ this.store.requeue(updatedPrimitives);
38
+ this.publish(domain_events_1.DomainEventRegistry.create(updatedPrimitives));
39
+ }
40
+ else {
41
+ console.warn(`Event ${event.id} exceeded max retries (${this.maxRetries}). Dropping.`);
42
+ }
43
+ };
44
+ for (const sub of subs) {
45
+ await sub.handle(event);
46
+ }
47
+ }
48
+ async replay() {
49
+ const events = this.store.all();
50
+ for (const primitives of events) {
51
+ const event = domain_events_1.DomainEventRegistry.create(primitives);
52
+ await this.dispatch(event);
53
+ }
54
+ }
55
+ }
56
+ exports.AsyncInMemoryEventBus = AsyncInMemoryEventBus;
57
+ //# sourceMappingURL=async-in-memory-event-bus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"async-in-memory-event-bus.js","sourceRoot":"","sources":["../../../../src/event-bus/in-memory/async-in-memory-event-bus.ts"],"names":[],"mappings":";;;AAAA,uDAAuE;AACvE,mEAA6D;AAI7D,MAAa,qBAAqB;IACf,WAAW,GAAG,IAAI,GAAG,EAA6B,CAAC;IACnD,KAAK,CAAa;IAClB,UAAU,CAAS;IAEpC,YAAY,QAAoB,IAAI,0CAAkB,EAAE,EAAE,UAAU,GAAG,CAAC;QACtE,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;IAED,SAAS,CAA4B,SAAiB,EAAE,UAAkC;QACxF,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC;YACrC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,EAAE,EAAE,CAAC,CAAC;QACtC,CAAC;QAED,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAE,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACpD,CAAC;IAED,KAAK,CAAC,OAAO,CAA4B,KAAY;QACnD,MAAM,UAAU,GAAG,KAAK,CAAC,YAAY,EAAE,CAAC;QAExC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;QAE5B,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC7B,CAAC;IAEO,KAAK,CAAC,QAAQ,CAAC,KAAkB;QACvC,MAAM,SAAS,GAAG,KAAK,CAAC,YAAY,EAAE,CAAC;QACvC,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,EAAE,CAAC;QACnD,MAAM,UAAU,GAAG,KAAK,CAAC,YAAY,EAAE,CAAC;QAExC,KAAK,CAAC,GAAG,GAAG,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC9C,KAAK,CAAC,OAAO,GAAG,GAAG,EAAE;YACnB,KAAK,CAAC,GAAG,EAAE,EAAE,CAAC;YAEd,IAAI,KAAK,CAAC,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,UAAU,EAAE,CAAC;gBACzC,MAAM,iBAAiB,GAAG;oBACxB,GAAG,UAAU;oBACb,IAAI,EAAE,EAAE,GAAG,UAAU,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,EAAE;iBAC9D,CAAC;gBAEF,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC;gBACtC,IAAI,CAAC,OAAO,CAAC,mCAAmB,CAAC,MAAM,CAAC,iBAAiB,CAAC,CAAC,CAAC;YAC9D,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,IAAI,CAAC,SAAS,KAAK,CAAC,EAAE,0BAA0B,IAAI,CAAC,UAAU,cAAc,CAAC,CAAC;YACzF,CAAC;QACH,CAAC,CAAC;QAEF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;YACvB,MAAM,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM;QACV,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QAEhC,KAAK,MAAM,UAAU,IAAI,MAAM,EAAE,CAAC;YAChC,MAAM,KAAK,GAAG,mCAAmB,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;YACrD,MAAM,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC7B,CAAC;IACH,CAAC;CACF;AA7DD,sDA6DC"}
@@ -0,0 +1,25 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.InMemoryEventStore = void 0;
4
+ class InMemoryEventStore {
5
+ events = [];
6
+ save(primitives) {
7
+ this.events.push(primitives);
8
+ }
9
+ all() {
10
+ return [...this.events];
11
+ }
12
+ delete(id) {
13
+ const index = this.events.findIndex(e => e.id === id);
14
+ if (index !== -1)
15
+ this.events.splice(index, 1);
16
+ }
17
+ requeue(primitives) {
18
+ this.events.push(primitives);
19
+ }
20
+ clear() {
21
+ this.events.length = 0;
22
+ }
23
+ }
24
+ exports.InMemoryEventStore = InMemoryEventStore;
25
+ //# sourceMappingURL=in-memory-event-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-memory-event-store.js","sourceRoot":"","sources":["../../../../src/event-bus/in-memory/in-memory-event-store.ts"],"names":[],"mappings":";;;AAGA,MAAa,kBAAkB;IACZ,MAAM,GAA4B,EAAE,CAAC;IAEtD,IAAI,CAAC,UAAiC;QACpC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC/B,CAAC;IAED,GAAG;QACD,OAAO,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1B,CAAC;IAED,MAAM,CAAC,EAAU;QACf,MAAM,KAAK,GAAG,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC;QAEtD,IAAI,KAAK,KAAK,CAAC,CAAC;YAAE,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC;IACjD,CAAC;IAED,OAAO,CAAC,UAAiC;QACvC,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC/B,CAAC;IAED,KAAK;QACH,IAAI,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC;IACzB,CAAC;CACF;AAxBD,gDAwBC"}
@@ -0,0 +1,8 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AsyncInMemoryEventBus = exports.InMemoryEventStore = void 0;
4
+ var in_memory_event_store_1 = require("./in-memory-event-store");
5
+ Object.defineProperty(exports, "InMemoryEventStore", { enumerable: true, get: function () { return in_memory_event_store_1.InMemoryEventStore; } });
6
+ var async_in_memory_event_bus_1 = require("./async-in-memory-event-bus");
7
+ Object.defineProperty(exports, "AsyncInMemoryEventBus", { enumerable: true, get: function () { return async_in_memory_event_bus_1.AsyncInMemoryEventBus; } });
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/event-bus/in-memory/index.ts"],"names":[],"mappings":";;;AAAA,iEAA6D;AAApD,2HAAA,kBAAkB,OAAA;AAC3B,yEAAmE;AAA1D,kIAAA,qBAAqB,OAAA"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./in-memory"), exports);
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/event-bus/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAEA,8CAA4B"}
package/dist/esm/index.js CHANGED
@@ -19,6 +19,7 @@ __exportStar(require("./criteria"), exports);
19
19
  __exportStar(require("./dao"), exports);
20
20
  __exportStar(require("./domain-events"), exports);
21
21
  __exportStar(require("./entities"), exports);
22
+ __exportStar(require("./event-bus"), exports);
22
23
  __exportStar(require("./formatters"), exports);
23
24
  __exportStar(require("./http"), exports);
24
25
  __exportStar(require("./i18n"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yCAAuB;AACvB,6CAA2B;AAC3B,wCAAsB;AACtB,kDAAgC;AAChC,6CAA2B;AAC3B,+CAA6B;AAC7B,yCAAuB;AACvB,yCAAuB;AACvB,6CAA2B;AAC3B,6CAA2B;AAC3B,2CAAyB;AACzB,yCAAuB;AACvB,2CAAyB;AACzB,kDAAgC;AAChC,iDAA+B;AAC/B,0CAAwB;AACxB,kDAAgC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,yCAAuB;AACvB,6CAA2B;AAC3B,wCAAsB;AACtB,kDAAgC;AAChC,6CAA2B;AAC3B,8CAA4B;AAC5B,+CAA6B;AAC7B,yCAAuB;AACvB,yCAAuB;AACvB,6CAA2B;AAC3B,6CAA2B;AAC3B,2CAAyB;AACzB,yCAAuB;AACvB,2CAAyB;AACzB,kDAAgC;AAChC,iDAA+B;AAC/B,0CAAwB;AACxB,kDAAgC"}
@@ -1 +1 @@
1
- {"version":3,"file":"json-api-connector.js","sourceRoot":"","sources":["../../../src/json-api/json-api-connector.ts"],"names":[],"mappings":";;;AAAA,kCAAsD;AAGtD,iEAA4D;AAE5D,6CAA6C;AAE7C,MAAa,gBAAgB;IACP;IAApB,YAAoB,IAAkB;QAAlB,SAAI,GAAJ,IAAI,CAAc;IAAG,CAAC;IAE1C,KAAK,CAAC,OAAO,CACX,GAAQ,EACR,QAAmB,EACnB,OAAkB;QAElB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,yCAAkB,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC;YAEvE,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAChC,CAAC;QAAC,OAAM,KAAK,EAAE,CAAC;YACd,IAAI,KAAK,YAAY,oBAAa,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBACjD,MAAM,IAAI,0BAAa,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YAChD,CAAC;YAED,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,QAAQ,CACZ,GAAQ,EACR,QAAmB,EACnB,OAAkB;QAElB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,yCAAkB,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC;YAEvE,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAChC,CAAC;QAAC,OAAM,KAAK,EAAE,CAAC;YACd,IAAI,KAAK,YAAY,oBAAa,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBACjD,MAAM,IAAI,0BAAa,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YAChD,CAAC;YAED,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CACV,GAAQ,EACR,OAGC;QAED,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QAChD,CAAC;QAAC,OAAM,KAAK,EAAE,CAAC;YACd,IAAI,KAAK,YAAY,oBAAa,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBACjD,MAAM,IAAI,0BAAa,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YAChD,CAAC;YAED,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CACV,GAAQ,EACR,OAIC;QAED,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QACjD,CAAC;QAAC,OAAM,KAAK,EAAE,CAAC;YACd,IAAI,KAAK,YAAY,oBAAa,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBACjD,MAAM,IAAI,0BAAa,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YAChD,CAAC;YAED,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CACV,GAAQ;QAER,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC/B,CAAC;QAAC,OAAM,KAAK,EAAE,CAAC;YACd,IAAI,KAAK,YAAY,oBAAa,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBACjD,MAAM,IAAI,0BAAa,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YAChD,CAAC;YAED,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;CACF;AAzFD,4CAyFC"}
1
+ {"version":3,"file":"json-api-connector.js","sourceRoot":"","sources":["../../../src/json-api/json-api-connector.ts"],"names":[],"mappings":";;;AAAA,kCAAsD;AAGtD,iEAA4D;AAE5D,6CAA6C;AAE7C,MAAa,gBAAgB;IACP;IAApB,YAAoB,IAAkB;QAAlB,SAAI,GAAJ,IAAI,CAAc;IAAG,CAAC;IAE1C,KAAK,CAAC,OAAO,CACX,GAAQ,EACR,QAAmB,EACnB,OAAkB;QAElB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,yCAAkB,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC;YAEvE,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAChC,CAAC;QAAC,OAAM,KAAK,EAAE,CAAC;YACd,IAAI,KAAK,YAAY,oBAAa,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBACjD,MAAM,IAAI,0BAAa,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YAChD,CAAC;YAED,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,QAAQ,CACZ,GAAQ,EACR,QAAmB,EACnB,OAAkB;QAElB,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,yCAAkB,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC;YAEvE,OAAO,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAChC,CAAC;QAAC,OAAM,KAAK,EAAE,CAAC;YACd,IAAI,KAAK,YAAY,oBAAa,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBACjD,MAAM,IAAI,0BAAa,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YAChD,CAAC;YAED,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CACV,GAAQ,EACR,OAIC;QAED,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QAChD,CAAC;QAAC,OAAM,KAAK,EAAE,CAAC;YACd,IAAI,KAAK,YAAY,oBAAa,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBACjD,MAAM,IAAI,0BAAa,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YAChD,CAAC;YAED,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CACV,GAAQ,EACR,OAIC;QAED,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QACjD,CAAC;QAAC,OAAM,KAAK,EAAE,CAAC;YACd,IAAI,KAAK,YAAY,oBAAa,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBACjD,MAAM,IAAI,0BAAa,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YAChD,CAAC;YAED,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,MAAM,CACV,GAAQ;QAER,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;QAC/B,CAAC;QAAC,OAAM,KAAK,EAAE,CAAC;YACd,IAAI,KAAK,YAAY,oBAAa,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;gBACjD,MAAM,IAAI,0BAAa,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YAChD,CAAC;YAED,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;CACF;AA1FD,4CA0FC"}
@@ -4,5 +4,8 @@ export type DomainEventPrimitives<PayloadSchema = {}> = {
4
4
  type: string;
5
5
  version: number;
6
6
  payload: PayloadSchema;
7
+ meta: {
8
+ retries: number;
9
+ };
7
10
  };
8
11
  //# sourceMappingURL=domain-event-primitives.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"domain-event-primitives.d.ts","sourceRoot":"","sources":["../../../src/domain-events/domain-event-primitives.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,qBAAqB,CAAC,aAAa,GAAG,EAAE,IAAI;IACtD,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,aAAa,CAAC;CACxB,CAAC"}
1
+ {"version":3,"file":"domain-event-primitives.d.ts","sourceRoot":"","sources":["../../../src/domain-events/domain-event-primitives.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,qBAAqB,CAAC,aAAa,GAAG,EAAE,IAAI;IACtD,EAAE,EAAE,MAAM,CAAC;IACX,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,aAAa,CAAC;IACvB,IAAI,EAAE;QACJ,OAAO,EAAE,MAAM,CAAC;KACjB,CAAC;CACH,CAAC"}
@@ -0,0 +1,13 @@
1
+ import { DomainEvent, DomainEventPrimitives } from ".";
2
+ type DomainEventConstructor<PayloadSchema = any> = {
3
+ new (id: string, occurredAt: Date, type: string, version: number, payload: PayloadSchema, meta: {
4
+ retries: number;
5
+ }): DomainEvent<PayloadSchema>;
6
+ };
7
+ export declare class DomainEventRegistry {
8
+ private static registry;
9
+ static register(eventName: string, constructor: DomainEventConstructor): void;
10
+ static create(primitives: DomainEventPrimitives): DomainEvent;
11
+ }
12
+ export {};
13
+ //# sourceMappingURL=domain-event-registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domain-event-registry.d.ts","sourceRoot":"","sources":["../../../src/domain-events/domain-event-registry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,qBAAqB,EAAE,MAAM,GAAG,CAAC;AAGvD,KAAK,sBAAsB,CAAC,aAAa,GAAG,GAAG,IAAI;IACjD,KACE,EAAE,EAAE,MAAM,EACV,UAAU,EAAE,IAAI,EAChB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,aAAa,EACtB,IAAI,EAAE;QACJ,OAAO,EAAE,MAAM,CAAC;KACjB,GACA,WAAW,CAAC,aAAa,CAAC,CAAC;CAC/B,CAAC;AAEF,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAA6C;IAEpE,MAAM,CAAC,QAAQ,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,sBAAsB,GAAG,IAAI;IAI7E,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,qBAAqB,GAAG,WAAW;CAgB9D"}
@@ -6,8 +6,15 @@ export declare abstract class DomainEvent<PayloadSchema = {}> implements Message
6
6
  readonly type: string;
7
7
  readonly version: number;
8
8
  readonly payload: PayloadSchema;
9
- constructor(id: string, occurredAt: Date, type: string, version: number, payload: PayloadSchema);
9
+ meta: {
10
+ retries: number;
11
+ };
12
+ constructor(id: string, occurredAt: Date, type: string, version: number, payload: PayloadSchema, meta?: {
13
+ retries: number;
14
+ });
10
15
  abstract getEventName(): string;
11
16
  abstract toPrimitives(): DomainEventPrimitives<PayloadSchema>;
17
+ ack?: () => void;
18
+ requeue?: () => void;
12
19
  }
13
20
  //# sourceMappingURL=domain-event.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"domain-event.d.ts","sourceRoot":"","sources":["../../../src/domain-events/domain-event.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAElE,8BAAsB,WAAW,CAAC,aAAa,GAAG,EAAE,CAAE,YAAW,OAAO,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC;IAE1G,QAAQ,CAAC,EAAE,EAAE,MAAM;IACnB,QAAQ,CAAC,UAAU,EAAE,IAAI;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM;IACxB,QAAQ,CAAC,OAAO,EAAE,aAAa;gBAJtB,EAAE,EAAE,MAAM,EACV,UAAU,EAAE,IAAI,EAChB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,aAAa;IAGjC,QAAQ,CAAC,YAAY,IAAI,MAAM;IAC/B,QAAQ,CAAC,YAAY,IAAI,qBAAqB,CAAC,aAAa,CAAC;CAC9D"}
1
+ {"version":3,"file":"domain-event.d.ts","sourceRoot":"","sources":["../../../src/domain-events/domain-event.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,aAAa,CAAC;AACtC,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAElE,8BAAsB,WAAW,CAAC,aAAa,GAAG,EAAE,CAAE,YAAW,OAAO,CAAC,qBAAqB,CAAC,aAAa,CAAC,CAAC;IAE1G,QAAQ,CAAC,EAAE,EAAE,MAAM;IACnB,QAAQ,CAAC,UAAU,EAAE,IAAI;IACzB,QAAQ,CAAC,IAAI,EAAE,MAAM;IACrB,QAAQ,CAAC,OAAO,EAAE,MAAM;IACxB,QAAQ,CAAC,OAAO,EAAE,aAAa;IACxB,IAAI;;;gBALF,EAAE,EAAE,MAAM,EACV,UAAU,EAAE,IAAI,EAChB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,OAAO,EAAE,aAAa,EACxB,IAAI;;KAAiB;IAG9B,QAAQ,CAAC,YAAY,IAAI,MAAM;IAC/B,QAAQ,CAAC,YAAY,IAAI,qBAAqB,CAAC,aAAa,CAAC;IAE7D,GAAG,CAAC,EAAE,MAAM,IAAI,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,IAAI,CAAC;CACtB"}
@@ -0,0 +1,5 @@
1
+ import { TranslationResolver } from "../../i18n";
2
+ export declare class DomainEventNotRegistered extends Error {
3
+ constructor(domainEventName: string, translationResolver?: TranslationResolver);
4
+ }
5
+ //# sourceMappingURL=domain-event-not-registered.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"domain-event-not-registered.d.ts","sourceRoot":"","sources":["../../../../src/domain-events/exceptions/domain-event-not-registered.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAC;AAEjD,qBAAa,wBAAyB,SAAQ,KAAK;gBACrC,eAAe,EAAE,MAAM,EAAE,mBAAmB,CAAC,EAAE,mBAAmB;CAO/E"}
@@ -0,0 +1,2 @@
1
+ export { DomainEventNotRegistered } from "./domain-event-not-registered";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/domain-events/exceptions/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,+BAA+B,CAAC"}
@@ -1,3 +1,5 @@
1
1
  export { DomainEvent } from "./domain-event";
2
2
  export type { DomainEventPrimitives } from "./domain-event-primitives";
3
+ export * from "./exceptions";
4
+ export { DomainEventRegistry } from "./domain-event-registry";
3
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/domain-events/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,YAAY,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/domain-events/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,YAAY,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AACvE,cAAc,cAAc,CAAC;AAC7B,OAAO,EAAE,mBAAmB,EAAE,MAAM,yBAAyB,CAAC"}
@@ -0,0 +1,9 @@
1
+ import { DomainEventPrimitives } from "../domain-events";
2
+ export interface EventStore {
3
+ save(primitives: DomainEventPrimitives): void;
4
+ all(): DomainEventPrimitives[];
5
+ delete(id: string): void;
6
+ requeue(primitives: DomainEventPrimitives): void;
7
+ clear(): void;
8
+ }
9
+ //# sourceMappingURL=event-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-store.d.ts","sourceRoot":"","sources":["../../../src/event-bus/event-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,kBAAkB,CAAC;AAEzD,MAAM,WAAW,UAAU;IACzB,IAAI,CAAC,UAAU,EAAE,qBAAqB,GAAG,IAAI,CAAC;IAC9C,GAAG,IAAI,qBAAqB,EAAE,CAAC;IAC/B,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,OAAO,CAAC,UAAU,EAAE,qBAAqB,GAAG,IAAI,CAAC;IACjD,KAAK,IAAI,IAAI,CAAC;CACf"}
@@ -0,0 +1,5 @@
1
+ import { DomainEvent } from "../domain-events";
2
+ export interface EventSubscriber<Event extends DomainEvent = DomainEvent> {
3
+ handle(event: Event): void | Promise<void>;
4
+ }
5
+ //# sourceMappingURL=event-subscriber.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-subscriber.d.ts","sourceRoot":"","sources":["../../../src/event-bus/event-subscriber.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,MAAM,WAAW,eAAe,CAAC,KAAK,SAAS,WAAW,GAAG,WAAW;IACtE,MAAM,CAAC,KAAK,EAAE,KAAK,GAAG,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CAC5C"}
@@ -0,0 +1,14 @@
1
+ import { DomainEvent } from "../../domain-events";
2
+ import { EventStore } from "../event-store";
3
+ import { EventSubscriber } from "../event-subscriber";
4
+ export declare class AsyncInMemoryEventBus {
5
+ private readonly subscribers;
6
+ private readonly store;
7
+ private readonly maxRetries;
8
+ constructor(store?: EventStore, maxRetries?: number);
9
+ subscribe<Event extends DomainEvent>(eventName: string, subscriber: EventSubscriber<Event>): void;
10
+ publish<Event extends DomainEvent>(event: Event): Promise<void>;
11
+ private dispatch;
12
+ replay(): Promise<void>;
13
+ }
14
+ //# sourceMappingURL=async-in-memory-event-bus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"async-in-memory-event-bus.d.ts","sourceRoot":"","sources":["../../../../src/event-bus/in-memory/async-in-memory-event-bus.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAuB,MAAM,qBAAqB,CAAC;AAEvE,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAC5C,OAAO,EAAE,eAAe,EAAE,MAAM,qBAAqB,CAAC;AAEtD,qBAAa,qBAAqB;IAChC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAwC;IACpE,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;IACnC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAS;gBAExB,KAAK,GAAE,UAAqC,EAAE,UAAU,SAAI;IAKxE,SAAS,CAAC,KAAK,SAAS,WAAW,EAAE,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,eAAe,CAAC,KAAK,CAAC,GAAG,IAAI;IAQ3F,OAAO,CAAC,KAAK,SAAS,WAAW,EAAE,KAAK,EAAE,KAAK,GAAG,OAAO,CAAC,IAAI,CAAC;YAQvD,QAAQ;IA2BhB,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC;CAQ9B"}
@@ -0,0 +1,11 @@
1
+ import { DomainEventPrimitives } from "../../domain-events";
2
+ import { EventStore } from "../event-store";
3
+ export declare class InMemoryEventStore implements EventStore {
4
+ private readonly events;
5
+ save(primitives: DomainEventPrimitives): void;
6
+ all(): DomainEventPrimitives[];
7
+ delete(id: string): void;
8
+ requeue(primitives: DomainEventPrimitives): void;
9
+ clear(): void;
10
+ }
11
+ //# sourceMappingURL=in-memory-event-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"in-memory-event-store.d.ts","sourceRoot":"","sources":["../../../../src/event-bus/in-memory/in-memory-event-store.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,gBAAgB,CAAC;AAE5C,qBAAa,kBAAmB,YAAW,UAAU;IACnD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA+B;IAEtD,IAAI,CAAC,UAAU,EAAE,qBAAqB,GAAG,IAAI;IAI7C,GAAG,IAAI,qBAAqB,EAAE;IAI9B,MAAM,CAAC,EAAE,EAAE,MAAM,GAAG,IAAI;IAMxB,OAAO,CAAC,UAAU,EAAE,qBAAqB,GAAG,IAAI;IAIhD,KAAK,IAAI,IAAI;CAGd"}
@@ -0,0 +1,3 @@
1
+ export { InMemoryEventStore } from "./in-memory-event-store";
2
+ export { AsyncInMemoryEventBus } from "./async-in-memory-event-bus";
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/event-bus/in-memory/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAC;AAC7D,OAAO,EAAE,qBAAqB,EAAE,MAAM,6BAA6B,CAAA"}
@@ -0,0 +1,4 @@
1
+ export type { EventSubscriber } from "./event-subscriber";
2
+ export type { EventStore } from "./event-store";
3
+ export * from "./in-memory";
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/event-bus/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AAC1D,YAAY,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAChD,cAAc,aAAa,CAAC"}
@@ -3,6 +3,7 @@ export * from "./criteria";
3
3
  export * from "./dao";
4
4
  export * from "./domain-events";
5
5
  export * from "./entities";
6
+ export * from "./event-bus";
6
7
  export * from "./formatters";
7
8
  export * from "./http";
8
9
  export * from "./i18n";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,YAAY,CAAC;AAC3B,cAAc,OAAO,CAAC;AACtB,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,cAAc,CAAC;AAC7B,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,SAAS,CAAC;AACxB,cAAc,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,QAAQ,CAAC;AACvB,cAAc,YAAY,CAAC;AAC3B,cAAc,OAAO,CAAC;AACtB,cAAc,iBAAiB,CAAC;AAChC,cAAc,YAAY,CAAC;AAC3B,cAAc,aAAa,CAAC;AAC5B,cAAc,cAAc,CAAC;AAC7B,cAAc,QAAQ,CAAC;AACvB,cAAc,QAAQ,CAAC;AACvB,cAAc,YAAY,CAAC;AAC3B,cAAc,YAAY,CAAC;AAC3B,cAAc,UAAU,CAAC;AACzB,cAAc,QAAQ,CAAC;AACvB,cAAc,UAAU,CAAC;AACzB,cAAc,iBAAiB,CAAC;AAChC,cAAc,gBAAgB,CAAC;AAC/B,cAAc,SAAS,CAAC;AACxB,cAAc,iBAAiB,CAAC"}
@@ -8,6 +8,7 @@ export declare class JSONAPIConnector {
8
8
  findOne<EntityAttributes>(url: URL, criteria?: Criteria, include?: string[]): Promise<JSONAPISingle<EntityAttributes>>;
9
9
  findMany<EntityAttributes>(url: URL, criteria?: Criteria, include?: string[]): Promise<JSONAPIList<EntityAttributes>>;
10
10
  create<EntityAttributes>(url: URL, payload: {
11
+ id: string;
11
12
  type: string;
12
13
  attributes: Omit<Partial<EntityAttributes>, "id">;
13
14
  }): Promise<JSONAPISingle<EntityAttributes>>;
@@ -1 +1 @@
1
- {"version":3,"file":"json-api-connector.d.ts","sourceRoot":"","sources":["../../../src/json-api/json-api-connector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAiB,MAAM,SAAS,CAAC;AACtD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGvC,qBAAa,gBAAgB;IACf,OAAO,CAAC,IAAI;gBAAJ,IAAI,EAAE,YAAY;IAEhC,OAAO,CAAC,gBAAgB,EAC5B,GAAG,EAAE,GAAG,EACR,QAAQ,CAAC,EAAE,QAAQ,EACnB,OAAO,CAAC,EAAE,MAAM,EAAE,GACjB,OAAO,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC;IAcrC,QAAQ,CAAC,gBAAgB,EAC7B,GAAG,EAAE,GAAG,EACR,QAAQ,CAAC,EAAE,QAAQ,EACnB,OAAO,CAAC,EAAE,MAAM,EAAE,GACjB,OAAO,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC;IAcnC,MAAM,CAAC,gBAAgB,EAC3B,GAAG,EAAE,GAAG,EACR,OAAO,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,IAAI,CAAC,CAAC;KACnD,GACA,OAAO,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC;IAYrC,MAAM,CAAC,gBAAgB,EAC3B,GAAG,EAAE,GAAG,EACR,OAAO,EAAE;QACP,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,IAAI,CAAC,CAAC;KACnD,GACA,OAAO,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC;IAYrC,MAAM,CAAC,gBAAgB,EAC3B,GAAG,EAAE,GAAG,GACP,OAAO,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC;CAW5C"}
1
+ {"version":3,"file":"json-api-connector.d.ts","sourceRoot":"","sources":["../../../src/json-api/json-api-connector.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAiB,MAAM,SAAS,CAAC;AACtD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACnD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEvD,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AAGvC,qBAAa,gBAAgB;IACf,OAAO,CAAC,IAAI;gBAAJ,IAAI,EAAE,YAAY;IAEhC,OAAO,CAAC,gBAAgB,EAC5B,GAAG,EAAE,GAAG,EACR,QAAQ,CAAC,EAAE,QAAQ,EACnB,OAAO,CAAC,EAAE,MAAM,EAAE,GACjB,OAAO,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC;IAcrC,QAAQ,CAAC,gBAAgB,EAC7B,GAAG,EAAE,GAAG,EACR,QAAQ,CAAC,EAAE,QAAQ,EACnB,OAAO,CAAC,EAAE,MAAM,EAAE,GACjB,OAAO,CAAC,WAAW,CAAC,gBAAgB,CAAC,CAAC;IAcnC,MAAM,CAAC,gBAAgB,EAC3B,GAAG,EAAE,GAAG,EACR,OAAO,EAAE;QACP,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,IAAI,CAAC,CAAC;KACnD,GACA,OAAO,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC;IAYrC,MAAM,CAAC,gBAAgB,EAC3B,GAAG,EAAE,GAAG,EACR,OAAO,EAAE;QACP,EAAE,EAAE,MAAM,CAAC;QACX,IAAI,EAAE,MAAM,CAAC;QACb,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC,EAAE,IAAI,CAAC,CAAC;KACnD,GACA,OAAO,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC;IAYrC,MAAM,CAAC,gBAAgB,EAC3B,GAAG,EAAE,GAAG,GACP,OAAO,CAAC,aAAa,CAAC,gBAAgB,CAAC,CAAC;CAW5C"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@schorts/shared-kernel",
3
- "version": "2.4.1",
3
+ "version": "2.5.0",
4
4
  "description": "A modular, type-safe foundation for building expressive, maintainable applications. This package provides core abstractions for domain modeling, HTTP integration, authentication, state management, and more — designed to be framework-agnostic and highly extensible.",
5
5
  "main": "./dist/cjs/index.js",
6
6
  "module": "./dist/esm/index.js",
@@ -36,6 +36,11 @@
36
36
  "require": "./dist/cjs/entities/index.js",
37
37
  "types": "./dist/types/entities/index.d.ts"
38
38
  },
39
+ "./event-bus": {
40
+ "import": "./dist/esm/event-bus/index.js",
41
+ "require": "./dist/cjs/event-bus/index.js",
42
+ "types": "./dist/types/event-bus/index.d.ts"
43
+ },
39
44
  "./formatters": {
40
45
  "import": "./dist/esm/formatters/index.js",
41
46
  "require": "./dist/cjs/formatters/index.js",
@@ -4,4 +4,7 @@ export type DomainEventPrimitives<PayloadSchema = {}> = {
4
4
  type: string;
5
5
  version: number;
6
6
  payload: PayloadSchema;
7
+ meta: {
8
+ retries: number;
9
+ },
7
10
  };
@@ -0,0 +1,40 @@
1
+ import { DomainEvent, DomainEventPrimitives } from ".";
2
+ import { DomainEventNotRegistered } from "./exceptions";
3
+
4
+ type DomainEventConstructor<PayloadSchema = any> = {
5
+ new (
6
+ id: string,
7
+ occurredAt: Date,
8
+ type: string,
9
+ version: number,
10
+ payload: PayloadSchema,
11
+ meta: {
12
+ retries: number,
13
+ },
14
+ ): DomainEvent<PayloadSchema>;
15
+ };
16
+
17
+ export class DomainEventRegistry {
18
+ private static registry = new Map<string, DomainEventConstructor>();
19
+
20
+ static register(eventName: string, constructor: DomainEventConstructor): void {
21
+ this.registry.set(eventName, constructor);
22
+ }
23
+
24
+ static create(primitives: DomainEventPrimitives): DomainEvent {
25
+ const Constructor = this.registry.get(primitives.type);
26
+
27
+ if (!Constructor) {
28
+ throw new DomainEventNotRegistered(primitives.type);
29
+ }
30
+
31
+ return new Constructor(
32
+ primitives.id,
33
+ new Date(primitives.occurred_at),
34
+ primitives.type,
35
+ primitives.version,
36
+ primitives.payload,
37
+ primitives.meta,
38
+ );
39
+ }
40
+ }
@@ -8,8 +8,12 @@ export abstract class DomainEvent<PayloadSchema = {}> implements Message<DomainE
8
8
  readonly type: string,
9
9
  readonly version: number,
10
10
  readonly payload: PayloadSchema,
11
+ public meta = { retries: 0 },
11
12
  ) {}
12
13
 
13
14
  abstract getEventName(): string;
14
15
  abstract toPrimitives(): DomainEventPrimitives<PayloadSchema>;
16
+
17
+ ack?: () => void;
18
+ requeue?: () => void;
15
19
  }
@@ -0,0 +1,11 @@
1
+ import { TranslationResolver } from "../../i18n";
2
+
3
+ export class DomainEventNotRegistered extends Error {
4
+ constructor(domainEventName: string, translationResolver?: TranslationResolver) {
5
+ const message = translationResolver
6
+ ? translationResolver.resolve("domain_events.errors.domain_event_not_registered")
7
+ : `DomainEvent Not Registered: ${domainEventName}`;
8
+
9
+ super(message);
10
+ }
11
+ }
@@ -0,0 +1 @@
1
+ export { DomainEventNotRegistered } from "./domain-event-not-registered";
@@ -1,2 +1,4 @@
1
1
  export { DomainEvent } from "./domain-event";
2
2
  export type { DomainEventPrimitives } from "./domain-event-primitives";
3
+ export * from "./exceptions";
4
+ export { DomainEventRegistry } from "./domain-event-registry";
@@ -0,0 +1,9 @@
1
+ import { DomainEventPrimitives } from "../domain-events";
2
+
3
+ export interface EventStore {
4
+ save(primitives: DomainEventPrimitives): void;
5
+ all(): DomainEventPrimitives[];
6
+ delete(id: string): void;
7
+ requeue(primitives: DomainEventPrimitives): void;
8
+ clear(): void;
9
+ }
@@ -0,0 +1,5 @@
1
+ import { DomainEvent } from "../domain-events";
2
+
3
+ export interface EventSubscriber<Event extends DomainEvent = DomainEvent> {
4
+ handle(event: Event): void | Promise<void>;
5
+ }
@@ -0,0 +1,67 @@
1
+ import { DomainEvent, DomainEventRegistry } from "../../domain-events";
2
+ import { InMemoryEventStore } from "./in-memory-event-store";
3
+ import { EventStore } from "../event-store";
4
+ import { EventSubscriber } from "../event-subscriber";
5
+
6
+ export class AsyncInMemoryEventBus {
7
+ private readonly subscribers = new Map<string, EventSubscriber[]>();
8
+ private readonly store: EventStore;
9
+ private readonly maxRetries: number;
10
+
11
+ constructor(store: EventStore = new InMemoryEventStore(), maxRetries = 3) {
12
+ this.store = store;
13
+ this.maxRetries = maxRetries;
14
+ }
15
+
16
+ subscribe<Event extends DomainEvent>(eventName: string, subscriber: EventSubscriber<Event>): void {
17
+ if (!this.subscribers.has(eventName)) {
18
+ this.subscribers.set(eventName, []);
19
+ }
20
+
21
+ this.subscribers.get(eventName)!.push(subscriber);
22
+ }
23
+
24
+ async publish<Event extends DomainEvent>(event: Event): Promise<void> {
25
+ const primitives = event.toPrimitives();
26
+
27
+ this.store.save(primitives);
28
+
29
+ await this.dispatch(event);
30
+ }
31
+
32
+ private async dispatch(event: DomainEvent): Promise<void> {
33
+ const eventName = event.getEventName();
34
+ const subs = this.subscribers.get(eventName) ?? [];
35
+ const primitives = event.toPrimitives();
36
+
37
+ event.ack = () => this.store.delete(event.id);
38
+ event.requeue = () => {
39
+ event.ack?.();
40
+
41
+ if (event.meta.retries < this.maxRetries) {
42
+ const updatedPrimitives = {
43
+ ...primitives,
44
+ meta: { ...primitives.meta, retries: event.meta.retries + 1 },
45
+ };
46
+
47
+ this.store.requeue(updatedPrimitives);
48
+ this.publish(DomainEventRegistry.create(updatedPrimitives));
49
+ } else {
50
+ console.warn(`Event ${event.id} exceeded max retries (${this.maxRetries}). Dropping.`);
51
+ }
52
+ };
53
+
54
+ for (const sub of subs) {
55
+ await sub.handle(event);
56
+ }
57
+ }
58
+
59
+ async replay(): Promise<void> {
60
+ const events = this.store.all();
61
+
62
+ for (const primitives of events) {
63
+ const event = DomainEventRegistry.create(primitives);
64
+ await this.dispatch(event);
65
+ }
66
+ }
67
+ }
@@ -0,0 +1,28 @@
1
+ import { DomainEventPrimitives } from "../../domain-events";
2
+ import { EventStore } from "../event-store";
3
+
4
+ export class InMemoryEventStore implements EventStore {
5
+ private readonly events: DomainEventPrimitives[] = [];
6
+
7
+ save(primitives: DomainEventPrimitives): void {
8
+ this.events.push(primitives);
9
+ }
10
+
11
+ all(): DomainEventPrimitives[] {
12
+ return [...this.events];
13
+ }
14
+
15
+ delete(id: string): void {
16
+ const index = this.events.findIndex(e => e.id === id);
17
+
18
+ if (index !== -1) this.events.splice(index, 1);
19
+ }
20
+
21
+ requeue(primitives: DomainEventPrimitives): void {
22
+ this.events.push(primitives);
23
+ }
24
+
25
+ clear(): void {
26
+ this.events.length = 0;
27
+ }
28
+ }
@@ -0,0 +1,2 @@
1
+ export { InMemoryEventStore } from "./in-memory-event-store";
2
+ export { AsyncInMemoryEventBus } from "./async-in-memory-event-bus"
@@ -0,0 +1,3 @@
1
+ export type { EventSubscriber } from "./event-subscriber";
2
+ export type { EventStore } from "./event-store";
3
+ export * from "./in-memory";
package/src/index.ts CHANGED
@@ -3,6 +3,7 @@ export * from "./criteria";
3
3
  export * from "./dao";
4
4
  export * from "./domain-events";
5
5
  export * from "./entities";
6
+ export * from "./event-bus";
6
7
  export * from "./formatters";
7
8
  export * from "./http";
8
9
  export * from "./i18n";
@@ -47,6 +47,7 @@ export class JSONAPIConnector {
47
47
  async create<EntityAttributes>(
48
48
  url: URL,
49
49
  payload: {
50
+ id: string;
50
51
  type: string;
51
52
  attributes: Omit<Partial<EntityAttributes>, "id">;
52
53
  }