mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
84de8a075e
Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/51416 Deletes `oncall` annotations from the `facebook/react-native` repository. Changelog: [Internal] Reviewed By: javache Differential Revision: D74902524 fbshipit-source-id: 32a6a5b2ff27281792d572f151e2b094d9a79029
74 lines
1.8 KiB
JavaScript
74 lines
1.8 KiB
JavaScript
/**
|
|
* 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.
|
|
*
|
|
* @flow strict-local
|
|
* @format
|
|
*/
|
|
|
|
import net from 'net';
|
|
|
|
/**
|
|
* Determine whether we can run the dev server.
|
|
*
|
|
* Return values:
|
|
* - `not_running`: The port is unoccupied.
|
|
* - `matched_server_running`: The port is occupied by another instance of this
|
|
* dev server (matching the passed `projectRoot`).
|
|
* - `port_taken`: The port is occupied by another process.
|
|
* - `unknown`: An error was encountered; attempt server creation anyway.
|
|
*/
|
|
export default async function isDevServerRunning(
|
|
devServerUrl: string,
|
|
projectRoot: string,
|
|
): Promise<
|
|
'not_running' | 'matched_server_running' | 'port_taken' | 'unknown',
|
|
> {
|
|
const {hostname, port} = new URL(devServerUrl);
|
|
|
|
try {
|
|
if (!(await isPortOccupied(hostname, port))) {
|
|
return 'not_running';
|
|
}
|
|
|
|
const statusResponse = await fetch(`${devServerUrl}/status`);
|
|
const body = await statusResponse.text();
|
|
|
|
return body === 'packager-status:running' &&
|
|
statusResponse.headers.get('X-React-Native-Project-Root') === projectRoot
|
|
? 'matched_server_running'
|
|
: 'port_taken';
|
|
} catch (e) {
|
|
return 'unknown';
|
|
}
|
|
}
|
|
|
|
async function isPortOccupied(
|
|
hostname: string,
|
|
port: string,
|
|
): Promise<boolean> {
|
|
let result = false;
|
|
const server = net.createServer();
|
|
|
|
return new Promise((resolve, reject) => {
|
|
server.once('error', e => {
|
|
server.close();
|
|
if (e.code === 'EADDRINUSE') {
|
|
result = true;
|
|
} else {
|
|
reject(e);
|
|
}
|
|
});
|
|
server.once('listening', () => {
|
|
result = false;
|
|
server.close();
|
|
});
|
|
server.once('close', () => {
|
|
resolve(result);
|
|
});
|
|
server.listen({host: hostname, port});
|
|
});
|
|
}
|