diff --git a/desktop/flipper-server-core/src/server/attachSocketServer.tsx b/desktop/flipper-server-core/src/server/attachSocketServer.tsx index 0b7e9b303..2e5e4e7ea 100644 --- a/desktop/flipper-server-core/src/server/attachSocketServer.tsx +++ b/desktop/flipper-server-core/src/server/attachSocketServer.tsx @@ -25,6 +25,7 @@ import { FlipperServerCompanionEnv, } from 'flipper-server-companion'; import {URLSearchParams} from 'url'; +import {getFlipperServerConfig} from '../FlipperServerConfig'; const safe = (f: () => void) => { try { @@ -36,9 +37,12 @@ const safe = (f: () => void) => { } }; +let numberOfConnectedClients = 0; +let disconnectTimeout: NodeJS.Timeout | undefined; + /** * Attach and handle incoming messages from clients. - * @param flipperServer A FlipperServer instance. + * @param server A FlipperServer instance. * @param socket A ws socket on which to listen for events. */ export function attachSocketServer( @@ -53,6 +57,8 @@ export function attachSocketServer( ''; console.log('Client connected', clientAddress); + numberOfConnectedClients++; + let connected = true; let flipperServerCompanion: FlipperServerCompanion | undefined; @@ -227,6 +233,22 @@ export function attachSocketServer( console.log(`Client disconnected ${clientAddress}`); } + numberOfConnectedClients--; + if (getFlipperServerConfig().environmentInfo.isHeadlessBuild) { + if (disconnectTimeout) { + clearTimeout(disconnectTimeout); + } + /** + * If, after 15 min, there are no more connected clients, we exit the process. + */ + disconnectTimeout = setTimeout(() => { + if (numberOfConnectedClients === 0) { + console.info('Shutdown as no clients are currently connected'); + process.exit(0); + } + }, 15 * 60 * 1000); + } + connected = false; server.offAny(onServerEvent); flipperServerCompanion?.destroyAll();