ddd-node 24.2.0 → 24.4.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.
@@ -103,10 +103,8 @@ class EventSourcedAggregateBase extends aggregate_base_1.AggregateBase {
103
103
  const handler = this.getHandlerForCommand(command);
104
104
  const events = (0, utils_1.toArray)(handler.call(this, command));
105
105
  events.forEach((event) => {
106
- event.setContext({
107
- correlationId: command.context()?.correlationId,
108
- causationId: command.id(),
109
- });
106
+ event.setCausationId(command.id());
107
+ event.setCorrelationIds(command.context().correlationIds || {});
110
108
  });
111
109
  this.applyEvents(events);
112
110
  this._handledCommands.push(command);
@@ -7,7 +7,7 @@ import { CommandModelDescriptor } from "./command-model-descriptor";
7
7
  export interface CommandMetadata extends MessageMetadata {
8
8
  commandType: CommandType;
9
9
  }
10
- export declare abstract class CommandBase<P extends Props> extends MessageBase<P> {
10
+ export declare class CommandBase<P extends Props> extends MessageBase<P> {
11
11
  protected readonly _commandType: CommandType;
12
12
  static commandType(): string;
13
13
  constructor(metadata: Omit<CommandMetadata, "commandType">, props: P);
@@ -13,7 +13,7 @@ export interface EventMetadata extends MessageMetadata {
13
13
  eventType: EventType;
14
14
  source: EventSource;
15
15
  }
16
- export declare abstract class EventBase<P extends Props> extends MessageBase<P> {
16
+ export declare class EventBase<P extends Props> extends MessageBase<P> {
17
17
  private readonly _eventType;
18
18
  private readonly _source;
19
19
  constructor(metadata: Omit<EventMetadata, "eventType">, props: P);
@@ -2,8 +2,11 @@ import { Class } from "type-fest";
2
2
  import { Props, PropsOf } from "../../../base";
3
3
  import { ClassStatic } from "../../../types";
4
4
  import { IdentifiableModel, IdentifiableModelMetadata } from "../../identifiable-model";
5
+ export interface CorrelationIds {
6
+ [type: string]: string;
7
+ }
5
8
  export interface MessageContext {
6
- correlationId?: string;
9
+ correlationIds?: CorrelationIds;
7
10
  causationId?: string;
8
11
  }
9
12
  export interface MessageMetadata extends IdentifiableModelMetadata {
@@ -12,13 +15,15 @@ export interface MessageMetadata extends IdentifiableModelMetadata {
12
15
  }
13
16
  export declare class MessageBase<P extends Props> extends IdentifiableModel<P> {
14
17
  private readonly _timestamp;
15
- private _context?;
18
+ private _context;
16
19
  constructor(metadata: MessageMetadata, props: P);
17
20
  props(): P;
18
21
  metadata(): MessageMetadata;
19
22
  timestamp(): number;
20
- context(): MessageContext | undefined;
21
- setContext(context: Partial<MessageContext>): void;
23
+ context(): MessageContext;
24
+ setCausationId(causationId: string): void;
25
+ addCorrelationId(type: string, correlationId: string): void;
26
+ setCorrelationIds(correlationIds: CorrelationIds): void;
22
27
  }
23
28
  export type AnyMessage = MessageBase<Props>;
24
29
  export interface MessageClass<T extends AnyMessage = AnyMessage, Arguments extends unknown[] = any[]> extends Class<T, Arguments>, ClassStatic<typeof MessageBase<PropsOf<T>>> {
@@ -8,12 +8,8 @@ var __decorate = (this && this.__decorate) || function (decorators, target, key,
8
8
  var __metadata = (this && this.__metadata) || function (k, v) {
9
9
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
10
  };
11
- var __importDefault = (this && this.__importDefault) || function (mod) {
12
- return (mod && mod.__esModule) ? mod : { "default": mod };
13
- };
14
11
  Object.defineProperty(exports, "__esModule", { value: true });
15
12
  exports.MessageBase = void 0;
16
- const lodash_1 = __importDefault(require("lodash"));
17
13
  const base_1 = require("../../../base");
18
14
  const identifiable_model_1 = require("../../identifiable-model");
19
15
  let MessageBase = class MessageBase extends identifiable_model_1.IdentifiableModel {
@@ -39,8 +35,19 @@ let MessageBase = class MessageBase extends identifiable_model_1.IdentifiableMod
39
35
  context() {
40
36
  return this._context;
41
37
  }
42
- setContext(context) {
43
- this._context = lodash_1.default.merge(this._context, context);
38
+ setCausationId(causationId) {
39
+ if (!this._context.causationId)
40
+ this._context.causationId = causationId;
41
+ }
42
+ addCorrelationId(type, correlationId) {
43
+ if (!this._context.correlationIds)
44
+ this._context.correlationIds = {};
45
+ if (!this._context.correlationIds[type])
46
+ this._context.correlationIds[type] = correlationId;
47
+ }
48
+ setCorrelationIds(correlationIds) {
49
+ if (!this._context.correlationIds)
50
+ this._context.correlationIds = correlationIds;
44
51
  }
45
52
  };
46
53
  exports.MessageBase = MessageBase;
@@ -1 +1 @@
1
- export * from "./event-subscriber";
1
+ export * from "./subscribe-to-events";
@@ -14,4 +14,4 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
14
  for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
- __exportStar(require("./event-subscriber"), exports);
17
+ __exportStar(require("./subscribe-to-events"), exports);
@@ -6,7 +6,8 @@ class EventPublisher {
6
6
  this.subscriberRegistry = subscriberRegistry;
7
7
  }
8
8
  async publish(event) {
9
- const subscribers = this.subscriberRegistry.getSubscribersForEvent(event.constructor);
9
+ const subscribers = this.subscriberRegistry.getAllSubscribersForEvent(event.constructor);
10
+ // TODO: should convert to for await (subscriber be called sequently) ?
10
11
  await Promise.all(subscribers.map((subscriber) => subscriber.handleEvent(event)));
11
12
  }
12
13
  }
@@ -1,8 +1,9 @@
1
1
  import { AnyEvent, EventClass } from "../core";
2
- import { IEventSubscriber, IEventSubscriberRegistry } from "./interfaces";
2
+ import { IEventSubscriber, IEventSubscriberRegistry, IGlobalEventSubscriber, Unsubscriber } from "./interfaces";
3
3
  export declare class EventSubscriberRegistry implements IEventSubscriberRegistry {
4
4
  private static _instance;
5
5
  static instance(): EventSubscriberRegistry;
6
+ private _globalSubscribers;
6
7
  private _subscribers;
7
8
  constructor(subscribers?: IEventSubscriber[]);
8
9
  private _setSubscribersForEvent;
@@ -11,8 +12,12 @@ export declare class EventSubscriberRegistry implements IEventSubscriberRegistry
11
12
  private _hasSubscriber;
12
13
  private _addSubscriber;
13
14
  private _removeSubscriber;
14
- registerSubscriber(subscriber: IEventSubscriber): () => void;
15
+ registerGlobalSubscriber(subscriber: IGlobalEventSubscriber): Unsubscriber;
16
+ deregisterGlobalSubscriber(subscriber: IGlobalEventSubscriber): void;
17
+ registerSubscriber(subscriber: IEventSubscriber): Unsubscriber;
15
18
  deregisterSubscriber(subscriber: IEventSubscriber<AnyEvent>): void;
16
- getSubscribersForEvent<T extends AnyEvent = AnyEvent>(eventType: EventClass<T, any[]>): IEventSubscriber<T>[];
19
+ getGlobalSubscribers(): IGlobalEventSubscriber[];
17
20
  getSubscribers(): IEventSubscriber[];
21
+ getSubscribersForEvent<T extends AnyEvent = AnyEvent>(eventType: EventClass<T>): IEventSubscriber<T>[];
22
+ getAllSubscribersForEvent<T extends AnyEvent = AnyEvent>(eventType: EventClass<T>): (IGlobalEventSubscriber | IEventSubscriber<T>)[];
18
23
  }
@@ -9,6 +9,7 @@ class EventSubscriberRegistry {
9
9
  return this._instance;
10
10
  }
11
11
  constructor(subscribers = []) {
12
+ this._globalSubscribers = new Set();
12
13
  this._subscribers = new Map();
13
14
  subscribers.forEach((subscriber) => {
14
15
  this.registerSubscriber(subscriber);
@@ -40,6 +41,13 @@ class EventSubscriberRegistry {
40
41
  const subscribers = this._getSubscribersForEvent(subscribedEvent);
41
42
  this._setSubscribersForEvent(subscribedEvent, subscribers.filter((_subscriber) => _subscriber !== subscriber));
42
43
  }
44
+ registerGlobalSubscriber(subscriber) {
45
+ this._globalSubscribers.add(subscriber);
46
+ return () => this.deregisterGlobalSubscriber(subscriber);
47
+ }
48
+ deregisterGlobalSubscriber(subscriber) {
49
+ this._globalSubscribers.delete(subscriber);
50
+ }
43
51
  registerSubscriber(subscriber) {
44
52
  const subscribedEvents = (0, utils_1.toArray)(subscriber.subscribeToEvents());
45
53
  subscribedEvents.forEach((subscribedEvent) => {
@@ -53,11 +61,20 @@ class EventSubscriberRegistry {
53
61
  this._removeSubscriber(subscribedEvent, subscriber);
54
62
  });
55
63
  }
56
- getSubscribersForEvent(eventType) {
57
- return Array.from(this._getSubscribersForEvent(eventType));
64
+ getGlobalSubscribers() {
65
+ return Array.from(this._globalSubscribers);
58
66
  }
59
67
  getSubscribers() {
60
68
  return Array.from(this._subscribers.values()).flat();
61
69
  }
70
+ getSubscribersForEvent(eventType) {
71
+ return Array.from(this._getSubscribersForEvent(eventType));
72
+ }
73
+ getAllSubscribersForEvent(eventType) {
74
+ return [
75
+ ...this.getGlobalSubscribers(),
76
+ ...this.getSubscribersForEvent(eventType),
77
+ ];
78
+ }
62
79
  }
63
80
  exports.EventSubscriberRegistry = EventSubscriberRegistry;
@@ -1,9 +1,13 @@
1
1
  import { AnyEvent, EventClass } from "../../core";
2
- import { IEventSubscriber } from "./event-subscriber.interface";
2
+ import { IEventSubscriber, IGlobalEventSubscriber } from "./event-subscriber.interface";
3
3
  export type Unsubscriber = () => void;
4
4
  export interface IEventSubscriberRegistry {
5
+ registerGlobalSubscriber(subscriber: IGlobalEventSubscriber): Unsubscriber;
6
+ deregisterGlobalSubscriber(subscriber: IGlobalEventSubscriber): void;
5
7
  registerSubscriber(subscriber: IEventSubscriber): Unsubscriber;
6
8
  deregisterSubscriber(subscriber: IEventSubscriber): void;
7
- getSubscribersForEvent<T extends AnyEvent = AnyEvent>(eventType: EventClass<T>): IEventSubscriber<T>[];
9
+ getGlobalSubscribers(): IGlobalEventSubscriber[];
8
10
  getSubscribers(): IEventSubscriber[];
11
+ getSubscribersForEvent<T extends AnyEvent = AnyEvent>(eventType: EventClass<T>): IEventSubscriber<T>[];
12
+ getAllSubscribersForEvent<T extends AnyEvent = AnyEvent>(eventType: EventClass<T>): (IGlobalEventSubscriber | IEventSubscriber<T>)[];
9
13
  }
@@ -1,4 +1,7 @@
1
1
  import { AnyEvent, EventClass } from "../../core";
2
+ export interface IGlobalEventSubscriber {
3
+ handleEvent(event: AnyEvent): Promise<void>;
4
+ }
2
5
  export interface IEventSubscriber<T extends AnyEvent = AnyEvent> {
3
6
  subscribeToEvents(): EventClass<T> | EventClass<T>[];
4
7
  handleEvent(event: T): Promise<void>;
@@ -30,8 +30,8 @@ const getCommandHandlerMap = (target) => {
30
30
  _target = Reflect.getPrototypeOf(_target);
31
31
  } while (_target !== null);
32
32
  ownCommandHandlerMaps.forEach((ownCommandHandlerMap) => {
33
- ownCommandHandlerMap.forEach((commandHandler, methodName) => {
34
- result.set(methodName, commandHandler);
33
+ ownCommandHandlerMap.forEach((commandHandler, commandType) => {
34
+ result.set(commandType, commandHandler);
35
35
  });
36
36
  });
37
37
  return result;
@@ -30,8 +30,8 @@ const getEventApplierMap = (target) => {
30
30
  _target = Reflect.getPrototypeOf(_target);
31
31
  } while (_target !== null);
32
32
  ownEventApplierMaps.forEach((ownEventApplierMap) => {
33
- ownEventApplierMap.forEach((eventApplier, methodName) => {
34
- result.set(methodName, eventApplier);
33
+ ownEventApplierMap.forEach((eventApplier, eventType) => {
34
+ result.set(eventType, eventApplier);
35
35
  });
36
36
  });
37
37
  return result;
package/dist/package.json CHANGED
@@ -1 +1 @@
1
- {"name":"ddd-node","version":"24.2.0","description":"Domain Driven Design base for NodeJs","type":"commonjs","main":"index.js","types":"index.d.ts","files":["dist"],"repository":{"type":"git","url":"https://github.com/nqd881/ddd-node"},"keywords":["ddd","ddd-node","ddd-base","ddd-ts","ddd-js"],"author":"Quoc Dai","license":"ISC","devDependencies":{"@types/chai":"^4.3.16","@types/lodash":"^4.14.200","@types/mocha":"^10.0.6","@types/uuid":"^9.0.6","chai":"^5.1.1","chai-deep-match":"^1.2.1","ddd-node":"file:dist","mocha":"^10.4.0","ts-node":"^10.9.1","tsconfig-paths":"^4.2.0","typescript":"^5.2.2"},"dependencies":{"lodash":"^4.17.21","reflect-metadata":"^0.1.13","tsc-alias":"^1.8.8","type-fest":"^4.20.1","uuid":"^9.0.1"}}
1
+ {"name":"ddd-node","version":"24.4.0","description":"Domain Driven Design base for NodeJs","type":"commonjs","main":"index.js","types":"index.d.ts","files":["dist"],"repository":{"type":"git","url":"https://github.com/nqd881/ddd-node"},"keywords":["ddd","ddd-node","ddd-base","ddd-ts","ddd-js"],"author":"Quoc Dai","license":"ISC","devDependencies":{"@types/chai":"^4.3.16","@types/lodash":"^4.14.200","@types/mocha":"^10.0.6","@types/uuid":"^9.0.6","chai":"^5.1.1","chai-deep-match":"^1.2.1","ddd-node":"file:dist","mocha":"^10.4.0","ts-node":"^10.9.1","tsconfig-paths":"^4.2.0","typescript":"^5.2.2"},"dependencies":{"lodash":"^4.17.21","reflect-metadata":"^0.1.13","tsc-alias":"^1.8.8","type-fest":"^4.20.1","uuid":"^9.0.1"}}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "ddd-node",
3
- "version": "24.2.0",
3
+ "version": "24.4.0",
4
4
  "description": "Domain Driven Design base for NodeJs",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",