@quanticjs/core 1.1.1
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/bootstrap/bootstrapService.d.ts +8 -0
- package/dist/bootstrap/bootstrapService.js +58 -0
- package/dist/cqrs/PipelineExecutor.d.ts +31 -0
- package/dist/cqrs/PipelineExecutor.js +81 -0
- package/dist/cqrs/behaviors/CacheBehavior.d.ts +9 -0
- package/dist/cqrs/behaviors/CacheBehavior.js +68 -0
- package/dist/cqrs/behaviors/DistributedLockBehavior.d.ts +12 -0
- package/dist/cqrs/behaviors/DistributedLockBehavior.js +90 -0
- package/dist/cqrs/behaviors/FeatureFlagBehavior.d.ts +8 -0
- package/dist/cqrs/behaviors/FeatureFlagBehavior.js +58 -0
- package/dist/cqrs/behaviors/InvalidateCacheBehavior.d.ts +9 -0
- package/dist/cqrs/behaviors/InvalidateCacheBehavior.js +61 -0
- package/dist/cqrs/behaviors/LogBehavior.d.ts +9 -0
- package/dist/cqrs/behaviors/LogBehavior.js +125 -0
- package/dist/cqrs/behaviors/PerformanceBehavior.d.ts +12 -0
- package/dist/cqrs/behaviors/PerformanceBehavior.js +56 -0
- package/dist/cqrs/behaviors/TransactionalBehavior.d.ts +18 -0
- package/dist/cqrs/behaviors/TransactionalBehavior.js +77 -0
- package/dist/cqrs/behaviors/ValidationBehavior.d.ts +4 -0
- package/dist/cqrs/behaviors/ValidationBehavior.js +33 -0
- package/dist/cqrs/behaviors/WorkflowBehavior.d.ts +8 -0
- package/dist/cqrs/behaviors/WorkflowBehavior.js +61 -0
- package/dist/cqrs/constants.d.ts +2 -0
- package/dist/cqrs/constants.js +5 -0
- package/dist/cqrs/decorators/Cache.decorator.d.ts +13 -0
- package/dist/cqrs/decorators/Cache.decorator.js +18 -0
- package/dist/cqrs/decorators/DistributedLock.decorator.d.ts +15 -0
- package/dist/cqrs/decorators/DistributedLock.decorator.js +23 -0
- package/dist/cqrs/decorators/FeatureFlag.decorator.d.ts +9 -0
- package/dist/cqrs/decorators/FeatureFlag.decorator.js +14 -0
- package/dist/cqrs/decorators/InvalidateCache.decorator.d.ts +6 -0
- package/dist/cqrs/decorators/InvalidateCache.decorator.js +14 -0
- package/dist/cqrs/decorators/IsolatedTransaction.decorator.d.ts +14 -0
- package/dist/cqrs/decorators/IsolatedTransaction.decorator.js +25 -0
- package/dist/cqrs/decorators/Log.decorator.d.ts +11 -0
- package/dist/cqrs/decorators/Log.decorator.js +18 -0
- package/dist/cqrs/decorators/Validate.decorator.d.ts +24 -0
- package/dist/cqrs/decorators/Validate.decorator.js +37 -0
- package/dist/cqrs/decorators/Workflow.decorator.d.ts +8 -0
- package/dist/cqrs/decorators/Workflow.decorator.js +14 -0
- package/dist/cqrs/interfaces/WorkflowEngine.d.ts +14 -0
- package/dist/cqrs/interfaces/WorkflowEngine.js +4 -0
- package/dist/cqrs/pipeline/QuanticCommandBus.d.ts +37 -0
- package/dist/cqrs/pipeline/QuanticCommandBus.js +99 -0
- package/dist/cqrs/pipeline/QuanticQueryBus.d.ts +28 -0
- package/dist/cqrs/pipeline/QuanticQueryBus.js +78 -0
- package/dist/cqrs/pipeline/runPipeline.d.ts +3 -0
- package/dist/cqrs/pipeline/runPipeline.js +12 -0
- package/dist/cqrs/transaction/TransactionContext.d.ts +18 -0
- package/dist/cqrs/transaction/TransactionContext.js +26 -0
- package/dist/cqrs/transaction/getTransactionalRepo.d.ts +16 -0
- package/dist/cqrs/transaction/getTransactionalRepo.js +22 -0
- package/dist/cqrs/validation/ICommandValidator.d.ts +48 -0
- package/dist/cqrs/validation/ICommandValidator.js +21 -0
- package/dist/entities/BaseEntity.d.ts +5 -0
- package/dist/entities/BaseEntity.js +31 -0
- package/dist/entities/TenantBaseEntity.d.ts +4 -0
- package/dist/entities/TenantBaseEntity.js +22 -0
- package/dist/events/DomainEvent.d.ts +14 -0
- package/dist/events/DomainEvent.js +27 -0
- package/dist/events/OutboxEvent.entity.d.ts +18 -0
- package/dist/events/OutboxEvent.entity.js +87 -0
- package/dist/events/OutboxPublisherService.d.ts +14 -0
- package/dist/events/OutboxPublisherService.js +104 -0
- package/dist/events/RedisStreamConsumer.d.ts +43 -0
- package/dist/events/RedisStreamConsumer.js +158 -0
- package/dist/events/RedisStreamPublisher.d.ts +9 -0
- package/dist/events/RedisStreamPublisher.js +60 -0
- package/dist/filters/GlobalExceptionFilter.d.ts +11 -0
- package/dist/filters/GlobalExceptionFilter.js +102 -0
- package/dist/guards/JwtAuthGuard.d.ts +10 -0
- package/dist/guards/JwtAuthGuard.js +46 -0
- package/dist/guards/JwtStrategy.d.ts +22 -0
- package/dist/guards/JwtStrategy.js +47 -0
- package/dist/guards/RolesGuard.d.ts +8 -0
- package/dist/guards/RolesGuard.js +52 -0
- package/dist/index.d.ts +69 -0
- package/dist/index.js +146 -0
- package/dist/interceptors/ResultInterceptor.d.ts +7 -0
- package/dist/interceptors/ResultInterceptor.js +88 -0
- package/dist/lifecycle/GracefulShutdownService.d.ts +24 -0
- package/dist/lifecycle/GracefulShutdownService.js +93 -0
- package/dist/logging/pino-config.d.ts +35 -0
- package/dist/logging/pino-config.js +79 -0
- package/dist/metrics/MetricsController.d.ts +7 -0
- package/dist/metrics/MetricsController.js +42 -0
- package/dist/metrics/MetricsService.d.ts +13 -0
- package/dist/metrics/MetricsService.js +58 -0
- package/dist/middleware/CorrelationIdMiddleware.d.ts +4 -0
- package/dist/middleware/CorrelationIdMiddleware.js +33 -0
- package/dist/middleware/CorrelationStore.d.ts +11 -0
- package/dist/middleware/CorrelationStore.js +9 -0
- package/dist/middleware/TenantContextMiddleware.d.ts +7 -0
- package/dist/middleware/TenantContextMiddleware.js +27 -0
- package/dist/middleware/TenantStore.d.ts +9 -0
- package/dist/middleware/TenantStore.js +9 -0
- package/dist/redis/redis.module.d.ts +8 -0
- package/dist/redis/redis.module.js +49 -0
- package/dist/resilience/CircuitBreakerFactory.d.ts +12 -0
- package/dist/resilience/CircuitBreakerFactory.js +22 -0
- package/dist/result/Result.d.ts +26 -0
- package/dist/result/Result.js +62 -0
- package/dist/shared-kernel.module.d.ts +13 -0
- package/dist/shared-kernel.module.js +87 -0
- package/dist/subscribers/TenantSubscriber.d.ts +20 -0
- package/dist/subscribers/TenantSubscriber.js +52 -0
- package/dist/testing/TestingModuleFactory.d.ts +23 -0
- package/dist/testing/TestingModuleFactory.js +63 -0
- package/dist/testing/index.d.ts +2 -0
- package/dist/testing/index.js +7 -0
- package/dist/testing/mocks.d.ts +34 -0
- package/dist/testing/mocks.js +62 -0
- package/dist/unleash/initial-flags.d.ts +7 -0
- package/dist/unleash/initial-flags.js +9 -0
- package/dist/unleash/unleash.module.d.ts +9 -0
- package/dist/unleash/unleash.module.js +47 -0
- package/package.json +140 -0
- package/src/bootstrap/bootstrapService.ts +72 -0
- package/src/cqrs/behaviors/CacheBehavior.spec.ts +63 -0
- package/src/cqrs/behaviors/CacheBehavior.ts +54 -0
- package/src/cqrs/behaviors/DistributedLockBehavior.ts +88 -0
- package/src/cqrs/behaviors/FeatureFlagBehavior.ts +46 -0
- package/src/cqrs/behaviors/InvalidateCacheBehavior.spec.ts +89 -0
- package/src/cqrs/behaviors/InvalidateCacheBehavior.ts +50 -0
- package/src/cqrs/behaviors/LogBehavior.spec.ts +55 -0
- package/src/cqrs/behaviors/LogBehavior.ts +121 -0
- package/src/cqrs/behaviors/PerformanceBehavior.spec.ts +48 -0
- package/src/cqrs/behaviors/PerformanceBehavior.ts +43 -0
- package/src/cqrs/behaviors/TransactionalBehavior.ts +64 -0
- package/src/cqrs/behaviors/ValidationBehavior.spec.ts +114 -0
- package/src/cqrs/behaviors/ValidationBehavior.ts +29 -0
- package/src/cqrs/behaviors/WorkflowBehavior.spec.ts +97 -0
- package/src/cqrs/behaviors/WorkflowBehavior.ts +62 -0
- package/src/cqrs/constants.ts +2 -0
- package/src/cqrs/decorators/Cache.decorator.ts +24 -0
- package/src/cqrs/decorators/DistributedLock.decorator.ts +34 -0
- package/src/cqrs/decorators/FeatureFlag.decorator.ts +23 -0
- package/src/cqrs/decorators/InvalidateCache.decorator.spec.ts +20 -0
- package/src/cqrs/decorators/InvalidateCache.decorator.ts +17 -0
- package/src/cqrs/decorators/IsolatedTransaction.decorator.ts +24 -0
- package/src/cqrs/decorators/Log.decorator.ts +22 -0
- package/src/cqrs/decorators/Validate.decorator.ts +39 -0
- package/src/cqrs/decorators/Workflow.decorator.ts +22 -0
- package/src/cqrs/interfaces/WorkflowEngine.ts +19 -0
- package/src/cqrs/pipeline/QuanticCommandBus.ts +69 -0
- package/src/cqrs/pipeline/QuanticQueryBus.ts +56 -0
- package/src/cqrs/pipeline/runPipeline.ts +22 -0
- package/src/cqrs/transaction/TransactionContext.ts +26 -0
- package/src/cqrs/transaction/getTransactionalRepo.ts +23 -0
- package/src/cqrs/validation/ICommandValidator.ts +55 -0
- package/src/entities/BaseEntity.ts +16 -0
- package/src/entities/TenantBaseEntity.ts +7 -0
- package/src/events/DomainEvent.ts +27 -0
- package/src/events/OutboxEvent.entity.ts +56 -0
- package/src/events/OutboxPublisherService.ts +94 -0
- package/src/events/RedisStreamConsumer.ts +172 -0
- package/src/events/RedisStreamPublisher.ts +54 -0
- package/src/filters/GlobalExceptionFilter.ts +125 -0
- package/src/guards/JwtAuthGuard.ts +29 -0
- package/src/guards/JwtStrategy.ts +41 -0
- package/src/guards/RolesGuard.ts +39 -0
- package/src/index.ts +118 -0
- package/src/interceptors/ResultInterceptor.ts +93 -0
- package/src/lifecycle/GracefulShutdownService.ts +77 -0
- package/src/logging/pino-config.ts +80 -0
- package/src/metrics/MetricsController.ts +17 -0
- package/src/metrics/MetricsService.ts +55 -0
- package/src/middleware/CorrelationIdMiddleware.ts +27 -0
- package/src/middleware/CorrelationStore.ts +13 -0
- package/src/middleware/TenantContextMiddleware.ts +21 -0
- package/src/middleware/TenantStore.ts +11 -0
- package/src/redis/redis.module.ts +41 -0
- package/src/resilience/CircuitBreakerFactory.ts +33 -0
- package/src/result/Result.ts +66 -0
- package/src/shared-kernel.module.ts +87 -0
- package/src/subscribers/TenantSubscriber.ts +47 -0
- package/src/testing/TestingModuleFactory.ts +78 -0
- package/src/testing/index.ts +2 -0
- package/src/testing/mocks.ts +59 -0
- package/src/unleash/unleash.module.ts +45 -0
- package/tsconfig.json +22 -0
|
@@ -0,0 +1,52 @@
|
|
|
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.RolesGuard = exports.Roles = void 0;
|
|
13
|
+
const common_1 = require("@nestjs/common");
|
|
14
|
+
const core_1 = require("@nestjs/core");
|
|
15
|
+
const ROLES_KEY = 'roles';
|
|
16
|
+
const Roles = (...roles) => (target, _key, descriptor) => {
|
|
17
|
+
if (descriptor) {
|
|
18
|
+
Reflect.defineMetadata(ROLES_KEY, roles, descriptor.value);
|
|
19
|
+
}
|
|
20
|
+
else {
|
|
21
|
+
Reflect.defineMetadata(ROLES_KEY, roles, target);
|
|
22
|
+
}
|
|
23
|
+
};
|
|
24
|
+
exports.Roles = Roles;
|
|
25
|
+
let RolesGuard = class RolesGuard {
|
|
26
|
+
reflector;
|
|
27
|
+
constructor(reflector) {
|
|
28
|
+
this.reflector = reflector;
|
|
29
|
+
}
|
|
30
|
+
canActivate(context) {
|
|
31
|
+
const requiredRoles = this.reflector.getAllAndOverride(ROLES_KEY, [
|
|
32
|
+
context.getHandler(),
|
|
33
|
+
context.getClass(),
|
|
34
|
+
]);
|
|
35
|
+
if (!requiredRoles || requiredRoles.length === 0)
|
|
36
|
+
return true;
|
|
37
|
+
const request = context.switchToHttp().getRequest();
|
|
38
|
+
const userRoles = request.user?.roles || [];
|
|
39
|
+
const hasRole = requiredRoles.some((role) => userRoles.includes(role));
|
|
40
|
+
if (!hasRole) {
|
|
41
|
+
throw new common_1.ForbiddenException({
|
|
42
|
+
error: { code: 'FORBIDDEN', message: 'Insufficient permissions' },
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
return true;
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
exports.RolesGuard = RolesGuard;
|
|
49
|
+
exports.RolesGuard = RolesGuard = __decorate([
|
|
50
|
+
(0, common_1.Injectable)(),
|
|
51
|
+
__metadata("design:paramtypes", [core_1.Reflector])
|
|
52
|
+
], RolesGuard);
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
export { Result, ErrorType } from './result/Result';
|
|
2
|
+
export { BaseEntity } from './entities/BaseEntity';
|
|
3
|
+
export { TenantBaseEntity } from './entities/TenantBaseEntity';
|
|
4
|
+
export { CorrelationIdMiddleware } from './middleware/CorrelationIdMiddleware';
|
|
5
|
+
export { correlationStore } from './middleware/CorrelationStore';
|
|
6
|
+
export type { CorrelationStoreData } from './middleware/CorrelationStore';
|
|
7
|
+
export { TenantContextMiddleware, TenantContext } from './middleware/TenantContextMiddleware';
|
|
8
|
+
export { tenantStore } from './middleware/TenantStore';
|
|
9
|
+
export type { TenantStoreData } from './middleware/TenantStore';
|
|
10
|
+
export { GlobalExceptionFilter } from './filters/GlobalExceptionFilter';
|
|
11
|
+
export { ResultInterceptor } from './interceptors/ResultInterceptor';
|
|
12
|
+
export { JwtAuthGuard, Public } from './guards/JwtAuthGuard';
|
|
13
|
+
export { JwtStrategy, JwtPayload } from './guards/JwtStrategy';
|
|
14
|
+
export { RolesGuard, Roles } from './guards/RolesGuard';
|
|
15
|
+
export { TenantSubscriber } from './subscribers/TenantSubscriber';
|
|
16
|
+
export { createCircuitBreaker } from './resilience/CircuitBreakerFactory';
|
|
17
|
+
export type { CircuitBreakerOptions } from './resilience/CircuitBreakerFactory';
|
|
18
|
+
export { bootstrapService } from './bootstrap/bootstrapService';
|
|
19
|
+
export type { BootstrapOptions } from './bootstrap/bootstrapService';
|
|
20
|
+
export { createPinoConfig } from './logging/pino-config';
|
|
21
|
+
export { REDIS_CLIENT } from './cqrs/constants';
|
|
22
|
+
export { FeatureFlag, getFeatureFlagMetadata } from './cqrs/decorators/FeatureFlag.decorator';
|
|
23
|
+
export type { FeatureFlagOptions } from './cqrs/decorators/FeatureFlag.decorator';
|
|
24
|
+
export { Log, getLogMetadata } from './cqrs/decorators/Log.decorator';
|
|
25
|
+
export type { LogOptions } from './cqrs/decorators/Log.decorator';
|
|
26
|
+
export { Validate, shouldValidate, getValidatorClass } from './cqrs/decorators/Validate.decorator';
|
|
27
|
+
export type { ICommandValidator } from './cqrs/validation/ICommandValidator';
|
|
28
|
+
export { validateCommand } from './cqrs/validation/ICommandValidator';
|
|
29
|
+
export { Cache, getCacheMetadata } from './cqrs/decorators/Cache.decorator';
|
|
30
|
+
export type { CacheOptions } from './cqrs/decorators/Cache.decorator';
|
|
31
|
+
export { InvalidateCache, getInvalidateCacheMetadata } from './cqrs/decorators/InvalidateCache.decorator';
|
|
32
|
+
export type { InvalidateCacheOptions } from './cqrs/decorators/InvalidateCache.decorator';
|
|
33
|
+
export { DistributedLock, getDistributedLockMetadata } from './cqrs/decorators/DistributedLock.decorator';
|
|
34
|
+
export type { DistributedLockOptions } from './cqrs/decorators/DistributedLock.decorator';
|
|
35
|
+
export { IsolatedTransaction, isIsolatedTransaction } from './cqrs/decorators/IsolatedTransaction.decorator';
|
|
36
|
+
export { Workflow, getWorkflowMetadata } from './cqrs/decorators/Workflow.decorator';
|
|
37
|
+
export type { WorkflowOptions } from './cqrs/decorators/Workflow.decorator';
|
|
38
|
+
export { WORKFLOW_ENGINE } from './cqrs/interfaces/WorkflowEngine';
|
|
39
|
+
export type { WorkflowEngine, WorkflowStartResult } from './cqrs/interfaces/WorkflowEngine';
|
|
40
|
+
export { TransactionContext } from './cqrs/transaction/TransactionContext';
|
|
41
|
+
export { getTransactionalRepo } from './cqrs/transaction/getTransactionalRepo';
|
|
42
|
+
export { MetricsService } from './metrics/MetricsService';
|
|
43
|
+
export { MetricsController } from './metrics/MetricsController';
|
|
44
|
+
export { LogBehavior } from './cqrs/behaviors/LogBehavior';
|
|
45
|
+
export { FeatureFlagBehavior } from './cqrs/behaviors/FeatureFlagBehavior';
|
|
46
|
+
export { ValidationBehavior } from './cqrs/behaviors/ValidationBehavior';
|
|
47
|
+
export { CacheBehavior } from './cqrs/behaviors/CacheBehavior';
|
|
48
|
+
export { InvalidateCacheBehavior } from './cqrs/behaviors/InvalidateCacheBehavior';
|
|
49
|
+
export { DistributedLockBehavior } from './cqrs/behaviors/DistributedLockBehavior';
|
|
50
|
+
export { TransactionalBehavior } from './cqrs/behaviors/TransactionalBehavior';
|
|
51
|
+
export { PerformanceBehavior } from './cqrs/behaviors/PerformanceBehavior';
|
|
52
|
+
export { WorkflowBehavior } from './cqrs/behaviors/WorkflowBehavior';
|
|
53
|
+
export { QuanticCommandBus } from './cqrs/pipeline/QuanticCommandBus';
|
|
54
|
+
export { QuanticQueryBus } from './cqrs/pipeline/QuanticQueryBus';
|
|
55
|
+
export { type BehaviorFn } from './cqrs/pipeline/runPipeline';
|
|
56
|
+
export { RedisModule } from './redis/redis.module';
|
|
57
|
+
export type { RedisModuleOptions } from './redis/redis.module';
|
|
58
|
+
export { DomainEvent } from './events/DomainEvent';
|
|
59
|
+
export type { DomainEventPayload } from './events/DomainEvent';
|
|
60
|
+
export { OutboxEvent, OutboxEventStatus } from './events/OutboxEvent.entity';
|
|
61
|
+
export { RedisStreamPublisher } from './events/RedisStreamPublisher';
|
|
62
|
+
export { RedisStreamConsumer } from './events/RedisStreamConsumer';
|
|
63
|
+
export { OutboxPublisherService } from './events/OutboxPublisherService';
|
|
64
|
+
export { UnleashModule } from './unleash/unleash.module';
|
|
65
|
+
export type { UnleashModuleOptions } from './unleash/unleash.module';
|
|
66
|
+
export { GracefulShutdownService } from './lifecycle/GracefulShutdownService';
|
|
67
|
+
export { QuanticModule, SharedKernelModule } from './shared-kernel.module';
|
|
68
|
+
export type { QuanticModuleOptions, SharedKernelModuleOptions } from './shared-kernel.module';
|
|
69
|
+
export { createMockRepository, createMockRedisClient } from './testing/mocks';
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.TransactionalBehavior = exports.DistributedLockBehavior = exports.InvalidateCacheBehavior = exports.CacheBehavior = exports.ValidationBehavior = exports.FeatureFlagBehavior = exports.LogBehavior = exports.MetricsController = exports.MetricsService = exports.getTransactionalRepo = exports.TransactionContext = exports.WORKFLOW_ENGINE = exports.getWorkflowMetadata = exports.Workflow = exports.isIsolatedTransaction = exports.IsolatedTransaction = exports.getDistributedLockMetadata = exports.DistributedLock = exports.getInvalidateCacheMetadata = exports.InvalidateCache = exports.getCacheMetadata = exports.Cache = exports.validateCommand = exports.getValidatorClass = exports.shouldValidate = exports.Validate = exports.getLogMetadata = exports.Log = exports.getFeatureFlagMetadata = exports.FeatureFlag = exports.REDIS_CLIENT = exports.createPinoConfig = exports.bootstrapService = exports.createCircuitBreaker = exports.TenantSubscriber = exports.Roles = exports.RolesGuard = exports.JwtStrategy = exports.Public = exports.JwtAuthGuard = exports.ResultInterceptor = exports.GlobalExceptionFilter = exports.tenantStore = exports.TenantContextMiddleware = exports.correlationStore = exports.CorrelationIdMiddleware = exports.TenantBaseEntity = exports.BaseEntity = exports.ErrorType = exports.Result = void 0;
|
|
4
|
+
exports.createMockRedisClient = exports.createMockRepository = exports.SharedKernelModule = exports.QuanticModule = exports.GracefulShutdownService = exports.UnleashModule = exports.OutboxPublisherService = exports.RedisStreamConsumer = exports.RedisStreamPublisher = exports.OutboxEventStatus = exports.OutboxEvent = exports.DomainEvent = exports.RedisModule = exports.QuanticQueryBus = exports.QuanticCommandBus = exports.WorkflowBehavior = exports.PerformanceBehavior = void 0;
|
|
5
|
+
// Result
|
|
6
|
+
var Result_1 = require("./result/Result");
|
|
7
|
+
Object.defineProperty(exports, "Result", { enumerable: true, get: function () { return Result_1.Result; } });
|
|
8
|
+
Object.defineProperty(exports, "ErrorType", { enumerable: true, get: function () { return Result_1.ErrorType; } });
|
|
9
|
+
// Entities
|
|
10
|
+
var BaseEntity_1 = require("./entities/BaseEntity");
|
|
11
|
+
Object.defineProperty(exports, "BaseEntity", { enumerable: true, get: function () { return BaseEntity_1.BaseEntity; } });
|
|
12
|
+
var TenantBaseEntity_1 = require("./entities/TenantBaseEntity");
|
|
13
|
+
Object.defineProperty(exports, "TenantBaseEntity", { enumerable: true, get: function () { return TenantBaseEntity_1.TenantBaseEntity; } });
|
|
14
|
+
// Middleware
|
|
15
|
+
var CorrelationIdMiddleware_1 = require("./middleware/CorrelationIdMiddleware");
|
|
16
|
+
Object.defineProperty(exports, "CorrelationIdMiddleware", { enumerable: true, get: function () { return CorrelationIdMiddleware_1.CorrelationIdMiddleware; } });
|
|
17
|
+
var CorrelationStore_1 = require("./middleware/CorrelationStore");
|
|
18
|
+
Object.defineProperty(exports, "correlationStore", { enumerable: true, get: function () { return CorrelationStore_1.correlationStore; } });
|
|
19
|
+
var TenantContextMiddleware_1 = require("./middleware/TenantContextMiddleware");
|
|
20
|
+
Object.defineProperty(exports, "TenantContextMiddleware", { enumerable: true, get: function () { return TenantContextMiddleware_1.TenantContextMiddleware; } });
|
|
21
|
+
var TenantStore_1 = require("./middleware/TenantStore");
|
|
22
|
+
Object.defineProperty(exports, "tenantStore", { enumerable: true, get: function () { return TenantStore_1.tenantStore; } });
|
|
23
|
+
// Filters
|
|
24
|
+
var GlobalExceptionFilter_1 = require("./filters/GlobalExceptionFilter");
|
|
25
|
+
Object.defineProperty(exports, "GlobalExceptionFilter", { enumerable: true, get: function () { return GlobalExceptionFilter_1.GlobalExceptionFilter; } });
|
|
26
|
+
// Interceptors
|
|
27
|
+
var ResultInterceptor_1 = require("./interceptors/ResultInterceptor");
|
|
28
|
+
Object.defineProperty(exports, "ResultInterceptor", { enumerable: true, get: function () { return ResultInterceptor_1.ResultInterceptor; } });
|
|
29
|
+
// Guards
|
|
30
|
+
var JwtAuthGuard_1 = require("./guards/JwtAuthGuard");
|
|
31
|
+
Object.defineProperty(exports, "JwtAuthGuard", { enumerable: true, get: function () { return JwtAuthGuard_1.JwtAuthGuard; } });
|
|
32
|
+
Object.defineProperty(exports, "Public", { enumerable: true, get: function () { return JwtAuthGuard_1.Public; } });
|
|
33
|
+
var JwtStrategy_1 = require("./guards/JwtStrategy");
|
|
34
|
+
Object.defineProperty(exports, "JwtStrategy", { enumerable: true, get: function () { return JwtStrategy_1.JwtStrategy; } });
|
|
35
|
+
var RolesGuard_1 = require("./guards/RolesGuard");
|
|
36
|
+
Object.defineProperty(exports, "RolesGuard", { enumerable: true, get: function () { return RolesGuard_1.RolesGuard; } });
|
|
37
|
+
Object.defineProperty(exports, "Roles", { enumerable: true, get: function () { return RolesGuard_1.Roles; } });
|
|
38
|
+
// Subscribers
|
|
39
|
+
var TenantSubscriber_1 = require("./subscribers/TenantSubscriber");
|
|
40
|
+
Object.defineProperty(exports, "TenantSubscriber", { enumerable: true, get: function () { return TenantSubscriber_1.TenantSubscriber; } });
|
|
41
|
+
// Resilience
|
|
42
|
+
var CircuitBreakerFactory_1 = require("./resilience/CircuitBreakerFactory");
|
|
43
|
+
Object.defineProperty(exports, "createCircuitBreaker", { enumerable: true, get: function () { return CircuitBreakerFactory_1.createCircuitBreaker; } });
|
|
44
|
+
// Bootstrap
|
|
45
|
+
var bootstrapService_1 = require("./bootstrap/bootstrapService");
|
|
46
|
+
Object.defineProperty(exports, "bootstrapService", { enumerable: true, get: function () { return bootstrapService_1.bootstrapService; } });
|
|
47
|
+
// Logging
|
|
48
|
+
var pino_config_1 = require("./logging/pino-config");
|
|
49
|
+
Object.defineProperty(exports, "createPinoConfig", { enumerable: true, get: function () { return pino_config_1.createPinoConfig; } });
|
|
50
|
+
// CQRS Constants
|
|
51
|
+
var constants_1 = require("./cqrs/constants");
|
|
52
|
+
Object.defineProperty(exports, "REDIS_CLIENT", { enumerable: true, get: function () { return constants_1.REDIS_CLIENT; } });
|
|
53
|
+
// CQRS Decorators
|
|
54
|
+
var FeatureFlag_decorator_1 = require("./cqrs/decorators/FeatureFlag.decorator");
|
|
55
|
+
Object.defineProperty(exports, "FeatureFlag", { enumerable: true, get: function () { return FeatureFlag_decorator_1.FeatureFlag; } });
|
|
56
|
+
Object.defineProperty(exports, "getFeatureFlagMetadata", { enumerable: true, get: function () { return FeatureFlag_decorator_1.getFeatureFlagMetadata; } });
|
|
57
|
+
var Log_decorator_1 = require("./cqrs/decorators/Log.decorator");
|
|
58
|
+
Object.defineProperty(exports, "Log", { enumerable: true, get: function () { return Log_decorator_1.Log; } });
|
|
59
|
+
Object.defineProperty(exports, "getLogMetadata", { enumerable: true, get: function () { return Log_decorator_1.getLogMetadata; } });
|
|
60
|
+
var Validate_decorator_1 = require("./cqrs/decorators/Validate.decorator");
|
|
61
|
+
Object.defineProperty(exports, "Validate", { enumerable: true, get: function () { return Validate_decorator_1.Validate; } });
|
|
62
|
+
Object.defineProperty(exports, "shouldValidate", { enumerable: true, get: function () { return Validate_decorator_1.shouldValidate; } });
|
|
63
|
+
Object.defineProperty(exports, "getValidatorClass", { enumerable: true, get: function () { return Validate_decorator_1.getValidatorClass; } });
|
|
64
|
+
var ICommandValidator_1 = require("./cqrs/validation/ICommandValidator");
|
|
65
|
+
Object.defineProperty(exports, "validateCommand", { enumerable: true, get: function () { return ICommandValidator_1.validateCommand; } });
|
|
66
|
+
var Cache_decorator_1 = require("./cqrs/decorators/Cache.decorator");
|
|
67
|
+
Object.defineProperty(exports, "Cache", { enumerable: true, get: function () { return Cache_decorator_1.Cache; } });
|
|
68
|
+
Object.defineProperty(exports, "getCacheMetadata", { enumerable: true, get: function () { return Cache_decorator_1.getCacheMetadata; } });
|
|
69
|
+
var InvalidateCache_decorator_1 = require("./cqrs/decorators/InvalidateCache.decorator");
|
|
70
|
+
Object.defineProperty(exports, "InvalidateCache", { enumerable: true, get: function () { return InvalidateCache_decorator_1.InvalidateCache; } });
|
|
71
|
+
Object.defineProperty(exports, "getInvalidateCacheMetadata", { enumerable: true, get: function () { return InvalidateCache_decorator_1.getInvalidateCacheMetadata; } });
|
|
72
|
+
var DistributedLock_decorator_1 = require("./cqrs/decorators/DistributedLock.decorator");
|
|
73
|
+
Object.defineProperty(exports, "DistributedLock", { enumerable: true, get: function () { return DistributedLock_decorator_1.DistributedLock; } });
|
|
74
|
+
Object.defineProperty(exports, "getDistributedLockMetadata", { enumerable: true, get: function () { return DistributedLock_decorator_1.getDistributedLockMetadata; } });
|
|
75
|
+
var IsolatedTransaction_decorator_1 = require("./cqrs/decorators/IsolatedTransaction.decorator");
|
|
76
|
+
Object.defineProperty(exports, "IsolatedTransaction", { enumerable: true, get: function () { return IsolatedTransaction_decorator_1.IsolatedTransaction; } });
|
|
77
|
+
Object.defineProperty(exports, "isIsolatedTransaction", { enumerable: true, get: function () { return IsolatedTransaction_decorator_1.isIsolatedTransaction; } });
|
|
78
|
+
var Workflow_decorator_1 = require("./cqrs/decorators/Workflow.decorator");
|
|
79
|
+
Object.defineProperty(exports, "Workflow", { enumerable: true, get: function () { return Workflow_decorator_1.Workflow; } });
|
|
80
|
+
Object.defineProperty(exports, "getWorkflowMetadata", { enumerable: true, get: function () { return Workflow_decorator_1.getWorkflowMetadata; } });
|
|
81
|
+
// Workflow Engine Interface
|
|
82
|
+
var WorkflowEngine_1 = require("./cqrs/interfaces/WorkflowEngine");
|
|
83
|
+
Object.defineProperty(exports, "WORKFLOW_ENGINE", { enumerable: true, get: function () { return WorkflowEngine_1.WORKFLOW_ENGINE; } });
|
|
84
|
+
// Transaction (UnitOfWork)
|
|
85
|
+
var TransactionContext_1 = require("./cqrs/transaction/TransactionContext");
|
|
86
|
+
Object.defineProperty(exports, "TransactionContext", { enumerable: true, get: function () { return TransactionContext_1.TransactionContext; } });
|
|
87
|
+
var getTransactionalRepo_1 = require("./cqrs/transaction/getTransactionalRepo");
|
|
88
|
+
Object.defineProperty(exports, "getTransactionalRepo", { enumerable: true, get: function () { return getTransactionalRepo_1.getTransactionalRepo; } });
|
|
89
|
+
// Metrics
|
|
90
|
+
var MetricsService_1 = require("./metrics/MetricsService");
|
|
91
|
+
Object.defineProperty(exports, "MetricsService", { enumerable: true, get: function () { return MetricsService_1.MetricsService; } });
|
|
92
|
+
var MetricsController_1 = require("./metrics/MetricsController");
|
|
93
|
+
Object.defineProperty(exports, "MetricsController", { enumerable: true, get: function () { return MetricsController_1.MetricsController; } });
|
|
94
|
+
// CQRS Behaviors
|
|
95
|
+
var LogBehavior_1 = require("./cqrs/behaviors/LogBehavior");
|
|
96
|
+
Object.defineProperty(exports, "LogBehavior", { enumerable: true, get: function () { return LogBehavior_1.LogBehavior; } });
|
|
97
|
+
var FeatureFlagBehavior_1 = require("./cqrs/behaviors/FeatureFlagBehavior");
|
|
98
|
+
Object.defineProperty(exports, "FeatureFlagBehavior", { enumerable: true, get: function () { return FeatureFlagBehavior_1.FeatureFlagBehavior; } });
|
|
99
|
+
var ValidationBehavior_1 = require("./cqrs/behaviors/ValidationBehavior");
|
|
100
|
+
Object.defineProperty(exports, "ValidationBehavior", { enumerable: true, get: function () { return ValidationBehavior_1.ValidationBehavior; } });
|
|
101
|
+
var CacheBehavior_1 = require("./cqrs/behaviors/CacheBehavior");
|
|
102
|
+
Object.defineProperty(exports, "CacheBehavior", { enumerable: true, get: function () { return CacheBehavior_1.CacheBehavior; } });
|
|
103
|
+
var InvalidateCacheBehavior_1 = require("./cqrs/behaviors/InvalidateCacheBehavior");
|
|
104
|
+
Object.defineProperty(exports, "InvalidateCacheBehavior", { enumerable: true, get: function () { return InvalidateCacheBehavior_1.InvalidateCacheBehavior; } });
|
|
105
|
+
var DistributedLockBehavior_1 = require("./cqrs/behaviors/DistributedLockBehavior");
|
|
106
|
+
Object.defineProperty(exports, "DistributedLockBehavior", { enumerable: true, get: function () { return DistributedLockBehavior_1.DistributedLockBehavior; } });
|
|
107
|
+
var TransactionalBehavior_1 = require("./cqrs/behaviors/TransactionalBehavior");
|
|
108
|
+
Object.defineProperty(exports, "TransactionalBehavior", { enumerable: true, get: function () { return TransactionalBehavior_1.TransactionalBehavior; } });
|
|
109
|
+
var PerformanceBehavior_1 = require("./cqrs/behaviors/PerformanceBehavior");
|
|
110
|
+
Object.defineProperty(exports, "PerformanceBehavior", { enumerable: true, get: function () { return PerformanceBehavior_1.PerformanceBehavior; } });
|
|
111
|
+
var WorkflowBehavior_1 = require("./cqrs/behaviors/WorkflowBehavior");
|
|
112
|
+
Object.defineProperty(exports, "WorkflowBehavior", { enumerable: true, get: function () { return WorkflowBehavior_1.WorkflowBehavior; } });
|
|
113
|
+
// CQRS Pipeline
|
|
114
|
+
var QuanticCommandBus_1 = require("./cqrs/pipeline/QuanticCommandBus");
|
|
115
|
+
Object.defineProperty(exports, "QuanticCommandBus", { enumerable: true, get: function () { return QuanticCommandBus_1.QuanticCommandBus; } });
|
|
116
|
+
var QuanticQueryBus_1 = require("./cqrs/pipeline/QuanticQueryBus");
|
|
117
|
+
Object.defineProperty(exports, "QuanticQueryBus", { enumerable: true, get: function () { return QuanticQueryBus_1.QuanticQueryBus; } });
|
|
118
|
+
// Redis
|
|
119
|
+
var redis_module_1 = require("./redis/redis.module");
|
|
120
|
+
Object.defineProperty(exports, "RedisModule", { enumerable: true, get: function () { return redis_module_1.RedisModule; } });
|
|
121
|
+
// Events
|
|
122
|
+
var DomainEvent_1 = require("./events/DomainEvent");
|
|
123
|
+
Object.defineProperty(exports, "DomainEvent", { enumerable: true, get: function () { return DomainEvent_1.DomainEvent; } });
|
|
124
|
+
var OutboxEvent_entity_1 = require("./events/OutboxEvent.entity");
|
|
125
|
+
Object.defineProperty(exports, "OutboxEvent", { enumerable: true, get: function () { return OutboxEvent_entity_1.OutboxEvent; } });
|
|
126
|
+
Object.defineProperty(exports, "OutboxEventStatus", { enumerable: true, get: function () { return OutboxEvent_entity_1.OutboxEventStatus; } });
|
|
127
|
+
var RedisStreamPublisher_1 = require("./events/RedisStreamPublisher");
|
|
128
|
+
Object.defineProperty(exports, "RedisStreamPublisher", { enumerable: true, get: function () { return RedisStreamPublisher_1.RedisStreamPublisher; } });
|
|
129
|
+
var RedisStreamConsumer_1 = require("./events/RedisStreamConsumer");
|
|
130
|
+
Object.defineProperty(exports, "RedisStreamConsumer", { enumerable: true, get: function () { return RedisStreamConsumer_1.RedisStreamConsumer; } });
|
|
131
|
+
var OutboxPublisherService_1 = require("./events/OutboxPublisherService");
|
|
132
|
+
Object.defineProperty(exports, "OutboxPublisherService", { enumerable: true, get: function () { return OutboxPublisherService_1.OutboxPublisherService; } });
|
|
133
|
+
// Unleash
|
|
134
|
+
var unleash_module_1 = require("./unleash/unleash.module");
|
|
135
|
+
Object.defineProperty(exports, "UnleashModule", { enumerable: true, get: function () { return unleash_module_1.UnleashModule; } });
|
|
136
|
+
// Lifecycle
|
|
137
|
+
var GracefulShutdownService_1 = require("./lifecycle/GracefulShutdownService");
|
|
138
|
+
Object.defineProperty(exports, "GracefulShutdownService", { enumerable: true, get: function () { return GracefulShutdownService_1.GracefulShutdownService; } });
|
|
139
|
+
// QuanticModule
|
|
140
|
+
var shared_kernel_module_1 = require("./shared-kernel.module");
|
|
141
|
+
Object.defineProperty(exports, "QuanticModule", { enumerable: true, get: function () { return shared_kernel_module_1.QuanticModule; } });
|
|
142
|
+
Object.defineProperty(exports, "SharedKernelModule", { enumerable: true, get: function () { return shared_kernel_module_1.SharedKernelModule; } });
|
|
143
|
+
// Testing mock helpers (safe for prod — no @nestjs/testing dependency)
|
|
144
|
+
var mocks_1 = require("./testing/mocks");
|
|
145
|
+
Object.defineProperty(exports, "createMockRepository", { enumerable: true, get: function () { return mocks_1.createMockRepository; } });
|
|
146
|
+
Object.defineProperty(exports, "createMockRedisClient", { enumerable: true, get: function () { return mocks_1.createMockRedisClient; } });
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { NestInterceptor, ExecutionContext, CallHandler } from '@nestjs/common';
|
|
2
|
+
import { Observable } from 'rxjs';
|
|
3
|
+
export declare class ResultInterceptor implements NestInterceptor {
|
|
4
|
+
private readonly logger;
|
|
5
|
+
intercept(context: ExecutionContext, next: CallHandler): Observable<unknown>;
|
|
6
|
+
private sendResultError;
|
|
7
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
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 ResultInterceptor_1;
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.ResultInterceptor = void 0;
|
|
11
|
+
const common_1 = require("@nestjs/common");
|
|
12
|
+
const rxjs_1 = require("rxjs");
|
|
13
|
+
const Result_1 = require("../result/Result");
|
|
14
|
+
const CorrelationStore_1 = require("../middleware/CorrelationStore");
|
|
15
|
+
const ERROR_TYPE_TO_STATUS = {
|
|
16
|
+
[Result_1.ErrorType.NotFound]: 404,
|
|
17
|
+
[Result_1.ErrorType.Forbidden]: 403,
|
|
18
|
+
[Result_1.ErrorType.Unauthorized]: 401,
|
|
19
|
+
[Result_1.ErrorType.Conflict]: 409,
|
|
20
|
+
[Result_1.ErrorType.ValidationError]: 400,
|
|
21
|
+
[Result_1.ErrorType.UnprocessableEntity]: 422,
|
|
22
|
+
[Result_1.ErrorType.InternalError]: 500,
|
|
23
|
+
};
|
|
24
|
+
const ERROR_TYPE_TO_TITLE = {
|
|
25
|
+
[Result_1.ErrorType.NotFound]: 'Not Found',
|
|
26
|
+
[Result_1.ErrorType.Forbidden]: 'Forbidden',
|
|
27
|
+
[Result_1.ErrorType.Unauthorized]: 'Unauthorized',
|
|
28
|
+
[Result_1.ErrorType.Conflict]: 'Conflict',
|
|
29
|
+
[Result_1.ErrorType.ValidationError]: 'Validation Error',
|
|
30
|
+
[Result_1.ErrorType.UnprocessableEntity]: 'Unprocessable Entity',
|
|
31
|
+
[Result_1.ErrorType.InternalError]: 'Internal Server Error',
|
|
32
|
+
};
|
|
33
|
+
let ResultInterceptor = ResultInterceptor_1 = class ResultInterceptor {
|
|
34
|
+
logger = new common_1.Logger(ResultInterceptor_1.name);
|
|
35
|
+
intercept(context, next) {
|
|
36
|
+
return next.handle().pipe((0, rxjs_1.switchMap)((data) => {
|
|
37
|
+
if (data instanceof Result_1.Result && !data.isSuccess) {
|
|
38
|
+
this.sendResultError(context, data);
|
|
39
|
+
return rxjs_1.EMPTY;
|
|
40
|
+
}
|
|
41
|
+
return (0, rxjs_1.of)(data);
|
|
42
|
+
}), (0, rxjs_1.catchError)((error) => {
|
|
43
|
+
if (error instanceof Result_1.Result) {
|
|
44
|
+
this.sendResultError(context, error);
|
|
45
|
+
return rxjs_1.EMPTY;
|
|
46
|
+
}
|
|
47
|
+
const err = error instanceof Error ? error : new Error(String(error));
|
|
48
|
+
this.logger.error({
|
|
49
|
+
msg: 'Unhandled exception before CQRS pipeline',
|
|
50
|
+
error: err.message,
|
|
51
|
+
stack: err.stack,
|
|
52
|
+
});
|
|
53
|
+
this.sendResultError(context, Result_1.Result.failure(Result_1.ErrorType.InternalError, err.message));
|
|
54
|
+
return rxjs_1.EMPTY;
|
|
55
|
+
}));
|
|
56
|
+
}
|
|
57
|
+
sendResultError(context, result) {
|
|
58
|
+
const request = context.switchToHttp().getRequest();
|
|
59
|
+
const response = context.switchToHttp().getResponse();
|
|
60
|
+
const correlationId = CorrelationStore_1.correlationStore.getStore()?.correlationId;
|
|
61
|
+
const status = ERROR_TYPE_TO_STATUS[result.errorType] ?? 500;
|
|
62
|
+
const title = ERROR_TYPE_TO_TITLE[result.errorType] ?? 'Unknown Error';
|
|
63
|
+
if (correlationId) {
|
|
64
|
+
response.setHeader('X-Correlation-ID', correlationId);
|
|
65
|
+
}
|
|
66
|
+
this.logger.warn({
|
|
67
|
+
msg: `${status} ${result.errorType}`,
|
|
68
|
+
correlationId,
|
|
69
|
+
status,
|
|
70
|
+
detail: result.errorMessage,
|
|
71
|
+
});
|
|
72
|
+
response
|
|
73
|
+
.status(status)
|
|
74
|
+
.setHeader('Content-Type', 'application/problem+json')
|
|
75
|
+
.json({
|
|
76
|
+
type: `https://arex.dev/errors/${result.errorType}`,
|
|
77
|
+
title,
|
|
78
|
+
status,
|
|
79
|
+
detail: result.errorMessage,
|
|
80
|
+
instance: request.originalUrl,
|
|
81
|
+
correlationId,
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
};
|
|
85
|
+
exports.ResultInterceptor = ResultInterceptor;
|
|
86
|
+
exports.ResultInterceptor = ResultInterceptor = ResultInterceptor_1 = __decorate([
|
|
87
|
+
(0, common_1.Injectable)()
|
|
88
|
+
], ResultInterceptor);
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { OnModuleDestroy } from '@nestjs/common';
|
|
2
|
+
import { DataSource } from 'typeorm';
|
|
3
|
+
import type { Redis } from 'ioredis';
|
|
4
|
+
/**
|
|
5
|
+
* GracefulShutdownService ensures clean resource teardown on SIGTERM/SIGINT.
|
|
6
|
+
*
|
|
7
|
+
* Shutdown order:
|
|
8
|
+
* 1. Wait for in-flight work (subclasses can override `drainWork`)
|
|
9
|
+
* 2. Close database connections
|
|
10
|
+
* 3. Quit Redis
|
|
11
|
+
*/
|
|
12
|
+
export declare class GracefulShutdownService implements OnModuleDestroy {
|
|
13
|
+
private readonly dataSource?;
|
|
14
|
+
private readonly redis?;
|
|
15
|
+
private readonly logger;
|
|
16
|
+
constructor(dataSource?: DataSource | undefined, redis?: Redis | undefined);
|
|
17
|
+
onModuleDestroy(): Promise<void>;
|
|
18
|
+
/**
|
|
19
|
+
* Override in service-specific subclasses to drain Bull queues,
|
|
20
|
+
* close Socket.IO servers, etc.
|
|
21
|
+
*/
|
|
22
|
+
protected drainWork(): Promise<void>;
|
|
23
|
+
private withTimeout;
|
|
24
|
+
}
|
|
@@ -0,0 +1,93 @@
|
|
|
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
|
+
var GracefulShutdownService_1;
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.GracefulShutdownService = void 0;
|
|
17
|
+
const common_1 = require("@nestjs/common");
|
|
18
|
+
const typeorm_1 = require("typeorm");
|
|
19
|
+
const constants_1 = require("../cqrs/constants");
|
|
20
|
+
const SHUTDOWN_TIMEOUT_MS = 30_000;
|
|
21
|
+
/**
|
|
22
|
+
* GracefulShutdownService ensures clean resource teardown on SIGTERM/SIGINT.
|
|
23
|
+
*
|
|
24
|
+
* Shutdown order:
|
|
25
|
+
* 1. Wait for in-flight work (subclasses can override `drainWork`)
|
|
26
|
+
* 2. Close database connections
|
|
27
|
+
* 3. Quit Redis
|
|
28
|
+
*/
|
|
29
|
+
let GracefulShutdownService = GracefulShutdownService_1 = class GracefulShutdownService {
|
|
30
|
+
dataSource;
|
|
31
|
+
redis;
|
|
32
|
+
logger = new common_1.Logger(GracefulShutdownService_1.name);
|
|
33
|
+
constructor(dataSource, redis) {
|
|
34
|
+
this.dataSource = dataSource;
|
|
35
|
+
this.redis = redis;
|
|
36
|
+
}
|
|
37
|
+
async onModuleDestroy() {
|
|
38
|
+
this.logger.log('Graceful shutdown initiated...');
|
|
39
|
+
// 1. Drain in-flight work with timeout
|
|
40
|
+
try {
|
|
41
|
+
await this.withTimeout(this.drainWork(), SHUTDOWN_TIMEOUT_MS, 'Work drain');
|
|
42
|
+
}
|
|
43
|
+
catch (err) {
|
|
44
|
+
this.logger.warn(`Work drain timeout or error: ${err.message}`);
|
|
45
|
+
}
|
|
46
|
+
// 2. Close database connections
|
|
47
|
+
if (this.dataSource?.isInitialized) {
|
|
48
|
+
try {
|
|
49
|
+
await this.dataSource.destroy();
|
|
50
|
+
this.logger.log('Database connections closed');
|
|
51
|
+
}
|
|
52
|
+
catch (err) {
|
|
53
|
+
this.logger.warn(`Database close error: ${err.message}`);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
// 3. Quit Redis
|
|
57
|
+
if (this.redis) {
|
|
58
|
+
try {
|
|
59
|
+
await this.redis.quit();
|
|
60
|
+
this.logger.log('Redis connection closed');
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
this.logger.warn(`Redis quit error: ${err.message}`);
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
this.logger.log('Graceful shutdown complete');
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Override in service-specific subclasses to drain Bull queues,
|
|
70
|
+
* close Socket.IO servers, etc.
|
|
71
|
+
*/
|
|
72
|
+
async drainWork() {
|
|
73
|
+
// Base implementation — no-op
|
|
74
|
+
}
|
|
75
|
+
withTimeout(promise, ms, label) {
|
|
76
|
+
return new Promise((resolve, reject) => {
|
|
77
|
+
const timer = setTimeout(() => {
|
|
78
|
+
reject(new Error(`${label} timed out after ${ms}ms`));
|
|
79
|
+
}, ms);
|
|
80
|
+
promise
|
|
81
|
+
.then(() => { clearTimeout(timer); resolve(); })
|
|
82
|
+
.catch((err) => { clearTimeout(timer); reject(err); });
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
exports.GracefulShutdownService = GracefulShutdownService;
|
|
87
|
+
exports.GracefulShutdownService = GracefulShutdownService = GracefulShutdownService_1 = __decorate([
|
|
88
|
+
(0, common_1.Injectable)(),
|
|
89
|
+
__param(0, (0, common_1.Optional)()),
|
|
90
|
+
__param(1, (0, common_1.Optional)()),
|
|
91
|
+
__param(1, (0, common_1.Inject)(constants_1.REDIS_CLIENT)),
|
|
92
|
+
__metadata("design:paramtypes", [typeorm_1.DataSource, Function])
|
|
93
|
+
], GracefulShutdownService);
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
export declare function createPinoConfig(serviceName: string): {
|
|
2
|
+
pinoHttp: {
|
|
3
|
+
level: string;
|
|
4
|
+
transport: {
|
|
5
|
+
target: string;
|
|
6
|
+
options: {
|
|
7
|
+
serverUrl: string;
|
|
8
|
+
logOtherAs: string;
|
|
9
|
+
};
|
|
10
|
+
targets?: undefined;
|
|
11
|
+
} | {
|
|
12
|
+
targets: any[];
|
|
13
|
+
target?: undefined;
|
|
14
|
+
options?: undefined;
|
|
15
|
+
};
|
|
16
|
+
serializers: {
|
|
17
|
+
req(req: any): {
|
|
18
|
+
id: any;
|
|
19
|
+
method: any;
|
|
20
|
+
url: any;
|
|
21
|
+
correlationId: any;
|
|
22
|
+
};
|
|
23
|
+
res(res: any): {
|
|
24
|
+
statusCode: any;
|
|
25
|
+
};
|
|
26
|
+
email(value: string): string;
|
|
27
|
+
token(_value: string): string;
|
|
28
|
+
brd(value: string): string;
|
|
29
|
+
};
|
|
30
|
+
customProps(req: any): {
|
|
31
|
+
correlationId: any;
|
|
32
|
+
service: string;
|
|
33
|
+
};
|
|
34
|
+
};
|
|
35
|
+
};
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createPinoConfig = createPinoConfig;
|
|
4
|
+
function canResolvePinoSeq() {
|
|
5
|
+
try {
|
|
6
|
+
require.resolve('pino-seq');
|
|
7
|
+
return true;
|
|
8
|
+
}
|
|
9
|
+
catch {
|
|
10
|
+
return false;
|
|
11
|
+
}
|
|
12
|
+
}
|
|
13
|
+
function buildTransport(logLevel) {
|
|
14
|
+
const seqUrl = process.env['SEQ_URL'];
|
|
15
|
+
const useSeq = seqUrl && canResolvePinoSeq();
|
|
16
|
+
if (process.env['NODE_ENV'] === 'production' && useSeq) {
|
|
17
|
+
return {
|
|
18
|
+
target: 'pino-seq',
|
|
19
|
+
options: { serverUrl: seqUrl, logOtherAs: 'Verbose' },
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
const targets = [
|
|
23
|
+
{ target: 'pino/file', options: { destination: 1 }, level: logLevel },
|
|
24
|
+
];
|
|
25
|
+
if (useSeq) {
|
|
26
|
+
targets.push({
|
|
27
|
+
target: 'pino-seq',
|
|
28
|
+
options: { serverUrl: seqUrl, logOtherAs: 'Verbose' },
|
|
29
|
+
level: logLevel,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
return { targets };
|
|
33
|
+
}
|
|
34
|
+
function createPinoConfig(serviceName) {
|
|
35
|
+
const logLevel = process.env['LOG_LEVEL'] || 'info';
|
|
36
|
+
return {
|
|
37
|
+
pinoHttp: {
|
|
38
|
+
level: logLevel,
|
|
39
|
+
transport: buildTransport(logLevel),
|
|
40
|
+
serializers: {
|
|
41
|
+
req(req) {
|
|
42
|
+
return {
|
|
43
|
+
id: req.id,
|
|
44
|
+
method: req.method,
|
|
45
|
+
url: req.url,
|
|
46
|
+
correlationId: req.raw?.correlationId || req.headers?.['x-correlation-id'],
|
|
47
|
+
};
|
|
48
|
+
},
|
|
49
|
+
res(res) {
|
|
50
|
+
return {
|
|
51
|
+
statusCode: res.statusCode,
|
|
52
|
+
};
|
|
53
|
+
},
|
|
54
|
+
email(value) {
|
|
55
|
+
if (!value || typeof value !== 'string')
|
|
56
|
+
return value;
|
|
57
|
+
const [local, domain] = value.split('@');
|
|
58
|
+
if (!domain)
|
|
59
|
+
return value;
|
|
60
|
+
return `${local[0]}***@${domain}`;
|
|
61
|
+
},
|
|
62
|
+
token(_value) {
|
|
63
|
+
return '[REDACTED]';
|
|
64
|
+
},
|
|
65
|
+
brd(value) {
|
|
66
|
+
if (!value || typeof value !== 'string')
|
|
67
|
+
return value;
|
|
68
|
+
return value.length > 50 ? `${value.substring(0, 50)}...` : value;
|
|
69
|
+
},
|
|
70
|
+
},
|
|
71
|
+
customProps(req) {
|
|
72
|
+
return {
|
|
73
|
+
correlationId: req.correlationId || req.headers?.['x-correlation-id'],
|
|
74
|
+
service: serviceName,
|
|
75
|
+
};
|
|
76
|
+
},
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
}
|