@futdevpro/nts-dynamo 1.9.40 → 1.9.41

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 (48) hide show
  1. package/build/_collections/archive.util.d.ts +1 -1
  2. package/build/_collections/archive.util.d.ts.map +1 -1
  3. package/build/_collections/archive.util.js +1 -1
  4. package/build/_collections/archive.util.js.map +1 -1
  5. package/build/_collections/global-settings.const.d.ts.map +1 -1
  6. package/build/_collections/global-settings.const.js +1 -0
  7. package/build/_collections/global-settings.const.js.map +1 -1
  8. package/build/_models/control-models/endpoint-params.control-model.d.ts +13 -8
  9. package/build/_models/control-models/endpoint-params.control-model.d.ts.map +1 -1
  10. package/build/_models/control-models/endpoint-params.control-model.js +52 -19
  11. package/build/_models/control-models/endpoint-params.control-model.js.map +1 -1
  12. package/build/_models/interfaces/global-settings.interface.d.ts +4 -0
  13. package/build/_models/interfaces/global-settings.interface.d.ts.map +1 -1
  14. package/build/_modules/socket/_services/app-extended.server.d.ts +3 -3
  15. package/build/_modules/socket/_services/app-extended.server.d.ts.map +1 -1
  16. package/build/_modules/socket/_services/app-extended.server.js +33 -21
  17. package/build/_modules/socket/_services/app-extended.server.js.map +1 -1
  18. package/build/_modules/socket/_services/socket-server.service.js +3 -3
  19. package/build/_modules/socket/_services/socket-server.service.js.map +1 -1
  20. package/build/_services/base/data.service.js +1 -1
  21. package/build/_services/base/data.service.js.map +1 -1
  22. package/build/_services/base/singleton.service-base.d.ts +1 -1
  23. package/build/_services/base/singleton.service-base.d.ts.map +1 -1
  24. package/build/_services/base/singleton.service-base.js +1 -0
  25. package/build/_services/base/singleton.service-base.js.map +1 -1
  26. package/build/_services/core/global.service.d.ts.map +1 -1
  27. package/build/_services/core/global.service.js +35 -23
  28. package/build/_services/core/global.service.js.map +1 -1
  29. package/build/_services/route/routing-module.service.d.ts +1 -1
  30. package/build/_services/route/routing-module.service.d.ts.map +1 -1
  31. package/build/_services/route/routing-module.service.js +19 -2
  32. package/build/_services/route/routing-module.service.js.map +1 -1
  33. package/build/_services/server/app.server.d.ts +2 -2
  34. package/build/_services/server/app.server.d.ts.map +1 -1
  35. package/build/_services/server/app.server.js +12 -6
  36. package/build/_services/server/app.server.js.map +1 -1
  37. package/package.json +3 -3
  38. package/src/_collections/archive.util.ts +1 -1
  39. package/src/_collections/global-settings.const.ts +1 -0
  40. package/src/_models/control-models/endpoint-params.control-model.ts +79 -31
  41. package/src/_models/interfaces/global-settings.interface.ts +5 -0
  42. package/src/_modules/socket/_services/app-extended.server.ts +10 -8
  43. package/src/_modules/socket/_services/socket-server.service.ts +3 -3
  44. package/src/_services/base/data.service.ts +1 -1
  45. package/src/_services/base/singleton.service-base.ts +2 -1
  46. package/src/_services/core/global.service.ts +52 -34
  47. package/src/_services/route/routing-module.service.ts +23 -4
  48. package/src/_services/server/app.server.ts +18 -9
