@futdevpro/nts-dynamo 1.9.33 → 1.9.34

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 (30) hide show
  1. package/build/_models/control-models/system-control.control-model.d.ts +1 -1
  2. package/build/_models/control-models/system-control.control-model.d.ts.map +1 -1
  3. package/build/_models/control-models/system-control.control-model.js +1 -1
  4. package/build/_models/control-models/system-control.control-model.js.map +1 -1
  5. package/build/_modules/socket/_services/app-extended.server.d.ts.map +1 -1
  6. package/build/_modules/socket/_services/app-extended.server.js +32 -30
  7. package/build/_modules/socket/_services/app-extended.server.js.map +1 -1
  8. package/build/_modules/socket/_services/app-extended.server.spec.js +51 -14
  9. package/build/_modules/socket/_services/app-extended.server.spec.js.map +1 -1
  10. package/build/_services/core/email.service.d.ts.map +1 -1
  11. package/build/_services/core/email.service.js +6 -9
  12. package/build/_services/core/email.service.js.map +1 -1
  13. package/build/_services/core/global.service.d.ts +14 -4
  14. package/build/_services/core/global.service.d.ts.map +1 -1
  15. package/build/_services/core/global.service.js +72 -15
  16. package/build/_services/core/global.service.js.map +1 -1
  17. package/build/_services/server/app.server.d.ts +2 -0
  18. package/build/_services/server/app.server.d.ts.map +1 -1
  19. package/build/_services/server/app.server.js +63 -59
  20. package/build/_services/server/app.server.js.map +1 -1
  21. package/build/_services/server/app.server.spec.js +21 -6
  22. package/build/_services/server/app.server.spec.js.map +1 -1
  23. package/package.json +1 -1
  24. package/src/_models/control-models/system-control.control-model.ts +1 -1
  25. package/src/_modules/socket/_services/app-extended.server.spec.ts +59 -20
  26. package/src/_modules/socket/_services/app-extended.server.ts +48 -42
  27. package/src/_services/core/email.service.ts +12 -14
  28. package/src/_services/core/global.service.ts +43 -22
  29. package/src/_services/server/app.server.spec.ts +26 -7
  30. package/src/_services/server/app.server.ts +103 -144
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@futdevpro/nts-dynamo",
3
- "version": "01.09.33",
3
+ "version": "01.09.34",
4
4
  "description": "Dynamic NodeTS (NodeJS-Typescript), MongoDB Backend System Framework by Future Development Program Ltd.",
