@futdevpro/nts-dynamo 1.15.155 → 1.15.157
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 +10 -10
- package/__documentations/2026-08-22-bfr-ctm-018-content-free-endpoint-errors.md +54 -0
- package/__documentations/2026-08-22-bfr-ctm-020-content-free-request-telemetry.md +65 -0
- package/__documentations/2026-08-22-content-free-process-error-boundary.md +21 -1
- package/build/_models/control-models/endpoint-params.control-model.d.ts +6 -0
- package/build/_models/control-models/endpoint-params.control-model.d.ts.map +1 -1
- package/build/_models/control-models/endpoint-params.control-model.js +71 -146
- package/build/_models/control-models/endpoint-params.control-model.js.map +1 -1
- package/build/_models/interfaces/request-telemetry-settings.interface.d.ts +10 -0
- package/build/_models/interfaces/request-telemetry-settings.interface.d.ts.map +1 -0
- package/build/_models/interfaces/request-telemetry-settings.interface.js +3 -0
- package/build/_models/interfaces/request-telemetry-settings.interface.js.map +1 -0
- package/build/_models/interfaces/request-telemetry-snapshot.interface.d.ts +29 -0
- package/build/_models/interfaces/request-telemetry-snapshot.interface.d.ts.map +1 -0
- package/build/_models/interfaces/request-telemetry-snapshot.interface.js +3 -0
- package/build/_models/interfaces/request-telemetry-snapshot.interface.js.map +1 -0
- package/build/_modules/server/safe-diagnostic/safe-diagnostic-stage.type-enum.d.ts +1 -0
- package/build/_modules/server/safe-diagnostic/safe-diagnostic-stage.type-enum.d.ts.map +1 -1
- package/build/_modules/server/safe-diagnostic/safe-diagnostic-stage.type-enum.js +1 -0
- package/build/_modules/server/safe-diagnostic/safe-diagnostic-stage.type-enum.js.map +1 -1
- package/build/_services/core/request-telemetry.control-service.d.ts +51 -0
- package/build/_services/core/request-telemetry.control-service.d.ts.map +1 -0
- package/build/_services/core/request-telemetry.control-service.js +286 -0
- package/build/_services/core/request-telemetry.control-service.js.map +1 -0
- package/build/_services/route/routing-module.service.d.ts.map +1 -1
- package/build/_services/route/routing-module.service.js +13 -10
- package/build/_services/route/routing-module.service.js.map +1 -1
- package/build/_services/server/app.server.d.ts +5 -0
- package/build/_services/server/app.server.d.ts.map +1 -1
- package/build/_services/server/app.server.js +13 -0
- package/build/_services/server/app.server.js.map +1 -1
- package/build/index.d.ts +3 -0
- package/build/index.d.ts.map +1 -1
- package/build/index.js +3 -0
- package/build/index.js.map +1 -1
- package/package.json +1 -1
- package/src/_models/control-models/endpoint-params.control-model.spec.ts +87 -2
- package/src/_models/control-models/endpoint-params.control-model.ts +93 -182
- package/src/_models/interfaces/request-telemetry-settings.interface.ts +9 -0
- package/src/_models/interfaces/request-telemetry-snapshot.interface.ts +30 -0
- package/src/_modules/server/safe-diagnostic/safe-diagnostic-stage.type-enum.ts +1 -0
- package/src/_services/core/request-telemetry.control-service.spec.ts +217 -0
- package/src/_services/core/request-telemetry.control-service.ts +381 -0
- package/src/_services/route/routing-module.service.ts +27 -18
- package/src/_services/server/app.server.ts +29 -9
- package/src/_services/shared.static-service.spec.ts +57 -57
- package/src/_services/shared.static-service.ts +48 -48
- package/src/index.ts +5 -2
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/** One bounded duration bucket in the content-free request telemetry snapshot. */
|
|
2
|
+
export interface DyNTS_RequestDurationBucket_Interface {
|
|
3
|
+
upperBoundMs: number | null;
|
|
4
|
+
count: number;
|
|
5
|
+
}
|
|
6
|
+
/** One declared route-template aggregate. No concrete URL or request value is retained. */
|
|
7
|
+
export interface DyNTS_RequestRouteMetric_Interface {
|
|
8
|
+
method: string;
|
|
9
|
+
routeTemplate: string;
|
|
10
|
+
count: number;
|
|
11
|
+
abortedCount: number;
|
|
12
|
+
serverErrorCount: number;
|
|
13
|
+
totalDurationMs: number;
|
|
14
|
+
maxDurationMs: number;
|
|
15
|
+
}
|
|
16
|
+
/** Synchronous, immutable-by-copy snapshot of the event-driven request counters. */
|
|
17
|
+
export interface DyNTS_RequestTelemetrySnapshot_Interface {
|
|
18
|
+
contractVersion: 'dynts-request-telemetry/1';
|
|
19
|
+
correlationHeader: 'X-Correlation-Id';
|
|
20
|
+
requestsStarted: number;
|
|
21
|
+
requestsCompleted: number;
|
|
22
|
+
requestsAborted: number;
|
|
23
|
+
inFlight: number;
|
|
24
|
+
droppedRouteTemplates: number;
|
|
25
|
+
statusClasses: Record<string, number>;
|
|
26
|
+
durationBuckets: DyNTS_RequestDurationBucket_Interface[];
|
|
27
|
+
routes: DyNTS_RequestRouteMetric_Interface[];
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=request-telemetry-snapshot.interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-telemetry-snapshot.interface.d.ts","sourceRoot":"","sources":["../../../src/_models/interfaces/request-telemetry-snapshot.interface.ts"],"names":[],"mappings":"AAAA,kFAAkF;AAClF,MAAM,WAAW,qCAAqC;IACpD,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,EAAE,MAAM,CAAC;CACf;AAED,2FAA2F;AAC3F,MAAM,WAAW,kCAAkC;IACjD,MAAM,EAAE,MAAM,CAAC;IACf,aAAa,EAAE,MAAM,CAAC;IACtB,KAAK,EAAE,MAAM,CAAC;IACd,YAAY,EAAE,MAAM,CAAC;IACrB,gBAAgB,EAAE,MAAM,CAAC;IACzB,eAAe,EAAE,MAAM,CAAC;IACxB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,oFAAoF;AACpF,MAAM,WAAW,wCAAwC;IACvD,eAAe,EAAE,2BAA2B,CAAC;IAC7C,iBAAiB,EAAE,kBAAkB,CAAC;IACtC,eAAe,EAAE,MAAM,CAAC;IACxB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,eAAe,EAAE,MAAM,CAAC;IACxB,QAAQ,EAAE,MAAM,CAAC;IACjB,qBAAqB,EAAE,MAAM,CAAC;IAC9B,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACtC,eAAe,EAAE,qCAAqC,EAAE,CAAC;IACzD,MAAM,EAAE,kCAAkC,EAAE,CAAC;CAC9C"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-telemetry-snapshot.interface.js","sourceRoot":"","sources":["../../../src/_models/interfaces/request-telemetry-snapshot.interface.ts"],"names":[],"mappings":""}
|
|
@@ -5,6 +5,7 @@ export declare enum DyNTS_SafeDiagnosticStage_Type {
|
|
|
5
5
|
databaseConnect = "database-connect",
|
|
6
6
|
databaseRuntime = "database-runtime",
|
|
7
7
|
eventLoopDiagnostic = "event-loop-diagnostic",
|
|
8
|
+
endpoint = "endpoint",
|
|
8
9
|
expressFallback = "express-fallback",
|
|
9
10
|
globalErrorHandler = "global-error-handler",
|
|
10
11
|
httpServer = "http-server",
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"safe-diagnostic-stage.type-enum.d.ts","sourceRoot":"","sources":["../../../../src/_modules/server/safe-diagnostic/safe-diagnostic-stage.type-enum.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,oBAAY,8BAA8B;IACxC,SAAS,cAAc;IACvB,uBAAuB,8BAA8B;IACrD,eAAe,qBAAqB;IACpC,eAAe,qBAAqB;IACpC,mBAAmB,0BAA0B;IAC7C,eAAe,qBAAqB;IACpC,kBAAkB,yBAAyB;IAC3C,UAAU,gBAAgB;IAC1B,WAAW,iBAAiB;IAC5B,WAAW,iBAAiB;IAC5B,mBAAmB,0BAA0B;IAC7C,WAAW,iBAAiB;IAC5B,SAAS,cAAc;IACvB,SAAS,cAAc;IACvB,OAAO,YAAY;IACnB,kBAAkB,wBAAwB;CAC3C"}
|
|
1
|
+
{"version":3,"file":"safe-diagnostic-stage.type-enum.d.ts","sourceRoot":"","sources":["../../../../src/_modules/server/safe-diagnostic/safe-diagnostic-stage.type-enum.ts"],"names":[],"mappings":"AAAA,gEAAgE;AAChE,oBAAY,8BAA8B;IACxC,SAAS,cAAc;IACvB,uBAAuB,8BAA8B;IACrD,eAAe,qBAAqB;IACpC,eAAe,qBAAqB;IACpC,mBAAmB,0BAA0B;IAC7C,QAAQ,aAAa;IACrB,eAAe,qBAAqB;IACpC,kBAAkB,yBAAyB;IAC3C,UAAU,gBAAgB;IAC1B,WAAW,iBAAiB;IAC5B,WAAW,iBAAiB;IAC5B,mBAAmB,0BAA0B;IAC7C,WAAW,iBAAiB;IAC5B,SAAS,cAAc;IACvB,SAAS,cAAc;IACvB,OAAO,YAAY;IACnB,kBAAkB,wBAAwB;CAC3C"}
|
|
@@ -9,6 +9,7 @@ var DyNTS_SafeDiagnosticStage_Type;
|
|
|
9
9
|
DyNTS_SafeDiagnosticStage_Type["databaseConnect"] = "database-connect";
|
|
10
10
|
DyNTS_SafeDiagnosticStage_Type["databaseRuntime"] = "database-runtime";
|
|
11
11
|
DyNTS_SafeDiagnosticStage_Type["eventLoopDiagnostic"] = "event-loop-diagnostic";
|
|
12
|
+
DyNTS_SafeDiagnosticStage_Type["endpoint"] = "endpoint";
|
|
12
13
|
DyNTS_SafeDiagnosticStage_Type["expressFallback"] = "express-fallback";
|
|
13
14
|
DyNTS_SafeDiagnosticStage_Type["globalErrorHandler"] = "global-error-handler";
|
|
14
15
|
DyNTS_SafeDiagnosticStage_Type["httpServer"] = "http-server";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"safe-diagnostic-stage.type-enum.js","sourceRoot":"","sources":["../../../../src/_modules/server/safe-diagnostic/safe-diagnostic-stage.type-enum.ts"],"names":[],"mappings":";;;AAAA,gEAAgE;AAChE,IAAY,
|
|
1
|
+
{"version":3,"file":"safe-diagnostic-stage.type-enum.js","sourceRoot":"","sources":["../../../../src/_modules/server/safe-diagnostic/safe-diagnostic-stage.type-enum.ts"],"names":[],"mappings":";;;AAAA,gEAAgE;AAChE,IAAY,8BAkBX;AAlBD,WAAY,8BAA8B;IACxC,yDAAuB,CAAA;IACvB,uFAAqD,CAAA;IACrD,sEAAoC,CAAA;IACpC,sEAAoC,CAAA;IACpC,+EAA6C,CAAA;IAC7C,uDAAqB,CAAA;IACrB,sEAAoC,CAAA;IACpC,6EAA2C,CAAA;IAC3C,4DAA0B,CAAA;IAC1B,8DAA4B,CAAA;IAC5B,8DAA4B,CAAA;IAC5B,+EAA6C,CAAA;IAC7C,8DAA4B,CAAA;IAC5B,yDAAuB,CAAA;IACvB,yDAAuB,CAAA;IACvB,qDAAmB,CAAA;IACnB,4EAA0C,CAAA;AAC5C,CAAC,EAlBW,8BAA8B,8CAA9B,8BAA8B,QAkBzC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { Request, RequestHandler } from 'express';
|
|
2
|
+
import { DyNTS_RequestTelemetry_Settings } from '../../_models/interfaces/request-telemetry-settings.interface';
|
|
3
|
+
import { DyNTS_RequestTelemetrySnapshot_Interface } from '../../_models/interfaces/request-telemetry-snapshot.interface';
|
|
4
|
+
/**
|
|
5
|
+
* Event-driven, content-free request correlation and aggregate metrics.
|
|
6
|
+
*
|
|
7
|
+
* The service never reads or stores URL, query, headers, body, IP, user agent, account identity or error content.
|
|
8
|
+
* Route labels can only come from the framework's declared route templates. Caller-provided correlation values are
|
|
9
|
+
* ignored and replaced with a server-generated UUID.
|
|
10
|
+
*/
|
|
11
|
+
export declare class DyNTS_RequestTelemetry_ControlService {
|
|
12
|
+
private static instance;
|
|
13
|
+
/** Returns the process-wide request telemetry accumulator used by open and secure Express applications. */
|
|
14
|
+
static getInstance(): DyNTS_RequestTelemetry_ControlService;
|
|
15
|
+
private settings;
|
|
16
|
+
private configurationFingerprint;
|
|
17
|
+
private requestStates;
|
|
18
|
+
private readonly routeMetrics;
|
|
19
|
+
private readonly retainedRouteTemplates;
|
|
20
|
+
private durationCounts;
|
|
21
|
+
private overflowDurationCount;
|
|
22
|
+
private readonly statusClassCounts;
|
|
23
|
+
private requestsStarted;
|
|
24
|
+
private requestsCompleted;
|
|
25
|
+
private requestsAborted;
|
|
26
|
+
private inFlight;
|
|
27
|
+
private droppedRouteTemplates;
|
|
28
|
+
private constructor();
|
|
29
|
+
/** Installs one immutable configuration; repeated identical calls are idempotent. */
|
|
30
|
+
configure(settings: DyNTS_RequestTelemetry_Settings): void;
|
|
31
|
+
/** Returns the early Express middleware that creates correlation and completion listeners. */
|
|
32
|
+
createMiddleware(): RequestHandler;
|
|
33
|
+
/** Returns a route-local middleware that labels only a framework-declared route template. */
|
|
34
|
+
identifyRoute(routeTemplate: string): RequestHandler;
|
|
35
|
+
/** Returns the generated correlation ID for internal error/audit joins without reading request headers. */
|
|
36
|
+
getCorrelationId(req: Request): string | undefined;
|
|
37
|
+
/** Returns a stable copy of all bounded aggregate counters. */
|
|
38
|
+
snapshot(): DyNTS_RequestTelemetrySnapshot_Interface;
|
|
39
|
+
/** Test-only reset for the process-wide singleton. */
|
|
40
|
+
_resetForTesting(): void;
|
|
41
|
+
private beginRequest;
|
|
42
|
+
private completeRequest;
|
|
43
|
+
private recordDuration;
|
|
44
|
+
private recordStatusClass;
|
|
45
|
+
private recordRouteMetric;
|
|
46
|
+
private normalizeRouteTemplate;
|
|
47
|
+
private resolveSettings;
|
|
48
|
+
private safeIncrement;
|
|
49
|
+
private safeAdd;
|
|
50
|
+
}
|
|
51
|
+
//# sourceMappingURL=request-telemetry.control-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-telemetry.control-service.d.ts","sourceRoot":"","sources":["../../../src/_services/core/request-telemetry.control-service.ts"],"names":[],"mappings":"AACA,OAAO,EAAgB,OAAO,EAAE,cAAc,EAAY,MAAM,SAAS,CAAC;AAG1E,OAAO,EACL,+BAA+B,EAChC,MAAM,+DAA+D,CAAC;AACvE,OAAO,EAGL,wCAAwC,EACzC,MAAM,+DAA+D,CAAC;AAiCvE;;;;;;GAMG;AACH,qBAAa,qCAAqC;IAChD,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAwC;IAE/D,2GAA2G;WAC7F,WAAW,IAAI,qCAAqC;IAQlE,OAAO,CAAC,QAAQ,CAA8E;IAC9F,OAAO,CAAC,wBAAwB,CAAuB;IACvD,OAAO,CAAC,aAAa,CAA0E;IAC/F,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAmE;IAChG,OAAO,CAAC,QAAQ,CAAC,sBAAsB,CAA0B;IACjE,OAAO,CAAC,cAAc,CAA4E;IAClG,OAAO,CAAC,qBAAqB,CAAa;IAC1C,OAAO,CAAC,QAAQ,CAAC,iBAAiB,CAOhC;IACF,OAAO,CAAC,eAAe,CAAa;IACpC,OAAO,CAAC,iBAAiB,CAAa;IACtC,OAAO,CAAC,eAAe,CAAa;IACpC,OAAO,CAAC,QAAQ,CAAa;IAC7B,OAAO,CAAC,qBAAqB,CAAa;IAE1C,OAAO;IAEP,qFAAqF;IAC9E,SAAS,CAAC,QAAQ,EAAE,+BAA+B,GAAG,IAAI;IAiBjE,8FAA8F;IACvF,gBAAgB,IAAI,cAAc;IAkBzC,6FAA6F;IACtF,aAAa,CAAC,aAAa,EAAE,MAAM,GAAG,cAAc;IAc3D,2GAA2G;IACpG,gBAAgB,CAAC,GAAG,EAAE,OAAO,GAAG,MAAM,GAAG,SAAS;IAIzD,+DAA+D;IACxD,QAAQ,IAAI,wCAAwC;IA8B3D,sDAAsD;IAC/C,gBAAgB,IAAI,IAAI;IAkB/B,OAAO,CAAC,YAAY;IAsDpB,OAAO,CAAC,eAAe;IA6BvB,OAAO,CAAC,cAAc;IActB,OAAO,CAAC,iBAAiB;IAQzB,OAAO,CAAC,iBAAiB;IAyCzB,OAAO,CAAC,sBAAsB;IAI9B,OAAO,CAAC,eAAe;IA8BvB,OAAO,CAAC,aAAa;IAIrB,OAAO,CAAC,OAAO;CAGhB"}
|
|
@@ -0,0 +1,286 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DyNTS_RequestTelemetry_ControlService = void 0;
|
|
4
|
+
const crypto_1 = require("crypto");
|
|
5
|
+
const app_version_header_util_1 = require("../../_collections/app-version-header.util");
|
|
6
|
+
const correlationHeader = 'X-Correlation-Id';
|
|
7
|
+
const contractVersion = 'dynts-request-telemetry/1';
|
|
8
|
+
const defaultDurationBuckets = [25, 100, 250, 1000, 5000];
|
|
9
|
+
const defaultMaxRouteCardinality = 128;
|
|
10
|
+
const otherRouteTemplate = '__other__';
|
|
11
|
+
const unmatchedRouteTemplate = '__unmatched__';
|
|
12
|
+
const allowedMethods = new Set(['DELETE', 'GET', 'HEAD', 'OPTIONS', 'PATCH', 'POST', 'PUT']);
|
|
13
|
+
const routeTemplatePattern = /^\/[A-Za-z0-9_:/.*-]{0,159}$/;
|
|
14
|
+
/**
|
|
15
|
+
* Event-driven, content-free request correlation and aggregate metrics.
|
|
16
|
+
*
|
|
17
|
+
* The service never reads or stores URL, query, headers, body, IP, user agent, account identity or error content.
|
|
18
|
+
* Route labels can only come from the framework's declared route templates. Caller-provided correlation values are
|
|
19
|
+
* ignored and replaced with a server-generated UUID.
|
|
20
|
+
*/
|
|
21
|
+
class DyNTS_RequestTelemetry_ControlService {
|
|
22
|
+
static instance;
|
|
23
|
+
/** Returns the process-wide request telemetry accumulator used by open and secure Express applications. */
|
|
24
|
+
static getInstance() {
|
|
25
|
+
if (!DyNTS_RequestTelemetry_ControlService.instance) {
|
|
26
|
+
DyNTS_RequestTelemetry_ControlService.instance = new DyNTS_RequestTelemetry_ControlService();
|
|
27
|
+
}
|
|
28
|
+
return DyNTS_RequestTelemetry_ControlService.instance;
|
|
29
|
+
}
|
|
30
|
+
settings = this.resolveSettings({});
|
|
31
|
+
configurationFingerprint = null;
|
|
32
|
+
requestStates = new WeakMap();
|
|
33
|
+
routeMetrics = new Map();
|
|
34
|
+
retainedRouteTemplates = new Set();
|
|
35
|
+
durationCounts = this.settings.durationBucketUpperBoundsMs.map(() => 0);
|
|
36
|
+
overflowDurationCount = 0;
|
|
37
|
+
statusClassCounts = {
|
|
38
|
+
'1xx': 0,
|
|
39
|
+
'2xx': 0,
|
|
40
|
+
'3xx': 0,
|
|
41
|
+
'4xx': 0,
|
|
42
|
+
'5xx': 0,
|
|
43
|
+
other: 0,
|
|
44
|
+
};
|
|
45
|
+
requestsStarted = 0;
|
|
46
|
+
requestsCompleted = 0;
|
|
47
|
+
requestsAborted = 0;
|
|
48
|
+
inFlight = 0;
|
|
49
|
+
droppedRouteTemplates = 0;
|
|
50
|
+
constructor() { }
|
|
51
|
+
/** Installs one immutable configuration; repeated identical calls are idempotent. */
|
|
52
|
+
configure(settings) {
|
|
53
|
+
const resolved = this.resolveSettings(settings);
|
|
54
|
+
const fingerprint = JSON.stringify(resolved);
|
|
55
|
+
if (this.configurationFingerprint && this.configurationFingerprint !== fingerprint) {
|
|
56
|
+
throw new Error('DYNTS|REQUEST_TELEMETRY|CONFIGURATION_CONFLICT');
|
|
57
|
+
}
|
|
58
|
+
if (this.configurationFingerprint === fingerprint) {
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
this.settings = resolved;
|
|
62
|
+
this.configurationFingerprint = fingerprint;
|
|
63
|
+
this.durationCounts = resolved.durationBucketUpperBoundsMs.map(() => 0);
|
|
64
|
+
}
|
|
65
|
+
/** Returns the early Express middleware that creates correlation and completion listeners. */
|
|
66
|
+
createMiddleware() {
|
|
67
|
+
return (req, res, next) => {
|
|
68
|
+
if (!this.settings.enabled) {
|
|
69
|
+
next();
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
try {
|
|
73
|
+
this.beginRequest(req, res);
|
|
74
|
+
}
|
|
75
|
+
catch {
|
|
76
|
+
// Telemetry is observation-only and must never change application response semantics.
|
|
77
|
+
}
|
|
78
|
+
next();
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
/** Returns a route-local middleware that labels only a framework-declared route template. */
|
|
82
|
+
identifyRoute(routeTemplate) {
|
|
83
|
+
const safeRouteTemplate = this.normalizeRouteTemplate(routeTemplate);
|
|
84
|
+
return (req, _res, next) => {
|
|
85
|
+
const state = this.requestStates.get(req);
|
|
86
|
+
if (state) {
|
|
87
|
+
state.routeTemplate = safeRouteTemplate;
|
|
88
|
+
}
|
|
89
|
+
next();
|
|
90
|
+
};
|
|
91
|
+
}
|
|
92
|
+
/** Returns the generated correlation ID for internal error/audit joins without reading request headers. */
|
|
93
|
+
getCorrelationId(req) {
|
|
94
|
+
return this.requestStates.get(req)?.correlationId;
|
|
95
|
+
}
|
|
96
|
+
/** Returns a stable copy of all bounded aggregate counters. */
|
|
97
|
+
snapshot() {
|
|
98
|
+
const durationBuckets = this.settings.durationBucketUpperBoundsMs.map((upperBoundMs, index) => ({
|
|
99
|
+
upperBoundMs: upperBoundMs,
|
|
100
|
+
count: this.durationCounts[index],
|
|
101
|
+
}));
|
|
102
|
+
durationBuckets.push({ upperBoundMs: null, count: this.overflowDurationCount });
|
|
103
|
+
return {
|
|
104
|
+
contractVersion: contractVersion,
|
|
105
|
+
correlationHeader: correlationHeader,
|
|
106
|
+
requestsStarted: this.requestsStarted,
|
|
107
|
+
requestsCompleted: this.requestsCompleted,
|
|
108
|
+
requestsAborted: this.requestsAborted,
|
|
109
|
+
inFlight: this.inFlight,
|
|
110
|
+
droppedRouteTemplates: this.droppedRouteTemplates,
|
|
111
|
+
statusClasses: { ...this.statusClassCounts },
|
|
112
|
+
durationBuckets: durationBuckets,
|
|
113
|
+
routes: [...this.routeMetrics.values()]
|
|
114
|
+
.map((metric) => ({
|
|
115
|
+
...metric,
|
|
116
|
+
}))
|
|
117
|
+
.sort((first, second) => `${first.method}:${first.routeTemplate}`.localeCompare(`${second.method}:${second.routeTemplate}`)),
|
|
118
|
+
};
|
|
119
|
+
}
|
|
120
|
+
/** Test-only reset for the process-wide singleton. */
|
|
121
|
+
_resetForTesting() {
|
|
122
|
+
this.settings = this.resolveSettings({});
|
|
123
|
+
this.configurationFingerprint = null;
|
|
124
|
+
this.requestStates = new WeakMap();
|
|
125
|
+
this.routeMetrics.clear();
|
|
126
|
+
this.retainedRouteTemplates.clear();
|
|
127
|
+
this.durationCounts = this.settings.durationBucketUpperBoundsMs.map(() => 0);
|
|
128
|
+
this.overflowDurationCount = 0;
|
|
129
|
+
Object.keys(this.statusClassCounts).forEach((key) => {
|
|
130
|
+
this.statusClassCounts[key] = 0;
|
|
131
|
+
});
|
|
132
|
+
this.requestsStarted = 0;
|
|
133
|
+
this.requestsCompleted = 0;
|
|
134
|
+
this.requestsAborted = 0;
|
|
135
|
+
this.inFlight = 0;
|
|
136
|
+
this.droppedRouteTemplates = 0;
|
|
137
|
+
}
|
|
138
|
+
beginRequest(req, res) {
|
|
139
|
+
const state = {
|
|
140
|
+
startedAtMs: Date.now(),
|
|
141
|
+
routeTemplate: unmatchedRouteTemplate,
|
|
142
|
+
correlationId: (0, crypto_1.randomUUID)(),
|
|
143
|
+
};
|
|
144
|
+
const existingExposeHeader = res.getHeader('Access-Control-Expose-Headers');
|
|
145
|
+
res.setHeader(correlationHeader, state.correlationId);
|
|
146
|
+
res.setHeader('Access-Control-Expose-Headers', (0, app_version_header_util_1.DyNTS_resolveExposeHeaders)(typeof existingExposeHeader === 'string' ? existingExposeHeader : undefined, correlationHeader));
|
|
147
|
+
let settled = false;
|
|
148
|
+
/** Settles one response exactly once and removes both lifecycle listeners. */
|
|
149
|
+
const settle = (aborted) => {
|
|
150
|
+
if (settled) {
|
|
151
|
+
return;
|
|
152
|
+
}
|
|
153
|
+
settled = true;
|
|
154
|
+
res.off('finish', onFinish);
|
|
155
|
+
res.off('close', onClose);
|
|
156
|
+
try {
|
|
157
|
+
this.completeRequest(req, res, aborted);
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
// Telemetry is observation-only and must never surface a response-lifecycle failure.
|
|
161
|
+
}
|
|
162
|
+
};
|
|
163
|
+
/** Records a normally completed response. */
|
|
164
|
+
const onFinish = () => settle(false);
|
|
165
|
+
/** Records a connection closed before a normal finish. */
|
|
166
|
+
const onClose = () => settle(true);
|
|
167
|
+
try {
|
|
168
|
+
res.once('finish', onFinish);
|
|
169
|
+
res.once('close', onClose);
|
|
170
|
+
}
|
|
171
|
+
catch (error) {
|
|
172
|
+
res.off('finish', onFinish);
|
|
173
|
+
res.off('close', onClose);
|
|
174
|
+
throw error;
|
|
175
|
+
}
|
|
176
|
+
this.requestStates.set(req, state);
|
|
177
|
+
this.requestsStarted = this.safeIncrement(this.requestsStarted);
|
|
178
|
+
this.inFlight = this.safeIncrement(this.inFlight);
|
|
179
|
+
}
|
|
180
|
+
completeRequest(req, res, aborted) {
|
|
181
|
+
const state = this.requestStates.get(req);
|
|
182
|
+
if (!state) {
|
|
183
|
+
return;
|
|
184
|
+
}
|
|
185
|
+
this.requestStates.delete(req);
|
|
186
|
+
this.inFlight = Math.max(0, this.inFlight - 1);
|
|
187
|
+
const durationMs = Math.max(0, Date.now() - state.startedAtMs);
|
|
188
|
+
this.recordDuration(durationMs);
|
|
189
|
+
if (aborted) {
|
|
190
|
+
this.requestsAborted = this.safeIncrement(this.requestsAborted);
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
this.requestsCompleted = this.safeIncrement(this.requestsCompleted);
|
|
194
|
+
this.recordStatusClass(res.statusCode);
|
|
195
|
+
}
|
|
196
|
+
this.recordRouteMetric({
|
|
197
|
+
method: req.method,
|
|
198
|
+
routeTemplate: state.routeTemplate,
|
|
199
|
+
statusCode: res.statusCode,
|
|
200
|
+
durationMs: durationMs,
|
|
201
|
+
aborted: aborted,
|
|
202
|
+
});
|
|
203
|
+
}
|
|
204
|
+
recordDuration(durationMs) {
|
|
205
|
+
const bucketIndex = this.settings.durationBucketUpperBoundsMs.findIndex((upperBoundMs) => durationMs <= upperBoundMs);
|
|
206
|
+
if (bucketIndex === -1) {
|
|
207
|
+
this.overflowDurationCount = this.safeIncrement(this.overflowDurationCount);
|
|
208
|
+
return;
|
|
209
|
+
}
|
|
210
|
+
this.durationCounts[bucketIndex] = this.safeIncrement(this.durationCounts[bucketIndex]);
|
|
211
|
+
}
|
|
212
|
+
recordStatusClass(statusCode) {
|
|
213
|
+
const statusClass = Number.isInteger(statusCode) && statusCode >= 100 && statusCode <= 599
|
|
214
|
+
? `${Math.floor(statusCode / 100)}xx`
|
|
215
|
+
: 'other';
|
|
216
|
+
this.statusClassCounts[statusClass] = this.safeIncrement(this.statusClassCounts[statusClass]);
|
|
217
|
+
}
|
|
218
|
+
recordRouteMetric(observation) {
|
|
219
|
+
const safeMethod = allowedMethods.has(observation.method) ? observation.method : 'OTHER';
|
|
220
|
+
let safeRouteTemplate = observation.routeTemplate;
|
|
221
|
+
let routeKey = `${safeMethod}:${safeRouteTemplate}`;
|
|
222
|
+
let metric = this.routeMetrics.get(routeKey);
|
|
223
|
+
if (safeRouteTemplate === otherRouteTemplate) {
|
|
224
|
+
this.droppedRouteTemplates = this.safeIncrement(this.droppedRouteTemplates);
|
|
225
|
+
}
|
|
226
|
+
else if (safeRouteTemplate !== unmatchedRouteTemplate && !this.retainedRouteTemplates.has(safeRouteTemplate)) {
|
|
227
|
+
if (this.retainedRouteTemplates.size >= this.settings.maxRouteCardinality) {
|
|
228
|
+
this.droppedRouteTemplates = this.safeIncrement(this.droppedRouteTemplates);
|
|
229
|
+
safeRouteTemplate = otherRouteTemplate;
|
|
230
|
+
routeKey = `${safeMethod}:${safeRouteTemplate}`;
|
|
231
|
+
metric = this.routeMetrics.get(routeKey);
|
|
232
|
+
}
|
|
233
|
+
else {
|
|
234
|
+
this.retainedRouteTemplates.add(safeRouteTemplate);
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
if (!metric) {
|
|
238
|
+
metric = {
|
|
239
|
+
method: safeMethod,
|
|
240
|
+
routeTemplate: safeRouteTemplate,
|
|
241
|
+
count: 0,
|
|
242
|
+
abortedCount: 0,
|
|
243
|
+
serverErrorCount: 0,
|
|
244
|
+
totalDurationMs: 0,
|
|
245
|
+
maxDurationMs: 0,
|
|
246
|
+
};
|
|
247
|
+
this.routeMetrics.set(routeKey, metric);
|
|
248
|
+
}
|
|
249
|
+
metric.count = this.safeIncrement(metric.count);
|
|
250
|
+
metric.abortedCount = observation.aborted ? this.safeIncrement(metric.abortedCount) : metric.abortedCount;
|
|
251
|
+
metric.serverErrorCount = !observation.aborted && observation.statusCode >= 500 && observation.statusCode <= 599
|
|
252
|
+
? this.safeIncrement(metric.serverErrorCount)
|
|
253
|
+
: metric.serverErrorCount;
|
|
254
|
+
metric.totalDurationMs = this.safeAdd(metric.totalDurationMs, observation.durationMs);
|
|
255
|
+
metric.maxDurationMs = Math.max(metric.maxDurationMs, observation.durationMs);
|
|
256
|
+
}
|
|
257
|
+
normalizeRouteTemplate(routeTemplate) {
|
|
258
|
+
return routeTemplatePattern.test(routeTemplate) ? routeTemplate : otherRouteTemplate;
|
|
259
|
+
}
|
|
260
|
+
resolveSettings(settings) {
|
|
261
|
+
const maxRouteCardinality = settings.maxRouteCardinality ?? defaultMaxRouteCardinality;
|
|
262
|
+
const durationBucketUpperBoundsMs = settings.durationBucketUpperBoundsMs ?? defaultDurationBuckets;
|
|
263
|
+
if (!Number.isInteger(maxRouteCardinality) || maxRouteCardinality < 1 || maxRouteCardinality > 1000) {
|
|
264
|
+
throw new Error('DYNTS|REQUEST_TELEMETRY|MAX_ROUTE_CARDINALITY_INVALID');
|
|
265
|
+
}
|
|
266
|
+
if (!durationBucketUpperBoundsMs.length ||
|
|
267
|
+
durationBucketUpperBoundsMs.length > 16 ||
|
|
268
|
+
durationBucketUpperBoundsMs.some((value) => !Number.isInteger(value) || value < 1 || value > 3_600_000) ||
|
|
269
|
+
durationBucketUpperBoundsMs.some((value, index) => index > 0 && value <= durationBucketUpperBoundsMs[index - 1])) {
|
|
270
|
+
throw new Error('DYNTS|REQUEST_TELEMETRY|DURATION_BUCKETS_INVALID');
|
|
271
|
+
}
|
|
272
|
+
return {
|
|
273
|
+
enabled: settings.enabled === true,
|
|
274
|
+
maxRouteCardinality: maxRouteCardinality,
|
|
275
|
+
durationBucketUpperBoundsMs: [...durationBucketUpperBoundsMs],
|
|
276
|
+
};
|
|
277
|
+
}
|
|
278
|
+
safeIncrement(value) {
|
|
279
|
+
return value >= Number.MAX_SAFE_INTEGER ? Number.MAX_SAFE_INTEGER : value + 1;
|
|
280
|
+
}
|
|
281
|
+
safeAdd(first, second) {
|
|
282
|
+
return first >= Number.MAX_SAFE_INTEGER - second ? Number.MAX_SAFE_INTEGER : first + second;
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
exports.DyNTS_RequestTelemetry_ControlService = DyNTS_RequestTelemetry_ControlService;
|
|
286
|
+
//# sourceMappingURL=request-telemetry.control-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-telemetry.control-service.js","sourceRoot":"","sources":["../../../src/_services/core/request-telemetry.control-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routing-module.service.d.ts","sourceRoot":"","sources":["../../../src/_services/route/routing-module.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,MAAM,EAAE,MAAM,SAAS,CAAC;AAWpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EACL,qBAAqB,EACtB,MAAM,4DAA4D,CAAC;AACpE,OAAO,EACL,4BAA4B,EAC7B,MAAM,4DAA4D,CAAC;
|
|
1
|
+
{"version":3,"file":"routing-module.service.d.ts","sourceRoot":"","sources":["../../../src/_services/route/routing-module.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,MAAM,EAAE,MAAM,SAAS,CAAC;AAWpD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AACvE,OAAO,EACL,qBAAqB,EACtB,MAAM,4DAA4D,CAAC;AACpE,OAAO,EACL,4BAA4B,EAC7B,MAAM,4DAA4D,CAAC;AAIpE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;AACH,qBAAa,mBAAmB;IAI9B,QAAQ,EAAE,mBAAmB,CAAC;IAC9B,QAAQ,CAAC,KAAK,EAAE,MAAM,CAAC;IAEvB,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAqB;IACjD,SAAS,EAAE,qBAAqB,EAAE,CAAM;IAExC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAY;IACvC,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAY;IAEzC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAE/B,IAAI,QAAQ,IAAI,OAAO,CAEtB;IAED,mBAAmB,SAEoC;gBAGrD,GAAG,EAAE,4BAA4B;IA4CnC;;OAEG;IACH,OAAO,CAAC,WAAW;IAyBnB;;;OAGG;IACH,OAAO,CAAC,WAAW;IA4DnB;;;OAGG;IACH,OAAO,CAAC,cAAc;IA2CtB;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IA6CxB,OAAO,CAAC,uBAAuB;CAiBhC"}
|
|
@@ -5,6 +5,7 @@ const express_1 = require("express");
|
|
|
5
5
|
const fsm_dynamo_1 = require("@futdevpro/fsm-dynamo");
|
|
6
6
|
const global_settings_const_1 = require("../../_collections/global-settings.const");
|
|
7
7
|
const route_security_enum_1 = require("../../_enums/route-security.enum");
|
|
8
|
+
const request_telemetry_control_service_1 = require("../core/request-telemetry.control-service");
|
|
8
9
|
/**
|
|
9
10
|
* Routing Module
|
|
10
11
|
* Handling route setup and control
|
|
@@ -177,21 +178,22 @@ class DyNTS_RoutingModule {
|
|
|
177
178
|
* @param endpointParams
|
|
178
179
|
*/
|
|
179
180
|
mountOpenRoute(endpointParams) {
|
|
181
|
+
const routeIdentity = request_telemetry_control_service_1.DyNTS_RequestTelemetry_ControlService.getInstance().identifyRoute(`${this.route}${endpointParams.endpoint}`);
|
|
180
182
|
switch (endpointParams.type) {
|
|
181
183
|
case fsm_dynamo_1.DyFM_HttpCallType.get:
|
|
182
|
-
this.openRouter.get(endpointParams.endpoint, endpointParams.getFullExecution());
|
|
184
|
+
this.openRouter.get(endpointParams.endpoint, routeIdentity, endpointParams.getFullExecution());
|
|
183
185
|
break;
|
|
184
186
|
case fsm_dynamo_1.DyFM_HttpCallType.post:
|
|
185
|
-
this.openRouter.post(endpointParams.endpoint, endpointParams.getFullExecution());
|
|
187
|
+
this.openRouter.post(endpointParams.endpoint, routeIdentity, endpointParams.getFullExecution());
|
|
186
188
|
break;
|
|
187
189
|
case fsm_dynamo_1.DyFM_HttpCallType.put:
|
|
188
|
-
this.openRouter.put(endpointParams.endpoint, endpointParams.getFullExecution());
|
|
190
|
+
this.openRouter.put(endpointParams.endpoint, routeIdentity, endpointParams.getFullExecution());
|
|
189
191
|
break;
|
|
190
192
|
case fsm_dynamo_1.DyFM_HttpCallType.patch:
|
|
191
|
-
this.openRouter.patch(endpointParams.endpoint, endpointParams.getFullExecution());
|
|
193
|
+
this.openRouter.patch(endpointParams.endpoint, routeIdentity, endpointParams.getFullExecution());
|
|
192
194
|
break;
|
|
193
195
|
case fsm_dynamo_1.DyFM_HttpCallType.delete:
|
|
194
|
-
this.openRouter.delete(endpointParams.endpoint, endpointParams.getFullExecution());
|
|
196
|
+
this.openRouter.delete(endpointParams.endpoint, routeIdentity, endpointParams.getFullExecution());
|
|
195
197
|
break;
|
|
196
198
|
default:
|
|
197
199
|
fsm_dynamo_1.DyFM_Log.error(`INVALID route type: ${endpointParams.type} - ${endpointParams.name}`);
|
|
@@ -207,21 +209,22 @@ class DyNTS_RoutingModule {
|
|
|
207
209
|
* @param endpointParams
|
|
208
210
|
*/
|
|
209
211
|
mountSecureRoute(endpointParams) {
|
|
212
|
+
const routeIdentity = request_telemetry_control_service_1.DyNTS_RequestTelemetry_ControlService.getInstance().identifyRoute(`${this.route}${endpointParams.endpoint}`);
|
|
210
213
|
switch (endpointParams.type) {
|
|
211
214
|
case fsm_dynamo_1.DyFM_HttpCallType.get:
|
|
212
|
-
this.secureRouter.get(endpointParams.endpoint, endpointParams.getFullExecution());
|
|
215
|
+
this.secureRouter.get(endpointParams.endpoint, routeIdentity, endpointParams.getFullExecution());
|
|
213
216
|
break;
|
|
214
217
|
case fsm_dynamo_1.DyFM_HttpCallType.post:
|
|
215
|
-
this.secureRouter.post(endpointParams.endpoint, endpointParams.getFullExecution());
|
|
218
|
+
this.secureRouter.post(endpointParams.endpoint, routeIdentity, endpointParams.getFullExecution());
|
|
216
219
|
break;
|
|
217
220
|
case fsm_dynamo_1.DyFM_HttpCallType.put:
|
|
218
|
-
this.secureRouter.put(endpointParams.endpoint, endpointParams.getFullExecution());
|
|
221
|
+
this.secureRouter.put(endpointParams.endpoint, routeIdentity, endpointParams.getFullExecution());
|
|
219
222
|
break;
|
|
220
223
|
case fsm_dynamo_1.DyFM_HttpCallType.patch:
|
|
221
|
-
this.secureRouter.patch(endpointParams.endpoint, endpointParams.getFullExecution());
|
|
224
|
+
this.secureRouter.patch(endpointParams.endpoint, routeIdentity, endpointParams.getFullExecution());
|
|
222
225
|
break;
|
|
223
226
|
case fsm_dynamo_1.DyFM_HttpCallType.delete:
|
|
224
|
-
this.secureRouter.delete(endpointParams.endpoint, endpointParams.getFullExecution());
|
|
227
|
+
this.secureRouter.delete(endpointParams.endpoint, routeIdentity, endpointParams.getFullExecution());
|
|
225
228
|
break;
|
|
226
229
|
default:
|
|
227
230
|
fsm_dynamo_1.DyFM_Log.error(`DYNAMO-NTS ERROR: INVALID route type: ${endpointParams.type} - ${endpointParams.name}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routing-module.service.js","sourceRoot":"","sources":["../../../src/_services/route/routing-module.service.ts"],"names":[],"mappings":";;;AAAA,qCAAoD;AAEpD,sDAM+B;AAE/B,oFAAiF;AACjF,0EAAuE;
|
|
1
|
+
{"version":3,"file":"routing-module.service.js","sourceRoot":"","sources":["../../../src/_services/route/routing-module.service.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@ import Express = require('express');
|
|
|
3
3
|
import * as Http from 'http';
|
|
4
4
|
import * as Https from 'https';
|
|
5
5
|
import { DyFM_Error } from '@futdevpro/fsm-dynamo';
|
|
6
|
+
import { DyNTS_RequestTelemetry_Settings } from '../../_models/interfaces/request-telemetry-settings.interface';
|
|
6
7
|
import { DyNTS_RouteSecurity } from '../../_enums/route-security.enum';
|
|
7
8
|
import { DyNTS_App_Params } from '../../_models/control-models/app-params.control-model';
|
|
8
9
|
import { DyNTS_AppSystemControls } from '../../_models/control-models/app-system-controls.control-model';
|
|
@@ -343,6 +344,8 @@ export declare abstract class DyNTS_App extends DyNTS_SingletonService {
|
|
|
343
344
|
* enelkul minden app kulon-kulon epitene ugyanezt.
|
|
344
345
|
*/
|
|
345
346
|
protected mountAppVersionHeader(express: Express.Application): void;
|
|
347
|
+
/** Mounts opt-in correlation and aggregate metrics before load shedding and every API route. */
|
|
348
|
+
protected mountRequestTelemetry(express: Express.Application): void;
|
|
346
349
|
protected mountCors(express: Express.Application): void;
|
|
347
350
|
/**
|
|
348
351
|
* Generikus, auth-agnosztikus extension-point orchestrator. A `registerCustomMiddleware`
|
|
@@ -410,6 +413,8 @@ export declare abstract class DyNTS_App extends DyNTS_SingletonService {
|
|
|
410
413
|
* Ha undefined → no CORS headers, no preflight handling — back-compat.
|
|
411
414
|
*/
|
|
412
415
|
getCorsSettings?(): DyNTS_Cors_Settings | undefined;
|
|
416
|
+
/** Enables content-free request correlation and event-driven aggregate metrics before API routing. */
|
|
417
|
+
getRequestTelemetrySettings?(): DyNTS_RequestTelemetry_Settings | undefined;
|
|
413
418
|
/**
|
|
414
419
|
* Opcionális generikus hook: custom Express middleware regisztrálása az API route-ok
|
|
415
420
|
* UTÁN és a SPA static catch-all ELŐTT. Auth-AGNOSZTIKUS framework extension-point —
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"app.server.d.ts","sourceRoot":"","sources":["../../../src/_services/server/app.server.ts"],"names":[],"mappings":"AACA,OAAO,QAAQ,GAAG,QAAQ,UAAU,CAAC,CAAC;AACtC,OAAO,OAAO,GAAG,QAAQ,SAAS,CAAC,CAAC;AAMpC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAM/B,OAAO,EAIL,UAAU,EAQX,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"app.server.d.ts","sourceRoot":"","sources":["../../../src/_services/server/app.server.ts"],"names":[],"mappings":"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"}
|