From fcb89b94b59252b3bf63adac83b59d88df207a99 Mon Sep 17 00:00:00 2001 From: John Knox Date: Mon, 27 Apr 2020 07:11:50 -0700 Subject: [PATCH] Fix wss connection initialisation race Summary: The websocket server has a race condition where it only starts listening for messages after the client has finished setting up. This lets it queue up messages if the client isn't ready. Reviewed By: passy Differential Revision: D21256218 fbshipit-source-id: fa8481e11225cc473f03f3afbf4d0c50a48cec91 --- desktop/app/src/server.tsx | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/desktop/app/src/server.tsx b/desktop/app/src/server.tsx index 8bf4b6eff..52ec3a974 100644 --- a/desktop/app/src/server.tsx +++ b/desktop/app/src/server.tsx @@ -193,6 +193,7 @@ class Server extends EventEmitter { case 'connect': { const app = message.app; const plugins = message.plugins; + let resolvedClient: Client | null = null; const client = this.addConnection( new WebsocketClientFlipperConnection(ws, app, plugins), { @@ -203,15 +204,18 @@ class Server extends EventEmitter { sdk_version: 1, }, {}, - ); + ).then((c) => (resolvedClient = c)); clients[app] = client; - client.then((c) => { - ws.on('message', (m: any) => { - const parsed = JSON.parse(m.toString()); - if (parsed.app === app) { - c.onMessage(JSON.stringify(parsed.payload)); + + ws.on('message', (m: any) => { + const parsed = JSON.parse(m.toString()); + if (parsed.app === app) { + const message = JSON.stringify(parsed.payload); + if (resolvedClient) { + resolvedClient.onMessage(message); } - }); + client.then((c) => c.onMessage(message)); + } }); break; }