5
5
  "scripts": {
6
6
  "prep": "npm i rimraf nodemon -g",
@@ -5,7 +5,7 @@ export class DyNTS_SystemControl {
5
5
  init: boolean = false;
6
6
  started: boolean = false;
7
7
 
8
- getReady(): boolean {
8
+ getIsReady(): boolean {
9
9
  return this.init ? this.started : true;
10
10
  }
11
11
  }
@@ -1,4 +1,4 @@
1
- import { DyFM_delay } from '@futdevpro/fsm-dynamo';
1
+ import { DyFM_delay, DyFM_Error, DyFM_Log } from '@futdevpro/fsm-dynamo';
2
2
  import {
3
3
  DyNTS_AppExtendedBase_Mock, DyNTS_AppExtendedFull_Mock, DyNTS_AppWbMock_Mock
4
4
  } from '../../mock/app-extended-server.mock';
@@ -8,17 +8,29 @@ describe('DyNTS_AppExtended;', (): void => {
8
8
  let app: DyNTS_AppExtendedBase_Mock;
9
9
 
10
10
  beforeEach(async (): Promise<void> => {
11
- app = new DyNTS_AppExtendedBase_Mock();
11
+ try {
12
+ app = new DyNTS_AppExtendedBase_Mock();
12
13
 
13
- await DyFM_delay(100);
14
-
15
- await app.ready();
14
+ await DyFM_delay(100);
15
+
16
+ await app.ready();
17
+
18
+ await DyFM_delay(100);
19
+ } catch (error) {
20
+ DyFM_Log.test('test beforeEach error:', (error as DyFM_Error)?._message);
21
+ }
16
22
  });
17
23
 
18
24
  afterEach(async (): Promise<void> => {
19
- await app.stop();
20
-
21
- await DyFM_delay(100);
25
+ try {
26
+ await DyFM_delay(100);
27
+
28
+ await app.stop();
29
+
30
+ app = null;
31
+ } catch (error) {
32
+ DyFM_Log.test('test afterEach error:', (error as DyFM_Error)?._message);
33
+ }
22
34
  });
23
35
 
24
36
  it('should be created', (): void => {
@@ -34,17 +46,29 @@ describe('DyNTS_AppExtended;', (): void => {
34
46
  let app: DyNTS_AppExtendedFull_Mock;
35
47
 
36
48
  beforeEach(async (): Promise<void> => {
37
- app = new DyNTS_AppExtendedFull_Mock();
49
+ try {
50
+ app = new DyNTS_AppExtendedFull_Mock();
38
51
 
39
- await DyFM_delay(100);
40
-
41
- await app.ready();
52
+ await DyFM_delay(100);
53
+
54
+ await app.ready();
55
+
56
+ await DyFM_delay(100);
57
+ } catch (error) {
58
+ DyFM_Log.test('test beforeEach error:', (error as DyFM_Error)?._message);
59
+ }
42
60
  });
43
61
 
44
62
  afterEach(async (): Promise<void> => {
45
- await app.stop();
46
-
47
- await DyFM_delay(100);
63
+ try {
64
+ await DyFM_delay(100);
65
+
66
+ await app.stop();
67
+
68
+ app = null;
69
+ } catch (error) {
70
+ DyFM_Log.test('test afterEach error:', (error as DyFM_Error)?._message);
71
+ }
48
72
  });
49
73
 
50
74
  it('should be created', (): void => {
@@ -60,14 +84,29 @@ describe('DyNTS_AppExtended;', (): void => {
60
84
  let app: DyNTS_AppWbMock_Mock;
61
85
 
62
86
  beforeEach(async (): Promise<void> => {
63
- app = new DyNTS_AppWbMock_Mock();
64
- await app.ready();
87
+ try {
88
+ app = new DyNTS_AppWbMock_Mock();
89
+
90
+ await DyFM_delay(100);
91
+
92
+ await app.ready();
93
+
94
+ await DyFM_delay(100);
95
+ } catch (error) {
96
+ DyFM_Log.test('test beforeEach error:', (error as DyFM_Error)?._message);
97
+ }
65
98
  });
66
99
 
67
100
  afterEach(async (): Promise<void> => {
68
- await app.stop();
69
-
70
- await DyFM_delay(100);
101
+ try {
102
+ await DyFM_delay(100);
103
+
104
+ await app.stop();
105
+
106
+ app = null;
107
+ } catch (error) {
108
+ DyFM_Log.test('test afterEach error:', (error as DyFM_Error)?._message);
109
+ }
71
110
  });
72
111
 
73
112
  it('should be created', (): void => {
@@ -191,7 +191,7 @@ export abstract class DyNTS_AppExtended extends DyNTS_App {
191
191
  console.log(this.params.title);
192
192
  console.log(`Version: ${this.params.version}`);
193
193
  }
194
- DyFM_Log.H_success(`${this.params.name} started successfully.`);
194
+ DyFM_Log.H_success(`"${this.params.name}" started successfully.`);
195
195
 
196
196
  } catch (error) {
197
197
  if (
@@ -216,20 +216,20 @@ export abstract class DyNTS_AppExtended extends DyNTS_App {
216
216
  systemControls: this.systemControls,
217
217
  systemControlsExt: this.systemControlsExt,
218
218
  systemReadies: {
219
- app: this.systemControls.app.getReady(),
220
- appExtended: this.systemControlsExt.appExtended.getReady(),
221
- mongoose: this.systemControls.mongoose.getReady(),
222
- httpServer: this.systemControls.httpServer.getReady(),
223
- httpsServer: this.systemControls.httpsServer.getReady(),
224
- httpSocketServer: this.systemControlsExt.httpSocketServer.getReady(),
225
- httpsSocketServer: this.systemControlsExt.httpsSocketServer.getReady(),
219
+ app: this.systemControls.app.getIsReady(),
220
+ appExtended: this.systemControlsExt.appExtended.getIsReady(),
221
+ mongoose: this.systemControls.mongoose.getIsReady(),
222
+ httpServer: this.systemControls.httpServer.getIsReady(),
223
+ httpsServer: this.systemControls.httpsServer.getIsReady(),
224
+ httpSocketServer: this.systemControlsExt.httpSocketServer.getIsReady(),
225
+ httpsSocketServer: this.systemControlsExt.httpsSocketServer.getIsReady(),
226
226
  },
227
227
  },
228
228
  });
229
229
  }
230
230
  }
231
231
 
232
- override async ready(timeout: number = 4 * second): Promise<void> {
232
+ override async ready(timeout: number = this.defaultReadyTimeout): Promise<void> {
233
233
  if (this.fnLogs) console.log('\nfn:. ready-extended');
234
234
 
235
235
  try {
@@ -239,17 +239,21 @@ export abstract class DyNTS_AppExtended extends DyNTS_App {
239
239
  const start: number = +new Date();
240
240
 
241
241
  if (this.constructErrors.length) {
242
- DyFM_Log.H_error(
243
- `Extended Application: ${this.params?.name} start failed. (ready constructErrors check)`,
244
- `\n construct ERRORS:\n`,
245
- this.constructErrors.map((error: any): any => {
246
- if (error instanceof DyFM_Error) {
247
- return error.getErrorSimplified();
248
- } else {
249
- return error;
250
- }
251
- }),
252
- );
242
+ if (this.deepLog) {
243
+ if (DyNTS_global_settings.log_settings.highDetailedLogs) {
244
+ DyFM_Log.H_error(
245
+ `Extended Application: "${this.params.name}" start failed. ` +
246
+ `(ready; constructErrors check +1)`,
247
+ `\n construct ERRORS:`, this.constructErrors
248
+ );
249
+ } else {
250
+ DyFM_Log.H_error(
251
+ `Extended Application: "${this.params.name}" start failed. ` +
252
+ `(ready; constructErrors check +1)`,
253
+ `\n construct ERRORS:`, this.getSimplifiedConstructErrors(),
254
+ );
255
+ }
256
+ }
253
257
 
254
258
  throw new DyFM_Error({
255
259
  message: `${this.params?.name} start failed.`,
@@ -262,11 +266,11 @@ export abstract class DyNTS_AppExtended extends DyNTS_App {
262
266
  if (this.systemControlsExt.appExtended.init) {
263
267
  ready = (
264
268
  this.superStarted &&
265
- this.systemControlsExt.httpSocketServer.getReady() &&
266
- this.systemControlsExt.httpsSocketServer.getReady()
269
+ this.systemControlsExt.httpSocketServer.getIsReady() &&
270
+ this.systemControlsExt.httpsSocketServer.getIsReady()
267
271
  );
268
272
  } else {
269
- DyFM_Log.error(`${this.params.name} APP NOT INITIALIZED while trying to get ready.`);
273
+ DyFM_Log.error(`"${this.params.name}" APP NOT INITIALIZED while trying to get ready.`);
270
274
  }
271
275
 
272
276
  if (!ready) {
@@ -275,17 +279,19 @@ export abstract class DyNTS_AppExtended extends DyNTS_App {
275
279
  }
276
280
 
277
281
  if (this.constructErrors.length) {
278
- DyFM_Log.H_error(
279
- `Extended Application: ${this.params?.name} start failed. (ready TIMEOUT check)`,
280
- `\n construct ERRORS:\n`,
281
- this.constructErrors.map((error: any): any => {
282
- if (error instanceof DyFM_Error) {
283
- return error.getErrorSimplified();
284
- } else {
285
- return error;
286
- }
287
- }),
288
- );
282
+ if (this.deepLog) {
283
+ if (DyNTS_global_settings.log_settings.highDetailedLogs) {
284
+ DyFM_Log.H_error(
285
+ `Extended Application: "${this.params.name}" start failed. (ready; TIMEOUT check +2)`,
286
+ `\n construct ERRORS:`, this.constructErrors
287
+ );
288
+ } else {
289
+ DyFM_Log.H_error(
290
+ `Extended Application: "${this.params.name}" start failed. (ready; TIMEOUT check +2)`,
291
+ `\n construct ERRORS:`, this.getSimplifiedConstructErrors(),
292
+ );
293
+ }
294
+ }
289
295
 
290
296
  throw new DyFM_Error({
291
297
  message: `${this.params?.name} start failed. TIMEOUT`,
@@ -329,13 +335,13 @@ export abstract class DyNTS_AppExtended extends DyNTS_App {
329
335
  systemControls: this.systemControls,
330
336
  systemControlsExt: this.systemControlsExt,
331
337
  systemReadies: {
332
- app: this.systemControls.app.getReady(),
333
- appExtended: this.systemControlsExt.appExtended.getReady(),
334
- mongoose: this.systemControls.mongoose.getReady(),
335
- httpServer: this.systemControls.httpServer.getReady(),
336
- httpsServer: this.systemControls.httpsServer.getReady(),
337
- httpSocketServer: this.systemControlsExt.httpSocketServer.getReady(),
338
- httpsSocketServer: this.systemControlsExt.httpsSocketServer.getReady(),
338
+ app: this.systemControls.app.getIsReady(),
339
+ appExtended: this.systemControlsExt.appExtended.getIsReady(),
340
+ mongoose: this.systemControls.mongoose.getIsReady(),
341
+ httpServer: this.systemControls.httpServer.getIsReady(),
342
+ httpsServer: this.systemControls.httpsServer.getIsReady(),
343
+ httpSocketServer: this.systemControlsExt.httpSocketServer.getIsReady(),
344
+ httpsSocketServer: this.systemControlsExt.httpsSocketServer.getIsReady(),
339
345
  },
340
346
  },
341
347
  error: this.constructErrors?.[0] ?? new Error(),
@@ -387,7 +393,7 @@ export abstract class DyNTS_AppExtended extends DyNTS_App {
387
393
 
388
394
  await DyFM_delay(100);
389
395
 
390
- DyFM_Log.H_info(`${this.params.name} stopped successfully.`);
396
+ DyFM_Log.H_info(`"${this.params.name}" stopped successfully.`);
391
397
  }
392
398
  } catch (error) {
393
399
  throw new DyFM_Error({
@@ -118,9 +118,6 @@ export class DyNTS_EmailService /* extends DyNTS_SingletonService */ {
118
118
  ...this._getDefaultErrorSettings('asyncPostConstruct', error, 'SYSTEM'),
119
119
 
120
120
  errorCode: 'NTS-ES0-APC0',
121
- message:
122
- `\nDynamoBEEmailService ERROR, ` +
123
- `\nThe emailService construction failed for ${this.serviceName}.`,
124
121
  });
125
122
  }
126
123
  }
@@ -144,9 +141,7 @@ export class DyNTS_EmailService /* extends DyNTS_SingletonService */ {
144
141
  throw new DyFM_Error({
145
142
  ...this._getDefaultErrorSettings(
146
143
  'sendEmail',
147
- new Error(
148
- `No email template component is given!`
149
- ),
144
+ new Error(`No email template component is given!`),
150
145
  issuer
151
146
  ),
152
147
 
@@ -470,20 +465,23 @@ export class DyNTS_EmailService /* extends DyNTS_SingletonService */ {
470
465
  private async loadComponent(component: DyNTS_EmailTemplateComponent): Promise<void> {
471
466
  try {
472
467
  if (this.componentsBySelector[component.selector]) {
473
- throw new DyFM_Error({
474
- ...this._getDefaultErrorSettings('loadComponent', new Error(), 'SYSTEM'),
475
-
476
- errorCode: 'NTS-ES0-LC1',
477
- message: `Template already loaded! (${component.name})`,
478
- });
468
+ DyFM_Log.warn('Email component already loaded! (it will be skipped)', component.selector);
469
+
470
+ return;
479
471
  }
480
472
 
481
473
  if (!component.templatePath && !component.template) {
482
474
  throw new DyFM_Error({
483
- ...this._getDefaultErrorSettings('loadComponent', new Error(), 'SYSTEM'),
475
+ ...this._getDefaultErrorSettings(
476
+ 'loadComponent',
477
+ new Error(`Component missing template and templatePath! (${component.name})`),
478
+ 'SYSTEM'
479
+ ),
484
480
 
485
481
  errorCode: 'NTS-ES0-LC2',
486
- message: `Component missing template and templatePath! (${component.name})`,
482
+ additionalContent: {
483
+ component: component,
484
+ },
487
485
  });
488
486
  }
489
487
 
@@ -4,7 +4,9 @@ import { Request, Response } from 'express';
4
4
 
5
5
  import {
6
6
  DyFM_Metadata, DyFM_DataModel_Params, DyFM_Log, DyFM_Error, DyFM_Array,
7
- DyFM_errorFlag
7
+ DyFM_errorFlag,
8
+ DyFM_AnyError,
9
+ DyFM_Error_Settings
8
10
  } from '@futdevpro/fsm-dynamo';
9
11
  import { DyNTS_App_Params } from '../../_models/control-models/app-params.control-model';
10
12
 
@@ -49,13 +51,12 @@ export class DyNTS_GlobalService extends DyNTS_SingletonService {
49
51
  authService: DyNTS_AuthService;
50
52
  dbServiceCollection: DyNTS_Service_Collection<DyNTS_DBService<any>>;
51
53
  emailServiceCollection: DyNTS_Service_Collection<DyNTS_EmailService>;
54
+
55
+ static readonly defaultErrorUserMsg: string =
56
+ `We encountered an unhandled Control Service Error, ` +
57
+ `\nplease contact the responsible development team.`;
52
58
 
53
- static globalErrorHandler?: (
54
- err: any,
55
- req?: Request,
56
- res?: Response,
57
- issuer?: string
58
- ) => Promise<void>;
59
+ static globalErrorHandler?: DyNTS_GlobalErrorHandlerFn;
59
60
 
60
61
  /**
61
62
  * You need to setup global Services through this function
@@ -73,8 +74,8 @@ export class DyNTS_GlobalService extends DyNTS_SingletonService {
73
74
  await this.setErrorHandler(set?.errorHandler);
74
75
  } catch (error) {
75
76
  throw new DyFM_Error({
76
- message: `Failed to setServices on DyNTS_GlobalService.`,
77
- error: error,
77
+ ...this.getDefaultErrorSettings('setServices', error, 'DyNTS_GlobalService'),
78
+
78
79
  errorCode: 'NTS-GS0-SS0',
79
80
  });
80
81
  }
@@ -86,8 +87,12 @@ export class DyNTS_GlobalService extends DyNTS_SingletonService {
86
87
  dbModels?.forEach((dbModel: DyFM_DataModel_Params): void => {
87
88
  if (!dbModel.constructed) {
88
89
  throw new DyFM_Error({
89
- message: `DyNTS_GlobalService.setServices failed, ` +
90
- `ERROR: dbModel is not constructed!`,
90
+ ...this.getDefaultErrorSettings(
91
+ 'setDBServices',
92
+ new Error(`dbModel is not constructed!`),
93
+ 'DyNTS_GlobalService'
94
+ ),
95
+
91
96
  errorCode: 'NTS-GS0-SDBS1',
92
97
  additionalContent: {
93
98
  dbModel: dbModel,
@@ -101,9 +106,8 @@ export class DyNTS_GlobalService extends DyNTS_SingletonService {
101
106
  DyFM_Log.error(`Failed to create DyNTS_DBService (${dbModel.dataName}).`, error);
102
107
 
103
108
  throw new DyFM_Error({
104
- message: `Failed to create DyNTS_DBService (${dbModel.dataName}).`,
105
- issuerService: 'DyNTS_GlobalService',
106
- error: error,
109
+ ...this.getDefaultErrorSettings('setDBServices', error, 'DyNTS_GlobalService'),
110
+
107
111
  additionalContent: {
108
112
  dbModel: dbModel,
109
113
  },
@@ -112,8 +116,8 @@ export class DyNTS_GlobalService extends DyNTS_SingletonService {
112
116
  });
113
117
  } catch (error) {
114
118
  throw new DyFM_Error({
115
- message: `Failed to set dbServiceCollections on DyNTS_GlobalService.`,
116
- error: error,
119
+ ...this.getDefaultErrorSettings('setDBServices', error, 'DyNTS_GlobalService'),
120
+
117
121
  errorCode: 'NTS-GS0-SDBS0',
118
122
  });
119
123
  }
@@ -128,8 +132,8 @@ export class DyNTS_GlobalService extends DyNTS_SingletonService {
128
132
  }
129
133
  } catch (error) {
130
134
  throw new DyFM_Error({
131
- message: `Failed to set authService on DyNTS_GlobalService.`,
132
- error: error,
135
+ ...this.getDefaultErrorSettings('setAuthService', error, 'DyNTS_GlobalService'),
136
+
133
137
  errorCode: 'NTS-GS0-SAS0',
134
138
  });
135
139
  }
@@ -150,8 +154,8 @@ export class DyNTS_GlobalService extends DyNTS_SingletonService {
150
154
  );
151
155
  } catch (error) {
152
156
  throw new DyFM_Error({
153
- message: `Failed to set emailServiceCollections on DyNTS_GlobalService.`,
154
- error: error,
157
+ ...this.getDefaultErrorSettings('setEmailServices', error, 'DyNTS_GlobalService'),
158
+
155
159
  errorCode: 'NTS-GS0-SS4',
156
160
  });
157
161
  }
@@ -190,8 +194,8 @@ export class DyNTS_GlobalService extends DyNTS_SingletonService {
190
194
  });
191
195
  } catch (error) {
192
196
  throw new DyFM_Error({
193
- message: `Failed to set errorHandler on DyNTS_GlobalService.`,
194
- error: error,
197
+ ...this.getDefaultErrorSettings('setErrorHandler', error, 'DyNTS_GlobalService'),
198
+
195
199
  errorCode: 'NTS-GS0-SEH0',
196
200
  });
197
201
  }
@@ -338,4 +342,21 @@ export class DyNTS_GlobalService extends DyNTS_SingletonService {
338
342
  ${names}\n`);
339
343
  }
340
344
  } */
345
+
346
+ protected static getDefaultErrorSettings(
347
+ fnName: string,
348
+ error: DyFM_AnyError,
349
+ issuer: string
350
+ ): DyFM_Error_Settings {
351
+ return {
352
+ status: (error as DyFM_Error)?.___status ?? 500,
353
+ message: (error as Error)?.message ??
354
+ `${fnName} was UNSUCCESSFUL (${DyNTS_global_settings.systemShortCodeName})`,
355
+ addECToUserMsg: !(error as DyFM_Error)?.__userMessage,
356
+ userMessage: (error as DyFM_Error)?.__userMessage ?? this.defaultErrorUserMsg,
357
+ issuer: issuer,
358
+ issuerService: this.constructor?.name,
359
+ error: error,
360
+ };
361
+ }
341
362
  }
@@ -1,5 +1,5 @@
1
1
 
2
- import { DyFM_Log, DyFM_delay } from '@futdevpro/fsm-dynamo';
2
+ import { DyFM_Error, DyFM_Log, DyFM_delay } from '@futdevpro/fsm-dynamo';
3
3
  import { DyNTS_AppBase_Mock, DyNTS_AppFull_Mock } from '../../_modules/mock/app-server.mock';
4
4
 
5
5
  describe('DyNTS_App AND DyNTS_AppExtended?;', (): void => {
@@ -15,15 +15,23 @@ describe('DyNTS_App AND DyNTS_AppExtended?;', (): void => {
15
15
  await DyFM_delay(100);
16
16
 
17
17
  await app.ready();
18
+
19
+ await DyFM_delay(100);
18
20
  } catch (error) {
19
- DyFM_Log.test('error', error);
21
+ DyFM_Log.test('test beforeEach error:', (error as DyFM_Error)?._message);
20
22
  }
21
23
  });
22
24
 
23
25
  afterEach(async (): Promise<void> => {
24
- await app.stop();
26
+ try {
27
+ await DyFM_delay(100);
28
+
29
+ await app.stop();
25
30
 
26
- await DyFM_delay(100);
31
+ app = null;
32
+ } catch (error) {
33
+ DyFM_Log.test('test afterEach error:', (error as DyFM_Error)?._message);
34
+ }
27
35
  });
28
36
 
29
37
  it('should be created', (): void => {
@@ -41,16 +49,27 @@ describe('DyNTS_App AND DyNTS_AppExtended?;', (): void => {
41
49
  beforeEach(async (): Promise<void> => {
42
50
  try {
43
51
  app = new DyNTS_AppFull_Mock();
52
+
53
+ await DyFM_delay(100);
54
+
44
55
  await app.ready();
56
+
57
+ await DyFM_delay(100);
45
58
  } catch (error) {
46
- DyFM_Log.test('error', error);
59
+ DyFM_Log.test('test beforeEach error:', (error as DyFM_Error)?._message);
47
60
  }
48
61
  });
49
62
 
50
63
  afterEach(async (): Promise<void> => {
51
- await app.stop();
64
+ try {
65
+ await DyFM_delay(100);
66
+
67
+ await app.stop();
52
68
 
53
- await DyFM_delay(100);
69
+ app = null;
70
+ } catch (error) {
71
+ DyFM_Log.test('test afterEach error:', (error as DyFM_Error)?._message);
72
+ }
54
73
  });
55
74
 
56
75
  it('should be created', (): void => {