diff --git a/desktop/app/src/init.tsx b/desktop/app/src/init.tsx index c9f105cb5..010b0c761 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 832b5038a..8342a2b10 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()); });