@mojaloop/sdk-scheme-adapter 24.1.0 → 24.1.1
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.
- package/.yarn/cache/{@eslint-compat-npm-1.2.6-9efc700114-116c277749.zip → @eslint-compat-npm-1.2.7-b26d41d869-bdb5102a1e.zip} +0 -0
- package/.yarn/cache/@mojaloop-central-services-shared-npm-18.18.2-8137f1eb81-a820a25d55.zip +0 -0
- package/.yarn/cache/{@mojaloop-event-sdk-npm-14.1.4-06eb082f24-5cab6c2cee.zip → @mojaloop-event-sdk-npm-14.1.5-97dbf6c0e3-9d5836df5a.zip} +0 -0
- package/.yarn/cache/@mojaloop-inter-scheme-proxy-cache-lib-npm-2.3.3-ca0069f863-f1f9e228ec.zip +0 -0
- package/.yarn/cache/@mojaloop-ml-schema-transformer-lib-npm-2.5.4-e84e9bcf4f-2ce61a546e.zip +0 -0
- package/.yarn/cache/@mojaloop-sdk-standard-components-npm-19.7.0-04e9d9d599-fefb01a635.zip +0 -0
- package/.yarn/cache/{@types-node-npm-22.13.4-80985669cb-39ecbd84fc.zip → @types-node-npm-22.13.5-4c5912eee2-8789d9bc3e.zip} +0 -0
- package/.yarn/cache/@typescript-eslint-eslint-plugin-npm-8.25.0-f1ecf3f166-8e6f525d9c.zip +0 -0
- package/.yarn/cache/@typescript-eslint-parser-npm-8.25.0-31c155428a-5de468b96b.zip +0 -0
- package/.yarn/cache/@typescript-eslint-scope-manager-npm-8.25.0-091dbcfc8f-0778232545.zip +0 -0
- package/.yarn/cache/@typescript-eslint-type-utils-npm-8.25.0-948ec177d4-ee4bccb650.zip +0 -0
- package/.yarn/cache/@typescript-eslint-types-npm-8.25.0-3b5d366120-958395fb20.zip +0 -0
- package/.yarn/cache/@typescript-eslint-typescript-estree-npm-8.25.0-3d5d32528c-b103847df2.zip +0 -0
- package/.yarn/cache/@typescript-eslint-utils-npm-8.25.0-8fbe62cef1-60572c8880.zip +0 -0
- package/.yarn/cache/@typescript-eslint-visitor-keys-npm-8.25.0-d1f59eb977-e9570dd2ff.zip +0 -0
- package/.yarn/cache/semver-npm-7.7.1-4572475307-586b825d36.zip +0 -0
- package/.yarn/cache/{ts-jest-npm-29.2.5-3012d53ff5-d60d1e1d80.zip → ts-jest-npm-29.2.6-81e5c09384-ff71b27e99.zip} +0 -0
- package/.yarn/install-state.gz +0 -0
- package/CHANGELOG.md +7 -0
- package/modules/api-svc/package.json +4 -4
- package/modules/api-svc/src/OutboundServer/handlers.js +13 -17
- package/modules/api-svc/src/config.js +3 -2
- package/modules/api-svc/src/index.js +5 -5
- package/modules/api-svc/src/lib/model/InboundTransfersModel.js +20 -23
- package/modules/api-svc/src/lib/model/OutboundBulkQuotesModel.js +8 -7
- package/modules/api-svc/src/lib/model/OutboundBulkTransfersModel.js +8 -7
- package/modules/api-svc/src/lib/model/OutboundRequestToPayModel.js +9 -6
- package/modules/api-svc/src/lib/model/OutboundTransfersModel.js +48 -40
- package/modules/api-svc/test/unit/config.test.js +1 -0
- package/modules/api-svc/test/unit/outboundApi/handlers.test.js +13 -85
- package/modules/outbound-command-event-handler/package.json +6 -6
- package/modules/outbound-domain-event-handler/package.json +4 -4
- package/modules/private-shared-lib/package.json +6 -6
- package/package.json +5 -5
- package/.yarn/cache/@typescript-eslint-eslint-plugin-npm-8.24.1-43fd154139-9627eb794d.zip +0 -0
- package/.yarn/cache/@typescript-eslint-parser-npm-8.24.1-fedd86ba37-859b78630a.zip +0 -0
- package/.yarn/cache/@typescript-eslint-scope-manager-npm-8.24.1-bbbd19850f-193c072cd0.zip +0 -0
- package/.yarn/cache/@typescript-eslint-type-utils-npm-8.24.1-a739e69814-18a4431890.zip +0 -0
- package/.yarn/cache/@typescript-eslint-types-npm-8.24.1-599b1de09d-6304b153de.zip +0 -0
- package/.yarn/cache/@typescript-eslint-typescript-estree-npm-8.24.1-006a219495-9a4055ebed.zip +0 -0
- package/.yarn/cache/@typescript-eslint-utils-npm-8.24.1-d8e526dcfa-87b62de9d0.zip +0 -0
- package/.yarn/cache/@typescript-eslint-visitor-keys-npm-8.24.1-7dbb0c7cb9-82b91cf090.zip +0 -0
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/.yarn/cache/@mojaloop-inter-scheme-proxy-cache-lib-npm-2.3.3-ca0069f863-f1f9e228ec.zip
ADDED
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/.yarn/install-state.gz
CHANGED
|
Binary file
|
package/CHANGELOG.md
CHANGED
|
@@ -1,4 +1,11 @@
|
|
|
1
1
|
# Changelog: [mojaloop/sdk-scheme-adapter](https://github.com/mojaloop/sdk-scheme-adapter)
|
|
2
|
+
### [24.1.1](https://github.com/mojaloop/sdk-scheme-adapter/compare/v24.1.0...v24.1.1) (2025-02-25)
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
### Chore
|
|
6
|
+
|
|
7
|
+
* **csi-1237:** improved logging ([#546](https://github.com/mojaloop/sdk-scheme-adapter/issues/546)) ([41af8db](https://github.com/mojaloop/sdk-scheme-adapter/commit/41af8dbc23412514a241c635888920ff27edfa6e))
|
|
8
|
+
|
|
2
9
|
## [24.1.0](https://github.com/mojaloop/sdk-scheme-adapter/compare/v24.0.8...v24.1.0) (2025-02-21)
|
|
3
10
|
|
|
4
11
|
|
|
@@ -68,12 +68,12 @@
|
|
|
68
68
|
"@mojaloop/central-services-error-handling": "^13.0.6",
|
|
69
69
|
"@mojaloop/central-services-logger": "^11.5.5",
|
|
70
70
|
"@mojaloop/central-services-metrics": "^12.4.5",
|
|
71
|
-
"@mojaloop/central-services-shared": "^18.18.
|
|
72
|
-
"@mojaloop/event-sdk": "^14.1.
|
|
71
|
+
"@mojaloop/central-services-shared": "^18.18.2",
|
|
72
|
+
"@mojaloop/event-sdk": "^14.1.5",
|
|
73
73
|
"@mojaloop/logging-bc-client-lib": "0.5.8",
|
|
74
|
-
"@mojaloop/ml-schema-transformer-lib": "^2.5.
|
|
74
|
+
"@mojaloop/ml-schema-transformer-lib": "^2.5.4",
|
|
75
75
|
"@mojaloop/sdk-scheme-adapter-private-shared-lib": "workspace:^",
|
|
76
|
-
"@mojaloop/sdk-standard-components": "19.
|
|
76
|
+
"@mojaloop/sdk-standard-components": "19.7.0",
|
|
77
77
|
"ajv": "8.17.1",
|
|
78
78
|
"axios": "^1.7.9",
|
|
79
79
|
"body-parser": "^1.20.3",
|
|
@@ -29,7 +29,6 @@
|
|
|
29
29
|
******/
|
|
30
30
|
'use strict';
|
|
31
31
|
|
|
32
|
-
const safeStringify = require('fast-safe-stringify');
|
|
33
32
|
const {
|
|
34
33
|
AccountsModel,
|
|
35
34
|
OutboundTransfersModel,
|
|
@@ -54,7 +53,7 @@ const { ReturnCodes } = Enum.Http;
|
|
|
54
53
|
* Error handling logic shared by outbound API handlers
|
|
55
54
|
*/
|
|
56
55
|
const handleError = (method, err, ctx, stateField) => {
|
|
57
|
-
ctx.state.logger.
|
|
56
|
+
ctx.state.logger.push({ err, stateField }).error(`Error handling ${method}`);
|
|
58
57
|
ctx.response.status = err.httpStatusCode || ReturnCodes.INTERNALSERVERERRROR.CODE;
|
|
59
58
|
ctx.response.body = {
|
|
60
59
|
message: err.message || 'Unspecified error',
|
|
@@ -72,6 +71,7 @@ const handleError = (method, err, ctx, stateField) => {
|
|
|
72
71
|
// the structure of the response object in depth to ascertain an underlying mojaloop API error code.
|
|
73
72
|
const errorInformation = err[stateField].lastError.mojaloopError.errorInformation;
|
|
74
73
|
ctx.response.body.statusCode = errorInformation.errorCode;
|
|
74
|
+
ctx.state.logger.warn('errorInformation - ', errorInformation);
|
|
75
75
|
|
|
76
76
|
// if we have been configured to use an error extensionList item as status code, look for it and use
|
|
77
77
|
// it if it is present...
|
|
@@ -125,13 +125,21 @@ const handleRequestSimpleTransfersInformationError = (method, err, ctx) =>
|
|
|
125
125
|
|
|
126
126
|
const createOutboundTransfersModel = (ctx) => new OutboundTransfersModel({
|
|
127
127
|
...ctx.state.conf,
|
|
128
|
-
...ctx.state.path?.params?.dfspId && {dfspId: ctx.state.path.params.dfspId},
|
|
128
|
+
...(ctx.state.path?.params?.dfspId && { dfspId: ctx.state.path.params.dfspId }),
|
|
129
129
|
cache: ctx.state.cache,
|
|
130
130
|
logger: ctx.state.logger,
|
|
131
131
|
wso2: ctx.state.wso2,
|
|
132
132
|
metricsClient: ctx.state.metricsClient,
|
|
133
133
|
});
|
|
134
134
|
|
|
135
|
+
const createOutboundBulkTransfersModel = (ctx) => new OutboundBulkTransfersModel({
|
|
136
|
+
...ctx.state.conf,
|
|
137
|
+
...(ctx.state.path?.params?.dfspId && { dfspId: ctx.state.path.params.dfspId }),
|
|
138
|
+
cache: ctx.state.cache,
|
|
139
|
+
logger: ctx.state.logger,
|
|
140
|
+
wso2: ctx.state.wso2,
|
|
141
|
+
});
|
|
142
|
+
|
|
135
143
|
/**
|
|
136
144
|
* Handler for outbound transfer request initiation
|
|
137
145
|
*/
|
|
@@ -222,13 +230,7 @@ const postBulkTransfers = async (ctx) => {
|
|
|
222
230
|
};
|
|
223
231
|
|
|
224
232
|
// use the bulk transfers model to execute asynchronous stages with the switch
|
|
225
|
-
const model =
|
|
226
|
-
...ctx.state.conf,
|
|
227
|
-
...ctx.state.path?.params?.dfspId && {dfspId: ctx.state.path.params.dfspId},
|
|
228
|
-
cache: ctx.state.cache,
|
|
229
|
-
logger: ctx.state.logger,
|
|
230
|
-
wso2: ctx.state.wso2,
|
|
231
|
-
});
|
|
233
|
+
const model = createOutboundBulkTransfersModel(ctx);
|
|
232
234
|
|
|
233
235
|
await model.initialize(bulkTransferRequest);
|
|
234
236
|
const response = await model.run();
|
|
@@ -254,13 +256,7 @@ const getBulkTransfers = async (ctx) => {
|
|
|
254
256
|
};
|
|
255
257
|
|
|
256
258
|
// use the bulk transfers model to execute asynchronous stages with the switch
|
|
257
|
-
const model =
|
|
258
|
-
...ctx.state.conf,
|
|
259
|
-
...ctx.state.path?.params?.dfspId && {dfspId: ctx.state.path.params.dfspId},
|
|
260
|
-
cache: ctx.state.cache,
|
|
261
|
-
logger: ctx.state.logger,
|
|
262
|
-
wso2: ctx.state.wso2,
|
|
263
|
-
});
|
|
259
|
+
const model = createOutboundBulkTransfersModel(ctx);
|
|
264
260
|
|
|
265
261
|
await model.initialize(bulkTransferRequest);
|
|
266
262
|
const response = await model.getBulkTransfer();
|
|
@@ -26,10 +26,11 @@
|
|
|
26
26
|
******/
|
|
27
27
|
'use strict';
|
|
28
28
|
|
|
29
|
-
const fs = require('fs');
|
|
30
29
|
require('dotenv').config();
|
|
30
|
+
const fs = require('node:fs');
|
|
31
31
|
const yaml = require('js-yaml');
|
|
32
32
|
const { from } = require('env-var');
|
|
33
|
+
const { Logger } = require('@mojaloop/sdk-standard-components').Logger;
|
|
33
34
|
const { API_TYPES, RESOURCE_VERSIONS_STRING } = require('./constants');
|
|
34
35
|
|
|
35
36
|
function getFileContent (path) {
|
|
@@ -88,7 +89,7 @@ module.exports = {
|
|
|
88
89
|
mgmtAPIWsPort: env.get('MGMT_API_WS_PORT').default('4005').asPortNumber()
|
|
89
90
|
},
|
|
90
91
|
idGenerator: env.get('ID_GENERATOR').default('{"type":"ulid"}').asJsonObject(),
|
|
91
|
-
logLevel: env.get('LOG_LEVEL').default('info').asEnum(
|
|
92
|
+
logLevel: env.get('LOG_LEVEL').default('info').asEnum(Logger.logLevels),
|
|
92
93
|
inbound: {
|
|
93
94
|
port: env.get('INBOUND_LISTEN_PORT').default('4000').asPortNumber(),
|
|
94
95
|
tls: {
|
|
@@ -376,9 +376,9 @@ class Server extends EventEmitter {
|
|
|
376
376
|
async function _GetUpdatedConfigFromMgmtAPI(conf, logger, client) {
|
|
377
377
|
logger.isInfoEnabled && logger.info(`Getting updated config from Management API at ${conf.control.mgmtAPIWsUrl}:${conf.control.mgmtAPIWsPort}...`);
|
|
378
378
|
const clientSendResponse = await client.send(ControlAgent.build.CONFIGURATION.READ());
|
|
379
|
-
logger.
|
|
379
|
+
logger.isDebugEnabled && logger.debug('client send returned:: ', clientSendResponse);
|
|
380
380
|
const responseRead = await client.receive();
|
|
381
|
-
logger.
|
|
381
|
+
logger.isDebugEnabled && logger.debug('client receive returned:: ', responseRead);
|
|
382
382
|
return responseRead.data;
|
|
383
383
|
}
|
|
384
384
|
|
|
@@ -387,13 +387,13 @@ async function start(config) {
|
|
|
387
387
|
|
|
388
388
|
if (config.pm4mlEnabled) {
|
|
389
389
|
const controlClient = await ControlAgent.Client.Create({
|
|
390
|
+
appConfig: config,
|
|
390
391
|
address: config.control.mgmtAPIWsUrl,
|
|
391
392
|
port: config.control.mgmtAPIWsPort,
|
|
392
|
-
logger
|
|
393
|
-
appConfig: config,
|
|
393
|
+
logger,
|
|
394
394
|
});
|
|
395
395
|
const updatedConfigFromMgmtAPI = await _GetUpdatedConfigFromMgmtAPI(config, logger, controlClient);
|
|
396
|
-
logger.isInfoEnabled && logger.push({ updatedConfigFromMgmtAPI }).info('updatedConfigFromMgmtAPI:');
|
|
396
|
+
logger.isInfoEnabled && logger.push({ updatedConfigFromMgmtAPIKeys: Object.keys(updatedConfigFromMgmtAPI) }).info('updatedConfigFromMgmtAPI keys:');
|
|
397
397
|
_.merge(config, updatedConfigFromMgmtAPI);
|
|
398
398
|
controlClient.terminate();
|
|
399
399
|
}
|
|
@@ -122,11 +122,10 @@ class InboundTransfersModel {
|
|
|
122
122
|
return this._mojaloopRequests.putAuthorizations(transactionRequestId, mlAuthorization, sourceFspId);
|
|
123
123
|
}
|
|
124
124
|
catch(err) {
|
|
125
|
-
this._logger.isErrorEnabled && this._logger.push({ err }).error('Error in getOTP');
|
|
125
|
+
this._logger.isErrorEnabled && this._logger.push({ err, transactionRequestId }).error('Error in getOTP');
|
|
126
126
|
const mojaloopError = await this._handleError(err);
|
|
127
127
|
this._logger.isDebugEnabled && this._logger.push({ mojaloopError }).debug(`Sending error response to ${sourceFspId}`);
|
|
128
|
-
return this._mojaloopRequests.putAuthorizationsError(transactionRequestId,
|
|
129
|
-
mojaloopError, sourceFspId);
|
|
128
|
+
return this._mojaloopRequests.putAuthorizationsError(transactionRequestId, mojaloopError, sourceFspId);
|
|
130
129
|
}
|
|
131
130
|
}
|
|
132
131
|
|
|
@@ -148,7 +147,7 @@ class InboundTransfersModel {
|
|
|
148
147
|
sourceFspId);
|
|
149
148
|
}
|
|
150
149
|
catch(err) {
|
|
151
|
-
this._logger.isErrorEnabled && this._logger.push({ err }).error('Error in getParticipants');
|
|
150
|
+
this._logger.isErrorEnabled && this._logger.push({ err, idValue }).error('Error in getParticipants');
|
|
152
151
|
const mojaloopError = await this._handleError(err);
|
|
153
152
|
this._logger.isDebugEnabled && this._logger.push({ mojaloopError }).debug(`Sending error response to ${sourceFspId}`);
|
|
154
153
|
return this._mojaloopRequests.putParticipantsError(idType, idValue, idSubValue,
|
|
@@ -189,7 +188,7 @@ class InboundTransfersModel {
|
|
|
189
188
|
|
|
190
189
|
}
|
|
191
190
|
catch(err) {
|
|
192
|
-
this._logger.isErrorEnabled && this._logger.push({ err }).error('Error in getParties');
|
|
191
|
+
this._logger.isErrorEnabled && this._logger.push({ err, idValue }).error('Error in getParties');
|
|
193
192
|
const mojaloopError = await this._handleError(err);
|
|
194
193
|
this._logger.isDebugEnabled && this._logger.push({ mojaloopError }).debug(`Sending error response to ${sourceFspId}`);
|
|
195
194
|
return this._mojaloopRequests.putPartiesError(idType, idValue, idSubValue,
|
|
@@ -318,7 +317,7 @@ class InboundTransfersModel {
|
|
|
318
317
|
await this._backendRequests.putRequestToPayNotification(internalForm, transactionRequestId);
|
|
319
318
|
}
|
|
320
319
|
catch(err) {
|
|
321
|
-
this._logger.push({ err }).error('Error in putTransactionRequest');
|
|
320
|
+
this._logger.push({ err, transactionRequestId }).error('Error in putTransactionRequest');
|
|
322
321
|
const mojaloopError = await this._handleError(err);
|
|
323
322
|
this._logger.isDebugEnabled && this._logger.push({ mojaloopError }).debug(`Sending error response to ${sourceFspId}`);
|
|
324
323
|
return await this._mojaloopRequests.putQuotesError(transactionRequestId,
|
|
@@ -339,19 +338,17 @@ class InboundTransfersModel {
|
|
|
339
338
|
if (!quoteResponse) {
|
|
340
339
|
const err = new Error('Quote Id not found');
|
|
341
340
|
const mojaloopError = await this._handleError(err, Errors.MojaloopApiErrorCodes.QUOTE_ID_NOT_FOUND);
|
|
342
|
-
this._logger.push({ mojaloopError }).
|
|
343
|
-
return await this._mojaloopRequests.putQuotesError(quoteId,
|
|
344
|
-
mojaloopError, sourceFspId);
|
|
341
|
+
this._logger.push({ mojaloopError, quoteId }).warn(`Sending error response to ${sourceFspId}`);
|
|
342
|
+
return await this._mojaloopRequests.putQuotesError(quoteId, mojaloopError, sourceFspId);
|
|
345
343
|
}
|
|
346
344
|
// Make a PUT /quotes/{ID} callback to the source fsp with the quote response
|
|
347
345
|
return this._mojaloopRequests.putQuotes(quoteId, quoteResponse, sourceFspId);
|
|
348
346
|
}
|
|
349
347
|
catch(err) {
|
|
350
|
-
this._logger.push({ err }).error('Error in getQuoteRequest');
|
|
348
|
+
this._logger.push({ err, quoteId }).error('Error in getQuoteRequest');
|
|
351
349
|
const mojaloopError = await this._handleError(err);
|
|
352
|
-
this._logger.
|
|
353
|
-
return await this._mojaloopRequests.putQuotesError(quoteId,
|
|
354
|
-
mojaloopError, sourceFspId);
|
|
350
|
+
this._logger.isVerboseEnabled && this._logger.push({ mojaloopError }).verbose(`Sending error response to ${sourceFspId}`);
|
|
351
|
+
return await this._mojaloopRequests.putQuotesError(quoteId, mojaloopError, sourceFspId);
|
|
355
352
|
}
|
|
356
353
|
}
|
|
357
354
|
|
|
@@ -378,7 +375,7 @@ class InboundTransfersModel {
|
|
|
378
375
|
return this._mojaloopRequests.putTransactionRequests(transactionRequest.transactionRequestId, mojaloopResponse, sourceFspId);
|
|
379
376
|
}
|
|
380
377
|
catch(err) {
|
|
381
|
-
this._logger.push({ err }).error(
|
|
378
|
+
this._logger.push({ err }).error(`Error in transactionRequest ${transactionRequest?.transactionRequestId}`);
|
|
382
379
|
const mojaloopError = await this._handleError(err);
|
|
383
380
|
this._logger.isDebugEnabled && this._logger.push({ mojaloopError }).debug(`Sending error response to ${sourceFspId}`);
|
|
384
381
|
return this._mojaloopRequests.putTransactionRequestsError(transactionRequest.transactionRequestId,
|
|
@@ -491,7 +488,7 @@ class InboundTransfersModel {
|
|
|
491
488
|
await this._save();
|
|
492
489
|
return res;
|
|
493
490
|
} catch(err) {
|
|
494
|
-
this._logger.isErrorEnabled && this._logger.push({ err }).error(
|
|
491
|
+
this._logger.isErrorEnabled && this._logger.push({ err }).error(`Error in prepareTransfer: ${request?.body?.transferId}`);
|
|
495
492
|
const mojaloopError = await this._handleError(err);
|
|
496
493
|
this._logger.isDebugEnabled && this._logger.push({ mojaloopError }).debug(`Sending error response to ${sourceFspId}`);
|
|
497
494
|
return await this._mojaloopRequests.putTransfersError(prepareRequest.transferId,
|
|
@@ -548,7 +545,7 @@ class InboundTransfersModel {
|
|
|
548
545
|
sourceFspId);
|
|
549
546
|
}
|
|
550
547
|
catch (err) {
|
|
551
|
-
this._logger.isErrorEnabled && this._logger.push({ err }).error('Error in getTransfers');
|
|
548
|
+
this._logger.isErrorEnabled && this._logger.push({ err, transferId }).error('Error in getTransfers');
|
|
552
549
|
const mojaloopError = await this._handleError(err);
|
|
553
550
|
this._logger.isDebugEnabled && this._logger.push({ mojaloopError }).debug(`Sending error response to ${sourceFspId}`);
|
|
554
551
|
return this._mojaloopRequests.putTransfersError(transferId,
|
|
@@ -773,7 +770,7 @@ class InboundTransfersModel {
|
|
|
773
770
|
sourceFspId);
|
|
774
771
|
}
|
|
775
772
|
catch (err) {
|
|
776
|
-
this._logger.isErrorEnabled && this._logger.push({ err }).error('Error in getBulkQuote');
|
|
773
|
+
this._logger.isErrorEnabled && this._logger.push({ err, bulkQuoteId }).error('Error in getBulkQuote');
|
|
777
774
|
const mojaloopError = await this._handleError(err);
|
|
778
775
|
this._logger.isDebugEnabled && this._logger.push({ mojaloopError }).debug(`Sending error response to ${sourceFspId}`);
|
|
779
776
|
return this._mojaloopRequests.putBulkQuotesError(bulkQuoteId,
|
|
@@ -951,7 +948,7 @@ class InboundTransfersModel {
|
|
|
951
948
|
sourceFspId);
|
|
952
949
|
}
|
|
953
950
|
catch (err) {
|
|
954
|
-
this._logger.isErrorEnabled && this._logger.push({ err }).error('Error in getBulkTransfer');
|
|
951
|
+
this._logger.isErrorEnabled && this._logger.push({ err, bulkTransferId }).error('Error in getBulkTransfer');
|
|
955
952
|
const mojaloopError = await this._handleError(err);
|
|
956
953
|
this._logger.isDebugEnabled && this._logger.push({ mojaloopError }).debug(`Sending error response to ${sourceFspId}`);
|
|
957
954
|
return this._mojaloopRequests.putBulkTransfersError(bulkTransferId,
|
|
@@ -983,7 +980,7 @@ class InboundTransfersModel {
|
|
|
983
980
|
const res = await this._backendRequests.patchFxTransfersNotification(this.data,conversionId);
|
|
984
981
|
return res;
|
|
985
982
|
} catch (err) {
|
|
986
|
-
this._logger.isErrorEnabled && this._logger.push({ err }).error(`Error notifying backend of final conversionId state equal to: ${body.conversionState} `);
|
|
983
|
+
this._logger.isErrorEnabled && this._logger.push({ err, conversionId }).error(`Error notifying backend of final conversionId state equal to: ${body.conversionState} `);
|
|
987
984
|
}
|
|
988
985
|
}
|
|
989
986
|
/**
|
|
@@ -1022,7 +1019,7 @@ class InboundTransfersModel {
|
|
|
1022
1019
|
const res = await this._backendRequests.putTransfersNotification(this.data, transferId);
|
|
1023
1020
|
return res;
|
|
1024
1021
|
} catch (err) {
|
|
1025
|
-
this._logger.isErrorEnabled && this._logger.push({ err }).error(`Error notifying backend of final transfer state equal to: ${body.transferState}`);
|
|
1022
|
+
this._logger.isErrorEnabled && this._logger.push({ err, transferId }).error(`Error notifying backend of final transfer state equal to: ${body.transferState}`);
|
|
1026
1023
|
}
|
|
1027
1024
|
}
|
|
1028
1025
|
|
|
@@ -1097,7 +1094,7 @@ class InboundTransfersModel {
|
|
|
1097
1094
|
return data;
|
|
1098
1095
|
}
|
|
1099
1096
|
catch(err) {
|
|
1100
|
-
this._logger.isErrorEnabled && this._logger.push({ err }).error('Error loading transfer model');
|
|
1097
|
+
this._logger.isErrorEnabled && this._logger.push({ err, transferId }).error('Error loading transfer model');
|
|
1101
1098
|
throw err;
|
|
1102
1099
|
}
|
|
1103
1100
|
}
|
|
@@ -1105,13 +1102,13 @@ class InboundTransfersModel {
|
|
|
1105
1102
|
async saveFxState() { // fxQuote + fxTransfer
|
|
1106
1103
|
const key = this.makeFxQuoteCacheKey(this.data?.conversionId);
|
|
1107
1104
|
const res = await this._cache.set(key, this.data, this._cacheTtl);
|
|
1108
|
-
this._logger.push({ key, res }).
|
|
1105
|
+
this._logger.push({ key, res }).debug('fxState is saved in cache');
|
|
1109
1106
|
}
|
|
1110
1107
|
|
|
1111
1108
|
async loadFxState(conversionId) {
|
|
1112
1109
|
const key = this.makeFxQuoteCacheKey(conversionId);
|
|
1113
1110
|
const data = await this._cache.get(key);
|
|
1114
|
-
this._logger.push({ key, data }).
|
|
1111
|
+
this._logger.push({ key, data }).debug('fxState is loaded from cache');
|
|
1115
1112
|
return data;
|
|
1116
1113
|
}
|
|
1117
1114
|
|
|
@@ -455,43 +455,44 @@ class OutboundBulkQuotesModel {
|
|
|
455
455
|
* Returns a promise that resolves when the state machine has reached a terminal state
|
|
456
456
|
*/
|
|
457
457
|
async run() {
|
|
458
|
+
const log = this._logger.push({ bulkQuoteId: this.data.bulkQuoteId });
|
|
458
459
|
try {
|
|
459
460
|
// run transitions based on incoming state
|
|
460
461
|
switch(this.data.currentState) {
|
|
461
462
|
case 'start':
|
|
462
463
|
await this.stateMachine.requestBulkQuote();
|
|
463
|
-
|
|
464
|
+
log.isInfoEnabled && log.info('Quotes resolved for bulk quote');
|
|
464
465
|
break;
|
|
465
466
|
|
|
466
467
|
case 'getBulkQuote':
|
|
467
468
|
await this.stateMachine.getBulkQuote();
|
|
468
|
-
|
|
469
|
+
log.isInfoEnabled && log.info('Get bulk quote has been completed');
|
|
469
470
|
break;
|
|
470
471
|
|
|
471
472
|
case 'succeeded':
|
|
472
473
|
// all steps complete so return
|
|
473
|
-
|
|
474
|
+
log.isInfoEnabled && log.info('Bulk quoting completed successfully');
|
|
474
475
|
await this._save();
|
|
475
476
|
return this.getResponse();
|
|
476
477
|
|
|
477
478
|
case 'errored':
|
|
478
479
|
// stopped in errored state
|
|
479
|
-
|
|
480
|
+
log.isWarnEnabled && log.warn('State machine in errored state');
|
|
480
481
|
return;
|
|
481
482
|
}
|
|
482
483
|
|
|
483
484
|
// now call ourselves recursively to deal with the next transition
|
|
484
|
-
|
|
485
|
+
log.isVerboseEnabled && log.verbose(`Bulk quote model state machine transition completed in state: ${this.stateMachine.state}. Recursing to handle next transition.`);
|
|
485
486
|
return this.run();
|
|
486
487
|
}
|
|
487
488
|
catch(err) {
|
|
488
|
-
|
|
489
|
+
log.isErrorEnabled && log.push({ err }).error(`Error running bulk quote model: ${err?.message}`);
|
|
489
490
|
|
|
490
491
|
// as this function is recursive, we dont want to error the state machine multiple times
|
|
491
492
|
if(this.data.currentState !== 'errored') {
|
|
492
493
|
// err should not have a bulkQuoteState property here!
|
|
493
494
|
if(err.bulkQuoteState) {
|
|
494
|
-
|
|
495
|
+
log.isWarnEnabled && log.warn('State machine is broken');
|
|
495
496
|
}
|
|
496
497
|
// transition to errored state
|
|
497
498
|
await this.stateMachine.error(err);
|
|
@@ -448,43 +448,44 @@ class OutboundBulkTransfersModel {
|
|
|
448
448
|
* Returns a promise that resolves when the state machine has reached a terminal state
|
|
449
449
|
*/
|
|
450
450
|
async run() {
|
|
451
|
+
const log = this._logger.push({ bulkTransferId: this.data.bulkTransferId });
|
|
451
452
|
try {
|
|
452
453
|
// run transitions based on incoming state
|
|
453
454
|
switch(this.data.currentState) {
|
|
454
455
|
case 'start':
|
|
455
456
|
await this.stateMachine.executeBulkTransfer();
|
|
456
|
-
|
|
457
|
+
log.isInfoEnabled && log.info('Bulk transfer has been started');
|
|
457
458
|
break;
|
|
458
459
|
|
|
459
460
|
case 'getBulkTransfer':
|
|
460
461
|
await this.stateMachine.getBulkTransfer();
|
|
461
|
-
|
|
462
|
+
log.isInfoEnabled && log.info('Get bulk transfer has been completed');
|
|
462
463
|
break;
|
|
463
464
|
|
|
464
465
|
case 'succeeded':
|
|
465
466
|
// all steps complete so return
|
|
466
|
-
|
|
467
|
+
log.isInfoEnabled && log.info('Bulk transfer completed successfully');
|
|
467
468
|
await this._save();
|
|
468
469
|
return this.getResponse();
|
|
469
470
|
|
|
470
471
|
case 'errored':
|
|
471
472
|
// stopped in errored state
|
|
472
|
-
|
|
473
|
+
log.isWarnEnabled && log.warn('State machine in errored state');
|
|
473
474
|
return;
|
|
474
475
|
}
|
|
475
476
|
|
|
476
477
|
// now call ourselves recursively to deal with the next transition
|
|
477
|
-
|
|
478
|
+
log.isVerboseEnabled && log.verbose(`Bulk transfer model state machine transition completed in state: ${this.stateMachine.state}. Recursing to handle next transition.`);
|
|
478
479
|
return this.run();
|
|
479
480
|
}
|
|
480
481
|
catch(err) {
|
|
481
|
-
|
|
482
|
+
log.isErrorEnabled && log.push({ err }).error(`Error running bulk transfer model: ${err.message}`);
|
|
482
483
|
|
|
483
484
|
// as this function is recursive, we dont want to error the state machine multiple times
|
|
484
485
|
if(this.data.currentState !== 'errored') {
|
|
485
486
|
// err should not have a bulkTransferState property here!
|
|
486
487
|
if(err.bulkTransferState) {
|
|
487
|
-
|
|
488
|
+
log.isWarnEnabled && log.warn('State machine is broken');
|
|
488
489
|
}
|
|
489
490
|
// transition to errored state
|
|
490
491
|
await this.stateMachine.error(err);
|
|
@@ -426,16 +426,19 @@ class OutboundRequestToPayModel {
|
|
|
426
426
|
* Returns a promise that resolves when the state machine has reached a terminal state
|
|
427
427
|
*/
|
|
428
428
|
async run() {
|
|
429
|
+
const { transferId, transactionRequestId } = this.data;
|
|
430
|
+
const log = this._logger.push({ transferId, transactionRequestId });
|
|
429
431
|
try {
|
|
430
432
|
// run transitions based on incoming state
|
|
431
433
|
switch(this.data.currentState) {
|
|
432
434
|
case 'start':
|
|
433
435
|
// next transition is to resolvePayee
|
|
434
436
|
await this.stateMachine.resolvePayee();
|
|
435
|
-
|
|
437
|
+
log.isInfoEnabled && log.info('Payee resolved for RequestToPay transfer');
|
|
436
438
|
if(this.stateMachine.state === 'payeeResolved' && !this._autoAcceptR2PParty) {
|
|
437
439
|
//we break execution here and return the resolved party details to allow asynchronous accept or reject
|
|
438
440
|
//of the resolved party
|
|
441
|
+
log.isInfoEnabled && log.info('Waiting for asynchronous accept or reject of resolved party');
|
|
439
442
|
await this._save();
|
|
440
443
|
return this.getResponse();
|
|
441
444
|
}
|
|
@@ -444,12 +447,12 @@ class OutboundRequestToPayModel {
|
|
|
444
447
|
case 'payeeResolved':
|
|
445
448
|
// next transition is to requestQuote
|
|
446
449
|
await this.stateMachine.executeTransactionRequest();
|
|
447
|
-
|
|
450
|
+
log.isInfoEnabled && log.info('Transaction Request has been completed');
|
|
448
451
|
break;
|
|
449
452
|
|
|
450
453
|
case 'succeeded':
|
|
451
454
|
// all steps complete so return
|
|
452
|
-
|
|
455
|
+
log.isInfoEnabled && log.info('Transaction Request completed successfully');
|
|
453
456
|
await this._save();
|
|
454
457
|
return this.getResponse();
|
|
455
458
|
|
|
@@ -460,17 +463,17 @@ class OutboundRequestToPayModel {
|
|
|
460
463
|
}
|
|
461
464
|
|
|
462
465
|
// now call ourselves recursively to deal with the next transition
|
|
463
|
-
|
|
466
|
+
log.isVerboseEnabled && log.verbose(`RequestToPay model state machine transition completed in state: ${this.stateMachine.state}. Recursing to handle next transition.`);
|
|
464
467
|
return this.run();
|
|
465
468
|
}
|
|
466
469
|
catch(err) {
|
|
467
|
-
|
|
470
|
+
log.isErrorEnabled && log.error(`Error running RequestToPay model: ${err?.message}`);
|
|
468
471
|
|
|
469
472
|
// as this function is recursive, we dont want to error the state machine multiple times
|
|
470
473
|
if(this.data.currentState !== 'errored') {
|
|
471
474
|
// err should not have a lastError property here!
|
|
472
475
|
if(err.lastError) {
|
|
473
|
-
|
|
476
|
+
log.isWarnEnabled && log.warn('State machine is broken');
|
|
474
477
|
}
|
|
475
478
|
// transition to errored state
|
|
476
479
|
await this.stateMachine.error(err);
|
|
@@ -210,7 +210,7 @@ class OutboundTransfersModel {
|
|
|
210
210
|
* Updates the internal state representation to reflect that of the state machine itself
|
|
211
211
|
*/
|
|
212
212
|
_afterTransition() {
|
|
213
|
-
this._logger.
|
|
213
|
+
this._logger.isVerboseEnabled && this._logger.verbose(`State machine transitioned: ${this.data.currentState} -> ${this.stateMachine.state} for transfer ${this.data.transferId}`);
|
|
214
214
|
this.data.currentState = this.stateMachine.state;
|
|
215
215
|
}
|
|
216
216
|
|
|
@@ -348,7 +348,7 @@ class OutboundTransfersModel {
|
|
|
348
348
|
// cancel the timeout handler
|
|
349
349
|
clearTimeout(timeout);
|
|
350
350
|
|
|
351
|
-
this._logger.
|
|
351
|
+
this._logger.isVerboseEnabled && this._logger.push({ payee }).verbose('Payee resolved');
|
|
352
352
|
|
|
353
353
|
// stop listening for payee resolution messages
|
|
354
354
|
// no need to await for the unsubscribe to complete.
|
|
@@ -392,7 +392,7 @@ class OutboundTransfersModel {
|
|
|
392
392
|
}
|
|
393
393
|
this.data.to.dateOfBirth = payee.personalInfo.dateOfBirth;
|
|
394
394
|
}
|
|
395
|
-
|
|
395
|
+
|
|
396
396
|
if (Array.isArray(payee.supportedCurrencies)) {
|
|
397
397
|
if (!payee.supportedCurrencies.length) {
|
|
398
398
|
throw new Error(ErrorMessages.noSupportedCurrencies);
|
|
@@ -586,7 +586,7 @@ class OutboundTransfersModel {
|
|
|
586
586
|
body: payload,
|
|
587
587
|
headers: originalRequest.headers
|
|
588
588
|
};
|
|
589
|
-
this._logger.
|
|
589
|
+
this._logger.isVerboseEnabled && this._logger.push({ fxQuotePayload: payload }).verbose('fxQuote request is sent to hub');
|
|
590
590
|
|
|
591
591
|
const message = await subscribing;
|
|
592
592
|
|
|
@@ -665,7 +665,7 @@ class OutboundTransfersModel {
|
|
|
665
665
|
error.mojaloopError = message.data.body;
|
|
666
666
|
}
|
|
667
667
|
else {
|
|
668
|
-
this._logger.
|
|
668
|
+
this._logger.isVerboseEnabled && this._logger.push({ quoteKey, message }).verbose(`Ignoring cache notification for quote ${quoteKey}. Unknown message type ${message.type}.`);
|
|
669
669
|
return;
|
|
670
670
|
}
|
|
671
671
|
|
|
@@ -689,7 +689,7 @@ class OutboundTransfersModel {
|
|
|
689
689
|
body: message.data.body,
|
|
690
690
|
originalIso20022QuoteResponse: message.data.originalIso20022QuoteResponse,
|
|
691
691
|
};
|
|
692
|
-
this._logger.push({ quoteResponse: this.data.quoteResponse.body }).
|
|
692
|
+
this._logger.isVerboseEnabled && this._logger.push({ quoteResponse: this.data.quoteResponse.body }).verbose('Quote response received');
|
|
693
693
|
|
|
694
694
|
this.data.quoteResponseSource = this.data.quoteResponse.headers['fspiop-source'];
|
|
695
695
|
|
|
@@ -897,7 +897,7 @@ class OutboundTransfersModel {
|
|
|
897
897
|
error = new BackendError(`Got an error response preparing transfer: ${safeStringify(message.data.body, { depth: Infinity })}`, 500);
|
|
898
898
|
error.mojaloopError = message.data.body;
|
|
899
899
|
} else {
|
|
900
|
-
this._logger.
|
|
900
|
+
this._logger.isVerboseEnabled && this._logger.push({ message }).verbose(`Ignoring cache notification for transfer ${transferKey}. Unknown message type ${message.type}.`);
|
|
901
901
|
return;
|
|
902
902
|
}
|
|
903
903
|
|
|
@@ -914,7 +914,7 @@ class OutboundTransfersModel {
|
|
|
914
914
|
}
|
|
915
915
|
|
|
916
916
|
const fulfil = message.data;
|
|
917
|
-
this._logger.
|
|
917
|
+
this._logger.isInfoEnabled && this._logger.push({ fulfil: fulfil.body }).info('Transfer fulfil received');
|
|
918
918
|
this.data.fulfil = fulfil;
|
|
919
919
|
if(this._checkIlp && !this._ilp.validateFulfil(fulfil.body.fulfilment, this.data.quoteResponse.body.condition)) {
|
|
920
920
|
throw new Error('Invalid fulfilment received from peer DFSP.');
|
|
@@ -934,7 +934,7 @@ class OutboundTransfersModel {
|
|
|
934
934
|
const res = this._requests.patchTransfers(this.data.transferId,
|
|
935
935
|
patchNotification, this.data.quoteResponseSource);
|
|
936
936
|
this.data.patch = res.originalRequest;
|
|
937
|
-
this._logger.
|
|
937
|
+
this._logger.isInfoEnabled && this._logger.info(`PATCH final notification sent to peer for transfer ${this.data.transferId}`);
|
|
938
938
|
}
|
|
939
939
|
return resolve(fulfil.body);
|
|
940
940
|
}
|
|
@@ -980,7 +980,7 @@ class OutboundTransfersModel {
|
|
|
980
980
|
};
|
|
981
981
|
|
|
982
982
|
this.metrics.transferPrepares.inc();
|
|
983
|
-
this._logger.
|
|
983
|
+
this._logger.isVerboseEnabled && this._logger.push({ prepare, res }).verbose('Transfer prepare sent to peer');
|
|
984
984
|
}
|
|
985
985
|
catch(err) {
|
|
986
986
|
// cancel the timeout and unsubscribe before rejecting the promise
|
|
@@ -1013,7 +1013,7 @@ class OutboundTransfersModel {
|
|
|
1013
1013
|
error = new BackendError(`Got an error response retrieving transfer: ${safeStringify(message.data.body, { depth: Infinity })}`, 500);
|
|
1014
1014
|
error.mojaloopError = message.data.body;
|
|
1015
1015
|
} else if (message.type !== 'transferFulfil') {
|
|
1016
|
-
this._logger.
|
|
1016
|
+
this._logger.isVerboseEnabled && this._logger.push({ message }).verbose(`Ignoring cache notification for transfer ${transferKey}. Unknown message type ${message.type}.`);
|
|
1017
1017
|
return;
|
|
1018
1018
|
}
|
|
1019
1019
|
// cancel the timeout handler
|
|
@@ -1026,7 +1026,7 @@ class OutboundTransfersModel {
|
|
|
1026
1026
|
return reject(error);
|
|
1027
1027
|
}
|
|
1028
1028
|
const fulfil = message.data;
|
|
1029
|
-
this._logger.
|
|
1029
|
+
this._logger.isVerboseEnabled && this._logger.push({ fulfil: fulfil.body }).verbose('Transfer fulfil received');
|
|
1030
1030
|
this.data.fulfil = fulfil;
|
|
1031
1031
|
return resolve(this.data.fulfil);
|
|
1032
1032
|
}
|
|
@@ -1051,7 +1051,7 @@ class OutboundTransfersModel {
|
|
|
1051
1051
|
// a GET /transfers request to the switch
|
|
1052
1052
|
try {
|
|
1053
1053
|
const res = await this._requests.getTransfers(this.data.transferId);
|
|
1054
|
-
this._logger.
|
|
1054
|
+
this._logger.isVerboseEnabled && this._logger.push({ peer: res }).verbose(`getTransfers ${this.data.transferId} sent to peer`);
|
|
1055
1055
|
}
|
|
1056
1056
|
catch(err) {
|
|
1057
1057
|
// cancel the timout and unsubscribe before rejecting the promise
|
|
@@ -1114,7 +1114,7 @@ class OutboundTransfersModel {
|
|
|
1114
1114
|
'CdtTrfTxInf.InstrForCdtrAgt.',
|
|
1115
1115
|
'CdtTrfTxInf.InstrForNxtAgt.'
|
|
1116
1116
|
];
|
|
1117
|
-
const filteredExtensions = quoteResponseExtensions.filter(ext =>
|
|
1117
|
+
const filteredExtensions = quoteResponseExtensions.filter(ext =>
|
|
1118
1118
|
prefixes.some(prefix => ext.key.startsWith(prefix))
|
|
1119
1119
|
);
|
|
1120
1120
|
if (filteredExtensions.length > 0) {
|
|
@@ -1236,7 +1236,7 @@ class OutboundTransfersModel {
|
|
|
1236
1236
|
|
|
1237
1237
|
/**
|
|
1238
1238
|
* Determines if FX is needed for the transfer
|
|
1239
|
-
*
|
|
1239
|
+
*
|
|
1240
1240
|
* @param {Array} payerCurrencies - Array of supported currencies for the payer
|
|
1241
1241
|
* @param {Array} payeeCurrencies - Array of supported currencies for the payee
|
|
1242
1242
|
* @param {string} amountCurrency - Currency of the amount being transferred
|
|
@@ -1291,6 +1291,8 @@ class OutboundTransfersModel {
|
|
|
1291
1291
|
* @param mergeData {object} - an object to merge with the model state (data) before running the state machine
|
|
1292
1292
|
*/
|
|
1293
1293
|
async run(mergeData = null) {
|
|
1294
|
+
const log = this._logger.push({ transferId: this.data?.transferId });
|
|
1295
|
+
|
|
1294
1296
|
try {
|
|
1295
1297
|
// if we were passed a mergeData object...
|
|
1296
1298
|
// merge it with our existing state, overwriting any existing matching root level keys
|
|
@@ -1317,7 +1319,7 @@ class OutboundTransfersModel {
|
|
|
1317
1319
|
|
|
1318
1320
|
if (typeof(this.data.to.fspId) !== 'undefined' && this.data.skipPartyLookup) {
|
|
1319
1321
|
// we already have the payee DFSP and we have bee asked to skip party resolution
|
|
1320
|
-
|
|
1322
|
+
log.isInfoEnabled && log.info('Skipping payee resolution for transfer as to.fspId was provided and skipPartyLookup is truthy');
|
|
1321
1323
|
this.data.currentState = States.PAYEE_RESOLVED;
|
|
1322
1324
|
// (!) this.data.currentState and this.stateMachine.state are different now!
|
|
1323
1325
|
break;
|
|
@@ -1325,10 +1327,10 @@ class OutboundTransfersModel {
|
|
|
1325
1327
|
|
|
1326
1328
|
// next transition is to resolvePayee
|
|
1327
1329
|
await this.stateMachine.resolvePayee();
|
|
1328
|
-
|
|
1330
|
+
log.isInfoEnabled && log.info('Payee resolved for transfer');
|
|
1329
1331
|
|
|
1330
1332
|
if (this.stateMachine.state === States.PAYEE_RESOLVED && !this._autoAcceptParty) {
|
|
1331
|
-
|
|
1333
|
+
log.isInfoEnabled && log.info('Transfer waits for async acceptParty');
|
|
1332
1334
|
await this._save();
|
|
1333
1335
|
return this.getResponse();
|
|
1334
1336
|
}
|
|
@@ -1337,20 +1339,23 @@ class OutboundTransfersModel {
|
|
|
1337
1339
|
case States.PAYEE_RESOLVED:
|
|
1338
1340
|
if (!this._autoAcceptParty && !this.data.acceptParty && !this.data.skipPartyLookup) {
|
|
1339
1341
|
// resuming after a party resolution halt, backend did not accept the party.
|
|
1340
|
-
|
|
1342
|
+
const abortMessage = 'Payee rejected by backend';
|
|
1343
|
+
log.isInfoEnabled && log.info(abortMessage);
|
|
1344
|
+
await this.stateMachine.abort(abortMessage);
|
|
1341
1345
|
await this._save();
|
|
1342
1346
|
return this.getResponse();
|
|
1343
1347
|
}
|
|
1344
1348
|
|
|
1345
1349
|
if (this.data.needFx) {
|
|
1346
1350
|
await this.stateMachine.requestServicesFxp();
|
|
1347
|
-
|
|
1351
|
+
log.isInfoEnabled && log.info('Services FXP received for transfer');
|
|
1348
1352
|
} else {
|
|
1349
1353
|
await this.stateMachine.requestQuote();
|
|
1350
|
-
|
|
1354
|
+
log.isInfoEnabled && log.info('Quote received for transfer');
|
|
1351
1355
|
if (this.stateMachine.state === States.QUOTE_RECEIVED && !this._autoAcceptQuotes) {
|
|
1352
1356
|
//we break execution here and return the quote response details to allow asynchronous accept or reject
|
|
1353
1357
|
//of the quote
|
|
1358
|
+
log.isInfoEnabled && log.info('Transfer waits for async accept or reject of quotes');
|
|
1354
1359
|
await this._save();
|
|
1355
1360
|
return this.getResponse();
|
|
1356
1361
|
}
|
|
@@ -1363,11 +1368,11 @@ class OutboundTransfersModel {
|
|
|
1363
1368
|
: Transitions.REQUEST_QUOTE;
|
|
1364
1369
|
|
|
1365
1370
|
await this.stateMachine[transition]();
|
|
1366
|
-
|
|
1371
|
+
log.isInfoEnabled && log.info(`Transition ${transition} for transfer has been completed`);
|
|
1367
1372
|
|
|
1368
1373
|
if ([States.QUOTE_RECEIVED, States.FX_QUOTE_RECEIVED].includes(this.stateMachine.state)) {
|
|
1369
1374
|
//we break execution here and return the quotes/fxQuote response details to allow asynchronous accept or reject
|
|
1370
|
-
|
|
1375
|
+
log.isInfoEnabled && log.info(`Transfer waits for async accept or reject of ${transition}`);
|
|
1371
1376
|
await this._save();
|
|
1372
1377
|
return this.getResponse();
|
|
1373
1378
|
}
|
|
@@ -1378,7 +1383,9 @@ class OutboundTransfersModel {
|
|
|
1378
1383
|
if ((this.data.acceptConversion !== undefined && this.data.acceptConversion === false) ||
|
|
1379
1384
|
(this.data.acceptQuoteOrConversion !== undefined && this.data.acceptQuoteOrConversion === false) ||
|
|
1380
1385
|
(this.data.acceptConversion === undefined && this.data.acceptQuoteOrConversion === undefined)) {
|
|
1381
|
-
|
|
1386
|
+
const abortMessage = ErrorMessages.fxQuoteRejectedByBackend;
|
|
1387
|
+
log.isInfoEnabled && log.info(abortMessage);
|
|
1388
|
+
await this.stateMachine.abort(abortMessage);
|
|
1382
1389
|
await this._save();
|
|
1383
1390
|
return this.getResponse();
|
|
1384
1391
|
}
|
|
@@ -1388,10 +1395,10 @@ class OutboundTransfersModel {
|
|
|
1388
1395
|
: Transitions.EXECUTE_FX_TRANSFER;
|
|
1389
1396
|
|
|
1390
1397
|
await this.stateMachine[transition]();
|
|
1391
|
-
|
|
1398
|
+
log.isInfoEnabled && log.info(`Transition ${transition} for transfer is done`);
|
|
1392
1399
|
|
|
1393
1400
|
if (this.stateMachine.state === States.QUOTE_RECEIVED && !this._autoAcceptQuotes) {
|
|
1394
|
-
|
|
1401
|
+
log.isInfoEnabled && log.info('Transfer waits for async acceptQuotes');
|
|
1395
1402
|
await this._save();
|
|
1396
1403
|
return this.getResponse();
|
|
1397
1404
|
}
|
|
@@ -1404,7 +1411,9 @@ class OutboundTransfersModel {
|
|
|
1404
1411
|
(this.data.acceptQuoteOrConversion !== undefined && this.data.acceptQuoteOrConversion === false) ||
|
|
1405
1412
|
(this.data.acceptQuote === undefined && this.data.acceptQuoteOrConversion === undefined))) {
|
|
1406
1413
|
// resuming after a party resolution halt, backend did not accept the party.
|
|
1407
|
-
|
|
1414
|
+
const abortMessage = ErrorMessages.quoteRejectedByBackend;
|
|
1415
|
+
log.isInfoEnabled && log.info(abortMessage);
|
|
1416
|
+
await this.stateMachine.abort(abortMessage);
|
|
1408
1417
|
await this._save();
|
|
1409
1418
|
return this.getResponse();
|
|
1410
1419
|
}
|
|
@@ -1416,10 +1425,10 @@ class OutboundTransfersModel {
|
|
|
1416
1425
|
: Transitions.REQUEST_FX_QUOTE);
|
|
1417
1426
|
|
|
1418
1427
|
await this.stateMachine[transition]();
|
|
1419
|
-
|
|
1428
|
+
log.isInfoEnabled && log.info(`Transition ${transition} for transfer has been completed`);
|
|
1420
1429
|
|
|
1421
1430
|
if (this.stateMachine.state === States.FX_QUOTE_RECEIVED) { // todo: think, if we need to add _autoAcceptConversion
|
|
1422
|
-
|
|
1431
|
+
log.isInfoEnabled && log.info('Transfer waits for async acceptConversion');
|
|
1423
1432
|
await this._save();
|
|
1424
1433
|
return this.getResponse();
|
|
1425
1434
|
}
|
|
@@ -1428,52 +1437,51 @@ class OutboundTransfersModel {
|
|
|
1428
1437
|
|
|
1429
1438
|
case States.FX_TRANSFER_SUCCEEDED:
|
|
1430
1439
|
await this.stateMachine.executeTransfer();
|
|
1431
|
-
|
|
1440
|
+
log.isInfoEnabled && log.info('FxTransfer has been completed');
|
|
1432
1441
|
break;
|
|
1433
1442
|
|
|
1434
1443
|
case States.SUCCEEDED:
|
|
1435
1444
|
// all steps complete so return
|
|
1436
|
-
|
|
1445
|
+
log.isInfoEnabled && log.info('Transfer completed successfully');
|
|
1437
1446
|
await this._save();
|
|
1438
1447
|
return this.getResponse();
|
|
1439
1448
|
|
|
1440
1449
|
case States.ERRORED:
|
|
1441
1450
|
// stopped in errored state
|
|
1442
1451
|
await this._save();
|
|
1443
|
-
|
|
1452
|
+
log.isErrorEnabled && log.error('State machine in errored state');
|
|
1444
1453
|
return;
|
|
1445
1454
|
|
|
1446
1455
|
case States.ABORTED:
|
|
1447
1456
|
// stopped in aborted state
|
|
1448
|
-
|
|
1457
|
+
log.isWarnEnabled && log.warn('State machine in aborted state');
|
|
1449
1458
|
await this._save();
|
|
1450
1459
|
return this.getResponse();
|
|
1451
1460
|
|
|
1452
1461
|
// todo: no such state!
|
|
1453
1462
|
case 'getTransfer':
|
|
1454
1463
|
await this.stateMachine.getTransfer();
|
|
1455
|
-
|
|
1464
|
+
log.isInfoEnabled && log.info('getTransfer has been completed');
|
|
1456
1465
|
break;
|
|
1457
1466
|
|
|
1458
1467
|
default:
|
|
1459
1468
|
// The state is not handled here, throwing an error to avoid an infinite recursion of this function
|
|
1460
1469
|
await this._save();
|
|
1461
|
-
|
|
1470
|
+
log.isErrorEnabled && log.error(`State machine in unhandled state: ${this.data.currentState}`);
|
|
1462
1471
|
return;
|
|
1463
1472
|
}
|
|
1464
1473
|
|
|
1465
1474
|
// now call ourselves recursively to deal with the next transition
|
|
1466
|
-
|
|
1475
|
+
log.isVerboseEnabled && log.verbose(`Transfer model state machine transition completed in state: ${this.stateMachine.state}. Recursing to handle next transition.`);
|
|
1467
1476
|
return this.run();
|
|
1468
|
-
}
|
|
1469
|
-
|
|
1470
|
-
this._logger.isErrorEnabled && this._logger.error(`error running outbound transfer model ${this.data.transferId}: ${err?.message}`);
|
|
1477
|
+
} catch (err) {
|
|
1478
|
+
log.isErrorEnabled && log.push({ err }).error(`error running outbound transfer model: ${err?.message}`);
|
|
1471
1479
|
|
|
1472
1480
|
// as this function is recursive, we dont want to error the state machine multiple times
|
|
1473
1481
|
if (this.data.currentState !== States.ERRORED) {
|
|
1474
1482
|
// err should not have a transferState property here!
|
|
1475
1483
|
if (err.transferState) {
|
|
1476
|
-
|
|
1484
|
+
log.isWarnEnabled && log.warn(`State machine is broken: ${safeStringify(err)}`);
|
|
1477
1485
|
}
|
|
1478
1486
|
// transition to errored state
|
|
1479
1487
|
await this.stateMachine.error(err);
|
|
@@ -33,6 +33,7 @@ process.env.CACHE_URL = 'redis://172.17.0.2:6379';
|
|
|
33
33
|
process.env.MGMT_API_WS_URL = '0.0.0.0';
|
|
34
34
|
process.env.SUPPORTED_CURRENCIES='USD';
|
|
35
35
|
|
|
36
|
+
const uuid = require('@mojaloop/central-services-shared').Util.id({ type: 'ulid' });
|
|
36
37
|
const mockError = require('./data/mockError');
|
|
37
38
|
const mockBulkQuoteError = require('./data/mockBulkQuoteError');
|
|
38
39
|
const mockBulkTransferError = require('./data/mockBulkTransferError');
|
|
@@ -46,7 +47,6 @@ const bulkQuoteRequest = require('./data/bulkQuoteRequest');
|
|
|
46
47
|
const requestToPayPayload = require('./data/requestToPay');
|
|
47
48
|
const requestToPayTransferRequest = require('./data/requestToPayTransferRequest');
|
|
48
49
|
const mockLogger = require('../mockLogger');
|
|
49
|
-
const uuid = require('@mojaloop/central-services-shared').Util.id({type: 'ulid'});
|
|
50
50
|
|
|
51
51
|
jest.mock('~/lib/model');
|
|
52
52
|
|
|
@@ -170,13 +170,7 @@ describe('Outbound API handlers:', () => {
|
|
|
170
170
|
response: {},
|
|
171
171
|
state: {
|
|
172
172
|
conf: {},
|
|
173
|
-
logger:
|
|
174
|
-
log: () => {},
|
|
175
|
-
debug: () => {},
|
|
176
|
-
error: () => {},
|
|
177
|
-
isDebugEnabled: () => {},
|
|
178
|
-
isErrorEnabled: () => {}
|
|
179
|
-
},
|
|
173
|
+
logger: mockLogger(),
|
|
180
174
|
}
|
|
181
175
|
};
|
|
182
176
|
|
|
@@ -204,13 +198,7 @@ describe('Outbound API handlers:', () => {
|
|
|
204
198
|
conf: {
|
|
205
199
|
outboundErrorStatusCodeExtensionKey: 'extErrorKey' // <- tell the handler to use this extensionList item as source of statusCode
|
|
206
200
|
},
|
|
207
|
-
logger:
|
|
208
|
-
log: () => {},
|
|
209
|
-
debug: () => {},
|
|
210
|
-
error: () => {},
|
|
211
|
-
isDebugEnabled: () => {},
|
|
212
|
-
isErrorEnabled: () => {}
|
|
213
|
-
},
|
|
201
|
+
logger: mockLogger(),
|
|
214
202
|
}
|
|
215
203
|
};
|
|
216
204
|
|
|
@@ -242,13 +230,7 @@ describe('Outbound API handlers:', () => {
|
|
|
242
230
|
response: {},
|
|
243
231
|
state: {
|
|
244
232
|
conf: {},
|
|
245
|
-
logger:
|
|
246
|
-
log: () => {},
|
|
247
|
-
debug: () => {},
|
|
248
|
-
error: () => {},
|
|
249
|
-
isDebugEnabled: () => {},
|
|
250
|
-
isErrorEnabled: () => {}
|
|
251
|
-
},
|
|
233
|
+
logger: mockLogger(),
|
|
252
234
|
path: {
|
|
253
235
|
params: {
|
|
254
236
|
transferId: '12345'
|
|
@@ -280,13 +262,7 @@ describe('Outbound API handlers:', () => {
|
|
|
280
262
|
response: {},
|
|
281
263
|
state: {
|
|
282
264
|
conf: {},
|
|
283
|
-
logger:
|
|
284
|
-
log: () => {},
|
|
285
|
-
debug: () => {},
|
|
286
|
-
error: () => {},
|
|
287
|
-
isDebugEnabled: () => {},
|
|
288
|
-
isErrorEnabled: () => {}
|
|
289
|
-
},
|
|
265
|
+
logger: mockLogger(),
|
|
290
266
|
}
|
|
291
267
|
};
|
|
292
268
|
|
|
@@ -314,13 +290,7 @@ describe('Outbound API handlers:', () => {
|
|
|
314
290
|
conf: {
|
|
315
291
|
outboundErrorStatusCodeExtensionKey: 'extErrorKey' // <- tell the handler to use this extensionList item as source of statusCode
|
|
316
292
|
},
|
|
317
|
-
logger:
|
|
318
|
-
log: () => {},
|
|
319
|
-
debug: () => {},
|
|
320
|
-
error: () => {},
|
|
321
|
-
isDebugEnabled: () => {},
|
|
322
|
-
isErrorEnabled: () => {}
|
|
323
|
-
},
|
|
293
|
+
logger: mockLogger(),
|
|
324
294
|
}
|
|
325
295
|
};
|
|
326
296
|
|
|
@@ -350,13 +320,7 @@ describe('Outbound API handlers:', () => {
|
|
|
350
320
|
response: {},
|
|
351
321
|
state: {
|
|
352
322
|
conf: {},
|
|
353
|
-
logger:
|
|
354
|
-
log: () => {},
|
|
355
|
-
debug: () => {},
|
|
356
|
-
error: () => {},
|
|
357
|
-
isDebugEnabled: () => {},
|
|
358
|
-
isErrorEnabled: () => {}
|
|
359
|
-
},
|
|
323
|
+
logger: mockLogger(),
|
|
360
324
|
}
|
|
361
325
|
};
|
|
362
326
|
|
|
@@ -384,13 +348,7 @@ describe('Outbound API handlers:', () => {
|
|
|
384
348
|
conf: {
|
|
385
349
|
outboundErrorStatusCodeExtensionKey: 'extErrorKey' // <- tell the handler to use this extensionList item as source of statusCode
|
|
386
350
|
},
|
|
387
|
-
logger:
|
|
388
|
-
log: () => {},
|
|
389
|
-
debug: () => {},
|
|
390
|
-
error: () => {},
|
|
391
|
-
isDebugEnabled: () => {},
|
|
392
|
-
isErrorEnabled: () => {}
|
|
393
|
-
},
|
|
351
|
+
logger: mockLogger(),
|
|
394
352
|
}
|
|
395
353
|
};
|
|
396
354
|
|
|
@@ -420,13 +378,7 @@ describe('Outbound API handlers:', () => {
|
|
|
420
378
|
response: {},
|
|
421
379
|
state: {
|
|
422
380
|
conf: {},
|
|
423
|
-
logger:
|
|
424
|
-
log: () => {},
|
|
425
|
-
debug: () => {},
|
|
426
|
-
error: () => {},
|
|
427
|
-
isDebugEnabled: () => {},
|
|
428
|
-
isErrorEnabled: () => {}
|
|
429
|
-
},
|
|
381
|
+
logger: mockLogger(),
|
|
430
382
|
eventLogger: { info: () => {}},
|
|
431
383
|
eventProducer: { sendDomainEvent: jest.fn() },
|
|
432
384
|
}
|
|
@@ -465,13 +417,7 @@ describe('Outbound API handlers:', () => {
|
|
|
465
417
|
response: {},
|
|
466
418
|
state: {
|
|
467
419
|
conf: {},
|
|
468
|
-
logger:
|
|
469
|
-
log: () => {},
|
|
470
|
-
debug: () => {},
|
|
471
|
-
error: () => {},
|
|
472
|
-
isDebugEnabled: () => {},
|
|
473
|
-
isErrorEnabled: () => {}
|
|
474
|
-
},
|
|
420
|
+
logger: mockLogger(),
|
|
475
421
|
eventLogger: { info: () => {}},
|
|
476
422
|
eventProducer: { sendDomainEvent: jest.fn() },
|
|
477
423
|
path: {
|
|
@@ -513,13 +459,7 @@ describe('Outbound API handlers:', () => {
|
|
|
513
459
|
response: {},
|
|
514
460
|
state: {
|
|
515
461
|
conf: {},
|
|
516
|
-
logger:
|
|
517
|
-
log: () => {},
|
|
518
|
-
debug: () => {},
|
|
519
|
-
error: () => {},
|
|
520
|
-
isDebugEnabled: () => {},
|
|
521
|
-
isErrorEnabled: () => {}
|
|
522
|
-
},
|
|
462
|
+
logger: mockLogger(),
|
|
523
463
|
eventLogger: { info: () => {}},
|
|
524
464
|
eventProducer: { sendDomainEvent: jest.fn() },
|
|
525
465
|
path: {
|
|
@@ -553,13 +493,7 @@ describe('Outbound API handlers:', () => {
|
|
|
553
493
|
response: {},
|
|
554
494
|
state: {
|
|
555
495
|
conf: {},
|
|
556
|
-
logger:
|
|
557
|
-
log: () => {},
|
|
558
|
-
debug: () => {},
|
|
559
|
-
error: () => {},
|
|
560
|
-
isDebugEnabled: () => {},
|
|
561
|
-
isErrorEnabled: () => {}
|
|
562
|
-
},
|
|
496
|
+
logger: mockLogger(),
|
|
563
497
|
}
|
|
564
498
|
};
|
|
565
499
|
|
|
@@ -586,13 +520,7 @@ describe('Outbound API handlers:', () => {
|
|
|
586
520
|
response: {},
|
|
587
521
|
state: {
|
|
588
522
|
conf: {},
|
|
589
|
-
logger:
|
|
590
|
-
log: () => {},
|
|
591
|
-
debug: () => {},
|
|
592
|
-
error: () => {},
|
|
593
|
-
isDebugEnabled: () => {},
|
|
594
|
-
isErrorEnabled: () => {},
|
|
595
|
-
},
|
|
523
|
+
logger: mockLogger(),
|
|
596
524
|
}
|
|
597
525
|
};
|
|
598
526
|
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
},
|
|
43
43
|
"dependencies": {
|
|
44
44
|
"@mojaloop/api-snippets": "17.8.0",
|
|
45
|
-
"@mojaloop/central-services-shared": "^18.18.
|
|
45
|
+
"@mojaloop/central-services-shared": "^18.18.2",
|
|
46
46
|
"@mojaloop/logging-bc-client-lib": "^0.5.8",
|
|
47
47
|
"@mojaloop/logging-bc-public-types-lib": "^0.5.4",
|
|
48
48
|
"@mojaloop/sdk-scheme-adapter-private-shared-lib": "workspace:^",
|
|
@@ -55,17 +55,17 @@
|
|
|
55
55
|
"yamljs": "^0.3.0"
|
|
56
56
|
},
|
|
57
57
|
"devDependencies": {
|
|
58
|
-
"@eslint/compat": "^1.2.
|
|
58
|
+
"@eslint/compat": "^1.2.7",
|
|
59
59
|
"@types/convict": "^6.1.6",
|
|
60
60
|
"@types/express": "^5.0.0",
|
|
61
61
|
"@types/jest": "^29.5.14",
|
|
62
|
-
"@types/node": "^22.13.
|
|
62
|
+
"@types/node": "^22.13.5",
|
|
63
63
|
"@types/node-cache": "^4.2.5",
|
|
64
64
|
"@types/supertest": "^6.0.2",
|
|
65
65
|
"@types/swagger-ui-express": "4.1.8",
|
|
66
66
|
"@types/yamljs": "^0.2.34",
|
|
67
|
-
"@typescript-eslint/eslint-plugin": "^8.
|
|
68
|
-
"@typescript-eslint/parser": "^8.
|
|
67
|
+
"@typescript-eslint/eslint-plugin": "^8.25.0",
|
|
68
|
+
"@typescript-eslint/parser": "^8.25.0",
|
|
69
69
|
"copyfiles": "^2.4.1",
|
|
70
70
|
"eslint": "^9.15.0",
|
|
71
71
|
"jest": "^29.7.0",
|
|
@@ -73,7 +73,7 @@
|
|
|
73
73
|
"npm-check-updates": "^16.7.10",
|
|
74
74
|
"replace": "^1.2.2",
|
|
75
75
|
"standard-version": "^9.5.0",
|
|
76
|
-
"ts-jest": "^29.2.
|
|
76
|
+
"ts-jest": "^29.2.6",
|
|
77
77
|
"ts-node": "^10.9.2",
|
|
78
78
|
"typescript": "^5.7.3"
|
|
79
79
|
},
|
|
@@ -56,13 +56,13 @@
|
|
|
56
56
|
"@types/convict": "^6.1.6",
|
|
57
57
|
"@types/express": "^5.0.0",
|
|
58
58
|
"@types/jest": "^29.5.14",
|
|
59
|
-
"@types/node": "^22.13.
|
|
59
|
+
"@types/node": "^22.13.5",
|
|
60
60
|
"@types/node-cache": "^4.2.5",
|
|
61
61
|
"@types/supertest": "^6.0.2",
|
|
62
62
|
"@types/swagger-ui-express": "^4.1.8",
|
|
63
63
|
"@types/yamljs": "^0.2.34",
|
|
64
|
-
"@typescript-eslint/eslint-plugin": "^8.
|
|
65
|
-
"@typescript-eslint/parser": "^8.
|
|
64
|
+
"@typescript-eslint/eslint-plugin": "^8.25.0",
|
|
65
|
+
"@typescript-eslint/parser": "^8.25.0",
|
|
66
66
|
"copyfiles": "^2.4.1",
|
|
67
67
|
"eslint": "^9.15.0",
|
|
68
68
|
"jest": "^29.7.0",
|
|
@@ -70,7 +70,7 @@
|
|
|
70
70
|
"npm-check-updates": "^16.7.10",
|
|
71
71
|
"replace": "^1.2.2",
|
|
72
72
|
"standard-version": "^9.5.0",
|
|
73
|
-
"ts-jest": "^29.2.
|
|
73
|
+
"ts-jest": "^29.2.6",
|
|
74
74
|
"ts-node": "^10.9.2",
|
|
75
75
|
"typescript": "^5.7.3"
|
|
76
76
|
},
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
},
|
|
31
31
|
"dependencies": {
|
|
32
32
|
"@mojaloop/api-snippets": "17.8.0",
|
|
33
|
-
"@mojaloop/central-services-shared": "^18.18.
|
|
33
|
+
"@mojaloop/central-services-shared": "^18.18.2",
|
|
34
34
|
"@mojaloop/logging-bc-public-types-lib": "^0.5.4",
|
|
35
35
|
"@mojaloop/platform-shared-lib-messaging-types-lib": "^0.7.1",
|
|
36
36
|
"@mojaloop/platform-shared-lib-nodejs-kafka-client-lib": "0.5.18",
|
|
@@ -39,17 +39,17 @@
|
|
|
39
39
|
"uuid": "^11.1.0"
|
|
40
40
|
},
|
|
41
41
|
"devDependencies": {
|
|
42
|
-
"@eslint/compat": "^1.2.
|
|
43
|
-
"@types/node": "^22.13.
|
|
42
|
+
"@eslint/compat": "^1.2.7",
|
|
43
|
+
"@types/node": "^22.13.5",
|
|
44
44
|
"@types/uuid": "^10.0.0",
|
|
45
|
-
"@typescript-eslint/eslint-plugin": "^8.
|
|
46
|
-
"@typescript-eslint/parser": "^8.
|
|
45
|
+
"@typescript-eslint/eslint-plugin": "^8.25.0",
|
|
46
|
+
"@typescript-eslint/parser": "^8.25.0",
|
|
47
47
|
"eslint": "^9.15.0",
|
|
48
48
|
"jest": "^29.7.0",
|
|
49
49
|
"npm-check-updates": "^16.7.10",
|
|
50
50
|
"replace": "^1.2.2",
|
|
51
51
|
"standard-version": "^9.5.0",
|
|
52
|
-
"ts-jest": "^29.2.
|
|
52
|
+
"ts-jest": "^29.2.6",
|
|
53
53
|
"tslib": "^2.8.1",
|
|
54
54
|
"typescript": "^5.7.3"
|
|
55
55
|
},
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@mojaloop/sdk-scheme-adapter",
|
|
3
|
-
"version": "24.1.
|
|
3
|
+
"version": "24.1.1",
|
|
4
4
|
"description": "mojaloop sdk-scheme-adapter",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"homepage": "https://github.com/mojaloop/sdk-scheme-adapter",
|
|
@@ -82,10 +82,10 @@
|
|
|
82
82
|
},
|
|
83
83
|
"devDependencies": {
|
|
84
84
|
"@types/jest": "^29.5.14",
|
|
85
|
-
"@types/node": "^22.13.
|
|
85
|
+
"@types/node": "^22.13.5",
|
|
86
86
|
"@types/node-cache": "^4.2.5",
|
|
87
|
-
"@typescript-eslint/eslint-plugin": "^8.
|
|
88
|
-
"@typescript-eslint/parser": "^8.
|
|
87
|
+
"@typescript-eslint/eslint-plugin": "^8.25.0",
|
|
88
|
+
"@typescript-eslint/parser": "^8.25.0",
|
|
89
89
|
"audit-ci": "^7.1.0",
|
|
90
90
|
"eslint": "^9.15.0",
|
|
91
91
|
"eslint-config-airbnb-typescript": "^18.0.0",
|
|
@@ -96,7 +96,7 @@
|
|
|
96
96
|
"npm-check-updates": "^16.7.10",
|
|
97
97
|
"replace": "^1.2.2",
|
|
98
98
|
"standard-version": "^9.5.0",
|
|
99
|
-
"ts-jest": "^29.2.
|
|
99
|
+
"ts-jest": "^29.2.6",
|
|
100
100
|
"ts-node": "^10.9.2",
|
|
101
101
|
"typescript": "^5.7.3",
|
|
102
102
|
"yarn-audit-fix": "^10.1.1"
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
|
Binary file
|
package/.yarn/cache/@typescript-eslint-typescript-estree-npm-8.24.1-006a219495-9a4055ebed.zip
DELETED
|
Binary file
|
|
Binary file
|