diff --git a/desktop/flipper-server-core/src/server/utilities.tsx b/desktop/flipper-server-core/src/server/utilities.tsx index 2ff26024c..5e4aaf213 100644 --- a/desktop/flipper-server-core/src/server/utilities.tsx +++ b/desktop/flipper-server-core/src/server/utilities.tsx @@ -11,6 +11,9 @@ import os from 'os'; import xdgBasedir from 'xdg-basedir'; import net from 'net'; import fs from 'fs-extra'; +import fetch from 'node-fetch'; +import {EnvironmentInfo} from 'flipper-common'; +import semver from 'semver'; /** * Checks if a port is in use. @@ -39,3 +42,66 @@ export async function checkPortInUse(port: number): Promise { .listen(port); }); } + +/** + * Checks if a running Flipper server is available on the given port. + * @param port The port to check. + * @returns If successful, it will return the version of the running + * Flipper server. Otherwise, undefined. + */ +export async function checkServerRunning( + port: number, +): Promise { + try { + const response = await fetch(`http://localhost:${port}/info`); + if (response.status >= 200 && response.status < 300) { + const environmentInfo: EnvironmentInfo = await response.json(); + return environmentInfo.appVersion; + } else { + console.info( + '[flipper-server] Running instance found, failed with HTTP status code: ', + response.status, + ); + } + } catch (e) { + console.info( + `[flipper-server] No running instance found, error found: ${e}`, + ); + } +} + +/** + * Attempts to shutdown an existing Flipper server instance. + * @param port The port of the running Flipper server + * @returns Returns true if the shutdown was successful. Otherwise, false. + */ +export async function shutdownRunningInstance(port: number): Promise { + try { + const response = await fetch(`http://localhost:${port}/shutdown`); + if (response.status >= 200 && response.status < 300) { + const json = await response.json(); + console.info( + `[flipper-server] Shutdown request acknowledge: ${json?.success}`, + ); + return json?.success; + } else { + console.warn( + '[flipper-server] Shutdown request not handled, HTTP status code: ', + response.status, + ); + } + } catch (e) { + console.warn('[flipper-server] Shutdown request failed with error: ', e); + } + + return false; +} + +/** + * Compares two versions excluding build identifiers + * (the bit after + in the semantic version string). + * @return 0 if v1 == v2, 1 if v1 is greater, -1 if v2 is greater. + */ +export function compareServerVersion(v1: string, v2: string): number { + return semver.compare(v1, v2); +}