@globalart/nestjs-typeorm-outbox 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/dist/index.cjs CHANGED
@@ -1,10 +1,11 @@
1
1
  let _nestjs_common = require("@nestjs/common");
2
- let _nestjs_schedule = require("@nestjs/schedule");
3
2
  let _globalart_text_utils = require("@globalart/text-utils");
4
3
  let typeorm = require("typeorm");
5
4
  let _nestjs_typeorm = require("@nestjs/typeorm");
6
5
  let rxjs = require("rxjs");
7
6
  let _nestjs_microservices = require("@nestjs/microservices");
7
+ let cron = require("cron");
8
+ let _nestjs_schedule = require("@nestjs/schedule");
8
9
 
9
10
  //#region src/core/typeorm-outbox.di-tokens.ts
10
11
  const TYPEORM_OUTBOX_CRON_CONFIG_TOKEN = Symbol("TYPEORM_OUTBOX_CRON_CONFIG_TOKEN");
@@ -33,7 +34,7 @@ function __decorate(decorators, target, key, desc) {
33
34
 
34
35
  //#endregion
35
36
  //#region src/core/typeorm-outbox.entity.ts
36
- var _ref$2, _ref2$1, _ref3$1, _ref4, _ref5;
37
+ var _ref$2, _ref2$1, _ref3$1, _ref4$1, _ref5;
37
38
  let TypeormOutboxEntity = class TypeormOutboxEntity {
38
39
  id;
39
40
  createdAt;
@@ -48,10 +49,21 @@ __decorate([(0, typeorm.CreateDateColumn)({ name: "created_at" }), __decorateMet
48
49
  __decorate([(0, typeorm.UpdateDateColumn)({ name: "updated_at" }), __decorateMetadata("design:type", typeof (_ref2$1 = typeof Date !== "undefined" && Date) === "function" ? _ref2$1 : Object)], TypeormOutboxEntity.prototype, "updatedAt", void 0);
49
50
  __decorate([(0, typeorm.Column)("character varying", { name: "destination_topic" }), __decorateMetadata("design:type", String)], TypeormOutboxEntity.prototype, "destinationTopic", void 0);
50
51
  __decorate([(0, typeorm.Column)("jsonb", { nullable: true }), __decorateMetadata("design:type", typeof (_ref3$1 = typeof Record !== "undefined" && Record) === "function" ? _ref3$1 : Object)], TypeormOutboxEntity.prototype, "headers", void 0);
51
- __decorate([(0, typeorm.Column)("jsonb", { nullable: true }), __decorateMetadata("design:type", typeof (_ref4 = typeof Record !== "undefined" && Record) === "function" ? _ref4 : Object)], TypeormOutboxEntity.prototype, "keys", void 0);
52
+ __decorate([(0, typeorm.Column)("jsonb", { nullable: true }), __decorateMetadata("design:type", typeof (_ref4$1 = typeof Record !== "undefined" && Record) === "function" ? _ref4$1 : Object)], TypeormOutboxEntity.prototype, "keys", void 0);
52
53
  __decorate([(0, typeorm.Column)("jsonb"), __decorateMetadata("design:type", typeof (_ref5 = typeof Record !== "undefined" && Record) === "function" ? _ref5 : Object)], TypeormOutboxEntity.prototype, "payload", void 0);
53
54
  TypeormOutboxEntity = __decorate([(0, typeorm.Entity)("outbox")], TypeormOutboxEntity);
54
55
 
56
+ //#endregion
57
+ //#region src/core/typeorm-outbox.interfaces.ts
58
+ var TypeormOutboxRegisterCronModuleOptions = class {
59
+ typeOrmConnectionName = "default";
60
+ kafkaConfig = {};
61
+ cronExpression = _nestjs_schedule.CronExpression.EVERY_10_SECONDS;
62
+ };
63
+ var TypeormOutboxModuleOptions = class {
64
+ typeOrmConnectionName = "default";
65
+ };
66
+
55
67
  //#endregion
56
68
  //#region \0@oxc-project+runtime@0.108.0/helpers/decorateParam.js
57
69
  function __decorateParam(paramIndex, decorator) {
@@ -61,16 +73,19 @@ function __decorateParam(paramIndex, decorator) {
61
73
  }
62
74
 
63
75
  //#endregion
64
- //#region src/core/typeorm-outbox.controller.ts
65
- var _ref$1, _ref2, _ref3;
66
- let TypeormOutboxController = class TypeormOutboxController {
67
- constructor(entityManager, outboxRepository, brokerClient) {
76
+ //#region src/core/typeorm-outbox-cron.service.ts
77
+ var _ref$1, _ref2, _ref3, _ref4;
78
+ let TypeormOutboxCronService = class TypeormOutboxCronService {
79
+ constructor(entityManager, outboxRepository, brokerClient, moduleConfig) {
68
80
  this.entityManager = entityManager;
69
81
  this.outboxRepository = outboxRepository;
70
82
  this.brokerClient = brokerClient;
83
+ this.moduleConfig = moduleConfig;
71
84
  }
72
- async handleOutboxCron() {
73
- await this.executeCronJob();
85
+ onModuleInit() {
86
+ new cron.CronJob(this.moduleConfig.cronExpression ?? _nestjs_schedule.CronExpression.EVERY_10_SECONDS, () => {
87
+ this.executeCronJob();
88
+ }).start();
74
89
  }
75
90
  async executeCronJob() {
76
91
  const lockId = (0, _globalart_text_utils.hashStringToInt)("typeorm-outbox-cron-job");
@@ -87,37 +102,18 @@ let TypeormOutboxController = class TypeormOutboxController {
87
102
  }
88
103
  }
89
104
  };
90
- __decorate([
91
- (0, _nestjs_schedule.Cron)(_nestjs_schedule.CronExpression.EVERY_10_SECONDS),
92
- __decorateMetadata("design:type", Function),
93
- __decorateMetadata("design:paramtypes", []),
94
- __decorateMetadata("design:returntype", Promise)
95
- ], TypeormOutboxController.prototype, "handleOutboxCron", null);
96
- TypeormOutboxController = __decorate([
97
- (0, _nestjs_common.Controller)(),
105
+ TypeormOutboxCronService = __decorate([
106
+ (0, _nestjs_common.Injectable)(),
98
107
  __decorateParam(1, (0, _nestjs_typeorm.InjectRepository)(TypeormOutboxEntity)),
99
108
  __decorateParam(2, InjectTypeormOutboxBroker()),
109
+ __decorateParam(3, InjectTypeormOutboxCronConfig()),
100
110
  __decorateMetadata("design:paramtypes", [
101
111
  typeof (_ref$1 = typeof typeorm.EntityManager !== "undefined" && typeorm.EntityManager) === "function" ? _ref$1 : Object,
102
112
  typeof (_ref2 = typeof typeorm.Repository !== "undefined" && typeorm.Repository) === "function" ? _ref2 : Object,
103
- typeof (_ref3 = typeof _nestjs_microservices.ClientProxy !== "undefined" && _nestjs_microservices.ClientProxy) === "function" ? _ref3 : Object
113
+ typeof (_ref3 = typeof _nestjs_microservices.ClientProxy !== "undefined" && _nestjs_microservices.ClientProxy) === "function" ? _ref3 : Object,
114
+ typeof (_ref4 = typeof TypeormOutboxRegisterCronModuleOptions !== "undefined" && TypeormOutboxRegisterCronModuleOptions) === "function" ? _ref4 : Object
104
115
  ])
105
- ], TypeormOutboxController);
106
-
107
- //#endregion
108
- //#region src/core/typeorm-outbox.interfaces.ts
109
- var TypeormOutboxRegisterCronModuleOptions = class {
110
- typeOrmConnectionName = "default";
111
- kafkaConfig = {};
112
- };
113
- var TypeormOutboxModuleOptions = class {
114
- typeOrmConnectionName = "default";
115
- };
116
- var TypeormOutboxModuleAsyncOptions = class {
117
- imports = [];
118
- inject = [];
119
- useFactory;
120
- };
116
+ ], TypeormOutboxCronService);
121
117
 
122
118
  //#endregion
123
119
  //#region src/core/typeorm-outbox.service.ts
@@ -145,22 +141,78 @@ TypeormOutboxService = __decorate([
145
141
  //#region src/core/typeorm-outbox.module.ts
146
142
  var _TypeormOutboxModule;
147
143
  let TypeormOutboxModule = _TypeormOutboxModule = class TypeormOutboxModule {
148
- static forRoot(options = {}) {
149
- const configProvider = {
150
- provide: TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN,
151
- useValue: options
152
- };
153
- const serviceProvider = {
144
+ static createServiceProvider() {
145
+ return {
154
146
  provide: TYPEORM_OUTBOX_SERVICE_TOKEN,
155
147
  useClass: TypeormOutboxService
156
148
  };
157
- const brokerProvider = {
149
+ }
150
+ static createBrokerProvider(useValue = null) {
151
+ return {
158
152
  provide: TYPEORM_OUTBOX_BROKER_TOKEN,
159
- useValue: null
153
+ useValue
154
+ };
155
+ }
156
+ static createTypeOrmFeature(connectionName) {
157
+ return _nestjs_typeorm.TypeOrmModule.forFeature([TypeormOutboxEntity], connectionName || "default");
158
+ }
159
+ static createModuleConfigProvider(options) {
160
+ return {
161
+ provide: TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN,
162
+ useValue: {
163
+ ...new TypeormOutboxModuleOptions(),
164
+ ...options
165
+ }
160
166
  };
167
+ }
168
+ static createAsyncModuleConfigProvider(options) {
169
+ return {
170
+ provide: TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN,
171
+ useFactory: async (...args) => {
172
+ const moduleOptions = await options.useFactory?.(...args);
173
+ return {
174
+ ...new TypeormOutboxModuleOptions(),
175
+ ...moduleOptions
176
+ };
177
+ },
178
+ inject: options.inject || []
179
+ };
180
+ }
181
+ static createCronConfigProvider(options) {
182
+ return {
183
+ provide: TYPEORM_OUTBOX_CRON_CONFIG_TOKEN,
184
+ useFactory: async (...args) => {
185
+ const moduleOptions = await options.useFactory?.(...args);
186
+ return {
187
+ ...new TypeormOutboxRegisterCronModuleOptions(),
188
+ ...moduleOptions
189
+ };
190
+ },
191
+ inject: options.inject || []
192
+ };
193
+ }
194
+ static createCronBrokerProvider(options) {
195
+ return {
196
+ provide: TYPEORM_OUTBOX_BROKER_TOKEN,
197
+ useFactory: async (...args) => {
198
+ const moduleOptions = await options.useFactory?.(...args);
199
+ const config = {
200
+ ...new TypeormOutboxRegisterCronModuleOptions(),
201
+ ...moduleOptions
202
+ };
203
+ return _nestjs_microservices.ClientProxyFactory.create(config?.kafkaConfig ?? {});
204
+ },
205
+ inject: options.inject || []
206
+ };
207
+ }
208
+ static forRoot(options = {}) {
209
+ const configProvider = this.createModuleConfigProvider(options);
210
+ const serviceProvider = this.createServiceProvider();
211
+ const brokerProvider = this.createBrokerProvider();
161
212
  return {
162
213
  module: _TypeormOutboxModule,
163
- imports: [_nestjs_typeorm.TypeOrmModule.forFeature([TypeormOutboxEntity], options.typeOrmConnectionName)],
214
+ global: true,
215
+ imports: [this.createTypeOrmFeature(options.typeOrmConnectionName)],
164
216
  providers: [
165
217
  configProvider,
166
218
  serviceProvider,
@@ -174,24 +226,13 @@ let TypeormOutboxModule = _TypeormOutboxModule = class TypeormOutboxModule {
174
226
  };
175
227
  }
176
228
  static forRootAsync(options) {
177
- const configProvider = {
178
- provide: TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN,
179
- useFactory: async (...args) => {
180
- return options.useFactory?.(...args);
181
- },
182
- inject: options.inject || []
183
- };
184
- const serviceProvider = {
185
- provide: TYPEORM_OUTBOX_SERVICE_TOKEN,
186
- useClass: TypeormOutboxService
187
- };
188
- const brokerProvider = {
189
- provide: TYPEORM_OUTBOX_BROKER_TOKEN,
190
- useValue: null
191
- };
229
+ const configProvider = this.createAsyncModuleConfigProvider(options);
230
+ const serviceProvider = this.createServiceProvider();
231
+ const brokerProvider = this.createBrokerProvider();
192
232
  return {
193
233
  module: _TypeormOutboxModule,
194
- imports: [_nestjs_typeorm.TypeOrmModule.forFeature([TypeormOutboxEntity], "default")],
234
+ global: true,
235
+ imports: [this.createTypeOrmFeature()],
195
236
  providers: [
196
237
  configProvider,
197
238
  serviceProvider,
@@ -205,30 +246,16 @@ let TypeormOutboxModule = _TypeormOutboxModule = class TypeormOutboxModule {
205
246
  };
206
247
  }
207
248
  static registerCronAsync(options) {
208
- const configProvider = {
209
- provide: TYPEORM_OUTBOX_CRON_CONFIG_TOKEN,
210
- useFactory: async (...args) => {
211
- return options.useFactory?.(...args);
212
- },
213
- inject: options.inject || []
214
- };
215
- const brokerProvider = {
216
- provide: TYPEORM_OUTBOX_BROKER_TOKEN,
217
- useFactory: async (...args) => {
218
- const moduleOptions = options?.useFactory?.(...args);
219
- return _nestjs_microservices.ClientProxyFactory.create(moduleOptions?.kafkaConfig ?? {});
220
- },
221
- inject: options.inject || []
222
- };
223
- const serviceProvider = {
224
- provide: TYPEORM_OUTBOX_SERVICE_TOKEN,
225
- useClass: TypeormOutboxService
226
- };
249
+ const configProvider = this.createCronConfigProvider(options);
250
+ const brokerProvider = this.createCronBrokerProvider(options);
251
+ const serviceProvider = this.createServiceProvider();
252
+ console.log(configProvider);
227
253
  return {
228
254
  module: _TypeormOutboxModule,
229
- imports: [_nestjs_schedule.ScheduleModule.forRoot(), _nestjs_typeorm.TypeOrmModule.forFeature([TypeormOutboxEntity], "default")],
230
- controllers: [TypeormOutboxController],
255
+ global: true,
256
+ imports: [_nestjs_schedule.ScheduleModule.forRoot(), this.createTypeOrmFeature()],
231
257
  providers: [
258
+ TypeormOutboxCronService,
232
259
  configProvider,
233
260
  brokerProvider,
234
261
  serviceProvider
@@ -252,10 +279,10 @@ exports.TYPEORM_OUTBOX_BROKER_TOKEN = TYPEORM_OUTBOX_BROKER_TOKEN;
252
279
  exports.TYPEORM_OUTBOX_CRON_CONFIG_TOKEN = TYPEORM_OUTBOX_CRON_CONFIG_TOKEN;
253
280
  exports.TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN = TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN;
254
281
  exports.TYPEORM_OUTBOX_SERVICE_TOKEN = TYPEORM_OUTBOX_SERVICE_TOKEN;
255
- Object.defineProperty(exports, 'TypeormOutboxController', {
282
+ Object.defineProperty(exports, 'TypeormOutboxCronService', {
256
283
  enumerable: true,
257
284
  get: function () {
258
- return TypeormOutboxController;
285
+ return TypeormOutboxCronService;
259
286
  }
260
287
  });
261
288
  Object.defineProperty(exports, 'TypeormOutboxEntity', {
@@ -270,7 +297,6 @@ Object.defineProperty(exports, 'TypeormOutboxModule', {
270
297
  return TypeormOutboxModule;
271
298
  }
272
299
  });
273
- exports.TypeormOutboxModuleAsyncOptions = TypeormOutboxModuleAsyncOptions;
274
300
  exports.TypeormOutboxModuleOptions = TypeormOutboxModuleOptions;
275
301
  exports.TypeormOutboxRegisterCronModuleOptions = TypeormOutboxRegisterCronModuleOptions;
276
302
  Object.defineProperty(exports, 'TypeormOutboxService', {
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["CronExpression","TypeOrmModule","ClientProxyFactory","ScheduleModule"],"sources":["../src/core/typeorm-outbox.di-tokens.ts","../src/core/typeorm-outbox.entity.ts","../src/core/typeorm-outbox.controller.ts","../src/core/typeorm-outbox.interfaces.ts","../src/core/typeorm-outbox.service.ts","../src/core/typeorm-outbox.module.ts"],"sourcesContent":["import { Inject } from \"@nestjs/common\";\n\nexport const TYPEORM_OUTBOX_CRON_CONFIG_TOKEN = Symbol(\n \"TYPEORM_OUTBOX_CRON_CONFIG_TOKEN\",\n);\nexport const TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN = Symbol(\n \"TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN\",\n);\nexport const TYPEORM_OUTBOX_SERVICE_TOKEN = Symbol(\n \"TYPEORM_OUTBOX_SERVICE_TOKEN\",\n);\nexport const TYPEORM_OUTBOX_BROKER_TOKEN = Symbol(\n \"TYPEORM_OUTBOX_BROKER_TOKEN\",\n);\n\nexport const InjectTypeormOutboxCronConfig = () =>\n Inject(TYPEORM_OUTBOX_CRON_CONFIG_TOKEN);\nexport const InjectTypeormOutboxModuleConfig = () =>\n Inject(TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN);\nexport const InjectTypeormOutboxService = () =>\n Inject(TYPEORM_OUTBOX_SERVICE_TOKEN);\nexport const InjectTypeormOutboxBroker = () =>\n Inject(TYPEORM_OUTBOX_BROKER_TOKEN);\n","import {\n Column,\n CreateDateColumn,\n Entity,\n PrimaryGeneratedColumn,\n UpdateDateColumn,\n} from \"typeorm\";\n\n@Entity('outbox')\nexport class TypeormOutboxEntity {\n @PrimaryGeneratedColumn()\n id!: number;\n\n @CreateDateColumn({ name: 'created_at' })\n createdAt!: Date;\n\n @UpdateDateColumn({ name: 'updated_at' })\n updatedAt!: Date;\n\n @Column(\"character varying\", { name: 'destination_topic' })\n destinationTopic!: string;\n\n @Column(\"jsonb\", { nullable: true })\n headers!: Record<string, string>;\n\n @Column(\"jsonb\", { nullable: true })\n keys!: Record<any, any>;\n\n @Column(\"jsonb\")\n payload!: Record<string, any>;\n}\n","import { Controller } from \"@nestjs/common\";\nimport { InjectTypeormOutboxBroker } from \"./typeorm-outbox.di-tokens\";\nimport { Cron, CronExpression } from \"@nestjs/schedule\";\nimport { hashStringToInt } from \"@globalart/text-utils\";\nimport { EntityManager, Repository } from \"typeorm\";\nimport { TypeormOutboxEntity } from \"./typeorm-outbox.entity\";\nimport { InjectRepository } from \"@nestjs/typeorm\";\nimport { firstValueFrom } from \"rxjs\";\nimport { ClientProxy } from \"@nestjs/microservices\";\n\n@Controller()\nexport class TypeormOutboxController {\n constructor(\n private readonly entityManager: EntityManager,\n @InjectRepository(TypeormOutboxEntity)\n private readonly outboxRepository: Repository<TypeormOutboxEntity>,\n @InjectTypeormOutboxBroker()\n private readonly brokerClient: ClientProxy,\n ) {}\n\n @Cron(CronExpression.EVERY_10_SECONDS)\n async handleOutboxCron() {\n await this.executeCronJob();\n }\n\n async executeCronJob() {\n const lockId = hashStringToInt(\"typeorm-outbox-cron-job\");\n const [{ pg_try_advisory_xact_lock: acquired }] =\n await this.entityManager.query<{ pg_try_advisory_xact_lock: boolean }[]>(\n `SELECT pg_try_advisory_xact_lock(${lockId})`,\n );\n\n if (!acquired) {\n return;\n }\n const entities = await this.outboxRepository.find();\n \n for (const entity of entities) {\n await firstValueFrom(\n this.brokerClient.emit(entity.destinationTopic, {\n key: entity.keys,\n value: entity.payload,\n headers: entity.headers,\n }),\n );\n await this.outboxRepository.delete(entity.id);\n }\n }\n}\n","import { KafkaOptions } from \"@nestjs/microservices\";\nimport { InjectionToken, ModuleMetadata, Type } from \"@nestjs/common\";\n\n// register cron options\nexport class TypeormOutboxRegisterCronModuleOptions {\n typeOrmConnectionName?: string = \"default\";\n kafkaConfig?: KafkaOptions = {};\n}\nexport interface TypeormOutboxRegisterCronAsyncOptions extends Pick<\n ModuleMetadata,\n \"imports\"\n> {\n inject?: any[];\n useExisting?: Type<TypeormOutboxRegisterCronModuleOptions>;\n useClass?: Type<TypeormOutboxRegisterCronModuleOptions>;\n useFactory?: (\n ...args: any[]\n ) =>\n | Promise<TypeormOutboxRegisterCronModuleOptions>\n | TypeormOutboxRegisterCronModuleOptions;\n}\n\n// register module options\nexport class TypeormOutboxModuleOptions {\n typeOrmConnectionName?: string = \"default\";\n}\nexport class TypeormOutboxModuleAsyncOptions {\n imports?: Type[] = [];\n inject?: InjectionToken[] = [];\n useFactory?: (\n ...args: any[]\n ) => Promise<TypeormOutboxModuleOptions> | TypeormOutboxModuleOptions;\n}\n","import { Injectable } from \"@nestjs/common\";\nimport { InjectRepository } from \"@nestjs/typeorm\";\nimport { TypeormOutboxEntity } from \"./typeorm-outbox.entity\";\nimport { Repository } from \"typeorm\";\n\ntype createOutboxOptions = {\n destinationTopic: string;\n payload: Record<string, any>;\n headers?: Record<string, string>;\n keys?: Record<any, any>;\n};\n\n@Injectable()\nexport class TypeormOutboxService {\n constructor(\n @InjectRepository(TypeormOutboxEntity)\n private readonly outboxRepository: Repository<TypeormOutboxEntity>,\n ) {}\n\n async create(options: createOutboxOptions) {\n await this.outboxRepository.save({\n destinationTopic: options.destinationTopic,\n headers: options.headers,\n keys: options.keys,\n payload: options.payload,\n });\n }\n}\n","import { TypeOrmModule } from \"@nestjs/typeorm\";\nimport { DynamicModule, Module, Provider } from \"@nestjs/common\";\nimport {\n TypeormOutboxRegisterCronAsyncOptions,\n TypeormOutboxRegisterCronModuleOptions,\n TypeormOutboxModuleOptions,\n TypeormOutboxModuleAsyncOptions,\n} from \"./typeorm-outbox.interfaces\";\nimport {\n TYPEORM_OUTBOX_BROKER_TOKEN,\n TYPEORM_OUTBOX_CRON_CONFIG_TOKEN,\n TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN,\n TYPEORM_OUTBOX_SERVICE_TOKEN,\n} from \"./typeorm-outbox.di-tokens\";\nimport { TypeormOutboxEntity } from \"./typeorm-outbox.entity\";\nimport { TypeormOutboxService } from \"./typeorm-outbox.service\";\nimport { TypeormOutboxController } from \"./typeorm-outbox.controller\";\nimport { ScheduleModule } from \"@nestjs/schedule\";\nimport { ClientProxyFactory } from \"@nestjs/microservices\";\n\n@Module({})\nexport class TypeormOutboxModule {\n static forRoot(options: TypeormOutboxModuleOptions = {}): DynamicModule {\n const configProvider: Provider = {\n provide: TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN,\n useValue: options,\n };\n const serviceProvider: Provider = {\n provide: TYPEORM_OUTBOX_SERVICE_TOKEN,\n useClass: TypeormOutboxService,\n };\n const brokerProvider: Provider = {\n provide: TYPEORM_OUTBOX_BROKER_TOKEN,\n useValue: null,\n };\n\n return {\n module: TypeormOutboxModule,\n imports: [\n TypeOrmModule.forFeature(\n [TypeormOutboxEntity],\n options.typeOrmConnectionName,\n ),\n ],\n providers: [configProvider, serviceProvider, brokerProvider],\n exports: [configProvider, serviceProvider, brokerProvider],\n };\n }\n\n static forRootAsync(options: TypeormOutboxModuleAsyncOptions): DynamicModule {\n const configProvider: Provider = {\n provide: TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN,\n useFactory: async (...args: unknown[]) => {\n const moduleOptions = options.useFactory?.(\n ...args,\n ) as TypeormOutboxModuleOptions;\n return moduleOptions;\n },\n inject: options.inject || [],\n };\n const serviceProvider: Provider = {\n provide: TYPEORM_OUTBOX_SERVICE_TOKEN,\n useClass: TypeormOutboxService,\n };\n const brokerProvider: Provider = {\n provide: TYPEORM_OUTBOX_BROKER_TOKEN,\n useValue: null,\n };\n\n return {\n module: TypeormOutboxModule,\n imports: [TypeOrmModule.forFeature([TypeormOutboxEntity], \"default\")],\n providers: [configProvider, serviceProvider, brokerProvider],\n exports: [configProvider, serviceProvider, brokerProvider],\n };\n }\n\n static registerCronAsync(\n options: TypeormOutboxRegisterCronAsyncOptions,\n ): DynamicModule {\n const configProvider: Provider = {\n provide: TYPEORM_OUTBOX_CRON_CONFIG_TOKEN,\n useFactory: async (...args: unknown[]) => {\n const moduleOptions = options.useFactory?.(\n ...args,\n ) as TypeormOutboxRegisterCronModuleOptions;\n return moduleOptions;\n },\n inject: options.inject || [],\n };\n\n const brokerProvider: Provider = {\n provide: TYPEORM_OUTBOX_BROKER_TOKEN,\n useFactory: async (...args: unknown[]) => {\n const moduleOptions = options?.useFactory?.(\n ...args,\n ) as TypeormOutboxRegisterCronModuleOptions;\n return ClientProxyFactory.create(moduleOptions?.kafkaConfig ?? {});\n },\n inject: options.inject || [],\n };\n const serviceProvider: Provider = {\n provide: TYPEORM_OUTBOX_SERVICE_TOKEN,\n useClass: TypeormOutboxService,\n };\n\n return {\n module: TypeormOutboxModule,\n imports: [\n ScheduleModule.forRoot(),\n TypeOrmModule.forFeature([TypeormOutboxEntity], \"default\")\n ],\n controllers: [TypeormOutboxController],\n providers: [configProvider, brokerProvider, serviceProvider],\n exports: [configProvider, brokerProvider, serviceProvider],\n };\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":["CronExpression","CronJob","CronExpression","TypeOrmModule","ClientProxyFactory","ScheduleModule"],"sources":["../src/core/typeorm-outbox.di-tokens.ts","../src/core/typeorm-outbox.entity.ts","../src/core/typeorm-outbox.interfaces.ts","../src/core/typeorm-outbox-cron.service.ts","../src/core/typeorm-outbox.service.ts","../src/core/typeorm-outbox.module.ts"],"sourcesContent":["import { Inject } from \"@nestjs/common\";\n\nexport const TYPEORM_OUTBOX_CRON_CONFIG_TOKEN = Symbol(\n \"TYPEORM_OUTBOX_CRON_CONFIG_TOKEN\",\n);\nexport const TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN = Symbol(\n \"TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN\",\n);\nexport const TYPEORM_OUTBOX_SERVICE_TOKEN = Symbol(\n \"TYPEORM_OUTBOX_SERVICE_TOKEN\",\n);\nexport const TYPEORM_OUTBOX_BROKER_TOKEN = Symbol(\n \"TYPEORM_OUTBOX_BROKER_TOKEN\",\n);\n\nexport const InjectTypeormOutboxCronConfig = () =>\n Inject(TYPEORM_OUTBOX_CRON_CONFIG_TOKEN);\nexport const InjectTypeormOutboxModuleConfig = () =>\n Inject(TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN);\nexport const InjectTypeormOutboxService = () =>\n Inject(TYPEORM_OUTBOX_SERVICE_TOKEN);\nexport const InjectTypeormOutboxBroker = () =>\n Inject(TYPEORM_OUTBOX_BROKER_TOKEN);\n","import {\n Column,\n CreateDateColumn,\n Entity,\n PrimaryGeneratedColumn,\n UpdateDateColumn,\n} from \"typeorm\";\n\n@Entity('outbox')\nexport class TypeormOutboxEntity {\n @PrimaryGeneratedColumn()\n id!: number;\n\n @CreateDateColumn({ name: 'created_at' })\n createdAt!: Date;\n\n @UpdateDateColumn({ name: 'updated_at' })\n updatedAt!: Date;\n\n @Column(\"character varying\", { name: 'destination_topic' })\n destinationTopic!: string;\n\n @Column(\"jsonb\", { nullable: true })\n headers!: Record<string, string>;\n\n @Column(\"jsonb\", { nullable: true })\n keys!: Record<string, unknown>;\n\n @Column(\"jsonb\")\n payload!: Record<string, any>;\n}\n","import { KafkaOptions } from \"@nestjs/microservices\";\nimport { InjectionToken, ModuleMetadata, Type } from \"@nestjs/common\";\nimport { CronExpression } from \"@nestjs/schedule\";\n\nexport class TypeormOutboxRegisterCronModuleOptions {\n typeOrmConnectionName?: string = \"default\";\n kafkaConfig?: KafkaOptions = {};\n cronExpression?: string = CronExpression.EVERY_10_SECONDS;\n}\n\nexport interface TypeormOutboxRegisterCronAsyncOptions\n extends Pick<ModuleMetadata, \"imports\"> {\n inject?: InjectionToken[];\n useExisting?: Type<TypeormOutboxRegisterCronModuleOptions>;\n useClass?: Type<TypeormOutboxRegisterCronModuleOptions>;\n useFactory?: (\n ...args: unknown[]\n ) =>\n | Promise<TypeormOutboxRegisterCronModuleOptions>\n | TypeormOutboxRegisterCronModuleOptions;\n}\n\nexport class TypeormOutboxModuleOptions {\n typeOrmConnectionName?: string = \"default\";\n}\n\nexport interface TypeormOutboxModuleAsyncOptions\n extends Pick<ModuleMetadata, \"imports\"> {\n inject?: InjectionToken[];\n useFactory?: (\n ...args: unknown[]\n ) => Promise<TypeormOutboxModuleOptions> | TypeormOutboxModuleOptions;\n}\n","import { Injectable, OnModuleInit } from \"@nestjs/common\";\nimport { InjectTypeormOutboxBroker, InjectTypeormOutboxCronConfig, InjectTypeormOutboxModuleConfig } from \"./typeorm-outbox.di-tokens\";\nimport { hashStringToInt } from \"@globalart/text-utils\";\nimport { EntityManager, Repository } from \"typeorm\";\nimport { TypeormOutboxEntity } from \"./typeorm-outbox.entity\";\nimport { InjectRepository } from \"@nestjs/typeorm\";\nimport { firstValueFrom } from \"rxjs\";\nimport { ClientProxy } from \"@nestjs/microservices\";\nimport { CronJob } from \"cron\";\nimport { TypeormOutboxRegisterCronModuleOptions } from \"./typeorm-outbox.interfaces\";\nimport { CronExpression } from \"@nestjs/schedule\";\n\n@Injectable()\nexport class TypeormOutboxCronService implements OnModuleInit {\n constructor(\n private readonly entityManager: EntityManager,\n @InjectRepository(TypeormOutboxEntity)\n private readonly outboxRepository: Repository<TypeormOutboxEntity>,\n @InjectTypeormOutboxBroker()\n private readonly brokerClient: ClientProxy,\n @InjectTypeormOutboxCronConfig()\n private readonly moduleConfig: TypeormOutboxRegisterCronModuleOptions,\n ) {}\n\n onModuleInit() {\n const cronJob = new CronJob(this.moduleConfig.cronExpression ?? CronExpression.EVERY_10_SECONDS, () => {\n this.executeCronJob();\n });\n cronJob.start();\n }\n\n async executeCronJob() {\n const lockId = hashStringToInt(\"typeorm-outbox-cron-job\");\n const [{ pg_try_advisory_xact_lock: acquired }] =\n await this.entityManager.query<{ pg_try_advisory_xact_lock: boolean }[]>(\n `SELECT pg_try_advisory_xact_lock(${lockId})`,\n );\n if (!acquired) {\n return;\n }\n\n const entities = await this.outboxRepository.find();\n \n for (const entity of entities) {\n await firstValueFrom(\n this.brokerClient.emit(entity.destinationTopic, {\n key: entity.keys,\n value: entity.payload,\n headers: entity.headers,\n }),\n );\n await this.outboxRepository.delete(entity.id);\n }\n }\n}\n","import { Injectable } from \"@nestjs/common\";\nimport { InjectRepository } from \"@nestjs/typeorm\";\nimport { TypeormOutboxEntity } from \"./typeorm-outbox.entity\";\nimport { Repository } from \"typeorm\";\n\nexport interface CreateOutboxOptions {\n destinationTopic: string;\n payload: Record<string, unknown>;\n headers?: Record<string, string>;\n keys?: Record<string, unknown>;\n}\n\n@Injectable()\nexport class TypeormOutboxService {\n constructor(\n @InjectRepository(TypeormOutboxEntity)\n private readonly outboxRepository: Repository<TypeormOutboxEntity>,\n ) {}\n\n async create(options: CreateOutboxOptions): Promise<void> {\n await this.outboxRepository.save({\n destinationTopic: options.destinationTopic,\n headers: options.headers,\n keys: options.keys,\n payload: options.payload,\n });\n }\n}\n","import { TypeOrmModule } from \"@nestjs/typeorm\";\nimport { DynamicModule, Module, Provider } from \"@nestjs/common\";\nimport {\n TypeormOutboxRegisterCronAsyncOptions,\n TypeormOutboxRegisterCronModuleOptions,\n TypeormOutboxModuleOptions,\n TypeormOutboxModuleAsyncOptions,\n} from \"./typeorm-outbox.interfaces\";\nimport {\n TYPEORM_OUTBOX_BROKER_TOKEN,\n TYPEORM_OUTBOX_CRON_CONFIG_TOKEN,\n TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN,\n TYPEORM_OUTBOX_SERVICE_TOKEN,\n} from \"./typeorm-outbox.di-tokens\";\nimport { TypeormOutboxEntity } from \"./typeorm-outbox.entity\";\nimport { TypeormOutboxService } from \"./typeorm-outbox.service\";\nimport { ScheduleModule } from \"@nestjs/schedule\";\nimport { ClientProxyFactory } from \"@nestjs/microservices\";\nimport { TypeormOutboxCronService } from \"./typeorm-outbox-cron.service\";\n\n@Module({})\nexport class TypeormOutboxModule {\n private static createServiceProvider(): Provider {\n return {\n provide: TYPEORM_OUTBOX_SERVICE_TOKEN,\n useClass: TypeormOutboxService,\n };\n }\n\n private static createBrokerProvider(useValue: unknown = null): Provider {\n return {\n provide: TYPEORM_OUTBOX_BROKER_TOKEN,\n useValue,\n };\n }\n\n private static createTypeOrmFeature(connectionName?: string) {\n return TypeOrmModule.forFeature(\n [TypeormOutboxEntity],\n connectionName || \"default\",\n );\n }\n\n private static createModuleConfigProvider(\n options: TypeormOutboxModuleOptions,\n ): Provider {\n return {\n provide: TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN,\n useValue: {\n ...new TypeormOutboxModuleOptions(),\n ...options,\n },\n };\n }\n\n private static createAsyncModuleConfigProvider(\n options: TypeormOutboxModuleAsyncOptions,\n ): Provider {\n return {\n provide: TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN,\n useFactory: async (...args: unknown[]) => {\n const moduleOptions = (await options.useFactory?.(...args)) as\n | TypeormOutboxModuleOptions;\n \n return {\n ...new TypeormOutboxModuleOptions(),\n ...moduleOptions,\n };\n },\n inject: options.inject || [],\n };\n }\n\n private static createCronConfigProvider(\n options: TypeormOutboxRegisterCronAsyncOptions,\n ): Provider {\n return {\n provide: TYPEORM_OUTBOX_CRON_CONFIG_TOKEN,\n useFactory: async (...args: unknown[]) => {\n const moduleOptions = await options.useFactory?.(...args);\n return {\n ...new TypeormOutboxRegisterCronModuleOptions(),\n ...moduleOptions,\n };\n },\n inject: options.inject || [],\n };\n }\n\n private static createCronBrokerProvider(\n options: TypeormOutboxRegisterCronAsyncOptions,\n ): Provider {\n return {\n provide: TYPEORM_OUTBOX_BROKER_TOKEN,\n useFactory: async (...args: unknown[]) => {\n const moduleOptions = await options.useFactory?.(...args);\n const config = {\n ...new TypeormOutboxRegisterCronModuleOptions(),\n ...moduleOptions,\n };\n return ClientProxyFactory.create(config?.kafkaConfig ?? {});\n },\n inject: options.inject || [],\n };\n }\n\n static forRoot(options: TypeormOutboxModuleOptions = {}): DynamicModule {\n const configProvider = this.createModuleConfigProvider(options);\n const serviceProvider = this.createServiceProvider();\n const brokerProvider = this.createBrokerProvider();\n\n return {\n module: TypeormOutboxModule,\n global: true,\n imports: [this.createTypeOrmFeature(options.typeOrmConnectionName)],\n providers: [configProvider, serviceProvider, brokerProvider],\n exports: [configProvider, serviceProvider, brokerProvider],\n };\n }\n\n static forRootAsync(\n options: TypeormOutboxModuleAsyncOptions,\n ): DynamicModule {\n const configProvider = this.createAsyncModuleConfigProvider(options);\n const serviceProvider = this.createServiceProvider();\n const brokerProvider = this.createBrokerProvider();\n\n return {\n module: TypeormOutboxModule,\n global: true,\n imports: [this.createTypeOrmFeature()],\n providers: [configProvider, serviceProvider, brokerProvider],\n exports: [configProvider, serviceProvider, brokerProvider],\n };\n }\n\n static registerCronAsync(\n options: TypeormOutboxRegisterCronAsyncOptions,\n ): DynamicModule {\n const configProvider = this.createCronConfigProvider(options);\n const brokerProvider = this.createCronBrokerProvider(options);\n const serviceProvider = this.createServiceProvider();\n console.log(configProvider);\n\n return {\n module: TypeormOutboxModule,\n global: true,\n imports: [\n ScheduleModule.forRoot(),\n this.createTypeOrmFeature(),\n ],\n providers: [\n TypeormOutboxCronService,\n configProvider,\n brokerProvider,\n serviceProvider,\n ],\n exports: [configProvider, brokerProvider, serviceProvider],\n };\n }\n}\n"],"mappings":"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"}
package/dist/index.d.cts CHANGED
@@ -1,6 +1,6 @@
1
+ import { DynamicModule, InjectionToken, ModuleMetadata, OnModuleInit, Type } from "@nestjs/common";
1
2
  import { EntityManager, Repository } from "typeorm";
2
3
  import { ClientProxy, KafkaOptions } from "@nestjs/microservices";
3
- import { DynamicModule, InjectionToken, ModuleMetadata, Type } from "@nestjs/common";
4
4
 
5
5
  //#region src/core/typeorm-outbox.entity.d.ts
6
6
  declare class TypeormOutboxEntity {
@@ -9,17 +9,38 @@ declare class TypeormOutboxEntity {
9
9
  updatedAt: Date;
10
10
  destinationTopic: string;
11
11
  headers: Record<string, string>;
12
- keys: Record<any, any>;
12
+ keys: Record<string, unknown>;
13
13
  payload: Record<string, any>;
14
14
  }
15
15
  //#endregion
16
- //#region src/core/typeorm-outbox.controller.d.ts
17
- declare class TypeormOutboxController {
16
+ //#region src/core/typeorm-outbox.interfaces.d.ts
17
+ declare class TypeormOutboxRegisterCronModuleOptions {
18
+ typeOrmConnectionName?: string;
19
+ kafkaConfig?: KafkaOptions;
20
+ cronExpression?: string;
21
+ }
22
+ interface TypeormOutboxRegisterCronAsyncOptions extends Pick<ModuleMetadata, "imports"> {
23
+ inject?: InjectionToken[];
24
+ useExisting?: Type<TypeormOutboxRegisterCronModuleOptions>;
25
+ useClass?: Type<TypeormOutboxRegisterCronModuleOptions>;
26
+ useFactory?: (...args: unknown[]) => Promise<TypeormOutboxRegisterCronModuleOptions> | TypeormOutboxRegisterCronModuleOptions;
27
+ }
28
+ declare class TypeormOutboxModuleOptions {
29
+ typeOrmConnectionName?: string;
30
+ }
31
+ interface TypeormOutboxModuleAsyncOptions extends Pick<ModuleMetadata, "imports"> {
32
+ inject?: InjectionToken[];
33
+ useFactory?: (...args: unknown[]) => Promise<TypeormOutboxModuleOptions> | TypeormOutboxModuleOptions;
34
+ }
35
+ //#endregion
36
+ //#region src/core/typeorm-outbox-cron.service.d.ts
37
+ declare class TypeormOutboxCronService implements OnModuleInit {
18
38
  private readonly entityManager;
19
39
  private readonly outboxRepository;
20
40
  private readonly brokerClient;
21
- constructor(entityManager: EntityManager, outboxRepository: Repository<TypeormOutboxEntity>, brokerClient: ClientProxy);
22
- handleOutboxCron(): Promise<void>;
41
+ private readonly moduleConfig;
42
+ constructor(entityManager: EntityManager, outboxRepository: Repository<TypeormOutboxEntity>, brokerClient: ClientProxy, moduleConfig: TypeormOutboxRegisterCronModuleOptions);
43
+ onModuleInit(): void;
23
44
  executeCronJob(): Promise<void>;
24
45
  }
25
46
  //#endregion
@@ -33,45 +54,32 @@ declare const InjectTypeormOutboxModuleConfig: () => PropertyDecorator & Paramet
33
54
  declare const InjectTypeormOutboxService: () => PropertyDecorator & ParameterDecorator;
34
55
  declare const InjectTypeormOutboxBroker: () => PropertyDecorator & ParameterDecorator;
35
56
  //#endregion
36
- //#region src/core/typeorm-outbox.interfaces.d.ts
37
- declare class TypeormOutboxRegisterCronModuleOptions {
38
- typeOrmConnectionName?: string;
39
- kafkaConfig?: KafkaOptions;
40
- }
41
- interface TypeormOutboxRegisterCronAsyncOptions extends Pick<ModuleMetadata, "imports"> {
42
- inject?: any[];
43
- useExisting?: Type<TypeormOutboxRegisterCronModuleOptions>;
44
- useClass?: Type<TypeormOutboxRegisterCronModuleOptions>;
45
- useFactory?: (...args: any[]) => Promise<TypeormOutboxRegisterCronModuleOptions> | TypeormOutboxRegisterCronModuleOptions;
46
- }
47
- declare class TypeormOutboxModuleOptions {
48
- typeOrmConnectionName?: string;
49
- }
50
- declare class TypeormOutboxModuleAsyncOptions {
51
- imports?: Type[];
52
- inject?: InjectionToken[];
53
- useFactory?: (...args: any[]) => Promise<TypeormOutboxModuleOptions> | TypeormOutboxModuleOptions;
54
- }
55
- //#endregion
56
57
  //#region src/core/typeorm-outbox.module.d.ts
57
58
  declare class TypeormOutboxModule {
59
+ private static createServiceProvider;
60
+ private static createBrokerProvider;
61
+ private static createTypeOrmFeature;
62
+ private static createModuleConfigProvider;
63
+ private static createAsyncModuleConfigProvider;
64
+ private static createCronConfigProvider;
65
+ private static createCronBrokerProvider;
58
66
  static forRoot(options?: TypeormOutboxModuleOptions): DynamicModule;
59
67
  static forRootAsync(options: TypeormOutboxModuleAsyncOptions): DynamicModule;
60
68
  static registerCronAsync(options: TypeormOutboxRegisterCronAsyncOptions): DynamicModule;
61
69
  }
62
70
  //#endregion
63
71
  //#region src/core/typeorm-outbox.service.d.ts
64
- type createOutboxOptions = {
72
+ interface CreateOutboxOptions {
65
73
  destinationTopic: string;
66
- payload: Record<string, any>;
74
+ payload: Record<string, unknown>;
67
75
  headers?: Record<string, string>;
68
- keys?: Record<any, any>;
69
- };
76
+ keys?: Record<string, unknown>;
77
+ }
70
78
  declare class TypeormOutboxService {
71
79
  private readonly outboxRepository;
72
80
  constructor(outboxRepository: Repository<TypeormOutboxEntity>);
73
- create(options: createOutboxOptions): Promise<void>;
81
+ create(options: CreateOutboxOptions): Promise<void>;
74
82
  }
75
83
  //#endregion
76
- export { InjectTypeormOutboxBroker, InjectTypeormOutboxCronConfig, InjectTypeormOutboxModuleConfig, InjectTypeormOutboxService, TYPEORM_OUTBOX_BROKER_TOKEN, TYPEORM_OUTBOX_CRON_CONFIG_TOKEN, TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN, TYPEORM_OUTBOX_SERVICE_TOKEN, TypeormOutboxController, TypeormOutboxEntity, TypeormOutboxModule, TypeormOutboxModuleAsyncOptions, TypeormOutboxModuleOptions, TypeormOutboxRegisterCronAsyncOptions, TypeormOutboxRegisterCronModuleOptions, TypeormOutboxService };
84
+ export { CreateOutboxOptions, InjectTypeormOutboxBroker, InjectTypeormOutboxCronConfig, InjectTypeormOutboxModuleConfig, InjectTypeormOutboxService, TYPEORM_OUTBOX_BROKER_TOKEN, TYPEORM_OUTBOX_CRON_CONFIG_TOKEN, TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN, TYPEORM_OUTBOX_SERVICE_TOKEN, TypeormOutboxCronService, TypeormOutboxEntity, TypeormOutboxModule, TypeormOutboxModuleAsyncOptions, TypeormOutboxModuleOptions, TypeormOutboxRegisterCronAsyncOptions, TypeormOutboxRegisterCronModuleOptions, TypeormOutboxService };
77
85
  //# sourceMappingURL=index.d.cts.map
package/dist/index.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { DynamicModule, InjectionToken, ModuleMetadata, Type } from "@nestjs/common";
1
+ import { DynamicModule, InjectionToken, ModuleMetadata, OnModuleInit, Type } from "@nestjs/common";
2
2
  import { EntityManager, Repository } from "typeorm";
3
3
  import { ClientProxy, KafkaOptions } from "@nestjs/microservices";
4
4
 
@@ -9,17 +9,38 @@ declare class TypeormOutboxEntity {
9
9
  updatedAt: Date;
10
10
  destinationTopic: string;
11
11
  headers: Record<string, string>;
12
- keys: Record<any, any>;
12
+ keys: Record<string, unknown>;
13
13
  payload: Record<string, any>;
14
14
  }
15
15
  //#endregion
16
- //#region src/core/typeorm-outbox.controller.d.ts
17
- declare class TypeormOutboxController {
16
+ //#region src/core/typeorm-outbox.interfaces.d.ts
17
+ declare class TypeormOutboxRegisterCronModuleOptions {
18
+ typeOrmConnectionName?: string;
19
+ kafkaConfig?: KafkaOptions;
20
+ cronExpression?: string;
21
+ }
22
+ interface TypeormOutboxRegisterCronAsyncOptions extends Pick<ModuleMetadata, "imports"> {
23
+ inject?: InjectionToken[];
24
+ useExisting?: Type<TypeormOutboxRegisterCronModuleOptions>;
25
+ useClass?: Type<TypeormOutboxRegisterCronModuleOptions>;
26
+ useFactory?: (...args: unknown[]) => Promise<TypeormOutboxRegisterCronModuleOptions> | TypeormOutboxRegisterCronModuleOptions;
27
+ }
28
+ declare class TypeormOutboxModuleOptions {
29
+ typeOrmConnectionName?: string;
30
+ }
31
+ interface TypeormOutboxModuleAsyncOptions extends Pick<ModuleMetadata, "imports"> {
32
+ inject?: InjectionToken[];
33
+ useFactory?: (...args: unknown[]) => Promise<TypeormOutboxModuleOptions> | TypeormOutboxModuleOptions;
34
+ }
35
+ //#endregion
36
+ //#region src/core/typeorm-outbox-cron.service.d.ts
37
+ declare class TypeormOutboxCronService implements OnModuleInit {
18
38
  private readonly entityManager;
19
39
  private readonly outboxRepository;
20
40
  private readonly brokerClient;
21
- constructor(entityManager: EntityManager, outboxRepository: Repository<TypeormOutboxEntity>, brokerClient: ClientProxy);
22
- handleOutboxCron(): Promise<void>;
41
+ private readonly moduleConfig;
42
+ constructor(entityManager: EntityManager, outboxRepository: Repository<TypeormOutboxEntity>, brokerClient: ClientProxy, moduleConfig: TypeormOutboxRegisterCronModuleOptions);
43
+ onModuleInit(): void;
23
44
  executeCronJob(): Promise<void>;
24
45
  }
25
46
  //#endregion
@@ -33,45 +54,32 @@ declare const InjectTypeormOutboxModuleConfig: () => PropertyDecorator & Paramet
33
54
  declare const InjectTypeormOutboxService: () => PropertyDecorator & ParameterDecorator;
34
55
  declare const InjectTypeormOutboxBroker: () => PropertyDecorator & ParameterDecorator;
35
56
  //#endregion
36
- //#region src/core/typeorm-outbox.interfaces.d.ts
37
- declare class TypeormOutboxRegisterCronModuleOptions {
38
- typeOrmConnectionName?: string;
39
- kafkaConfig?: KafkaOptions;
40
- }
41
- interface TypeormOutboxRegisterCronAsyncOptions extends Pick<ModuleMetadata, "imports"> {
42
- inject?: any[];
43
- useExisting?: Type<TypeormOutboxRegisterCronModuleOptions>;
44
- useClass?: Type<TypeormOutboxRegisterCronModuleOptions>;
45
- useFactory?: (...args: any[]) => Promise<TypeormOutboxRegisterCronModuleOptions> | TypeormOutboxRegisterCronModuleOptions;
46
- }
47
- declare class TypeormOutboxModuleOptions {
48
- typeOrmConnectionName?: string;
49
- }
50
- declare class TypeormOutboxModuleAsyncOptions {
51
- imports?: Type[];
52
- inject?: InjectionToken[];
53
- useFactory?: (...args: any[]) => Promise<TypeormOutboxModuleOptions> | TypeormOutboxModuleOptions;
54
- }
55
- //#endregion
56
57
  //#region src/core/typeorm-outbox.module.d.ts
57
58
  declare class TypeormOutboxModule {
59
+ private static createServiceProvider;
60
+ private static createBrokerProvider;
61
+ private static createTypeOrmFeature;
62
+ private static createModuleConfigProvider;
63
+ private static createAsyncModuleConfigProvider;
64
+ private static createCronConfigProvider;
65
+ private static createCronBrokerProvider;
58
66
  static forRoot(options?: TypeormOutboxModuleOptions): DynamicModule;
59
67
  static forRootAsync(options: TypeormOutboxModuleAsyncOptions): DynamicModule;
60
68
  static registerCronAsync(options: TypeormOutboxRegisterCronAsyncOptions): DynamicModule;
61
69
  }
62
70
  //#endregion
63
71
  //#region src/core/typeorm-outbox.service.d.ts
64
- type createOutboxOptions = {
72
+ interface CreateOutboxOptions {
65
73
  destinationTopic: string;
66
- payload: Record<string, any>;
74
+ payload: Record<string, unknown>;
67
75
  headers?: Record<string, string>;
68
- keys?: Record<any, any>;
69
- };
76
+ keys?: Record<string, unknown>;
77
+ }
70
78
  declare class TypeormOutboxService {
71
79
  private readonly outboxRepository;
72
80
  constructor(outboxRepository: Repository<TypeormOutboxEntity>);
73
- create(options: createOutboxOptions): Promise<void>;
81
+ create(options: CreateOutboxOptions): Promise<void>;
74
82
  }
75
83
  //#endregion
76
- export { InjectTypeormOutboxBroker, InjectTypeormOutboxCronConfig, InjectTypeormOutboxModuleConfig, InjectTypeormOutboxService, TYPEORM_OUTBOX_BROKER_TOKEN, TYPEORM_OUTBOX_CRON_CONFIG_TOKEN, TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN, TYPEORM_OUTBOX_SERVICE_TOKEN, TypeormOutboxController, TypeormOutboxEntity, TypeormOutboxModule, TypeormOutboxModuleAsyncOptions, TypeormOutboxModuleOptions, TypeormOutboxRegisterCronAsyncOptions, TypeormOutboxRegisterCronModuleOptions, TypeormOutboxService };
84
+ export { CreateOutboxOptions, InjectTypeormOutboxBroker, InjectTypeormOutboxCronConfig, InjectTypeormOutboxModuleConfig, InjectTypeormOutboxService, TYPEORM_OUTBOX_BROKER_TOKEN, TYPEORM_OUTBOX_CRON_CONFIG_TOKEN, TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN, TYPEORM_OUTBOX_SERVICE_TOKEN, TypeormOutboxCronService, TypeormOutboxEntity, TypeormOutboxModule, TypeormOutboxModuleAsyncOptions, TypeormOutboxModuleOptions, TypeormOutboxRegisterCronAsyncOptions, TypeormOutboxRegisterCronModuleOptions, TypeormOutboxService };
77
85
  //# sourceMappingURL=index.d.mts.map
package/dist/index.mjs CHANGED
@@ -1,10 +1,11 @@
1
- import { Controller, Inject, Injectable, Module } from "@nestjs/common";
2
- import { Cron, CronExpression, ScheduleModule } from "@nestjs/schedule";
1
+ import { Inject, Injectable, Module } from "@nestjs/common";
3
2
  import { hashStringToInt } from "@globalart/text-utils";
4
3
  import { Column, CreateDateColumn, Entity, EntityManager, PrimaryGeneratedColumn, Repository, UpdateDateColumn } from "typeorm";
5
4
  import { InjectRepository, TypeOrmModule } from "@nestjs/typeorm";
6
5
  import { firstValueFrom } from "rxjs";
7
6
  import { ClientProxy, ClientProxyFactory } from "@nestjs/microservices";
7
+ import { CronJob } from "cron";
8
+ import { CronExpression, ScheduleModule } from "@nestjs/schedule";
8
9
 
9
10
  //#region src/core/typeorm-outbox.di-tokens.ts
10
11
  const TYPEORM_OUTBOX_CRON_CONFIG_TOKEN = Symbol("TYPEORM_OUTBOX_CRON_CONFIG_TOKEN");
@@ -33,7 +34,7 @@ function __decorate(decorators, target, key, desc) {
33
34
 
34
35
  //#endregion
35
36
  //#region src/core/typeorm-outbox.entity.ts
36
- var _ref$2, _ref2$1, _ref3$1, _ref4, _ref5;
37
+ var _ref$2, _ref2$1, _ref3$1, _ref4$1, _ref5;
37
38
  let TypeormOutboxEntity = class TypeormOutboxEntity {
38
39
  id;
39
40
  createdAt;
@@ -48,10 +49,21 @@ __decorate([CreateDateColumn({ name: "created_at" }), __decorateMetadata("design
48
49
  __decorate([UpdateDateColumn({ name: "updated_at" }), __decorateMetadata("design:type", typeof (_ref2$1 = typeof Date !== "undefined" && Date) === "function" ? _ref2$1 : Object)], TypeormOutboxEntity.prototype, "updatedAt", void 0);
49
50
  __decorate([Column("character varying", { name: "destination_topic" }), __decorateMetadata("design:type", String)], TypeormOutboxEntity.prototype, "destinationTopic", void 0);
50
51
  __decorate([Column("jsonb", { nullable: true }), __decorateMetadata("design:type", typeof (_ref3$1 = typeof Record !== "undefined" && Record) === "function" ? _ref3$1 : Object)], TypeormOutboxEntity.prototype, "headers", void 0);
51
- __decorate([Column("jsonb", { nullable: true }), __decorateMetadata("design:type", typeof (_ref4 = typeof Record !== "undefined" && Record) === "function" ? _ref4 : Object)], TypeormOutboxEntity.prototype, "keys", void 0);
52
+ __decorate([Column("jsonb", { nullable: true }), __decorateMetadata("design:type", typeof (_ref4$1 = typeof Record !== "undefined" && Record) === "function" ? _ref4$1 : Object)], TypeormOutboxEntity.prototype, "keys", void 0);
52
53
  __decorate([Column("jsonb"), __decorateMetadata("design:type", typeof (_ref5 = typeof Record !== "undefined" && Record) === "function" ? _ref5 : Object)], TypeormOutboxEntity.prototype, "payload", void 0);
53
54
  TypeormOutboxEntity = __decorate([Entity("outbox")], TypeormOutboxEntity);
54
55
 
56
+ //#endregion
57
+ //#region src/core/typeorm-outbox.interfaces.ts
58
+ var TypeormOutboxRegisterCronModuleOptions = class {
59
+ typeOrmConnectionName = "default";
60
+ kafkaConfig = {};
61
+ cronExpression = CronExpression.EVERY_10_SECONDS;
62
+ };
63
+ var TypeormOutboxModuleOptions = class {
64
+ typeOrmConnectionName = "default";
65
+ };
66
+
55
67
  //#endregion
56
68
  //#region \0@oxc-project+runtime@0.108.0/helpers/decorateParam.js
57
69
  function __decorateParam(paramIndex, decorator) {
@@ -61,16 +73,19 @@ function __decorateParam(paramIndex, decorator) {
61
73
  }
62
74
 
63
75
  //#endregion
64
- //#region src/core/typeorm-outbox.controller.ts
65
- var _ref$1, _ref2, _ref3;
66
- let TypeormOutboxController = class TypeormOutboxController {
67
- constructor(entityManager, outboxRepository, brokerClient) {
76
+ //#region src/core/typeorm-outbox-cron.service.ts
77
+ var _ref$1, _ref2, _ref3, _ref4;
78
+ let TypeormOutboxCronService = class TypeormOutboxCronService {
79
+ constructor(entityManager, outboxRepository, brokerClient, moduleConfig) {
68
80
  this.entityManager = entityManager;
69
81
  this.outboxRepository = outboxRepository;
70
82
  this.brokerClient = brokerClient;
83
+ this.moduleConfig = moduleConfig;
71
84
  }
72
- async handleOutboxCron() {
73
- await this.executeCronJob();
85
+ onModuleInit() {
86
+ new CronJob(this.moduleConfig.cronExpression ?? CronExpression.EVERY_10_SECONDS, () => {
87
+ this.executeCronJob();
88
+ }).start();
74
89
  }
75
90
  async executeCronJob() {
76
91
  const lockId = hashStringToInt("typeorm-outbox-cron-job");
@@ -87,37 +102,18 @@ let TypeormOutboxController = class TypeormOutboxController {
87
102
  }
88
103
  }
89
104
  };
90
- __decorate([
91
- Cron(CronExpression.EVERY_10_SECONDS),
92
- __decorateMetadata("design:type", Function),
93
- __decorateMetadata("design:paramtypes", []),
94
- __decorateMetadata("design:returntype", Promise)
95
- ], TypeormOutboxController.prototype, "handleOutboxCron", null);
96
- TypeormOutboxController = __decorate([
97
- Controller(),
105
+ TypeormOutboxCronService = __decorate([
106
+ Injectable(),
98
107
  __decorateParam(1, InjectRepository(TypeormOutboxEntity)),
99
108
  __decorateParam(2, InjectTypeormOutboxBroker()),
109
+ __decorateParam(3, InjectTypeormOutboxCronConfig()),
100
110
  __decorateMetadata("design:paramtypes", [
101
111
  typeof (_ref$1 = typeof EntityManager !== "undefined" && EntityManager) === "function" ? _ref$1 : Object,
102
112
  typeof (_ref2 = typeof Repository !== "undefined" && Repository) === "function" ? _ref2 : Object,
103
- typeof (_ref3 = typeof ClientProxy !== "undefined" && ClientProxy) === "function" ? _ref3 : Object
113
+ typeof (_ref3 = typeof ClientProxy !== "undefined" && ClientProxy) === "function" ? _ref3 : Object,
114
+ typeof (_ref4 = typeof TypeormOutboxRegisterCronModuleOptions !== "undefined" && TypeormOutboxRegisterCronModuleOptions) === "function" ? _ref4 : Object
104
115
  ])
105
- ], TypeormOutboxController);
106
-
107
- //#endregion
108
- //#region src/core/typeorm-outbox.interfaces.ts
109
- var TypeormOutboxRegisterCronModuleOptions = class {
110
- typeOrmConnectionName = "default";
111
- kafkaConfig = {};
112
- };
113
- var TypeormOutboxModuleOptions = class {
114
- typeOrmConnectionName = "default";
115
- };
116
- var TypeormOutboxModuleAsyncOptions = class {
117
- imports = [];
118
- inject = [];
119
- useFactory;
120
- };
116
+ ], TypeormOutboxCronService);
121
117
 
122
118
  //#endregion
123
119
  //#region src/core/typeorm-outbox.service.ts
@@ -145,22 +141,78 @@ TypeormOutboxService = __decorate([
145
141
  //#region src/core/typeorm-outbox.module.ts
146
142
  var _TypeormOutboxModule;
147
143
  let TypeormOutboxModule = _TypeormOutboxModule = class TypeormOutboxModule {
148
- static forRoot(options = {}) {
149
- const configProvider = {
150
- provide: TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN,
151
- useValue: options
152
- };
153
- const serviceProvider = {
144
+ static createServiceProvider() {
145
+ return {
154
146
  provide: TYPEORM_OUTBOX_SERVICE_TOKEN,
155
147
  useClass: TypeormOutboxService
156
148
  };
157
- const brokerProvider = {
149
+ }
150
+ static createBrokerProvider(useValue = null) {
151
+ return {
158
152
  provide: TYPEORM_OUTBOX_BROKER_TOKEN,
159
- useValue: null
153
+ useValue
154
+ };
155
+ }
156
+ static createTypeOrmFeature(connectionName) {
157
+ return TypeOrmModule.forFeature([TypeormOutboxEntity], connectionName || "default");
158
+ }
159
+ static createModuleConfigProvider(options) {
160
+ return {
161
+ provide: TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN,
162
+ useValue: {
163
+ ...new TypeormOutboxModuleOptions(),
164
+ ...options
165
+ }
160
166
  };
167
+ }
168
+ static createAsyncModuleConfigProvider(options) {
169
+ return {
170
+ provide: TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN,
171
+ useFactory: async (...args) => {
172
+ const moduleOptions = await options.useFactory?.(...args);
173
+ return {
174
+ ...new TypeormOutboxModuleOptions(),
175
+ ...moduleOptions
176
+ };
177
+ },
178
+ inject: options.inject || []
179
+ };
180
+ }
181
+ static createCronConfigProvider(options) {
182
+ return {
183
+ provide: TYPEORM_OUTBOX_CRON_CONFIG_TOKEN,
184
+ useFactory: async (...args) => {
185
+ const moduleOptions = await options.useFactory?.(...args);
186
+ return {
187
+ ...new TypeormOutboxRegisterCronModuleOptions(),
188
+ ...moduleOptions
189
+ };
190
+ },
191
+ inject: options.inject || []
192
+ };
193
+ }
194
+ static createCronBrokerProvider(options) {
195
+ return {
196
+ provide: TYPEORM_OUTBOX_BROKER_TOKEN,
197
+ useFactory: async (...args) => {
198
+ const moduleOptions = await options.useFactory?.(...args);
199
+ const config = {
200
+ ...new TypeormOutboxRegisterCronModuleOptions(),
201
+ ...moduleOptions
202
+ };
203
+ return ClientProxyFactory.create(config?.kafkaConfig ?? {});
204
+ },
205
+ inject: options.inject || []
206
+ };
207
+ }
208
+ static forRoot(options = {}) {
209
+ const configProvider = this.createModuleConfigProvider(options);
210
+ const serviceProvider = this.createServiceProvider();
211
+ const brokerProvider = this.createBrokerProvider();
161
212
  return {
162
213
  module: _TypeormOutboxModule,
163
- imports: [TypeOrmModule.forFeature([TypeormOutboxEntity], options.typeOrmConnectionName)],
214
+ global: true,
215
+ imports: [this.createTypeOrmFeature(options.typeOrmConnectionName)],
164
216
  providers: [
165
217
  configProvider,
166
218
  serviceProvider,
@@ -174,24 +226,13 @@ let TypeormOutboxModule = _TypeormOutboxModule = class TypeormOutboxModule {
174
226
  };
175
227
  }
176
228
  static forRootAsync(options) {
177
- const configProvider = {
178
- provide: TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN,
179
- useFactory: async (...args) => {
180
- return options.useFactory?.(...args);
181
- },
182
- inject: options.inject || []
183
- };
184
- const serviceProvider = {
185
- provide: TYPEORM_OUTBOX_SERVICE_TOKEN,
186
- useClass: TypeormOutboxService
187
- };
188
- const brokerProvider = {
189
- provide: TYPEORM_OUTBOX_BROKER_TOKEN,
190
- useValue: null
191
- };
229
+ const configProvider = this.createAsyncModuleConfigProvider(options);
230
+ const serviceProvider = this.createServiceProvider();
231
+ const brokerProvider = this.createBrokerProvider();
192
232
  return {
193
233
  module: _TypeormOutboxModule,
194
- imports: [TypeOrmModule.forFeature([TypeormOutboxEntity], "default")],
234
+ global: true,
235
+ imports: [this.createTypeOrmFeature()],
195
236
  providers: [
196
237
  configProvider,
197
238
  serviceProvider,
@@ -205,30 +246,16 @@ let TypeormOutboxModule = _TypeormOutboxModule = class TypeormOutboxModule {
205
246
  };
206
247
  }
207
248
  static registerCronAsync(options) {
208
- const configProvider = {
209
- provide: TYPEORM_OUTBOX_CRON_CONFIG_TOKEN,
210
- useFactory: async (...args) => {
211
- return options.useFactory?.(...args);
212
- },
213
- inject: options.inject || []
214
- };
215
- const brokerProvider = {
216
- provide: TYPEORM_OUTBOX_BROKER_TOKEN,
217
- useFactory: async (...args) => {
218
- const moduleOptions = options?.useFactory?.(...args);
219
- return ClientProxyFactory.create(moduleOptions?.kafkaConfig ?? {});
220
- },
221
- inject: options.inject || []
222
- };
223
- const serviceProvider = {
224
- provide: TYPEORM_OUTBOX_SERVICE_TOKEN,
225
- useClass: TypeormOutboxService
226
- };
249
+ const configProvider = this.createCronConfigProvider(options);
250
+ const brokerProvider = this.createCronBrokerProvider(options);
251
+ const serviceProvider = this.createServiceProvider();
252
+ console.log(configProvider);
227
253
  return {
228
254
  module: _TypeormOutboxModule,
229
- imports: [ScheduleModule.forRoot(), TypeOrmModule.forFeature([TypeormOutboxEntity], "default")],
230
- controllers: [TypeormOutboxController],
255
+ global: true,
256
+ imports: [ScheduleModule.forRoot(), this.createTypeOrmFeature()],
231
257
  providers: [
258
+ TypeormOutboxCronService,
232
259
  configProvider,
233
260
  brokerProvider,
234
261
  serviceProvider
@@ -244,5 +271,5 @@ let TypeormOutboxModule = _TypeormOutboxModule = class TypeormOutboxModule {
244
271
  TypeormOutboxModule = _TypeormOutboxModule = __decorate([Module({})], TypeormOutboxModule);
245
272
 
246
273
  //#endregion
247
- export { InjectTypeormOutboxBroker, InjectTypeormOutboxCronConfig, InjectTypeormOutboxModuleConfig, InjectTypeormOutboxService, TYPEORM_OUTBOX_BROKER_TOKEN, TYPEORM_OUTBOX_CRON_CONFIG_TOKEN, TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN, TYPEORM_OUTBOX_SERVICE_TOKEN, TypeormOutboxController, TypeormOutboxEntity, TypeormOutboxModule, TypeormOutboxModuleAsyncOptions, TypeormOutboxModuleOptions, TypeormOutboxRegisterCronModuleOptions, TypeormOutboxService };
274
+ export { InjectTypeormOutboxBroker, InjectTypeormOutboxCronConfig, InjectTypeormOutboxModuleConfig, InjectTypeormOutboxService, TYPEORM_OUTBOX_BROKER_TOKEN, TYPEORM_OUTBOX_CRON_CONFIG_TOKEN, TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN, TYPEORM_OUTBOX_SERVICE_TOKEN, TypeormOutboxCronService, TypeormOutboxEntity, TypeormOutboxModule, TypeormOutboxModuleOptions, TypeormOutboxRegisterCronModuleOptions, TypeormOutboxService };
248
275
  //# sourceMappingURL=index.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../src/core/typeorm-outbox.di-tokens.ts","../src/core/typeorm-outbox.entity.ts","../src/core/typeorm-outbox.controller.ts","../src/core/typeorm-outbox.interfaces.ts","../src/core/typeorm-outbox.service.ts","../src/core/typeorm-outbox.module.ts"],"sourcesContent":["import { Inject } from \"@nestjs/common\";\n\nexport const TYPEORM_OUTBOX_CRON_CONFIG_TOKEN = Symbol(\n \"TYPEORM_OUTBOX_CRON_CONFIG_TOKEN\",\n);\nexport const TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN = Symbol(\n \"TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN\",\n);\nexport const TYPEORM_OUTBOX_SERVICE_TOKEN = Symbol(\n \"TYPEORM_OUTBOX_SERVICE_TOKEN\",\n);\nexport const TYPEORM_OUTBOX_BROKER_TOKEN = Symbol(\n \"TYPEORM_OUTBOX_BROKER_TOKEN\",\n);\n\nexport const InjectTypeormOutboxCronConfig = () =>\n Inject(TYPEORM_OUTBOX_CRON_CONFIG_TOKEN);\nexport const InjectTypeormOutboxModuleConfig = () =>\n Inject(TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN);\nexport const InjectTypeormOutboxService = () =>\n Inject(TYPEORM_OUTBOX_SERVICE_TOKEN);\nexport const InjectTypeormOutboxBroker = () =>\n Inject(TYPEORM_OUTBOX_BROKER_TOKEN);\n","import {\n Column,\n CreateDateColumn,\n Entity,\n PrimaryGeneratedColumn,\n UpdateDateColumn,\n} from \"typeorm\";\n\n@Entity('outbox')\nexport class TypeormOutboxEntity {\n @PrimaryGeneratedColumn()\n id!: number;\n\n @CreateDateColumn({ name: 'created_at' })\n createdAt!: Date;\n\n @UpdateDateColumn({ name: 'updated_at' })\n updatedAt!: Date;\n\n @Column(\"character varying\", { name: 'destination_topic' })\n destinationTopic!: string;\n\n @Column(\"jsonb\", { nullable: true })\n headers!: Record<string, string>;\n\n @Column(\"jsonb\", { nullable: true })\n keys!: Record<any, any>;\n\n @Column(\"jsonb\")\n payload!: Record<string, any>;\n}\n","import { Controller } from \"@nestjs/common\";\nimport { InjectTypeormOutboxBroker } from \"./typeorm-outbox.di-tokens\";\nimport { Cron, CronExpression } from \"@nestjs/schedule\";\nimport { hashStringToInt } from \"@globalart/text-utils\";\nimport { EntityManager, Repository } from \"typeorm\";\nimport { TypeormOutboxEntity } from \"./typeorm-outbox.entity\";\nimport { InjectRepository } from \"@nestjs/typeorm\";\nimport { firstValueFrom } from \"rxjs\";\nimport { ClientProxy } from \"@nestjs/microservices\";\n\n@Controller()\nexport class TypeormOutboxController {\n constructor(\n private readonly entityManager: EntityManager,\n @InjectRepository(TypeormOutboxEntity)\n private readonly outboxRepository: Repository<TypeormOutboxEntity>,\n @InjectTypeormOutboxBroker()\n private readonly brokerClient: ClientProxy,\n ) {}\n\n @Cron(CronExpression.EVERY_10_SECONDS)\n async handleOutboxCron() {\n await this.executeCronJob();\n }\n\n async executeCronJob() {\n const lockId = hashStringToInt(\"typeorm-outbox-cron-job\");\n const [{ pg_try_advisory_xact_lock: acquired }] =\n await this.entityManager.query<{ pg_try_advisory_xact_lock: boolean }[]>(\n `SELECT pg_try_advisory_xact_lock(${lockId})`,\n );\n\n if (!acquired) {\n return;\n }\n const entities = await this.outboxRepository.find();\n \n for (const entity of entities) {\n await firstValueFrom(\n this.brokerClient.emit(entity.destinationTopic, {\n key: entity.keys,\n value: entity.payload,\n headers: entity.headers,\n }),\n );\n await this.outboxRepository.delete(entity.id);\n }\n }\n}\n","import { KafkaOptions } from \"@nestjs/microservices\";\nimport { InjectionToken, ModuleMetadata, Type } from \"@nestjs/common\";\n\n// register cron options\nexport class TypeormOutboxRegisterCronModuleOptions {\n typeOrmConnectionName?: string = \"default\";\n kafkaConfig?: KafkaOptions = {};\n}\nexport interface TypeormOutboxRegisterCronAsyncOptions extends Pick<\n ModuleMetadata,\n \"imports\"\n> {\n inject?: any[];\n useExisting?: Type<TypeormOutboxRegisterCronModuleOptions>;\n useClass?: Type<TypeormOutboxRegisterCronModuleOptions>;\n useFactory?: (\n ...args: any[]\n ) =>\n | Promise<TypeormOutboxRegisterCronModuleOptions>\n | TypeormOutboxRegisterCronModuleOptions;\n}\n\n// register module options\nexport class TypeormOutboxModuleOptions {\n typeOrmConnectionName?: string = \"default\";\n}\nexport class TypeormOutboxModuleAsyncOptions {\n imports?: Type[] = [];\n inject?: InjectionToken[] = [];\n useFactory?: (\n ...args: any[]\n ) => Promise<TypeormOutboxModuleOptions> | TypeormOutboxModuleOptions;\n}\n","import { Injectable } from \"@nestjs/common\";\nimport { InjectRepository } from \"@nestjs/typeorm\";\nimport { TypeormOutboxEntity } from \"./typeorm-outbox.entity\";\nimport { Repository } from \"typeorm\";\n\ntype createOutboxOptions = {\n destinationTopic: string;\n payload: Record<string, any>;\n headers?: Record<string, string>;\n keys?: Record<any, any>;\n};\n\n@Injectable()\nexport class TypeormOutboxService {\n constructor(\n @InjectRepository(TypeormOutboxEntity)\n private readonly outboxRepository: Repository<TypeormOutboxEntity>,\n ) {}\n\n async create(options: createOutboxOptions) {\n await this.outboxRepository.save({\n destinationTopic: options.destinationTopic,\n headers: options.headers,\n keys: options.keys,\n payload: options.payload,\n });\n }\n}\n","import { TypeOrmModule } from \"@nestjs/typeorm\";\nimport { DynamicModule, Module, Provider } from \"@nestjs/common\";\nimport {\n TypeormOutboxRegisterCronAsyncOptions,\n TypeormOutboxRegisterCronModuleOptions,\n TypeormOutboxModuleOptions,\n TypeormOutboxModuleAsyncOptions,\n} from \"./typeorm-outbox.interfaces\";\nimport {\n TYPEORM_OUTBOX_BROKER_TOKEN,\n TYPEORM_OUTBOX_CRON_CONFIG_TOKEN,\n TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN,\n TYPEORM_OUTBOX_SERVICE_TOKEN,\n} from \"./typeorm-outbox.di-tokens\";\nimport { TypeormOutboxEntity } from \"./typeorm-outbox.entity\";\nimport { TypeormOutboxService } from \"./typeorm-outbox.service\";\nimport { TypeormOutboxController } from \"./typeorm-outbox.controller\";\nimport { ScheduleModule } from \"@nestjs/schedule\";\nimport { ClientProxyFactory } from \"@nestjs/microservices\";\n\n@Module({})\nexport class TypeormOutboxModule {\n static forRoot(options: TypeormOutboxModuleOptions = {}): DynamicModule {\n const configProvider: Provider = {\n provide: TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN,\n useValue: options,\n };\n const serviceProvider: Provider = {\n provide: TYPEORM_OUTBOX_SERVICE_TOKEN,\n useClass: TypeormOutboxService,\n };\n const brokerProvider: Provider = {\n provide: TYPEORM_OUTBOX_BROKER_TOKEN,\n useValue: null,\n };\n\n return {\n module: TypeormOutboxModule,\n imports: [\n TypeOrmModule.forFeature(\n [TypeormOutboxEntity],\n options.typeOrmConnectionName,\n ),\n ],\n providers: [configProvider, serviceProvider, brokerProvider],\n exports: [configProvider, serviceProvider, brokerProvider],\n };\n }\n\n static forRootAsync(options: TypeormOutboxModuleAsyncOptions): DynamicModule {\n const configProvider: Provider = {\n provide: TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN,\n useFactory: async (...args: unknown[]) => {\n const moduleOptions = options.useFactory?.(\n ...args,\n ) as TypeormOutboxModuleOptions;\n return moduleOptions;\n },\n inject: options.inject || [],\n };\n const serviceProvider: Provider = {\n provide: TYPEORM_OUTBOX_SERVICE_TOKEN,\n useClass: TypeormOutboxService,\n };\n const brokerProvider: Provider = {\n provide: TYPEORM_OUTBOX_BROKER_TOKEN,\n useValue: null,\n };\n\n return {\n module: TypeormOutboxModule,\n imports: [TypeOrmModule.forFeature([TypeormOutboxEntity], \"default\")],\n providers: [configProvider, serviceProvider, brokerProvider],\n exports: [configProvider, serviceProvider, brokerProvider],\n };\n }\n\n static registerCronAsync(\n options: TypeormOutboxRegisterCronAsyncOptions,\n ): DynamicModule {\n const configProvider: Provider = {\n provide: TYPEORM_OUTBOX_CRON_CONFIG_TOKEN,\n useFactory: async (...args: unknown[]) => {\n const moduleOptions = options.useFactory?.(\n ...args,\n ) as TypeormOutboxRegisterCronModuleOptions;\n return moduleOptions;\n },\n inject: options.inject || [],\n };\n\n const brokerProvider: Provider = {\n provide: TYPEORM_OUTBOX_BROKER_TOKEN,\n useFactory: async (...args: unknown[]) => {\n const moduleOptions = options?.useFactory?.(\n ...args,\n ) as TypeormOutboxRegisterCronModuleOptions;\n return ClientProxyFactory.create(moduleOptions?.kafkaConfig ?? {});\n },\n inject: options.inject || [],\n };\n const serviceProvider: Provider = {\n provide: TYPEORM_OUTBOX_SERVICE_TOKEN,\n useClass: TypeormOutboxService,\n };\n\n return {\n module: TypeormOutboxModule,\n imports: [\n ScheduleModule.forRoot(),\n TypeOrmModule.forFeature([TypeormOutboxEntity], \"default\")\n ],\n controllers: [TypeormOutboxController],\n providers: [configProvider, brokerProvider, serviceProvider],\n exports: [configProvider, brokerProvider, serviceProvider],\n };\n }\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../src/core/typeorm-outbox.di-tokens.ts","../src/core/typeorm-outbox.entity.ts","../src/core/typeorm-outbox.interfaces.ts","../src/core/typeorm-outbox-cron.service.ts","../src/core/typeorm-outbox.service.ts","../src/core/typeorm-outbox.module.ts"],"sourcesContent":["import { Inject } from \"@nestjs/common\";\n\nexport const TYPEORM_OUTBOX_CRON_CONFIG_TOKEN = Symbol(\n \"TYPEORM_OUTBOX_CRON_CONFIG_TOKEN\",\n);\nexport const TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN = Symbol(\n \"TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN\",\n);\nexport const TYPEORM_OUTBOX_SERVICE_TOKEN = Symbol(\n \"TYPEORM_OUTBOX_SERVICE_TOKEN\",\n);\nexport const TYPEORM_OUTBOX_BROKER_TOKEN = Symbol(\n \"TYPEORM_OUTBOX_BROKER_TOKEN\",\n);\n\nexport const InjectTypeormOutboxCronConfig = () =>\n Inject(TYPEORM_OUTBOX_CRON_CONFIG_TOKEN);\nexport const InjectTypeormOutboxModuleConfig = () =>\n Inject(TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN);\nexport const InjectTypeormOutboxService = () =>\n Inject(TYPEORM_OUTBOX_SERVICE_TOKEN);\nexport const InjectTypeormOutboxBroker = () =>\n Inject(TYPEORM_OUTBOX_BROKER_TOKEN);\n","import {\n Column,\n CreateDateColumn,\n Entity,\n PrimaryGeneratedColumn,\n UpdateDateColumn,\n} from \"typeorm\";\n\n@Entity('outbox')\nexport class TypeormOutboxEntity {\n @PrimaryGeneratedColumn()\n id!: number;\n\n @CreateDateColumn({ name: 'created_at' })\n createdAt!: Date;\n\n @UpdateDateColumn({ name: 'updated_at' })\n updatedAt!: Date;\n\n @Column(\"character varying\", { name: 'destination_topic' })\n destinationTopic!: string;\n\n @Column(\"jsonb\", { nullable: true })\n headers!: Record<string, string>;\n\n @Column(\"jsonb\", { nullable: true })\n keys!: Record<string, unknown>;\n\n @Column(\"jsonb\")\n payload!: Record<string, any>;\n}\n","import { KafkaOptions } from \"@nestjs/microservices\";\nimport { InjectionToken, ModuleMetadata, Type } from \"@nestjs/common\";\nimport { CronExpression } from \"@nestjs/schedule\";\n\nexport class TypeormOutboxRegisterCronModuleOptions {\n typeOrmConnectionName?: string = \"default\";\n kafkaConfig?: KafkaOptions = {};\n cronExpression?: string = CronExpression.EVERY_10_SECONDS;\n}\n\nexport interface TypeormOutboxRegisterCronAsyncOptions\n extends Pick<ModuleMetadata, \"imports\"> {\n inject?: InjectionToken[];\n useExisting?: Type<TypeormOutboxRegisterCronModuleOptions>;\n useClass?: Type<TypeormOutboxRegisterCronModuleOptions>;\n useFactory?: (\n ...args: unknown[]\n ) =>\n | Promise<TypeormOutboxRegisterCronModuleOptions>\n | TypeormOutboxRegisterCronModuleOptions;\n}\n\nexport class TypeormOutboxModuleOptions {\n typeOrmConnectionName?: string = \"default\";\n}\n\nexport interface TypeormOutboxModuleAsyncOptions\n extends Pick<ModuleMetadata, \"imports\"> {\n inject?: InjectionToken[];\n useFactory?: (\n ...args: unknown[]\n ) => Promise<TypeormOutboxModuleOptions> | TypeormOutboxModuleOptions;\n}\n","import { Injectable, OnModuleInit } from \"@nestjs/common\";\nimport { InjectTypeormOutboxBroker, InjectTypeormOutboxCronConfig, InjectTypeormOutboxModuleConfig } from \"./typeorm-outbox.di-tokens\";\nimport { hashStringToInt } from \"@globalart/text-utils\";\nimport { EntityManager, Repository } from \"typeorm\";\nimport { TypeormOutboxEntity } from \"./typeorm-outbox.entity\";\nimport { InjectRepository } from \"@nestjs/typeorm\";\nimport { firstValueFrom } from \"rxjs\";\nimport { ClientProxy } from \"@nestjs/microservices\";\nimport { CronJob } from \"cron\";\nimport { TypeormOutboxRegisterCronModuleOptions } from \"./typeorm-outbox.interfaces\";\nimport { CronExpression } from \"@nestjs/schedule\";\n\n@Injectable()\nexport class TypeormOutboxCronService implements OnModuleInit {\n constructor(\n private readonly entityManager: EntityManager,\n @InjectRepository(TypeormOutboxEntity)\n private readonly outboxRepository: Repository<TypeormOutboxEntity>,\n @InjectTypeormOutboxBroker()\n private readonly brokerClient: ClientProxy,\n @InjectTypeormOutboxCronConfig()\n private readonly moduleConfig: TypeormOutboxRegisterCronModuleOptions,\n ) {}\n\n onModuleInit() {\n const cronJob = new CronJob(this.moduleConfig.cronExpression ?? CronExpression.EVERY_10_SECONDS, () => {\n this.executeCronJob();\n });\n cronJob.start();\n }\n\n async executeCronJob() {\n const lockId = hashStringToInt(\"typeorm-outbox-cron-job\");\n const [{ pg_try_advisory_xact_lock: acquired }] =\n await this.entityManager.query<{ pg_try_advisory_xact_lock: boolean }[]>(\n `SELECT pg_try_advisory_xact_lock(${lockId})`,\n );\n if (!acquired) {\n return;\n }\n\n const entities = await this.outboxRepository.find();\n \n for (const entity of entities) {\n await firstValueFrom(\n this.brokerClient.emit(entity.destinationTopic, {\n key: entity.keys,\n value: entity.payload,\n headers: entity.headers,\n }),\n );\n await this.outboxRepository.delete(entity.id);\n }\n }\n}\n","import { Injectable } from \"@nestjs/common\";\nimport { InjectRepository } from \"@nestjs/typeorm\";\nimport { TypeormOutboxEntity } from \"./typeorm-outbox.entity\";\nimport { Repository } from \"typeorm\";\n\nexport interface CreateOutboxOptions {\n destinationTopic: string;\n payload: Record<string, unknown>;\n headers?: Record<string, string>;\n keys?: Record<string, unknown>;\n}\n\n@Injectable()\nexport class TypeormOutboxService {\n constructor(\n @InjectRepository(TypeormOutboxEntity)\n private readonly outboxRepository: Repository<TypeormOutboxEntity>,\n ) {}\n\n async create(options: CreateOutboxOptions): Promise<void> {\n await this.outboxRepository.save({\n destinationTopic: options.destinationTopic,\n headers: options.headers,\n keys: options.keys,\n payload: options.payload,\n });\n }\n}\n","import { TypeOrmModule } from \"@nestjs/typeorm\";\nimport { DynamicModule, Module, Provider } from \"@nestjs/common\";\nimport {\n TypeormOutboxRegisterCronAsyncOptions,\n TypeormOutboxRegisterCronModuleOptions,\n TypeormOutboxModuleOptions,\n TypeormOutboxModuleAsyncOptions,\n} from \"./typeorm-outbox.interfaces\";\nimport {\n TYPEORM_OUTBOX_BROKER_TOKEN,\n TYPEORM_OUTBOX_CRON_CONFIG_TOKEN,\n TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN,\n TYPEORM_OUTBOX_SERVICE_TOKEN,\n} from \"./typeorm-outbox.di-tokens\";\nimport { TypeormOutboxEntity } from \"./typeorm-outbox.entity\";\nimport { TypeormOutboxService } from \"./typeorm-outbox.service\";\nimport { ScheduleModule } from \"@nestjs/schedule\";\nimport { ClientProxyFactory } from \"@nestjs/microservices\";\nimport { TypeormOutboxCronService } from \"./typeorm-outbox-cron.service\";\n\n@Module({})\nexport class TypeormOutboxModule {\n private static createServiceProvider(): Provider {\n return {\n provide: TYPEORM_OUTBOX_SERVICE_TOKEN,\n useClass: TypeormOutboxService,\n };\n }\n\n private static createBrokerProvider(useValue: unknown = null): Provider {\n return {\n provide: TYPEORM_OUTBOX_BROKER_TOKEN,\n useValue,\n };\n }\n\n private static createTypeOrmFeature(connectionName?: string) {\n return TypeOrmModule.forFeature(\n [TypeormOutboxEntity],\n connectionName || \"default\",\n );\n }\n\n private static createModuleConfigProvider(\n options: TypeormOutboxModuleOptions,\n ): Provider {\n return {\n provide: TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN,\n useValue: {\n ...new TypeormOutboxModuleOptions(),\n ...options,\n },\n };\n }\n\n private static createAsyncModuleConfigProvider(\n options: TypeormOutboxModuleAsyncOptions,\n ): Provider {\n return {\n provide: TYPEORM_OUTBOX_MODULE_CONFIG_TOKEN,\n useFactory: async (...args: unknown[]) => {\n const moduleOptions = (await options.useFactory?.(...args)) as\n | TypeormOutboxModuleOptions;\n \n return {\n ...new TypeormOutboxModuleOptions(),\n ...moduleOptions,\n };\n },\n inject: options.inject || [],\n };\n }\n\n private static createCronConfigProvider(\n options: TypeormOutboxRegisterCronAsyncOptions,\n ): Provider {\n return {\n provide: TYPEORM_OUTBOX_CRON_CONFIG_TOKEN,\n useFactory: async (...args: unknown[]) => {\n const moduleOptions = await options.useFactory?.(...args);\n return {\n ...new TypeormOutboxRegisterCronModuleOptions(),\n ...moduleOptions,\n };\n },\n inject: options.inject || [],\n };\n }\n\n private static createCronBrokerProvider(\n options: TypeormOutboxRegisterCronAsyncOptions,\n ): Provider {\n return {\n provide: TYPEORM_OUTBOX_BROKER_TOKEN,\n useFactory: async (...args: unknown[]) => {\n const moduleOptions = await options.useFactory?.(...args);\n const config = {\n ...new TypeormOutboxRegisterCronModuleOptions(),\n ...moduleOptions,\n };\n return ClientProxyFactory.create(config?.kafkaConfig ?? {});\n },\n inject: options.inject || [],\n };\n }\n\n static forRoot(options: TypeormOutboxModuleOptions = {}): DynamicModule {\n const configProvider = this.createModuleConfigProvider(options);\n const serviceProvider = this.createServiceProvider();\n const brokerProvider = this.createBrokerProvider();\n\n return {\n module: TypeormOutboxModule,\n global: true,\n imports: [this.createTypeOrmFeature(options.typeOrmConnectionName)],\n providers: [configProvider, serviceProvider, brokerProvider],\n exports: [configProvider, serviceProvider, brokerProvider],\n };\n }\n\n static forRootAsync(\n options: TypeormOutboxModuleAsyncOptions,\n ): DynamicModule {\n const configProvider = this.createAsyncModuleConfigProvider(options);\n const serviceProvider = this.createServiceProvider();\n const brokerProvider = this.createBrokerProvider();\n\n return {\n module: TypeormOutboxModule,\n global: true,\n imports: [this.createTypeOrmFeature()],\n providers: [configProvider, serviceProvider, brokerProvider],\n exports: [configProvider, serviceProvider, brokerProvider],\n };\n }\n\n static registerCronAsync(\n options: TypeormOutboxRegisterCronAsyncOptions,\n ): DynamicModule {\n const configProvider = this.createCronConfigProvider(options);\n const brokerProvider = this.createCronBrokerProvider(options);\n const serviceProvider = this.createServiceProvider();\n console.log(configProvider);\n\n return {\n module: TypeormOutboxModule,\n global: true,\n imports: [\n ScheduleModule.forRoot(),\n this.createTypeOrmFeature(),\n ],\n providers: [\n TypeormOutboxCronService,\n configProvider,\n brokerProvider,\n serviceProvider,\n ],\n exports: [configProvider, brokerProvider, serviceProvider],\n };\n }\n}\n"],"mappings":"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"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@globalart/nestjs-typeorm-outbox",
3
3
  "description": "TypeORM Outbox integration for NestJS",
4
- "version": "1.0.1",
4
+ "version": "1.0.3",
5
5
  "type": "module",
6
6
  "main": "dist/index.mjs",
7
7
  "module": "dist/index.mjs",