@takentrade/takentrade-libs 2.0.7 → 3.0.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.
- package/LICENSE +87 -0
- package/README.md +112 -743
- package/dist/common/health/health.controller.js +0 -2
- package/dist/common/index.d.ts +0 -2
- package/dist/common/index.js +0 -2
- package/dist/index.d.ts +2 -0
- package/dist/index.js +2 -0
- package/dist/metrics/circuit-breaker-metrics.service.d.ts +61 -0
- package/dist/metrics/circuit-breaker-metrics.service.js +149 -0
- package/dist/metrics/index.d.ts +5 -0
- package/dist/metrics/index.js +21 -0
- package/dist/metrics/metrics-registry.d.ts +50 -0
- package/dist/metrics/metrics-registry.js +156 -0
- package/dist/metrics/metrics-updater.d.ts +32 -0
- package/dist/metrics/metrics-updater.js +102 -0
- package/dist/metrics/metrics.controller.d.ts +11 -0
- package/dist/metrics/metrics.controller.js +32 -0
- package/dist/metrics/metrics.interface.d.ts +106 -0
- package/dist/metrics/metrics.interface.js +35 -0
- package/dist/metrics/metrics.module.d.ts +11 -0
- package/dist/metrics/metrics.module.js +39 -0
- package/dist/metrics/metrics.service.d.ts +50 -0
- package/dist/metrics/metrics.service.js +165 -0
- package/dist/notification/notification.interface.d.ts +2 -0
- package/dist/resilience/circuit-breaker-event-handler.d.ts +16 -0
- package/dist/resilience/circuit-breaker-event-handler.js +70 -0
- package/dist/resilience/circuit-breaker-factory.d.ts +19 -0
- package/dist/resilience/circuit-breaker-factory.js +51 -0
- package/dist/resilience/circuit-breaker-stats.service.d.ts +37 -0
- package/dist/resilience/circuit-breaker-stats.service.js +69 -0
- package/dist/resilience/circuit-breaker.interface.d.ts +134 -0
- package/dist/resilience/circuit-breaker.interface.js +31 -0
- package/dist/{common/circuit-breaker → resilience}/circuit-breaker.module.js +1 -0
- package/dist/resilience/circuit-breaker.service.d.ts +119 -0
- package/dist/resilience/circuit-breaker.service.js +234 -0
- package/dist/resilience/index.d.ts +3 -0
- package/dist/resilience/index.js +19 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/dist/utils/dto/pagination.js +0 -6
- package/package.json +5 -2
- package/dist/common/circuit-breaker/circuit-breaker.service.d.ts +0 -13
- package/dist/common/circuit-breaker/circuit-breaker.service.js +0 -120
- package/dist/common/circuit-breaker/circuit-breaker.types.d.ts +0 -19
- package/dist/common/circuit-breaker/circuit-breaker.types.js +0 -9
- /package/dist/{common/circuit-breaker → resilience}/circuit-breaker.module.d.ts +0 -0
|
@@ -9,7 +9,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
9
9
|
exports.PaginationQueryDto = void 0;
|
|
10
10
|
const class_validator_1 = require("class-validator");
|
|
11
11
|
const class_transformer_1 = require("class-transformer");
|
|
12
|
-
const swagger_1 = require("@nestjs/swagger");
|
|
13
12
|
class PaginationQueryDto {
|
|
14
13
|
page;
|
|
15
14
|
limit;
|
|
@@ -19,31 +18,26 @@ class PaginationQueryDto {
|
|
|
19
18
|
}
|
|
20
19
|
exports.PaginationQueryDto = PaginationQueryDto;
|
|
21
20
|
__decorate([
|
|
22
|
-
(0, swagger_1.ApiPropertyOptional)({ minimum: 1, default: 1 }),
|
|
23
21
|
(0, class_transformer_1.Type)(() => Number),
|
|
24
22
|
(0, class_validator_1.IsInt)(),
|
|
25
23
|
(0, class_validator_1.Min)(1),
|
|
26
24
|
(0, class_validator_1.IsOptional)()
|
|
27
25
|
], PaginationQueryDto.prototype, "page", void 0);
|
|
28
26
|
__decorate([
|
|
29
|
-
(0, swagger_1.ApiPropertyOptional)({ minimum: 1, maximum: 100, default: 10 }),
|
|
30
27
|
(0, class_transformer_1.Type)(() => Number),
|
|
31
28
|
(0, class_validator_1.IsInt)(),
|
|
32
29
|
(0, class_validator_1.Min)(1),
|
|
33
30
|
(0, class_validator_1.IsOptional)()
|
|
34
31
|
], PaginationQueryDto.prototype, "limit", void 0);
|
|
35
32
|
__decorate([
|
|
36
|
-
(0, swagger_1.ApiPropertyOptional)(),
|
|
37
33
|
(0, class_validator_1.IsString)(),
|
|
38
34
|
(0, class_validator_1.IsOptional)()
|
|
39
35
|
], PaginationQueryDto.prototype, "search", void 0);
|
|
40
36
|
__decorate([
|
|
41
|
-
(0, swagger_1.ApiPropertyOptional)(),
|
|
42
37
|
(0, class_validator_1.IsString)(),
|
|
43
38
|
(0, class_validator_1.IsOptional)()
|
|
44
39
|
], PaginationQueryDto.prototype, "sortBy", void 0);
|
|
45
40
|
__decorate([
|
|
46
|
-
(0, swagger_1.ApiPropertyOptional)({ enum: ['asc', 'desc'], default: 'desc' }),
|
|
47
41
|
(0, class_validator_1.IsEnum)(['asc', 'desc']),
|
|
48
42
|
(0, class_validator_1.IsOptional)()
|
|
49
43
|
], PaginationQueryDto.prototype, "sortOrder", void 0);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@takentrade/takentrade-libs",
|
|
3
|
-
"version": "
|
|
3
|
+
"version": "3.0.0",
|
|
4
4
|
"description": "TakeNTrade shared libraries",
|
|
5
5
|
"main": "./dist/index.js",
|
|
6
6
|
"module": "./dist/index.mjs",
|
|
@@ -36,16 +36,18 @@
|
|
|
36
36
|
"@nestjs/jwt": "^11.0.1",
|
|
37
37
|
"@nestjs/microservices": "^11.1.9",
|
|
38
38
|
"@nestjs/passport": "^11.0.5",
|
|
39
|
-
"@nestjs/swagger": "^11.2.3",
|
|
40
39
|
"@nestjs/terminus": "^11.0.0",
|
|
41
40
|
"class-transformer": "^0.5.1",
|
|
42
41
|
"class-validator": "^0.14.3",
|
|
43
42
|
"cloudinary": "^2.8.0",
|
|
43
|
+
"cockatiel": "^3.2.1",
|
|
44
44
|
"country-codes-list": "^2.0.0",
|
|
45
45
|
"ioredis": "^5.8.2",
|
|
46
46
|
"joi": "^18.0.2",
|
|
47
47
|
"jsonwebtoken": "^9.0.2",
|
|
48
48
|
"object-hash": "^3.0.0",
|
|
49
|
+
"opossum": "^9.0.0",
|
|
50
|
+
"prom-client": "^15.1.3",
|
|
49
51
|
"rxjs": "^7.8.2",
|
|
50
52
|
"tsup": "^8.5.1",
|
|
51
53
|
"uuid": "^13.0.0"
|
|
@@ -57,6 +59,7 @@
|
|
|
57
59
|
"@types/multer": "^2.0.0",
|
|
58
60
|
"@types/node": "^24.10.1",
|
|
59
61
|
"@types/object-hash": "^3.0.6",
|
|
62
|
+
"@types/opossum": "^8.1.9",
|
|
60
63
|
"@types/passport": "^1.0.17",
|
|
61
64
|
"jest": "^30.2.0",
|
|
62
65
|
"prettier": "^3.6.2",
|
|
@@ -1,13 +0,0 @@
|
|
|
1
|
-
import { CircuitBreaker, CircuitBreakerOptions, CircuitState } from './circuit-breaker.types';
|
|
2
|
-
export declare class CircuitBreakerService {
|
|
3
|
-
private readonly logger;
|
|
4
|
-
private readonly breakers;
|
|
5
|
-
createBreaker(name: string, options?: Partial<CircuitBreakerOptions>): CircuitBreaker;
|
|
6
|
-
private startHealthCheck;
|
|
7
|
-
execute<T>(name: string, operation: () => Promise<T>): Promise<T>;
|
|
8
|
-
private onSuccess;
|
|
9
|
-
private onFailure;
|
|
10
|
-
private setState;
|
|
11
|
-
getState(name: string): CircuitState;
|
|
12
|
-
reset(name: string): void;
|
|
13
|
-
}
|
|
@@ -1,120 +0,0 @@
|
|
|
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 CircuitBreakerService_1;
|
|
9
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
-
exports.CircuitBreakerService = void 0;
|
|
11
|
-
const common_1 = require("@nestjs/common");
|
|
12
|
-
const circuit_breaker_types_1 = require("./circuit-breaker.types");
|
|
13
|
-
let CircuitBreakerService = CircuitBreakerService_1 = class CircuitBreakerService {
|
|
14
|
-
logger = new common_1.Logger(CircuitBreakerService_1.name);
|
|
15
|
-
breakers = new Map();
|
|
16
|
-
createBreaker(name, options = {}) {
|
|
17
|
-
const defaultOptions = {
|
|
18
|
-
failureThreshold: 5,
|
|
19
|
-
resetTimeout: 60000,
|
|
20
|
-
monitorTimeout: 30000,
|
|
21
|
-
healthCheckInterval: 5000,
|
|
22
|
-
};
|
|
23
|
-
const finalOptions = { ...defaultOptions, ...options };
|
|
24
|
-
const breaker = {
|
|
25
|
-
name,
|
|
26
|
-
state: circuit_breaker_types_1.CircuitState.CLOSED,
|
|
27
|
-
failures: 0,
|
|
28
|
-
lastFailureTime: null,
|
|
29
|
-
lastSuccessTime: null,
|
|
30
|
-
options: finalOptions,
|
|
31
|
-
};
|
|
32
|
-
this.breakers.set(name, breaker);
|
|
33
|
-
this.startHealthCheck(name);
|
|
34
|
-
return breaker;
|
|
35
|
-
}
|
|
36
|
-
startHealthCheck(name) {
|
|
37
|
-
const interval = setInterval(() => {
|
|
38
|
-
const breaker = this.breakers.get(name);
|
|
39
|
-
if (!breaker) {
|
|
40
|
-
clearInterval(interval);
|
|
41
|
-
return;
|
|
42
|
-
}
|
|
43
|
-
if (breaker.state === circuit_breaker_types_1.CircuitState.OPEN) {
|
|
44
|
-
const now = Date.now();
|
|
45
|
-
const resetTime = breaker.lastFailureTime
|
|
46
|
-
? breaker.lastFailureTime + breaker.options.resetTimeout
|
|
47
|
-
: 0;
|
|
48
|
-
if (now >= resetTime) {
|
|
49
|
-
this.setState(name, circuit_breaker_types_1.CircuitState.HALF_OPEN);
|
|
50
|
-
this.logger.log(`Circuit ${name} moved to HALF_OPEN state for testing`);
|
|
51
|
-
}
|
|
52
|
-
}
|
|
53
|
-
}, this.breakers.get(name)?.options.healthCheckInterval);
|
|
54
|
-
}
|
|
55
|
-
async execute(name, operation) {
|
|
56
|
-
const breaker = this.breakers.get(name);
|
|
57
|
-
if (!breaker) {
|
|
58
|
-
throw new Error(`Circuit breaker ${name} not found`);
|
|
59
|
-
}
|
|
60
|
-
if (breaker.state === circuit_breaker_types_1.CircuitState.OPEN) {
|
|
61
|
-
throw new Error(`Circuit ${name} is OPEN`);
|
|
62
|
-
}
|
|
63
|
-
try {
|
|
64
|
-
const result = await operation();
|
|
65
|
-
this.onSuccess(name);
|
|
66
|
-
return result;
|
|
67
|
-
}
|
|
68
|
-
catch (error) {
|
|
69
|
-
this.onFailure(name);
|
|
70
|
-
throw error;
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
onSuccess(name) {
|
|
74
|
-
const breaker = this.breakers.get(name);
|
|
75
|
-
if (!breaker)
|
|
76
|
-
return;
|
|
77
|
-
breaker.failures = 0;
|
|
78
|
-
breaker.lastSuccessTime = Date.now();
|
|
79
|
-
if (breaker.state === circuit_breaker_types_1.CircuitState.HALF_OPEN) {
|
|
80
|
-
this.setState(name, circuit_breaker_types_1.CircuitState.CLOSED);
|
|
81
|
-
this.logger.log(`Circuit ${name} closed after successful test`);
|
|
82
|
-
}
|
|
83
|
-
}
|
|
84
|
-
onFailure(name) {
|
|
85
|
-
const breaker = this.breakers.get(name);
|
|
86
|
-
if (!breaker)
|
|
87
|
-
return;
|
|
88
|
-
breaker.failures++;
|
|
89
|
-
breaker.lastFailureTime = Date.now();
|
|
90
|
-
if (breaker.state === circuit_breaker_types_1.CircuitState.CLOSED &&
|
|
91
|
-
breaker.failures >= breaker.options.failureThreshold) {
|
|
92
|
-
this.setState(name, circuit_breaker_types_1.CircuitState.OPEN);
|
|
93
|
-
this.logger.warn(`Circuit ${name} opened after ${breaker.failures} failures`);
|
|
94
|
-
}
|
|
95
|
-
}
|
|
96
|
-
setState(name, state) {
|
|
97
|
-
const breaker = this.breakers.get(name);
|
|
98
|
-
if (breaker) {
|
|
99
|
-
breaker.state = state;
|
|
100
|
-
this.breakers.set(name, breaker);
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
getState(name) {
|
|
104
|
-
return this.breakers.get(name)?.state || circuit_breaker_types_1.CircuitState.CLOSED;
|
|
105
|
-
}
|
|
106
|
-
reset(name) {
|
|
107
|
-
const breaker = this.breakers.get(name);
|
|
108
|
-
if (breaker) {
|
|
109
|
-
breaker.failures = 0;
|
|
110
|
-
breaker.state = circuit_breaker_types_1.CircuitState.CLOSED;
|
|
111
|
-
breaker.lastFailureTime = null;
|
|
112
|
-
breaker.lastSuccessTime = null;
|
|
113
|
-
this.breakers.set(name, breaker);
|
|
114
|
-
}
|
|
115
|
-
}
|
|
116
|
-
};
|
|
117
|
-
exports.CircuitBreakerService = CircuitBreakerService;
|
|
118
|
-
exports.CircuitBreakerService = CircuitBreakerService = CircuitBreakerService_1 = __decorate([
|
|
119
|
-
(0, common_1.Injectable)()
|
|
120
|
-
], CircuitBreakerService);
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
export declare enum CircuitState {
|
|
2
|
-
CLOSED = "CLOSED",
|
|
3
|
-
OPEN = "OPEN",
|
|
4
|
-
HALF_OPEN = "HALF_OPEN"
|
|
5
|
-
}
|
|
6
|
-
export interface CircuitBreakerOptions {
|
|
7
|
-
failureThreshold: number;
|
|
8
|
-
resetTimeout: number;
|
|
9
|
-
monitorTimeout: number;
|
|
10
|
-
healthCheckInterval: number;
|
|
11
|
-
}
|
|
12
|
-
export interface CircuitBreaker {
|
|
13
|
-
name: string;
|
|
14
|
-
state: CircuitState;
|
|
15
|
-
failures: number;
|
|
16
|
-
lastFailureTime: number | null;
|
|
17
|
-
lastSuccessTime: number | null;
|
|
18
|
-
options: CircuitBreakerOptions;
|
|
19
|
-
}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.CircuitState = void 0;
|
|
4
|
-
var CircuitState;
|
|
5
|
-
(function (CircuitState) {
|
|
6
|
-
CircuitState["CLOSED"] = "CLOSED";
|
|
7
|
-
CircuitState["OPEN"] = "OPEN";
|
|
8
|
-
CircuitState["HALF_OPEN"] = "HALF_OPEN";
|
|
9
|
-
})(CircuitState || (exports.CircuitState = CircuitState = {}));
|
|
File without changes
|