@futdevpro/nts-dynamo 1.15.17 → 1.15.20
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/_specifications/BACKLOG.md +4 -4
- package/build/_models/interfaces/global-log-settings.interface.d.ts +35 -0
- package/build/_models/interfaces/global-log-settings.interface.d.ts.map +1 -1
- package/build/_modules/admin-auth/_models/admin-api-key-config.interface.d.ts +32 -0
- package/build/_modules/admin-auth/_models/admin-api-key-config.interface.d.ts.map +1 -0
- package/build/_modules/admin-auth/_models/admin-api-key-config.interface.js +3 -0
- package/build/_modules/admin-auth/_models/admin-api-key-config.interface.js.map +1 -0
- package/build/_modules/admin-auth/admin-api-key.auth-service.d.ts +90 -0
- package/build/_modules/admin-auth/admin-api-key.auth-service.d.ts.map +1 -0
- package/build/_modules/admin-auth/admin-api-key.auth-service.js +195 -0
- package/build/_modules/admin-auth/admin-api-key.auth-service.js.map +1 -0
- package/build/_modules/admin-auth/index.d.ts +3 -0
- package/build/_modules/admin-auth/index.d.ts.map +1 -0
- package/build/_modules/admin-auth/index.js +6 -0
- package/build/_modules/admin-auth/index.js.map +1 -0
- package/build/_modules/logs/file-log.service.d.ts +87 -0
- package/build/_modules/logs/file-log.service.d.ts.map +1 -0
- package/build/_modules/logs/file-log.service.js +267 -0
- package/build/_modules/logs/file-log.service.js.map +1 -0
- package/build/_modules/logs/get-logs-routing-module.util.d.ts +19 -0
- package/build/_modules/logs/get-logs-routing-module.util.d.ts.map +1 -0
- package/build/_modules/logs/get-logs-routing-module.util.js +32 -0
- package/build/_modules/logs/get-logs-routing-module.util.js.map +1 -0
- package/build/_modules/logs/index.d.ts +5 -0
- package/build/_modules/logs/index.d.ts.map +1 -0
- package/build/_modules/logs/index.js +12 -0
- package/build/_modules/logs/index.js.map +1 -0
- package/build/_modules/logs/log-buffer.service.d.ts +38 -0
- package/build/_modules/logs/log-buffer.service.d.ts.map +1 -0
- package/build/_modules/logs/log-buffer.service.js +97 -0
- package/build/_modules/logs/log-buffer.service.js.map +1 -0
- package/build/_modules/logs/logs.controller.d.ts +27 -0
- package/build/_modules/logs/logs.controller.d.ts.map +1 -0
- package/build/_modules/logs/logs.controller.js +90 -0
- package/build/_modules/logs/logs.controller.js.map +1 -0
- package/build/_modules/logs/logs.service.d.ts +40 -0
- package/build/_modules/logs/logs.service.d.ts.map +1 -0
- package/build/_modules/logs/logs.service.js +97 -0
- package/build/_modules/logs/logs.service.js.map +1 -0
- package/package.json +1 -1
- package/pipeline.cicd.config.json +3 -1
- package/src/_models/interfaces/global-log-settings.interface.ts +36 -0
- package/src/_modules/admin-auth/_models/admin-api-key-config.interface.ts +33 -0
- package/src/_modules/admin-auth/admin-api-key.auth-service.spec.ts +200 -0
- package/src/_modules/admin-auth/admin-api-key.auth-service.ts +220 -0
- package/src/_modules/admin-auth/index.ts +2 -0
- package/src/_modules/logs/file-log.service.spec.ts +202 -0
- package/src/_modules/logs/file-log.service.ts +283 -0
- package/src/_modules/logs/get-logs-routing-module.util.ts +36 -0
- package/src/_modules/logs/index.ts +4 -0
- package/src/_modules/logs/log-buffer.service.ts +101 -0
- package/src/_modules/logs/logs.controller.ts +109 -0
- package/src/_modules/logs/logs.service.ts +100 -0
|
@@ -22,18 +22,18 @@
|
|
|
22
22
|
details: Alkalmassá kell tenni a Dynamo NTS-t, hogy kiszolgálja a klienst (frontend/client-side serving)
|
|
23
23
|
|
|
24
24
|
- [FEATURE] (BL-20260420-001) Átfogó file-based log kezelési rendszer
|
|
25
|
-
status:
|
|
25
|
+
status: ✅ done
|
|
26
26
|
priority: medium
|
|
27
27
|
source: user
|
|
28
28
|
area: backend
|
|
29
|
-
details: Config-vezérelt log rendszer, ahol egy boolean flag-gel be lehet kapcsolni a file-ba történő log írást, és további config opciókkal lehet állítani a maximum tárolt log mennyiséget (file size / rotation / retention) és egyéb log kezelési paramétereket
|
|
29
|
+
details: Config-vezérelt log rendszer, ahol egy boolean flag-gel be lehet kapcsolni a file-ba történő log írást, és további config opciókkal lehet állítani a maximum tárolt log mennyiséget (file size / rotation / retention) és egyéb log kezelési paramétereket. Implementálva (2026-05-17): DyNTS_FileLog_Service (singleton) — process.stdout/stderr.write monkey-patch, per-session log fájl, sync appendFileSync (crash-safe), config: file_log.{enabled, logDir, filenamePrefix, maxFileSizeMb, maxFiles, retentionDays, stripAnsi, includeStdout, includeStderr}. Rotation size-limitre, retention by count + age (ami előbb teljesül). Silent failure (file IO sosem blokkolja a szervert). Spec: 11 spec / 0 fail. Full suite: 1133/0. Smoke verified.
|
|
30
30
|
|
|
31
31
|
- [FEATURE] (BL-20260420-002) Admin API key alapú authentikációs réteg (env-ből)
|
|
32
|
-
status:
|
|
32
|
+
status: ✅ done
|
|
33
33
|
priority: high
|
|
34
34
|
source: user
|
|
35
35
|
area: backend
|
|
36
|
-
details: Új admin authentikációs mechanizmus bevezetése, ahol az admin API key-t environment variable-ből olvassuk (pl. DYNTS_ADMIN_API_KEY), és ezzel lehet védeni az érzékeny / admin endpointokat.
|
|
36
|
+
details: Új admin authentikációs mechanizmus bevezetése, ahol az admin API key-t environment variable-ből olvassuk (pl. DYNTS_ADMIN_API_KEY), és ezzel lehet védeni az érzékeny / admin endpointokat. Implementálva (2026-05-17): DyNTS_AdminApiKey_AuthService (singleton) — preProcess `.verify(req, res)` fn opt-in átadható `DyNTS_Endpoint_Params.preProcesses`-be vagy `DyNTS_getLogsRoutingModule({ authPreProcess })`-be. Default env var DYNTS_ADMIN_API_KEY, header x-admin-api-key + Authorization Bearer fallback. Konfig: `configure({ envVarName, headerName, allowAuthorizationBearer })`. Timing-safe compare (crypto.timingSafeEqual + length-mismatch dummy compare). Hibák: 500 ha env nincs, 401 ha header hiányzik/rossz. Env minden híváskor olvasott (nem cache-elt). 15/15 spec + 1148/0 full suite + smoke verifikálva. Foundational a BL-003 (log fetch) és BL-004 (errors retrofit) entry-knek.
|
|
37
37
|
|
|
38
38
|
- [FEATURE] (BL-20260420-003) Server log file-ok lekérése admin endpointon keresztül
|
|
39
39
|
status: ⏳ pending
|
|
@@ -81,5 +81,40 @@ export interface DyNTS_GlobalLog_Settings {
|
|
|
81
81
|
/** Max sorok szama a bufferben. Default: 2000. */
|
|
82
82
|
maxEntries?: number;
|
|
83
83
|
};
|
|
84
|
+
/**
|
|
85
|
+
* File-based log kiiras konfiguracio (DyNTS_FileLog_Service).
|
|
86
|
+
*
|
|
87
|
+
* Az in-memory ring buffer (DyNTS_Logs_Service) mellett mukodik — NEM
|
|
88
|
+
* helyette. A szerver stdout/stderr kimeneteket egy per-session log
|
|
89
|
+
* fajlba duplikalja (`{logDir}/{filenamePrefix}YYYY-MM-DD_HH-MM-SS.log`).
|
|
90
|
+
*
|
|
91
|
+
* Rotation: ha az aktiv fajl meghaladja a `maxFileSizeMb`-t, uj fajl jon
|
|
92
|
+
* letre. Retention: az `install()` + minden rotation utan a
|
|
93
|
+
* `maxFiles`-nel regebbi vagy a `retentionDays`-nel idosebb fajlok
|
|
94
|
+
* torlodnek (ami elobb teljesul).
|
|
95
|
+
*
|
|
96
|
+
* Hasznalat:
|
|
97
|
+
* DyNTS_FileLog_Service.getInstance().install(); // szerver startup
|
|
98
|
+
*/
|
|
99
|
+
file_log?: {
|
|
100
|
+
/** Engedelyezve van-e a file-based logolás. Default: false. */
|
|
101
|
+
enabled: boolean;
|
|
102
|
+
/** Log mappa abszolut vagy relativ path-ja. Default: './logs/server'. */
|
|
103
|
+
logDir?: string;
|
|
104
|
+
/** Per-session fajlnev prefix. Default: 'server-'. */
|
|
105
|
+
filenamePrefix?: string;
|
|
106
|
+
/** Rotation trigger MB-ban. Default: 50. */
|
|
107
|
+
maxFileSizeMb?: number;
|
|
108
|
+
/** Retention by count — max ennyi log fajl marad meg. Default: 10. */
|
|
109
|
+
maxFiles?: number;
|
|
110
|
+
/** Retention by age — ennyi napnal regebbi fajl torlodik. Default: 30. */
|
|
111
|
+
retentionDays?: number;
|
|
112
|
+
/** ANSI escape kodok strippelese a fajl-irasnal. Default: true. */
|
|
113
|
+
stripAnsi?: boolean;
|
|
114
|
+
/** stdout interceptalasa. Default: true. */
|
|
115
|
+
includeStdout?: boolean;
|
|
116
|
+
/** stderr interceptalasa. Default: true. */
|
|
117
|
+
includeStderr?: boolean;
|
|
118
|
+
};
|
|
84
119
|
}
|
|
85
120
|
//# sourceMappingURL=global-log-settings.interface.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"global-log-settings.interface.d.ts","sourceRoot":"","sources":["../../../src/_models/interfaces/global-log-settings.interface.ts"],"names":[],"mappings":"AACA,MAAM,WAAW,wBAAwB;IACvC;;OAEG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B,IAAI,CAAC,EAAE,OAAO,CAAC;IAEf;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;OAEG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB;;OAEG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B;;OAEG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B;;OAEG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAG/B;;OAEG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B;;OAEG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAE5B;;OAEG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAG9B;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;OAEG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B;;OAEG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B;;OAEG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAE/B;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAGrB;;OAEG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;;;OAIG;IACH,aAAa,CAAC,EAAE;QACd,2DAA2D;QAC3D,OAAO,EAAE,OAAO,CAAC;QACjB,kDAAkD;QAClD,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;CACH"}
|
|
1
|
+
{"version":3,"file":"global-log-settings.interface.d.ts","sourceRoot":"","sources":["../../../src/_models/interfaces/global-log-settings.interface.ts"],"names":[],"mappings":"AACA,MAAM,WAAW,wBAAwB;IACvC;;OAEG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B,IAAI,CAAC,EAAE,OAAO,CAAC;IAEf;;OAEG;IACH,KAAK,CAAC,EAAE,OAAO,CAAC;IAEhB;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;OAEG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAElB;;OAEG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB;;OAEG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B;;OAEG;IACH,eAAe,CAAC,EAAE,OAAO,CAAC;IAE1B;;OAEG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAG/B;;OAEG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;IAE3B;;OAEG;IACH,iBAAiB,CAAC,EAAE,OAAO,CAAC;IAE5B;;OAEG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAG9B;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAErB;;OAEG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B;;OAEG;IACH,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAE9B;;OAEG;IACH,oBAAoB,CAAC,EAAE,OAAO,CAAC;IAE/B;;OAEG;IACH,UAAU,CAAC,EAAE,OAAO,CAAC;IAGrB;;OAEG;IACH,cAAc,CAAC,EAAE,OAAO,CAAC;IAEzB,YAAY,CAAC,EAAE,OAAO,CAAC;IAEvB,SAAS,CAAC,EAAE,OAAO,CAAC;IAEpB;;;;OAIG;IACH,aAAa,CAAC,EAAE;QACd,2DAA2D;QAC3D,OAAO,EAAE,OAAO,CAAC;QACjB,kDAAkD;QAClD,UAAU,CAAC,EAAE,MAAM,CAAC;KACrB,CAAC;IAEF;;;;;;;;;;;;;;OAcG;IACH,QAAQ,CAAC,EAAE;QACT,+DAA+D;QAC/D,OAAO,EAAE,OAAO,CAAC;QACjB,yEAAyE;QACzE,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,sDAAsD;QACtD,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,4CAA4C;QAC5C,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,sEAAsE;QACtE,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,0EAA0E;QAC1E,aAAa,CAAC,EAAE,MAAM,CAAC;QACvB,mEAAmE;QACnE,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB,4CAA4C;QAC5C,aAAa,CAAC,EAAE,OAAO,CAAC;QACxB,4CAA4C;QAC5C,aAAa,CAAC,EAAE,OAAO,CAAC;KACzB,CAAC;CACH"}
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Config a `DyNTS_AdminApiKey_AuthService.configure(...)`-hoz.
|
|
3
|
+
*
|
|
4
|
+
* Minden mezo opcionalis — a default-ok megfelelnek a tipikus hasznalat-eset
|
|
5
|
+
* elvarasanak (DYNTS_ADMIN_API_KEY env var + x-admin-api-key header +
|
|
6
|
+
* Bearer fallback).
|
|
7
|
+
*/
|
|
8
|
+
export interface DyNTS_AdminApiKey_Config {
|
|
9
|
+
/**
|
|
10
|
+
* Env var nev, ahonnan az admin API key olvasodik.
|
|
11
|
+
* Default: `DYNTS_ADMIN_API_KEY`.
|
|
12
|
+
*
|
|
13
|
+
* Override-olhato pl. multi-tenant deploy-okhoz vagy ha a host app
|
|
14
|
+
* mas konvenciot kovet (`MY_APP_ADMIN_KEY`, stb.).
|
|
15
|
+
*/
|
|
16
|
+
envVarName?: string;
|
|
17
|
+
/**
|
|
18
|
+
* HTTP header nev (case-insensitive — Express normalizalja lowercase-re).
|
|
19
|
+
* Default: `x-admin-api-key`.
|
|
20
|
+
*/
|
|
21
|
+
headerName?: string;
|
|
22
|
+
/**
|
|
23
|
+
* Engedi-e az `Authorization: Bearer <key>` fallback-et a primer header
|
|
24
|
+
* helyett. Default: `true`.
|
|
25
|
+
*
|
|
26
|
+
* Hasznos amikor a kliens egy generikus HTTP klienst hasznal ami csak
|
|
27
|
+
* az Authorization header-t allitja, vagy amikor proxy-k strippelik
|
|
28
|
+
* a custom header-eket.
|
|
29
|
+
*/
|
|
30
|
+
allowAuthorizationBearer?: boolean;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=admin-api-key-config.interface.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-api-key-config.interface.d.ts","sourceRoot":"","sources":["../../../../src/_modules/admin-auth/_models/admin-api-key-config.interface.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AACH,MAAM,WAAW,wBAAwB;IACvC;;;;;;OAMG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;OAGG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IAEpB;;;;;;;OAOG;IACH,wBAAwB,CAAC,EAAE,OAAO,CAAC;CACpC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-api-key-config.interface.js","sourceRoot":"","sources":["../../../../src/_modules/admin-auth/_models/admin-api-key-config.interface.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
import { Request, Response } from 'express';
|
|
2
|
+
import { DyNTS_SingletonServiceBase } from '../../_services/base/singleton.service-base';
|
|
3
|
+
import { DyNTS_AdminApiKey_Config } from './_models/admin-api-key-config.interface';
|
|
4
|
+
/**
|
|
5
|
+
* Admin API key auth service — opt-in HTTP guard a meglevo `DyNTS_Endpoint_Params.preProcesses`
|
|
6
|
+
* mechanizmushoz. Egy env var-ban tarolt fix kulccsal valid-alja a bejovo kerest.
|
|
7
|
+
*
|
|
8
|
+
* **Hasznalat (host app):**
|
|
9
|
+
* ```ts
|
|
10
|
+
* const adminAuth = DyNTS_AdminApiKey_AuthService.getInstance();
|
|
11
|
+
* // opcionalis konfig:
|
|
12
|
+
* // adminAuth.configure({ envVarName: 'MY_KEY', headerName: 'x-my-key' });
|
|
13
|
+
*
|
|
14
|
+
* new DyNTS_Endpoint_Params({
|
|
15
|
+
* ...,
|
|
16
|
+
* preProcesses: [adminAuth.verify, ...other],
|
|
17
|
+
* });
|
|
18
|
+
*
|
|
19
|
+
* // vagy a logs routing module-on at
|
|
20
|
+
* DyNTS_getLogsRoutingModule({ authPreProcess: adminAuth.verify });
|
|
21
|
+
* ```
|
|
22
|
+
*
|
|
23
|
+
* **Viselkedes:**
|
|
24
|
+
* - env var beallitva ES helyes header → silent pass
|
|
25
|
+
* - env var beallitva, header hianyzik / rossz → 401 DyFM_Error
|
|
26
|
+
* - env var NINCS beallitva → 500 DyFM_Error (fail-closed; NEM silent allow)
|
|
27
|
+
*
|
|
28
|
+
* **Header lookup:**
|
|
29
|
+
* 1. `x-admin-api-key` (default canonical header)
|
|
30
|
+
* 2. `Authorization: Bearer <key>` (fallback ha `allowAuthorizationBearer === true`)
|
|
31
|
+
*
|
|
32
|
+
* **Timing-safe:** `crypto.timingSafeEqual` Buffer-konvertalassal. Length-mismatch
|
|
33
|
+
* eseten dummy compare-rel azonos idő, hogy a kulcs-hossz ne szivarogjon ki.
|
|
34
|
+
*
|
|
35
|
+
* **Env var read-on-each-call:** a `verify()` minden hivasnal olvassa az env-et,
|
|
36
|
+
* nem cache-eli. Igy a host az env-et utolagosan is allithatja (pl. config
|
|
37
|
+
* loader az auth.service.install() utan).
|
|
38
|
+
*
|
|
39
|
+
* **Singleton:** `getInstance()`-szel hivd. A `.verify` mezo binding-elve van
|
|
40
|
+
* `this`-re, igy direkt atadhato `preProcesses`-be ujracsomagolas nelkul.
|
|
41
|
+
*/
|
|
42
|
+
export declare class DyNTS_AdminApiKey_AuthService extends DyNTS_SingletonServiceBase {
|
|
43
|
+
static getInstance(): DyNTS_AdminApiKey_AuthService;
|
|
44
|
+
private envVarName;
|
|
45
|
+
private headerName;
|
|
46
|
+
private allowAuthorizationBearer;
|
|
47
|
+
/**
|
|
48
|
+
* Konfig override. Hianyzo mezok a default-okat orzik.
|
|
49
|
+
* Hivhato barmikor — a `verify()` a friss config-ot olvassa.
|
|
50
|
+
*/
|
|
51
|
+
configure(config: DyNTS_AdminApiKey_Config): void;
|
|
52
|
+
/**
|
|
53
|
+
* Aktualis konfig olvasasa (test/diagnosztika celokra).
|
|
54
|
+
*/
|
|
55
|
+
getConfig(): Required<DyNTS_AdminApiKey_Config>;
|
|
56
|
+
/**
|
|
57
|
+
* Pre-process function — atadhato `DyNTS_Endpoint_Params.preProcesses`-be,
|
|
58
|
+
* vagy `DyNTS_getLogsRoutingModule({ authPreProcess: ... })`-be.
|
|
59
|
+
*
|
|
60
|
+
* Throws:
|
|
61
|
+
* - 500 ha az env var nincs beallitva (vagy ures string)
|
|
62
|
+
* - 401 ha a header hianyzik vagy nem egyezik
|
|
63
|
+
*
|
|
64
|
+
* A `req`/`res` parametereket NEM modositja (a kerest tovabb engedi a tovabbi
|
|
65
|
+
* preProcess-eknek; csak hiba eseten throw-ol).
|
|
66
|
+
*/
|
|
67
|
+
readonly verify: (req: Request, _res: Response) => Promise<void>;
|
|
68
|
+
/**
|
|
69
|
+
* Header lookup — elobb a primer header, aztan opcionalisan az Authorization Bearer.
|
|
70
|
+
* Az ures string is "hianyzo"-nak szamit (a Buffer.from('') es timingSafeEqual
|
|
71
|
+
* konzisztencia miatt).
|
|
72
|
+
*/
|
|
73
|
+
private extractKeyFromRequest;
|
|
74
|
+
/**
|
|
75
|
+
* Timing-safe compare ket string kozott. Length-mismatch eseten egy dummy
|
|
76
|
+
* compare-rel azonos idot kenyszeritunk (a kulcs-hossz nem szivaroghat ki
|
|
77
|
+
* timing-attackal).
|
|
78
|
+
*
|
|
79
|
+
* crypto.timingSafeEqual KOTELEZOEN azonos Buffer-hosszt var — kulonbozo
|
|
80
|
+
* hosszra throw-ol, ezert vizsgaljuk elobb a length-et es csak utana
|
|
81
|
+
* compare-elunk.
|
|
82
|
+
*/
|
|
83
|
+
private timingSafeEquals;
|
|
84
|
+
/**
|
|
85
|
+
* Test-only: visszaallitja a default config-ot, hogy a specfajlok ne szivarogjak
|
|
86
|
+
* at egymas state-jet. Production code NE hivja.
|
|
87
|
+
*/
|
|
88
|
+
_resetForTesting(): void;
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=admin-api-key.auth-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-api-key.auth-service.d.ts","sourceRoot":"","sources":["../../../src/_modules/admin-auth/admin-api-key.auth-service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAK5C,OAAO,EAAE,0BAA0B,EAAE,MAAM,6CAA6C,CAAC;AAGzF,OAAO,EAAE,wBAAwB,EAAE,MAAM,0CAA0C,CAAC;AAsBpF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AACH,qBAAa,6BAA8B,SAAQ,0BAA0B;IAE3E,MAAM,CAAC,WAAW,IAAI,6BAA6B;IAInD,OAAO,CAAC,UAAU,CAAgC;IAClD,OAAO,CAAC,UAAU,CAA+B;IACjD,OAAO,CAAC,wBAAwB,CAAiC;IAGjE;;;OAGG;IACH,SAAS,CAAC,MAAM,EAAE,wBAAwB,GAAG,IAAI;IAajD;;OAEG;IACH,SAAS,IAAI,QAAQ,CAAC,wBAAwB,CAAC;IAQ/C;;;;;;;;;;OAUG;IACH,QAAQ,CAAC,MAAM,QAAe,OAAO,QAAQ,QAAQ,KAAG,OAAO,CAAC,IAAI,CAAC,CAqCnE;IAGF;;;;OAIG;IACH,OAAO,CAAC,qBAAqB;IAuB7B;;;;;;;;OAQG;IACH,OAAO,CAAC,gBAAgB;IAexB;;;OAGG;IACH,gBAAgB,IAAI,IAAI;CAKzB"}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DyNTS_AdminApiKey_AuthService = void 0;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const crypto = tslib_1.__importStar(require("crypto"));
|
|
6
|
+
const fsm_dynamo_1 = require("@futdevpro/fsm-dynamo");
|
|
7
|
+
const singleton_service_base_1 = require("../../_services/base/singleton.service-base");
|
|
8
|
+
const global_settings_const_1 = require("../../_collections/global-settings.const");
|
|
9
|
+
/** Default env var nev az admin API key-hez. */
|
|
10
|
+
const DEFAULT_ENV_VAR_NAME = 'DYNTS_ADMIN_API_KEY';
|
|
11
|
+
/** Default header nev (Express lowercase-re normalizalja az osszes header-t). */
|
|
12
|
+
const DEFAULT_HEADER_NAME = 'x-admin-api-key';
|
|
13
|
+
/** Default Bearer fallback engedelyezve van. */
|
|
14
|
+
const DEFAULT_ALLOW_BEARER = true;
|
|
15
|
+
/** Service-nev az error-okhoz. */
|
|
16
|
+
const SERVICE_NAME = 'DyNTS_AdminApiKey_AuthService';
|
|
17
|
+
/** ErrorCode prefix — system shortcode + saját kod. */
|
|
18
|
+
const buildErrorCode = (subcode) => {
|
|
19
|
+
const sys = global_settings_const_1.DyNTS_global_settings.systemShortCodeName ?? 'DyNTS';
|
|
20
|
+
return `${sys}|DyNTS-AAK-${subcode}`;
|
|
21
|
+
};
|
|
22
|
+
/**
|
|
23
|
+
* Admin API key auth service — opt-in HTTP guard a meglevo `DyNTS_Endpoint_Params.preProcesses`
|
|
24
|
+
* mechanizmushoz. Egy env var-ban tarolt fix kulccsal valid-alja a bejovo kerest.
|
|
25
|
+
*
|
|
26
|
+
* **Hasznalat (host app):**
|
|
27
|
+
* ```ts
|
|
28
|
+
* const adminAuth = DyNTS_AdminApiKey_AuthService.getInstance();
|
|
29
|
+
* // opcionalis konfig:
|
|
30
|
+
* // adminAuth.configure({ envVarName: 'MY_KEY', headerName: 'x-my-key' });
|
|
31
|
+
*
|
|
32
|
+
* new DyNTS_Endpoint_Params({
|
|
33
|
+
* ...,
|
|
34
|
+
* preProcesses: [adminAuth.verify, ...other],
|
|
35
|
+
* });
|
|
36
|
+
*
|
|
37
|
+
* // vagy a logs routing module-on at
|
|
38
|
+
* DyNTS_getLogsRoutingModule({ authPreProcess: adminAuth.verify });
|
|
39
|
+
* ```
|
|
40
|
+
*
|
|
41
|
+
* **Viselkedes:**
|
|
42
|
+
* - env var beallitva ES helyes header → silent pass
|
|
43
|
+
* - env var beallitva, header hianyzik / rossz → 401 DyFM_Error
|
|
44
|
+
* - env var NINCS beallitva → 500 DyFM_Error (fail-closed; NEM silent allow)
|
|
45
|
+
*
|
|
46
|
+
* **Header lookup:**
|
|
47
|
+
* 1. `x-admin-api-key` (default canonical header)
|
|
48
|
+
* 2. `Authorization: Bearer <key>` (fallback ha `allowAuthorizationBearer === true`)
|
|
49
|
+
*
|
|
50
|
+
* **Timing-safe:** `crypto.timingSafeEqual` Buffer-konvertalassal. Length-mismatch
|
|
51
|
+
* eseten dummy compare-rel azonos idő, hogy a kulcs-hossz ne szivarogjon ki.
|
|
52
|
+
*
|
|
53
|
+
* **Env var read-on-each-call:** a `verify()` minden hivasnal olvassa az env-et,
|
|
54
|
+
* nem cache-eli. Igy a host az env-et utolagosan is allithatja (pl. config
|
|
55
|
+
* loader az auth.service.install() utan).
|
|
56
|
+
*
|
|
57
|
+
* **Singleton:** `getInstance()`-szel hivd. A `.verify` mezo binding-elve van
|
|
58
|
+
* `this`-re, igy direkt atadhato `preProcesses`-be ujracsomagolas nelkul.
|
|
59
|
+
*/
|
|
60
|
+
class DyNTS_AdminApiKey_AuthService extends singleton_service_base_1.DyNTS_SingletonServiceBase {
|
|
61
|
+
static getInstance() {
|
|
62
|
+
return DyNTS_AdminApiKey_AuthService.getSingletonInstance();
|
|
63
|
+
}
|
|
64
|
+
envVarName = DEFAULT_ENV_VAR_NAME;
|
|
65
|
+
headerName = DEFAULT_HEADER_NAME;
|
|
66
|
+
allowAuthorizationBearer = DEFAULT_ALLOW_BEARER;
|
|
67
|
+
/**
|
|
68
|
+
* Konfig override. Hianyzo mezok a default-okat orzik.
|
|
69
|
+
* Hivhato barmikor — a `verify()` a friss config-ot olvassa.
|
|
70
|
+
*/
|
|
71
|
+
configure(config) {
|
|
72
|
+
if (config.envVarName !== undefined) {
|
|
73
|
+
this.envVarName = config.envVarName;
|
|
74
|
+
}
|
|
75
|
+
if (config.headerName !== undefined) {
|
|
76
|
+
// Express lowercase-re normalizal — itt is lowercase-eljuk a konzisztenciaert
|
|
77
|
+
this.headerName = config.headerName.toLowerCase();
|
|
78
|
+
}
|
|
79
|
+
if (config.allowAuthorizationBearer !== undefined) {
|
|
80
|
+
this.allowAuthorizationBearer = config.allowAuthorizationBearer;
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/**
|
|
84
|
+
* Aktualis konfig olvasasa (test/diagnosztika celokra).
|
|
85
|
+
*/
|
|
86
|
+
getConfig() {
|
|
87
|
+
return {
|
|
88
|
+
envVarName: this.envVarName,
|
|
89
|
+
headerName: this.headerName,
|
|
90
|
+
allowAuthorizationBearer: this.allowAuthorizationBearer,
|
|
91
|
+
};
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* Pre-process function — atadhato `DyNTS_Endpoint_Params.preProcesses`-be,
|
|
95
|
+
* vagy `DyNTS_getLogsRoutingModule({ authPreProcess: ... })`-be.
|
|
96
|
+
*
|
|
97
|
+
* Throws:
|
|
98
|
+
* - 500 ha az env var nincs beallitva (vagy ures string)
|
|
99
|
+
* - 401 ha a header hianyzik vagy nem egyezik
|
|
100
|
+
*
|
|
101
|
+
* A `req`/`res` parametereket NEM modositja (a kerest tovabb engedi a tovabbi
|
|
102
|
+
* preProcess-eknek; csak hiba eseten throw-ol).
|
|
103
|
+
*/
|
|
104
|
+
verify = async (req, _res) => {
|
|
105
|
+
const expectedKey = process.env[this.envVarName] ?? '';
|
|
106
|
+
if (expectedKey.length === 0) {
|
|
107
|
+
throw new fsm_dynamo_1.DyFM_Error({
|
|
108
|
+
status: 500,
|
|
109
|
+
errorCode: buildErrorCode('CONFIG'),
|
|
110
|
+
addECToUserMsg: true,
|
|
111
|
+
message: `Admin API key not configured: env var ${this.envVarName} is not set or empty`,
|
|
112
|
+
userMessage: 'Server configuration error',
|
|
113
|
+
issuerService: SERVICE_NAME,
|
|
114
|
+
});
|
|
115
|
+
}
|
|
116
|
+
const providedKey = this.extractKeyFromRequest(req);
|
|
117
|
+
if (providedKey === null) {
|
|
118
|
+
throw new fsm_dynamo_1.DyFM_Error({
|
|
119
|
+
status: 401,
|
|
120
|
+
errorCode: buildErrorCode('MISSING'),
|
|
121
|
+
addECToUserMsg: true,
|
|
122
|
+
message: `Admin API key required (expected header: ${this.headerName})`,
|
|
123
|
+
userMessage: 'Admin API key required',
|
|
124
|
+
issuerService: SERVICE_NAME,
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
if (!this.timingSafeEquals(providedKey, expectedKey)) {
|
|
128
|
+
throw new fsm_dynamo_1.DyFM_Error({
|
|
129
|
+
status: 401,
|
|
130
|
+
errorCode: buildErrorCode('INVALID'),
|
|
131
|
+
addECToUserMsg: true,
|
|
132
|
+
message: 'Admin API key invalid',
|
|
133
|
+
userMessage: 'Admin API key invalid',
|
|
134
|
+
issuerService: SERVICE_NAME,
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
// Silent pass — return resolved promise
|
|
138
|
+
};
|
|
139
|
+
/**
|
|
140
|
+
* Header lookup — elobb a primer header, aztan opcionalisan az Authorization Bearer.
|
|
141
|
+
* Az ures string is "hianyzo"-nak szamit (a Buffer.from('') es timingSafeEqual
|
|
142
|
+
* konzisztencia miatt).
|
|
143
|
+
*/
|
|
144
|
+
extractKeyFromRequest(req) {
|
|
145
|
+
// Primer header
|
|
146
|
+
const primary = req.headers[this.headerName];
|
|
147
|
+
const primaryStr = Array.isArray(primary) ? primary[0] ?? '' : (typeof primary === 'string' ? primary : '');
|
|
148
|
+
if (primaryStr.length > 0) {
|
|
149
|
+
return primaryStr;
|
|
150
|
+
}
|
|
151
|
+
// Authorization Bearer fallback
|
|
152
|
+
if (this.allowAuthorizationBearer) {
|
|
153
|
+
const authHeader = req.headers['authorization'];
|
|
154
|
+
const authStr = Array.isArray(authHeader) ? authHeader[0] ?? '' : (typeof authHeader === 'string' ? authHeader : '');
|
|
155
|
+
if (authStr.toLowerCase().startsWith('bearer ')) {
|
|
156
|
+
const token = authStr.substring(7).trim();
|
|
157
|
+
if (token.length > 0) {
|
|
158
|
+
return token;
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
return null;
|
|
163
|
+
}
|
|
164
|
+
/**
|
|
165
|
+
* Timing-safe compare ket string kozott. Length-mismatch eseten egy dummy
|
|
166
|
+
* compare-rel azonos idot kenyszeritunk (a kulcs-hossz nem szivaroghat ki
|
|
167
|
+
* timing-attackal).
|
|
168
|
+
*
|
|
169
|
+
* crypto.timingSafeEqual KOTELEZOEN azonos Buffer-hosszt var — kulonbozo
|
|
170
|
+
* hosszra throw-ol, ezert vizsgaljuk elobb a length-et es csak utana
|
|
171
|
+
* compare-elunk.
|
|
172
|
+
*/
|
|
173
|
+
timingSafeEquals(a, b) {
|
|
174
|
+
const aBuf = Buffer.from(a, 'utf-8');
|
|
175
|
+
const bBuf = Buffer.from(b, 'utf-8');
|
|
176
|
+
if (aBuf.length !== bBuf.length) {
|
|
177
|
+
// Dummy compare ugyanazzal a string-gel: konstans ideju mukodest biztosit
|
|
178
|
+
// mielott visszaternenk false-szal — igy a length-mismatch nem szivaroghat ki.
|
|
179
|
+
crypto.timingSafeEqual(bBuf, bBuf);
|
|
180
|
+
return false;
|
|
181
|
+
}
|
|
182
|
+
return crypto.timingSafeEqual(aBuf, bBuf);
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* Test-only: visszaallitja a default config-ot, hogy a specfajlok ne szivarogjak
|
|
186
|
+
* at egymas state-jet. Production code NE hivja.
|
|
187
|
+
*/
|
|
188
|
+
_resetForTesting() {
|
|
189
|
+
this.envVarName = DEFAULT_ENV_VAR_NAME;
|
|
190
|
+
this.headerName = DEFAULT_HEADER_NAME;
|
|
191
|
+
this.allowAuthorizationBearer = DEFAULT_ALLOW_BEARER;
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
exports.DyNTS_AdminApiKey_AuthService = DyNTS_AdminApiKey_AuthService;
|
|
195
|
+
//# sourceMappingURL=admin-api-key.auth-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"admin-api-key.auth-service.js","sourceRoot":"","sources":["../../../src/_modules/admin-auth/admin-api-key.auth-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/_modules/admin-auth/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,6BAA6B,EAAE,MAAM,8BAA8B,CAAC;AAC7E,OAAO,EAAE,wBAAwB,EAAE,MAAM,0CAA0C,CAAC"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DyNTS_AdminApiKey_AuthService = void 0;
|
|
4
|
+
var admin_api_key_auth_service_1 = require("./admin-api-key.auth-service");
|
|
5
|
+
Object.defineProperty(exports, "DyNTS_AdminApiKey_AuthService", { enumerable: true, get: function () { return admin_api_key_auth_service_1.DyNTS_AdminApiKey_AuthService; } });
|
|
6
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/_modules/admin-auth/index.ts"],"names":[],"mappings":";;;AAAA,2EAA6E;AAApE,2IAAA,6BAA6B,OAAA"}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
import { DyNTS_SingletonServiceBase } from '../../_services/base/singleton.service-base';
|
|
2
|
+
/**
|
|
3
|
+
* File-based szerver log service — duplikalja a stdout/stderr-t per-session
|
|
4
|
+
* log fajl(ok)ba, miközben a console kimenet erintetlenul marad. Az
|
|
5
|
+
* in-memory ring buffer (`DyNTS_Logs_Service`) MELLETT mukodik, NEM
|
|
6
|
+
* helyette.
|
|
7
|
+
*
|
|
8
|
+
* Architecture:
|
|
9
|
+
* - `process.stdout.write` es `process.stderr.write` monkey-patch (NEM
|
|
10
|
+
* `console.*` — azt mar a `DyNTS_Logs_Service` patch-elheti)
|
|
11
|
+
* - Per-session fajl: `{logDir}/{prefix}YYYY-MM-DD_HH-MM-SS.log`
|
|
12
|
+
* - Sync `appendFileSync` iras — crash-safe, azonnali flush
|
|
13
|
+
* - Rotation: `maxFileSizeMb` atlepesenel uj session fajl
|
|
14
|
+
* - Retention: `maxFiles` (count) ES `retentionDays` (age) — ami elobb
|
|
15
|
+
* teljesul; install-kor + minden rotation utan futtatva
|
|
16
|
+
* - Silent failure: file IO hibak ELNYELODNEK (a file logger SOHASEM
|
|
17
|
+
* buktathatja el a szervert)
|
|
18
|
+
*
|
|
19
|
+
* Idempotens: tobbszori install() hivas no-op (a masodiktol).
|
|
20
|
+
*
|
|
21
|
+
* Hasznalat:
|
|
22
|
+
* DyNTS_global_settings.log_settings.file_log = { enabled: true, ... };
|
|
23
|
+
* DyNTS_FileLog_Service.getInstance().install(); // szerver startup
|
|
24
|
+
*/
|
|
25
|
+
export declare class DyNTS_FileLog_Service extends DyNTS_SingletonServiceBase {
|
|
26
|
+
static getInstance(): DyNTS_FileLog_Service;
|
|
27
|
+
private installed;
|
|
28
|
+
private activeLogDir;
|
|
29
|
+
private filenamePrefix;
|
|
30
|
+
private maxFileSizeBytes;
|
|
31
|
+
private maxFiles;
|
|
32
|
+
private retentionDays;
|
|
33
|
+
private stripAnsiEnabled;
|
|
34
|
+
private currentLogPath;
|
|
35
|
+
private currentLogSizeBytes;
|
|
36
|
+
private originalStdoutWrite;
|
|
37
|
+
private originalStderrWrite;
|
|
38
|
+
/**
|
|
39
|
+
* Telepiti a file logger-t a `DyNTS_global_settings.log_settings.file_log`
|
|
40
|
+
* config alapjan. Ha `enabled === false` vagy hianyzik a config → no-op.
|
|
41
|
+
*
|
|
42
|
+
* Idempotens — masodszori hivas no-op (akkor is, ha kozben a config
|
|
43
|
+
* valtozott; a service uj install-jara teardownFor Testing() + install()).
|
|
44
|
+
*/
|
|
45
|
+
install(): void;
|
|
46
|
+
/**
|
|
47
|
+
* Visszaadja az aktualis log fajl abszolut path-jat (csak akkor letezo,
|
|
48
|
+
* ha az install() sikeresen lefutott; egyebkent ures string).
|
|
49
|
+
*/
|
|
50
|
+
getCurrentLogPath(): string;
|
|
51
|
+
/**
|
|
52
|
+
* Telepitve van-e (csak akkor true, ha az enabled === true es a setup nem bukott).
|
|
53
|
+
*/
|
|
54
|
+
isInstalled(): boolean;
|
|
55
|
+
/**
|
|
56
|
+
* Test-only: visszallitja az eredeti stdout/stderr.write-okat, hogy a
|
|
57
|
+
* specfajlok egymas utan tisztán futhassanak. Production code NE hivja.
|
|
58
|
+
*/
|
|
59
|
+
_teardownForTesting(): void;
|
|
60
|
+
/**
|
|
61
|
+
* Session fajl nev: `{prefix}YYYY-MM-DD_HH-MM-SS_RANDOM.log`. Az RANDOM
|
|
62
|
+
* suffix biztositja a unique nevet ha ugyanazon a masodpercen tobb fajl jon letre
|
|
63
|
+
* (pl. rotation kozvetlenul install utan, vagy specfajlok gyors egymas utan).
|
|
64
|
+
*/
|
|
65
|
+
private buildSessionFilename;
|
|
66
|
+
/**
|
|
67
|
+
* Egyetlen stdout/stderr iras tee-zese az aktualis log fajlba.
|
|
68
|
+
* Hibakat csendben elnyeli — a file logger SOHASEM blokkolja a szervert.
|
|
69
|
+
* Size-trackeli az aktualis fajlt es szukseg szerint rotalja.
|
|
70
|
+
*/
|
|
71
|
+
private teeWrite;
|
|
72
|
+
/**
|
|
73
|
+
* Uj session fajl letrehozasa (az aktualis lezarodik). Retention cleanup-ot is
|
|
74
|
+
* vegrehajt, hogy a rotation termeszetesen tisztan tarttsa a log dir-t.
|
|
75
|
+
*/
|
|
76
|
+
private rotate;
|
|
77
|
+
/**
|
|
78
|
+
* Retention takaritas: ket szabaly ami ami elobb teljesul:
|
|
79
|
+
* 1) maxFiles — ha tobb mint N log fajl van, a legregebbieket torli
|
|
80
|
+
* 2) retentionDays — `retentionDays`-nel idosebb fajlokat torli
|
|
81
|
+
*
|
|
82
|
+
* Hibakat csendben elnyel. A torolt fajlokat es az okot NEM logoljuk, hogy
|
|
83
|
+
* ne kerüljön extra szennyezes a most induló session fajlba.
|
|
84
|
+
*/
|
|
85
|
+
private cleanupOldLogs;
|
|
86
|
+
}
|
|
87
|
+
//# sourceMappingURL=file-log.service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-log.service.d.ts","sourceRoot":"","sources":["../../../src/_modules/logs/file-log.service.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,0BAA0B,EAAE,MAAM,6CAA6C,CAAC;AAsBzF;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,qBAAsB,SAAQ,0BAA0B;IAEnE,MAAM,CAAC,WAAW,IAAI,qBAAqB;IAI3C,OAAO,CAAC,SAAS,CAAkB;IACnC,OAAO,CAAC,YAAY,CAAc;IAClC,OAAO,CAAC,cAAc,CAAmC;IACzD,OAAO,CAAC,gBAAgB,CAAkD;IAC1E,OAAO,CAAC,QAAQ,CAA6B;IAC7C,OAAO,CAAC,aAAa,CAAkC;IACvD,OAAO,CAAC,gBAAgB,CAA+B;IACvD,OAAO,CAAC,cAAc,CAAc;IACpC,OAAO,CAAC,mBAAmB,CAAa;IAExC,OAAO,CAAC,mBAAmB,CAA4C;IACvE,OAAO,CAAC,mBAAmB,CAA4C;IAGvE;;;;;;OAMG;IACH,OAAO,IAAI,IAAI;IAoEf;;;OAGG;IACH,iBAAiB,IAAI,MAAM;IAI3B;;OAEG;IACH,WAAW,IAAI,OAAO;IAItB;;;OAGG;IACH,mBAAmB,IAAI,IAAI;IAgB3B;;;;OAIG;IACH,OAAO,CAAC,oBAAoB;IAa5B;;;;OAIG;IACH,OAAO,CAAC,QAAQ;IAsBhB;;;OAGG;IACH,OAAO,CAAC,MAAM;IAWd;;;;;;;OAOG;IACH,OAAO,CAAC,cAAc;CAoCvB"}
|