@hkdigital/lib-core 0.4.33 → 0.4.35

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.
@@ -212,7 +212,9 @@ export class ConsoleAdapter {
212
212
  message: details.message,
213
213
  stack: cleanedStack,
214
214
  errorType: formatErrorDisplay(errorMeta),
215
- ...(relevantFrameIndex >= 0 && { relevantFrameIndex })
215
+ ...(relevantFrameIndex >= 0 && { relevantFrameIndex }),
216
+ ...('details' in details && { details: details.details }),
217
+ ...('status' in details && { status: details.status })
216
218
  };
217
219
  }
218
220
  } else if (details.error instanceof Error) {
@@ -233,7 +235,9 @@ export class ConsoleAdapter {
233
235
  message: details.error.message,
234
236
  stack: cleanedStack,
235
237
  errorType: formatErrorDisplay(errorMeta),
236
- ...(relevantFrameIndex >= 0 && { relevantFrameIndex })
238
+ ...(relevantFrameIndex >= 0 && { relevantFrameIndex }),
239
+ ...('details' in details.error && { details: details.error.details }),
240
+ ...('status' in details.error && { status: details.error.status })
237
241
  };
238
242
  }
239
243
  // Include other details except the error
@@ -1,3 +1,4 @@
1
+ /** @typedef {import('../../typedef.js').LogLevel} LogLevel */
1
2
  /**
2
3
  * Logger class for consistent logging
3
4
  * @extends EventEmitter
@@ -7,19 +8,19 @@ export default class Logger extends EventEmitter {
7
8
  * Create a new Logger instance
8
9
  *
9
10
  * @param {string} name - Name of the service/component for this logger
10
- * @param {string} [defaultLevel=INFO] - Initial log level threshold
11
+ * @param {LogLevel} [defaultLevel=INFO] - Initial log level threshold
11
12
  * @param {Object} [context={}] - Default context data for all logs
12
13
  */
13
- constructor(name: string, defaultLevel?: string, context?: Object);
14
+ constructor(name: string, defaultLevel?: LogLevel, context?: Object);
14
15
  name: string;
15
- level: string;
16
+ level: import("../../typedef.js").LogLevel;
16
17
  /**
17
18
  * Set the minimum log level threshold
18
19
  *
19
- * @param {string} level - New log level (DEBUG, INFO, WARN, ERROR or NONE)
20
+ * @param {LogLevel} level - New log level (DEBUG, INFO, WARN, ERROR or NONE)
20
21
  * @returns {boolean} True if level was valid and set, false otherwise
21
22
  */
22
- setLevel(level: string): boolean;
23
+ setLevel(level: LogLevel): boolean;
23
24
  /**
24
25
  * Log a debug message
25
26
  *
@@ -77,11 +78,11 @@ export default class Logger extends EventEmitter {
77
78
  * E.g. an event that was created by another Logger instance and should be
78
79
  * forwarded to this logger.
79
80
  *
80
- * @param {string} eventName
81
81
  * @param {import('../../typedef.js').LogEventData} eventData
82
82
  */
83
- logFromEvent(eventName: string, eventData: import("../../typedef.js").LogEventData): false | undefined;
83
+ logFromEvent(eventData: import("../../typedef.js").LogEventData): false | undefined;
84
84
  #private;
85
85
  }
86
86
  export type ErrorDetails = import("../../../generic/typedef.js").ErrorDetails;
87
+ export type LogLevel = import("../../typedef.js").LogLevel;
87
88
  import { EventEmitter } from '../../../generic/events.js';
@@ -59,6 +59,8 @@ import { exportNotNullish } from '../../../util/object.js';
59
59
  import * as is from '../../../util/is.js';
60
60
  import { HttpError } from '../../../network/errors.js';
61
61
 
62
+ /** @typedef {import('../../typedef.js').LogLevel} LogLevel */
63
+
62
64
  /**
63
65
  * Logger class for consistent logging
64
66
  * @extends EventEmitter
@@ -71,7 +73,7 @@ export default class Logger extends EventEmitter {
71
73
  * Create a new Logger instance
72
74
  *
73
75
  * @param {string} name - Name of the service/component for this logger
74
- * @param {string} [defaultLevel=INFO] - Initial log level threshold
76
+ * @param {LogLevel} [defaultLevel=INFO] - Initial log level threshold
75
77
  * @param {Object} [context={}] - Default context data for all logs
76
78
  */
