@futdevpro/nts-dynamo 1.15.46 → 1.15.48

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 (22) hide show
  1. package/.dynamo/logs/cicd-pipeline/output.log +1618 -1541
  2. package/.dynamo/logs/cicd-pipeline/status.json +210 -208
  3. package/build/_modules/rate-limit/_models/rate-limit-config.interface.d.ts +8 -0
  4. package/build/_modules/rate-limit/_models/rate-limit-config.interface.d.ts.map +1 -1
  5. package/build/_modules/rate-limit/rate-limit.middleware.d.ts +15 -0
  6. package/build/_modules/rate-limit/rate-limit.middleware.d.ts.map +1 -1
  7. package/build/_modules/rate-limit/rate-limit.middleware.js +32 -4
  8. package/build/_modules/rate-limit/rate-limit.middleware.js.map +1 -1
  9. package/build/_modules/server/server-status/server-status.control-service.d.ts +30 -0
  10. package/build/_modules/server/server-status/server-status.control-service.d.ts.map +1 -1
  11. package/build/_modules/server/server-status/server-status.control-service.js +40 -0
  12. package/build/_modules/server/server-status/server-status.control-service.js.map +1 -1
  13. package/build/_modules/server/server-status/server-status.controller.d.ts.map +1 -1
  14. package/build/_modules/server/server-status/server-status.controller.js +13 -0
  15. package/build/_modules/server/server-status/server-status.controller.js.map +1 -1
  16. package/package.json +2 -2
  17. package/src/_modules/rate-limit/_models/rate-limit-config.interface.ts +9 -0
  18. package/src/_modules/rate-limit/rate-limit.middleware.spec.ts +53 -0
  19. package/src/_modules/rate-limit/rate-limit.middleware.ts +42 -9
  20. package/src/_modules/server/server-status/server-status.control-service.spec.ts +52 -0
  21. package/src/_modules/server/server-status/server-status.control-service.ts +60 -0
  22. package/src/_modules/server/server-status/server-status.controller.ts +16 -1
@@ -10,6 +10,7 @@ import {
10
10
  DyFM_Array
11
11
  } from '@futdevpro/fsm-dynamo';
12
12
  import { Subscription, timer } from 'rxjs';
13
+ import * as mongoose from 'mongoose';
13
14
 
14
15
  import { version as _serverVersion } from '../../../../package.json';
15
16
  import { DyNTS_SingletonService } from '../../../_services/base/singleton.service';
@@ -26,6 +27,23 @@ export interface DyNTS_ServerConnection {
26
27
  lastCheck?: Date,
27
28
  }
28
29
 
30
+ /**
31
+ * A readiness-probe ({@link DyNTS_ServerStatus_ControlService.checkDbReadiness}) eredménye.
32
+ * `ready=true` CSAK ha a DB-connection él (readyState=1) ÉS a valós ping round-trip sikerült.
33
+ */
34
+ export interface DyNTS_DbReadiness {
35
+ /** ready: a DB elérhető (readyState=1 + sikeres ping). Erre adjon az endpoint 200-at, különben 503-at. */
36
+ ready: boolean;
37
+ /** mongoose connection.readyState: 0=disconnected, 1=connected, 2=connecting, 3=disconnecting. */
38
+ dbReadyState: number;
39
+ /** Sikerült-e a valós DB ping round-trip (csak readyState=1-nél próbáljuk). */
40
+ dbPingOk: boolean;
41
+ /** A szerver uptime ms-ban. */
42
+ uptime: number;
43
+ /** A szerver verziója. */
44
+ serverVersion: string;
45
+ }
46
+
29
47
  export abstract class DyNTS_ServerStatus_ControlService<
30
48
  T_ServerStatus extends DyFM_ServerStatus,
31
49
  T_Error extends DyFM_Error,
@@ -157,6 +175,48 @@ export abstract class DyNTS_ServerStatus_ControlService<
157
175
  }
158
176
  }
159
177
 
