@futdevpro/nts-dynamo 1.10.10 → 1.10.12

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 (91) hide show
  1. package/build/_collections/global-settings.const.d.ts.map +1 -1
  2. package/build/_collections/global-settings.const.js +1 -0
  3. package/build/_collections/global-settings.const.js.map +1 -1
  4. package/build/_models/control-models/api-call-params.control-model.d.ts.map +1 -1
  5. package/build/_models/control-models/api-call-params.control-model.js +1 -2
  6. package/build/_models/control-models/api-call-params.control-model.js.map +1 -1
  7. package/build/_models/control-models/app-params.control-model.d.ts.map +1 -1
  8. package/build/_models/control-models/app-params.control-model.js +6 -1
  9. package/build/_models/control-models/app-params.control-model.js.map +1 -1
  10. package/build/_models/control-models/endpoint-params.control-model.d.ts.map +1 -1
  11. package/build/_models/control-models/endpoint-params.control-model.js +1 -2
  12. package/build/_models/control-models/endpoint-params.control-model.js.map +1 -1
  13. package/build/_models/interfaces/global-settings.interface.d.ts +4 -0
  14. package/build/_models/interfaces/global-settings.interface.d.ts.map +1 -1
  15. package/build/_modules/mock/data-model.mock.spec.js +2 -2
  16. package/build/_modules/mock/data-model.mock.spec.js.map +1 -1
  17. package/build/_modules/server/error/error.controller.d.ts +36 -0
  18. package/build/_modules/server/error/error.controller.d.ts.map +1 -0
  19. package/build/_modules/server/error/error.controller.js +178 -0
  20. package/build/_modules/server/error/error.controller.js.map +1 -0
  21. package/build/_modules/server/error/error.data-service.d.ts +13 -0
  22. package/build/_modules/server/error/error.data-service.d.ts.map +1 -0
  23. package/build/_modules/server/error/error.data-service.js +249 -0
  24. package/build/_modules/server/error/error.data-service.js.map +1 -0
  25. package/build/_modules/server/index.d.ts +5 -0
  26. package/build/_modules/server/index.d.ts.map +1 -0
  27. package/build/_modules/server/index.js +10 -0
  28. package/build/_modules/server/index.js.map +1 -0
  29. package/build/_modules/server/server-status/server-status.control-service.d.ts +24 -0
  30. package/build/_modules/server/server-status/server-status.control-service.d.ts.map +1 -0
  31. package/build/_modules/server/server-status/server-status.control-service.js +102 -0
  32. package/build/_modules/server/server-status/server-status.control-service.js.map +1 -0
  33. package/build/_modules/server/server-status/server-status.controller.d.ts +23 -0
  34. package/build/_modules/server/server-status/server-status.controller.d.ts.map +1 -0
  35. package/build/_modules/server/server-status/server-status.controller.js +74 -0
  36. package/build/_modules/server/server-status/server-status.controller.js.map +1 -0
  37. package/build/_modules/socket/_services/socket-server.service.d.ts.map +1 -1
  38. package/build/_modules/socket/_services/socket-server.service.js.map +1 -1
  39. package/build/_modules/socket/index.d.ts +1 -0
  40. package/build/_modules/socket/index.d.ts.map +1 -1
  41. package/build/_modules/socket/index.js +1 -0
  42. package/build/_modules/socket/index.js.map +1 -1
  43. package/build/_services/base/data.service.d.ts +1 -0
  44. package/build/_services/base/data.service.d.ts.map +1 -1
  45. package/build/_services/base/data.service.js +15 -0
  46. package/build/_services/base/data.service.js.map +1 -1
  47. package/build/_services/base/db.service.d.ts +1 -0
  48. package/build/_services/base/db.service.d.ts.map +1 -1
  49. package/build/_services/base/db.service.js +13 -0
  50. package/build/_services/base/db.service.js.map +1 -1
  51. package/build/_services/core/global.service.d.ts.map +1 -1
  52. package/build/_services/core/global.service.js +8 -2
  53. package/build/_services/core/global.service.js.map +1 -1
  54. package/build/_services/server/app.server.d.ts.map +1 -1
  55. package/build/_services/server/app.server.js +6 -1
  56. package/build/_services/server/app.server.js.map +1 -1
  57. package/build/index.d.ts +0 -1
  58. package/build/index.d.ts.map +1 -1
  59. package/build/index.js +0 -1
  60. package/build/index.js.map +1 -1
  61. package/nodemon.json +2 -0
  62. package/package.json +11 -4
  63. package/src/_collections/global-settings.const.ts +1 -0
  64. package/src/_models/control-models/api-call-params.control-model.ts +2 -3
  65. package/src/_models/control-models/app-params.control-model.ts +9 -1
  66. package/src/_models/control-models/endpoint-params.control-model.ts +3 -3
  67. package/src/_models/interfaces/global-settings.interface.ts +5 -0
  68. package/src/_modules/mock/data-model.mock.spec.ts +2 -2
  69. package/src/_modules/server/error/error.controller.ts +233 -0
  70. package/src/_modules/server/error/error.data-service.ts +337 -0
  71. package/src/_modules/server/index.ts +11 -0
  72. package/src/_modules/server/server-status/server-status.control-service.ts +217 -0
  73. package/src/_modules/server/server-status/server-status.controller.ts +105 -0
  74. package/src/_modules/socket/_services/socket-server.service.ts +0 -1
  75. package/src/_modules/socket/index.ts +1 -1
  76. package/src/_services/base/data.service.ts +18 -0
  77. package/src/_services/base/db.service.ts +19 -0
  78. package/src/_services/core/global.service.ts +12 -5
  79. package/src/_services/server/app.server.ts +8 -4
  80. package/src/index.ts +0 -1
  81. package/tsconfig.json +1 -1
  82. package/build/_collections/stack.util.d.ts +0 -7
  83. package/build/_collections/stack.util.d.ts.map +0 -1
  84. package/build/_collections/stack.util.js +0 -31
  85. package/build/_collections/stack.util.js.map +0 -1
  86. package/build/_collections/stack.util.test.d.ts +0 -2
  87. package/build/_collections/stack.util.test.d.ts.map +0 -1
  88. package/build/_collections/stack.util.test.js +0 -96
  89. package/build/_collections/stack.util.test.js.map +0 -1
  90. package/src/_collections/stack.util.test.ts +0 -111
  91. package/src/_collections/stack.util.ts +0 -33
