@russ-b/nestjs-common-tools 2.1.1 → 2.3.0

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.
Files changed (94) hide show
  1. package/README.md +275 -0
  2. package/dist/common/util/error.util.d.ts +1 -0
  3. package/dist/common/util/error.util.js +10 -0
  4. package/dist/common/util/error.util.js.map +1 -0
  5. package/dist/common/util/index.d.ts +1 -0
  6. package/dist/common/util/index.js +1 -0
  7. package/dist/common/util/index.js.map +1 -1
  8. package/dist/errors/api-error-code.enum.d.ts +11 -0
  9. package/dist/errors/api-error-code.enum.js +16 -0
  10. package/dist/errors/api-error-code.enum.js.map +1 -0
  11. package/dist/errors/api-error-response.type.d.ts +11 -0
  12. package/dist/errors/api-error-response.type.js +3 -0
  13. package/dist/errors/api-error-response.type.js.map +1 -0
  14. package/dist/errors/api-error-root-field.constant.d.ts +1 -0
  15. package/dist/errors/api-error-root-field.constant.js +5 -0
  16. package/dist/errors/api-error-root-field.constant.js.map +1 -0
  17. package/dist/errors/class-validator-exception.factory.d.ts +6 -0
  18. package/dist/errors/class-validator-exception.factory.js +38 -0
  19. package/dist/errors/class-validator-exception.factory.js.map +1 -0
  20. package/dist/errors/error-response.factory.d.ts +10 -0
  21. package/dist/errors/error-response.factory.js +46 -0
  22. package/dist/errors/error-response.factory.js.map +1 -0
  23. package/dist/errors/index.d.ts +5 -0
  24. package/dist/errors/index.js +22 -0
  25. package/dist/errors/index.js.map +1 -0
  26. package/dist/logger/pino/index.d.ts +1 -0
  27. package/dist/{common/filters → logger/pino}/index.js +1 -1
  28. package/dist/logger/pino/index.js.map +1 -0
  29. package/dist/logger/pino-logger.d.ts +13 -0
  30. package/dist/logger/pino-logger.js +62 -0
  31. package/dist/logger/pino-logger.js.map +1 -0
  32. package/dist/modules/index.d.ts +1 -0
  33. package/dist/modules/index.js +1 -0
  34. package/dist/modules/index.js.map +1 -1
  35. package/dist/modules/outbox/entities/index.d.ts +1 -0
  36. package/dist/modules/outbox/entities/index.js +18 -0
  37. package/dist/modules/outbox/entities/index.js.map +1 -0
  38. package/dist/modules/outbox/entities/outbox-event.entity.d.ts +14 -0
  39. package/dist/modules/outbox/entities/outbox-event.entity.js +76 -0
  40. package/dist/modules/outbox/entities/outbox-event.entity.js.map +1 -0
  41. package/dist/modules/outbox/enums/index.d.ts +1 -0
  42. package/dist/modules/outbox/enums/index.js +18 -0
  43. package/dist/modules/outbox/enums/index.js.map +1 -0
  44. package/dist/modules/outbox/enums/outbox-event-status.enum.d.ts +6 -0
  45. package/dist/modules/outbox/enums/outbox-event-status.enum.js +11 -0
  46. package/dist/modules/outbox/enums/outbox-event-status.enum.js.map +1 -0
  47. package/dist/modules/outbox/index.d.ts +6 -0
  48. package/dist/modules/outbox/index.js +23 -0
  49. package/dist/modules/outbox/index.js.map +1 -0
  50. package/dist/modules/outbox/outbox-options.util.d.ts +3 -0
  51. package/dist/modules/outbox/outbox-options.util.js +34 -0
  52. package/dist/modules/outbox/outbox-options.util.js.map +1 -0
  53. package/dist/modules/outbox/outbox.constants.d.ts +2 -0
  54. package/dist/modules/outbox/outbox.constants.js +6 -0
  55. package/dist/modules/outbox/outbox.constants.js.map +1 -0
  56. package/dist/modules/outbox/outbox.module.d.ts +6 -0
  57. package/dist/modules/outbox/outbox.module.js +74 -0
  58. package/dist/modules/outbox/outbox.module.js.map +1 -0
  59. package/dist/modules/outbox/services/base-worker.d.ts +15 -0
  60. package/dist/modules/outbox/services/base-worker.js +99 -0
  61. package/dist/modules/outbox/services/base-worker.js.map +1 -0
  62. package/dist/modules/outbox/services/index.d.ts +3 -0
  63. package/dist/modules/outbox/services/index.js +20 -0
  64. package/dist/modules/outbox/services/index.js.map +1 -0
  65. package/dist/modules/outbox/services/outbox-cleanup.worker.d.ts +9 -0
  66. package/dist/modules/outbox/services/outbox-cleanup.worker.js +59 -0
  67. package/dist/modules/outbox/services/outbox-cleanup.worker.js.map +1 -0
  68. package/dist/modules/outbox/services/outbox.service.d.ts +33 -0
  69. package/dist/modules/outbox/services/outbox.service.js +289 -0
  70. package/dist/modules/outbox/services/outbox.service.js.map +1 -0
  71. package/dist/modules/outbox/types/index.d.ts +1 -0
  72. package/dist/modules/outbox/types/index.js +18 -0
  73. package/dist/modules/outbox/types/index.js.map +1 -0
  74. package/dist/modules/outbox/types/outbox-module-options.interface.d.ts +35 -0
  75. package/dist/modules/outbox/types/outbox-module-options.interface.js +3 -0
  76. package/dist/modules/outbox/types/outbox-module-options.interface.js.map +1 -0
  77. package/dist/zod/filters/index.d.ts +3 -0
  78. package/dist/zod/filters/index.js +20 -0
  79. package/dist/zod/filters/index.js.map +1 -0
  80. package/dist/zod/filters/zod-express-exception.filter.d.ts +8 -0
  81. package/dist/zod/filters/zod-express-exception.filter.js +35 -0
  82. package/dist/zod/filters/zod-express-exception.filter.js.map +1 -0
  83. package/dist/zod/filters/zod-fastify-exception.filter.d.ts +8 -0
  84. package/dist/zod/filters/zod-fastify-exception.filter.js +35 -0
  85. package/dist/zod/filters/zod-fastify-exception.filter.js.map +1 -0
  86. package/dist/zod/filters/zod-validation-error-response.d.ts +6 -0
  87. package/dist/zod/filters/zod-validation-error-response.js +24 -0
  88. package/dist/zod/filters/zod-validation-error-response.js.map +1 -0
  89. package/dist/zod/index.d.ts +1 -0
  90. package/dist/zod/index.js +18 -0
  91. package/dist/zod/index.js.map +1 -0
  92. package/package.json +70 -12
  93. package/dist/common/filters/index.d.ts +0 -1
  94. package/dist/common/filters/index.js.map +0 -1
