Skip to content

Commit 741950e

Browse files
authored
feat(csi-1252): switched to use ContextLogger (#244)
* feat(csi-1252): switched to use ContextLogger * chore(snapshot): 19.10.0-snapshot.0 * feat(csi-1252): updated loggerFactory * chore(snapshot): 19.10.0-snapshot.1 * feat(csi-1252): used this.constructor.name to create childLogger * chore(snapshot): 19.10.0-snapshot.2
1 parent 09fb5a0 commit 741950e

20 files changed

+203
-751
lines changed

CODEOWNERS

+1-1
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
## @global-owner1 and @global-owner2 will be requested for
66
## review when someone opens a pull request.
77
#* @global-owner1 @global-owner2
8-
* @elnyry-sam-k @bushjames @kleyow @vijayg10 @oderayi @geka-evk @shashi165 @gibaros
8+
* @elnyry-sam-k @bushjames @kleyow @vijayg10 @oderayi @geka-evk @shashi165 @gibaros @kalinkrustev
99
## Order is important; the last matching pattern takes the most
1010
## precedence. When someone opens a pull request that only
1111
## modifies JS files, only @js-owner and not the global

package-lock.json

+36-10
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

+4-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "@mojaloop/sdk-standard-components",
3-
"version": "19.9.0",
3+
"version": "19.10.0-snapshot.2",
44
"description": "A set of standard components for connecting to Mojaloop API enabled Switches",
55
"main": "src/index.js",
66
"types": "src/index.d.ts",
@@ -43,8 +43,9 @@
4343
}
4444
],
4545
"dependencies": {
46+
"@mojaloop/central-services-logger": "11.5.5",
4647
"@mojaloop/ml-schema-transformer-lib": "2.5.6",
47-
"axios": "1.8.1",
48+
"axios": "1.8.2",
4849
"axios-retry": "4.5.0",
4950
"base64url": "3.0.1",
5051
"fast-safe-stringify": "2.1.1",
@@ -72,7 +73,7 @@
7273
"devDependencies": {
7374
"@mojaloop/api-snippets": "17.8.0",
7475
"@types/jest": "29.5.14",
75-
"@types/node": "22.13.9",
76+
"@types/node": "22.13.10",
7677
"audit-ci": "7.1.0",
7778
"axios-mock-adapter": "2.1.0",
7879
"eslint": "8.57.0",

src/index.d.ts

+26-68
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import http from 'http'
22
import { KeyObject } from 'tls'
3+
import { ILogger, ContextLogger } from '@mojaloop/central-services-logger/src/contextLogger'
34
import {
45
//This needs reconsidering if and when more changes are included in fspiop v2.0, currently they're non-breaking as far as any existing fields are replaced, but when such changes come in, this needs to be reviewed.
56
v2_0 as fspiopAPI,
@@ -8,6 +9,13 @@ import {
89

910
import * as ilp from './ilp'
1011

12+
type Json =
13+
| string
14+
| number
15+
| boolean
16+
| { [x: string]: Json }
17+
| Array<Json>;
18+
1119
declare namespace SDKStandardComponents {
1220

1321
/* hashmap of versions of various resources */
@@ -41,7 +49,7 @@ declare namespace SDKStandardComponents {
4149
}
4250

4351
type BaseRequestConfigType = {
44-
logger: Logger.Logger;
52+
logger: Logger.SdkLogger;
4553
tls: BaseRequestTLSConfig;
4654
dfspId: string;
4755
jwsSign: boolean;
@@ -512,7 +520,7 @@ declare namespace SDKStandardComponents {
512520
}
513521

514522
interface WSO2AuthConfig {
515-
logger: Logger.Logger,
523+
logger: Logger.SdkLogger,
516524
tlsCreds?: {
517525
ca: string
518526
cert: string
@@ -553,75 +561,25 @@ declare namespace SDKStandardComponents {
553561
*/
554562
stop(): void
555563
}
556-
namespace Logger {
557-
type Level = 'verbose' | 'debug' | 'warn' | 'error' | 'trace' | 'info' | 'fatal'
558-
type TimestampFormatter = (ts: Date) => string;
559-
type Stringify = (toBeStringified: unknown) => string;
560-
interface LoggerStringifyParams {
561-
ctx: unknown
562-
msg: unknown
563-
level: Level
564-
}
565-
566-
type LoggerStringify = (params: LoggerStringifyParams) => string
567-
568-
569-
interface BuildStringifyParams {
570-
isJsonOutput?: boolean
571-
space?: number
572-
printTimestamp?: boolean
573-
timestampFmt?: TimestampFormatter
574-
stringify?: Stringify
575-
}
576-
type BuildStringify = (params: BuildStringifyParams) => LoggerStringify;
577-
578-
function buildStringify(params: BuildStringifyParams): LoggerStringify
579-
580-
interface LoggerOptions {
581-
allowContextOverwrite: boolean
582-
copy: (arg0: unknown) => unknown
583-
levels: Level[]
584-
}
585564

586-
interface LoggerConstructorParams {
587-
ctx?: unknown
588-
stringify?: Stringify
589-
opts?: LoggerOptions
590-
}
565+
namespace Logger {
566+
type Level = 'silly' | 'debug' | 'verbose' | 'perf' | 'info' | 'trace' | 'audit' | 'warn' | 'error'
567+
type LogContext = Json | null;
568+
type LogMeta = Json | Error | null;
591569

592-
interface LoggerConfigureParams {
593-
stringify?: Stringify
594-
opts?: LoggerOptions
570+
type CreateLoggerFactoryConfig = {
571+
context?: LogContext,
572+
isJsonOutput?: boolean,
595573
}
574+
// todo: need to be aligned with ContextLogger ctor params
596575

597-
/**
598-
* @class Logger
599-
* @description fast and lightweight logger which do pretty dumping of anything into the log in a pretty way
600-
*/
601-
class Logger {
602-
protected stringify: BuildStringify
603-
protected opts: LoggerOptions
604-
605-
constructor(params?: LoggerConstructorParams)
606-
607-
configure(params?: LoggerConfigureParams): void
608-
609-
push(arg: unknown): Logger
610-
log(...args: unknown[]): void
611-
612-
// default set of logging methods taken from default levels
613-
// if you want to use different log levels
614-
// this part of code will not work for you
615-
verbose(arg: unknown): void
616-
debug(arg: unknown): void
617-
warn(arg: unknown): void
618-
error(arg: unknown): void
619-
trace(arg: unknown): void
620-
info(arg: unknown): void
621-
fatal(arg: unknown): void
576+
export function loggerFactory(config?: CreateLoggerFactoryConfig): SdkLogger;
622577

623-
static logLevels: Level[]
578+
export class SdkLogger extends ContextLogger implements ILogger {
579+
push(context?: LogContext): SdkLogger
580+
log(message: string, meta?: LogMeta): void
624581
}
582+
export const LOG_LEVELS: Level[]
625583
}
626584

627585
enum RequestResponseType { ArrayBuffer, JSON, Text, Stream }
@@ -813,12 +771,12 @@ declare namespace SDKStandardComponents {
813771
}
814772

815773
type JwsValidatorConfig = {
816-
logger: Logger.Logger
774+
logger: Logger.SdkLogger
817775
validationKeys: Record<string, Buffer> | Record<string, string>
818776
}
819777

820778
type JwsSignerConfig = {
821-
logger: Logger.Logger
779+
logger: Logger.SdkLogger
822780
signingKey: String
823781
}
824782

@@ -890,7 +848,7 @@ declare namespace SDKStandardComponents {
890848

891849
type IlpOptions = {
892850
secret: string;
893-
logger: Logger.Logger;
851+
logger: Logger.SdkLogger;
894852
}
895853

896854
namespace Ilp {

src/lib/WSO2Auth/index.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ class WSO2Auth extends EventEmitter {
6060
*/
6161
constructor(opts) {
6262
super({ captureExceptions: true });
63-
this._logger = opts.logger.push({ component: WSO2Auth.name });
63+
this._logger = opts.logger.push({ component: this.constructor.name });
6464
this._refreshSeconds = opts.refreshSeconds || DEFAULT_REFRESH_INTERVAL_SECONDS;
6565
this._refreshRetrySeconds = opts.refreshRetrySeconds || DEFAULT_REFRESH_RETRY_INTERVAL_SECONDS;
6666

src/lib/httpRequester/AxiosHttpRequester.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ class AxiosHttpRequester {
137137
const { method, baseURL, url, params } = err.config;
138138
config = { method, baseURL, url, params, restData: '[REDACTED]' };
139139
}
140-
this.logger.push({ error: { ...err, config } }).warn('error in sending HTTP request');
140+
this.logger.warn('error in sending HTTP request', { error: { ...err, config, request: '[REDACTED]' } });
141141
return err;
142142
}
143143

src/lib/httpRequester/index.js

+4-3
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,12 @@
3737
* @prop {http.Agent} agent - HTTP agent, used to send the request.
3838
*/
3939

40-
const { Logger } = require('../logger');
40+
const { loggerFactory } = require('../logger');
4141
const defaultConfig = require('./defaultConfig');
4242
const AxiosHttpRequester = require('./AxiosHttpRequester');
4343

4444
const createHttpRequester = ({
45-
logger = new Logger({ context: { component: AxiosHttpRequester.name } }),
45+
logger = loggerFactory({ context: { component: AxiosHttpRequester.name } }),
4646
httpClient = null,
4747
httpConfig = defaultConfig.createDefaultHttpConfig(),
4848
retryConfig = defaultConfig.createDefaultRetryConfig(logger),
@@ -58,14 +58,15 @@ const httpRequester = createHttpRequester();
5858

5959
/**
6060
* Backwards compatibility http request functionality
61+
* @deprecated Use createHttpRequester instead
6162
* @param {HttpOptions} reqOpts - HTTP request options
6263
* @returns {Promise<unknown>} HTTP response
6364
*/
6465
const request = (reqOpts) => httpRequester.sendRequest(reqOpts);
6566
request.responseType = httpRequester.responseType;
6667

6768
module.exports = {
68-
request,
69+
request, // use createHttpRequester instead
6970
createHttpRequester,
7071
defaultConfig,
7172
};

src/lib/ilp/IlpBase.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ const DIGEST_ENCODING = 'base64url';
4646
class IlpBase {
4747
constructor(config) {
4848
this.secret = config.secret;
49-
this.logger = config.logger;
49+
this.logger = config.logger.push({ component: this.constructor.name });
5050
}
5151

5252
get version() {

src/lib/jws/jwsSigner.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ const uriRegex = /(?:^.*)(\/(participants|parties|quotes|bulkQuotes|transfers|bu
4141
*/
4242
class JwsSigner {
4343
constructor(config) {
44-
this.logger = config.logger || console;
44+
this.logger = config.logger?.push({ component: this.constructor.name }) || console;
4545

4646
if(!config.signingKey) {
4747
throw new Error('Signing key must be supplied as config argument');

src/lib/jws/jwsValidator.js

+4-8
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ const SIGNATURE_ALGORITHMS = ['RS256', 'ES256'];
4242
*/
4343
class JwsValidator {
4444
constructor(config) {
45-
this.logger = config.logger || console;
45+
this.logger = config.logger?.push({ component: this.constructor.name }) || console;
4646

4747
if(!config.validationKeys) {
4848
throw new Error('Validation keys must be supplied as config argument');
@@ -100,15 +100,11 @@ class JwsValidator {
100100
// check protected header has all required fields and matches actual incoming headers
101101
this._validateProtectedHeader(headers, result.header);
102102

103-
// const result = jwt.verify(token, pubKey, { complete: true, json: true });
104-
this.logger.isDebugEnabled && this.logger.debug(`JWS verify result: ${safeStringify(result)}`);
105-
106-
// all ok if we got here
107-
this.logger.isDebugEnabled && this.logger.debug(`JWS valid for request ${safeStringify(request)}`);
103+
this.logger.debug('JWS verify result for request:', { result, request });
108104
return true;
109105
}
110-
catch(err) {
111-
this.logger.isErrorEnabled && this.logger.error(`Error validating JWS: ${err.stack || safeStringify(err)}`);
106+
catch (err) {
107+
this.logger.error(`Error validating JWS: ${err?.message}`, err);
112108
throw err;
113109
}
114110
}

0 commit comments

Comments
 (0)