@@ -23,16 +23,17 @@ export class DyNTS_Endpoint_Params {
23
23
  /* TODO: ENCRYPTION !!EZTET
24
24
  useEncryptionKey?: string; */
25
25
 
26
- private pathParams: string[];
26
+ private readonly pathParams: string[];
27
27
 
28
- private preProcesses: ((req: Request, res: Response) => Promise<void>)[];
29
- private tasks: ((req: Request, res: Response, issuer?: string) => Promise<void>)[];
28
+ private readonly preProcesses: ((req: Request, res: Response) => Promise<void>)[];
29
+ private readonly tasks: ((req: Request, res: Response, issuer?: string) => Promise<void>)[];
30
30
 
31
- private logRequest: boolean;
32
- private logRequestsParams: boolean;
33
- private logRequestsContent: boolean;
34
- private logResponseContent: boolean;
35
- private stack: string;
31
+ private readonly logRequest: boolean;
32
+ private readonly logRequestsParams: boolean;
33
+ private readonly logRequestsContent: boolean;
34
+ private readonly logResponseContent: boolean;
35
+ private readonly stack: string;
36
+ private readonly autoResolveCirculation: boolean;
36
37
 
37
38
  constructor(
38
39
  set: {
@@ -85,6 +86,10 @@ export class DyNTS_Endpoint_Params {
85
86
  * log settings for response content
86
87
  */
87
88
  logResponseContent?: boolean,
89
+ /**
90
+ * auto resolve circulation errors
91
+ */
92
+ autoResolveCirculation?: boolean,
88
93
  }
89
94
  ) {
90
95
  try {
@@ -101,6 +106,8 @@ export class DyNTS_Endpoint_Params {
101
106
  set.logRequestsContent ?? DyNTS_global_settings.log_settings.requestsContent;
102
107
  this.logResponseContent =
103
108
  set.logResponseContent ?? DyNTS_global_settings.log_settings.responseContent;
109
+ this.autoResolveCirculation =
110
+ set.autoResolveCirculation ?? DyNTS_global_settings.autoResolveEndpointCirculationErrors;
104
111
 
105
112
  if (!this.endpoint) {
106
113
  throw new DyFM_Error({
@@ -233,7 +240,8 @@ export class DyNTS_Endpoint_Params {
233
240
  req: Request,
234
241
  res: Response,
235
242
  error: Error | DyFM_Error,
236
- issuer: string
243
+ issuer: string,
244
+ autoSecondTry?: boolean
237
245
  ): Promise<void> {
238
246
  try {
239
247
  let msg: string = `Endpoint caught an error. '${this.name}' (${this.endpoint})`;
@@ -284,10 +292,27 @@ export class DyNTS_Endpoint_Params {
284
292
 
285
293
  try {
286
294
  JSON.stringify(error);
287
- } catch (error) {
288
- DyFM_Log.H_error(
289
- 'DyNTS_Endpoint_Params: error object is not serializable!', error
290
- );
295
+ } catch (stringifyError) {
296
+ if (this.autoResolveCirculation) {
297
+ try {
298
+ error = DyFM_Shared.resolveCirculation(error);
299
+ JSON.stringify(error);
300
+ } catch (resolveError) {
301
+ DyFM_Log.H_error(
302
+ 'DyNTS_Endpoint_Params: error object is not serializable, and not resolvable!'
303
+ );
304
+
305
+ error = new DyFM_Error({
306
+ error: new Error('UNRESOLVABLE UNSERIALIZABLE ERROR'),
307
+ });
308
+ }
309
+ } else {
310
+ DyFM_Log.H_error('DyNTS_Endpoint_Params: error object is not serializable!');
311
+
312
+ error = new DyFM_Error({
313
+ error: new Error('UNSERIALIZABLE ERROR'),
314
+ });
315
+ }
291
316
  }
292
317
 
293
318
  res.status((error as DyFM_Error)?.___status ?? 501);
@@ -310,21 +335,28 @@ export class DyNTS_Endpoint_Params {
310
335
 
311
336
  DyFM_Log.error('');
312
337
 
313
- } catch (error) {
338
+ } catch (errorLvl2) {
314
339
  this.multiLevelError(
315
- error,
316
- { req, res, error, issuer }
340
+ errorLvl2,
341
+ {
342
+ req: req,
343
+ res: res,
344
+ error: error,
345
+ issuer: issuer,
346
+ autoSecondTry: autoSecondTry,
347
+ }
317
348
  );
318
349
  }
319
350
  }
320
351
 
321
352
  private multiLevelError(
322
- error: any,
353
+ errorLvl2: any,
323
354
  errorInputs: {
324
355
  req: Request,
325
356
  res: Response,
326
357
  error: Error | DyFM_Error,
327
- issuer: string
358
+ issuer: string,
359
+ autoSecondTry: boolean
328
360
  }
329
361
  ): void {
330
362
  if (DyNTS_global_settings.log_settings.highDetailedLogs) {
@@ -333,7 +365,7 @@ export class DyNTS_Endpoint_Params {
333
365
  `(${this.name}, ${this.endpoint})` +
334
366
  `\n(DYNAMO MULTILEVEL ERROR means, that the ERROR HANDLING is ALSO FAILED, ` +
335
367
  `and the error message was not sent.)` +
336
- `\nERROR:`, error,
368
+ `\nERROR:`, errorLvl2,
337
369
  '\n'
338
370
  );
339
371
  } else {
@@ -347,32 +379,48 @@ export class DyNTS_Endpoint_Params {
347
379
 
348
380
  try {
349
381
  JSON.stringify(errorInputs.error);
350
- } catch (error) {
351
- DyFM_Log.error('error object is not serializable!');
352
- let unresolvable;
382
+ } catch (errorLvl2Replication) {
383
+ DyFM_Log.error(' ...response object is not serializable!');
384
+ let resolvedError: any;
353
385
 
354
386
  try {
355
- DyFM_Shared.resolveCirculation(errorInputs.error);
356
- } catch (error) {
357
- unresolvable = true;
358
- DyFM_Log.error('error object is not resolvable!');
387
+ resolvedError = DyFM_Shared.resolveCirculation(errorInputs.error);
388
+ } catch (errorLvl3) {
389
+ DyFM_Log.error(' ...response object is not resolvable!');
390
+ DyFM_Log.error(' ...', errorLvl3);
359
391
  }
360
392
 
361
- if (!unresolvable) {
362
- DyFM_Log.error('error object is resolvable! (use DyFM_Shared.resolveCirculation)');
393
+ if (resolvedError) {
394
+ if (this.autoResolveCirculation && !errorInputs.autoSecondTry) {
395
+ this.error(
396
+ errorInputs.req,
397
+ errorInputs.res,
398
+ resolvedError,
399
+ errorInputs.issuer,
400
+ true
401
+ );
402
+
403
+ DyFM_Log.warn(' ...automatic circulation error resolution was successful!');
404
+
405
+ return;
406
+ } else {
407
+ DyFM_Log.error(
408
+ ' ...response object is resolvable! (use DyFM_Shared.resolveCirculation)'
409
+ );
410
+ }
363
411
  }
364
412
  }
365
413
 
366
414
  if (
367
415
  DyNTS_global_settings.log_settings.highDetailedLogs ||
368
- !(error instanceof DyFM_Error)
416
+ !(errorLvl2 instanceof DyFM_Error)
369
417
  ) {
370
418
  DyFM_Log.H_error(
371
419
  `Endpoint "${this.endpoint}" caught an error and FAILED TO RESOLVE. (${this.name})`,
372
- '\n ERROR:', error
420
+ '\n ERROR:', errorLvl2
373
421
  );
374
422
  } else {
375
- error.logSimple(
423
+ errorLvl2.logSimple(
376
424
  `Endpoint "${this.endpoint}" caught an error and FAILED TO RESOLVE. (${this.name})`
377
425
  );
378
426
  }
@@ -30,6 +30,11 @@ export interface DyNTS_Global_Settings {
30
30
  */
31
31
  systemShortCodeName?: string;
32
32
 
33
+ /**
34
+ *
35
+ */
36
+ autoResolveEndpointCirculationErrors: boolean;
37
+
33
38
  /**
34
39
  * this setting will set which logs will be shown
35
40
  */
@@ -119,7 +119,7 @@ import { DyNTS_global_settings } from '../../../_collections/global-settings.con
119
119
  */
120
120
  export abstract class DyNTS_AppExtended extends DyNTS_App {
121
121
 
122
- private systemControlsExt: DyNTS_AppExtSysControls = new DyNTS_AppExtSysControls();
122
+ private readonly systemControlsExt: DyNTS_AppExtSysControls = new DyNTS_AppExtSysControls();
123
123
  override get started(): boolean { return this.systemControlsExt.appExtended.started; }
124
124
  private httpsSocketSettingUpCount: number = 0;
125
125
  private httpSocketSettingUpCount: number = 0;
@@ -138,12 +138,12 @@ export abstract class DyNTS_AppExtended extends DyNTS_App {
138
138
  * ];
139
139
  */
140
140
  protected socketServices: DyNTS_SocketServerService<any>[];
141
- private allSocketServers: SocketIO.Server[] = [];
141
+ private readonly allSocketServers: SocketIO.Server[] = [];
142
142
 
143
143
  constructor(){
144
- super(true);
144
+ super(/* true */);
145
145
 
146
- this.asyncConstructExt().catch((error: DyFM_AnyError): void => {
146
+ /* this.asyncConstructExt().catch((error: DyFM_AnyError): void => {
147
147
  if (
148
148
  DyNTS_global_settings.log_settings.highDetailedLogs ||
149
149
  !(error instanceof DyFM_Error)
@@ -159,13 +159,15 @@ export abstract class DyNTS_AppExtended extends DyNTS_App {
159
159
  `(DyNTS_AppExtended constructor catch)`
160
160
  );
161
161
  }
162
- });
162
+ }); */
163
163
  }
164
164
 
165
- private async asyncConstructExt(): Promise<void> {
165
+ protected override async asyncConstruct(extended = true): Promise<void> {
166
166
  if (this.fnLogs && this.deepLog) console.log('\nfn:. asyncConstruct-extended');
167
167
 
168
168
  try {
169
+ await super.asyncConstruct(true);
170
+
169
171
  this.systemControlsExt.appExtended.init = true;
170
172
 
171
173
  this.socketServices = this.getSocketServices();
@@ -194,7 +196,7 @@ export abstract class DyNTS_AppExtended extends DyNTS_App {
194
196
  DyFM_Log.H_success(`"${this.params.name}" started successfully.`);
195
197
 
196
198
  } catch (error) {
197
- if (
199
+ /* if (
198
200
  DyNTS_global_settings.log_settings.highDetailedLogs ||
199
201
  !(error instanceof DyFM_Error)
200
202
  ) {
@@ -206,7 +208,7 @@ export abstract class DyNTS_AppExtended extends DyNTS_App {
206
208
  error.logSimple(
207
209
  `Extended Application: "${this.params?.name}" start failed. (asyncConstructExt catch)`
208
210
  );
209
- }
211
+ } */
210
212
 
211
213
  throw new DyFM_Error({
212
214
  errorCode: 'NTS-AES-001',
@@ -678,13 +678,13 @@ export abstract class DyNTS_SocketServerService<
678
678
  if (DyNTS_global_settings.log_settings.socket_eventContent) {
679
679
  DyFM_Log.success(
680
680
  ` <--= emitted socket(${this.params.name}) event: "${event}", ` +
681
- `\n presenceId: "${id}", sockets: ${presence.sockets.length}` +
682
- `\n content:`, content
681
+ `\n presenceId: "${id}", sockets: ${presence.sockets.length}` +
682
+ `\n content:`, content
683
683
  );
684
684
  } else {
685
685
  DyFM_Log.success(
686
686
  ` <--= emitted socket(${this.params.name}) event: "${event}", ` +
687
- `\n presenceId: ${id}, sockets: ${presence.sockets.length}`
687
+ `\n presenceId: ${id}, sockets: ${presence.sockets.length}`
688
688
  );
689
689
  }
690
690
  } catch (error) {
@@ -84,7 +84,7 @@ export class DyNTS_DataService<T extends DyFM_Metadata> {
84
84
  message:
85
85
  `The dataService construction failed for "${dataParams?.dataName}". ` +
86
86
  `at "${this.serviceName}" (${this.constructor.name})` +
87
- `\nMaybe you forgot to add the dbService to the GlobalService?\n\n`,
87
+ `\nMaybe you forgot to add the dbService to the GlobalService?`,
88
88
  level: DyFM_ErrorLevel.critical,
89
89
  });
90
90
  /* DyFM_Log.error(
@@ -10,7 +10,8 @@ export class DyNTS_SingletonServiceBase {
10
10
  /// --- --- --- SINGLETON --- --- --- \\\
11
11
  protected static instance;
12
12
 
13
- static getSingletonInstance() {
13
+ // eslint-disable-next-line @typescript-eslint/explicit-function-return-type
14
+ protected static getSingletonInstance() {
14
15
  if (!this.instance) {
15
16
  this.instance = new this();
16
17
  }
@@ -88,6 +88,22 @@ export class DyNTS_GlobalService extends DyNTS_SingletonService {
88
88
  this.instance.dbServiceCollection = {};
89
89
 
90
90
  dbModels?.forEach((dbModel: DyFM_DataModel_Params): void => {
91
+ if (!dbModel) {
92
+ throw new DyFM_Error({
93
+ ...this.getDefaultErrorSettings(
94
+ 'setDBServices',
95
+ new Error(`given dbModel is empty!`),
96
+ 'DyNTS_GlobalService'
97
+ ),
98
+
99
+ errorCode: 'NTS-GS0-SDBS2',
100
+ additionalContent: {
101
+ dbModels: dbModels,
102
+ dbModelNames: dbModels.map((dbModel: DyFM_DataModel_Params) => dbModel.dataName),
103
+ },
104
+ });
105
+ }
106
+
91
107
  if (dbModel.addArchive) {
92
108
  const archiveModel: DyFM_DataModel_Params = new DyFM_DataModel_Params({
93
109
  ...dbModel,
@@ -178,35 +194,39 @@ export class DyNTS_GlobalService extends DyNTS_SingletonService {
178
194
 
179
195
  private static async setErrorHandler(errorHandler?: DyNTS_GlobalErrorHandlerFn): Promise<void> {
180
196
  try {
181
- DyNTS_GlobalService.globalErrorHandler =
182
- errorHandler ??
183
- (async (error: any): Promise<void> => {
184
- try {
185
- DyFM_Log.warn(
186
- `globalErrorHandler not set! (set in app.getGlobalServiceCollection)`,
187
- '\nwill use default-logging',
197
+ DyNTS_GlobalService.globalErrorHandler = (async (error: any): Promise<void> => {
198
+ try {
199
+ if (errorHandler) {
200
+ await errorHandler(error);
201
+
202
+ return;
203
+ }
204
+
205
+ DyFM_Log.warn(
206
+ `globalErrorHandler not set! (set in app.getGlobalServiceCollection)`,
207
+ '\nwill use default-logging',
208
+ );
209
+
210
+ if (
211
+ DyNTS_global_settings.log_settings.highDetailedLogs ||
212
+ !(error instanceof DyFM_Error)
213
+ ) {
214
+ DyFM_Log.H_error(
215
+ `Error caught by globalErrorHandler.`,
216
+ `\n ERROR:`, error?.replaceAll?.('at', ' at') ?? error
188
217
  );
189
-
190
- if (
191
- DyNTS_global_settings.log_settings.highDetailedLogs ||
192
- !(error instanceof DyFM_Error)
193
- ) {
194
- DyFM_Log.H_error(
195
- `Error caught by globalErrorHandler.`,
196
- `\n ERROR:`, error?.replaceAll?.('at', ' at') ?? error
197
- );
198
- } else /* if (!error.___logged) */ {
199
- error.logSimple(
200
- `Error caught by globalErrorHandler.`
201
- );
202
- }
203
- } catch (error) {
204
- DyFM_Log.error(
205
- `NTS GLOBAL MULTILEVEL ERROR: \nFailed to handle error on globalErrorHandler.`,
206
- error
218
+ } else /* if (!error.___logged) */ {
219
+ error.logSimple(
220
+ `Error caught by globalErrorHandler.`
207
221
  );
208
222
  }
209
- });
223
+ } catch (error) {
224
+ DyFM_Log.error(
225
+ `NTS GLOBAL MULTILEVEL ERROR: \nFailed to handle error on globalErrorHandler.`,
226
+ error
227
+ );
228
+ }
229
+ });
210
230
  } catch (error) {
211
231
  throw new DyFM_Error({
212
232
  ...this.getDefaultErrorSettings('setErrorHandler', error, 'DyNTS_GlobalService'),
@@ -275,15 +295,11 @@ export class DyNTS_GlobalService extends DyNTS_SingletonService {
275
295
  if (collection[key]) {
276
296
  return collection[key] as DyNTS_DBService<T>;
277
297
  } else {
278
- let keys: string = `${Object.keys(collection)}`;
279
-
280
- keys = keys.replace(/,/g, '\n ');
281
-
282
298
  throw new Error(
283
299
  `\n DyNTS_GlobalService.getDBService failed, ERROR: ` +
284
- `\n no dbService on collection with this key: ${key}!` +
300
+ `\n no dbService on collection with this key: "${key}"!` +
285
301
  `\n The available dbServices on collection:` +
286
- `\n ${keys}\n`
302
+ `\n ${Object.keys(collection).join(', ')}\n`
287
303
  );
288
304
  }
289
305
  }
@@ -293,12 +309,14 @@ export class DyNTS_GlobalService extends DyNTS_SingletonService {
293
309
  * @returns
294
310
  */
295
311
  static getEmailServiceCollection(): DyNTS_Service_Collection<DyNTS_EmailService> {
296
- if (!this.instance?.emailServiceCollection) {
312
+ if (!this.instance.emailServiceCollection) {
297
313
  throw new Error(
298
314
  `\n Unique Email Service Collection missing!` +
299
315
  `\n Please create a Unique Email Service Collection extending ` +
300
316
  `DynamoBEEmailServiceCollection, ` +
301
- `\n and Setup with DyNTS_GlobalServiceC.setServices(...)\n`
317
+ `\n and Setup with DyNTS_GlobalServiceC.setServices(...)\n` +
318
+ `\n available emailServiceCollection: ` +
319
+ `${Object().keys(this.instance.emailServiceCollection).join(', ')}\n`
302
320
  );
303
321
  }
304
322
 
@@ -65,7 +65,7 @@ export class DyNTS_RoutingModule {
65
65
  security: DyNTS_RouteSecurity;
66
66
  route: string;
67
67
 
68
- private controllers: DyNTS_Controller[];
68
+ private readonly controllers: DyNTS_Controller[];
69
69
  endpoints: DyNTS_Endpoint_Params[] = [];
70
70
 
71
71
  openRouter: Router = Router();
@@ -93,13 +93,29 @@ export class DyNTS_RoutingModule {
93
93
  `routing module setup done: ${this.route} security: ${this.security}\n`
94
94
  );
95
95
  } catch (error) {
96
+ /* if (
97
+ DyNTS_global_settings.log_settings.highDetailedLogs ||
98
+ !(error instanceof DyFM_Error)
99
+ ) {
100
+ DyFM_Log.H_error(
101
+ `Routing module setup failed (${this.route}).`,
102
+ `\n ERROR:`, error
103
+ );
104
+ } else {
105
+ error.logSimple(
106
+ `Routing module setup failed (${this.route}).` +
107
+ '\nmessages:\n' + error._messages.join(' \n')
108
+ );
109
+ } */
110
+
96
111
  /* DyFM_Log.error(`\nRouting module setup failed (${this.route})`, error); */
97
112
  throw new DyFM_Error({
98
113
  ...this.getDefaultErrorSettings(
99
- 'constructor',
100
- new Error(`Routing module setup failed (${this.route}).`)
114
+ 'DyNTS_RoutingModule.constructor',
115
+ error
101
116
  ),
102
117
 
118
+ message: `Routing module setup failed (${this.route}).`,
103
119
  errorCode: 'NTS-RMS-000',
104
120
  additionalContent: set,
105
121
  });
@@ -117,9 +133,12 @@ export class DyNTS_RoutingModule {
117
133
  throw new DyFM_Error({
118
134
  ...this.getDefaultErrorSettings(
119
135
  'setupRoutes',
120
- new Error(`DynamoBEController setup failed. Please check the setupEndpoints() method.`)
136
+ error
121
137
  ),
122
138
 
139
+ message:
140
+ `DyNTS_Controller setup failed. (${controller?.constructor?.name}) ` +
141
+ `Please check the setupEndpoints() method.`,
123
142
  errorCode: 'NTS-RMS-SR1',
124
143
  level: DyFM_ErrorLevel.critical,
125
144
  });
@@ -268,14 +268,14 @@ export abstract class DyNTS_App extends DyNTS_SingletonService {
268
268
  }
269
269
  debugLog: boolean = DyNTS_global_settings.log_settings.server_debug;
270
270
 
271
- constructor(extended?: boolean){
271
+ constructor(/* extended?: boolean */){
272
272
  super();
273
273
 
274
274
  process.on(
275
275
  'unhandledRejection',
276
276
  (reason_theError: object, p_passWhatIsThis_maybeThePromise: any): void => {
277
277
  DyFM_Log.H_error(
278
- 'Unhandled Rejection: ', (p_passWhatIsThis_maybeThePromise as Promise<any>)?.toString(),
278
+ 'Unhandled Rejection:', (p_passWhatIsThis_maybeThePromise as Promise<any>)?.toString(),
279
279
  '\n Rejection reason:', (reason_theError as Error)?.stack?.split('at')?.[0],
280
280
  /* '\n ErrorCode:', (reason as any)?.code, */
281
281
  '\n\n Stack:',
@@ -286,7 +286,10 @@ export abstract class DyNTS_App extends DyNTS_SingletonService {
286
286
  DyNTS_GlobalService.globalErrorHandler?.(
287
287
  new DyFM_Error({
288
288
  errorCode: 'NTS-AS0-BASE-UR',
289
- message: 'Unhandled Rejection!',
289
+ message:
290
+ `Unhandled Rejection!: "${(reason_theError as Error)?.stack?.split('at')?.[0]}"`,
291
+ userMessage: this.defaultErrorUserMsg,
292
+ addECToUserMsg: true,
290
293
  error: reason_theError as Error,
291
294
  additionalContent: {
292
295
  reason: reason_theError,
@@ -295,14 +298,20 @@ export abstract class DyNTS_App extends DyNTS_SingletonService {
295
298
  level: DyFM_ErrorLevel.critical,
296
299
  })
297
300
  );
298
-
299
301
  } catch (error) {
300
302
  DyFM_Log.error('globalErrorHandler (MULTILEVEL) ERROR:', error);
301
303
  }
302
304
  }
303
305
  );
304
306
 
305
- this.asyncConstruct(extended).catch((error: any): void => {
307
+ this.asyncConstruct(/* extended */).catch((error: any): void => {
308
+ if (error instanceof DyFM_Error) {
309
+ DyFM_Log.H_warn(
310
+ '(constructor asyncConstruct.catch) additional error content:\n',
311
+ error?.additionalContent
312
+ );
313
+ }
314
+
306
315
  if (
307
316
  DyNTS_global_settings.log_settings.highDetailedLogs ||
308
317
  !(error instanceof DyFM_Error)
@@ -313,15 +322,15 @@ export abstract class DyNTS_App extends DyNTS_SingletonService {
313
322
  );
314
323
  } else {
315
324
  error.logSimple(
316
- `Application: "${this.params?.name}" start failed. (constructor asyncConstruct.catch)`
325
+ `Application: "${this.params?.name}" start failed. (constructor asyncConstruct.catch)` +
326
+ '\n all error messages (from this stack):\n\n"' +
327
+ error._messages.join('"\n\n"') + '"\n\n'
317
328
  );
318
329
  }
319
-
320
- DyFM_Log.H_warn('asyncConstruct error\n', error?.additionalContent);
321
330
  });
322
331
  }
323
332
 
324
- private async asyncConstruct(extended?: boolean): Promise<void> {
333
+ protected async asyncConstruct(extended?: boolean): Promise<void> {
325
334
  if (this.fnLogs && this.deepLog) DyFM_Log.log('\nfn:. asyncConstruct');
326
335
 
327
336
  try {