@takentrade/takentrade-libs 4.1.1 → 4.1.3
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/README.md +15 -55
- package/dist/auth/guards/index.d.ts +1 -0
- package/dist/auth/guards/index.js +1 -0
- package/dist/auth/guards/tnt-base-auth.guard.d.ts +15 -0
- package/dist/auth/guards/tnt-base-auth.guard.js +56 -0
- package/dist/bullmq/config/bull.config.js +1 -1
- package/dist/cache/cache.module.d.ts +6 -2
- package/dist/cache/cache.module.js +10 -3
- package/dist/index.d.ts +0 -3
- package/dist/index.js +0 -3
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +15 -21
- package/dist/metrics/circuit-breaker-metrics.service.d.ts +0 -61
- package/dist/metrics/circuit-breaker-metrics.service.js +0 -149
- package/dist/metrics/index.d.ts +0 -5
- package/dist/metrics/index.js +0 -21
- package/dist/metrics/metrics-registry.d.ts +0 -50
- package/dist/metrics/metrics-registry.js +0 -156
- package/dist/metrics/metrics-updater.d.ts +0 -32
- package/dist/metrics/metrics-updater.js +0 -102
- package/dist/metrics/metrics.controller.d.ts +0 -11
- package/dist/metrics/metrics.controller.js +0 -32
- package/dist/metrics/metrics.interface.d.ts +0 -53
- package/dist/metrics/metrics.interface.js +0 -23
- package/dist/metrics/metrics.module.d.ts +0 -11
- package/dist/metrics/metrics.module.js +0 -39
- package/dist/metrics/metrics.service.d.ts +0 -50
- package/dist/metrics/metrics.service.js +0 -165
- package/dist/monitoring/alerting.service.d.ts +0 -82
- package/dist/monitoring/alerting.service.js +0 -290
- package/dist/monitoring/index.d.ts +0 -5
- package/dist/monitoring/index.js +0 -21
- package/dist/monitoring/monitoring.interface.d.ts +0 -102
- package/dist/monitoring/monitoring.interface.js +0 -10
- package/dist/monitoring/monitoring.module.d.ts +0 -8
- package/dist/monitoring/monitoring.module.js +0 -44
- package/dist/monitoring/sentry.service.d.ts +0 -65
- package/dist/monitoring/sentry.service.js +0 -218
- package/dist/monitoring/uptime.service.d.ts +0 -59
- package/dist/monitoring/uptime.service.js +0 -213
- package/dist/resilience/circuit-breaker-event-handler.d.ts +0 -16
- package/dist/resilience/circuit-breaker-event-handler.js +0 -70
- package/dist/resilience/circuit-breaker-factory.d.ts +0 -19
- package/dist/resilience/circuit-breaker-factory.js +0 -51
- package/dist/resilience/circuit-breaker-stats.service.d.ts +0 -37
- package/dist/resilience/circuit-breaker-stats.service.js +0 -69
- package/dist/resilience/circuit-breaker.interface.d.ts +0 -59
- package/dist/resilience/circuit-breaker.interface.js +0 -25
- package/dist/resilience/circuit-breaker.module.d.ts +0 -2
- package/dist/resilience/circuit-breaker.module.js +0 -21
- package/dist/resilience/circuit-breaker.service.d.ts +0 -119
- package/dist/resilience/circuit-breaker.service.js +0 -234
- package/dist/resilience/index.d.ts +0 -3
- package/dist/resilience/index.js +0 -19
package/README.md
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# TakeNTrade Microservices Libraries
|
|
2
2
|
|
|
3
|
-
Shared libraries for the TakeNTrade microservices architecture, providing authentication, caching, messaging, notifications,
|
|
3
|
+
Shared libraries for the TakeNTrade microservices architecture, providing authentication, caching, messaging, notifications, and common utilities.
|
|
4
4
|
|
|
5
5
|
## Installation
|
|
6
6
|
|
|
@@ -11,22 +11,27 @@ npm install @takentrade/takentrade-libs
|
|
|
11
11
|
## Quick Start
|
|
12
12
|
|
|
13
13
|
```typescript
|
|
14
|
-
import {
|
|
15
|
-
|
|
16
|
-
MetricsModule,
|
|
17
|
-
CircuitBreakerModule,
|
|
18
|
-
} from '@takentrade/takentrade-libs';
|
|
14
|
+
import { CacheModule } from '@takentrade/takentrade-libs';
|
|
15
|
+
import { ConfigService } from '@nestjs/config';
|
|
19
16
|
|
|
20
17
|
@Module({
|
|
21
18
|
imports: [
|
|
22
|
-
CacheModule.
|
|
23
|
-
|
|
24
|
-
|
|
19
|
+
CacheModule.registerAsync({
|
|
20
|
+
inject: [ConfigService],
|
|
21
|
+
useFactory: (configService: ConfigService) => ({
|
|
22
|
+
host: configService.get<string>('redis.host'),
|
|
23
|
+
port: configService.get<number>('redis.port'),
|
|
24
|
+
username: configService.get<string>('redis.username'),
|
|
25
|
+
password: configService.get<string>('redis.password'),
|
|
26
|
+
}),
|
|
27
|
+
}),
|
|
25
28
|
],
|
|
26
29
|
})
|
|
27
30
|
export class AppModule {}
|
|
28
31
|
```
|
|
29
32
|
|
|
33
|
+
For authentication, services can extend the shared `TntBaseAuthGuard` and pair it with their own JWT strategy implementation based on `TntJwtStrategy`.
|
|
34
|
+
|
|
30
35
|
## Modules
|
|
31
36
|
|
|
32
37
|
| Module | Description | Documentation |
|
|
@@ -37,9 +42,6 @@ export class AppModule {}
|
|
|
37
42
|
| **NATS** | Microservice messaging and event streaming | [docs/nats.md](docs/nats.md) |
|
|
38
43
|
| **Notifications** | Email, SMS, and push notifications | [docs/notifications.md](docs/notifications.md) |
|
|
39
44
|
| **RPC** | Request-response patterns for NATS | [docs/rpc.md](docs/rpc.md) |
|
|
40
|
-
| **Resilience** | Circuit breakers for fault tolerance | [docs/resilience.md](docs/resilience.md) |
|
|
41
|
-
| **Metrics** | Prometheus metrics collection | [docs/metrics.md](docs/metrics.md) |
|
|
42
|
-
| **Monitoring** | Error tracking, alerting, uptime monitoring | [docs/monitoring.md](docs/monitoring.md) |
|
|
43
45
|
| **Common** | Shared constants, enums, and utilities | [docs/common.md](docs/common.md) |
|
|
44
46
|
| **Utils** | DTOs, pipes, filters, and helpers | [docs/utils.md](docs/utils.md) |
|
|
45
47
|
|
|
@@ -48,6 +50,7 @@ export class AppModule {}
|
|
|
48
50
|
### 🔐 Authentication & Authorization
|
|
49
51
|
|
|
50
52
|
- `@Public()` and `@Roles()` decorators
|
|
53
|
+
- `TntBaseAuthGuard` for shared JWT guard behavior
|
|
51
54
|
- JWT-based authentication support
|
|
52
55
|
- Role-based access control
|
|
53
56
|
|
|
@@ -58,23 +61,6 @@ export class AppModule {}
|
|
|
58
61
|
- Hash operations
|
|
59
62
|
- Auto-reconnection
|
|
60
63
|
|
|
61
|
-
### 📊 Metrics & Observability
|
|
62
|
-
|
|
63
|
-
- Prometheus metrics with prom-client
|
|
64
|
-
- Default process metrics (CPU, memory, event loop)
|
|
65
|
-
- Custom counters, gauges, histograms, summaries
|
|
66
|
-
- Circuit breaker metrics integration
|
|
67
|
-
- `/metrics` endpoint for scraping
|
|
68
|
-
|
|
69
|
-
### 🔄 Resilience
|
|
70
|
-
|
|
71
|
-
- Circuit breakers using Opossum
|
|
72
|
-
- Automatic failure detection
|
|
73
|
-
- Fallback support
|
|
74
|
-
- Health checks
|
|
75
|
-
- Request caching
|
|
76
|
-
- Comprehensive metrics
|
|
77
|
-
|
|
78
64
|
### 🚀 Background Jobs
|
|
79
65
|
|
|
80
66
|
- BullMQ integration
|
|
@@ -122,30 +108,6 @@ await this.cacheService.set('key', 'value', 3600); // 1 hour TTL
|
|
|
122
108
|
const value = await this.cacheService.get('key');
|
|
123
109
|
```
|
|
124
110
|
|
|
125
|
-
### Metrics
|
|
126
|
-
|
|
127
|
-
```typescript
|
|
128
|
-
this.metricsService.registerCounter({
|
|
129
|
-
name: 'requests_total',
|
|
130
|
-
help: 'Total requests',
|
|
131
|
-
labelNames: ['method', 'status'],
|
|
132
|
-
});
|
|
133
|
-
this.metricsService.incrementCounter('requests_total', {
|
|
134
|
-
method: 'GET',
|
|
135
|
-
status: '200',
|
|
136
|
-
});
|
|
137
|
-
```
|
|
138
|
-
|
|
139
|
-
### Circuit Breaker
|
|
140
|
-
|
|
141
|
-
```typescript
|
|
142
|
-
this.circuitBreaker.createBreaker('api', async (data) => this.apiCall(data), {
|
|
143
|
-
timeout: 5000,
|
|
144
|
-
errorThresholdPercentage: 50,
|
|
145
|
-
});
|
|
146
|
-
const result = await this.circuitBreaker.fire('api', requestData);
|
|
147
|
-
```
|
|
148
|
-
|
|
149
111
|
### Background Jobs
|
|
150
112
|
|
|
151
113
|
```typescript
|
|
@@ -167,8 +129,6 @@ await this.queue.add(
|
|
|
167
129
|
- [NATS](docs/nats.md) - Messaging
|
|
168
130
|
- [Notifications](docs/notifications.md) - Email, SMS, push
|
|
169
131
|
- [RPC](docs/rpc.md) - Request-response patterns
|
|
170
|
-
- [Resilience](docs/resilience.md) - Circuit breakers
|
|
171
|
-
- [Metrics](docs/metrics.md) - Prometheus metrics
|
|
172
132
|
- [Common](docs/common.md) - Shared utilities
|
|
173
133
|
- [Utils](docs/utils.md) - DTOs, pipes, filters
|
|
174
134
|
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { ExecutionContext } from '@nestjs/common';
|
|
2
|
+
import { Reflector } from '@nestjs/core';
|
|
3
|
+
import { Observable } from 'rxjs';
|
|
4
|
+
declare const TntBaseAuthGuard_base: import("@nestjs/passport").Type<import("@nestjs/passport").IAuthGuard>;
|
|
5
|
+
export declare class TntBaseAuthGuard extends TntBaseAuthGuard_base {
|
|
6
|
+
private readonly reflector;
|
|
7
|
+
private readonly logger;
|
|
8
|
+
constructor(reflector: Reflector);
|
|
9
|
+
canActivate(context: ExecutionContext): boolean | Promise<boolean> | Observable<boolean>;
|
|
10
|
+
handleRequest<TUser = unknown>(err: unknown, user: TUser, info: {
|
|
11
|
+
name?: string;
|
|
12
|
+
message?: string;
|
|
13
|
+
} | undefined, context: ExecutionContext, status?: unknown): TUser;
|
|
14
|
+
}
|
|
15
|
+
export {};
|
|
@@ -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 TntBaseAuthGuard_1;
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.TntBaseAuthGuard = void 0;
|
|
11
|
+
const common_1 = require("@nestjs/common");
|
|
12
|
+
const passport_1 = require("@nestjs/passport");
|
|
13
|
+
const decorators_1 = require("../decorators");
|
|
14
|
+
let TntBaseAuthGuard = TntBaseAuthGuard_1 = class TntBaseAuthGuard extends (0, passport_1.AuthGuard)('jwt') {
|
|
15
|
+
reflector;
|
|
16
|
+
logger = new common_1.Logger(TntBaseAuthGuard_1.name);
|
|
17
|
+
constructor(reflector) {
|
|
18
|
+
super();
|
|
19
|
+
this.reflector = reflector;
|
|
20
|
+
}
|
|
21
|
+
canActivate(context) {
|
|
22
|
+
const isPublic = this.reflector.getAllAndOverride(decorators_1.IS_PUBLIC_KEY, [
|
|
23
|
+
context.getHandler(),
|
|
24
|
+
context.getClass(),
|
|
25
|
+
]);
|
|
26
|
+
if (isPublic) {
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
return super.canActivate(context);
|
|
30
|
+
}
|
|
31
|
+
handleRequest(err, user, info, context, status) {
|
|
32
|
+
void status;
|
|
33
|
+
if (err || !user) {
|
|
34
|
+
const request = context.switchToHttp().getRequest();
|
|
35
|
+
const message = err instanceof Error
|
|
36
|
+
? err.message
|
|
37
|
+
: (info?.message ?? 'Authentication failed');
|
|
38
|
+
this.logger.error(`JWT validation error on ${request.method ?? 'UNKNOWN'} ${request.url ?? 'UNKNOWN'}: ${message}`);
|
|
39
|
+
if (info?.name === 'TokenExpiredError') {
|
|
40
|
+
throw new common_1.UnauthorizedException('Token has expired');
|
|
41
|
+
}
|
|
42
|
+
if (info?.name === 'JsonWebTokenError') {
|
|
43
|
+
throw new common_1.UnauthorizedException('Invalid token');
|
|
44
|
+
}
|
|
45
|
+
if (info?.name === 'NotBeforeError') {
|
|
46
|
+
throw new common_1.UnauthorizedException('Token not yet valid');
|
|
47
|
+
}
|
|
48
|
+
throw new common_1.UnauthorizedException('Authentication failed');
|
|
49
|
+
}
|
|
50
|
+
return user;
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
exports.TntBaseAuthGuard = TntBaseAuthGuard;
|
|
54
|
+
exports.TntBaseAuthGuard = TntBaseAuthGuard = TntBaseAuthGuard_1 = __decorate([
|
|
55
|
+
(0, common_1.Injectable)()
|
|
56
|
+
], TntBaseAuthGuard);
|
|
@@ -14,7 +14,7 @@ class BullConfigFactory {
|
|
|
14
14
|
password: this.configService.get('REDIS_PASSWORD'),
|
|
15
15
|
},
|
|
16
16
|
defaultJobOptions: {
|
|
17
|
-
removeOnComplete: false, // Keep completed jobs for
|
|
17
|
+
removeOnComplete: false, // Keep completed jobs available for inspection
|
|
18
18
|
removeOnFail: false, // Keep failed jobs for debugging
|
|
19
19
|
attempts: 3, // Default retry attempts
|
|
20
20
|
backoff: {
|
|
@@ -1,5 +1,9 @@
|
|
|
1
|
-
import { DynamicModule } from '@nestjs/common';
|
|
1
|
+
import { DynamicModule, InjectionToken, ModuleMetadata } from '@nestjs/common';
|
|
2
2
|
import { CacheOptions } from './cache.interface';
|
|
3
3
|
export declare class CacheModule {
|
|
4
|
-
static
|
|
4
|
+
static registerAsync(options: {
|
|
5
|
+
imports?: ModuleMetadata['imports'];
|
|
6
|
+
inject?: InjectionToken[];
|
|
7
|
+
useFactory: (...args: any[]) => Promise<CacheOptions> | CacheOptions;
|
|
8
|
+
}): DynamicModule;
|
|
5
9
|
}
|
|
@@ -12,11 +12,18 @@ const common_1 = require("@nestjs/common");
|
|
|
12
12
|
const config_1 = require("@nestjs/config");
|
|
13
13
|
const cache_service_1 = require("./cache.service");
|
|
14
14
|
let CacheModule = CacheModule_1 = class CacheModule {
|
|
15
|
-
static
|
|
15
|
+
static registerAsync(options) {
|
|
16
16
|
return {
|
|
17
17
|
module: CacheModule_1,
|
|
18
|
-
imports: [config_1.ConfigModule],
|
|
19
|
-
providers: [
|
|
18
|
+
imports: [...(options.imports ?? []), config_1.ConfigModule],
|
|
19
|
+
providers: [
|
|
20
|
+
cache_service_1.CacheService,
|
|
21
|
+
{
|
|
22
|
+
provide: 'options',
|
|
23
|
+
inject: options.inject ?? [],
|
|
24
|
+
useFactory: options.useFactory,
|
|
25
|
+
},
|
|
26
|
+
],
|
|
20
27
|
exports: [cache_service_1.CacheService],
|
|
21
28
|
};
|
|
22
29
|
}
|
package/dist/index.d.ts
CHANGED
package/dist/index.js
CHANGED
|
@@ -23,6 +23,3 @@ __exportStar(require("./rpc"), exports);
|
|
|
23
23
|
__exportStar(require("./logging"), exports);
|
|
24
24
|
__exportStar(require("./auth"), exports);
|
|
25
25
|
__exportStar(require("./notification"), exports);
|
|
26
|
-
__exportStar(require("./resilience"), exports);
|
|
27
|
-
__exportStar(require("./metrics"), exports);
|
|
28
|
-
__exportStar(require("./monitoring"), exports);
|