- The plugins the controller is running have changed since this page was opened. Plugin code,
- messages and config fields are loaded once when the page starts and cannot be swapped out
- while it runs, so this page has been stopped to keep it from acting on plugins that are no
- longer there.
+ The plugins the controller is running have changed since this page was opened.
+ So the page has been closed and must be reloaded to continue functioning as expected.
@@ -91,9 +89,8 @@ export default function App(props: AppProps) {
};
}, [token, props.control]);
- // The controller reports the plugins it is running in the handshake it
- // sends on every connection, so restarting it to install, enable or
- // disable a plugin, or into recovery mode, is caught on reconnect.
+ // The controller reports the plugins it is running in the handshake
+ // This is used to detect when plugins change and a restart is required
useEffect(() => {
function onHello(data: any) {
if (pluginSetKey(data.plugins) !== props.control.pluginSetKey) {
diff --git a/packages/web_ui/src/components/PluginsPage.tsx b/packages/web_ui/src/components/PluginsPage.tsx
index ddf80c29..16a0dc7d 100644
--- a/packages/web_ui/src/components/PluginsPage.tsx
+++ b/packages/web_ui/src/components/PluginsPage.tsx
@@ -88,11 +88,6 @@ export default function PluginsPage() {
if (!plugin.meta.enabled) {
return <> Disabled on controller>;
}
- // Plugins are loaded once when the page starts, so one the
- // controller has picked up since then was never attempted
- // rather than attempted and failed. A plugin the controller
- // cannot serve at all is excluded before it gets that far,
- // and is a real error.
if (!plugin.meta.web.error && !control.pluginInfos.has(plugin.meta.name)) {
return <> Reload page to load>;
}
@@ -100,7 +95,7 @@ export default function PluginsPage() {
return <> Error loading module>;
}
if (plugin.package.version !== plugin.meta.version) {
- return "Version missmatched";
+ return <> Version mis-matched>;
}
return plugin.package.version;
},
diff --git a/packages/web_ui/src/util/pluginSet.ts b/packages/web_ui/src/util/pluginSet.ts
index 190fe2c2..76ef9406 100644
--- a/packages/web_ui/src/util/pluginSet.ts
+++ b/packages/web_ui/src/util/pluginSet.ts
@@ -1,7 +1,8 @@
import type { PluginWebApi } from "@clusterio/lib";
/**
- * Canonical key for a set of plugins loaded on the controller
+ * Canonical key for a set of plugins loaded on the controller.
+ * It is assumed that all plugins provided are currently loaded.
*
* @param plugins - name to version mapping of loaded plugins.
* @returns value comparable with === against another key.
@@ -17,9 +18,6 @@ export function pluginSetKey(plugins: Record) {
* @returns value comparable with === against a key from the handshake.
*/
export function loadedPluginSetKey(pluginList: PluginWebApi[]) {
- // The handshake reports the plugins the controller is running, so
- // compare against loaded rather than enabled, which also takes the
- // config into account and only applies from the next restart.
return pluginSetKey(Object.fromEntries(
pluginList.filter(plugin => plugin.loaded).map(plugin => [plugin.name, plugin.version])
));