From 3e836c1dd3f40c32b4cb814901a9c2a1734dc927 Mon Sep 17 00:00:00 2001 From: Hornwitser Date: Wed, 8 Jun 2022 23:26:33 +0200 Subject: [PATCH] Fix web interface breaking when disabling plugins Fix incorrect logic to set up plugins in the web interface causing an emptry plugin to be atempted to be loaded when a plugin was disabled. --- packages/web_ui/src/bootstrap.jsx | 41 ++++++++++++++++++++++--------- 1 file changed, 29 insertions(+), 12 deletions(-) diff --git a/packages/web_ui/src/bootstrap.jsx b/packages/web_ui/src/bootstrap.jsx index e64be130..e6f3bbb0 100644 --- a/packages/web_ui/src/bootstrap.jsx +++ b/packages/web_ui/src/bootstrap.jsx @@ -25,7 +25,7 @@ async function loadScript(url) { return result; } -async function loadPlugins() { +async function loadPluginInfos() { let response = await fetch(`${webRoot}api/plugins`); let pluginList; if (response.ok) { @@ -36,7 +36,7 @@ async function loadPlugins() { pluginList = []; } - let plugins = new Map(); + let pluginInfos = []; await __webpack_init_sharing__("default"); for (let meta of pluginList) { if (meta.web.error) { @@ -51,26 +51,43 @@ async function loadPlugins() { } await container.init(__webpack_share_scopes__.default); let pluginInfo = (await container.get("./info"))(); - let pluginPackage = (await container.get("./package.json"))(); + pluginInfo.container = container; + pluginInfo.package = (await container.get("./package.json"))(); + pluginInfo.enabled = meta.enabled; + pluginInfos.push(pluginInfo); + } catch (err) { + logger.error(`Failed to load plugin info for ${meta.name}`); + if (err.stack) { + logger.error(err.stack); + } + } + } + return pluginInfos; +} + +async function loadPlugins(pluginInfos) { + let plugins = new Map(); + for (let pluginInfo of pluginInfos) { + if (!pluginInfo.enabled) { + continue; + } + try { let WebPluginClass = libPlugin.BaseWebPlugin; - if (meta.enabled && pluginInfo.webEntrypoint) { - let webModule = (await container.get(pluginInfo.webEntrypoint))(); + if (pluginInfo.webEntrypoint) { + let webModule = (await pluginInfo.container.get(pluginInfo.webEntrypoint))(); if (!webModule.WebPlugin) { throw new Error("Plugin webEntrypoint does not export WebPlugin class"); } WebPluginClass = webModule.WebPlugin; } - let plugin = new WebPluginClass(container, pluginPackage, pluginInfo, logger); + let plugin = new WebPluginClass(pluginInfo.container, pluginInfo.package, pluginInfo, logger); await plugin.init(); plugins.set(pluginInfo.name, plugin); } catch (err) { - if (err.message) { - meta.web.error = err.message; - } - logger.error(`Failed to load plugin ${meta.name}`); + logger.error(`Failed to load plugin ${pluginInfo.name}`); if (err.stack) { logger.error(err.stack); } @@ -84,10 +101,10 @@ export default async function bootstrap() { level: "verbose", format: new WebConsoleFormat(), })); - let plugins = await loadPlugins(); - let pluginInfos = [...plugins.values()].map(p => p.info); + let pluginInfos = await loadPluginInfos(); libConfig.registerPluginConfigGroups(pluginInfos); libConfig.finalizeConfigs(); + let plugins = await loadPlugins(pluginInfos); let wsUrl = new URL(window.webRoot, document.location); wsUrl.protocol = wsUrl.protocol.replace("http", "ws");