@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.
Files changed (53) hide show
  1. package/_specifications/BACKLOG.md +4 -4
  2. package/build/_models/interfaces/global-log-settings.interface.d.ts +35 -0
  3. package/build/_models/interfaces/global-log-settings.interface.d.ts.map +1 -1
  4. package/build/_modules/admin-auth/_models/admin-api-key-config.interface.d.ts +32 -0
  5. package/build/_modules/admin-auth/_models/admin-api-key-config.interface.d.ts.map +1 -0
  6. package/build/_modules/admin-auth/_models/admin-api-key-config.interface.js +3 -0
  7. package/build/_modules/admin-auth/_models/admin-api-key-config.interface.js.map +1 -0
  8. package/build/_modules/admin-auth/admin-api-key.auth-service.d.ts +90 -0
  9. package/build/_modules/admin-auth/admin-api-key.auth-service.d.ts.map +1 -0
  10. package/build/_modules/admin-auth/admin-api-key.auth-service.js +195 -0
  11. package/build/_modules/admin-auth/admin-api-key.auth-service.js.map +1 -0
  12. package/build/_modules/admin-auth/index.d.ts +3 -0
  13. package/build/_modules/admin-auth/index.d.ts.map +1 -0
  14. package/build/_modules/admin-auth/index.js +6 -0
  15. package/build/_modules/admin-auth/index.js.map +1 -0
  16. package/build/_modules/logs/file-log.service.d.ts +87 -0
  17. package/build/_modules/logs/file-log.service.d.ts.map +1 -0
  18. package/build/_modules/logs/file-log.service.js +267 -0
  19. package/build/_modules/logs/file-log.service.js.map +1 -0
  20. package/build/_modules/logs/get-logs-routing-module.util.d.ts +19 -0
  21. package/build/_modules/logs/get-logs-routing-module.util.d.ts.map +1 -0
  22. package/build/_modules/logs/get-logs-routing-module.util.js +32 -0
  23. package/build/_modules/logs/get-logs-routing-module.util.js.map +1 -0
  24. package/build/_modules/logs/index.d.ts +5 -0
  25. package/build/_modules/logs/index.d.ts.map +1 -0
  26. package/build/_modules/logs/index.js +12 -0
  27. package/build/_modules/logs/index.js.map +1 -0
  28. package/build/_modules/logs/log-buffer.service.d.ts +38 -0
  29. package/build/_modules/logs/log-buffer.service.d.ts.map +1 -0
  30. package/build/_modules/logs/log-buffer.service.js +97 -0
  31. package/build/_modules/logs/log-buffer.service.js.map +1 -0
  32. package/build/_modules/logs/logs.controller.d.ts +27 -0
  33. package/build/_modules/logs/logs.controller.d.ts.map +1 -0
  34. package/build/_modules/logs/logs.controller.js +90 -0
  35. package/build/_modules/logs/logs.controller.js.map +1 -0
  36. package/build/_modules/logs/logs.service.d.ts +40 -0
  37. package/build/_modules/logs/logs.service.d.ts.map +1 -0
  38. package/build/_modules/logs/logs.service.js +97 -0
  39. package/build/_modules/logs/logs.service.js.map +1 -0
  40. package/package.json +1 -1
  41. package/pipeline.cicd.config.json +3 -1
  42. package/src/_models/interfaces/global-log-settings.interface.ts +36 -0
  43. package/src/_modules/admin-auth/_models/admin-api-key-config.interface.ts +33 -0
  44. package/src/_modules/admin-auth/admin-api-key.auth-service.spec.ts +200 -0
  45. package/src/_modules/admin-auth/admin-api-key.auth-service.ts +220 -0
  46. package/src/_modules/admin-auth/index.ts +2 -0
  47. package/src/_modules/logs/file-log.service.spec.ts +202 -0
  48. package/src/_modules/logs/file-log.service.ts +283 -0
  49. package/src/_modules/logs/get-logs-routing-module.util.ts +36 -0
  50. package/src/_modules/logs/index.ts +4 -0
  51. package/src/_modules/logs/log-buffer.service.ts +101 -0
  52. package/src/_modules/logs/logs.controller.ts +109 -0
  53. 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
+ }