@globalart/nestjs-typeorm-outbox 1.0.5 → 1.0.7

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,11 +1,10 @@
1
1
  let _nestjs_common = require("@nestjs/common");
2
2
  let _globalart_text_utils = require("@globalart/text-utils");
3
3
  let typeorm = require("typeorm");
4
- let _nestjs_typeorm = require("@nestjs/typeorm");
5
4
  let rxjs = require("rxjs");
6
5
  let _nestjs_microservices = require("@nestjs/microservices");
7
6
  let cron = require("cron");
8
- let _nestjs_schedule = require("@nestjs/schedule");
7
+ let _nestjs_typeorm = require("@nestjs/typeorm");
9
8
 
10
9
  //#region src/core/typeorm-outbox.di-tokens.ts
11
10
  const TYPEORM_OUTBOX_CRON_CONFIG_TOKEN = Symbol("TYPEORM_OUTBOX_CRON_CONFIG_TOKEN");
@@ -18,13 +17,13 @@ const InjectTypeormOutboxService = () => (0, _nestjs_common.Inject)(TYPEORM_OUTB
18
17
  const InjectTypeormOutboxBroker = () => (0, _nestjs_common.Inject)(TYPEORM_OUTBOX_BROKER_TOKEN);
19
18
 
20
19
  //#endregion
21
- //#region \0@oxc-project+runtime@0.108.0/helpers/decorateMetadata.js
20
+ //#region \0@oxc-project+runtime@0.110.0/helpers/decorateMetadata.js
22
21
  function __decorateMetadata(k, v) {
23
22
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
24
23
  }
25
24
 
26
25
  //#endregion
27
- //#region \0@oxc-project+runtime@0.108.0/helpers/decorate.js
26
+ //#region \0@oxc-project+runtime@0.110.0/helpers/decorate.js
28
27
  function __decorate(decorators, target, key, desc) {
29
28
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
30
29
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
@@ -34,7 +33,7 @@ function __decorate(decorators, target, key, desc) {
34
33
 
35
34
  //#endregion
36
35
  //#region src/core/typeorm-outbox.entity.ts
37
- var _ref$2, _ref2$1, _ref3$1, _ref4$1, _ref5;
36
+ var _ref$2, _ref2$1, _ref3$1, _ref4, _ref5;
38
37
  let TypeormOutboxEntity = class TypeormOutboxEntity {
39
38
  id;
40
39
  createdAt;
@@ -49,23 +48,89 @@ __decorate([(0, typeorm.CreateDateColumn)({ name: "created_at" }), __decorateMet
49
48
  __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);
50
49
  __decorate([(0, typeorm.Column)("character varying", { name: "destination_topic" }), __decorateMetadata("design:type", String)], TypeormOutboxEntity.prototype, "destinationTopic", void 0);
51
50
  __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);
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);
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);
53
52
  __decorate([(0, typeorm.Column)("jsonb"), __decorateMetadata("design:type", typeof (_ref5 = typeof Record !== "undefined" && Record) === "function" ? _ref5 : Object)], TypeormOutboxEntity.prototype, "payload", void 0);
54
53
  TypeormOutboxEntity = __decorate([(0, typeorm.Entity)("outbox")], TypeormOutboxEntity);
55
54
 
55
+ //#endregion
56
+ //#region src/core/typeorm-outbox.enums.ts
57
+ let CronExpression = /* @__PURE__ */ function(CronExpression) {
58
+ CronExpression["EVERY_1_SECOND"] = "* * * * * *";
59
+ CronExpression["EVERY_2_SECONDS"] = "*/2 * * * * *";
60
+ CronExpression["EVERY_3_SECONDS"] = "*/3 * * * * *";
61
+ CronExpression["EVERY_4_SECONDS"] = "*/4 * * * * *";
62
+ CronExpression["EVERY_5_SECONDS"] = "*/5 * * * * *";
63
+ CronExpression["EVERY_6_SECONDS"] = "*/6 * * * * *";
64
+ CronExpression["EVERY_7_SECONDS"] = "*/7 * * * * *";
65
+ CronExpression["EVERY_8_SECONDS"] = "*/8 * * * * *";
66
+ CronExpression["EVERY_9_SECONDS"] = "*/9 * * * * *";
67
+ CronExpression["EVERY_10_SECONDS"] = "*/10 * * * * *";
68
+ CronExpression["EVERY_11_SECONDS"] = "*/11 * * * * *";
69
+ CronExpression["EVERY_12_SECONDS"] = "*/12 * * * * *";
70
+ CronExpression["EVERY_13_SECONDS"] = "*/13 * * * * *";
71
+ CronExpression["EVERY_14_SECONDS"] = "*/14 * * * * *";
72
+ CronExpression["EVERY_15_SECONDS"] = "*/15 * * * * *";
73
+ CronExpression["EVERY_16_SECONDS"] = "*/16 * * * * *";
74
+ CronExpression["EVERY_17_SECONDS"] = "*/17 * * * * *";
75
+ CronExpression["EVERY_18_SECONDS"] = "*/18 * * * * *";
76
+ CronExpression["EVERY_19_SECONDS"] = "*/19 * * * * *";
77
+ CronExpression["EVERY_20_SECONDS"] = "*/20 * * * * *";
78
+ CronExpression["EVERY_21_SECONDS"] = "*/21 * * * * *";
79
+ CronExpression["EVERY_22_SECONDS"] = "*/22 * * * * *";
80
+ CronExpression["EVERY_23_SECONDS"] = "*/23 * * * * *";
81
+ CronExpression["EVERY_24_SECONDS"] = "*/24 * * * * *";
82
+ CronExpression["EVERY_25_SECONDS"] = "*/25 * * * * *";
83
+ CronExpression["EVERY_26_SECONDS"] = "*/26 * * * * *";
84
+ CronExpression["EVERY_27_SECONDS"] = "*/27 * * * * *";
85
+ CronExpression["EVERY_28_SECONDS"] = "*/28 * * * * *";
86
+ CronExpression["EVERY_29_SECONDS"] = "*/29 * * * * *";
87
+ CronExpression["EVERY_30_SECONDS"] = "*/30 * * * * *";
88
+ CronExpression["EVERY_31_SECONDS"] = "*/31 * * * * *";
89
+ CronExpression["EVERY_32_SECONDS"] = "*/32 * * * * *";
90
+ CronExpression["EVERY_33_SECONDS"] = "*/33 * * * * *";
91
+ CronExpression["EVERY_34_SECONDS"] = "*/34 * * * * *";
92
+ CronExpression["EVERY_35_SECONDS"] = "*/35 * * * * *";
93
+ CronExpression["EVERY_36_SECONDS"] = "*/36 * * * * *";
94
+ CronExpression["EVERY_37_SECONDS"] = "*/37 * * * * *";
95
+ CronExpression["EVERY_38_SECONDS"] = "*/38 * * * * *";
96
+ CronExpression["EVERY_39_SECONDS"] = "*/39 * * * * *";
97
+ CronExpression["EVERY_40_SECONDS"] = "*/40 * * * * *";
98
+ CronExpression["EVERY_41_SECONDS"] = "*/41 * * * * *";
99
+ CronExpression["EVERY_42_SECONDS"] = "*/42 * * * * *";
100
+ CronExpression["EVERY_43_SECONDS"] = "*/43 * * * * *";
101
+ CronExpression["EVERY_44_SECONDS"] = "*/44 * * * * *";
102
+ CronExpression["EVERY_45_SECONDS"] = "*/45 * * * * *";
103
+ CronExpression["EVERY_46_SECONDS"] = "*/46 * * * * *";
104
+ CronExpression["EVERY_47_SECONDS"] = "*/47 * * * * *";
105
+ CronExpression["EVERY_48_SECONDS"] = "*/48 * * * * *";
106
+ CronExpression["EVERY_49_SECONDS"] = "*/49 * * * * *";
107
+ CronExpression["EVERY_50_SECONDS"] = "*/50 * * * * *";
108
+ CronExpression["EVERY_51_SECONDS"] = "*/51 * * * * *";
109
+ CronExpression["EVERY_52_SECONDS"] = "*/52 * * * * *";
110
+ CronExpression["EVERY_53_SECONDS"] = "*/53 * * * * *";
111
+ CronExpression["EVERY_54_SECONDS"] = "*/54 * * * * *";
112
+ CronExpression["EVERY_55_SECONDS"] = "*/55 * * * * *";
113
+ CronExpression["EVERY_56_SECONDS"] = "*/56 * * * * *";
114
+ CronExpression["EVERY_57_SECONDS"] = "*/57 * * * * *";
115
+ CronExpression["EVERY_58_SECONDS"] = "*/58 * * * * *";
116
+ CronExpression["EVERY_59_SECONDS"] = "*/59 * * * * *";
117
+ CronExpression["EVERY_MINUTE"] = "0 * * * * *";
118
+ return CronExpression;
119
+ }({});
120
+
56
121
  //#endregion
57
122
  //#region src/core/typeorm-outbox.interfaces.ts
58
123
  var TypeormOutboxRegisterCronModuleOptions = class {
59
124
  typeOrmConnectionName = "default";
60
125
  kafkaConfig = {};
61
- cronExpression = _nestjs_schedule.CronExpression.EVERY_10_SECONDS;
126
+ cronExpression = CronExpression.EVERY_10_SECONDS;
62
127
  };
63
128
  var TypeormOutboxModuleOptions = class {
64
129
  typeOrmConnectionName = "default";
65
130
  };
66
131
 
67
132
  //#endregion
68
- //#region \0@oxc-project+runtime@0.108.0/helpers/decorateParam.js
133
+ //#region \0@oxc-project+runtime@0.110.0/helpers/decorateParam.js
69
134
  function __decorateParam(paramIndex, decorator) {
70
135
  return function(target, key) {
71
136
  decorator(target, key, paramIndex);
@@ -74,44 +139,55 @@ function __decorateParam(paramIndex, decorator) {
74
139
 
75
140
  //#endregion
76
141
  //#region src/core/typeorm-outbox-cron.service.ts
77
- var _ref$1, _ref2, _ref3, _ref4;
142
+ var _ref$1, _ref2, _ref3;
78
143
  let TypeormOutboxCronService = class TypeormOutboxCronService {
79
- constructor(entityManager, outboxRepository, brokerClient, moduleConfig) {
80
- this.entityManager = entityManager;
81
- this.outboxRepository = outboxRepository;
144
+ constructor(brokerClient, moduleConfig, dataSource) {
82
145
  this.brokerClient = brokerClient;
83
146
  this.moduleConfig = moduleConfig;
147
+ this.dataSource = dataSource;
84
148
  }
85
149
  onModuleInit() {
86
- new cron.CronJob(this.moduleConfig.cronExpression ?? _nestjs_schedule.CronExpression.EVERY_10_SECONDS, () => {
150
+ new cron.CronJob(this.moduleConfig.cronExpression ?? CronExpression.EVERY_10_SECONDS, () => {
87
151
  this.executeCronJob();
88
152
  }).start();
89
153
  }
90
154
  async executeCronJob() {
91
- const lockId = (0, _globalart_text_utils.hashStringToInt)("typeorm-outbox-cron-job");
92
- const [{ pg_try_advisory_xact_lock: acquired }] = await this.entityManager.query(`SELECT pg_try_advisory_xact_lock(${lockId})`);
93
- if (!acquired) return;
94
- const entities = await this.outboxRepository.find();
95
- for (const entity of entities) {
96
- await (0, rxjs.firstValueFrom)(this.brokerClient.emit(entity.destinationTopic, {
97
- key: entity.keys,
98
- value: entity.payload,
99
- headers: entity.headers
100
- }));
101
- await this.outboxRepository.delete(entity.id);
155
+ const queryRunner = this.dataSource.createQueryRunner();
156
+ await queryRunner.connect();
157
+ const lockKey = (0, _globalart_text_utils.hashStringToInt)("typeorm-outbox-cron-lock");
158
+ try {
159
+ if (!(await queryRunner.query("SELECT pg_try_advisory_lock($1) as locked", [lockKey]))[0].locked) return;
160
+ try {
161
+ await queryRunner.startTransaction("REPEATABLE READ");
162
+ const entities = await queryRunner.manager.find(TypeormOutboxEntity);
163
+ for (const entity of entities) {
164
+ await (0, rxjs.firstValueFrom)(this.brokerClient.emit(entity.destinationTopic, {
165
+ key: entity.keys,
166
+ value: entity.payload,
167
+ headers: entity.headers
168
+ }));
169
+ await queryRunner.manager.delete(TypeormOutboxEntity, entity.id);
170
+ }
171
+ await queryRunner.commitTransaction();
172
+ } catch (error) {
173
+ await queryRunner.rollbackTransaction();
174
+ throw error;
175
+ } finally {
176
+ await queryRunner.query("SELECT pg_advisory_unlock($1)", [lockKey]);
177
+ }
178
+ } finally {
179
+ await queryRunner.release();
102
180
  }
103
181
  }
104
182
  };
105
183
  TypeormOutboxCronService = __decorate([
106
184
  (0, _nestjs_common.Injectable)(),
107
- __decorateParam(1, (0, _nestjs_typeorm.InjectRepository)(TypeormOutboxEntity)),
108
- __decorateParam(2, InjectTypeormOutboxBroker()),
109
- __decorateParam(3, InjectTypeormOutboxCronConfig()),
185
+ __decorateParam(0, InjectTypeormOutboxBroker()),
186
+ __decorateParam(1, InjectTypeormOutboxCronConfig()),
110
187
  __decorateMetadata("design:paramtypes", [
111
- typeof (_ref$1 = typeof typeorm.EntityManager !== "undefined" && typeorm.EntityManager) === "function" ? _ref$1 : Object,
112
- typeof (_ref2 = typeof typeorm.Repository !== "undefined" && typeorm.Repository) === "function" ? _ref2 : 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
188
+ typeof (_ref$1 = typeof _nestjs_microservices.ClientProxy !== "undefined" && _nestjs_microservices.ClientProxy) === "function" ? _ref$1 : Object,
189
+ typeof (_ref2 = typeof TypeormOutboxRegisterCronModuleOptions !== "undefined" && TypeormOutboxRegisterCronModuleOptions) === "function" ? _ref2 : Object,
190
+ typeof (_ref3 = typeof typeorm.DataSource !== "undefined" && typeorm.DataSource) === "function" ? _ref3 : Object
115
191
  ])
116
192
  ], TypeormOutboxCronService);
117
193
 
@@ -252,7 +328,7 @@ let TypeormOutboxModule = _TypeormOutboxModule = class TypeormOutboxModule {
252
328
  return {
253
329
  module: _TypeormOutboxModule,
254
330
  global: true,
255
- imports: [_nestjs_schedule.ScheduleModule.forRoot(), this.createTypeOrmFeature()],
331
+ imports: [this.createTypeOrmFeature()],
256
332
  providers: [
257
333
  TypeormOutboxCronService,
258
334
  configProvider,
@@ -270,6 +346,7 @@ let TypeormOutboxModule = _TypeormOutboxModule = class TypeormOutboxModule {
270
346
  TypeormOutboxModule = _TypeormOutboxModule = __decorate([(0, _nestjs_common.Module)({})], TypeormOutboxModule);
271
347
 
272
348
  //#endregion
349
+ exports.CronExpression = CronExpression;
273
350
  exports.InjectTypeormOutboxBroker = InjectTypeormOutboxBroker;
274
351
  exports.InjectTypeormOutboxCronConfig = InjectTypeormOutboxCronConfig;
275
352
  exports.InjectTypeormOutboxModuleConfig = InjectTypeormOutboxModuleConfig;
@@ -1 +1 @@
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<TypeormOutboxEntity> {\n return 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\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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"}
1
+ {"version":3,"file":"index.cjs","names":["CronJob","TypeOrmModule","ClientProxyFactory"],"sources":["../src/core/typeorm-outbox.di-tokens.ts","../src/core/typeorm-outbox.entity.ts","../src/core/typeorm-outbox.enums.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","export enum CronExpression {\n EVERY_1_SECOND = \"* * * * * *\",\n EVERY_2_SECONDS = \"*/2 * * * * *\",\n EVERY_3_SECONDS = \"*/3 * * * * *\",\n EVERY_4_SECONDS = \"*/4 * * * * *\",\n EVERY_5_SECONDS = \"*/5 * * * * *\",\n EVERY_6_SECONDS = \"*/6 * * * * *\",\n EVERY_7_SECONDS = \"*/7 * * * * *\",\n EVERY_8_SECONDS = \"*/8 * * * * *\",\n EVERY_9_SECONDS = \"*/9 * * * * *\",\n EVERY_10_SECONDS = \"*/10 * * * * *\",\n EVERY_11_SECONDS = \"*/11 * * * * *\",\n EVERY_12_SECONDS = \"*/12 * * * * *\",\n EVERY_13_SECONDS = \"*/13 * * * * *\",\n EVERY_14_SECONDS = \"*/14 * * * * *\",\n EVERY_15_SECONDS = \"*/15 * * * * *\",\n EVERY_16_SECONDS = \"*/16 * * * * *\",\n EVERY_17_SECONDS = \"*/17 * * * * *\",\n EVERY_18_SECONDS = \"*/18 * * * * *\",\n EVERY_19_SECONDS = \"*/19 * * * * *\",\n EVERY_20_SECONDS = \"*/20 * * * * *\",\n EVERY_21_SECONDS = \"*/21 * * * * *\",\n EVERY_22_SECONDS = \"*/22 * * * * *\",\n EVERY_23_SECONDS = \"*/23 * * * * *\",\n EVERY_24_SECONDS = \"*/24 * * * * *\",\n EVERY_25_SECONDS = \"*/25 * * * * *\",\n EVERY_26_SECONDS = \"*/26 * * * * *\",\n EVERY_27_SECONDS = \"*/27 * * * * *\",\n EVERY_28_SECONDS = \"*/28 * * * * *\",\n EVERY_29_SECONDS = \"*/29 * * * * *\",\n EVERY_30_SECONDS = \"*/30 * * * * *\",\n EVERY_31_SECONDS = \"*/31 * * * * *\",\n EVERY_32_SECONDS = \"*/32 * * * * *\",\n EVERY_33_SECONDS = \"*/33 * * * * *\",\n EVERY_34_SECONDS = \"*/34 * * * * *\",\n EVERY_35_SECONDS = \"*/35 * * * * *\",\n EVERY_36_SECONDS = \"*/36 * * * * *\",\n EVERY_37_SECONDS = \"*/37 * * * * *\",\n EVERY_38_SECONDS = \"*/38 * * * * *\",\n EVERY_39_SECONDS = \"*/39 * * * * *\",\n EVERY_40_SECONDS = \"*/40 * * * * *\",\n EVERY_41_SECONDS = \"*/41 * * * * *\",\n EVERY_42_SECONDS = \"*/42 * * * * *\",\n EVERY_43_SECONDS = \"*/43 * * * * *\",\n EVERY_44_SECONDS = \"*/44 * * * * *\",\n EVERY_45_SECONDS = \"*/45 * * * * *\",\n EVERY_46_SECONDS = \"*/46 * * * * *\",\n EVERY_47_SECONDS = \"*/47 * * * * *\",\n EVERY_48_SECONDS = \"*/48 * * * * *\",\n EVERY_49_SECONDS = \"*/49 * * * * *\",\n EVERY_50_SECONDS = \"*/50 * * * * *\",\n EVERY_51_SECONDS = \"*/51 * * * * *\",\n EVERY_52_SECONDS = \"*/52 * * * * *\",\n EVERY_53_SECONDS = \"*/53 * * * * *\",\n EVERY_54_SECONDS = \"*/54 * * * * *\",\n EVERY_55_SECONDS = \"*/55 * * * * *\",\n EVERY_56_SECONDS = \"*/56 * * * * *\",\n EVERY_57_SECONDS = \"*/57 * * * * *\",\n EVERY_58_SECONDS = \"*/58 * * * * *\",\n EVERY_59_SECONDS = \"*/59 * * * * *\",\n EVERY_MINUTE = \"0 * * * * *\",\n}","import { KafkaOptions } from \"@nestjs/microservices\";\nimport { InjectionToken, ModuleMetadata, Type } from \"@nestjs/common\";\nimport { CronExpression } from \"./typeorm-outbox.enums\";\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 { TypeormOutboxEntity } from \"./typeorm-outbox.entity\";\nimport { firstValueFrom } from \"rxjs\";\nimport { ClientProxy } from \"@nestjs/microservices\";\nimport { CronJob } from \"cron\";\nimport { TypeormOutboxRegisterCronModuleOptions } from \"./typeorm-outbox.interfaces\";\nimport { DataSource } from \"typeorm\";\nimport { CronExpression } from \"./typeorm-outbox.enums\";\n\n@Injectable()\nexport class TypeormOutboxCronService implements OnModuleInit {\n constructor(\n @InjectTypeormOutboxBroker()\n private readonly brokerClient: ClientProxy,\n @InjectTypeormOutboxCronConfig()\n private readonly moduleConfig: TypeormOutboxRegisterCronModuleOptions,\n private readonly dataSource: DataSource,\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 queryRunner = this.dataSource.createQueryRunner();\n await queryRunner.connect();\n const lockKey = hashStringToInt('typeorm-outbox-cron-lock');\n\n try {\n const lockResult = await queryRunner.query(\n 'SELECT pg_try_advisory_lock($1) as locked',\n [lockKey],\n );\n\n if (!lockResult[0].locked) {\n return;\n }\n try {\n await queryRunner.startTransaction('REPEATABLE READ');\n \n const entities = await queryRunner.manager.find(TypeormOutboxEntity);\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 queryRunner.manager.delete(TypeormOutboxEntity, entity.id);\n }\n\n await queryRunner.commitTransaction();\n } catch (error) {\n await queryRunner.rollbackTransaction();\n throw error;\n } finally {\n await queryRunner.query('SELECT pg_advisory_unlock($1)', [lockKey]);\n }\n } finally {\n await queryRunner.release();\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<TypeormOutboxEntity> {\n return 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 { 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\n return {\n module: TypeormOutboxModule,\n global: true,\n imports: [\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,18 +1,7 @@
1
1
  import { DynamicModule, InjectionToken, ModuleMetadata, OnModuleInit, Type } from "@nestjs/common";
2
- import { EntityManager, Repository } from "typeorm";
3
2
  import { ClientProxy, KafkaOptions } from "@nestjs/microservices";
3
+ import { DataSource, Repository } from "typeorm";
4
4
 
5
- //#region src/core/typeorm-outbox.entity.d.ts
6
- declare class TypeormOutboxEntity {
7
- id: number;
8
- createdAt: Date;
9
- updatedAt: Date;
10
- destinationTopic: string;
11
- headers: Record<string, string>;
12
- keys: Record<string, unknown>;
13
- payload: Record<string, any>;
14
- }
15
- //#endregion
16
5
  //#region src/core/typeorm-outbox.interfaces.d.ts
17
6
  declare class TypeormOutboxRegisterCronModuleOptions {
18
7
  typeOrmConnectionName?: string;
@@ -35,11 +24,10 @@ interface TypeormOutboxModuleAsyncOptions extends Pick<ModuleMetadata, "imports"
35
24
  //#endregion
36
25
  //#region src/core/typeorm-outbox-cron.service.d.ts
37
26
  declare class TypeormOutboxCronService implements OnModuleInit {
38
- private readonly entityManager;
39
- private readonly outboxRepository;
40
27
  private readonly brokerClient;
41
28
  private readonly moduleConfig;
42
- constructor(entityManager: EntityManager, outboxRepository: Repository<TypeormOutboxEntity>, brokerClient: ClientProxy, moduleConfig: TypeormOutboxRegisterCronModuleOptions);
29
+ private readonly dataSource;
30
+ constructor(brokerClient: ClientProxy, moduleConfig: TypeormOutboxRegisterCronModuleOptions, dataSource: DataSource);
43
31
  onModuleInit(): void;
44
32
  executeCronJob(): Promise<void>;
45
33
  }
@@ -54,6 +42,17 @@ declare const InjectTypeormOutboxModuleConfig: () => PropertyDecorator & Paramet
54
42
  declare const InjectTypeormOutboxService: () => PropertyDecorator & ParameterDecorator;
55
43
  declare const InjectTypeormOutboxBroker: () => PropertyDecorator & ParameterDecorator;
56
44
  //#endregion
45
+ //#region src/core/typeorm-outbox.entity.d.ts
46
+ declare class TypeormOutboxEntity {
47
+ id: number;
48
+ createdAt: Date;
49
+ updatedAt: Date;
50
+ destinationTopic: string;
51
+ headers: Record<string, string>;
52
+ keys: Record<string, unknown>;
53
+ payload: Record<string, any>;
54
+ }
55
+ //#endregion
57
56
  //#region src/core/typeorm-outbox.module.d.ts
58
57
  declare class TypeormOutboxModule {
59
58
  private static createServiceProvider;
@@ -81,5 +80,69 @@ declare class TypeormOutboxService {
81
80
  create(options: CreateOutboxOptions): Promise<TypeormOutboxEntity>;
82
81
  }
83
82
  //#endregion
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 };
83
+ //#region src/core/typeorm-outbox.enums.d.ts
84
+ declare enum CronExpression {
85
+ EVERY_1_SECOND = "* * * * * *",
86
+ EVERY_2_SECONDS = "*/2 * * * * *",
87
+ EVERY_3_SECONDS = "*/3 * * * * *",
88
+ EVERY_4_SECONDS = "*/4 * * * * *",
89
+ EVERY_5_SECONDS = "*/5 * * * * *",
90
+ EVERY_6_SECONDS = "*/6 * * * * *",
91
+ EVERY_7_SECONDS = "*/7 * * * * *",
92
+ EVERY_8_SECONDS = "*/8 * * * * *",
93
+ EVERY_9_SECONDS = "*/9 * * * * *",
94
+ EVERY_10_SECONDS = "*/10 * * * * *",
95
+ EVERY_11_SECONDS = "*/11 * * * * *",
96
+ EVERY_12_SECONDS = "*/12 * * * * *",
97
+ EVERY_13_SECONDS = "*/13 * * * * *",
98
+ EVERY_14_SECONDS = "*/14 * * * * *",
99
+ EVERY_15_SECONDS = "*/15 * * * * *",
100
+ EVERY_16_SECONDS = "*/16 * * * * *",
101
+ EVERY_17_SECONDS = "*/17 * * * * *",
102
+ EVERY_18_SECONDS = "*/18 * * * * *",
103
+ EVERY_19_SECONDS = "*/19 * * * * *",
104
+ EVERY_20_SECONDS = "*/20 * * * * *",
105
+ EVERY_21_SECONDS = "*/21 * * * * *",
106
+ EVERY_22_SECONDS = "*/22 * * * * *",
107
+ EVERY_23_SECONDS = "*/23 * * * * *",
108
+ EVERY_24_SECONDS = "*/24 * * * * *",
109
+ EVERY_25_SECONDS = "*/25 * * * * *",
110
+ EVERY_26_SECONDS = "*/26 * * * * *",
111
+ EVERY_27_SECONDS = "*/27 * * * * *",
112
+ EVERY_28_SECONDS = "*/28 * * * * *",
113
+ EVERY_29_SECONDS = "*/29 * * * * *",
114
+ EVERY_30_SECONDS = "*/30 * * * * *",
115
+ EVERY_31_SECONDS = "*/31 * * * * *",
116
+ EVERY_32_SECONDS = "*/32 * * * * *",
117
+ EVERY_33_SECONDS = "*/33 * * * * *",
118
+ EVERY_34_SECONDS = "*/34 * * * * *",
119
+ EVERY_35_SECONDS = "*/35 * * * * *",
120
+ EVERY_36_SECONDS = "*/36 * * * * *",
121
+ EVERY_37_SECONDS = "*/37 * * * * *",
122
+ EVERY_38_SECONDS = "*/38 * * * * *",
123
+ EVERY_39_SECONDS = "*/39 * * * * *",
124
+ EVERY_40_SECONDS = "*/40 * * * * *",
125
+ EVERY_41_SECONDS = "*/41 * * * * *",
126
+ EVERY_42_SECONDS = "*/42 * * * * *",
127
+ EVERY_43_SECONDS = "*/43 * * * * *",
128
+ EVERY_44_SECONDS = "*/44 * * * * *",
129
+ EVERY_45_SECONDS = "*/45 * * * * *",
130
+ EVERY_46_SECONDS = "*/46 * * * * *",
131
+ EVERY_47_SECONDS = "*/47 * * * * *",
132
+ EVERY_48_SECONDS = "*/48 * * * * *",
133
+ EVERY_49_SECONDS = "*/49 * * * * *",
134
+ EVERY_50_SECONDS = "*/50 * * * * *",
135
+ EVERY_51_SECONDS = "*/51 * * * * *",
136
+ EVERY_52_SECONDS = "*/52 * * * * *",
137
+ EVERY_53_SECONDS = "*/53 * * * * *",
138
+ EVERY_54_SECONDS = "*/54 * * * * *",
139
+ EVERY_55_SECONDS = "*/55 * * * * *",
140
+ EVERY_56_SECONDS = "*/56 * * * * *",
141
+ EVERY_57_SECONDS = "*/57 * * * * *",
142
+ EVERY_58_SECONDS = "*/58 * * * * *",
143
+ EVERY_59_SECONDS = "*/59 * * * * *",
144
+ EVERY_MINUTE = "0 * * * * *"
145
+ }
146
+ //#endregion
147
+ export { CreateOutboxOptions, CronExpression, 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 };
85
148
  //# sourceMappingURL=index.d.cts.map
package/dist/index.d.mts CHANGED
@@ -1,18 +1,7 @@
1
1
  import { DynamicModule, InjectionToken, ModuleMetadata, OnModuleInit, Type } from "@nestjs/common";
2
- import { EntityManager, Repository } from "typeorm";
2
+ import { DataSource, Repository } from "typeorm";
3
3
  import { ClientProxy, KafkaOptions } from "@nestjs/microservices";
4
4
 
5
- //#region src/core/typeorm-outbox.entity.d.ts
6
- declare class TypeormOutboxEntity {
7
- id: number;
8
- createdAt: Date;
9
- updatedAt: Date;
10
- destinationTopic: string;
11
- headers: Record<string, string>;
12
- keys: Record<string, unknown>;
13
- payload: Record<string, any>;
14
- }
15
- //#endregion
16
5
  //#region src/core/typeorm-outbox.interfaces.d.ts
17
6
  declare class TypeormOutboxRegisterCronModuleOptions {
18
7
  typeOrmConnectionName?: string;
@@ -35,11 +24,10 @@ interface TypeormOutboxModuleAsyncOptions extends Pick<ModuleMetadata, "imports"
35
24
  //#endregion
36
25
  //#region src/core/typeorm-outbox-cron.service.d.ts
37
26
  declare class TypeormOutboxCronService implements OnModuleInit {
38
- private readonly entityManager;
39
- private readonly outboxRepository;
40
27
  private readonly brokerClient;
41
28
  private readonly moduleConfig;
42
- constructor(entityManager: EntityManager, outboxRepository: Repository<TypeormOutboxEntity>, brokerClient: ClientProxy, moduleConfig: TypeormOutboxRegisterCronModuleOptions);
29
+ private readonly dataSource;
30
+ constructor(brokerClient: ClientProxy, moduleConfig: TypeormOutboxRegisterCronModuleOptions, dataSource: DataSource);
43
31
  onModuleInit(): void;
44
32
  executeCronJob(): Promise<void>;
45
33
  }
@@ -54,6 +42,17 @@ declare const InjectTypeormOutboxModuleConfig: () => PropertyDecorator & Paramet
54
42
  declare const InjectTypeormOutboxService: () => PropertyDecorator & ParameterDecorator;
55
43
  declare const InjectTypeormOutboxBroker: () => PropertyDecorator & ParameterDecorator;
56
44
  //#endregion
45
+ //#region src/core/typeorm-outbox.entity.d.ts
46
+ declare class TypeormOutboxEntity {
47
+ id: number;
48
+ createdAt: Date;
49
+ updatedAt: Date;
50
+ destinationTopic: string;
51
+ headers: Record<string, string>;
52
+ keys: Record<string, unknown>;
53
+ payload: Record<string, any>;
54
+ }
55
+ //#endregion
57
56
  //#region src/core/typeorm-outbox.module.d.ts
58
57
  declare class TypeormOutboxModule {
59
58
  private static createServiceProvider;
@@ -81,5 +80,69 @@ declare class TypeormOutboxService {
81
80
  create(options: CreateOutboxOptions): Promise<TypeormOutboxEntity>;
82
81
  }
83
82
  //#endregion
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 };
83
+ //#region src/core/typeorm-outbox.enums.d.ts
84
+ declare enum CronExpression {
85
+ EVERY_1_SECOND = "* * * * * *",
86
+ EVERY_2_SECONDS = "*/2 * * * * *",
87
+ EVERY_3_SECONDS = "*/3 * * * * *",
88
+ EVERY_4_SECONDS = "*/4 * * * * *",
89
+ EVERY_5_SECONDS = "*/5 * * * * *",
90
+ EVERY_6_SECONDS = "*/6 * * * * *",
91
+ EVERY_7_SECONDS = "*/7 * * * * *",
92
+ EVERY_8_SECONDS = "*/8 * * * * *",
93
+ EVERY_9_SECONDS = "*/9 * * * * *",
94
+ EVERY_10_SECONDS = "*/10 * * * * *",
95
+ EVERY_11_SECONDS = "*/11 * * * * *",
96
+ EVERY_12_SECONDS = "*/12 * * * * *",
97
+ EVERY_13_SECONDS = "*/13 * * * * *",
98
+ EVERY_14_SECONDS = "*/14 * * * * *",
99
+ EVERY_15_SECONDS = "*/15 * * * * *",
100
+ EVERY_16_SECONDS = "*/16 * * * * *",
101
+ EVERY_17_SECONDS = "*/17 * * * * *",
102
+ EVERY_18_SECONDS = "*/18 * * * * *",
103
+ EVERY_19_SECONDS = "*/19 * * * * *",
104
+ EVERY_20_SECONDS = "*/20 * * * * *",
105
+ EVERY_21_SECONDS = "*/21 * * * * *",
106
+ EVERY_22_SECONDS = "*/22 * * * * *",
107
+ EVERY_23_SECONDS = "*/23 * * * * *",
108
+ EVERY_24_SECONDS = "*/24 * * * * *",
109
+ EVERY_25_SECONDS = "*/25 * * * * *",
110
+ EVERY_26_SECONDS = "*/26 * * * * *",
111
+ EVERY_27_SECONDS = "*/27 * * * * *",
112
+ EVERY_28_SECONDS = "*/28 * * * * *",
113
+ EVERY_29_SECONDS = "*/29 * * * * *",
114
+ EVERY_30_SECONDS = "*/30 * * * * *",
115
+ EVERY_31_SECONDS = "*/31 * * * * *",
116
+ EVERY_32_SECONDS = "*/32 * * * * *",
117
+ EVERY_33_SECONDS = "*/33 * * * * *",
118
+ EVERY_34_SECONDS = "*/34 * * * * *",
119
+ EVERY_35_SECONDS = "*/35 * * * * *",
120
+ EVERY_36_SECONDS = "*/36 * * * * *",
121
+ EVERY_37_SECONDS = "*/37 * * * * *",
122
+ EVERY_38_SECONDS = "*/38 * * * * *",
123
+ EVERY_39_SECONDS = "*/39 * * * * *",
124
+ EVERY_40_SECONDS = "*/40 * * * * *",
125
+ EVERY_41_SECONDS = "*/41 * * * * *",
126
+ EVERY_42_SECONDS = "*/42 * * * * *",
127
+ EVERY_43_SECONDS = "*/43 * * * * *",
128
+ EVERY_44_SECONDS = "*/44 * * * * *",
129
+ EVERY_45_SECONDS = "*/45 * * * * *",
130
+ EVERY_46_SECONDS = "*/46 * * * * *",
131
+ EVERY_47_SECONDS = "*/47 * * * * *",
132
+ EVERY_48_SECONDS = "*/48 * * * * *",
133
+ EVERY_49_SECONDS = "*/49 * * * * *",
134
+ EVERY_50_SECONDS = "*/50 * * * * *",
135
+ EVERY_51_SECONDS = "*/51 * * * * *",
136
+ EVERY_52_SECONDS = "*/52 * * * * *",
137
+ EVERY_53_SECONDS = "*/53 * * * * *",
138
+ EVERY_54_SECONDS = "*/54 * * * * *",
139
+ EVERY_55_SECONDS = "*/55 * * * * *",
140
+ EVERY_56_SECONDS = "*/56 * * * * *",
141
+ EVERY_57_SECONDS = "*/57 * * * * *",
142
+ EVERY_58_SECONDS = "*/58 * * * * *",
143
+ EVERY_59_SECONDS = "*/59 * * * * *",
144
+ EVERY_MINUTE = "0 * * * * *"
145
+ }
146
+ //#endregion
147
+ export { CreateOutboxOptions, CronExpression, 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 };
85
148
  //# sourceMappingURL=index.d.mts.map
package/dist/index.mjs CHANGED
@@ -1,11 +1,10 @@
1
1
  import { Inject, Injectable, Module } from "@nestjs/common";
2
2
  import { hashStringToInt } from "@globalart/text-utils";
3
- import { Column, CreateDateColumn, Entity, EntityManager, PrimaryGeneratedColumn, Repository, UpdateDateColumn } from "typeorm";
4
- import { InjectRepository, TypeOrmModule } from "@nestjs/typeorm";
3
+ import { Column, CreateDateColumn, DataSource, Entity, PrimaryGeneratedColumn, Repository, UpdateDateColumn } from "typeorm";
5
4
  import { firstValueFrom } from "rxjs";
6
5
  import { ClientProxy, ClientProxyFactory } from "@nestjs/microservices";
7
6
  import { CronJob } from "cron";
8
- import { CronExpression, ScheduleModule } from "@nestjs/schedule";
7
+ import { InjectRepository, TypeOrmModule } from "@nestjs/typeorm";
9
8
 
10
9
  //#region src/core/typeorm-outbox.di-tokens.ts
11
10
  const TYPEORM_OUTBOX_CRON_CONFIG_TOKEN = Symbol("TYPEORM_OUTBOX_CRON_CONFIG_TOKEN");
@@ -18,13 +17,13 @@ const InjectTypeormOutboxService = () => Inject(TYPEORM_OUTBOX_SERVICE_TOKEN);
18
17
  const InjectTypeormOutboxBroker = () => Inject(TYPEORM_OUTBOX_BROKER_TOKEN);
19
18
 
20
19
  //#endregion
21
- //#region \0@oxc-project+runtime@0.108.0/helpers/decorateMetadata.js
20
+ //#region \0@oxc-project+runtime@0.110.0/helpers/decorateMetadata.js
22
21
  function __decorateMetadata(k, v) {
23
22
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
24
23
  }
25
24
 
26
25
  //#endregion
27
- //#region \0@oxc-project+runtime@0.108.0/helpers/decorate.js
26
+ //#region \0@oxc-project+runtime@0.110.0/helpers/decorate.js
28
27
  function __decorate(decorators, target, key, desc) {
29
28
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
30
29
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
@@ -34,7 +33,7 @@ function __decorate(decorators, target, key, desc) {
34
33
 
35
34
  //#endregion
36
35
  //#region src/core/typeorm-outbox.entity.ts
37
- var _ref$2, _ref2$1, _ref3$1, _ref4$1, _ref5;
36
+ var _ref$2, _ref2$1, _ref3$1, _ref4, _ref5;
38
37
  let TypeormOutboxEntity = class TypeormOutboxEntity {
39
38
  id;
40
39
  createdAt;
@@ -49,10 +48,76 @@ __decorate([CreateDateColumn({ name: "created_at" }), __decorateMetadata("design
49
48
  __decorate([UpdateDateColumn({ name: "updated_at" }), __decorateMetadata("design:type", typeof (_ref2$1 = typeof Date !== "undefined" && Date) === "function" ? _ref2$1 : Object)], TypeormOutboxEntity.prototype, "updatedAt", void 0);
50
49
  __decorate([Column("character varying", { name: "destination_topic" }), __decorateMetadata("design:type", String)], TypeormOutboxEntity.prototype, "destinationTopic", void 0);
51
50
  __decorate([Column("jsonb", { nullable: true }), __decorateMetadata("design:type", typeof (_ref3$1 = typeof Record !== "undefined" && Record) === "function" ? _ref3$1 : Object)], TypeormOutboxEntity.prototype, "headers", 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);
51
+ __decorate([Column("jsonb", { nullable: true }), __decorateMetadata("design:type", typeof (_ref4 = typeof Record !== "undefined" && Record) === "function" ? _ref4 : Object)], TypeormOutboxEntity.prototype, "keys", void 0);
53
52
  __decorate([Column("jsonb"), __decorateMetadata("design:type", typeof (_ref5 = typeof Record !== "undefined" && Record) === "function" ? _ref5 : Object)], TypeormOutboxEntity.prototype, "payload", void 0);
54
53
  TypeormOutboxEntity = __decorate([Entity("outbox")], TypeormOutboxEntity);
55
54
 
55
+ //#endregion
56
+ //#region src/core/typeorm-outbox.enums.ts
57
+ let CronExpression = /* @__PURE__ */ function(CronExpression) {
58
+ CronExpression["EVERY_1_SECOND"] = "* * * * * *";
59
+ CronExpression["EVERY_2_SECONDS"] = "*/2 * * * * *";
60
+ CronExpression["EVERY_3_SECONDS"] = "*/3 * * * * *";
61
+ CronExpression["EVERY_4_SECONDS"] = "*/4 * * * * *";
62
+ CronExpression["EVERY_5_SECONDS"] = "*/5 * * * * *";
63
+ CronExpression["EVERY_6_SECONDS"] = "*/6 * * * * *";
64
+ CronExpression["EVERY_7_SECONDS"] = "*/7 * * * * *";
65
+ CronExpression["EVERY_8_SECONDS"] = "*/8 * * * * *";
66
+ CronExpression["EVERY_9_SECONDS"] = "*/9 * * * * *";
67
+ CronExpression["EVERY_10_SECONDS"] = "*/10 * * * * *";
68
+ CronExpression["EVERY_11_SECONDS"] = "*/11 * * * * *";
69
+ CronExpression["EVERY_12_SECONDS"] = "*/12 * * * * *";
70
+ CronExpression["EVERY_13_SECONDS"] = "*/13 * * * * *";
71
+ CronExpression["EVERY_14_SECONDS"] = "*/14 * * * * *";
72
+ CronExpression["EVERY_15_SECONDS"] = "*/15 * * * * *";
73
+ CronExpression["EVERY_16_SECONDS"] = "*/16 * * * * *";
74
+ CronExpression["EVERY_17_SECONDS"] = "*/17 * * * * *";
75
+ CronExpression["EVERY_18_SECONDS"] = "*/18 * * * * *";
76
+ CronExpression["EVERY_19_SECONDS"] = "*/19 * * * * *";
77
+ CronExpression["EVERY_20_SECONDS"] = "*/20 * * * * *";
78
+ CronExpression["EVERY_21_SECONDS"] = "*/21 * * * * *";
79
+ CronExpression["EVERY_22_SECONDS"] = "*/22 * * * * *";
80
+ CronExpression["EVERY_23_SECONDS"] = "*/23 * * * * *";
81
+ CronExpression["EVERY_24_SECONDS"] = "*/24 * * * * *";
82
+ CronExpression["EVERY_25_SECONDS"] = "*/25 * * * * *";
83
+ CronExpression["EVERY_26_SECONDS"] = "*/26 * * * * *";
84
+ CronExpression["EVERY_27_SECONDS"] = "*/27 * * * * *";
85
+ CronExpression["EVERY_28_SECONDS"] = "*/28 * * * * *";
86
+ CronExpression["EVERY_29_SECONDS"] = "*/29 * * * * *";
87
+ CronExpression["EVERY_30_SECONDS"] = "*/30 * * * * *";
88
+ CronExpression["EVERY_31_SECONDS"] = "*/31 * * * * *";
89
+ CronExpression["EVERY_32_SECONDS"] = "*/32 * * * * *";
90
+ CronExpression["EVERY_33_SECONDS"] = "*/33 * * * * *";
91
+ CronExpression["EVERY_34_SECONDS"] = "*/34 * * * * *";
92
+ CronExpression["EVERY_35_SECONDS"] = "*/35 * * * * *";
93
+ CronExpression["EVERY_36_SECONDS"] = "*/36 * * * * *";
94
+ CronExpression["EVERY_37_SECONDS"] = "*/37 * * * * *";
95
+ CronExpression["EVERY_38_SECONDS"] = "*/38 * * * * *";
96
+ CronExpression["EVERY_39_SECONDS"] = "*/39 * * * * *";
97
+ CronExpression["EVERY_40_SECONDS"] = "*/40 * * * * *";
98
+ CronExpression["EVERY_41_SECONDS"] = "*/41 * * * * *";
99
+ CronExpression["EVERY_42_SECONDS"] = "*/42 * * * * *";
100
+ CronExpression["EVERY_43_SECONDS"] = "*/43 * * * * *";
101
+ CronExpression["EVERY_44_SECONDS"] = "*/44 * * * * *";
102
+ CronExpression["EVERY_45_SECONDS"] = "*/45 * * * * *";
103
+ CronExpression["EVERY_46_SECONDS"] = "*/46 * * * * *";
104
+ CronExpression["EVERY_47_SECONDS"] = "*/47 * * * * *";
105
+ CronExpression["EVERY_48_SECONDS"] = "*/48 * * * * *";
106
+ CronExpression["EVERY_49_SECONDS"] = "*/49 * * * * *";
107
+ CronExpression["EVERY_50_SECONDS"] = "*/50 * * * * *";
108
+ CronExpression["EVERY_51_SECONDS"] = "*/51 * * * * *";
109
+ CronExpression["EVERY_52_SECONDS"] = "*/52 * * * * *";
110
+ CronExpression["EVERY_53_SECONDS"] = "*/53 * * * * *";
111
+ CronExpression["EVERY_54_SECONDS"] = "*/54 * * * * *";
112
+ CronExpression["EVERY_55_SECONDS"] = "*/55 * * * * *";
113
+ CronExpression["EVERY_56_SECONDS"] = "*/56 * * * * *";
114
+ CronExpression["EVERY_57_SECONDS"] = "*/57 * * * * *";
115
+ CronExpression["EVERY_58_SECONDS"] = "*/58 * * * * *";
116
+ CronExpression["EVERY_59_SECONDS"] = "*/59 * * * * *";
117
+ CronExpression["EVERY_MINUTE"] = "0 * * * * *";
118
+ return CronExpression;
119
+ }({});
120
+
56
121
  //#endregion
57
122
  //#region src/core/typeorm-outbox.interfaces.ts
58
123
  var TypeormOutboxRegisterCronModuleOptions = class {
@@ -65,7 +130,7 @@ var TypeormOutboxModuleOptions = class {
65
130
  };
66
131
 
67
132
  //#endregion
68
- //#region \0@oxc-project+runtime@0.108.0/helpers/decorateParam.js
133
+ //#region \0@oxc-project+runtime@0.110.0/helpers/decorateParam.js
69
134
  function __decorateParam(paramIndex, decorator) {
70
135
  return function(target, key) {
71
136
  decorator(target, key, paramIndex);
@@ -74,13 +139,12 @@ function __decorateParam(paramIndex, decorator) {
74
139
 
75
140
  //#endregion
76
141
  //#region src/core/typeorm-outbox-cron.service.ts
77
- var _ref$1, _ref2, _ref3, _ref4;
142
+ var _ref$1, _ref2, _ref3;
78
143
  let TypeormOutboxCronService = class TypeormOutboxCronService {
79
- constructor(entityManager, outboxRepository, brokerClient, moduleConfig) {
80
- this.entityManager = entityManager;
81
- this.outboxRepository = outboxRepository;
144
+ constructor(brokerClient, moduleConfig, dataSource) {
82
145
  this.brokerClient = brokerClient;
83
146
  this.moduleConfig = moduleConfig;
147
+ this.dataSource = dataSource;
84
148
  }
85
149
  onModuleInit() {
86
150
  new CronJob(this.moduleConfig.cronExpression ?? CronExpression.EVERY_10_SECONDS, () => {
@@ -88,30 +152,42 @@ let TypeormOutboxCronService = class TypeormOutboxCronService {
88
152
  }).start();
89
153
  }
90
154
  async executeCronJob() {
91
- const lockId = hashStringToInt("typeorm-outbox-cron-job");
92
- const [{ pg_try_advisory_xact_lock: acquired }] = await this.entityManager.query(`SELECT pg_try_advisory_xact_lock(${lockId})`);
93
- if (!acquired) return;
94
- const entities = await this.outboxRepository.find();
95
- for (const entity of entities) {
96
- await firstValueFrom(this.brokerClient.emit(entity.destinationTopic, {
97
- key: entity.keys,
98
- value: entity.payload,
99
- headers: entity.headers
100
- }));
101
- await this.outboxRepository.delete(entity.id);
155
+ const queryRunner = this.dataSource.createQueryRunner();
156
+ await queryRunner.connect();
157
+ const lockKey = hashStringToInt("typeorm-outbox-cron-lock");
158
+ try {
159
+ if (!(await queryRunner.query("SELECT pg_try_advisory_lock($1) as locked", [lockKey]))[0].locked) return;
160
+ try {
161
+ await queryRunner.startTransaction("REPEATABLE READ");
162
+ const entities = await queryRunner.manager.find(TypeormOutboxEntity);
163
+ for (const entity of entities) {
164
+ await firstValueFrom(this.brokerClient.emit(entity.destinationTopic, {
165
+ key: entity.keys,
166
+ value: entity.payload,
167
+ headers: entity.headers
168
+ }));
169
+ await queryRunner.manager.delete(TypeormOutboxEntity, entity.id);
170
+ }
171
+ await queryRunner.commitTransaction();
172
+ } catch (error) {
173
+ await queryRunner.rollbackTransaction();
174
+ throw error;
175
+ } finally {
176
+ await queryRunner.query("SELECT pg_advisory_unlock($1)", [lockKey]);
177
+ }
178
+ } finally {
179
+ await queryRunner.release();
102
180
  }
103
181
  }
104
182
  };
105
183
  TypeormOutboxCronService = __decorate([
106
184
  Injectable(),
107
- __decorateParam(1, InjectRepository(TypeormOutboxEntity)),
108
- __decorateParam(2, InjectTypeormOutboxBroker()),
109
- __decorateParam(3, InjectTypeormOutboxCronConfig()),
185
+ __decorateParam(0, InjectTypeormOutboxBroker()),
186
+ __decorateParam(1, InjectTypeormOutboxCronConfig()),
110
187
  __decorateMetadata("design:paramtypes", [
111
- typeof (_ref$1 = typeof EntityManager !== "undefined" && EntityManager) === "function" ? _ref$1 : Object,
112
- typeof (_ref2 = typeof Repository !== "undefined" && Repository) === "function" ? _ref2 : Object,
113
- typeof (_ref3 = typeof ClientProxy !== "undefined" && ClientProxy) === "function" ? _ref3 : Object,
114
- typeof (_ref4 = typeof TypeormOutboxRegisterCronModuleOptions !== "undefined" && TypeormOutboxRegisterCronModuleOptions) === "function" ? _ref4 : Object
188
+ typeof (_ref$1 = typeof ClientProxy !== "undefined" && ClientProxy) === "function" ? _ref$1 : Object,
189
+ typeof (_ref2 = typeof TypeormOutboxRegisterCronModuleOptions !== "undefined" && TypeormOutboxRegisterCronModuleOptions) === "function" ? _ref2 : Object,
190
+ typeof (_ref3 = typeof DataSource !== "undefined" && DataSource) === "function" ? _ref3 : Object
115
191
  ])
116
192
  ], TypeormOutboxCronService);
117
193
 
@@ -252,7 +328,7 @@ let TypeormOutboxModule = _TypeormOutboxModule = class TypeormOutboxModule {
252
328
  return {
253
329
  module: _TypeormOutboxModule,
254
330
  global: true,
255
- imports: [ScheduleModule.forRoot(), this.createTypeOrmFeature()],
331
+ imports: [this.createTypeOrmFeature()],
256
332
  providers: [
257
333
  TypeormOutboxCronService,
258
334
  configProvider,
@@ -270,5 +346,5 @@ let TypeormOutboxModule = _TypeormOutboxModule = class TypeormOutboxModule {
270
346
  TypeormOutboxModule = _TypeormOutboxModule = __decorate([Module({})], TypeormOutboxModule);
271
347
 
272
348
  //#endregion
273
- 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 };
349
+ export { CronExpression, 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 };
274
350
  //# 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.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<TypeormOutboxEntity> {\n return 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\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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"}
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.enums.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","export enum CronExpression {\n EVERY_1_SECOND = \"* * * * * *\",\n EVERY_2_SECONDS = \"*/2 * * * * *\",\n EVERY_3_SECONDS = \"*/3 * * * * *\",\n EVERY_4_SECONDS = \"*/4 * * * * *\",\n EVERY_5_SECONDS = \"*/5 * * * * *\",\n EVERY_6_SECONDS = \"*/6 * * * * *\",\n EVERY_7_SECONDS = \"*/7 * * * * *\",\n EVERY_8_SECONDS = \"*/8 * * * * *\",\n EVERY_9_SECONDS = \"*/9 * * * * *\",\n EVERY_10_SECONDS = \"*/10 * * * * *\",\n EVERY_11_SECONDS = \"*/11 * * * * *\",\n EVERY_12_SECONDS = \"*/12 * * * * *\",\n EVERY_13_SECONDS = \"*/13 * * * * *\",\n EVERY_14_SECONDS = \"*/14 * * * * *\",\n EVERY_15_SECONDS = \"*/15 * * * * *\",\n EVERY_16_SECONDS = \"*/16 * * * * *\",\n EVERY_17_SECONDS = \"*/17 * * * * *\",\n EVERY_18_SECONDS = \"*/18 * * * * *\",\n EVERY_19_SECONDS = \"*/19 * * * * *\",\n EVERY_20_SECONDS = \"*/20 * * * * *\",\n EVERY_21_SECONDS = \"*/21 * * * * *\",\n EVERY_22_SECONDS = \"*/22 * * * * *\",\n EVERY_23_SECONDS = \"*/23 * * * * *\",\n EVERY_24_SECONDS = \"*/24 * * * * *\",\n EVERY_25_SECONDS = \"*/25 * * * * *\",\n EVERY_26_SECONDS = \"*/26 * * * * *\",\n EVERY_27_SECONDS = \"*/27 * * * * *\",\n EVERY_28_SECONDS = \"*/28 * * * * *\",\n EVERY_29_SECONDS = \"*/29 * * * * *\",\n EVERY_30_SECONDS = \"*/30 * * * * *\",\n EVERY_31_SECONDS = \"*/31 * * * * *\",\n EVERY_32_SECONDS = \"*/32 * * * * *\",\n EVERY_33_SECONDS = \"*/33 * * * * *\",\n EVERY_34_SECONDS = \"*/34 * * * * *\",\n EVERY_35_SECONDS = \"*/35 * * * * *\",\n EVERY_36_SECONDS = \"*/36 * * * * *\",\n EVERY_37_SECONDS = \"*/37 * * * * *\",\n EVERY_38_SECONDS = \"*/38 * * * * *\",\n EVERY_39_SECONDS = \"*/39 * * * * *\",\n EVERY_40_SECONDS = \"*/40 * * * * *\",\n EVERY_41_SECONDS = \"*/41 * * * * *\",\n EVERY_42_SECONDS = \"*/42 * * * * *\",\n EVERY_43_SECONDS = \"*/43 * * * * *\",\n EVERY_44_SECONDS = \"*/44 * * * * *\",\n EVERY_45_SECONDS = \"*/45 * * * * *\",\n EVERY_46_SECONDS = \"*/46 * * * * *\",\n EVERY_47_SECONDS = \"*/47 * * * * *\",\n EVERY_48_SECONDS = \"*/48 * * * * *\",\n EVERY_49_SECONDS = \"*/49 * * * * *\",\n EVERY_50_SECONDS = \"*/50 * * * * *\",\n EVERY_51_SECONDS = \"*/51 * * * * *\",\n EVERY_52_SECONDS = \"*/52 * * * * *\",\n EVERY_53_SECONDS = \"*/53 * * * * *\",\n EVERY_54_SECONDS = \"*/54 * * * * *\",\n EVERY_55_SECONDS = \"*/55 * * * * *\",\n EVERY_56_SECONDS = \"*/56 * * * * *\",\n EVERY_57_SECONDS = \"*/57 * * * * *\",\n EVERY_58_SECONDS = \"*/58 * * * * *\",\n EVERY_59_SECONDS = \"*/59 * * * * *\",\n EVERY_MINUTE = \"0 * * * * *\",\n}","import { KafkaOptions } from \"@nestjs/microservices\";\nimport { InjectionToken, ModuleMetadata, Type } from \"@nestjs/common\";\nimport { CronExpression } from \"./typeorm-outbox.enums\";\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 { TypeormOutboxEntity } from \"./typeorm-outbox.entity\";\nimport { firstValueFrom } from \"rxjs\";\nimport { ClientProxy } from \"@nestjs/microservices\";\nimport { CronJob } from \"cron\";\nimport { TypeormOutboxRegisterCronModuleOptions } from \"./typeorm-outbox.interfaces\";\nimport { DataSource } from \"typeorm\";\nimport { CronExpression } from \"./typeorm-outbox.enums\";\n\n@Injectable()\nexport class TypeormOutboxCronService implements OnModuleInit {\n constructor(\n @InjectTypeormOutboxBroker()\n private readonly brokerClient: ClientProxy,\n @InjectTypeormOutboxCronConfig()\n private readonly moduleConfig: TypeormOutboxRegisterCronModuleOptions,\n private readonly dataSource: DataSource,\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 queryRunner = this.dataSource.createQueryRunner();\n await queryRunner.connect();\n const lockKey = hashStringToInt('typeorm-outbox-cron-lock');\n\n try {\n const lockResult = await queryRunner.query(\n 'SELECT pg_try_advisory_lock($1) as locked',\n [lockKey],\n );\n\n if (!lockResult[0].locked) {\n return;\n }\n try {\n await queryRunner.startTransaction('REPEATABLE READ');\n \n const entities = await queryRunner.manager.find(TypeormOutboxEntity);\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 queryRunner.manager.delete(TypeormOutboxEntity, entity.id);\n }\n\n await queryRunner.commitTransaction();\n } catch (error) {\n await queryRunner.rollbackTransaction();\n throw error;\n } finally {\n await queryRunner.query('SELECT pg_advisory_unlock($1)', [lockKey]);\n }\n } finally {\n await queryRunner.release();\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<TypeormOutboxEntity> {\n return 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 { 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\n return {\n module: TypeormOutboxModule,\n global: true,\n imports: [\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.5",
4
+ "version": "1.0.7",
5
5
  "type": "module",
6
6
  "main": "dist/index.mjs",
7
7
  "module": "dist/index.mjs",
@@ -47,7 +47,6 @@
47
47
  "dependencies": {
48
48
  "@nestjs/common": "11.1.12",
49
49
  "cron": "^4.4.0",
50
- "@nestjs/schedule": "^6.1.0",
51
50
  "@nestjs/core": "11.1.12",
52
51
  "@nestjs/microservices": "^11.1.12",
53
52
  "@nestjs/typeorm": "^11.0.0",
@@ -61,7 +60,7 @@
61
60
  "@types/node": "25.0.10",
62
61
  "reflect-metadata": "^0.2.2",
63
62
  "release-it": "19.2.4",
64
- "tsdown": "0.20.0",
63
+ "tsdown": "0.20.1",
65
64
  "typescript": "^5.9.3",
66
65
  "prettier": "^3.8.1"
67
66
  }