{"_id":"@elenaizaguirre/cactus-cmd-api-server","_rev":"21-2c918b60c09e1a82130eda94f26aa1c3","time":{"0.6.2":"2021-08-03T11:50:30.995Z","created":"2021-08-09T06:45:19.970Z","0.6.3":"2021-08-09T06:45:20.292Z","modified":"2022-04-05T07:09:29.452Z","0.6.4":"2021-08-09T06:52:38.495Z","0.6.5":"2021-08-09T07:33:10.301Z","0.6.6":"2021-08-09T08:04:13.516Z","0.6.8":"2021-08-09T10:07:10.845Z","0.6.9":"2021-08-11T06:11:40.613Z","0.7.1-scope-changed.ab167ba4.5":"2021-08-11T07:16:08.579Z","0.7.1-scope-changed.2eda5046.6":"2021-08-11T07:53:10.110Z","0.6.10":"2021-08-11T08:06:30.757Z","0.6.11":"2021-08-11T09:10:06.689Z","0.6.12":"2021-08-12T06:57:29.472Z","0.6.13":"2021-08-12T09:05:11.461Z","0.6.14":"2021-08-12T11:20:14.942Z","0.9.3":"2021-09-21T11:30:46.798Z","0.9.4":"2021-09-23T09:09:20.180Z"},"name":"@elenaizaguirre/cactus-cmd-api-server","dist-tags":{"latest":"0.9.4","scope-changed":"0.7.1-scope-changed.2eda5046.6"},"versions":{"0.6.3":{"name":"@elenaizaguirre/cactus-cmd-api-server","version":"0.6.3","description":"API server that combines and exposes all the functionality of a Cactus deployment through a unified REST API interface.","main":"dist/lib/main/typescript/index.js","mainMinified":"dist/cactus-cmd-api-server.node.umd.min.js","browser":"dist/cactus-cmd-api-server.web.umd.js","browserMinified":"dist/cactus-cmd-api-server.web.umd.min.js","module":"dist/lib/main/typescript/index.js","types":"dist/types/main/typescript/index.d.ts","scripts":{"generate-sdk":"openapi-generator-cli generate -i ./src/main/json/openapi.json -g typescript-axios -o ./src/main/typescript/generated/openapi/typescript-axios/ --reserved-words-mappings protected=protected","codegen:openapi":"npm run generate-sdk","codegen":"run-p 'codegen:*'","watch":"npm-watch","webpack":"npm-run-all webpack:dev webpack:prod","webpack:dev":"npm-run-all webpack:dev:node webpack:dev:web","webpack:dev:web":"webpack --env=dev --target=web --config ../../webpack.config.js","webpack:dev:node":"webpack --env=dev --target=node --config ../../webpack.config.js","webpack:prod":"npm-run-all webpack:prod:node webpack:prod:web","webpack:prod:web":"webpack --env=prod --target=web --config ../../webpack.config.js","webpack:prod:node":"echo 'SKIPPING script webpack:prod:node for @hyperledger/cactus-cmd-api-server' the dev bundle will be used as fallback until npm can be processed by the Webpack Terser."},"watch":{"codegen:openapi":{"patterns":["./src/main/json/openapi.json"]}},"publishConfig":{"access":"public"},"engines":{"node":">=10","npm":">=6"},"repository":{"type":"git","url":"git+https://github.com/elenaizaguirre/cactus.git"},"keywords":["Hyperledger","Cactus","Integration","Blockchain","Distributed Ledger Technology"],"author":{"name":"Hyperledger Cactus Contributors","email":"cactus@lists.hyperledger.org","url":"https://www.hyperledger.org/use/cactus"},"contributors":[{"name":"Please add yourself to the list of contributors","email":"your.name@example.com","url":"https://example.com"},{"name":"Peter Somogyvari","email":"peter.somogyvari@accenture.com","url":"https://accenture.com"}],"license":"Apache-2.0","bugs":{"url":"https://github.com/hyperledger/cactus/issues"},"homepage":"https://github.com/hyperledger/cactus#readme","dependencies":{"@elenaizaguirre/cactus-common":"0.6.3","@elenaizaguirre/cactus-core":"0.6.3","@elenaizaguirre/cactus-core-api":"0.6.3","@thream/socketio-jwt":"2.1.0","axios":"0.21.1","bluebird":"3.7.2","body-parser":"1.19.0","compression":"1.7.4","convict":"6.0.0","convict-format-with-validator":"6.0.0","cors":"2.8.5","express":"4.17.1","express-http-proxy":"1.6.0","express-jwt":"6.0.0","express-jwt-authz":"2.4.1","express-openapi-validator":"3.10.0","http-status-codes":"2.1.4","jose":"1.28.1","node-forge":"0.10.0","npm":"7.19.1","prom-client":"13.1.0","rxjs":"7.1.0","semver":"7.3.2","socket.io":"4.0.1","socket.io-client":"4.0.1","typescript-optional":"2.0.1","uuid":"7.0.2"},"devDependencies":{"@elenaizaguirre/cactus-plugin-keychain-vault":"0.6.3","@elenaizaguirre/cactus-test-tooling":"0.6.3","@types/compression":"1.7.0","@types/convict":"5.2.1","@types/cors":"2.8.6","@types/express":"4.17.8","@types/express-http-proxy":"1.6.1","@types/express-jwt":"6.0.1","@types/jsonwebtoken":"8.5.1","@types/multer":"1.4.5","@types/node-forge":"0.9.3","@types/npm":"2.0.32","@types/passport":"1.0.6","@types/passport-oauth2":"1.4.10","@types/passport-saml":"1.1.2","@types/passport-strategy":"0.2.35","@types/semver":"7.3.1","@types/uuid":"7.0.2","@types/xml2js":"0.4.8"},"gitHead":"3255c453b21c5900a90436d6124482f43778e70e","_id":"@elenaizaguirre/cactus-cmd-api-server@0.6.3","_nodeVersion":"16.3.0","_npmVersion":"lerna/4.0.0/node@v16.3.0+x64 (linux)","dist":{"integrity":"sha512-RPkLnN5bHDc+vmJ5kuQG4r3I5oc+jXFjYwRTfA7WRT4XMmgUiikQu61dkP4DFTVji+MVRnnmfjjOSd49z9Au8g==","shasum":"313ce64b244d0c8a084a52ea850443cbf8b0a3ae","tarball":"https://registry.npmjs.org/@elenaizaguirre/cactus-cmd-api-server/-/cactus-cmd-api-server-0.6.3.tgz","fileCount":94,"unpackedSize":6265783,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhEM8ACRA9TVsSAnZWagAAzsUQAIiipqe3yAl07ufPU6SA\nc5y6iamu0f/YGCS3rl63Cj3+ejtW1mfHUEdH4rSm2XR9WZT03cPNoEwdncYG\nokS4uruJcygC5rB46NA0K5orn196NmyvK+aUwRHMeGX81Vusd8hW3nMvPpwI\n+lztJNUeSPCEVMi5AuuePhxSN/omSP6MD8A5Ynhl/Va2Jta8tldRXCyWVz4Z\npuQXrFWkjM3t281p5FZRTV2CcZ4QtpRIzLHGaTEcTSD1eIvzQ+K/rNQE1pFT\nrVX41P7Ghp6Hyy/pGvh1gw+xNcV82YVrF8uksYAg1EsWzrUkDdsAaaR1BJgS\nDTqRAeSTrt5OHu1dvNK6HP1GiVG21Hd4RW0fnNqfBS7yd1rJlkdiy57GA52n\nBw24J8WOLtouP0HIFLI14fh7oDbjJkzpwDNnFYK1pnfdnrsp+8a1/qlNSAdZ\ngKajFYbxLhKuIU+/QaKUbWJTTPffLQqw4xXIRFk398JeWgh79bjAORILg6d8\nDFf5/RFbQVT5r09VXLLnyVJdx9TMnb/Ls2UJGtiiGWlLwFmzdye4xJHVyw2N\n4D2oL/FerM36NnQoLljCo8ByQWfOolZxqVoxGmo1lmynwPrKsQF4z8vS4IQX\nnXCqNElO3wUtDAhSK4XYmiAS6vZkh+YFH0Do7gl8lJkaODM1LzsFesclv6RC\njvZZ\r\n=77/T\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCOjOVrWCvOjt3dD9LGBuzOy5747AXafxGpj2IBN8UBFAIhAMYHbSSKWidli7JLZICWBR6LPSw76PDVM2XPL3o0A6i0"}]},"_npmUser":{"name":"elenaizaguirre","email":"e.izaguirre.equiza@accenture.com"},"directories":{},"maintainers":[{"name":"elenaizaguirre","email":"e.izaguirre.equiza@accenture.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/cactus-cmd-api-server_0.6.3_1628491520030_0.9865604177922058"},"_hasShrinkwrap":false},"0.6.4":{"name":"@elenaizaguirre/cactus-cmd-api-server","version":"0.6.4","description":"API server that combines and exposes all the functionality of a Cactus deployment through a unified REST API interface.","main":"dist/lib/main/typescript/index.js","mainMinified":"dist/cactus-cmd-api-server.node.umd.min.js","browser":"dist/cactus-cmd-api-server.web.umd.js","browserMinified":"dist/cactus-cmd-api-server.web.umd.min.js","module":"dist/lib/main/typescript/index.js","types":"dist/types/main/typescript/index.d.ts","scripts":{"generate-sdk":"openapi-generator-cli generate -i ./src/main/json/openapi.json -g typescript-axios -o ./src/main/typescript/generated/openapi/typescript-axios/ --reserved-words-mappings protected=protected","codegen:openapi":"npm run generate-sdk","codegen":"run-p 'codegen:*'","watch":"npm-watch","webpack":"npm-run-all webpack:dev webpack:prod","webpack:dev":"npm-run-all webpack:dev:node webpack:dev:web","webpack:dev:web":"webpack --env=dev --target=web --config ../../webpack.config.js","webpack:dev:node":"webpack --env=dev --target=node --config ../../webpack.config.js","webpack:prod":"npm-run-all webpack:prod:node webpack:prod:web","webpack:prod:web":"webpack --env=prod --target=web --config ../../webpack.config.js","webpack:prod:node":"echo 'SKIPPING script webpack:prod:node for @hyperledger/cactus-cmd-api-server' the dev bundle will be used as fallback until npm can be processed by the Webpack Terser."},"watch":{"codegen:openapi":{"patterns":["./src/main/json/openapi.json"]}},"publishConfig":{"access":"public"},"engines":{"node":">=10","npm":">=6"},"repository":{"type":"git","url":"git+https://github.com/elenaizaguirre/cactus.git"},"keywords":["Hyperledger","Cactus","Integration","Blockchain","Distributed Ledger Technology"],"author":{"name":"Hyperledger Cactus Contributors","email":"cactus@lists.hyperledger.org","url":"https://www.hyperledger.org/use/cactus"},"contributors":[{"name":"Please add yourself to the list of contributors","email":"your.name@example.com","url":"https://example.com"},{"name":"Peter Somogyvari","email":"peter.somogyvari@accenture.com","url":"https://accenture.com"}],"license":"Apache-2.0","bugs":{"url":"https://github.com/hyperledger/cactus/issues"},"homepage":"https://github.com/hyperledger/cactus#readme","dependencies":{"@elenaizaguirre/cactus-common":"0.6.4","@elenaizaguirre/cactus-core":"0.6.4","@elenaizaguirre/cactus-core-api":"0.6.4","@thream/socketio-jwt":"2.1.0","axios":"0.21.1","bluebird":"3.7.2","body-parser":"1.19.0","compression":"1.7.4","convict":"6.0.0","convict-format-with-validator":"6.0.0","cors":"2.8.5","express":"4.17.1","express-http-proxy":"1.6.0","express-jwt":"6.0.0","express-jwt-authz":"2.4.1","express-openapi-validator":"3.10.0","http-status-codes":"2.1.4","jose":"1.28.1","node-forge":"0.10.0","npm":"7.19.1","prom-client":"13.1.0","rxjs":"7.1.0","semver":"7.3.2","socket.io":"4.0.1","socket.io-client":"4.0.1","typescript-optional":"2.0.1","uuid":"7.0.2"},"devDependencies":{"@elenaizaguirre/cactus-plugin-keychain-vault":"0.6.4","@elenaizaguirre/cactus-test-tooling":"0.6.4","@types/compression":"1.7.0","@types/convict":"5.2.1","@types/cors":"2.8.6","@types/express":"4.17.8","@types/express-http-proxy":"1.6.1","@types/express-jwt":"6.0.1","@types/jsonwebtoken":"8.5.1","@types/multer":"1.4.5","@types/node-forge":"0.9.3","@types/npm":"2.0.32","@types/passport":"1.0.6","@types/passport-oauth2":"1.4.10","@types/passport-saml":"1.1.2","@types/passport-strategy":"0.2.35","@types/semver":"7.3.1","@types/uuid":"7.0.2","@types/xml2js":"0.4.8"},"gitHead":"ed7600489eb811e4114c57ec255a41c71538934d","_id":"@elenaizaguirre/cactus-cmd-api-server@0.6.4","_nodeVersion":"16.3.0","_npmVersion":"lerna/4.0.0/node@v16.3.0+x64 (linux)","dist":{"integrity":"sha512-IghdR1XDFn0ZtCE/YXkCp7MsWhpujRnceL3eMF4nGKLrMQTqyTKjoLIn8AY+iRajgpbNdk6zTC2FCc0Pp7A/+g==","shasum":"b65eb688680d680d8e19eefadec2a5268f4b02f3","tarball":"https://registry.npmjs.org/@elenaizaguirre/cactus-cmd-api-server/-/cactus-cmd-api-server-0.6.4.tgz","fileCount":94,"unpackedSize":6265783,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhENC2CRA9TVsSAnZWagAA7nsP/1x4V4jbTso6SJk16Dqr\nUsjXiekjz8MVngJaGAZrIYnkgReuyMlFSnWX5yVN3w5WN+3Xjd1QmYaPLhwX\nD+6V0K9sWqNtuqdEhso1QlwFZeZFtTffCwBtrB51TyWYAZIyCl8khUUUUYqe\nYJPYDgUr/ibZcsjwlvrZh6KTb2EvVEhFrjMKF42XXGv99Sx8O/XoTrP4Tu/j\nbMKwVczEqXZOHS5WD6ilU2RJ2eJMoQllfkjA+NZpxSsxaSn+UXoNygHQ6ovQ\nyovK6Uweh/jXQUTukGLDlo+2M+T4Pqz2i2U+VbqA3RjA9aaIUkTo9y4zoskJ\nnOIIXwnt7NUbB7dORw8CnRt/FvXrPP0hZ75bTDPa7vTtZblwePUvxFumq4hy\nibLpnykDTsNy5dJh+oK8Y9mxImMIIndlhr6OpznDIz6pnaTlZHHMc3P0cSuF\nKoc92cRldK5CYQt7i2Jfuqz8NdIJHwG/pTfnmqcPXZrWRCz/7tDpeiYP8nD6\nMH8nApGjQQsWJ1IOHcMQwYmg0GIX285P7NB3UGjRZEVLXfIdqeqWNjQWWXwv\nW0GviQfvFCf84pD8u5FV55nkro9mYugUAd/XJ/ZbJiA5UfK7MxpbfFxJjjij\nZnVqnENkfi0cHdH8G5VNfDHh9dic4/jqple3nwKpqnTkfacQg6sKzmewMZYo\nEFjq\r\n=Euew\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCga5w1LIk3hpubhJhE0o5LRVw6YGVDcnAoXIEL1oRMJwIhAKyZGtGI3KlqKqpOh3HS9oNxYSyvjz935C0K2d4Gqmsh"}]},"_npmUser":{"name":"elenaizaguirre","email":"e.izaguirre.equiza@accenture.com"},"directories":{},"maintainers":[{"name":"elenaizaguirre","email":"e.izaguirre.equiza@accenture.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/cactus-cmd-api-server_0.6.4_1628491958204_0.9081547174157409"},"_hasShrinkwrap":false},"0.6.5":{"name":"@elenaizaguirre/cactus-cmd-api-server","version":"0.6.5","description":"API server that combines and exposes all the functionality of a Cactus deployment through a unified REST API interface.","main":"dist/lib/main/typescript/index.js","mainMinified":"dist/cactus-cmd-api-server.node.umd.min.js","browser":"dist/cactus-cmd-api-server.web.umd.js","browserMinified":"dist/cactus-cmd-api-server.web.umd.min.js","module":"dist/lib/main/typescript/index.js","types":"dist/types/main/typescript/index.d.ts","scripts":{"generate-sdk":"openapi-generator-cli generate -i ./src/main/json/openapi.json -g typescript-axios -o ./src/main/typescript/generated/openapi/typescript-axios/ --reserved-words-mappings protected=protected","codegen:openapi":"npm run generate-sdk","codegen":"run-p 'codegen:*'","watch":"npm-watch","webpack":"npm-run-all webpack:dev webpack:prod","webpack:dev":"npm-run-all webpack:dev:node webpack:dev:web","webpack:dev:web":"webpack --env=dev --target=web --config ../../webpack.config.js","webpack:dev:node":"webpack --env=dev --target=node --config ../../webpack.config.js","webpack:prod":"npm-run-all webpack:prod:node webpack:prod:web","webpack:prod:web":"webpack --env=prod --target=web --config ../../webpack.config.js","webpack:prod:node":"echo 'SKIPPING script webpack:prod:node for @hyperledger/cactus-cmd-api-server' the dev bundle will be used as fallback until npm can be processed by the Webpack Terser."},"watch":{"codegen:openapi":{"patterns":["./src/main/json/openapi.json"]}},"publishConfig":{"access":"public"},"engines":{"node":">=10","npm":">=6"},"repository":{"type":"git","url":"git+https://github.com/elenaizaguirre/cactus.git"},"keywords":["Hyperledger","Cactus","Integration","Blockchain","Distributed Ledger Technology"],"author":{"name":"Hyperledger Cactus Contributors","email":"cactus@lists.hyperledger.org","url":"https://www.hyperledger.org/use/cactus"},"contributors":[{"name":"Please add yourself to the list of contributors","email":"your.name@example.com","url":"https://example.com"},{"name":"Peter Somogyvari","email":"peter.somogyvari@accenture.com","url":"https://accenture.com"}],"license":"Apache-2.0","bugs":{"url":"https://github.com/hyperledger/cactus/issues"},"homepage":"https://github.com/hyperledger/cactus#readme","dependencies":{"@elenaizaguirre/cactus-common":"0.6.5","@elenaizaguirre/cactus-core":"0.6.5","@elenaizaguirre/cactus-core-api":"0.6.5","@thream/socketio-jwt":"2.1.0","axios":"0.21.1","bluebird":"3.7.2","body-parser":"1.19.0","compression":"1.7.4","convict":"6.0.0","convict-format-with-validator":"6.0.0","cors":"2.8.5","express":"4.17.1","express-http-proxy":"1.6.0","express-jwt":"6.0.0","express-jwt-authz":"2.4.1","express-openapi-validator":"3.10.0","http-status-codes":"2.1.4","jose":"1.28.1","node-forge":"0.10.0","npm":"7.19.1","prom-client":"13.1.0","rxjs":"7.1.0","semver":"7.3.2","socket.io":"4.0.1","socket.io-client":"4.0.1","typescript-optional":"2.0.1","uuid":"7.0.2"},"devDependencies":{"@elenaizaguirre/cactus-plugin-keychain-vault":"0.6.5","@elenaizaguirre/cactus-test-tooling":"0.6.5","@types/compression":"1.7.0","@types/convict":"5.2.1","@types/cors":"2.8.6","@types/express":"4.17.8","@types/express-http-proxy":"1.6.1","@types/express-jwt":"6.0.1","@types/jsonwebtoken":"8.5.1","@types/multer":"1.4.5","@types/node-forge":"0.9.3","@types/npm":"2.0.32","@types/passport":"1.0.6","@types/passport-oauth2":"1.4.10","@types/passport-saml":"1.1.2","@types/passport-strategy":"0.2.35","@types/semver":"7.3.1","@types/uuid":"7.0.2","@types/xml2js":"0.4.8"},"gitHead":"b1a024148ba6fd87bcfe1a41a0970830798d6e91","_id":"@elenaizaguirre/cactus-cmd-api-server@0.6.5","_nodeVersion":"16.3.0","_npmVersion":"lerna/4.0.0/node@v16.3.0+x64 (linux)","dist":{"integrity":"sha512-gZLytHjEw2KQsQeKrbtT6/Lp305P7hrrZlIG6hBmdNta+5sPId+1wjM0hwCewQlxsUWXCtWcj/DEPmgPkpdKag==","shasum":"96e8d8341713c4f03d2ba775c04626f4a0ae009d","tarball":"https://registry.npmjs.org/@elenaizaguirre/cactus-cmd-api-server/-/cactus-cmd-api-server-0.6.5.tgz","fileCount":94,"unpackedSize":6265783,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhENo2CRA9TVsSAnZWagAAn3IP/iqs9kTKxfxO7iQw5r6i\nR5aFd70OS6Pc22LH5ISG+ZfW2S4WD/yp0FVatGgcfe6kQexRcJlQosSRojDH\nooOBj6cozJcT1LSC8BtuRfGtHJPGRWqN3MQDw1TIRDciLcFvBWndsIMmbMH/\nlRUkh7ZshBV1LFETVmgoBe0jFnaLIgICt6XbPqdEkf8PZHLKxPC8q+IIUYVw\nnZ0u1snyUb7SxJ/EBAsMe/ih7RwV/nh/Zgr3QevJSf06ugQyFl65Mn6V87nD\nlZzR/Ry7GTA5wx8fnVDK+603hMo7cjXIvwR7DtUbm0BVfmU8yBKCIPGb36i5\nduMFFISbHlZFl7tMF1a5luy7CRfJWmLgnB08EVe57LpdX7hJ0V6x71OY08B1\ntV8C6tGpbXtn/NvAruhRA4dbUzN9m+ozXd2eTOh84/3IQBWlQSsea3MQK3WU\nhojRrVDG4wunPpMkstJ9yBpirs1tZa8DTv6MQiYPLc+vHUIHCGXH2XRrL1Ub\ni2aRE+ohr+WlU5OZPLHiOKaWwp6BXSMPKwGebFMLfnXoZoRdGjp0rDYcb6yj\nUOmGQyk1m/QDNmfrdf34/50rNiNSgbePMM0h+UwHXoLyuG8bxBUPxxpM+/6d\noAxoTh6HUphtQ1JDhofdaLs0YeOPvLGwzlfHFniQ1ODxfiF31m6zaDOHNRZr\nxw3x\r\n=nzwH\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIAK9YW89kN3z775pq8K0CtoGYzjG4h3tesFeMaos38feAiEA/6TusqZ161HBRLycUU5FXPpd2lN4alzPXgnT8w/ayew="}]},"_npmUser":{"name":"elenaizaguirre","email":"e.izaguirre.equiza@accenture.com"},"directories":{},"maintainers":[{"name":"elenaizaguirre","email":"e.izaguirre.equiza@accenture.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/cactus-cmd-api-server_0.6.5_1628494389943_0.6343630099552036"},"_hasShrinkwrap":false},"0.6.6":{"name":"@elenaizaguirre/cactus-cmd-api-server","version":"0.6.6","description":"API server that combines and exposes all the functionality of a Cactus deployment through a unified REST API interface.","main":"dist/lib/main/typescript/index.js","mainMinified":"dist/cactus-cmd-api-server.node.umd.min.js","browser":"dist/cactus-cmd-api-server.web.umd.js","browserMinified":"dist/cactus-cmd-api-server.web.umd.min.js","module":"dist/lib/main/typescript/index.js","types":"dist/types/main/typescript/index.d.ts","scripts":{"generate-sdk":"openapi-generator-cli generate -i ./src/main/json/openapi.json -g typescript-axios -o ./src/main/typescript/generated/openapi/typescript-axios/ --reserved-words-mappings protected=protected","codegen:openapi":"npm run generate-sdk","codegen":"run-p 'codegen:*'","watch":"npm-watch","webpack":"npm-run-all webpack:dev webpack:prod","webpack:dev":"npm-run-all webpack:dev:node webpack:dev:web","webpack:dev:web":"webpack --env=dev --target=web --config ../../webpack.config.js","webpack:dev:node":"webpack --env=dev --target=node --config ../../webpack.config.js","webpack:prod":"npm-run-all webpack:prod:node webpack:prod:web","webpack:prod:web":"webpack --env=prod --target=web --config ../../webpack.config.js","webpack:prod:node":"echo 'SKIPPING script webpack:prod:node for @hyperledger/cactus-cmd-api-server' the dev bundle will be used as fallback until npm can be processed by the Webpack Terser."},"watch":{"codegen:openapi":{"patterns":["./src/main/json/openapi.json"]}},"publishConfig":{"access":"public"},"engines":{"node":">=10","npm":">=6"},"repository":{"type":"git","url":"git+https://github.com/elenaizaguirre/cactus.git"},"keywords":["Hyperledger","Cactus","Integration","Blockchain","Distributed Ledger Technology"],"author":{"name":"Hyperledger Cactus Contributors","email":"cactus@lists.hyperledger.org","url":"https://www.hyperledger.org/use/cactus"},"contributors":[{"name":"Please add yourself to the list of contributors","email":"your.name@example.com","url":"https://example.com"},{"name":"Peter Somogyvari","email":"peter.somogyvari@accenture.com","url":"https://accenture.com"}],"license":"Apache-2.0","bugs":{"url":"https://github.com/hyperledger/cactus/issues"},"homepage":"https://github.com/hyperledger/cactus#readme","dependencies":{"@elenaizaguirre/cactus-common":"0.6.6","@elenaizaguirre/cactus-core":"0.6.6","@elenaizaguirre/cactus-core-api":"0.6.6","@thream/socketio-jwt":"2.1.0","axios":"0.21.1","bluebird":"3.7.2","body-parser":"1.19.0","compression":"1.7.4","convict":"6.0.0","convict-format-with-validator":"6.0.0","cors":"2.8.5","express":"4.17.1","express-http-proxy":"1.6.0","express-jwt":"6.0.0","express-jwt-authz":"2.4.1","express-openapi-validator":"3.10.0","http-status-codes":"2.1.4","jose":"1.28.1","node-forge":"0.10.0","npm":"7.19.1","prom-client":"13.1.0","rxjs":"7.1.0","semver":"7.3.2","socket.io":"4.0.1","socket.io-client":"4.0.1","typescript-optional":"2.0.1","uuid":"7.0.2"},"devDependencies":{"@elenaizaguirre/cactus-plugin-keychain-vault":"0.6.6","@elenaizaguirre/cactus-test-tooling":"0.6.6","@types/compression":"1.7.0","@types/convict":"5.2.1","@types/cors":"2.8.6","@types/express":"4.17.8","@types/express-http-proxy":"1.6.1","@types/express-jwt":"6.0.1","@types/jsonwebtoken":"8.5.1","@types/multer":"1.4.5","@types/node-forge":"0.9.3","@types/npm":"2.0.32","@types/passport":"1.0.6","@types/passport-oauth2":"1.4.10","@types/passport-saml":"1.1.2","@types/passport-strategy":"0.2.35","@types/semver":"7.3.1","@types/uuid":"7.0.2","@types/xml2js":"0.4.8"},"gitHead":"faa1059634d121fdc5f43e5afa3640bbd8c25b49","_id":"@elenaizaguirre/cactus-cmd-api-server@0.6.6","_nodeVersion":"16.3.0","_npmVersion":"lerna/4.0.0/node@v16.3.0+x64 (linux)","dist":{"integrity":"sha512-u7OqqrgnT7eWo93JSWYMYcMUAhnR9i0CSmEFAUBQf93zcSSQvz4AFZfIWh4KczUmiMtE1EY1W5tqxNke3AYfcg==","shasum":"bc11514d19cdbf0c50166d4b0ea556b417111c6b","tarball":"https://registry.npmjs.org/@elenaizaguirre/cactus-cmd-api-server/-/cactus-cmd-api-server-0.6.6.tgz","fileCount":94,"unpackedSize":6265783,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhEOF9CRA9TVsSAnZWagAACjIQAI8pDf8jr0/c5IX7I9L7\nJHtbxGcLTp+a9mofZYbd3Zta8lPZIrEY2DERMbCa24qDW2vPrVX+VMq9Kk6D\ns+APnFILyTJa3ERkoemFIq38gY9ZC2i7HrFB0cA8TbHNlQI9ww3Rsh5nFaEV\nPYX3A+yYFKJTjAsx6i5xSat4IzXfKFdpALLtpVLUfH8runBsdULnZTM7F7Dy\n1wxI95k3SpegqY6WZl3IHHIWPlIWY8a3okcUs9+nJejqkutSRFR9yeE9JJ8O\no7fvo3H5HiTzB7qakfuC/cC/1BTaPHqSvyoLzSXAMFqtaBxz+yWWrND662gh\n093sD6QBAtymgwKK6rthSfXzAeXdNN1nl1A49S7vvjo3Khqf0el9fwb4GvBq\nXdTyoalv/JTuG9V+m7DmAcNq2H499o1yMhj25DzBuvUBjm4+CeDu6VNSKoxM\nK0Kp95Aj46coKPr/pTCJ+36s3JlIWiHO+Kv+6JBF/Ug0FcvFputwzqnDLRdg\nO5g8z6EQsHYjFWGaRCle1a+23ZfNWN9Fs+gbO4kKni3yTALjhqA7NAJajF2k\nBYrBi+AhgbX7uwOm5iwbnW+pjYPxB41AYBKxQQZxfM3Ta0V6lzEFzFDJXTFj\n8FCZ7c1ES7G/6CEtDHO2ELiNzdyM43YNg1Yp4KQALxa03ss5EVxVGlQjnSUJ\nfAzl\r\n=duWd\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIGvdHChcxHx0hCgS6E5MfoNK7RPUobUfvUzndbULIMAYAiB6zKYFhnNDEF8ZdXPeaJ0xTaO2p62Bq7R1kgJQc7O+kQ=="}]},"_npmUser":{"name":"elenaizaguirre","email":"e.izaguirre.equiza@accenture.com"},"directories":{},"maintainers":[{"name":"elenaizaguirre","email":"e.izaguirre.equiza@accenture.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/cactus-cmd-api-server_0.6.6_1628496253249_0.5151898730799187"},"_hasShrinkwrap":false},"0.6.8":{"name":"@elenaizaguirre/cactus-cmd-api-server","version":"0.6.8","description":"API server that combines and exposes all the functionality of a Cactus deployment through a unified REST API interface.","main":"dist/lib/main/typescript/cmd/cactus-api.js","mainMinified":"dist/cactus-cmd-api-server.node.umd.min.js","browser":"dist/cactus-cmd-api-server.web.umd.js","browserMinified":"dist/cactus-cmd-api-server.web.umd.min.js","module":"dist/lib/main/typescript/index.js","types":"dist/types/main/typescript/index.d.ts","scripts":{"generate-sdk":"openapi-generator-cli generate -i ./src/main/json/openapi.json -g typescript-axios -o ./src/main/typescript/generated/openapi/typescript-axios/ --reserved-words-mappings protected=protected","codegen:openapi":"npm run generate-sdk","codegen":"run-p 'codegen:*'","watch":"npm-watch","webpack":"npm-run-all webpack:dev webpack:prod","webpack:dev":"npm-run-all webpack:dev:node webpack:dev:web","webpack:dev:web":"webpack --env=dev --target=web --config ../../webpack.config.js","webpack:dev:node":"webpack --env=dev --target=node --config ../../webpack.config.js","webpack:prod":"npm-run-all webpack:prod:node webpack:prod:web","webpack:prod:web":"webpack --env=prod --target=web --config ../../webpack.config.js","webpack:prod:node":"echo 'SKIPPING script webpack:prod:node for @hyperledger/cactus-cmd-api-server' the dev bundle will be used as fallback until npm can be processed by the Webpack Terser."},"watch":{"codegen:openapi":{"patterns":["./src/main/json/openapi.json"]}},"publishConfig":{"access":"public"},"engines":{"node":">=10","npm":">=6"},"repository":{"type":"git","url":"git+https://github.com/elenaizaguirre/cactus.git"},"keywords":["Hyperledger","Cactus","Integration","Blockchain","Distributed Ledger Technology"],"author":{"name":"Hyperledger Cactus Contributors","email":"cactus@lists.hyperledger.org","url":"https://www.hyperledger.org/use/cactus"},"contributors":[{"name":"Please add yourself to the list of contributors","email":"your.name@example.com","url":"https://example.com"},{"name":"Peter Somogyvari","email":"peter.somogyvari@accenture.com","url":"https://accenture.com"}],"license":"Apache-2.0","bugs":{"url":"https://github.com/hyperledger/cactus/issues"},"homepage":"https://github.com/hyperledger/cactus#readme","dependencies":{"@elenaizaguirre/cactus-common":"0.6.8","@elenaizaguirre/cactus-core":"0.6.8","@elenaizaguirre/cactus-core-api":"0.6.8","@thream/socketio-jwt":"2.1.0","axios":"0.21.1","bluebird":"3.7.2","body-parser":"1.19.0","compression":"1.7.4","convict":"6.0.0","convict-format-with-validator":"6.0.0","cors":"2.8.5","express":"4.17.1","express-http-proxy":"1.6.0","express-jwt":"6.0.0","express-jwt-authz":"2.4.1","express-openapi-validator":"3.10.0","http-status-codes":"2.1.4","jose":"1.28.1","node-forge":"0.10.0","npm":"7.19.1","prom-client":"13.1.0","rxjs":"7.1.0","semver":"7.3.2","socket.io":"4.0.1","socket.io-client":"4.0.1","typescript-optional":"2.0.1","uuid":"7.0.2"},"devDependencies":{"@elenaizaguirre/cactus-plugin-keychain-vault":"0.6.8","@elenaizaguirre/cactus-test-tooling":"0.6.8","@types/compression":"1.7.0","@types/convict":"5.2.1","@types/cors":"2.8.6","@types/express":"4.17.8","@types/express-http-proxy":"1.6.1","@types/express-jwt":"6.0.1","@types/jsonwebtoken":"8.5.1","@types/multer":"1.4.5","@types/node-forge":"0.9.3","@types/npm":"2.0.32","@types/passport":"1.0.6","@types/passport-oauth2":"1.4.10","@types/passport-saml":"1.1.2","@types/passport-strategy":"0.2.35","@types/semver":"7.3.1","@types/uuid":"7.0.2","@types/xml2js":"0.4.8"},"gitHead":"91cec1e5c803270d3649a2954d824af610ed0eb9","_id":"@elenaizaguirre/cactus-cmd-api-server@0.6.8","_nodeVersion":"16.3.0","_npmVersion":"lerna/4.0.0/node@v16.3.0+x64 (linux)","dist":{"integrity":"sha512-8crGKFEEAnCKWEYHXih9NlxWEGjPr/vWy7ZptWldmV3jtK8jW+J8OMfjZb4w8gnnlOmlWgUjsJYPKcRtxtytGw==","shasum":"7b68f3bec9b674e6456220d61dabbfe0ccf67303","tarball":"https://registry.npmjs.org/@elenaizaguirre/cactus-cmd-api-server/-/cactus-cmd-api-server-0.6.8.tgz","fileCount":94,"unpackedSize":6265792,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhEP5OCRA9TVsSAnZWagAAmnoP/06tUmxMQYEas0EXYqpQ\ngu3MVbfCGkzZOy0uZ8naE+OzrVA16KrkVCUL6W2FqbrPEbCyWgUrdpEppNEg\nAGiAKWFcdKRguVtxpg7LNcVueEn/nYTotsN6UzI+8V/JZRof7wCk8PMwk/aH\n4WipHZK48a3FzUxbrqm7hUj4yIpqopQJcVn419YRxMb1mg7krIts59KdhsLh\n99kpxU8XcZjwNHwLZBaV0FnpLAwSLSz92reJov/gwKw009bNRw/PYbxjQ221\nB9XaOBzaTyslfkUx61DSmEi4YzjuB70O0kBbTvJHKlL2aVb6H5L3v910fDaa\nI98ro4DF580ixZJhX516wl9jzyWN+1bjCt7K1ZtbniX/xy7T0euEi4B1b6gp\nq05J0SWnK4F0aVNN84ACA3C4lbweco6fc9axMJgc/bvtyfTkKmmZLuFm2Ng9\neq3BL7QSxKsPjzxmQ2KeEYIp9bsZT5f5t42A7V5EnvHxHKi3hESCXEhUv6wQ\nvn831/bsOirjpUEinboZSAVRBCoAQE5zGQDHK5VIbgSZWnu8OgQXP6jXQKXJ\ny9WM4opy7KCW5tVy2P12TsZPFwSF/yXT6h4XgE9rXu7X2lWMDkksMJ2pK2g+\nXtx+uIXOLa6GBQ1cLDkzbYxGrzXDWRZuMi8DTihN3r4ymtI09yKpkjkK65Eb\nKhYJ\r\n=zZRs\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIGSzy2MC43GKdHDXgYSt0i/NX+K1FJTcLFZKy7bw6AYAAiEA/kvRhBORJ50xDZ/URMv0xVgsK45RQbQSxRNZlW/ycbU="}]},"_npmUser":{"name":"elenaizaguirre","email":"e.izaguirre.equiza@accenture.com"},"directories":{},"maintainers":[{"name":"elenaizaguirre","email":"e.izaguirre.equiza@accenture.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/cactus-cmd-api-server_0.6.8_1628503630623_0.8302617425577088"},"_hasShrinkwrap":false},"0.6.9":{"name":"@elenaizaguirre/cactus-cmd-api-server","version":"0.6.9","description":"API server that combines and exposes all the functionality of a Cactus deployment through a unified REST API interface.","main":"dist/lib/main/typescript/cmd/cactus-api.js","mainMinified":"dist/cactus-cmd-api-server.node.umd.min.js","browser":"dist/cactus-cmd-api-server.web.umd.js","browserMinified":"dist/cactus-cmd-api-server.web.umd.min.js","module":"dist/lib/main/typescript/index.js","types":"dist/types/main/typescript/index.d.ts","scripts":{"generate-sdk":"openapi-generator-cli generate -i ./src/main/json/openapi.json -g typescript-axios -o ./src/main/typescript/generated/openapi/typescript-axios/ --reserved-words-mappings protected=protected","codegen:openapi":"npm run generate-sdk","codegen":"run-p 'codegen:*'","watch":"npm-watch","webpack":"npm-run-all webpack:dev webpack:prod","webpack:dev":"npm-run-all webpack:dev:node webpack:dev:web","webpack:dev:web":"webpack --env=dev --target=web --config ../../webpack.config.js","webpack:dev:node":"webpack --env=dev --target=node --config ../../webpack.config.js","webpack:prod":"npm-run-all webpack:prod:node webpack:prod:web","webpack:prod:web":"webpack --env=prod --target=web --config ../../webpack.config.js","webpack:prod:node":"echo 'SKIPPING script webpack:prod:node for @hyperledger/cactus-cmd-api-server' the dev bundle will be used as fallback until npm can be processed by the Webpack Terser."},"watch":{"codegen:openapi":{"patterns":["./src/main/json/openapi.json"]}},"publishConfig":{"access":"public"},"engines":{"node":">=10","npm":">=6"},"repository":{"type":"git","url":"git+https://github.com/elenaizaguirre/cactus.git"},"keywords":["Hyperledger","Cactus","Integration","Blockchain","Distributed Ledger Technology"],"author":{"name":"Hyperledger Cactus Contributors","email":"cactus@lists.hyperledger.org","url":"https://www.hyperledger.org/use/cactus"},"contributors":[{"name":"Please add yourself to the list of contributors","email":"your.name@example.com","url":"https://example.com"},{"name":"Peter Somogyvari","email":"peter.somogyvari@accenture.com","url":"https://accenture.com"}],"license":"Apache-2.0","bugs":{"url":"https://github.com/hyperledger/cactus/issues"},"homepage":"https://github.com/hyperledger/cactus#readme","dependencies":{"@elenaizaguirre/cactus-common":"0.6.9","@elenaizaguirre/cactus-core":"0.6.9","@elenaizaguirre/cactus-core-api":"0.6.9","@thream/socketio-jwt":"2.1.0","axios":"0.21.1","bluebird":"3.7.2","body-parser":"1.19.0","compression":"1.7.4","convict":"6.0.0","convict-format-with-validator":"6.0.0","cors":"2.8.5","express":"4.17.1","express-http-proxy":"1.6.0","express-jwt":"6.0.0","express-jwt-authz":"2.4.1","express-openapi-validator":"3.10.0","http-status-codes":"2.1.4","jose":"1.28.1","live-plugin-manager":"0.15.1","node-forge":"0.10.0","prom-client":"13.1.0","rxjs":"7.1.0","semver":"7.3.2","socket.io":"4.0.1","socket.io-client":"4.0.1","typescript-optional":"2.0.1","uuid":"7.0.2"},"devDependencies":{"@elenaizaguirre/cactus-plugin-keychain-vault":"0.6.9","@elenaizaguirre/cactus-test-tooling":"0.6.9","@types/compression":"1.7.0","@types/convict":"5.2.1","@types/cors":"2.8.6","@types/express":"4.17.8","@types/express-http-proxy":"1.6.1","@types/express-jwt":"6.0.1","@types/jsonwebtoken":"8.5.1","@types/multer":"1.4.5","@types/node-forge":"0.9.3","@types/passport":"1.0.6","@types/passport-oauth2":"1.4.10","@types/passport-saml":"1.1.2","@types/passport-strategy":"0.2.35","@types/semver":"7.3.1","@types/uuid":"7.0.2","@types/xml2js":"0.4.8"},"gitHead":"3363b29413ac58d71472d84a81c64da323958950","_id":"@elenaizaguirre/cactus-cmd-api-server@0.6.9","_nodeVersion":"16.3.0","_npmVersion":"lerna/4.0.0/node@v16.3.0+x64 (linux)","dist":{"integrity":"sha512-XvN4c3J+JZXcThOgJf7tATEpdbC++EjTQYZkzIZk3LveqzOI565b4hVGcTEbdMs5J6LkmzMXrUI5C62C/rHHHA==","shasum":"83e61a67ee551a56684d147ecdc4ab04eb44641d","tarball":"https://registry.npmjs.org/@elenaizaguirre/cactus-cmd-api-server/-/cactus-cmd-api-server-0.6.9.tgz","fileCount":94,"unpackedSize":6271275,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhE2ocCRA9TVsSAnZWagAAyVEQAJYKAgpJGvZSD5iOprq5\nfpBspnw/8UU+9uH7Y4C2ckKG3k73+g9f4aXQOjE4aX7jODb+O2b3CteZm2BD\nxx0L53lOrsvR2N2nQNzpQqmONfzk/dM3QAWNAuKaie2k9gxEqAI8dXLi0VXH\nevCI8Uy56CQ/Sj0JAkRNxbNcshVKyfhBjEV1gN6HbioExYCwn+XG8lbVKiE7\nAFbp0I0/R00U4SWqGR1dbA6IGiDXW8qr+642/nK0aNqGNPxVPT0hDEyIvc3c\nRjybVkQqjzMhrS8GfeDTXFxBqVqbg45lcLMONfV1XD2welEk2wY0q+xrFkXl\nhtcjdoNOvGWI4pOrA/y5eACYcw5xOS9EwreKTvV+cF2opjssU34FKIQ0KkFz\nx/Imrw7jZWw9FLZd8zkl4331NQJPYu11UQajPmvrOemua5FPj0dN0jrqGInA\nqAzP9Pfj6SZP/eQ36OC2V68WJd4unoNBUSpLUtDLDDr7FCGEIOCXrbpK2kbv\nwDTlrX8n1Q/ox9ViiSm/kFkZki9K6Rj33gpBxwEjyhczNwRxo9gPVqR0wcbr\nu+x3yrKcS3vgsrOmkG0I1hyBEgs7SfD4+9uGbrzbk8xh1UPD14xMm82LUjQn\ntb54WAgzofBg2AIL+uP7eSIBxdBJZHWax24w7SeXTO91Xxf2RdfhL5y6KPAM\n5oNT\r\n=fdJZ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQCBciUH44XUW5bd/vgyKyHXNgSyTSUI6YS3E82auouxiwIhAMgvwbxaaSmxozHVDYcLtCGJSwBybQPo/h2sTfIT9uV6"}]},"_npmUser":{"name":"elenaizaguirre","email":"e.izaguirre.equiza@accenture.com"},"directories":{},"maintainers":[{"name":"elenaizaguirre","email":"e.izaguirre.equiza@accenture.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/cactus-cmd-api-server_0.6.9_1628662300342_0.5423524893536515"},"_hasShrinkwrap":false},"0.7.1-scope-changed.ab167ba4.5":{"name":"@elenaizaguirre/cactus-cmd-api-server","version":"0.7.1-scope-changed.ab167ba4.5","description":"API server that combines and exposes all the functionality of a Cactus deployment through a unified REST API interface.","main":"dist/lib/main/typescript/index.js","mainMinified":"dist/cactus-cmd-api-server.node.umd.min.js","browser":"dist/cactus-cmd-api-server.web.umd.js","browserMinified":"dist/cactus-cmd-api-server.web.umd.min.js","module":"dist/lib/main/typescript/index.js","types":"dist/types/main/typescript/index.d.ts","scripts":{"generate-sdk":"openapi-generator-cli generate -i ./src/main/json/openapi.json -g typescript-axios -o ./src/main/typescript/generated/openapi/typescript-axios/ --reserved-words-mappings protected=protected","codegen:openapi":"npm run generate-sdk","codegen":"run-p 'codegen:*'","watch":"npm-watch","webpack":"npm-run-all webpack:dev webpack:prod","webpack:dev":"npm-run-all webpack:dev:node webpack:dev:web","webpack:dev:web":"webpack --env=dev --target=web --config ../../webpack.config.js","webpack:dev:node":"webpack --env=dev --target=node --config ../../webpack.config.js","webpack:prod":"npm-run-all webpack:prod:node webpack:prod:web","webpack:prod:web":"webpack --env=prod --target=web --config ../../webpack.config.js","webpack:prod:node":"echo 'SKIPPING script webpack:prod:node for @hyperledger/cactus-cmd-api-server' the dev bundle will be used as fallback until npm can be processed by the Webpack Terser."},"watch":{"codegen:openapi":{"patterns":["./src/main/json/openapi.json"]}},"publishConfig":{"access":"public"},"engines":{"node":">=10","npm":">=6"},"repository":{"type":"git","url":"git+https://github.com/elenaizaguirre/cactus.git"},"keywords":["Hyperledger","Cactus","Integration","Blockchain","Distributed Ledger Technology"],"author":{"name":"Hyperledger Cactus Contributors","email":"cactus@lists.hyperledger.org","url":"https://www.hyperledger.org/use/cactus"},"contributors":[{"name":"Please add yourself to the list of contributors","email":"your.name@example.com","url":"https://example.com"},{"name":"Peter Somogyvari","email":"peter.somogyvari@accenture.com","url":"https://accenture.com"}],"license":"Apache-2.0","bugs":{"url":"https://github.com/hyperledger/cactus/issues"},"homepage":"https://github.com/hyperledger/cactus#readme","dependencies":{"@elenaizaguirre/cactus-common":"^0.7.1-scope-changed.ab167ba4.5+ab167ba4","@elenaizaguirre/cactus-core":"^0.7.1-scope-changed.ab167ba4.5+ab167ba4","@elenaizaguirre/cactus-core-api":"^0.7.1-scope-changed.ab167ba4.5+ab167ba4","@thream/socketio-jwt":"2.1.0","axios":"0.21.1","bluebird":"3.7.2","body-parser":"1.19.0","compression":"1.7.4","convict":"6.0.0","convict-format-with-validator":"6.0.0","cors":"2.8.5","express":"4.17.1","express-http-proxy":"1.6.0","express-jwt":"6.0.0","express-jwt-authz":"2.4.1","express-openapi-validator":"3.10.0","http-status-codes":"2.1.4","jose":"1.28.1","live-plugin-manager":"0.15.1","node-forge":"0.10.0","prom-client":"13.1.0","rxjs":"7.1.0","semver":"7.3.2","socket.io":"4.0.1","socket.io-client":"4.0.1","typescript-optional":"2.0.1","uuid":"7.0.2"},"devDependencies":{"@elenaizaguirre/cactus-plugin-keychain-vault":"^0.7.1-scope-changed.ab167ba4.5+ab167ba4","@elenaizaguirre/cactus-test-tooling":"^0.7.1-scope-changed.ab167ba4.5+ab167ba4","@types/compression":"1.7.0","@types/convict":"5.2.1","@types/cors":"2.8.6","@types/express":"4.17.8","@types/express-http-proxy":"1.6.1","@types/express-jwt":"6.0.1","@types/jsonwebtoken":"8.5.1","@types/multer":"1.4.5","@types/node-forge":"0.9.3","@types/passport":"1.0.6","@types/passport-oauth2":"1.4.10","@types/passport-saml":"1.1.2","@types/passport-strategy":"0.2.35","@types/semver":"7.3.1","@types/uuid":"7.0.2","@types/xml2js":"0.4.8"},"gitHead":"ab167ba4bf35f442884a56b3cc43ff8a71f78e60","readme":"# `@hyperledger/cactus-cmd-api-server` <!-- omit in toc -->\n\n- [Summary](#summary)\n- [Usage](#usage)\n  - [Basic Example](#basic-example)\n  - [Remote Plugin Imports at Runtime Example](#remote-plugin-imports-at-runtime-example)\n  - [Complete Example](#complete-example)\n- [Deployment Scenarios](#deployment-scenarios)\n  - [Production Deployment Example](#production-deployment-example)\n  - [Low Resource Deployment Example](#low-resource-deployment-example)\n- [Containerization](#containerization)\n  - [Building the container image locally](#building-the-container-image-locally)\n  - [Running the container image locally](#running-the-container-image-locally)\n  - [Testing API calls with the container](#testing-api-calls-with-the-container)\n- [Prometheus Exporter](#prometheus-exporter)\n  - [Usage Prometheus](#usage-prometheus)\n  - [Prometheus Integration](#prometheus-integration)\n  - [Helper code](#helper-code)\n        - [response.type.ts](#responsetypets)\n        - [data-fetcher.ts](#data-fetcherts)\n        - [metrics.ts](#metricsts)\n- [FAQ](#faq)\n  - [What is the difference between a Cactus Node and a Cactus API Server?](#what-is-the-difference-between-a-cactus-node-and-a-cactus-api-server)\n  - [Is the API server horizontally scalable?](#is-the-api-server-horizontally-scalable)\n  - [Does the API server automatically protect me from malicious plugins?](#does-the-api-server-automatically-protect-me-from-malicious-plugins)\n  - [Can I use the API server with plugins deployed as a service?](#can-i-use-the-api-server-with-plugins-deployed-as-a-service)\n\n## Summary\n\nThis package is part of the Hyperledger Cactus blockchain integration framework\nand is used as a shell/container of sort for housing different Cactus plugins\n(which all live in their own npm packages as well).\n\nThe API server gives you for free the following benefits, should you choose to\nuse it:\n1. Automatic wiring of API endpoints for Cactus plugins which implement the `IPluginWebService` Typescript interface\n2. Lightweight inversion of control container provided to plugins in the form of the `PluginRegistry` so that plugins can depend on each other in a way that each plugin instance can be uniquely identified and obtained by other plugins. A great example of this in action is ledger connector plugins frequently using the `PluginRegistry` to look up instances of keychain plugins to get access to secrets that are needed for the connector plugins to accomplish certain tasks such as cryptographically signing some information or SSH-ing into a server instance in order to upload and deploy binary (or otherwise) artifacts of smart contracts.\n\n## Usage\n\nLike with most parts of the framework in Cactus, using the `ApiServer` is optional.\n\nTo see the `ApiServer` in action, the end to end tests of the framework are a great\nplace to start.\nA few excerpts that regularly occur in said tests can be seen below as well for\nthe reader's convenience.\n\nOne of our design principles for the framework is **secure by default** which\nmeans that the API servers\n1. assumes TLS is enabled by default and\n2. cross-origin resource sharing is disabled completely\n\n### Basic Example\n\n```typescript\n#!/usr/bin/env node\n\nimport { ApiServer } from \"../api-server\";\nimport { ConfigService } from \"../config/config-service\";\nimport { Logger, LoggerProvider } from \"@hyperledger/cactus-common\";\n\nconst log: Logger = LoggerProvider.getOrCreate({\n  label: \"cactus-api\",\n  level: \"INFO\",\n});\n\nconst main = async () => {\n  const configService = new ConfigService();\n  const config = configService.getOrCreate();\n  const serverOptions = config.getProperties();\n\n  LoggerProvider.setLogLevel(serverOptions.logLevel);\n\n  if (process.argv[2].includes(\"help\")) {\n    const helpText = ConfigService.getHelpText();\n    console.log(helpText);\n    log.info(`Effective Configuration:`);\n    log.info(JSON.stringify(serverOptions, null, 4));\n  } else {\n    const apiServer = new ApiServer({ config: serverOptions });\n    await apiServer.start();\n  }\n};\n\nexport async function launchApp(): Promise<void> {\n  try {\n    await main();\n    log.info(`Cactus API server launched OK `);\n  } catch (ex) {\n    log.error(`Cactus API server crashed: `, ex);\n    process.exit(1);\n  }\n}\n\nif (require.main === module) {\n  launchApp();\n}\n\n```\n\n### Remote Plugin Imports at Runtime Example\n\n```typescript\nimport { PluginImportType } from \"@hyperledger/cactus-core-api\";\nimport { ApiServer } from \"@hyperledger/cactus-cmd-api-server\";\nimport { ConfigService } from \"@hyperledger/cactus-cmd-api-server\";\nimport { Logger, LoggerProvider } from \"@hyperledger/cactus-common\";\n\nconst main = async () => {\n\n  const configService = new ConfigService();\n  const apiServerOptions = configService.newExampleConfig();\n  // If there is no configuration file on the file system, just set it to empty string\n  apiServerOptions.configFile = \"\";\n  // Enable CORS for\n  apiServerOptions.apiCorsDomainCsv = \"your.domain.example.com\";\n  apiServerOptions.apiPort = 3000;\n  apiServerOptions.cockpitPort = 3100;\n  // Disble TLS (or provide TLS certs for secure HTTP if you are deploying to production)\n  apiServerOptions.apiTlsEnabled = false;\n  apiServerOptions.plugins = [\n    {\n      // npm package name of the plugin you are installing\n      // Since this will be imported at runtime, you are responsible for\n      // installing the package yourself prior to launching the API server.\n      packageName: \"@hyperledger/cactus-plugin-keychain-vault\",\n      // The REMOTE value means that a different plugin factory will be imported and\n      // called to obtain the plugin instance. This way plugins can support them\n      // being imported by the API server regardless of the language the plugin\n      // was written in.\n      type: PluginImportType.REMOTE,\n      // The options that will be passed in to the plugin factory\n      options: {\n        keychainId: \"_keychainId_\",\n        instanceId: \"_instanceId_\",\n        remoteConfig: configuration,\n      },\n    },\n  ];\n  const config = configService.newExampleConfigConvict(apiServerOptions);\n\n  const apiServer = new ApiServer({\n    config: config.getProperties(),\n  });\n\n  // start the API server here and you are ready to roll\n};\n\nexport async function launchApp(): Promise<void> {\n  try {\n    await main();\n    log.info(`Cactus API server launched OK `);\n  } catch (ex) {\n    log.error(`Cactus API server crashed: `, ex);\n    process.exit(1);\n  }\n}\n\nif (require.main === module) {\n  launchApp();\n}\n\n```\n\n### Complete Example\n\nFor a complete example of how to use the API server, read all the code of the\nsupply chain exmaple's backend package:\n\nhttps://github.com/hyperledger/cactus/tree/main/examples/cactus-example-supply-chain-backend/src/main/typescript\n\n## Deployment Scenarios\n\nThere's a set of building blocks (members, nodes, API server processes, plugin instances) that you can use when defining (founding) a consortium and these building blocks relate to each other in a way that can be expressed with an entity relationship diagram which can be seen below.\nThe composability rules can be deducted from how the diagram elements (entities) are connected (related) to each other, e.g. the API server process can have any number of plugin instances in it and a node can contain any number of API server processes, and so on until the top level construct is reached: the consortium.\n\n> Consortium management does not relate to achieving consensus on data/transactions involving individual ledgers, merely about consensus on the metadata of a consortium.\n\n![deployment-entity-relationship-diagram.png](https://github.com/hyperledger/cactus/raw/4a337be719a9d2e2ccb877edccd7849f4be477ec/whitepaper/deployment-entity-relationship-diagram.png)\n\nNow, with these composability rules in mind, let us demonstrate a few different deployment scenarios (both expected and exotic ones) to showcase the framework's flexibility in this regard.\n\n### Production Deployment Example\n\nMany different configurations are possible here as well.\nOne way to have two members form a consortium and both of those members provide highly available, high throughput services is to have a deployment as shown on the below figure.\nWhat is important to note here is that this consortium has 2 nodes, 1 for each member\nand it is irrelevant how many API servers those nodes have internally because they\nall respond to requests through the network host/web domain that is tied to the\nnode.\nOne could say that API servers do not have a distinguishable identity relative to\ntheir peer API servers, only the higher-level nodes do.\n\n![deployment-production-example.png](https://github.com/hyperledger/cactus/raw/4a337be719a9d2e2ccb877edccd7849f4be477ec/whitepaper/deployment-production-example.png)\n\n### Low Resource Deployment Example\n\nThis is an example to showcase how you can pull up a full consortium even from\nwithin a single operating system process (API server) with multiple members and\ntheir respective nodes. It is not something that's recommended for a production\ngrade environment, ever, but it is great for demos and integration tests where\nyou have to simulate a fully functioning consortium with as little hardware footprint\nas possible to save on time and cost.\n\nThe individual nodes/API servers are isolated by listening on seperate TCP ports\nof the machine they are hosted on:\n\n![deployment-low-resource-example.png](https://github.com/hyperledger/cactus/raw/4a337be719a9d2e2ccb877edccd7849f4be477ec/whitepaper/deployment-low-resource-example.png)\n\n## Containerization\n\n### Building the container image locally\n\nIn the Cactus project root say:\n\n```sh\nDOCKER_BUILDKIT=1 docker build -f ./packages/cactus-cmd-api-server/Dockerfile . -t cas -t cactus-api-server\n```\n\nBuild with a specific version of the npm package:\n```sh\nDOCKER_BUILDKIT=1 docker build --build-arg NPM_PKG_VERSION=fix-quorum-contract-types -f ./packages/cactus-cmd-api-server/Dockerfile . -t cas -t cactus-api-server\n```\n\n### Running the container image locally\n\nBefore running the examples here you need to build the image locally.\nSee section [Building the container image locally](#building-the-container-image-locally) for details on how to do that.\n\nOnce you've built the container, the following commands should work:\n\n- Launch container - no plugins, default configuration\n\n  ```sh\n  docker run \\\n    --rm \\\n    --publish 3000:3000 \\\n    --publish 4000:4000 \\\n    cas\n  ```\n\n- Launch container with plugins of your choice (keychain, consortium connector, etc.) \n\n  ```sh\n    docker run \\\n    --rm \\\n    --publish 3000:3000 \\\n    --publish 4000:4000 \\\n    cas \\\n      ./node_modules/.bin/cactusapi \\\n      --plugins='[{\"packageName\": \"@hyperledger/cactus-plugin-ledger-connector-fabric\", \"type\": \"org.hyperledger.cactus.plugin_import_type.LOCAL\",  \"options\": { \"connectionProfile\": {}, \"instanceId\": \"some-unique-instance-id\"}}]'\n  ```\n\n- Launch container with plugin configuration as an **environment variable**:\n  ```sh\n  docker run \\\n    --rm \\\n    --publish 3000:3000 \\\n    --publish 4000:4000 \\\n    --env PLUGINS='[{\"packageName\": \"@hyperledger/cactus-plugin-ledger-connector-besu\", \"type\": \"org.hyperledger.cactus.plugin_import_type.LOCAL\",  \"options\": {\"rpcApiHttpHost\": \"http://localhost:8545\", \"instanceId\": \"some-unique-besu-connector-instance-id\"}}]' \\\n    cas\n  ```\n\n- Launch container with plugin configuration as a **CLI argument**:\n  ```sh\n  docker run \\\n    --rm \\\n    --publish 3000:3000 \\\n    --publish 4000:4000 \\\n    cas \\\n      ./node_modules/.bin/cactusapi \\\n      --plugins='[{\"packageName\": \"@hyperledger/cactus-plugin-ledger-connector-besu\", \"type\": \"org.hyperledger.cactus.plugin_import_type.LOCAL\",  \"options\": {\"rpcApiHttpHost\": \"http://localhost:8545\", \"instanceId\": \"some-unique-besu-connector-instance-id\"}}]'\n  ```\n\n- Launch container with **configuration file** mounted from host machine:\n  ```sh\n\n  echo '[{\"packageName\": \"@hyperledger/cactus-plugin-ledger-connector-besu\", \"type\": \"org.hyperledger.cactus.plugin_import_type.LOCAL\",  \"options\": {\"rpcApiHttpHost\": \"http://localhost:8545\", \"instanceId\": \"some-unique-besu-connector-instance-id\"}}]' > cactus.json\n\n  docker run \\\n    --rm \\\n    --publish 3000:3000 \\\n    --publish 4000:4000 \\\n    --mount type=bind,source=\"$(pwd)\"/cactus.json,target=/cactus.json \\\n    cas \\\n      ./node_modules/.bin/cactusapi \\\n      --config-file=/cactus.json\n  ```\n\n### Testing API calls with the container\n\nDon't have a Besu network on hand to test with? Test or develop against our Besu All-In-One container!\n\n1. Terminal Window 1 (Ledger)\n    ```sh\n    docker run --publish 8545:8545 hyperledger/cactus-besu-all-in-one:latest\n    ```\n\n2. Terminal Window 2 (Cactus API Server)\n    ```sh\n    docker run \\\n      --network host \\\n      --rm \\\n      --publish 3000:3000 \\\n      --publish 4000:4000 \\\n      --env PLUGINS='[{\"packageName\": \"@hyperledger/cactus-plugin-ledger-connector-besu\", \"type\": \"org.hyperledger.cactus.plugin_import_type.LOCAL\",  \"options\": {\"rpcApiHttpHost\": \"http://localhost:8545\", \"instanceId\": \"some-unique-besu-connector-instance-id\"}}]' \\\n      cas\n    ```\n\n3. Terminal Window 3 (curl - replace eth accounts as needed)\n    ```sh\n    curl --location --request POST 'http://127.0.0.1:4000/api/v1/plugins/@hyperledger/cactus-plugin-ledger-connector-besu/run-transaction' \\\n    --header 'Content-Type: application/json' \\\n    --data-raw '{\n        \"web3SigningCredential\": {\n          \"ethAccount\": \"627306090abaB3A6e1400e9345bC60c78a8BEf57\",\n          \"secret\": \"c87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3\",\n          \"type\": \"PRIVATE_KEY_HEX\"\n        },\n        \"consistencyStrategy\": {\n          \"blockConfirmations\": 0,\n          \"receiptType\": \"NODE_TX_POOL_ACK\"\n        },\n        \"transactionConfig\": {\n          \"from\": \"627306090abaB3A6e1400e9345bC60c78a8BEf57\",\n          \"to\": \"f17f52151EbEF6C7334FAD080c5704D77216b732\",\n          \"value\": 1,\n          \"gas\": 10000000\n        }\n    }'\n    ```\n\n4. The above should produce a response that looks similar to this:\n\n    ```json\n    {\n        \"success\": true,\n        \"data\": {\n            \"transactionReceipt\": {\n                \"blockHash\": \"0x7c97c038a5d3bd84613fe23ed442695276d5d2df97f4e7c4f10ca06765033ffd\",\n                \"blockNumber\": 1218,\n                \"contractAddress\": null,\n                \"cumulativeGasUsed\": 21000,\n                \"from\": \"0x627306090abab3a6e1400e9345bc60c78a8bef57\",\n                \"gasUsed\": 21000,\n                \"logs\": [],\n                \"logsBloom\": \"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\",\n                \"status\": true,\n                \"to\": \"0xf17f52151ebef6c7334fad080c5704d77216b732\",\n                \"transactionHash\": \"0xc7fcb46c735bdc696d500bfc70c72595a2b8c31813929e5c61d9a5aec3376d6f\",\n                \"transactionIndex\": 0\n            }\n        }\n    }\n    ```\n\n\n\n## Prometheus Exporter\nThis class creates a prometheus exporter, which scrapes the total Cactus node count.\n\n### Usage Prometheus\nThe prometheus exporter object is initialized in the `ApiServer` class constructor itself, so instantiating the object of the `ApiServer` class, gives access to the exporter object.\nYou can also initialize the prometheus exporter object seperately and then pass it to the `IApiServerConstructorOptions` interface for `ApiServer` constructor.\n\n`getPrometheusMetricsV1` function returns the prometheus exporter metrics, currently displaying the total plugins imported, which currently refreshes to match the plugin count, everytime `setTotalPluginImports` method is called.\n\n### Prometheus Integration\nTo use Prometheus with this exporter make sure to install [Prometheus main component](https://prometheus.io/download/).\nOnce Prometheus is setup, the corresponding scrape_config needs to be added to the prometheus.yml\n\n```(yaml)\n- job_name: 'consortium_manual_exporter'\n  metrics_path: /api/v1/api-server/get-prometheus-exporter-metrics\n  scrape_interval: 5s\n  static_configs:\n    - targets: ['{host}:{port}']\n```\n\nHere the `host:port` is where the prometheus exporter metrics are exposed. The test cases (For example, packages/cactus-plugin-consortium-manual/src/test/typescript/unit/consortium/get-node-jws-endpoint-v1.test.ts) exposes it over `0.0.0.0` and a random port(). The random port can be found in the running logs of the test case and looks like (42379 in the below mentioned URL)\n`Metrics URL: http://0.0.0.0:42379/api/v1/api-server/get-prometheus-exporter-metrics/get-prometheus-exporter-metrics`\n\nOnce edited, you can start the prometheus service by referencing the above edited prometheus.yml file.\nOn the prometheus graphical interface (defaulted to http://localhost:9090), choose **Graph** from the menu bar, then select the **Console** tab. From the **Insert metric at cursor** drop down, select **cactus_api_server_total_plugin_imports** and click **execute**\n\n### Helper code\n\n###### response.type.ts\nThis file contains the various responses of the metrics.\n\n###### data-fetcher.ts\nThis file contains functions encasing the logic to process the data points.\n\n###### metrics.ts\nThis file lists all the prometheus metrics and what they are used for.\n\n\n\n\n\n## FAQ\n\n### What is the difference between a Cactus Node and a Cactus API Server?\n\nThe node is what has an identity within your PKI and can be made up of 1-N API\nserver instances that all share the same configuration/identity of the node.\nSee deployment scenarios above for a much more detailed explanation.\n\n### Is the API server horizontally scalable?\n\n**Yes, 100%.**\nKeep in mind though that the API server can be loaded up with arbitrary plugins\nmeaning that if you write a plugin that has a central database that can only\ndo 1 transaction per second, then it will not help you much that the API server\nitself is horizontally scalable because deploying a thousand instances of the\nAPI server will just result in you having a thousand instances of your plugin\nall waiting for that underlying database with its 1 TPS throughput hogging your\nsystem.\nWhen we say that the API server is horizontally scalable, we mean that the API\nserver itself is designed not to have any such state mentioned in the example\nabove.\nYou are responsible for only deploying plugins in the API server that are\nhorizontally scalable as well. In short, your whole system is only horizontally\nscalable if all components of it are horizontally scalable.\n\n### Does the API server automatically protect me from malicious plugins?\n\n**No.** If you install a third-party plugin that wasn't vetted by anyone and that\nplugin happens to have malicious code in it to steal your private keys, it can\ndo so.\nYou are responsible for making sure that the plugins you install have no known\nsecurity vulnerabilities or backdoors e.g. they are considered \"secure\".\nThe double quotes around \"secure\" is meant to signify the fact that no software\nis ever really truly secure, just merely lacking of known vulnerabilities at\nany given point in time.\n\n### Can I use the API server with plugins deployed as a service?\n\n**Yes.** You can deploy your plugin written in any language, anywhere as long\nas it is accessible over the network and does come with a Typescript API client\nthat you can use to install into the API server as a proxy for an in-process\nplugin implementation.\n","readmeFilename":"README.md","_id":"@elenaizaguirre/cactus-cmd-api-server@0.7.1-scope-changed.ab167ba4.5","_nodeVersion":"16.3.0","_npmVersion":"lerna/4.0.0/node@v16.3.0+x64 (linux)","dist":{"integrity":"sha512-GR4WJ4UwhEF9Yqn/d0YiMK24bNdhu/az4J+QW3U15c9BathhELw53WuYCnuudj5qVVVXOZ4R6dFUPOkvw3ugtw==","shasum":"8dfcf33d3d43fd0b23049b8656698b39cdcd456d","tarball":"https://registry.npmjs.org/@elenaizaguirre/cactus-cmd-api-server/-/cactus-cmd-api-server-0.7.1-scope-changed.ab167ba4.5.tgz","fileCount":94,"unpackedSize":6271475,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhE3k4CRA9TVsSAnZWagAA880P/0U6Vkk3yRFNTscc8gqs\n7zGtBovtTVEblLhVHvWfuzkeHSnBjorGp2h6/jk0JwKYIGFFNd5chDhelVlV\nTshTQAkWovlCHYBbHs8KDh0uuLf0P7MMjFZ+ywPiXza1x7VTLYk2Qk8LbTzS\nBh/SYJUVQtcg4201Ie3iDquNI5phjn5f59+Q6mWVurzcaEaxi7nJioIKPyIw\nSVxFXkZMisgWrnub71bQSPiV/uJhflbpb8mqIW3CjwkKSKl7GexOclncHlJl\nr5X1Pofnvvm10DGN3xH3dqKMn35Cz0+d8HrvVZcfl/MxJen38wIBpamS5Xfa\nspGOeWsKfd6mEF1QgFekc0XQTlBB9zHoEHlBfzgkbdFTKxvJc1sV0ts/NmhV\nT4B+tLgjCzzRW1XXVejiaXRExQPxr+YlFp7N6y0UYX9yjKtjTpiWn80Pw3+B\nVRMjNN9nYLOX3GNaNyqaRLScFcT9k7vAVwkNnqiHQ4fg53ES96WNaRjkvuv5\n4qMxZ7iZt7SYWkuOdycImvftLVqUBKfOYAGG3OIwSn1aGgafimZpGGK3Nbv+\nZPfzZuagqeI8Lfzw0n7eSrQEr7xTPoDAO3BERrKkZBW2jW06s/XhIAzR9fdg\nLBtFu1k5vE4lA6Y292hZF98jj0i7v45FWp/6vdtvJJmFvqEqtAzY6kU3z241\n9qkc\r\n=D9GS\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIFElzihfCqaVY+FKrm7suAcAh9h9iPuCYIfYf99Mm9gbAiEA2Q1GlxhQbEi1ka+Eq0l5oSX4EIie41nmPnlCOKmjEXc="}]},"_npmUser":{"name":"elenaizaguirre","email":"e.izaguirre.equiza@accenture.com"},"directories":{},"maintainers":[{"name":"elenaizaguirre","email":"e.izaguirre.equiza@accenture.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/cactus-cmd-api-server_0.7.1-scope-changed.ab167ba4.5_1628666168310_0.6044101040205372"},"_hasShrinkwrap":false},"0.7.1-scope-changed.2eda5046.6":{"name":"@elenaizaguirre/cactus-cmd-api-server","version":"0.7.1-scope-changed.2eda5046.6","description":"API server that combines and exposes all the functionality of a Cactus deployment through a unified REST API interface.","main":"dist/lib/main/typescript/index.js","mainMinified":"dist/cactus-cmd-api-server.node.umd.min.js","browser":"dist/cactus-cmd-api-server.web.umd.js","browserMinified":"dist/cactus-cmd-api-server.web.umd.min.js","module":"dist/lib/main/typescript/index.js","types":"dist/types/main/typescript/index.d.ts","scripts":{"generate-sdk":"openapi-generator-cli generate -i ./src/main/json/openapi.json -g typescript-axios -o ./src/main/typescript/generated/openapi/typescript-axios/ --reserved-words-mappings protected=protected","codegen:openapi":"npm run generate-sdk","codegen":"run-p 'codegen:*'","watch":"npm-watch","webpack":"npm-run-all webpack:dev webpack:prod","webpack:dev":"npm-run-all webpack:dev:node webpack:dev:web","webpack:dev:web":"webpack --env=dev --target=web --config ../../webpack.config.js","webpack:dev:node":"webpack --env=dev --target=node --config ../../webpack.config.js","webpack:prod":"npm-run-all webpack:prod:node webpack:prod:web","webpack:prod:web":"webpack --env=prod --target=web --config ../../webpack.config.js","webpack:prod:node":"echo 'SKIPPING script webpack:prod:node for @hyperledger/cactus-cmd-api-server' the dev bundle will be used as fallback until npm can be processed by the Webpack Terser."},"watch":{"codegen:openapi":{"patterns":["./src/main/json/openapi.json"]}},"publishConfig":{"access":"public"},"engines":{"node":">=10","npm":">=6"},"repository":{"type":"git","url":"git+https://github.com/elenaizaguirre/cactus.git"},"keywords":["Hyperledger","Cactus","Integration","Blockchain","Distributed Ledger Technology"],"author":{"name":"Hyperledger Cactus Contributors","email":"cactus@lists.hyperledger.org","url":"https://www.hyperledger.org/use/cactus"},"contributors":[{"name":"Please add yourself to the list of contributors","email":"your.name@example.com","url":"https://example.com"},{"name":"Peter Somogyvari","email":"peter.somogyvari@accenture.com","url":"https://accenture.com"}],"license":"Apache-2.0","bugs":{"url":"https://github.com/hyperledger/cactus/issues"},"homepage":"https://github.com/hyperledger/cactus#readme","dependencies":{"@elenaizaguirre/cactus-common":"^0.7.1-scope-changed.2eda5046.6+2eda5046","@elenaizaguirre/cactus-core":"^0.7.1-scope-changed.2eda5046.6+2eda5046","@elenaizaguirre/cactus-core-api":"^0.7.1-scope-changed.2eda5046.6+2eda5046","@thream/socketio-jwt":"2.1.0","axios":"0.21.1","bluebird":"3.7.2","body-parser":"1.19.0","compression":"1.7.4","convict":"6.0.0","convict-format-with-validator":"6.0.0","cors":"2.8.5","express":"4.17.1","express-http-proxy":"1.6.0","express-jwt":"6.0.0","express-jwt-authz":"2.4.1","express-openapi-validator":"3.10.0","http-status-codes":"2.1.4","jose":"1.28.1","live-plugin-manager":"0.15.1","node-forge":"0.10.0","prom-client":"13.1.0","run-time-error":"1.4.0","rxjs":"7.1.0","semver":"7.3.2","socket.io":"4.0.1","socket.io-client":"4.0.1","typescript-optional":"2.0.1","uuid":"7.0.2"},"devDependencies":{"@elenaizaguirre/cactus-plugin-keychain-vault":"^0.7.1-scope-changed.2eda5046.6+2eda5046","@elenaizaguirre/cactus-test-tooling":"^0.7.1-scope-changed.2eda5046.6+2eda5046","@types/compression":"1.7.0","@types/convict":"5.2.1","@types/cors":"2.8.6","@types/express":"4.17.8","@types/express-http-proxy":"1.6.1","@types/express-jwt":"6.0.1","@types/jsonwebtoken":"8.5.1","@types/multer":"1.4.5","@types/node-forge":"0.9.3","@types/passport":"1.0.6","@types/passport-oauth2":"1.4.10","@types/passport-saml":"1.1.2","@types/passport-strategy":"0.2.35","@types/semver":"7.3.1","@types/uuid":"7.0.2","@types/xml2js":"0.4.8"},"gitHead":"2eda50462d834a7a74aeaa9e0d9784406ef05ebe","readme":"# `@hyperledger/cactus-cmd-api-server` <!-- omit in toc -->\n\n- [Summary](#summary)\n- [Usage](#usage)\n  - [Basic Example](#basic-example)\n  - [Remote Plugin Imports at Runtime Example](#remote-plugin-imports-at-runtime-example)\n  - [Complete Example](#complete-example)\n- [Deployment Scenarios](#deployment-scenarios)\n  - [Production Deployment Example](#production-deployment-example)\n  - [Low Resource Deployment Example](#low-resource-deployment-example)\n- [Containerization](#containerization)\n  - [Building the container image locally](#building-the-container-image-locally)\n  - [Running the container image locally](#running-the-container-image-locally)\n  - [Testing API calls with the container](#testing-api-calls-with-the-container)\n- [Prometheus Exporter](#prometheus-exporter)\n  - [Usage Prometheus](#usage-prometheus)\n  - [Prometheus Integration](#prometheus-integration)\n  - [Helper code](#helper-code)\n        - [response.type.ts](#responsetypets)\n        - [data-fetcher.ts](#data-fetcherts)\n        - [metrics.ts](#metricsts)\n- [FAQ](#faq)\n  - [What is the difference between a Cactus Node and a Cactus API Server?](#what-is-the-difference-between-a-cactus-node-and-a-cactus-api-server)\n  - [Is the API server horizontally scalable?](#is-the-api-server-horizontally-scalable)\n  - [Does the API server automatically protect me from malicious plugins?](#does-the-api-server-automatically-protect-me-from-malicious-plugins)\n  - [Can I use the API server with plugins deployed as a service?](#can-i-use-the-api-server-with-plugins-deployed-as-a-service)\n\n## Summary\n\nThis package is part of the Hyperledger Cactus blockchain integration framework\nand is used as a shell/container of sort for housing different Cactus plugins\n(which all live in their own npm packages as well).\n\nThe API server gives you for free the following benefits, should you choose to\nuse it:\n1. Automatic wiring of API endpoints for Cactus plugins which implement the `IPluginWebService` Typescript interface\n2. Lightweight inversion of control container provided to plugins in the form of the `PluginRegistry` so that plugins can depend on each other in a way that each plugin instance can be uniquely identified and obtained by other plugins. A great example of this in action is ledger connector plugins frequently using the `PluginRegistry` to look up instances of keychain plugins to get access to secrets that are needed for the connector plugins to accomplish certain tasks such as cryptographically signing some information or SSH-ing into a server instance in order to upload and deploy binary (or otherwise) artifacts of smart contracts.\n\n## Usage\n\nLike with most parts of the framework in Cactus, using the `ApiServer` is optional.\n\nTo see the `ApiServer` in action, the end to end tests of the framework are a great\nplace to start.\nA few excerpts that regularly occur in said tests can be seen below as well for\nthe reader's convenience.\n\nOne of our design principles for the framework is **secure by default** which\nmeans that the API servers\n1. assumes TLS is enabled by default and\n2. cross-origin resource sharing is disabled completely\n\n### Basic Example\n\n```typescript\n#!/usr/bin/env node\n\nimport { ApiServer } from \"../api-server\";\nimport { ConfigService } from \"../config/config-service\";\nimport { Logger, LoggerProvider } from \"@hyperledger/cactus-common\";\n\nconst log: Logger = LoggerProvider.getOrCreate({\n  label: \"cactus-api\",\n  level: \"INFO\",\n});\n\nconst main = async () => {\n  const configService = new ConfigService();\n  const config = configService.getOrCreate();\n  const serverOptions = config.getProperties();\n\n  LoggerProvider.setLogLevel(serverOptions.logLevel);\n\n  if (process.argv[2].includes(\"help\")) {\n    const helpText = ConfigService.getHelpText();\n    console.log(helpText);\n    log.info(`Effective Configuration:`);\n    log.info(JSON.stringify(serverOptions, null, 4));\n  } else {\n    const apiServer = new ApiServer({ config: serverOptions });\n    await apiServer.start();\n  }\n};\n\nexport async function launchApp(): Promise<void> {\n  try {\n    await main();\n    log.info(`Cactus API server launched OK `);\n  } catch (ex) {\n    log.error(`Cactus API server crashed: `, ex);\n    process.exit(1);\n  }\n}\n\nif (require.main === module) {\n  launchApp();\n}\n\n```\n\n### Remote Plugin Imports at Runtime Example\n\n```typescript\nimport { PluginImportType } from \"@hyperledger/cactus-core-api\";\nimport { ApiServer } from \"@hyperledger/cactus-cmd-api-server\";\nimport { ConfigService } from \"@hyperledger/cactus-cmd-api-server\";\nimport { Logger, LoggerProvider } from \"@hyperledger/cactus-common\";\n\nconst main = async () => {\n\n  const configService = new ConfigService();\n  const apiServerOptions = configService.newExampleConfig();\n  // If there is no configuration file on the file system, just set it to empty string\n  apiServerOptions.configFile = \"\";\n  // Enable CORS for\n  apiServerOptions.apiCorsDomainCsv = \"your.domain.example.com\";\n  apiServerOptions.apiPort = 3000;\n  apiServerOptions.cockpitPort = 3100;\n  // Disble TLS (or provide TLS certs for secure HTTP if you are deploying to production)\n  apiServerOptions.apiTlsEnabled = false;\n  apiServerOptions.plugins = [\n    {\n      // npm package name of the plugin you are installing\n      // Since this will be imported at runtime, you are responsible for\n      // installing the package yourself prior to launching the API server.\n      packageName: \"@hyperledger/cactus-plugin-keychain-vault\",\n      // The REMOTE value means that a different plugin factory will be imported and\n      // called to obtain the plugin instance. This way plugins can support them\n      // being imported by the API server regardless of the language the plugin\n      // was written in.\n      type: PluginImportType.REMOTE,\n      // The options that will be passed in to the plugin factory\n      options: {\n        keychainId: \"_keychainId_\",\n        instanceId: \"_instanceId_\",\n        remoteConfig: configuration,\n      },\n    },\n  ];\n  const config = configService.newExampleConfigConvict(apiServerOptions);\n\n  const apiServer = new ApiServer({\n    config: config.getProperties(),\n  });\n\n  // start the API server here and you are ready to roll\n};\n\nexport async function launchApp(): Promise<void> {\n  try {\n    await main();\n    log.info(`Cactus API server launched OK `);\n  } catch (ex) {\n    log.error(`Cactus API server crashed: `, ex);\n    process.exit(1);\n  }\n}\n\nif (require.main === module) {\n  launchApp();\n}\n\n```\n\n### Complete Example\n\nFor a complete example of how to use the API server, read all the code of the\nsupply chain exmaple's backend package:\n\nhttps://github.com/hyperledger/cactus/tree/main/examples/cactus-example-supply-chain-backend/src/main/typescript\n\n## Deployment Scenarios\n\nThere's a set of building blocks (members, nodes, API server processes, plugin instances) that you can use when defining (founding) a consortium and these building blocks relate to each other in a way that can be expressed with an entity relationship diagram which can be seen below.\nThe composability rules can be deducted from how the diagram elements (entities) are connected (related) to each other, e.g. the API server process can have any number of plugin instances in it and a node can contain any number of API server processes, and so on until the top level construct is reached: the consortium.\n\n> Consortium management does not relate to achieving consensus on data/transactions involving individual ledgers, merely about consensus on the metadata of a consortium.\n\n![deployment-entity-relationship-diagram.png](https://github.com/hyperledger/cactus/raw/4a337be719a9d2e2ccb877edccd7849f4be477ec/whitepaper/deployment-entity-relationship-diagram.png)\n\nNow, with these composability rules in mind, let us demonstrate a few different deployment scenarios (both expected and exotic ones) to showcase the framework's flexibility in this regard.\n\n### Production Deployment Example\n\nMany different configurations are possible here as well.\nOne way to have two members form a consortium and both of those members provide highly available, high throughput services is to have a deployment as shown on the below figure.\nWhat is important to note here is that this consortium has 2 nodes, 1 for each member\nand it is irrelevant how many API servers those nodes have internally because they\nall respond to requests through the network host/web domain that is tied to the\nnode.\nOne could say that API servers do not have a distinguishable identity relative to\ntheir peer API servers, only the higher-level nodes do.\n\n![deployment-production-example.png](https://github.com/hyperledger/cactus/raw/4a337be719a9d2e2ccb877edccd7849f4be477ec/whitepaper/deployment-production-example.png)\n\n### Low Resource Deployment Example\n\nThis is an example to showcase how you can pull up a full consortium even from\nwithin a single operating system process (API server) with multiple members and\ntheir respective nodes. It is not something that's recommended for a production\ngrade environment, ever, but it is great for demos and integration tests where\nyou have to simulate a fully functioning consortium with as little hardware footprint\nas possible to save on time and cost.\n\nThe individual nodes/API servers are isolated by listening on seperate TCP ports\nof the machine they are hosted on:\n\n![deployment-low-resource-example.png](https://github.com/hyperledger/cactus/raw/4a337be719a9d2e2ccb877edccd7849f4be477ec/whitepaper/deployment-low-resource-example.png)\n\n## Containerization\n\n### Building the container image locally\n\nIn the Cactus project root say:\n\n```sh\nDOCKER_BUILDKIT=1 docker build -f ./packages/cactus-cmd-api-server/Dockerfile . -t cas -t cactus-api-server\n```\n\nBuild with a specific version of the npm package:\n```sh\nDOCKER_BUILDKIT=1 docker build --build-arg NPM_PKG_VERSION=fix-quorum-contract-types -f ./packages/cactus-cmd-api-server/Dockerfile . -t cas -t cactus-api-server\n```\n\n### Running the container image locally\n\nBefore running the examples here you need to build the image locally.\nSee section [Building the container image locally](#building-the-container-image-locally) for details on how to do that.\n\nOnce you've built the container, the following commands should work:\n\n- Launch container - no plugins, default configuration\n\n  ```sh\n  docker run \\\n    --rm \\\n    --publish 3000:3000 \\\n    --publish 4000:4000 \\\n    cas\n  ```\n\n- Launch container with plugins of your choice (keychain, consortium connector, etc.) \n\n  ```sh\n    docker run \\\n    --rm \\\n    --publish 3000:3000 \\\n    --publish 4000:4000 \\\n    cas \\\n      ./node_modules/.bin/cactusapi \\\n      --plugins='[{\"packageName\": \"@hyperledger/cactus-plugin-ledger-connector-fabric\", \"type\": \"org.hyperledger.cactus.plugin_import_type.LOCAL\",  \"options\": { \"connectionProfile\": {}, \"instanceId\": \"some-unique-instance-id\"}}]'\n  ```\n\n- Launch container with plugin configuration as an **environment variable**:\n  ```sh\n  docker run \\\n    --rm \\\n    --publish 3000:3000 \\\n    --publish 4000:4000 \\\n    --env PLUGINS='[{\"packageName\": \"@hyperledger/cactus-plugin-ledger-connector-besu\", \"type\": \"org.hyperledger.cactus.plugin_import_type.LOCAL\",  \"options\": {\"rpcApiHttpHost\": \"http://localhost:8545\", \"instanceId\": \"some-unique-besu-connector-instance-id\"}}]' \\\n    cas\n  ```\n\n- Launch container with plugin configuration as a **CLI argument**:\n  ```sh\n  docker run \\\n    --rm \\\n    --publish 3000:3000 \\\n    --publish 4000:4000 \\\n    cas \\\n      ./node_modules/.bin/cactusapi \\\n      --plugins='[{\"packageName\": \"@hyperledger/cactus-plugin-ledger-connector-besu\", \"type\": \"org.hyperledger.cactus.plugin_import_type.LOCAL\",  \"options\": {\"rpcApiHttpHost\": \"http://localhost:8545\", \"instanceId\": \"some-unique-besu-connector-instance-id\"}}]'\n  ```\n\n- Launch container with **configuration file** mounted from host machine:\n  ```sh\n\n  echo '[{\"packageName\": \"@hyperledger/cactus-plugin-ledger-connector-besu\", \"type\": \"org.hyperledger.cactus.plugin_import_type.LOCAL\",  \"options\": {\"rpcApiHttpHost\": \"http://localhost:8545\", \"instanceId\": \"some-unique-besu-connector-instance-id\"}}]' > cactus.json\n\n  docker run \\\n    --rm \\\n    --publish 3000:3000 \\\n    --publish 4000:4000 \\\n    --mount type=bind,source=\"$(pwd)\"/cactus.json,target=/cactus.json \\\n    cas \\\n      ./node_modules/.bin/cactusapi \\\n      --config-file=/cactus.json\n  ```\n\n### Testing API calls with the container\n\nDon't have a Besu network on hand to test with? Test or develop against our Besu All-In-One container!\n\n1. Terminal Window 1 (Ledger)\n    ```sh\n    docker run --publish 8545:8545 hyperledger/cactus-besu-all-in-one:latest\n    ```\n\n2. Terminal Window 2 (Cactus API Server)\n    ```sh\n    docker run \\\n      --network host \\\n      --rm \\\n      --publish 3000:3000 \\\n      --publish 4000:4000 \\\n      --env PLUGINS='[{\"packageName\": \"@hyperledger/cactus-plugin-ledger-connector-besu\", \"type\": \"org.hyperledger.cactus.plugin_import_type.LOCAL\",  \"options\": {\"rpcApiHttpHost\": \"http://localhost:8545\", \"instanceId\": \"some-unique-besu-connector-instance-id\"}}]' \\\n      cas\n    ```\n\n3. Terminal Window 3 (curl - replace eth accounts as needed)\n    ```sh\n    curl --location --request POST 'http://127.0.0.1:4000/api/v1/plugins/@hyperledger/cactus-plugin-ledger-connector-besu/run-transaction' \\\n    --header 'Content-Type: application/json' \\\n    --data-raw '{\n        \"web3SigningCredential\": {\n          \"ethAccount\": \"627306090abaB3A6e1400e9345bC60c78a8BEf57\",\n          \"secret\": \"c87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3\",\n          \"type\": \"PRIVATE_KEY_HEX\"\n        },\n        \"consistencyStrategy\": {\n          \"blockConfirmations\": 0,\n          \"receiptType\": \"NODE_TX_POOL_ACK\"\n        },\n        \"transactionConfig\": {\n          \"from\": \"627306090abaB3A6e1400e9345bC60c78a8BEf57\",\n          \"to\": \"f17f52151EbEF6C7334FAD080c5704D77216b732\",\n          \"value\": 1,\n          \"gas\": 10000000\n        }\n    }'\n    ```\n\n4. The above should produce a response that looks similar to this:\n\n    ```json\n    {\n        \"success\": true,\n        \"data\": {\n            \"transactionReceipt\": {\n                \"blockHash\": \"0x7c97c038a5d3bd84613fe23ed442695276d5d2df97f4e7c4f10ca06765033ffd\",\n                \"blockNumber\": 1218,\n                \"contractAddress\": null,\n                \"cumulativeGasUsed\": 21000,\n                \"from\": \"0x627306090abab3a6e1400e9345bc60c78a8bef57\",\n                \"gasUsed\": 21000,\n                \"logs\": [],\n                \"logsBloom\": \"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\",\n                \"status\": true,\n                \"to\": \"0xf17f52151ebef6c7334fad080c5704d77216b732\",\n                \"transactionHash\": \"0xc7fcb46c735bdc696d500bfc70c72595a2b8c31813929e5c61d9a5aec3376d6f\",\n                \"transactionIndex\": 0\n            }\n        }\n    }\n    ```\n\n\n\n## Prometheus Exporter\nThis class creates a prometheus exporter, which scrapes the total Cactus node count.\n\n### Usage Prometheus\nThe prometheus exporter object is initialized in the `ApiServer` class constructor itself, so instantiating the object of the `ApiServer` class, gives access to the exporter object.\nYou can also initialize the prometheus exporter object seperately and then pass it to the `IApiServerConstructorOptions` interface for `ApiServer` constructor.\n\n`getPrometheusMetricsV1` function returns the prometheus exporter metrics, currently displaying the total plugins imported, which currently refreshes to match the plugin count, everytime `setTotalPluginImports` method is called.\n\n### Prometheus Integration\nTo use Prometheus with this exporter make sure to install [Prometheus main component](https://prometheus.io/download/).\nOnce Prometheus is setup, the corresponding scrape_config needs to be added to the prometheus.yml\n\n```(yaml)\n- job_name: 'consortium_manual_exporter'\n  metrics_path: /api/v1/api-server/get-prometheus-exporter-metrics\n  scrape_interval: 5s\n  static_configs:\n    - targets: ['{host}:{port}']\n```\n\nHere the `host:port` is where the prometheus exporter metrics are exposed. The test cases (For example, packages/cactus-plugin-consortium-manual/src/test/typescript/unit/consortium/get-node-jws-endpoint-v1.test.ts) exposes it over `0.0.0.0` and a random port(). The random port can be found in the running logs of the test case and looks like (42379 in the below mentioned URL)\n`Metrics URL: http://0.0.0.0:42379/api/v1/api-server/get-prometheus-exporter-metrics/get-prometheus-exporter-metrics`\n\nOnce edited, you can start the prometheus service by referencing the above edited prometheus.yml file.\nOn the prometheus graphical interface (defaulted to http://localhost:9090), choose **Graph** from the menu bar, then select the **Console** tab. From the **Insert metric at cursor** drop down, select **cactus_api_server_total_plugin_imports** and click **execute**\n\n### Helper code\n\n###### response.type.ts\nThis file contains the various responses of the metrics.\n\n###### data-fetcher.ts\nThis file contains functions encasing the logic to process the data points.\n\n###### metrics.ts\nThis file lists all the prometheus metrics and what they are used for.\n\n\n\n\n\n## FAQ\n\n### What is the difference between a Cactus Node and a Cactus API Server?\n\nThe node is what has an identity within your PKI and can be made up of 1-N API\nserver instances that all share the same configuration/identity of the node.\nSee deployment scenarios above for a much more detailed explanation.\n\n### Is the API server horizontally scalable?\n\n**Yes, 100%.**\nKeep in mind though that the API server can be loaded up with arbitrary plugins\nmeaning that if you write a plugin that has a central database that can only\ndo 1 transaction per second, then it will not help you much that the API server\nitself is horizontally scalable because deploying a thousand instances of the\nAPI server will just result in you having a thousand instances of your plugin\nall waiting for that underlying database with its 1 TPS throughput hogging your\nsystem.\nWhen we say that the API server is horizontally scalable, we mean that the API\nserver itself is designed not to have any such state mentioned in the example\nabove.\nYou are responsible for only deploying plugins in the API server that are\nhorizontally scalable as well. In short, your whole system is only horizontally\nscalable if all components of it are horizontally scalable.\n\n### Does the API server automatically protect me from malicious plugins?\n\n**No.** If you install a third-party plugin that wasn't vetted by anyone and that\nplugin happens to have malicious code in it to steal your private keys, it can\ndo so.\nYou are responsible for making sure that the plugins you install have no known\nsecurity vulnerabilities or backdoors e.g. they are considered \"secure\".\nThe double quotes around \"secure\" is meant to signify the fact that no software\nis ever really truly secure, just merely lacking of known vulnerabilities at\nany given point in time.\n\n### Can I use the API server with plugins deployed as a service?\n\n**Yes.** You can deploy your plugin written in any language, anywhere as long\nas it is accessible over the network and does come with a Typescript API client\nthat you can use to install into the API server as a proxy for an in-process\nplugin implementation.\n","readmeFilename":"README.md","_id":"@elenaizaguirre/cactus-cmd-api-server@0.7.1-scope-changed.2eda5046.6","_nodeVersion":"16.3.0","_npmVersion":"lerna/4.0.0/node@v16.3.0+x64 (linux)","dist":{"integrity":"sha512-XUMfGME9oNvr40749VIjm5a/oHLttvdfm/5fM52rHGSy2pDdk9ebBv8Zv250FdIXbr+GVYV5x+jcpoysfCpT4A==","shasum":"760e960dad7401834171aac342740350d0d30690","tarball":"https://registry.npmjs.org/@elenaizaguirre/cactus-cmd-api-server/-/cactus-cmd-api-server-0.7.1-scope-changed.2eda5046.6.tgz","fileCount":94,"unpackedSize":6271506,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhE4HmCRA9TVsSAnZWagAAltcQAJyfrLFJivHB38gUFbJ7\nQPUmBZXaP52Jz7B4n8Rjkr1DmV2JajLYIW26UypQzrhLXYXJ/6Vt4x339Car\n4cm1dbYdogDRfOzfPM6gjq35tAI1d1qKwVYguQrZbDi/gt1rm/dRTE0B8J3C\ncoeeqXKLPz+nShqXLFdZZGQ9frIy6FPBnNo4i5UO0tQUUoPzFZeE97q3yJcL\ndMqZLBiotbSLrvpFpYkw4tefYMr95VrXno/+CsgmerolJt0A+HSEmPNcCI+A\nQyZ8NL4PhVQYxNhv23IQJtXnkXmhGE+bfUUkEJnBlqpJ3HdHsPDAbfc3OqGc\n7PKIJTI/V06doSZkIbc0zkMuyswT3RT5vnvaePE714QQccU5kZUGZAE7xzgV\nFoNrIS8ALE0GaTwXJ4iDWXOdRpDm+6rScO6bwvD9RmK+21+ix9za5JHD1+kJ\njDUVC2KvpoyZBE5WOvRIu4re8og4gic1E68iBPRQsojNJm7LlfcyNJVmeRh3\nYNfTpTz47O3V+3zPBtaJ0sV047DZm+SPeb6drHMsLY7MJihWtRELU3rA1qlP\nlWnDIk48h2F/8z1HcBgmF4NvuEn2i79ixB2PzDwaFr3Sp7+TqKpopc2jzUBB\n0n1KNK79SoiUIBbjDwAYi9RPBlegA7KT+N5UnpNkRxATytorLnifXrPtqKBY\nEmfX\r\n=UB3A\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCFsaNgE6KiwdMSJAHTJcRskvpyZDlHmSqdKm1jOVDq2gIgRblLvN5kydDUs445kJSGmiUMc4Rf+HboL6R1XIXudbE="}]},"_npmUser":{"name":"elenaizaguirre","email":"e.izaguirre.equiza@accenture.com"},"directories":{},"maintainers":[{"name":"elenaizaguirre","email":"e.izaguirre.equiza@accenture.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/cactus-cmd-api-server_0.7.1-scope-changed.2eda5046.6_1628668389553_0.2617638486374967"},"_hasShrinkwrap":false},"0.6.10":{"name":"@elenaizaguirre/cactus-cmd-api-server","version":"0.6.10","description":"API server that combines and exposes all the functionality of a Cactus deployment through a unified REST API interface.","main":"dist/lib/main/typescript/index.js","mainMinified":"dist/cactus-cmd-api-server.node.umd.min.js","browser":"dist/cactus-cmd-api-server.web.umd.js","browserMinified":"dist/cactus-cmd-api-server.web.umd.min.js","module":"dist/lib/main/typescript/index.js","types":"dist/types/main/typescript/index.d.ts","scripts":{"generate-sdk":"openapi-generator-cli generate -i ./src/main/json/openapi.json -g typescript-axios -o ./src/main/typescript/generated/openapi/typescript-axios/ --reserved-words-mappings protected=protected","codegen:openapi":"npm run generate-sdk","codegen":"run-p 'codegen:*'","watch":"npm-watch","webpack":"npm-run-all webpack:dev webpack:prod","webpack:dev":"npm-run-all webpack:dev:node webpack:dev:web","webpack:dev:web":"webpack --env=dev --target=web --config ../../webpack.config.js","webpack:dev:node":"webpack --env=dev --target=node --config ../../webpack.config.js","webpack:prod":"npm-run-all webpack:prod:node webpack:prod:web","webpack:prod:web":"webpack --env=prod --target=web --config ../../webpack.config.js","webpack:prod:node":"echo 'SKIPPING script webpack:prod:node for @hyperledger/cactus-cmd-api-server' the dev bundle will be used as fallback until npm can be processed by the Webpack Terser."},"watch":{"codegen:openapi":{"patterns":["./src/main/json/openapi.json"]}},"publishConfig":{"access":"public"},"engines":{"node":">=10","npm":">=6"},"repository":{"type":"git","url":"git+https://github.com/elenaizaguirre/cactus.git"},"keywords":["Hyperledger","Cactus","Integration","Blockchain","Distributed Ledger Technology"],"author":{"name":"Hyperledger Cactus Contributors","email":"cactus@lists.hyperledger.org","url":"https://www.hyperledger.org/use/cactus"},"contributors":[{"name":"Please add yourself to the list of contributors","email":"your.name@example.com","url":"https://example.com"},{"name":"Peter Somogyvari","email":"peter.somogyvari@accenture.com","url":"https://accenture.com"}],"license":"Apache-2.0","bugs":{"url":"https://github.com/hyperledger/cactus/issues"},"homepage":"https://github.com/hyperledger/cactus#readme","dependencies":{"@elenaizaguirre/cactus-common":"0.6.10","@elenaizaguirre/cactus-core":"0.6.10","@elenaizaguirre/cactus-core-api":"0.6.10","@thream/socketio-jwt":"2.1.0","axios":"0.21.1","bluebird":"3.7.2","body-parser":"1.19.0","compression":"1.7.4","convict":"6.0.0","convict-format-with-validator":"6.0.0","cors":"2.8.5","express":"4.17.1","express-http-proxy":"1.6.0","express-jwt":"6.0.0","express-jwt-authz":"2.4.1","express-openapi-validator":"3.10.0","http-status-codes":"2.1.4","jose":"1.28.1","live-plugin-manager":"0.15.1","node-forge":"0.10.0","prom-client":"13.1.0","run-time-error":"1.4.0","rxjs":"7.1.0","semver":"7.3.2","socket.io":"4.0.1","socket.io-client":"4.0.1","typescript-optional":"2.0.1","uuid":"7.0.2"},"devDependencies":{"@elenaizaguirre/cactus-plugin-keychain-vault":"0.6.10","@elenaizaguirre/cactus-test-tooling":"0.6.10","@types/compression":"1.7.0","@types/convict":"5.2.1","@types/cors":"2.8.6","@types/express":"4.17.8","@types/express-http-proxy":"1.6.1","@types/express-jwt":"6.0.1","@types/jsonwebtoken":"8.5.1","@types/multer":"1.4.5","@types/node-forge":"0.9.3","@types/passport":"1.0.6","@types/passport-oauth2":"1.4.10","@types/passport-saml":"1.1.2","@types/passport-strategy":"0.2.35","@types/semver":"7.3.1","@types/uuid":"7.0.2","@types/xml2js":"0.4.8"},"gitHead":"2eda50462d834a7a74aeaa9e0d9784406ef05ebe","_id":"@elenaizaguirre/cactus-cmd-api-server@0.6.10","_nodeVersion":"16.3.0","_npmVersion":"lerna/4.0.0/node@v16.3.0+x64 (linux)","dist":{"integrity":"sha512-GVW0WC8wgoiP20ZjU+JJw7BdITrYPe9PY0YiCVIwl7FNmOYwY0XiBbfczECp/Afz1QxxHfospAZrlK+U4xEesw==","shasum":"01075bd0a17fb14b28515a665e7cc4c65cdd98c8","tarball":"https://registry.npmjs.org/@elenaizaguirre/cactus-cmd-api-server/-/cactus-cmd-api-server-0.6.10.tgz","fileCount":94,"unpackedSize":6271303,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhE4UGCRA9TVsSAnZWagAATCQP/Rf3P3aM2SSzlBPcyNX8\noB6IWwJ7+27nC9crCXXJY6diqCAWHvEPSpLmLLHbzSRVtyRU4u1wjy6ZjXqL\n3ZM3l53zANj2Re/rffdX7cRNhTsRUoTslEi7YaeApmTY73zkTWmu6pMdWXIv\n/x3FptmFH5gWTMxnojfBX12TKi1hmjdIUW0KTJqAIGXy7TnVKRLRqR5MVI65\n68YkoYG1zf9kovUXsFn5LUD3KQNsH1SIFjToDKP1iOq/mCnrYScn/XDhbKc1\nTzU3o0ECMnAKfbz2GS50kLOvY6j3N2h590Mjwrbrg1c1tPp4v7S9s/Zwbsdg\nZh6zDMnXF92Zp2kxsvmg8EXbt8m978C4MbByES6vHjDLua7FVKcg5bQFJ3GW\n3x108Vyzm6SfbnaeG+vxHlF30EyhEG94YD8sHL3UUcv+aEjBsClSvuUj+AqT\nS4x2huRURbRND7i7mqKOK3KNcwiBPqStfVg9ALQtLH0xb0gbPjQtteLcqh+E\nex/qNL3M+GpGpOtBd5XLFYSB/H1sGjxRB9NAyaiBZiOdY/d/pSLCgks9ThE2\n/bPdm7hSk8zoKzPIpfJQuFlBC/hWZOgYCLbUahCqyvYMcuPvfZizAnurb2dC\nV0yEG7dgf+Z58F6g3BHq8P/1iBswH0ETKgqjVyI/mO1Yy6UakO8AvO6+gKd9\nre4b\r\n=lKvx\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEj9ydzbD68kAKIkp2DBoBvEMMtQ0emLb6zAbleyZpIwAiEA3gknNusIpFnICEr+PVezY1Ws+2bS1LbO46AxRunzg8I="}]},"_npmUser":{"name":"elenaizaguirre","email":"e.izaguirre.equiza@accenture.com"},"directories":{},"maintainers":[{"name":"elenaizaguirre","email":"e.izaguirre.equiza@accenture.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/cactus-cmd-api-server_0.6.10_1628669190427_0.7783449143995198"},"_hasShrinkwrap":false},"0.6.11":{"name":"@elenaizaguirre/cactus-cmd-api-server","version":"0.6.11","description":"API server that combines and exposes all the functionality of a Cactus deployment through a unified REST API interface.","main":"dist/lib/main/typescript/index.js","mainMinified":"dist/cactus-cmd-api-server.node.umd.min.js","browser":"dist/cactus-cmd-api-server.web.umd.js","browserMinified":"dist/cactus-cmd-api-server.web.umd.min.js","module":"dist/lib/main/typescript/index.js","types":"dist/types/main/typescript/index.d.ts","scripts":{"generate-sdk":"openapi-generator-cli generate -i ./src/main/json/openapi.json -g typescript-axios -o ./src/main/typescript/generated/openapi/typescript-axios/ --reserved-words-mappings protected=protected","codegen:openapi":"npm run generate-sdk","codegen":"run-p 'codegen:*'","watch":"npm-watch","webpack":"npm-run-all webpack:dev webpack:prod","webpack:dev":"npm-run-all webpack:dev:node webpack:dev:web","webpack:dev:web":"webpack --env=dev --target=web --config ../../webpack.config.js","webpack:dev:node":"webpack --env=dev --target=node --config ../../webpack.config.js","webpack:prod":"npm-run-all webpack:prod:node webpack:prod:web","webpack:prod:web":"webpack --env=prod --target=web --config ../../webpack.config.js","webpack:prod:node":"echo 'SKIPPING script webpack:prod:node for @hyperledger/cactus-cmd-api-server' the dev bundle will be used as fallback until npm can be processed by the Webpack Terser."},"watch":{"codegen:openapi":{"patterns":["./src/main/json/openapi.json"]}},"publishConfig":{"access":"public"},"engines":{"node":">=10","npm":">=6"},"repository":{"type":"git","url":"git+https://github.com/elenaizaguirre/cactus.git"},"keywords":["Hyperledger","Cactus","Integration","Blockchain","Distributed Ledger Technology"],"author":{"name":"Hyperledger Cactus Contributors","email":"cactus@lists.hyperledger.org","url":"https://www.hyperledger.org/use/cactus"},"contributors":[{"name":"Please add yourself to the list of contributors","email":"your.name@example.com","url":"https://example.com"},{"name":"Peter Somogyvari","email":"peter.somogyvari@accenture.com","url":"https://accenture.com"}],"license":"Apache-2.0","bugs":{"url":"https://github.com/hyperledger/cactus/issues"},"homepage":"https://github.com/hyperledger/cactus#readme","dependencies":{"@elenaizaguirre/cactus-common":"0.6.11","@elenaizaguirre/cactus-core":"0.6.11","@elenaizaguirre/cactus-core-api":"0.6.11","@thream/socketio-jwt":"2.1.0","axios":"0.21.1","bluebird":"3.7.2","body-parser":"1.19.0","compression":"1.7.4","convict":"6.0.0","convict-format-with-validator":"6.0.0","cors":"2.8.5","express":"4.17.1","express-http-proxy":"1.6.0","express-jwt":"6.0.0","express-jwt-authz":"2.4.1","express-openapi-validator":"3.10.0","http-status-codes":"2.1.4","jose":"1.28.1","live-plugin-manager":"0.15.1","node-forge":"0.10.0","prom-client":"13.1.0","run-time-error":"1.4.0","rxjs":"7.1.0","semver":"7.3.2","socket.io":"4.0.1","socket.io-client":"4.0.1","typescript-optional":"2.0.1","uuid":"7.0.2"},"devDependencies":{"@elenaizaguirre/cactus-plugin-keychain-vault":"0.6.11","@elenaizaguirre/cactus-test-tooling":"0.6.11","@types/compression":"1.7.0","@types/convict":"5.2.1","@types/cors":"2.8.6","@types/express":"4.17.8","@types/express-http-proxy":"1.6.1","@types/express-jwt":"6.0.1","@types/jsonwebtoken":"8.5.1","@types/multer":"1.4.5","@types/node-forge":"0.9.3","@types/passport":"1.0.6","@types/passport-oauth2":"1.4.10","@types/passport-saml":"1.1.2","@types/passport-strategy":"0.2.35","@types/semver":"7.3.1","@types/uuid":"7.0.2","@types/xml2js":"0.4.8"},"gitHead":"ed87c800f7f633794eb8d6bffacd5812c6620f19","_id":"@elenaizaguirre/cactus-cmd-api-server@0.6.11","_nodeVersion":"16.3.0","_npmVersion":"lerna/4.0.0/node@v16.3.0+x64 (linux)","dist":{"integrity":"sha512-DtGAnOc0qSTPTzlLX0/4It0XZJPAq1mWxGYSxJXUZ7UmnH15hXPbb55YtCsS9gU0DtedyIxjt0bb9mR00nfZiQ==","shasum":"e90d6632810b8c5ef60f5aa0d4e8c4b808214089","tarball":"https://registry.npmjs.org/@elenaizaguirre/cactus-cmd-api-server/-/cactus-cmd-api-server-0.6.11.tgz","fileCount":94,"unpackedSize":6271300,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhE5PuCRA9TVsSAnZWagAAH8MQAJsnEuYVUhQyy0FGxXDn\npupJtVqD9Z036br+KkJcr6u/7p+i5Xu+GJ7Dx9z16tkKvXxmBwrXBa9J9mif\nYXy8A9aBRQFOAPAb3HDQxEKrvgN6UqLpnZXNfT0RvzDeuThwFrVCKh0uvKz/\nZUj5xEi8ZhCwInRWl6bOTCbbb/5DLTpFNA9FgqBZciG5ISg0zVAw0hhHe3hX\nx11SVoqE7xlBUnElLF0w+BBLKpeQ2/s3zwj2KPF8ZtVL0+tsujEIf27Rxhk2\nTnrmwFkATvoLmZmoECk9QzUTP0vH1LUsI+MgsmXWUm1B9MeTIveSB0nzxX7N\nuS1URCElXQrUU5yiGtgHwdrSQfgQScIJsvhjza3lSgA62B2/DplnUDj2olFA\nxaOHpukFOAbaP8wv+iDDkzLDuBmgIvqj8pIaUo44gZcDqT+r3lfE/uhdaE91\ngPgWCpcRdnCHwmvVax7JZEYIZtOkJA9SMmh6iTtqRI3Oyq9slPYjQSCnukSZ\njLJ4MbDN+sTAQwA/6n9of0sjrP/ojvc4QQ/otti+caLkv0W5FsSDLXSH58Km\np2Oli7w6uFtpfiJRyL4/R2tBXR8UqGuF3CzMVTEAi3/G2nPIvng+o+x3Xnzy\nESSyMlWGLgfUSOA5Np+7hut04o4xco4Qi25xAJRGpKXGOqT25pHlZzGmNO9P\nbniE\r\n=KjOM\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIBel172c+ODJSrMIrXBpHgAUoi7wEnkXZMjUqSjxrTQtAiAiPjpogS4z0FpfW0RxPvwHjULO7PpHU0sE6CCNq0jchA=="}]},"_npmUser":{"name":"elenaizaguirre","email":"e.izaguirre.equiza@accenture.com"},"directories":{},"maintainers":[{"name":"elenaizaguirre","email":"e.izaguirre.equiza@accenture.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/cactus-cmd-api-server_0.6.11_1628673006396_0.6071726893798164"},"_hasShrinkwrap":false},"0.6.12":{"name":"@elenaizaguirre/cactus-cmd-api-server","version":"0.6.12","description":"API server that combines and exposes all the functionality of a Cactus deployment through a unified REST API interface.","main":"dist/lib/main/typescript/index.js","mainMinified":"dist/cactus-cmd-api-server.node.umd.min.js","browser":"dist/cactus-cmd-api-server.web.umd.js","browserMinified":"dist/cactus-cmd-api-server.web.umd.min.js","module":"dist/lib/main/typescript/index.js","types":"dist/types/main/typescript/index.d.ts","scripts":{"generate-sdk":"openapi-generator-cli generate -i ./src/main/json/openapi.json -g typescript-axios -o ./src/main/typescript/generated/openapi/typescript-axios/ --reserved-words-mappings protected=protected","codegen:openapi":"npm run generate-sdk","codegen":"run-p 'codegen:*'","watch":"npm-watch","webpack":"npm-run-all webpack:dev webpack:prod","webpack:dev":"npm-run-all webpack:dev:node webpack:dev:web","webpack:dev:web":"webpack --env=dev --target=web --config ../../webpack.config.js","webpack:dev:node":"webpack --env=dev --target=node --config ../../webpack.config.js","webpack:prod":"npm-run-all webpack:prod:node webpack:prod:web","webpack:prod:web":"webpack --env=prod --target=web --config ../../webpack.config.js","webpack:prod:node":"echo 'SKIPPING script webpack:prod:node for @hyperledger/cactus-cmd-api-server' the dev bundle will be used as fallback until npm can be processed by the Webpack Terser."},"watch":{"codegen:openapi":{"patterns":["./src/main/json/openapi.json"]}},"publishConfig":{"access":"public"},"engines":{"node":">=10","npm":">=6"},"repository":{"type":"git","url":"git+https://github.com/elenaizaguirre/cactus.git"},"keywords":["Hyperledger","Cactus","Integration","Blockchain","Distributed Ledger Technology"],"author":{"name":"Hyperledger Cactus Contributors","email":"cactus@lists.hyperledger.org","url":"https://www.hyperledger.org/use/cactus"},"contributors":[{"name":"Please add yourself to the list of contributors","email":"your.name@example.com","url":"https://example.com"},{"name":"Peter Somogyvari","email":"peter.somogyvari@accenture.com","url":"https://accenture.com"}],"license":"Apache-2.0","bugs":{"url":"https://github.com/hyperledger/cactus/issues"},"homepage":"https://github.com/hyperledger/cactus#readme","dependencies":{"@elenaizaguirre/cactus-common":"0.6.12","@elenaizaguirre/cactus-core":"0.6.12","@elenaizaguirre/cactus-core-api":"0.6.12","@thream/socketio-jwt":"2.1.0","axios":"0.21.1","bluebird":"3.7.2","body-parser":"1.19.0","compression":"1.7.4","convict":"6.0.0","convict-format-with-validator":"6.0.0","cors":"2.8.5","express":"4.17.1","express-http-proxy":"1.6.0","express-jwt":"6.0.0","express-jwt-authz":"2.4.1","express-openapi-validator":"3.10.0","fs-extra":"10.0.0","http-status-codes":"2.1.4","jose":"1.28.1","lmify":"0.3.0","node-forge":"0.10.0","prom-client":"13.1.0","run-time-error":"1.4.0","rxjs":"7.1.0","semver":"7.3.2","socket.io":"4.0.1","socket.io-client":"4.0.1","typescript-optional":"2.0.1","uuid":"7.0.2"},"devDependencies":{"@elenaizaguirre/cactus-plugin-keychain-vault":"0.6.12","@elenaizaguirre/cactus-test-tooling":"0.6.12","@types/compression":"1.7.0","@types/convict":"5.2.1","@types/cors":"2.8.6","@types/express":"4.17.8","@types/express-http-proxy":"1.6.1","@types/express-jwt":"6.0.1","@types/jsonwebtoken":"8.5.1","@types/multer":"1.4.5","@types/node-forge":"0.9.3","@types/passport":"1.0.6","@types/passport-oauth2":"1.4.10","@types/passport-saml":"1.1.2","@types/passport-strategy":"0.2.35","@types/semver":"7.3.1","@types/uuid":"7.0.2","@types/xml2js":"0.4.8"},"gitHead":"fdd5a74e4f61223e63d3838b5648d57b4c1f6c82","_id":"@elenaizaguirre/cactus-cmd-api-server@0.6.12","_nodeVersion":"16.3.0","_npmVersion":"lerna/4.0.0/node@v16.3.0+x64 (linux)","dist":{"integrity":"sha512-BcfQXjDJi779FWPX2SXH8N4IFqPq0IPGT0uYj47MFWrNFgzpUaRvOZ6CVR9clbmwgyia77Izu/0lXEQNIXUOjQ==","shasum":"26fbd88882cfad2a006432493d8d1a8e8079b11e","tarball":"https://registry.npmjs.org/@elenaizaguirre/cactus-cmd-api-server/-/cactus-cmd-api-server-0.6.12.tgz","fileCount":95,"unpackedSize":3674439,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhFMZZCRA9TVsSAnZWagAAFYAP/0LyuOyKdsSfbFyBHGqO\nImUEDLUbPCSVrK8HHtn4JBi0rqluEcI/LhsBwTd1wNKorkoUKrU/a5obSLNG\nqk8UXui9ZW2jOdF9/MaRNx0hYC1j/588sHHqJSfgOyU/C+7SE6Qhokc1HZnH\n4QoQ2XXHtpsZI1MGSsVBKO1zNS/Tuy6p+ZPhbwX86cZTpQw4LUrL9SqZBkmP\nc2s7wGEvmW7dn7mJ9Z+N0EwYYLzqcyVUqMJC1gwJQZCDjiuseDBixLNFWNyw\n0a4vGzsggeg9Z25S1TAw+H2x/eNw2LZIfi60vqu13e3ptY4T/m3OkJM2V4dM\nigStw/YkWKY2tlA5fHRfKFpJlVWySNuQMM7AgXIY+VcifSRpdgAsMTZhNYt+\nP5MltSqX+6E6jfslrOty+Iqu+DB1bBwun5WkZr9EQpYxU8GPwemJDdD3KcZB\nJxPdEXzCkYEp+kCD5GAFXU1bcfwlNOK6q2BvpzcV/VGY4/BD7pv9ZGqL3FqC\nwHaNEAzb0SLHCaKFQPjj53y9zU/8u7oLPpL5vlH9L8gQJiDvOXJ79Hplpxwf\nn63X3PE5A42R8RzGMi6V97y/jShtW8oCoVKXh564fYlQT4W2NTyljS6qxDh5\nFlnyNpaWADJIoGCa+fDtSjcOq5bDwH+/lA3ypFpltdDDchHXo8j9OsGcquBN\ncHlJ\r\n=LubG\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIHAmdT2iObI0TkRfd8cwfZt2byh9L2hOTRfg25RTVth8AiEApjHPlRtfeB+gEX4oXucEDDdpJ07LhAMScZCB9V77ngs="}]},"_npmUser":{"name":"elenaizaguirre","email":"e.izaguirre.equiza@accenture.com"},"directories":{},"maintainers":[{"name":"elenaizaguirre","email":"e.izaguirre.equiza@accenture.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/cactus-cmd-api-server_0.6.12_1628751449189_0.24618859083423295"},"_hasShrinkwrap":false},"0.6.13":{"name":"@elenaizaguirre/cactus-cmd-api-server","version":"0.6.13","description":"API server that combines and exposes all the functionality of a Cactus deployment through a unified REST API interface.","main":"dist/lib/main/typescript/index.js","mainMinified":"dist/cactus-cmd-api-server.node.umd.min.js","browser":"dist/cactus-cmd-api-server.web.umd.js","browserMinified":"dist/cactus-cmd-api-server.web.umd.min.js","module":"dist/lib/main/typescript/index.js","types":"dist/types/main/typescript/index.d.ts","scripts":{"generate-sdk":"openapi-generator-cli generate -i ./src/main/json/openapi.json -g typescript-axios -o ./src/main/typescript/generated/openapi/typescript-axios/ --reserved-words-mappings protected=protected","codegen:openapi":"npm run generate-sdk","codegen":"run-p 'codegen:*'","watch":"npm-watch","webpack":"npm-run-all webpack:dev webpack:prod","webpack:dev":"npm-run-all webpack:dev:node webpack:dev:web","webpack:dev:web":"webpack --env=dev --target=web --config ../../webpack.config.js","webpack:dev:node":"webpack --env=dev --target=node --config ../../webpack.config.js","webpack:prod":"npm-run-all webpack:prod:node webpack:prod:web","webpack:prod:web":"webpack --env=prod --target=web --config ../../webpack.config.js","webpack:prod:node":"echo 'SKIPPING script webpack:prod:node for @hyperledger/cactus-cmd-api-server' the dev bundle will be used as fallback until npm can be processed by the Webpack Terser."},"watch":{"codegen:openapi":{"patterns":["./src/main/json/openapi.json"]}},"publishConfig":{"access":"public"},"engines":{"node":">=10","npm":">=6"},"repository":{"type":"git","url":"git+https://github.com/elenaizaguirre/cactus.git"},"keywords":["Hyperledger","Cactus","Integration","Blockchain","Distributed Ledger Technology"],"author":{"name":"Hyperledger Cactus Contributors","email":"cactus@lists.hyperledger.org","url":"https://www.hyperledger.org/use/cactus"},"contributors":[{"name":"Please add yourself to the list of contributors","email":"your.name@example.com","url":"https://example.com"},{"name":"Peter Somogyvari","email":"peter.somogyvari@accenture.com","url":"https://accenture.com"}],"license":"Apache-2.0","bugs":{"url":"https://github.com/hyperledger/cactus/issues"},"homepage":"https://github.com/hyperledger/cactus#readme","dependencies":{"@elenaizaguirre/cactus-common":"0.6.13","@elenaizaguirre/cactus-core":"0.6.13","@elenaizaguirre/cactus-core-api":"0.6.13","@thream/socketio-jwt":"2.1.0","axios":"0.21.1","bluebird":"3.7.2","body-parser":"1.19.0","compression":"1.7.4","convict":"6.0.0","convict-format-with-validator":"6.0.0","cors":"2.8.5","express":"4.17.1","express-http-proxy":"1.6.0","express-jwt":"6.0.0","express-jwt-authz":"2.4.1","express-openapi-validator":"3.10.0","fs-extra":"10.0.0","http-status-codes":"2.1.4","jose":"1.28.1","lmify":"0.3.0","node-forge":"0.10.0","prom-client":"13.1.0","run-time-error":"1.4.0","rxjs":"7.1.0","semver":"7.3.2","socket.io":"4.0.1","socket.io-client":"4.0.1","typescript-optional":"2.0.1","uuid":"7.0.2"},"devDependencies":{"@elenaizaguirre/cactus-plugin-keychain-vault":"0.6.13","@elenaizaguirre/cactus-test-tooling":"0.6.13","@types/compression":"1.7.0","@types/convict":"5.2.1","@types/cors":"2.8.6","@types/express":"4.17.8","@types/express-http-proxy":"1.6.1","@types/express-jwt":"6.0.1","@types/jsonwebtoken":"8.5.1","@types/multer":"1.4.5","@types/node-forge":"0.9.3","@types/passport":"1.0.6","@types/passport-oauth2":"1.4.10","@types/passport-saml":"1.1.2","@types/passport-strategy":"0.2.35","@types/semver":"7.3.1","@types/uuid":"7.0.2","@types/xml2js":"0.4.8"},"gitHead":"3e38c3846aa701a2ce680b0f475e0127df689328","_id":"@elenaizaguirre/cactus-cmd-api-server@0.6.13","_nodeVersion":"16.3.0","_npmVersion":"lerna/4.0.0/node@v16.3.0+x64 (linux)","dist":{"integrity":"sha512-yQ5FltytmYP2vAMLGLiTy6GabbI8F+uRIB2ue+EBwPQJjmXMpPKIlpfynqVrDRPr4HBl0eq6hYgVhJ1pdTlAXw==","shasum":"d6ed4cd037262a48034f0f33f9ec650b053f73f1","tarball":"https://registry.npmjs.org/@elenaizaguirre/cactus-cmd-api-server/-/cactus-cmd-api-server-0.6.13.tgz","fileCount":95,"unpackedSize":3674451,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhFORHCRA9TVsSAnZWagAAohMP/03/c2qR+wt6G3rxJ1iN\n4e/KCXWR54MOKs+DnHgMNM8HsuieaYApWH4swYh38HEoQKcqxPyK+mFd3qzT\np0LDANb1Z6leGqg6Wec0X8AfIOhnBqlBQrEPJRKI8uFoehjypbaJAIF9uJ2L\nBggbY+N+4yMV7AVOdPXpVF7AXxA98UHe2xMTP35ZluYkfVXYGs8sVnbPDXqp\nBJBfGoV1pdb6D3a6QfUgYN1vmQbQu7N/2PIistIXOUv2UD6xbRauFnt7lU4z\nEWzuNQqfKGgBFkx4vh1ICC6IynsxqSf7OtHOwbS6G89rM0MU/N07IhFkitPN\n+/U4KIdUKlP7qL79kQdXxzyfAWITspm933jJH/hok46vLUL9uQHFSA+XVcl7\n0eRgkFo/leXeYqMa2yNqOw/OKmQk9D3kk/NSyaSunrtdtI+yeAR1r1DENG8V\ncr3z/K/vBr6RLipYFFZtiHirdTr5bIIgp0OPgaiPbHiLeSlDOZ0xdCL5fumF\nfgsWYTmIeKS/sQ9rAx0dR6mdsKfff9v5glgVzEGAmP9aeMG2N2KxqpRn682T\nFl8twEawxKZzYMFVEBaW+iD33AcAkWWgVBEOtaAPgCmDAszxFjddj3quTEDb\nGLIdG04ac7Rw/kNST2hOfHkaglb+lcSDexmfUp+liuwfp5FsA+U4bHPIqSzx\ntOAc\r\n=y8UZ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIEmlI7sSahRFL187enx6DIvaERkr38/spM+Zp4T6SCP4AiEAvV+qW+oB8tb6MO9aqGg7ZlP0GIzAtT15Qs2FY89ydak="}]},"_npmUser":{"name":"elenaizaguirre","email":"e.izaguirre.equiza@accenture.com"},"directories":{},"maintainers":[{"name":"elenaizaguirre","email":"e.izaguirre.equiza@accenture.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/cactus-cmd-api-server_0.6.13_1628759111226_0.49895809696366467"},"_hasShrinkwrap":false},"0.6.14":{"name":"@elenaizaguirre/cactus-cmd-api-server","version":"0.6.14","description":"API server that combines and exposes all the functionality of a Cactus deployment through a unified REST API interface.","main":"dist/lib/main/typescript/index.js","mainMinified":"dist/cactus-cmd-api-server.node.umd.min.js","browser":"dist/cactus-cmd-api-server.web.umd.js","browserMinified":"dist/cactus-cmd-api-server.web.umd.min.js","module":"dist/lib/main/typescript/index.js","types":"dist/types/main/typescript/index.d.ts","scripts":{"generate-sdk":"openapi-generator-cli generate -i ./src/main/json/openapi.json -g typescript-axios -o ./src/main/typescript/generated/openapi/typescript-axios/ --reserved-words-mappings protected=protected","codegen:openapi":"npm run generate-sdk","codegen":"run-p 'codegen:*'","watch":"npm-watch","webpack":"npm-run-all webpack:dev webpack:prod","webpack:dev":"npm-run-all webpack:dev:node webpack:dev:web","webpack:dev:web":"webpack --env=dev --target=web --config ../../webpack.config.js","webpack:dev:node":"webpack --env=dev --target=node --config ../../webpack.config.js","webpack:prod":"npm-run-all webpack:prod:node webpack:prod:web","webpack:prod:web":"webpack --env=prod --target=web --config ../../webpack.config.js","webpack:prod:node":"echo 'SKIPPING script webpack:prod:node for @hyperledger/cactus-cmd-api-server' the dev bundle will be used as fallback until npm can be processed by the Webpack Terser."},"watch":{"codegen:openapi":{"patterns":["./src/main/json/openapi.json"]}},"publishConfig":{"access":"public"},"engines":{"node":">=10","npm":">=6"},"repository":{"type":"git","url":"git+https://github.com/elenaizaguirre/cactus.git"},"keywords":["Hyperledger","Cactus","Integration","Blockchain","Distributed Ledger Technology"],"author":{"name":"Hyperledger Cactus Contributors","email":"cactus@lists.hyperledger.org","url":"https://www.hyperledger.org/use/cactus"},"contributors":[{"name":"Please add yourself to the list of contributors","email":"your.name@example.com","url":"https://example.com"},{"name":"Peter Somogyvari","email":"peter.somogyvari@accenture.com","url":"https://accenture.com"}],"license":"Apache-2.0","bugs":{"url":"https://github.com/hyperledger/cactus/issues"},"homepage":"https://github.com/hyperledger/cactus#readme","dependencies":{"@elenaizaguirre/cactus-common":"0.6.14","@elenaizaguirre/cactus-core":"0.6.14","@elenaizaguirre/cactus-core-api":"0.6.14","@thream/socketio-jwt":"2.1.0","axios":"0.21.1","bluebird":"3.7.2","body-parser":"1.19.0","compression":"1.7.4","convict":"6.0.0","convict-format-with-validator":"6.0.0","cors":"2.8.5","express":"4.17.1","express-http-proxy":"1.6.0","express-jwt":"6.0.0","express-jwt-authz":"2.4.1","express-openapi-validator":"3.10.0","fs-extra":"10.0.0","http-status-codes":"2.1.4","jose":"1.28.1","lmify":"0.3.0","node-forge":"0.10.0","prom-client":"13.1.0","run-time-error":"1.4.0","rxjs":"7.1.0","semver":"7.3.2","socket.io":"4.0.1","socket.io-client":"4.0.1","typescript-optional":"2.0.1","uuid":"7.0.2"},"devDependencies":{"@elenaizaguirre/cactus-plugin-keychain-vault":"0.6.14","@elenaizaguirre/cactus-test-tooling":"0.6.14","@types/compression":"1.7.0","@types/convict":"5.2.1","@types/cors":"2.8.6","@types/express":"4.17.8","@types/express-http-proxy":"1.6.1","@types/express-jwt":"6.0.1","@types/jsonwebtoken":"8.5.1","@types/multer":"1.4.5","@types/node-forge":"0.9.3","@types/passport":"1.0.6","@types/passport-oauth2":"1.4.10","@types/passport-saml":"1.1.2","@types/passport-strategy":"0.2.35","@types/semver":"7.3.1","@types/uuid":"7.0.2","@types/xml2js":"0.4.8"},"gitHead":"d340c8a1c056abfbd0d93eecfb6dbf569a0ba215","_id":"@elenaizaguirre/cactus-cmd-api-server@0.6.14","_nodeVersion":"16.3.0","_npmVersion":"lerna/4.0.0/node@v16.3.0+x64 (linux)","dist":{"integrity":"sha512-a3ciPHFG9inZs5nsvWklI7+kyo5xMTpGaKln6pPu45goOphjYNicmFU4bFbVudQ4xWnGUNPl/+ijZgtlPxIFGQ==","shasum":"65749fe2980c0f8aab4a4c99116d3fef32a92b96","tarball":"https://registry.npmjs.org/@elenaizaguirre/cactus-cmd-api-server/-/cactus-cmd-api-server-0.6.14.tgz","fileCount":95,"unpackedSize":3674439,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhFQPuCRA9TVsSAnZWagAAxREP/0OdbnC+vID3sjpUp+NM\n8tr0S5LehHtqqVWakhOB3rL8YqCCR/EgwOjcOqEE7Y+Hk9rj4B3IMYAZ9b1x\nZMT0IusNIOEJOV8pPwn/fE7WpRzIL+1uGVP/saQyTqDZ3vgyc8C/jP2X31Nl\nVqABOVbJAKQTpjwbYXD5m7cil+g3XFzsjAGmXZqlqEuv65QvLgrrJhXFwqga\nJO+DPgkIU+3K+X+d8/XG9WJdLoI3+EydTJ1KpWzDLbgcdz3VBsqs5IpJoCdy\nRGBEQK4KXLUGxzAqIfzyIR7LshiSx8fZpAyuuGv+nhOU+bKp3V/T7C/WibJT\n3fKuL26NBjo4lc57Xj0QCvUunR5FszN99JCLWedCsKLjq5TxTO0MIQc05lQa\ndy09SOldU6c/qIKTfp2slrJOZ38C9ccUGPyvJGE9htG+kU3aTzOz2Wo4fOBG\n3Gu0HIS3rachQ0hsshrTTgr/tv4no/Sjq/qgB50Nhv6i4cGjkmqed4FosMu6\n2Kdlo1t1mYMMOfalEFvIuSZPSYwfSG0YneQrPGLiLKa0T3jwuJP81T1UDzur\nGdbe7os2J8XH7AdIksnyxhTFaUEAomiyseiM402rXVePH+0EVibtry/dz2N4\n2Xdi+k6BGAMIp4aRBmx5lavsFO+3w8/fFBSOjVyW/qc2Y6yAhRnudSjaduda\nI46G\r\n=v9sZ\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEQCIHOZOSwwmKaq6/puWczQS1xYpFx6g/ApswOcEE2qE09PAiB9IOcA53en+3H8w4UgFLdnOIWUrza4zsezCN4hy0haTA=="}]},"_npmUser":{"name":"elenaizaguirre","email":"e.izaguirre.equiza@accenture.com"},"directories":{},"maintainers":[{"name":"elenaizaguirre","email":"e.izaguirre.equiza@accenture.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/cactus-cmd-api-server_0.6.14_1628767214703_0.07712288677225931"},"_hasShrinkwrap":false},"0.9.3":{"name":"@elenaizaguirre/cactus-cmd-api-server","version":"0.9.3","description":"API server that combines and exposes all the functionality of a Cactus deployment through a unified REST API interface.","main":"dist/lib/main/typescript/index.js","mainMinified":"dist/cactus-cmd-api-server.node.umd.min.js","browser":"dist/cactus-cmd-api-server.web.umd.js","browserMinified":"dist/cactus-cmd-api-server.web.umd.min.js","module":"dist/lib/main/typescript/index.js","types":"dist/lib/main/typescript/index.d.ts","scripts":{"generate-sdk":"openapi-generator-cli generate -i ./src/main/json/openapi.json -g typescript-axios -o ./src/main/typescript/generated/openapi/typescript-axios/ --reserved-words-mappings protected=protected","codegen:openapi":"npm run generate-sdk","proto:openapi":"openapi-generator-cli generate -i ./src/main/json/openapi.json -g protobuf-schema --model-name-suffix=PB --additional-properties=packageName=org.hyperledger.cactus.cmd_api_server -o ./src/main/proto/generated/openapi/ -t=./src/main/openapi-generator/templates/protobuf-schema/","proto:protoc-gen-ts":"yarn run grpc_tools_node_protoc --plugin=protoc-gen-ts=../../node_modules/.bin/protoc-gen-ts --ts_out=grpc_js:./src/main/typescript/generated/proto/protoc-gen-ts/ --proto_path ./src/main/proto/generated/openapi/ ./src/main/proto/generated/openapi/services/*.proto","codegen:proto":"run-s proto:openapi proto:protoc-gen-ts","codegen":"run-p 'codegen:*'","watch":"npm-watch","webpack":"npm-run-all webpack:dev webpack:prod","webpack:dev":"npm-run-all webpack:dev:node webpack:dev:web","webpack:dev:web":"webpack --env=dev --target=web --config ../../webpack.config.js","webpack:dev:node":"webpack --env=dev --target=node --config ../../webpack.config.js","webpack:prod":"npm-run-all webpack:prod:node webpack:prod:web","webpack:prod:web":"webpack --env=prod --target=web --config ../../webpack.config.js","webpack:prod:node":"echo 'SKIPPING script webpack:prod:node for @elenaizaguirre/cactus-cmd-api-server' the dev bundle will be used as fallback until npm can be processed by the Webpack Terser."},"watch":{"codegen:openapi":{"patterns":["./src/main/json/openapi.json"]}},"publishConfig":{"access":"public"},"engines":{"node":">=10","npm":">=6"},"repository":{"type":"git","url":"git+https://github.com/elenaizaguirre/cactus.git"},"keywords":["Hyperledger","Cactus","Integration","Blockchain","Distributed Ledger Technology"],"author":{"name":"Hyperledger Cactus Contributors","email":"cactus@lists.hyperledger.org","url":"https://www.hyperledger.org/use/cactus"},"contributors":[{"name":"Please add yourself to the list of contributors","email":"your.name@example.com","url":"https://example.com"},{"name":"Peter Somogyvari","email":"peter.somogyvari@accenture.com","url":"https://accenture.com"}],"license":"Apache-2.0","bugs":{"url":"https://github.com/hyperledger/cactus/issues"},"homepage":"https://github.com/hyperledger/cactus#readme","dependencies":{"@elenaizaguirre/cactus-common":"0.9.3","@elenaizaguirre/cactus-core":"0.9.3","@elenaizaguirre/cactus-core-api":"0.9.3","@grpc/grpc-js":"1.3.6","@grpc/proto-loader":"0.6.4","@thream/socketio-jwt":"2.1.1","axios":"0.21.1","bluebird":"3.7.2","body-parser":"1.19.0","compression":"1.7.4","convict":"6.0.0","convict-format-with-validator":"6.2.0","cors":"2.8.5","express":"4.17.1","express-http-proxy":"1.6.2","express-jwt":"6.0.0","express-openapi-validator":"4.12.12","fs-extra":"10.0.0","google-protobuf":"3.18.0-rc.2","jose":"1.28.1","lmify":"0.3.0","node-forge":"0.10.0","prom-client":"13.2.0","run-time-error":"1.4.0","rxjs":"7.3.0","semver":"7.3.5","socket.io":"4.1.3","socket.io-client":"4.1.3","typescript-optional":"2.0.1","uuid":"8.3.2"},"devDependencies":{"@elenaizaguirre/cactus-plugin-keychain-vault":"0.9.3","@elenaizaguirre/cactus-test-tooling":"0.9.3","@types/compression":"1.7.1","@types/convict":"6.1.1","@types/cors":"2.8.12","@types/express":"4.17.13","@types/express-http-proxy":"1.6.2","@types/express-jwt":"6.0.2","@types/google-protobuf":"3.15.3","@types/jsonwebtoken":"8.5.4","@types/multer":"1.4.7","@types/node-forge":"0.10.2","@types/passport":"1.0.7","@types/passport-oauth2":"1.4.11","@types/passport-saml":"1.1.3","@types/passport-strategy":"0.2.35","@types/semver":"7.3.8","@types/uuid":"8.3.1","@types/xml2js":"0.4.9","artillery":"1.7.2","http-status-codes":"2.1.4"},"gitHead":"0d5cded5b3d726c93392ed2ce0fe8dfa2dc03c95","_id":"@elenaizaguirre/cactus-cmd-api-server@0.9.3","_nodeVersion":"16.3.0","_npmVersion":"lerna/4.0.0/node@v16.3.0+x64 (linux)","dist":{"integrity":"sha512-3VZ0lpAA0I4xaz2tOQqh3tVB0Z8Ke8qx8CGxKWurKg+7ubAe3y/ADoX2Rh1JyPr0UxRyAtHqE9TDSYrGQkHa7w==","shasum":"58b55b3937e3f19f9a5abdc90ed07172b5ef8285","tarball":"https://registry.npmjs.org/@elenaizaguirre/cactus-cmd-api-server/-/cactus-cmd-api-server-0.9.3.tgz","fileCount":116,"unpackedSize":6126176,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQC5S46YzvNg87kQI2WDDmcN2SAbARfuSVkCX+BXIemSAQIhAIk9fStoU2Zrrt8ZxlGnoSbx+zKqoC1pBHQ3a+xlHXzX"}]},"_npmUser":{"name":"elenaizaguirre","email":"e.izaguirre.equiza@accenture.com"},"directories":{},"maintainers":[{"name":"elenaizaguirre","email":"e.izaguirre.equiza@accenture.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/cactus-cmd-api-server_0.9.3_1632223846495_0.12573790346397695"},"_hasShrinkwrap":false},"0.9.4":{"name":"@elenaizaguirre/cactus-cmd-api-server","version":"0.9.4","description":"API server that combines and exposes all the functionality of a Cactus deployment through a unified REST API interface.","main":"dist/lib/main/typescript/index.js","mainMinified":"dist/cactus-cmd-api-server.node.umd.min.js","browser":"dist/cactus-cmd-api-server.web.umd.js","browserMinified":"dist/cactus-cmd-api-server.web.umd.min.js","module":"dist/lib/main/typescript/index.js","types":"dist/lib/main/typescript/index.d.ts","scripts":{"generate-sdk":"openapi-generator-cli generate -i ./src/main/json/openapi.json -g typescript-axios -o ./src/main/typescript/generated/openapi/typescript-axios/ --reserved-words-mappings protected=protected","codegen:openapi":"npm run generate-sdk","proto:openapi":"openapi-generator-cli generate -i ./src/main/json/openapi.json -g protobuf-schema --model-name-suffix=PB --additional-properties=packageName=org.hyperledger.cactus.cmd_api_server -o ./src/main/proto/generated/openapi/ -t=./src/main/openapi-generator/templates/protobuf-schema/","proto:protoc-gen-ts":"yarn run grpc_tools_node_protoc --plugin=protoc-gen-ts=../../node_modules/.bin/protoc-gen-ts --ts_out=grpc_js:./src/main/typescript/generated/proto/protoc-gen-ts/ --proto_path ./src/main/proto/generated/openapi/ ./src/main/proto/generated/openapi/services/*.proto","codegen:proto":"run-s proto:openapi proto:protoc-gen-ts","codegen":"run-p 'codegen:*'","watch":"npm-watch","webpack":"npm-run-all webpack:dev webpack:prod","webpack:dev":"npm-run-all webpack:dev:node webpack:dev:web","webpack:dev:web":"webpack --env=dev --target=web --config ../../webpack.config.js","webpack:dev:node":"webpack --env=dev --target=node --config ../../webpack.config.js","webpack:prod":"npm-run-all webpack:prod:node webpack:prod:web","webpack:prod:web":"webpack --env=prod --target=web --config ../../webpack.config.js","webpack:prod:node":"echo 'SKIPPING script webpack:prod:node for @elenaizaguirre/cactus-cmd-api-server' the dev bundle will be used as fallback until npm can be processed by the Webpack Terser."},"watch":{"codegen:openapi":{"patterns":["./src/main/json/openapi.json"]}},"publishConfig":{"access":"public"},"engines":{"node":">=10","npm":">=6"},"repository":{"type":"git","url":"git+https://github.com/elenaizaguirre/cactus.git"},"keywords":["Hyperledger","Cactus","Integration","Blockchain","Distributed Ledger Technology"],"author":{"name":"Hyperledger Cactus Contributors","email":"cactus@lists.hyperledger.org","url":"https://www.hyperledger.org/use/cactus"},"contributors":[{"name":"Please add yourself to the list of contributors","email":"your.name@example.com","url":"https://example.com"},{"name":"Peter Somogyvari","email":"peter.somogyvari@accenture.com","url":"https://accenture.com"}],"license":"Apache-2.0","bugs":{"url":"https://github.com/hyperledger/cactus/issues"},"homepage":"https://github.com/hyperledger/cactus#readme","dependencies":{"@elenaizaguirre/cactus-common":"0.9.4","@elenaizaguirre/cactus-core":"0.9.4","@elenaizaguirre/cactus-core-api":"0.9.4","@grpc/grpc-js":"1.3.6","@grpc/proto-loader":"0.6.4","@thream/socketio-jwt":"2.1.1","axios":"0.21.4","bluebird":"3.7.2","body-parser":"1.19.0","compression":"1.7.4","convict":"6.0.0","convict-format-with-validator":"6.2.0","cors":"2.8.5","express":"4.17.1","express-http-proxy":"1.6.2","express-jwt":"6.0.0","express-openapi-validator":"4.12.12","fs-extra":"10.0.0","google-protobuf":"3.18.0-rc.2","jose":"1.28.1","lmify":"0.3.0","node-forge":"0.10.0","prom-client":"13.2.0","run-time-error":"1.4.0","rxjs":"7.3.0","semver":"7.3.5","socket.io":"4.1.3","socket.io-client":"4.1.3","typescript-optional":"2.0.1","uuid":"8.3.2"},"devDependencies":{"@elenaizaguirre/cactus-plugin-keychain-vault":"0.9.4","@elenaizaguirre/cactus-test-tooling":"0.9.4","@types/compression":"1.7.1","@types/convict":"6.1.1","@types/cors":"2.8.12","@types/express":"4.17.13","@types/express-http-proxy":"1.6.2","@types/express-jwt":"6.0.2","@types/google-protobuf":"3.15.3","@types/jsonwebtoken":"8.5.4","@types/multer":"1.4.7","@types/node-forge":"0.10.2","@types/passport":"1.0.7","@types/passport-oauth2":"1.4.11","@types/passport-saml":"1.1.3","@types/passport-strategy":"0.2.35","@types/semver":"7.3.8","@types/uuid":"8.3.1","@types/xml2js":"0.4.9","artillery":"1.7.2","http-status-codes":"2.1.4"},"gitHead":"50ad5e82a81dfca2040770c696d353055f27a24a","_id":"@elenaizaguirre/cactus-cmd-api-server@0.9.4","_nodeVersion":"16.3.0","_npmVersion":"lerna/4.0.0/node@v16.3.0+x64 (linux)","dist":{"integrity":"sha512-ZfAhyahtXkqHJye9wrrY+CllsUJv8t3BzGriK1y6tVEMaJ+JhSNy6eAYVVWd0v1yUB1k9+nGAkJdVIc2fc2axg==","shasum":"8d14e8c5b2a5690f4a7cfeeee3a55ce56ed11d1e","tarball":"https://registry.npmjs.org/@elenaizaguirre/cactus-cmd-api-server/-/cactus-cmd-api-server-0.9.4.tgz","fileCount":116,"unpackedSize":6812053,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJh2FkOCRA9TVsSAnZWagAA5REP/1Z8k0qu18LHmpFi8ENp\nxywl0MYALU9IQNQPBUmGvJe6dNOVAlx8MrohEn57iPxDsSvPm/4KiC0Izjh1\nVS2qB8diUUm1EHLuZvEm8Ru/1n0ML7CM60nteQt4RM6qwF4Lh3BQ9bowQtFy\nNZ+WbaWs0kDl3kvqVxhOZfTRwLQ8KiCH0fVQAeRkz8V0982DMokVsSFJ2qxo\nlz+4VMpUH3WXs8znEmqa6ZFKKRrJYUa3V5afOqGfuZbIs/FmAxHBzelbFnvE\nvUQbXAjolrv5nQCyZ3LG01MVLn97jriQif2UiFLhGvl3EIxR5g/UuK1Y7Cjr\nptn+nDPoRFfzk+up2mKy5omeb5kKOVpyWFMV1oCJHXliQXJMamYyEtK6gGre\nxOlPBTS704MNsUIyZo7Z7Y0gv7TZmoUz0n9uWejtv07rKvSLUwXo62mxieg9\n1WN5VcIdULrfNRNYyAl4oowgC8/kylAWr27MqG8xzXjDqxO4jxVaepW4+txs\nwz4lFHAc119frWvoLF1NTtgeIvKGSwcC/Sf7eWV7oOOpc6H9f1uJohedSHCW\ncZsS9dFqyzdTGU4ru/J+LVYoZEVTbpw+fdqDHm40tA0gfpQIpZY3ePmAsgTg\n8qGQulu5UsxtgaMly8ftD98fLB81TdLBnp1rUSYIE7JDiJFd6RBjZOfldykk\nBzgG\r\n=8t01\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEYCIQDiWVB6VUh0l0Sp3t3DbpWB5twmMCONIg1jXqLNnNXxpwIhAJbubvMhtks8s/ki6Vb9veDnFCIGd3W89GTw7T/L8hyO"}]},"_npmUser":{"name":"elenaizaguirre","email":"e.izaguirre.equiza@accenture.com"},"directories":{},"maintainers":[{"name":"elenaizaguirre","email":"e.izaguirre.equiza@accenture.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/cactus-cmd-api-server_0.9.4_1632388159992_0.5138477169383242"},"_hasShrinkwrap":false}},"maintainers":[{"name":"elenaizaguirre","email":"e.izaguirre.equiza@accenture.com"}],"description":"API server that combines and exposes all the functionality of a Cactus deployment through a unified REST API interface.","homepage":"https://github.com/hyperledger/cactus#readme","keywords":["Hyperledger","Cactus","Integration","Blockchain","Distributed Ledger Technology"],"repository":{"type":"git","url":"git+https://github.com/elenaizaguirre/cactus.git"},"contributors":[{"name":"Please add yourself to the list of contributors","email":"your.name@example.com","url":"https://example.com"},{"name":"Peter Somogyvari","email":"peter.somogyvari@accenture.com","url":"https://accenture.com"}],"author":{"name":"Hyperledger Cactus Contributors","email":"cactus@lists.hyperledger.org","url":"https://www.hyperledger.org/use/cactus"},"bugs":{"url":"https://github.com/hyperledger/cactus/issues"},"license":"Apache-2.0","readme":"# `@elenaizaguirre/cactus-cmd-api-server` <!-- omit in toc -->\n\n- [Summary](#summary)\n- [Usage](#usage)\n  - [Basic Example](#basic-example)\n  - [Remote Plugin Imports at Runtime Example](#remote-plugin-imports-at-runtime-example)\n  - [Complete Example](#complete-example)\n- [Deployment Scenarios](#deployment-scenarios)\n  - [Production Deployment Example](#production-deployment-example)\n  - [Low Resource Deployment Example](#low-resource-deployment-example)\n- [Containerization](#containerization)\n  - [Building the container image locally](#building-the-container-image-locally)\n  - [Running the container image locally](#running-the-container-image-locally)\n  - [Testing API calls with the container](#testing-api-calls-with-the-container)\n- [Prometheus Exporter](#prometheus-exporter)\n  - [Usage Prometheus](#usage-prometheus)\n  - [Prometheus Integration](#prometheus-integration)\n  - [Helper code](#helper-code)\n        - [response.type.ts](#responsetypets)\n        - [data-fetcher.ts](#data-fetcherts)\n        - [metrics.ts](#metricsts)\n- [FAQ](#faq)\n  - [What is the difference between a Cactus Node and a Cactus API Server?](#what-is-the-difference-between-a-cactus-node-and-a-cactus-api-server)\n  - [Is the API server horizontally scalable?](#is-the-api-server-horizontally-scalable)\n  - [Does the API server automatically protect me from malicious plugins?](#does-the-api-server-automatically-protect-me-from-malicious-plugins)\n  - [Can I use the API server with plugins deployed as a service?](#can-i-use-the-api-server-with-plugins-deployed-as-a-service)\n\n## Summary\n\nThis package is part of the Hyperledger Cactus blockchain integration framework\nand is used as a shell/container of sort for housing different Cactus plugins\n(which all live in their own npm packages as well).\n\nThe API server gives you for free the following benefits, should you choose to\nuse it:\n1. Automatic wiring of API endpoints for Cactus plugins which implement the `IPluginWebService` Typescript interface\n2. Lightweight inversion of control container provided to plugins in the form of the `PluginRegistry` so that plugins can depend on each other in a way that each plugin instance can be uniquely identified and obtained by other plugins. A great example of this in action is ledger connector plugins frequently using the `PluginRegistry` to look up instances of keychain plugins to get access to secrets that are needed for the connector plugins to accomplish certain tasks such as cryptographically signing some information or SSH-ing into a server instance in order to upload and deploy binary (or otherwise) artifacts of smart contracts.\n\n## Usage\n\nLike with most parts of the framework in Cactus, using the `ApiServer` is optional.\n\nTo see the `ApiServer` in action, the end to end tests of the framework are a great\nplace to start.\nA few excerpts that regularly occur in said tests can be seen below as well for\nthe reader's convenience.\n\nOne of our design principles for the framework is **secure by default** which\nmeans that the API servers\n1. assumes TLS is enabled by default and\n2. cross-origin resource sharing is disabled completely\n\n### Basic Example\n\n```typescript\n#!/usr/bin/env node\n\nimport { ApiServer } from \"../api-server\";\nimport { ConfigService } from \"../config/config-service\";\nimport { Logger, LoggerProvider } from \"@elenaizaguirre/cactus-common\";\n\nconst log: Logger = LoggerProvider.getOrCreate({\n  label: \"cactus-api\",\n  level: \"INFO\",\n});\n\nconst main = async () => {\n  const configService = new ConfigService();\n  const config = configService.getOrCreate();\n  const serverOptions = config.getProperties();\n\n  LoggerProvider.setLogLevel(serverOptions.logLevel);\n\n  if (process.argv[2].includes(\"help\")) {\n    const helpText = ConfigService.getHelpText();\n    console.log(helpText);\n    log.info(`Effective Configuration:`);\n    log.info(JSON.stringify(serverOptions, null, 4));\n  } else {\n    const apiServer = new ApiServer({ config: serverOptions });\n    await apiServer.start();\n  }\n};\n\nexport async function launchApp(): Promise<void> {\n  try {\n    await main();\n    log.info(`Cactus API server launched OK `);\n  } catch (ex) {\n    log.error(`Cactus API server crashed: `, ex);\n    process.exit(1);\n  }\n}\n\nif (require.main === module) {\n  launchApp();\n}\n\n```\n\n### Remote Plugin Imports at Runtime Example\n\n```typescript\nimport { PluginImportType } from \"@elenaizaguirre/cactus-core-api\";\nimport { ApiServer } from \"@elenaizaguirre/cactus-cmd-api-server\";\nimport { ConfigService } from \"@elenaizaguirre/cactus-cmd-api-server\";\nimport { Logger, LoggerProvider } from \"@elenaizaguirre/cactus-common\";\n\nconst main = async () => {\n\n  const configService = new ConfigService();\n  const apiServerOptions = configService.newExampleConfig();\n  // If there is no configuration file on the file system, just set it to empty string\n  apiServerOptions.configFile = \"\";\n  // Enable CORS for\n  apiServerOptions.apiCorsDomainCsv = \"your.domain.example.com\";\n  apiServerOptions.apiPort = 3000;\n  apiServerOptions.cockpitPort = 3100;\n  apiServerOptions.grpcPort = 5000;\n  // Disble TLS (or provide TLS certs for secure HTTP if you are deploying to production)\n  apiServerOptions.apiTlsEnabled = false;\n  apiServerOptions.plugins = [\n    {\n      // npm package name of the plugin you are installing\n      // Since this will be imported at runtime, you are responsible for\n      // installing the package yourself prior to launching the API server.\n      packageName: \"@elenaizaguirre/cactus-plugin-keychain-vault\",\n      // The REMOTE value means that a different plugin factory will be imported and\n      // called to obtain the plugin instance. This way plugins can support them\n      // being imported by the API server regardless of the language the plugin\n      // was written in.\n      type: PluginImportType.REMOTE,\n      // The options that will be passed in to the plugin factory\n      options: {\n        keychainId: \"_keychainId_\",\n        instanceId: \"_instanceId_\",\n        remoteConfig: configuration,\n      },\n    },\n  ];\n  const config = configService.newExampleConfigConvict(apiServerOptions);\n\n  const apiServer = new ApiServer({\n    config: config.getProperties(),\n  });\n\n  // start the API server here and you are ready to roll\n};\n\nexport async function launchApp(): Promise<void> {\n  try {\n    await main();\n    log.info(`Cactus API server launched OK `);\n  } catch (ex) {\n    log.error(`Cactus API server crashed: `, ex);\n    process.exit(1);\n  }\n}\n\nif (require.main === module) {\n  launchApp();\n}\n\n```\n\n### Complete Example\n\nFor a complete example of how to use the API server, read all the code of the\nsupply chain example's backend package:\n\nhttps://github.com/hyperledger/cactus/tree/main/examples/cactus-example-supply-chain-backend/src/main/typescript\n\n## Deployment Scenarios\n\nThere's a set of building blocks (members, nodes, API server processes, plugin instances) that you can use when defining (founding) a consortium and these building blocks relate to each other in a way that can be expressed with an entity relationship diagram which can be seen below.\nThe composability rules can be deducted from how the diagram elements (entities) are connected (related) to each other, e.g. the API server process can have any number of plugin instances in it and a node can contain any number of API server processes, and so on until the top level construct is reached: the consortium.\n\n> Consortium management does not relate to achieving consensus on data/transactions involving individual ledgers, merely about consensus on the metadata of a consortium.\n\n![deployment-entity-relationship-diagram.png](https://github.com/hyperledger/cactus/raw/4a337be719a9d2e2ccb877edccd7849f4be477ec/whitepaper/deployment-entity-relationship-diagram.png)\n\nNow, with these composability rules in mind, let us demonstrate a few different deployment scenarios (both expected and exotic ones) to showcase the framework's flexibility in this regard.\n\n### Production Deployment Example\n\nMany different configurations are possible here as well.\nOne way to have two members form a consortium and both of those members provide highly available, high throughput services is to have a deployment as shown on the below figure.\nWhat is important to note here is that this consortium has 2 nodes, 1 for each member\nand it is irrelevant how many API servers those nodes have internally because they\nall respond to requests through the network host/web domain that is tied to the\nnode.\nOne could say that API servers do not have a distinguishable identity relative to\ntheir peer API servers, only the higher-level nodes do.\n\n![deployment-production-example.png](https://github.com/hyperledger/cactus/raw/4a337be719a9d2e2ccb877edccd7849f4be477ec/whitepaper/deployment-production-example.png)\n\n### Low Resource Deployment Example\n\nThis is an example to showcase how you can pull up a full consortium even from\nwithin a single operating system process (API server) with multiple members and\ntheir respective nodes. It is not something that's recommended for a production\ngrade environment, ever, but it is great for demos and integration tests where\nyou have to simulate a fully functioning consortium with as little hardware footprint\nas possible to save on time and cost.\n\nThe individual nodes/API servers are isolated by listening on seperate TCP ports\nof the machine they are hosted on:\n\n![deployment-low-resource-example.png](https://github.com/hyperledger/cactus/raw/4a337be719a9d2e2ccb877edccd7849f4be477ec/whitepaper/deployment-low-resource-example.png)\n\n## Containerization\n\n### Building the container image locally\n\nIn the Cactus project root say:\n\n```sh\nDOCKER_BUILDKIT=1 docker build -f ./packages/cactus-cmd-api-server/Dockerfile . -t cas -t cactus-api-server\n```\n\nBuild with a specific version of the npm package:\n```sh\nDOCKER_BUILDKIT=1 docker build --build-arg NPM_PKG_VERSION=main -f ./packages/cactus-cmd-api-server/Dockerfile . -t cas -t cactus-api-server\n```\n\n### Running the container image locally\n\nBefore running the examples here you need to build the image locally.\nSee section [Building the container image locally](#building-the-container-image-locally) for details on how to do that.\n\nOnce you've built the container, the following commands should work:\n\n- Launch container - no plugins, default configuration\n\n  ```sh\n  docker run \\\n    --rm \\\n    --publish 3000:3000 \\\n    --publish 4000:4000 \\\n    cas\n  ```\n\n- Launch container with plugins of your choice (keychain, consortium connector, etc.)\n\n  ```sh\n    docker run \\\n    --rm \\\n    --publish 3000:3000 \\\n    --publish 4000:4000 \\\n    --env=AUTHORIZATION_CONFIG_JSON=\"{}\" \\\n    --env=AUTHORIZATION_PROTOCOL=NONE \\\n    --env=GRPC_TLS_ENABLED=false \\\n    cas \\\n      node_modules/@elenaizaguirre/cactus-cmd-api-server/dist/lib/main/typescript/cmd/cactus-api.js \\\n      --plugins='[{\"packageName\": \"@elenaizaguirre/cactus-plugin-ledger-connector-fabric\", \"type\": \"org.hyperledger.cactus.plugin_import_type.LOCAL\",  \"options\": { \"connectionProfile\": {}, \"peerBinary\": \"peer\", \"instanceId\": \"some-unique-instance-id\"}}]'\n  ```\n\n- Launch container with plugin configuration as an **environment variable**:\n  ```sh\n  docker run \\\n    --rm \\\n    --publish 3000:3000 \\\n    --publish 4000:4000 \\\n    --env PLUGINS='[{\"packageName\": \"@elenaizaguirre/cactus-plugin-ledger-connector-besu\", \"type\": \"org.hyperledger.cactus.plugin_import_type.LOCAL\",  \"options\": {\"rpcApiHttpHost\": \"http://localhost:8545\", \"instanceId\": \"some-unique-besu-connector-instance-id\"}}]' \\\n    cas\n  ```\n\n- Launch container with plugin configuration as a **CLI argument**:\n  ```sh\n  docker run \\\n    --rm \\\n    --publish 3000:3000 \\\n    --publish 4000:4000 \\\n    cas \\\n      ./node_modules/.bin/cactusapi \\\n      --plugins='[{\"packageName\": \"@elenaizaguirre/cactus-plugin-ledger-connector-besu\", \"type\": \"org.hyperledger.cactus.plugin_import_type.LOCAL\",  \"options\": {\"rpcApiHttpHost\": \"http://localhost:8545\", \"instanceId\": \"some-unique-besu-connector-instance-id\"}}]'\n  ```\n\n- Launch container with **configuration file** mounted from host machine:\n  ```sh\n\n  echo '[{\"packageName\": \"@elenaizaguirre/cactus-plugin-ledger-connector-besu\", \"type\": \"org.hyperledger.cactus.plugin_import_type.LOCAL\",  \"options\": {\"rpcApiHttpHost\": \"http://localhost:8545\", \"instanceId\": \"some-unique-besu-connector-instance-id\"}}]' > cactus.json\n\n  docker run \\\n    --rm \\\n    --publish 3000:3000 \\\n    --publish 4000:4000 \\\n    --mount type=bind,source=\"$(pwd)\"/cactus.json,target=/cactus.json \\\n    cas \\\n      ./node_modules/.bin/cactusapi \\\n      --config-file=/cactus.json\n  ```\n\n### Testing API calls with the container\n\nDon't have a Besu network on hand to test with? Test or develop against our Besu All-In-One container!\n\n1. Terminal Window 1 (Ledger)\n    ```sh\n    docker run --publish 8545:8545 hyperledger/cactus-besu-all-in-one:latest\n    ```\n\n2. Terminal Window 2 (Cactus API Server)\n    ```sh\n    docker run \\\n      --network host \\\n      --rm \\\n      --publish 3000:3000 \\\n      --publish 4000:4000 \\\n      --env PLUGINS='[{\"packageName\": \"@elenaizaguirre/cactus-plugin-ledger-connector-besu\", \"type\": \"org.hyperledger.cactus.plugin_import_type.LOCAL\",  \"options\": {\"rpcApiHttpHost\": \"http://localhost:8545\", \"instanceId\": \"some-unique-besu-connector-instance-id\"}}]' \\\n      cas\n    ```\n\n3. Terminal Window 3 (curl - replace eth accounts as needed)\n    ```sh\n    curl --location --request POST 'http://127.0.0.1:4000/api/v1/plugins/@elenaizaguirre/cactus-plugin-ledger-connector-besu/run-transaction' \\\n    --header 'Content-Type: application/json' \\\n    --data-raw '{\n        \"web3SigningCredential\": {\n          \"ethAccount\": \"627306090abaB3A6e1400e9345bC60c78a8BEf57\",\n          \"secret\": \"c87509a1c067bbde78beb793e6fa76530b6382a4c0241e5e4a9ec0a0f44dc0d3\",\n          \"type\": \"PRIVATE_KEY_HEX\"\n        },\n        \"consistencyStrategy\": {\n          \"blockConfirmations\": 0,\n          \"receiptType\": \"NODE_TX_POOL_ACK\"\n        },\n        \"transactionConfig\": {\n          \"from\": \"627306090abaB3A6e1400e9345bC60c78a8BEf57\",\n          \"to\": \"f17f52151EbEF6C7334FAD080c5704D77216b732\",\n          \"value\": 1,\n          \"gas\": 10000000\n        }\n    }'\n    ```\n\n4. The above should produce a response that looks similar to this:\n\n    ```json\n    {\n        \"success\": true,\n        \"data\": {\n            \"transactionReceipt\": {\n                \"blockHash\": \"0x7c97c038a5d3bd84613fe23ed442695276d5d2df97f4e7c4f10ca06765033ffd\",\n                \"blockNumber\": 1218,\n                \"contractAddress\": null,\n                \"cumulativeGasUsed\": 21000,\n                \"from\": \"0x627306090abab3a6e1400e9345bc60c78a8bef57\",\n                \"gasUsed\": 21000,\n                \"logs\": [],\n                \"logsBloom\": \"0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\",\n                \"status\": true,\n                \"to\": \"0xf17f52151ebef6c7334fad080c5704d77216b732\",\n                \"transactionHash\": \"0xc7fcb46c735bdc696d500bfc70c72595a2b8c31813929e5c61d9a5aec3376d6f\",\n                \"transactionIndex\": 0\n            }\n        }\n    }\n    ```\n\n\n\n## Prometheus Exporter\nThis class creates a prometheus exporter, which scrapes the total Cactus node count.\n\n### Usage Prometheus\nThe prometheus exporter object is initialized in the `ApiServer` class constructor itself, so instantiating the object of the `ApiServer` class, gives access to the exporter object.\nYou can also initialize the prometheus exporter object seperately and then pass it to the `IApiServerConstructorOptions` interface for `ApiServer` constructor.\n\n`getPrometheusMetricsV1` function returns the prometheus exporter metrics, currently displaying the total plugins imported, which currently refreshes to match the plugin count, everytime `setTotalPluginImports` method is called.\n\n### Prometheus Integration\nTo use Prometheus with this exporter make sure to install [Prometheus main component](https://prometheus.io/download/).\nOnce Prometheus is setup, the corresponding scrape_config needs to be added to the prometheus.yml\n\n```(yaml)\n- job_name: 'consortium_manual_exporter'\n  metrics_path: /api/v1/api-server/get-prometheus-exporter-metrics\n  scrape_interval: 5s\n  static_configs:\n    - targets: ['{host}:{port}']\n```\n\nHere the `host:port` is where the prometheus exporter metrics are exposed. The test cases (For example, packages/cactus-plugin-consortium-manual/src/test/typescript/unit/consortium/get-node-jws-endpoint-v1.test.ts) exposes it over `0.0.0.0` and a random port(). The random port can be found in the running logs of the test case and looks like (42379 in the below mentioned URL)\n`Metrics URL: http://0.0.0.0:42379/api/v1/api-server/get-prometheus-exporter-metrics/get-prometheus-exporter-metrics`\n\nOnce edited, you can start the prometheus service by referencing the above edited prometheus.yml file.\nOn the prometheus graphical interface (defaulted to http://localhost:9090), choose **Graph** from the menu bar, then select the **Console** tab. From the **Insert metric at cursor** drop down, select **cactus_api_server_total_plugin_imports** and click **execute**\n\n### Helper code\n\n###### response.type.ts\nThis file contains the various responses of the metrics.\n\n###### data-fetcher.ts\nThis file contains functions encasing the logic to process the data points.\n\n###### metrics.ts\nThis file lists all the prometheus metrics and what they are used for.\n\n\n\n\n\n## FAQ\n\n### What is the difference between a Cactus Node and a Cactus API Server?\n\nThe node is what has an identity within your PKI and can be made up of 1-N API\nserver instances that all share the same configuration/identity of the node.\nSee deployment scenarios above for a much more detailed explanation.\n\n### Is the API server horizontally scalable?\n\n**Yes, 100%.**\nKeep in mind though that the API server can be loaded up with arbitrary plugins\nmeaning that if you write a plugin that has a central database that can only\ndo 1 transaction per second, then it will not help you much that the API server\nitself is horizontally scalable because deploying a thousand instances of the\nAPI server will just result in you having a thousand instances of your plugin\nall waiting for that underlying database with its 1 TPS throughput hogging your\nsystem.\nWhen we say that the API server is horizontally scalable, we mean that the API\nserver itself is designed not to have any such state mentioned in the example\nabove.\nYou are responsible for only deploying plugins in the API server that are\nhorizontally scalable as well. In short, your whole system is only horizontally\nscalable if all components of it are horizontally scalable.\n\n### Does the API server automatically protect me from malicious plugins?\n\n**No.** If you install a third-party plugin that wasn't vetted by anyone and that\nplugin happens to have malicious code in it to steal your private keys, it can\ndo so.\nYou are responsible for making sure that the plugins you install have no known\nsecurity vulnerabilities or backdoors e.g. they are considered \"secure\".\nThe double quotes around \"secure\" is meant to signify the fact that no software\nis ever really truly secure, just merely lacking of known vulnerabilities at\nany given point in time.\n\n### Can I use the API server with plugins deployed as a service?\n\n**Yes.** You can deploy your plugin written in any language, anywhere as long\nas it is accessible over the network and does come with a Typescript API client\nthat you can use to install into the API server as a proxy for an in-process\nplugin implementation.\n","readmeFilename":"README.md"}