@@ -0,0 +1,33 @@
1
+ import { EntityManager, Repository } from 'typeorm';
2
+ import { OutboxEvent } from '../entities';
3
+ import { OutboxResolvedModuleOptions } from '../types';
4
+ export interface CreateOutboxEventOptions {
5
+ manager?: EntityManager;
6
+ maxRetries?: number | null;
7
+ nextTryAt?: Date | null;
8
+ }
9
+ export declare class OutboxService {
10
+ private readonly outboxRepository;
11
+ private readonly options;
12
+ constructor(outboxRepository: Repository<OutboxEvent>, options: OutboxResolvedModuleOptions);
13
+ getOperationalPolicy(): OutboxResolvedModuleOptions['operationalPolicy'];
14
+ createEvent(eventType: string, payload: Record<string, any>, optionsOrManager?: CreateOutboxEventOptions | EntityManager): Promise<OutboxEvent>;
15
+ claimById(eventId: string): Promise<OutboxEvent | null>;
16
+ claimPendingEventsByTypes(eventTypes: string[], limit?: number): Promise<OutboxEvent[]>;
17
+ claimPendingEvents(eventType: string, limit?: number): Promise<OutboxEvent[]>;
18
+ markAsProcessing(eventId: string): Promise<void>;
19
+ markAsProcessed(eventId: string, expectedProcessingStartedAt?: Date | null): Promise<boolean>;
20
+ incrementRetry(eventId: string, error: string, fallbackMaxRetries?: number, expectedProcessingStartedAt?: Date | null, nextTryAt?: Date | null): Promise<boolean>;
21
+ markAsFailed(eventId: string, error: string, expectedProcessingStartedAt?: Date | null): Promise<boolean>;
22
+ deleteProcessed(olderThanHours?: number): Promise<number>;
23
+ resetStaleProcessingEvents(staleMinutes?: number): Promise<number>;
24
+ private findEventForProcessingUpdate;
25
+ private updateEvent;
26
+ private addProcessingOwnershipCondition;
27
+ private addReadyToProcessCondition;
28
+ private resolveCreateEventOptions;
29
+ private isEntityManager;
30
+ private resolveEventMaxRetries;
31
+ private resolveEffectiveMaxRetries;
32
+ private requirePositiveInteger;
33
+ }
@@ -0,0 +1,289 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ var __param = (this && this.__param) || function (paramIndex, decorator) {
12
+ return function (target, key) { decorator(target, key, paramIndex); }
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.OutboxService = void 0;
16
+ const common_1 = require("@nestjs/common");
17
+ const typeorm_1 = require("typeorm");
18
+ const entities_1 = require("../entities");
19
+ const enums_1 = require("../enums");
20
+ const outbox_constants_1 = require("../outbox.constants");
21
+ let OutboxService = class OutboxService {
22
+ constructor(outboxRepository, options) {
23
+ this.outboxRepository = outboxRepository;
24
+ this.options = options;
25
+ }
26
+ getOperationalPolicy() {
27
+ return this.options.operationalPolicy;
28
+ }
29
+ async createEvent(eventType, payload, optionsOrManager) {
30
+ const options = this.resolveCreateEventOptions(optionsOrManager);
31
+ const repo = options.manager
32
+ ? options.manager.getRepository(entities_1.OutboxEvent)
33
+ : this.outboxRepository;
34
+ const event = repo.create({
35
+ eventType,
36
+ payload,
37
+ status: enums_1.OutboxEventStatus.PENDING,
38
+ maxRetries: this.resolveEventMaxRetries(options.maxRetries),
39
+ nextTryAt: options.nextTryAt ?? null,
40
+ });
41
+ return repo.save(event);
42
+ }
43
+ async claimById(eventId) {
44
+ return this.outboxRepository.manager.transaction(async (manager) => {
45
+ const processingStartedAt = new Date();
46
+ const query = manager
47
+ .createQueryBuilder()
48
+ .update(entities_1.OutboxEvent)
49
+ .set({
50
+ status: enums_1.OutboxEventStatus.PROCESSING,
51
+ processingStartedAt,
52
+ nextTryAt: null,
53
+ })
54
+ .where('id = :id', { id: eventId })
55
+ .andWhere('status = :status', { status: enums_1.OutboxEventStatus.PENDING });
56
+ this.addReadyToProcessCondition(query, processingStartedAt);
57
+ const result = await query.execute();
58
+ if (!result.affected) {
59
+ return null;
60
+ }
61
+ return manager.findOne(entities_1.OutboxEvent, { where: { id: eventId } });
62
+ });
63
+ }
64
+ async claimPendingEventsByTypes(eventTypes, limit = this.options.operationalPolicy.claimBatchSize) {
65
+ if (eventTypes.length === 0) {
66
+ return [];
67
+ }
68
+ return this.outboxRepository.manager.transaction(async (manager) => {
69
+ const query = manager
70
+ .createQueryBuilder(entities_1.OutboxEvent, 'outbox')
71
+ .where('outbox.status = :status', { status: enums_1.OutboxEventStatus.PENDING })
72
+ .andWhere('outbox.eventType IN (:...eventTypes)', { eventTypes });
73
+ this.addReadyToProcessCondition(query, new Date(), 'outbox');
74
+ const events = await query
75
+ .orderBy('outbox.createdAt', 'ASC')
76
+ .limit(limit)
77
+ .setLock('pessimistic_write')
78
+ .setOnLocked('skip_locked')
79
+ .getMany();
80
+ if (events.length > 0) {
81
+ const eventIds = events.map((e) => e.id);
82
+ const processingStartedAt = new Date();
83
+ await manager
84
+ .createQueryBuilder()
85
+ .update(entities_1.OutboxEvent)
86
+ .set({
87
+ status: enums_1.OutboxEventStatus.PROCESSING,
88
+ processingStartedAt,
89
+ nextTryAt: null,
90
+ })
91
+ .whereInIds(eventIds)
92
+ .execute();
93
+ events.forEach((e) => {
94
+ e.status = enums_1.OutboxEventStatus.PROCESSING;
95
+ e.processingStartedAt = processingStartedAt;
96
+ e.nextTryAt = null;
97
+ });
98
+ }
99
+ return events;
100
+ });
101
+ }
102
+ async claimPendingEvents(eventType, limit = this.options.operationalPolicy.claimBatchSize) {
103
+ return this.outboxRepository.manager.transaction(async (manager) => {
104
+ // Fetch pending events with pessimistic lock
105
+ const query = manager
106
+ .createQueryBuilder(entities_1.OutboxEvent, 'outbox')
107
+ .where('outbox.status = :status', { status: enums_1.OutboxEventStatus.PENDING })
108
+ .andWhere('outbox.eventType = :eventType', { eventType });
109
+ this.addReadyToProcessCondition(query, new Date(), 'outbox');
110
+ const events = await query
111
+ .orderBy('outbox.createdAt', 'ASC')
112
+ .limit(limit)
113
+ .setLock('pessimistic_write')
114
+ .setOnLocked('skip_locked')
115
+ .getMany();
116
+ // Immediately mark as PROCESSING while we hold the lock
117
+ if (events.length > 0) {
118
+ const eventIds = events.map((e) => e.id);
119
+ const processingStartedAt = new Date();
120
+ await manager
121
+ .createQueryBuilder()
122
+ .update(entities_1.OutboxEvent)
123
+ .set({
124
+ status: enums_1.OutboxEventStatus.PROCESSING,
125
+ processingStartedAt,
126
+ nextTryAt: null,
127
+ })
128
+ .whereInIds(eventIds)
129
+ .execute();
130
+ // Update the in-memory objects too
131
+ events.forEach((e) => {
132
+ e.status = enums_1.OutboxEventStatus.PROCESSING;
133
+ e.processingStartedAt = processingStartedAt;
134
+ e.nextTryAt = null;
135
+ });
136
+ }
137
+ return events;
138
+ });
139
+ }
140
+ async markAsProcessing(eventId) {
141
+ await this.outboxRepository.update(eventId, {
142
+ status: enums_1.OutboxEventStatus.PROCESSING,
143
+ processingStartedAt: new Date(),
144
+ nextTryAt: null,
145
+ });
146
+ }
147
+ async markAsProcessed(eventId, expectedProcessingStartedAt) {
148
+ return this.updateEvent(eventId, {
149
+ status: enums_1.OutboxEventStatus.PROCESSED,
150
+ processingStartedAt: null,
151
+ nextTryAt: null,
152
+ processedAt: new Date(),
153
+ }, expectedProcessingStartedAt);
154
+ }
155
+ async incrementRetry(eventId, error, fallbackMaxRetries = this.options.operationalPolicy.maxRetries, expectedProcessingStartedAt, nextTryAt) {
156
+ const event = await this.findEventForProcessingUpdate(eventId, expectedProcessingStartedAt);
157
+ if (!event) {
158
+ return false;
159
+ }
160
+ const newRetryCount = event.retryCount + 1;
161
+ const maxRetries = this.resolveEffectiveMaxRetries(event.maxRetries, fallbackMaxRetries);
162
+ if (newRetryCount >= maxRetries) {
163
+ return this.updateEvent(eventId, {
164
+ status: enums_1.OutboxEventStatus.FAILED,
165
+ lastError: error,
166
+ retryCount: newRetryCount,
167
+ processingStartedAt: null,
168
+ nextTryAt: null,
169
+ }, expectedProcessingStartedAt);
170
+ }
171
+ return this.updateEvent(eventId, {
172
+ status: enums_1.OutboxEventStatus.PENDING,
173
+ lastError: error,
174
+ retryCount: newRetryCount,
175
+ processingStartedAt: null,
176
+ nextTryAt: nextTryAt ?? null,
177
+ }, expectedProcessingStartedAt);
178
+ }
179
+ async markAsFailed(eventId, error, expectedProcessingStartedAt) {
180
+ const event = await this.findEventForProcessingUpdate(eventId, expectedProcessingStartedAt);
181
+ return this.updateEvent(eventId, {
182
+ status: enums_1.OutboxEventStatus.FAILED,
183
+ lastError: error,
184
+ retryCount: event?.retryCount || 0,
185
+ processingStartedAt: null,
186
+ nextTryAt: null,
187
+ }, expectedProcessingStartedAt);
188
+ }
189
+ async deleteProcessed(olderThanHours = this.options.operationalPolicy
190
+ .processedEventRetentionHours) {
191
+ const threshold = new Date(Date.now() - olderThanHours * 60 * 60 * 1000);
192
+ const result = await this.outboxRepository
193
+ .createQueryBuilder()
194
+ .delete()
195
+ .where('status = :status', { status: enums_1.OutboxEventStatus.PROCESSED })
196
+ .andWhere('processed_at < :threshold', { threshold })
197
+ .execute();
198
+ return result.affected || 0;
199
+ }
200
+ async resetStaleProcessingEvents(staleMinutes = this.options.operationalPolicy.staleProcessingMinutes) {
201
+ const staleThreshold = new Date(Date.now() - staleMinutes * 60 * 1000);
202
+ const result = await this.outboxRepository
203
+ .createQueryBuilder()
204
+ .update(entities_1.OutboxEvent)
205
+ .set({
206
+ status: enums_1.OutboxEventStatus.PENDING,
207
+ processingStartedAt: null,
208
+ nextTryAt: null,
209
+ })
210
+ .where('status = :status', { status: enums_1.OutboxEventStatus.PROCESSING })
211
+ .andWhere('processing_started_at < :staleThreshold', { staleThreshold })
212
+ .execute();
213
+ return result.affected || 0;
214
+ }
215
+ async findEventForProcessingUpdate(eventId, expectedProcessingStartedAt) {
216
+ const query = this.outboxRepository
217
+ .createQueryBuilder('outbox')
218
+ .where('outbox.id = :eventId', { eventId });
219
+ this.addProcessingOwnershipCondition(query, expectedProcessingStartedAt);
220
+ return query.getOne();
221
+ }
222
+ async updateEvent(eventId, values, expectedProcessingStartedAt) {
223
+ const query = this.outboxRepository
224
+ .createQueryBuilder()
225
+ .update(entities_1.OutboxEvent)
226
+ .set(values)
227
+ .where('id = :eventId', { eventId });
228
+ this.addProcessingOwnershipCondition(query, expectedProcessingStartedAt);
229
+ const result = await query.execute();
230
+ return Boolean(result.affected);
231
+ }
232
+ addProcessingOwnershipCondition(query, expectedProcessingStartedAt) {
233
+ if (expectedProcessingStartedAt === undefined) {
234
+ return;
235
+ }
236
+ query.andWhere('status = :processingStatus', {
237
+ processingStatus: enums_1.OutboxEventStatus.PROCESSING,
238
+ });
239
+ if (expectedProcessingStartedAt === null) {
240
+ query.andWhere('processing_started_at IS NULL');
241
+ return;
242
+ }
243
+ query.andWhere('processing_started_at = :expectedProcessingStartedAt', {
244
+ expectedProcessingStartedAt,
245
+ });
246
+ }
247
+ addReadyToProcessCondition(query, now, alias) {
248
+ const prefix = alias ? `${alias}.` : '';
249
+ query.andWhere(`(${prefix}next_try_at IS NULL OR ${prefix}next_try_at <= :now)`, { now });
250
+ }
251
+ resolveCreateEventOptions(optionsOrManager) {
252
+ if (!optionsOrManager) {
253
+ return {};
254
+ }
255
+ if (this.isEntityManager(optionsOrManager)) {
256
+ return { manager: optionsOrManager };
257
+ }
258
+ return optionsOrManager;
259
+ }
260
+ isEntityManager(value) {
261
+ return typeof value.getRepository === 'function';
262
+ }
263
+ resolveEventMaxRetries(maxRetries) {
264
+ if (maxRetries === undefined || maxRetries === null) {
265
+ return null;
266
+ }
267
+ return this.requirePositiveInteger(maxRetries, 'maxRetries');
268
+ }
269
+ resolveEffectiveMaxRetries(eventMaxRetries, fallbackMaxRetries) {
270
+ if (eventMaxRetries !== null) {
271
+ return this.requirePositiveInteger(eventMaxRetries, 'event.maxRetries');
272
+ }
273
+ return this.requirePositiveInteger(fallbackMaxRetries, 'fallbackMaxRetries');
274
+ }
275
+ requirePositiveInteger(value, optionName) {
276
+ if (Number.isInteger(value) && value > 0) {
277
+ return value;
278
+ }
279
+ throw new TypeError(`${optionName} must be a positive integer.`);
280
+ }
281
+ };
282
+ exports.OutboxService = OutboxService;
283
+ exports.OutboxService = OutboxService = __decorate([
284
+ (0, common_1.Injectable)(),
285
+ __param(0, (0, common_1.Inject)(outbox_constants_1.OUTBOX_EVENT_REPOSITORY)),
286
+ __param(1, (0, common_1.Inject)(outbox_constants_1.OUTBOX_MODULE_OPTIONS)),
287
+ __metadata("design:paramtypes", [typeorm_1.Repository, Object])
288
+ ], OutboxService);
289
+ //# sourceMappingURL=outbox.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outbox.service.js","sourceRoot":"","sources":["../../../../src/modules/outbox/services/outbox.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export * from './outbox-module-options.interface';
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./outbox-module-options.interface"), exports);
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/modules/outbox/types/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,oEAAkD"}
@@ -0,0 +1,35 @@
1
+ import type { ModuleMetadata } from '@nestjs/common';
2
+ import type { DataSource, DataSourceOptions } from 'typeorm';
3
+ export type OutboxDataSource = DataSource | DataSourceOptions | string;
4
+ export interface OutboxOperationalPolicy {
5
+ claimBatchSize?: number;
6
+ maxRetries?: number;
7
+ staleProcessingMinutes?: number;
8
+ resetStaleProcessingEvents?: boolean;
9
+ maxConcurrentEvents?: number;
10
+ processedEventRetentionHours?: number;
11
+ }
12
+ export interface OutboxResolvedOperationalPolicy {
13
+ claimBatchSize: number;
14
+ maxRetries: number;
15
+ staleProcessingMinutes: number;
16
+ resetStaleProcessingEvents: boolean;
17
+ maxConcurrentEvents?: number;
18
+ processedEventRetentionHours: number;
19
+ }
20
+ export interface OutboxModuleOptions {
21
+ operationalPolicy?: OutboxOperationalPolicy;
22
+ }
23
+ export interface OutboxModuleRootOptions extends OutboxModuleOptions {
24
+ dataSource?: OutboxDataSource;
25
+ global?: boolean;
26
+ }
27
+ export interface OutboxModuleAsyncOptions extends Pick<ModuleMetadata, 'imports'> {
28
+ useFactory: (...args: any[]) => Promise<OutboxModuleOptions> | OutboxModuleOptions;
29
+ inject?: any[];
30
+ dataSource?: OutboxDataSource;
31
+ global?: boolean;
32
+ }
33
+ export interface OutboxResolvedModuleOptions {
34
+ operationalPolicy: OutboxResolvedOperationalPolicy;
35
+ }
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=outbox-module-options.interface.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"outbox-module-options.interface.js","sourceRoot":"","sources":["../../../../src/modules/outbox/types/outbox-module-options.interface.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ export * from './zod-express-exception.filter';
2
+ export * from './zod-fastify-exception.filter';
3
+ export * from './zod-validation-error-response';
@@ -0,0 +1,20 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./zod-express-exception.filter"), exports);
18
+ __exportStar(require("./zod-fastify-exception.filter"), exports);
19
+ __exportStar(require("./zod-validation-error-response"), exports);
20
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/zod/filters/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,iEAA+C;AAC/C,iEAA+C;AAC/C,kEAAgD"}
@@ -0,0 +1,8 @@
1
+ import { ArgumentsHost, ExceptionFilter } from '@nestjs/common';
2
+ import { ZodError } from 'zod';
3
+ import { ZodExceptionFilterOptions } from './zod-validation-error-response';
4
+ export declare class ZodExpressExceptionFilter implements ExceptionFilter<ZodError> {
5
+ private readonly options;
6
+ constructor(options?: ZodExceptionFilterOptions);
7
+ catch(exception: ZodError, host: ArgumentsHost): void;
8
+ }
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.ZodExpressExceptionFilter = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const zod_1 = require("zod");
15
+ const zod_validation_error_response_1 = require("./zod-validation-error-response");
16
+ let ZodExpressExceptionFilter = class ZodExpressExceptionFilter {
17
+ constructor(options = {}) {
18
+ this.options = options;
19
+ }
20
+ catch(exception, host) {
21
+ if (host.getType() !== 'http') {
22
+ throw exception;
23
+ }
24
+ const response = host.switchToHttp().getResponse();
25
+ response
26
+ .status(common_1.HttpStatus.BAD_REQUEST)
27
+ .json((0, zod_validation_error_response_1.createZodValidationErrorResponse)(exception, this.options));
28
+ }
29
+ };
30
+ exports.ZodExpressExceptionFilter = ZodExpressExceptionFilter;
31
+ exports.ZodExpressExceptionFilter = ZodExpressExceptionFilter = __decorate([
32
+ (0, common_1.Catch)(zod_1.ZodError),
33
+ __metadata("design:paramtypes", [Object])
34
+ ], ZodExpressExceptionFilter);
35
+ //# sourceMappingURL=zod-express-exception.filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zod-express-exception.filter.js","sourceRoot":"","sources":["../../../src/zod/filters/zod-express-exception.filter.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAKwB;AAExB,6BAA+B;AAC/B,mFAGyC;AAGlC,IAAM,yBAAyB,GAA/B,MAAM,yBAAyB;IACpC,YAA6B,UAAqC,EAAE;QAAvC,YAAO,GAAP,OAAO,CAAgC;IAAG,CAAC;IAExE,KAAK,CAAC,SAAmB,EAAE,IAAmB;QAC5C,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,MAAM,EAAE,CAAC;YAC9B,MAAM,SAAS,CAAC;QAClB,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,WAAW,EAAY,CAAC;QAE7D,QAAQ;aACL,MAAM,CAAC,mBAAU,CAAC,WAAW,CAAC;aAC9B,IAAI,CAAC,IAAA,gEAAgC,EAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IACrE,CAAC;CACF,CAAA;AAdY,8DAAyB;oCAAzB,yBAAyB;IADrC,IAAA,cAAK,EAAC,cAAQ,CAAC;;GACH,yBAAyB,CAcrC"}
@@ -0,0 +1,8 @@
1
+ import { ArgumentsHost, ExceptionFilter } from '@nestjs/common';
2
+ import { ZodError } from 'zod';
3
+ import { ZodExceptionFilterOptions } from './zod-validation-error-response';
4
+ export declare class ZodFastifyExceptionFilter implements ExceptionFilter<ZodError> {
5
+ private readonly options;
6
+ constructor(options?: ZodExceptionFilterOptions);
7
+ catch(exception: ZodError, host: ArgumentsHost): void;
8
+ }
@@ -0,0 +1,35 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.ZodFastifyExceptionFilter = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const zod_1 = require("zod");
15
+ const zod_validation_error_response_1 = require("./zod-validation-error-response");
16
+ let ZodFastifyExceptionFilter = class ZodFastifyExceptionFilter {
17
+ constructor(options = {}) {
18
+ this.options = options;
19
+ }
20
+ catch(exception, host) {
21
+ if (host.getType() !== 'http') {
22
+ throw exception;
23
+ }
24
+ const response = host.switchToHttp().getResponse();
25
+ response
26
+ .code(common_1.HttpStatus.BAD_REQUEST)
27
+ .send((0, zod_validation_error_response_1.createZodValidationErrorResponse)(exception, this.options));
28
+ }
29
+ };
30
+ exports.ZodFastifyExceptionFilter = ZodFastifyExceptionFilter;
31
+ exports.ZodFastifyExceptionFilter = ZodFastifyExceptionFilter = __decorate([
32
+ (0, common_1.Catch)(zod_1.ZodError),
33
+ __metadata("design:paramtypes", [Object])
34
+ ], ZodFastifyExceptionFilter);
35
+ //# sourceMappingURL=zod-fastify-exception.filter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zod-fastify-exception.filter.js","sourceRoot":"","sources":["../../../src/zod/filters/zod-fastify-exception.filter.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2CAKwB;AAExB,6BAA+B;AAC/B,mFAGyC;AAGlC,IAAM,yBAAyB,GAA/B,MAAM,yBAAyB;IACpC,YAA6B,UAAqC,EAAE;QAAvC,YAAO,GAAP,OAAO,CAAgC;IAAG,CAAC;IAExE,KAAK,CAAC,SAAmB,EAAE,IAAmB;QAC5C,IAAI,IAAI,CAAC,OAAO,EAAE,KAAK,MAAM,EAAE,CAAC;YAC9B,MAAM,SAAS,CAAC;QAClB,CAAC;QAED,MAAM,QAAQ,GAAG,IAAI,CAAC,YAAY,EAAE,CAAC,WAAW,EAAgB,CAAC;QAEjE,QAAQ;aACL,IAAI,CAAC,mBAAU,CAAC,WAAW,CAAC;aAC5B,IAAI,CAAC,IAAA,gEAAgC,EAAC,SAAS,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC;IACrE,CAAC;CACF,CAAA;AAdY,8DAAyB;oCAAzB,yBAAyB;IADrC,IAAA,cAAK,EAAC,cAAQ,CAAC;;GACH,yBAAyB,CAcrC"}
@@ -0,0 +1,6 @@
1
+ import type { ZodError } from 'zod';
2
+ import type { ApiErrorResponse } from '../../errors';
3
+ export interface ZodExceptionFilterOptions {
4
+ message?: string;
5
+ }
6
+ export declare function createZodValidationErrorResponse(exception: ZodError, options?: ZodExceptionFilterOptions): ApiErrorResponse;
@@ -0,0 +1,24 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.createZodValidationErrorResponse = createZodValidationErrorResponse;
4
+ const common_1 = require("@nestjs/common");
5
+ const errors_1 = require("../../errors");
6
+ const DEFAULT_VALIDATION_ERROR_MESSAGE = 'Validation failed';
7
+ function createZodValidationErrorResponse(exception, options = {}) {
8
+ return (0, errors_1.createApiErrorResponse)({
9
+ statusCode: common_1.HttpStatus.BAD_REQUEST,
10
+ message: options.message ?? DEFAULT_VALIDATION_ERROR_MESSAGE,
11
+ code: errors_1.ApiErrorCode.VALIDATION_FAILED,
12
+ errors: exception.issues.map((issue) => ({
13
+ field: formatZodIssuePath(issue.path),
14
+ message: issue.message,
15
+ })),
16
+ });
17
+ }
18
+ function formatZodIssuePath(path) {
19
+ if (path.length === 0) {
20
+ return errors_1.API_ERROR_ROOT_FIELD;
21
+ }
22
+ return path.map(String).join('.');
23
+ }
24
+ //# sourceMappingURL=zod-validation-error-response.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zod-validation-error-response.js","sourceRoot":"","sources":["../../../src/zod/filters/zod-validation-error-response.ts"],"names":[],"mappings":";;AAeA,4EAaC;AA5BD,2CAA4C;AAE5C,yCAIsB;AAOtB,MAAM,gCAAgC,GAAG,mBAAmB,CAAC;AAE7D,SAAgB,gCAAgC,CAC9C,SAAmB,EACnB,UAAqC,EAAE;IAEvC,OAAO,IAAA,+BAAsB,EAAC;QAC5B,UAAU,EAAE,mBAAU,CAAC,WAAW;QAClC,OAAO,EAAE,OAAO,CAAC,OAAO,IAAI,gCAAgC;QAC5D,IAAI,EAAE,qBAAY,CAAC,iBAAiB;QACpC,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACvC,KAAK,EAAE,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC;YACrC,OAAO,EAAE,KAAK,CAAC,OAAO;SACvB,CAAC,CAAC;KACJ,CAAC,CAAC;AACL,CAAC;AAED,SAAS,kBAAkB,CACzB,IAA4B;IAE5B,IAAI,IAAI,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtB,OAAO,6BAAoB,CAAC;IAC9B,CAAC;IAED,OAAO,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACpC,CAAC"}
@@ -0,0 +1 @@
1
+ export * from './filters';
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ __exportStar(require("./filters"), exports);
18
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/zod/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,4CAA0B"}