@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.
- package/.dynamo/logs/cicd-pipeline/output.log +1618 -1541
- package/.dynamo/logs/cicd-pipeline/status.json +210 -208
- package/build/_modules/rate-limit/_models/rate-limit-config.interface.d.ts +8 -0
- package/build/_modules/rate-limit/_models/rate-limit-config.interface.d.ts.map +1 -1
- package/build/_modules/rate-limit/rate-limit.middleware.d.ts +15 -0
- package/build/_modules/rate-limit/rate-limit.middleware.d.ts.map +1 -1
- package/build/_modules/rate-limit/rate-limit.middleware.js +32 -4
- package/build/_modules/rate-limit/rate-limit.middleware.js.map +1 -1
- package/build/_modules/server/server-status/server-status.control-service.d.ts +30 -0
- package/build/_modules/server/server-status/server-status.control-service.d.ts.map +1 -1
- package/build/_modules/server/server-status/server-status.control-service.js +40 -0
- package/build/_modules/server/server-status/server-status.control-service.js.map +1 -1
- package/build/_modules/server/server-status/server-status.controller.d.ts.map +1 -1
- package/build/_modules/server/server-status/server-status.controller.js +13 -0
- package/build/_modules/server/server-status/server-status.controller.js.map +1 -1
- package/package.json +2 -2
- package/src/_modules/rate-limit/_models/rate-limit-config.interface.ts +9 -0
- package/src/_modules/rate-limit/rate-limit.middleware.spec.ts +53 -0
- package/src/_modules/rate-limit/rate-limit.middleware.ts +42 -9
- package/src/_modules/server/server-status/server-status.control-service.spec.ts +52 -0
- package/src/_modules/server/server-status/server-status.control-service.ts +60 -0
- 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,
|