Files
flipper/desktop/flipper-server-core/src/server/utilities.tsx
Anton Kastritskiy 663380e721 mark unused vars as errors
Reviewed By: lblasa

Differential Revision: D50500690

fbshipit-source-id: 6f739fe25c232ecfe842337af4399681e85f6a13
2023-10-20 12:44:58 -07:00

105 lines
2.9 KiB
TypeScript

/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @format
*/
import net from 'net';
import fetch from 'node-fetch';
import {EnvironmentInfo} from 'flipper-common';
import semver from 'semver';
/**
* Checks if a port is in use.
* @param port The port to check.
* @returns True if the port is in use. Otherwise, false.
*/
export async function checkPortInUse(port: number): Promise<boolean> {
interface HttpError extends Error {
code?: string;
}
return new Promise((resolve, reject) => {
const tester = net
.createServer()
.once('error', function (err: HttpError) {
if (err.code != 'EADDRINUSE') return reject(err);
resolve(true);
})
.once('listening', function () {
tester
.once('close', function () {
resolve(false);
})
.close();
})
.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<string | undefined> {
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<boolean> {
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);
}