@@ -0,0 +1,337 @@
1
+
2
+
3
+
4
+
5
+ import { DyNTS_global_settings } from '../../../_collections/global-settings.const';
6
+ import { DyNTS_DBUpdate } from '../../../_models/types/db-update.type';
7
+ import { DyNTS_DataService } from '../../../_services/base/data.service';
8
+
9
+ import {
10
+ DyFM_AnyError,
11
+ DyFM_DBFilter,
12
+ DyFM_DataModel_Params, DyFM_Error, DyFM_ErrorLevel, DyFM_Error_Settings,
13
+ DyFM_Log, DyFM_Shared, DyFM_clone, DyFM_errorFlag, DyFM_Errors
14
+ } from '@futdevpro/fsm-dynamo';
15
+
16
+
17
+ export class DyNTS_Error_DataService<
18
+ T_Error extends DyFM_Errors
19
+ > extends DyNTS_DataService<T_Error> {
20
+
21
+ debugLog: boolean = false;
22
+ readonly version: string = DyNTS_global_settings.systemVersion;
23
+ protected duplicationCounter: number;
24
+
25
+ /* constructor(
26
+ set: {
27
+ data?: T_Error,
28
+ issuer: string,
29
+ },
30
+ dataParams: DyFM_DataModel_Params<T_Error>
31
+ ) {
32
+ super(
33
+ new FDP_Error(set?.data) as T_Error,
34
+ dataParams,
35
+ set.issuer
36
+ );
37
+ } */
38
+
39
+ async recordError(data?: T_Error, alwaysRecord?: boolean): Promise<void> {
40
+ try {
41
+ if (
42
+ !alwaysRecord &&
43
+ this.data?.version?.includes('dev') ||
44
+ this.data?.version?.includes('alpha') ||
45
+ this.data?.version?.includes('beta')
46
+ ) {
47
+ DyFM_Log.warn('error not saved (dev version)');
48
+
49
+ return;
50
+ }
51
+
52
+ if (!data && this.data) {
53
+ data = this.data;
54
+ }
55
+
56
+ if (!data) {
57
+ throw new DyFM_Error({
58
+ ...this.getDefaultErrorSettings(
59
+ 'recordError',
60
+ new Error('error data is not defined')
61
+ ),
62
+
63
+ errorCode: `${DyNTS_global_settings.systemShortCodeName}|FDPNTS-EDS-RE1`,
64
+ });
65
+ }
66
+
67
+ if ([ DyFM_ErrorLevel.user ].includes(data.level)) {
68
+ DyFM_Log.warn('error not saved (user level)');
69
+
70
+ return;
71
+ }
72
+
73
+ if (data.message?.includes('NullReferenceException')) {
74
+ data.message += '\n' + data.exception.split('() (at <')[0];
75
+ }
76
+
77
+ const duplicateError: T_Error = await this.findData({
78
+ version: data.version,
79
+ message: data.message,
80
+ } as DyFM_DBFilter<T_Error>, true);
81
+
82
+ data.d_error = this.checkErrorIsStringifyableOrResolvable(data.d_error) as DyFM_Error;
83
+
84
+ try {
85
+ JSON.stringify(data);
86
+ } catch (err) {
87
+ DyFM_Log.error('error data is not stringifyable!');
88
+
89
+ return;
90
+ }
91
+
92
+ if (JSON.stringify(data).length > 16793000) {
93
+ data.additionalContent = {
94
+ message: 'error data was too big to save, removed additionalContent',
95
+ };
96
+ data.error.additionalContent = {
97
+ message: 'error data was too big to save, removed additionalContent',
98
+ };
99
+
100
+ if (JSON.stringify(data).length > 16793000) {
101
+ data.error.errors = [];
102
+ }
103
+ }
104
+
105
+ if (
106
+ duplicateError &&
107
+ duplicateError?.message === data?.message
108
+ ) {
109
+ if (!data.__created) {
110
+ data.__created = new Date();
111
+ }
112
+
113
+ this.duplicationCounter = duplicateError.count + 1;
114
+
115
+ await this.updateData({
116
+ filterBy: { _id: duplicateError._id } as DyFM_DBFilter<T_Error>,
117
+ update: {
118
+ $inc: { count: 1, priority: this.getPriorityMultiplierByLevel(data?.level) },
119
+ } as DyNTS_DBUpdate<T_Error>,
120
+ });
121
+
122
+ // ezt majd ha leülepedett, hogy biztos nem kellenek a deep duplication-ök
123
+ // (a WB-ban kellhettek a user és pc config info-k)
124
+ /* if (!duplicateError.duplications.includes(data.stackTrace)) {
125
+ await this.updateData({
126
+ filterBy: { _id: duplicateError._id } as DyFM_DBFilter<Error_T>,
127
+ update: {
128
+ $push: { duplications: DyFM_clone(data) },
129
+ } as DyNTS_DBUpdate<Error_T>,
130
+ }).catch((pushError) => {
131
+ DyFM_Log.error('pushError:', pushError);
132
+ });
133
+ } */
134
+
135
+ DyFM_Log.error(
136
+ 'error found, not saving ("known" error), but increased count, ' +
137
+ '\ncount:', duplicateError.count + 1
138
+ );
139
+ DyFM_Log.error(
140
+ 'ErrorMsg:', data?.message?.replace(/\n/g, ' \n')
141
+ );
142
+
143
+ if (this.debugLog) DyFM_Log.error('Error:', data);
144
+ } else {
145
+ DyFM_Log.log('error not found, saving....');
146
+ DyFM_Log.error(
147
+ 'ErrorMsg:', data?.message?.replace(/\n/g, ' \n')
148
+ );
149
+
150
+ if (this.debugLog) DyFM_Log.error('Error:', data);
151
+
152
+ data.priority = this.getPriorityMultiplierByLevel(data?.level);
153
+ data.duplications.push(DyFM_clone(data));
154
+
155
+ this.duplicationCounter = 1;
156
+
157
+ await this.saveData();
158
+ DyFM_Log.warn('error saved');
159
+ }
160
+ } catch (error) {
161
+ DyFM_Log.error('recordError error:', error);
162
+ /* throw new DyFM_Error({
163
+ ...this.getDefaultErrorSettings(
164
+ 'recordError',
165
+ error
166
+ ),
167
+
168
+ errorCode: `${DyNTS_global_settings.systemShortCodeName}|FDPNTS-EDS-RE0`,
169
+ }); */
170
+ }
171
+ }
172
+
173
+ async preProcessWBError(): Promise<void> {
174
+ try {
175
+ const innerError = this.data?.error;
176
+
177
+ if (
178
+ innerError &&
179
+ !innerError?.message &&
180
+ !innerError?.userMessage &&
181
+ !innerError?.d_error?.message &&
182
+ !innerError?.d_error?.userMessage
183
+ ) {
184
+ delete this.data.error;
185
+ }
186
+
187
+ const innerDError: DyFM_Error = this.data?.d_error;
188
+
189
+ if (
190
+ innerDError &&
191
+ !innerDError?._message &&
192
+ !innerDError?.__userMessage &&
193
+ !innerDError?._errorCode
194
+ ) {
195
+ delete this.data.d_error;
196
+ }
197
+
198
+ } catch (error) {
199
+ throw new DyFM_Error({
200
+ ...this.getDefaultErrorSettings(
201
+ 'preProcessWBError',
202
+ error
203
+ ),
204
+
205
+ errorCode: `${DyNTS_global_settings.systemShortCodeName}|FDPNTS-EDS-PPE0`,
206
+ });
207
+ }
208
+ }
209
+
210
+ async handleInternalError(
211
+ error: DyFM_AnyError | any,
212
+ issuer: string,
213
+ alwaysRecord?: boolean,
214
+ ): Promise<void> {
215
+ try {
216
+ if (this.debugLog) DyFM_Log.log('handleInternalError');
217
+
218
+ if ((error as DyFM_Error)?.flag?.includes(DyFM_errorFlag)) {
219
+ this.data = new DyFM_Errors({
220
+ issuer: issuer,
221
+ version: 'SERVER-' + this.version,
222
+
223
+ source: 'INTERNAL-SERVER-ERROR: ' + (error as DyFM_Error)?.___issuerService,
224
+
225
+ stackTrace: (error as DyFM_Error)?._errorCodes,
226
+ error: (error as DyFM_Error)?.getErrorSimplified?.(),
227
+ level: (error as DyFM_Error)?.level ?? DyFM_ErrorLevel.error,
228
+
229
+ message: (error as DyFM_Error)?._message,
230
+ exceptionObj:
231
+ (error as DyFM_Error)?.errors?.map(
232
+ (e: DyFM_Error): DyFM_Error_Settings | '' => e?.getErrorSimplified?.() ?? ''
233
+ ),
234
+
235
+ additionalContent: (error as DyFM_Error)?.additionalContent,
236
+ }) as T_Error;
237
+ } else {
238
+ this.data = new DyFM_Errors({
239
+ issuer: issuer,
240
+ version: 'SERVER-' + this.version,
241
+
242
+ source: 'UNEXPECTED-SERVER-ERROR',
243
+
244
+ stackTrace: (error as Error)?.stack.split('\n'),
245
+ error: error,
246
+ level: DyFM_ErrorLevel.critical,
247
+
248
+ message: (error as Error)?.message,
249
+ exceptionObj: (error as Error)?.stack?.split('\n'),
250
+ }) as T_Error;
251
+ }
252
+
253
+ /* if (!(error as FDP_Error)?.flag?.includes('WB-ERROR-OBJECT')) {
254
+ DyFM_Log.H_error('__ERROR__:', error);
255
+ } */
256
+
257
+ await this.recordError(this.data, alwaysRecord);
258
+
259
+ if (
260
+ DyNTS_global_settings.log_settings.highDetailedLogs ||
261
+ !(error instanceof DyFM_Error)
262
+ ) {
263
+ DyFM_Log.H_error(
264
+ `FDPNTS_Error_DataService handling InternalError...`,
265
+ `\n ERROR:`, error
266
+ );
267
+ } else {
268
+ error.logSimple(
269
+ `FDPNTS_Error_DataService handling InternalError...`
270
+ );
271
+ }
272
+ } catch (error) {
273
+ DyFM_Log.error('handleInternalError error:', error);
274
+ /* throw new DyFM_Error({
275
+ ...this.getDefaultErrorSettings(
276
+ 'handleInternalError',
277
+ error
278
+ ),
279
+
280
+ errorCode: `${DyNTS_global_settings.systemShortCodeName}|FDPNTS-EDS-HIE0`,
281
+ }); */
282
+ }
283
+ }
284
+
285
+ private checkErrorIsStringifyableOrResolvable(error: DyFM_Error): DyFM_Error | 'UNRESOLVABLE' {
286
+ try {
287
+ JSON.stringify(error);
288
+ } catch (err) {
289
+ DyFM_Log.error('error data is not stringifyable! trying to resolve...');
290
+
291
+ error = DyFM_Shared.resolveCirculation(error) as DyFM_Error;
292
+
293
+ try {
294
+ JSON.stringify(error);
295
+ } catch (err) {
296
+ delete error.additionalContent;
297
+
298
+ try {
299
+ JSON.stringify(error);
300
+ } catch (err) {
301
+ DyFM_Log.error('error data is not stringifyable! resolution failed! will not save!');
302
+
303
+ return 'UNRESOLVABLE';
304
+ }
305
+
306
+ DyFM_Log.error('error data was too big to save, removed additionalContent');
307
+ }
308
+ }
309
+
310
+ return error;
311
+ }
312
+
313
+ private getPriorityMultiplierByLevel(level: DyFM_ErrorLevel): number {
314
+ switch (level) {
315
+ case DyFM_ErrorLevel.critical:
316
+ case DyFM_ErrorLevel.fatal:
317
+ return 1000;
318
+
319
+ case DyFM_ErrorLevel.error:
320
+ case DyFM_ErrorLevel.serious:
321
+ return 100;
322
+
323
+ case DyFM_ErrorLevel.warning:
324
+ return 10;
325
+
326
+ case DyFM_ErrorLevel.info:
327
+ case DyFM_ErrorLevel.debug:
328
+ case DyFM_ErrorLevel.known:
329
+ return 0.01;
330
+
331
+ case DyFM_ErrorLevel.user:
332
+ default:
333
+ return 0;
334
+ }
335
+ }
336
+
337
+ }
@@ -0,0 +1,11 @@
1
+
2
+ // ERROR
3
+ export * from './error/error.controller';
4
+ export * from './error/error.data-service';
5
+
6
+ // SERVER-STATUS
7
+ export * from './server-status/server-status.control-service';
8
+ export * from './server-status/server-status.controller';
9
+
10
+
11
+
@@ -0,0 +1,217 @@
1
+
2
+
3
+ import {
4
+ DyFM_Metadata, DyFM_RelativeDate, DyFM_Time, DyFM_ServerStatus, DyFM_ErrorLevel, DyFM_Log,
5
+ DyFM_Error, DyFM_Error_Statistics, DyFM_Errors
6
+ } from '@futdevpro/fsm-dynamo';
7
+
8
+ import { version as _serverVersion } from '../../../../package.json';
9
+ import { DyNTS_SingletonService } from '../../../_services/base/singleton.service';
10
+ import { DyNTS_DataService } from '../../../_services/base/data.service';
11
+ import { DyNTS_global_settings } from '../../../_collections/global-settings.const';
12
+ import { DyNTS_Error_DataService } from '../error/error.data-service';
13
+
14
+ export abstract class DyNTS_ServerStatus_ControlService<
15
+ T_Error extends DyFM_Errors,
16
+ T_ServerStatus extends DyFM_ServerStatus
17
+ > extends DyNTS_SingletonService {
18
+
19
+ /* static getInstance(): FDPNTS_ServerStatus_ControlService {
20
+ return FDPNTS_ServerStatus_ControlService.getSingletonInstance();
21
+ } */
22
+
23
+ /* protected constructor() {
24
+ super();
25
+
26
+ if (!this.getErrorDataService) {
27
+ throw new DyFM_Error({
28
+ message: 'getErrorDataService() method not implemented in ServerStatus_ControlService.',
29
+ status: 500,
30
+ errorCode: `${DyNTS_global_settings.systemShortCodeName}|FDPNTS-SSS-GED0',
31
+ });
32
+ }
33
+ } */
34
+
35
+ protected abstract getErrorDataService?(
36
+ set?: { data?: T_Error, issuer?: string }
37
+ ): DyNTS_Error_DataService<T_Error>;
38
+
39
+ /* protected abstract error_DS: FDPNTS_Error_DataService<T_Error>; */
40
+
41
+ protected readonly up: Date = new Date();
42
+
43
+ protected readonly _serverVersionNumeric: number = this.getVersionNumeric(_serverVersion);
44
+ get serverVersion(): string { return _serverVersion; }
45
+ get serverVersionNumeric(): number { return this._serverVersionNumeric; }
46
+
47
+ protected _latestClientVersion: string;
48
+ protected _latestClientVersionNumeric: number;
49
+ get latestClientVersion(): string { return this._latestClientVersion; }
50
+ get latestClientVersionNumeric(): number { return this._latestClientVersionNumeric; }
51
+
52
+ override readonly defaultErrorUserMsg = 'Something went wrong';
53
+
54
+ /* private readonly serverSnapshotOverseer */
55
+
56
+ getServerStatus(clientVersion?: string): DyFM_ServerStatus {
57
+ return {
58
+ status: 'ready',
59
+
60
+ clientVersionOk: clientVersion ? this.clientVersionIsLatest(clientVersion) : false,
61
+ latestClientVersion: this.latestClientVersion,
62
+ latestClientVersionNumeric: this.latestClientVersionNumeric,
63
+
64
+ serverVersion: this.serverVersion,
65
+ serverNumericVersion: this.serverVersionNumeric,
66
+
67
+ uptime: +new Date() - +this.up,
68
+
69
+ memoryUsage: process.memoryUsage(),
70
+ cpuUsage: process.cpuUsage(),
71
+ }
72
+ }
73
+
74
+ async getErrorStatistics(
75
+ range: DyFM_RelativeDate,
76
+ issuer: string
77
+ ): Promise<DyFM_Error_Statistics> {
78
+ try {
79
+ const error_DS: DyNTS_Error_DataService<T_Error> =
80
+ this.getErrorDataService({ issuer: issuer });
81
+ /* new FDPNTS_Error_DataService({ issuer: issuer }); */
82
+
83
+ const from: Date = DyFM_Time.getDateByRelativeDate(range);
84
+ const errors: T_Error[] = await error_DS.findDataList({
85
+ __created: { $gte: from },
86
+ });
87
+
88
+ return {
89
+ range: range,
90
+
91
+ allErrors: errors.length,
92
+ allAllErrors: errors.reduce(
93
+ (sum: number, error: T_Error): number => sum + error.count,
94
+ 0
95
+ ),
96
+
97
+ serverErrors:
98
+ errors.filter(
99
+ (error: T_Error): boolean => error.source.includes('SERVER')
100
+ ).length,
101
+ clientErrors:
102
+ errors.filter(
103
+ (error: T_Error): boolean => !error.source.includes('SERVER')
104
+ ).length,
105
+ allServerErrors:
106
+ errors.filter(
107
+ (error: T_Error): boolean => error.source.includes('SERVER')
108
+ ).reduce(
109
+ (sum: number, error: T_Error): number => sum + error.count, 0
110
+ ),
111
+ allClientErrors:
112
+ errors.filter(
113
+ (error: T_Error): boolean => !error.source.includes('SERVER')
114
+ ).reduce(
115
+ (sum: number, error: T_Error): number => sum + error.count, 0
116
+ ),
117
+
118
+ infoErrors:
119
+ errors.filter(
120
+ (error: T_Error): boolean => error.level === DyFM_ErrorLevel.info
121
+ ).length,
122
+ warningErrors:
123
+ errors.filter(
124
+ (error: T_Error): boolean => error.level === DyFM_ErrorLevel.warning
125
+ ).length,
126
+ errorErrors:
127
+ errors.filter(
128
+ (error: T_Error): boolean => error.level === DyFM_ErrorLevel.error
129
+ ).length,
130
+ criticalErrors:
131
+ errors.filter(
132
+ (error: T_Error): boolean => error.level === DyFM_ErrorLevel.critical
133
+ ).length,
134
+
135
+ allInfoErrors:
136
+ errors.filter(
137
+ (error: T_Error): boolean => error.level === DyFM_ErrorLevel.info
138
+ ).reduce(
139
+ (sum: number, error: T_Error): number => sum + error.count, 0
140
+ ),
141
+ allWarningErrors:
142
+ errors.filter(
143
+ (error: T_Error): boolean => error.level === DyFM_ErrorLevel.warning
144
+ ).reduce(
145
+ (sum: number, error: T_Error): number => sum + error.count, 0
146
+ ),
147
+ allErrorErrors:
148
+ errors.filter(
149
+ (error: T_Error): boolean => error.level === DyFM_ErrorLevel.error
150
+ ).reduce(
151
+ (sum: number, error: T_Error): number => sum + error.count, 0
152
+ ),
153
+ allCriticalErrors:
154
+ errors.filter(
155
+ (error: T_Error): boolean => error.level === DyFM_ErrorLevel.critical
156
+ ).reduce(
157
+ (sum: number, error: T_Error): number => sum + error.count, 0
158
+ ),
159
+ } as DyFM_Error_Statistics;
160
+ } catch (error) {
161
+ throw new DyFM_Error({
162
+ ...this.getDefaultErrorSettings(
163
+ 'getMatchStatistics',
164
+ error?.response?.data ?? error,
165
+ issuer
166
+ ),
167
+
168
+ errorCode: `${DyNTS_global_settings.systemShortCodeName}|FDPNTS-SSS-GES0`,
169
+ });
170
+ }
171
+ }
172
+
173
+ protected getVersionNumeric(version: string): number {
174
+ return +version.replace('v', '')
175
+ .replace('.', '')
176
+ .replace('.', '')
177
+ .replace('-alpha', '')
178
+ .replace('-beta', '')
179
+ .replace('-test', '')
180
+ .replace('-dev', '');
181
+ }
182
+
183
+ protected clientVersionIsLatest(clientVersion: string): boolean {
184
+ const thisClientVersionNumeric: number = this.getVersionNumeric(clientVersion);
185
+
186
+ if (!this._latestClientVersionNumeric) {
187
+ this.setLatestClientVersion(clientVersion, thisClientVersionNumeric);
188
+
189
+ return true;
190
+
191
+ } else if (thisClientVersionNumeric === this._latestClientVersionNumeric) {
192
+ return true;
193
+
194
+ } else if (thisClientVersionNumeric < this._latestClientVersionNumeric) {
195
+ return false;
196
+
197
+ } else if (this._latestClientVersionNumeric < thisClientVersionNumeric) {
198
+ this.setLatestClientVersion(clientVersion, thisClientVersionNumeric);
199
+
200
+ return true;
201
+ }
202
+
203
+ DyFM_Log.error(
204
+ 'Something went wrong, invalid version:', clientVersion,
205
+ thisClientVersionNumeric, _serverVersion, this.serverVersionNumeric
206
+ );
207
+
208
+ return false;
209
+ }
210
+
211
+ protected setLatestClientVersion(clientVersion: string, clientVersionNumeric: number): void {
212
+ if (!clientVersion.includes('test') && !clientVersion.includes('dev')) {
213
+ this._latestClientVersion = clientVersion;
214
+ this._latestClientVersionNumeric = clientVersionNumeric;
215
+ }
216
+ }
217
+ }
@@ -0,0 +1,105 @@
1
+
2
+ import { Request, Response } from 'express';
3
+
4
+ import { DyFM_Error, DyFM_Errors, DyFM_HttpCallType, DyFM_RelativeDate, DyFM_ServerStatus } from '@futdevpro/fsm-dynamo';
5
+ import { DyNTS_ServerStatus_ControlService } from './server-status.control-service';
6
+ import { DyNTS_Controller } from '../../../_services/route/controller.service';
7
+ import { DyNTS_Endpoint_Params } from '../../../_models/control-models/endpoint-params.control-model';
8
+ import { DyNTS_global_settings } from '../../../_collections/global-settings.const';
9
+
10
+
11
+ /**
12
+ * Endpoints:
13
+ *
14
+ * getServerStatus
15
+ * GET /status
16
+ *
17
+ * getServerStatusForClient
18
+ * GET /status/:version
19
+ *
20
+ * getErrorStatistics
21
+ * GET /statistics/error/:range
22
+ *
23
+ */
24
+ export abstract class DyNTS_ServerStatus_Controller<
25
+ T_Error extends DyFM_Errors,
26
+ T_ServerStatus extends DyFM_ServerStatus,
27
+ T_ServerStatusService extends DyNTS_ServerStatus_ControlService<T_Error, T_ServerStatus>
28
+ > extends DyNTS_Controller {
29
+
30
+ /* static getInstance(): FDPNTS_ServerStatus_Controller {
31
+ return FDPNTS_ServerStatus_Controller.getSingletonInstance();
32
+ } */
33
+
34
+ protected abstract readonly server_CS: T_ServerStatusService;
35
+
36
+ /* protected abstract getServerService(): T_ServerStatusService; */
37
+ protected readonly additionalEndpoints: DyNTS_Endpoint_Params[] = [];
38
+
39
+ setupEndpoints(): void {
40
+ /* if (!this.getServerService) {
41
+ throw new DyFM_Error({
42
+ message: 'getServerService() method not implemented in ServerStatus_Controller.',
43
+ errorCode: `${DyNTS_global_settings.systemShortCodeName}|FDPNTS-SSC-001`,
44
+ });
45
+ } */
46
+
47
+ if (!this.additionalEndpoints) {
48
+ throw new DyFM_Error({
49
+ message: 'additionalEndpoints must be defined in ServerStatus_Controller.',
50
+ errorCode: `${DyNTS_global_settings.systemShortCodeName}|DyNTS-SSC-002`,
51
+ });
52
+ }
53
+
54
+ /* this.serverService = this.getServerService(); */
55
+
56
+ this.endpoints = [
57
+ new DyNTS_Endpoint_Params({
58
+ name: 'getServerStatus',
59
+ type: DyFM_HttpCallType.get,
60
+ endpoint: '/status',
61
+ tasks: [
62
+ async (req: Request, res: Response): Promise<void> => {
63
+ res.send(
64
+ this.server_CS.getServerStatus()
65
+ );
66
+ },
67
+ ],
68
+ }),
69
+
70
+ new DyNTS_Endpoint_Params({
71
+ name: 'getServerStatusForClient',
72
+ type: DyFM_HttpCallType.get,
73
+ endpoint: '/status/:version',
74
+ tasks: [
75
+ async (req: Request, res: Response): Promise<void> => {
76
+
77
+ res.send(
78
+ this.server_CS.getServerStatus(req.params.version)
79
+ );
80
+ },
81
+ ],
82
+ }),
83
+
84
+ new DyNTS_Endpoint_Params({
85
+ name: 'getErrorStatistics',
86
+ type: DyFM_HttpCallType.get,
87
+ endpoint: '/statistics/error/:range',
88
+ tasks: [
89
+ async (req: Request, res: Response, issuer: string) : Promise<void> => {
90
+
91
+ res.send(
92
+ await this.server_CS.getErrorStatistics(
93
+ req.params.range as DyFM_RelativeDate,
94
+ issuer
95
+ )
96
+ );
97
+ },
98
+ ],
99
+ }),
100
+
101
+ ...this.additionalEndpoints,
102
+ ];
103
+ }
104
+ }
105
+
@@ -20,7 +20,6 @@ import {
20
20
  import {
21
21
  DyNTS_SocketServerService_Params
22
22
  } from '../_models/socket-server-service-params.control-model';
23
- import { DyNTS_getStackLocation } from '../../../_collections/stack.util';
24
23
 
25
24
  /**
26
25
  * You need to define the following functions:
@@ -16,4 +16,4 @@ export * from './_services/socket-client.service';
16
16
  export * from './_services/socket-server.service';
17
17
  export * from './app-extended.server';
18
18
 
19
-
19
+ export * from '@futdevpro/fsm-dynamo/socket';