@pawells/nestjs-shared 1.0.0-dev.4c8c698
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 +21 -0
- package/README.md +802 -0
- package/build/LICENSE +21 -0
- package/build/README.md +802 -0
- package/build/common/common.module.d.ts +49 -0
- package/build/common/common.module.d.ts.map +1 -0
- package/build/common/common.module.js +178 -0
- package/build/common/common.module.js.map +1 -0
- package/build/common/constants/histogram-buckets.constants.d.ts +12 -0
- package/build/common/constants/histogram-buckets.constants.d.ts.map +1 -0
- package/build/common/constants/histogram-buckets.constants.js +51 -0
- package/build/common/constants/histogram-buckets.constants.js.map +1 -0
- package/build/common/constants/http-status.constants.d.ts +27 -0
- package/build/common/constants/http-status.constants.d.ts.map +1 -0
- package/build/common/constants/http-status.constants.js +27 -0
- package/build/common/constants/http-status.constants.js.map +1 -0
- package/build/common/constants/timeout.constants.d.ts +29 -0
- package/build/common/constants/timeout.constants.d.ts.map +1 -0
- package/build/common/constants/timeout.constants.js +45 -0
- package/build/common/constants/timeout.constants.js.map +1 -0
- package/build/common/controllers/metrics.controller.d.ts +23 -0
- package/build/common/controllers/metrics.controller.d.ts.map +1 -0
- package/build/common/controllers/metrics.controller.js +66 -0
- package/build/common/controllers/metrics.controller.js.map +1 -0
- package/build/common/decorators/common-decorators.d.ts +90 -0
- package/build/common/decorators/common-decorators.d.ts.map +1 -0
- package/build/common/decorators/common-decorators.js +101 -0
- package/build/common/decorators/common-decorators.js.map +1 -0
- package/build/common/decorators/decorator-factory.d.ts +108 -0
- package/build/common/decorators/decorator-factory.d.ts.map +1 -0
- package/build/common/decorators/decorator-factory.js +104 -0
- package/build/common/decorators/decorator-factory.js.map +1 -0
- package/build/common/decorators/guard.decorators.d.ts +48 -0
- package/build/common/decorators/guard.decorators.d.ts.map +1 -0
- package/build/common/decorators/guard.decorators.js +49 -0
- package/build/common/decorators/guard.decorators.js.map +1 -0
- package/build/common/decorators/index.d.ts +10 -0
- package/build/common/decorators/index.d.ts.map +1 -0
- package/build/common/decorators/index.js +11 -0
- package/build/common/decorators/index.js.map +1 -0
- package/build/common/decorators/instrument.decorator.d.ts +128 -0
- package/build/common/decorators/instrument.decorator.d.ts.map +1 -0
- package/build/common/decorators/instrument.decorator.js +165 -0
- package/build/common/decorators/instrument.decorator.js.map +1 -0
- package/build/common/decorators/metric.decorators.d.ts +42 -0
- package/build/common/decorators/metric.decorators.d.ts.map +1 -0
- package/build/common/decorators/metric.decorators.js +85 -0
- package/build/common/decorators/metric.decorators.js.map +1 -0
- package/build/common/decorators/request-property.decorator.d.ts +65 -0
- package/build/common/decorators/request-property.decorator.d.ts.map +1 -0
- package/build/common/decorators/request-property.decorator.js +102 -0
- package/build/common/decorators/request-property.decorator.js.map +1 -0
- package/build/common/errors/base-application-error.d.ts +98 -0
- package/build/common/errors/base-application-error.d.ts.map +1 -0
- package/build/common/errors/base-application-error.js +133 -0
- package/build/common/errors/base-application-error.js.map +1 -0
- package/build/common/errors/error-factory.d.ts +93 -0
- package/build/common/errors/error-factory.d.ts.map +1 -0
- package/build/common/errors/error-factory.js +105 -0
- package/build/common/errors/error-factory.js.map +1 -0
- package/build/common/errors/index.d.ts +13 -0
- package/build/common/errors/index.d.ts.map +1 -0
- package/build/common/errors/index.js +15 -0
- package/build/common/errors/index.js.map +1 -0
- package/build/common/factories/index.d.ts +5 -0
- package/build/common/factories/index.d.ts.map +1 -0
- package/build/common/factories/index.js +3 -0
- package/build/common/factories/index.js.map +1 -0
- package/build/common/factories/module-factory.d.ts +178 -0
- package/build/common/factories/module-factory.d.ts.map +1 -0
- package/build/common/factories/module-factory.js +253 -0
- package/build/common/factories/module-factory.js.map +1 -0
- package/build/common/factories/rate-limit-config.factory.d.ts +79 -0
- package/build/common/factories/rate-limit-config.factory.d.ts.map +1 -0
- package/build/common/factories/rate-limit-config.factory.js +115 -0
- package/build/common/factories/rate-limit-config.factory.js.map +1 -0
- package/build/common/factories/security-bootstrap.factory.d.ts +77 -0
- package/build/common/factories/security-bootstrap.factory.d.ts.map +1 -0
- package/build/common/factories/security-bootstrap.factory.js +222 -0
- package/build/common/factories/security-bootstrap.factory.js.map +1 -0
- package/build/common/filters/global-exception.filter.d.ts +78 -0
- package/build/common/filters/global-exception.filter.d.ts.map +1 -0
- package/build/common/filters/global-exception.filter.js +192 -0
- package/build/common/filters/global-exception.filter.js.map +1 -0
- package/build/common/filters/http-exception.filter.d.ts +37 -0
- package/build/common/filters/http-exception.filter.d.ts.map +1 -0
- package/build/common/filters/http-exception.filter.js +91 -0
- package/build/common/filters/http-exception.filter.js.map +1 -0
- package/build/common/guards/csrf.guard.d.ts +53 -0
- package/build/common/guards/csrf.guard.d.ts.map +1 -0
- package/build/common/guards/csrf.guard.js +109 -0
- package/build/common/guards/csrf.guard.js.map +1 -0
- package/build/common/guards/metrics.guard.d.ts +42 -0
- package/build/common/guards/metrics.guard.d.ts.map +1 -0
- package/build/common/guards/metrics.guard.js +124 -0
- package/build/common/guards/metrics.guard.js.map +1 -0
- package/build/common/index.d.ts +43 -0
- package/build/common/index.d.ts.map +1 -0
- package/build/common/index.js +50 -0
- package/build/common/index.js.map +1 -0
- package/build/common/interceptors/http-client.interceptor.d.ts +11 -0
- package/build/common/interceptors/http-client.interceptor.d.ts.map +1 -0
- package/build/common/interceptors/http-client.interceptor.js +69 -0
- package/build/common/interceptors/http-client.interceptor.js.map +1 -0
- package/build/common/interceptors/http-instrumentation.interceptor.d.ts +64 -0
- package/build/common/interceptors/http-instrumentation.interceptor.d.ts.map +1 -0
- package/build/common/interceptors/http-instrumentation.interceptor.js +148 -0
- package/build/common/interceptors/http-instrumentation.interceptor.js.map +1 -0
- package/build/common/interceptors/http-metrics.interceptor.d.ts +46 -0
- package/build/common/interceptors/http-metrics.interceptor.d.ts.map +1 -0
- package/build/common/interceptors/http-metrics.interceptor.js +120 -0
- package/build/common/interceptors/http-metrics.interceptor.js.map +1 -0
- package/build/common/interceptors/logging.interceptor.d.ts +22 -0
- package/build/common/interceptors/logging.interceptor.d.ts.map +1 -0
- package/build/common/interceptors/logging.interceptor.js +67 -0
- package/build/common/interceptors/logging.interceptor.js.map +1 -0
- package/build/common/interfaces/cache-provider.interface.d.ts +54 -0
- package/build/common/interfaces/cache-provider.interface.d.ts.map +1 -0
- package/build/common/interfaces/cache-provider.interface.js +6 -0
- package/build/common/interfaces/cache-provider.interface.js.map +1 -0
- package/build/common/interfaces/index.d.ts +7 -0
- package/build/common/interfaces/index.d.ts.map +1 -0
- package/build/common/interfaces/index.js +3 -0
- package/build/common/interfaces/index.js.map +1 -0
- package/build/common/interfaces/log-context.interface.d.ts +77 -0
- package/build/common/interfaces/log-context.interface.d.ts.map +1 -0
- package/build/common/interfaces/log-context.interface.js +2 -0
- package/build/common/interfaces/log-context.interface.js.map +1 -0
- package/build/common/interfaces/log-entry.interface.d.ts +26 -0
- package/build/common/interfaces/log-entry.interface.d.ts.map +1 -0
- package/build/common/interfaces/log-entry.interface.js +33 -0
- package/build/common/interfaces/log-entry.interface.js.map +1 -0
- package/build/common/interfaces/logger.interface.d.ts +62 -0
- package/build/common/interfaces/logger.interface.d.ts.map +1 -0
- package/build/common/interfaces/logger.interface.js +2 -0
- package/build/common/interfaces/logger.interface.js.map +1 -0
- package/build/common/interfaces/metrics-exporter.interface.d.ts +275 -0
- package/build/common/interfaces/metrics-exporter.interface.d.ts.map +1 -0
- package/build/common/interfaces/metrics-exporter.interface.js +8 -0
- package/build/common/interfaces/metrics-exporter.interface.js.map +1 -0
- package/build/common/metrics/base-metrics-collector.d.ts +81 -0
- package/build/common/metrics/base-metrics-collector.d.ts.map +1 -0
- package/build/common/metrics/base-metrics-collector.js +88 -0
- package/build/common/metrics/base-metrics-collector.js.map +1 -0
- package/build/common/metrics/index.d.ts +2 -0
- package/build/common/metrics/index.d.ts.map +1 -0
- package/build/common/metrics/index.js +2 -0
- package/build/common/metrics/index.js.map +1 -0
- package/build/common/metrics.module.d.ts +50 -0
- package/build/common/metrics.module.d.ts.map +1 -0
- package/build/common/metrics.module.js +77 -0
- package/build/common/metrics.module.js.map +1 -0
- package/build/common/modules/throttler.module.d.ts +69 -0
- package/build/common/modules/throttler.module.d.ts.map +1 -0
- package/build/common/modules/throttler.module.js +117 -0
- package/build/common/modules/throttler.module.js.map +1 -0
- package/build/common/pipes/base-validation.pipe.d.ts +67 -0
- package/build/common/pipes/base-validation.pipe.d.ts.map +1 -0
- package/build/common/pipes/base-validation.pipe.js +95 -0
- package/build/common/pipes/base-validation.pipe.js.map +1 -0
- package/build/common/pipes/validation.pipe.d.ts +32 -0
- package/build/common/pipes/validation.pipe.d.ts.map +1 -0
- package/build/common/pipes/validation.pipe.js +60 -0
- package/build/common/pipes/validation.pipe.js.map +1 -0
- package/build/common/registry/instrumentation-registry.d.ts +227 -0
- package/build/common/registry/instrumentation-registry.d.ts.map +1 -0
- package/build/common/registry/instrumentation-registry.js +414 -0
- package/build/common/registry/instrumentation-registry.js.map +1 -0
- package/build/common/services/audit-logger.service.d.ts +91 -0
- package/build/common/services/audit-logger.service.d.ts.map +1 -0
- package/build/common/services/audit-logger.service.js +180 -0
- package/build/common/services/audit-logger.service.js.map +1 -0
- package/build/common/services/csrf.service.d.ts +202 -0
- package/build/common/services/csrf.service.d.ts.map +1 -0
- package/build/common/services/csrf.service.js +478 -0
- package/build/common/services/csrf.service.js.map +1 -0
- package/build/common/services/error-categorizer.service.d.ts +82 -0
- package/build/common/services/error-categorizer.service.d.ts.map +1 -0
- package/build/common/services/error-categorizer.service.js +339 -0
- package/build/common/services/error-categorizer.service.js.map +1 -0
- package/build/common/services/error-sanitizer.service.d.ts +146 -0
- package/build/common/services/error-sanitizer.service.d.ts.map +1 -0
- package/build/common/services/error-sanitizer.service.js +287 -0
- package/build/common/services/error-sanitizer.service.js.map +1 -0
- package/build/common/services/health-check.service.d.ts +86 -0
- package/build/common/services/health-check.service.d.ts.map +1 -0
- package/build/common/services/health-check.service.js +132 -0
- package/build/common/services/health-check.service.js.map +1 -0
- package/build/common/services/http-client.service.d.ts +113 -0
- package/build/common/services/http-client.service.d.ts.map +1 -0
- package/build/common/services/http-client.service.js +294 -0
- package/build/common/services/http-client.service.js.map +1 -0
- package/build/common/services/logger.service.d.ts +189 -0
- package/build/common/services/logger.service.d.ts.map +1 -0
- package/build/common/services/logger.service.js +423 -0
- package/build/common/services/logger.service.js.map +1 -0
- package/build/common/services/metrics-registry.service.d.ts +98 -0
- package/build/common/services/metrics-registry.service.d.ts.map +1 -0
- package/build/common/services/metrics-registry.service.js +262 -0
- package/build/common/services/metrics-registry.service.js.map +1 -0
- package/build/common/services/nest-logger-adapter.service.d.ts +62 -0
- package/build/common/services/nest-logger-adapter.service.d.ts.map +1 -0
- package/build/common/services/nest-logger-adapter.service.js +120 -0
- package/build/common/services/nest-logger-adapter.service.js.map +1 -0
- package/build/common/utils/error.utils.d.ts +16 -0
- package/build/common/utils/error.utils.d.ts.map +1 -0
- package/build/common/utils/error.utils.js +26 -0
- package/build/common/utils/error.utils.js.map +1 -0
- package/build/common/utils/lazy-getter.types.d.ts +190 -0
- package/build/common/utils/lazy-getter.types.d.ts.map +1 -0
- package/build/common/utils/lazy-getter.types.js +114 -0
- package/build/common/utils/lazy-getter.types.js.map +1 -0
- package/build/common/utils/module.utils.d.ts +33 -0
- package/build/common/utils/module.utils.d.ts.map +1 -0
- package/build/common/utils/module.utils.js +48 -0
- package/build/common/utils/module.utils.js.map +1 -0
- package/build/common/utils/sanitization.utils.d.ts +69 -0
- package/build/common/utils/sanitization.utils.d.ts.map +1 -0
- package/build/common/utils/sanitization.utils.js +141 -0
- package/build/common/utils/sanitization.utils.js.map +1 -0
- package/build/config/config.module.d.ts +30 -0
- package/build/config/config.module.d.ts.map +1 -0
- package/build/config/config.module.js +49 -0
- package/build/config/config.module.js.map +1 -0
- package/build/config/config.service.d.ts +74 -0
- package/build/config/config.service.d.ts.map +1 -0
- package/build/config/config.service.js +145 -0
- package/build/config/config.service.js.map +1 -0
- package/build/config/config.types.d.ts +143 -0
- package/build/config/config.types.d.ts.map +1 -0
- package/build/config/config.types.js +2 -0
- package/build/config/config.types.js.map +1 -0
- package/build/config/decorators/config.decorators.d.ts +43 -0
- package/build/config/decorators/config.decorators.d.ts.map +1 -0
- package/build/config/decorators/config.decorators.js +68 -0
- package/build/config/decorators/config.decorators.js.map +1 -0
- package/build/config/decorators/index.d.ts +2 -0
- package/build/config/decorators/index.d.ts.map +1 -0
- package/build/config/decorators/index.js +2 -0
- package/build/config/decorators/index.js.map +1 -0
- package/build/config/index.d.ts +7 -0
- package/build/config/index.d.ts.map +1 -0
- package/build/config/index.js +9 -0
- package/build/config/index.js.map +1 -0
- package/build/config/validation.utils.d.ts +136 -0
- package/build/config/validation.utils.d.ts.map +1 -0
- package/build/config/validation.utils.js +263 -0
- package/build/config/validation.utils.js.map +1 -0
- package/build/errors/index.d.ts +9 -0
- package/build/errors/index.d.ts.map +1 -0
- package/build/errors/index.js +12 -0
- package/build/errors/index.js.map +1 -0
- package/build/guards/custom-throttle.guard.d.ts +28 -0
- package/build/guards/custom-throttle.guard.d.ts.map +1 -0
- package/build/guards/custom-throttle.guard.js +52 -0
- package/build/guards/custom-throttle.guard.js.map +1 -0
- package/build/guards/index.d.ts +2 -0
- package/build/guards/index.d.ts.map +1 -0
- package/build/guards/index.js +2 -0
- package/build/guards/index.js.map +1 -0
- package/build/index.d.ts +53 -0
- package/build/index.d.ts.map +1 -0
- package/build/index.js +61 -0
- package/build/index.js.map +1 -0
- package/build/logging/index.d.ts +7 -0
- package/build/logging/index.d.ts.map +1 -0
- package/build/logging/index.js +7 -0
- package/build/logging/index.js.map +1 -0
- package/build/metrics/index.d.ts +6 -0
- package/build/metrics/index.d.ts.map +1 -0
- package/build/metrics/index.js +11 -0
- package/build/metrics/index.js.map +1 -0
- package/build/package.json +72 -0
- package/build/security/index.d.ts +8 -0
- package/build/security/index.d.ts.map +1 -0
- package/build/security/index.js +11 -0
- package/build/security/index.js.map +1 -0
- package/build/test-setup.d.ts +2 -0
- package/build/test-setup.d.ts.map +1 -0
- package/build/test-setup.js +40 -0
- package/build/test-setup.js.map +1 -0
- package/build/validation/index.d.ts +6 -0
- package/build/validation/index.d.ts.map +1 -0
- package/build/validation/index.js +8 -0
- package/build/validation/index.js.map +1 -0
- package/package.json +71 -0
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
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;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
8
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
9
|
+
};
|
|
10
|
+
var HttpClientService_1;
|
|
11
|
+
import { Injectable } from '@nestjs/common';
|
|
12
|
+
import { ModuleRef } from '@nestjs/core';
|
|
13
|
+
import * as https from 'https';
|
|
14
|
+
import * as http from 'http';
|
|
15
|
+
import { AppLogger } from './logger.service.js';
|
|
16
|
+
import { getHttpClientTimeout } from '../constants/timeout.constants.js';
|
|
17
|
+
import { HTTP_STATUS_OK } from '../constants/http-status.constants.js';
|
|
18
|
+
/**
|
|
19
|
+
* HTTP Client Service.
|
|
20
|
+
* Provides a robust HTTP client with timeout handling, SSL/TLS configuration, payload size limits,
|
|
21
|
+
* and comprehensive logging with sensitive data redaction.
|
|
22
|
+
*
|
|
23
|
+
* Features:
|
|
24
|
+
* - Configurable timeouts (default: HTTP_CLIENT_TIMEOUT)
|
|
25
|
+
* - SSL/TLS certificate validation (default: strict)
|
|
26
|
+
* - Custom CA certificate support for self-signed certs
|
|
27
|
+
* - Payload size limit enforcement (10MB default)
|
|
28
|
+
* - Automatic content-type parsing (JSON, text)
|
|
29
|
+
* - Correlation ID support for request tracing
|
|
30
|
+
* - Sensitive data redaction in logs (passwords, tokens, auth headers)
|
|
31
|
+
* - Request/response duration tracking
|
|
32
|
+
*
|
|
33
|
+
* @remarks
|
|
34
|
+
* - Maximum payload size: 10MB (prevents memory exhaustion from large responses)
|
|
35
|
+
* - Timeout error handling with clear error messages
|
|
36
|
+
* - Content-type validation before JSON parsing
|
|
37
|
+
* - All sensitive headers (Authorization, Cookie, X-API-Key) redacted in logs
|
|
38
|
+
* - URLs with embedded credentials are sanitized before logging
|
|
39
|
+
*
|
|
40
|
+
* @example
|
|
41
|
+
* ```typescript
|
|
42
|
+
* // Simple GET request
|
|
43
|
+
* const response = await client.get('https://api.example.com/users');
|
|
44
|
+
*
|
|
45
|
+
* // POST with custom timeout and correlation ID
|
|
46
|
+
* const response = await client.post('https://api.example.com/users',
|
|
47
|
+
* { name: 'John', email: 'john@example.com' },
|
|
48
|
+
* { timeout: 5000, correlationId: 'req-123' }
|
|
49
|
+
* );
|
|
50
|
+
*
|
|
51
|
+
* // HTTPS with custom CA certificate
|
|
52
|
+
* const cert = fs.readFileSync('/path/to/ca.pem');
|
|
53
|
+
* const response = await client.get('https://internal-api.local/data', { ca: cert });
|
|
54
|
+
* ```
|
|
55
|
+
*/
|
|
56
|
+
let HttpClientService = HttpClientService_1 = class HttpClientService {
|
|
57
|
+
_contextualLogger;
|
|
58
|
+
Module;
|
|
59
|
+
constructor(module) {
|
|
60
|
+
this.Module = module;
|
|
61
|
+
}
|
|
62
|
+
get Logger() {
|
|
63
|
+
if (!this._contextualLogger) {
|
|
64
|
+
const baseLogger = this.Module.get(AppLogger);
|
|
65
|
+
this._contextualLogger = baseLogger.createContextualLogger(HttpClientService_1.name);
|
|
66
|
+
}
|
|
67
|
+
return this._contextualLogger;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* Makes an HTTP request. URLs with embedded credentials and sensitive headers
|
|
71
|
+
* are sanitized before logging.
|
|
72
|
+
*/
|
|
73
|
+
// eslint-disable-next-line @typescript-eslint/promise-function-async
|
|
74
|
+
request(options) {
|
|
75
|
+
const { method, url: requestUrl, headers, data, timeout = getHttpClientTimeout(), correlationId, rejectUnauthorized = true, ca } = options;
|
|
76
|
+
const startTime = Date.now();
|
|
77
|
+
const MAX_PAYLOAD_SIZE = 10_485_760; // 10MB in bytes
|
|
78
|
+
const safeUrl = this.sanitizeUrl(requestUrl);
|
|
79
|
+
this.Logger.debug('Making HTTP request', JSON.stringify({
|
|
80
|
+
method,
|
|
81
|
+
url: safeUrl,
|
|
82
|
+
headers: this.sanitizeHeaders(headers),
|
|
83
|
+
hasData: !!data,
|
|
84
|
+
timeout,
|
|
85
|
+
correlationId: correlationId ?? 'unknown',
|
|
86
|
+
}));
|
|
87
|
+
return new Promise((resolve, reject) => {
|
|
88
|
+
const parsedUrl = new URL(requestUrl); // Use raw URL for actual request
|
|
89
|
+
const isHttps = parsedUrl.protocol === 'https:';
|
|
90
|
+
const client = isHttps ? https : http;
|
|
91
|
+
const requestOptions = {
|
|
92
|
+
hostname: parsedUrl.hostname,
|
|
93
|
+
port: parsedUrl.port || undefined,
|
|
94
|
+
path: parsedUrl.pathname + parsedUrl.search,
|
|
95
|
+
method,
|
|
96
|
+
headers: headers ?? {},
|
|
97
|
+
timeout,
|
|
98
|
+
};
|
|
99
|
+
// Add SSL/TLS options for HTTPS requests
|
|
100
|
+
if (isHttps) {
|
|
101
|
+
requestOptions.rejectUnauthorized = rejectUnauthorized;
|
|
102
|
+
if (ca) {
|
|
103
|
+
requestOptions.ca = ca;
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
const req = client.request(requestOptions, (res) => {
|
|
107
|
+
const chunks = [];
|
|
108
|
+
let totalSize = 0;
|
|
109
|
+
res.on('data', (chunk) => {
|
|
110
|
+
totalSize += chunk.length;
|
|
111
|
+
if (totalSize > MAX_PAYLOAD_SIZE) {
|
|
112
|
+
const duration = Date.now() - startTime;
|
|
113
|
+
req.destroy();
|
|
114
|
+
const error = new Error('Payload too large');
|
|
115
|
+
this.Logger.error('HTTP response payload exceeded size limit', JSON.stringify({
|
|
116
|
+
method,
|
|
117
|
+
url: safeUrl,
|
|
118
|
+
maxSize: MAX_PAYLOAD_SIZE,
|
|
119
|
+
actualSize: totalSize,
|
|
120
|
+
durationMs: duration,
|
|
121
|
+
correlationId: correlationId ?? 'unknown',
|
|
122
|
+
}));
|
|
123
|
+
reject(error);
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
chunks.push(chunk);
|
|
127
|
+
});
|
|
128
|
+
res.on('error', (error) => {
|
|
129
|
+
const duration = Date.now() - startTime;
|
|
130
|
+
this.Logger.error('HTTP response error', JSON.stringify({
|
|
131
|
+
method,
|
|
132
|
+
url: safeUrl,
|
|
133
|
+
error: error.message,
|
|
134
|
+
durationMs: duration,
|
|
135
|
+
correlationId: correlationId ?? 'unknown',
|
|
136
|
+
}));
|
|
137
|
+
reject(error);
|
|
138
|
+
});
|
|
139
|
+
res.on('end', () => {
|
|
140
|
+
const duration = Date.now() - startTime;
|
|
141
|
+
try {
|
|
142
|
+
const body = Buffer.concat(chunks).toString('utf-8');
|
|
143
|
+
// Validate payload size before parsing JSON
|
|
144
|
+
if (body.length > MAX_PAYLOAD_SIZE) {
|
|
145
|
+
this.Logger.error('HTTP response payload exceeded size limit', JSON.stringify({
|
|
146
|
+
method,
|
|
147
|
+
url: safeUrl,
|
|
148
|
+
maxSize: MAX_PAYLOAD_SIZE,
|
|
149
|
+
actualSize: body.length,
|
|
150
|
+
durationMs: duration,
|
|
151
|
+
correlationId: correlationId ?? 'unknown',
|
|
152
|
+
}));
|
|
153
|
+
reject(new Error('Payload too large'));
|
|
154
|
+
return;
|
|
155
|
+
}
|
|
156
|
+
// Validate content-type before parsing JSON
|
|
157
|
+
const contentType = res.headers['content-type'] ?? '';
|
|
158
|
+
let parsedData = null;
|
|
159
|
+
if (body) {
|
|
160
|
+
if (contentType.includes('application/json')) {
|
|
161
|
+
parsedData = JSON.parse(body);
|
|
162
|
+
}
|
|
163
|
+
else if (contentType.includes('text/')) {
|
|
164
|
+
parsedData = body;
|
|
165
|
+
}
|
|
166
|
+
else {
|
|
167
|
+
// For other content types, return raw body
|
|
168
|
+
parsedData = body;
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
this.Logger.info('HTTP request successful', JSON.stringify({
|
|
172
|
+
method,
|
|
173
|
+
url: safeUrl,
|
|
174
|
+
statusCode: res.statusCode,
|
|
175
|
+
durationMs: duration,
|
|
176
|
+
responseSize: body.length,
|
|
177
|
+
correlationId: correlationId ?? 'unknown',
|
|
178
|
+
}));
|
|
179
|
+
resolve({
|
|
180
|
+
data: parsedData,
|
|
181
|
+
status: res.statusCode ?? HTTP_STATUS_OK,
|
|
182
|
+
statusText: res.statusMessage ?? 'OK',
|
|
183
|
+
headers: res.headers,
|
|
184
|
+
duration,
|
|
185
|
+
});
|
|
186
|
+
}
|
|
187
|
+
catch (error) {
|
|
188
|
+
this.Logger.error('HTTP response parsing failed', JSON.stringify({
|
|
189
|
+
method,
|
|
190
|
+
url: safeUrl,
|
|
191
|
+
statusCode: res.statusCode,
|
|
192
|
+
error: error.message,
|
|
193
|
+
durationMs: duration,
|
|
194
|
+
correlationId: correlationId ?? 'unknown',
|
|
195
|
+
}));
|
|
196
|
+
reject(error);
|
|
197
|
+
}
|
|
198
|
+
});
|
|
199
|
+
});
|
|
200
|
+
req.on('error', (error) => {
|
|
201
|
+
const duration = Date.now() - startTime;
|
|
202
|
+
this.Logger.error('HTTP request failed', JSON.stringify({
|
|
203
|
+
method,
|
|
204
|
+
url: safeUrl,
|
|
205
|
+
error: error.message,
|
|
206
|
+
durationMs: duration,
|
|
207
|
+
correlationId: correlationId ?? 'unknown',
|
|
208
|
+
}));
|
|
209
|
+
reject(error);
|
|
210
|
+
});
|
|
211
|
+
req.on('timeout', () => {
|
|
212
|
+
const duration = Date.now() - startTime;
|
|
213
|
+
req.destroy();
|
|
214
|
+
this.Logger.warn('HTTP request timeout', JSON.stringify({
|
|
215
|
+
method,
|
|
216
|
+
url: safeUrl,
|
|
217
|
+
timeout,
|
|
218
|
+
durationMs: duration,
|
|
219
|
+
correlationId: correlationId ?? 'unknown',
|
|
220
|
+
}));
|
|
221
|
+
reject(new Error('Request timeout'));
|
|
222
|
+
});
|
|
223
|
+
if (data) {
|
|
224
|
+
const bodyData = typeof data === 'string' ? data : JSON.stringify(data);
|
|
225
|
+
req.write(bodyData);
|
|
226
|
+
}
|
|
227
|
+
req.end();
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
// eslint-disable-next-line @typescript-eslint/promise-function-async
|
|
231
|
+
get(url, options = {}) {
|
|
232
|
+
return this.request({ ...options, method: 'GET', url });
|
|
233
|
+
}
|
|
234
|
+
// eslint-disable-next-line @typescript-eslint/promise-function-async
|
|
235
|
+
post(url, data, options = {}) {
|
|
236
|
+
return this.request({ ...options, method: 'POST', url, data });
|
|
237
|
+
}
|
|
238
|
+
// eslint-disable-next-line @typescript-eslint/promise-function-async
|
|
239
|
+
put(url, data, options = {}) {
|
|
240
|
+
return this.request({ ...options, method: 'PUT', url, data });
|
|
241
|
+
}
|
|
242
|
+
// eslint-disable-next-line @typescript-eslint/promise-function-async
|
|
243
|
+
delete(url, options = {}) {
|
|
244
|
+
return this.request({ ...options, method: 'DELETE', url });
|
|
245
|
+
}
|
|
246
|
+
/**
|
|
247
|
+
* Sanitize a URL to remove embedded credentials (e.g., https://user:pass@host/)
|
|
248
|
+
*/
|
|
249
|
+
sanitizeUrl(url) {
|
|
250
|
+
try {
|
|
251
|
+
const parsed = new URL(url);
|
|
252
|
+
if (parsed.username || parsed.password) {
|
|
253
|
+
parsed.username = '[REDACTED]';
|
|
254
|
+
parsed.password = '[REDACTED]';
|
|
255
|
+
return parsed.toString();
|
|
256
|
+
}
|
|
257
|
+
return url;
|
|
258
|
+
}
|
|
259
|
+
catch {
|
|
260
|
+
return url;
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
/**
|
|
264
|
+
* Redacts sensitive headers (authorization, cookies, API keys, CSRF tokens)
|
|
265
|
+
* before logging.
|
|
266
|
+
*/
|
|
267
|
+
sanitizeHeaders(headers) {
|
|
268
|
+
if (!headers)
|
|
269
|
+
return undefined;
|
|
270
|
+
const sensitiveHeaders = [
|
|
271
|
+
'authorization',
|
|
272
|
+
'x-api-key',
|
|
273
|
+
'cookie',
|
|
274
|
+
'set-cookie',
|
|
275
|
+
'x-auth-token',
|
|
276
|
+
'proxy-authorization',
|
|
277
|
+
'x-csrf-token',
|
|
278
|
+
];
|
|
279
|
+
const sanitized = { ...headers };
|
|
280
|
+
// Replace sensitive headers with redacted value (case-insensitive)
|
|
281
|
+
for (const [key] of Object.entries(sanitized)) {
|
|
282
|
+
if (sensitiveHeaders.includes(key.toLowerCase())) {
|
|
283
|
+
sanitized[key] = '[REDACTED]';
|
|
284
|
+
}
|
|
285
|
+
}
|
|
286
|
+
return sanitized;
|
|
287
|
+
}
|
|
288
|
+
};
|
|
289
|
+
HttpClientService = HttpClientService_1 = __decorate([
|
|
290
|
+
Injectable(),
|
|
291
|
+
__metadata("design:paramtypes", [ModuleRef])
|
|
292
|
+
], HttpClientService);
|
|
293
|
+
export { HttpClientService };
|
|
294
|
+
//# sourceMappingURL=http-client.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"http-client.service.js","sourceRoot":"","sources":["../../../src/common/services/http-client.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
import { ConfigService } from '@nestjs/config';
|
|
2
|
+
import { LogMetadata } from '../interfaces/log-entry.interface.js';
|
|
3
|
+
import { IContextualLogger } from '../interfaces/logger.interface.js';
|
|
4
|
+
/**
|
|
5
|
+
* Options object for logging methods.
|
|
6
|
+
* Provides a cleaner alternative to positional parameters.
|
|
7
|
+
*/
|
|
8
|
+
export interface LogOptions {
|
|
9
|
+
context?: string;
|
|
10
|
+
trace?: string;
|
|
11
|
+
metadata?: LogMetadata;
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* Centralized application logger service.
|
|
15
|
+
* Wraps @pawells/logger and respects LOG_LEVEL environment variable for filtering.
|
|
16
|
+
* Automatically redacts sensitive information (passwords, tokens, API keys) from logs.
|
|
17
|
+
* Supports structured logging with context and metadata.
|
|
18
|
+
* Integrates with OpenTelemetry for trace and span ID correlation.
|
|
19
|
+
* Implements Interface Segregation Principle with focused interfaces.
|
|
20
|
+
*
|
|
21
|
+
* @example
|
|
22
|
+
* ```typescript
|
|
23
|
+
* // Use flexible logging methods
|
|
24
|
+
* logger.info('User logged in', 'AuthService', { userId: '123' });
|
|
25
|
+
* logger.error('Database error', error.stack, 'DatabaseService', { query: '...' });
|
|
26
|
+
* logger.debug('Cache hit', { metadata: { key: 'users:123' } });
|
|
27
|
+
* ```
|
|
28
|
+
*/
|
|
29
|
+
export declare class AppLogger implements IContextualLogger {
|
|
30
|
+
private readonly configService?;
|
|
31
|
+
private readonly context;
|
|
32
|
+
private readonly pawellsLogger;
|
|
33
|
+
private readonly minLevel;
|
|
34
|
+
private readonly serviceName;
|
|
35
|
+
/**
|
|
36
|
+
* Set of field names that contain sensitive information requiring redaction in logs.
|
|
37
|
+
* Stored as lowercase for case-insensitive matching against object keys.
|
|
38
|
+
* Prevents leaking credentials, tokens, and other security-sensitive data into log output.
|
|
39
|
+
* Includes passwords, API keys, tokens, and payment card information.
|
|
40
|
+
*/
|
|
41
|
+
private readonly sensitiveKeys;
|
|
42
|
+
constructor(configService?: ConfigService | undefined, context?: string);
|
|
43
|
+
/**
|
|
44
|
+
* Parse LOG_LEVEL environment variable
|
|
45
|
+
* @returns LogLevel enum value (numeric)
|
|
46
|
+
*/
|
|
47
|
+
private parseLogLevel;
|
|
48
|
+
/**
|
|
49
|
+
* Parse LOG_FORMAT environment variable
|
|
50
|
+
* @returns Format type ('json' | 'text'), defaults to 'json'
|
|
51
|
+
*/
|
|
52
|
+
private parseLogFormat;
|
|
53
|
+
/**
|
|
54
|
+
* Map nestjs-shared numeric LogLevel to @pawells/logger LogLevel
|
|
55
|
+
* @param level - Numeric LogLevel from nestjs-shared
|
|
56
|
+
* @returns String LogLevel for @pawells/logger
|
|
57
|
+
*/
|
|
58
|
+
private mapNestjsLogLevelToPawells;
|
|
59
|
+
/**
|
|
60
|
+
* Check if a log level should be output
|
|
61
|
+
* @param level - Level to check
|
|
62
|
+
* @returns true if level should be logged
|
|
63
|
+
*/
|
|
64
|
+
private shouldLog;
|
|
65
|
+
/**
|
|
66
|
+
* Sanitize metadata to remove sensitive information and handle circular references
|
|
67
|
+
* @param metadata - Metadata to sanitize
|
|
68
|
+
* @returns Sanitized metadata with circular references replaced by '[CIRCULAR_REF]'
|
|
69
|
+
*/
|
|
70
|
+
private sanitizeMetadata;
|
|
71
|
+
/**
|
|
72
|
+
* Extract OpenTelemetry trace context
|
|
73
|
+
* @returns Object with traceId and spanId if available
|
|
74
|
+
*/
|
|
75
|
+
private extractTraceContext;
|
|
76
|
+
/**
|
|
77
|
+
* Build metadata with context and trace info
|
|
78
|
+
* @param logContext - Logger context
|
|
79
|
+
* @param metadata - User-provided metadata
|
|
80
|
+
* @returns Combined metadata
|
|
81
|
+
*/
|
|
82
|
+
private buildMetadata;
|
|
83
|
+
/**
|
|
84
|
+
* Log debug message
|
|
85
|
+
* @param message - Log message
|
|
86
|
+
* @param options - Optional context/metadata options
|
|
87
|
+
*/
|
|
88
|
+
debug(message: string | Error, options: LogOptions): void;
|
|
89
|
+
/**
|
|
90
|
+
* Log debug message
|
|
91
|
+
* @param message - Log message
|
|
92
|
+
* @param context - Optional context override
|
|
93
|
+
* @param metadata - Optional structured metadata
|
|
94
|
+
*/
|
|
95
|
+
debug(message: string | Error, context?: string, metadata?: LogMetadata): void;
|
|
96
|
+
/**
|
|
97
|
+
* Log debug message
|
|
98
|
+
* @param message - Log message
|
|
99
|
+
* @param metadata - Optional structured metadata
|
|
100
|
+
*/
|
|
101
|
+
debug(message: string | Error, metadata?: LogMetadata): void;
|
|
102
|
+
/**
|
|
103
|
+
* Log info message
|
|
104
|
+
* @param message - Log message
|
|
105
|
+
* @param options - Optional context/metadata options
|
|
106
|
+
*/
|
|
107
|
+
info(message: string | Error, options: LogOptions): void;
|
|
108
|
+
/**
|
|
109
|
+
* Log info message
|
|
110
|
+
* @param message - Log message
|
|
111
|
+
* @param context - Optional context override
|
|
112
|
+
* @param metadata - Optional structured metadata
|
|
113
|
+
*/
|
|
114
|
+
info(message: string | Error, context?: string, metadata?: LogMetadata): void;
|
|
115
|
+
/**
|
|
116
|
+
* Log info message
|
|
117
|
+
* @param message - Log message
|
|
118
|
+
* @param metadata - Optional structured metadata
|
|
119
|
+
*/
|
|
120
|
+
info(message: string | Error, metadata?: LogMetadata): void;
|
|
121
|
+
/**
|
|
122
|
+
* Log warning message
|
|
123
|
+
* @param message - Log message
|
|
124
|
+
* @param options - Optional context/metadata options
|
|
125
|
+
*/
|
|
126
|
+
warn(message: string | Error, options: LogOptions): void;
|
|
127
|
+
/**
|
|
128
|
+
* Log warning message
|
|
129
|
+
* @param message - Log message
|
|
130
|
+
* @param context - Optional context override
|
|
131
|
+
* @param metadata - Optional structured metadata
|
|
132
|
+
*/
|
|
133
|
+
warn(message: string | Error, context?: string, metadata?: LogMetadata): void;
|
|
134
|
+
/**
|
|
135
|
+
* Log warning message
|
|
136
|
+
* @param message - Log message
|
|
137
|
+
* @param metadata - Optional structured metadata
|
|
138
|
+
*/
|
|
139
|
+
warn(message: string | Error, metadata?: LogMetadata): void;
|
|
140
|
+
/**
|
|
141
|
+
* Log error message
|
|
142
|
+
* @param message - Log message or Error object
|
|
143
|
+
* @param options - Optional context/trace/metadata options
|
|
144
|
+
*/
|
|
145
|
+
error(message: string | Error, options: LogOptions): void;
|
|
146
|
+
/**
|
|
147
|
+
* Log error message
|
|
148
|
+
* @param message - Log message or Error object
|
|
149
|
+
* @param trace - Optional stack trace
|
|
150
|
+
* @param context - Optional context override
|
|
151
|
+
* @param metadata - Optional structured metadata
|
|
152
|
+
*/
|
|
153
|
+
error(message: string | Error, trace?: string, context?: string, metadata?: LogMetadata): void;
|
|
154
|
+
/**
|
|
155
|
+
* Log error message
|
|
156
|
+
* @param message - Log message or Error object
|
|
157
|
+
* @param context - Optional context override
|
|
158
|
+
* @param metadata - Optional structured metadata
|
|
159
|
+
*/
|
|
160
|
+
error(message: string | Error, context?: string, metadata?: LogMetadata): void;
|
|
161
|
+
/**
|
|
162
|
+
* Log fatal message
|
|
163
|
+
* @param message - Log message or Error object
|
|
164
|
+
* @param options - Optional context/trace/metadata options
|
|
165
|
+
*/
|
|
166
|
+
fatal(message: string | Error, options: LogOptions): void;
|
|
167
|
+
/**
|
|
168
|
+
* Log fatal message
|
|
169
|
+
* @param message - Log message or Error object
|
|
170
|
+
* @param trace - Optional stack trace
|
|
171
|
+
* @param context - Optional context override
|
|
172
|
+
* @param metadata - Optional structured metadata
|
|
173
|
+
*/
|
|
174
|
+
fatal(message: string | Error, trace?: string, context?: string, metadata?: LogMetadata): void;
|
|
175
|
+
/**
|
|
176
|
+
* Log fatal message
|
|
177
|
+
* @param message - Log message or Error object
|
|
178
|
+
* @param context - Optional context override
|
|
179
|
+
* @param metadata - Optional structured metadata
|
|
180
|
+
*/
|
|
181
|
+
fatal(message: string | Error, context?: string, metadata?: LogMetadata): void;
|
|
182
|
+
/**
|
|
183
|
+
* Create a contextual logger instance
|
|
184
|
+
* @param context - Context string
|
|
185
|
+
* @returns New AppLogger instance with context
|
|
186
|
+
*/
|
|
187
|
+
createContextualLogger(context: string): AppLogger;
|
|
188
|
+
}
|
|
189
|
+
//# sourceMappingURL=logger.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.service.d.ts","sourceRoot":"","sources":["../../../src/common/services/logger.service.ts"],"names":[],"mappings":"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"}
|