From 3993e7461dc53af5f23945514fe4ef14db985fb8 Mon Sep 17 00:00:00 2001 From: Lorenzo Blasa Date: Wed, 8 Nov 2023 10:39:18 -0800 Subject: [PATCH] Shutdown after 5 hours Summary: If after 5 hours there are no connected clients, shutdown the server. This is to prevent cases whereas the long-lived instance makes users use stale versions of Flipper if Flipper stays indefinitely running in the background. Reviewed By: passy Differential Revision: D51111926 fbshipit-source-id: 4c38e392cf8a6a4fb840bffdea92c0b0314aefb9 --- .../src/server/attachSocketServer.tsx | 27 ++++++++++++++++++- 1 file changed, 26 insertions(+), 1 deletion(-) diff --git a/desktop/flipper-server-core/src/server/attachSocketServer.tsx b/desktop/flipper-server-core/src/server/attachSocketServer.tsx index 4b85ecbdc..dd389522d 100644 --- a/desktop/flipper-server-core/src/server/attachSocketServer.tsx +++ b/desktop/flipper-server-core/src/server/attachSocketServer.tsx @@ -17,6 +17,7 @@ import { SystemError, getLogger, CompanionEventWebSocketMessage, + isProduction, } from 'flipper-common'; import {FlipperServerImpl} from '../FlipperServerImpl'; import {RawData, WebSocketServer} from 'ws'; @@ -27,6 +28,7 @@ import { import {URLSearchParams} from 'url'; import {tracker} from '../tracker'; import {performance} from 'perf_hooks'; +import {getFlipperServerConfig} from '../FlipperServerConfig'; const safe = (f: () => void) => { try { @@ -38,8 +40,8 @@ const safe = (f: () => void) => { } }; -/* eslint-disable @typescript-eslint/no-unused-vars */ let numberOfConnectedClients = 0; +let disconnectTimeout: NodeJS.Timeout | undefined; /** * Attach and handle incoming messages from clients. @@ -68,6 +70,10 @@ export function attachSocketServer( console.log('Client connected', clientAddress); numberOfConnectedClients++; + if (disconnectTimeout) { + clearTimeout(disconnectTimeout); + } + clearTimeout(browserConnectionTimeout); tracker.track('browser-connection-created', { successful: true, @@ -254,6 +260,25 @@ export function attachSocketServer( code, error, }); + + if ( + getFlipperServerConfig().environmentInfo.isHeadlessBuild && + isProduction() + ) { + const FIVE_HOURS = 5 * 60 * 60 * 1000; + if (disconnectTimeout) { + clearTimeout(disconnectTimeout); + } + + disconnectTimeout = setTimeout(() => { + if (numberOfConnectedClients === 0) { + console.info( + '[flipper-server] Shutdown as no clients are currently connected', + ); + process.exit(0); + } + }, FIVE_HOURS); + } } client.on('close', (code, _reason) => {