From b9827772fa6694381716686759f85f96b915662e Mon Sep 17 00:00:00 2001 From: Elena Izaguirre Date: Mon, 4 Oct 2021 13:19:46 +0200 Subject: [PATCH] fix(cmd-api-server): enable version selection in plugins cactus-cmd-api-server can now import plugins specifying the npm package version as a plugin option cmd-api-server: add missing dependency bluebird closes #839 and #840 Signed-off-by: Elena Izaguirre --- packages/cactus-cmd-api-server/package.json | 1 + .../src/main/typescript/api-server.ts | 6 +- ...with-npm-install-version-selection.test.ts | 74 +++++++++++++++++++ yarn.lock | 2 +- 4 files changed, 81 insertions(+), 2 deletions(-) create mode 100644 packages/cactus-test-cmd-api-server/src/test/typescript/integration/plugin-import-with-npm-install-version-selection.test.ts diff --git a/packages/cactus-cmd-api-server/package.json b/packages/cactus-cmd-api-server/package.json index 1f6a5d09e1..2214ca6a32 100644 --- a/packages/cactus-cmd-api-server/package.json +++ b/packages/cactus-cmd-api-server/package.json @@ -79,6 +79,7 @@ "@hyperledger/cactus-core-api": "0.10.0", "@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", diff --git a/packages/cactus-cmd-api-server/src/main/typescript/api-server.ts b/packages/cactus-cmd-api-server/src/main/typescript/api-server.ts index 0757ada57b..c8b1425ab1 100644 --- a/packages/cactus-cmd-api-server/src/main/typescript/api-server.ts +++ b/packages/cactus-cmd-api-server/src/main/typescript/api-server.ts @@ -326,6 +326,10 @@ export class ApiServer { const instanceId = pluginImport.options.instanceId; const pluginPackageDir = path.join(this.pluginsPath, instanceId); + // version of the npm package + const pluginVersion = pluginImport.options.version + ? "@".concat(pluginImport.options.version) + : ""; try { await fs.mkdirp(pluginPackageDir); this.log.debug(`${pkgName} plugin package dir: %o`, pluginPackageDir); @@ -341,7 +345,7 @@ export class ApiServer { lmify.setRootDir(pluginPackageDir); this.log.debug(`Installing ${pkgName} for plugin import`, pluginImport); const out = await lmify.install([ - pkgName, + pkgName.concat(pluginVersion), // empty if no version was specified "--production", "--audit=false", "--progress=false", diff --git a/packages/cactus-test-cmd-api-server/src/test/typescript/integration/plugin-import-with-npm-install-version-selection.test.ts b/packages/cactus-test-cmd-api-server/src/test/typescript/integration/plugin-import-with-npm-install-version-selection.test.ts new file mode 100644 index 0000000000..05fd4b9a8f --- /dev/null +++ b/packages/cactus-test-cmd-api-server/src/test/typescript/integration/plugin-import-with-npm-install-version-selection.test.ts @@ -0,0 +1,74 @@ +import path from "path"; +import test, { Test } from "tape-promise/tape"; +import { v4 as uuidv4 } from "uuid"; +import { LogLevelDesc } from "@hyperledger/cactus-common"; +import { PluginImportType } from "@hyperledger/cactus-core-api"; +import { + ApiServer, + AuthorizationProtocol, + ConfigService, +} from "@hyperledger/cactus-cmd-api-server"; + +const logLevel: LogLevelDesc = "TRACE"; + +test("can install plugins at runtime with specified version based on imports", async (t: Test) => { + const pluginsPath = path.join( + __dirname, + "../../../../../../", // walk back up to the project root + ".tmp/test/test-cmd-api-server/plugin-import-with-npm-install_test/", // the dir path from the root + uuidv4(), // then a random directory to ensure proper isolation + ); + const pluginManagerOptionsJson = JSON.stringify({ pluginsPath }); + + const configService = new ConfigService(); + + const apiServerOptions = configService.newExampleConfig(); + apiServerOptions.pluginManagerOptionsJson = pluginManagerOptionsJson; + apiServerOptions.authorizationProtocol = AuthorizationProtocol.NONE; + apiServerOptions.configFile = ""; + apiServerOptions.apiCorsDomainCsv = "*"; + apiServerOptions.apiPort = 0; + apiServerOptions.cockpitPort = 0; + apiServerOptions.grpcPort = 0; + apiServerOptions.apiTlsEnabled = false; + apiServerOptions.plugins = [ + { + packageName: "@hyperledger/cactus-plugin-keychain-memory", + type: PluginImportType.Local, + options: { + instanceId: uuidv4(), + keychainId: uuidv4(), + logLevel, + version: "0.9.0", + }, + }, + ]; + const config = configService.newExampleConfigConvict(apiServerOptions); + + const apiServer = new ApiServer({ + config: config.getProperties(), + }); + + const startResponse = apiServer.start(); + await t.doesNotReject( + startResponse, + "failed to start API server with dynamic plugin imports configured for it...", + ); + t.ok(startResponse, "startResponse truthy OK"); + + const packageFilePath = path.join( + pluginsPath, + apiServerOptions.plugins[0].options.instanceId, + "node_modules", + `${apiServerOptions.plugins[0].packageName}`, + "package.json", + ); + const { version } = await import(packageFilePath); + t.strictEquals( + version, + apiServerOptions.plugins[0].options.version, + `Package version strictly equal to ${version}`, + ); + + test.onFinish(() => apiServer.shutdown()); +}); diff --git a/yarn.lock b/yarn.lock index 02715f592c..76ad23a261 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6278,7 +6278,7 @@ blocking-proxy@^1.0.0: dependencies: minimist "^1.2.0" -bluebird@^3.5.0: +bluebird@3.7.2, bluebird@^3.5.0: version "3.7.2" resolved "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz#9f229c15be272454ffa973ace0dbee79a1b0c36f" integrity sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==