Skip to content
This repository has been archived by the owner on Nov 22, 2024. It is now read-only.

Commit

Permalink
Fix WebSocket server not starting on Windows
Browse files Browse the repository at this point in the history
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
  • Loading branch information
aigoncharov authored and facebook-github-bot committed Oct 26, 2022
1 parent 13e0680 commit 3e88a53
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 10 deletions.
20 changes: 14 additions & 6 deletions desktop/app/src/init.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand All @@ -76,7 +77,7 @@ async function getKeytarModule(staticPath: string): Promise<KeytarModule> {
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[]) {
Expand All @@ -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) => {},
Expand Down Expand Up @@ -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. */
});
Expand Down Expand Up @@ -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(
Expand All @@ -182,7 +190,7 @@ async function getFlipperServer(
await readyForIncomingConnections(server, companionEnv);
}

return getExternalServer(socketPath);
return getExternalServer(externalServerConnectionURL);
}
return getEmbeddedServer();
}
Expand Down
11 changes: 7 additions & 4 deletions desktop/flipper-server-core/src/server/startServer.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -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<void> => {
const readyForIncomingConnections = (
serverImpl: FlipperServerImpl,
companionEnv: FlipperServerCompanionEnv,
): Promise<void> => {
attachSocketServer(socket, serverImpl, companionEnv);
return new Promise((resolve) => {
server.listen(config.port, undefined, () => resolve());
});
Expand Down

0 comments on commit 3e88a53

Please sign in to comment.