diff --git a/packages/web_ui/src/BaseWebPlugin.ts b/packages/web_ui/src/BaseWebPlugin.ts index e476cbe1..5a3a9b98 100644 --- a/packages/web_ui/src/BaseWebPlugin.ts +++ b/packages/web_ui/src/BaseWebPlugin.ts @@ -1,5 +1,6 @@ import type React from "react"; -import type { AccountRole, Link, Logger, PluginWebpackEnvInfo } from "@clusterio/lib"; +import type { AccountRole, Logger, PluginWebpackEnvInfo } from "@clusterio/lib"; +import type { Control } from "./util/websocket"; /** * Plugin supplied login form @@ -77,11 +78,6 @@ export default class BaseWebPlugin { * Contents of the plugin's package.json file */ package: any; - /** - * Control link to the controller, not available until the - * connect event in onControllerConnectionEvent is signaled. - */ - control?: Link; /** * Logger for this plugin * @@ -152,6 +148,12 @@ export default class BaseWebPlugin { * The plugin's own info module */ public info: PluginWebpackEnvInfo, + /** + * Control link to the controller + * + * Not connected at the time init is invoked. + */ + public control: Control, logger: Logger, ) { this.package = packageData; diff --git a/packages/web_ui/src/bootstrap.tsx b/packages/web_ui/src/bootstrap.tsx index 349d0e33..aa34cd03 100644 --- a/packages/web_ui/src/bootstrap.tsx +++ b/packages/web_ui/src/bootstrap.tsx @@ -67,8 +67,8 @@ async function loadPluginInfos(): Promise { return pluginInfos; } -async function loadPlugins(pluginInfos: lib.PluginWebpackEnvInfo[]) { - let plugins = new Map(); +async function loadPlugins(pluginInfos: lib.PluginWebpackEnvInfo[], control: Control) { + let plugins = new Map(); for (let pluginInfo of pluginInfos) { if (!pluginInfo.enabled) { continue; @@ -83,7 +83,7 @@ async function loadPlugins(pluginInfos: lib.PluginWebpackEnvInfo[]) { WebPluginClass = webModule.WebPlugin; } - let plugin = new WebPluginClass(pluginInfo.container, pluginInfo.package, pluginInfo, logger); + let plugin = new WebPluginClass(pluginInfo.container, pluginInfo.package, pluginInfo, control, logger); await plugin.init(); plugins.set(pluginInfo.name, plugin); @@ -106,11 +106,11 @@ export default async function bootstrap() { lib.registerPluginMessages(pluginInfos); lib.registerPluginConfigGroups(pluginInfos); lib.finalizeConfigs(); - let plugins = await loadPlugins(pluginInfos); let wsUrl = new URL(webRoot, document.location.href); let controlConnector = new ControlConnector(wsUrl.href, 120, undefined); - let control = new Control(controlConnector, plugins); + let control = new Control(controlConnector); + control.plugins = await loadPlugins(pluginInfos, control); const root = createRoot(document.getElementById("root") as HTMLDivElement); root.render(); diff --git a/packages/web_ui/src/index.ts b/packages/web_ui/src/index.ts index 54abb479..03e4e6cd 100644 --- a/packages/web_ui/src/index.ts +++ b/packages/web_ui/src/index.ts @@ -2,6 +2,7 @@ export { default as bootstrap } from "./bootstrap"; export { default as notify, notifyErrorHandler } from "./util/notify"; export { default as BaseWebPlugin } from "./BaseWebPlugin"; +export * from "./util/websocket"; export * from "./model/instance"; export * from "./model/host"; diff --git a/packages/web_ui/src/util/websocket.ts b/packages/web_ui/src/util/websocket.ts index c2fbbdf1..a61386d3 100644 --- a/packages/web_ui/src/util/websocket.ts +++ b/packages/web_ui/src/util/websocket.ts @@ -52,6 +52,9 @@ export class Control extends lib.Link { /** Roles of the account this control link is connected as. */ accountRoles: lib.AccountRole[] | null = null; + /** Plugins loaded in the web interface */ + public plugins = new Map(); + /** Updates not handled by the subscription service */ accountUpdateHandlers: accountHandler[] = []; logHandlers: Map = new Map(); @@ -85,14 +88,9 @@ export class Control extends lib.Link { constructor( connector: ControlConnector, - public plugins: Map, ) { super(connector); - for (let plugin of plugins.values()) { - plugin.control = this; - } - this.connector.on("connect", data => { this.accountName = data.account.name; this.accountRoles = data.account.roles;