@hestjs/cqrs 0.1.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/README.md +234 -0
- package/dist/classes/command.d.ts +13 -0
- package/dist/classes/command.d.ts.map +1 -0
- package/dist/classes/command.js +11 -0
- package/dist/classes/command.js.map +1 -0
- package/dist/classes/event.d.ts +10 -0
- package/dist/classes/event.d.ts.map +1 -0
- package/dist/classes/event.js +14 -0
- package/dist/classes/event.js.map +1 -0
- package/dist/classes/index.d.ts +4 -0
- package/dist/classes/index.d.ts.map +1 -0
- package/dist/classes/index.js +20 -0
- package/dist/classes/index.js.map +1 -0
- package/dist/classes/query.d.ts +13 -0
- package/dist/classes/query.d.ts.map +1 -0
- package/dist/classes/query.js +11 -0
- package/dist/classes/query.js.map +1 -0
- package/dist/command-bus.d.ts +30 -0
- package/dist/command-bus.d.ts.map +1 -0
- package/dist/command-bus.js +88 -0
- package/dist/command-bus.js.map +1 -0
- package/dist/constants.d.ts +10 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +16 -0
- package/dist/constants.js.map +1 -0
- package/dist/cqrs.module.d.ts +50 -0
- package/dist/cqrs.module.d.ts.map +1 -0
- package/dist/cqrs.module.js +149 -0
- package/dist/cqrs.module.js.map +1 -0
- package/dist/decorators/command-handler.decorator.d.ts +12 -0
- package/dist/decorators/command-handler.decorator.d.ts.map +1 -0
- package/dist/decorators/command-handler.decorator.js +27 -0
- package/dist/decorators/command-handler.decorator.js.map +1 -0
- package/dist/decorators/events-handler.decorator.d.ts +12 -0
- package/dist/decorators/events-handler.decorator.d.ts.map +1 -0
- package/dist/decorators/events-handler.decorator.js +23 -0
- package/dist/decorators/events-handler.decorator.js.map +1 -0
- package/dist/decorators/index.d.ts +5 -0
- package/dist/decorators/index.d.ts.map +1 -0
- package/dist/decorators/index.js +21 -0
- package/dist/decorators/index.js.map +1 -0
- package/dist/decorators/query-handler.decorator.d.ts +12 -0
- package/dist/decorators/query-handler.decorator.d.ts.map +1 -0
- package/dist/decorators/query-handler.decorator.js +27 -0
- package/dist/decorators/query-handler.decorator.js.map +1 -0
- package/dist/decorators/saga.decorator.d.ts +9 -0
- package/dist/decorators/saga.decorator.d.ts.map +1 -0
- package/dist/decorators/saga.decorator.js +21 -0
- package/dist/decorators/saga.decorator.js.map +1 -0
- package/dist/event-bus.d.ts +38 -0
- package/dist/event-bus.d.ts.map +1 -0
- package/dist/event-bus.js +135 -0
- package/dist/event-bus.js.map +1 -0
- package/dist/exceptions/command.exceptions.d.ts +7 -0
- package/dist/exceptions/command.exceptions.d.ts.map +1 -0
- package/dist/exceptions/command.exceptions.js +18 -0
- package/dist/exceptions/command.exceptions.js.map +1 -0
- package/dist/exceptions/event.exceptions.d.ts +7 -0
- package/dist/exceptions/event.exceptions.d.ts.map +1 -0
- package/dist/exceptions/event.exceptions.js +18 -0
- package/dist/exceptions/event.exceptions.js.map +1 -0
- package/dist/exceptions/index.d.ts +4 -0
- package/dist/exceptions/index.d.ts.map +1 -0
- package/dist/exceptions/index.js +20 -0
- package/dist/exceptions/index.js.map +1 -0
- package/dist/exceptions/query.exceptions.d.ts +7 -0
- package/dist/exceptions/query.exceptions.d.ts.map +1 -0
- package/dist/exceptions/query.exceptions.js +18 -0
- package/dist/exceptions/query.exceptions.js.map +1 -0
- package/dist/helpers/default-command-pubsub.d.ts +7 -0
- package/dist/helpers/default-command-pubsub.d.ts.map +1 -0
- package/dist/helpers/default-command-pubsub.js +21 -0
- package/dist/helpers/default-command-pubsub.js.map +1 -0
- package/dist/helpers/default-event-pubsub.d.ts +8 -0
- package/dist/helpers/default-event-pubsub.d.ts.map +1 -0
- package/dist/helpers/default-event-pubsub.js +24 -0
- package/dist/helpers/default-event-pubsub.js.map +1 -0
- package/dist/helpers/default-query-pubsub.d.ts +7 -0
- package/dist/helpers/default-query-pubsub.d.ts.map +1 -0
- package/dist/helpers/default-query-pubsub.js +21 -0
- package/dist/helpers/default-query-pubsub.js.map +1 -0
- package/dist/helpers/index.d.ts +4 -0
- package/dist/helpers/index.d.ts.map +1 -0
- package/dist/helpers/index.js +20 -0
- package/dist/helpers/index.js.map +1 -0
- package/dist/index.d.ts +14 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +39 -0
- package/dist/index.js.map +1 -0
- package/dist/interfaces/command.interface.d.ts +14 -0
- package/dist/interfaces/command.interface.d.ts.map +1 -0
- package/dist/interfaces/command.interface.js +3 -0
- package/dist/interfaces/command.interface.js.map +1 -0
- package/dist/interfaces/cqrs-module-options.interface.d.ts +17 -0
- package/dist/interfaces/cqrs-module-options.interface.d.ts.map +1 -0
- package/dist/interfaces/cqrs-module-options.interface.js +3 -0
- package/dist/interfaces/cqrs-module-options.interface.js.map +1 -0
- package/dist/interfaces/event.interface.d.ts +23 -0
- package/dist/interfaces/event.interface.d.ts.map +1 -0
- package/dist/interfaces/event.interface.js +3 -0
- package/dist/interfaces/event.interface.js.map +1 -0
- package/dist/interfaces/index.d.ts +5 -0
- package/dist/interfaces/index.d.ts.map +1 -0
- package/dist/interfaces/index.js +21 -0
- package/dist/interfaces/index.js.map +1 -0
- package/dist/interfaces/query.interface.d.ts +16 -0
- package/dist/interfaces/query.interface.d.ts.map +1 -0
- package/dist/interfaces/query.interface.js +3 -0
- package/dist/interfaces/query.interface.js.map +1 -0
- package/dist/query-bus.d.ts +30 -0
- package/dist/query-bus.d.ts.map +1 -0
- package/dist/query-bus.js +88 -0
- package/dist/query-bus.js.map +1 -0
- package/dist/services/explorer.service.d.ts +25 -0
- package/dist/services/explorer.service.d.ts.map +1 -0
- package/dist/services/explorer.service.js +95 -0
- package/dist/services/explorer.service.js.map +1 -0
- package/dist/services/index.d.ts +2 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +18 -0
- package/dist/services/index.js.map +1 -0
- package/dist/utils/index.d.ts +2 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +18 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/observable-bus.d.ts +11 -0
- package/dist/utils/observable-bus.d.ts.map +1 -0
- package/dist/utils/observable-bus.js +26 -0
- package/dist/utils/observable-bus.js.map +1 -0
- package/package.json +51 -0
package/README.md
ADDED
@@ -0,0 +1,234 @@
|
|
1
|
+
# @hestjs/cqrs
|
2
|
+
|
3
|
+
HestJS CQRS - Command Query Responsibility Segregation module for HestJS
|
4
|
+
|
5
|
+
## 安装
|
6
|
+
|
7
|
+
```bash
|
8
|
+
npm install @hestjs/cqrs
|
9
|
+
```
|
10
|
+
|
11
|
+
## 基本用法
|
12
|
+
|
13
|
+
### 1. 初始化CQRS模块
|
14
|
+
|
15
|
+
```typescript
|
16
|
+
import { CqrsModule } from "@hestjs/cqrs";
|
17
|
+
|
18
|
+
// 基本初始化
|
19
|
+
CqrsModule.forRoot();
|
20
|
+
|
21
|
+
// 或者使用选项
|
22
|
+
CqrsModule.forRoot({
|
23
|
+
// 自定义配置
|
24
|
+
});
|
25
|
+
```
|
26
|
+
|
27
|
+
### 2. 创建Command
|
28
|
+
|
29
|
+
```typescript
|
30
|
+
import { Command } from "@hestjs/cqrs";
|
31
|
+
|
32
|
+
export class CreateUserCommand extends Command<string> {
|
33
|
+
constructor(
|
34
|
+
public readonly name: string,
|
35
|
+
public readonly email: string
|
36
|
+
) {
|
37
|
+
super();
|
38
|
+
}
|
39
|
+
}
|
40
|
+
```
|
41
|
+
|
42
|
+
### 3. 创建Command Handler
|
43
|
+
|
44
|
+
```typescript
|
45
|
+
import { CommandHandler, ICommandHandler } from "@hestjs/cqrs";
|
46
|
+
import { CreateUserCommand } from "./create-user.command";
|
47
|
+
|
48
|
+
@CommandHandler(CreateUserCommand)
|
49
|
+
export class CreateUserHandler
|
50
|
+
implements ICommandHandler<CreateUserCommand, string>
|
51
|
+
{
|
52
|
+
async execute(command: CreateUserCommand): Promise<string> {
|
53
|
+
// 处理命令逻辑
|
54
|
+
console.log(`Creating user: ${command.name} (${command.email})`);
|
55
|
+
return "user-id-123";
|
56
|
+
}
|
57
|
+
}
|
58
|
+
```
|
59
|
+
|
60
|
+
### 4. 创建Query
|
61
|
+
|
62
|
+
```typescript
|
63
|
+
import { Query, IQueryResult } from "@hestjs/cqrs";
|
64
|
+
|
65
|
+
export class GetUserQuery extends Query<GetUserResult> {
|
66
|
+
constructor(public readonly userId: string) {
|
67
|
+
super();
|
68
|
+
}
|
69
|
+
}
|
70
|
+
|
71
|
+
export class GetUserResult implements IQueryResult {
|
72
|
+
constructor(
|
73
|
+
public readonly id: string,
|
74
|
+
public readonly name: string,
|
75
|
+
public readonly email: string
|
76
|
+
) {}
|
77
|
+
}
|
78
|
+
```
|
79
|
+
|
80
|
+
### 5. 创建Query Handler
|
81
|
+
|
82
|
+
```typescript
|
83
|
+
import { QueryHandler, IQueryHandler } from "@hestjs/cqrs";
|
84
|
+
import { GetUserQuery, GetUserResult } from "./get-user.query";
|
85
|
+
|
86
|
+
@QueryHandler(GetUserQuery)
|
87
|
+
export class GetUserHandler
|
88
|
+
implements IQueryHandler<GetUserQuery, GetUserResult>
|
89
|
+
{
|
90
|
+
async execute(query: GetUserQuery): Promise<GetUserResult> {
|
91
|
+
// 查询逻辑
|
92
|
+
return new GetUserResult(query.userId, "John Doe", "john@example.com");
|
93
|
+
}
|
94
|
+
}
|
95
|
+
```
|
96
|
+
|
97
|
+
### 6. 创建Event
|
98
|
+
|
99
|
+
```typescript
|
100
|
+
import { Event } from "@hestjs/cqrs";
|
101
|
+
|
102
|
+
export class UserCreatedEvent extends Event {
|
103
|
+
constructor(
|
104
|
+
public readonly userId: string,
|
105
|
+
public readonly name: string,
|
106
|
+
public readonly email: string
|
107
|
+
) {
|
108
|
+
super(userId);
|
109
|
+
}
|
110
|
+
}
|
111
|
+
```
|
112
|
+
|
113
|
+
### 7. 创建Event Handler
|
114
|
+
|
115
|
+
```typescript
|
116
|
+
import { EventsHandler, IEventHandler } from "@hestjs/cqrs";
|
117
|
+
import { UserCreatedEvent } from "./user-created.event";
|
118
|
+
|
119
|
+
@EventsHandler(UserCreatedEvent)
|
120
|
+
export class UserCreatedHandler implements IEventHandler<UserCreatedEvent> {
|
121
|
+
async handle(event: UserCreatedEvent): Promise<void> {
|
122
|
+
// 处理事件逻辑
|
123
|
+
console.log(`User created: ${event.name} (${event.email})`);
|
124
|
+
}
|
125
|
+
}
|
126
|
+
```
|
127
|
+
|
128
|
+
### 8. 在控制器中使用
|
129
|
+
|
130
|
+
```typescript
|
131
|
+
import { Controller, Post } from "@hestjs/core";
|
132
|
+
import { CommandBus, QueryBus, EventBus } from "@hestjs/cqrs";
|
133
|
+
import { CreateUserCommand } from "./commands/create-user.command";
|
134
|
+
import { GetUserQuery } from "./queries/get-user.query";
|
135
|
+
import { UserCreatedEvent } from "./events/user-created.event";
|
136
|
+
|
137
|
+
@Controller("/users")
|
138
|
+
export class UserController {
|
139
|
+
constructor(
|
140
|
+
private readonly commandBus: CommandBus,
|
141
|
+
private readonly queryBus: QueryBus,
|
142
|
+
private readonly eventBus: EventBus
|
143
|
+
) {}
|
144
|
+
|
145
|
+
@Post()
|
146
|
+
async createUser(data: { name: string; email: string }) {
|
147
|
+
const command = new CreateUserCommand(data.name, data.email);
|
148
|
+
const userId = await this.commandBus.execute(command);
|
149
|
+
|
150
|
+
// 发布事件
|
151
|
+
const event = new UserCreatedEvent(userId, data.name, data.email);
|
152
|
+
await this.eventBus.publish(event);
|
153
|
+
|
154
|
+
return { userId };
|
155
|
+
}
|
156
|
+
|
157
|
+
@Get("/:id")
|
158
|
+
async getUser(id: string) {
|
159
|
+
const query = new GetUserQuery(id);
|
160
|
+
return await this.queryBus.execute(query);
|
161
|
+
}
|
162
|
+
}
|
163
|
+
```
|
164
|
+
|
165
|
+
### 9. 注册处理器
|
166
|
+
|
167
|
+
```typescript
|
168
|
+
import { CqrsModule } from "@hestjs/cqrs";
|
169
|
+
import { CreateUserHandler } from "./handlers/create-user.handler";
|
170
|
+
import { GetUserHandler } from "./handlers/get-user.handler";
|
171
|
+
import { UserCreatedHandler } from "./handlers/user-created.handler";
|
172
|
+
|
173
|
+
// 初始化CQRS模块
|
174
|
+
CqrsModule.forRoot();
|
175
|
+
|
176
|
+
// 获取CQRS模块实例
|
177
|
+
const cqrsModule = CqrsModule.getInstance();
|
178
|
+
|
179
|
+
// 注册处理器
|
180
|
+
cqrsModule.registerHandler(CreateUserHandler);
|
181
|
+
cqrsModule.registerHandler(GetUserHandler);
|
182
|
+
cqrsModule.registerHandler(UserCreatedHandler);
|
183
|
+
|
184
|
+
// 启动应用时调用
|
185
|
+
await cqrsModule.onApplicationBootstrap();
|
186
|
+
```
|
187
|
+
|
188
|
+
### 10. Saga (长期运行的流程)
|
189
|
+
|
190
|
+
```typescript
|
191
|
+
import { Saga, ICommand } from "@hestjs/cqrs";
|
192
|
+
import { UserCreatedEvent } from "./events/user-created.event";
|
193
|
+
import { SendWelcomeEmailCommand } from "./commands/send-welcome-email.command";
|
194
|
+
|
195
|
+
@Saga()
|
196
|
+
export class UserSaga {
|
197
|
+
// 当用户创建事件发生时,发送欢迎邮件
|
198
|
+
async onUserCreatedEvent(event: UserCreatedEvent): Promise<ICommand[]> {
|
199
|
+
return [new SendWelcomeEmailCommand(event.userId, event.email)];
|
200
|
+
}
|
201
|
+
}
|
202
|
+
```
|
203
|
+
|
204
|
+
## API 参考
|
205
|
+
|
206
|
+
### 装饰器
|
207
|
+
|
208
|
+
- `@CommandHandler(command)` - 标记命令处理器
|
209
|
+
- `@QueryHandler(query)` - 标记查询处理器
|
210
|
+
- `@EventsHandler(...events)` - 标记事件处理器
|
211
|
+
- `@Saga()` - 标记Saga
|
212
|
+
|
213
|
+
### 基类
|
214
|
+
|
215
|
+
- `Command<T>` - 命令基类,T为返回类型
|
216
|
+
- `Query<T>` - 查询基类,T为结果类型
|
217
|
+
- `Event` - 事件基类
|
218
|
+
|
219
|
+
### 总线
|
220
|
+
|
221
|
+
- `CommandBus` - 命令总线
|
222
|
+
- `QueryBus` - 查询总线
|
223
|
+
- `EventBus` - 事件总线
|
224
|
+
|
225
|
+
### 接口
|
226
|
+
|
227
|
+
- `ICommandHandler<TCommand, TResult>` - 命令处理器接口
|
228
|
+
- `IQueryHandler<TQuery, TResult>` - 查询处理器接口
|
229
|
+
- `IEventHandler<TEvent>` - 事件处理器接口
|
230
|
+
- `ISaga<TEvent>` - Saga接口
|
231
|
+
|
232
|
+
## 许可证
|
233
|
+
|
234
|
+
MIT
|
@@ -0,0 +1,13 @@
|
|
1
|
+
import { RESULT_TYPE_SYMBOL } from "../constants";
|
2
|
+
import { ICommand } from "../interfaces";
|
3
|
+
/**
|
4
|
+
* Utility type to extract the result type of a command.
|
5
|
+
*/
|
6
|
+
export type CommandResult<C extends Command<unknown>> = C extends Command<infer R> ? R : never;
|
7
|
+
/**
|
8
|
+
* Base command class with typed result
|
9
|
+
*/
|
10
|
+
export declare class Command<T> implements ICommand {
|
11
|
+
readonly [RESULT_TYPE_SYMBOL]?: T;
|
12
|
+
}
|
13
|
+
//# sourceMappingURL=command.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"command.d.ts","sourceRoot":"","sources":["../../src/classes/command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC;;GAEG;AACH,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,OAAO,CAAC,OAAO,CAAC,IAClD,CAAC,SAAS,OAAO,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AAEzC;;GAEG;AACH,qBAAa,OAAO,CAAC,CAAC,CAAE,YAAW,QAAQ;IACzC,QAAQ,CAAC,CAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC;CACnC"}
|
@@ -0,0 +1,11 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.Command = void 0;
|
4
|
+
const constants_1 = require("../constants");
|
5
|
+
/**
|
6
|
+
* Base command class with typed result
|
7
|
+
*/
|
8
|
+
class Command {
|
9
|
+
}
|
10
|
+
exports.Command = Command;
|
11
|
+
//# sourceMappingURL=command.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"command.js","sourceRoot":"","sources":["../../src/classes/command.ts"],"names":[],"mappings":";;;AAAA,4CAAkD;AASlD;;GAEG;AACH,MAAa,OAAO;CAEnB;AAFD,0BAEC"}
|
@@ -0,0 +1,10 @@
|
|
1
|
+
import { IEvent } from "../interfaces";
|
2
|
+
/**
|
3
|
+
* Base event class
|
4
|
+
*/
|
5
|
+
export declare class Event implements IEvent {
|
6
|
+
readonly aggregateId?: string;
|
7
|
+
readonly version?: number;
|
8
|
+
constructor(aggregateId?: string, version?: number);
|
9
|
+
}
|
10
|
+
//# sourceMappingURL=event.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"event.d.ts","sourceRoot":"","sources":["../../src/classes/event.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAEvC;;GAEG;AACH,qBAAa,KAAM,YAAW,MAAM;IAClC,SAAgB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrC,SAAgB,OAAO,CAAC,EAAE,MAAM,CAAC;gBAErB,WAAW,CAAC,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM;CAInD"}
|
@@ -0,0 +1,14 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.Event = void 0;
|
4
|
+
/**
|
5
|
+
* Base event class
|
6
|
+
*/
|
7
|
+
class Event {
|
8
|
+
constructor(aggregateId, version) {
|
9
|
+
this.aggregateId = aggregateId;
|
10
|
+
this.version = version;
|
11
|
+
}
|
12
|
+
}
|
13
|
+
exports.Event = Event;
|
14
|
+
//# sourceMappingURL=event.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"event.js","sourceRoot":"","sources":["../../src/classes/event.ts"],"names":[],"mappings":";;;AAEA;;GAEG;AACH,MAAa,KAAK;IAIhB,YAAY,WAAoB,EAAE,OAAgB;QAChD,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;QAC/B,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF;AARD,sBAQC"}
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/classes/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AACxB,cAAc,SAAS,CAAC"}
|
@@ -0,0 +1,20 @@
|
|
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("./command"), exports);
|
18
|
+
__exportStar(require("./event"), exports);
|
19
|
+
__exportStar(require("./query"), exports);
|
20
|
+
//# sourceMappingURL=index.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/classes/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,4CAA0B;AAC1B,0CAAwB;AACxB,0CAAwB"}
|
@@ -0,0 +1,13 @@
|
|
1
|
+
import { RESULT_TYPE_SYMBOL } from "../constants";
|
2
|
+
import { IQuery, IQueryResult } from "../interfaces";
|
3
|
+
/**
|
4
|
+
* Utility type to extract the result type of a query.
|
5
|
+
*/
|
6
|
+
export type QueryResult<Q extends Query<IQueryResult>> = Q extends Query<infer R> ? R : never;
|
7
|
+
/**
|
8
|
+
* Base query class with typed result
|
9
|
+
*/
|
10
|
+
export declare class Query<T extends IQueryResult> implements IQuery {
|
11
|
+
readonly [RESULT_TYPE_SYMBOL]?: T;
|
12
|
+
}
|
13
|
+
//# sourceMappingURL=query.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"query.d.ts","sourceRoot":"","sources":["../../src/classes/query.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,cAAc,CAAC;AAClD,OAAO,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAErD;;GAEG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,KAAK,CAAC,YAAY,CAAC,IACnD,CAAC,SAAS,KAAK,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AAEvC;;GAEG;AACH,qBAAa,KAAK,CAAC,CAAC,SAAS,YAAY,CAAE,YAAW,MAAM;IAC1D,QAAQ,CAAC,CAAC,kBAAkB,CAAC,CAAC,EAAE,CAAC,CAAC;CACnC"}
|
@@ -0,0 +1,11 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.Query = void 0;
|
4
|
+
const constants_1 = require("../constants");
|
5
|
+
/**
|
6
|
+
* Base query class with typed result
|
7
|
+
*/
|
8
|
+
class Query {
|
9
|
+
}
|
10
|
+
exports.Query = Query;
|
11
|
+
//# sourceMappingURL=query.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"query.js","sourceRoot":"","sources":["../../src/classes/query.ts"],"names":[],"mappings":";;;AAAA,4CAAkD;AASlD;;GAEG;AACH,MAAa,KAAK;CAEjB;AAFD,sBAEC"}
|
@@ -0,0 +1,30 @@
|
|
1
|
+
import "reflect-metadata";
|
2
|
+
import { Command } from "./classes";
|
3
|
+
import { CommandHandlerType, ICommand, ICommandBus, ICommandPublisher } from "./interfaces";
|
4
|
+
import { ObservableBus } from "./utils";
|
5
|
+
export declare class CommandBus<CommandBase extends ICommand = ICommand> extends ObservableBus<CommandBase> implements ICommandBus<CommandBase> {
|
6
|
+
private handlers;
|
7
|
+
private _publisher;
|
8
|
+
constructor();
|
9
|
+
/**
|
10
|
+
* Returns the publisher.
|
11
|
+
*/
|
12
|
+
get publisher(): ICommandPublisher<CommandBase>;
|
13
|
+
/**
|
14
|
+
* Sets the publisher.
|
15
|
+
*/
|
16
|
+
set publisher(_publisher: ICommandPublisher<CommandBase>);
|
17
|
+
/**
|
18
|
+
* Executes a command.
|
19
|
+
*/
|
20
|
+
execute<R = void>(command: Command<R>): Promise<R>;
|
21
|
+
execute<T extends CommandBase, R = any>(command: T): Promise<R>;
|
22
|
+
/**
|
23
|
+
* Registers command handlers.
|
24
|
+
*/
|
25
|
+
register(handlers: CommandHandlerType<CommandBase>[]): void;
|
26
|
+
private registerHandler;
|
27
|
+
private useDefaultPublisher;
|
28
|
+
private getCommandName;
|
29
|
+
}
|
30
|
+
//# sourceMappingURL=command-bus.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"command-bus.d.ts","sourceRoot":"","sources":["../src/command-bus.ts"],"names":[],"mappings":"AACA,OAAO,kBAAkB,CAAC;AAE1B,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,OAAO,EACL,kBAAkB,EAClB,QAAQ,EACR,WAAW,EAEX,iBAAiB,EAClB,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAExC,qBACa,UAAU,CAAC,WAAW,SAAS,QAAQ,GAAG,QAAQ,CAC7D,SAAQ,aAAa,CAAC,WAAW,CACjC,YAAW,WAAW,CAAC,WAAW,CAAC;IAEnC,OAAO,CAAC,QAAQ,CAA6D;IAC7E,OAAO,CAAC,UAAU,CAAkC;;IAOpD;;OAEG;IACH,IAAI,SAAS,IAAI,iBAAiB,CAAC,WAAW,CAAC,CAE9C;IAED;;OAEG;IACH,IAAI,SAAS,CAAC,UAAU,EAAE,iBAAiB,CAAC,WAAW,CAAC,EAEvD;IAED;;OAEG;IACG,OAAO,CAAC,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAClD,OAAO,CAAC,CAAC,SAAS,WAAW,EAAE,CAAC,GAAG,GAAG,EAAE,OAAO,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;IAoBrE;;OAEG;IACH,QAAQ,CAAC,QAAQ,EAAE,kBAAkB,CAAC,WAAW,CAAC,EAAE,GAAG,IAAI;IAI3D,OAAO,CAAC,eAAe;IA8BvB,OAAO,CAAC,mBAAmB;IAI3B,OAAO,CAAC,cAAc;CAIvB"}
|
@@ -0,0 +1,88 @@
|
|
1
|
+
"use strict";
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
7
|
+
};
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
10
|
+
};
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
12
|
+
exports.CommandBus = void 0;
|
13
|
+
const core_1 = require("@hestjs/core");
|
14
|
+
require("reflect-metadata");
|
15
|
+
const tsyringe_1 = require("tsyringe");
|
16
|
+
const constants_1 = require("./constants");
|
17
|
+
const exceptions_1 = require("./exceptions");
|
18
|
+
const helpers_1 = require("./helpers");
|
19
|
+
const utils_1 = require("./utils");
|
20
|
+
let CommandBus = class CommandBus extends utils_1.ObservableBus {
|
21
|
+
constructor() {
|
22
|
+
super();
|
23
|
+
this.handlers = new Map();
|
24
|
+
this.useDefaultPublisher();
|
25
|
+
}
|
26
|
+
/**
|
27
|
+
* Returns the publisher.
|
28
|
+
*/
|
29
|
+
get publisher() {
|
30
|
+
return this._publisher;
|
31
|
+
}
|
32
|
+
/**
|
33
|
+
* Sets the publisher.
|
34
|
+
*/
|
35
|
+
set publisher(_publisher) {
|
36
|
+
this._publisher = _publisher;
|
37
|
+
}
|
38
|
+
async execute(command) {
|
39
|
+
const commandName = this.getCommandName(command);
|
40
|
+
const handler = this.handlers.get(commandName);
|
41
|
+
if (!handler) {
|
42
|
+
core_1.logger.error(`Command handler for "${commandName}" not found`);
|
43
|
+
throw new exceptions_1.CommandHandlerNotFoundException(commandName);
|
44
|
+
}
|
45
|
+
this.publishToSubject(command);
|
46
|
+
try {
|
47
|
+
return await handler(command);
|
48
|
+
}
|
49
|
+
catch (error) {
|
50
|
+
core_1.logger.error(`Error executing command "${commandName}":`, String(error));
|
51
|
+
throw error;
|
52
|
+
}
|
53
|
+
}
|
54
|
+
/**
|
55
|
+
* Registers command handlers.
|
56
|
+
*/
|
57
|
+
register(handlers) {
|
58
|
+
handlers.forEach((handler) => this.registerHandler(handler));
|
59
|
+
}
|
60
|
+
registerHandler(handler) {
|
61
|
+
const target = handler;
|
62
|
+
const commandType = Reflect.getMetadata(constants_1.COMMAND_HANDLER_METADATA, target);
|
63
|
+
if (!commandType) {
|
64
|
+
throw new exceptions_1.InvalidCommandHandlerException(`Missing @CommandHandler decorator on ${target.name}`);
|
65
|
+
}
|
66
|
+
const commandName = this.getCommandName(commandType);
|
67
|
+
if (this.handlers.has(commandName)) {
|
68
|
+
core_1.logger.warn(`Command handler for "${commandName}" already registered. Overwriting.`);
|
69
|
+
}
|
70
|
+
// Get handler instance from container
|
71
|
+
const handlerInstance = tsyringe_1.container.resolve(target);
|
72
|
+
this.handlers.set(commandName, (command) => handlerInstance.execute(command));
|
73
|
+
core_1.logger.info(`Registered command handler for "${commandName}"`);
|
74
|
+
}
|
75
|
+
useDefaultPublisher() {
|
76
|
+
this._publisher = new helpers_1.DefaultCommandPubSub();
|
77
|
+
}
|
78
|
+
getCommandName(command) {
|
79
|
+
const { constructor } = Object.getPrototypeOf(command);
|
80
|
+
return constructor.name;
|
81
|
+
}
|
82
|
+
};
|
83
|
+
exports.CommandBus = CommandBus;
|
84
|
+
exports.CommandBus = CommandBus = __decorate([
|
85
|
+
(0, core_1.Injectable)(),
|
86
|
+
__metadata("design:paramtypes", [])
|
87
|
+
], CommandBus);
|
88
|
+
//# sourceMappingURL=command-bus.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"command-bus.js","sourceRoot":"","sources":["../src/command-bus.ts"],"names":[],"mappings":"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"}
|
@@ -0,0 +1,10 @@
|
|
1
|
+
export declare const CQRS_MODULE_OPTIONS: unique symbol;
|
2
|
+
export declare const COMMAND_HANDLER_METADATA: unique symbol;
|
3
|
+
export declare const COMMAND_METADATA: unique symbol;
|
4
|
+
export declare const QUERY_HANDLER_METADATA: unique symbol;
|
5
|
+
export declare const QUERY_METADATA: unique symbol;
|
6
|
+
export declare const EVENT_HANDLER_METADATA: unique symbol;
|
7
|
+
export declare const EVENT_METADATA: unique symbol;
|
8
|
+
export declare const SAGA_METADATA: unique symbol;
|
9
|
+
export declare const RESULT_TYPE_SYMBOL: unique symbol;
|
10
|
+
//# sourceMappingURL=constants.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,mBAAmB,eAAgC,CAAC;AAGjE,eAAO,MAAM,wBAAwB,eAAqC,CAAC;AAC3E,eAAO,MAAM,gBAAgB,eAA6B,CAAC;AAE3D,eAAO,MAAM,sBAAsB,eAAmC,CAAC;AACvE,eAAO,MAAM,cAAc,eAA2B,CAAC;AAEvD,eAAO,MAAM,sBAAsB,eAAmC,CAAC;AACvE,eAAO,MAAM,cAAc,eAA2B,CAAC;AAEvD,eAAO,MAAM,aAAa,eAA0B,CAAC;AAGrD,eAAO,MAAM,kBAAkB,eAA+B,CAAC"}
|
@@ -0,0 +1,16 @@
|
|
1
|
+
"use strict";
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
3
|
+
exports.RESULT_TYPE_SYMBOL = exports.SAGA_METADATA = exports.EVENT_METADATA = exports.EVENT_HANDLER_METADATA = exports.QUERY_METADATA = exports.QUERY_HANDLER_METADATA = exports.COMMAND_METADATA = exports.COMMAND_HANDLER_METADATA = exports.CQRS_MODULE_OPTIONS = void 0;
|
4
|
+
// CQRS Module constants
|
5
|
+
exports.CQRS_MODULE_OPTIONS = Symbol("CQRS_MODULE_OPTIONS");
|
6
|
+
// Metadata keys for decorators
|
7
|
+
exports.COMMAND_HANDLER_METADATA = Symbol("COMMAND_HANDLER_METADATA");
|
8
|
+
exports.COMMAND_METADATA = Symbol("COMMAND_METADATA");
|
9
|
+
exports.QUERY_HANDLER_METADATA = Symbol("QUERY_HANDLER_METADATA");
|
10
|
+
exports.QUERY_METADATA = Symbol("QUERY_METADATA");
|
11
|
+
exports.EVENT_HANDLER_METADATA = Symbol("EVENT_HANDLER_METADATA");
|
12
|
+
exports.EVENT_METADATA = Symbol("EVENT_METADATA");
|
13
|
+
exports.SAGA_METADATA = Symbol("SAGA_METADATA");
|
14
|
+
// Result type symbol for commands and queries
|
15
|
+
exports.RESULT_TYPE_SYMBOL = Symbol("RESULT_TYPE_SYMBOL");
|
16
|
+
//# sourceMappingURL=constants.js.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"constants.js","sourceRoot":"","sources":["../src/constants.ts"],"names":[],"mappings":";;;AAAA,wBAAwB;AACX,QAAA,mBAAmB,GAAG,MAAM,CAAC,qBAAqB,CAAC,CAAC;AAEjE,+BAA+B;AAClB,QAAA,wBAAwB,GAAG,MAAM,CAAC,0BAA0B,CAAC,CAAC;AAC9D,QAAA,gBAAgB,GAAG,MAAM,CAAC,kBAAkB,CAAC,CAAC;AAE9C,QAAA,sBAAsB,GAAG,MAAM,CAAC,wBAAwB,CAAC,CAAC;AAC1D,QAAA,cAAc,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC;AAE1C,QAAA,sBAAsB,GAAG,MAAM,CAAC,wBAAwB,CAAC,CAAC;AAC1D,QAAA,cAAc,GAAG,MAAM,CAAC,gBAAgB,CAAC,CAAC;AAE1C,QAAA,aAAa,GAAG,MAAM,CAAC,eAAe,CAAC,CAAC;AAErD,8CAA8C;AACjC,QAAA,kBAAkB,GAAG,MAAM,CAAC,oBAAoB,CAAC,CAAC"}
|
@@ -0,0 +1,50 @@
|
|
1
|
+
import { CommandBus } from "./command-bus";
|
2
|
+
import { EventBus } from "./event-bus";
|
3
|
+
import { CqrsModuleAsyncOptions, CqrsModuleOptions, IEvent } from "./interfaces";
|
4
|
+
import { QueryBus } from "./query-bus";
|
5
|
+
import { ExplorerService } from "./services";
|
6
|
+
/**
|
7
|
+
* CQRS Module for HestJS
|
8
|
+
* Provides Command Query Responsibility Segregation capabilities
|
9
|
+
*/
|
10
|
+
export declare class CqrsModule<EventBase extends IEvent = IEvent> {
|
11
|
+
private readonly explorerService;
|
12
|
+
private readonly eventBus;
|
13
|
+
private readonly commandBus;
|
14
|
+
private readonly queryBus;
|
15
|
+
private static isInitialized;
|
16
|
+
constructor(explorerService: ExplorerService<EventBase>, eventBus: EventBus<EventBase>, commandBus: CommandBus, queryBus: QueryBus);
|
17
|
+
/**
|
18
|
+
* Configure CQRS module with options
|
19
|
+
*/
|
20
|
+
static forRoot(options?: CqrsModuleOptions): typeof CqrsModule;
|
21
|
+
/**
|
22
|
+
* Configure CQRS module with async options
|
23
|
+
*/
|
24
|
+
static forRootAsync(options: CqrsModuleAsyncOptions): typeof CqrsModule;
|
25
|
+
/**
|
26
|
+
* Initialize the CQRS module and register all handlers
|
27
|
+
*/
|
28
|
+
onApplicationBootstrap(): Promise<void>;
|
29
|
+
/**
|
30
|
+
* Get the command bus instance
|
31
|
+
*/
|
32
|
+
getCommandBus(): CommandBus;
|
33
|
+
/**
|
34
|
+
* Get the query bus instance
|
35
|
+
*/
|
36
|
+
getQueryBus(): QueryBus;
|
37
|
+
/**
|
38
|
+
* Get the event bus instance
|
39
|
+
*/
|
40
|
+
getEventBus(): EventBus<EventBase>;
|
41
|
+
/**
|
42
|
+
* Register a handler manually
|
43
|
+
*/
|
44
|
+
registerHandler(handlerClass: Function): void;
|
45
|
+
/**
|
46
|
+
* Get a singleton instance of the CQRS module
|
47
|
+
*/
|
48
|
+
static getInstance<EventBase extends IEvent = IEvent>(): CqrsModule<EventBase>;
|
49
|
+
}
|
50
|
+
//# sourceMappingURL=cqrs.module.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"cqrs.module.d.ts","sourceRoot":"","sources":["../src/cqrs.module.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EACL,sBAAsB,EACtB,iBAAiB,EAEjB,MAAM,EACP,MAAM,cAAc,CAAC;AACtB,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,YAAY,CAAC;AAE7C;;;GAGG;AACH,qBACa,UAAU,CAAC,SAAS,SAAS,MAAM,GAAG,MAAM;IAIrD,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAN3B,OAAO,CAAC,MAAM,CAAC,aAAa,CAAS;gBAGlB,eAAe,EAAE,eAAe,CAAC,SAAS,CAAC,EAC3C,QAAQ,EAAE,QAAQ,CAAC,SAAS,CAAC,EAC7B,UAAU,EAAE,UAAU,EACtB,QAAQ,EAAE,QAAQ;IAGrC;;OAEG;IACH,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,iBAAiB,GAAG,OAAO,UAAU;IAuB9D;;OAEG;IACH,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,sBAAsB,GAAG,OAAO,UAAU;IAwCvE;;OAEG;IACG,sBAAsB,IAAI,OAAO,CAAC,IAAI,CAAC;IAY7C;;OAEG;IACH,aAAa,IAAI,UAAU;IAI3B;;OAEG;IACH,WAAW,IAAI,QAAQ;IAIvB;;OAEG;IACH,WAAW,IAAI,QAAQ,CAAC,SAAS,CAAC;IAIlC;;OAEG;IACH,eAAe,CAAC,YAAY,EAAE,QAAQ,GAAG,IAAI;IAI7C;;OAEG;IACH,MAAM,CAAC,WAAW,CAChB,SAAS,SAAS,MAAM,GAAG,MAAM,KAC9B,UAAU,CAAC,SAAS,CAAC;CAoB3B"}
|