From 3e88a53a3f6a2e70ce3cad0e77ccbeb2770b801a Mon Sep 17 00:00:00 2001 From: Andrey Goncharov Date: Wed, 26 Oct 2022 03:36:04 -0700 Subject: [PATCH] Fix WebSocket server not starting on Windows Summary: When Flipper starts with Flipper Server enabled, on Windows we forgot to attach the WebSocket handler. It led to a white screen on Electron or to connection timeout messages on Flipper Server. Reviewed By: passy, lblasa Differential Revision: D40679781 fbshipit-source-id: 1c8df8012efc54077409eb8891b1d82ddaf16689 --- desktop/app/src/init.tsx | 20 +++++++++++++------ .../src/server/startServer.tsx | 11 ++++++---- 2 files changed, 21 insertions(+), 10 deletions(-) diff --git a/desktop/app/src/init.tsx b/desktop/app/src/init.tsx index c9f105cb56d..010b0c7618f 100644 --- a/desktop/app/src/init.tsx +++ b/desktop/app/src/init.tsx @@ -50,6 +50,7 @@ import {initCompanionEnv} from 'flipper-server-companion'; import ReconnectingWebSocket from 'reconnecting-websocket'; import WS from 'ws'; import {Module} from 'module'; +import os from 'os'; Module.prototype.require = wrapRequire(Module.prototype.require); enableMapSet(); @@ -76,7 +77,7 @@ async function getKeytarModule(staticPath: string): Promise { return keytar; } -async function getExternalServer(path: string) { +async function getExternalServer(url: string) { const options = { WebSocket: class WSWithUnixDomainSocketSupport extends WS { constructor(url: string, protocols: string | string[]) { @@ -86,7 +87,7 @@ async function getExternalServer(path: string) { } }, }; - const socket = new ReconnectingWebSocket(`ws+unix://${path}`, [], options); + const socket = new ReconnectingWebSocket(url, [], options); const server = await createFlipperServerWithSocket( socket, (_state: FlipperServerState) => {}, @@ -116,13 +117,15 @@ async function getFlipperServer( const settings = await loadSettings(); const socketPath = await makeSocketPath(); - let serverRunning = await checkSocketInUse(socketPath); + let externalServerConnectionURL = `ws+unix://${socketPath}`; + // On Windows this is going to return false at all times as we do not use domain sockets there. + let serverRunning = await checkSocketInUse(socketPath); if (serverRunning) { console.info( 'flipper-server: currently running/listening, attempt to shutdown', ); - const server = await getExternalServer(socketPath); + const server = await getExternalServer(externalServerConnectionURL); await server.exec('shutdown').catch(() => { /** shutdown will ultimately make this request fail, ignore error. */ }); @@ -160,11 +163,16 @@ async function getFlipperServer( if (!serverRunning) { console.info('flipper-server: not running/listening, start'); + const port = 52342; + if (os.platform() === 'win32') { + externalServerConnectionURL = `ws://localhost:${port}`; + } + const {readyForIncomingConnections} = await startServer({ staticDir: staticPath, entry: 'index.web.dev.html', tcp: false, - port: 52342, + port, }); const server = await startFlipperServer( @@ -182,7 +190,7 @@ async function getFlipperServer( await readyForIncomingConnections(server, companionEnv); } - return getExternalServer(socketPath); + return getExternalServer(externalServerConnectionURL); } return getEmbeddedServer(); } diff --git a/desktop/flipper-server-core/src/server/startServer.tsx b/desktop/flipper-server-core/src/server/startServer.tsx index 832b5038a12..8342a2b108b 100644 --- a/desktop/flipper-server-core/src/server/startServer.tsx +++ b/desktop/flipper-server-core/src/server/startServer.tsx @@ -110,14 +110,17 @@ async function startProxyServer( // listening at the specified port. if (os.platform() === 'win32') { if (!config.tcp) { - console.error( - 'No port was supplied and domain socket access is not available for non-POSIX systems, unable to start server', + console.warn( + 'No port was supplied and domain socket access is not available for non-POSIX systems, falling back to TCP', ); - process.exit(1); } return new Promise((resolve) => { console.log(`Starting server on http://localhost:${config.port}`); - const readyForIncomingConnections = (): Promise => { + const readyForIncomingConnections = ( + serverImpl: FlipperServerImpl, + companionEnv: FlipperServerCompanionEnv, + ): Promise => { + attachSocketServer(socket, serverImpl, companionEnv); return new Promise((resolve) => { server.listen(config.port, undefined, () => resolve()); });