@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 {
|
|
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?:
|
|
14
|
+
constructor(name: string, defaultLevel?: LogLevel, context?: Object);
|
|
14
15
|
name: string;
|
|
15
|
-
level:
|
|
16
|
+
level: import("../../typedef.js").LogLevel;
|
|
16
17
|
/**
|
|
17
18
|
* Set the minimum log level threshold
|
|
18
19
|
*
|
|
19
|
-
* @param {
|
|
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:
|
|
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(
|
|
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 {
|
|
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 {
|
|
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(
|
|
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(
|
|
258
|
+
this.#logEvent(eventData);
|
|
254
259
|
}
|
|
255
260
|
|
|
256
261
|
/**
|
|
257
262
|
* Internal logging method
|
|
258
263
|
*
|
|
259
|
-
* @param {
|
|
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" ) {
|
package/dist/services/README.md
CHANGED
|
@@ -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.
|
|
306
|
-
logger.logFromEvent(
|
|
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
|
-
|
|
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
|
|
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 (
|
|
449
|
-
|
|
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)) {
|