Files
react-native/packages/community-cli-plugin/src/utils/isDevServerRunning.js
T
Jakub RomanczykandFacebook GitHub Bot 881d8a720f refactor(community-cli-plugin): use node builtin fetch (#47397)
Summary:
Removed `node-fetch` in favour of node builtin fetch to get rid of the deprecated `punycode` warning when using Node 22.

`react-native/community-cli-plugin` already requires Node >= 18 where it was made available by default (without `--experimental-fetch` flag).

This change is similar to the one made in https://github.com/facebook/react-native/pull/45227

## Changelog:

[GENERAL] [CHANGED] - Drop node-fetch in favor of Node's built-in fetch from undici in `react-native/community-cli-plugin`

Pull Request resolved: https://github.com/facebook/react-native/pull/47397

Test Plan: tests pass

Reviewed By: blakef

Differential Revision: D66512595

Pulled By: NickGerleman

fbshipit-source-id: c4e01baf388f9fae8cea7b4bfe25034bff28b461
2024-11-27 10:39:39 -08:00

75 lines
1.9 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
* @oncall react_native
*/
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});
});
}