@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,262 @@
|
|
|
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 MetricsRegistryService_1;
|
|
11
|
+
import { Injectable } from '@nestjs/common';
|
|
12
|
+
import { ModuleRef } from '@nestjs/core';
|
|
13
|
+
import { Registry, collectDefaultMetrics, Histogram, Counter, Gauge } from 'prom-client';
|
|
14
|
+
import { HTTP_DURATION_BUCKETS, HTTP_REQUEST_SIZE_BUCKETS, MILLISECONDS_TO_SECONDS, } from '../constants/histogram-buckets.constants.js';
|
|
15
|
+
import { AppLogger } from './logger.service.js';
|
|
16
|
+
import { getErrorMessage } from '../utils/error.utils.js';
|
|
17
|
+
const HTTP_STATUS_CODE_500 = 500;
|
|
18
|
+
const HTTP_STATUS_CODE_400 = 400;
|
|
19
|
+
/**
|
|
20
|
+
* Metrics Registry Service.
|
|
21
|
+
* Centralized service for managing Prometheus metrics across the application.
|
|
22
|
+
*
|
|
23
|
+
* Features:
|
|
24
|
+
* - HTTP request metrics (duration, count, size)
|
|
25
|
+
* - Custom metric creation (counter, gauge, histogram)
|
|
26
|
+
* - Default Node.js metrics collection
|
|
27
|
+
* - Prometheus registry management
|
|
28
|
+
* - Per-route metric cardinality prevention
|
|
29
|
+
*
|
|
30
|
+
* @remarks
|
|
31
|
+
* - Controlled by METRICS_ENABLED environment variable (default: true)
|
|
32
|
+
* - Automatically collects Node.js default metrics
|
|
33
|
+
* - HTTP request metrics use normalized route paths to prevent unbounded label cardinality
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```typescript
|
|
37
|
+
* // Record HTTP request
|
|
38
|
+
* metricsService.recordHttpRequest('GET', '/users/:id', 200, 45, 2048);
|
|
39
|
+
*
|
|
40
|
+
* // Create custom metric
|
|
41
|
+
* const customCounter = metricsService.createCounter('orders_total', 'Total orders processed');
|
|
42
|
+
* customCounter.inc({ status: 'completed' });
|
|
43
|
+
*
|
|
44
|
+
* // Get metrics in Prometheus format
|
|
45
|
+
* const metrics = await metricsService.getMetrics();
|
|
46
|
+
* ```
|
|
47
|
+
*/
|
|
48
|
+
let MetricsRegistryService = MetricsRegistryService_1 = class MetricsRegistryService {
|
|
49
|
+
_contextualLogger;
|
|
50
|
+
registry;
|
|
51
|
+
enabled;
|
|
52
|
+
// HTTP Request Metrics
|
|
53
|
+
httpRequestDuration = null;
|
|
54
|
+
httpRequestTotal = null;
|
|
55
|
+
httpRequestSize = null;
|
|
56
|
+
Module;
|
|
57
|
+
constructor(module) {
|
|
58
|
+
this.Module = module;
|
|
59
|
+
this.registry = new Registry();
|
|
60
|
+
this.enabled = process.env['METRICS_ENABLED'] !== 'false';
|
|
61
|
+
if (this.enabled) {
|
|
62
|
+
// Collect default Node.js metrics
|
|
63
|
+
collectDefaultMetrics({ register: this.registry });
|
|
64
|
+
// HTTP Request Duration Histogram
|
|
65
|
+
this.httpRequestDuration = new Histogram({
|
|
66
|
+
name: 'http_request_duration_seconds',
|
|
67
|
+
help: 'Duration of HTTP requests in seconds',
|
|
68
|
+
labelNames: ['method', 'route', 'status_code', 'status_class'],
|
|
69
|
+
buckets: HTTP_DURATION_BUCKETS,
|
|
70
|
+
registers: [this.registry],
|
|
71
|
+
});
|
|
72
|
+
// HTTP Request Total Counter
|
|
73
|
+
this.httpRequestTotal = new Counter({
|
|
74
|
+
name: 'http_requests_total',
|
|
75
|
+
help: 'Total number of HTTP requests',
|
|
76
|
+
labelNames: ['method', 'route', 'status_code', 'status_class'],
|
|
77
|
+
registers: [this.registry],
|
|
78
|
+
});
|
|
79
|
+
// HTTP Request Size Histogram
|
|
80
|
+
this.httpRequestSize = new Histogram({
|
|
81
|
+
name: 'http_request_size_bytes',
|
|
82
|
+
help: 'Size of HTTP requests in bytes',
|
|
83
|
+
labelNames: ['method', 'route'],
|
|
84
|
+
buckets: HTTP_REQUEST_SIZE_BUCKETS,
|
|
85
|
+
registers: [this.registry],
|
|
86
|
+
});
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
onModuleInit() {
|
|
90
|
+
if (!this.enabled) {
|
|
91
|
+
this.Logger.info('Prometheus metrics disabled');
|
|
92
|
+
}
|
|
93
|
+
else {
|
|
94
|
+
this.Logger.info('MetricsRegistryService initialized with HTTP metrics');
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Get contextual logger for metrics registry
|
|
99
|
+
* Memoized for performance
|
|
100
|
+
*/
|
|
101
|
+
get Logger() {
|
|
102
|
+
this._contextualLogger ??= this.Module.get(AppLogger).createContextualLogger(MetricsRegistryService_1.name);
|
|
103
|
+
return this._contextualLogger;
|
|
104
|
+
}
|
|
105
|
+
/**
|
|
106
|
+
* Get the Prometheus registry
|
|
107
|
+
*/
|
|
108
|
+
getRegistry() {
|
|
109
|
+
return this.registry;
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Record HTTP request metrics
|
|
113
|
+
*/
|
|
114
|
+
recordHttpRequest(method, route, statusCode, duration, size) {
|
|
115
|
+
if (!this.enabled || !this.httpRequestDuration || !this.httpRequestTotal)
|
|
116
|
+
return;
|
|
117
|
+
const statusClass = statusCode >= HTTP_STATUS_CODE_500 ? '5xx' : statusCode >= HTTP_STATUS_CODE_400 ? '4xx' : '2xx';
|
|
118
|
+
const labels = { method, route, status_code: statusCode.toString(), status_class: statusClass };
|
|
119
|
+
this.httpRequestDuration.observe(labels, duration / MILLISECONDS_TO_SECONDS); // Convert to seconds
|
|
120
|
+
this.httpRequestTotal.inc(labels);
|
|
121
|
+
if (size !== undefined && this.httpRequestSize) {
|
|
122
|
+
this.httpRequestSize.observe({ method, route }, size);
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
/**
|
|
126
|
+
* Record a counter metric
|
|
127
|
+
*/
|
|
128
|
+
recordCounter(name, value = 1, labels = {}) {
|
|
129
|
+
if (!this.enabled)
|
|
130
|
+
return;
|
|
131
|
+
try {
|
|
132
|
+
const counter = this.registry.getSingleMetric(name);
|
|
133
|
+
if (counter) {
|
|
134
|
+
counter.inc(labels, value);
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
this.Logger.warn(`Counter metric '${name}' not found in registry`);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
const errorMsg = getErrorMessage(error);
|
|
142
|
+
this.Logger.error(`Failed to record counter '${name}': ${errorMsg}`);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
/**
|
|
146
|
+
* Record a gauge metric
|
|
147
|
+
*/
|
|
148
|
+
recordGauge(name, value, labels = {}) {
|
|
149
|
+
if (!this.enabled)
|
|
150
|
+
return;
|
|
151
|
+
try {
|
|
152
|
+
const gauge = this.registry.getSingleMetric(name);
|
|
153
|
+
if (gauge) {
|
|
154
|
+
gauge.set(labels, value);
|
|
155
|
+
}
|
|
156
|
+
else {
|
|
157
|
+
this.Logger.warn(`Gauge metric '${name}' not found in registry`);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
catch (error) {
|
|
161
|
+
this.Logger.error(`Failed to record gauge '${name}': ${getErrorMessage(error)}`);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Record a histogram observation
|
|
166
|
+
*/
|
|
167
|
+
recordHistogram(name, value, labels = {}) {
|
|
168
|
+
if (!this.enabled)
|
|
169
|
+
return;
|
|
170
|
+
try {
|
|
171
|
+
const histogram = this.registry.getSingleMetric(name);
|
|
172
|
+
if (histogram) {
|
|
173
|
+
histogram.observe(labels, value);
|
|
174
|
+
}
|
|
175
|
+
else {
|
|
176
|
+
this.Logger.warn(`Histogram metric '${name}' not found in registry`);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
catch (error) {
|
|
180
|
+
this.Logger.error(`Failed to record histogram '${name}': ${getErrorMessage(error)}`);
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
/**
|
|
184
|
+
* Create and register a new counter metric
|
|
185
|
+
*/
|
|
186
|
+
createCounter(name, help, labelNames = []) {
|
|
187
|
+
const counter = new Counter({
|
|
188
|
+
name,
|
|
189
|
+
help,
|
|
190
|
+
labelNames,
|
|
191
|
+
registers: [this.registry],
|
|
192
|
+
});
|
|
193
|
+
this.Logger.info(`Created counter metric: ${name}`);
|
|
194
|
+
return counter;
|
|
195
|
+
}
|
|
196
|
+
/**
|
|
197
|
+
* Create and register a new gauge metric
|
|
198
|
+
*/
|
|
199
|
+
createGauge(name, help, labelNames = []) {
|
|
200
|
+
const gauge = new Gauge({
|
|
201
|
+
name,
|
|
202
|
+
help,
|
|
203
|
+
labelNames,
|
|
204
|
+
registers: [this.registry],
|
|
205
|
+
});
|
|
206
|
+
this.Logger.info(`Created gauge metric: ${name}`);
|
|
207
|
+
return gauge;
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Create and register a new histogram metric
|
|
211
|
+
*/
|
|
212
|
+
createHistogram(name, help, labelNames = [], buckets) {
|
|
213
|
+
const config = {
|
|
214
|
+
name,
|
|
215
|
+
help,
|
|
216
|
+
labelNames,
|
|
217
|
+
registers: [this.registry],
|
|
218
|
+
};
|
|
219
|
+
if (buckets !== undefined) {
|
|
220
|
+
config.buckets = buckets;
|
|
221
|
+
}
|
|
222
|
+
const histogram = new Histogram(config);
|
|
223
|
+
this.Logger.info(`Created histogram metric: ${name}`);
|
|
224
|
+
return histogram;
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Register a custom metric
|
|
228
|
+
*/
|
|
229
|
+
registerMetric(metric) {
|
|
230
|
+
if (metric && typeof metric === 'object' && 'register' in metric && typeof metric.register === 'function') {
|
|
231
|
+
metric.register(this.registry);
|
|
232
|
+
}
|
|
233
|
+
return metric;
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* Get metrics in Prometheus format
|
|
237
|
+
*/
|
|
238
|
+
// eslint-disable-next-line require-await
|
|
239
|
+
async getMetrics() {
|
|
240
|
+
return this.registry.metrics();
|
|
241
|
+
}
|
|
242
|
+
/**
|
|
243
|
+
* Get registry metrics as JSON for debugging
|
|
244
|
+
*/
|
|
245
|
+
// eslint-disable-next-line require-await
|
|
246
|
+
async getMetricsAsJSON() {
|
|
247
|
+
return this.registry.getMetricsAsJSON();
|
|
248
|
+
}
|
|
249
|
+
/**
|
|
250
|
+
* Clear all metrics (useful for testing)
|
|
251
|
+
*/
|
|
252
|
+
clear() {
|
|
253
|
+
this.registry.clear();
|
|
254
|
+
this.Logger.warn('All metrics cleared');
|
|
255
|
+
}
|
|
256
|
+
};
|
|
257
|
+
MetricsRegistryService = MetricsRegistryService_1 = __decorate([
|
|
258
|
+
Injectable(),
|
|
259
|
+
__metadata("design:paramtypes", [ModuleRef])
|
|
260
|
+
], MetricsRegistryService);
|
|
261
|
+
export { MetricsRegistryService };
|
|
262
|
+
//# sourceMappingURL=metrics-registry.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics-registry.service.js","sourceRoot":"","sources":["../../../src/common/services/metrics-registry.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { LoggerService } from '@nestjs/common';
|
|
2
|
+
import { AppLogger } from './logger.service.js';
|
|
3
|
+
/**
|
|
4
|
+
* Adapts {@link AppLogger} to the NestJS {@link LoggerService} interface.
|
|
5
|
+
*
|
|
6
|
+
* Pass an instance to `NestFactory.create()` via the `logger` option to route
|
|
7
|
+
* all framework bootstrap and lifecycle logs through `AppLogger`, eliminating
|
|
8
|
+
* the default `[Nest]` format and producing a single, consistent log format.
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* ```ts
|
|
12
|
+
* const app = await NestFactory.create(AppModule, {
|
|
13
|
+
* logger: new NestLoggerAdapter(),
|
|
14
|
+
* });
|
|
15
|
+
* ```
|
|
16
|
+
*/
|
|
17
|
+
export declare class NestLoggerAdapter implements LoggerService {
|
|
18
|
+
private readonly logger;
|
|
19
|
+
/**
|
|
20
|
+
* @param logger - Optional existing `AppLogger` instance to delegate to.
|
|
21
|
+
* When omitted, a new `AppLogger` is created using environment variables
|
|
22
|
+
* (`SERVICE_NAME`, `LOG_LEVEL`, `LOG_FORMAT`).
|
|
23
|
+
*/
|
|
24
|
+
constructor(logger?: AppLogger);
|
|
25
|
+
/** Maps NestJS `log()` (INFO level) to {@link AppLogger.info}. */
|
|
26
|
+
log(message: any, ...optionalParams: any[]): void;
|
|
27
|
+
/**
|
|
28
|
+
* Maps NestJS `error()` to {@link AppLogger.error}.
|
|
29
|
+
*
|
|
30
|
+
* NestJS calls this as `error(message, stack?, context?)`.
|
|
31
|
+
* When a stack trace is present it is forwarded as `metadata.stack`.
|
|
32
|
+
*/
|
|
33
|
+
error(message: any, ...optionalParams: any[]): void;
|
|
34
|
+
/** Maps NestJS `warn()` to {@link AppLogger.warn}. */
|
|
35
|
+
warn(message: any, ...optionalParams: any[]): void;
|
|
36
|
+
/** Maps NestJS `debug()` to {@link AppLogger.debug}. */
|
|
37
|
+
debug(message: any, ...optionalParams: any[]): void;
|
|
38
|
+
/**
|
|
39
|
+
* Maps NestJS `verbose()` to {@link AppLogger.debug}.
|
|
40
|
+
* `AppLogger` has no `verbose` level; `debug` is the nearest equivalent.
|
|
41
|
+
*/
|
|
42
|
+
verbose(message: any, ...optionalParams: any[]): void;
|
|
43
|
+
/** Maps NestJS `fatal()` to {@link AppLogger.fatal}. */
|
|
44
|
+
fatal(message: any, ...optionalParams: any[]): void;
|
|
45
|
+
/**
|
|
46
|
+
* Extracts the NestJS context string (e.g. `"NestFactory"`, `"RouterExplorer"`)
|
|
47
|
+
* from variadic params. NestJS passes context as the last string argument.
|
|
48
|
+
*/
|
|
49
|
+
private extractContext;
|
|
50
|
+
/**
|
|
51
|
+
* Extracts `stack` and `context` from variadic error params.
|
|
52
|
+
*
|
|
53
|
+
* NestJS error signature: `error(message, stack?, context?)` where `stack`
|
|
54
|
+
* is a multiline string (contains `\n`) or begins with `"Error:"`.
|
|
55
|
+
*/
|
|
56
|
+
private extractErrorParams;
|
|
57
|
+
/** Returns `true` if the string looks like a stack trace. */
|
|
58
|
+
private looksLikeStack;
|
|
59
|
+
/** Coerces any log message type to a string. */
|
|
60
|
+
private formatMessage;
|
|
61
|
+
}
|
|
62
|
+
//# sourceMappingURL=nest-logger-adapter.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nest-logger-adapter.service.d.ts","sourceRoot":"","sources":["../../../src/common/services/nest-logger-adapter.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD;;;;;;;;;;;;;GAaG;AACH,qBAAa,iBAAkB,YAAW,aAAa;IACtD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAY;IAEnC;;;;OAIG;gBACS,MAAM,CAAC,EAAE,SAAS;IAI9B,kEAAkE;IAC3D,GAAG,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,EAAE,GAAG,IAAI;IAKxD;;;;;OAKG;IACI,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,EAAE,GAAG,IAAI;IAU1D,sDAAsD;IAC/C,IAAI,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,EAAE,GAAG,IAAI;IAKzD,wDAAwD;IACjD,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,EAAE,GAAG,IAAI;IAK1D;;;OAGG;IACI,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,EAAE,GAAG,IAAI;IAK5D,wDAAwD;IACjD,KAAK,CAAC,OAAO,EAAE,GAAG,EAAE,GAAG,cAAc,EAAE,GAAG,EAAE,GAAG,IAAI;IAK1D;;;OAGG;IACH,OAAO,CAAC,cAAc;IAMtB;;;;;OAKG;IACH,OAAO,CAAC,kBAAkB;IAuB1B,6DAA6D;IAC7D,OAAO,CAAC,cAAc;IAItB,gDAAgD;IAChD,OAAO,CAAC,aAAa;CAKrB"}
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import { AppLogger } from './logger.service.js';
|
|
2
|
+
/**
|
|
3
|
+
* Adapts {@link AppLogger} to the NestJS {@link LoggerService} interface.
|
|
4
|
+
*
|
|
5
|
+
* Pass an instance to `NestFactory.create()` via the `logger` option to route
|
|
6
|
+
* all framework bootstrap and lifecycle logs through `AppLogger`, eliminating
|
|
7
|
+
* the default `[Nest]` format and producing a single, consistent log format.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```ts
|
|
11
|
+
* const app = await NestFactory.create(AppModule, {
|
|
12
|
+
* logger: new NestLoggerAdapter(),
|
|
13
|
+
* });
|
|
14
|
+
* ```
|
|
15
|
+
*/
|
|
16
|
+
export class NestLoggerAdapter {
|
|
17
|
+
logger;
|
|
18
|
+
/**
|
|
19
|
+
* @param logger - Optional existing `AppLogger` instance to delegate to.
|
|
20
|
+
* When omitted, a new `AppLogger` is created using environment variables
|
|
21
|
+
* (`SERVICE_NAME`, `LOG_LEVEL`, `LOG_FORMAT`).
|
|
22
|
+
*/
|
|
23
|
+
constructor(logger) {
|
|
24
|
+
this.logger = logger ?? new AppLogger();
|
|
25
|
+
}
|
|
26
|
+
/** Maps NestJS `log()` (INFO level) to {@link AppLogger.info}. */
|
|
27
|
+
log(message, ...optionalParams) {
|
|
28
|
+
const context = this.extractContext(optionalParams);
|
|
29
|
+
this.logger.info(this.formatMessage(message), context);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Maps NestJS `error()` to {@link AppLogger.error}.
|
|
33
|
+
*
|
|
34
|
+
* NestJS calls this as `error(message, stack?, context?)`.
|
|
35
|
+
* When a stack trace is present it is forwarded as `metadata.stack`.
|
|
36
|
+
*/
|
|
37
|
+
error(message, ...optionalParams) {
|
|
38
|
+
const { context, stack } = this.extractErrorParams(optionalParams);
|
|
39
|
+
const msg = this.formatMessage(message);
|
|
40
|
+
if (stack !== undefined) {
|
|
41
|
+
this.logger.error(msg, context, { stack });
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
this.logger.error(msg, context);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/** Maps NestJS `warn()` to {@link AppLogger.warn}. */
|
|
48
|
+
warn(message, ...optionalParams) {
|
|
49
|
+
const context = this.extractContext(optionalParams);
|
|
50
|
+
this.logger.warn(this.formatMessage(message), context);
|
|
51
|
+
}
|
|
52
|
+
/** Maps NestJS `debug()` to {@link AppLogger.debug}. */
|
|
53
|
+
debug(message, ...optionalParams) {
|
|
54
|
+
const context = this.extractContext(optionalParams);
|
|
55
|
+
this.logger.debug(this.formatMessage(message), context);
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Maps NestJS `verbose()` to {@link AppLogger.debug}.
|
|
59
|
+
* `AppLogger` has no `verbose` level; `debug` is the nearest equivalent.
|
|
60
|
+
*/
|
|
61
|
+
verbose(message, ...optionalParams) {
|
|
62
|
+
const context = this.extractContext(optionalParams);
|
|
63
|
+
this.logger.debug(this.formatMessage(message), context);
|
|
64
|
+
}
|
|
65
|
+
/** Maps NestJS `fatal()` to {@link AppLogger.fatal}. */
|
|
66
|
+
fatal(message, ...optionalParams) {
|
|
67
|
+
const context = this.extractContext(optionalParams);
|
|
68
|
+
this.logger.fatal(this.formatMessage(message), context);
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Extracts the NestJS context string (e.g. `"NestFactory"`, `"RouterExplorer"`)
|
|
72
|
+
* from variadic params. NestJS passes context as the last string argument.
|
|
73
|
+
*/
|
|
74
|
+
extractContext(params) {
|
|
75
|
+
if (params.length === 0)
|
|
76
|
+
return undefined;
|
|
77
|
+
const last = params[params.length - 1];
|
|
78
|
+
return typeof last === 'string' ? last : undefined;
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Extracts `stack` and `context` from variadic error params.
|
|
82
|
+
*
|
|
83
|
+
* NestJS error signature: `error(message, stack?, context?)` where `stack`
|
|
84
|
+
* is a multiline string (contains `\n`) or begins with `"Error:"`.
|
|
85
|
+
*/
|
|
86
|
+
extractErrorParams(params) {
|
|
87
|
+
if (params.length === 0)
|
|
88
|
+
return {};
|
|
89
|
+
if (params.length === 1) {
|
|
90
|
+
const [param] = params;
|
|
91
|
+
if (typeof param !== 'string')
|
|
92
|
+
return {};
|
|
93
|
+
return this.looksLikeStack(param) ? { stack: param } : { context: param };
|
|
94
|
+
}
|
|
95
|
+
const [first, ...rest] = params;
|
|
96
|
+
if (typeof first === 'string' && this.looksLikeStack(first)) {
|
|
97
|
+
const contextParam = rest[rest.length - 1];
|
|
98
|
+
return {
|
|
99
|
+
stack: first,
|
|
100
|
+
context: typeof contextParam === 'string' ? contextParam : undefined,
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
// No stack — treat last string param as context
|
|
104
|
+
const last = params[params.length - 1];
|
|
105
|
+
return { context: typeof last === 'string' ? last : undefined };
|
|
106
|
+
}
|
|
107
|
+
/** Returns `true` if the string looks like a stack trace. */
|
|
108
|
+
looksLikeStack(value) {
|
|
109
|
+
return value.includes('\n') || value.startsWith('Error:');
|
|
110
|
+
}
|
|
111
|
+
/** Coerces any log message type to a string. */
|
|
112
|
+
formatMessage(message) {
|
|
113
|
+
if (message instanceof Error)
|
|
114
|
+
return message.message;
|
|
115
|
+
if (typeof message === 'string')
|
|
116
|
+
return message;
|
|
117
|
+
return String(message);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
//# sourceMappingURL=nest-logger-adapter.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"nest-logger-adapter.service.js","sourceRoot":"","sources":["../../../src/common/services/nest-logger-adapter.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extracts a string representation of an error suitable for use as a log
|
|
3
|
+
* stack-trace argument. Returns the stack trace when available, falls back to
|
|
4
|
+
* the error message, and stringifies any non-Error thrown value.
|
|
5
|
+
*
|
|
6
|
+
* @param error Any caught value (ideally an Error, but can be anything)
|
|
7
|
+
*/
|
|
8
|
+
export declare function getErrorStack(error: unknown): string;
|
|
9
|
+
/**
|
|
10
|
+
* Extracts the human-readable message from a caught value.
|
|
11
|
+
* Returns `error.message` for Error instances and stringifies anything else.
|
|
12
|
+
*
|
|
13
|
+
* @param error Any caught value (ideally an Error, but can be anything)
|
|
14
|
+
*/
|
|
15
|
+
export declare function getErrorMessage(error: unknown): string;
|
|
16
|
+
//# sourceMappingURL=error.utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error.utils.d.ts","sourceRoot":"","sources":["../../../src/common/utils/error.utils.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAKpD;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,KAAK,EAAE,OAAO,GAAG,MAAM,CAKtD"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Extracts a string representation of an error suitable for use as a log
|
|
3
|
+
* stack-trace argument. Returns the stack trace when available, falls back to
|
|
4
|
+
* the error message, and stringifies any non-Error thrown value.
|
|
5
|
+
*
|
|
6
|
+
* @param error Any caught value (ideally an Error, but can be anything)
|
|
7
|
+
*/
|
|
8
|
+
export function getErrorStack(error) {
|
|
9
|
+
if (error instanceof Error) {
|
|
10
|
+
return error.stack ?? error.message;
|
|
11
|
+
}
|
|
12
|
+
return String(error);
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Extracts the human-readable message from a caught value.
|
|
16
|
+
* Returns `error.message` for Error instances and stringifies anything else.
|
|
17
|
+
*
|
|
18
|
+
* @param error Any caught value (ideally an Error, but can be anything)
|
|
19
|
+
*/
|
|
20
|
+
export function getErrorMessage(error) {
|
|
21
|
+
if (error instanceof Error) {
|
|
22
|
+
return error.message;
|
|
23
|
+
}
|
|
24
|
+
return String(error);
|
|
25
|
+
}
|
|
26
|
+
//# sourceMappingURL=error.utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"error.utils.js","sourceRoot":"","sources":["../../../src/common/utils/error.utils.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,UAAU,aAAa,CAAC,KAAc;IAC3C,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC5B,OAAO,KAAK,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC;IACrC,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACtB,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,KAAc;IAC7C,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC5B,OAAO,KAAK,CAAC,OAAO,CAAC;IACtB,CAAC;IACD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;AACtB,CAAC"}
|