diff --git a/desktop/flipper-server-companion/src/companion.tsx b/desktop/flipper-server-companion/src/companion.tsx index 0911822bd..d8be20b4a 100644 --- a/desktop/flipper-server-companion/src/companion.tsx +++ b/desktop/flipper-server-companion/src/companion.tsx @@ -378,7 +378,23 @@ export class FlipperServerCompanion { ); } - return pluginInstance.companionApi[api](...(params ?? [])); + return new Promise(async (resolve, reject) => { + const closeHandle = () => { + reject(new Error('Client disconnected whilst executing request')); + }; + client.once('close', closeHandle); + + try { + const response = await pluginInstance.companionApi[api]( + ...(params ?? []), + ); + resolve(response); + } catch (error) { + reject(error); + } finally { + client.off('close', closeHandle); + } + }); }, 'companion-plugin-subscribe': async (clientId, pluginId, api) => { const client = this.clients.get(clientId); diff --git a/desktop/flipper-server-core/src/FlipperServerImpl.tsx b/desktop/flipper-server-core/src/FlipperServerImpl.tsx index b2a03761b..63acd6422 100644 --- a/desktop/flipper-server-core/src/FlipperServerImpl.tsx +++ b/desktop/flipper-server-core/src/FlipperServerImpl.tsx @@ -235,6 +235,13 @@ export class FlipperServerImpl implements FlipperServer { this.events.on(event, callback); } + once( + event: Event, + callback: (payload: FlipperServerEvents[Event]) => void, + ): void { + this.events.once(event, callback); + } + off( event: Event, callback: (payload: FlipperServerEvents[Event]) => void,