@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
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import { Request, Response } from 'express';
|
|
2
|
+
|
|
3
|
+
import { DyFM_HttpCallType } from '@futdevpro/fsm-dynamo';
|
|
4
|
+
|
|
5
|
+
import { DyNTS_Controller } from '../../_services/route/controller.service';
|
|
6
|
+
import { DyNTS_Endpoint_Params } from '../../_models/control-models/endpoint-params.control-model';
|
|
7
|
+
import { DyNTS_global_settings } from '../../_collections/global-settings.const';
|
|
8
|
+
import { DyNTS_Logs_Service } from './logs.service';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Overseer-szintu log parameter tipus.
|
|
12
|
+
* Az authPreProcess opcionalis — ha megadod, a /get endpoint vedett lesz.
|
|
13
|
+
*/
|
|
14
|
+
export interface DyNTS_LogsController_Config {
|
|
15
|
+
/** Opcionalis auth preprocess. Ha nincs megadva → nyilt hozzaferes. */
|
|
16
|
+
authPreProcess?: (req: Request, res: Response) => Promise<void>;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* NTS Logs Controller — beepitett /logs/get endpoint a szerver logok lekeresehez.
|
|
21
|
+
*
|
|
22
|
+
* Hasznalat:
|
|
23
|
+
* DyNTS_getLogsRoutingModule() — auth nelkul
|
|
24
|
+
* DyNTS_getLogsRoutingModule({ authPreProcess: myAuth }) — auth-tal
|
|
25
|
+
*
|
|
26
|
+
* Ha a logs_endpoint.enabled === false, a controller 503-at dob.
|
|
27
|
+
*/
|
|
28
|
+
export class DyNTS_Logs_Controller extends DyNTS_Controller {
|
|
29
|
+
|
|
30
|
+
private static config: DyNTS_LogsController_Config = {};
|
|
31
|
+
|
|
32
|
+
static configure(config: DyNTS_LogsController_Config): void {
|
|
33
|
+
DyNTS_Logs_Controller.config = config;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
static getInstance(): DyNTS_Logs_Controller {
|
|
37
|
+
return DyNTS_Logs_Controller.getSingletonInstance();
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
private readonly logsService: DyNTS_Logs_Service = DyNTS_Logs_Service.getInstance();
|
|
41
|
+
|
|
42
|
+
setupEndpoints(): void {
|
|
43
|
+
const preProcesses: ((req: Request, res: Response) => Promise<void>)[] = [];
|
|
44
|
+
if (DyNTS_Logs_Controller.config.authPreProcess) {
|
|
45
|
+
preProcesses.push(DyNTS_Logs_Controller.config.authPreProcess);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
this.endpoints = [
|
|
49
|
+
// GET /get?tail=200 — utolso N sor a log bufferbol
|
|
50
|
+
new DyNTS_Endpoint_Params({
|
|
51
|
+
name: 'getLogs',
|
|
52
|
+
type: DyFM_HttpCallType.get,
|
|
53
|
+
endpoint: '/get',
|
|
54
|
+
preProcesses: preProcesses,
|
|
55
|
+
logRequest: false,
|
|
56
|
+
tasks: [
|
|
57
|
+
async (req: Request, res: Response): Promise<void> => {
|
|
58
|
+
// Ellenorzes: be van-e kapcsolva a logs endpoint
|
|
59
|
+
if (!DyNTS_global_settings.log_settings?.logs_endpoint?.enabled) {
|
|
60
|
+
res.status(503).send({
|
|
61
|
+
error: 'Logs endpoint is not enabled on this server.',
|
|
62
|
+
hint: 'Set DyNTS_global_settings.log_settings.logs_endpoint.enabled = true',
|
|
63
|
+
});
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
// Ellenorzes: install megtortent-e
|
|
68
|
+
if (!this.logsService.isInstalled()) {
|
|
69
|
+
res.status(503).send({
|
|
70
|
+
error: 'Log buffer is not installed. Call DyNTS_Logs_Service.getInstance().install() at server startup.',
|
|
71
|
+
});
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const tail: number = Math.min(parseInt(req.query.tail as string) || 200, 2000);
|
|
76
|
+
const lines: string[] = this.logsService.getLines(tail);
|
|
77
|
+
|
|
78
|
+
res.send({
|
|
79
|
+
totalBuffered: this.logsService.getLineCount(),
|
|
80
|
+
returned: lines.length,
|
|
81
|
+
lines: lines,
|
|
82
|
+
});
|
|
83
|
+
},
|
|
84
|
+
],
|
|
85
|
+
}),
|
|
86
|
+
|
|
87
|
+
// DELETE /clear — buffer uritese
|
|
88
|
+
new DyNTS_Endpoint_Params({
|
|
89
|
+
name: 'clearLogs',
|
|
90
|
+
type: DyFM_HttpCallType.delete,
|
|
91
|
+
endpoint: '/clear',
|
|
92
|
+
preProcesses: preProcesses,
|
|
93
|
+
logRequest: false,
|
|
94
|
+
tasks: [
|
|
95
|
+
async (req: Request, res: Response): Promise<void> => {
|
|
96
|
+
if (!DyNTS_global_settings.log_settings?.logs_endpoint?.enabled) {
|
|
97
|
+
res.status(503).send({ error: 'Logs endpoint is not enabled.' });
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
const count: number = this.logsService.getLineCount();
|
|
102
|
+
this.logsService.clear();
|
|
103
|
+
res.send({ result: 'Log buffer cleared', clearedLines: count });
|
|
104
|
+
},
|
|
105
|
+
],
|
|
106
|
+
}),
|
|
107
|
+
];
|
|
108
|
+
}
|
|
109
|
+
}
|
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
import { DyNTS_SingletonServiceBase } from '../../_services/base/singleton.service-base';
|
|
2
|
+
import { DyNTS_global_settings } from '../../_collections/global-settings.const';
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* In-memory ring buffer a szerver logokhoz.
|
|
6
|
+
* Interceptalja a console.log/error/warn kimeneteket es tarolja oket.
|
|
7
|
+
* Max entryszam a log_settings.logs_endpoint.maxEntries-bol jon (default: 2000).
|
|
8
|
+
*
|
|
9
|
+
* Hasznalat:
|
|
10
|
+
* DyNTS_Logs_Service.getInstance().install() — egyszer, szerver indulasakor
|
|
11
|
+
* DyNTS_Logs_Service.getInstance().getLines(200) — utolso N sor
|
|
12
|
+
*/
|
|
13
|
+
export class DyNTS_Logs_Service extends DyNTS_SingletonServiceBase {
|
|
14
|
+
|
|
15
|
+
static getInstance(): DyNTS_Logs_Service {
|
|
16
|
+
return DyNTS_Logs_Service.getSingletonInstance() as DyNTS_Logs_Service;
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
private readonly maxEntries: number;
|
|
20
|
+
private readonly buffer: string[] = [];
|
|
21
|
+
private installed: boolean = false;
|
|
22
|
+
|
|
23
|
+
protected constructor() {
|
|
24
|
+
super();
|
|
25
|
+
this.maxEntries = DyNTS_global_settings.log_settings?.logs_endpoint?.maxEntries ?? 2000;
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Interceptalja a console.log/error/warn kimeneteket es a bufferbe irja.
|
|
30
|
+
* Egyszer kell hivni, a szerver indulasakor. Tobbszori hivas no-op.
|
|
31
|
+
*/
|
|
32
|
+
install(): void {
|
|
33
|
+
if (this.installed) { return; }
|
|
34
|
+
this.installed = true;
|
|
35
|
+
|
|
36
|
+
const originalLog: typeof console.log = console.log.bind(console);
|
|
37
|
+
const originalError: typeof console.error = console.error.bind(console);
|
|
38
|
+
const originalWarn: typeof console.warn = console.warn.bind(console);
|
|
39
|
+
|
|
40
|
+
const self: DyNTS_Logs_Service = this;
|
|
41
|
+
|
|
42
|
+
console.log = (...args: any[]): void => {
|
|
43
|
+
self.addLine('LOG', args);
|
|
44
|
+
originalLog(...args);
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
console.error = (...args: any[]): void => {
|
|
48
|
+
self.addLine('ERR', args);
|
|
49
|
+
originalError(...args);
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
console.warn = (...args: any[]): void => {
|
|
53
|
+
self.addLine('WRN', args);
|
|
54
|
+
originalWarn(...args);
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Az utolso N sor lekerdezese.
|
|
60
|
+
*/
|
|
61
|
+
getLines(count: number = 200): string[] {
|
|
62
|
+
const start: number = Math.max(0, this.buffer.length - count);
|
|
63
|
+
return this.buffer.slice(start);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
/**
|
|
67
|
+
* Osszes bufferelt sor szama.
|
|
68
|
+
*/
|
|
69
|
+
getLineCount(): number {
|
|
70
|
+
return this.buffer.length;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Buffer uritese.
|
|
75
|
+
*/
|
|
76
|
+
clear(): void {
|
|
77
|
+
this.buffer.length = 0;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
/**
|
|
81
|
+
* Telepitve van-e mar a console intercept.
|
|
82
|
+
*/
|
|
83
|
+
isInstalled(): boolean {
|
|
84
|
+
return this.installed;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
private addLine(level: string, args: any[]): void {
|
|
88
|
+
const message: string = args.map((arg: any) => {
|
|
89
|
+
if (typeof arg === 'string') { return arg; }
|
|
90
|
+
try { return JSON.stringify(arg); } catch { return String(arg); }
|
|
91
|
+
}).join(' ');
|
|
92
|
+
|
|
93
|
+
const timestamped: string = `${new Date().toISOString()} [${level}] ${message}`;
|
|
94
|
+
this.buffer.push(timestamped);
|
|
95
|
+
|
|
96
|
+
if (this.buffer.length > this.maxEntries) {
|
|
97
|
+
this.buffer.shift();
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|