77
79
  constructor(name, defaultLevel = INFO, context = {}) {
@@ -86,7 +88,7 @@ export default class Logger extends EventEmitter {
86
88
  /**
87
89
  * Set the minimum log level threshold
88
90
  *
89
- * @param {string} level - New log level (DEBUG, INFO, WARN, ERROR or NONE)
91
+ * @param {LogLevel} level - New log level (DEBUG, INFO, WARN, ERROR or NONE)
90
92
  * @returns {boolean} True if level was valid and set, false otherwise
91
93
  */
92
94
  setLevel(level) {
@@ -198,6 +200,10 @@ export default class Logger extends EventEmitter {
198
200
  // Log without message
199
201
  return this.#log(ERROR, errorObject.message, errorObject);
200
202
  }
203
+ // else if( message ) {
204
+ // // Only log message, no Error object supplied
205
+ // return this.#log(ERROR, message);
206
+ // }
201
207
  else {
202
208
  // Missing error like object
203
209
  // => invalid parameters supplied to logger.error
@@ -239,10 +245,9 @@ export default class Logger extends EventEmitter {
239
245
  * E.g. an event that was created by another Logger instance and should be
240
246
  * forwarded to this logger.
241
247
  *
242
- * @param {string} eventName
243
248
  * @param {import('../../typedef.js').LogEventData} eventData
244
249
  */
245
- logFromEvent(eventName, eventData) {
250
+ logFromEvent(eventData) {
246
251
  const level = eventData.level;
247
252
 
248
253
  // Check if this log level should be filtered
@@ -250,13 +255,13 @@ export default class Logger extends EventEmitter {
250
255
  return false; // Below threshold, don't emit
251
256
  }
252
257
 
253
- this.#logEvent({ ...eventData, eventName });
258
+ this.#logEvent(eventData);
254
259
  }
255
260
 
256
261
  /**
257
262
  * Internal logging method
258
263
  *
259
- * @param {string} level - Log level
264
+ * @param {LogLevel} level - Log level
260
265
  * @param {string} message - Log message
261
266
  * @param {*} [details] - Additional details to include in the log
262
267
  * @returns {boolean} True if the log was emitted, false if filtered
@@ -355,8 +360,10 @@ export default class Logger extends EventEmitter {
355
360
  if (reason instanceof Error) {
356
361
  return reason;
357
362
  }
363
+ // @ts-ignore
358
364
  else if ( is.object(reason) && reason?.message ) {
359
365
  // reason is an object with message property
366
+ // @ts-ignore
360
367
  return new DetailedError(reason?.message, reason);
361
368
  }
362
369
  else if ( typeof reason === "string" ) {
@@ -302,8 +302,8 @@ const manager = new ServiceManager();
302
302
  const logger = createServerLogger('SystemLogger');
303
303
 
304
304
  // Listen to all log events and forward them to the logger
305
- const unsubscribe = manager.onServiceLogEvent((logEvent) => {
306
- logger.logFromEvent('manager:service:log', logEvent);
305
+ const unsubscribe = manager.onLogEvent((logEvent) => {
306
+ logger.logFromEvent(logEvent);
307
307
  });
308
308
 
309
309
  // Register services
@@ -66,8 +66,8 @@
66
66
  import { EventEmitter } from '../../generic/events.js';
67
67
  import { Logger, DEBUG, INFO } from '../../logging/index.js';
68
68
 
69
- import {
70
- SERVICE_LOG,
69
+ import {
70
+ SERVICE_LOG,
71
71
  STATE_CHANGED,
72
72
  HEALTH_CHANGED,
73
73
  ERROR,
@@ -298,9 +298,10 @@ export class ServiceManager extends EventEmitter {
298
298
  this.logger.debug(`Starting dependency '${dep}' for '${name}'`);
299
299
 
300
300
  const started = await this.startService(dep);
301
+
301
302
  if (!started) {
302
303
  this.logger.error(
303
- `Failed to start dependency '${dep}' for '${name}'`
304
+ new Error(`Failed to start dependency '${dep}' for '${name}'`)
304
305
  );
305
306
  return false;
306
307
  }
@@ -396,14 +397,7 @@ export class ServiceManager extends EventEmitter {
396
397
  results.set(name, success);
397
398
 
398
399
  if (!success) {
399
- this.logger.error(`Failed to start '${name}', stopping`);
400
- // Mark remaining services as not started
401
- for (const remaining of sorted) {
402
- if (!results.has(remaining)) {
403
- results.set(remaining, false);
404
- }
405
- }
406
- break;
400
+ throw new Error(`Failed to start service [${name}], stopping`);
407
401
  }
408
402
  }
409
403
 
@@ -430,7 +424,7 @@ export class ServiceManager extends EventEmitter {
430
424
  const results = new Map();
431
425
 
432
426
  // Handle global timeout if specified
433
- if (stopOptions.timeout > 0) {
427
+ if (stopOptions.timeout) {
434
428
  const timeoutPromise = new Promise((_, reject) =>
435
429
  setTimeout(
436
430
  () => reject(new Error('Global shutdown timeout')),
@@ -445,8 +439,10 @@ export class ServiceManager extends EventEmitter {
445
439
  timeoutPromise
446
440
  ]);
447
441
  } catch (error) {
448
- if (error.message === 'Global shutdown timeout') {
449
- this.logger.error('Global shutdown timeout reached');
442
+ if (
443
+ /** @type {Error} */ (error).message === 'Global shutdown timeout'
444
+ ) {
445
+ this.logger.error( new Error('Global shutdown timeout reached' ) );
450
446
  // Mark any remaining services as failed
451
447
  for (const name of sorted) {
452
448
  if (!results.has(name)) {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@hkdigital/lib-core",
3
- "version": "0.4.33",
3
+ "version": "0.4.35",
4
4
  "author": {
5
5
  "name": "HKdigital",
6
6
  "url": "https://hkdigital.nl"