@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,56 @@
|
|
|
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.PerformanceBehavior = void 0;
|
|
16
|
+
const common_1 = require("@nestjs/common");
|
|
17
|
+
const MetricsService_1 = require("../../metrics/MetricsService");
|
|
18
|
+
const SLOW_THRESHOLD_MS = 500;
|
|
19
|
+
/**
|
|
20
|
+
* PerformanceBehavior logs a warning when a handler exceeds 500ms
|
|
21
|
+
* and records handler duration in Prometheus histogram.
|
|
22
|
+
*/
|
|
23
|
+
let PerformanceBehavior = class PerformanceBehavior {
|
|
24
|
+
metrics;
|
|
25
|
+
logger = new common_1.Logger('PerformanceBehavior');
|
|
26
|
+
constructor(metrics) {
|
|
27
|
+
this.metrics = metrics;
|
|
28
|
+
}
|
|
29
|
+
async execute(command, next) {
|
|
30
|
+
const handlerName = command.constructor.name;
|
|
31
|
+
const startTime = Date.now();
|
|
32
|
+
const result = await next();
|
|
33
|
+
const durationMs = Date.now() - startTime;
|
|
34
|
+
const durationSec = durationMs / 1000;
|
|
35
|
+
const resultLabel = result.isSuccess ? 'success' : 'failure';
|
|
36
|
+
// Record metrics
|
|
37
|
+
this.metrics?.handlerDuration
|
|
38
|
+
.labels(handlerName, resultLabel)
|
|
39
|
+
.observe(durationSec);
|
|
40
|
+
// Warn on slow handlers
|
|
41
|
+
if (durationMs > SLOW_THRESHOLD_MS) {
|
|
42
|
+
this.logger.warn({
|
|
43
|
+
msg: `Slow handler detected: ${handlerName} took ${durationMs}ms`,
|
|
44
|
+
handler: handlerName,
|
|
45
|
+
durationMs,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
return result;
|
|
49
|
+
}
|
|
50
|
+
};
|
|
51
|
+
exports.PerformanceBehavior = PerformanceBehavior;
|
|
52
|
+
exports.PerformanceBehavior = PerformanceBehavior = __decorate([
|
|
53
|
+
(0, common_1.Injectable)(),
|
|
54
|
+
__param(0, (0, common_1.Optional)()),
|
|
55
|
+
__metadata("design:paramtypes", [MetricsService_1.MetricsService])
|
|
56
|
+
], PerformanceBehavior);
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { DataSource } from 'typeorm';
|
|
2
|
+
import { Result } from '../../result/Result';
|
|
3
|
+
/**
|
|
4
|
+
* TransactionalBehavior — UnitOfWork pattern via AsyncLocalStorage.
|
|
5
|
+
*
|
|
6
|
+
* Every command is transactional by default (no decorator needed):
|
|
7
|
+
* - If no ambient transaction exists → CREATE one, own commit/rollback
|
|
8
|
+
* - If an ambient transaction exists → JOIN it (pass through, outer scope owns lifecycle)
|
|
9
|
+
* - If command is @IsolatedTransaction() → always CREATE a new one, even if context exists
|
|
10
|
+
*
|
|
11
|
+
* Queries skip this behavior entirely (separate pipeline chain in QuanticQueryBus).
|
|
12
|
+
*/
|
|
13
|
+
export declare class TransactionalBehavior {
|
|
14
|
+
private readonly dataSource?;
|
|
15
|
+
private readonly logger;
|
|
16
|
+
constructor(dataSource?: DataSource | undefined);
|
|
17
|
+
execute<T>(command: object, next: () => Promise<Result<T>>): Promise<Result<T>>;
|
|
18
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
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 TransactionalBehavior_1;
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.TransactionalBehavior = void 0;
|
|
17
|
+
const common_1 = require("@nestjs/common");
|
|
18
|
+
const typeorm_1 = require("typeorm");
|
|
19
|
+
const Result_1 = require("../../result/Result");
|
|
20
|
+
const TransactionContext_1 = require("../transaction/TransactionContext");
|
|
21
|
+
const IsolatedTransaction_decorator_1 = require("../decorators/IsolatedTransaction.decorator");
|
|
22
|
+
/**
|
|
23
|
+
* TransactionalBehavior — UnitOfWork pattern via AsyncLocalStorage.
|
|
24
|
+
*
|
|
25
|
+
* Every command is transactional by default (no decorator needed):
|
|
26
|
+
* - If no ambient transaction exists → CREATE one, own commit/rollback
|
|
27
|
+
* - If an ambient transaction exists → JOIN it (pass through, outer scope owns lifecycle)
|
|
28
|
+
* - If command is @IsolatedTransaction() → always CREATE a new one, even if context exists
|
|
29
|
+
*
|
|
30
|
+
* Queries skip this behavior entirely (separate pipeline chain in QuanticQueryBus).
|
|
31
|
+
*/
|
|
32
|
+
let TransactionalBehavior = TransactionalBehavior_1 = class TransactionalBehavior {
|
|
33
|
+
dataSource;
|
|
34
|
+
logger = new common_1.Logger(TransactionalBehavior_1.name);
|
|
35
|
+
constructor(dataSource) {
|
|
36
|
+
this.dataSource = dataSource;
|
|
37
|
+
}
|
|
38
|
+
async execute(command, next) {
|
|
39
|
+
if (!this.dataSource) {
|
|
40
|
+
return next();
|
|
41
|
+
}
|
|
42
|
+
const existing = TransactionContext_1.TransactionContext.get();
|
|
43
|
+
const isolated = (0, IsolatedTransaction_decorator_1.isIsolatedTransaction)(command.constructor);
|
|
44
|
+
// JOIN — ambient transaction exists and command does not demand isolation
|
|
45
|
+
if (existing && !isolated) {
|
|
46
|
+
return next();
|
|
47
|
+
}
|
|
48
|
+
// CREATE — we are the outermost scope (or isolated); we own the lifecycle
|
|
49
|
+
const queryRunner = this.dataSource.createQueryRunner();
|
|
50
|
+
await queryRunner.connect();
|
|
51
|
+
await queryRunner.startTransaction();
|
|
52
|
+
try {
|
|
53
|
+
const result = await TransactionContext_1.TransactionContext.run(queryRunner, () => next());
|
|
54
|
+
if (result.isSuccess) {
|
|
55
|
+
await queryRunner.commitTransaction();
|
|
56
|
+
}
|
|
57
|
+
else {
|
|
58
|
+
await queryRunner.rollbackTransaction();
|
|
59
|
+
this.logger.warn(`Transaction rolled back for ${command.constructor.name}: ${result.errorMessage}`);
|
|
60
|
+
}
|
|
61
|
+
return result;
|
|
62
|
+
}
|
|
63
|
+
catch (error) {
|
|
64
|
+
await queryRunner.rollbackTransaction();
|
|
65
|
+
return Result_1.Result.failure(Result_1.ErrorType.InternalError, `Transaction failed for ${command.constructor.name}: ${error.message}`);
|
|
66
|
+
}
|
|
67
|
+
finally {
|
|
68
|
+
await queryRunner.release();
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
};
|
|
72
|
+
exports.TransactionalBehavior = TransactionalBehavior;
|
|
73
|
+
exports.TransactionalBehavior = TransactionalBehavior = TransactionalBehavior_1 = __decorate([
|
|
74
|
+
(0, common_1.Injectable)(),
|
|
75
|
+
__param(0, (0, common_1.Optional)()),
|
|
76
|
+
__metadata("design:paramtypes", [typeorm_1.DataSource])
|
|
77
|
+
], TransactionalBehavior);
|
|
@@ -0,0 +1,33 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.ValidationBehavior = void 0;
|
|
10
|
+
const common_1 = require("@nestjs/common");
|
|
11
|
+
const Validate_decorator_1 = require("../decorators/Validate.decorator");
|
|
12
|
+
const Result_1 = require("../../result/Result");
|
|
13
|
+
let ValidationBehavior = class ValidationBehavior {
|
|
14
|
+
async execute(command, next) {
|
|
15
|
+
if (!(0, Validate_decorator_1.shouldValidate)(command.constructor)) {
|
|
16
|
+
return next();
|
|
17
|
+
}
|
|
18
|
+
const ValidatorClass = (0, Validate_decorator_1.getValidatorClass)(command.constructor);
|
|
19
|
+
if (!ValidatorClass) {
|
|
20
|
+
return next();
|
|
21
|
+
}
|
|
22
|
+
const validator = new ValidatorClass();
|
|
23
|
+
const validationResult = validator.validate(command);
|
|
24
|
+
if (!validationResult.isSuccess) {
|
|
25
|
+
return Result_1.Result.failure(validationResult.errorType ?? Result_1.ErrorType.ValidationError, validationResult.errorMessage ?? 'Validation failed');
|
|
26
|
+
}
|
|
27
|
+
return next();
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
exports.ValidationBehavior = ValidationBehavior;
|
|
31
|
+
exports.ValidationBehavior = ValidationBehavior = __decorate([
|
|
32
|
+
(0, common_1.Injectable)()
|
|
33
|
+
], ValidationBehavior);
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { WorkflowEngine } from '../interfaces/WorkflowEngine';
|
|
2
|
+
import { Result } from '../../result/Result';
|
|
3
|
+
export declare class WorkflowBehavior {
|
|
4
|
+
private readonly engine?;
|
|
5
|
+
private readonly logger;
|
|
6
|
+
constructor(engine?: WorkflowEngine | undefined);
|
|
7
|
+
execute<T>(command: object, next: () => Promise<Result<T>>): Promise<Result<T>>;
|
|
8
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
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 WorkflowBehavior_1;
|
|
15
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
16
|
+
exports.WorkflowBehavior = void 0;
|
|
17
|
+
const common_1 = require("@nestjs/common");
|
|
18
|
+
const Workflow_decorator_1 = require("../decorators/Workflow.decorator");
|
|
19
|
+
const WorkflowEngine_1 = require("../interfaces/WorkflowEngine");
|
|
20
|
+
const Result_1 = require("../../result/Result");
|
|
21
|
+
let WorkflowBehavior = WorkflowBehavior_1 = class WorkflowBehavior {
|
|
22
|
+
engine;
|
|
23
|
+
logger = new common_1.Logger(WorkflowBehavior_1.name);
|
|
24
|
+
constructor(engine) {
|
|
25
|
+
this.engine = engine;
|
|
26
|
+
}
|
|
27
|
+
async execute(command, next) {
|
|
28
|
+
const metadata = (0, Workflow_decorator_1.getWorkflowMetadata)(command.constructor);
|
|
29
|
+
if (!metadata) {
|
|
30
|
+
return next();
|
|
31
|
+
}
|
|
32
|
+
if (!this.engine) {
|
|
33
|
+
this.logger.debug('No WorkflowEngine provided, skipping workflow behavior');
|
|
34
|
+
return next();
|
|
35
|
+
}
|
|
36
|
+
try {
|
|
37
|
+
const result = await this.engine.startProcess(metadata.processDefinitionId, command, { commandType: command.constructor.name });
|
|
38
|
+
return Result_1.Result.success(result);
|
|
39
|
+
}
|
|
40
|
+
catch (error) {
|
|
41
|
+
const fallback = metadata.fallback ?? 'throw';
|
|
42
|
+
this.logger.warn(`Workflow start failed for "${metadata.processDefinitionId}", applying fallback: ${fallback}`, error.message);
|
|
43
|
+
switch (fallback) {
|
|
44
|
+
case 'skip':
|
|
45
|
+
return next();
|
|
46
|
+
case 'queue':
|
|
47
|
+
return Result_1.Result.failure(Result_1.ErrorType.InternalError, `Workflow queuing not available without companion package: ${error.message}`);
|
|
48
|
+
case 'throw':
|
|
49
|
+
default:
|
|
50
|
+
return Result_1.Result.failure(Result_1.ErrorType.InternalError, `Workflow start failed: ${error.message}`);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
};
|
|
55
|
+
exports.WorkflowBehavior = WorkflowBehavior;
|
|
56
|
+
exports.WorkflowBehavior = WorkflowBehavior = WorkflowBehavior_1 = __decorate([
|
|
57
|
+
(0, common_1.Injectable)(),
|
|
58
|
+
__param(0, (0, common_1.Optional)()),
|
|
59
|
+
__param(0, (0, common_1.Inject)(WorkflowEngine_1.WORKFLOW_ENGINE)),
|
|
60
|
+
__metadata("design:paramtypes", [Object])
|
|
61
|
+
], WorkflowBehavior);
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
export interface CacheOptions {
|
|
3
|
+
/** Cache key template — use {propName} for interpolation, e.g. 'user:{id}' */
|
|
4
|
+
key: string;
|
|
5
|
+
/** TTL in seconds (default: 60) */
|
|
6
|
+
ttlSeconds?: number;
|
|
7
|
+
}
|
|
8
|
+
/**
|
|
9
|
+
* @Cache('key:{prop}', { ttlSeconds: 60 }) — caches query results in Redis.
|
|
10
|
+
* Reads from cache on hit; sets on miss with TTL.
|
|
11
|
+
*/
|
|
12
|
+
export declare function Cache(key: string, options?: Omit<CacheOptions, 'key'>): ClassDecorator;
|
|
13
|
+
export declare function getCacheMetadata(target: object): CacheOptions | undefined;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Cache = Cache;
|
|
4
|
+
exports.getCacheMetadata = getCacheMetadata;
|
|
5
|
+
require("reflect-metadata");
|
|
6
|
+
const CACHE_KEY = 'arex:cache';
|
|
7
|
+
/**
|
|
8
|
+
* @Cache('key:{prop}', { ttlSeconds: 60 }) — caches query results in Redis.
|
|
9
|
+
* Reads from cache on hit; sets on miss with TTL.
|
|
10
|
+
*/
|
|
11
|
+
function Cache(key, options = {}) {
|
|
12
|
+
return (target) => {
|
|
13
|
+
Reflect.defineMetadata(CACHE_KEY, { key, ttlSeconds: 60, ...options }, target);
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
function getCacheMetadata(target) {
|
|
17
|
+
return Reflect.getMetadata(CACHE_KEY, target);
|
|
18
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
export interface DistributedLockOptions {
|
|
3
|
+
/** Lock key template — use {propName} for interpolation */
|
|
4
|
+
key: string;
|
|
5
|
+
/** Max time to wait for lock acquisition in seconds (default: 5) */
|
|
6
|
+
acquireTimeoutSeconds?: number;
|
|
7
|
+
/** Lock auto-release time in seconds (default: 30) */
|
|
8
|
+
lockTtlSeconds?: number;
|
|
9
|
+
}
|
|
10
|
+
/**
|
|
11
|
+
* @DistributedLock('key:{prop}') — acquires a Redis distributed lock before execution.
|
|
12
|
+
* Throws ConflictException on timeout.
|
|
13
|
+
*/
|
|
14
|
+
export declare function DistributedLock(key: string, options?: Omit<DistributedLockOptions, 'key'>): ClassDecorator;
|
|
15
|
+
export declare function getDistributedLockMetadata(target: object): DistributedLockOptions | undefined;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DistributedLock = DistributedLock;
|
|
4
|
+
exports.getDistributedLockMetadata = getDistributedLockMetadata;
|
|
5
|
+
require("reflect-metadata");
|
|
6
|
+
const LOCK_KEY = 'arex:distributed-lock';
|
|
7
|
+
/**
|
|
8
|
+
* @DistributedLock('key:{prop}') — acquires a Redis distributed lock before execution.
|
|
9
|
+
* Throws ConflictException on timeout.
|
|
10
|
+
*/
|
|
11
|
+
function DistributedLock(key, options = {}) {
|
|
12
|
+
return (target) => {
|
|
13
|
+
Reflect.defineMetadata(LOCK_KEY, {
|
|
14
|
+
key,
|
|
15
|
+
acquireTimeoutSeconds: 5,
|
|
16
|
+
lockTtlSeconds: 30,
|
|
17
|
+
...options,
|
|
18
|
+
}, target);
|
|
19
|
+
};
|
|
20
|
+
}
|
|
21
|
+
function getDistributedLockMetadata(target) {
|
|
22
|
+
return Reflect.getMetadata(LOCK_KEY, target);
|
|
23
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
export interface FeatureFlagOptions {
|
|
3
|
+
fallback?: 'throw' | 'skip' | 'default';
|
|
4
|
+
defaultValue?: unknown;
|
|
5
|
+
}
|
|
6
|
+
export declare function FeatureFlag(flagName: string, options?: FeatureFlagOptions): ClassDecorator;
|
|
7
|
+
export declare function getFeatureFlagMetadata(target: object): {
|
|
8
|
+
flagName: string;
|
|
9
|
+
} & FeatureFlagOptions | undefined;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.FeatureFlag = FeatureFlag;
|
|
4
|
+
exports.getFeatureFlagMetadata = getFeatureFlagMetadata;
|
|
5
|
+
require("reflect-metadata");
|
|
6
|
+
const FEATURE_FLAG_KEY = 'arex:feature-flag';
|
|
7
|
+
function FeatureFlag(flagName, options = { fallback: 'throw' }) {
|
|
8
|
+
return (target) => {
|
|
9
|
+
Reflect.defineMetadata(FEATURE_FLAG_KEY, { flagName, ...options }, target);
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
function getFeatureFlagMetadata(target) {
|
|
13
|
+
return Reflect.getMetadata(FEATURE_FLAG_KEY, target);
|
|
14
|
+
}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
export interface InvalidateCacheOptions {
|
|
3
|
+
keys: string[];
|
|
4
|
+
}
|
|
5
|
+
export declare function InvalidateCache(keys: string[]): ClassDecorator;
|
|
6
|
+
export declare function getInvalidateCacheMetadata(target: object): InvalidateCacheOptions | undefined;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.InvalidateCache = InvalidateCache;
|
|
4
|
+
exports.getInvalidateCacheMetadata = getInvalidateCacheMetadata;
|
|
5
|
+
require("reflect-metadata");
|
|
6
|
+
const INVALIDATE_CACHE_KEY = 'arex:invalidate-cache';
|
|
7
|
+
function InvalidateCache(keys) {
|
|
8
|
+
return (target) => {
|
|
9
|
+
Reflect.defineMetadata(INVALIDATE_CACHE_KEY, { keys }, target);
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
function getInvalidateCacheMetadata(target) {
|
|
13
|
+
return Reflect.getMetadata(INVALIDATE_CACHE_KEY, target);
|
|
14
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
/**
|
|
3
|
+
* @IsolatedTransaction() — forces a command to run in its own dedicated transaction,
|
|
4
|
+
* even when an outer transaction scope already exists.
|
|
5
|
+
*
|
|
6
|
+
* Use for operations that must commit independently of the parent flow:
|
|
7
|
+
* - Audit logging (must persist even if the business operation rolls back)
|
|
8
|
+
* - Notifications / side-effects that should not be lost on rollback
|
|
9
|
+
*
|
|
10
|
+
* By default all commands share the ambient transaction (UnitOfWork pattern).
|
|
11
|
+
* This decorator opts out of that behavior.
|
|
12
|
+
*/
|
|
13
|
+
export declare function IsolatedTransaction(): ClassDecorator;
|
|
14
|
+
export declare function isIsolatedTransaction(target: object): boolean;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.IsolatedTransaction = IsolatedTransaction;
|
|
4
|
+
exports.isIsolatedTransaction = isIsolatedTransaction;
|
|
5
|
+
require("reflect-metadata");
|
|
6
|
+
const ISOLATED_TRANSACTION_KEY = 'arex:isolated-transaction';
|
|
7
|
+
/**
|
|
8
|
+
* @IsolatedTransaction() — forces a command to run in its own dedicated transaction,
|
|
9
|
+
* even when an outer transaction scope already exists.
|
|
10
|
+
*
|
|
11
|
+
* Use for operations that must commit independently of the parent flow:
|
|
12
|
+
* - Audit logging (must persist even if the business operation rolls back)
|
|
13
|
+
* - Notifications / side-effects that should not be lost on rollback
|
|
14
|
+
*
|
|
15
|
+
* By default all commands share the ambient transaction (UnitOfWork pattern).
|
|
16
|
+
* This decorator opts out of that behavior.
|
|
17
|
+
*/
|
|
18
|
+
function IsolatedTransaction() {
|
|
19
|
+
return (target) => {
|
|
20
|
+
Reflect.defineMetadata(ISOLATED_TRANSACTION_KEY, true, target);
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
function isIsolatedTransaction(target) {
|
|
24
|
+
return Reflect.getMetadata(ISOLATED_TRANSACTION_KEY, target) === true;
|
|
25
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
export interface LogOptions {
|
|
3
|
+
/** Whether to log the command/query payload (default: true) */
|
|
4
|
+
logPayload?: boolean;
|
|
5
|
+
}
|
|
6
|
+
/**
|
|
7
|
+
* @Log() — marks a command/query for automatic entry/exit logging.
|
|
8
|
+
* Applied globally by QuanticCommandBus/QuanticQueryBus when no explicit decorator is present.
|
|
9
|
+
*/
|
|
10
|
+
export declare function Log(options?: LogOptions): ClassDecorator;
|
|
11
|
+
export declare function getLogMetadata(target: object): LogOptions | undefined;
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Log = Log;
|
|
4
|
+
exports.getLogMetadata = getLogMetadata;
|
|
5
|
+
require("reflect-metadata");
|
|
6
|
+
const LOG_KEY = 'arex:log';
|
|
7
|
+
/**
|
|
8
|
+
* @Log() — marks a command/query for automatic entry/exit logging.
|
|
9
|
+
* Applied globally by QuanticCommandBus/QuanticQueryBus when no explicit decorator is present.
|
|
10
|
+
*/
|
|
11
|
+
function Log(options = {}) {
|
|
12
|
+
return (target) => {
|
|
13
|
+
Reflect.defineMetadata(LOG_KEY, { logPayload: true, ...options }, target);
|
|
14
|
+
};
|
|
15
|
+
}
|
|
16
|
+
function getLogMetadata(target) {
|
|
17
|
+
return Reflect.getMetadata(LOG_KEY, target);
|
|
18
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
import type { ICommandValidator } from '../validation/ICommandValidator';
|
|
3
|
+
type ValidatorClass = new () => ICommandValidator;
|
|
4
|
+
/**
|
|
5
|
+
* @Validate(ValidatorClass) — links a command/query to its Zod-based validator.
|
|
6
|
+
*
|
|
7
|
+
* The ValidationBehavior instantiates the validator and calls validate()
|
|
8
|
+
* before the handler runs. Returns Result.validationError() on failure.
|
|
9
|
+
*
|
|
10
|
+
* Usage:
|
|
11
|
+
* ```typescript
|
|
12
|
+
* @Validate(BlockUserValidator)
|
|
13
|
+
* export class BlockUserCommand {
|
|
14
|
+
* constructor(
|
|
15
|
+
* public readonly blockerId: string,
|
|
16
|
+
* public readonly blockedUserId: string,
|
|
17
|
+
* ) {}
|
|
18
|
+
* }
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export declare function Validate(validatorClass: ValidatorClass): ClassDecorator;
|
|
22
|
+
export declare function shouldValidate(target: object): boolean;
|
|
23
|
+
export declare function getValidatorClass(target: object): ValidatorClass | undefined;
|
|
24
|
+
export {};
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Validate = Validate;
|
|
4
|
+
exports.shouldValidate = shouldValidate;
|
|
5
|
+
exports.getValidatorClass = getValidatorClass;
|
|
6
|
+
require("reflect-metadata");
|
|
7
|
+
const VALIDATE_KEY = 'arex:validate';
|
|
8
|
+
const VALIDATOR_CLASS_KEY = 'arex:validator-class';
|
|
9
|
+
/**
|
|
10
|
+
* @Validate(ValidatorClass) — links a command/query to its Zod-based validator.
|
|
11
|
+
*
|
|
12
|
+
* The ValidationBehavior instantiates the validator and calls validate()
|
|
13
|
+
* before the handler runs. Returns Result.validationError() on failure.
|
|
14
|
+
*
|
|
15
|
+
* Usage:
|
|
16
|
+
* ```typescript
|
|
17
|
+
* @Validate(BlockUserValidator)
|
|
18
|
+
* export class BlockUserCommand {
|
|
19
|
+
* constructor(
|
|
20
|
+
* public readonly blockerId: string,
|
|
21
|
+
* public readonly blockedUserId: string,
|
|
22
|
+
* ) {}
|
|
23
|
+
* }
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
function Validate(validatorClass) {
|
|
27
|
+
return (target) => {
|
|
28
|
+
Reflect.defineMetadata(VALIDATE_KEY, true, target);
|
|
29
|
+
Reflect.defineMetadata(VALIDATOR_CLASS_KEY, validatorClass, target);
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
function shouldValidate(target) {
|
|
33
|
+
return Reflect.getMetadata(VALIDATE_KEY, target) === true;
|
|
34
|
+
}
|
|
35
|
+
function getValidatorClass(target) {
|
|
36
|
+
return Reflect.getMetadata(VALIDATOR_CLASS_KEY, target);
|
|
37
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import 'reflect-metadata';
|
|
2
|
+
export interface WorkflowOptions {
|
|
3
|
+
fallback?: 'throw' | 'skip' | 'queue';
|
|
4
|
+
}
|
|
5
|
+
export declare function Workflow(processDefinitionId: string, options?: WorkflowOptions): ClassDecorator;
|
|
6
|
+
export declare function getWorkflowMetadata(target: object): {
|
|
7
|
+
processDefinitionId: string;
|
|
8
|
+
} & WorkflowOptions | undefined;
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Workflow = Workflow;
|
|
4
|
+
exports.getWorkflowMetadata = getWorkflowMetadata;
|
|
5
|
+
require("reflect-metadata");
|
|
6
|
+
const WORKFLOW_KEY = 'arex:workflow';
|
|
7
|
+
function Workflow(processDefinitionId, options) {
|
|
8
|
+
return (target) => {
|
|
9
|
+
Reflect.defineMetadata(WORKFLOW_KEY, { processDefinitionId, ...options }, target);
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
function getWorkflowMetadata(target) {
|
|
13
|
+
return Reflect.getMetadata(WORKFLOW_KEY, target);
|
|
14
|
+
}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export declare const WORKFLOW_ENGINE: unique symbol;
|
|
2
|
+
export interface WorkflowStartResult {
|
|
3
|
+
workflowInstanceId: string;
|
|
4
|
+
processInstanceId: string;
|
|
5
|
+
status: 'STARTED';
|
|
6
|
+
}
|
|
7
|
+
export interface WorkflowEngine {
|
|
8
|
+
startProcess(processDefinitionId: string, command: object, metadata: {
|
|
9
|
+
commandType: string;
|
|
10
|
+
correlationId?: string;
|
|
11
|
+
}): Promise<WorkflowStartResult>;
|
|
12
|
+
signalProcess(processInstanceId: string, signal: string, data?: unknown): Promise<void>;
|
|
13
|
+
abortProcess(processInstanceId: string): Promise<void>;
|
|
14
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { OnModuleInit } from '@nestjs/common';
|
|
2
|
+
import { CommandBus } from '@nestjs/cqrs';
|
|
3
|
+
import { LogBehavior } from '../behaviors/LogBehavior';
|
|
4
|
+
import { FeatureFlagBehavior } from '../behaviors/FeatureFlagBehavior';
|
|
5
|
+
import { ValidationBehavior } from '../behaviors/ValidationBehavior';
|
|
6
|
+
import { CacheBehavior } from '../behaviors/CacheBehavior';
|
|
7
|
+
import { DistributedLockBehavior } from '../behaviors/DistributedLockBehavior';
|
|
8
|
+
import { TransactionalBehavior } from '../behaviors/TransactionalBehavior';
|
|
9
|
+
import { PerformanceBehavior } from '../behaviors/PerformanceBehavior';
|
|
10
|
+
import { WorkflowBehavior } from '../behaviors/WorkflowBehavior';
|
|
11
|
+
import { InvalidateCacheBehavior } from '../behaviors/InvalidateCacheBehavior';
|
|
12
|
+
/**
|
|
13
|
+
* QuanticCommandBus — wraps the @nestjs/cqrs CommandBus with a behavior pipeline.
|
|
14
|
+
*
|
|
15
|
+
* Pipeline order:
|
|
16
|
+
* InvalidateCache → Log → Performance → FeatureFlag → Validate → Workflow → Cache → DistributedLock → Transactional → Handler
|
|
17
|
+
*
|
|
18
|
+
* Controllers inject the standard CommandBus from @nestjs/cqrs.
|
|
19
|
+
* This class patches its execute() in onModuleInit so the pipeline is transparent.
|
|
20
|
+
*/
|
|
21
|
+
export declare class QuanticCommandBus implements OnModuleInit {
|
|
22
|
+
private readonly commandBus;
|
|
23
|
+
private readonly logBehavior;
|
|
24
|
+
private readonly performanceBehavior;
|
|
25
|
+
private readonly featureFlagBehavior;
|
|
26
|
+
private readonly validationBehavior;
|
|
27
|
+
private readonly workflowBehavior;
|
|
28
|
+
private readonly cacheBehavior;
|
|
29
|
+
private readonly distributedLockBehavior;
|
|
30
|
+
private readonly transactionalBehavior;
|
|
31
|
+
private readonly invalidateCacheBehavior;
|
|
32
|
+
private readonly logger;
|
|
33
|
+
private behaviors;
|
|
34
|
+
private originalExecute;
|
|
35
|
+
constructor(commandBus: CommandBus, logBehavior: LogBehavior, performanceBehavior: PerformanceBehavior, featureFlagBehavior: FeatureFlagBehavior | undefined, validationBehavior: ValidationBehavior, workflowBehavior: WorkflowBehavior | undefined, cacheBehavior: CacheBehavior, distributedLockBehavior: DistributedLockBehavior, transactionalBehavior: TransactionalBehavior, invalidateCacheBehavior: InvalidateCacheBehavior);
|
|
36
|
+
onModuleInit(): void;
|
|
37
|
+
}
|