178
+ /**
179
+ * A mongoose default-connection. Külön metódus = teszt-seam (spy-jal felülírható, hogy a
180
+ * {@link checkDbReadiness} DB nélkül is tesztelhető legyen).
181
+ */
182
+ protected getMongooseConnection(): mongoose.Connection {
183
+ return mongoose.connection;
184
+ }
185
+
186
+ /**
187
+ * Readiness-probe: a `/health` (liveness — "a process fut + kiszolgál") MELLETT a DB-elérhetőséget
188
+ * ellenőrzi. A readyState (mongoose driver-állapot) + egy valós `ping` round-trip → így a "connected
189
+ * de a DB nem válaszol" eset is kibukik. **Sosem dob** (a probe-nak determinisztikusan kell válaszolnia);
190
+ * hiba esetén `ready=false`. Az endpoint 503-at adjon, ha nem ready → az orchestrátor (k8s/docker/LB)
191
+ * ne irányítson forgalmat a DB-vesztett instance-ra.
192
+ */
193
+ async checkDbReadiness(): Promise<DyNTS_DbReadiness> {
194
+ let dbReadyState: number = 0;
195
+ let dbPingOk: boolean = false;
196
+
197
+ try {
198
+ const connection: mongoose.Connection = this.getMongooseConnection();
199
+ // readyState: 0=disconnected, 1=connected, 2=connecting, 3=disconnecting
200
+ dbReadyState = connection?.readyState ?? 0;
201
+
202
+ if (dbReadyState === 1) {
203
+ await connection.db?.admin().ping();
204
+ dbPingOk = true;
205
+ }
206
+ } catch (error) {
207
+ DyFM_Log.warn('(checkDbReadiness) DB readiness check failed', error);
208
+ dbPingOk = false;
209
+ }
210
+
211
+ return {
212
+ ready: dbReadyState === 1 && dbPingOk,
213
+ dbReadyState: dbReadyState,
214
+ dbPingOk: dbPingOk,
215
+ uptime: +new Date() - +this.up,
216
+ serverVersion: this.serverVersion,
217
+ };
218
+ }
219
+
160
220
  async getErrorStatistics(
161
221
  range: DyFM_RelativeDate,
162
222
  issuer: string
@@ -6,7 +6,7 @@ import { DyNTS_Errors_ControlService } from '../errors/errors.control-service';
6
6
  import { DyNTS_Controller } from '../../../_services/route/controller.service';
7
7
  import { DyNTS_Endpoint_Params } from '../../../_models/control-models/endpoint-params.control-model';
8
8
  import { DyNTS_global_settings } from '../../../_collections/global-settings.const';
9
- import { DyNTS_ServerStatus_ControlService } from './server-status.control-service';
9
+ import { DyNTS_DbReadiness, DyNTS_ServerStatus_ControlService } from './server-status.control-service';
10
10
  import { DyNTS_ServerStatusSnapshot_ControlService } from './server-status-snapshot.control-service';
11
11
 
12
12
 
@@ -93,6 +93,21 @@ export abstract class DyNTS_ServerStatus_Controller<
93
93
  ],
94
94
  }),
95
95
 
96
+ // Readiness-probe: a /health-tel (liveness) szemben a DB-elérhetőséget is ellenőrzi.
97
+ // Public (mint a /health) — orchestrátor/LB hívja; 503 ha a DB nem ready → no traffic.
98
+ new DyNTS_Endpoint_Params({
99
+ name: 'getServerReadiness',
100
+ type: DyFM_HttpCallType.get,
101
+ endpoint: '/readiness',
102
+ tasks: [
103
+ async (req: Request, res: Response, issuer: string): Promise<void> => {
104
+ const readiness: DyNTS_DbReadiness = await this.server_CS.checkDbReadiness();
105
+
106
+ res.status(readiness.ready ? 200 : 503).send(readiness);
107
+ },
108
+ ],
109
+ }),
110
+
96
111
  new DyNTS_Endpoint_Params({
97
112
  name: 'getServerStatusForClient',
98
113
  type: DyFM_HttpCallType.get,