diff --git a/desktop/flipper-server-companion/src/companion.tsx b/desktop/flipper-server-companion/src/companion.tsx index 47503498f..0911822bd 100644 --- a/desktop/flipper-server-companion/src/companion.tsx +++ b/desktop/flipper-server-companion/src/companion.tsx @@ -21,6 +21,7 @@ import {BaseDevice} from 'flipper-frontend-core'; import {_SandyPluginDefinition} from 'flipper-plugin'; import {isAtom} from 'flipper-plugin'; import {HeadlessClient} from './HeadlessClient'; +import {FlipperServerCompanionEnv} from './init'; const companionEvents: Array = [ 'companion-plugin-state-update', @@ -48,8 +49,9 @@ export class FlipperServerCompanion { constructor( private readonly flipperServer: FlipperServer, private readonly logger: Logger, - loadablePluginsArr: ReadonlyArray<_SandyPluginDefinition>, + private readonly env: FlipperServerCompanionEnv, ) { + const loadablePluginsArr = env.pluginInitializer.initialPlugins; for (const loadablePlugin of loadablePluginsArr) { this.loadablePlugins.set(loadablePlugin.id, loadablePlugin); } @@ -176,6 +178,30 @@ export class FlipperServerCompanion { return newDevice; } + private async loadPluginIfNeeded(pluginId: string) { + if (!this.loadablePlugins.has(pluginId)) { + console.info( + 'FlipperServerCompanion.loadPluginIfNeeded -> plugin not found, attempt to install from marketplace', + ); + + const plugin = await this.flipperServer.exec( + 'plugins-install-from-marketplace', + pluginId, + ); + if (plugin) { + const sandyPlugin = await this.env.pluginInitializer.installPlugin( + plugin, + ); + if (sandyPlugin) { + console.info( + 'FlipperServerCompanion.loadPluginIfNeeded -> plugin successfully installed', + ); + this.loadablePlugins.set(pluginId, sandyPlugin); + } + } + } + } + private emit( event: T, data: FlipperCompanionEvents[T], @@ -241,6 +267,8 @@ export class FlipperServerCompanion { }); }, 'companion-plugin-start': async (clientId, pluginId) => { + await this.loadPluginIfNeeded(pluginId); + const client = await this.createHeadlessClientIfNeeded(clientId); const pluginInstance = client.sandyPluginStates.get(pluginId); diff --git a/desktop/flipper-server-core/src/server/attachSocketServer.tsx b/desktop/flipper-server-core/src/server/attachSocketServer.tsx index 3f91b81b8..0b7e9b303 100644 --- a/desktop/flipper-server-core/src/server/attachSocketServer.tsx +++ b/desktop/flipper-server-core/src/server/attachSocketServer.tsx @@ -63,7 +63,7 @@ export function attachSocketServer( flipperServerCompanion = new FlipperServerCompanion( server, getLogger(), - companionEnv.pluginInitializer.initialPlugins, + companionEnv, ); } }