@globalart/nestjs-typeorm-outbox 1.0.5 → 1.0.6

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,11 @@
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
7
  let _nestjs_schedule = require("@nestjs/schedule");
8
+ let _nestjs_typeorm = require("@nestjs/typeorm");
9
9
 
10
10
  //#region src/core/typeorm-outbox.di-tokens.ts
11
11
  const TYPEORM_OUTBOX_CRON_CONFIG_TOKEN = Symbol("TYPEORM_OUTBOX_CRON_CONFIG_TOKEN");
@@ -34,7 +34,7 @@ function __decorate(decorators, target, key, desc) {
34
34
 
35
35
  //#endregion
36
36
  //#region src/core/typeorm-outbox.entity.ts
37
- var _ref$2, _ref2$1, _ref3$1, _ref4$1, _ref5;
37
+ var _ref$2, _ref2$1, _ref3$1, _ref4, _ref5;
38
38
  let TypeormOutboxEntity = class TypeormOutboxEntity {
39
39
  id;
40
40
  createdAt;
@@ -49,7 +49,7 @@ __decorate([(0, typeorm.CreateDateColumn)({ name: "created_at" }), __decorateMet
49
49
  __decorate([(0, typeorm.UpdateDateColumn)({ name: "updated_at" }), __decorateMetadata("design:type", typeof (_ref2$1 = typeof Date !== "undefined" && Date) === "function" ? _ref2$1 : Object)], TypeormOutboxEntity.prototype, "updatedAt", void 0);
50
50
  __decorate([(0, typeorm.Column)("character varying", { name: "destination_topic" }), __decorateMetadata("design:type", String)], TypeormOutboxEntity.prototype, "destinationTopic", void 0);
51
51
  __decorate([(0, typeorm.Column)("jsonb", { nullable: true }), __decorateMetadata("design:type", typeof (_ref3$1 = typeof Record !== "undefined" && Record) === "function" ? _ref3$1 : Object)], TypeormOutboxEntity.prototype, "headers", void 0);
52
- __decorate([(0, typeorm.Column)("jsonb", { nullable: true }), __decorateMetadata("design:type", typeof (_ref4$1 = typeof Record !== "undefined" && Record) === "function" ? _ref4$1 : Object)], TypeormOutboxEntity.prototype, "keys", void 0);
52
+ __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
53
  __decorate([(0, typeorm.Column)("jsonb"), __decorateMetadata("design:type", typeof (_ref5 = typeof Record !== "undefined" && Record) === "function" ? _ref5 : Object)], TypeormOutboxEntity.prototype, "payload", void 0);
54
54
  TypeormOutboxEntity = __decorate([(0, typeorm.Entity)("outbox")], TypeormOutboxEntity);
55
55
 
@@ -74,13 +74,12 @@ function __decorateParam(paramIndex, decorator) {
74
74
 
75
75
  //#endregion
76
76
  //#region src/core/typeorm-outbox-cron.service.ts
77
- var _ref$1, _ref2, _ref3, _ref4;
77
+ var _ref$1, _ref2, _ref3;
78
78
  let TypeormOutboxCronService = class TypeormOutboxCronService {
79
- constructor(entityManager, outboxRepository, brokerClient, moduleConfig) {
80
- this.entityManager = entityManager;
81
- this.outboxRepository = outboxRepository;
79
+ constructor(brokerClient, moduleConfig, dataSource) {
82
80
  this.brokerClient = brokerClient;
83
81
  this.moduleConfig = moduleConfig;
82
+ this.dataSource = dataSource;
84
83
  }
85
84
  onModuleInit() {
86
85
  new cron.CronJob(this.moduleConfig.cronExpression ?? _nestjs_schedule.CronExpression.EVERY_10_SECONDS, () => {
@@ -88,30 +87,42 @@ let TypeormOutboxCronService = class TypeormOutboxCronService {
88
87
  }).start();
89
88
  }
90
89
  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);
90
+ const queryRunner = this.dataSource.createQueryRunner();
91
+ await queryRunner.connect();
92
+ const lockKey = (0, _globalart_text_utils.hashStringToInt)("typeorm-outbox-cron-lock");
93
+ try {
94
+ if (!(await queryRunner.query("SELECT pg_try_advisory_lock($1) as locked", [lockKey]))[0].locked) return;
95
+ try {
96
+ await queryRunner.startTransaction("REPEATABLE READ");
97
+ const entities = await queryRunner.manager.find(TypeormOutboxEntity);
98
+ for (const entity of entities) {
99
+ await (0, rxjs.firstValueFrom)(this.brokerClient.emit(entity.destinationTopic, {
100
+ key: entity.keys,
101
+ value: entity.payload,
102
+ headers: entity.headers
103
+ }));
104
+ await queryRunner.manager.delete(TypeormOutboxEntity, entity.id);
105
+ }
106
+ await queryRunner.commitTransaction();
107
+ } catch (error) {
108
+ await queryRunner.rollbackTransaction();
109
+ throw error;
110
+ } finally {
111
+ await queryRunner.query("SELECT pg_advisory_unlock($1)", [lockKey]);
112
+ }
113
+ } finally {
114
+ await queryRunner.release();
102
115
  }
103
116
  }
104
117
  };
105
118
  TypeormOutboxCronService = __decorate([
106
119
  (0, _nestjs_common.Injectable)(),
107
- __decorateParam(1, (0, _nestjs_typeorm.InjectRepository)(TypeormOutboxEntity)),
108
- __decorateParam(2, InjectTypeormOutboxBroker()),
109
- __decorateParam(3, InjectTypeormOutboxCronConfig()),
120
+ __decorateParam(0, InjectTypeormOutboxBroker()),
121
+ __decorateParam(1, InjectTypeormOutboxCronConfig()),
110
122
  __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
123
+ typeof (_ref$1 = typeof _nestjs_microservices.ClientProxy !== "undefined" && _nestjs_microservices.ClientProxy) === "function" ? _ref$1 : Object,
124
+ typeof (_ref2 = typeof TypeormOutboxRegisterCronModuleOptions !== "undefined" && TypeormOutboxRegisterCronModuleOptions) === "function" ? _ref2 : Object,
125
+ typeof (_ref3 = typeof typeorm.DataSource !== "undefined" && typeorm.DataSource) === "function" ? _ref3 : Object
115
126
  ])
116
127
  ], TypeormOutboxCronService);
117
128
 
@@ -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":["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 { 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 { CronExpression } from \"@nestjs/schedule\";\nimport { DataSource } from \"typeorm\";\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 { 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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"}
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;
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;
package/dist/index.mjs CHANGED
@@ -1,11 +1,11 @@
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
7
  import { CronExpression, ScheduleModule } from "@nestjs/schedule";
8
+ import { InjectRepository, TypeOrmModule } from "@nestjs/typeorm";
9
9
 
10
10
  //#region src/core/typeorm-outbox.di-tokens.ts
11
11
  const TYPEORM_OUTBOX_CRON_CONFIG_TOKEN = Symbol("TYPEORM_OUTBOX_CRON_CONFIG_TOKEN");
@@ -34,7 +34,7 @@ function __decorate(decorators, target, key, desc) {
34
34
 
35
35
  //#endregion
36
36
  //#region src/core/typeorm-outbox.entity.ts
37
- var _ref$2, _ref2$1, _ref3$1, _ref4$1, _ref5;
37
+ var _ref$2, _ref2$1, _ref3$1, _ref4, _ref5;
38
38
  let TypeormOutboxEntity = class TypeormOutboxEntity {
39
39
  id;
40
40
  createdAt;
@@ -49,7 +49,7 @@ __decorate([CreateDateColumn({ name: "created_at" }), __decorateMetadata("design
49
49
  __decorate([UpdateDateColumn({ name: "updated_at" }), __decorateMetadata("design:type", typeof (_ref2$1 = typeof Date !== "undefined" && Date) === "function" ? _ref2$1 : Object)], TypeormOutboxEntity.prototype, "updatedAt", void 0);
50
50
  __decorate([Column("character varying", { name: "destination_topic" }), __decorateMetadata("design:type", String)], TypeormOutboxEntity.prototype, "destinationTopic", void 0);
51
51
  __decorate([Column("jsonb", { nullable: true }), __decorateMetadata("design:type", typeof (_ref3$1 = typeof Record !== "undefined" && Record) === "function" ? _ref3$1 : Object)], TypeormOutboxEntity.prototype, "headers", void 0);
52
- __decorate([Column("jsonb", { nullable: true }), __decorateMetadata("design:type", typeof (_ref4$1 = typeof Record !== "undefined" && Record) === "function" ? _ref4$1 : Object)], TypeormOutboxEntity.prototype, "keys", void 0);
52
+ __decorate([Column("jsonb", { nullable: true }), __decorateMetadata("design:type", typeof (_ref4 = typeof Record !== "undefined" && Record) === "function" ? _ref4 : Object)], TypeormOutboxEntity.prototype, "keys", void 0);
53
53
  __decorate([Column("jsonb"), __decorateMetadata("design:type", typeof (_ref5 = typeof Record !== "undefined" && Record) === "function" ? _ref5 : Object)], TypeormOutboxEntity.prototype, "payload", void 0);
54
54
  TypeormOutboxEntity = __decorate([Entity("outbox")], TypeormOutboxEntity);
55
55
 
@@ -74,13 +74,12 @@ function __decorateParam(paramIndex, decorator) {
74
74
 
75
75
  //#endregion
76
76
  //#region src/core/typeorm-outbox-cron.service.ts
77
- var _ref$1, _ref2, _ref3, _ref4;
77
+ var _ref$1, _ref2, _ref3;
78
78
  let TypeormOutboxCronService = class TypeormOutboxCronService {
79
- constructor(entityManager, outboxRepository, brokerClient, moduleConfig) {
80
- this.entityManager = entityManager;
81
- this.outboxRepository = outboxRepository;
79
+ constructor(brokerClient, moduleConfig, dataSource) {
82
80
  this.brokerClient = brokerClient;
83
81
  this.moduleConfig = moduleConfig;
82
+ this.dataSource = dataSource;
84
83
  }
85
84
  onModuleInit() {
86
85
  new CronJob(this.moduleConfig.cronExpression ?? CronExpression.EVERY_10_SECONDS, () => {
@@ -88,30 +87,42 @@ let TypeormOutboxCronService = class TypeormOutboxCronService {
88
87
  }).start();
89
88
  }
90
89
  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);
90
+ const queryRunner = this.dataSource.createQueryRunner();
91
+ await queryRunner.connect();
92
+ const lockKey = hashStringToInt("typeorm-outbox-cron-lock");
93
+ try {
94
+ if (!(await queryRunner.query("SELECT pg_try_advisory_lock($1) as locked", [lockKey]))[0].locked) return;
95
+ try {
96
+ await queryRunner.startTransaction("REPEATABLE READ");
97
+ const entities = await queryRunner.manager.find(TypeormOutboxEntity);
98
+ for (const entity of entities) {
99
+ await firstValueFrom(this.brokerClient.emit(entity.destinationTopic, {
100
+ key: entity.keys,
101
+ value: entity.payload,
102
+ headers: entity.headers
103
+ }));
104
+ await queryRunner.manager.delete(TypeormOutboxEntity, entity.id);
105
+ }
106
+ await queryRunner.commitTransaction();
107
+ } catch (error) {
108
+ await queryRunner.rollbackTransaction();
109
+ throw error;
110
+ } finally {
111
+ await queryRunner.query("SELECT pg_advisory_unlock($1)", [lockKey]);
112
+ }
113
+ } finally {
114
+ await queryRunner.release();
102
115
  }
103
116
  }
104
117
  };
105
118
  TypeormOutboxCronService = __decorate([
106
119
  Injectable(),
107
- __decorateParam(1, InjectRepository(TypeormOutboxEntity)),
108
- __decorateParam(2, InjectTypeormOutboxBroker()),
109
- __decorateParam(3, InjectTypeormOutboxCronConfig()),
120
+ __decorateParam(0, InjectTypeormOutboxBroker()),
121
+ __decorateParam(1, InjectTypeormOutboxCronConfig()),
110
122
  __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
123
+ typeof (_ref$1 = typeof ClientProxy !== "undefined" && ClientProxy) === "function" ? _ref$1 : Object,
124
+ typeof (_ref2 = typeof TypeormOutboxRegisterCronModuleOptions !== "undefined" && TypeormOutboxRegisterCronModuleOptions) === "function" ? _ref2 : Object,
125
+ typeof (_ref3 = typeof DataSource !== "undefined" && DataSource) === "function" ? _ref3 : Object
115
126
  ])
116
127
  ], TypeormOutboxCronService);
117
128
 
@@ -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.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 { 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 { CronExpression } from \"@nestjs/schedule\";\nimport { DataSource } from \"typeorm\";\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 { 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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"}
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.6",
5
5
  "type": "module",
6
6
  "main": "dist/index.mjs",
7
7
  "module": "dist/index.mjs",