mirror of
https://github.com/facebook/react-native.git
synced 2025-11-01 09:14:26 +00:00
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
75 lines
1.9 KiB
JavaScript
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});
|
|
});
|
|
}
|