diff --git a/desktop/flipper-common/src/ServerAddOn.tsx b/desktop/flipper-common/src/ServerAddOn.tsx index 6d6fb4bf4..d0200725d 100644 --- a/desktop/flipper-common/src/ServerAddOn.tsx +++ b/desktop/flipper-common/src/ServerAddOn.tsx @@ -13,6 +13,10 @@ import { FlipperServerEvents, } from './server-types'; +export type ServerAddOnStartDetails = + | {isBundled: true; path?: never} + | {isBundled?: false; path: string}; + export interface ServerAddOnControls { start: FlipperServerCommands['plugins-server-add-on-start']; stop: FlipperServerCommands['plugins-server-add-on-stop']; diff --git a/desktop/flipper-common/src/server-types.tsx b/desktop/flipper-common/src/server-types.tsx index 8bc801685..2343b1c1c 100644 --- a/desktop/flipper-common/src/server-types.tsx +++ b/desktop/flipper-common/src/server-types.tsx @@ -17,6 +17,7 @@ import { OS as PluginOS, UpdatablePluginDetails, } from './PluginDetails'; +import {ServerAddOnStartDetails} from './ServerAddOn'; import { EnvironmentInfo, LauncherSettings, @@ -252,6 +253,7 @@ export type FlipperServerCommands = { 'plugins-remove-plugins': (names: string[]) => Promise; 'plugins-server-add-on-start': ( pluginName: string, + details: ServerAddOnStartDetails, owner: string, ) => Promise; 'plugins-server-add-on-stop': ( diff --git a/desktop/flipper-plugin/src/plugin/PluginBase.tsx b/desktop/flipper-plugin/src/plugin/PluginBase.tsx index e55876ac9..3e1c1b27a 100644 --- a/desktop/flipper-plugin/src/plugin/PluginBase.tsx +++ b/desktop/flipper-plugin/src/plugin/PluginBase.tsx @@ -510,16 +510,24 @@ export abstract class BasePluginInstance { protected abstract serverAddOnOwner: string; protected startServerAddOn() { - const {serverAddOn, name} = this.definition.details; - if (serverAddOn) { - this.serverAddOnControls.start(name, this.serverAddOnOwner).catch((e) => { - console.warn( - 'Failed to start a server add on', - name, + const pluginDetails = this.definition.details; + if (pluginDetails.serverAddOn) { + this.serverAddOnControls + .start( + pluginDetails.name, + pluginDetails.isBundled + ? {isBundled: true} + : {path: pluginDetails.serverAddOnEntry!}, this.serverAddOnOwner, - e, - ); - }); + ) + .catch((e) => { + console.warn( + 'Failed to start a server add on', + pluginDetails.name, + this.serverAddOnOwner, + e, + ); + }); } } diff --git a/desktop/flipper-server-core/src/FlipperServerImpl.tsx b/desktop/flipper-server-core/src/FlipperServerImpl.tsx index d5bb6dd8b..c508558a5 100644 --- a/desktop/flipper-server-core/src/FlipperServerImpl.tsx +++ b/desktop/flipper-server-core/src/FlipperServerImpl.tsx @@ -419,8 +419,8 @@ export class FlipperServerImpl implements FlipperServer { 'plugins-install-from-npm': (name) => this.pluginManager.installPluginFromNpm(name), 'plugin-source': (path) => this.pluginManager.loadSource(path), - 'plugins-server-add-on-start': (pluginName, owner) => - this.pluginManager.startServerAddOn(pluginName, owner), + 'plugins-server-add-on-start': (pluginName, details, owner) => + this.pluginManager.startServerAddOn(pluginName, details, owner), // TODO: Figure out if it needs to be async 'plugins-server-add-on-stop': async (pluginName, owner) => this.pluginManager.stopServerAddOn(pluginName, owner), diff --git a/desktop/flipper-server-core/src/plugins/PluginManager.tsx b/desktop/flipper-server-core/src/plugins/PluginManager.tsx index e0f47dd1c..ea18f6aff 100644 --- a/desktop/flipper-server-core/src/plugins/PluginManager.tsx +++ b/desktop/flipper-server-core/src/plugins/PluginManager.tsx @@ -18,6 +18,7 @@ import { ExecuteMessage, FlipperServerForServerAddOn, InstalledPluginDetails, + ServerAddOnStartDetails, } from 'flipper-common'; import {getStaticPath} from '../utils/pathUtils'; import {loadDynamicPlugins} from './loadDynamicPlugins'; @@ -173,7 +174,11 @@ export class PluginManager { return this.serverAddOns.get(message.params.api); } - async startServerAddOn(pluginName: string, owner: string) { + async startServerAddOn( + pluginName: string, + details: ServerAddOnStartDetails, + owner: string, + ) { console.debug('PluginManager.startServerAddOn', pluginName); const existingServerAddOn = this.serverAddOns.get(pluginName); if (existingServerAddOn) { @@ -188,6 +193,7 @@ export class PluginManager { const newServerAddOn = await ServerAddOn.start( pluginName, + details, owner, () => this.serverAddOns.delete(pluginName), this.flipperServer, diff --git a/desktop/flipper-server-core/src/plugins/ServerAddOn.tsx b/desktop/flipper-server-core/src/plugins/ServerAddOn.tsx index 607162b0c..945aa1fa1 100644 --- a/desktop/flipper-server-core/src/plugins/ServerAddOn.tsx +++ b/desktop/flipper-server-core/src/plugins/ServerAddOn.tsx @@ -13,6 +13,7 @@ import { FlipperServerForServerAddOn, ServerAddOnCleanup, ServerAddOn as ServerAddOnFn, + ServerAddOnStartDetails, } from 'flipper-common'; import {ServerAddOnDesktopToModuleConnection} from './ServerAddOnDesktopToModuleConnection'; import {ServerAddOnModuleToDesktopConnection} from './ServerAddOnModuleToDesktopConnection'; @@ -23,16 +24,29 @@ interface ServerAddOnModule { default: ServerAddOnFn; } -const loadPlugin = (pluginName: string): ServerAddOnModule => { - console.debug('loadPlugin', pluginName); +const loadPlugin = ( + pluginName: string, + details: ServerAddOnStartDetails, +): ServerAddOnModule => { + console.debug('loadPlugin', pluginName, details); - const bundledPlugin = defaultPlugins[pluginName]; - if (bundledPlugin) { + if (details.isBundled) { + const bundledPlugin = defaultPlugins[pluginName]; + assertNotNull( + bundledPlugin, + `loadPlugin (isBundled = true) -> plugin ${pluginName} not found.`, + ); return bundledPlugin; } - // TODO: Use getInstalledPlugin - return {default: async () => async () => {}}; + assertNotNull( + details.path, + `loadPlugin (isBundled = false) -> server add-on path is empty plugin ${pluginName}.`, + ); + + // eslint-disable-next-line no-eval + const serverAddOnModule = eval(`require("${details.path}")`); + return serverAddOnModule; }; // TODO: Fix potential race conditions when starting/stopping concurrently @@ -50,13 +64,14 @@ export class ServerAddOn { static async start( pluginName: string, + details: ServerAddOnStartDetails, initialOwner: string, onStop: () => void, flipperServer: FlipperServerForServerAddOn, ): Promise { - console.info('ServerAddOn.start', pluginName); + console.info('ServerAddOn.start', pluginName, details); - const {default: serverAddOn} = loadPlugin(pluginName); + const {default: serverAddOn} = loadPlugin(pluginName, details); assertNotNull(serverAddOn); assert( typeof serverAddOn === 'function', diff --git a/desktop/flipper-ui-core/src/utils/createServerAddOnControls.tsx b/desktop/flipper-ui-core/src/utils/createServerAddOnControls.tsx index d25348a3f..76dd0a0ec 100644 --- a/desktop/flipper-ui-core/src/utils/createServerAddOnControls.tsx +++ b/desktop/flipper-ui-core/src/utils/createServerAddOnControls.tsx @@ -45,8 +45,13 @@ export const createServerAddOnControls = ( }; return { - start: (pluginName, owner) => - flipperServer.exec('plugins-server-add-on-start', pluginName, owner), + start: (pluginName, details, owner) => + flipperServer.exec( + 'plugins-server-add-on-start', + pluginName, + details, + owner, + ), stop: (pluginName, owner) => flipperServer.exec('plugins-server-add-on-stop', pluginName, owner), sendMessage: async (pluginName, method, params) => {