ddd-node 16.3.0 → 16.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.
- package/dist/core/aggregate/event-sourced-aggregate.js +3 -3
- package/dist/core/aggregate/state-aggregate.d.ts +4 -2
- package/dist/core/aggregate/state-aggregate.js +7 -5
- package/dist/core/event-pubsub/event-publisher.d.ts +10 -0
- package/dist/core/event-pubsub/event-publisher.js +13 -0
- package/dist/core/event-pubsub/event-subscriber-registry.d.ts +25 -0
- package/dist/core/event-pubsub/event-subscriber-registry.js +59 -0
- package/dist/core/event-pubsub/event-subscriber.d.ts +13 -0
- package/dist/core/event-pubsub/event-subscriber.js +16 -0
- package/dist/core/event-pubsub/index.d.ts +3 -0
- package/dist/core/event-pubsub/index.js +19 -0
- package/dist/core/index.d.ts +2 -1
- package/dist/core/index.js +2 -1
- package/dist/core/message/command.d.ts +2 -1
- package/dist/core/message/event.d.ts +2 -1
- package/dist/core/repository/index.d.ts +1 -0
- package/dist/core/{abstraction → repository}/index.js +0 -1
- package/dist/decorators/message/command.d.ts +2 -2
- package/dist/decorators/message/event.d.ts +2 -2
- package/dist/meta/command.metadata.d.ts +3 -2
- package/dist/meta/event.metadata.d.ts +3 -2
- package/dist/package.json +1 -1
- package/package.json +1 -1
- package/dist/core/abstraction/event-publisher.d.ts +0 -5
- package/dist/core/abstraction/event-publisher.js +0 -2
- package/dist/core/abstraction/index.d.ts +0 -2
- /package/dist/core/{abstraction → repository}/repository.d.ts +0 -0
- /package/dist/core/{abstraction → repository}/repository.js +0 -0
|
@@ -38,13 +38,13 @@ class EventSourcedAggregateBase extends base_1.AggregateBase {
|
|
|
38
38
|
return this._version + this._pastEvents.length + this._events.length;
|
|
39
39
|
}
|
|
40
40
|
pastEvents() {
|
|
41
|
-
return
|
|
41
|
+
return Array.from(this._pastEvents);
|
|
42
42
|
}
|
|
43
43
|
events() {
|
|
44
|
-
return
|
|
44
|
+
return Array.from(this._events);
|
|
45
45
|
}
|
|
46
46
|
handledCommands() {
|
|
47
|
-
return
|
|
47
|
+
return Array.from(this._handledCommands);
|
|
48
48
|
}
|
|
49
49
|
eventApplierMap() {
|
|
50
50
|
return this.constructor.eventApplierMap();
|
|
@@ -4,7 +4,9 @@ import { Id } from "../id";
|
|
|
4
4
|
import { AnyEvent, EventClass } from "../message";
|
|
5
5
|
import { Props, PropsOf } from "../model";
|
|
6
6
|
import { AggregateBase, AggregateMetadata } from "./base";
|
|
7
|
-
|
|
7
|
+
export interface IEventDispatcher {
|
|
8
|
+
dispatch(event: AnyEvent): void;
|
|
9
|
+
}
|
|
8
10
|
export declare class StateAggregateBase<P extends Props> extends AggregateBase<P> {
|
|
9
11
|
private _events;
|
|
10
12
|
constructor(metadata: AggregateMetadata, props: P);
|
|
@@ -14,8 +16,8 @@ export declare class StateAggregateBase<P extends Props> extends AggregateBase<P
|
|
|
14
16
|
events(): AnyEvent[];
|
|
15
17
|
protected recordEvent<E extends AnyEvent>(event: E): void;
|
|
16
18
|
protected recordEvent<E extends AnyEvent>(eventClass: EventClass<E>, props: PropsOf<E>): void;
|
|
17
|
-
publishEvents(eventPublisher: IEventPublisher): Promise<void>;
|
|
18
19
|
clearEvents(): void;
|
|
20
|
+
dispatchEvents(dispatcher: IEventDispatcher): void;
|
|
19
21
|
}
|
|
20
22
|
export type AnyStateAggregate = StateAggregateBase<Props>;
|
|
21
23
|
export interface StateAggregateClass<T extends AnyStateAggregate = AnyStateAggregate, Arguments extends unknown[] = any[]> extends Class<T, Arguments>, ClassStatic<typeof StateAggregateBase<PropsOf<T>>> {
|
|
@@ -20,7 +20,7 @@ class StateAggregateBase extends base_1.AggregateBase {
|
|
|
20
20
|
return this._version;
|
|
21
21
|
}
|
|
22
22
|
events() {
|
|
23
|
-
return
|
|
23
|
+
return Array.from(this._events);
|
|
24
24
|
}
|
|
25
25
|
recordEvent(param1, param2) {
|
|
26
26
|
let event;
|
|
@@ -32,12 +32,14 @@ class StateAggregateBase extends base_1.AggregateBase {
|
|
|
32
32
|
}
|
|
33
33
|
this._events.push(event);
|
|
34
34
|
}
|
|
35
|
-
async publishEvents(eventPublisher) {
|
|
36
|
-
await eventPublisher.publishAll(this.events());
|
|
37
|
-
this.clearEvents();
|
|
38
|
-
}
|
|
39
35
|
clearEvents() {
|
|
40
36
|
this._events = [];
|
|
41
37
|
}
|
|
38
|
+
dispatchEvents(dispatcher) {
|
|
39
|
+
this.events().forEach((event) => {
|
|
40
|
+
dispatcher.dispatch(event);
|
|
41
|
+
});
|
|
42
|
+
this.clearEvents();
|
|
43
|
+
}
|
|
42
44
|
}
|
|
43
45
|
exports.StateAggregateBase = StateAggregateBase;
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { AnyEvent } from "../message";
|
|
2
|
+
import { IEventSubscriberRegistry } from "./event-subscriber-registry";
|
|
3
|
+
export interface IEventPublisher {
|
|
4
|
+
publish<T extends AnyEvent = AnyEvent>(event: T): Promise<void>;
|
|
5
|
+
}
|
|
6
|
+
export declare class EventPublisher implements IEventPublisher {
|
|
7
|
+
private subscriberRegistry;
|
|
8
|
+
constructor(subscriberRegistry: IEventSubscriberRegistry);
|
|
9
|
+
publish<T extends AnyEvent = AnyEvent>(event: T): Promise<void>;
|
|
10
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EventPublisher = void 0;
|
|
4
|
+
class EventPublisher {
|
|
5
|
+
constructor(subscriberRegistry) {
|
|
6
|
+
this.subscriberRegistry = subscriberRegistry;
|
|
7
|
+
}
|
|
8
|
+
async publish(event) {
|
|
9
|
+
const subscribers = this.subscriberRegistry.getSubscribersForEvent(event.constructor);
|
|
10
|
+
await Promise.all(subscribers.map((subscriber) => subscriber.handleEvent(event)));
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
exports.EventPublisher = EventPublisher;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { AnyEvent, EventClass } from "../message";
|
|
2
|
+
import { IEventSubscriber } from "./event-subscriber";
|
|
3
|
+
export type Unsubscriber = () => void;
|
|
4
|
+
export interface IEventSubscriberRegistry {
|
|
5
|
+
registerSubscriber(subscriber: IEventSubscriber): Unsubscriber;
|
|
6
|
+
deregisterSubscriber(subscriber: IEventSubscriber): void;
|
|
7
|
+
getSubscribersForEvent<T extends AnyEvent = AnyEvent>(eventType: EventClass<T>): IEventSubscriber<T>[];
|
|
8
|
+
getSubscribers(): IEventSubscriber[];
|
|
9
|
+
}
|
|
10
|
+
export declare class EventSubscriberRegistry implements IEventSubscriberRegistry {
|
|
11
|
+
private static _instance;
|
|
12
|
+
static instance(): EventSubscriberRegistry;
|
|
13
|
+
private _subscribers;
|
|
14
|
+
constructor(subscribers?: IEventSubscriber[]);
|
|
15
|
+
private _setSubscribersForEvent;
|
|
16
|
+
private _initSubscribersForEvent;
|
|
17
|
+
private _getSubscribersForEvent;
|
|
18
|
+
private _hasSubscriber;
|
|
19
|
+
private _addSubscriber;
|
|
20
|
+
private _removeSubscriber;
|
|
21
|
+
registerSubscriber(subscriber: IEventSubscriber): () => void;
|
|
22
|
+
deregisterSubscriber(subscriber: IEventSubscriber<AnyEvent>): void;
|
|
23
|
+
getSubscribersForEvent<T extends AnyEvent = AnyEvent>(eventType: EventClass<T, any[]>): IEventSubscriber<T>[];
|
|
24
|
+
getSubscribers(): IEventSubscriber[];
|
|
25
|
+
}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EventSubscriberRegistry = void 0;
|
|
4
|
+
class EventSubscriberRegistry {
|
|
5
|
+
static instance() {
|
|
6
|
+
if (!this._instance)
|
|
7
|
+
this._instance = new EventSubscriberRegistry();
|
|
8
|
+
return this._instance;
|
|
9
|
+
}
|
|
10
|
+
constructor(subscribers = []) {
|
|
11
|
+
this._subscribers = new Map();
|
|
12
|
+
subscribers.forEach((subscriber) => {
|
|
13
|
+
this.registerSubscriber(subscriber);
|
|
14
|
+
});
|
|
15
|
+
}
|
|
16
|
+
_setSubscribersForEvent(eventType, subscribers) {
|
|
17
|
+
this._subscribers.set(eventType, subscribers);
|
|
18
|
+
}
|
|
19
|
+
_initSubscribersForEvent(eventType) {
|
|
20
|
+
this._setSubscribersForEvent(eventType, []);
|
|
21
|
+
}
|
|
22
|
+
_getSubscribersForEvent(eventType) {
|
|
23
|
+
const subscribers = () => this._subscribers.get(eventType);
|
|
24
|
+
if (!subscribers())
|
|
25
|
+
this._initSubscribersForEvent(eventType);
|
|
26
|
+
return subscribers();
|
|
27
|
+
}
|
|
28
|
+
_hasSubscriber(subscriber) {
|
|
29
|
+
const subscribedEvent = subscriber.subscribeToEvent();
|
|
30
|
+
const subscribers = this._getSubscribersForEvent(subscribedEvent);
|
|
31
|
+
return subscribers.some((_subscriber) => _subscriber === subscriber);
|
|
32
|
+
}
|
|
33
|
+
_addSubscriber(subscriber) {
|
|
34
|
+
if (!this._hasSubscriber(subscriber)) {
|
|
35
|
+
const subscribedEvent = subscriber.subscribeToEvent();
|
|
36
|
+
const subscribers = this._getSubscribersForEvent(subscribedEvent);
|
|
37
|
+
subscribers.push(subscriber);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
_removeSubscriber(subscriber) {
|
|
41
|
+
const subscribedEvent = subscriber.subscribeToEvent();
|
|
42
|
+
const subscribers = this._getSubscribersForEvent(subscribedEvent);
|
|
43
|
+
this._setSubscribersForEvent(subscribedEvent, subscribers.filter((_subscriber) => _subscriber !== subscriber));
|
|
44
|
+
}
|
|
45
|
+
registerSubscriber(subscriber) {
|
|
46
|
+
this._addSubscriber(subscriber);
|
|
47
|
+
return () => this.deregisterSubscriber(subscriber);
|
|
48
|
+
}
|
|
49
|
+
deregisterSubscriber(subscriber) {
|
|
50
|
+
this._removeSubscriber(subscriber);
|
|
51
|
+
}
|
|
52
|
+
getSubscribersForEvent(eventType) {
|
|
53
|
+
return Array.from(this._getSubscribersForEvent(eventType));
|
|
54
|
+
}
|
|
55
|
+
getSubscribers() {
|
|
56
|
+
return Array.from(this._subscribers.values()).flat();
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
exports.EventSubscriberRegistry = EventSubscriberRegistry;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { AnyEvent, EventClass } from "../message";
|
|
2
|
+
export interface IEventSubscriber<T extends AnyEvent = AnyEvent> {
|
|
3
|
+
subscribeToEvent(): EventClass<T>;
|
|
4
|
+
handleEvent(event: T): Promise<void>;
|
|
5
|
+
}
|
|
6
|
+
export type EventSubscriberHandler<T extends AnyEvent = AnyEvent> = IEventSubscriber<T>["handleEvent"];
|
|
7
|
+
export declare class EventSubscriber<T extends AnyEvent = AnyEvent> implements IEventSubscriber<T> {
|
|
8
|
+
private readonly subscribedEvent;
|
|
9
|
+
private readonly eventHandler;
|
|
10
|
+
constructor(subscribedEvent: EventClass<T>, eventHandler: EventSubscriberHandler<T>);
|
|
11
|
+
subscribeToEvent(): EventClass<T, any[]>;
|
|
12
|
+
handleEvent(event: T): Promise<void>;
|
|
13
|
+
}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.EventSubscriber = void 0;
|
|
4
|
+
class EventSubscriber {
|
|
5
|
+
constructor(subscribedEvent, eventHandler) {
|
|
6
|
+
this.subscribedEvent = subscribedEvent;
|
|
7
|
+
this.eventHandler = eventHandler;
|
|
8
|
+
}
|
|
9
|
+
subscribeToEvent() {
|
|
10
|
+
return this.subscribedEvent;
|
|
11
|
+
}
|
|
12
|
+
handleEvent(event) {
|
|
13
|
+
return this.eventHandler(event);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
exports.EventSubscriber = EventSubscriber;
|
|
@@ -0,0 +1,19 @@
|
|
|
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("./event-subscriber"), exports);
|
|
18
|
+
__exportStar(require("./event-publisher"), exports);
|
|
19
|
+
__exportStar(require("./event-subscriber-registry"), exports);
|
package/dist/core/index.d.ts
CHANGED
package/dist/core/index.js
CHANGED
|
@@ -21,5 +21,6 @@ __exportStar(require("./entity"), exports);
|
|
|
21
21
|
__exportStar(require("./enum"), exports);
|
|
22
22
|
__exportStar(require("./message"), exports);
|
|
23
23
|
__exportStar(require("./value-object"), exports);
|
|
24
|
-
__exportStar(require("./
|
|
24
|
+
__exportStar(require("./repository"), exports);
|
|
25
25
|
__exportStar(require("./domain"), exports);
|
|
26
|
+
__exportStar(require("./event-pubsub"), exports);
|
|
@@ -2,12 +2,13 @@ import { ClassStatic } from "../../types";
|
|
|
2
2
|
import { Class } from "type-fest";
|
|
3
3
|
import { Props, PropsOf } from "../model";
|
|
4
4
|
import { MessageBase, MessageContext, MessageMetadata } from "./message";
|
|
5
|
+
export type CommandType = string;
|
|
5
6
|
export interface CommandMetadata extends Omit<MessageMetadata, "messageType"> {
|
|
6
7
|
}
|
|
7
8
|
export declare class CommandBase<P extends Props> extends MessageBase<P> {
|
|
8
9
|
static readonly COMMAND_MESSAGE_TYPE = "command";
|
|
9
10
|
constructor(metadata: CommandMetadata, props: P);
|
|
10
|
-
static commandType():
|
|
11
|
+
static commandType(): CommandType;
|
|
11
12
|
static newCommand<T extends AnyCommand>(this: CommandClassWithTypedConstructor<T>, props: PropsOf<T>, context?: MessageContext, timestamp?: number): T;
|
|
12
13
|
commandType(): string;
|
|
13
14
|
}
|
|
@@ -3,6 +3,7 @@ import { Class } from "type-fest";
|
|
|
3
3
|
import { Id } from "../id";
|
|
4
4
|
import { Props, PropsOf } from "../model";
|
|
5
5
|
import { MessageBase, MessageContext, MessageMetadata } from "./message";
|
|
6
|
+
export type EventType = string;
|
|
6
7
|
export type EventSource = Readonly<{
|
|
7
8
|
aggregate: string;
|
|
8
9
|
id: Id;
|
|
@@ -15,7 +16,7 @@ export declare class EventBase<P extends Props> extends MessageBase<P> {
|
|
|
15
16
|
static readonly EVENT_MESSAGE_TYPE = "event";
|
|
16
17
|
private readonly _source;
|
|
17
18
|
constructor(metadata: EventMetadata, props: P);
|
|
18
|
-
static eventType():
|
|
19
|
+
static eventType(): EventType;
|
|
19
20
|
static newEvent<T extends AnyEvent>(this: EventClassWithTypedConstructor<T>, source: EventSource, props: PropsOf<T>, context?: MessageContext, timestamp?: number): T;
|
|
20
21
|
source(): Readonly<{
|
|
21
22
|
aggregate: string;
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./repository";
|
|
@@ -14,5 +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-publisher"), exports);
|
|
18
17
|
__exportStar(require("./repository"), exports);
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { AnyCommand, CommandClass } from "../../core";
|
|
2
|
-
export declare const Command: (commandType:
|
|
1
|
+
import { AnyCommand, CommandClass, CommandType } from "../../core";
|
|
2
|
+
export declare const Command: (commandType: CommandType) => <T extends AnyCommand>(target: CommandClass<T, any[]>) => void;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { AnyEvent, EventClass } from "../../core";
|
|
2
|
-
export declare const Event: (eventType:
|
|
1
|
+
import { AnyEvent, EventClass, EventType } from "../../core";
|
|
2
|
+
export declare const Event: (eventType: EventType) => <T extends AnyEvent>(target: EventClass<T, any[]>) => void;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
import "reflect-metadata";
|
|
2
|
-
|
|
3
|
-
export declare const
|
|
2
|
+
import { CommandType } from "../core";
|
|
3
|
+
export declare const setCommandType: (target: object, commandType: CommandType) => void;
|
|
4
|
+
export declare const getCommandType: (target: object) => CommandType | undefined;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
1
|
import "reflect-metadata";
|
|
2
|
-
|
|
3
|
-
export declare const
|
|
2
|
+
import { EventType } from "../core";
|
|
3
|
+
export declare const setEventType: (target: object, eventType: EventType) => void;
|
|
4
|
+
export declare const getEventType: (target: object) => EventType | undefined;
|
package/dist/package.json
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"name":"ddd-node","version":"16.
|
|
1
|
+
{"name":"ddd-node","version":"16.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","nodejs-snowflake":"^2.0.1","reflect-metadata":"^0.1.13","tsc-alias":"^1.8.8","type-fest":"^4.15.0","uuid":"^9.0.1"}}
|
package/package.json
CHANGED
|
File without changes
|
|
File without changes
|