@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 +109 -32
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +79 -16
- package/dist/index.d.mts +79 -16
- package/dist/index.mjs +108 -32
- package/dist/index.mjs.map +1 -1
- package/package.json +2 -3
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
|
|
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.
|
|
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.
|
|
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
|
|
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
|
|
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 =
|
|
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.
|
|
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
|
|
142
|
+
var _ref$1, _ref2, _ref3;
|
|
78
143
|
let TypeormOutboxCronService = class TypeormOutboxCronService {
|
|
79
|
-
constructor(
|
|
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 ??
|
|
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
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
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(
|
|
108
|
-
__decorateParam(
|
|
109
|
-
__decorateParam(3, InjectTypeormOutboxCronConfig()),
|
|
185
|
+
__decorateParam(0, InjectTypeormOutboxBroker()),
|
|
186
|
+
__decorateParam(1, InjectTypeormOutboxCronConfig()),
|
|
110
187
|
__decorateMetadata("design:paramtypes", [
|
|
111
|
-
typeof (_ref$1 = typeof
|
|
112
|
-
typeof (_ref2 = typeof
|
|
113
|
-
typeof (_ref3 = typeof
|
|
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: [
|
|
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;
|
package/dist/index.cjs.map
CHANGED
|
@@ -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":";;;;;;;;;AAEA,MAAa,mCAAmC,OAC9C,mCACD;AACD,MAAa,qCAAqC,OAChD,qCACD;AACD,MAAa,+BAA+B,OAC1C,+BACD;AACD,MAAa,8BAA8B,OACzC,8BACD;AAED,MAAa,iEACJ,iCAAiC;AAC1C,MAAa,mEACJ,mCAAmC;AAC5C,MAAa,8DACJ,6BAA6B;AACtC,MAAa,6DACJ,4BAA4B;;;;;;;;;;;;;;;;;;;;ACb9B,gCAAM,oBAAoB;CAC/B,AACA;CAEA,AACA;CAEA,AACA;CAEA,AACA;CAEA,AACA;CAEA,AACA;CAEA,AACA;;iDAnByB;0CAGP,EAAE,MAAM,cAAc,CAAC;0CAGvB,EAAE,MAAM,cAAc,CAAC;gCAGjC,qBAAqB,EAAE,MAAM,qBAAqB,CAAC;gCAGnD,SAAS,EAAE,UAAU,MAAM,CAAC;gCAG5B,SAAS,EAAE,UAAU,MAAM,CAAC;gCAG5B,QAAQ;sDApBV,SAAS;;;;ACRjB,IAAY,0DAAL;AACL;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;;;;;ACxDF,IAAa,yCAAb,MAAoD;CAClD,wBAAiC;CACjC,cAA6B,EAAE;CAC/B,iBAA0B,eAAe;;AAe3C,IAAa,6BAAb,MAAwC;CACtC,wBAAiC;;;;;;;;;;;;;;ACX5B,qCAAM,yBAAiD;CAC5D,YACE,AACiB,cACjB,AACiB,cACjB,AAAiB,YACjB;EAJiB;EAEA;EACA;;CAGnB,eAAe;AAIb,EAHgB,IAAIA,aAAQ,KAAK,aAAa,kBAAkB,eAAe,wBAAwB;AACrG,QAAK,gBAAgB;IACrB,CACM,OAAO;;CAGjB,MAAM,iBAAiB;EACrB,MAAM,cAAc,KAAK,WAAW,mBAAmB;AACvD,QAAM,YAAY,SAAS;EAC3B,MAAM,qDAA0B,2BAA2B;AAE3D,MAAI;AAMF,OAAI,EALe,MAAM,YAAY,MACnC,6CACA,CAAC,QAAQ,CACV,EAEe,GAAG,OACjB;AAEF,OAAI;AACF,UAAM,YAAY,iBAAiB,kBAAkB;IAErD,MAAM,WAAW,MAAM,YAAY,QAAQ,KAAK,oBAAoB;AAEpE,SAAK,MAAM,UAAU,UAAU;AAC7B,oCACE,KAAK,aAAa,KAAK,OAAO,kBAAkB;MAC9C,KAAK,OAAO;MACZ,OAAO,OAAO;MACd,SAAS,OAAO;MACjB,CAAC,CACH;AACD,WAAM,YAAY,QAAQ,OAAO,qBAAqB,OAAO,GAAG;;AAGlE,UAAM,YAAY,mBAAmB;YAC9B,OAAO;AACd,UAAM,YAAY,qBAAqB;AACvC,UAAM;aACE;AACR,UAAM,YAAY,MAAM,iCAAiC,CAAC,QAAQ,CAAC;;YAE7D;AACR,SAAM,YAAY,SAAS;;;;;iCAvDpB;oBAGR,2BAA2B;oBAE3B,+BAA+B;;;;;;;;;;;ACH7B,iCAAM,qBAAqB;CAChC,YACE,AACiB,kBACjB;EADiB;;CAGnB,MAAM,OAAO,SAA4D;AACvE,SAAO,KAAK,iBAAiB,KAAK;GAChC,kBAAkB,QAAQ;GAC1B,SAAS,QAAQ;GACjB,MAAM,QAAQ;GACd,SAAS,QAAQ;GAClB,CAAC;;;;iCAbO;0DAGS,oBAAoB;;;;;;;ACKnC,uDAAM,oBAAoB;CAC/B,OAAe,wBAAkC;AAC/C,SAAO;GACL,SAAS;GACT,UAAU;GACX;;CAGH,OAAe,qBAAqB,WAAoB,MAAgB;AACtE,SAAO;GACL,SAAS;GACT;GACD;;CAGH,OAAe,qBAAqB,gBAAyB;AAC3D,SAAOC,8BAAc,WACnB,CAAC,oBAAoB,EACrB,kBAAkB,UACnB;;CAGH,OAAe,2BACb,SACU;AACV,SAAO;GACL,SAAS;GACT,UAAU;IACR,GAAG,IAAI,4BAA4B;IACnC,GAAG;IACJ;GACF;;CAGH,OAAe,gCACb,SACU;AACV,SAAO;GACL,SAAS;GACT,YAAY,OAAO,GAAG,SAAoB;IACxC,MAAM,gBAAiB,MAAM,QAAQ,aAAa,GAAG,KAAK;AAG1D,WAAO;KACL,GAAG,IAAI,4BAA4B;KACnC,GAAG;KACJ;;GAEH,QAAQ,QAAQ,UAAU,EAAE;GAC7B;;CAGH,OAAe,yBACb,SACU;AACV,SAAO;GACL,SAAS;GACT,YAAY,OAAO,GAAG,SAAoB;IACxC,MAAM,gBAAgB,MAAM,QAAQ,aAAa,GAAG,KAAK;AACzD,WAAO;KACL,GAAG,IAAI,wCAAwC;KAC/C,GAAG;KACJ;;GAEH,QAAQ,QAAQ,UAAU,EAAE;GAC7B;;CAGH,OAAe,yBACb,SACU;AACV,SAAO;GACL,SAAS;GACT,YAAY,OAAO,GAAG,SAAoB;IACxC,MAAM,gBAAgB,MAAM,QAAQ,aAAa,GAAG,KAAK;IACzD,MAAM,SAAS;KACb,GAAG,IAAI,wCAAwC;KAC/C,GAAG;KACJ;AACD,WAAOC,yCAAmB,OAAO,QAAQ,eAAe,EAAE,CAAC;;GAE7D,QAAQ,QAAQ,UAAU,EAAE;GAC7B;;CAGH,OAAO,QAAQ,UAAsC,EAAE,EAAiB;EACtE,MAAM,iBAAiB,KAAK,2BAA2B,QAAQ;EAC/D,MAAM,kBAAkB,KAAK,uBAAuB;EACpD,MAAM,iBAAiB,KAAK,sBAAsB;AAElD,SAAO;GACL;GACA,QAAQ;GACR,SAAS,CAAC,KAAK,qBAAqB,QAAQ,sBAAsB,CAAC;GACnE,WAAW;IAAC;IAAgB;IAAiB;IAAe;GAC5D,SAAS;IAAC;IAAgB;IAAiB;IAAe;GAC3D;;CAGH,OAAO,aACL,SACe;EACf,MAAM,iBAAiB,KAAK,gCAAgC,QAAQ;EACpE,MAAM,kBAAkB,KAAK,uBAAuB;EACpD,MAAM,iBAAiB,KAAK,sBAAsB;AAElD,SAAO;GACL;GACA,QAAQ;GACR,SAAS,CAAC,KAAK,sBAAsB,CAAC;GACtC,WAAW;IAAC;IAAgB;IAAiB;IAAe;GAC5D,SAAS;IAAC;IAAgB;IAAiB;IAAe;GAC3D;;CAGH,OAAO,kBACL,SACe;EACf,MAAM,iBAAiB,KAAK,yBAAyB,QAAQ;EAC7D,MAAM,iBAAiB,KAAK,yBAAyB,QAAQ;EAC7D,MAAM,kBAAkB,KAAK,uBAAuB;AAEpD,SAAO;GACL;GACA,QAAQ;GACR,SAAS,CACP,KAAK,sBAAsB,CAC5B;GACD,WAAW;IACT;IACA;IACA;IACA;IACD;GACD,SAAS;IAAC;IAAgB;IAAgB;IAAgB;GAC3D;;;oFAxIG,EAAE,CAAC"}
|
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
|
-
|
|
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
|
-
|
|
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 {
|
|
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
|
-
|
|
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
|
-
|
|
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,
|
|
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 {
|
|
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.
|
|
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.
|
|
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
|
|
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
|
|
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.
|
|
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
|
|
142
|
+
var _ref$1, _ref2, _ref3;
|
|
78
143
|
let TypeormOutboxCronService = class TypeormOutboxCronService {
|
|
79
|
-
constructor(
|
|
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
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
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(
|
|
108
|
-
__decorateParam(
|
|
109
|
-
__decorateParam(3, InjectTypeormOutboxCronConfig()),
|
|
185
|
+
__decorateParam(0, InjectTypeormOutboxBroker()),
|
|
186
|
+
__decorateParam(1, InjectTypeormOutboxCronConfig()),
|
|
110
187
|
__decorateMetadata("design:paramtypes", [
|
|
111
|
-
typeof (_ref$1 = typeof
|
|
112
|
-
typeof (_ref2 = typeof
|
|
113
|
-
typeof (_ref3 = typeof
|
|
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: [
|
|
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
|
package/dist/index.mjs.map
CHANGED
|
@@ -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.
|
|
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.
|
|
63
|
+
"tsdown": "0.20.1",
|
|
65
64
|
"typescript": "^5.9.3",
|
|
66
65
|
"prettier": "^3.8.1"
|
|
67
66
|
}
|