Skip to content

Commit 1bbb9ee

Browse files
robhoganmeta-codesync[bot]
authored andcommitted
Replace deprecated url.parse in dev-middleware (#55235)
Summary: Pull Request resolved: #55235 Use of Node's `url.parse` is deprecated and emits a runtime warning (when used in 1P code) from Node 24. This wouldn't directly affect RN users, but does create noise running from monorepo source. Changelog: [Internal] Reviewed By: GijsWeterings Differential Revision: D90992431 fbshipit-source-id: d53e2837cd13bba3fbb24302c5916038ae0e5a50
1 parent 50289e3 commit 1bbb9ee

3 files changed

Lines changed: 23 additions & 18 deletions

File tree

packages/dev-middleware/src/__tests__/ServerUtils.js

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,6 @@ import connect from 'connect';
1616
import http from 'http';
1717
import https from 'https';
1818
import * as selfsigned from 'selfsigned';
19-
import url from 'url';
2019

2120
type CreateDevMiddlewareOptions = Parameters<typeof createDevMiddleware>[0];
2221
type CreateServerOptions = {
@@ -109,7 +108,7 @@ export async function createServer(options: CreateServerOptions): Promise<{
109108
});
110109
app.use(middleware);
111110
httpServer.on('upgrade', (request, socket, head) => {
112-
const {pathname} = url.parse(request.url);
111+
const {pathname} = new URL(request.url, 'http://example.com');
113112
if (pathname != null && websocketEndpoints[pathname]) {
114113
websocketEndpoints[pathname].handleUpgrade(
115114
request,

packages/dev-middleware/src/inspector-proxy/InspectorProxy.js

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,6 @@ import Device from './Device';
2727
import EventLoopPerfTracker from './EventLoopPerfTracker';
2828
import InspectorProxyHeartbeat from './InspectorProxyHeartbeat';
2929
import nullthrows from 'nullthrows';
30-
import url from 'url';
3130
import WS from 'ws';
3231

3332
const debug = require('debug')('Metro:InspectorProxy');
@@ -205,7 +204,7 @@ export default class InspectorProxy implements InspectorProxyQueries {
205204
response: ServerResponse,
206205
next: (?Error) => unknown,
207206
) {
208-
const pathname = url.parse(request.url).pathname;
207+
const pathname = new URL(request.url, 'http://example.com').pathname;
209208
if (
210209
pathname === PAGES_LIST_JSON_URL ||
211210
pathname === PAGES_LIST_JSON_URL_2
@@ -336,12 +335,11 @@ export default class InspectorProxy implements InspectorProxyQueries {
336335
const wssTimestamp = Date.now();
337336

338337
const fallbackDeviceId = String(this.#deviceCounter++);
339-
340-
const query = url.parse(req.url || '', true).query || {};
341-
const deviceId = query.device || fallbackDeviceId;
342-
const deviceName = query.name || 'Unknown';
343-
const appName = query.app || 'Unknown';
344-
const isProfilingBuild = query.profiling === 'true';
338+
const query = tryParseQueryParams(req.url);
339+
const deviceId = query?.get('device') || fallbackDeviceId;
340+
const deviceName = query?.get('name') || 'Unknown';
341+
const appName = query?.get('app') || 'Unknown';
342+
const isProfilingBuild = query?.get('profiling') === 'true';
345343

346344
try {
347345
const deviceRelativeBaseUrl =
@@ -504,9 +502,9 @@ export default class InspectorProxy implements InspectorProxyQueries {
504502
wss.on('connection', async (socket: WS, req) => {
505503
const wssTimestamp = Date.now();
506504

507-
const query = url.parse(req.url || '', true).query || {};
508-
const deviceId = query.device;
509-
const pageId = query.page;
505+
const query = tryParseQueryParams(req.url);
506+
const deviceId = query?.get('device') || null;
507+
const pageId = query?.get('page') || null;
510508
const debuggerRelativeBaseUrl =
511509
getBaseUrlFromRequest(req) ?? this.#serverBaseUrl;
512510
const device: Device | void = deviceId
@@ -593,7 +591,8 @@ export default class InspectorProxy implements InspectorProxyQueries {
593591

594592
device.handleDebuggerConnection(socket, pageId, {
595593
debuggerRelativeBaseUrl,
596-
userAgent: req.headers['user-agent'] ?? query.userAgent ?? null,
594+
userAgent:
595+
req.headers['user-agent'] ?? query?.get('userAgent') ?? null,
597596
});
598597

599598
socket.on('close', (code: number, reason: string) => {
@@ -619,7 +618,7 @@ export default class InspectorProxy implements InspectorProxyQueries {
619618
"Connection failed to be established with DevTools for app='%s' on device='%s' and device id='%s' with error:",
620619
device?.getApp() || 'unknown',
621620
device?.getName() || 'unknown',
622-
deviceId,
621+
deviceId || 'unknown',
623622
error,
624623
);
625624
socket.close(INTERNAL_ERROR_CODE, error?.toString() ?? 'Unknown error');
@@ -634,3 +633,11 @@ export default class InspectorProxy implements InspectorProxyQueries {
634633
return wss;
635634
}
636635
}
636+
637+
function tryParseQueryParams(urlString: string): ?URLSearchParams {
638+
try {
639+
return new URL(urlString, 'http://example.com').searchParams;
640+
} catch {
641+
return null;
642+
}
643+
}

packages/dev-middleware/src/middleware/openDebuggerMiddleware.js

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,6 @@ import type {IncomingMessage, ServerResponse} from 'http';
2222

2323
import getDevToolsFrontendUrl from '../utils/getDevToolsFrontendUrl';
2424
import {createHash} from 'crypto';
25-
import url from 'url';
2625

2726
const LEGACY_SYNTHETIC_PAGE_TITLE =
2827
'React Native Experimental (Improved Chrome Reloads)';
@@ -74,7 +73,7 @@ export default function openDebuggerMiddleware({
7473
req.method === 'POST' ||
7574
(experiments.enableOpenDebuggerRedirect && req.method === 'GET')
7675
) {
77-
const parsedUrl = url.parse(req.url, true);
76+
const {searchParams} = new URL(req.url, 'http://example.com');
7877

7978
const query: {
8079
/** @deprecated Will only match legacy Hermes targets */
@@ -86,7 +85,7 @@ export default function openDebuggerMiddleware({
8685
target?: string,
8786
panel?: string,
8887
...
89-
} = parsedUrl.query;
88+
} = Object.fromEntries(searchParams);
9089

9190
const targets = inspectorProxy
9291
.getPageDescriptions({requestorRelativeBaseUrl: new URL(serverBaseUrl)})

0 commit comments

Comments
 (0)