From c01df31459a53c9b487b8daf569ed6bc1e3f3e31 Mon Sep 17 00:00:00 2001 From: Lorenzo Blasa Date: Tue, 12 Jul 2022 12:55:19 -0700 Subject: [PATCH] Handle disconnection events whilst executing requests Summary: If there's a device client disconnect during request execution, no response is ever given back to the client (flipperd). This change effectively subscribes to client disconnect events and notifies flipperd of any disconnection during request processing. Reviewed By: passy Differential Revision: D37787986 fbshipit-source-id: 31737a50b83b0cbe4141ce814064aebef7e09bfc --- .../flipper-server-companion/src/companion.tsx | 18 +++++++++++++++++- .../src/FlipperServerImpl.tsx | 7 +++++++ 2 files changed, 24 insertions(+), 1 deletion(-) 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,