ddd-node 24.2.0 → 24.3.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.
@@ -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);
@@ -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.3.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.3.0",
4
4
  "description": "Domain Driven Design base for NodeJs",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",