diff --git a/examples/cactus-example-carbon-accounting-backend/src/test/typescript/integration/admin-enroll-v1-endpoint.test.ts b/examples/cactus-example-carbon-accounting-backend/src/test/typescript/integration/admin-enroll-v1-endpoint.test.ts index 4bef291316..b9e8b03afa 100644 --- a/examples/cactus-example-carbon-accounting-backend/src/test/typescript/integration/admin-enroll-v1-endpoint.test.ts +++ b/examples/cactus-example-carbon-accounting-backend/src/test/typescript/integration/admin-enroll-v1-endpoint.test.ts @@ -12,7 +12,7 @@ import { } from "jose"; import { StatusCodes } from "http-status-codes"; import jsonStableStringify from "json-stable-stringify"; - +import { AxiosError } from "axios"; import { AuthorizationProtocol, ConfigService, @@ -46,6 +46,17 @@ const log = LoggerProvider.getOrCreate({ level: logLevel, }); +interface ResponseError extends AxiosError { + response: { + data: any; + status: number; + statusText: string; + headers: any; + config: any; + request?: any; + }; +} + test("BEFORE " + testCase, async (t: Test) => { const pruning = pruneDockerAllIfGithubAction({ logLevel }); await t.doesNotReject(pruning, "Pruning didn't throw OK"); @@ -181,16 +192,18 @@ test.skip(testCase, async (t: Test) => { try { await apiClientBad.enrollAdminV1({ orgName: "does-not-matter" }); t.fail("enroll admin response status === 403 FAIL"); - } catch (out) { - t.ok(out, "error thrown for forbidden endpoint truthy OK"); - t.ok(out.response, "enroll admin response truthy OK"); + } catch (err) { + const e = err as ResponseError; + + t.ok(e, "error thrown for forbidden endpoint truthy OK"); + t.ok(e.response, "enroll admin response truthy OK"); t.equal( - out.response.status, + e?.response?.status, StatusCodes.FORBIDDEN, "enroll admin response status === 403 OK", ); - t.notok(out.response.data.data, "out.response.data.data falsy OK"); - t.notok(out.response.data.success, "out.response.data.success falsy OK"); + t.notok(e?.response?.data?.data, "out.response.data.data falsy OK"); + t.notok(e?.response?.data?.success, "out.response.data.success falsy OK"); } t.end(); diff --git a/examples/cactus-example-discounted-asset-trade-client/src/main/typescript/scripts/run-discounted-asset-trade-client.ts b/examples/cactus-example-discounted-asset-trade-client/src/main/typescript/scripts/run-discounted-asset-trade-client.ts index 3a49885bb8..fb0f742afb 100644 --- a/examples/cactus-example-discounted-asset-trade-client/src/main/typescript/scripts/run-discounted-asset-trade-client.ts +++ b/examples/cactus-example-discounted-asset-trade-client/src/main/typescript/scripts/run-discounted-asset-trade-client.ts @@ -189,7 +189,12 @@ async function menuLoop(agent: AnoncredAgent) { break; } } catch (error) { - if (error.isTtyError) { + if ( + error && + typeof error === "object" && + "isTtyError" in error && + error.isTtyError + ) { log.error("Prompt couldn't be rendered in the current environment:"); isRunning = false; } diff --git a/examples/cactus-example-discounted-asset-trade/indy-endpoints.ts b/examples/cactus-example-discounted-asset-trade/indy-endpoints.ts index ea1bf7c78a..955b18da5c 100644 --- a/examples/cactus-example-discounted-asset-trade/indy-endpoints.ts +++ b/examples/cactus-example-discounted-asset-trade/indy-endpoints.ts @@ -7,6 +7,7 @@ import escapeHtml from "escape-html"; import { getLogger } from "log4js"; import { ConfigUtil } from "@hyperledger/cactus-cmd-socketio-server"; import { connectToClientAgent } from "./transaction-indy"; +import { safeStringifyException } from "@hyperledger/cactus-common"; const config: any = ConfigUtil.getConfig(); const moduleName = "indy-endpoints"; @@ -38,7 +39,7 @@ router.post( }); } catch (err) { res.status(500).send({ - error: escapeHtml(err), + error: escapeHtml(safeStringifyException(err)), }); next(err); } diff --git a/extensions/cactus-plugin-htlc-coordinator-besu/src/main/typescript/plugin-htlc-coordinator-besu.ts b/extensions/cactus-plugin-htlc-coordinator-besu/src/main/typescript/plugin-htlc-coordinator-besu.ts index 18f77f14bc..79ce149798 100644 --- a/extensions/cactus-plugin-htlc-coordinator-besu/src/main/typescript/plugin-htlc-coordinator-besu.ts +++ b/extensions/cactus-plugin-htlc-coordinator-besu/src/main/typescript/plugin-htlc-coordinator-besu.ts @@ -334,7 +334,7 @@ export class PluginHTLCCoordinatorBesu try { const res = await pluginHtlc.withdraw(withdrawRequest); return res; - } catch (ex: unknown) { + } catch (ex) { const cause = ex instanceof Error ? ex : fastSafeStringify(ex); throw new WithdrawCounterpartyTxReverted(`EVM tx reverted:`, cause); } diff --git a/extensions/cactus-plugin-htlc-coordinator-besu/src/main/typescript/web-services/counterparty-htlc-endpoint.ts b/extensions/cactus-plugin-htlc-coordinator-besu/src/main/typescript/web-services/counterparty-htlc-endpoint.ts index 546ab0624a..3ae184050e 100644 --- a/extensions/cactus-plugin-htlc-coordinator-besu/src/main/typescript/web-services/counterparty-htlc-endpoint.ts +++ b/extensions/cactus-plugin-htlc-coordinator-besu/src/main/typescript/web-services/counterparty-htlc-endpoint.ts @@ -15,6 +15,7 @@ import { } from "@hyperledger/cactus-common"; import { PluginRegistry, + handleRestEndpointException, registerWebServiceEndpoint, } from "@hyperledger/cactus-core"; import { CounterpartyHTLCRequest } from "../generated/openapi/typescript-axios"; @@ -108,10 +109,8 @@ export class CounterpartyHTLCEndpoint implements IWebServiceEndpoint { res.json(resBody); } catch (ex) { this.log.error(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, - }); + const errorMsg = "Internal Server Error"; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/extensions/cactus-plugin-htlc-coordinator-besu/src/main/typescript/web-services/own-htlc-endpoint.ts b/extensions/cactus-plugin-htlc-coordinator-besu/src/main/typescript/web-services/own-htlc-endpoint.ts index db8819867d..3023cfae84 100644 --- a/extensions/cactus-plugin-htlc-coordinator-besu/src/main/typescript/web-services/own-htlc-endpoint.ts +++ b/extensions/cactus-plugin-htlc-coordinator-besu/src/main/typescript/web-services/own-htlc-endpoint.ts @@ -16,6 +16,7 @@ import { import { registerWebServiceEndpoint, PluginRegistry, + handleRestEndpointException, } from "@hyperledger/cactus-core"; import { PluginHTLCCoordinatorBesu } from "../plugin-htlc-coordinator-besu"; import { OwnHTLCRequest } from "../generated/openapi/typescript-axios"; @@ -103,10 +104,8 @@ export class OwnHTLCEndpoint implements IWebServiceEndpoint { res.json(resBody); } catch (ex) { this.log.error(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex, - }); + const errorMsg = "Internal Server Error"; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/extensions/cactus-plugin-htlc-coordinator-besu/src/main/typescript/web-services/withdraw-counterparty-endpoint.ts b/extensions/cactus-plugin-htlc-coordinator-besu/src/main/typescript/web-services/withdraw-counterparty-endpoint.ts index df0f6b675b..4c43861d40 100644 --- a/extensions/cactus-plugin-htlc-coordinator-besu/src/main/typescript/web-services/withdraw-counterparty-endpoint.ts +++ b/extensions/cactus-plugin-htlc-coordinator-besu/src/main/typescript/web-services/withdraw-counterparty-endpoint.ts @@ -104,7 +104,7 @@ export class WithdrawCounterpartyEndpoint implements IWebServiceEndpoint { }) as unknown as PluginHTLCCoordinatorBesu; const resBody = await connector.withdrawCounterparty(request); res.json(resBody); - } catch (ex: unknown) { + } catch (ex) { if (ex instanceof WithdrawCounterpartyTxReverted) { this.log.debug("%o %o", reqTag, ex); res.status(400).json(ex); diff --git a/extensions/cactus-plugin-object-store-ipfs/src/main/typescript/plugin-object-store-ipfs.ts b/extensions/cactus-plugin-object-store-ipfs/src/main/typescript/plugin-object-store-ipfs.ts index 62320bb92a..885660f5d5 100644 --- a/extensions/cactus-plugin-object-store-ipfs/src/main/typescript/plugin-object-store-ipfs.ts +++ b/extensions/cactus-plugin-object-store-ipfs/src/main/typescript/plugin-object-store-ipfs.ts @@ -183,12 +183,12 @@ export class PluginObjectStoreIpfs implements IPluginObjectStore { this.log.debug(`StatResult for ${req.key}: %o`, statResult); return { key: req.key, checkedAt, isPresent: true }; } catch (ex) { - if (ex?.stack?.includes(K_IPFS_JS_HTTP_ERROR_FILE_DOES_NOT_EXIST)) { + if (ex instanceof Error && ex?.stack?.includes(K_IPFS_JS_HTTP_ERROR_FILE_DOES_NOT_EXIST)) { const msg = `Stat ${req.key} failed with error message containing phrase "${K_IPFS_JS_HTTP_ERROR_FILE_DOES_NOT_EXIST}" Returning isPresent=false ...`; this.log.debug(msg); return { key: req.key, checkedAt, isPresent: false }; } else { - throw new RuntimeError(`Checking presence of ${req.key} crashed:`, ex); + throw new RuntimeError(`Checking presence of ${req.key} crashed: ${ex}`,); } } } @@ -204,7 +204,7 @@ export class PluginObjectStoreIpfs implements IPluginObjectStore { parents: true, }); } catch (ex) { - throw new RuntimeError(`Can't set object ${keyPath}. Write failed:`, ex); + throw new RuntimeError(`Can't set object ${keyPath}. Write failed: ${ex}`); } return { key: req.key, diff --git a/extensions/cactus-plugin-object-store-ipfs/src/main/typescript/web-services/get-object-endpoint-v1.ts b/extensions/cactus-plugin-object-store-ipfs/src/main/typescript/web-services/get-object-endpoint-v1.ts index 427fa0f201..2f963f934b 100644 --- a/extensions/cactus-plugin-object-store-ipfs/src/main/typescript/web-services/get-object-endpoint-v1.ts +++ b/extensions/cactus-plugin-object-store-ipfs/src/main/typescript/web-services/get-object-endpoint-v1.ts @@ -16,7 +16,10 @@ import { IWebServiceEndpoint, } from "@hyperledger/cactus-core-api"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import OAS from "../../json/openapi.json"; @@ -93,8 +96,8 @@ export class GetObjectEndpointV1 implements IWebServiceEndpoint { res.json(resBody); } catch (ex) { this.log.error(`${tag} Failed to serve request:`, ex); - res.status(500); - res.json({ error: ex.stack }); + const errorMsg = "Internal Server Error"; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/extensions/cactus-plugin-object-store-ipfs/src/main/typescript/web-services/has-object-endpoint-v1.ts b/extensions/cactus-plugin-object-store-ipfs/src/main/typescript/web-services/has-object-endpoint-v1.ts index 3ae6b08967..2bfd49055d 100644 --- a/extensions/cactus-plugin-object-store-ipfs/src/main/typescript/web-services/has-object-endpoint-v1.ts +++ b/extensions/cactus-plugin-object-store-ipfs/src/main/typescript/web-services/has-object-endpoint-v1.ts @@ -16,7 +16,10 @@ import { IWebServiceEndpoint, } from "@hyperledger/cactus-core-api"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import OAS from "../../json/openapi.json"; @@ -93,8 +96,8 @@ export class HasObjectEndpointV1 implements IWebServiceEndpoint { res.json(resBody); } catch (ex) { this.log.error(`${tag} Failed to serve request:`, ex); - res.status(500); - res.json({ error: ex.stack }); + const errorMsg = "Internal Server Error"; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/extensions/cactus-plugin-object-store-ipfs/src/main/typescript/web-services/set-object-endpoint-v1.ts b/extensions/cactus-plugin-object-store-ipfs/src/main/typescript/web-services/set-object-endpoint-v1.ts index e0e97d8b80..ca7bb3af9a 100644 --- a/extensions/cactus-plugin-object-store-ipfs/src/main/typescript/web-services/set-object-endpoint-v1.ts +++ b/extensions/cactus-plugin-object-store-ipfs/src/main/typescript/web-services/set-object-endpoint-v1.ts @@ -16,7 +16,10 @@ import { IWebServiceEndpoint, } from "@hyperledger/cactus-core-api"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import OAS from "../../json/openapi.json"; @@ -93,8 +96,8 @@ export class SetObjectEndpointV1 implements IWebServiceEndpoint { res.json(resBody); } catch (ex) { this.log.error(`${tag} Failed to serve request:`, ex); - res.status(500); - res.json({ error: ex.stack }); + const errorMsg = "Internal Server Error"; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-api-client/src/main/typescript/default-consortium-provider.ts b/packages/cactus-api-client/src/main/typescript/default-consortium-provider.ts index cef24a1f8c..60addc60ad 100644 --- a/packages/cactus-api-client/src/main/typescript/default-consortium-provider.ts +++ b/packages/cactus-api-client/src/main/typescript/default-consortium-provider.ts @@ -18,8 +18,7 @@ export interface IDefaultConsortiumProviderOptions { } export class DefaultConsortiumProvider - implements IAsyncProvider -{ + implements IAsyncProvider { public static readonly CLASS_NAME = "DefaultConsortiumProvider"; private readonly log: Logger; @@ -64,9 +63,15 @@ export class DefaultConsortiumProvider const res = await this.options.apiClient.getConsortiumJwsV1(); return this.parseConsortiumJws(res.data); } catch (ex) { - const innerException = (ex.toJSON && ex.toJSON()) || ex; - this.log.error(`Request for Consortium JWS failed: `, innerException); - throw ex; + if (ex instanceof Date && ex !== null) { + const innerException = (ex.toJSON && ex.toJSON()) + this.log.error(`Request for Consortium JWS failed: `, innerException); + throw ex; + } else { + this.log.error(`Request for Consortium JWS failed: `, ex); + throw ex; + } + } } } diff --git a/packages/cactus-api-client/src/test/typescript/integration/default-consortium-provider.test.ts b/packages/cactus-api-client/src/test/typescript/integration/default-consortium-provider.test.ts index ba910ff134..3be869825d 100644 --- a/packages/cactus-api-client/src/test/typescript/integration/default-consortium-provider.test.ts +++ b/packages/cactus-api-client/src/test/typescript/integration/default-consortium-provider.test.ts @@ -32,14 +32,23 @@ test("Reports failures with meaningful information", async (t: Test) => { await provider.get(); t2.fail("Provider.get() did not throw despite API errors."); } catch (ex) { - t2.ok(ex, "Thrown error truthy OK"); - t2.ok(ex.message, "Thrown error.message truthy OK"); - t2.equal( - typeof ex.message, - "string", - "Thrown error.message type string OK", - ); - t2.true(ex.message.includes("timeout"), "Has timeout in msg OK"); + if ( + typeof ex === "object" && + ex !== null && + "message" in ex && + typeof ex.message === "string" + ) { + t2.ok(ex, "Thrown error truthy OK"); + t2.ok(ex.message, "Thrown error.message truthy OK"); + t2.equal( + typeof ex.message, + "string", + "Thrown error.message type string OK", + ); + t2.true(ex.message.includes("timeout"), "Has timeout in msg OK"); + } else { + t2.ok(ex, "Thrown error truthy OK"); + } } t2.end(); }); @@ -57,17 +66,23 @@ test("Reports failures with meaningful information", async (t: Test) => { await provider.get(); t2.fail("Provider.get() did not throw despite API errors."); } catch (ex) { - t2.ok(ex, "Thrown error truthy OK"); - t2.ok(ex.message, "Thrown error.message truthy OK"); - t2.equal( - typeof ex.message, - "string", - "Thrown error.message type string OK", - ); - t2.true( - ex.message.includes("status code 404"), - "Has Status Code in msg OK", - ); + if (typeof ex === "object" && ex !== null) { + if ("message" in ex && typeof ex.message === "string") { + t2.ok(ex, "Thrown error truthy OK"); + t2.ok(ex.message, "Thrown error.message truthy OK"); + t2.equal( + typeof ex.message, + "string", + "Thrown error.message type string OK", + ); + t2.true( + ex.message.includes("status code 404"), + "Has Status Code in msg OK", + ); + } + } else { + t2.ok(ex, "Thrown error truthy OK"); + } } t2.end(); }); diff --git a/packages/cactus-cmd-api-server/src/main/typescript/api-server.ts b/packages/cactus-cmd-api-server/src/main/typescript/api-server.ts index e417c9f5c8..3672eede3a 100644 --- a/packages/cactus-cmd-api-server/src/main/typescript/api-server.ts +++ b/packages/cactus-cmd-api-server/src/main/typescript/api-server.ts @@ -293,14 +293,14 @@ export class ApiServer { addressInfoGrpc, addressInfoCrpc, }; - } catch (ex1: unknown) { + } catch (ex1) { const context = "Failed to start ApiServer"; this.log.error(context, ex1); this.log.error(`Attempting shutdown...`); try { await this.shutdown(); this.log.info(`Server shut down after crash OK`); - } catch (ex2: unknown) { + } catch (ex2) { this.log.error(ApiServer.E_POST_CRASH_SHUTDOWN, ex2); } throw newRex(context, ex1); @@ -349,7 +349,7 @@ export class ApiServer { await this.getPluginImportsCount(), ); return this.pluginRegistry; - } catch (ex: unknown) { + } catch (ex) { this.pluginRegistry = new PluginRegistry({ plugins: [] }); const context = "Failed to init PluginRegistry"; this.log.debug(context, ex); @@ -413,7 +413,7 @@ export class ApiServer { await plugin.onPluginInit(); return plugin; - } catch (ex: unknown) { + } catch (ex) { const context = `${fnTag} failed instantiating plugin '${packageName}' with the instanceId '${options.instanceId}'`; this.log.debug(context, ex); throw newRex(context, ex); @@ -437,7 +437,7 @@ export class ApiServer { try { await fs.mkdirp(pluginPackageDir); this.log.debug(`${pkgName} plugin package dir: %o`, pluginPackageDir); - } catch (ex: unknown) { + } catch (ex) { const context = "Could not create plugin installation directory, check the file-system permissions."; throw newRex(context, ex); @@ -464,7 +464,7 @@ export class ApiServer { throw newRex(eMsg, out); } this.log.info(`Installed ${pkgName} OK`); - } catch (ex: unknown) { + } catch (ex) { const context = `${fnTag} failed installing plugin '${pkgName}`; this.log.debug(ex, context); throw newRex(context, ex); @@ -788,15 +788,15 @@ export class ApiServer { const grpcTlsCredentials = this.options.config.grpcMtlsEnabled ? GrpcServerCredentials.createSsl( - Buffer.from(this.options.config.apiTlsCertPem), - [ - { - cert_chain: Buffer.from(this.options.config.apiTlsCertPem), - private_key: Buffer.from(this.options.config.apiTlsKeyPem), - }, - ], - true, - ) + Buffer.from(this.options.config.apiTlsCertPem), + [ + { + cert_chain: Buffer.from(this.options.config.apiTlsCertPem), + private_key: Buffer.from(this.options.config.apiTlsKeyPem), + }, + ], + true, + ) : GrpcServerCredentials.createInsecure(); this.grpcServer.addService( diff --git a/packages/cactus-cmd-api-server/src/main/typescript/web-services/watch-healthcheck-v1-endpoint.ts b/packages/cactus-cmd-api-server/src/main/typescript/web-services/watch-healthcheck-v1-endpoint.ts index c6db12eea0..c56fe044ed 100644 --- a/packages/cactus-cmd-api-server/src/main/typescript/web-services/watch-healthcheck-v1-endpoint.ts +++ b/packages/cactus-cmd-api-server/src/main/typescript/web-services/watch-healthcheck-v1-endpoint.ts @@ -53,7 +53,8 @@ export class WatchHealthcheckV1Endpoint { socket.emit(WatchHealthcheckV1.Next, next); } catch (ex) { log.error(`Failed to construct health check response:`, ex); - socket.emit(WatchHealthcheckV1.Error, ex); + const responseError = ex as HealthCheckResponse; + socket.emit(WatchHealthcheckV1.Error, responseError); clearInterval(timerId); } }, 1000); diff --git a/packages/cactus-cmd-api-server/src/test/typescript/benchmark/run-cmd-api-server-benchmark.ts b/packages/cactus-cmd-api-server/src/test/typescript/benchmark/run-cmd-api-server-benchmark.ts index f44b2a6435..2b60407e37 100644 --- a/packages/cactus-cmd-api-server/src/test/typescript/benchmark/run-cmd-api-server-benchmark.ts +++ b/packages/cactus-cmd-api-server/src/test/typescript/benchmark/run-cmd-api-server-benchmark.ts @@ -245,7 +245,7 @@ const main = async (opts: { readonly argv: Readonly> }) => { console.log("%s Shut down API server OK", LOG_TAG); }; -main({ argv: process.argv }).catch((ex: unknown) => { +main({ argv: process.argv }).catch((ex) => { console.error("%s process crashed with:", LOG_TAG, ex); process.exit(1); }); diff --git a/packages/cactus-cmd-api-server/src/test/typescript/fixtures/plugin-ledger-connector-stub/web-services/deploy-contract-endpoint.ts b/packages/cactus-cmd-api-server/src/test/typescript/fixtures/plugin-ledger-connector-stub/web-services/deploy-contract-endpoint.ts index 2265770655..806d0374b5 100644 --- a/packages/cactus-cmd-api-server/src/test/typescript/fixtures/plugin-ledger-connector-stub/web-services/deploy-contract-endpoint.ts +++ b/packages/cactus-cmd-api-server/src/test/typescript/fixtures/plugin-ledger-connector-stub/web-services/deploy-contract-endpoint.ts @@ -14,7 +14,10 @@ import { IAsyncProvider, } from "@hyperledger/cactus-common"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { PluginLedgerConnectorStub } from "../plugin-ledger-connector-stub"; @@ -101,10 +104,8 @@ export class DeployContractEndpoint implements IWebServiceEndpoint { res.json(resBody); } catch (ex) { this.log.error(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, - }); + const errorMsg = "Internal Server Error"; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-cmd-api-server/src/test/typescript/fixtures/plugin-ledger-connector-stub/web-services/run-transaction-endpoint.ts b/packages/cactus-cmd-api-server/src/test/typescript/fixtures/plugin-ledger-connector-stub/web-services/run-transaction-endpoint.ts index ccca8e338f..957ad943e1 100644 --- a/packages/cactus-cmd-api-server/src/test/typescript/fixtures/plugin-ledger-connector-stub/web-services/run-transaction-endpoint.ts +++ b/packages/cactus-cmd-api-server/src/test/typescript/fixtures/plugin-ledger-connector-stub/web-services/run-transaction-endpoint.ts @@ -12,7 +12,10 @@ import { IExpressRequestHandler, IWebServiceEndpoint, } from "@hyperledger/cactus-core-api"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { PluginLedgerConnectorStub } from "../plugin-ledger-connector-stub"; @@ -99,10 +102,8 @@ export class RunTransactionEndpoint implements IWebServiceEndpoint { res.json({ success: true, data: resBody }); } catch (ex) { this.log.error(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, - }); + const errorMsg = "Internal Server Error"; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-cmd-api-server/src/test/typescript/fixtures/plugin-ledger-connector-stub/web-services/unprotected-action-endpoint.ts b/packages/cactus-cmd-api-server/src/test/typescript/fixtures/plugin-ledger-connector-stub/web-services/unprotected-action-endpoint.ts index 7b55bb6d0c..4f6de7afeb 100644 --- a/packages/cactus-cmd-api-server/src/test/typescript/fixtures/plugin-ledger-connector-stub/web-services/unprotected-action-endpoint.ts +++ b/packages/cactus-cmd-api-server/src/test/typescript/fixtures/plugin-ledger-connector-stub/web-services/unprotected-action-endpoint.ts @@ -12,7 +12,10 @@ import { IExpressRequestHandler, IWebServiceEndpoint, } from "@hyperledger/cactus-core-api"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { PluginLedgerConnectorStub } from "../plugin-ledger-connector-stub"; @@ -105,10 +108,8 @@ export class UnprotectedActionEndpoint implements IWebServiceEndpoint { res.json({ success: true, data }); } catch (ex) { this.log.error(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, - }); + const errorMsg = "Internal Server Error"; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-cmd-api-server/src/test/typescript/integration/jwt-endpoint-authz-scope-enforcement.test.ts b/packages/cactus-cmd-api-server/src/test/typescript/integration/jwt-endpoint-authz-scope-enforcement.test.ts index 0f9c776d39..7618a4ad2c 100644 --- a/packages/cactus-cmd-api-server/src/test/typescript/integration/jwt-endpoint-authz-scope-enforcement.test.ts +++ b/packages/cactus-cmd-api-server/src/test/typescript/integration/jwt-endpoint-authz-scope-enforcement.test.ts @@ -139,7 +139,7 @@ describe(testCase, () => { Authorization: `Bearer ${token}`, }, }); - } catch (out: unknown) { + } catch (out) { if (axios.isAxiosError(out)) { expect(out).toBeTruthy(); expect(out.response).toBeTruthy(); diff --git a/packages/cactus-cmd-socketio-server/src/main/typescript/routing-interface/routes/login.ts b/packages/cactus-cmd-socketio-server/src/main/typescript/routing-interface/routes/login.ts index 984d11e4bd..5dd5197889 100644 --- a/packages/cactus-cmd-socketio-server/src/main/typescript/routing-interface/routes/login.ts +++ b/packages/cactus-cmd-socketio-server/src/main/typescript/routing-interface/routes/login.ts @@ -45,8 +45,10 @@ router.post("/", (req: Request, res: Response, next: NextFunction) => { res.status(201); res.send(respData); - } catch (err: any) { - logger.error(`##err name: ${err.constructor.name}`); + } catch (err) { + if (typeof err === "object" && err !== null) { + logger.error(`##err name: ${err.constructor.name}`); + } if (err instanceof RIFError) { logger.debug(`##catch RIFError, ${err.statusCode}, ${err.message}`); diff --git a/packages/cactus-cmd-socketio-server/src/main/typescript/routing-interface/util/ConfigUtil.ts b/packages/cactus-cmd-socketio-server/src/main/typescript/routing-interface/util/ConfigUtil.ts index b55575c21d..1cccac973a 100644 --- a/packages/cactus-cmd-socketio-server/src/main/typescript/routing-interface/util/ConfigUtil.ts +++ b/packages/cactus-cmd-socketio-server/src/main/typescript/routing-interface/util/ConfigUtil.ts @@ -11,7 +11,7 @@ const yaml = require("js-yaml"); function readConfig(path: string, encoding = "utf8"): object { try { return yaml.safeLoad(fs.readFileSync(path, encoding)); - } catch (err: unknown) { + } catch (err) { return {}; } } diff --git a/packages/cactus-common/src/main/typescript/servers.ts b/packages/cactus-common/src/main/typescript/servers.ts index 21ba40b4f3..0cd170714c 100644 --- a/packages/cactus-common/src/main/typescript/servers.ts +++ b/packages/cactus-common/src/main/typescript/servers.ts @@ -89,9 +89,13 @@ export class Servers { const server = await Servers.startOnPort(preferredPort, host); return server; } catch (ex) { - // if something else went wrong we still want to just give up - if (!ex.message.includes("EADDRINUSE")) { - throw ex; + if (ex instanceof Error) { + if (!ex.message.includes("EADDRINUSE")) { + throw ex; + } + } else { + console.error("Unknown error occurred:", ex); + throw new Error("Unknown error occurred"); } } return Servers.startOnPort(0); diff --git a/packages/cactus-common/src/test/typescript/unit/exception/create-runtime-error-with-cause.test.ts b/packages/cactus-common/src/test/typescript/unit/exception/create-runtime-error-with-cause.test.ts index 69a3615eac..282f256330 100644 --- a/packages/cactus-common/src/test/typescript/unit/exception/create-runtime-error-with-cause.test.ts +++ b/packages/cactus-common/src/test/typescript/unit/exception/create-runtime-error-with-cause.test.ts @@ -14,7 +14,7 @@ describe("createRuntimeErrorWithCause() & newRex()", () => { try { throw anError; - } catch (ex: unknown) { + } catch (ex) { const rex = createRuntimeErrorWithCause(eMsg, ex); const { cause, message, name, stack } = rex; expect(cause).toBeInstanceOf(Error); @@ -43,7 +43,7 @@ describe("createRuntimeErrorWithCause() & newRex()", () => { try { throw anError; - } catch (ex: unknown) { + } catch (ex) { const rex = createRuntimeErrorWithCause(eMsg, ex); const { cause, message, name, stack } = rex; expect(cause).toBeInstanceOf(Error); @@ -69,7 +69,7 @@ describe("createRuntimeErrorWithCause() & newRex()", () => { try { throw anError; - } catch (ex: unknown) { + } catch (ex) { const rex = createRuntimeErrorWithCause(eMsg, ex); const { cause, message, name, stack } = rex; expect(cause).toBeInstanceOf(Error); @@ -97,7 +97,7 @@ describe("createRuntimeErrorWithCause() & newRex()", () => { try { throw fakeErrorWithStack; - } catch (ex: unknown) { + } catch (ex) { const rex = createRuntimeErrorWithCause(eMsg, ex); const { cause, message, name, stack } = rex; expect(cause).toBeInstanceOf(Error); @@ -129,7 +129,7 @@ describe("createRuntimeErrorWithCause() & newRex()", () => { try { throw fakeErrorWithStack; - } catch (ex: unknown) { + } catch (ex) { const rex = createRuntimeErrorWithCause(eMsg, ex); const { cause, message, name, stack } = rex; expect(cause).toBeInstanceOf(Error); @@ -152,7 +152,7 @@ describe("createRuntimeErrorWithCause() & newRex()", () => { try { throw undefined; - } catch (ex: unknown) { + } catch (ex) { const rex = createRuntimeErrorWithCause(eMsg, ex); const { cause, message, name, stack } = rex; expect(cause).toBeInstanceOf(Error); @@ -172,7 +172,7 @@ describe("createRuntimeErrorWithCause() & newRex()", () => { try { throw null; - } catch (ex: unknown) { + } catch (ex) { const rex = createRuntimeErrorWithCause(eMsg, ex); const { cause, message, name, stack } = rex; expect(cause).toBeInstanceOf(Error); @@ -192,7 +192,7 @@ describe("createRuntimeErrorWithCause() & newRex()", () => { try { throw NaN; - } catch (ex: unknown) { + } catch (ex) { const rex = createRuntimeErrorWithCause(eMsg, ex); const { cause, message, name, stack } = rex; expect(cause).toBeInstanceOf(Error); @@ -212,7 +212,7 @@ describe("createRuntimeErrorWithCause() & newRex()", () => { try { throw 0; - } catch (ex: unknown) { + } catch (ex) { const rex = createRuntimeErrorWithCause(eMsg, ex); const { cause, message, name, stack } = rex; expect(cause).toBeInstanceOf(Error); @@ -232,7 +232,7 @@ describe("createRuntimeErrorWithCause() & newRex()", () => { try { throw {}; - } catch (ex: unknown) { + } catch (ex) { const rex = createRuntimeErrorWithCause(eMsg, ex); const { cause, message, name, stack } = rex; expect(cause).toBeInstanceOf(Error); @@ -252,7 +252,7 @@ describe("createRuntimeErrorWithCause() & newRex()", () => { try { throw []; - } catch (ex: unknown) { + } catch (ex) { const rex = createRuntimeErrorWithCause(eMsg, ex); const { cause, message, name, stack } = rex; expect(cause).toBeInstanceOf(Error); @@ -275,7 +275,7 @@ describe("createRuntimeErrorWithCause() & newRex()", () => { try { throw [id1, id2, id3]; - } catch (ex: unknown) { + } catch (ex) { const rex = createRuntimeErrorWithCause(eMsg, ex); const { cause, message, name, stack } = rex; expect(cause).toBeInstanceOf(Error); @@ -300,7 +300,7 @@ describe("createRuntimeErrorWithCause() & newRex()", () => { try { const symbolToThrow = Symbol(id1); throw symbolToThrow; - } catch (ex: unknown) { + } catch (ex) { const rex = createRuntimeErrorWithCause(eMsg, ex); const { cause, message, name, stack } = rex; expect(cause).toBeInstanceOf(Error); @@ -326,7 +326,7 @@ describe("createRuntimeErrorWithCause() & newRex()", () => { try { throw maxSafeIntSquared; - } catch (ex: unknown) { + } catch (ex) { const rex = createRuntimeErrorWithCause(eMsg, ex); const { cause, message, name, stack } = rex; expect(cause).toBeInstanceOf(Error); @@ -347,7 +347,7 @@ describe("createRuntimeErrorWithCause() & newRex()", () => { const eMsg = uuidV4(); try { throw throwable; - } catch (ex: unknown) { + } catch (ex) { const rex = createRuntimeErrorWithCause(eMsg, ex); const { cause, message, name, stack } = rex; expect(cause).toBeInstanceOf(Error); @@ -366,7 +366,7 @@ describe("createRuntimeErrorWithCause() & newRex()", () => { const eMsg = uuidV4(); try { throw eMsg; - } catch (ex: unknown) { + } catch (ex) { const rex = createRuntimeErrorWithCause(eMsg, ex); const { cause, message, name, stack } = rex; expect(cause).toBeInstanceOf(Error); diff --git a/packages/cactus-core/src/main/typescript/web-services/get-open-api-spec-v1-endpoint-base.ts b/packages/cactus-core/src/main/typescript/web-services/get-open-api-spec-v1-endpoint-base.ts index 0a699ca6df..223a4110be 100644 --- a/packages/cactus-core/src/main/typescript/web-services/get-open-api-spec-v1-endpoint-base.ts +++ b/packages/cactus-core/src/main/typescript/web-services/get-open-api-spec-v1-endpoint-base.ts @@ -179,7 +179,7 @@ export class GetOpenApiSpecV1EndpointBase implements IWebServiceEndpoint { const { oas } = this.opts; res.status(200); res.json(oas); - } catch (ex: unknown) { + } catch (ex) { const errorMsg = `${fnTag} request handler fn crashed for: ${reqMeta}`; handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } diff --git a/packages/cactus-core/src/main/typescript/web-services/register-web-service-endpoint.ts b/packages/cactus-core/src/main/typescript/web-services/register-web-service-endpoint.ts index 6771175400..44459cd628 100644 --- a/packages/cactus-core/src/main/typescript/web-services/register-web-service-endpoint.ts +++ b/packages/cactus-core/src/main/typescript/web-services/register-web-service-endpoint.ts @@ -42,7 +42,7 @@ export async function registerWebServiceEndpoint( } else { registrationMethod(httpPath, requestHandler); } - } catch (ex: unknown) { + } catch (ex) { const errorMessage = `${fnTag} Express verb method ${httpVerb} threw while registering endpoint on path ${httpPath}`; throw createRuntimeErrorWithCause(errorMessage, ex); } diff --git a/packages/cactus-plugin-bungee-hermes/src/main/typescript/web-services/create-view-endpoint.ts b/packages/cactus-plugin-bungee-hermes/src/main/typescript/web-services/create-view-endpoint.ts index 24575259af..4d523e2a78 100644 --- a/packages/cactus-plugin-bungee-hermes/src/main/typescript/web-services/create-view-endpoint.ts +++ b/packages/cactus-plugin-bungee-hermes/src/main/typescript/web-services/create-view-endpoint.ts @@ -96,7 +96,7 @@ export class CreateViewEndpointV1 implements IWebServiceEndpoint { try { const view = await this.options.bungee.onCreateView(req.body); res.status(200).json(view); - } catch (ex: unknown) { + } catch (ex) { const errorMsg = `${fnTag} request handler fn crashed for: ${reqTag}`; handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } diff --git a/packages/cactus-plugin-bungee-hermes/src/main/typescript/web-services/get-available-strategies-endpoint.ts b/packages/cactus-plugin-bungee-hermes/src/main/typescript/web-services/get-available-strategies-endpoint.ts index 23fce2800d..14ec365f8c 100644 --- a/packages/cactus-plugin-bungee-hermes/src/main/typescript/web-services/get-available-strategies-endpoint.ts +++ b/packages/cactus-plugin-bungee-hermes/src/main/typescript/web-services/get-available-strategies-endpoint.ts @@ -96,7 +96,7 @@ export class GetAvailableStrategiesEndpointV1 implements IWebServiceEndpoint { try { const strategies = this.options.bungee.getAvailableStrategies(); res.status(200).json(strategies); - } catch (ex: unknown) { + } catch (ex) { const errorMsg = `${fnTag} request handler fn crashed for: ${reqTag}`; handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } diff --git a/packages/cactus-plugin-bungee-hermes/src/main/typescript/web-services/get-public-key-endpoint.ts b/packages/cactus-plugin-bungee-hermes/src/main/typescript/web-services/get-public-key-endpoint.ts index 836d1efa7d..8436ea3833 100644 --- a/packages/cactus-plugin-bungee-hermes/src/main/typescript/web-services/get-public-key-endpoint.ts +++ b/packages/cactus-plugin-bungee-hermes/src/main/typescript/web-services/get-public-key-endpoint.ts @@ -96,7 +96,7 @@ export class GetPublicKeyEndpointV1 implements IWebServiceEndpoint { try { const pubKey = this.options.bungee.getPublicKey(); res.status(200).json(pubKey); - } catch (ex: unknown) { + } catch (ex) { const errorMsg = `${fnTag} request handler fn crashed for: ${reqTag}`; handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } diff --git a/packages/cactus-plugin-consortium-manual/src/main/typescript/consortium/get-consortium-jws-endpoint-v1.ts b/packages/cactus-plugin-consortium-manual/src/main/typescript/consortium/get-consortium-jws-endpoint-v1.ts index 5414a64c0d..8616f510ab 100644 --- a/packages/cactus-plugin-consortium-manual/src/main/typescript/consortium/get-consortium-jws-endpoint-v1.ts +++ b/packages/cactus-plugin-consortium-manual/src/main/typescript/consortium/get-consortium-jws-endpoint-v1.ts @@ -19,6 +19,7 @@ import { import { registerWebServiceEndpoint, ConsortiumRepository, + handleRestEndpointException, } from "@hyperledger/cactus-core"; import OAS from "../../json/openapi.json"; @@ -99,6 +100,7 @@ export class GetConsortiumEndpointV1 implements IWebServiceEndpoint { async handleRequest(req: Request, res: Response): Promise { const fnTag = "GetConsortiumJwsEndpointV1#handleRequest()"; + const reqTag = `${this.getVerbLowerCase()} - ${this.getPath()}`; this.log.debug(`POST ${this.getPath()}`); try { @@ -109,9 +111,8 @@ export class GetConsortiumEndpointV1 implements IWebServiceEndpoint { res.json(body); } catch (ex) { this.log.error(`${fnTag} failed to serve request`, ex); - res.status(500); - res.statusMessage = ex.message; - res.json({ error: ex.stack }); + const errorMsg = `${fnTag} request handler fn crashed for: ${reqTag}`; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-consortium-manual/src/main/typescript/consortium/get-node-jws-endpoint-v1.ts b/packages/cactus-plugin-consortium-manual/src/main/typescript/consortium/get-node-jws-endpoint-v1.ts index 9fd091fa9d..0398ab4e58 100644 --- a/packages/cactus-plugin-consortium-manual/src/main/typescript/consortium/get-node-jws-endpoint-v1.ts +++ b/packages/cactus-plugin-consortium-manual/src/main/typescript/consortium/get-node-jws-endpoint-v1.ts @@ -19,6 +19,7 @@ import { import { registerWebServiceEndpoint, ConsortiumRepository, + handleRestEndpointException, } from "@hyperledger/cactus-core"; import OAS from "../../json/openapi.json"; @@ -97,6 +98,7 @@ export class GetNodeJwsEndpoint implements IWebServiceEndpoint { async handleRequest(req: Request, res: Response): Promise { const fnTag = "GetNodeJwsEndpoint#createJws()"; + const reqTag = `${this.getVerbLowerCase()} - ${this.getPath()}`; this.log.debug(`GET ${this.getPath()}`); try { const jws = await this.options.plugin.getNodeJws(); @@ -105,9 +107,8 @@ export class GetNodeJwsEndpoint implements IWebServiceEndpoint { res.json(body); } catch (ex) { this.log.error(`${fnTag} failed to serve request`, ex); - res.status(500); - res.statusMessage = ex.message; - res.json({ error: ex.stack }); + const errorMsg = `${fnTag} request handler fn crashed for: ${reqTag}`; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-consortium-manual/src/main/typescript/consortium/get-prometheus-exporter-metrics-endpoint-v1.ts b/packages/cactus-plugin-consortium-manual/src/main/typescript/consortium/get-prometheus-exporter-metrics-endpoint-v1.ts index 8f1bd53806..37b72b8e25 100644 --- a/packages/cactus-plugin-consortium-manual/src/main/typescript/consortium/get-prometheus-exporter-metrics-endpoint-v1.ts +++ b/packages/cactus-plugin-consortium-manual/src/main/typescript/consortium/get-prometheus-exporter-metrics-endpoint-v1.ts @@ -16,7 +16,10 @@ import { import OAS from "../../json/openapi.json"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { PluginConsortiumManual } from "../plugin-consortium-manual"; @@ -85,6 +88,7 @@ export class GetPrometheusExporterMetricsEndpointV1 async handleRequest(req: Request, res: Response): Promise { const fnTag = "GetPrometheusExporterMetrics#handleRequest()"; + const reqTag = `${this.getVerbLowerCase()} - ${this.getPath()}`; const verbUpper = this.getVerbLowerCase().toUpperCase(); this.log.debug(`${verbUpper} ${this.getPath()}`); @@ -94,9 +98,8 @@ export class GetPrometheusExporterMetricsEndpointV1 res.send(resBody); } catch (ex) { this.log.error(`${fnTag} failed to serve request`, ex); - res.status(500); - res.statusMessage = ex.message; - res.json({ error: ex.stack }); + const errorMsg = `${fnTag} request handler fn crashed for: ${reqTag}`; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-htlc-eth-besu-erc20/src/main/typescript/web-services/get-single-status-endpoint.ts b/packages/cactus-plugin-htlc-eth-besu-erc20/src/main/typescript/web-services/get-single-status-endpoint.ts index 3313d84e07..91f09ea100 100644 --- a/packages/cactus-plugin-htlc-eth-besu-erc20/src/main/typescript/web-services/get-single-status-endpoint.ts +++ b/packages/cactus-plugin-htlc-eth-besu-erc20/src/main/typescript/web-services/get-single-status-endpoint.ts @@ -11,7 +11,10 @@ import { IExpressRequestHandler, IWebServiceEndpoint, } from "@hyperledger/cactus-core-api"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import OAS from "../../json/openapi.json"; import { PluginHtlcEthBesuErc20 } from "../plugin-htlc-eth-besu-erc20"; @@ -85,10 +88,8 @@ export class GetSingleStatusEndpoint implements IWebServiceEndpoint { res.send(callOutput); } catch (ex) { this.log.error(`${fnTag} failed to serve request`, ex); - res.status(400).json({ - message: "Bad request", - error: ex?.stack || ex?.message, - }); + const errorMsg = `Bad request`; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-htlc-eth-besu-erc20/src/main/typescript/web-services/get-status-endpoint.ts b/packages/cactus-plugin-htlc-eth-besu-erc20/src/main/typescript/web-services/get-status-endpoint.ts index cdbb364b20..3e8e563604 100644 --- a/packages/cactus-plugin-htlc-eth-besu-erc20/src/main/typescript/web-services/get-status-endpoint.ts +++ b/packages/cactus-plugin-htlc-eth-besu-erc20/src/main/typescript/web-services/get-status-endpoint.ts @@ -12,7 +12,10 @@ import { IExpressRequestHandler, IWebServiceEndpoint, } from "@hyperledger/cactus-core-api"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import OAS from "../../json/openapi.json"; import { PluginHtlcEthBesuErc20 } from "../plugin-htlc-eth-besu-erc20"; @@ -85,10 +88,8 @@ export class GetStatusEndpoint implements IWebServiceEndpoint { res.send(callOutput); } catch (ex) { this.log.error(`${fnTag} failed to serve request`, ex); - res.status(400).json({ - message: "Bad request", - error: ex?.stack || ex?.message, - }); + const errorMsg = `Bar request`; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-htlc-eth-besu-erc20/src/main/typescript/web-services/initialize-endpoint.ts b/packages/cactus-plugin-htlc-eth-besu-erc20/src/main/typescript/web-services/initialize-endpoint.ts index 20a3a7d365..7cdac1e4a4 100644 --- a/packages/cactus-plugin-htlc-eth-besu-erc20/src/main/typescript/web-services/initialize-endpoint.ts +++ b/packages/cactus-plugin-htlc-eth-besu-erc20/src/main/typescript/web-services/initialize-endpoint.ts @@ -12,7 +12,10 @@ import { IExpressRequestHandler, IWebServiceEndpoint, } from "@hyperledger/cactus-core-api"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import OAS from "../../json/openapi.json"; import { InitializeRequest } from "../generated/openapi/typescript-axios"; @@ -89,10 +92,8 @@ export class InitializeEndpoint implements IWebServiceEndpoint { res.send(result); } catch (ex) { this.log.error(`${fnTag} failed to serve request`, ex); - res.status(400).json({ - message: "Bad request", - error: ex?.stack || ex?.message, - }); + const errorMsg = `Bad request`; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-htlc-eth-besu-erc20/src/main/typescript/web-services/new-contract-endpoint.ts b/packages/cactus-plugin-htlc-eth-besu-erc20/src/main/typescript/web-services/new-contract-endpoint.ts index c1a2f50897..91ba2c6f9a 100644 --- a/packages/cactus-plugin-htlc-eth-besu-erc20/src/main/typescript/web-services/new-contract-endpoint.ts +++ b/packages/cactus-plugin-htlc-eth-besu-erc20/src/main/typescript/web-services/new-contract-endpoint.ts @@ -11,7 +11,10 @@ import { IExpressRequestHandler, IWebServiceEndpoint, } from "@hyperledger/cactus-core-api"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { NewContractRequest } from "../generated/openapi/typescript-axios"; import OAS from "../../json/openapi.json"; import { PluginHtlcEthBesuErc20 } from "../plugin-htlc-eth-besu-erc20"; @@ -85,10 +88,8 @@ export class NewContractEndpoint implements IWebServiceEndpoint { res.send(result); } catch (ex) { this.log.error(`${fnTag} failed to serve request`, ex); - res.status(400).json({ - message: "Bad request", - error: ex?.stack || ex?.message, - }); + const errorMsg = `Bad request`; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-htlc-eth-besu-erc20/src/main/typescript/web-services/refund-endpoint.ts b/packages/cactus-plugin-htlc-eth-besu-erc20/src/main/typescript/web-services/refund-endpoint.ts index f8f816b359..242da44d54 100644 --- a/packages/cactus-plugin-htlc-eth-besu-erc20/src/main/typescript/web-services/refund-endpoint.ts +++ b/packages/cactus-plugin-htlc-eth-besu-erc20/src/main/typescript/web-services/refund-endpoint.ts @@ -11,7 +11,10 @@ import { IWebServiceEndpoint, IEndpointAuthzOptions, } from "@hyperledger/cactus-core-api"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { RefundRequest } from "../generated/openapi/typescript-axios"; import OAS from "../../json/openapi.json"; import { PluginHtlcEthBesuErc20 } from "../plugin-htlc-eth-besu-erc20"; @@ -85,10 +88,8 @@ export class RefundEndpoint implements IWebServiceEndpoint { res.send(result); } catch (ex) { this.log.error(`${fnTag} failed to serve request`, ex); - res.status(400).json({ - message: "Bad request", - error: ex?.stack || ex?.message, - }); + const errorMsg = `Bad request`; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-htlc-eth-besu-erc20/src/main/typescript/web-services/withdraw-endpoint.ts b/packages/cactus-plugin-htlc-eth-besu-erc20/src/main/typescript/web-services/withdraw-endpoint.ts index e5ffbef089..fef65ae246 100644 --- a/packages/cactus-plugin-htlc-eth-besu-erc20/src/main/typescript/web-services/withdraw-endpoint.ts +++ b/packages/cactus-plugin-htlc-eth-besu-erc20/src/main/typescript/web-services/withdraw-endpoint.ts @@ -11,7 +11,10 @@ import { IExpressRequestHandler, IWebServiceEndpoint, } from "@hyperledger/cactus-core-api"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { WithdrawRequest } from "../generated/openapi/typescript-axios"; import OAS from "../../json/openapi.json"; import { PluginHtlcEthBesuErc20 } from "../plugin-htlc-eth-besu-erc20"; @@ -85,10 +88,8 @@ export class WithdrawEndpoint implements IWebServiceEndpoint { res.send(result); } catch (ex) { this.log.error(`${fnTag} failed to serve request`, ex); - res.status(400).json({ - message: "Bad request", - error: ex?.stack || ex?.message, - }); + const errorMsg = `Bad request`; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-htlc-eth-besu/src/main/typescript/web-services/get-single-status-endpoint.ts b/packages/cactus-plugin-htlc-eth-besu/src/main/typescript/web-services/get-single-status-endpoint.ts index 0ad4a28d9e..170520f849 100644 --- a/packages/cactus-plugin-htlc-eth-besu/src/main/typescript/web-services/get-single-status-endpoint.ts +++ b/packages/cactus-plugin-htlc-eth-besu/src/main/typescript/web-services/get-single-status-endpoint.ts @@ -11,7 +11,10 @@ import { IExpressRequestHandler, IWebServiceEndpoint, } from "@hyperledger/cactus-core-api"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { PluginHtlcEthBesu } from "../plugin-htlc-eth-besu"; import OAS from "../../json/openapi.json"; @@ -93,10 +96,8 @@ export class GetSingleStatusEndpoint implements IWebServiceEndpoint { } } catch (ex) { this.log.error(`${fnTag} failed to serve request`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, - }); + const errorMsg = `Internal server Error`; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-htlc-eth-besu/src/main/typescript/web-services/get-status-endpoint.ts b/packages/cactus-plugin-htlc-eth-besu/src/main/typescript/web-services/get-status-endpoint.ts index 5b6eab8796..e96dfe8344 100644 --- a/packages/cactus-plugin-htlc-eth-besu/src/main/typescript/web-services/get-status-endpoint.ts +++ b/packages/cactus-plugin-htlc-eth-besu/src/main/typescript/web-services/get-status-endpoint.ts @@ -11,7 +11,10 @@ import { IExpressRequestHandler, IWebServiceEndpoint, } from "@hyperledger/cactus-core-api"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import OAS from "../../json/openapi.json"; import { PluginHtlcEthBesu } from "../plugin-htlc-eth-besu"; export interface IGetStatusEndpointOptions { @@ -75,6 +78,7 @@ export class GetStatusEndpoint implements IWebServiceEndpoint { public async handleRequest(req: Request, res: Response): Promise { const fnTag = "GetStatusEndpoint#handleRequest()"; + const reqTag = `${this.getVerbLowerCase()} - ${this.getPath()}`; this.log.debug(`POST ${this.getPath()}`); try { const { callOutput } = await this.options.plugin.getStatus(req.body); @@ -89,11 +93,9 @@ export class GetStatusEndpoint implements IWebServiceEndpoint { res.send(callOutput); } } catch (ex) { - this.log.error(`${fnTag} failed to serve request`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, - }); + this.log.error(`${fnTag} request handler fn crashed for: ${reqTag}`, ex); + const errorMsg = `Internal server error`; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-htlc-eth-besu/src/main/typescript/web-services/initialize-endpoint.ts b/packages/cactus-plugin-htlc-eth-besu/src/main/typescript/web-services/initialize-endpoint.ts index 46a5d95c61..c60b5f2ad7 100644 --- a/packages/cactus-plugin-htlc-eth-besu/src/main/typescript/web-services/initialize-endpoint.ts +++ b/packages/cactus-plugin-htlc-eth-besu/src/main/typescript/web-services/initialize-endpoint.ts @@ -11,7 +11,10 @@ import { IExpressRequestHandler, IWebServiceEndpoint, } from "@hyperledger/cactus-core-api"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import OAS from "../../json/openapi.json"; import { InitializeRequest } from "../generated/openapi/typescript-axios"; @@ -79,6 +82,7 @@ export class InitializeEndpoint implements IWebServiceEndpoint { public async handleRequest(req: Request, res: Response): Promise { const fnTag = "InitializeEndpoint#handleRequest()"; + const reqTag = `${this.getVerbLowerCase()} - ${this.getPath()}`; this.log.debug(`POST ${this.getPath()}`); try { const request: InitializeRequest = req.body as InitializeRequest; @@ -93,11 +97,9 @@ export class InitializeEndpoint implements IWebServiceEndpoint { res.send(result); } } catch (ex) { - this.log.error(`${fnTag} failed to serve request`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, - }); + this.log.error(`${fnTag} request handler fn crashed for: ${reqTag}`, ex); + const errorMsg = `Internal server Error`; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-htlc-eth-besu/src/main/typescript/web-services/new-contract-endpoint.ts b/packages/cactus-plugin-htlc-eth-besu/src/main/typescript/web-services/new-contract-endpoint.ts index fb32c1d127..51b0b7d07e 100644 --- a/packages/cactus-plugin-htlc-eth-besu/src/main/typescript/web-services/new-contract-endpoint.ts +++ b/packages/cactus-plugin-htlc-eth-besu/src/main/typescript/web-services/new-contract-endpoint.ts @@ -11,7 +11,10 @@ import { IExpressRequestHandler, IWebServiceEndpoint, } from "@hyperledger/cactus-core-api"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { NewContractObj } from "../generated/openapi/typescript-axios/api"; import { PluginHtlcEthBesu } from "../plugin-htlc-eth-besu"; import OAS from "../../json/openapi.json"; @@ -77,6 +80,7 @@ export class NewContractEndpoint implements IWebServiceEndpoint { public async handleRequest(req: Request, res: Response): Promise { const fnTag = "NewContractEndpoint#handleRequest()"; + const reqTag = `${this.getVerbLowerCase()} - ${this.getPath()}`; this.log.debug(`POST ${this.getPath()}`); try { const request: NewContractObj = req.body as NewContractObj; @@ -91,11 +95,9 @@ export class NewContractEndpoint implements IWebServiceEndpoint { res.send(result); } } catch (ex) { - this.log.error(`${fnTag} failed to serve request`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, - }); + this.log.error(`${fnTag} request handler fn crashed for: ${reqTag}`, ex); + const errorMsg = "Internal server Error"; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-htlc-eth-besu/src/main/typescript/web-services/refund-endpoint.ts b/packages/cactus-plugin-htlc-eth-besu/src/main/typescript/web-services/refund-endpoint.ts index e30e7083d1..34d11128aa 100644 --- a/packages/cactus-plugin-htlc-eth-besu/src/main/typescript/web-services/refund-endpoint.ts +++ b/packages/cactus-plugin-htlc-eth-besu/src/main/typescript/web-services/refund-endpoint.ts @@ -11,7 +11,10 @@ import { IWebServiceEndpoint, IEndpointAuthzOptions, } from "@hyperledger/cactus-core-api"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { PluginHtlcEthBesu } from "../plugin-htlc-eth-besu"; import { RefundReq } from "../generated/openapi/typescript-axios"; import OAS from "../../json/openapi.json"; @@ -92,10 +95,8 @@ export class RefundEndpoint implements IWebServiceEndpoint { } } catch (ex) { this.log.error(`${fnTag} failed to serve request`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, - }); + const errorMsg = "Internal server Error"; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-htlc-eth-besu/src/main/typescript/web-services/withdraw-endpoint.ts b/packages/cactus-plugin-htlc-eth-besu/src/main/typescript/web-services/withdraw-endpoint.ts index f5bf16d471..6608155a08 100644 --- a/packages/cactus-plugin-htlc-eth-besu/src/main/typescript/web-services/withdraw-endpoint.ts +++ b/packages/cactus-plugin-htlc-eth-besu/src/main/typescript/web-services/withdraw-endpoint.ts @@ -11,7 +11,10 @@ import { IExpressRequestHandler, IWebServiceEndpoint, } from "@hyperledger/cactus-core-api"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { PluginHtlcEthBesu } from "../plugin-htlc-eth-besu"; import { WithdrawReq } from "../generated/openapi/typescript-axios/api"; import OAS from "../../json/openapi.json"; @@ -91,10 +94,8 @@ export class WithdrawEndpoint implements IWebServiceEndpoint { } } catch (ex) { this.log.error(`${fnTag} failed to serve request`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, - }); + const errorMsg = `Internal server Error`; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-keychain-aws-sm/src/main/typescript/plugin-keychain-aws-sm.ts b/packages/cactus-plugin-keychain-aws-sm/src/main/typescript/plugin-keychain-aws-sm.ts index 6727ff7137..a3047439b9 100644 --- a/packages/cactus-plugin-keychain-aws-sm/src/main/typescript/plugin-keychain-aws-sm.ts +++ b/packages/cactus-plugin-keychain-aws-sm/src/main/typescript/plugin-keychain-aws-sm.ts @@ -73,8 +73,7 @@ export interface IPluginKeychainAwsSmOptions extends ICactusPluginOptions { const SECRETMANAGER_STATUS_KEY_NOT_FOUND = "Secrets Manager can't find the specified secret."; export class PluginKeychainAwsSm - implements ICactusPlugin, IPluginWebService, IPluginKeychain -{ + implements ICactusPlugin, IPluginWebService, IPluginKeychain { public static readonly CLASS_NAME = "PluginKeychainAwsSm"; private readonly log: Logger; diff --git a/packages/cactus-plugin-keychain-aws-sm/src/main/typescript/webservices/delete-keychain-entry-endpoint-v1.ts b/packages/cactus-plugin-keychain-aws-sm/src/main/typescript/webservices/delete-keychain-entry-endpoint-v1.ts index 42f95ce2d8..fcd745a5dc 100644 --- a/packages/cactus-plugin-keychain-aws-sm/src/main/typescript/webservices/delete-keychain-entry-endpoint-v1.ts +++ b/packages/cactus-plugin-keychain-aws-sm/src/main/typescript/webservices/delete-keychain-entry-endpoint-v1.ts @@ -12,7 +12,10 @@ import { IExpressRequestHandler, IWebServiceEndpoint, } from "@hyperledger/cactus-core-api"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import OAS from "../../json/openapi.json"; import { PluginKeychainAwsSm } from "../plugin-keychain-aws-sm"; @@ -93,10 +96,8 @@ export class DeleteKeychainEntryV1Endpoint implements IWebServiceEndpoint { res.json(resBody); } catch (ex) { this.log.error(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, - }); + const errorMsg = `Internal server Error`; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-keychain-aws-sm/src/main/typescript/webservices/get-keychain-entry-endpoint-v1.ts b/packages/cactus-plugin-keychain-aws-sm/src/main/typescript/webservices/get-keychain-entry-endpoint-v1.ts index 0228b5fa4b..1195938b89 100644 --- a/packages/cactus-plugin-keychain-aws-sm/src/main/typescript/webservices/get-keychain-entry-endpoint-v1.ts +++ b/packages/cactus-plugin-keychain-aws-sm/src/main/typescript/webservices/get-keychain-entry-endpoint-v1.ts @@ -13,7 +13,10 @@ import { IExpressRequestHandler, IWebServiceEndpoint, } from "@hyperledger/cactus-core-api"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import OAS from "../../json/openapi.json"; import { PluginKeychainAwsSm } from "../plugin-keychain-aws-sm"; @@ -93,16 +96,29 @@ export class GetKeychainEntryV1Endpoint implements IWebServiceEndpoint { //const resBody = await this.options.connector.get(reqBody.key); res.json({ key, value }); } catch (ex) { - if (ex?.message?.includes(`${key} secret not found`)) { - res.status(404).json({ - key, - error: ex?.stack || ex?.message, - }); + if ( + typeof ex === "object" && + ex !== null && + "message" in ex && + typeof ex.message === "string" + ) { + if (ex?.message?.includes(`${key} secret not found`)) { + const errorMsg = ex.message; + handleRestEndpointException({ + errorMsg, + log: this.log, + error: ex, + res, + }); + } } else { this.log.error(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, + const errorMsg = `Internal server Error`; + handleRestEndpointException({ + errorMsg, + log: this.log, + error: ex, + res, }); } } diff --git a/packages/cactus-plugin-keychain-aws-sm/src/main/typescript/webservices/get-prometheus-exporter-metrics-endpoint-v1.ts b/packages/cactus-plugin-keychain-aws-sm/src/main/typescript/webservices/get-prometheus-exporter-metrics-endpoint-v1.ts index 6cfa33cb52..a68cd92850 100644 --- a/packages/cactus-plugin-keychain-aws-sm/src/main/typescript/webservices/get-prometheus-exporter-metrics-endpoint-v1.ts +++ b/packages/cactus-plugin-keychain-aws-sm/src/main/typescript/webservices/get-prometheus-exporter-metrics-endpoint-v1.ts @@ -16,7 +16,10 @@ import { import OAS from "../../json/openapi.json"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { PluginKeychainAwsSm } from "../plugin-keychain-aws-sm"; @@ -26,8 +29,7 @@ export interface IGetPrometheusExporterMetricsEndpointV1Options { } export class GetPrometheusExporterMetricsEndpointV1 - implements IWebServiceEndpoint -{ + implements IWebServiceEndpoint { private readonly log: Logger; constructor( @@ -94,9 +96,28 @@ export class GetPrometheusExporterMetricsEndpointV1 res.send(resBody); } catch (ex) { this.log.error(`${fnTag} failed to serve request`, ex); - res.status(500); - res.statusMessage = ex.message; - res.json({ error: ex.stack }); + if ( + typeof ex === "object" && + ex !== null && + "message" in ex && + typeof ex.message === "string" + ) { + const errorMsg = ex.message; + handleRestEndpointException({ + errorMsg, + log: this.log, + error: ex, + res, + }); + } else { + const errorMsg = `Bar request`; + handleRestEndpointException({ + errorMsg, + log: this.log, + error: ex, + res, + }); + } } } } diff --git a/packages/cactus-plugin-keychain-aws-sm/src/main/typescript/webservices/has-keychain-entry-endpoint-v1.ts b/packages/cactus-plugin-keychain-aws-sm/src/main/typescript/webservices/has-keychain-entry-endpoint-v1.ts index e23c7f18c0..27beb90d51 100644 --- a/packages/cactus-plugin-keychain-aws-sm/src/main/typescript/webservices/has-keychain-entry-endpoint-v1.ts +++ b/packages/cactus-plugin-keychain-aws-sm/src/main/typescript/webservices/has-keychain-entry-endpoint-v1.ts @@ -12,7 +12,10 @@ import { IExpressRequestHandler, IWebServiceEndpoint, } from "@hyperledger/cactus-core-api"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import OAS from "../../json/openapi.json"; import { PluginKeychainAwsSm } from "../plugin-keychain-aws-sm"; @@ -99,10 +102,8 @@ export class HasKeychainEntryV1Endpoint implements IWebServiceEndpoint { res.json(resBody); } catch (ex) { this.log.error(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, - }); + const errorMsg = `Internal server Error}`; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-keychain-aws-sm/src/main/typescript/webservices/set-keychain-entry-endpoint-v1.ts b/packages/cactus-plugin-keychain-aws-sm/src/main/typescript/webservices/set-keychain-entry-endpoint-v1.ts index 7e253d2cbd..1ec082680d 100644 --- a/packages/cactus-plugin-keychain-aws-sm/src/main/typescript/webservices/set-keychain-entry-endpoint-v1.ts +++ b/packages/cactus-plugin-keychain-aws-sm/src/main/typescript/webservices/set-keychain-entry-endpoint-v1.ts @@ -12,7 +12,10 @@ import { IExpressRequestHandler, IWebServiceEndpoint, } from "@hyperledger/cactus-core-api"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import OAS from "../../json/openapi.json"; import { PluginKeychainAwsSm } from "../plugin-keychain-aws-sm"; @@ -92,10 +95,8 @@ export class SetKeychainEntryV1Endpoint implements IWebServiceEndpoint { res.json(resBody); } catch (ex) { this.log.error(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, - }); + const errorMsg = `Internal server Error`; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-keychain-aws-sm/src/test/typescript/integration/openapi/openapi-validation.test.ts b/packages/cactus-plugin-keychain-aws-sm/src/test/typescript/integration/openapi/openapi-validation.test.ts index a7ce4c4028..575620e862 100644 --- a/packages/cactus-plugin-keychain-aws-sm/src/test/typescript/integration/openapi/openapi-validation.test.ts +++ b/packages/cactus-plugin-keychain-aws-sm/src/test/typescript/integration/openapi/openapi-validation.test.ts @@ -157,7 +157,7 @@ test(testCase, async (t: Test) => { await apiClient.setKeychainEntryV1({ value: value, } as any as SetKeychainEntryRequestV1); - } catch (e) { + } catch (e: any) { t2.equal( e.response.status, 400, @@ -176,7 +176,7 @@ test(testCase, async (t: Test) => { await apiClient.getKeychainEntryV1( {} as any as GetKeychainEntryRequestV1, ); - } catch (e) { + } catch (e: any) { t2.equal( e.response.status, 400, @@ -195,7 +195,7 @@ test(testCase, async (t: Test) => { await apiClient.hasKeychainEntryV1( {} as any as HasKeychainEntryRequestV1, ); - } catch (e) { + } catch (e: any) { t2.equal( e.response.status, 400, @@ -214,7 +214,7 @@ test(testCase, async (t: Test) => { await apiClient.deleteKeychainEntryV1( {} as any as DeleteKeychainEntryRequestV1, ); - } catch (e) { + } catch (e: any) { t2.equal( e.response.status, 400, @@ -235,7 +235,7 @@ test(testCase, async (t: Test) => { value, fake: 4, } as any as SetKeychainEntryRequestV1); - } catch (e) { + } catch (e: any) { t2.equal( e.response.status, 400, @@ -258,7 +258,7 @@ test(testCase, async (t: Test) => { key, fake: 4, } as any as GetKeychainEntryRequestV1); - } catch (e) { + } catch (e: any) { t2.equal( e.response.status, 400, @@ -281,7 +281,7 @@ test(testCase, async (t: Test) => { key, fake: 4, } as any as HasKeychainEntryRequestV1); - } catch (e) { + } catch (e: any) { t2.equal( e.response.status, 400, @@ -304,7 +304,7 @@ test(testCase, async (t: Test) => { key, fake: 4, } as any as DeleteKeychainEntryRequestV1); - } catch (e) { + } catch (e: any) { t2.equal( e.response.status, 400, diff --git a/packages/cactus-plugin-keychain-aws-sm/src/test/typescript/integration/plugin-keychain-aws-sm.test.ts b/packages/cactus-plugin-keychain-aws-sm/src/test/typescript/integration/plugin-keychain-aws-sm.test.ts index edd4b43ddd..178544177c 100644 --- a/packages/cactus-plugin-keychain-aws-sm/src/test/typescript/integration/plugin-keychain-aws-sm.test.ts +++ b/packages/cactus-plugin-keychain-aws-sm/src/test/typescript/integration/plugin-keychain-aws-sm.test.ts @@ -205,7 +205,7 @@ test("get,set,has,delete alters state as expected", async (t: Test) => { t.fail( "Failing because getKeychainEntryV1 did not throw when called with non-existent key.", ); - } catch (ex) { + } catch (ex: any) { t.ok(ex, "res7 -> ex truthy"); const res7 = ex.response; t.equal(res7.status, 404, "res7.status === 404 OK"); diff --git a/packages/cactus-plugin-keychain-azure-kv/src/main/typescript/web-services/delete-keychain-entry-endpoint.ts b/packages/cactus-plugin-keychain-azure-kv/src/main/typescript/web-services/delete-keychain-entry-endpoint.ts index 0cb3aac4f6..7d82f85567 100644 --- a/packages/cactus-plugin-keychain-azure-kv/src/main/typescript/web-services/delete-keychain-entry-endpoint.ts +++ b/packages/cactus-plugin-keychain-azure-kv/src/main/typescript/web-services/delete-keychain-entry-endpoint.ts @@ -12,7 +12,10 @@ import { IExpressRequestHandler, IWebServiceEndpoint, } from "@hyperledger/cactus-core-api"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { PluginKeychainAzureKv } from "../plugin-keychain-azure-kv"; @@ -93,10 +96,8 @@ export class DeleteKeychainEntryEndpoint implements IWebServiceEndpoint { res.json(resBody); } catch (ex) { this.log.error(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, - }); + const errorMsg = `Internal server Error`; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-keychain-azure-kv/src/main/typescript/web-services/get-keychain-entry-endpoint.ts b/packages/cactus-plugin-keychain-azure-kv/src/main/typescript/web-services/get-keychain-entry-endpoint.ts index d7f23c2479..ff6dc4fc45 100644 --- a/packages/cactus-plugin-keychain-azure-kv/src/main/typescript/web-services/get-keychain-entry-endpoint.ts +++ b/packages/cactus-plugin-keychain-azure-kv/src/main/typescript/web-services/get-keychain-entry-endpoint.ts @@ -12,7 +12,10 @@ import { IExpressRequestHandler, IWebServiceEndpoint, } from "@hyperledger/cactus-core-api"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { PluginKeychainAzureKv } from "../plugin-keychain-azure-kv"; @@ -95,16 +98,28 @@ export class GetKeychainEntryEndpoint implements IWebServiceEndpoint { value, }); } catch (ex) { - if (ex?.message?.includes(`${key} secret not found`)) { - res.status(404).json({ - key, - error: ex?.stack || ex?.message, + if ( + typeof ex === "object" && + ex !== null && + "message" in ex && + typeof ex.message === "string" && + ex?.message?.includes(`${key} secret not found`) + ) { + const errorMsg = ex.message; + handleRestEndpointException({ + errorMsg, + log: this.log, + error: ex, + res, }); } else { this.log.error(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, + const errorMsg = `Internal server Error`; + handleRestEndpointException({ + errorMsg, + log: this.log, + error: ex, + res, }); } } diff --git a/packages/cactus-plugin-keychain-azure-kv/src/main/typescript/web-services/has-keychain-entry-endpoint.ts b/packages/cactus-plugin-keychain-azure-kv/src/main/typescript/web-services/has-keychain-entry-endpoint.ts index 697b87fc5e..65f19b9c32 100644 --- a/packages/cactus-plugin-keychain-azure-kv/src/main/typescript/web-services/has-keychain-entry-endpoint.ts +++ b/packages/cactus-plugin-keychain-azure-kv/src/main/typescript/web-services/has-keychain-entry-endpoint.ts @@ -14,7 +14,10 @@ import { IExpressRequestHandler, IWebServiceEndpoint, } from "@hyperledger/cactus-core-api"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { PluginKeychainAzureKv } from "../plugin-keychain-azure-kv"; @@ -101,10 +104,8 @@ export class HasKeychainEntryEndpoint implements IWebServiceEndpoint { res.json(resBody); } catch (ex) { this.log.error(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, - }); + const errorMsg = `Internal server Error`; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-keychain-azure-kv/src/main/typescript/web-services/set-keychain-entry-endpoint.ts b/packages/cactus-plugin-keychain-azure-kv/src/main/typescript/web-services/set-keychain-entry-endpoint.ts index 3b4b1485f0..a979af230d 100644 --- a/packages/cactus-plugin-keychain-azure-kv/src/main/typescript/web-services/set-keychain-entry-endpoint.ts +++ b/packages/cactus-plugin-keychain-azure-kv/src/main/typescript/web-services/set-keychain-entry-endpoint.ts @@ -12,7 +12,10 @@ import { IExpressRequestHandler, IWebServiceEndpoint, } from "@hyperledger/cactus-core-api"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { PluginKeychainAzureKv } from "../plugin-keychain-azure-kv"; @@ -93,10 +96,8 @@ export class SetKeychainEntryEndpoint implements IWebServiceEndpoint { res.json(resBody); } catch (ex) { this.log.error(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, - }); + const errorMsg = `Internal server Error`; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-keychain-azure-kv/src/test/typescript/integration/plugin-keychain-azure-kv.test.ts b/packages/cactus-plugin-keychain-azure-kv/src/test/typescript/integration/plugin-keychain-azure-kv.test.ts index 7a4dd74e43..01e3966eae 100644 --- a/packages/cactus-plugin-keychain-azure-kv/src/test/typescript/integration/plugin-keychain-azure-kv.test.ts +++ b/packages/cactus-plugin-keychain-azure-kv/src/test/typescript/integration/plugin-keychain-azure-kv.test.ts @@ -128,7 +128,7 @@ test("get,set,has,delete alters state as expected for AzureCredentialType.InMemo t.fail( "Failing because getKeychainEntryV1 did not throw when called with non-existent key.", ); - } catch (ex) { + } catch (ex: any) { t.ok(ex, "res7 -> ex truthy"); const res7 = ex.response; t.equal(res7.status, 404, "res7.status === 404 OK"); diff --git a/packages/cactus-plugin-keychain-google-sm/src/main/typescript/webservices/delete-keychain-entry-endpoint-v1.ts b/packages/cactus-plugin-keychain-google-sm/src/main/typescript/webservices/delete-keychain-entry-endpoint-v1.ts index b3744cef02..20e00f5bf3 100644 --- a/packages/cactus-plugin-keychain-google-sm/src/main/typescript/webservices/delete-keychain-entry-endpoint-v1.ts +++ b/packages/cactus-plugin-keychain-google-sm/src/main/typescript/webservices/delete-keychain-entry-endpoint-v1.ts @@ -12,7 +12,10 @@ import { IExpressRequestHandler, IWebServiceEndpoint, } from "@hyperledger/cactus-core-api"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import OAS from "../../json/openapi.json"; import { PluginKeychainGoogleSm } from "../plugin-keychain-google-sm"; @@ -91,10 +94,8 @@ export class DeleteKeychainEntryV1Endpoint implements IWebServiceEndpoint { res.json(resBody); } catch (ex) { this.log.error(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, - }); + const errorMsg = `Internal server Error`; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-keychain-google-sm/src/main/typescript/webservices/get-keychain-entry-endpoint-v1.ts b/packages/cactus-plugin-keychain-google-sm/src/main/typescript/webservices/get-keychain-entry-endpoint-v1.ts index cddad84417..b61faaa4c7 100644 --- a/packages/cactus-plugin-keychain-google-sm/src/main/typescript/webservices/get-keychain-entry-endpoint-v1.ts +++ b/packages/cactus-plugin-keychain-google-sm/src/main/typescript/webservices/get-keychain-entry-endpoint-v1.ts @@ -12,7 +12,10 @@ import { IExpressRequestHandler, IWebServiceEndpoint, } from "@hyperledger/cactus-core-api"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import OAS from "../../json/openapi.json"; import { PluginKeychainGoogleSm } from "../plugin-keychain-google-sm"; @@ -90,16 +93,28 @@ export class GetKeychainEntryV1Endpoint implements IWebServiceEndpoint { const resBody = await this.options.connector.get(reqBody.key); res.json(resBody); } catch (ex) { - if (ex.message.includes("secret not found")) { - res.status(404).json({ - message: "Bad request", - error: ex?.stack || ex?.message, + if ( + typeof ex === "object" && + ex !== null && + "message" in ex && + ex["message"] && + typeof ex.message === "string" + ) { + const errorMsg = ex.message; + handleRestEndpointException({ + errorMsg, + log: this.log, + error: ex, + res, }); } else { this.log.error(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, + const errorMsg = `Internal server Error`; + handleRestEndpointException({ + errorMsg, + log: this.log, + error: ex, + res, }); } } diff --git a/packages/cactus-plugin-keychain-google-sm/src/main/typescript/webservices/has-keychain-entry-endpoint-v1.ts b/packages/cactus-plugin-keychain-google-sm/src/main/typescript/webservices/has-keychain-entry-endpoint-v1.ts index 90099efe38..1410bfc671 100644 --- a/packages/cactus-plugin-keychain-google-sm/src/main/typescript/webservices/has-keychain-entry-endpoint-v1.ts +++ b/packages/cactus-plugin-keychain-google-sm/src/main/typescript/webservices/has-keychain-entry-endpoint-v1.ts @@ -12,7 +12,10 @@ import { IExpressRequestHandler, IWebServiceEndpoint, } from "@hyperledger/cactus-core-api"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import OAS from "../../json/openapi.json"; import { PluginKeychainGoogleSm } from "../plugin-keychain-google-sm"; @@ -93,10 +96,8 @@ export class HasKeychainEntryV1Endpoint implements IWebServiceEndpoint { res.json({ key, isPresent, checkedAt }); } catch (ex) { this.log.error(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, - }); + const errorMsg = `Internal server Error`; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-keychain-google-sm/src/main/typescript/webservices/set-keychain-entry-endpoint-v1.ts b/packages/cactus-plugin-keychain-google-sm/src/main/typescript/webservices/set-keychain-entry-endpoint-v1.ts index 5a28f46664..2d95bde825 100644 --- a/packages/cactus-plugin-keychain-google-sm/src/main/typescript/webservices/set-keychain-entry-endpoint-v1.ts +++ b/packages/cactus-plugin-keychain-google-sm/src/main/typescript/webservices/set-keychain-entry-endpoint-v1.ts @@ -12,7 +12,10 @@ import { IExpressRequestHandler, IWebServiceEndpoint, } from "@hyperledger/cactus-core-api"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import OAS from "../../json/openapi.json"; import { PluginKeychainGoogleSm } from "../plugin-keychain-google-sm"; @@ -94,10 +97,8 @@ export class SetKeychainEntryV1Endpoint implements IWebServiceEndpoint { res.json(resBody); } catch (ex) { this.log.error(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, - }); + const errorMsg = `Internal server Error`; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-keychain-google-sm/src/test/typescript/integration/openapi/openapi-validation.test.ts b/packages/cactus-plugin-keychain-google-sm/src/test/typescript/integration/openapi/openapi-validation.test.ts index 0088f95045..fb7683444d 100644 --- a/packages/cactus-plugin-keychain-google-sm/src/test/typescript/integration/openapi/openapi-validation.test.ts +++ b/packages/cactus-plugin-keychain-google-sm/src/test/typescript/integration/openapi/openapi-validation.test.ts @@ -26,6 +26,7 @@ import { SecretManagerServiceClientMock } from "../../mock/plugin-keychain-googl import { installOpenapiValidationMiddleware } from "@hyperledger/cactus-core"; import OAS from "../../../../main/json/openapi.json"; +import { AxiosError } from "axios"; const logLevel: LogLevelDesc = "TRACE"; const testCase = "Test cactus-plugin-keychain-azure-kv openapi validation"; @@ -112,16 +113,17 @@ test(testCase, async (t: Test) => { await apiClient.setKeychainEntryV1({ value, } as any as SetKeychainEntryRequestV1); - } catch (e) { + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; t2.equal( - e.response.status, + e?.response?.status, 400, `Endpoint ${fSet} without required key: response.status === 400 OK`, ); - const fields = e.response.data.map((param: any) => + const fields = e?.response?.data.map((param: any) => param.path.replace("/body/", ""), ); - t2.ok(fields.includes("key"), "Rejected because key is required"); + t2.ok(fields?.includes("key"), "Rejected because key is required"); } t2.end(); }); @@ -131,16 +133,17 @@ test(testCase, async (t: Test) => { await apiClient.getKeychainEntryV1( {} as any as GetKeychainEntryRequestV1, ); - } catch (e) { + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; t2.equal( - e.response.status, + e?.response?.status, 400, `Endpoint ${fGet} without required key: response.status === 400 OK`, ); - const fields = e.response.data.map((param: any) => + const fields = e?.response?.data.map((param: any) => param.path.replace("/body/", ""), ); - t2.ok(fields.includes("key"), "Rejected because key is required"); + t2.ok(fields?.includes("key"), "Rejected because key is required"); } t2.end(); }); @@ -150,16 +153,17 @@ test(testCase, async (t: Test) => { await apiClient.hasKeychainEntryV1( {} as any as HasKeychainEntryRequestV1, ); - } catch (e) { + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; t2.equal( - e.response.status, + e?.response?.status, 400, `Endpoint ${fHas} without required key: response.status === 400 OK`, ); - const fields = e.response.data.map((param: any) => + const fields = e?.response?.data.map((param: any) => param.path.replace("/body/", ""), ); - t2.ok(fields.includes("key"), "Rejected because key is required"); + t2.ok(fields?.includes("key"), "Rejected because key is required"); } t2.end(); }); @@ -169,16 +173,17 @@ test(testCase, async (t: Test) => { await apiClient.deleteKeychainEntryV1( {} as any as DeleteKeychainEntryRequestV1, ); - } catch (e) { + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; t2.equal( - e.response.status, + e?.response?.status, 400, `Endpoint ${fDelete} without required key: response.status === 400 OK`, ); - const fields = e.response.data.map((param: any) => + const fields = e?.response?.data.map((param: any) => param.path.replace("/body/", ""), ); - t2.ok(fields.includes("key"), "Rejected because key is required"); + t2.ok(fields?.includes("key"), "Rejected because key is required"); } t2.end(); }); @@ -190,17 +195,18 @@ test(testCase, async (t: Test) => { value, fake: 4, } as any as SetKeychainEntryRequestV1); - } catch (e) { + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; t2.equal( - e.response.status, + e?.response?.status, 400, `Endpoint ${fSet} with fake=4: response.status === 400 OK`, ); - const fields = e.response.data.map((param: any) => + const fields = e?.response?.data.map((param: any) => param.path.replace("/body/", ""), ); t2.ok( - fields.includes("fake"), + fields?.includes("fake"), "Rejected because fake is not a valid parameter", ); } @@ -213,17 +219,18 @@ test(testCase, async (t: Test) => { key, fake: 4, } as any as GetKeychainEntryRequestV1); - } catch (e) { + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; t2.equal( - e.response.status, + e?.response?.status, 400, `Endpoint ${fGet} with fake=4: response.status === 400 OK`, ); - const fields = e.response.data.map((param: any) => + const fields = e?.response?.data.map((param: any) => param.path.replace("/body/", ""), ); t2.ok( - fields.includes("fake"), + fields?.includes("fake"), "Rejected because fake is not a valid parameter", ); } @@ -236,17 +243,18 @@ test(testCase, async (t: Test) => { key, fake: 4, } as any as HasKeychainEntryRequestV1); - } catch (e) { + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; t2.equal( - e.response.status, + e?.response?.status, 400, `Endpoint ${fHas} with fake=4: response.status === 400 OK`, ); - const fields = e.response.data.map((param: any) => + const fields = e?.response?.data.map((param: any) => param.path.replace("/body/", ""), ); t2.ok( - fields.includes("fake"), + fields?.includes("fake"), "Rejected because fake is not a valid parameter", ); } @@ -259,17 +267,18 @@ test(testCase, async (t: Test) => { key, fake: 4, } as any as DeleteKeychainEntryRequestV1); - } catch (e) { + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; t2.equal( - e.response.status, + e?.response?.status, 400, `Endpoint ${fDelete} with fake=4: response.status === 400 OK`, ); - const fields = e.response.data.map((param: any) => + const fields = e?.response?.data.map((param: any) => param.path.replace("/body/", ""), ); t2.ok( - fields.includes("fake"), + fields?.includes("fake"), "Rejected because fake is not a valid parameter", ); } diff --git a/packages/cactus-plugin-keychain-google-sm/src/test/typescript/integration/plugin-keychain-google-sm.test.ts b/packages/cactus-plugin-keychain-google-sm/src/test/typescript/integration/plugin-keychain-google-sm.test.ts index 49a5f7b38a..db5a6fbec7 100644 --- a/packages/cactus-plugin-keychain-google-sm/src/test/typescript/integration/plugin-keychain-google-sm.test.ts +++ b/packages/cactus-plugin-keychain-google-sm/src/test/typescript/integration/plugin-keychain-google-sm.test.ts @@ -114,7 +114,7 @@ test("get,set,has,delete alters state as expected", async (t: Test) => { t.equal(res6.data.key, key, "res6.data.key === key OK"); try { await apiClient.getKeychainEntryV1({ key }); - } catch (out) { + } catch (out: any) { t.ok(out, "error thrown for not found endpoint truthy OK"); t.ok(out.response, "deploy contract response truthy OK"); t.ok(out.response.data, "out.response.data truthy OK"); diff --git a/packages/cactus-plugin-keychain-memory-wasm/src/main/typescript/webservices/delete-keychain-entry-endpoint-v1.ts b/packages/cactus-plugin-keychain-memory-wasm/src/main/typescript/webservices/delete-keychain-entry-endpoint-v1.ts index adb4aff167..c29191c1d6 100644 --- a/packages/cactus-plugin-keychain-memory-wasm/src/main/typescript/webservices/delete-keychain-entry-endpoint-v1.ts +++ b/packages/cactus-plugin-keychain-memory-wasm/src/main/typescript/webservices/delete-keychain-entry-endpoint-v1.ts @@ -12,7 +12,10 @@ import { IExpressRequestHandler, IWebServiceEndpoint, } from "@hyperledger/cactus-core-api"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { DeleteKeychainEntryRequestV1 } from "@hyperledger/cactus-core-api"; import OAS from "../../json/openapi.json"; @@ -92,10 +95,8 @@ export class DeleteKeychainEntryV1Endpoint implements IWebServiceEndpoint { res.json(resBody); } catch (ex) { this.log.error(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, - }); + const errorMsg = `Internal server Error`; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-keychain-memory-wasm/src/main/typescript/webservices/get-keychain-entry-endpoint-v1.ts b/packages/cactus-plugin-keychain-memory-wasm/src/main/typescript/webservices/get-keychain-entry-endpoint-v1.ts index b39e4d7aa7..1a2f2de623 100644 --- a/packages/cactus-plugin-keychain-memory-wasm/src/main/typescript/webservices/get-keychain-entry-endpoint-v1.ts +++ b/packages/cactus-plugin-keychain-memory-wasm/src/main/typescript/webservices/get-keychain-entry-endpoint-v1.ts @@ -13,7 +13,10 @@ import { IExpressRequestHandler, IWebServiceEndpoint, } from "@hyperledger/cactus-core-api"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import OAS from "../../json/openapi.json"; import { PluginKeychainMemoryWasm } from "../plugin-keychain-memory-wasm"; @@ -91,16 +94,28 @@ export class GetKeychainEntryV1Endpoint implements IWebServiceEndpoint { const value = await this.options.plugin.get(key); res.json({ key, value }); } catch (ex) { - if (ex?.message?.includes(`${key} secret not found`)) { - res.status(404).json({ - key, - error: ex?.stack || ex?.message, + if ( + typeof ex === "object" && + ex !== null && + "message" in ex && + ex["message"] && + typeof ex.message === "string" + ) { + const errorMsg = ex.message; + handleRestEndpointException({ + errorMsg, + log: this.log, + error: ex, + res, }); } else { this.log.error(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, + const errorMsg = `Internal server Error`; + handleRestEndpointException({ + errorMsg, + log: this.log, + error: ex, + res, }); } } diff --git a/packages/cactus-plugin-keychain-memory-wasm/src/main/typescript/webservices/has-keychain-entry-endpoint-v1.ts b/packages/cactus-plugin-keychain-memory-wasm/src/main/typescript/webservices/has-keychain-entry-endpoint-v1.ts index a251a63dc7..394a7bfdcb 100644 --- a/packages/cactus-plugin-keychain-memory-wasm/src/main/typescript/webservices/has-keychain-entry-endpoint-v1.ts +++ b/packages/cactus-plugin-keychain-memory-wasm/src/main/typescript/webservices/has-keychain-entry-endpoint-v1.ts @@ -12,7 +12,10 @@ import { IExpressRequestHandler, IWebServiceEndpoint, } from "@hyperledger/cactus-core-api"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import OAS from "../../json/openapi.json"; import { PluginKeychainMemoryWasm } from "../plugin-keychain-memory-wasm"; @@ -99,10 +102,8 @@ export class HasKeychainEntryV1Endpoint implements IWebServiceEndpoint { res.json(resBody); } catch (ex) { this.log.error(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, - }); + const errorMsg = `Internal server Error`; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-keychain-memory-wasm/src/main/typescript/webservices/set-keychain-entry-endpoint-v1.ts b/packages/cactus-plugin-keychain-memory-wasm/src/main/typescript/webservices/set-keychain-entry-endpoint-v1.ts index 039e4c516d..eda27080b8 100644 --- a/packages/cactus-plugin-keychain-memory-wasm/src/main/typescript/webservices/set-keychain-entry-endpoint-v1.ts +++ b/packages/cactus-plugin-keychain-memory-wasm/src/main/typescript/webservices/set-keychain-entry-endpoint-v1.ts @@ -12,7 +12,10 @@ import { IExpressRequestHandler, IWebServiceEndpoint, } from "@hyperledger/cactus-core-api"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import OAS from "../../json/openapi.json"; import { PluginKeychainMemoryWasm } from "../plugin-keychain-memory-wasm"; @@ -92,10 +95,8 @@ export class SetKeychainEntryV1Endpoint implements IWebServiceEndpoint { res.json(resBody); } catch (ex) { this.log.error(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, - }); + const errorMsg = `Internal server Error`; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-keychain-memory/src/main/typescript/get-prometheus-exporter-metrics/get-prometheus-exporter-metrics-endpoint-v1.ts b/packages/cactus-plugin-keychain-memory/src/main/typescript/get-prometheus-exporter-metrics/get-prometheus-exporter-metrics-endpoint-v1.ts index 053ca59527..c3d041bc30 100644 --- a/packages/cactus-plugin-keychain-memory/src/main/typescript/get-prometheus-exporter-metrics/get-prometheus-exporter-metrics-endpoint-v1.ts +++ b/packages/cactus-plugin-keychain-memory/src/main/typescript/get-prometheus-exporter-metrics/get-prometheus-exporter-metrics-endpoint-v1.ts @@ -16,7 +16,10 @@ import { import OAS from "../../json/openapi.json"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { PluginKeychainMemory } from "../plugin-keychain-memory"; @@ -84,7 +87,6 @@ export class GetPrometheusExporterMetricsEndpointV1 } async handleRequest(req: Request, res: Response): Promise { - const fnTag = "GetPrometheusExporterMetrics#handleRequest()"; const verbUpper = this.getVerbLowerCase().toUpperCase(); this.log.debug(`${verbUpper} ${this.getPath()}`); @@ -93,10 +95,29 @@ export class GetPrometheusExporterMetricsEndpointV1 res.status(200); res.send(resBody); } catch (ex) { - this.log.error(`${fnTag} failed to serve request`, ex); - res.status(500); - res.statusMessage = ex.message; - res.json({ error: ex.stack }); + if ( + typeof ex === "object" && + ex !== null && + "message" in ex && + ex["message"] && + typeof ex.message === "string" + ) { + const errorMsg = ex.message; + handleRestEndpointException({ + errorMsg, + log: this.log, + error: ex, + res, + }); + } else { + const errorMsg = ""; + handleRestEndpointException({ + errorMsg, + log: this.log, + error: ex, + res, + }); + } } } } diff --git a/packages/cactus-plugin-keychain-vault/src/main/typescript/plugin-keychain-vault-remote-adapter.ts b/packages/cactus-plugin-keychain-vault/src/main/typescript/plugin-keychain-vault-remote-adapter.ts index 598889fce6..ae0838b1ad 100644 --- a/packages/cactus-plugin-keychain-vault/src/main/typescript/plugin-keychain-vault-remote-adapter.ts +++ b/packages/cactus-plugin-keychain-vault/src/main/typescript/plugin-keychain-vault-remote-adapter.ts @@ -34,8 +34,7 @@ export interface IPluginKeychainVaultRemoteAdapterOptions * the author so desires. */ export class PluginKeychainVaultRemoteAdapter - implements ICactusPlugin, IPluginWebService -{ + implements ICactusPlugin, IPluginWebService { public static readonly CLASS_NAME = "PluginKeychainVaultRemoteAdapter"; private readonly instanceId: string; diff --git a/packages/cactus-plugin-keychain-vault/src/main/typescript/plugin-keychain-vault.ts b/packages/cactus-plugin-keychain-vault/src/main/typescript/plugin-keychain-vault.ts index 4c2764d4cf..ca3699f67d 100644 --- a/packages/cactus-plugin-keychain-vault/src/main/typescript/plugin-keychain-vault.ts +++ b/packages/cactus-plugin-keychain-vault/src/main/typescript/plugin-keychain-vault.ts @@ -1,7 +1,7 @@ import type { Express } from "express"; import Vault from "node-vault"; import HttpStatus from "http-status-codes"; - +import handleVaultResponse from "node-vault"; import OAS from "../json/openapi.json"; import { @@ -28,6 +28,12 @@ import { SetKeychainEntryEndpointV1 } from "./web-services/set-keychain-entry-en import { HasKeychainEntryEndpointV1 } from "./web-services/has-keychain-entry-endpoint-v1"; import { DeleteKeychainEntryEndpointV1 } from "./web-services/delete-keychain-entry-endpoint-v1"; +interface ErrorResponse extends Error { + response?: { + statusCode?: number; + }; +} + export interface IPluginKeychainVaultOptions extends ICactusPluginOptions { logLevel?: LogLevelDesc; keychainId: string; @@ -228,8 +234,9 @@ export class PluginKeychainVault implements IPluginWebService, IPluginKeychain { ); } } catch (ex) { + const errorResponse = ex as ErrorResponse; // FIXME: Throw if not found, detect it in the endpoint code, status=404 - if (ex?.response?.statusCode === HttpStatus.NOT_FOUND) { + if (errorResponse?.response?.statusCode === HttpStatus.NOT_FOUND) { return null as unknown as string; } else { this.log.error(`Retrieval of "${key}" crashed:`, ex); @@ -249,14 +256,17 @@ export class PluginKeychainVault implements IPluginWebService, IPluginKeychain { try { const res = await this.backend.read(path); return res; + ``; } catch (ex) { + const errorResponse = ex as ErrorResponse; + handleVaultResponse(); // We have to make sure that the exception is either an expected - // or an unexpected one where the expected exception is what we + // or an unexpected one where the expected exception is `what we // get when the key is not present in the keychain and anything // else being an unexpected exception that we do not want to // handle nor suppress under any circumstances since doing so // would lead to silent failures or worse. - if (ex?.response?.statusCode === HttpStatus.NOT_FOUND) { + if (errorResponse?.response?.statusCode === HttpStatus.NOT_FOUND) { return false; } else { this.log.error(`Presence check of "${key}" crashed:`, ex); diff --git a/packages/cactus-plugin-keychain-vault/src/main/typescript/web-services/delete-keychain-entry-endpoint-v1.ts b/packages/cactus-plugin-keychain-vault/src/main/typescript/web-services/delete-keychain-entry-endpoint-v1.ts index 508bc67e6d..7c6f46d68a 100644 --- a/packages/cactus-plugin-keychain-vault/src/main/typescript/web-services/delete-keychain-entry-endpoint-v1.ts +++ b/packages/cactus-plugin-keychain-vault/src/main/typescript/web-services/delete-keychain-entry-endpoint-v1.ts @@ -12,7 +12,10 @@ import { IExpressRequestHandler, IWebServiceEndpoint, } from "@hyperledger/cactus-core-api"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import OAS from "../../json/openapi.json"; import { PluginKeychainVault } from "../plugin-keychain-vault"; @@ -102,7 +105,8 @@ export class DeleteKeychainEntryEndpointV1 implements IWebServiceEndpoint { } catch (ex) { this.log.debug(`${tag} Failed to serve request:`, ex); res.status(500); - res.json({ error: ex.stack }); + const errorMsg = `Internal server Error`; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-keychain-vault/src/main/typescript/web-services/get-keychain-entry-endpoint-v1.ts b/packages/cactus-plugin-keychain-vault/src/main/typescript/web-services/get-keychain-entry-endpoint-v1.ts index 2972a38f2e..fd713625b8 100644 --- a/packages/cactus-plugin-keychain-vault/src/main/typescript/web-services/get-keychain-entry-endpoint-v1.ts +++ b/packages/cactus-plugin-keychain-vault/src/main/typescript/web-services/get-keychain-entry-endpoint-v1.ts @@ -12,7 +12,10 @@ import { IExpressRequestHandler, IWebServiceEndpoint, } from "@hyperledger/cactus-core-api"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import OAS from "../../json/openapi.json"; import { PluginKeychainVault } from "../plugin-keychain-vault"; @@ -102,8 +105,8 @@ export class GetKeychainEntryEndpointV1 implements IWebServiceEndpoint { res.json(resBody); } catch (ex) { this.log.debug(`${tag} Failed to serve request:`, ex); - res.status(500); - res.json({ error: ex.stack }); + const errorMsg = `Internal server Error`; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-keychain-vault/src/main/typescript/web-services/get-prometheus-exporter-metrics-endpoint-v1.ts b/packages/cactus-plugin-keychain-vault/src/main/typescript/web-services/get-prometheus-exporter-metrics-endpoint-v1.ts index fe07adedb6..db0c807117 100644 --- a/packages/cactus-plugin-keychain-vault/src/main/typescript/web-services/get-prometheus-exporter-metrics-endpoint-v1.ts +++ b/packages/cactus-plugin-keychain-vault/src/main/typescript/web-services/get-prometheus-exporter-metrics-endpoint-v1.ts @@ -16,7 +16,10 @@ import { import OAS from "../../json/openapi.json"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { PluginKeychainVault } from "../plugin-keychain-vault"; @@ -94,9 +97,8 @@ export class GetPrometheusExporterMetricsEndpointV1 res.send(resBody); } catch (ex) { this.log.error(`${fnTag} failed to serve request`, ex); - res.status(500); - res.statusMessage = ex.message; - res.json({ error: ex.stack }); + const errorMsg = `Internal server Error`; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-keychain-vault/src/main/typescript/web-services/has-keychain-entry-endpoint-v1.ts b/packages/cactus-plugin-keychain-vault/src/main/typescript/web-services/has-keychain-entry-endpoint-v1.ts index da2a9fa4d8..b9e14d7af5 100644 --- a/packages/cactus-plugin-keychain-vault/src/main/typescript/web-services/has-keychain-entry-endpoint-v1.ts +++ b/packages/cactus-plugin-keychain-vault/src/main/typescript/web-services/has-keychain-entry-endpoint-v1.ts @@ -12,7 +12,10 @@ import { IExpressRequestHandler, IWebServiceEndpoint, } from "@hyperledger/cactus-core-api"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import OAS from "../../json/openapi.json"; import { PluginKeychainVault } from "../plugin-keychain-vault"; @@ -103,8 +106,8 @@ export class HasKeychainEntryEndpointV1 implements IWebServiceEndpoint { res.json(resBody); } catch (ex) { this.log.debug(`${tag} Failed to serve request:`, ex); - res.status(500); - res.json({ error: ex.stack }); + const errorMsg = `Internal server Error`; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-keychain-vault/src/main/typescript/web-services/set-keychain-entry-endpoint-v1.ts b/packages/cactus-plugin-keychain-vault/src/main/typescript/web-services/set-keychain-entry-endpoint-v1.ts index 4d4ad5f197..acc2de7005 100644 --- a/packages/cactus-plugin-keychain-vault/src/main/typescript/web-services/set-keychain-entry-endpoint-v1.ts +++ b/packages/cactus-plugin-keychain-vault/src/main/typescript/web-services/set-keychain-entry-endpoint-v1.ts @@ -12,7 +12,10 @@ import { IExpressRequestHandler, IWebServiceEndpoint, } from "@hyperledger/cactus-core-api"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import OAS from "../../json/openapi.json"; import { PluginKeychainVault } from "../plugin-keychain-vault"; @@ -97,8 +100,8 @@ export class SetKeychainEntryEndpointV1 implements IWebServiceEndpoint { res.json(resBody); } catch (ex) { this.log.debug(`${tag} Failed to serve request:`, ex); - res.status(500); - res.json({ error: ex.stack }); + const errorMsg = `Internal server Error`; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-keychain-vault/src/test/typescript/integration/openapi/openapi-validation.test.ts b/packages/cactus-plugin-keychain-vault/src/test/typescript/integration/openapi/openapi-validation.test.ts index 55174f1250..7e22ab307d 100644 --- a/packages/cactus-plugin-keychain-vault/src/test/typescript/integration/openapi/openapi-validation.test.ts +++ b/packages/cactus-plugin-keychain-vault/src/test/typescript/integration/openapi/openapi-validation.test.ts @@ -290,7 +290,7 @@ test(`${testCase}`, async (t: Test) => { } catch (err) { const e = err as AxiosError; t2.equal( - (e as AxiosError)?.response?.status, + e?.response?.status, 400, `Endpoint ${fDelete} with fake=4: response.status === 400 OK`, ); diff --git a/packages/cactus-plugin-ledger-connector-aries/src/main/typescript/web-services/accept-invitation-v1-endpoint.ts b/packages/cactus-plugin-ledger-connector-aries/src/main/typescript/web-services/accept-invitation-v1-endpoint.ts index 123d8edc18..7864275587 100644 --- a/packages/cactus-plugin-ledger-connector-aries/src/main/typescript/web-services/accept-invitation-v1-endpoint.ts +++ b/packages/cactus-plugin-ledger-connector-aries/src/main/typescript/web-services/accept-invitation-v1-endpoint.ts @@ -11,9 +11,11 @@ import { LogLevelDesc, LoggerProvider, IAsyncProvider, - safeStringifyException, } from "@hyperledger/cactus-common"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { PluginLedgerConnectorAries } from "../plugin-ledger-connector-aries"; import OAS from "../../json/openapi.json"; @@ -93,11 +95,8 @@ export class AcceptInvitationEndpoint implements IWebServiceEndpoint { ); } catch (ex) { this.log.error(`Crash while serving ${reqTag}`, ex); - - res.status(500).json({ - message: "Internal Server Error", - error: safeStringifyException(ex), - }); + const errorMsg = "Internal Server Error"; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-ledger-connector-aries/src/main/typescript/web-services/create-new-connection-invitation-v1-endpoint.ts b/packages/cactus-plugin-ledger-connector-aries/src/main/typescript/web-services/create-new-connection-invitation-v1-endpoint.ts index f2805929bf..bf023ad58a 100644 --- a/packages/cactus-plugin-ledger-connector-aries/src/main/typescript/web-services/create-new-connection-invitation-v1-endpoint.ts +++ b/packages/cactus-plugin-ledger-connector-aries/src/main/typescript/web-services/create-new-connection-invitation-v1-endpoint.ts @@ -11,9 +11,11 @@ import { LogLevelDesc, LoggerProvider, IAsyncProvider, - safeStringifyException, } from "@hyperledger/cactus-common"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { PluginLedgerConnectorAries } from "../plugin-ledger-connector-aries"; import OAS from "../../json/openapi.json"; @@ -24,8 +26,7 @@ export interface ICreateNewConnectionInvitationOptions { } export class CreateNewConnectionInvitationEndpoint - implements IWebServiceEndpoint -{ + implements IWebServiceEndpoint { private readonly log: Logger; public get className(): string { @@ -95,11 +96,8 @@ export class CreateNewConnectionInvitationEndpoint ); } catch (ex) { this.log.error(`Crash while serving ${reqTag}`, ex); - - res.status(500).json({ - message: "Internal Server Error", - error: safeStringifyException(ex), - }); + const errorMsg = "Internal Server Error"; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-ledger-connector-aries/src/main/typescript/web-services/get-agents-v1-endpoint.ts b/packages/cactus-plugin-ledger-connector-aries/src/main/typescript/web-services/get-agents-v1-endpoint.ts index 5d896b8354..7ae22cccc7 100644 --- a/packages/cactus-plugin-ledger-connector-aries/src/main/typescript/web-services/get-agents-v1-endpoint.ts +++ b/packages/cactus-plugin-ledger-connector-aries/src/main/typescript/web-services/get-agents-v1-endpoint.ts @@ -11,9 +11,11 @@ import { LogLevelDesc, LoggerProvider, IAsyncProvider, - safeStringifyException, } from "@hyperledger/cactus-common"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { PluginLedgerConnectorAries } from "../plugin-ledger-connector-aries"; import OAS from "../../json/openapi.json"; @@ -86,11 +88,8 @@ export class GetAgentsEndpoint implements IWebServiceEndpoint { res.status(200).json(await this.options.connector.getAgents()); } catch (ex) { this.log.error(`Crash while serving ${reqTag}`, ex); - - res.status(500).json({ - message: "Internal Server Error", - error: safeStringifyException(ex), - }); + const errorMsg = "Internal Server Error"; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-ledger-connector-aries/src/main/typescript/web-services/get-connections-v1-endpoint.ts b/packages/cactus-plugin-ledger-connector-aries/src/main/typescript/web-services/get-connections-v1-endpoint.ts index bd23474054..d37da3540a 100644 --- a/packages/cactus-plugin-ledger-connector-aries/src/main/typescript/web-services/get-connections-v1-endpoint.ts +++ b/packages/cactus-plugin-ledger-connector-aries/src/main/typescript/web-services/get-connections-v1-endpoint.ts @@ -11,9 +11,11 @@ import { LogLevelDesc, LoggerProvider, IAsyncProvider, - safeStringifyException, } from "@hyperledger/cactus-common"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { PluginLedgerConnectorAries } from "../plugin-ledger-connector-aries"; import OAS from "../../json/openapi.json"; @@ -93,11 +95,8 @@ export class GetConnectionsEndpoint implements IWebServiceEndpoint { ); } catch (ex) { this.log.error(`Crash while serving ${reqTag}`, ex); - - res.status(500).json({ - message: "Internal Server Error", - error: safeStringifyException(ex), - }); + const errorMsg = "Internal Server Error"; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-ledger-connector-aries/src/main/typescript/web-services/request-proof-v1-endpoint.ts b/packages/cactus-plugin-ledger-connector-aries/src/main/typescript/web-services/request-proof-v1-endpoint.ts index 948e894ec2..c4c834da5f 100644 --- a/packages/cactus-plugin-ledger-connector-aries/src/main/typescript/web-services/request-proof-v1-endpoint.ts +++ b/packages/cactus-plugin-ledger-connector-aries/src/main/typescript/web-services/request-proof-v1-endpoint.ts @@ -11,9 +11,11 @@ import { LogLevelDesc, LoggerProvider, IAsyncProvider, - safeStringifyException, } from "@hyperledger/cactus-common"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { PluginLedgerConnectorAries } from "../plugin-ledger-connector-aries"; import OAS from "../../json/openapi.json"; @@ -94,11 +96,8 @@ export class RequestProofEndpoint implements IWebServiceEndpoint { ); } catch (ex) { this.log.error(`Crash while serving ${reqTag}`, ex); - - res.status(500).json({ - message: "Internal Server Error", - error: safeStringifyException(ex), - }); + const errorMsg = "Internal Server Error"; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-ledger-connector-besu/src/main/typescript/web-services/get-balance-endpoint.ts b/packages/cactus-plugin-ledger-connector-besu/src/main/typescript/web-services/get-balance-endpoint.ts index 95f2332898..3ee2616d6e 100644 --- a/packages/cactus-plugin-ledger-connector-besu/src/main/typescript/web-services/get-balance-endpoint.ts +++ b/packages/cactus-plugin-ledger-connector-besu/src/main/typescript/web-services/get-balance-endpoint.ts @@ -12,7 +12,10 @@ import { IExpressRequestHandler, IWebServiceEndpoint, } from "@hyperledger/cactus-core-api"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { PluginLedgerConnectorBesu } from "../plugin-ledger-connector-besu"; @@ -90,10 +93,8 @@ export class GetBalanceEndpoint implements IWebServiceEndpoint { res.json(resBody); } catch (ex) { this.log.error(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, - }); + const errorMsg = `Internal server Error`; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-ledger-connector-besu/src/main/typescript/web-services/get-besu-record-endpoint-v1.ts b/packages/cactus-plugin-ledger-connector-besu/src/main/typescript/web-services/get-besu-record-endpoint-v1.ts index 84a530909c..8a68fa6503 100644 --- a/packages/cactus-plugin-ledger-connector-besu/src/main/typescript/web-services/get-besu-record-endpoint-v1.ts +++ b/packages/cactus-plugin-ledger-connector-besu/src/main/typescript/web-services/get-besu-record-endpoint-v1.ts @@ -12,7 +12,10 @@ import { IExpressRequestHandler, IWebServiceEndpoint, } from "@hyperledger/cactus-core-api"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { PluginLedgerConnectorBesu } from "../plugin-ledger-connector-besu"; import { GetBesuRecordV1Request } from "../generated/openapi/typescript-axios/api"; @@ -94,10 +97,8 @@ export class GetBesuRecordEndpointV1 implements IWebServiceEndpoint { res.json(resBody); } catch (ex) { this.log.error(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, - }); + const errorMsg = `Internal server Error`; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-ledger-connector-besu/src/main/typescript/web-services/get-block-v1-endpoint-.ts b/packages/cactus-plugin-ledger-connector-besu/src/main/typescript/web-services/get-block-v1-endpoint-.ts index 23f6f4d6ec..192184443b 100644 --- a/packages/cactus-plugin-ledger-connector-besu/src/main/typescript/web-services/get-block-v1-endpoint-.ts +++ b/packages/cactus-plugin-ledger-connector-besu/src/main/typescript/web-services/get-block-v1-endpoint-.ts @@ -12,7 +12,10 @@ import { IExpressRequestHandler, IWebServiceEndpoint, } from "@hyperledger/cactus-core-api"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { PluginLedgerConnectorBesu } from "../plugin-ledger-connector-besu"; @@ -90,10 +93,8 @@ export class GetBlockEndpoint implements IWebServiceEndpoint { res.json(resBody); } catch (ex) { this.log.error(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, - }); + const errorMsg = `Internal server Error`; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-ledger-connector-besu/src/main/typescript/web-services/get-past-logs-endpoint.ts b/packages/cactus-plugin-ledger-connector-besu/src/main/typescript/web-services/get-past-logs-endpoint.ts index ff3f14b764..68c0590ab0 100644 --- a/packages/cactus-plugin-ledger-connector-besu/src/main/typescript/web-services/get-past-logs-endpoint.ts +++ b/packages/cactus-plugin-ledger-connector-besu/src/main/typescript/web-services/get-past-logs-endpoint.ts @@ -12,7 +12,10 @@ import { IExpressRequestHandler, IWebServiceEndpoint, } from "@hyperledger/cactus-core-api"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { PluginLedgerConnectorBesu } from "../plugin-ledger-connector-besu"; @@ -90,10 +93,8 @@ export class GetPastLogsEndpoint implements IWebServiceEndpoint { res.json(resBody); } catch (ex) { this.log.error(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, - }); + const errorMsg = `Internal server Error`; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-ledger-connector-besu/src/main/typescript/web-services/get-prometheus-exporter-metrics-endpoint-v1.ts b/packages/cactus-plugin-ledger-connector-besu/src/main/typescript/web-services/get-prometheus-exporter-metrics-endpoint-v1.ts index 416190ed0f..c192ec2deb 100644 --- a/packages/cactus-plugin-ledger-connector-besu/src/main/typescript/web-services/get-prometheus-exporter-metrics-endpoint-v1.ts +++ b/packages/cactus-plugin-ledger-connector-besu/src/main/typescript/web-services/get-prometheus-exporter-metrics-endpoint-v1.ts @@ -1,6 +1,9 @@ import { Express, Request, Response } from "express"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import OAS from "../../json/openapi.json"; @@ -26,8 +29,7 @@ export interface IGetPrometheusExporterMetricsEndpointV1Options { } export class GetPrometheusExporterMetricsEndpointV1 - implements IWebServiceEndpoint -{ + implements IWebServiceEndpoint { private readonly log: Logger; constructor( @@ -84,6 +86,7 @@ export class GetPrometheusExporterMetricsEndpointV1 async handleRequest(req: Request, res: Response): Promise { const fnTag = "GetPrometheusExporterMetrics#handleRequest()"; + const reqTag = `${this.getVerbLowerCase()} - ${this.getPath()}`; const verbUpper = this.getVerbLowerCase().toUpperCase(); this.log.debug(`${verbUpper} ${this.getPath()}`); @@ -94,9 +97,29 @@ export class GetPrometheusExporterMetricsEndpointV1 res.send(resBody); } catch (ex) { this.log.error(`${fnTag} failed to serve request`, ex); - res.status(500); - res.statusMessage = ex.message; - res.json({ error: ex.stack }); + if ( + typeof ex === "object" && + ex !== null && + "message" in ex && + typeof ex.message === "string" + ) { + const errorMsg = ex.message; + handleRestEndpointException({ + errorMsg, + log: this.log, + error: ex, + res, + }); + } else { + this.log.error(`Crash while serving ${reqTag}`, ex); + const errorMsg = `Internal server Error`; + handleRestEndpointException({ + errorMsg, + log: this.log, + error: ex, + res, + }); + } } } } diff --git a/packages/cactus-plugin-ledger-connector-besu/src/main/typescript/web-services/get-transaction-endpoint.ts b/packages/cactus-plugin-ledger-connector-besu/src/main/typescript/web-services/get-transaction-endpoint.ts index 84807e8da9..78a78f3ac7 100644 --- a/packages/cactus-plugin-ledger-connector-besu/src/main/typescript/web-services/get-transaction-endpoint.ts +++ b/packages/cactus-plugin-ledger-connector-besu/src/main/typescript/web-services/get-transaction-endpoint.ts @@ -12,7 +12,10 @@ import { IExpressRequestHandler, IWebServiceEndpoint, } from "@hyperledger/cactus-core-api"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { PluginLedgerConnectorBesu } from "../plugin-ledger-connector-besu"; @@ -90,10 +93,9 @@ export class GetTransactionEndpoint implements IWebServiceEndpoint { res.json(resBody); } catch (ex) { this.log.error(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, - }); + const errorMsg = `Internal server Error`; + + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-ledger-connector-besu/src/main/typescript/web-services/invoke-contract-endpoint.ts b/packages/cactus-plugin-ledger-connector-besu/src/main/typescript/web-services/invoke-contract-endpoint.ts index cd398a6290..656f915e31 100644 --- a/packages/cactus-plugin-ledger-connector-besu/src/main/typescript/web-services/invoke-contract-endpoint.ts +++ b/packages/cactus-plugin-ledger-connector-besu/src/main/typescript/web-services/invoke-contract-endpoint.ts @@ -12,7 +12,10 @@ import { IExpressRequestHandler, IWebServiceEndpoint, } from "@hyperledger/cactus-core-api"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { PluginLedgerConnectorBesu } from "../plugin-ledger-connector-besu"; @@ -91,10 +94,8 @@ export class InvokeContractEndpoint implements IWebServiceEndpoint { res.json(resBody); } catch (ex) { this.log.error(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, - }); + const errorMsg = `Internal server Error`; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-ledger-connector-besu/src/main/typescript/web-services/run-transaction-endpoint.ts b/packages/cactus-plugin-ledger-connector-besu/src/main/typescript/web-services/run-transaction-endpoint.ts index 096be62d00..c90eee32be 100644 --- a/packages/cactus-plugin-ledger-connector-besu/src/main/typescript/web-services/run-transaction-endpoint.ts +++ b/packages/cactus-plugin-ledger-connector-besu/src/main/typescript/web-services/run-transaction-endpoint.ts @@ -12,7 +12,10 @@ import { IExpressRequestHandler, IWebServiceEndpoint, } from "@hyperledger/cactus-core-api"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { PluginLedgerConnectorBesu } from "../plugin-ledger-connector-besu"; @@ -91,10 +94,9 @@ export class RunTransactionEndpoint implements IWebServiceEndpoint { res.json({ success: true, data: resBody }); } catch (ex) { this.log.error(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, - }); + const errorMsg = `Internal server Error`; + + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-ledger-connector-besu/src/main/typescript/web-services/sign-transaction-endpoint-v1.ts b/packages/cactus-plugin-ledger-connector-besu/src/main/typescript/web-services/sign-transaction-endpoint-v1.ts index 88a352065d..3c7c7c8867 100644 --- a/packages/cactus-plugin-ledger-connector-besu/src/main/typescript/web-services/sign-transaction-endpoint-v1.ts +++ b/packages/cactus-plugin-ledger-connector-besu/src/main/typescript/web-services/sign-transaction-endpoint-v1.ts @@ -1,6 +1,9 @@ import { Express, Request, Response } from "express"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { IWebServiceEndpoint, @@ -81,6 +84,7 @@ export class BesuSignTransactionEndpointV1 implements IWebServiceEndpoint { async handleRequest(req: Request, res: Response): Promise { const fnTag = "BesuSignTransactionEndpointV1#handleRequest()"; + const reqTag = `${this.getVerbLowerCase()} - ${this.getPath()}`; this.log.debug(`POST ${this.getPath()}`); try { @@ -100,9 +104,29 @@ export class BesuSignTransactionEndpointV1 implements IWebServiceEndpoint { } } catch (ex) { this.log.error(`${fnTag} failed to serve request`, ex); - res.status(500); - res.statusMessage = ex.message; - res.json({ error: ex.stack }); + if ( + typeof ex === "object" && + ex !== null && + "message" in ex && + typeof ex.message === "string" + ) { + const errorMsg = ex.message; + handleRestEndpointException({ + errorMsg, + log: this.log, + error: ex, + res, + }); + } else { + this.log.error(`Crash while serving ${reqTag}`, ex); + const errorMsg = `Internal server Error`; + handleRestEndpointException({ + errorMsg, + log: this.log, + error: ex, + res, + }); + } } } } diff --git a/packages/cactus-plugin-ledger-connector-besu/src/test/typescript/integration/plugin-ledger-connector-besu/deploy-contract/invoke-contract.test.ts b/packages/cactus-plugin-ledger-connector-besu/src/test/typescript/integration/plugin-ledger-connector-besu/deploy-contract/invoke-contract.test.ts index d596bceea2..771a58283c 100644 --- a/packages/cactus-plugin-ledger-connector-besu/src/test/typescript/integration/plugin-ledger-connector-besu/deploy-contract/invoke-contract.test.ts +++ b/packages/cactus-plugin-ledger-connector-besu/src/test/typescript/integration/plugin-ledger-connector-besu/deploy-contract/invoke-contract.test.ts @@ -200,7 +200,11 @@ describe(testCase, () => { }); expect(setNameOutInvalid.transactionReceipt).toBeFalsy(); } catch (error) { - expect(error.message).toMatch("Nonce too low"); + if (typeof error === "object" && error !== null) { + if ("message" in error && typeof error.message === "string") { + expect(error.message).toMatch("Nonce too low"); + } + } } const { callOutput: getNameOut } = await connector.invokeContract({ @@ -299,7 +303,11 @@ describe(testCase, () => { }); expect(setNameOutInvalid.transactionReceipt).toBeFalsy(); } catch (error) { - expect(error.message).toMatch("Nonce too low"); + if (typeof error === "object" && error !== null) { + if ("message" in error && typeof error.message === "string") { + expect(error.message).toMatch("Nonce too low"); + } + } } const { callOutput: getNameOut } = await connector.invokeContract({ diff --git a/packages/cactus-plugin-ledger-connector-besu/src/test/typescript/integration/plugin-ledger-connector-besu/openapi/openapi-validation.test.ts b/packages/cactus-plugin-ledger-connector-besu/src/test/typescript/integration/plugin-ledger-connector-besu/openapi/openapi-validation.test.ts index 95ae330f70..9e08a582c4 100644 --- a/packages/cactus-plugin-ledger-connector-besu/src/test/typescript/integration/plugin-ledger-connector-besu/openapi/openapi-validation.test.ts +++ b/packages/cactus-plugin-ledger-connector-besu/src/test/typescript/integration/plugin-ledger-connector-besu/openapi/openapi-validation.test.ts @@ -44,6 +44,7 @@ import { BesuApiClientOptions } from "../../../../../main/typescript/api-client/ import { installOpenapiValidationMiddleware } from "@hyperledger/cactus-core"; import OAS from "../../../../../main/json/openapi.json"; import { Account } from "web3-core"; +import { AxiosError } from "axios"; const logLevel: LogLevelDesc = "TRACE"; const testCase = "able to validate OpenAPI requests"; @@ -212,15 +213,16 @@ describe("PluginLedgerConnectorBesu", () => { await apiClient.deployContractSolBytecodeV1( parameters as unknown as DeployContractSolidityBytecodeV1Request, ); - } catch (e) { - expect(e.response.status).toEqual(400); - const fields = e.response.data.map((param: { readonly path: string }) => + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; + expect(e?.response?.status).toEqual(400); + const fields = e?.response?.data.map((param: { readonly path: string }) => param.path.replace("/body/", ""), ); - expect(fields.includes("contractName")).toBeTrue(); - expect(fields.includes("bytecode")).toBeTrue(); - expect(fields.includes("gas")).toBeFalse(); + expect(fields?.includes("contractName")).toBeTrue(); + expect(fields?.includes("bytecode")).toBeTrue(); + expect(fields?.includes("gas")).toBeFalse(); } }); @@ -243,12 +245,13 @@ describe("PluginLedgerConnectorBesu", () => { await apiClient.deployContractSolBytecodeV1( parameters as DeployContractSolidityBytecodeV1Request, ); - } catch (e) { - expect(e.response.status).toEqual(400); - const fields = e.response.data.map((param: { readonly path: string }) => + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; + expect(e?.response?.status).toEqual(400); + const fields = e?.response?.data.map((param: { readonly path: string }) => param.path.replace("/body/", ""), ); - expect(fields.includes("fake")).toBeTrue(); + expect(fields?.includes("fake")).toBeTrue(); } }); @@ -289,13 +292,14 @@ describe("PluginLedgerConnectorBesu", () => { await apiClient.invokeContractV1( parameters as any as InvokeContractV1Request, ); - } catch (e) { - expect(e.response.status).toEqual(400); - const fields = e.response.data.map((param: { readonly path: string }) => + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; + expect(e?.response?.status).toEqual(400); + const fields = e?.response?.data.map((param: { readonly path: string }) => param.path.replace("/body/", ""), ); - expect(fields.includes("contractName")).toBeTrue(); - expect(fields.includes("gas")).toBeFalse(); + expect(fields?.includes("contractName")).toBeTrue(); + expect(fields?.includes("gas")).toBeFalse(); } }); @@ -315,12 +319,13 @@ describe("PluginLedgerConnectorBesu", () => { fake: 4, }; await apiClient.invokeContractV1(parameters as InvokeContractV1Request); - } catch (e) { - expect(e.response.status).toEqual(400); - const fields = e.response.data.map((param: { readonly path: string }) => + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; + expect(e?.response?.status).toEqual(400); + const fields = e?.response?.data.map((param: { readonly path: string }) => param.path.replace("/body/", ""), ); - expect(fields.includes("fake")).toBeTrue(); + expect(fields?.includes("fake")).toBeTrue(); } }); @@ -368,12 +373,13 @@ describe("PluginLedgerConnectorBesu", () => { }, }; await apiClient.runTransactionV1(parameters as RunTransactionRequest); - } catch (e) { - expect(e.response.status).toEqual(400); - const fields = e.response.data.map((param: { readonly path: string }) => + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; + expect(e?.response?.status).toEqual(400); + const fields = e?.response?.data.map((param: { readonly path: string }) => param.path.replace("/body/", ""), ); - expect(fields.includes("consistencyStrategy")).toBeTrue(); + expect(fields?.includes("consistencyStrategy")).toBeTrue(); } }); @@ -399,12 +405,13 @@ describe("PluginLedgerConnectorBesu", () => { fake: 4, }; await apiClient.runTransactionV1(parameters as RunTransactionRequest); - } catch (e) { - expect(e.response.status).toEqual(400); - const fields = e.response.data.map((param: { readonly path: string }) => + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; + expect(e?.response?.status).toEqual(400); + const fields = e?.response?.data.map((param: { readonly path: string }) => param.path.replace("/body/", ""), ); - expect(fields.includes("fake")).toBeTrue(); + expect(fields?.includes("fake")).toBeTrue(); } }); @@ -490,12 +497,13 @@ describe("PluginLedgerConnectorBesu", () => { }; await apiClient.signTransactionV1(parameters as SignTransactionRequest); - } catch (e) { - expect(e.response.status).toEqual(400); - const fields = e.response.data.map((param: any) => + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; + expect(e?.response?.status).toEqual(400); + const fields = e?.response?.data.map((param: any) => param.path.replace("/body/", ""), ); - expect(fields.includes("keychainId")).toBeTrue(); + expect(fields?.includes("keychainId")).toBeTrue(); } }); @@ -533,12 +541,13 @@ describe("PluginLedgerConnectorBesu", () => { }; await apiClient.signTransactionV1(parameters as SignTransactionRequest); - } catch (e) { - expect(e.response.status).toEqual(400); - const fields = e.response.data.map((param: { readonly path: string }) => + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; + expect(e?.response?.status).toEqual(400); + const fields = e?.response?.data.map((param: { readonly path: string }) => param.path.replace("/body/", ""), ); - expect(fields.includes("fake")).toBeTrue(); + expect(fields?.includes("fake")).toBeTrue(); } }); @@ -553,12 +562,13 @@ describe("PluginLedgerConnectorBesu", () => { try { const parameters = {}; await apiClient.getBalanceV1(parameters as GetBalanceV1Request); - } catch (e) { - expect(e.response.status).toEqual(400); - const fields = e.response.data.map((param: { readonly path: string }) => + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; + expect(e?.response?.status).toEqual(400); + const fields = e?.response?.data.map((param: { readonly path: string }) => param.path.replace("/body/", ""), ); - expect(fields.includes("address")).toBeTrue(); + expect(fields?.includes("address")).toBeTrue(); } }); @@ -569,12 +579,13 @@ describe("PluginLedgerConnectorBesu", () => { fake: 4, }; await apiClient.getBalanceV1(parameters as GetBalanceV1Request); - } catch (e) { - expect(e.response.status).toEqual(400); - const fields = e.response.data.map((param: { readonly path: string }) => + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; + expect(e?.response?.status).toEqual(400); + const fields = e?.response?.data.map((param: { readonly path: string }) => param.path.replace("/body/", ""), ); - expect(fields.includes("fake")).toBeTrue(); + expect(fields?.includes("fake")).toBeTrue(); } }); @@ -589,12 +600,13 @@ describe("PluginLedgerConnectorBesu", () => { try { const parameters = {}; await apiClient.getBlockV1(parameters as GetBlockV1Request); - } catch (e) { - expect(e.response.status).toEqual(400); - const fields = e.response.data.map((param: { readonly path: string }) => + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; + expect(e?.response?.status).toEqual(400); + const fields = e?.response?.data.map((param: { readonly path: string }) => param.path.replace("/body/", ""), ); - expect(fields.includes("blockHashOrBlockNumber")).toBeTrue(); + expect(fields?.includes("blockHashOrBlockNumber")).toBeTrue(); } }); @@ -605,12 +617,13 @@ describe("PluginLedgerConnectorBesu", () => { fake: 4, }; await apiClient.getBlockV1(parameters as GetBlockV1Request); - } catch (e) { - expect(e.response.status).toEqual(400); - const fields = e.response.data.map((param: { readonly path: string }) => + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; + expect(e?.response?.status).toEqual(400); + const fields = e?.response?.data.map((param: { readonly path: string }) => param.path.replace("/body/", ""), ); - expect(fields.includes("fake")).toBeTrue(); + expect(fields?.includes("fake")).toBeTrue(); } }); @@ -627,12 +640,13 @@ describe("PluginLedgerConnectorBesu", () => { try { const parameters = {}; await apiClient.getPastLogsV1(parameters as GetPastLogsV1Request); - } catch (e) { - expect(e.response.status).toEqual(400); - const fields = e.response.data.map((param: { readonly path: string }) => + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; + expect(e?.response?.status).toEqual(400); + const fields = e?.response?.data.map((param: { readonly path: string }) => param.path.replace("/body/", ""), ); - expect(fields.includes("address")).toBeTrue(); + expect(fields?.includes("address")).toBeTrue(); } }); @@ -643,12 +657,13 @@ describe("PluginLedgerConnectorBesu", () => { fake: 4, }; await apiClient.getPastLogsV1(parameters as GetPastLogsV1Request); - } catch (e) { - expect(e.response.status).toEqual(400); - const fields = e.response.data.map((param: { readonly path: string }) => + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; + expect(e?.response?.status).toEqual(400); + const fields = e?.response?.data.map((param: { readonly path: string }) => param.path.replace("/body/", ""), ); - expect(fields.includes("fake")).toBeTrue(); + expect(fields?.includes("fake")).toBeTrue(); } }); @@ -693,12 +708,13 @@ describe("PluginLedgerConnectorBesu", () => { try { const parameters = {}; await apiClient.getBesuRecordV1(parameters as GetBesuRecordV1Request); - } catch (e) { - expect(e.response.status).toEqual(400); - const fields = e.response.data.map((param: any) => + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; + expect(e?.response?.status).toEqual(400); + const fields = e?.response?.data.map((param: any) => param.path.replace("/body/", ""), ); - expect(fields.includes("transactionHash")).toBeTrue(); + expect(fields?.includes("transactionHash")).toBeTrue(); } }); @@ -709,12 +725,13 @@ describe("PluginLedgerConnectorBesu", () => { fake: 5, }; await apiClient.getBesuRecordV1(parameters as GetBesuRecordV1Request); - } catch (e) { - expect(e.response.status).toEqual(400); - const fields = e.response.data.map((param: { readonly path: string }) => + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; + expect(e?.response?.status).toEqual(400); + const fields = e?.response?.data.map((param: { readonly path: string }) => param.path.replace("/body/", ""), ); - expect(fields.includes("fake")).toBeTrue(); + expect(fields?.includes("fake")).toBeTrue(); } }); diff --git a/packages/cactus-plugin-ledger-connector-cdl/src/main/typescript/cdl-gateway.ts b/packages/cactus-plugin-ledger-connector-cdl/src/main/typescript/cdl-gateway.ts index 8007464f3a..628c1ce812 100644 --- a/packages/cactus-plugin-ledger-connector-cdl/src/main/typescript/cdl-gateway.ts +++ b/packages/cactus-plugin-ledger-connector-cdl/src/main/typescript/cdl-gateway.ts @@ -117,10 +117,9 @@ export class CDLGateway { return requestResponse.data; } catch (error) { - if ("toJSON" in error) { + if (error instanceof Date) { this.log.error("CDL API request failed:", error.toJSON()); } - throw error; } } diff --git a/packages/cactus-plugin-ledger-connector-cdl/src/main/typescript/web-services/get-lineage-v1-endpoint.ts b/packages/cactus-plugin-ledger-connector-cdl/src/main/typescript/web-services/get-lineage-v1-endpoint.ts index d511a572fb..2a4ee2a392 100644 --- a/packages/cactus-plugin-ledger-connector-cdl/src/main/typescript/web-services/get-lineage-v1-endpoint.ts +++ b/packages/cactus-plugin-ledger-connector-cdl/src/main/typescript/web-services/get-lineage-v1-endpoint.ts @@ -12,10 +12,12 @@ import { LogLevelDesc, LoggerProvider, IAsyncProvider, - safeStringifyException, } from "@hyperledger/cactus-common"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { PluginLedgerConnectorCDL } from "../plugin-ledger-connector-cdl"; import OAS from "../../json/openapi.json"; @@ -89,11 +91,8 @@ export class GetLineageDataEndpoint implements IWebServiceEndpoint { res.status(200).json(await this.options.connector.getLineage(req.body)); } catch (ex) { this.log.error(`Crash while serving ${reqTag}`, ex); - - res.status(500).json({ - message: "Internal Server Error", - error: safeStringifyException(ex), - }); + const errorMsg = "Internal Server Error"; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-ledger-connector-cdl/src/main/typescript/web-services/register-history-data-v1-endpoint.ts b/packages/cactus-plugin-ledger-connector-cdl/src/main/typescript/web-services/register-history-data-v1-endpoint.ts index 81155dc4e2..0dc88a3b9c 100644 --- a/packages/cactus-plugin-ledger-connector-cdl/src/main/typescript/web-services/register-history-data-v1-endpoint.ts +++ b/packages/cactus-plugin-ledger-connector-cdl/src/main/typescript/web-services/register-history-data-v1-endpoint.ts @@ -12,10 +12,12 @@ import { LogLevelDesc, LoggerProvider, IAsyncProvider, - safeStringifyException, } from "@hyperledger/cactus-common"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { PluginLedgerConnectorCDL } from "../plugin-ledger-connector-cdl"; import OAS from "../../json/openapi.json"; @@ -92,10 +94,8 @@ export class RegisterHistoryDataEndpoint implements IWebServiceEndpoint { } catch (ex) { this.log.error(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: safeStringifyException(ex), - }); + const errorMsg = "Internal Server Error"; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-ledger-connector-cdl/src/main/typescript/web-services/search-lineage-by-globaldata-v1-endpoint.ts b/packages/cactus-plugin-ledger-connector-cdl/src/main/typescript/web-services/search-lineage-by-globaldata-v1-endpoint.ts index 1e6d7e7e8c..f360b3cce0 100644 --- a/packages/cactus-plugin-ledger-connector-cdl/src/main/typescript/web-services/search-lineage-by-globaldata-v1-endpoint.ts +++ b/packages/cactus-plugin-ledger-connector-cdl/src/main/typescript/web-services/search-lineage-by-globaldata-v1-endpoint.ts @@ -12,10 +12,12 @@ import { LogLevelDesc, LoggerProvider, IAsyncProvider, - safeStringifyException, } from "@hyperledger/cactus-common"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { PluginLedgerConnectorCDL } from "../plugin-ledger-connector-cdl"; import OAS from "../../json/openapi.json"; @@ -92,10 +94,8 @@ export class SearchLineageByGlobalDataEndpoint implements IWebServiceEndpoint { } catch (ex) { this.log.error(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: safeStringifyException(ex), - }); + const errorMsg = "Internal Server Error"; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-ledger-connector-cdl/src/main/typescript/web-services/search-lineage-by-header-v1-endpoint.ts b/packages/cactus-plugin-ledger-connector-cdl/src/main/typescript/web-services/search-lineage-by-header-v1-endpoint.ts index 31f8de6948..13c7667c4a 100644 --- a/packages/cactus-plugin-ledger-connector-cdl/src/main/typescript/web-services/search-lineage-by-header-v1-endpoint.ts +++ b/packages/cactus-plugin-ledger-connector-cdl/src/main/typescript/web-services/search-lineage-by-header-v1-endpoint.ts @@ -12,10 +12,12 @@ import { LogLevelDesc, LoggerProvider, IAsyncProvider, - safeStringifyException, } from "@hyperledger/cactus-common"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { PluginLedgerConnectorCDL } from "../plugin-ledger-connector-cdl"; import OAS from "../../json/openapi.json"; @@ -91,11 +93,8 @@ export class SearchLineageByHeaderEndpoint implements IWebServiceEndpoint { .json(await this.options.connector.searchLineageByHeader(req.body)); } catch (ex) { this.log.error(`Crash while serving ${reqTag}`, ex); - - res.status(500).json({ - message: "Internal Server Error", - error: safeStringifyException(ex), - }); + const errorMsg = "Internal Server Error"; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-ledger-connector-corda/src/main/typescript/web-services/deploy-contract-jars-endpoint.ts b/packages/cactus-plugin-ledger-connector-corda/src/main/typescript/web-services/deploy-contract-jars-endpoint.ts index 43872ff69f..7c6845e7d0 100644 --- a/packages/cactus-plugin-ledger-connector-corda/src/main/typescript/web-services/deploy-contract-jars-endpoint.ts +++ b/packages/cactus-plugin-ledger-connector-corda/src/main/typescript/web-services/deploy-contract-jars-endpoint.ts @@ -9,6 +9,7 @@ import { import { AuthorizationOptionsProvider, + handleRestEndpointException, registerWebServiceEndpoint, } from "@hyperledger/cactus-core"; @@ -133,12 +134,20 @@ export class DeployContractJarsEndpoint implements IWebServiceEndpoint { res.json(body); } catch (ex) { this.log.error(`${fnTag} failed to serve request`, ex); - res.status(500); - res.json({ - error: ex?.message, - // FIXME do not include stack trace - errorStack: ex?.stack, - }); + if ( + typeof ex === "object" && + ex !== null && + "message" in ex && + typeof ex.message === "string" + ) { + const errorMsg = ex.message; + handleRestEndpointException({ + errorMsg, + log: this.log, + error: ex, + res, + }); + } } } diff --git a/packages/cactus-plugin-ledger-connector-corda/src/main/typescript/web-services/diagnose-node-endpoint-v1.ts b/packages/cactus-plugin-ledger-connector-corda/src/main/typescript/web-services/diagnose-node-endpoint-v1.ts index 932b8750cc..757d2de944 100644 --- a/packages/cactus-plugin-ledger-connector-corda/src/main/typescript/web-services/diagnose-node-endpoint-v1.ts +++ b/packages/cactus-plugin-ledger-connector-corda/src/main/typescript/web-services/diagnose-node-endpoint-v1.ts @@ -17,7 +17,10 @@ import { import OAS from "../../json/openapi.json"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { DefaultApi, DiagnoseNodeV1Request, @@ -97,9 +100,20 @@ export class DiagnoseNodeEndpointV1 implements IWebServiceEndpoint { res.send(resBody); } catch (ex) { this.log.error(`${fnTag} failed to serve request`, ex); - res.status(500); - res.statusMessage = ex.message; - res.json({ error: ex.stack }); + if ( + typeof ex === "object" && + ex !== null && + "message" in ex && + typeof ex.message === "string" + ) { + const errorMsg = ex.message; + handleRestEndpointException({ + errorMsg, + log: this.log, + error: ex, + res, + }); + } } } diff --git a/packages/cactus-plugin-ledger-connector-corda/src/main/typescript/web-services/get-prometheus-exporter-metrics-endpoint-v1.ts b/packages/cactus-plugin-ledger-connector-corda/src/main/typescript/web-services/get-prometheus-exporter-metrics-endpoint-v1.ts index 90447712c7..fe6c2837df 100644 --- a/packages/cactus-plugin-ledger-connector-corda/src/main/typescript/web-services/get-prometheus-exporter-metrics-endpoint-v1.ts +++ b/packages/cactus-plugin-ledger-connector-corda/src/main/typescript/web-services/get-prometheus-exporter-metrics-endpoint-v1.ts @@ -16,7 +16,10 @@ import { import OAS from "../../json/openapi.json"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { PluginLedgerConnectorCorda } from "../plugin-ledger-connector-corda"; @@ -94,9 +97,20 @@ export class GetPrometheusExporterMetricsEndpointV1 res.send(resBody); } catch (ex) { this.log.error(`${fnTag} failed to serve request`, ex); - res.status(500); - res.statusMessage = ex.message; - res.json({ error: ex.stack }); + if ( + typeof ex === "object" && + ex !== null && + "message" in ex && + typeof ex.message === "string" + ) { + const errorMsg = ex.message; + handleRestEndpointException({ + errorMsg, + log: this.log, + error: ex, + res, + }); + } } } } diff --git a/packages/cactus-plugin-ledger-connector-corda/src/main/typescript/web-services/invoke-contract-endpoint-v1.ts b/packages/cactus-plugin-ledger-connector-corda/src/main/typescript/web-services/invoke-contract-endpoint-v1.ts index 1673eb89db..963d1b6d98 100644 --- a/packages/cactus-plugin-ledger-connector-corda/src/main/typescript/web-services/invoke-contract-endpoint-v1.ts +++ b/packages/cactus-plugin-ledger-connector-corda/src/main/typescript/web-services/invoke-contract-endpoint-v1.ts @@ -17,7 +17,10 @@ import { import OAS from "../../json/openapi.json"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { DefaultApi, InvokeContractV1Request, @@ -97,9 +100,20 @@ export class InvokeContractEndpointV1 implements IWebServiceEndpoint { res.send(resBody); } catch (ex) { this.log.error(`${fnTag} failed to serve request`, ex); - res.status(500); - res.statusMessage = ex.message; - res.json({ error: ex.stack }); + if ( + typeof ex === "object" && + ex !== null && + "message" in ex && + typeof ex.message === "string" + ) { + const errorMsg = ex.message; + handleRestEndpointException({ + errorMsg, + log: this.log, + error: ex, + res, + }); + } } } diff --git a/packages/cactus-plugin-ledger-connector-corda/src/main/typescript/web-services/list-flows-endpoint-v1.ts b/packages/cactus-plugin-ledger-connector-corda/src/main/typescript/web-services/list-flows-endpoint-v1.ts index 87de9a8520..68abe024ac 100644 --- a/packages/cactus-plugin-ledger-connector-corda/src/main/typescript/web-services/list-flows-endpoint-v1.ts +++ b/packages/cactus-plugin-ledger-connector-corda/src/main/typescript/web-services/list-flows-endpoint-v1.ts @@ -17,7 +17,10 @@ import { import OAS from "../../json/openapi.json"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { DefaultApi, ListFlowsV1Request, @@ -102,9 +105,20 @@ export class ListFlowsEndpointV1 implements IWebServiceEndpoint { res.send(resBody); } catch (ex) { this.log.error(`${fnTag} failed to serve request`, ex); - res.status(500); - res.statusMessage = ex.message; - res.json({ error: ex.stack }); + if ( + typeof ex === "object" && + ex !== null && + "message" in ex && + typeof ex.message === "string" + ) { + const errorMsg = ex.message; + handleRestEndpointException({ + errorMsg, + log: this.log, + error: ex, + res, + }); + } } } diff --git a/packages/cactus-plugin-ledger-connector-corda/src/main/typescript/web-services/network-map-endpoint-v1.ts b/packages/cactus-plugin-ledger-connector-corda/src/main/typescript/web-services/network-map-endpoint-v1.ts index 9ec95ec971..8dd887804e 100644 --- a/packages/cactus-plugin-ledger-connector-corda/src/main/typescript/web-services/network-map-endpoint-v1.ts +++ b/packages/cactus-plugin-ledger-connector-corda/src/main/typescript/web-services/network-map-endpoint-v1.ts @@ -17,7 +17,10 @@ import { import OAS from "../../json/openapi.json"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { DefaultApi, NodeInfo } from "../generated/openapi/typescript-axios"; export interface INetworkMapEndpointV1Options { @@ -93,9 +96,20 @@ export class NetworkMapEndpointV1 implements IWebServiceEndpoint { res.send(resBody); } catch (ex) { this.log.error(`${fnTag} failed to serve request`, ex); - res.status(500); - res.statusMessage = ex.message; - res.json({ error: ex.stack }); + if ( + typeof ex === "object" && + ex !== null && + "message" in ex && + typeof ex.message === "string" + ) { + const errorMsg = ex.message; + handleRestEndpointException({ + errorMsg, + log: this.log, + error: ex, + res, + }); + } } } diff --git a/packages/cactus-plugin-ledger-connector-corda/src/test/typescript/integration/openapi/openapi-validation.test.ts b/packages/cactus-plugin-ledger-connector-corda/src/test/typescript/integration/openapi/openapi-validation.test.ts index e672fe640e..3649aa422b 100644 --- a/packages/cactus-plugin-ledger-connector-corda/src/test/typescript/integration/openapi/openapi-validation.test.ts +++ b/packages/cactus-plugin-ledger-connector-corda/src/test/typescript/integration/openapi/openapi-validation.test.ts @@ -24,6 +24,7 @@ import { PublicKey, } from "../../../../main/typescript/generated/openapi/typescript-axios/index"; import { Configuration } from "@hyperledger/cactus-core-api"; +import { AxiosError } from "axios"; const testCase = "openapi validation on corda JVM implementation"; const logLevel: LogLevelDesc = "TRACE"; @@ -434,8 +435,10 @@ test(testCase, async (t: Test) => { await apiClient.deployContractJarsV1(depReq); t2.fail(`${fDeploy} - ${cWithoutParams}: should fail`); } catch (e) { + const err = e as AxiosError<{ status: number }>; + t2.equal( - e.response?.data?.status, + err.response?.data?.status, 400, "Deploy contract response status code === 400 OK", ); @@ -453,8 +456,10 @@ test(testCase, async (t: Test) => { await apiClient.invokeContractV1(req); t2.fail(`${fInvoke} - ${cWithoutParams}: should fail`); } catch (e) { + const err = e as AxiosError<{ status: number }>; + t2.equal( - e.response?.data?.status, + err.response?.data?.status, 400, "Invoke contract response status code === 400 OK", ); @@ -472,8 +477,10 @@ test(testCase, async (t: Test) => { await apiClient.deployContractJarsV1(depReq); t2.fail(`${fDeploy} - ${cInvalidParams}: should fail`); } catch (e) { + const err = e as AxiosError<{ status: number }>; + t2.equal( - e.response?.data?.status, + err.response?.data?.status, 400, "Deploy contract response status code === 400 OK", ); @@ -487,8 +494,10 @@ test(testCase, async (t: Test) => { await apiClient.listFlowsV1(req); t2.fail(`${fFlows} - ${cInvalidParams}: should fail`); } catch (e) { + const err = e as AxiosError<{ status: number }>; + t2.equal( - e.response?.data?.status, + err.response?.data?.status, 400, "List flows response status code === 400 OK", ); @@ -502,8 +511,10 @@ test(testCase, async (t: Test) => { await apiClient.diagnoseNodeV1(req); t2.fail(`${fDiagnose} - ${cInvalidParams}: should fail`); } catch (e) { + const err = e as AxiosError<{ status: number }>; + t2.equal( - e.response?.data?.status, + err.response?.data?.status, 400, "Diagnose node response status code === 400 OK", ); @@ -756,8 +767,10 @@ test(testCase, async (t: Test) => { await apiClient.invokeContractV1(req); t2.fail(`${fInvoke} - ${cInvalidParams}: should fail`); } catch (e) { + const err = e as AxiosError<{ status: number }>; + t2.equal( - e.response?.data?.status, + err.response?.data?.status, 400, "Invoke contract response status code === 400 OK", ); diff --git a/packages/cactus-plugin-ledger-connector-ethereum/src/main/typescript/plugin-ledger-connector-ethereum.ts b/packages/cactus-plugin-ledger-connector-ethereum/src/main/typescript/plugin-ledger-connector-ethereum.ts index 551baf07fb..1e434bf8ed 100644 --- a/packages/cactus-plugin-ledger-connector-ethereum/src/main/typescript/plugin-ledger-connector-ethereum.ts +++ b/packages/cactus-plugin-ledger-connector-ethereum/src/main/typescript/plugin-ledger-connector-ethereum.ts @@ -799,10 +799,17 @@ export class PluginLedgerConnectorEthereum }, }; } catch (ex) { - throw new Error( - `${fnTag} Failed to invoke web3.eth.personal.sendTransaction(). ` + - `InnerException: ${ex.stack}`, - ); + if (ex instanceof Error) { + throw new Error( + `${fnTag} Failed to invoke web3.eth.personal.sendTransaction(). ` + + `InnerException: ${ex.stack}`, + ); + } else { + throw new Error( + `${fnTag} Failed to invoke web3.eth.personal.sendTransaction(). ` + + `Error: ${ex}`, + ); + } } } diff --git a/packages/cactus-plugin-ledger-connector-ethereum/src/main/typescript/web-services/get-prometheus-exporter-metrics-v1-endpoint.ts b/packages/cactus-plugin-ledger-connector-ethereum/src/main/typescript/web-services/get-prometheus-exporter-metrics-v1-endpoint.ts index 34135a99e6..bad03c05d6 100644 --- a/packages/cactus-plugin-ledger-connector-ethereum/src/main/typescript/web-services/get-prometheus-exporter-metrics-v1-endpoint.ts +++ b/packages/cactus-plugin-ledger-connector-ethereum/src/main/typescript/web-services/get-prometheus-exporter-metrics-v1-endpoint.ts @@ -1,6 +1,9 @@ import { Express, Request, Response } from "express"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import OAS from "../../json/openapi.json"; @@ -16,7 +19,6 @@ import { LoggerProvider, Checks, IAsyncProvider, - safeStringifyException, } from "@hyperledger/cactus-common"; import { PluginLedgerConnectorEthereum } from "../plugin-ledger-connector-ethereum"; @@ -85,6 +87,7 @@ export class GetPrometheusExporterMetricsEndpointV1 async handleRequest(req: Request, res: Response): Promise { const fnTag = "GetPrometheusExporterMetrics#handleRequest()"; + const reqTag = `${this.getVerbLowerCase()} - ${this.getPath()}`; const verbUpper = this.getVerbLowerCase().toUpperCase(); this.log.debug(`${verbUpper} ${this.getPath()}`); @@ -93,10 +96,22 @@ export class GetPrometheusExporterMetricsEndpointV1 .status(200) .send(await this.options.connector.getPrometheusExporterMetrics()); } catch (ex) { - this.log.error(`Crash while serving ${fnTag}`, ex); - res.status(500); - res.statusMessage = ex.message; - res.json({ error: safeStringifyException(ex) }); + if ( + typeof ex === "object" && + ex !== null && + "message" in ex && + typeof ex.message === "string" + ) { + this.log.error(`Crash while serving ${reqTag} in ${fnTag}`, ex); + const errorMsg = ex.message; + + handleRestEndpointException({ + errorMsg, + log: this.log, + error: ex, + res, + }); + } } } } diff --git a/packages/cactus-plugin-ledger-connector-fabric/src/main/typescript/deploy-contract-go-source/deploy-contract-go-source-endpoint-v1.ts b/packages/cactus-plugin-ledger-connector-fabric/src/main/typescript/deploy-contract-go-source/deploy-contract-go-source-endpoint-v1.ts index f327b6cef6..9c78b36ddf 100644 --- a/packages/cactus-plugin-ledger-connector-fabric/src/main/typescript/deploy-contract-go-source/deploy-contract-go-source-endpoint-v1.ts +++ b/packages/cactus-plugin-ledger-connector-fabric/src/main/typescript/deploy-contract-go-source/deploy-contract-go-source-endpoint-v1.ts @@ -8,6 +8,7 @@ import { LogLevelDesc, LoggerProvider, IAsyncProvider, + safeStringifyException, } from "@hyperledger/cactus-common"; import { @@ -117,9 +118,10 @@ export class DeployContractGoSourceEndpointV1 implements IWebServiceEndpoint { res.json(resBody); } catch (ex) { this.log.error(`${fnTag} failed to serve contract deploy request`, ex); - res.status(HttpStatus.INTERNAL_SERVER_ERROR); - res.statusMessage = ex.message; - res.json({ error: ex.stack }); + res.status(HttpStatus.INTERNAL_SERVER_ERROR).json({ + message: "Internal Server Error", + error: safeStringifyException(ex), + }); } } } diff --git a/packages/cactus-plugin-ledger-connector-fabric/src/main/typescript/deploy-contract/deploy-contract-endpoint-v1.ts b/packages/cactus-plugin-ledger-connector-fabric/src/main/typescript/deploy-contract/deploy-contract-endpoint-v1.ts index 55a8d5d4d7..4a0fc3869e 100644 --- a/packages/cactus-plugin-ledger-connector-fabric/src/main/typescript/deploy-contract/deploy-contract-endpoint-v1.ts +++ b/packages/cactus-plugin-ledger-connector-fabric/src/main/typescript/deploy-contract/deploy-contract-endpoint-v1.ts @@ -15,7 +15,10 @@ import { IEndpointAuthzOptions, } from "@hyperledger/cactus-core-api"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { PluginLedgerConnectorFabric } from "../plugin-ledger-connector-fabric"; import { DeployContractV1Request } from "../generated/openapi/typescript-axios/index"; @@ -97,9 +100,13 @@ export class DeployContractEndpointV1 implements IWebServiceEndpoint { res.json(resBody); } catch (ex) { this.log.error(`${fnTag} failed to serve contract deploy request`, ex); - res.status(HttpStatus.INTERNAL_SERVER_ERROR); - res.statusMessage = ex.message; - res.json({ error: ex.stack }); + const errorMsg = `Internal server Error`; + handleRestEndpointException({ + errorMsg, + log: this.log, + error: ex, + res, + }); } } } diff --git a/packages/cactus-plugin-ledger-connector-fabric/src/main/typescript/get-block/get-block-endpoint-v1.ts b/packages/cactus-plugin-ledger-connector-fabric/src/main/typescript/get-block/get-block-endpoint-v1.ts index 763ed05573..de9a9cdb4e 100644 --- a/packages/cactus-plugin-ledger-connector-fabric/src/main/typescript/get-block/get-block-endpoint-v1.ts +++ b/packages/cactus-plugin-ledger-connector-fabric/src/main/typescript/get-block/get-block-endpoint-v1.ts @@ -6,7 +6,6 @@ import { LogLevelDesc, Checks, IAsyncProvider, - safeStringifyException, } from "@hyperledger/cactus-common"; import { @@ -15,7 +14,10 @@ import { IEndpointAuthzOptions, } from "@hyperledger/cactus-core-api"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { PluginLedgerConnectorFabric } from "../plugin-ledger-connector-fabric"; import OAS from "../../json/openapi.json"; @@ -87,12 +89,10 @@ export class GetBlockEndpointV1 implements IWebServiceEndpoint { try { res.status(200).send(await this.opts.connector.getBlock(req.body)); - } catch (error) { - this.log.error(`Crash while serving ${fnTag}`, error); - res.status(500).json({ - message: "Internal Server Error", - error: safeStringifyException(error), - }); + } catch (ex) { + this.log.error(`Crash while serving ${fnTag}`, ex); + const errorMsg = "Internal Server Error"; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-ledger-connector-fabric/src/main/typescript/get-prometheus-exporter-metrics/get-prometheus-exporter-metrics-endpoint-v1.ts b/packages/cactus-plugin-ledger-connector-fabric/src/main/typescript/get-prometheus-exporter-metrics/get-prometheus-exporter-metrics-endpoint-v1.ts index 4886332e7e..2fd6b45bd0 100644 --- a/packages/cactus-plugin-ledger-connector-fabric/src/main/typescript/get-prometheus-exporter-metrics/get-prometheus-exporter-metrics-endpoint-v1.ts +++ b/packages/cactus-plugin-ledger-connector-fabric/src/main/typescript/get-prometheus-exporter-metrics/get-prometheus-exporter-metrics-endpoint-v1.ts @@ -16,7 +16,10 @@ import { import OAS from "../../json/openapi.json"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { PluginLedgerConnectorFabric } from "../plugin-ledger-connector-fabric"; @@ -93,9 +96,8 @@ export class GetPrometheusExporterMetricsEndpointV1 res.send(resBody); } catch (ex) { this.log.error(`${fnTag} failed to serve request`, ex); - res.status(500); - res.statusMessage = ex.message; - res.json({ error: ex.stack }); + const errorMsg = "Internal Server Error"; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-ledger-connector-fabric/src/main/typescript/get-transaction-receipt/get-transaction-receipt-by-txid-endpoint-v1.ts b/packages/cactus-plugin-ledger-connector-fabric/src/main/typescript/get-transaction-receipt/get-transaction-receipt-by-txid-endpoint-v1.ts index 7f05408ea4..57d002121b 100644 --- a/packages/cactus-plugin-ledger-connector-fabric/src/main/typescript/get-transaction-receipt/get-transaction-receipt-by-txid-endpoint-v1.ts +++ b/packages/cactus-plugin-ledger-connector-fabric/src/main/typescript/get-transaction-receipt/get-transaction-receipt-by-txid-endpoint-v1.ts @@ -14,7 +14,10 @@ import { IEndpointAuthzOptions, } from "@hyperledger/cactus-core-api"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { PluginLedgerConnectorFabric } from "../plugin-ledger-connector-fabric"; import { RunTransactionRequest } from "../generated/openapi/typescript-axios"; @@ -95,9 +98,8 @@ export class GetTransactionReceiptByTxIDEndpointV1 res.json(resBody); } catch (ex) { this.log.error(`${fnTag} failed to serve request`, ex); - res.status(500); - res.statusMessage = ex.message; - res.json({ error: ex.stack }); + const errorMsg = "Internal Server Error"; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-ledger-connector-fabric/src/main/typescript/plugin-ledger-connector-fabric.ts b/packages/cactus-plugin-ledger-connector-fabric/src/main/typescript/plugin-ledger-connector-fabric.ts index 6302c3ad85..1bb403ab0f 100644 --- a/packages/cactus-plugin-ledger-connector-fabric/src/main/typescript/plugin-ledger-connector-fabric.ts +++ b/packages/cactus-plugin-ledger-connector-fabric/src/main/typescript/plugin-ledger-connector-fabric.ts @@ -1115,7 +1115,16 @@ export class PluginLedgerConnectorFabric } } catch (ex) { this.log.error(`Building transient map crashed: `, ex); - throw new Error(`Unable to build the transient map: ${ex.message}`); + if ( + typeof ex === "object" && + ex !== null && + "message" in ex && + typeof ex.message === "string" + ) { + throw new Error(`Unable to build the transient map: ${ex.message}`); + } else { + throw new Error(`Unable to build the transient map. Error: ${ex}`); + } } return transientMap; @@ -1216,8 +1225,13 @@ export class PluginLedgerConnectorFabric return res; } catch (ex) { - this.log.error(`transact() crashed: `, ex); - throw new Error(`${fnTag} Unable to run transaction: ${ex.message}`); + this.log.error(`enrollAdmin() Failure:`, ex); + + if (ex instanceof Error) { + throw new Error(`${fnTag} Inner Exception: ${ex?.message}`); + } else { + throw new Error(`${fnTag} Exception: ${ex}`); + } } } @@ -1254,7 +1268,12 @@ export class PluginLedgerConnectorFabric return new FabricCAServices(caUrl, tlsOptions, caName); } catch (ex) { this.log.error(`createCaClient() Failure:`, ex); - throw new Error(`${fnTag} Inner Exception: ${ex?.message}`); + + if (ex instanceof Error) { + throw new Error(`${fnTag} Inner Exception: ${ex?.message}`); + } else { + throw new Error(`${fnTag} Exception: ${ex}`); + } } } @@ -1290,7 +1309,11 @@ export class PluginLedgerConnectorFabric return [x509Identity, wallet]; } catch (ex) { this.log.error(`enrollAdmin() Failure:`, ex); - throw new Error(`${fnTag} Exception: ${ex?.message}`); + if (ex instanceof Error) { + throw new Error(`${fnTag} Inner Exception: ${ex?.message}`); + } else { + throw new Error(`${fnTag} Exception: ${ex}`); + } } } /** diff --git a/packages/cactus-plugin-ledger-connector-fabric/src/main/typescript/run-transaction/run-delegated-sign-transaction-endpoint-v1.ts b/packages/cactus-plugin-ledger-connector-fabric/src/main/typescript/run-transaction/run-delegated-sign-transaction-endpoint-v1.ts index 257150c2e3..d2cd9c883c 100644 --- a/packages/cactus-plugin-ledger-connector-fabric/src/main/typescript/run-transaction/run-delegated-sign-transaction-endpoint-v1.ts +++ b/packages/cactus-plugin-ledger-connector-fabric/src/main/typescript/run-transaction/run-delegated-sign-transaction-endpoint-v1.ts @@ -6,7 +6,6 @@ import { LogLevelDesc, Checks, IAsyncProvider, - safeStringifyException, } from "@hyperledger/cactus-common"; import { @@ -15,7 +14,10 @@ import { IEndpointAuthzOptions, } from "@hyperledger/cactus-core-api"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { PluginLedgerConnectorFabric } from "../plugin-ledger-connector-fabric"; import OAS from "../../json/openapi.json"; @@ -91,12 +93,10 @@ export class RunDelegatedSignTransactionEndpointV1 res .status(200) .json(await this.opts.connector.transactDelegatedSign(req.body)); - } catch (error) { + } catch (ex) { this.log.error(`Crash while serving ${fnTag}`, error); - res.status(500).json({ - message: "Internal Server Error", - error: safeStringifyException(error), - }); + const errorMsg = "Internal Server Error"; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-ledger-connector-fabric/src/main/typescript/run-transaction/run-transaction-endpoint-v1.ts b/packages/cactus-plugin-ledger-connector-fabric/src/main/typescript/run-transaction/run-transaction-endpoint-v1.ts index 38173ef24d..c611b82887 100644 --- a/packages/cactus-plugin-ledger-connector-fabric/src/main/typescript/run-transaction/run-transaction-endpoint-v1.ts +++ b/packages/cactus-plugin-ledger-connector-fabric/src/main/typescript/run-transaction/run-transaction-endpoint-v1.ts @@ -6,7 +6,6 @@ import { LogLevelDesc, Checks, IAsyncProvider, - safeStringifyException, } from "@hyperledger/cactus-common"; import { @@ -15,7 +14,10 @@ import { IEndpointAuthzOptions, } from "@hyperledger/cactus-core-api"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { PluginLedgerConnectorFabric } from "../plugin-ledger-connector-fabric"; import OAS from "../../json/openapi.json"; @@ -85,12 +87,10 @@ export class RunTransactionEndpointV1 implements IWebServiceEndpoint { try { res.status(200).json(await this.opts.connector.transact(req.body)); - } catch (error) { + } catch (ex) { this.log.error(`Crash while serving ${fnTag}`, error); - res.status(500).json({ - message: "Internal Server Error", - error: safeStringifyException(error), - }); + const errorMsg = "Internal Server Error"; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-ledger-connector-fabric/src/test/typescript/integration/openapi/openapi-validation-go.test.ts b/packages/cactus-plugin-ledger-connector-fabric/src/test/typescript/integration/openapi/openapi-validation-go.test.ts index 365ae19f18..6ed4ddb048 100644 --- a/packages/cactus-plugin-ledger-connector-fabric/src/test/typescript/integration/openapi/openapi-validation-go.test.ts +++ b/packages/cactus-plugin-ledger-connector-fabric/src/test/typescript/integration/openapi/openapi-validation-go.test.ts @@ -32,6 +32,7 @@ import { Configuration } from "@hyperledger/cactus-core-api"; import { installOpenapiValidationMiddleware } from "@hyperledger/cactus-core"; import OAS from "../../../../main/json/openapi.json"; +import { AxiosError } from "axios"; const testCase = "check openapi validation in fabric endpoints"; const logLevel: LogLevelDesc = "TRACE"; @@ -228,17 +229,18 @@ test(testCase, async (t: Test) => { await apiClient.deployContractGoSourceV1( parameters as any as DeployContractGoSourceV1Request, ); - } catch (e) { + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; t2.equal( - e.response.status, + e?.response?.status, 400, `Endpoint ${fDeployGo} without required targetPeerAddresses: response.status === 400 OK`, ); - const fields = e.response.data.map((param: any) => + const fields = e.response?.data.map((param: any) => param.path.replace("/body/", ""), ); t2.ok( - fields.includes("targetPeerAddresses"), + fields?.includes("targetPeerAddresses"), "Rejected because targetPeerAddresses is required", ); } @@ -290,17 +292,18 @@ test(testCase, async (t: Test) => { await apiClient.deployContractGoSourceV1( parameters as any as DeployContractGoSourceV1Request, ); - } catch (e) { + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; t2.equal( - e.response.status, + e?.response?.status, 400, `Endpoint ${fDeployGo} with fake=4: response.status === 400 OK`, ); - const fields = e.response.data.map((param: any) => + const fields = e?.response?.data.map((param: any) => param.path.replace("/body/", ""), ); t2.ok( - fields.includes("fake"), + fields?.includes("fake"), "Rejected because fake is not a valid parameter", ); } diff --git a/packages/cactus-plugin-ledger-connector-fabric/src/test/typescript/integration/openapi/openapi-validation.test.ts b/packages/cactus-plugin-ledger-connector-fabric/src/test/typescript/integration/openapi/openapi-validation.test.ts index f1006ecd74..ec36ae2469 100644 --- a/packages/cactus-plugin-ledger-connector-fabric/src/test/typescript/integration/openapi/openapi-validation.test.ts +++ b/packages/cactus-plugin-ledger-connector-fabric/src/test/typescript/integration/openapi/openapi-validation.test.ts @@ -39,6 +39,7 @@ import { Configuration } from "@hyperledger/cactus-core-api"; import { installOpenapiValidationMiddleware } from "@hyperledger/cactus-core"; import OAS from "../../../../main/json/openapi.json"; +import { AxiosError } from "axios"; const testCase = "deploys Fabric V2.5.6 contract from typescript source"; const logLevel: LogLevelDesc = "INFO"; @@ -290,17 +291,18 @@ test(testCase, async (t: Test) => { await apiClient.deployContractV1( parameters as unknown as DeployContractV1Request, ); - } catch (e) { + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; t2.equal( - e.response.status, + e?.response?.status, 400, `Endpoint ${fDeploy} without required channelId: response.status === 400 OK`, ); - const fields = e.response.data.map((param: any) => + const fields = e?.response?.data.map((param: any) => param.path.replace("/body/", ""), ); t2.ok( - fields.includes("channelId"), + fields?.includes("channelId"), "Rejected because channelId is required", ); } @@ -331,17 +333,18 @@ test(testCase, async (t: Test) => { try { await apiClient.deployContractV1(parameters as DeployContractV1Request); - } catch (e) { + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; t2.equal( - e.response.status, + e?.response?.status, 400, `Endpoint ${fDeploy} with fake=4: response.status === 400 OK`, ); - const fields = e.response.data.map((param: any) => + const fields = e?.response?.data.map((param: any) => param.path.replace("/body/", ""), ); t2.ok( - fields.includes("fake"), + fields?.includes("fake"), "Rejected because fake is not a valid parameter", ); } @@ -391,17 +394,18 @@ test(testCase, async (t: Test) => { try { await apiClient.runTransactionV1(parameters as RunTransactionRequest); - } catch (e) { + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; t2.equal( - e.response.status, + e?.response?.status, 400, `Endpoint ${fRun} without required contractName: response.status === 400 OK`, ); - const fields = e.response.data.map((param: any) => + const fields = e?.response?.data.map((param: any) => param.path.replace("/body/", ""), ); t2.ok( - fields.includes("contractName"), + fields?.includes("contractName"), "Rejected because contractName is required", ); } @@ -428,17 +432,18 @@ test(testCase, async (t: Test) => { try { await apiClient.runTransactionV1(parameters as RunTransactionRequest); - } catch (e) { + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; t2.equal( - e.response.status, + e?.response?.status, 400, `Endpoint ${fRun} with fake=4: response.status === 400 OK`, ); - const fields = e.response.data.map((param: any) => + const fields = e?.response?.data.map((param: any) => param.path.replace("/body/", ""), ); t2.ok( - fields.includes("fake"), + fields?.includes("fake"), "Rejected because fake is not a valid parameter", ); } diff --git a/packages/cactus-plugin-ledger-connector-iroha2/src/main/typescript/web-services/generate-transaction-v1-endpoint.ts b/packages/cactus-plugin-ledger-connector-iroha2/src/main/typescript/web-services/generate-transaction-v1-endpoint.ts index 0e374cdab0..fc08a12bb5 100644 --- a/packages/cactus-plugin-ledger-connector-iroha2/src/main/typescript/web-services/generate-transaction-v1-endpoint.ts +++ b/packages/cactus-plugin-ledger-connector-iroha2/src/main/typescript/web-services/generate-transaction-v1-endpoint.ts @@ -16,10 +16,12 @@ import { IExpressRequestHandler, IWebServiceEndpoint, } from "@hyperledger/cactus-core-api"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { PluginLedgerConnectorIroha2 } from "../plugin-ledger-connector-iroha2"; -import { safeStringifyException } from "../utils"; import OAS from "../../json/openapi.json"; @@ -29,8 +31,7 @@ export interface IGenerateTransactionOptions { } export class Iroha2GenerateTransactionEndpointV1 - implements IWebServiceEndpoint -{ + implements IWebServiceEndpoint { public static readonly CLASS_NAME = "GenerateTransaction"; private readonly log: Logger; @@ -101,10 +102,8 @@ export class Iroha2GenerateTransactionEndpointV1 res.send(txPayload); } catch (ex) { this.log.warn(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: safeStringifyException(ex), - }); + const errorMsg = "Internal Server Error"; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-ledger-connector-iroha2/src/main/typescript/web-services/transact-v1-endpoint.ts b/packages/cactus-plugin-ledger-connector-iroha2/src/main/typescript/web-services/transact-v1-endpoint.ts index 6066495d46..41f7f98680 100644 --- a/packages/cactus-plugin-ledger-connector-iroha2/src/main/typescript/web-services/transact-v1-endpoint.ts +++ b/packages/cactus-plugin-ledger-connector-iroha2/src/main/typescript/web-services/transact-v1-endpoint.ts @@ -16,10 +16,12 @@ import { IExpressRequestHandler, IWebServiceEndpoint, } from "@hyperledger/cactus-core-api"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { PluginLedgerConnectorIroha2 } from "../plugin-ledger-connector-iroha2"; -import { safeStringifyException } from "../utils"; import OAS from "../../json/openapi.json"; @@ -97,10 +99,8 @@ export class Iroha2TransactEndpointV1 implements IWebServiceEndpoint { res.json(resBody); } catch (ex) { this.log.warn(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: safeStringifyException(ex), - }); + const errorMsg = "Internal Server Error"; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-ledger-connector-iroha2/src/test/typescript/integration/iroha2-generate-and-send-signed-transaction.test.ts b/packages/cactus-plugin-ledger-connector-iroha2/src/test/typescript/integration/iroha2-generate-and-send-signed-transaction.test.ts index 07ac3e53ed..9ac554727b 100644 --- a/packages/cactus-plugin-ledger-connector-iroha2/src/test/typescript/integration/iroha2-generate-and-send-signed-transaction.test.ts +++ b/packages/cactus-plugin-ledger-connector-iroha2/src/test/typescript/integration/iroha2-generate-and-send-signed-transaction.test.ts @@ -32,6 +32,16 @@ import "jest-extended"; import { TransactionPayload } from "@iroha2/data-model"; import { signIrohaV2Query } from "../../../main/typescript/iroha-sign-utils"; +interface ErrorResponse extends Error { + response?: { + status?: number; + data?: { + message: string; + error: any; + }; + }; +} + // Logger setup const log: Logger = LoggerProvider.getOrCreate({ label: "generate-and-send-signed-transaction.test", @@ -321,10 +331,13 @@ describe("Generate and send signed transaction tests", () => { baseConfig: env.defaultBaseConfig, }); expect(false).toBe(true); // should always throw by now - } catch (err: any) { - expect(err.response.status).toBe(500); - expect(err.response.data.message).toEqual("Internal Server Error"); - expect(err.response.data.error).toBeTruthy(); + } catch (err) { + const errorResponse = err as ErrorResponse; + expect(errorResponse?.response?.status).toBe(500); + expect(errorResponse?.response?.data?.message).toEqual( + "Internal Server Error", + ); + expect(errorResponse?.response?.data?.error).toBeTruthy(); } }); @@ -342,10 +355,13 @@ describe("Generate and send signed transaction tests", () => { baseConfig: env.defaultBaseConfig, }); expect(false).toBe(true); // should always throw by now - } catch (err: any) { - expect(err.response.status).toBe(500); - expect(err.response.data.message).toEqual("Internal Server Error"); - expect(err.response.data.error).toBeTruthy(); + } catch (err) { + const errorResponse = err as ErrorResponse; + expect(errorResponse?.response?.status).toBe(500); + expect(errorResponse?.response?.data?.message).toEqual( + "Internal Server Error", + ); + expect(errorResponse?.response?.data?.error).toBeTruthy(); } }); diff --git a/packages/cactus-plugin-ledger-connector-quorum/src/main/typescript/plugin-ledger-connector-quorum.ts b/packages/cactus-plugin-ledger-connector-quorum/src/main/typescript/plugin-ledger-connector-quorum.ts index bfcc3bde5c..5f0b33890d 100644 --- a/packages/cactus-plugin-ledger-connector-quorum/src/main/typescript/plugin-ledger-connector-quorum.ts +++ b/packages/cactus-plugin-ledger-connector-quorum/src/main/typescript/plugin-ledger-connector-quorum.ts @@ -577,7 +577,7 @@ export class PluginLedgerConnectorQuorum } catch (ex) { throw new Error( `${fnTag} Failed to invoke web3.eth.personal.sendTransaction(). ` + - `InnerException: ${ex.stack}`, + `InnerException: ${ex}`, ); } } diff --git a/packages/cactus-plugin-ledger-connector-quorum/src/main/typescript/web-services/deploy-contract-solidity-bytecode-endpoint-json-object.ts b/packages/cactus-plugin-ledger-connector-quorum/src/main/typescript/web-services/deploy-contract-solidity-bytecode-endpoint-json-object.ts index b69f0e28ff..3ba0653b71 100644 --- a/packages/cactus-plugin-ledger-connector-quorum/src/main/typescript/web-services/deploy-contract-solidity-bytecode-endpoint-json-object.ts +++ b/packages/cactus-plugin-ledger-connector-quorum/src/main/typescript/web-services/deploy-contract-solidity-bytecode-endpoint-json-object.ts @@ -12,6 +12,7 @@ import { LogLevelDesc, LoggerProvider, IAsyncProvider, + safeStringifyException, } from "@hyperledger/cactus-common"; import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; @@ -100,10 +101,8 @@ export class DeployContractSolidityBytecodeJsonObjectEndpoint res.json(resBody); } catch (ex) { this.log.error(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, - }); + res.status(500); + res.json({ error: safeStringifyException(ex) }); } } } diff --git a/packages/cactus-plugin-ledger-connector-quorum/src/main/typescript/web-services/deploy-contract-solidity-bytecode-endpoint.ts b/packages/cactus-plugin-ledger-connector-quorum/src/main/typescript/web-services/deploy-contract-solidity-bytecode-endpoint.ts index 40e4f4606d..ba8523091e 100644 --- a/packages/cactus-plugin-ledger-connector-quorum/src/main/typescript/web-services/deploy-contract-solidity-bytecode-endpoint.ts +++ b/packages/cactus-plugin-ledger-connector-quorum/src/main/typescript/web-services/deploy-contract-solidity-bytecode-endpoint.ts @@ -12,6 +12,7 @@ import { LogLevelDesc, LoggerProvider, IAsyncProvider, + safeStringifyException, } from "@hyperledger/cactus-common"; import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; @@ -94,10 +95,8 @@ export class DeployContractSolidityBytecodeEndpoint res.json(resBody); } catch (ex) { this.log.error(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, - }); + res.status(500); + res.json({ error: safeStringifyException(ex) }); } } } diff --git a/packages/cactus-plugin-ledger-connector-quorum/src/main/typescript/web-services/get-prometheus-exporter-metrics-endpoint-v1.ts b/packages/cactus-plugin-ledger-connector-quorum/src/main/typescript/web-services/get-prometheus-exporter-metrics-endpoint-v1.ts index ed0149136d..ea92ace2a4 100644 --- a/packages/cactus-plugin-ledger-connector-quorum/src/main/typescript/web-services/get-prometheus-exporter-metrics-endpoint-v1.ts +++ b/packages/cactus-plugin-ledger-connector-quorum/src/main/typescript/web-services/get-prometheus-exporter-metrics-endpoint-v1.ts @@ -16,6 +16,7 @@ import { LoggerProvider, Checks, IAsyncProvider, + safeStringifyException, } from "@hyperledger/cactus-common"; import { PluginLedgerConnectorQuorum } from "../plugin-ledger-connector-quorum"; @@ -95,8 +96,8 @@ export class GetPrometheusExporterMetricsEndpointV1 } catch (ex) { this.log.error(`${fnTag} failed to serve request`, ex); res.status(500); - res.statusMessage = ex.message; - res.json({ error: ex.stack }); + res.status(500); + res.json({ error: safeStringifyException(ex) }); } } } diff --git a/packages/cactus-plugin-ledger-connector-quorum/src/main/typescript/web-services/invoke-contract-endpoint-json-object.ts b/packages/cactus-plugin-ledger-connector-quorum/src/main/typescript/web-services/invoke-contract-endpoint-json-object.ts index 2f1990fcc7..4fd6abbaf2 100644 --- a/packages/cactus-plugin-ledger-connector-quorum/src/main/typescript/web-services/invoke-contract-endpoint-json-object.ts +++ b/packages/cactus-plugin-ledger-connector-quorum/src/main/typescript/web-services/invoke-contract-endpoint-json-object.ts @@ -6,6 +6,7 @@ import { LogLevelDesc, LoggerProvider, IAsyncProvider, + safeStringifyException, } from "@hyperledger/cactus-common"; import { IEndpointAuthzOptions, @@ -94,10 +95,8 @@ export class InvokeContractJsonObjectEndpoint implements IWebServiceEndpoint { res.json(resBody); } catch (ex) { this.log.error(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, - }); + res.status(500); + res.json({ error: safeStringifyException(ex) }); } } } diff --git a/packages/cactus-plugin-ledger-connector-quorum/src/main/typescript/web-services/invoke-contract-endpoint.ts b/packages/cactus-plugin-ledger-connector-quorum/src/main/typescript/web-services/invoke-contract-endpoint.ts index af4dd11d1e..8efaa70f72 100644 --- a/packages/cactus-plugin-ledger-connector-quorum/src/main/typescript/web-services/invoke-contract-endpoint.ts +++ b/packages/cactus-plugin-ledger-connector-quorum/src/main/typescript/web-services/invoke-contract-endpoint.ts @@ -6,6 +6,7 @@ import { LogLevelDesc, LoggerProvider, IAsyncProvider, + safeStringifyException, } from "@hyperledger/cactus-common"; import { IEndpointAuthzOptions, @@ -92,10 +93,8 @@ export class InvokeContractEndpoint implements IWebServiceEndpoint { res.json(resBody); } catch (ex) { this.log.error(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, - }); + res.status(500); + res.json({ error: safeStringifyException(ex) }); } } } diff --git a/packages/cactus-plugin-ledger-connector-quorum/src/main/typescript/web-services/run-transaction-endpoint.ts b/packages/cactus-plugin-ledger-connector-quorum/src/main/typescript/web-services/run-transaction-endpoint.ts index 20eacabbdf..f9ce4937a7 100644 --- a/packages/cactus-plugin-ledger-connector-quorum/src/main/typescript/web-services/run-transaction-endpoint.ts +++ b/packages/cactus-plugin-ledger-connector-quorum/src/main/typescript/web-services/run-transaction-endpoint.ts @@ -6,6 +6,7 @@ import { LogLevelDesc, LoggerProvider, IAsyncProvider, + safeStringifyException, } from "@hyperledger/cactus-common"; import { IEndpointAuthzOptions, @@ -91,10 +92,8 @@ export class RunTransactionEndpoint implements IWebServiceEndpoint { res.json({ success: true, data: resBody }); } catch (ex) { this.log.error(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, - }); + res.status(500); + res.json({ error: safeStringifyException(ex) }); } } } diff --git a/packages/cactus-plugin-ledger-connector-quorum/src/test/typescript/integration/plugin-ledger-connector-quorum/deploy-contract/openapi/openapi-validation-no-keychain.test.ts b/packages/cactus-plugin-ledger-connector-quorum/src/test/typescript/integration/plugin-ledger-connector-quorum/deploy-contract/openapi/openapi-validation-no-keychain.test.ts index 9691f9215e..06dfb57744 100644 --- a/packages/cactus-plugin-ledger-connector-quorum/src/test/typescript/integration/plugin-ledger-connector-quorum/deploy-contract/openapi/openapi-validation-no-keychain.test.ts +++ b/packages/cactus-plugin-ledger-connector-quorum/src/test/typescript/integration/plugin-ledger-connector-quorum/deploy-contract/openapi/openapi-validation-no-keychain.test.ts @@ -36,6 +36,7 @@ import { Server as SocketIoServer } from "socket.io"; import { installOpenapiValidationMiddleware } from "@hyperledger/cactus-core"; import OAS from "../../../../../../main/json/openapi.json"; +import { AxiosError } from "axios"; const logLevel: LogLevelDesc = "INFO"; @@ -190,20 +191,21 @@ test(testCase, async (t: Test) => { await apiClient.deployContractSolBytecodeJsonObjectV1( parameters as any as DeployContractSolidityBytecodeJsonObjectV1Request, ); - } catch (e) { + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; t2.equal( - e.response.status, + e?.response?.status, 400, `Endpoint ${fDeploy} without required contractJSON and bytecode: response.status === 400 OK`, ); - const fields = e.response.data.map((param: any) => + const fields = e?.response?.data.map((param: any) => param.path.replace("/body/", ""), ); t2.ok( - fields.includes("contractJSON"), + fields?.includes("contractJSON"), "Rejected because contractJSON is required", ); - t2.notOk(fields.includes("gas"), "gas is not required"); + t2.notOk(fields?.includes("gas"), "gas is not required"); } t2.end(); @@ -226,17 +228,18 @@ test(testCase, async (t: Test) => { await apiClient.deployContractSolBytecodeJsonObjectV1( parameters as any as DeployContractSolidityBytecodeJsonObjectV1Request, ); - } catch (e) { + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; t2.equal( - e.response.status, + e?.response?.status, 400, `Endpoint ${fDeploy} with fake=4: response.status === 400 OK`, ); - const fields = e.response.data.map((param: any) => + const fields = e?.response?.data.map((param: any) => param.path.replace("/body/", ""), ); t2.ok( - fields.includes("fake"), + fields?.includes("fake"), "Rejected because fake is not a valid parameter", ); } @@ -262,20 +265,21 @@ test(testCase, async (t: Test) => { await apiClient.invokeContractV1NoKeychain( parameters as any as InvokeContractJsonObjectV1Request, ); - } catch (e) { + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; t2.equal( - e.response.status, + e?.response?.status, 400, `Endpoint ${fInvoke} without required contractJSON and methodName: response.status === 400 OK`, ); - const fields = e.response.data.map((param: any) => + const fields = e?.response?.data.map((param: any) => param.path.replace("/body/", ""), ); t2.ok( - fields.includes("contractJSON"), + fields?.includes("contractJSON"), "Rejected because contractJSON is required", ); - t2.notOk(fields.includes("nonce"), "nonce is not required"); + t2.notOk(fields?.includes("nonce"), "nonce is not required"); } t2.end(); @@ -301,17 +305,18 @@ test(testCase, async (t: Test) => { await apiClient.invokeContractV1NoKeychain( parameters as any as InvokeContractJsonObjectV1Request, ); - } catch (e) { + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; t2.equal( - e.response.status, + e?.response?.status, 400, `Endpoint ${fInvoke} with fake=4: response.status === 400 OK`, ); - const fields = e.response.data.map((param: any) => + const fields = e?.response?.data.map((param: any) => param.path.replace("/body/", ""), ); t2.ok( - fields.includes("fake"), + fields?.includes("fake"), "Rejected because fake is not a valid parameter", ); } diff --git a/packages/cactus-plugin-ledger-connector-quorum/src/test/typescript/integration/plugin-ledger-connector-quorum/deploy-contract/openapi/openapi-validation.test.ts b/packages/cactus-plugin-ledger-connector-quorum/src/test/typescript/integration/plugin-ledger-connector-quorum/deploy-contract/openapi/openapi-validation.test.ts index 5a6694949c..52d74a2081 100644 --- a/packages/cactus-plugin-ledger-connector-quorum/src/test/typescript/integration/plugin-ledger-connector-quorum/deploy-contract/openapi/openapi-validation.test.ts +++ b/packages/cactus-plugin-ledger-connector-quorum/src/test/typescript/integration/plugin-ledger-connector-quorum/deploy-contract/openapi/openapi-validation.test.ts @@ -32,6 +32,7 @@ import { Server as SocketIoServer } from "socket.io"; import { installOpenapiValidationMiddleware } from "@hyperledger/cactus-core"; import OAS from "../../../../../../main/json/openapi.json"; +import { AxiosError } from "axios"; const logLevel: LogLevelDesc = "INFO"; const testCase = "Quorum API"; @@ -179,20 +180,21 @@ test(testCase, async (t: Test) => { await apiClient.deployContractSolBytecodeV1( parameters as DeployContractSolidityBytecodeV1Request, ); - } catch (e) { + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; t2.equal( - e.response.status, + e?.response?.status, 400, `Endpoint ${fDeploy} without required contractName and bytecode: response.status === 400 OK`, ); - const fields = e.response.data.map((param: any) => + const fields = e?.response?.data.map((param: any) => param.path.replace("/body/", ""), ); t2.ok( - fields.includes("contractName"), + fields?.includes("contractName"), "Rejected because contractName is required", ); - t2.notOk(fields.includes("gas"), "gas is not required"); + t2.notOk(fields?.includes("gas"), "gas is not required"); } t2.end(); @@ -214,17 +216,18 @@ test(testCase, async (t: Test) => { await apiClient.deployContractSolBytecodeV1( parameters as DeployContractSolidityBytecodeV1Request, ); - } catch (e) { + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; t2.equal( - e.response.status, + e?.response?.status, 400, `Endpoint ${fDeploy} with fake=4: response.status === 400 OK`, ); - const fields = e.response.data.map((param: any) => + const fields = e?.response?.data.map((param: any) => param.path.replace("/body/", ""), ); t2.ok( - fields.includes("fake"), + fields?.includes("fake"), "Rejected because fake is not a valid parameter", ); } @@ -275,20 +278,21 @@ test(testCase, async (t: Test) => { }, }; await apiClient.invokeContractV1(parameters as InvokeContractV1Request); - } catch (e) { + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; t2.equal( - e.response.status, + e?.response?.status, 400, `Endpoint ${fInvoke} without required methodName: response.status === 400 OK`, ); - const fields = e.response.data.map((param: any) => + const fields = e?.response?.data.map((param: any) => param.path.replace("/body/", ""), ); t2.ok( - fields.includes("methodName"), + fields?.includes("methodName"), "Rejected because methodName is required", ); - t2.notOk(fields.includes("nonce"), "nonce is not required"); + t2.notOk(fields?.includes("nonce"), "nonce is not required"); } t2.end(); @@ -313,17 +317,18 @@ test(testCase, async (t: Test) => { fake: 4, }; await apiClient.invokeContractV1(parameters as InvokeContractV1Request); - } catch (e) { + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; t2.equal( - e.response.status, + e?.response?.status, 400, `Endpoint ${fInvoke} with fake=4: response.status === 400 OK`, ); - const fields = e.response.data.map((param: any) => + const fields = e?.response?.data.map((param: any) => param.path.replace("/body/", ""), ); t2.ok( - fields.includes("fake"), + fields?.includes("fake"), "Rejected because fake is not a valid parameter", ); } @@ -364,20 +369,21 @@ test(testCase, async (t: Test) => { }, }; await apiClient.runTransactionV1(parameters as RunTransactionRequest); - } catch (e) { + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; t2.equal( - e.response.status, + e?.response?.status, 400, `Endpoint ${fRun} without required transactionConfig: response.status === 400 OK`, ); - const fields = e.response.data.map((param: { path: string }) => + const fields = e?.response?.data.map((param: { path: string }) => param.path.replace("/body/", ""), ); t2.ok( - fields.includes("transactionConfig"), + fields?.includes("transactionConfig"), "Rejected because transactionConfig is required", ); - t2.notOk(fields.includes("timeoutMs"), "timeoutMs is not required"); + t2.notOk(fields?.includes("timeoutMs"), "timeoutMs is not required"); } t2.end(); @@ -399,17 +405,18 @@ test(testCase, async (t: Test) => { fake: 4, }; await apiClient.runTransactionV1(parameters as RunTransactionRequest); - } catch (e) { + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; t2.equal( - e.response.status, + e?.response?.status, 400, `Endpoint ${fRun} with fake=4: response.status === 400 OK`, ); - const fields = e.response.data.map((param: { path: string }) => + const fields = e?.response?.data.map((param: { path: string }) => param.path.replace("/body/", ""), ); t2.ok( - fields.includes("fake"), + fields?.includes("fake"), "Rejected because fake is not a valid parameter", ); } diff --git a/packages/cactus-plugin-ledger-connector-quorum/src/test/typescript/integration/plugin-ledger-connector-quorum/deploy-contract/v21.4.1-invoke-contract.test.ts b/packages/cactus-plugin-ledger-connector-quorum/src/test/typescript/integration/plugin-ledger-connector-quorum/deploy-contract/v21.4.1-invoke-contract.test.ts index 176e5626ea..8f78634b2a 100644 --- a/packages/cactus-plugin-ledger-connector-quorum/src/test/typescript/integration/plugin-ledger-connector-quorum/deploy-contract/v21.4.1-invoke-contract.test.ts +++ b/packages/cactus-plugin-ledger-connector-quorum/src/test/typescript/integration/plugin-ledger-connector-quorum/deploy-contract/v21.4.1-invoke-contract.test.ts @@ -170,7 +170,9 @@ describe(testCase, () => { }); expect(setNameOutInvalid.transactionReceipt).toBeFalsy(); } catch (error) { - expect(error.message).toMatch(/nonce too low/); + if (error instanceof Error) { + expect(error.message).toMatch(/nonce too low/); + } } const getNameOut = await connector.getContractInfoKeychain({ @@ -263,7 +265,9 @@ describe(testCase, () => { }); expect(setNameOutInvalid.transactionReceipt).toBeFalsy(); } catch (error) { - expect(error.message).toMatch(/nonce too low/); + if (error instanceof Error) { + expect(error.message).toMatch(/nonce too low/); + } } const { callOutput: getNameOut } = await connector.getContractInfoKeychain({ @@ -336,7 +340,9 @@ describe(testCase, () => { }); expect(setNameOutInvalid.transactionReceipt).toBeFalsy(); } catch (error) { - expect(error.message).toMatch(/nonce too low/); + if (error instanceof Error) { + expect(error.message).toMatch(/nonce too low/); + } } const { callOutput: getNameOut } = await connector.getContractInfoKeychain({ diff --git a/packages/cactus-plugin-ledger-connector-sawtooth/src/main/typescript/web-services/status-endpoint-v1.ts b/packages/cactus-plugin-ledger-connector-sawtooth/src/main/typescript/web-services/status-endpoint-v1.ts index 392ad28ae3..90235d6c9e 100644 --- a/packages/cactus-plugin-ledger-connector-sawtooth/src/main/typescript/web-services/status-endpoint-v1.ts +++ b/packages/cactus-plugin-ledger-connector-sawtooth/src/main/typescript/web-services/status-endpoint-v1.ts @@ -8,14 +8,16 @@ import { LogLevelDesc, LoggerProvider, IAsyncProvider, - safeStringifyException, } from "@hyperledger/cactus-common"; import type { IEndpointAuthzOptions, IExpressRequestHandler, IWebServiceEndpoint, } from "@hyperledger/cactus-core-api"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import OAS from "../../json/openapi.json"; import { PluginLedgerConnectorSawtooth } from "../plugin-ledger-connector-sawtooth"; @@ -95,10 +97,8 @@ export class StatusEndpointV1 implements IWebServiceEndpoint { res.status(200).json(await this.options.connector.getStatus()); } catch (ex) { this.log.error(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: safeStringifyException(ex), - }); + const errorMsg = "Internal Server Error"; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-ledger-connector-xdai/src/main/typescript/web-services/deploy-contract-solidity-bytecode-endpoint.ts b/packages/cactus-plugin-ledger-connector-xdai/src/main/typescript/web-services/deploy-contract-solidity-bytecode-endpoint.ts index 5cd0956c5c..34c176cfb9 100644 --- a/packages/cactus-plugin-ledger-connector-xdai/src/main/typescript/web-services/deploy-contract-solidity-bytecode-endpoint.ts +++ b/packages/cactus-plugin-ledger-connector-xdai/src/main/typescript/web-services/deploy-contract-solidity-bytecode-endpoint.ts @@ -12,6 +12,7 @@ import { LogLevelDesc, LoggerProvider, IAsyncProvider, + safeStringifyException, } from "@hyperledger/cactus-common"; import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; @@ -94,10 +95,8 @@ export class DeployContractSolidityBytecodeEndpoint res.json(resBody); } catch (ex) { this.log.error(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, - }); + res.status(500); + res.json({ error: safeStringifyException(ex) }); } } } diff --git a/packages/cactus-plugin-ledger-connector-xdai/src/main/typescript/web-services/deploy-contract-solidity-bytecode-json-object-endpoint.ts b/packages/cactus-plugin-ledger-connector-xdai/src/main/typescript/web-services/deploy-contract-solidity-bytecode-json-object-endpoint.ts index b24a370958..d7af23d453 100644 --- a/packages/cactus-plugin-ledger-connector-xdai/src/main/typescript/web-services/deploy-contract-solidity-bytecode-json-object-endpoint.ts +++ b/packages/cactus-plugin-ledger-connector-xdai/src/main/typescript/web-services/deploy-contract-solidity-bytecode-json-object-endpoint.ts @@ -12,6 +12,7 @@ import { LogLevelDesc, LoggerProvider, IAsyncProvider, + safeStringifyException, } from "@hyperledger/cactus-common"; import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; @@ -98,10 +99,8 @@ export class DeployContractSolidityBytecodeJsonObjectEndpoint res.json(resBody); } catch (ex) { this.log.error(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, - }); + res.status(500); + res.json({ error: safeStringifyException(ex) }); } } } diff --git a/packages/cactus-plugin-ledger-connector-xdai/src/main/typescript/web-services/get-prometheus-exporter-metrics-endpoint-v1.ts b/packages/cactus-plugin-ledger-connector-xdai/src/main/typescript/web-services/get-prometheus-exporter-metrics-endpoint-v1.ts index a94728bfb4..cac1673091 100644 --- a/packages/cactus-plugin-ledger-connector-xdai/src/main/typescript/web-services/get-prometheus-exporter-metrics-endpoint-v1.ts +++ b/packages/cactus-plugin-ledger-connector-xdai/src/main/typescript/web-services/get-prometheus-exporter-metrics-endpoint-v1.ts @@ -16,6 +16,7 @@ import { LoggerProvider, Checks, IAsyncProvider, + safeStringifyException, } from "@hyperledger/cactus-common"; import { PluginLedgerConnectorXdai } from "../plugin-ledger-connector-xdai"; @@ -94,9 +95,9 @@ export class GetPrometheusExporterMetricsEndpointV1 res.send(resBody); } catch (ex) { this.log.error(`${fnTag} failed to serve request`, ex); + res.status(500); - res.statusMessage = ex.message; - res.json({ error: ex.stack }); + res.json({ error: safeStringifyException(ex) }); } } } diff --git a/packages/cactus-plugin-ledger-connector-xdai/src/main/typescript/web-services/invoke-contract-endpoint.ts b/packages/cactus-plugin-ledger-connector-xdai/src/main/typescript/web-services/invoke-contract-endpoint.ts index f55db0d59c..0acb20d834 100644 --- a/packages/cactus-plugin-ledger-connector-xdai/src/main/typescript/web-services/invoke-contract-endpoint.ts +++ b/packages/cactus-plugin-ledger-connector-xdai/src/main/typescript/web-services/invoke-contract-endpoint.ts @@ -6,6 +6,7 @@ import { LogLevelDesc, LoggerProvider, IAsyncProvider, + safeStringifyException, } from "@hyperledger/cactus-common"; import { IEndpointAuthzOptions, @@ -90,10 +91,8 @@ export class InvokeContractEndpoint implements IWebServiceEndpoint { res.json(resBody); } catch (ex) { this.log.error(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, - }); + res.status(500); + res.json({ error: safeStringifyException(ex) }); } } } diff --git a/packages/cactus-plugin-ledger-connector-xdai/src/main/typescript/web-services/invoke-contract-json-object-endpoint.ts b/packages/cactus-plugin-ledger-connector-xdai/src/main/typescript/web-services/invoke-contract-json-object-endpoint.ts index 746941353d..b10cd405a5 100644 --- a/packages/cactus-plugin-ledger-connector-xdai/src/main/typescript/web-services/invoke-contract-json-object-endpoint.ts +++ b/packages/cactus-plugin-ledger-connector-xdai/src/main/typescript/web-services/invoke-contract-json-object-endpoint.ts @@ -6,6 +6,7 @@ import { LogLevelDesc, LoggerProvider, IAsyncProvider, + safeStringifyException, } from "@hyperledger/cactus-common"; import { IEndpointAuthzOptions, @@ -94,10 +95,8 @@ export class InvokeContractJsonObjectEndpoint implements IWebServiceEndpoint { res.json(resBody); } catch (ex) { this.log.error(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, - }); + res.status(500); + res.json({ error: safeStringifyException(ex) }); } } } diff --git a/packages/cactus-plugin-ledger-connector-xdai/src/main/typescript/web-services/run-transaction-endpoint.ts b/packages/cactus-plugin-ledger-connector-xdai/src/main/typescript/web-services/run-transaction-endpoint.ts index a0b200d3a0..9e9d0638ef 100644 --- a/packages/cactus-plugin-ledger-connector-xdai/src/main/typescript/web-services/run-transaction-endpoint.ts +++ b/packages/cactus-plugin-ledger-connector-xdai/src/main/typescript/web-services/run-transaction-endpoint.ts @@ -6,6 +6,7 @@ import { LogLevelDesc, LoggerProvider, IAsyncProvider, + safeStringifyException, } from "@hyperledger/cactus-common"; import { IEndpointAuthzOptions, @@ -90,10 +91,8 @@ export class RunTransactionEndpoint implements IWebServiceEndpoint { res.json({ success: true, data: resBody }); } catch (ex) { this.log.error(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, - }); + res.status(500); + res.json({ error: safeStringifyException(ex) }); } } } diff --git a/packages/cactus-plugin-ledger-connector-xdai/src/test/typescript/integration/invoke-contract-xdai.test.ts b/packages/cactus-plugin-ledger-connector-xdai/src/test/typescript/integration/invoke-contract-xdai.test.ts index a426c9a00f..bb5c345264 100644 --- a/packages/cactus-plugin-ledger-connector-xdai/src/test/typescript/integration/invoke-contract-xdai.test.ts +++ b/packages/cactus-plugin-ledger-connector-xdai/src/test/typescript/integration/invoke-contract-xdai.test.ts @@ -204,8 +204,13 @@ describe(testCase, () => { nonce: 1, }); fail("invalid nonce should have thrown"); - } catch (error: any) { - expect(error.message).toContain("Transaction nonce is too low."); + } catch (error) { + if (error instanceof Error) { + expect(error.message).toContain("Transaction nonce is too low."); + } else { + // Log the unexpected error type for debugging + console.error("Unexpected error type:", error); + } } const { callOutput: getNameOut } = await connector.invokeContract({ contractName, @@ -302,10 +307,14 @@ describe(testCase, () => { nonce: 4, }); fail("invalid nonce should have thrown"); - } catch (error: any) { - expect(error.message).toContain( - "Transaction with the same hash was already imported", - ); + } catch (error) { + if (error instanceof Error) { + expect(error.message).toContain( + "Transaction with the same hash was already imported", + ); + } else { + console.error("Unexpected error type:", error); + } } const { callOutput: getNameOut } = await connector.invokeContract({ contractName, diff --git a/packages/cactus-plugin-ledger-connector-xdai/src/test/typescript/integration/openapi/openapi-validation-no-keychain.test.ts b/packages/cactus-plugin-ledger-connector-xdai/src/test/typescript/integration/openapi/openapi-validation-no-keychain.test.ts index 44e59e2c14..33fc6faed3 100644 --- a/packages/cactus-plugin-ledger-connector-xdai/src/test/typescript/integration/openapi/openapi-validation-no-keychain.test.ts +++ b/packages/cactus-plugin-ledger-connector-xdai/src/test/typescript/integration/openapi/openapi-validation-no-keychain.test.ts @@ -30,6 +30,7 @@ import { import { installOpenapiValidationMiddleware } from "@hyperledger/cactus-core"; import OAS from "../../../../main/json/openapi.json"; +import { AxiosError } from "axios"; const testCase = "xDai API"; const logLevel: LogLevelDesc = "TRACE"; @@ -141,17 +142,18 @@ test(testCase, async (t: Test) => { await apiClient.deployContractJsonObjectV1( parameters as any as DeployContractJsonObjectV1Request, ); - } catch (e) { + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; t2.equal( - e.response.status, + e?.response?.status, 400, `Endpoint ${fDeploy} without required contractJSON: response.status === 400 OK`, ); - const fields = e.response.data.map((param: any) => + const fields = e?.response?.data.map((param: any) => param.path.replace("/body/", ""), ); t2.ok( - fields.includes("contractJSON"), + fields?.includes("contractJSON"), "Rejected because contractJSON is required", ); } @@ -175,17 +177,21 @@ test(testCase, async (t: Test) => { await apiClient.deployContractJsonObjectV1( parameters as any as DeployContractJsonObjectV1Request, ); - } catch (e) { + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; t2.equal( - e.response.status, - 400, - `Endpoint ${fDeploy} with fake=4: response.status === 400 OK`, + e?.response?.status, + t2.equal( + e?.response?.status, + 400, + `Endpoint ${fDeploy} with fake=4: response.status === 400 OK`, + ), ); - const fields = e.response.data.map((param: any) => + const fields = e?.response?.data.map((param: any) => param.path.replace("/body/", ""), ); t2.ok( - fields.includes("fake"), + fields?.includes("fake"), "Rejected because fake is not a valid parameter", ); } @@ -236,17 +242,21 @@ test(testCase, async (t: Test) => { await apiClient.invokeContractJsonObject( parameters as any as InvokeContractJsonObjectV1Request, ); - } catch (e) { + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; t2.equal( - e.response.status, - 400, - `Endpoint ${fInvoke} without required contractJSON: response.status === 400 OK`, + e?.response?.status, + t2.equal( + e?.response?.status, + 400, + `Endpoint ${fInvoke} without required contractJSON: response.status === 400 OK`, + ), ); - const fields = e.response.data.map((param: any) => + const fields = e?.response?.data.map((param: any) => param.path.replace("/body/", ""), ); t2.ok( - fields.includes("contractJSON"), + fields?.includes("contractJSON"), "Rejected because contractJSON is required", ); } @@ -273,17 +283,21 @@ test(testCase, async (t: Test) => { await apiClient.invokeContractJsonObject( parameters as any as InvokeContractJsonObjectV1Request, ); - } catch (e) { + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; t2.equal( - e.response.status, - 400, - `Endpoint ${fInvoke} with fake=4: response.status === 400 OK`, + e?.response?.status, + t2.equal( + e?.response?.status, + 400, + `Endpoint ${fInvoke} with fake=4: response.status === 400 OK`, + ), ); - const fields = e.response.data.map((param: any) => + const fields = e?.response?.data.map((param: any) => param.path.replace("/body/", ""), ); t2.ok( - fields.includes("fake"), + fields?.includes("fake"), "Rejected because fake is not a valid parameter", ); } diff --git a/packages/cactus-plugin-ledger-connector-xdai/src/test/typescript/integration/openapi/openapi-validation.test.ts b/packages/cactus-plugin-ledger-connector-xdai/src/test/typescript/integration/openapi/openapi-validation.test.ts index 712ba58135..e863af17ab 100644 --- a/packages/cactus-plugin-ledger-connector-xdai/src/test/typescript/integration/openapi/openapi-validation.test.ts +++ b/packages/cactus-plugin-ledger-connector-xdai/src/test/typescript/integration/openapi/openapi-validation.test.ts @@ -33,6 +33,7 @@ import { import { installOpenapiValidationMiddleware } from "@hyperledger/cactus-core"; import OAS from "../../../../main/json/openapi.json"; +import { AxiosError } from "axios"; const testCase = "xDai API"; const logLevel: LogLevelDesc = "TRACE"; @@ -165,17 +166,18 @@ test(testCase, async (t: Test) => { await apiClient.deployContractV1( parameters as unknown as DeployContractV1Request, ); - } catch (e) { + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; t2.equal( - e.response.status, + e?.response?.status, 400, `Endpoint ${fDeploy} without required keychainId: response.status === 400 OK`, ); - const fields = e.response.data.map((param: { path: string }) => + const fields = e?.response?.data.map((param: { path: string }) => param.path.replace("/body/", ""), ); t2.ok( - fields.includes("keychainId"), + fields?.includes("keychainId"), "Rejected because keychainId is required", ); } @@ -198,17 +200,18 @@ test(testCase, async (t: Test) => { fake: 4, }; await apiClient.deployContractV1(parameters); - } catch (e) { + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; t2.equal( - e.response.status, + e?.response?.status, 400, `Endpoint ${fDeploy} with fake=4: response.status === 400 OK`, ); - const fields = e.response.data.map((param: { path: string }) => + const fields = e?.response?.data.map((param: { path: string }) => param.path.replace("/body/", ""), ); t2.ok( - fields.includes("fake"), + fields?.includes("fake"), "Rejected because fake is not a valid parameter", ); } @@ -259,17 +262,18 @@ test(testCase, async (t: Test) => { await apiClient.invokeContractV1( parameters as unknown as InvokeContractV1Request, ); - } catch (e) { + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; t2.equal( - e.response.status, + e?.response?.status, 400, `Endpoint ${fInvoke} without required contractName: response.status === 400 OK`, ); - const fields = e.response.data.map((param: { path: string }) => + const fields = e?.response?.data.map((param: { path: string }) => param.path.replace("/body/", ""), ); t2.ok( - fields.includes("contractName"), + fields?.includes("contractName"), "Rejected because contractName is required", ); } @@ -296,17 +300,18 @@ test(testCase, async (t: Test) => { await apiClient.invokeContractV1( parameters as any as InvokeContractV1Request, ); - } catch (e) { + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; t2.equal( - e.response.status, + e?.response?.status, 400, `Endpoint ${fInvoke} with fake=4: response.status === 400 OK`, ); - const fields = e.response.data.map((param: { path: string }) => + const fields = e?.response?.data.map((param: { path: string }) => param.path.replace("/body/", ""), ); t2.ok( - fields.includes("fake"), + fields?.includes("fake"), "Rejected because fake is not a valid parameter", ); } @@ -359,17 +364,18 @@ test(testCase, async (t: Test) => { await apiClient.runTransactionV1( parameters as any as RunTransactionV1Request, ); - } catch (e) { + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; t2.equal( - e.response.status, + e?.response?.status, 400, `Endpoint ${fRun} without required consistencyStrategy: response.status === 400 OK`, ); - const fields = e.response.data.map((param: { path: string }) => + const fields = e?.response?.data.map((param: { path: string }) => param.path.replace("/body/", ""), ); t2.ok( - fields.includes("consistencyStrategy"), + fields?.includes("consistencyStrategy"), "Rejected because consistencyStrategy is required", ); } @@ -401,17 +407,18 @@ test(testCase, async (t: Test) => { await apiClient.runTransactionV1( parameters as any as RunTransactionV1Request, ); - } catch (e) { + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; t2.equal( - e.response.status, + e?.response?.status, 400, `Endpoint ${fRun} with fake=4: response.status === 400 OK`, ); - const fields = e.response.data.map((param: { path: string }) => + const fields = e?.response?.data.map((param: { path: string }) => param.path.replace("/body/", ""), ); t2.ok( - fields.includes("fake"), + fields?.includes("fake"), "Rejected because fake is not a valid parameter", ); } diff --git a/packages/cactus-plugin-persistence-ethereum/src/main/typescript/web-services/status-endpoint-v1.ts b/packages/cactus-plugin-persistence-ethereum/src/main/typescript/web-services/status-endpoint-v1.ts index 66a1d78358..7f1c43b0a9 100644 --- a/packages/cactus-plugin-persistence-ethereum/src/main/typescript/web-services/status-endpoint-v1.ts +++ b/packages/cactus-plugin-persistence-ethereum/src/main/typescript/web-services/status-endpoint-v1.ts @@ -8,14 +8,16 @@ import { LogLevelDesc, LoggerProvider, IAsyncProvider, - safeStringifyException, } from "@hyperledger/cactus-common"; import type { IEndpointAuthzOptions, IExpressRequestHandler, IWebServiceEndpoint, } from "@hyperledger/cactus-core-api"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { PluginPersistenceEthereum } from "../plugin-persistence-ethereum"; import OAS from "../../json/openapi.json"; @@ -99,10 +101,8 @@ export class StatusEndpointV1 implements IWebServiceEndpoint { res.status(200).json(resBody); } catch (ex) { this.log.warn(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: safeStringifyException(ex), - }); + const errorMsg = "Internal Server Error"; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/client-side/client-request-endpoint.ts b/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/client-side/client-request-endpoint.ts index 9ef597bf16..65217620e9 100644 --- a/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/client-side/client-request-endpoint.ts +++ b/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/client-side/client-request-endpoint.ts @@ -13,7 +13,10 @@ import { IAsyncProvider, } from "@hyperledger/cactus-common"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { PluginSatpGateway } from "../../gateway/plugin-satp-gateway"; @@ -83,6 +86,7 @@ export class ClientRequestEndpointV1 implements IWebServiceEndpoint { } public async handleRequest(req: Request, res: Response): Promise { + const fnTag = `${this.className}#handleRequest()`; const reqTag = `${this.getVerbLowerCase()} - ${this.getPath()}`; this.log.debug(reqTag); try { @@ -90,10 +94,8 @@ export class ClientRequestEndpointV1 implements IWebServiceEndpoint { res.status(200).json("OK"); } catch (ex) { this.log.error(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, - }); + const errorMsg = `${fnTag} request handler fn crashed for: ${reqTag}`; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/client-side/commit-final-response-endpoint.ts b/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/client-side/commit-final-response-endpoint.ts index c68f4864bd..1fbccf94d8 100644 --- a/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/client-side/commit-final-response-endpoint.ts +++ b/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/client-side/commit-final-response-endpoint.ts @@ -13,7 +13,10 @@ import { IAsyncProvider, } from "@hyperledger/cactus-common"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { PluginSatpGateway } from "../../gateway/plugin-satp-gateway"; @@ -87,6 +90,7 @@ export class CommitFinalResponseEndpointV1 implements IWebServiceEndpoint { } public async handleRequest(req: Request, res: Response): Promise { + const fnTag = `${this.className}#handleRequest()`; const reqTag = `${this.getVerbLowerCase()} - ${this.getPath()}`; this.log.debug(reqTag); try { @@ -94,10 +98,8 @@ export class CommitFinalResponseEndpointV1 implements IWebServiceEndpoint { res.status(200).json("OK"); } catch (ex) { this.log.error(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, - }); + const errorMsg = `${fnTag} request handler fn crashed for: ${reqTag}`; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/client-side/commit-prepare-response-endpoint.ts b/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/client-side/commit-prepare-response-endpoint.ts index f7d9f0fa24..0ff8fb58e5 100644 --- a/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/client-side/commit-prepare-response-endpoint.ts +++ b/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/client-side/commit-prepare-response-endpoint.ts @@ -13,7 +13,10 @@ import { IAsyncProvider, } from "@hyperledger/cactus-common"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { PluginSatpGateway } from "../../gateway/plugin-satp-gateway"; @@ -91,6 +94,7 @@ export class CommitPreparationResponseEndpointV1 } public async handleRequest(req: Request, res: Response): Promise { + const fnTag = `${this.className}#handleRequest()`; const reqTag = `${this.getVerbLowerCase()} - ${this.getPath()}`; this.log.debug(reqTag); try { @@ -98,10 +102,8 @@ export class CommitPreparationResponseEndpointV1 res.status(200).json("OK"); } catch (ex) { this.log.error(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, - }); + const errorMsg = `${fnTag} request handler fn crashed for: ${reqTag}`; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/client-side/lock-evidence-response-endpoint.ts b/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/client-side/lock-evidence-response-endpoint.ts index b59a2db14b..4cd86ca9b4 100644 --- a/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/client-side/lock-evidence-response-endpoint.ts +++ b/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/client-side/lock-evidence-response-endpoint.ts @@ -13,7 +13,10 @@ import { IAsyncProvider, } from "@hyperledger/cactus-common"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { PluginSatpGateway } from "../../gateway/plugin-satp-gateway"; import OAS from "../../../json/openapi.json"; @@ -90,6 +93,7 @@ export class LockEvidenceResponseEndpointV1 implements IWebServiceEndpoint { } public async handleRequest(req: Request, res: Response): Promise { + const fnTag = `${this.className}#handleRequest()`; const reqTag = `${this.getVerbLowerCase()} - ${this.getPath()}`; this.log.debug(reqTag); try { @@ -97,10 +101,8 @@ export class LockEvidenceResponseEndpointV1 implements IWebServiceEndpoint { res.status(200).json("OK"); } catch (ex) { this.log.error(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, - }); + const errorMsg = `${fnTag} request handler fn crashed for: ${reqTag}`; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/client-side/transfer-commence-response-endpoint.ts b/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/client-side/transfer-commence-response-endpoint.ts index 4e0ab33676..998d397f30 100644 --- a/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/client-side/transfer-commence-response-endpoint.ts +++ b/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/client-side/transfer-commence-response-endpoint.ts @@ -13,7 +13,10 @@ import { IAsyncProvider, } from "@hyperledger/cactus-common"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { PluginSatpGateway } from "../../gateway/plugin-satp-gateway"; import OAS from "../../../json/openapi.json"; @@ -88,6 +91,7 @@ export class TransferCommenceResponseEndpointV1 implements IWebServiceEndpoint { } public async handleRequest(req: Request, res: Response): Promise { + const fnTag = `${this.className}#handleRequest()`; const reqTag = `${this.getVerbLowerCase()} - ${this.getPath()}`; this.log.debug(reqTag); try { @@ -95,10 +99,8 @@ export class TransferCommenceResponseEndpointV1 implements IWebServiceEndpoint { res.status(200).json("OK"); } catch (ex) { this.log.error(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, - }); + const errorMsg = `${fnTag} request handler fn crashed for: ${reqTag}`; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/client-side/transfer-initiation-response-endpoint.ts b/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/client-side/transfer-initiation-response-endpoint.ts index b5155591de..4f48db4af1 100644 --- a/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/client-side/transfer-initiation-response-endpoint.ts +++ b/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/client-side/transfer-initiation-response-endpoint.ts @@ -13,7 +13,10 @@ import { IAsyncProvider, } from "@hyperledger/cactus-common"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { PluginSatpGateway } from "../../gateway/plugin-satp-gateway"; import OAS from "../../../json/openapi.json"; @@ -91,6 +94,7 @@ export class TransferInitiationResponseEndpointV1 } public async handleRequest(req: Request, res: Response): Promise { + const fnTag = `${this.className}#handleRequest()`; const reqTag = `${this.getVerbLowerCase()} - ${this.getPath()}`; this.log.debug(reqTag); try { @@ -98,10 +102,8 @@ export class TransferInitiationResponseEndpointV1 res.status(200).json("OK"); } catch (ex) { this.log.error(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, - }); + const errorMsg = `${fnTag} request handler fn crashed for: ${reqTag}`; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/recovery/recover-message-endpoint.ts b/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/recovery/recover-message-endpoint.ts index 39b167e403..6c9d62f773 100644 --- a/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/recovery/recover-message-endpoint.ts +++ b/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/recovery/recover-message-endpoint.ts @@ -13,7 +13,10 @@ import { IAsyncProvider, } from "@hyperledger/cactus-common"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { PluginSatpGateway } from "../../gateway/plugin-satp-gateway"; @@ -87,6 +90,7 @@ export class RecoverMessageEndpointV1 implements IWebServiceEndpoint { } public async handleRequest(req: Request, res: Response): Promise { + const fnTag = `${this.className}#handleRequest()`; const reqTag = `${this.getVerbLowerCase()} - ${this.getPath()}`; this.log.debug(reqTag); try { @@ -94,10 +98,8 @@ export class RecoverMessageEndpointV1 implements IWebServiceEndpoint { res.status(200).json("OK"); } catch (ex) { this.log.error(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, - }); + const errorMsg = `${fnTag} request handler fn crashed for: ${reqTag}`; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/recovery/recover-success-message-endpoint.ts b/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/recovery/recover-success-message-endpoint.ts index 9ce43e466a..5a61fc0e37 100644 --- a/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/recovery/recover-success-message-endpoint.ts +++ b/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/recovery/recover-success-message-endpoint.ts @@ -13,7 +13,10 @@ import { IAsyncProvider, } from "@hyperledger/cactus-common"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { PluginSatpGateway } from "../../gateway/plugin-satp-gateway"; @@ -87,6 +90,8 @@ export class RecoverSuccessMessageEndpointV1 implements IWebServiceEndpoint { } public async handleRequest(req: Request, res: Response): Promise { + const fnTag = `${this.className}#handleRequest()`; + const reqTag = `${this.getVerbLowerCase()} - ${this.getPath()}`; this.log.debug(reqTag); try { @@ -94,10 +99,8 @@ export class RecoverSuccessMessageEndpointV1 implements IWebServiceEndpoint { res.status(200).json("OK"); } catch (ex) { this.log.error(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, - }); + const errorMsg = `${fnTag} request handler fn crashed for: ${reqTag}`; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/recovery/recover-update-ack-message-endpoint.ts b/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/recovery/recover-update-ack-message-endpoint.ts index a9808d4922..cd2b346aca 100644 --- a/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/recovery/recover-update-ack-message-endpoint.ts +++ b/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/recovery/recover-update-ack-message-endpoint.ts @@ -13,7 +13,10 @@ import { IAsyncProvider, } from "@hyperledger/cactus-common"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { PluginSatpGateway } from "../../gateway/plugin-satp-gateway"; @@ -89,6 +92,7 @@ export class RecoverUpdateAckMessageEndpointV1 implements IWebServiceEndpoint { } public async handleRequest(req: Request, res: Response): Promise { + const fnTag = `${this.className}#handleRequest()`; const reqTag = `${this.getVerbLowerCase()} - ${this.getPath()}`; this.log.debug(reqTag); try { @@ -96,10 +100,8 @@ export class RecoverUpdateAckMessageEndpointV1 implements IWebServiceEndpoint { res.status(200).json("OK"); } catch (ex) { this.log.error(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, - }); + const errorMsg = `${fnTag} request handler fn crashed for: ${reqTag}`; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/recovery/recover-update-message-endpoint.ts b/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/recovery/recover-update-message-endpoint.ts index f10cff1b9f..a8111b9aa8 100644 --- a/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/recovery/recover-update-message-endpoint.ts +++ b/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/recovery/recover-update-message-endpoint.ts @@ -13,7 +13,10 @@ import { IAsyncProvider, } from "@hyperledger/cactus-common"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { PluginSatpGateway } from "../../gateway/plugin-satp-gateway"; @@ -87,6 +90,7 @@ export class RecoverUpdateMessageEndpointV1 implements IWebServiceEndpoint { } public async handleRequest(req: Request, res: Response): Promise { + const fnTag = `${this.className}#handleRequest()`; const reqTag = `${this.getVerbLowerCase()} - ${this.getPath()}`; this.log.debug(reqTag); try { @@ -94,10 +98,8 @@ export class RecoverUpdateMessageEndpointV1 implements IWebServiceEndpoint { res.status(200).json("OK"); } catch (ex) { this.log.error(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, - }); + const errorMsg = `${fnTag} request handler fn crashed for: ${reqTag}`; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/recovery/rollback-ack-message-endpoint.ts b/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/recovery/rollback-ack-message-endpoint.ts index 2857f12b5b..703424caf7 100644 --- a/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/recovery/rollback-ack-message-endpoint.ts +++ b/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/recovery/rollback-ack-message-endpoint.ts @@ -13,7 +13,10 @@ import { IAsyncProvider, } from "@hyperledger/cactus-common"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { PluginSatpGateway } from "../../gateway/plugin-satp-gateway"; @@ -87,6 +90,8 @@ export class RollbackAckMessageEndpointV1 implements IWebServiceEndpoint { } public async handleRequest(req: Request, res: Response): Promise { + const fnTag = `${this.className}#handleRequest()`; + const reqTag = `${this.getVerbLowerCase()} - ${this.getPath()}`; this.log.debug(reqTag); try { @@ -94,10 +99,8 @@ export class RollbackAckMessageEndpointV1 implements IWebServiceEndpoint { res.status(200).json("OK"); } catch (ex) { this.log.error(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, - }); + const errorMsg = `${fnTag} request handler fn crashed for: ${reqTag}`; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/recovery/rollback-message-endpoint.ts b/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/recovery/rollback-message-endpoint.ts index 3e09838d58..5fb33612e7 100644 --- a/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/recovery/rollback-message-endpoint.ts +++ b/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/recovery/rollback-message-endpoint.ts @@ -13,7 +13,10 @@ import { IAsyncProvider, } from "@hyperledger/cactus-common"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { PluginSatpGateway } from "../../gateway/plugin-satp-gateway"; @@ -87,6 +90,8 @@ export class RollbackMessageEndpointV1 implements IWebServiceEndpoint { } public async handleRequest(req: Request, res: Response): Promise { + const fnTag = `${this.className}#handleRequest()`; + const reqTag = `${this.getVerbLowerCase()} - ${this.getPath()}`; this.log.debug(reqTag); try { @@ -94,10 +99,8 @@ export class RollbackMessageEndpointV1 implements IWebServiceEndpoint { res.status(200).json("OK"); } catch (ex) { this.log.error(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, - }); + const errorMsg = `${fnTag} request handler fn crashed for: ${reqTag}`; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/server-side/commit-final-request-endpoint.ts b/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/server-side/commit-final-request-endpoint.ts index cdf2004e8d..7fd7b4974b 100644 --- a/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/server-side/commit-final-request-endpoint.ts +++ b/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/server-side/commit-final-request-endpoint.ts @@ -13,7 +13,10 @@ import { IAsyncProvider, } from "@hyperledger/cactus-common"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { PluginSatpGateway } from "../../gateway/plugin-satp-gateway"; import OAS from "../../../json/openapi.json"; @@ -86,6 +89,7 @@ export class CommitFinalRequestEndpointV1 implements IWebServiceEndpoint { } public async handleRequest(req: Request, res: Response): Promise { + const fnTag = `${this.className}#handleRequest()`; const reqTag = `${this.getVerbLowerCase()} - ${this.getPath()}`; this.log.debug(reqTag); try { @@ -93,10 +97,8 @@ export class CommitFinalRequestEndpointV1 implements IWebServiceEndpoint { res.status(200).json("OK"); } catch (ex) { this.log.error(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, - }); + const errorMsg = `${fnTag} request handler fn crashed for: ${reqTag}`; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/server-side/commite-prepare-request-endpoint.ts b/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/server-side/commite-prepare-request-endpoint.ts index 4c87695844..764594fc53 100644 --- a/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/server-side/commite-prepare-request-endpoint.ts +++ b/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/server-side/commite-prepare-request-endpoint.ts @@ -13,7 +13,10 @@ import { IAsyncProvider, } from "@hyperledger/cactus-common"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { PluginSatpGateway } from "../../gateway/plugin-satp-gateway"; import OAS from "../../../json/openapi.json"; @@ -88,6 +91,7 @@ export class CommitPreparationRequestEndpointV1 implements IWebServiceEndpoint { } public async handleRequest(req: Request, res: Response): Promise { + const fnTag = `${this.className}#handleRequest()`; const reqTag = `${this.getVerbLowerCase()} - ${this.getPath()}`; this.log.debug(reqTag); try { @@ -95,10 +99,8 @@ export class CommitPreparationRequestEndpointV1 implements IWebServiceEndpoint { res.status(200).json("OK"); } catch (ex) { this.log.error(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, - }); + const errorMsg = `${fnTag} request handler fn crashed for: ${reqTag}`; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/server-side/lock-evidence-request-endpoint.ts b/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/server-side/lock-evidence-request-endpoint.ts index 8265526059..85859e74b0 100644 --- a/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/server-side/lock-evidence-request-endpoint.ts +++ b/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/server-side/lock-evidence-request-endpoint.ts @@ -13,7 +13,10 @@ import { IAsyncProvider, } from "@hyperledger/cactus-common"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { PluginSatpGateway } from "../../gateway/plugin-satp-gateway"; import OAS from "../../../json/openapi.json"; @@ -90,6 +93,7 @@ export class LockEvidenceRequestEndpointV1 implements IWebServiceEndpoint { } public async handleRequest(req: Request, res: Response): Promise { + const fnTag = `${this.className}#handleRequest()`; const reqTag = `${this.getVerbLowerCase()} - ${this.getPath()}`; this.log.debug(reqTag); try { @@ -97,10 +101,8 @@ export class LockEvidenceRequestEndpointV1 implements IWebServiceEndpoint { res.status(200).json("OK"); } catch (ex) { this.log.error(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, - }); + const errorMsg = `${fnTag} request handler fn crashed for: ${reqTag}`; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/server-side/transfer-commence-request-endpoint.ts b/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/server-side/transfer-commence-request-endpoint.ts index 8853a65632..f1d48f9799 100644 --- a/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/server-side/transfer-commence-request-endpoint.ts +++ b/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/server-side/transfer-commence-request-endpoint.ts @@ -13,7 +13,10 @@ import { IAsyncProvider, } from "@hyperledger/cactus-common"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { PluginSatpGateway } from "../../gateway/plugin-satp-gateway"; import OAS from "../../../json/openapi.json"; @@ -88,6 +91,7 @@ export class TransferCommenceRequestEndpointV1 implements IWebServiceEndpoint { } public async handleRequest(req: Request, res: Response): Promise { + const fnTag = `${this.className}#handleRequest()`; const reqTag = `${this.getVerbLowerCase()} - ${this.getPath()}`; this.log.debug(reqTag); try { @@ -95,10 +99,8 @@ export class TransferCommenceRequestEndpointV1 implements IWebServiceEndpoint { res.status(200).json("OK"); } catch (ex) { this.log.error(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, - }); + const errorMsg = `${fnTag} request handler fn crashed for: ${reqTag}`; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/server-side/transfer-complete-request-endpoint.ts b/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/server-side/transfer-complete-request-endpoint.ts index f2d57b398a..42922af1ff 100644 --- a/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/server-side/transfer-complete-request-endpoint.ts +++ b/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/server-side/transfer-complete-request-endpoint.ts @@ -13,7 +13,10 @@ import { IAsyncProvider, } from "@hyperledger/cactus-common"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { PluginSatpGateway } from "../../gateway/plugin-satp-gateway"; import OAS from "../../../json/openapi.json"; @@ -88,6 +91,7 @@ export class TransferCompleteRequestEndpointV1 implements IWebServiceEndpoint { } public async handleRequest(req: Request, res: Response): Promise { + const fnTag = `${this.className}#handleRequest()`; const reqTag = `${this.getVerbLowerCase()} - ${this.getPath()}`; this.log.debug(reqTag); try { @@ -95,10 +99,8 @@ export class TransferCompleteRequestEndpointV1 implements IWebServiceEndpoint { res.status(200).json("OK"); } catch (ex) { this.log.error(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, - }); + const errorMsg = `${fnTag} request handler fn crashed for: ${reqTag}`; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/server-side/transfer-initiation-request-endpoint.ts b/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/server-side/transfer-initiation-request-endpoint.ts index 68c9e29d37..deedd3d8aa 100644 --- a/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/server-side/transfer-initiation-request-endpoint.ts +++ b/packages/cactus-plugin-satp-hermes/src/main/typescript/web-services/server-side/transfer-initiation-request-endpoint.ts @@ -13,7 +13,10 @@ import { IAsyncProvider, } from "@hyperledger/cactus-common"; -import { registerWebServiceEndpoint } from "@hyperledger/cactus-core"; +import { + handleRestEndpointException, + registerWebServiceEndpoint, +} from "@hyperledger/cactus-core"; import { PluginSatpGateway } from "../../gateway/plugin-satp-gateway"; import OAS from "../../../json/openapi.json"; @@ -91,6 +94,7 @@ export class TransferInitiationRequestEndpointV1 } public async handleRequest(req: Request, res: Response): Promise { + const fnTag = `${this.className}#handleRequest()`; const reqTag = `${this.getVerbLowerCase()} - ${this.getPath()}`; this.log.debug(reqTag); try { @@ -98,10 +102,8 @@ export class TransferInitiationRequestEndpointV1 res.status(200).json("OK"); } catch (ex) { this.log.error(`Crash while serving ${reqTag}`, ex); - res.status(500).json({ - message: "Internal Server Error", - error: ex?.stack || ex?.message, - }); + const errorMsg = `${fnTag} request handler fn crashed for: ${reqTag}`; + handleRestEndpointException({ errorMsg, log: this.log, error: ex, res }); } } } diff --git a/packages/cactus-test-plugin-consortium-manual/src/test/typescript/integration/plugin-consortium-manual/openapi/openapi-validation.test.ts b/packages/cactus-test-plugin-consortium-manual/src/test/typescript/integration/plugin-consortium-manual/openapi/openapi-validation.test.ts index 37a7263122..2c6ec3caff 100644 --- a/packages/cactus-test-plugin-consortium-manual/src/test/typescript/integration/plugin-consortium-manual/openapi/openapi-validation.test.ts +++ b/packages/cactus-test-plugin-consortium-manual/src/test/typescript/integration/plugin-consortium-manual/openapi/openapi-validation.test.ts @@ -23,6 +23,7 @@ import { ConsortiumMember, } from "@hyperledger/cactus-core-api"; import { PluginRegistry } from "@hyperledger/cactus-core"; +import { AxiosError } from "axios"; const testCase = "cactus-plugin-consortium-manual API"; @@ -287,17 +288,18 @@ test(testCase, async (t: Test) => { const api = new DefaultApi(configuration); try { await api.getNodeJwsV1({ fake: 4 }); - } catch (e) { + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; t2.equal( - e.response.status, + e?.response?.status, 400, `Endpoint ${fGetNodeJwt} with fake=4: response.status === 400 OK`, ); - const fields = e.response.data.map((param: { path: string }) => + const fields = e?.response?.data.map((param: { path: string }) => param.path.replace("/body/", ""), ); t2.ok( - fields.includes("fake"), + fields?.includes("fake"), "Rejected because fake is not a valid parameter", ); } @@ -310,17 +312,18 @@ test(testCase, async (t: Test) => { const api = new DefaultApi(configuration); try { await api.getConsortiumJwsV1({ fake: 4 }); - } catch (e) { + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; t2.equal( - e.response.status, + e?.response?.status, 400, `Endpoint ${fGetConsortiumJws} with fake=4: response.status === 400 OK`, ); - const fields = e.response.data.map((param: { path: string }) => + const fields = e?.response?.data.map((param: { path: string }) => param.path.replace("/body/", ""), ); t2.ok( - fields.includes("fake"), + fields?.includes("fake"), "Rejected because fake is not a valid parameter", ); } diff --git a/packages/cactus-test-plugin-htlc-eth-besu-erc20/src/test/typescript/integration/plugin-htlc-eth-besu-erc20/initialize-endpoint.test.ts b/packages/cactus-test-plugin-htlc-eth-besu-erc20/src/test/typescript/integration/plugin-htlc-eth-besu-erc20/initialize-endpoint.test.ts index d4c7086b0c..927265faef 100644 --- a/packages/cactus-test-plugin-htlc-eth-besu-erc20/src/test/typescript/integration/plugin-htlc-eth-besu-erc20/initialize-endpoint.test.ts +++ b/packages/cactus-test-plugin-htlc-eth-besu-erc20/src/test/typescript/integration/plugin-htlc-eth-besu-erc20/initialize-endpoint.test.ts @@ -31,6 +31,7 @@ import { import { PluginKeychainMemory } from "@hyperledger/cactus-plugin-keychain-memory"; import HashTimeLockJSON from "../../../../../../cactus-plugin-htlc-eth-besu-erc20/src/main/solidity/contracts/HashedTimeLockContract.json"; +import { AxiosError } from "axios"; const logLevel: LogLevelDesc = "INFO"; const estimatedGas = 6721975; @@ -203,8 +204,9 @@ describe(testCase, () => { try { const res = await api.initializeV1(request); expect(res.status).toEqual(400); - } catch (error: any) { - expect(error.response.status).toEqual(400); + } catch (err) { + const e = err as AxiosError; + expect(e?.response?.status).toEqual(400); } }); }); diff --git a/packages/cactus-test-plugin-htlc-eth-besu-erc20/src/test/typescript/integration/plugin-htlc-eth-besu-erc20/new-contract-endpoint.test.ts b/packages/cactus-test-plugin-htlc-eth-besu-erc20/src/test/typescript/integration/plugin-htlc-eth-besu-erc20/new-contract-endpoint.test.ts index 3b5b36f9fc..8e2c80b39f 100644 --- a/packages/cactus-test-plugin-htlc-eth-besu-erc20/src/test/typescript/integration/plugin-htlc-eth-besu-erc20/new-contract-endpoint.test.ts +++ b/packages/cactus-test-plugin-htlc-eth-besu-erc20/src/test/typescript/integration/plugin-htlc-eth-besu-erc20/new-contract-endpoint.test.ts @@ -33,6 +33,7 @@ import { import { PluginKeychainMemory } from "@hyperledger/cactus-plugin-keychain-memory"; import HashTimeLockJSON from "../../../../../../cactus-plugin-htlc-eth-besu-erc20/src/main/solidity/contracts/HashedTimeLockContract.json"; import TestTokenJSON from "../../../solidity/token-erc20-contract/Test_Token.json"; +import { AxiosError } from "axios"; const testCase = "Test new valid contract"; describe(testCase, () => { @@ -330,8 +331,9 @@ describe(testCase, () => { }; const res = await api.newContractV1(request); expect(res.status).toEqual(400); - } catch (error: any) { - expect(error.response.status).toEqual(400); + } catch (err) { + const e = err as AxiosError; + expect(e?.response?.status).toEqual(400); } }); }); diff --git a/packages/cactus-test-plugin-htlc-eth-besu-erc20/src/test/typescript/integration/plugin-htlc-eth-besu-erc20/openapi/openapi-validation.test.ts b/packages/cactus-test-plugin-htlc-eth-besu-erc20/src/test/typescript/integration/plugin-htlc-eth-besu-erc20/openapi/openapi-validation.test.ts index 7bef6a2706..2392b4aca3 100644 --- a/packages/cactus-test-plugin-htlc-eth-besu-erc20/src/test/typescript/integration/plugin-htlc-eth-besu-erc20/openapi/openapi-validation.test.ts +++ b/packages/cactus-test-plugin-htlc-eth-besu-erc20/src/test/typescript/integration/plugin-htlc-eth-besu-erc20/openapi/openapi-validation.test.ts @@ -43,6 +43,7 @@ import HashTimeLockJSON from "../../../../../../../cactus-plugin-htlc-eth-besu-e import { installOpenapiValidationMiddleware } from "@hyperledger/cactus-core"; import { PluginHtlcEthBesuErc20 } from "@hyperledger/cactus-plugin-htlc-eth-besu-erc20"; +import { AxiosError } from "axios"; const connectorId = uuidv4(); const logLevel: LogLevelDesc = "INFO"; @@ -217,21 +218,21 @@ test(testCase, async (t: Test) => { try { await api.initializeV1(parameters as any as InitializeRequest); - } catch (e) { + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; t2.equal( - e.response.status, + e?.response?.status, 400, `Endpoint ${fInitialize} without required connectorId: response.status === 400 OK`, ); - const fields = e.response.data.map((param: any) => + const fields = e?.response?.data.map((param: any) => param.path.replace("/body/", ""), ); t2.ok( - fields.includes("connectorId"), + fields?.includes("connectorId"), "Rejected because connectorId is required", ); } - t2.end(); }); @@ -247,17 +248,18 @@ test(testCase, async (t: Test) => { try { await api.initializeV1(parameters as any as InitializeRequest); - } catch (e) { + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; t2.equal( - e.response.status, + e?.response?.status, 400, `Endpoint ${fInitialize} with fake=4: response.status === 400 OK`, ); - const fields = e.response.data.map((param: any) => + const fields = e?.response?.data.map((param: any) => param.path.replace("/body/", ""), ); t2.ok( - fields.includes("fake"), + fields?.includes("fake"), "Rejected because fake is not a valid parameter", ); } @@ -361,17 +363,18 @@ test(testCase, async (t: Test) => { }; try { await api.newContractV1(parameters as any as NewContractRequest); - } catch (e) { + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; t2.equal( - e.response.status, + e?.response?.status, 400, `Endpoint ${fNew} without required contractAddress: response.status === 400 OK`, ); - const fields = e.response.data.map((param: any) => + const fields = e?.response?.data.map((param: any) => param.path.replace("/body/", ""), ); t2.ok( - fields.includes("contractAddress"), + fields?.includes("contractAddress"), "Rejected because contractAddress is required", ); } @@ -398,17 +401,18 @@ test(testCase, async (t: Test) => { }; try { await api.newContractV1(parameters as any as NewContractRequest); - } catch (e) { + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; t2.equal( - e.response.status, + e?.response?.status, 400, `Endpoint ${fNew} with fake=4: response.status === 400 OK`, ); - const fields = e.response.data.map((param: any) => + const fields = e?.response?.data.map((param: any) => param.path.replace("/body/", ""), ); t2.ok( - fields.includes("fake"), + fields?.includes("fake"), "Rejected because fake is not a valid parameter", ); } @@ -462,16 +466,17 @@ test(testCase, async (t: Test) => { }; try { await api.refundV1(parameters as any as RefundRequest); - } catch (e) { + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; t2.equal( - e.response.status, + e?.response?.status, 400, `Endpoint ${fRefund} without required id: response.status === 400 OK`, ); - const fields = e.response.data.map((param: any) => + const fields = e?.response?.data.map((param: any) => param.path.replace("/body/", ""), ); - t2.ok(fields.includes("id"), "Rejected because id is required"); + t2.ok(fields?.includes("id"), "Rejected because id is required"); } t2.end(); @@ -487,17 +492,18 @@ test(testCase, async (t: Test) => { }; try { await api.refundV1(parameters as any as RefundRequest); - } catch (e) { + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; t2.equal( - e.response.status, + e?.response?.status, 400, `Endpoint ${fRefund} with fake=4: response.status === 400 OK`, ); - const fields = e.response.data.map((param: any) => + const fields = e?.response?.data.map((param: any) => param.path.replace("/body/", ""), ); t2.ok( - fields.includes("fake"), + fields?.includes("fake"), "Rejected because fake is not a valid parameter", ); } @@ -604,16 +610,17 @@ test(testCase, async (t: Test) => { try { await api.withdrawV1(parameters as any as WithdrawRequest); - } catch (e) { + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; t2.equal( - e.response.status, + e?.response?.status, 400, `Endpoint ${fWithdraw} without required id: response.status === 400 OK`, ); - const fields = e.response.data.map((param: any) => + const fields = e?.response?.data.map((param: any) => param.path.replace("/body/", ""), ); - t2.ok(fields.includes("id"), "Rejected because id is required"); + t2.ok(fields?.includes("id"), "Rejected because id is required"); } t2.end(); @@ -631,17 +638,18 @@ test(testCase, async (t: Test) => { try { await api.withdrawV1(parameters as any as WithdrawRequest); - } catch (e) { + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; t2.equal( - e.response.status, + e?.response?.status, 400, `Endpoint ${fWithdraw} with fake=4: response.status === 400 OK`, ); - const fields = e.response.data.map((param: any) => + const fields = e?.response?.data.map((param: any) => param.path.replace("/body/", ""), ); t2.ok( - fields.includes("fake"), + fields?.includes("fake"), "Rejected because fake is not a valid parameter", ); } @@ -678,16 +686,17 @@ test(testCase, async (t: Test) => { try { await api.getStatusV1(parameters as any as GetStatusRequest); - } catch (e) { + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; t2.equal( - e.response.status, + e?.response?.status, 400, `Endpoint ${fStatus} without required id: response.status === 400 OK`, ); - const fields = e.response.data.map((param: any) => + const fields = e?.response?.data.map((param: any) => param.path.replace("/body/", ""), ); - t2.ok(fields.includes("ids"), "Rejected because ids is required"); + t2.ok(fields?.includes("ids"), "Rejected because ids is required"); } t2.end(); @@ -704,17 +713,18 @@ test(testCase, async (t: Test) => { try { await api.getStatusV1(parameters as any as GetStatusRequest); - } catch (e) { + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; t2.equal( - e.response.status, + e?.response?.status, 400, `Endpoint ${fStatus} with fake=4: response.status === 400 OK`, ); - const fields = e.response.data.map((param: any) => + const fields = e?.response?.data.map((param: any) => param.path.replace("/body/", ""), ); t2.ok( - fields.includes("fake"), + fields?.includes("fake"), "Rejected because fake is not a valid parameter", ); } @@ -749,16 +759,17 @@ test(testCase, async (t: Test) => { try { await api.getSingleStatusV1(parameters as any as GetSingleStatusRequest); - } catch (e) { + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; t2.equal( - e.response.status, + e?.response?.status, 400, `Endpoint ${fSingleStatus} without required id: response.status === 400 OK`, ); - const fields = e.response.data.map((param: any) => + const fields = e?.response?.data.map((param: any) => param.path.replace("/body/", ""), ); - t2.ok(fields.includes("id"), "Rejected because id is required"); + t2.ok(fields?.includes("id"), "Rejected because id is required"); } t2.end(); @@ -776,17 +787,18 @@ test(testCase, async (t: Test) => { try { // eslint-disable-next-line prettier/prettier await api.getSingleStatusV1(parameters as any as GetSingleStatusRequest); - } catch (e) { + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; t2.equal( - e.response.status, + e?.response?.status, 400, `Endpoint ${fSingleStatus} with fake=4: response.status === 400 OK`, ); - const fields = e.response.data.map((param: any) => + const fields = e?.response?.data.map((param: any) => param.path.replace("/body/", ""), ); t2.ok( - fields.includes("fake"), + fields?.includes("fake"), "Rejected because fake is not a valid parameter", ); } diff --git a/packages/cactus-test-plugin-htlc-eth-besu-erc20/src/test/typescript/integration/plugin-htlc-eth-besu-erc20/refund-endpoint-invalid-time.test.ts b/packages/cactus-test-plugin-htlc-eth-besu-erc20/src/test/typescript/integration/plugin-htlc-eth-besu-erc20/refund-endpoint-invalid-time.test.ts index 4e81c9a226..df1d2f3a90 100644 --- a/packages/cactus-test-plugin-htlc-eth-besu-erc20/src/test/typescript/integration/plugin-htlc-eth-besu-erc20/refund-endpoint-invalid-time.test.ts +++ b/packages/cactus-test-plugin-htlc-eth-besu-erc20/src/test/typescript/integration/plugin-htlc-eth-besu-erc20/refund-endpoint-invalid-time.test.ts @@ -36,6 +36,7 @@ import { PluginKeychainMemory } from "@hyperledger/cactus-plugin-keychain-memory import TestTokenJSON from "../../../solidity/token-erc20-contract/Test_Token.json"; import DemoHelperJSON from "../../../solidity/token-erc20-contract/DemoHelpers.json"; import HashTimeLockJSON from "../../../../../../cactus-plugin-htlc-eth-besu-erc20/src/main/solidity/contracts/HashedTimeLockContract.json"; +import { AxiosError } from "axios"; const testCase = "Test refund endpoint"; describe(testCase, () => { const logLevel: LogLevelDesc = "TRACE"; @@ -280,8 +281,9 @@ describe(testCase, () => { }; const resRefund = await api.refundV1(refundRequest); expect(resRefund.status).toEqual(400); - } catch (error: any) { - expect(error.response.status).toEqual(400); + } catch (err) { + const e = err as AxiosError; + expect(e?.response?.status).toEqual(400); } const responseFinalBalance = await connector.invokeContract({ diff --git a/packages/cactus-test-plugin-htlc-eth-besu-erc20/src/test/typescript/integration/plugin-htlc-eth-besu-erc20/refund-endpoint.test.ts b/packages/cactus-test-plugin-htlc-eth-besu-erc20/src/test/typescript/integration/plugin-htlc-eth-besu-erc20/refund-endpoint.test.ts index 1d4b6f605d..f7d3f22850 100644 --- a/packages/cactus-test-plugin-htlc-eth-besu-erc20/src/test/typescript/integration/plugin-htlc-eth-besu-erc20/refund-endpoint.test.ts +++ b/packages/cactus-test-plugin-htlc-eth-besu-erc20/src/test/typescript/integration/plugin-htlc-eth-besu-erc20/refund-endpoint.test.ts @@ -36,6 +36,7 @@ import { PluginKeychainMemory } from "@hyperledger/cactus-plugin-keychain-memory import TestTokenJSON from "../../../solidity/token-erc20-contract/Test_Token.json"; import DemoHelperJSON from "../../../solidity/token-erc20-contract/DemoHelpers.json"; import HashTimeLockJSON from "../../../../../../cactus-plugin-htlc-eth-besu-erc20/src/main/solidity/contracts/HashedTimeLockContract.json"; +import { AxiosError } from "axios"; const logLevel: LogLevelDesc = "INFO"; const estimatedGas = 6721975; @@ -584,8 +585,9 @@ test("Test invalid refund with invalid time", async (t: Test) => { }; const resRefund = await api.refundV1(refundRequest); t.equal(resRefund.status, 400, "response status is 400"); - } catch (error) { - t.equal(error.response.status, 400, "response status is 400"); + } catch (err) { + const e = err as AxiosError; + t.equal(e?.response?.status, 400, "response status is 400"); } t.comment("Get balance of account"); diff --git a/packages/cactus-test-plugin-htlc-eth-besu-erc20/src/test/typescript/integration/plugin-htlc-eth-besu-erc20/withdraw-endpoint-invalid-id.test.ts b/packages/cactus-test-plugin-htlc-eth-besu-erc20/src/test/typescript/integration/plugin-htlc-eth-besu-erc20/withdraw-endpoint-invalid-id.test.ts index ce0f1f4132..c29e568aaa 100644 --- a/packages/cactus-test-plugin-htlc-eth-besu-erc20/src/test/typescript/integration/plugin-htlc-eth-besu-erc20/withdraw-endpoint-invalid-id.test.ts +++ b/packages/cactus-test-plugin-htlc-eth-besu-erc20/src/test/typescript/integration/plugin-htlc-eth-besu-erc20/withdraw-endpoint-invalid-id.test.ts @@ -37,6 +37,7 @@ import DemoHelperJSON from "../../../solidity/token-erc20-contract/DemoHelpers.j import HashTimeLockJSON from "../../../../../../cactus-plugin-htlc-eth-besu-erc20/src/main/solidity/contracts/HashedTimeLockContract.json"; import { PluginKeychainMemory } from "@hyperledger/cactus-plugin-keychain-memory"; +import { AxiosError } from "axios"; const testCase = "Test invalid withdraw with invalid id"; @@ -248,8 +249,9 @@ describe(testCase, () => { }; const resWithdraw = await api.withdrawV1(withdrawRequest); expect(resWithdraw.status).toEqual(400); - } catch (error: any) { - expect(error.response.status).toEqual(400); + } catch (err) { + const e = err as AxiosError; + expect(e?.response?.status).toEqual(400); } const responseFinalBalance = await connector.invokeContract({ diff --git a/packages/cactus-test-plugin-htlc-eth-besu/src/test/typescript/integration/plugin-htlc-eth-besu/get-single-status-endpoint-invalid.test.ts b/packages/cactus-test-plugin-htlc-eth-besu/src/test/typescript/integration/plugin-htlc-eth-besu/get-single-status-endpoint-invalid.test.ts index d22c18ed64..3ca01b1b08 100644 --- a/packages/cactus-test-plugin-htlc-eth-besu/src/test/typescript/integration/plugin-htlc-eth-besu/get-single-status-endpoint-invalid.test.ts +++ b/packages/cactus-test-plugin-htlc-eth-besu/src/test/typescript/integration/plugin-htlc-eth-besu/get-single-status-endpoint-invalid.test.ts @@ -34,6 +34,7 @@ import { } from "@hyperledger/cactus-test-tooling"; import { DataTest } from "../data-test"; import DemoHelperJSON from "../../../solidity/contracts/DemoHelpers.json"; +import { AxiosError } from "axios"; const connectorId = uuidv4(); const logLevel: LogLevelDesc = "INFO"; @@ -204,8 +205,9 @@ describe(testCase, () => { keychainId: "", }); expect(res.status).toEqual(500); - } catch (e: any) { - expect(e.response.status).toEqual(500); + } catch (err) { + const e = err as AxiosError; + expect(e?.response?.status).toEqual(500); } }); }); diff --git a/packages/cactus-test-plugin-htlc-eth-besu/src/test/typescript/integration/plugin-htlc-eth-besu/get-status-endpoint-invalid.test.ts b/packages/cactus-test-plugin-htlc-eth-besu/src/test/typescript/integration/plugin-htlc-eth-besu/get-status-endpoint-invalid.test.ts index a6b7ccd2d6..6f29013777 100644 --- a/packages/cactus-test-plugin-htlc-eth-besu/src/test/typescript/integration/plugin-htlc-eth-besu/get-status-endpoint-invalid.test.ts +++ b/packages/cactus-test-plugin-htlc-eth-besu/src/test/typescript/integration/plugin-htlc-eth-besu/get-status-endpoint-invalid.test.ts @@ -35,6 +35,7 @@ import { import { DataTest } from "../data-test"; import DemoHelperJSON from "../../../solidity/contracts/DemoHelpers.json"; import HashTimeLockJSON from "../../../../../../cactus-plugin-htlc-eth-besu/src/main/solidity/contracts/HashTimeLock.json"; +import { AxiosError } from "axios"; const connectorId = uuidv4(); const logLevel: LogLevelDesc = "INFO"; @@ -206,8 +207,9 @@ describe(testCase, () => { keychainId: "", }); expect(res.status).toEqual(500); - } catch (e: any) { - expect(e.response.status).toEqual(500); + } catch (err) { + const e = err as AxiosError; + expect(e?.response?.status).toEqual(500); } }); }); diff --git a/packages/cactus-test-plugin-htlc-eth-besu/src/test/typescript/integration/plugin-htlc-eth-besu/openapi/openapi-validation.test.ts b/packages/cactus-test-plugin-htlc-eth-besu/src/test/typescript/integration/plugin-htlc-eth-besu/openapi/openapi-validation.test.ts index 3a8524c4cd..d205a66a2e 100644 --- a/packages/cactus-test-plugin-htlc-eth-besu/src/test/typescript/integration/plugin-htlc-eth-besu/openapi/openapi-validation.test.ts +++ b/packages/cactus-test-plugin-htlc-eth-besu/src/test/typescript/integration/plugin-htlc-eth-besu/openapi/openapi-validation.test.ts @@ -41,6 +41,7 @@ import HashTimeLockJSON from "../../../../../../../cactus-plugin-htlc-eth-besu/s import { installOpenapiValidationMiddleware } from "@hyperledger/cactus-core"; import { PluginHtlcEthBesu } from "@hyperledger/cactus-plugin-htlc-eth-besu"; +import { AxiosError } from "axios"; const connectorId = uuidv4(); const logLevel: LogLevelDesc = "INFO"; @@ -207,17 +208,18 @@ test(testCase, async (t: Test) => { try { await api.initializeV1(parameters as unknown as InitializeRequest); - } catch (e) { + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; t2.equal( - e.response.status, + e?.response?.status, 400, `Endpoint ${fInitialize} without required connectorId: response.status === 400 OK`, ); - const fields = e.response.data.map((param: { path: string }) => + const fields = e?.response?.data.map((param: { path: string }) => param.path.replace("/body/", ""), ); t2.ok( - fields.includes("connectorId"), + fields?.includes("connectorId"), "Rejected because connectorId is required", ); } @@ -237,17 +239,21 @@ test(testCase, async (t: Test) => { try { await api.initializeV1(parameters as unknown as InitializeRequest); - } catch (e) { + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; t2.equal( - e.response.status, - 400, - `Endpoint ${fInitialize} with fake=4: response.status === 400 OK`, - ); - const fields = e.response.data.map((param: { path: string }) => + e?.response?.status, + t2.equal( + e?.response?.status, + 400, + `Endpoint ${fInitialize} with fake=4: response.status === 400 OK`, + ), + ); + const fields = e?.response?.data.map((param: { path: string }) => param.path.replace("/body/", ""), ); t2.ok( - fields.includes("fake"), + fields?.includes("fake"), "Rejected because fake is not a valid parameter", ); } @@ -316,17 +322,21 @@ test(testCase, async (t: Test) => { }; try { await api.newContractV1(parameters as unknown as NewContractObj); - } catch (e) { + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; t2.equal( - e.response.status, - 400, - `Endpoint ${fNew} without required contractAddress: response.status === 400 OK`, - ); - const fields = e.response.data.map((param: { path: string }) => + e?.response?.status, + t2.equal( + e?.response?.status, + 400, + `Endpoint ${fNew} without required contractAddress: response.status === 400 OK`, + ), + ); + const fields = e?.response?.data.map((param: { path: string }) => param.path.replace("/body/", ""), ); t2.ok( - fields.includes("contractAddress"), + fields?.includes("contractAddress"), "Rejected because contractAddress is required", ); } @@ -352,17 +362,21 @@ test(testCase, async (t: Test) => { }; try { await api.newContractV1(parameters as unknown as NewContractObj); - } catch (e) { + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; t2.equal( - e.response.status, - 400, - `Endpoint ${fNew} with fake=4: response.status === 400 OK`, - ); - const fields = e.response.data.map((param: { path: string }) => + e?.response?.status, + t2.equal( + e?.response?.status, + 400, + `Endpoint ${fNew} with fake=4: response.status === 400 OK`, + ), + ); + const fields = e?.response?.data.map((param: { path: string }) => param.path.replace("/body/", ""), ); t2.ok( - fields.includes("fake"), + fields?.includes("fake"), "Rejected because fake is not a valid parameter", ); } @@ -415,16 +429,20 @@ test(testCase, async (t: Test) => { }; try { await api.refundV1(parameters as unknown as RefundReq); - } catch (e) { + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; t2.equal( - e.response.status, - 400, - `Endpoint ${fRefund} without required id: response.status === 400 OK`, - ); - const fields = e.response.data.map((param: { path: string }) => + e?.response?.status, + t2.equal( + e?.response?.status, + 400, + `Endpoint ${fRefund} without required id: response.status === 400 OK`, + ), + ); + const fields = e?.response?.data.map((param: { path: string }) => param.path.replace("/body/", ""), ); - t2.ok(fields.includes("id"), "Rejected because id is required"); + t2.ok(fields?.includes("id"), "Rejected because id is required"); } t2.end(); @@ -440,17 +458,21 @@ test(testCase, async (t: Test) => { }; try { await api.refundV1(parameters as unknown as RefundReq); - } catch (e) { + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; t2.equal( - e.response.status, - 400, - `Endpoint ${fRefund} with fake=4: response.status === 400 OK`, - ); - const fields = e.response.data.map((param: { path: string }) => + e?.response?.status, + t2.equal( + e?.response?.status, + 400, + `Endpoint ${fRefund} with fake=4: response.status === 400 OK`, + ), + ); + const fields = e?.response?.data.map((param: { path: string }) => param.path.replace("/body/", ""), ); t2.ok( - fields.includes("fake"), + fields?.includes("fake"), "Rejected because fake is not a valid parameter", ); } @@ -520,16 +542,20 @@ test(testCase, async (t: Test) => { try { await api.withdrawV1(parameters as unknown as WithdrawReq); - } catch (e) { + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; t2.equal( - e.response.status, - 400, - `Endpoint ${fWithdraw} without required id: response.status === 400 OK`, - ); - const fields = e.response.data.map((param: { path: string }) => + e?.response?.status, + t2.equal( + e?.response?.status, + 400, + `Endpoint ${fWithdraw} without required id: response.status === 400 OK`, + ), + ); + const fields = e?.response?.data.map((param: { path: string }) => param.path.replace("/body/", ""), ); - t2.ok(fields.includes("id"), "Rejected because id is required"); + t2.ok(fields?.includes("id"), "Rejected because id is required"); } t2.end(); @@ -548,17 +574,21 @@ test(testCase, async (t: Test) => { try { await api.withdrawV1(parameters as unknown as WithdrawReq); - } catch (e) { + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; t2.equal( - e.response.status, - 400, - `Endpoint ${fWithdraw} with fake=4: response.status === 400 OK`, - ); - const fields = e.response.data.map((param: { path: string }) => + e?.response?.status, + t2.equal( + e?.response?.status, + 400, + `Endpoint ${fWithdraw} with fake=4: response.status === 400 OK`, + ), + ); + const fields = e?.response?.data.map((param: { path: string }) => param.path.replace("/body/", ""), ); t2.ok( - fields.includes("fake"), + fields?.includes("fake"), "Rejected because fake is not a valid parameter", ); } @@ -637,16 +667,20 @@ test(testCase, async (t: Test) => { try { await api.getStatusV1(parameters as unknown as GetStatusRequest); - } catch (e) { + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; t2.equal( - e.response.status, - 400, - `Endpoint ${fStatus} without required ids: response.status === 400 OK`, - ); - const fields = e.response.data.map((param: { path: string }) => + e?.response?.status, + t2.equal( + e?.response?.status, + 400, + `Endpoint ${fStatus} without required ids: response.status === 400 OK`, + ), + ); + const fields = e?.response?.data.map((param: { path: string }) => param.path.replace("/body/", ""), ); - t2.ok(fields.includes("ids"), "Rejected because ids is required"); + t2.ok(fields?.includes("ids"), "Rejected because ids is required"); } t2.end(); @@ -663,17 +697,21 @@ test(testCase, async (t: Test) => { try { await api.getStatusV1(parameters as unknown as GetStatusRequest); - } catch (e) { + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; t2.equal( - e.response.status, - 400, - `Endpoint ${fStatus} with fake=4: response.status === 400 OK`, - ); - const fields = e.response.data.map((param: { path: string }) => + e?.response?.status, + t2.equal( + e?.response?.status, + 400, + `Endpoint ${fStatus} with fake=4: response.status === 400 OK`, + ), + ); + const fields = e?.response?.data.map((param: { path: string }) => param.path.replace("/body/", ""), ); t2.ok( - fields.includes("fake"), + fields?.includes("fake"), "Rejected because fake is not a valid parameter", ); } @@ -752,16 +790,20 @@ test(testCase, async (t: Test) => { await api.getSingleStatusV1( parameters as unknown as GetSingleStatusRequest, ); - } catch (e) { + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; t2.equal( - e.response.status, - 400, - `Endpoint ${fSingleStatus} without required id: response.status === 400 OK`, - ); - const fields = e.response.data.map((param: { path: string }) => + e?.response?.status, + t2.equal( + e?.response?.status, + 400, + `Endpoint ${fSingleStatus} without required id: response.status === 400 OK`, + ), + ); + const fields = e?.response?.data.map((param: { path: string }) => param.path.replace("/body/", ""), ); - t2.ok(fields.includes("id"), "Rejected because id is required"); + t2.ok(fields?.includes("id"), "Rejected because id is required"); } t2.end(); @@ -780,17 +822,21 @@ test(testCase, async (t: Test) => { await api.getSingleStatusV1( parameters as unknown as GetSingleStatusRequest, ); - } catch (e) { + } catch (err) { + const e = err as AxiosError<{ path: string }[]>; t2.equal( - e.response.status, - 400, - `Endpoint ${fSingleStatus} with fake=4: response.status === 400 OK`, - ); - const fields = e.response.data.map((param: { path: string }) => + e?.response?.status, + t2.equal( + e?.response?.status, + 400, + `Endpoint ${fSingleStatus} with fake=4: response.status === 400 OK`, + ), + ); + const fields = e?.response?.data.map((param: { path: string }) => param.path.replace("/body/", ""), ); t2.ok( - fields.includes("fake"), + fields?.includes("fake"), "Rejected because fake is not a valid parameter", ); } diff --git a/packages/cactus-test-plugin-ledger-connector-besu/src/test/typescript/integration/plugin-validator-besu/sign-transaction-endpoint.test.ts b/packages/cactus-test-plugin-ledger-connector-besu/src/test/typescript/integration/plugin-validator-besu/sign-transaction-endpoint.test.ts index 75c40ed146..4804c6a0ca 100644 --- a/packages/cactus-test-plugin-ledger-connector-besu/src/test/typescript/integration/plugin-validator-besu/sign-transaction-endpoint.test.ts +++ b/packages/cactus-test-plugin-ledger-connector-besu/src/test/typescript/integration/plugin-validator-besu/sign-transaction-endpoint.test.ts @@ -177,7 +177,7 @@ describe(testCase, () => { "0x46eac4d1d1ff81837698cbab38862a428ddf042f92855a72010de2771a7b704d", }; await api.signTransactionV1(notFoundRequest); - } catch (error: unknown) { + } catch (error) { if (axios.isAxiosError(error)) { expect(error.response?.status).toEqual(404); expect(error.response?.statusText).toEqual("Transaction not found"); diff --git a/packages/cactus-test-plugin-ledger-connector-besu/src/test/typescript/integration/plugin-validator-besu/v21-sign-transaction-endpoint.test.ts b/packages/cactus-test-plugin-ledger-connector-besu/src/test/typescript/integration/plugin-validator-besu/v21-sign-transaction-endpoint.test.ts index 7ca2508a1a..9bb157e68e 100644 --- a/packages/cactus-test-plugin-ledger-connector-besu/src/test/typescript/integration/plugin-validator-besu/v21-sign-transaction-endpoint.test.ts +++ b/packages/cactus-test-plugin-ledger-connector-besu/src/test/typescript/integration/plugin-validator-besu/v21-sign-transaction-endpoint.test.ts @@ -36,6 +36,7 @@ import { import { PluginRegistry } from "@hyperledger/cactus-core"; import { PluginKeychainMemory } from "@hyperledger/cactus-plugin-keychain-memory"; +import { AxiosError } from "axios"; const testCase = "Test sign transaction endpoint"; const logLevel: LogLevelDesc = "TRACE"; @@ -189,10 +190,11 @@ test(testCase, async (t: Test) => { "0x46eac4d1d1ff81837698cbab38862a428ddf042f92855a72010de2771a7b704d", }; await api.signTransactionV1(notFoundRequest); - } catch (error) { - t.equal(error.response.status, 404, "HTTP response status are equal"); + } catch (err) { + const e = err as AxiosError; + t.equal(e.response?.status, 404, "HTTP response status are equal"); t.equal( - error.response.statusText, + e.response?.statusText, "Transaction not found", "Response text are equal", ); diff --git a/packages/cactus-test-tooling/src/main/typescript/common/containers.ts b/packages/cactus-test-tooling/src/main/typescript/common/containers.ts index 4b575e9a4b..bf377ae829 100644 --- a/packages/cactus-test-tooling/src/main/typescript/common/containers.ts +++ b/packages/cactus-test-tooling/src/main/typescript/common/containers.ts @@ -105,7 +105,7 @@ export class Containers { return response; } catch (ex) { log.error("Failed to get diagnostics of Docker daemon", ex); - throw new RuntimeError("Failed to get diagnostics of Docker daemon", ex); + throw new RuntimeError(`Failed to get diagnostics of Docker daemon${ex}`); } } /** @@ -542,7 +542,8 @@ export class Containers { // `${fnTag} container crashed while awaiting healthheck -> ${ex.stack}`, // ); // } - if (Date.now() >= startedAt + timeoutMs) { + + if (Date.now() >= startedAt + timeoutMs && ex instanceof Error) { throw new Error(`${fnTag} timed out (${timeoutMs}ms) -> ${ex.stack}`); } reachable = false; diff --git a/packages/cactus-test-tooling/src/main/typescript/fabric/fabric-test-ledger-v1.ts b/packages/cactus-test-tooling/src/main/typescript/fabric/fabric-test-ledger-v1.ts index 8fba66f734..4381fc1924 100644 --- a/packages/cactus-test-tooling/src/main/typescript/fabric/fabric-test-ledger-v1.ts +++ b/packages/cactus-test-tooling/src/main/typescript/fabric/fabric-test-ledger-v1.ts @@ -215,7 +215,7 @@ export class FabricTestLedgerV1 implements ITestLedger { return new FabricCAServices(caUrl, tlsOptions, caName); } catch (ex) { this.log.error(`createCaClientV2() Failure:`, ex); - throw new RuntimeError(`${fnTag} Inner Exception:`, ex); + throw new RuntimeError(`${fnTag} Inner Exception: ${ex}`); } } @@ -225,7 +225,7 @@ export class FabricTestLedgerV1 implements ITestLedger { return this.createCaClientV2("org1"); } catch (ex) { this.log.error(`createCaClient() Failure:`, ex); - throw new RuntimeError(`${fnTag} Inner Exception:`, ex); + throw new RuntimeError(`${fnTag} Inner Exception: ${ex}`); } } @@ -293,7 +293,7 @@ export class FabricTestLedgerV1 implements ITestLedger { return [x509Identity, wallet]; } catch (ex) { this.log.error(`${fnTag} failed with inner exception:`, ex); - throw new RuntimeError(`${fnTag} failed with inner exception:`, ex); + throw new RuntimeError(`${fnTag} failed with inner exception: ${ex}`); } } @@ -306,7 +306,7 @@ export class FabricTestLedgerV1 implements ITestLedger { return out; } catch (ex) { this.log.error(`${fnTag} failed with inner exception:`, ex); - throw new RuntimeError(`${fnTag} failed with inner exception:`, ex); + throw new RuntimeError(`${fnTag} failed with inner exception: ${ex}`); } } @@ -357,7 +357,7 @@ export class FabricTestLedgerV1 implements ITestLedger { return [x509Identity, wallet]; } catch (ex) { this.log.error(`${fnTag} Failure:`, ex); - throw new RuntimeError(`${fnTag} Exception:`, ex); + throw new RuntimeError(`${fnTag} Exception: ${ex}`); } } @@ -368,7 +368,7 @@ export class FabricTestLedgerV1 implements ITestLedger { return out; } catch (ex) { this.log.error(`${fnTag} Failure:`, ex); - throw new RuntimeError(`${fnTag} Exception:`, ex); + throw new RuntimeError(`${fnTag} Exception: ${ex}`); } } diff --git a/packages/cactus-test-tooling/src/test/typescript/integration/common/containers.test.ts b/packages/cactus-test-tooling/src/test/typescript/integration/common/containers.test.ts index 12a6f5d63c..5f5550884d 100644 --- a/packages/cactus-test-tooling/src/test/typescript/integration/common/containers.test.ts +++ b/packages/cactus-test-tooling/src/test/typescript/integration/common/containers.test.ts @@ -115,7 +115,7 @@ describe(testCase, () => { }, }); fail(Containers.getDiagnostics); - } catch (ex: unknown) { + } catch (ex) { expect(ex).toBeTruthy(); const connectEN = "connect ENOENT "; const fullBadPath = connectEN.concat(badSocketPath); diff --git a/tools/generate-sbom.ts b/tools/generate-sbom.ts index e84329196a..c4e2bd6f54 100644 --- a/tools/generate-sbom.ts +++ b/tools/generate-sbom.ts @@ -124,7 +124,7 @@ const main = async (argv: string[], env: NodeJS.ProcessEnv) => { runtimeMs, }); console.log(logMessage); - } catch (ex: unknown) { + } catch (ex) { // If it was a syntax error in the package.json file // then we just log it as a warning and move on. if (ex instanceof ManifestParseError) { @@ -187,7 +187,7 @@ export async function lernaPkgList(req: { const pkgs = JSON.parse(stdout); const pkgNames = pkgs.map((x: { name: string }) => x.name); return { pkgNames }; - } catch (ex: unknown) { + } catch (ex) { const msg = `${TAG} Failed to execute shell CMD: ${shellCmd}`; const throwable = ex instanceof Error ? ex : fastSafeStringify(ex); throw new RuntimeError(msg, throwable); @@ -248,7 +248,7 @@ export async function generateSBoM(req: { console.error(`${TAG} stderr of the above command: ${stderr}`); } return { manifestFilePath, stderr, stdout }; - } catch (ex: unknown) { + } catch (ex) { const msg = `${TAG} Failed to execute shell CMD: ${shellCmd}`; if (ex instanceof Error && ex.message.includes("SyntaxError: ")) { throw new ManifestParseError(msg, ex); diff --git a/tools/npm-list.ts b/tools/npm-list.ts index 9bcb0758e7..db35d5e4ea 100644 --- a/tools/npm-list.ts +++ b/tools/npm-list.ts @@ -59,7 +59,7 @@ export async function npmList( console.error(`${TAG} stderr of the above command: ${stderr}`); } return JSON.parse(stdout); - } catch (ex: unknown) { + } catch (ex) { // We have to detect if npm is giving a non-zero exit code only because // it found some extraneous dependencies (in which case it's output of // the list of dependencies is still a valid JSON document that is still diff --git a/tsconfig.base.json b/tsconfig.base.json index 1290f6141f..abda772deb 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -75,6 +75,6 @@ /* Advanced Options */ "forceConsistentCasingInFileNames": true, /* Disallow inconsistently-cased references to the same file. */ "skipLibCheck": true, - "useUnknownInCatchVariables": false + "useUnknownInCatchVariables": true }, } \ No newline at end of file diff --git a/tsconfig.json b/tsconfig.json index 3bef46b01f..3cd557ea76 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -234,6 +234,6 @@ "esModuleInterop": true, "inlineSourceMap": true, "forceConsistentCasingInFileNames": true, - "useUnknownInCatchVariables": false + "useUnknownInCatchVariables": true } } diff --git a/weaver/core/drivers/fabric-driver/server/sample-satp.ts b/weaver/core/drivers/fabric-driver/server/sample-satp.ts index 6d8924c000..63da253788 100644 --- a/weaver/core/drivers/fabric-driver/server/sample-satp.ts +++ b/weaver/core/drivers/fabric-driver/server/sample-satp.ts @@ -1,357 +1,400 @@ -import satp_pb from '@hyperledger/cacti-weaver-protos-js/relay/satp_pb'; -import satp_grpc_pb from '@hyperledger/cacti-weaver-protos-js/relay/satp_grpc_pb'; -import driverPb from '@hyperledger/cacti-weaver-protos-js/driver/driver_pb'; -import logger from './logger'; -import { credentials } from '@grpc/grpc-js'; -import { SatpAssetManager, AssetManager, HashFunctions } from '@hyperledger/cacti-weaver-sdk-fabric' -import fs from 'fs'; -import { Gateway, Network } from 'fabric-network' +import satp_pb from "@hyperledger/cacti-weaver-protos-js/relay/satp_pb"; +import satp_grpc_pb from "@hyperledger/cacti-weaver-protos-js/relay/satp_grpc_pb"; +import driverPb from "@hyperledger/cacti-weaver-protos-js/driver/driver_pb"; +import logger from "./logger"; +import { credentials } from "@grpc/grpc-js"; +import { + SatpAssetManager, + AssetManager, + HashFunctions, +} from "@hyperledger/cacti-weaver-sdk-fabric"; +import fs from "fs"; +import { Gateway, Network } from "fabric-network"; import { getNetworkGateway } from "./fabric-code"; -import { getDriverKeyCert } from './walletSetup'; +import { getDriverKeyCert } from "./walletSetup"; async function performLockHelper( - performLockRequest: driverPb.PerformLockRequest, - networkName: string + performLockRequest: driverPb.PerformLockRequest, + networkName: string, ) { - - // TODO: remove the hardcoded values - let performLockRequest2 = {}; - performLockRequest2['target-network'] = 'network1'; - performLockRequest2['hashBase64'] = 'ivHErp1x4bJDKuRo6L5bApO/DdoyD/dG0mAZrzLZEIs='; - performLockRequest2['timeout-duration'] = parseInt('3600'); - performLockRequest2['locker'] = 'alice'; - performLockRequest2['recipient'] = 'bob'; - performLockRequest2['lockerWalletPath'] = '../wallet-network1/alice.id'; - performLockRequest2['recipientWalletPath'] = '../wallet-network1/bob.id'; - performLockRequest2['param'] = 'bond01:a05'; - performLockRequest2['channel'] = 'mychannel'; - performLockRequest2['chaincode-id'] = 'satpsimpleasset'; - - // Locker and recipient - const locker = performLockRequest2['locker']; - const recipient = performLockRequest2['recipient']; - const recipientWalletPath = performLockRequest2['recipientWalletPath']; - let hashFn = performLockRequest2['hash_fn']; - let hashBase64 = performLockRequest2['hashBase64']; - const targetNetwork = performLockRequest2['target-network']; - const channel = performLockRequest2['channel']; - const chaincodeId = performLockRequest2['chaincode-id']; - - // Hash - let hash: HashFunctions.Hash - if (hashFn == 'SHA512') { - hash = new HashFunctions.SHA512() + // TODO: remove the hardcoded values + const performLockRequest2 = {}; + performLockRequest2["target-network"] = "network1"; + performLockRequest2["hashBase64"] = + "ivHErp1x4bJDKuRo6L5bApO/DdoyD/dG0mAZrzLZEIs="; + performLockRequest2["timeout-duration"] = parseInt("3600"); + performLockRequest2["locker"] = "alice"; + performLockRequest2["recipient"] = "bob"; + performLockRequest2["lockerWalletPath"] = "../wallet-network1/alice.id"; + performLockRequest2["recipientWalletPath"] = "../wallet-network1/bob.id"; + performLockRequest2["param"] = "bond01:a05"; + performLockRequest2["channel"] = "mychannel"; + performLockRequest2["chaincode-id"] = "satpsimpleasset"; + + // Locker and recipient + const locker = performLockRequest2["locker"]; + const recipient = performLockRequest2["recipient"]; + const recipientWalletPath = performLockRequest2["recipientWalletPath"]; + const hashFn = performLockRequest2["hash_fn"]; + const hashBase64 = performLockRequest2["hashBase64"]; + const targetNetwork = performLockRequest2["target-network"]; + const channel = performLockRequest2["channel"]; + const chaincodeId = performLockRequest2["chaincode-id"]; + + // Hash + let hash: HashFunctions.Hash; + if (hashFn == "SHA512") { + hash = new HashFunctions.SHA512(); + } else { + hash = new HashFunctions.SHA256(); + } + + if (hashBase64) { + hash.setSerializedHashBase64(hashBase64); + } else { + logger.info(`No hash provided, using random preimage`); + } + + // Timeout + let timeout = 0; + const currTime = Math.floor(Date.now() / 1000); + if (performLockRequest2["timeout-epoch"]) { + timeout = performLockRequest2["timeout-epoch"]; + } else if (performLockRequest2["timeout-duration"]) { + timeout = currTime + performLockRequest2["timeout-duration"]; + } + + const gateway: Gateway = await getNetworkGateway(networkName); + const network: Network = await gateway.getNetwork(channel); + const contract = network.getContract(chaincodeId); + + const params = performLockRequest2["param"].split(":"); + const recipientCert = Buffer.from(recipientWalletPath).toString("base64"); + + let funcToCall, asset; + + try { + if (performLockRequest2["fungible"]) { + funcToCall = AssetManager.createFungibleHTLC; + asset = "Fungible Asset"; } else { - hash = new HashFunctions.SHA256() + funcToCall = AssetManager.createHTLC; + asset = "Asset"; } - if (hashBase64) { - hash.setSerializedHashBase64(hashBase64) + logger.info(`Asset Lock: Lock ${asset}:\n`); + + logger.info( + `Trying ${asset} Lock: ${params[0]}, ${params[1]} by ${locker} for ${recipient}`, + ); + const res = await funcToCall( + contract, + params[0], + params[1], + recipientCert, + hash, + timeout, + null, + ); + if (!res.result) { + throw new Error(); } - else { - logger.info(`No hash provided, using random preimage`) + logger.info( + `${asset} Locked with Contract Id: ${res.result}, preimage: ${res.hash.getPreimage()}, hashvalue: ${res.hash.getSerializedHashBase64()}`, + ); + logger.info("Asset has been locked successfully"); + } catch (error) { + logger.error(`Could not Lock ${asset} in ${targetNetwork}`); + } finally { + if (gateway) { + await gateway.disconnect(); + logger.info("Gateway disconnected."); } + } - // Timeout - let timeout = 0; - const currTime = Math.floor(Date.now() / 1000); - if (performLockRequest2['timeout-epoch']) { - timeout = performLockRequest2['timeout-epoch'] - } - else if (performLockRequest2['timeout-duration']) { - timeout = currTime + performLockRequest2['timeout-duration'] - } + const client = getRelayClientForAssetStatusResponse(); + const request = new satp_pb.SendAssetStatusRequest(); + request.setSessionId(performLockRequest.getSessionId()); + request.setStatus("Locked"); + client.sendAssetStatus(request, relayCallback); +} - let gateway: Gateway = await getNetworkGateway(networkName); - const network: Network = await gateway.getNetwork(channel); +async function createAssetHelper( + createAssetRequest: driverPb.CreateAssetRequest, + networkName: string, +) { + // TODO: remove the hardcoded values + const createAssetRequest2 = {}; + createAssetRequest2["target-network"] = "network1"; + createAssetRequest2["hashBase64"] = + "ivHErp1x4bJDKuRo6L5bApO/DdoyD/dG0mAZrzLZEIs="; + createAssetRequest2["timeout-duration"] = parseInt("3600"); + createAssetRequest2["owner"] = "admin"; + createAssetRequest2["type"] = "bond"; + createAssetRequest2["assetType"] = "bond01"; + createAssetRequest2["id"] = "a0demo"; + createAssetRequest2["issuer"] = "admin"; + createAssetRequest2["facevalue"] = "300"; + createAssetRequest2["maturitydate"] = "05 May 48 00:00 MST"; + createAssetRequest2["channel"] = "mychannel"; + createAssetRequest2["chaincode-id"] = "satpsimpleasset"; + + const owner = createAssetRequest2["owner"]; + const ccType = createAssetRequest2["type"]; + const assetType = createAssetRequest2["assetType"]; + const id = createAssetRequest2["id"]; + const issuer = createAssetRequest2["issuer"]; + const facevalue = createAssetRequest2["facevalue"]; + const maturitydate = createAssetRequest2["maturitydate"]; + const tokenassettype = createAssetRequest2["tokenassettype"]; + const numunits = createAssetRequest2["numunits"]; + const channel = createAssetRequest2["channel"]; + const chaincodeId = createAssetRequest2["chaincode-id"]; + + const gateway: Gateway = await getNetworkGateway(networkName); + const network: Network = await gateway.getNetwork(channel); + + try { const contract = network.getContract(chaincodeId); + const currentQuery = { + channel: channel, + contractName: chaincodeId, + ccFunc: "", + args: [], + }; + + const driverkeyCert = await getDriverKeyCert(); + const certificate = Buffer.from(driverkeyCert.cert).toString("base64"); + + if (ccType == "bond") { + currentQuery.ccFunc = "CreateAsset"; + currentQuery.args = [ + ...currentQuery.args, + assetType, + id, + certificate, + issuer, + facevalue, + maturitydate, + ]; + } else if (ccType == "token") { + currentQuery.ccFunc = "IssueTokenAssets"; + currentQuery.args = [ + ...currentQuery.args, + tokenassettype, + numunits, + certificate, + ]; + } else { + throw new Error(`Unrecognized asset category: ${ccType}`); + } + logger.info(currentQuery); + + logger.info( + `Trying creating the asset: type: ${ccType}, id: ${id}, by: ${owner}, facevalue: ${facevalue}, maturitydate: ${maturitydate}`, + ); + const read = await contract.submitTransaction( + currentQuery.ccFunc, + ...currentQuery.args, + ); + const state = Buffer.from(read).toString(); + if (state) { + logger.debug(`Response From Network: ${state}`); + logger.info("Asset has been created successfully"); + } else { + logger.debug("No Response from network"); + } + } catch (error) { + logger.error(`Failed to submit transaction: ${error}`); + throw new Error(error); + } finally { + if (gateway) { + await gateway.disconnect(); + logger.info("Gateway disconnected."); + } + } - const params = performLockRequest2['param'].split(':') - const recipientCert = Buffer.from(recipientWalletPath).toString('base64') + const client = getRelayClientForAssetStatusResponse(); + const request = new satp_pb.SendAssetStatusRequest(); + request.setSessionId(createAssetRequest.getSessionId()); + request.setStatus("Created"); + client.sendAssetStatus(request, relayCallback); +} - let funcToCall, asset +async function extinguishHelper(extinguishRequest: driverPb.ExtinguishRequest) { + // TODO: run the appropriate extinguish logic + const client = getRelayClientForAssetStatusResponse(); + const request = new satp_pb.SendAssetStatusRequest(); + request.setSessionId(extinguishRequest.getSessionId()); + request.setStatus("Extinguished"); + client.sendAssetStatus(request, relayCallback); +} +async function assignAssetHelper( + assignAssetRequest: driverPb.AssignAssetRequest, + networkName: string, +) { + // TODO: remove the hardcoded values + const assignAssetRequest2 = {}; + assignAssetRequest2["target-network"] = "network1"; + assignAssetRequest2["hashBase64"] = + "ivHErp1x4bJDKuRo6L5bApO/DdoyD/dG0mAZrzLZEIs="; + assignAssetRequest2["timeout-duration"] = parseInt("3600"); + assignAssetRequest2["locker"] = "admin"; + assignAssetRequest2["recipient"] = "bob"; + assignAssetRequest2["fungible"] = false; + assignAssetRequest2["contract-id"] = "abc01"; + assignAssetRequest2["hash_fn"] = ""; + assignAssetRequest2["secret"] = "secrettext"; + assignAssetRequest2["param"] = "bond01:a0demo"; + assignAssetRequest2["channel"] = "mychannel"; + assignAssetRequest2["chaincode-id"] = "satpsimpleasset"; + + const targetNetwork = assignAssetRequest2["target-network"]; + const locker = assignAssetRequest2["locker"]; + const recipient = assignAssetRequest2["recipient"]; + const fungible = assignAssetRequest2["fungible"]; + const hashFn = assignAssetRequest2["hash_fn"]; + const secret = assignAssetRequest2["secret"]; + const channel = assignAssetRequest2["channel"]; + const chaincodeId = assignAssetRequest2["chaincode-id"]; + + const gateway: Gateway = await getNetworkGateway(networkName); + const network: Network = await gateway.getNetwork(channel); + const contract = network.getContract(chaincodeId); + + // Hash + let hash: HashFunctions.Hash; + if (hashFn === "SHA512") { + hash = new HashFunctions.SHA512(); + } else { + hash = new HashFunctions.SHA256(); + } + hash.setPreimage(secret); + + let contractId: string = null; + if (assignAssetRequest2["contract-id"]) { + contractId = assignAssetRequest2["contract-id"]; + } + + const params = assignAssetRequest2["param"].split(":"); + + const funcToCall = SatpAssetManager.assignAsset; + let asset = assignAssetRequest2["param"]; + + if (assignAssetRequest2["fungible"]) { + // funcToCall = SatpAssetManager.claimFungibleAssetInHTLC + asset = "Fungible Asset"; + } + + if (fungible) { try { - if (performLockRequest2['fungible']) { - funcToCall = AssetManager.createFungibleHTLC - asset = 'Fungible Asset' - } else { - funcToCall = AssetManager.createHTLC - asset = 'Asset' - } - - logger.info(`Asset Lock: Lock ${asset}:\n`); - - logger.info(`Trying ${asset} Lock: ${params[0]}, ${params[1]} by ${locker} for ${recipient}`) - const res = await funcToCall(contract, - params[0], - params[1], - recipientCert, - hash, - timeout, - null) - if (!res.result) { - throw new Error() - } - logger.info(`${asset} Locked with Contract Id: ${res.result}, preimage: ${res.hash.getPreimage()}, hashvalue: ${res.hash.getSerializedHashBase64()}`) - logger.info('Asset has been locked successfully') + logger.info(`Trying assigning the asset with contract id ${contractId}`); + // TODO } catch (error) { - logger.error(`Could not Lock ${asset} in ${targetNetwork}`) + logger.error(`Could not assign ${asset} in ${targetNetwork}`); + throw new Error(`Could not assign ${asset} in ${targetNetwork}`); } finally { - if (gateway) { - await gateway.disconnect(); - logger.info('Gateway disconnected.'); - } + if (gateway) { + await gateway.disconnect(); + logger.info("Gateway disconnected."); + } } - - const client = getRelayClientForAssetStatusResponse(); - const request = new satp_pb.SendAssetStatusRequest(); - request.setSessionId(performLockRequest.getSessionId()); - request.setStatus("Locked"); - client.sendAssetStatus(request, relayCallback); -} - -async function createAssetHelper( - createAssetRequest: driverPb.CreateAssetRequest, - networkName: string -) { - - // TODO: remove the hardcoded values - let createAssetRequest2 = {}; - createAssetRequest2['target-network'] = 'network1'; - createAssetRequest2['hashBase64'] = 'ivHErp1x4bJDKuRo6L5bApO/DdoyD/dG0mAZrzLZEIs='; - createAssetRequest2['timeout-duration'] = parseInt('3600'); - createAssetRequest2['owner'] = 'admin'; - createAssetRequest2['type'] = 'bond'; - createAssetRequest2['assetType'] = 'bond01'; - createAssetRequest2['id'] = 'a0demo'; - createAssetRequest2['issuer'] = 'admin'; - createAssetRequest2['facevalue'] = '300'; - createAssetRequest2['maturitydate'] = '05 May 48 00:00 MST'; - createAssetRequest2['channel'] = 'mychannel'; - createAssetRequest2['chaincode-id'] = 'satpsimpleasset'; - - const owner = createAssetRequest2['owner']; - const ccType = createAssetRequest2['type']; - const assetType = createAssetRequest2['assetType']; - const id = createAssetRequest2['id']; - const issuer = createAssetRequest2['issuer']; - const facevalue = createAssetRequest2['facevalue']; - const maturitydate = createAssetRequest2['maturitydate']; - const tokenassettype = createAssetRequest2['tokenassettype']; - const numunits = createAssetRequest2['numunits']; - const channel = createAssetRequest2['channel']; - const chaincodeId = createAssetRequest2['chaincode-id']; - - let gateway: Gateway = await getNetworkGateway(networkName); - const network: Network = await gateway.getNetwork(channel); - + } else { try { - const contract = network.getContract(chaincodeId); - const currentQuery = { - channel: channel, - contractName: chaincodeId, - ccFunc: '', - args: [] - } - - const driverkeyCert = await getDriverKeyCert(); - const certificate = Buffer.from(driverkeyCert.cert).toString('base64') - - if (ccType == 'bond') { - currentQuery.ccFunc = 'CreateAsset' - currentQuery.args = [...currentQuery.args, assetType, id, certificate, issuer, facevalue, maturitydate] - } else if (ccType == 'token') { - currentQuery.ccFunc = 'IssueTokenAssets' - currentQuery.args = [...currentQuery.args, tokenassettype, numunits, certificate] - } else { - throw new Error(`Unrecognized asset category: ${ccType}`) - } - logger.info(currentQuery) - - logger.info(`Trying creating the asset: type: ${ccType}, id: ${id}, by: ${owner}, facevalue: ${facevalue}, maturitydate: ${maturitydate}`) - const read = await contract.submitTransaction(currentQuery.ccFunc, ...currentQuery.args) - const state = Buffer.from(read).toString() - if (state) { - logger.debug(`Response From Network: ${state}`) - logger.info('Asset has been created successfully') - } else { - logger.debug('No Response from network') - } + const driverkeyCert = await getDriverKeyCert(); + const certificate = Buffer.from(driverkeyCert.cert).toString("base64"); + + logger.info( + `Trying assign asset with params: ${params[0]}, ${params[1]} locked by ${locker} for ${recipient}`, + ); + const res = await funcToCall( + contract, + params[0], + params[1], + certificate, + hash, + ); + if (!res) { + throw new Error(); + } + logger.info(`${asset} assigned complete: ${res}`); + logger.info(`Asset ${asset} assign complete: ${res}`); } catch (error) { - logger.error(`Failed to submit transaction: ${error}`) - throw new Error(error) + logger.error( + `Could not assign non-fungible ${asset} in ${targetNetwork}: ${error}`, + ); + throw new Error( + `Could not assign non-fungible ${asset} in ${targetNetwork}: ${error}`, + ); } finally { - if (gateway) { - await gateway.disconnect(); - logger.info('Gateway disconnected.'); - } + if (gateway) { + await gateway.disconnect(); + logger.info("Gateway disconnected."); + } } const client = getRelayClientForAssetStatusResponse(); const request = new satp_pb.SendAssetStatusRequest(); - request.setSessionId(createAssetRequest.getSessionId()); - request.setStatus("Created"); - client.sendAssetStatus(request, relayCallback); -} - -async function extinguishHelper( - extinguishRequest: driverPb.ExtinguishRequest -) { - - // TODO: run the appropriate extinguish logic - const client = getRelayClientForAssetStatusResponse(); - const request = new satp_pb.SendAssetStatusRequest(); - request.setSessionId(extinguishRequest.getSessionId()); - request.setStatus("Extinguished"); + request.setSessionId(assignAssetRequest.getSessionId()); + request.setStatus("Finalized"); client.sendAssetStatus(request, relayCallback); -} - -async function assignAssetHelper( - assignAssetRequest: driverPb.AssignAssetRequest, - networkName: string -) { - - // TODO: remove the hardcoded values - let assignAssetRequest2 = {}; - assignAssetRequest2['target-network'] = 'network1'; - assignAssetRequest2['hashBase64'] = 'ivHErp1x4bJDKuRo6L5bApO/DdoyD/dG0mAZrzLZEIs='; - assignAssetRequest2['timeout-duration'] = parseInt('3600'); - assignAssetRequest2['locker'] = 'admin'; - assignAssetRequest2['recipient'] = 'bob'; - assignAssetRequest2['fungible'] = false; - assignAssetRequest2['contract-id'] = 'abc01'; - assignAssetRequest2['hash_fn'] = ''; - assignAssetRequest2['secret'] = 'secrettext'; - assignAssetRequest2['param'] = 'bond01:a0demo'; - assignAssetRequest2['channel'] = 'mychannel'; - assignAssetRequest2['chaincode-id'] = 'satpsimpleasset'; - - const targetNetwork = assignAssetRequest2['target-network']; - const locker = assignAssetRequest2['locker']; - const recipient = assignAssetRequest2['recipient']; - const fungible = assignAssetRequest2['fungible']; - const hashFn = assignAssetRequest2['hash_fn']; - const secret = assignAssetRequest2['secret']; - const channel = assignAssetRequest2['channel']; - const chaincodeId = assignAssetRequest2['chaincode-id']; - - let gateway: Gateway = await getNetworkGateway(networkName); - const network: Network = await gateway.getNetwork(channel); - const contract = network.getContract(chaincodeId); - - // Hash - let hash: HashFunctions.Hash - if (hashFn === 'SHA512') { - hash = new HashFunctions.SHA512() - } else { - hash = new HashFunctions.SHA256() - } - hash.setPreimage(secret) - - let contractId: string = null - if (assignAssetRequest2['contract-id']) { - contractId = assignAssetRequest2['contract-id'] - } - - const params = assignAssetRequest2['param'].split(':') - - let funcToCall = SatpAssetManager.assignAsset - let asset = assignAssetRequest2['param'] - - if (assignAssetRequest2['fungible']) { - // funcToCall = SatpAssetManager.claimFungibleAssetInHTLC - asset = 'Fungible Asset' - } - - if (fungible) { - try { - logger.info(`Trying assigning the asset with contract id ${contractId}`) - - // TODO - } catch (error) { - logger.error(`Could not assign ${asset} in ${targetNetwork}`) - throw new Error(`Could not assign ${asset} in ${targetNetwork}`) - } finally { - if (gateway) { - await gateway.disconnect(); - logger.info('Gateway disconnected.'); - } - } - } else { - try { - const driverkeyCert = await getDriverKeyCert(); - const certificate = Buffer.from(driverkeyCert.cert).toString('base64') - - logger.info(`Trying assign asset with params: ${params[0]}, ${params[1]} locked by ${locker} for ${recipient}`) - const res = await funcToCall(contract, - params[0], - params[1], - certificate, - hash) - if (!res) { - throw new Error() - } - logger.info(`${asset} assigned complete: ${res}`) - logger.info(`Asset ${asset} assign complete: ${res}`) - } catch (error) { - logger.error(`Could not assign non-fungible ${asset} in ${targetNetwork}: ${error}`) - throw new Error(`Could not assign non-fungible ${asset} in ${targetNetwork}: ${error}`) - } finally { - if (gateway) { - await gateway.disconnect(); - logger.info('Gateway disconnected.'); - } - } - - const client = getRelayClientForAssetStatusResponse(); - const request = new satp_pb.SendAssetStatusRequest(); - request.setSessionId(assignAssetRequest.getSessionId()); - request.setStatus("Finalized"); - client.sendAssetStatus(request, relayCallback); - } + } } function getRelayClientForAssetStatusResponse() { - let client: satp_grpc_pb.SATPClient; - if (process.env.RELAY_TLS === 'true') { - if (!process.env.RELAY_TLSCA_CERT_PATH || process.env.RELAY_TLSCA_CERT_PATH == "") { - client = new satp_grpc_pb.SATPClient( - process.env.RELAY_ENDPOINT, - credentials.createSsl() - ); - } else { - if (!(process.env.RELAY_TLSCA_CERT_PATH && fs.existsSync(process.env.RELAY_TLSCA_CERT_PATH))) { - throw new Error("Missing or invalid RELAY_TLSCA_CERT_PATH: " + process.env.RELAY_TLSCA_CERT_PATH); - } - const rootCert = fs.readFileSync(process.env.RELAY_TLSCA_CERT_PATH); - client = new satp_grpc_pb.SATPClient( - process.env.RELAY_ENDPOINT, - credentials.createSsl(rootCert) - ); - } + let client: satp_grpc_pb.SATPClient; + if (process.env.RELAY_TLS === "true") { + if ( + !process.env.RELAY_TLSCA_CERT_PATH || + process.env.RELAY_TLSCA_CERT_PATH == "" + ) { + client = new satp_grpc_pb.SATPClient( + process.env.RELAY_ENDPOINT, + credentials.createSsl(), + ); } else { - client = new satp_grpc_pb.SATPClient( - process.env.RELAY_ENDPOINT, - credentials.createInsecure() + if ( + !( + process.env.RELAY_TLSCA_CERT_PATH && + fs.existsSync(process.env.RELAY_TLSCA_CERT_PATH) + ) + ) { + throw new Error( + "Missing or invalid RELAY_TLSCA_CERT_PATH: " + + process.env.RELAY_TLSCA_CERT_PATH, ); + } + const rootCert = fs.readFileSync(process.env.RELAY_TLSCA_CERT_PATH); + client = new satp_grpc_pb.SATPClient( + process.env.RELAY_ENDPOINT, + credentials.createSsl(rootCert), + ); } - return client; + } else { + client = new satp_grpc_pb.SATPClient( + process.env.RELAY_ENDPOINT, + credentials.createInsecure(), + ); + } + return client; } // handle callback function relayCallback(err: any, response: any) { - if (response) { - logger.info(`Relay Callback Response: ${JSON.stringify(response.toObject())}`); - } else if (err) { - logger.error(`Relay Callback Error: ${err}`); - } + if (response) { + logger.info( + `Relay Callback Response: ${JSON.stringify(response.toObject())}`, + ); + } else if (err) { + logger.error(`Relay Callback Error: ${err}`); + } } export { - performLockHelper, - createAssetHelper, - extinguishHelper, - assignAssetHelper -} + performLockHelper, + createAssetHelper, + extinguishHelper, + assignAssetHelper, +}; diff --git a/weaver/core/drivers/fabric-driver/server/server.ts b/weaver/core/drivers/fabric-driver/server/server.ts index 31c0bfd2dc..1a5bdcce85 100644 --- a/weaver/core/drivers/fabric-driver/server/server.ts +++ b/weaver/core/drivers/fabric-driver/server/server.ts @@ -4,26 +4,45 @@ * SPDX-License-Identifier: Apache-2.0 */ -import fs from 'fs'; -import { Server, ServerCredentials, credentials } from '@grpc/grpc-js'; -import ack_pb from '@hyperledger/cacti-weaver-protos-js/common/ack_pb'; -import query_pb from '@hyperledger/cacti-weaver-protos-js/common/query_pb'; -import fabricViewPb from '@hyperledger/cacti-weaver-protos-js/fabric/view_data_pb'; -import eventsPb from '@hyperledger/cacti-weaver-protos-js/common/events_pb'; -import driver_pb_grpc from '@hyperledger/cacti-weaver-protos-js/driver/driver_grpc_pb'; -import datatransfer_grpc_pb from '@hyperledger/cacti-weaver-protos-js/relay/datatransfer_grpc_pb'; -import state_pb from '@hyperledger/cacti-weaver-protos-js/common/state_pb'; -import { invoke, packageFabricView } from './fabric-code'; -import 'dotenv/config'; -import { loadEventSubscriptionsFromStorage, monitorBlockForMissedEvents } from './listener' -import { walletSetup } from './walletSetup'; -import { subscribeEventHelper, unsubscribeEventHelper, signEventSubscriptionQuery, writeExternalStateHelper } from "./events" -import { performLockHelper, createAssetHelper, extinguishHelper, assignAssetHelper } from "./sample-satp" -import * as path from 'path'; -import { handlePromise, relayCallback, getRelayClientForQueryResponse, getRelayClientForEventSubscription, delay } from './utils'; -import { dbConnectionTest, eventSubscriptionTest } from "./tests" -import driverPb from '@hyperledger/cacti-weaver-protos-js/driver/driver_pb'; -import logger from './logger'; +import fs from "fs"; +import { Server, ServerCredentials, credentials } from "@grpc/grpc-js"; +import ack_pb from "@hyperledger/cacti-weaver-protos-js/common/ack_pb"; +import query_pb from "@hyperledger/cacti-weaver-protos-js/common/query_pb"; +import fabricViewPb from "@hyperledger/cacti-weaver-protos-js/fabric/view_data_pb"; +import eventsPb from "@hyperledger/cacti-weaver-protos-js/common/events_pb"; +import driver_pb_grpc from "@hyperledger/cacti-weaver-protos-js/driver/driver_grpc_pb"; +import datatransfer_grpc_pb from "@hyperledger/cacti-weaver-protos-js/relay/datatransfer_grpc_pb"; +import state_pb from "@hyperledger/cacti-weaver-protos-js/common/state_pb"; +import { invoke, packageFabricView } from "./fabric-code"; +import "dotenv/config"; +import { + loadEventSubscriptionsFromStorage, + monitorBlockForMissedEvents, +} from "./listener"; +import { walletSetup } from "./walletSetup"; +import { + subscribeEventHelper, + unsubscribeEventHelper, + signEventSubscriptionQuery, + writeExternalStateHelper, +} from "./events"; +import { + performLockHelper, + createAssetHelper, + extinguishHelper, + assignAssetHelper, +} from "./sample-satp"; +import * as path from "path"; +import { + handlePromise, + relayCallback, + getRelayClientForQueryResponse, + getRelayClientForEventSubscription, + delay, +} from "./utils"; +import { dbConnectionTest, eventSubscriptionTest } from "./tests"; +import driverPb from "@hyperledger/cacti-weaver-protos-js/driver/driver_pb"; +import logger from "./logger"; if (process.env.DEBUG === "true") { logger.level = "debug"; @@ -50,11 +69,10 @@ function mockCommunication(query: query_pb.Query) { meta.setProtocol(state_pb.Meta.Protocol.FABRIC); const view = new state_pb.View(); view.setMeta(meta); - const viewDataBinary = - fabricViewPb.FabricView.deserializeBinary( - //@ts-ignore - mockedB64Data, - ).serializeBinary(); + const viewDataBinary = fabricViewPb.FabricView.deserializeBinary( + //@ts-ignore + mockedB64Data, + ).serializeBinary(); logger.info(`viewData ${viewDataBinary}`); view.setData(viewDataBinary); const viewPayload = new state_pb.ViewPayload(); @@ -256,109 +274,162 @@ server.addService(driver_pb_grpc.DriverCommunicationService, { const viewPayload: state_pb.ViewPayload = call.request.getViewPayload(); const requestId: string = viewPayload.getRequestId(); - writeExternalStateHelper(call.request, process.env.NETWORK_NAME ? process.env.NETWORK_NAME : 'network1').then(() => { - const ack_response = new ack_pb.Ack(); - ack_response.setRequestId(requestId); - ack_response.setMessage('Successfully written to the ledger'); - ack_response.setStatus(ack_pb.Ack.STATUS.OK); - // gRPC response. - logger.info(`Responding to caller with Ack: ${JSON.stringify(ack_response.toObject())}`); - callback(null, ack_response); - }).catch((error) => { - const ack_err_response = new ack_pb.Ack(); - ack_err_response.setRequestId(requestId); - ack_err_response.setMessage(error.toString()); - ack_err_response.setStatus(ack_pb.Ack.STATUS.ERROR); - // gRPC response. - logger.info(`Responding to caller with error Ack: ${JSON.stringify(ack_err_response.toObject())}`); - callback(null, ack_err_response); - }); - }, - performLock: (call: { request: driverPb.PerformLockRequest }, callback: (_: any, object: ack_pb.Ack) => void) => { - const requestId: string = call.request.getSessionId(); - - performLockHelper(call.request, process.env.NETWORK_NAME ? process.env.NETWORK_NAME : 'network1').then(() => { - const ack_response = new ack_pb.Ack(); - ack_response.setRequestId(requestId); - ack_response.setMessage('Successfully locked the asset'); - ack_response.setStatus(ack_pb.Ack.STATUS.OK); - // gRPC response. - logger.info(`Responding to caller with Ack: ${JSON.stringify(ack_response.toObject())}`); - callback(null, ack_response); - }).catch((error) => { - const ack_err_response = new ack_pb.Ack(); - ack_err_response.setRequestId(requestId); - ack_err_response.setMessage(error.toString()); - ack_err_response.setStatus(ack_pb.Ack.STATUS.ERROR); - // gRPC response. - logger.info(`Responding to caller with error Ack: ${JSON.stringify(ack_err_response.toObject())}`); - callback(null, ack_err_response); - }); - }, - createAsset: (call: { request: driverPb.CreateAssetRequest }, callback: (_: any, object: ack_pb.Ack) => void) => { - const requestId: string = call.request.getSessionId(); + writeExternalStateHelper( + call.request, + process.env.NETWORK_NAME ? process.env.NETWORK_NAME : "network1", + ) + .then(() => { + const ack_response = new ack_pb.Ack(); + ack_response.setRequestId(requestId); + ack_response.setMessage("Successfully written to the ledger"); + ack_response.setStatus(ack_pb.Ack.STATUS.OK); + // gRPC response. + logger.info( + `Responding to caller with Ack: ${JSON.stringify(ack_response.toObject())}`, + ); + callback(null, ack_response); + }) + .catch((error) => { + const ack_err_response = new ack_pb.Ack(); + ack_err_response.setRequestId(requestId); + ack_err_response.setMessage(error.toString()); + ack_err_response.setStatus(ack_pb.Ack.STATUS.ERROR); + // gRPC response. + logger.info( + `Responding to caller with error Ack: ${JSON.stringify(ack_err_response.toObject())}`, + ); + callback(null, ack_err_response); + }); + }, + performLock: ( + call: { request: driverPb.PerformLockRequest }, + callback: (_: any, object: ack_pb.Ack) => void, + ) => { + const requestId: string = call.request.getSessionId(); - createAssetHelper(call.request, process.env.NETWORK_NAME ? process.env.NETWORK_NAME : 'network1').then(() => { - const ack_response = new ack_pb.Ack(); - ack_response.setRequestId(requestId); - ack_response.setMessage('Successfully created the asset'); - ack_response.setStatus(ack_pb.Ack.STATUS.OK); - // gRPC response. - logger.info(`Responding to caller with Ack: ${JSON.stringify(ack_response.toObject())}`); - callback(null, ack_response); - }).catch((error) => { - const ack_err_response = new ack_pb.Ack(); - ack_err_response.setRequestId(requestId); - ack_err_response.setMessage(error.toString()); - ack_err_response.setStatus(ack_pb.Ack.STATUS.ERROR); - // gRPC response. - logger.info(`Responding to caller with error Ack: ${JSON.stringify(ack_err_response.toObject())}`); - callback(null, ack_err_response); - }); - }, - extinguish: (call: { request: driverPb.ExtinguishRequest }, callback: (_: any, object: ack_pb.Ack) => void) => { - const requestId: string = call.request.getSessionId(); + performLockHelper( + call.request, + process.env.NETWORK_NAME ? process.env.NETWORK_NAME : "network1", + ) + .then(() => { + const ack_response = new ack_pb.Ack(); + ack_response.setRequestId(requestId); + ack_response.setMessage("Successfully locked the asset"); + ack_response.setStatus(ack_pb.Ack.STATUS.OK); + // gRPC response. + logger.info( + `Responding to caller with Ack: ${JSON.stringify(ack_response.toObject())}`, + ); + callback(null, ack_response); + }) + .catch((error) => { + const ack_err_response = new ack_pb.Ack(); + ack_err_response.setRequestId(requestId); + ack_err_response.setMessage(error.toString()); + ack_err_response.setStatus(ack_pb.Ack.STATUS.ERROR); + // gRPC response. + logger.info( + `Responding to caller with error Ack: ${JSON.stringify(ack_err_response.toObject())}`, + ); + callback(null, ack_err_response); + }); + }, + createAsset: ( + call: { request: driverPb.CreateAssetRequest }, + callback: (_: any, object: ack_pb.Ack) => void, + ) => { + const requestId: string = call.request.getSessionId(); - extinguishHelper(call.request).then(() => { - const ack_response = new ack_pb.Ack(); - ack_response.setRequestId(requestId); - ack_response.setMessage('Successfully extinguished the asset'); - ack_response.setStatus(ack_pb.Ack.STATUS.OK); - // gRPC response. - logger.info(`Responding to caller with Ack: ${JSON.stringify(ack_response.toObject())}`); - callback(null, ack_response); - }).catch((error) => { - const ack_err_response = new ack_pb.Ack(); - ack_err_response.setRequestId(requestId); - ack_err_response.setMessage(error.toString()); - ack_err_response.setStatus(ack_pb.Ack.STATUS.ERROR); - // gRPC response. - logger.info(`Responding to caller with error Ack: ${JSON.stringify(ack_err_response.toObject())}`); - callback(null, ack_err_response); - }); - }, - assignAsset: (call: { request: driverPb.AssignAssetRequest }, callback: (_: any, object: ack_pb.Ack) => void) => { - const requestId: string = call.request.getSessionId(); + createAssetHelper( + call.request, + process.env.NETWORK_NAME ? process.env.NETWORK_NAME : "network1", + ) + .then(() => { + const ack_response = new ack_pb.Ack(); + ack_response.setRequestId(requestId); + ack_response.setMessage("Successfully created the asset"); + ack_response.setStatus(ack_pb.Ack.STATUS.OK); + // gRPC response. + logger.info( + `Responding to caller with Ack: ${JSON.stringify(ack_response.toObject())}`, + ); + callback(null, ack_response); + }) + .catch((error) => { + const ack_err_response = new ack_pb.Ack(); + ack_err_response.setRequestId(requestId); + ack_err_response.setMessage(error.toString()); + ack_err_response.setStatus(ack_pb.Ack.STATUS.ERROR); + // gRPC response. + logger.info( + `Responding to caller with error Ack: ${JSON.stringify(ack_err_response.toObject())}`, + ); + callback(null, ack_err_response); + }); + }, + extinguish: ( + call: { request: driverPb.ExtinguishRequest }, + callback: (_: any, object: ack_pb.Ack) => void, + ) => { + const requestId: string = call.request.getSessionId(); - assignAssetHelper(call.request, process.env.NETWORK_NAME ? process.env.NETWORK_NAME : 'network1').then(() => { - const ack_response = new ack_pb.Ack(); - ack_response.setRequestId(requestId); - ack_response.setMessage('Successfully assigned the asset'); - ack_response.setStatus(ack_pb.Ack.STATUS.OK); - // gRPC response. - logger.info(`Responding to caller with Ack: ${JSON.stringify(ack_response.toObject())}`); - callback(null, ack_response); - }).catch((error) => { - const ack_err_response = new ack_pb.Ack(); - ack_err_response.setRequestId(requestId); - ack_err_response.setMessage(error.toString()); - ack_err_response.setStatus(ack_pb.Ack.STATUS.ERROR); - // gRPC response. - logger.info(`Responding to caller with error Ack: ${JSON.stringify(ack_err_response.toObject())}`); - callback(null, ack_err_response); - }); - }, + extinguishHelper(call.request) + .then(() => { + const ack_response = new ack_pb.Ack(); + ack_response.setRequestId(requestId); + ack_response.setMessage("Successfully extinguished the asset"); + ack_response.setStatus(ack_pb.Ack.STATUS.OK); + // gRPC response. + logger.info( + `Responding to caller with Ack: ${JSON.stringify(ack_response.toObject())}`, + ); + callback(null, ack_response); + }) + .catch((error) => { + const ack_err_response = new ack_pb.Ack(); + ack_err_response.setRequestId(requestId); + ack_err_response.setMessage(error.toString()); + ack_err_response.setStatus(ack_pb.Ack.STATUS.ERROR); + // gRPC response. + logger.info( + `Responding to caller with error Ack: ${JSON.stringify(ack_err_response.toObject())}`, + ); + callback(null, ack_err_response); + }); + }, + assignAsset: ( + call: { request: driverPb.AssignAssetRequest }, + callback: (_: any, object: ack_pb.Ack) => void, + ) => { + const requestId: string = call.request.getSessionId(); + assignAssetHelper( + call.request, + process.env.NETWORK_NAME ? process.env.NETWORK_NAME : "network1", + ) + .then(() => { + const ack_response = new ack_pb.Ack(); + ack_response.setRequestId(requestId); + ack_response.setMessage("Successfully assigned the asset"); + ack_response.setStatus(ack_pb.Ack.STATUS.OK); + // gRPC response. + logger.info( + `Responding to caller with Ack: ${JSON.stringify(ack_response.toObject())}`, + ); + callback(null, ack_response); + }) + .catch((error) => { + const ack_err_response = new ack_pb.Ack(); + ack_err_response.setRequestId(requestId); + ack_err_response.setMessage(error.toString()); + ack_err_response.setStatus(ack_pb.Ack.STATUS.ERROR); + // gRPC response. + logger.info( + `Responding to caller with error Ack: ${JSON.stringify(ack_err_response.toObject())}`, + ); + callback(null, ack_err_response); + }); + }, }); // Prepares required crypto material for communication with the fabric network diff --git a/weaver/sdks/fabric/interoperation-node-sdk/src/SatpAssetManager.ts b/weaver/sdks/fabric/interoperation-node-sdk/src/SatpAssetManager.ts index 4d5f5ec546..4e5bf5fd10 100644 --- a/weaver/sdks/fabric/interoperation-node-sdk/src/SatpAssetManager.ts +++ b/weaver/sdks/fabric/interoperation-node-sdk/src/SatpAssetManager.ts @@ -12,69 +12,67 @@ import log4js from "log4js"; import * as helpers from "./helpers"; import { Contract } from "fabric-network"; -import { Hash } from "./HashFunctions" -import { createAssetExchangeAgreementSerialized, createAssetClaimInfoSerialized} from "./AssetManager" +import { Hash } from "./HashFunctions"; +import { + createAssetExchangeAgreementSerialized, + createAssetClaimInfoSerialized, +} from "./AssetManager"; const logger = log4js.getLogger("InteroperableHelper"); - const assignAsset = async ( - contract: Contract, - assetType: string, - assetID: string, - lockerECert: string, - hash: Hash, - endorsingOrgs: Array = [] + contract: Contract, + assetType: string, + assetID: string, + lockerECert: string, + hash: Hash, + endorsingOrgs: Array = [], ): Promise => { + if (!contract) { + logger.error("Contract handle not supplied"); + return false; + } + if (!assetType) { + logger.error("Asset type not supplied"); + return false; + } + if (!assetID) { + logger.error("Asset ID not supplied"); + return false; + } + if (!lockerECert) { + logger.error("Locker ECert not supplied"); + return false; + } + if (!hash) { + logger.error("Instance of Hash interface not supplied"); + return false; + } + if (!hash.preimage) { + logger.error("Hash Preimage not supplied"); + return false; + } - if (!contract) - { - logger.error("Contract handle not supplied"); - return false; - } - if (!assetType) - { - logger.error("Asset type not supplied"); - return false; - } - if (!assetID) - { - logger.error("Asset ID not supplied"); - return false; - } - if (!lockerECert) - { - logger.error("Locker ECert not supplied"); - return false; - } - if (!hash) - { - logger.error("Instance of Hash interface not supplied") - return false - } - if (!hash.preimage) - { - logger.error("Hash Preimage not supplied"); - return false; - } - - const assetExchangeAgreementStr = createAssetExchangeAgreementSerialized(assetType, assetID, "", lockerECert); - const claimInfoStr = createAssetClaimInfoSerialized(hash); + const assetExchangeAgreementStr = createAssetExchangeAgreementSerialized( + assetType, + assetID, + "", + lockerECert, + ); + const claimInfoStr = createAssetClaimInfoSerialized(hash); - // Normal invoke function - const tx = contract.createTransaction("AssignAsset") - const ccArgs = [assetExchangeAgreementStr, claimInfoStr] - if (endorsingOrgs && endorsingOrgs.length > 0) { - tx.setEndorsingOrganizations(...endorsingOrgs) - } - const [result, submitError] = await helpers.handlePromise( - tx.submit(...ccArgs) - ); - if (submitError) { - throw new Error(`AssignAsset submitTransaction Error: ${submitError}`); - } - return result; + // Normal invoke function + const tx = contract.createTransaction("AssignAsset"); + const ccArgs = [assetExchangeAgreementStr, claimInfoStr]; + if (endorsingOrgs && endorsingOrgs.length > 0) { + tx.setEndorsingOrganizations(...endorsingOrgs); + } + const [result, submitError] = await helpers.handlePromise( + tx.submit(...ccArgs), + ); + if (submitError) { + throw new Error(`AssignAsset submitTransaction Error: ${submitError}`); + } + return result; }; -export { - assignAsset -}; +export { assignAsset };