@prodforcode/event-forge-nestjs 1.0.1 → 1.0.3
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 +231 -0
- package/dist/eventforge-lifecycle.service.d.ts +9 -0
- package/dist/eventforge-lifecycle.service.d.ts.map +1 -0
- package/dist/eventforge-lifecycle.service.js +37 -0
- package/dist/eventforge-lifecycle.service.js.map +1 -0
- package/dist/inbox-outbox.interfaces.d.ts +4 -0
- package/dist/inbox-outbox.interfaces.d.ts.map +1 -1
- package/dist/inbox-outbox.module.d.ts +1 -0
- package/dist/inbox-outbox.module.d.ts.map +1 -1
- package/dist/inbox-outbox.module.js +35 -3
- package/dist/inbox-outbox.module.js.map +1 -1
- package/dist/index.d.ts +1 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/package.json +3 -2
package/README.md
ADDED
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
# @prodforcode/event-forge-nestjs
|
|
2
|
+
|
|
3
|
+
NestJS module for the Universal Inbox-Outbox Pattern with automatic lifecycle management.
|
|
4
|
+
|
|
5
|
+
## Installation
|
|
6
|
+
|
|
7
|
+
```bash
|
|
8
|
+
npm install @prodforcode/event-forge-nestjs @prodforcode/event-forge-core
|
|
9
|
+
# or
|
|
10
|
+
pnpm add @prodforcode/event-forge-nestjs @prodforcode/event-forge-core
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
## Features
|
|
14
|
+
|
|
15
|
+
- **Automatic Polling Management**: Outbox polling starts automatically on application bootstrap and stops gracefully on shutdown
|
|
16
|
+
- **Configurable Lifecycle**: Control automatic polling behavior via `lifecycle.autoStart` option
|
|
17
|
+
- **Dependency Injection**: Full NestJS DI support for repositories and services
|
|
18
|
+
- **Database Agnostic**: Works with any database adapter (TypeORM, Mongoose, etc.)
|
|
19
|
+
|
|
20
|
+
## Quick Start
|
|
21
|
+
|
|
22
|
+
### With Automatic Lifecycle (Default)
|
|
23
|
+
|
|
24
|
+
The simplest setup automatically manages polling lifecycle:
|
|
25
|
+
|
|
26
|
+
```typescript
|
|
27
|
+
import { Module } from '@nestjs/common';
|
|
28
|
+
import { InboxOutboxModule } from '@prodforcode/event-forge-nestjs';
|
|
29
|
+
import { TypeOrmOutboxRepository } from '@prodforcode/event-forge-typeorm';
|
|
30
|
+
import { RabbitMQPublisher } from '@prodforcode/event-forge-rabbitmq';
|
|
31
|
+
|
|
32
|
+
@Module({
|
|
33
|
+
imports: [
|
|
34
|
+
InboxOutboxModule.forRootAsync({
|
|
35
|
+
useFactory: () => ({
|
|
36
|
+
outbox: {
|
|
37
|
+
repository: TypeOrmOutboxRepository,
|
|
38
|
+
config: {
|
|
39
|
+
pollingIntervalMs: 1000,
|
|
40
|
+
batchSize: 50,
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
publisher: RabbitMQPublisher,
|
|
44
|
+
// lifecycle.autoStart defaults to true - polling starts automatically
|
|
45
|
+
}),
|
|
46
|
+
}),
|
|
47
|
+
],
|
|
48
|
+
})
|
|
49
|
+
export class AppModule {}
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
With this configuration:
|
|
53
|
+
- Outbox polling **starts automatically** when the application boots
|
|
54
|
+
- Polling **stops gracefully** when the application shuts down
|
|
55
|
+
- No manual lifecycle management required
|
|
56
|
+
|
|
57
|
+
### With Manual Lifecycle Control
|
|
58
|
+
|
|
59
|
+
If you need custom startup logic, disable automatic lifecycle:
|
|
60
|
+
|
|
61
|
+
```typescript
|
|
62
|
+
@Module({
|
|
63
|
+
imports: [
|
|
64
|
+
InboxOutboxModule.forRootAsync({
|
|
65
|
+
useFactory: () => ({
|
|
66
|
+
outbox: {
|
|
67
|
+
repository: TypeOrmOutboxRepository,
|
|
68
|
+
},
|
|
69
|
+
publisher: RabbitMQPublisher,
|
|
70
|
+
lifecycle: {
|
|
71
|
+
autoStart: false, // Disable automatic polling
|
|
72
|
+
},
|
|
73
|
+
}),
|
|
74
|
+
}),
|
|
75
|
+
],
|
|
76
|
+
})
|
|
77
|
+
export class AppModule {
|
|
78
|
+
constructor(private readonly outboxService: OutboxService) {}
|
|
79
|
+
|
|
80
|
+
onApplicationBootstrap() {
|
|
81
|
+
// Custom startup logic here
|
|
82
|
+
console.log('Running custom initialization...');
|
|
83
|
+
|
|
84
|
+
// Manually start polling when ready
|
|
85
|
+
this.outboxService.startPolling();
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
onApplicationShutdown() {
|
|
89
|
+
// Custom shutdown logic
|
|
90
|
+
this.outboxService.stopPolling();
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
## Configuration
|
|
96
|
+
|
|
97
|
+
### Lifecycle Options
|
|
98
|
+
|
|
99
|
+
```typescript
|
|
100
|
+
interface LifecycleOptions {
|
|
101
|
+
/**
|
|
102
|
+
* Whether to automatically start outbox polling on application bootstrap
|
|
103
|
+
* @default true
|
|
104
|
+
*/
|
|
105
|
+
autoStart?: boolean;
|
|
106
|
+
}
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
### Module Options
|
|
110
|
+
|
|
111
|
+
```typescript
|
|
112
|
+
InboxOutboxModule.forRootAsync({
|
|
113
|
+
useFactory: () => ({
|
|
114
|
+
outbox: {
|
|
115
|
+
repository: OutboxRepositoryClass,
|
|
116
|
+
config: {
|
|
117
|
+
pollingIntervalMs: 1000,
|
|
118
|
+
batchSize: 50,
|
|
119
|
+
maxRetries: 5,
|
|
120
|
+
},
|
|
121
|
+
},
|
|
122
|
+
inbox: {
|
|
123
|
+
repository: InboxRepositoryClass,
|
|
124
|
+
},
|
|
125
|
+
publisher: PublisherClass,
|
|
126
|
+
lifecycle: {
|
|
127
|
+
autoStart: true, // Default behavior
|
|
128
|
+
},
|
|
129
|
+
}),
|
|
130
|
+
});
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
## Advanced Usage
|
|
134
|
+
|
|
135
|
+
### Accessing the Lifecycle Service
|
|
136
|
+
|
|
137
|
+
The `EventForgeLifecycleService` is exported and can be injected for advanced control:
|
|
138
|
+
|
|
139
|
+
```typescript
|
|
140
|
+
import { Injectable } from '@nestjs/common';
|
|
141
|
+
import { EventForgeLifecycleService } from '@prodforcode/event-forge-nestjs';
|
|
142
|
+
|
|
143
|
+
@Injectable()
|
|
144
|
+
export class CustomService {
|
|
145
|
+
constructor(
|
|
146
|
+
private readonly lifecycleService: EventForgeLifecycleService,
|
|
147
|
+
) {}
|
|
148
|
+
|
|
149
|
+
// The lifecycle service handles start/stop automatically
|
|
150
|
+
// You typically don't need to interact with it directly
|
|
151
|
+
}
|
|
152
|
+
```
|
|
153
|
+
|
|
154
|
+
### Health Checks
|
|
155
|
+
|
|
156
|
+
Integrate with NestJS health checks:
|
|
157
|
+
|
|
158
|
+
```typescript
|
|
159
|
+
import { Injectable } from '@nestjs/common';
|
|
160
|
+
import { HealthIndicator, HealthIndicatorResult } from '@nestjs/terminus';
|
|
161
|
+
import { OutboxService } from '@prodforcode/event-forge-core';
|
|
162
|
+
|
|
163
|
+
@Injectable()
|
|
164
|
+
export class OutboxHealthIndicator extends HealthIndicator {
|
|
165
|
+
constructor(private readonly outboxService: OutboxService) {
|
|
166
|
+
super();
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
async isHealthy(key: string): Promise<HealthIndicatorResult> {
|
|
170
|
+
// Check if polling is active
|
|
171
|
+
const isPolling = this.outboxService.isPolling();
|
|
172
|
+
|
|
173
|
+
return this.getStatus(key, isPolling, {
|
|
174
|
+
polling: isPolling,
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
## Migration from Manual Lifecycle
|
|
181
|
+
|
|
182
|
+
If you're migrating from manual lifecycle management:
|
|
183
|
+
|
|
184
|
+
**Before** (manual):
|
|
185
|
+
```typescript
|
|
186
|
+
@Module({
|
|
187
|
+
imports: [InboxOutboxModule.forRootAsync({...})],
|
|
188
|
+
})
|
|
189
|
+
export class AppModule {
|
|
190
|
+
constructor(private readonly outboxService: OutboxService) {}
|
|
191
|
+
|
|
192
|
+
onApplicationBootstrap() {
|
|
193
|
+
this.outboxService.startPolling(); // Manual start
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
onApplicationShutdown() {
|
|
197
|
+
this.outboxService.stopPolling(); // Manual stop
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
**After** (automatic):
|
|
203
|
+
```typescript
|
|
204
|
+
@Module({
|
|
205
|
+
imports: [
|
|
206
|
+
InboxOutboxModule.forRootAsync({
|
|
207
|
+
// ... config ...
|
|
208
|
+
// lifecycle.autoStart: true is the default
|
|
209
|
+
}),
|
|
210
|
+
],
|
|
211
|
+
})
|
|
212
|
+
export class AppModule {
|
|
213
|
+
// No lifecycle hooks needed!
|
|
214
|
+
}
|
|
215
|
+
```
|
|
216
|
+
|
|
217
|
+
## API Reference
|
|
218
|
+
|
|
219
|
+
### EventForgeLifecycleService
|
|
220
|
+
|
|
221
|
+
Implements NestJS lifecycle hooks to automatically manage outbox polling.
|
|
222
|
+
|
|
223
|
+
**Methods:**
|
|
224
|
+
- `onApplicationBootstrap()`: Starts outbox polling automatically
|
|
225
|
+
- `onApplicationShutdown()`: Stops outbox polling gracefully
|
|
226
|
+
|
|
227
|
+
**Note**: This service is automatically provided when `lifecycle.autoStart` is not `false` and an outbox configuration exists.
|
|
228
|
+
|
|
229
|
+
## License
|
|
230
|
+
|
|
231
|
+
MIT
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { OnApplicationBootstrap, OnApplicationShutdown } from '@nestjs/common';
|
|
2
|
+
import { OutboxService } from '@prodforcode/event-forge-core';
|
|
3
|
+
export declare class EventForgeLifecycleService implements OnApplicationBootstrap, OnApplicationShutdown {
|
|
4
|
+
private readonly outboxService;
|
|
5
|
+
constructor(outboxService: OutboxService);
|
|
6
|
+
onApplicationBootstrap(): void;
|
|
7
|
+
onApplicationShutdown(): void;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=eventforge-lifecycle.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eventforge-lifecycle.service.d.ts","sourceRoot":"","sources":["../src/eventforge-lifecycle.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAsB,sBAAsB,EAAE,qBAAqB,EAAE,MAAM,gBAAgB,CAAC;AACnG,OAAO,EAAE,aAAa,EAAE,MAAM,+BAA+B,CAAC;AAQ9D,qBACa,0BAA2B,YAAW,sBAAsB,EAAE,qBAAqB;IAEpE,OAAO,CAAC,QAAQ,CAAC,aAAa;gBAAb,aAAa,EAAE,aAAa;IAMvE,sBAAsB,IAAI,IAAI;IAO9B,qBAAqB,IAAI,IAAI;CAG9B"}
|
|
@@ -0,0 +1,37 @@
|
|
|
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
|
+
var __param = (this && this.__param) || function (paramIndex, decorator) {
|
|
12
|
+
return function (target, key) { decorator(target, key, paramIndex); }
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.EventForgeLifecycleService = void 0;
|
|
16
|
+
const common_1 = require("@nestjs/common");
|
|
17
|
+
const event_forge_core_1 = require("@prodforcode/event-forge-core");
|
|
18
|
+
const inbox_outbox_constants_1 = require("./inbox-outbox.constants");
|
|
19
|
+
let EventForgeLifecycleService = class EventForgeLifecycleService {
|
|
20
|
+
outboxService;
|
|
21
|
+
constructor(outboxService) {
|
|
22
|
+
this.outboxService = outboxService;
|
|
23
|
+
}
|
|
24
|
+
onApplicationBootstrap() {
|
|
25
|
+
this.outboxService.startPolling();
|
|
26
|
+
}
|
|
27
|
+
onApplicationShutdown() {
|
|
28
|
+
this.outboxService.stopPolling();
|
|
29
|
+
}
|
|
30
|
+
};
|
|
31
|
+
exports.EventForgeLifecycleService = EventForgeLifecycleService;
|
|
32
|
+
exports.EventForgeLifecycleService = EventForgeLifecycleService = __decorate([
|
|
33
|
+
(0, common_1.Injectable)(),
|
|
34
|
+
__param(0, (0, common_1.Inject)(inbox_outbox_constants_1.OUTBOX_SERVICE)),
|
|
35
|
+
__metadata("design:paramtypes", [event_forge_core_1.OutboxService])
|
|
36
|
+
], EventForgeLifecycleService);
|
|
37
|
+
//# sourceMappingURL=eventforge-lifecycle.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"eventforge-lifecycle.service.js","sourceRoot":"","sources":["../src/eventforge-lifecycle.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AAAA,2CAAmG;AACnG,oEAA8D;AAE9D,qEAA0D;AAOnD,IAAM,0BAA0B,GAAhC,MAAM,0BAA0B;IAEM;IAD3C,YAC2C,aAA4B;QAA5B,kBAAa,GAAb,aAAa,CAAe;IACpE,CAAC;IAKJ,sBAAsB;QACpB,IAAI,CAAC,aAAa,CAAC,YAAY,EAAE,CAAC;IACpC,CAAC;IAKD,qBAAqB;QACnB,IAAI,CAAC,aAAa,CAAC,WAAW,EAAE,CAAC;IACnC,CAAC;CACF,CAAA;AAlBY,gEAA0B;qCAA1B,0BAA0B;IADtC,IAAA,mBAAU,GAAE;IAGR,WAAA,IAAA,eAAM,EAAC,uCAAc,CAAC,CAAA;qCAAiC,gCAAa;GAF5D,0BAA0B,CAkBtC"}
|
|
@@ -1,5 +1,8 @@
|
|
|
1
1
|
import { InjectionToken, ModuleMetadata, OptionalFactoryDependency, Type } from '@nestjs/common';
|
|
2
2
|
import { IOutboxRepository, IInboxRepository, IMessagePublisher, OutboxConfig, InboxConfig } from '@prodforcode/event-forge-core';
|
|
3
|
+
export interface LifecycleOptions {
|
|
4
|
+
autoStart?: boolean;
|
|
5
|
+
}
|
|
3
6
|
export interface InboxOutboxModuleOptions {
|
|
4
7
|
outbox?: {
|
|
5
8
|
repository: Type<IOutboxRepository> | IOutboxRepository;
|
|
@@ -10,6 +13,7 @@ export interface InboxOutboxModuleOptions {
|
|
|
10
13
|
config?: Partial<InboxConfig>;
|
|
11
14
|
};
|
|
12
15
|
publisher?: Type<IMessagePublisher> | IMessagePublisher;
|
|
16
|
+
lifecycle?: LifecycleOptions;
|
|
13
17
|
}
|
|
14
18
|
export interface InboxOutboxModuleOptionsFactory {
|
|
15
19
|
createInboxOutboxOptions(): Promise<InboxOutboxModuleOptions> | InboxOutboxModuleOptions;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inbox-outbox.interfaces.d.ts","sourceRoot":"","sources":["../src/inbox-outbox.interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,yBAAyB,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACjG,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACZ,WAAW,EACZ,MAAM,+BAA+B,CAAC;AAKvC,MAAM,WAAW,wBAAwB;IACvC,MAAM,CAAC,EAAE;QACP,UAAU,EAAE,IAAI,CAAC,iBAAiB,CAAC,GAAG,iBAAiB,CAAC;QACxD,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;KAChC,CAAC;IACF,KAAK,CAAC,EAAE;QACN,UAAU,EAAE,IAAI,CAAC,gBAAgB,CAAC,GAAG,gBAAgB,CAAC;QACtD,MAAM,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;KAC/B,CAAC;IACF,SAAS,CAAC,EAAE,IAAI,CAAC,iBAAiB,CAAC,GAAG,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"inbox-outbox.interfaces.d.ts","sourceRoot":"","sources":["../src/inbox-outbox.interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,yBAAyB,EAAE,IAAI,EAAE,MAAM,gBAAgB,CAAC;AACjG,OAAO,EACL,iBAAiB,EACjB,gBAAgB,EAChB,iBAAiB,EACjB,YAAY,EACZ,WAAW,EACZ,MAAM,+BAA+B,CAAC;AAKvC,MAAM,WAAW,gBAAgB;IAK/B,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAKD,MAAM,WAAW,wBAAwB;IACvC,MAAM,CAAC,EAAE;QACP,UAAU,EAAE,IAAI,CAAC,iBAAiB,CAAC,GAAG,iBAAiB,CAAC;QACxD,MAAM,CAAC,EAAE,OAAO,CAAC,YAAY,CAAC,CAAC;KAChC,CAAC;IACF,KAAK,CAAC,EAAE;QACN,UAAU,EAAE,IAAI,CAAC,gBAAgB,CAAC,GAAG,gBAAgB,CAAC;QACtD,MAAM,CAAC,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;KAC/B,CAAC;IACF,SAAS,CAAC,EAAE,IAAI,CAAC,iBAAiB,CAAC,GAAG,iBAAiB,CAAC;IACxD,SAAS,CAAC,EAAE,gBAAgB,CAAC;CAC9B;AAKD,MAAM,WAAW,+BAA+B;IAC9C,wBAAwB,IAAI,OAAO,CAAC,wBAAwB,CAAC,GAAG,wBAAwB,CAAC;CAC1F;AAKD,MAAM,WAAW,6BAA8B,SAAQ,IAAI,CAAC,cAAc,EAAE,SAAS,CAAC;IACpF,WAAW,CAAC,EAAE,IAAI,CAAC,+BAA+B,CAAC,CAAC;IACpD,QAAQ,CAAC,EAAE,IAAI,CAAC,+BAA+B,CAAC,CAAC;IACjD,UAAU,CAAC,EAAE,CACX,GAAG,IAAI,EAAE,OAAO,EAAE,KACf,OAAO,CAAC,wBAAwB,CAAC,GAAG,wBAAwB,CAAC;IAClE,MAAM,CAAC,EAAE,CAAC,cAAc,GAAG,yBAAyB,CAAC,EAAE,CAAC;CACzD"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inbox-outbox.module.d.ts","sourceRoot":"","sources":["../src/inbox-outbox.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAA0B,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"inbox-outbox.module.d.ts","sourceRoot":"","sources":["../src/inbox-outbox.module.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAA0B,MAAM,gBAAgB,CAAC;AAkBvE,OAAO,EACL,wBAAwB,EACxB,6BAA6B,EAE9B,MAAM,2BAA2B,CAAC;AAMnC,qBACa,iBAAiB;IAI5B,MAAM,CAAC,OAAO,CAAC,OAAO,EAAE,wBAAwB,GAAG,aAAa;IA0BhE,MAAM,CAAC,YAAY,CAAC,OAAO,EAAE,6BAA6B,GAAG,aAAa;IA2B1E,OAAO,CAAC,MAAM,CAAC,eAAe;IAqF9B,OAAO,CAAC,MAAM,CAAC,oBAAoB;IAqBnC,OAAO,CAAC,MAAM,CAAC,0BAA0B;IAmCzC,OAAO,CAAC,MAAM,CAAC,sBAAsB;IAgFrC,OAAO,CAAC,MAAM,CAAC,MAAM;IAOrB,OAAO,CAAC,MAAM,CAAC,uBAAuB;CAkBvC"}
|
|
@@ -10,27 +10,47 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
10
10
|
exports.InboxOutboxModule = void 0;
|
|
11
11
|
const common_1 = require("@nestjs/common");
|
|
12
12
|
const event_forge_core_1 = require("@prodforcode/event-forge-core");
|
|
13
|
+
const eventforge_lifecycle_service_1 = require("./eventforge-lifecycle.service");
|
|
13
14
|
const inbox_outbox_constants_1 = require("./inbox-outbox.constants");
|
|
14
15
|
let InboxOutboxModule = InboxOutboxModule_1 = class InboxOutboxModule {
|
|
15
16
|
static forRoot(options) {
|
|
16
17
|
const providers = this.createProviders(options);
|
|
18
|
+
const exports = [
|
|
19
|
+
inbox_outbox_constants_1.OUTBOX_SERVICE,
|
|
20
|
+
inbox_outbox_constants_1.INBOX_SERVICE,
|
|
21
|
+
inbox_outbox_constants_1.OUTBOX_REPOSITORY,
|
|
22
|
+
inbox_outbox_constants_1.INBOX_REPOSITORY,
|
|
23
|
+
];
|
|
24
|
+
if (options.lifecycle?.autoStart !== false && options.outbox) {
|
|
25
|
+
providers.push(eventforge_lifecycle_service_1.EventForgeLifecycleService);
|
|
26
|
+
exports.push(eventforge_lifecycle_service_1.EventForgeLifecycleService);
|
|
27
|
+
}
|
|
17
28
|
return {
|
|
18
29
|
module: InboxOutboxModule_1,
|
|
19
30
|
providers,
|
|
20
|
-
exports
|
|
31
|
+
exports,
|
|
21
32
|
global: true,
|
|
22
33
|
};
|
|
23
34
|
}
|
|
24
35
|
static forRootAsync(options) {
|
|
25
36
|
const asyncProviders = this.createAsyncProviders(options);
|
|
37
|
+
const dynamicProviders = this.createDynamicProviders();
|
|
38
|
+
const lifecycleProvider = this.createLifecycleProvider();
|
|
26
39
|
return {
|
|
27
40
|
module: InboxOutboxModule_1,
|
|
28
41
|
imports: options.imports || [],
|
|
29
42
|
providers: [
|
|
30
43
|
...asyncProviders,
|
|
31
|
-
...
|
|
44
|
+
...dynamicProviders,
|
|
45
|
+
lifecycleProvider,
|
|
46
|
+
],
|
|
47
|
+
exports: [
|
|
48
|
+
inbox_outbox_constants_1.OUTBOX_SERVICE,
|
|
49
|
+
inbox_outbox_constants_1.INBOX_SERVICE,
|
|
50
|
+
inbox_outbox_constants_1.OUTBOX_REPOSITORY,
|
|
51
|
+
inbox_outbox_constants_1.INBOX_REPOSITORY,
|
|
52
|
+
eventforge_lifecycle_service_1.EventForgeLifecycleService,
|
|
32
53
|
],
|
|
33
|
-
exports: [inbox_outbox_constants_1.OUTBOX_SERVICE, inbox_outbox_constants_1.INBOX_SERVICE, inbox_outbox_constants_1.OUTBOX_REPOSITORY, inbox_outbox_constants_1.INBOX_REPOSITORY],
|
|
34
54
|
global: true,
|
|
35
55
|
};
|
|
36
56
|
}
|
|
@@ -210,6 +230,18 @@ let InboxOutboxModule = InboxOutboxModule_1 = class InboxOutboxModule {
|
|
|
210
230
|
static isType(value) {
|
|
211
231
|
return typeof value === 'function';
|
|
212
232
|
}
|
|
233
|
+
static createLifecycleProvider() {
|
|
234
|
+
return {
|
|
235
|
+
provide: eventforge_lifecycle_service_1.EventForgeLifecycleService,
|
|
236
|
+
useFactory: (outboxService, options) => {
|
|
237
|
+
if (!outboxService || options.lifecycle?.autoStart === false) {
|
|
238
|
+
return null;
|
|
239
|
+
}
|
|
240
|
+
return new eventforge_lifecycle_service_1.EventForgeLifecycleService(outboxService);
|
|
241
|
+
},
|
|
242
|
+
inject: [inbox_outbox_constants_1.OUTBOX_SERVICE, inbox_outbox_constants_1.INBOX_OUTBOX_OPTIONS],
|
|
243
|
+
};
|
|
244
|
+
}
|
|
213
245
|
};
|
|
214
246
|
exports.InboxOutboxModule = InboxOutboxModule;
|
|
215
247
|
exports.InboxOutboxModule = InboxOutboxModule = InboxOutboxModule_1 = __decorate([
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"inbox-outbox.module.js","sourceRoot":"","sources":["../src/inbox-outbox.module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAAuE;AACvE,oEAMuC;AAEvC,qEAOkC;AAY3B,IAAM,iBAAiB,yBAAvB,MAAM,iBAAiB;IAI5B,MAAM,CAAC,OAAO,CAAC,OAAiC;QAC9C,MAAM,SAAS,GAAG,IAAI,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"inbox-outbox.module.js","sourceRoot":"","sources":["../src/inbox-outbox.module.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,uBAAuB,CAAC;AACtC,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC;AACzC,cAAc,gCAAgC,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -17,4 +17,5 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
17
17
|
__exportStar(require("./inbox-outbox.module"), exports);
|
|
18
18
|
__exportStar(require("./inbox-outbox.interfaces"), exports);
|
|
19
19
|
__exportStar(require("./inbox-outbox.constants"), exports);
|
|
20
|
+
__exportStar(require("./eventforge-lifecycle.service"), exports);
|
|
20
21
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,wDAAsC;AACtC,4DAA0C;AAC1C,2DAAyC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,wDAAsC;AACtC,4DAA0C;AAC1C,2DAAyC;AACzC,iEAA+C"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prodforcode/event-forge-nestjs",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.3",
|
|
4
4
|
"description": "NestJS module for Universal Inbox-Outbox Pattern",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -17,10 +17,11 @@
|
|
|
17
17
|
"author": "Event-Forge",
|
|
18
18
|
"license": "MIT",
|
|
19
19
|
"dependencies": {
|
|
20
|
-
"@prodforcode/event-forge-core": "1.0.
|
|
20
|
+
"@prodforcode/event-forge-core": "1.0.3"
|
|
21
21
|
},
|
|
22
22
|
"devDependencies": {
|
|
23
23
|
"@nestjs/common": "^10.0.0",
|
|
24
|
+
"@nestjs/testing": "^10.0.0",
|
|
24
25
|
"@types/jest": "^29.5.11",
|
|
25
26
|
"@types/node": "^20.10.0",
|
|
26
27
|
"jest": "^29.7.0",
|