@mojaloop/sdk-scheme-adapter 12.0.0 → 12.1.0
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/.circleci/config.yml +619 -0
- package/.env.example +13 -0
- package/.nvmrc +1 -1
- package/.versionrc +1 -0
- package/CHANGELOG.md +28 -2
- package/CODEOWNERS +2 -0
- package/Dockerfile +35 -0
- package/LICENSE.md +10 -0
- package/PROXY.md +84 -0
- package/README.md +228 -0
- package/SECURITY.md +18 -0
- package/audit-resolve.json +45 -0
- package/docker/ml-testing-toolkit/secrets/keygen.sh +5 -0
- package/docker/ml-testing-toolkit/secrets/privatekey.pem +27 -0
- package/docker/ml-testing-toolkit/secrets/publickey.cer +21 -0
- package/docker/ml-testing-toolkit/secrets/tls/createSecrets.sh +29 -0
- package/docker/ml-testing-toolkit/secrets/tls/hub_client.csr +28 -0
- package/docker/ml-testing-toolkit/secrets/tls/hub_client_cacert.pem +32 -0
- package/docker/ml-testing-toolkit/secrets/tls/hub_client_cakey.key +51 -0
- package/docker/ml-testing-toolkit/secrets/tls/hub_client_key.key +51 -0
- package/docker/ml-testing-toolkit/secrets/tls/hub_server.csr +28 -0
- package/docker/ml-testing-toolkit/secrets/tls/hub_server_cacert.pem +32 -0
- package/docker/ml-testing-toolkit/secrets/tls/hub_server_cacert.srl +1 -0
- package/docker/ml-testing-toolkit/secrets/tls/hub_server_cakey.key +51 -0
- package/docker/ml-testing-toolkit/secrets/tls/hub_server_cert.pem +33 -0
- package/docker/ml-testing-toolkit/secrets/tls/hub_server_key.key +51 -0
- package/docker/ml-testing-toolkit/secrets/tls/openssl.conf +17 -0
- package/docker/ml-testing-toolkit/spec_files/api_definitions/central_admin_9.3/api_spec.yaml +2450 -0
- package/docker/ml-testing-toolkit/spec_files/api_definitions/central_admin_9.3/response_map.json +96 -0
- package/docker/ml-testing-toolkit/spec_files/api_definitions/fspiop_1.0/api_spec.yaml +4187 -0
- package/docker/ml-testing-toolkit/spec_files/api_definitions/fspiop_1.0/callback_map.json +542 -0
- package/docker/ml-testing-toolkit/spec_files/api_definitions/fspiop_1.0/mockRef.json +83 -0
- package/docker/ml-testing-toolkit/spec_files/api_definitions/fspiop_1.0/trigger_templates/transaction_request_followup.json +125 -0
- package/docker/ml-testing-toolkit/spec_files/api_definitions/fspiop_1.1/api_spec.yaml +3703 -0
- package/docker/ml-testing-toolkit/spec_files/api_definitions/fspiop_1.1/callback_map.json +568 -0
- package/docker/ml-testing-toolkit/spec_files/api_definitions/fspiop_1.1/mockRef.json +83 -0
- package/docker/ml-testing-toolkit/spec_files/api_definitions/fspiop_1.1/trigger_templates/transaction_request_followup.json +125 -0
- package/docker/ml-testing-toolkit/spec_files/api_definitions/settlements_1.0/api_spec.yaml +983 -0
- package/docker/ml-testing-toolkit/spec_files/api_definitions/settlements_1.0/mockRef.json +38 -0
- package/docker/ml-testing-toolkit/spec_files/api_definitions/settlements_1.0/response_map.json +34 -0
- package/docker/ml-testing-toolkit/spec_files/reports/templates/newman/html_template.html +1074 -0
- package/docker/ml-testing-toolkit/spec_files/reports/templates/newman/pdf_template.html +765 -0
- package/docker/ml-testing-toolkit/spec_files/reports/templates/newman/script.js +98 -0
- package/docker/ml-testing-toolkit/spec_files/rules_callback/config.json +3 -0
- package/docker/ml-testing-toolkit/spec_files/rules_callback/default.json +426 -0
- package/docker/ml-testing-toolkit/spec_files/rules_response/config.json +3 -0
- package/docker/ml-testing-toolkit/spec_files/rules_response/default.json +1623 -0
- package/docker/ml-testing-toolkit/spec_files/rules_response/default_pisp_rules.json +161 -0
- package/docker/ml-testing-toolkit/spec_files/rules_validation/config.json +3 -0
- package/docker/ml-testing-toolkit/spec_files/rules_validation/default.json +672 -0
- package/docker/ml-testing-toolkit/spec_files/system_config.json +62 -0
- package/docker/ml-testing-toolkit/spec_files/user_config.json +45 -0
- package/docker/wait4/setup_hosts_file.sh +25 -0
- package/docker/wait4/wait4.config.js +71 -0
- package/docker/wait4/wait4.js +204 -0
- package/docker-compose.yml +67 -0
- package/docs/Mojaloop - Modusbox Onboarding functionality.pdf +0 -0
- package/docs/dfspInboundApi.yaml +1091 -0
- package/jest.config.js +4 -1
- package/package.json +17 -17
- package/secrets/jwsSigningKey.key +27 -0
- package/secrets/jwsVerificationKeys/mojaloop-sdk.pem +9 -0
- package/secrets/jwsVerificationKeys/switch.pem +9 -0
- package/sequences.puml +99 -0
- package/src/ControlAgent/index.js +221 -0
- package/{TestServer → src/ControlServer}/handlers.js +0 -0
- package/src/ControlServer/index.js +294 -0
- package/{InboundServer → src/InboundServer}/api.yaml +0 -0
- package/src/InboundServer/api_template.yaml +69 -0
- package/{InboundServer → src/InboundServer}/handlers.js +0 -0
- package/{InboundServer → src/InboundServer}/index.js +33 -1
- package/{InboundServer → src/InboundServer}/middlewares.js +0 -0
- package/src/OAuthTestServer/index.js +127 -0
- package/{OAuthTestServer → src/OAuthTestServer}/model.js +0 -0
- package/{OutboundServer → src/OutboundServer}/api.yaml +0 -0
- package/{OutboundServer → src/OutboundServer}/api_interfaces/index.d.ts +0 -0
- package/{OutboundServer → src/OutboundServer}/api_interfaces/openapi.d.ts +0 -0
- package/{OutboundServer → src/OutboundServer}/api_template/components/parameters/bulkQuoteId.yaml +1 -1
- package/{OutboundServer → src/OutboundServer}/api_template/components/parameters/bulkTransferId.yaml +1 -1
- package/{OutboundServer → src/OutboundServer}/api_template/components/parameters/requestToPayTransactionId.yaml +1 -1
- package/{OutboundServer → src/OutboundServer}/api_template/components/parameters/transferId.yaml +1 -1
- package/{OutboundServer → src/OutboundServer}/api_template/components/responses/accountsCreationCompleted.yaml +0 -0
- package/{OutboundServer → src/OutboundServer}/api_template/components/responses/accountsCreationError.yaml +0 -0
- package/{OutboundServer → src/OutboundServer}/api_template/components/responses/accountsCreationTimeout.yaml +0 -0
- package/{OutboundServer → src/OutboundServer}/api_template/components/responses/bulkQuoteBadRequest.yaml +0 -0
- package/{OutboundServer → src/OutboundServer}/api_template/components/responses/bulkQuoteServerError.yaml +0 -0
- package/{OutboundServer → src/OutboundServer}/api_template/components/responses/bulkQuoteSuccess.yaml +0 -0
- package/{OutboundServer → src/OutboundServer}/api_template/components/responses/bulkQuoteTimeout.yaml +0 -0
- package/{OutboundServer → src/OutboundServer}/api_template/components/responses/bulkTransferBadRequest.yaml +0 -0
- package/{OutboundServer → src/OutboundServer}/api_template/components/responses/bulkTransferServerError.yaml +0 -0
- package/{OutboundServer → src/OutboundServer}/api_template/components/responses/bulkTransferSuccess.yaml +0 -0
- package/{OutboundServer → src/OutboundServer}/api_template/components/responses/bulkTransferTimeout.yaml +0 -0
- package/{OutboundServer → src/OutboundServer}/api_template/components/responses/partiesByIdError404.yaml +1 -1
- package/{OutboundServer → src/OutboundServer}/api_template/components/responses/partiesByIdSuccess.yaml +0 -0
- package/{OutboundServer → src/OutboundServer}/api_template/components/responses/quotesPostSuccess.yaml +0 -0
- package/{OutboundServer → src/OutboundServer}/api_template/components/responses/quotesServerError.yaml +0 -0
- package/{OutboundServer → src/OutboundServer}/api_template/components/responses/requestToPaySuccess.yaml +0 -0
- package/{OutboundServer → src/OutboundServer}/api_template/components/responses/requestToPayTransferBadRequest.yaml +0 -0
- package/{OutboundServer → src/OutboundServer}/api_template/components/responses/requestToPayTransferSuccess.yaml +0 -0
- package/{OutboundServer → src/OutboundServer}/api_template/components/responses/simpleTransfersPostSuccess.yaml +0 -0
- package/{OutboundServer → src/OutboundServer}/api_template/components/responses/simpleTransfersServerError.yaml +0 -0
- package/{OutboundServer → src/OutboundServer}/api_template/components/responses/transferBadRequest.yaml +0 -0
- package/{OutboundServer → src/OutboundServer}/api_template/components/responses/transferServerError.yaml +0 -0
- package/{OutboundServer → src/OutboundServer}/api_template/components/responses/transferSuccess.yaml +0 -0
- package/{OutboundServer → src/OutboundServer}/api_template/components/responses/transferTimeout.yaml +0 -0
- package/src/OutboundServer/api_template/components/schemas/accountCreationStatus.yaml +18 -0
- package/{OutboundServer → src/OutboundServer}/api_template/components/schemas/accountsCreationState.yaml +0 -0
- package/src/OutboundServer/api_template/components/schemas/accountsRequest.yaml +20 -0
- package/{OutboundServer → src/OutboundServer}/api_template/components/schemas/accountsResponse.yaml +1 -1
- package/{OutboundServer → src/OutboundServer}/api_template/components/schemas/async2SyncCurrentState.yaml +0 -0
- package/{OutboundServer → src/OutboundServer}/api_template/components/schemas/bulkQuoteErrorResponse.yaml +0 -0
- package/{OutboundServer → src/OutboundServer}/api_template/components/schemas/bulkQuoteRequest.yaml +2 -2
- package/{OutboundServer → src/OutboundServer}/api_template/components/schemas/bulkQuoteResponse.yaml +1 -1
- package/{OutboundServer → src/OutboundServer}/api_template/components/schemas/bulkQuoteStatus.yaml +0 -0
- package/{OutboundServer → src/OutboundServer}/api_template/components/schemas/bulkQuoteStatusResponse.yaml +1 -1
- package/{OutboundServer → src/OutboundServer}/api_template/components/schemas/bulkTransferErrorResponse.yaml +0 -0
- package/{OutboundServer → src/OutboundServer}/api_template/components/schemas/bulkTransferRequest.yaml +2 -2
- package/{OutboundServer → src/OutboundServer}/api_template/components/schemas/bulkTransferResponse.yaml +1 -1
- package/{OutboundServer → src/OutboundServer}/api_template/components/schemas/bulkTransferStatus.yaml +0 -0
- package/{OutboundServer → src/OutboundServer}/api_template/components/schemas/bulkTransferStatusResponse.yaml +1 -1
- package/{OutboundServer → src/OutboundServer}/api_template/components/schemas/errorAccountsResponse.yaml +0 -0
- package/{OutboundServer → src/OutboundServer}/api_template/components/schemas/errorQuotesResponse.yaml +0 -0
- package/{OutboundServer → src/OutboundServer}/api_template/components/schemas/errorResponse.yaml +0 -0
- package/{OutboundServer → src/OutboundServer}/api_template/components/schemas/errorSimpleTransfersResponse.yaml +0 -0
- package/{OutboundServer → src/OutboundServer}/api_template/components/schemas/errorTransferResponse.yaml +0 -0
- package/src/OutboundServer/api_template/components/schemas/extensionListEmptiable.yaml +6 -0
- package/src/OutboundServer/api_template/components/schemas/individualQuote.yaml +32 -0
- package/{OutboundServer → src/OutboundServer}/api_template/components/schemas/individualQuoteResult.yaml +5 -5
- package/src/OutboundServer/api_template/components/schemas/individualTransfer.yaml +32 -0
- package/{OutboundServer → src/OutboundServer}/api_template/components/schemas/individualTransferFulfilment.yaml +2 -2
- package/{OutboundServer → src/OutboundServer}/api_template/components/schemas/individualTransferResult.yaml +6 -6
- package/src/OutboundServer/api_template/components/schemas/mojaloopError.yaml +5 -0
- package/src/OutboundServer/api_template/components/schemas/mojaloopTransactionRequestState.yaml +2 -0
- package/{OutboundServer → src/OutboundServer}/api_template/components/schemas/partiesByIdResponse.yaml +1 -1
- package/src/OutboundServer/api_template/components/schemas/quote.yaml +3 -0
- package/{OutboundServer → src/OutboundServer}/api_template/components/schemas/quoteError.yaml +0 -0
- package/src/OutboundServer/api_template/components/schemas/quotesPostRequest.yaml +13 -0
- package/src/OutboundServer/api_template/components/schemas/quotesPostResponse.yaml +48 -0
- package/src/OutboundServer/api_template/components/schemas/requestToPayRequest.yaml +39 -0
- package/src/OutboundServer/api_template/components/schemas/requestToPayResponse.yaml +41 -0
- package/src/OutboundServer/api_template/components/schemas/requestToPayTransferRequest.yaml +42 -0
- package/{OutboundServer → src/OutboundServer}/api_template/components/schemas/requestToPayTransferResponse.yaml +6 -6
- package/{OutboundServer → src/OutboundServer}/api_template/components/schemas/simpleTransferServerError.yaml +0 -0
- package/src/OutboundServer/api_template/components/schemas/simpleTransfersPostRequest.yaml +12 -0
- package/{OutboundServer → src/OutboundServer}/api_template/components/schemas/simpleTransfersPostResponse.yaml +1 -1
- package/{OutboundServer → src/OutboundServer}/api_template/components/schemas/transactionType.yaml +0 -0
- package/{OutboundServer → src/OutboundServer}/api_template/components/schemas/transferContinuationAcceptOTP.yaml +0 -0
- package/{OutboundServer → src/OutboundServer}/api_template/components/schemas/transferContinuationAcceptParty.yaml +0 -0
- package/{OutboundServer → src/OutboundServer}/api_template/components/schemas/transferContinuationAcceptQuote.yaml +0 -0
- package/{OutboundServer → src/OutboundServer}/api_template/components/schemas/transferError.yaml +0 -0
- package/src/OutboundServer/api_template/components/schemas/transferFulfilment.yaml +3 -0
- package/src/OutboundServer/api_template/components/schemas/transferParty.yaml +40 -0
- package/{OutboundServer → src/OutboundServer}/api_template/components/schemas/transferRequest.yaml +4 -4
- package/{OutboundServer → src/OutboundServer}/api_template/components/schemas/transferResponse.yaml +6 -6
- package/{OutboundServer → src/OutboundServer}/api_template/components/schemas/transferStatus.yaml +0 -0
- package/{OutboundServer → src/OutboundServer}/api_template/components/schemas/transferStatusResponse.yaml +1 -1
- package/{OutboundServer → src/OutboundServer}/api_template/health.yaml +0 -0
- package/{OutboundServer → src/OutboundServer}/api_template/openapi.yaml +0 -0
- package/{OutboundServer → src/OutboundServer}/api_template/paths/accounts.yaml +0 -0
- package/{OutboundServer → src/OutboundServer}/api_template/paths/bulkQuotes.yaml +0 -0
- package/{OutboundServer → src/OutboundServer}/api_template/paths/bulkQuotes_bulkQuoteId.yaml +0 -0
- package/{OutboundServer → src/OutboundServer}/api_template/paths/bulkTransfers.yaml +0 -0
- package/{OutboundServer → src/OutboundServer}/api_template/paths/bulkTransfers_bulkTransferId.yaml +0 -0
- package/{OutboundServer → src/OutboundServer}/api_template/paths/parties_Type_ID.yaml +2 -2
- package/{OutboundServer → src/OutboundServer}/api_template/paths/parties_Type_ID_SubId.yaml +3 -3
- package/{OutboundServer → src/OutboundServer}/api_template/paths/quotes.yaml +0 -0
- package/{OutboundServer → src/OutboundServer}/api_template/paths/requestToPay.yaml +0 -0
- package/{OutboundServer → src/OutboundServer}/api_template/paths/requestToPayTransfer.yaml +0 -0
- package/{OutboundServer → src/OutboundServer}/api_template/paths/requestToPayTransfer_requestToPayTransactionId.yaml +0 -0
- package/{OutboundServer → src/OutboundServer}/api_template/paths/simpleTransfers.yaml +0 -0
- package/{OutboundServer → src/OutboundServer}/api_template/paths/transfers.yaml +0 -0
- package/{OutboundServer → src/OutboundServer}/api_template/paths/transfers_transferId.yaml +0 -0
- package/{OutboundServer → src/OutboundServer}/handlers.js +0 -0
- package/{OutboundServer → src/OutboundServer}/index.js +15 -0
- package/{OutboundServer → src/OutboundServer}/middlewares.js +0 -0
- package/{TestServer → src/TestServer}/api.yaml +0 -0
- package/src/TestServer/handlers.js +63 -0
- package/{TestServer → src/TestServer}/index.js +31 -0
- package/{config.js → src/config.js} +6 -0
- package/{index.d.ts → src/index.d.ts} +0 -0
- package/{index.js → src/index.js} +0 -0
- package/{lib → src/lib}/api/index.js +0 -0
- package/{lib → src/lib}/cache.js +0 -0
- package/{lib → src/lib}/check.js +0 -0
- package/{lib → src/lib}/model/AccountsModel.js +0 -0
- package/{lib → src/lib}/model/Async2SyncModel.js +0 -0
- package/{lib → src/lib}/model/InboundTransfersModel.js +0 -0
- package/{lib → src/lib}/model/OutboundBulkQuotesModel.js +0 -0
- package/{lib → src/lib}/model/OutboundBulkTransfersModel.js +0 -0
- package/{lib → src/lib}/model/OutboundRequestToPayModel.js +0 -0
- package/{lib → src/lib}/model/OutboundRequestToPayTransferModel.js +0 -0
- package/{lib → src/lib}/model/OutboundTransfersModel.js +0 -0
- package/{lib → src/lib}/model/PartiesModel.js +0 -0
- package/{lib → src/lib}/model/ProxyModel/MatchRules/Expression.js +0 -0
- package/{lib → src/lib}/model/ProxyModel/MatchRules/Headers.js +0 -0
- package/{lib → src/lib}/model/ProxyModel/MatchRules/MatchRule.js +0 -0
- package/{lib → src/lib}/model/ProxyModel/MatchRules/Path.js +0 -0
- package/{lib → src/lib}/model/ProxyModel/MatchRules/Query.js +0 -0
- package/{lib → src/lib}/model/ProxyModel/MatchRules/index.js +0 -0
- package/{lib → src/lib}/model/ProxyModel/Route.js +0 -0
- package/{lib → src/lib}/model/ProxyModel/configSchema.json +0 -0
- package/{lib → src/lib}/model/ProxyModel/index.js +0 -0
- package/{lib → src/lib}/model/QuotesModel.js +0 -0
- package/{lib → src/lib}/model/TransfersModel.js +0 -0
- package/{lib → src/lib}/model/common/BackendError.js +0 -0
- package/{lib → src/lib}/model/common/PersistentStateMachine.js +0 -0
- package/{lib → src/lib}/model/common/index.js +0 -0
- package/{lib → src/lib}/model/index.js +0 -0
- package/{lib → src/lib}/model/lib/deferredJob.js +0 -0
- package/{lib → src/lib}/model/lib/index.js +0 -0
- package/{lib → src/lib}/model/lib/requests/backendRequests.js +0 -0
- package/{lib → src/lib}/model/lib/requests/common.js +0 -0
- package/{lib → src/lib}/model/lib/requests/index.js +0 -0
- package/{lib → src/lib}/model/lib/shared.js +0 -0
- package/{lib → src/lib}/randomphrase/index.js +0 -0
- package/{lib → src/lib}/randomphrase/words.json +0 -0
- package/{lib → src/lib}/router.js +0 -0
- package/{lib → src/lib}/validate.js +0 -0
- package/test/config/integration.env +9 -0
- package/test/integration/lib/cache.test.js +3 -3
- package/test/unit/ControlClient.test.js +113 -0
- package/test/unit/ControlServer/events.js +41 -0
- package/test/unit/ControlServer/index.js +231 -0
- package/test/unit/ControlServer.test.js +126 -0
- package/test/unit/InboundServer.test.js +5 -5
- package/test/unit/TestServer.test.js +5 -5
- package/test/unit/api/utils.js +5 -5
- package/test/unit/config.test.js +11 -10
- package/test/unit/inboundApi/handlers.test.js +6 -6
- package/test/unit/index.test.js +2 -1
- package/test/unit/lib/cache.test.js +1 -1
- package/test/unit/lib/model/AccountsModel.test.js +2 -2
- package/test/unit/lib/model/InboundTransfersModel.test.js +5 -5
- package/test/unit/lib/model/OutboundBulkQuotesModel.test.js +2 -2
- package/test/unit/lib/model/OutboundBulkTransfersModel.test.js +2 -2
- package/test/unit/lib/model/OutboundRequestToPayModel.test.js +3 -3
- package/test/unit/lib/model/OutboundRequestToPayTransferModel.test.js +2 -2
- package/test/unit/lib/model/OutboundTransfersModel.test.js +3 -3
- package/test/unit/lib/model/PartiesModel.test.js +28 -28
- package/test/unit/lib/model/QuotesModel.test.js +31 -31
- package/test/unit/lib/model/TransfersModel.test.js +3 -3
- package/test/unit/lib/model/common/PersistentStateMachine.test.js +13 -13
- package/test/unit/lib/model/mockedLibRequests.js +1 -1
- package/test/unit/outboundApi/handlers.test.js +3 -3
- package/.eslintignore +0 -2
- package/InboundServer/api_template.yaml +0 -69
- package/OAuthTestServer/index.js +0 -66
- package/OutboundServer/api_template/components/schemas/accountCreationStatus.yaml +0 -18
- package/OutboundServer/api_template/components/schemas/accountsRequest.yaml +0 -20
- package/OutboundServer/api_template/components/schemas/extensionListEmptiable.yaml +0 -6
- package/OutboundServer/api_template/components/schemas/individualQuote.yaml +0 -32
- package/OutboundServer/api_template/components/schemas/individualTransfer.yaml +0 -32
- package/OutboundServer/api_template/components/schemas/mojaloopError.yaml +0 -5
- package/OutboundServer/api_template/components/schemas/mojaloopTransactionRequestState.yaml +0 -2
- package/OutboundServer/api_template/components/schemas/quote.yaml +0 -3
- package/OutboundServer/api_template/components/schemas/quotesPostRequest.yaml +0 -13
- package/OutboundServer/api_template/components/schemas/quotesPostResponse.yaml +0 -48
- package/OutboundServer/api_template/components/schemas/requestToPayRequest.yaml +0 -39
- package/OutboundServer/api_template/components/schemas/requestToPayResponse.yaml +0 -41
- package/OutboundServer/api_template/components/schemas/requestToPayTransferRequest.yaml +0 -42
- package/OutboundServer/api_template/components/schemas/simpleTransfersPostRequest.yaml +0 -12
- package/OutboundServer/api_template/components/schemas/transferFulfilment.yaml +0 -3
- package/OutboundServer/api_template/components/schemas/transferParty.yaml +0 -40
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
/**************************************************************************
|
|
2
|
+
* (C) Copyright ModusBox Inc. 2020 - All rights reserved. *
|
|
3
|
+
* *
|
|
4
|
+
* This file is made available under the terms of the license agreement *
|
|
5
|
+
* specified in the corresponding source code repository. *
|
|
6
|
+
* *
|
|
7
|
+
* ORIGINAL AUTHOR: *
|
|
8
|
+
* Matt Kingston - matt.kingston@modusbox.com *
|
|
9
|
+
**************************************************************************/
|
|
10
|
+
|
|
11
|
+
// This server has deliberately been written separate from any other server in the SDK. There is
|
|
12
|
+
// some reasonable argument that it could be part of the outbound or test server. It has not been
|
|
13
|
+
// incorporated in either as, at the time of writing, it is intended to be maintained in a
|
|
14
|
+
// proprietary fork. Therefore, keeping it independent of other servers will avoid the maintenance
|
|
15
|
+
// burden that would otherwise be associated with incorporating it with those.
|
|
16
|
+
//
|
|
17
|
+
// It inherits from the Server class from the 'ws' websocket library for Node, which in turn
|
|
18
|
+
// inherits from EventEmitter. We exploit this to emit an event when a reconfigure message is sent
|
|
19
|
+
// to this server. Then, when this server's reconfigure method is called, it reconfigures itself
|
|
20
|
+
// and sends a message to all clients notifying them of the new application configuration.
|
|
21
|
+
//
|
|
22
|
+
// It expects new configuration to be supplied as an array of JSON patches. It therefore exposes
|
|
23
|
+
// the current configuration to
|
|
24
|
+
|
|
25
|
+
const assert = require('assert').strict;
|
|
26
|
+
|
|
27
|
+
const ws = require('ws');
|
|
28
|
+
const jsonPatch = require('fast-json-patch');
|
|
29
|
+
|
|
30
|
+
const randomPhrase = require('~/lib/randomphrase');
|
|
31
|
+
|
|
32
|
+
/**************************************************************************
|
|
33
|
+
* The message protocol messages, verbs, and errors
|
|
34
|
+
*************************************************************************/
|
|
35
|
+
const MESSAGE = {
|
|
36
|
+
CONFIGURATION: 'CONFIGURATION',
|
|
37
|
+
ERROR: 'ERROR',
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
const VERB = {
|
|
41
|
+
READ: 'READ',
|
|
42
|
+
NOTIFY: 'NOTIFY',
|
|
43
|
+
PATCH: 'PATCH'
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
const ERROR = {
|
|
47
|
+
UNSUPPORTED_MESSAGE: 'UNSUPPORTED_MESSAGE',
|
|
48
|
+
UNSUPPORTED_VERB: 'UNSUPPORTED_VERB',
|
|
49
|
+
JSON_PARSE_ERROR: 'JSON_PARSE_ERROR',
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
/**************************************************************************
|
|
53
|
+
* Events emitted by the control server
|
|
54
|
+
*************************************************************************/
|
|
55
|
+
const EVENT = {
|
|
56
|
+
RECONFIGURE: 'RECONFIGURE',
|
|
57
|
+
};
|
|
58
|
+
|
|
59
|
+
/**************************************************************************
|
|
60
|
+
* Private convenience functions
|
|
61
|
+
*************************************************************************/
|
|
62
|
+
const serialise = JSON.stringify;
|
|
63
|
+
const deserialise = (msg) => {
|
|
64
|
+
//reviver function
|
|
65
|
+
return JSON.parse(msg.toString(), (k, v) => {
|
|
66
|
+
if (
|
|
67
|
+
v !== null &&
|
|
68
|
+
typeof v === 'object' &&
|
|
69
|
+
'type' in v &&
|
|
70
|
+
v.type === 'Buffer' &&
|
|
71
|
+
'data' in v &&
|
|
72
|
+
Array.isArray(v.data)) {
|
|
73
|
+
return new Buffer(v.data);
|
|
74
|
+
}
|
|
75
|
+
return v;
|
|
76
|
+
});
|
|
77
|
+
};
|
|
78
|
+
|
|
79
|
+
const buildMsg = (verb, msg, data, id = randomPhrase()) => serialise({
|
|
80
|
+
verb,
|
|
81
|
+
msg,
|
|
82
|
+
data,
|
|
83
|
+
id,
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
const buildPatchConfiguration = (oldConf, newConf, id) => {
|
|
87
|
+
const patches = jsonPatch.compare(oldConf, newConf);
|
|
88
|
+
return buildMsg(VERB.PATCH, MESSAGE.CONFIGURATION, patches, id);
|
|
89
|
+
};
|
|
90
|
+
|
|
91
|
+
const getWsIp = (req) => [
|
|
92
|
+
req.socket.remoteAddress,
|
|
93
|
+
...(
|
|
94
|
+
req.headers['x-forwarded-for']
|
|
95
|
+
? req.headers['x-forwarded-for'].split(/\s*,\s*/)
|
|
96
|
+
: []
|
|
97
|
+
)
|
|
98
|
+
];
|
|
99
|
+
|
|
100
|
+
/**************************************************************************
|
|
101
|
+
* build
|
|
102
|
+
*
|
|
103
|
+
* Public object exposing an API to build valid protocol messages.
|
|
104
|
+
* It is not the only way to build valid messages within the protocol.
|
|
105
|
+
*************************************************************************/
|
|
106
|
+
const build = {
|
|
107
|
+
CONFIGURATION: {
|
|
108
|
+
PATCH: buildPatchConfiguration,
|
|
109
|
+
READ: (id) => buildMsg(VERB.READ, MESSAGE.CONFIGURATION, {}, id),
|
|
110
|
+
NOTIFY: (config, id) => buildMsg(VERB.NOTIFY, MESSAGE.CONFIGURATION, config, id),
|
|
111
|
+
},
|
|
112
|
+
ERROR: {
|
|
113
|
+
NOTIFY: {
|
|
114
|
+
UNSUPPORTED_MESSAGE: (id) => buildMsg(VERB.NOTIFY, MESSAGE.ERROR, ERROR.UNSUPPORTED_MESSAGE, id),
|
|
115
|
+
UNSUPPORTED_VERB: (id) => buildMsg(VERB.NOTIFY, MESSAGE.ERROR, ERROR.UNSUPPORTED_VERB, id),
|
|
116
|
+
JSON_PARSE_ERROR: (id) => buildMsg(VERB.NOTIFY, MESSAGE.ERROR, ERROR.JSON_PARSE_ERROR, id),
|
|
117
|
+
}
|
|
118
|
+
},
|
|
119
|
+
};
|
|
120
|
+
|
|
121
|
+
/**************************************************************************
|
|
122
|
+
* Client
|
|
123
|
+
*
|
|
124
|
+
* The Control Client. Client for the websocket control API.
|
|
125
|
+
* Used to hot-restart the SDK.
|
|
126
|
+
*
|
|
127
|
+
* logger - Logger- see SDK logger used elsewhere
|
|
128
|
+
* address - address of control server
|
|
129
|
+
* port - port of control server
|
|
130
|
+
*************************************************************************/
|
|
131
|
+
class Client extends ws {
|
|
132
|
+
constructor({ address = 'localhost', port, logger }) {
|
|
133
|
+
super(`ws://${address}:${port}`);
|
|
134
|
+
this._logger = logger;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// Really only exposed so that a user can import only the client for convenience
|
|
138
|
+
get Build() {
|
|
139
|
+
return build;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
static async Create(...args) {
|
|
143
|
+
const result = new Client(...args);
|
|
144
|
+
await new Promise((resolve, reject) => {
|
|
145
|
+
result.on('open', resolve);
|
|
146
|
+
result.on('error', reject);
|
|
147
|
+
});
|
|
148
|
+
return result;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
async send(msg) {
|
|
152
|
+
const data = typeof msg === 'string' ? msg : serialise(msg);
|
|
153
|
+
this._logger.push({ data }).log('Sending message');
|
|
154
|
+
return new Promise((resolve) => super.send.call(this, data, resolve));
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// Receive a single message
|
|
158
|
+
async receive() {
|
|
159
|
+
return new Promise((resolve) => this.once('message', (data) => {
|
|
160
|
+
const msg = deserialise(data);
|
|
161
|
+
this._logger.push({ msg }).log('Received');
|
|
162
|
+
resolve(msg);
|
|
163
|
+
}));
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
/**************************************************************************
|
|
168
|
+
* Server
|
|
169
|
+
*
|
|
170
|
+
* The Control Server. Exposes a websocket control API.
|
|
171
|
+
* Used to hot-restart the SDK.
|
|
172
|
+
*
|
|
173
|
+
* logger - Logger- see SDK logger used elsewhere
|
|
174
|
+
* port - HTTP port to host on
|
|
175
|
+
* appConfig - The configuration for the entire application- supplied here as this class uses it to
|
|
176
|
+
* validate reconfiguration requests- it is not used for configuration here, however
|
|
177
|
+
* server - optional HTTP/S server on which to serve the websocket
|
|
178
|
+
*************************************************************************/
|
|
179
|
+
class Server extends ws.Server {
|
|
180
|
+
constructor({ logger, port = 0, appConfig = {} }) {
|
|
181
|
+
super({ clientTracking: true, port });
|
|
182
|
+
|
|
183
|
+
this._logger = logger;
|
|
184
|
+
this._port = port;
|
|
185
|
+
this._appConfig = appConfig;
|
|
186
|
+
this._clientData = new Map();
|
|
187
|
+
|
|
188
|
+
this.on('error', err => {
|
|
189
|
+
this._logger.push({ err })
|
|
190
|
+
.log('Unhandled websocket error occurred. Shutting down.');
|
|
191
|
+
process.exit(1);
|
|
192
|
+
});
|
|
193
|
+
|
|
194
|
+
this.on('connection', (socket, req) => {
|
|
195
|
+
const logger = this._logger.push({
|
|
196
|
+
url: req.url,
|
|
197
|
+
ip: getWsIp(req),
|
|
198
|
+
remoteAddress: req.socket.remoteAddress,
|
|
199
|
+
});
|
|
200
|
+
logger.log('Websocket connection received');
|
|
201
|
+
this._clientData.set(socket, { ip: req.connection.remoteAddress, logger });
|
|
202
|
+
|
|
203
|
+
socket.on('close', (code, reason) => {
|
|
204
|
+
logger.push({ code, reason }).log('Websocket connection closed');
|
|
205
|
+
this._clientData.delete(socket);
|
|
206
|
+
});
|
|
207
|
+
|
|
208
|
+
socket.on('message', this._handle(socket, logger));
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
this._logger.push(this.address()).log('running on');
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
// Close the server then wait for all the client sockets to close
|
|
215
|
+
async stop() {
|
|
216
|
+
await new Promise(this.close.bind(this));
|
|
217
|
+
this._logger.log('Control server shutdown complete');
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
reconfigure({ logger = this._logger, port = 0, appConfig = this._appConfig }) {
|
|
221
|
+
assert(port === this._port, 'Cannot reconfigure running port');
|
|
222
|
+
return () => {
|
|
223
|
+
const reconfigureClientLogger =
|
|
224
|
+
({ logger: clientLogger }) => clientLogger.configure(logger);
|
|
225
|
+
this._clientData.values(reconfigureClientLogger);
|
|
226
|
+
this._logger = logger;
|
|
227
|
+
this._appConfig = appConfig;
|
|
228
|
+
this._logger.log('restarted');
|
|
229
|
+
};
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
async notifyClientsOfCurrentConfig() {
|
|
233
|
+
const updateConfMsg = build.CONFIGURATION.NOTIFY(this._appConfig);
|
|
234
|
+
const logError = (socket, message) => (err) =>
|
|
235
|
+
this._logger
|
|
236
|
+
.push({ message, ip: this._clientData.get(socket).ip, err })
|
|
237
|
+
.log('Error sending reconfigure notification to client');
|
|
238
|
+
const sendToAllClients = (msg) => Promise.all(
|
|
239
|
+
[...this.clients.values()].map((socket) =>
|
|
240
|
+
(new Promise((resolve) => socket.send(msg, resolve))).catch(logError(socket, msg))
|
|
241
|
+
)
|
|
242
|
+
);
|
|
243
|
+
return await sendToAllClients(updateConfMsg);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
_handle(client, logger) {
|
|
247
|
+
return (data) => {
|
|
248
|
+
// TODO: json-schema validation of received message- should be pretty straight-forward
|
|
249
|
+
// and will allow better documentation of the API
|
|
250
|
+
let msg;
|
|
251
|
+
try {
|
|
252
|
+
msg = deserialise(data);
|
|
253
|
+
} catch (err) {
|
|
254
|
+
logger.push({ data }).log('Couldn\'t parse received message');
|
|
255
|
+
client.send(build.ERROR.NOTIFY.JSON_PARSE_ERROR());
|
|
256
|
+
}
|
|
257
|
+
logger.push({ msg }).log('Handling received message');
|
|
258
|
+
switch (msg.msg) {
|
|
259
|
+
case MESSAGE.CONFIGURATION:
|
|
260
|
+
switch (msg.verb) {
|
|
261
|
+
case VERB.READ:
|
|
262
|
+
client.send(build.CONFIGURATION.NOTIFY(this._appConfig, msg.id));
|
|
263
|
+
break;
|
|
264
|
+
case VERB.PATCH: {
|
|
265
|
+
// TODO: validate the incoming patch? Or assume clients have used the
|
|
266
|
+
// client library?
|
|
267
|
+
const dup = JSON.parse(JSON.stringify(this._appConfig)); // fast-json-patch explicitly mutates
|
|
268
|
+
jsonPatch.applyPatch(dup, msg.data);
|
|
269
|
+
logger.push({ oldConf: this._appConfig, newConf: dup }).log('Emitting new configuration');
|
|
270
|
+
this.emit(EVENT.RECONFIGURE, dup);
|
|
271
|
+
break;
|
|
272
|
+
}
|
|
273
|
+
default:
|
|
274
|
+
client.send(build.ERROR.NOTIFY.UNSUPPORTED_VERB(msg.id));
|
|
275
|
+
break;
|
|
276
|
+
}
|
|
277
|
+
break;
|
|
278
|
+
default:
|
|
279
|
+
client.send(build.ERROR.NOTIFY.UNSUPPORTED_MESSAGE(msg.id));
|
|
280
|
+
break;
|
|
281
|
+
}
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
}
|
|
285
|
+
|
|
286
|
+
module.exports = {
|
|
287
|
+
Client,
|
|
288
|
+
Server,
|
|
289
|
+
build,
|
|
290
|
+
MESSAGE,
|
|
291
|
+
VERB,
|
|
292
|
+
ERROR,
|
|
293
|
+
EVENT,
|
|
294
|
+
};
|
|
File without changes
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
openapi: 3.0.0
|
|
2
|
+
info:
|
|
3
|
+
version: '1.1'
|
|
4
|
+
title: Open API for FSP Interoperability (FSPIOP)
|
|
5
|
+
description: >-
|
|
6
|
+
Based on API Definition.docx updated on 2020-05-19 Version 1.1.
|
|
7
|
+
API supports a maximum size of 65536 bytes (64 Kilobytes) in the HTTP
|
|
8
|
+
header.
|
|
9
|
+
license:
|
|
10
|
+
name: Open API for FSP Interoperability (FSPIOP)
|
|
11
|
+
paths:
|
|
12
|
+
'/participants/{ID}/error':
|
|
13
|
+
$ref: '../../node_modules/@mojaloop/api-snippets/fspiop/v1_1/openapi3/paths/participants_ID_error.yaml'
|
|
14
|
+
'/participants/{ID}':
|
|
15
|
+
$ref: '../../node_modules/@mojaloop/api-snippets/fspiop/v1_1/openapi3/paths/participants_ID.yaml'
|
|
16
|
+
'/participants/{Type}/{ID}/error':
|
|
17
|
+
$ref: '../../node_modules/@mojaloop/api-snippets/fspiop/v1_1/openapi3/paths/participants_Type_ID_error.yaml'
|
|
18
|
+
'/participants/{Type}/{ID}/{SubId}/error':
|
|
19
|
+
$ref: '../../node_modules/@mojaloop/api-snippets/fspiop/v1_1/openapi3/paths/participants_Type_ID_SubId_error.yaml'
|
|
20
|
+
'/participants/{Type}/{ID}/{SubId}':
|
|
21
|
+
$ref: '../../node_modules/@mojaloop/api-snippets/fspiop/v1_1/openapi3/paths/participants_Type_ID_SubId.yaml'
|
|
22
|
+
'/participants/{Type}/{ID}':
|
|
23
|
+
$ref: '../../node_modules/@mojaloop/api-snippets/fspiop/v1_1/openapi3/paths/participants_Type_ID.yaml'
|
|
24
|
+
'/participants':
|
|
25
|
+
$ref: '../../node_modules/@mojaloop/api-snippets/fspiop/v1_1/openapi3/paths/participants.yaml'
|
|
26
|
+
'/parties/{Type}/{ID}':
|
|
27
|
+
$ref: '../../node_modules/@mojaloop/api-snippets/fspiop/v1_1/openapi3/paths/parties_Type_ID.yaml'
|
|
28
|
+
'/parties/{Type}/{ID}/error':
|
|
29
|
+
$ref: '../../node_modules/@mojaloop/api-snippets/fspiop/v1_1/openapi3/paths/parties_Type_ID_error.yaml'
|
|
30
|
+
'/parties/{Type}/{ID}/{SubId}':
|
|
31
|
+
$ref: '../../node_modules/@mojaloop/api-snippets/fspiop/v1_1/openapi3/paths/parties_Type_ID_SubId.yaml'
|
|
32
|
+
'/parties/{Type}/{ID}/{SubId}/error':
|
|
33
|
+
$ref: '../../node_modules/@mojaloop/api-snippets/fspiop/v1_1/openapi3/paths/parties_Type_ID_SubId_error.yaml'
|
|
34
|
+
'/transactionRequests/{ID}/error':
|
|
35
|
+
$ref: '../../node_modules/@mojaloop/api-snippets/fspiop/v1_1/openapi3/paths/transactionRequests_ID_error.yaml'
|
|
36
|
+
'/transactionRequests/{ID}':
|
|
37
|
+
$ref: '../../node_modules/@mojaloop/api-snippets/fspiop/v1_1/openapi3/paths/transactionRequests_ID.yaml'
|
|
38
|
+
'/transactionRequests':
|
|
39
|
+
$ref: '../../node_modules/@mojaloop/api-snippets/fspiop/v1_1/openapi3/paths/transactionRequests.yaml'
|
|
40
|
+
'/quotes/{ID}/error':
|
|
41
|
+
$ref: '../../node_modules/@mojaloop/api-snippets/fspiop/v1_1/openapi3/paths/quotes_ID_error.yaml'
|
|
42
|
+
'/quotes/{ID}':
|
|
43
|
+
$ref: '../../node_modules/@mojaloop/api-snippets/fspiop/v1_1/openapi3/paths/quotes_ID.yaml'
|
|
44
|
+
'/quotes':
|
|
45
|
+
$ref: '../../node_modules/@mojaloop/api-snippets/fspiop/v1_1/openapi3/paths/quotes.yaml'
|
|
46
|
+
'/authorizations/{ID}':
|
|
47
|
+
$ref: '../../node_modules/@mojaloop/api-snippets/fspiop/v1_1/openapi3/paths/authorizations_ID.yaml'
|
|
48
|
+
'/authorizations/{ID}/error':
|
|
49
|
+
$ref: '../../node_modules/@mojaloop/api-snippets/fspiop/v1_1/openapi3/paths/authorizations_ID_error.yaml'
|
|
50
|
+
'/transfers/{ID}/error':
|
|
51
|
+
$ref: '../../node_modules/@mojaloop/api-snippets/fspiop/v1_1/openapi3/paths/transfers_ID_error.yaml'
|
|
52
|
+
'/transfers/{ID}':
|
|
53
|
+
$ref: '../../node_modules/@mojaloop/api-snippets/fspiop/v1_1/openapi3/paths/transfers_ID.yaml'
|
|
54
|
+
'/transfers':
|
|
55
|
+
$ref: '../../node_modules/@mojaloop/api-snippets/fspiop/v1_1/openapi3/paths/transfers.yaml'
|
|
56
|
+
'/transactions/{ID}':
|
|
57
|
+
$ref: '../../node_modules/@mojaloop/api-snippets/fspiop/v1_1/openapi3/paths/transactions_ID.yaml'
|
|
58
|
+
'/transactions/{ID}/error':
|
|
59
|
+
$ref: '../../node_modules/@mojaloop/api-snippets/fspiop/v1_1/openapi3/paths/transactions_ID_error.yaml'
|
|
60
|
+
'/bulkQuotes/{ID}/error':
|
|
61
|
+
$ref: '../../node_modules/@mojaloop/api-snippets/fspiop/v1_1/openapi3/paths/bulkQuotes_ID_error.yaml'
|
|
62
|
+
'/bulkQuotes/{ID}':
|
|
63
|
+
$ref: '../../node_modules/@mojaloop/api-snippets/fspiop/v1_1/openapi3/paths/bulkQuotes_ID.yaml'
|
|
64
|
+
'/bulkTransfers/{ID}':
|
|
65
|
+
$ref: '../../node_modules/@mojaloop/api-snippets/fspiop/v1_1/openapi3/paths/bulkTransfers_ID.yaml'
|
|
66
|
+
'/bulkTransfers':
|
|
67
|
+
$ref: '../../node_modules/@mojaloop/api-snippets/fspiop/v1_1/openapi3/paths/bulkTransfers.yaml'
|
|
68
|
+
'/bulkTransfers/{ID}/error':
|
|
69
|
+
$ref: '../../node_modules/@mojaloop/api-snippets/fspiop/v1_1/openapi3/paths/bulkTransfers_ID_error.yaml'
|
|
File without changes
|
|
@@ -24,6 +24,7 @@ const Validate = require('../lib/validate');
|
|
|
24
24
|
const router = require('../lib/router');
|
|
25
25
|
const handlers = require('./handlers');
|
|
26
26
|
const middlewares = require('./middlewares');
|
|
27
|
+
const check = require('../lib/check');
|
|
27
28
|
|
|
28
29
|
class InboundApi extends EventEmitter {
|
|
29
30
|
constructor(conf, logger, cache, validator) {
|
|
@@ -43,7 +44,7 @@ class InboundApi extends EventEmitter {
|
|
|
43
44
|
});
|
|
44
45
|
|
|
45
46
|
if (conf.validateInboundJws) {
|
|
46
|
-
this._jwsVerificationKeys = InboundApi._GetJwsKeys(conf.jwsVerificationKeysDirectory);
|
|
47
|
+
this._jwsVerificationKeys = conf.pm4mlEnabled ? conf.peerJWSKeys : InboundApi._GetJwsKeys(conf.jwsVerificationKeysDirectory);
|
|
47
48
|
}
|
|
48
49
|
this._api = InboundApi._SetupApi({
|
|
49
50
|
conf,
|
|
@@ -187,6 +188,37 @@ class InboundServer extends EventEmitter {
|
|
|
187
188
|
this._logger.log('inbound shut down complete');
|
|
188
189
|
}
|
|
189
190
|
|
|
191
|
+
async reconfigure(conf, logger, cache) {
|
|
192
|
+
// It may be possible to extract the socket from an existing HTTP/HTTPS server and replace
|
|
193
|
+
// it in a new server of the other type, as Node's HTTP and HTTPS servers both eventually
|
|
194
|
+
// are subclasses of net.Server. This wasn't considered as a requirement at the time of
|
|
195
|
+
// writing.
|
|
196
|
+
assert(
|
|
197
|
+
this._conf.mutualTLS.inboundRequests.enabled === conf.mutualTLS.inboundRequests.enabled,
|
|
198
|
+
'Cannot live-restart an HTTPS server as HTTP or vice versa',
|
|
199
|
+
);
|
|
200
|
+
const newApi = new InboundApi(conf, logger, cache, this._validator);
|
|
201
|
+
await newApi.start();
|
|
202
|
+
return () => {
|
|
203
|
+
this._logger = logger;
|
|
204
|
+
this._cache = cache;
|
|
205
|
+
// TODO: .tls might be undefined, causing an.. err.. undefined dereference..
|
|
206
|
+
const tlsCredsChanged = check.notDeepEqual(
|
|
207
|
+
conf.inbound.tls.creds,
|
|
208
|
+
this._conf.inbound.tls.creds
|
|
209
|
+
);
|
|
210
|
+
if (this._conf.mutualTLS.inboundRequests.enabled && tlsCredsChanged) {
|
|
211
|
+
this._server.setSecureContext(conf.inbound.tls.creds);
|
|
212
|
+
}
|
|
213
|
+
this._server.removeAllListeners('request');
|
|
214
|
+
this._server.on('request', newApi.callback());
|
|
215
|
+
this._api.stop();
|
|
216
|
+
this._api = newApi;
|
|
217
|
+
this._conf = conf;
|
|
218
|
+
this._logger.log('restarted');
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
|
|
190
222
|
_createServer(tlsEnabled, tlsCreds, handler) {
|
|
191
223
|
if (!tlsEnabled) {
|
|
192
224
|
return http.createServer(handler);
|
|
File without changes
|
|
@@ -0,0 +1,127 @@
|
|
|
1
|
+
/**************************************************************************
|
|
2
|
+
* (C) Copyright ModusBox Inc. 2019 - All rights reserved. *
|
|
3
|
+
* *
|
|
4
|
+
* This file is made available under the terms of the license agreement *
|
|
5
|
+
* specified in the corresponding source code repository. *
|
|
6
|
+
* *
|
|
7
|
+
* ORIGINAL AUTHOR: *
|
|
8
|
+
* Yevhen Kyriukha - yevhen.kyriukha@modusbox.com *
|
|
9
|
+
**************************************************************************/
|
|
10
|
+
|
|
11
|
+
'use strict';
|
|
12
|
+
|
|
13
|
+
const { assert } = require('assert');
|
|
14
|
+
const express = require('express');
|
|
15
|
+
const bodyParser = require('body-parser');
|
|
16
|
+
const OAuth2Server = require('oauth2-server');
|
|
17
|
+
const { InMemoryCache } = require('./model');
|
|
18
|
+
const {Request, Response} = require('oauth2-server');
|
|
19
|
+
const UnauthorizedRequestError = require('oauth2-server/lib/errors/unauthorized-request-error');
|
|
20
|
+
|
|
21
|
+
class OAuthTestServer {
|
|
22
|
+
/**
|
|
23
|
+
*
|
|
24
|
+
* @param {Object} conf
|
|
25
|
+
* @param {number} conf.port OAuth server listen port
|
|
26
|
+
* @param {string} conf.clientKey Customer Key
|
|
27
|
+
* @param {String} conf.clientSecret Customer Secret
|
|
28
|
+
* @param {Logger} conf.logger Logger
|
|
29
|
+
*/
|
|
30
|
+
constructor({ port, clientKey, clientSecret, logger }) {
|
|
31
|
+
this._api = null;
|
|
32
|
+
this._port = port;
|
|
33
|
+
this._logger = logger;
|
|
34
|
+
this._clientKey = clientKey;
|
|
35
|
+
this._clientSecret = clientSecret;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
async start() {
|
|
39
|
+
if (this._app) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
this._app = express();
|
|
43
|
+
|
|
44
|
+
this._oauth = new OAuth2Server({
|
|
45
|
+
model: new InMemoryCache({ clientKey: this._clientKey, clientSecret:this._clientSecret }),
|
|
46
|
+
accessTokenLifetime: 60 * 60,
|
|
47
|
+
allowBearerTokensInQueryString: true,
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
this._app.use(bodyParser.urlencoded({ extended: false }));
|
|
51
|
+
this._app.use(bodyParser.json());
|
|
52
|
+
this._app.use(this.tokenMiddleware());
|
|
53
|
+
|
|
54
|
+
|
|
55
|
+
await new Promise((resolve) => this._app.listen(this._port, resolve));
|
|
56
|
+
this._logger.push({ port: this._port }).log('Serving OAuth2 Test Server');
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
async stop() {
|
|
60
|
+
if (!this._app) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
await new Promise(resolve => this._app.close(resolve));
|
|
64
|
+
this._app = null;
|
|
65
|
+
this._logger.log('OAuth2 Test Server shut down complete');
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
async reconfigure({ port, clientKey, clientSecret, logger }) {
|
|
69
|
+
assert(port === this._port, 'Cannot reconfigure running port');
|
|
70
|
+
return () => {
|
|
71
|
+
this._port = port;
|
|
72
|
+
this._logger = logger;
|
|
73
|
+
this.stop().then(() => this.start());
|
|
74
|
+
this._api = OAuthTestServer._SetupApi({ clientKey, clientSecret });
|
|
75
|
+
this._logger.log('restarted');
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
handleResponse(req, res, response) {
|
|
80
|
+
if (response.status === 302) {
|
|
81
|
+
const location = response.headers.location;
|
|
82
|
+
delete response.headers.location;
|
|
83
|
+
res.set(response.headers);
|
|
84
|
+
res.redirect(location);
|
|
85
|
+
} else {
|
|
86
|
+
res.set(response.headers);
|
|
87
|
+
res.status(response.status).send(response.body);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
handleError(e, req, res, response) {
|
|
92
|
+
if (response) {
|
|
93
|
+
res.set(response.headers);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
res.status(e.code);
|
|
97
|
+
|
|
98
|
+
if (e instanceof UnauthorizedRequestError) {
|
|
99
|
+
return res.send();
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
res.send({ error: e.name, error_description: e.message });
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
tokenMiddleware(options) {
|
|
106
|
+
return async (req, res, next) => {
|
|
107
|
+
const request = new Request(req);
|
|
108
|
+
const response = new Response(res);
|
|
109
|
+
|
|
110
|
+
let token;
|
|
111
|
+
|
|
112
|
+
try {
|
|
113
|
+
token = await this._oauth.token(request, response, options);
|
|
114
|
+
res.locals.oauth = {token};
|
|
115
|
+
} catch (e) {
|
|
116
|
+
await this.handleError(e, req, res, response, next);
|
|
117
|
+
return;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
await this.handleResponse(req, res, response);
|
|
121
|
+
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
|
|
127
|
+
module.exports = OAuthTestServer;
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
package/{OutboundServer → src/OutboundServer}/api_template/components/parameters/bulkQuoteId.yaml
RENAMED
|
@@ -3,7 +3,7 @@ in: path
|
|
|
3
3
|
required: true
|
|
4
4
|
schema:
|
|
5
5
|
$ref: >-
|
|
6
|
-
|
|
6
|
+
../../../../../node_modules/@mojaloop/api-snippets/fspiop/v1_1/openapi3/components/schemas/CorrelationId.yaml
|
|
7
7
|
description: >-
|
|
8
8
|
Identifier of the bulk transfer to continue as returned in the response to a
|
|
9
9
|
`POST /bulkTransfers` request.
|
package/{OutboundServer → src/OutboundServer}/api_template/components/parameters/bulkTransferId.yaml
RENAMED
|
@@ -3,7 +3,7 @@ in: path
|
|
|
3
3
|
required: true
|
|
4
4
|
schema:
|
|
5
5
|
$ref: >-
|
|
6
|
-
|
|
6
|
+
../../../../../node_modules/@mojaloop/api-snippets/fspiop/v1_1/openapi3/components/schemas/CorrelationId.yaml
|
|
7
7
|
description: >-
|
|
8
8
|
Identifier of the bulk transfer to continue as returned in the response to a
|
|
9
9
|
`POST /bulkTransfers` request.
|
|
@@ -3,7 +3,7 @@ in: path
|
|
|
3
3
|
required: true
|
|
4
4
|
schema:
|
|
5
5
|
$ref: >-
|
|
6
|
-
|
|
6
|
+
../../../../../node_modules/@mojaloop/api-snippets/fspiop/v1_1/openapi3/components/schemas/CorrelationId.yaml
|
|
7
7
|
description: >-
|
|
8
8
|
Identifier of the merchant request to pay transfer to continue as returned in
|
|
9
9
|
the response to a `POST /requestToPayTransfer` request.
|
package/{OutboundServer → src/OutboundServer}/api_template/components/parameters/transferId.yaml
RENAMED
|
@@ -3,7 +3,7 @@ in: path
|
|
|
3
3
|
required: true
|
|
4
4
|
schema:
|
|
5
5
|
$ref: >-
|
|
6
|
-
|
|
6
|
+
../../../../../node_modules/@mojaloop/api-snippets/fspiop/v1_1/openapi3/components/schemas/CorrelationId.yaml
|
|
7
7
|
description: >-
|
|
8
8
|
Identifier of the transfer to continue as returned in the response to a `POST
|
|
9
9
|
/transfers` request.
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -6,4 +6,4 @@ content:
|
|
|
6
6
|
properties:
|
|
7
7
|
errorInformation:
|
|
8
8
|
$ref: >-
|
|
9
|
-
|
|
9
|
+
../../../../../node_modules/@mojaloop/api-snippets/fspiop/v1_1/openapi3/components/schemas/ErrorInformation.yaml
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|