Skip to content

Commit 451fffb

Browse files
motiz88facebook-github-bot
authored andcommitted
Use host-relative WebSocket URLs when launching new debugger
Summary: Changelog: [Internal] Uses the capability introduced in facebook/react-native-devtools-frontend#4 to avoid repeating the dev server's host:port in the `ws` / `wss` parameter we pass to the Chrome DevTools frontend. This gives us more flexibility to handle port forwarding and redirects outside of `dev-middleware`. This is mostly useful in Meta's internal VS Code remoting setup, but this particular change should work equally well in open source. Reviewed By: huntie Differential Revision: D54107316 fbshipit-source-id: 68d4dbf4849ca431274bfb0dc8a4e05981bdd5b5
1 parent 0f3018d commit 451fffb

File tree

3 files changed

+96
-46
lines changed

3 files changed

+96
-46
lines changed

packages/dev-middleware/src/__tests__/getDevToolsFrontendUrl-test.js

Lines changed: 57 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -14,16 +14,16 @@ import getDevToolsFrontendUrl from '../utils/getDevToolsFrontendUrl';
1414
describe('getDevToolsFrontendUrl', () => {
1515
const webSocketDebuggerUrl =
1616
'ws://localhost:8081/inspector/debug?device=1a9372c&page=-1';
17+
const devServerUrl = 'http://localhost:8081';
1718

18-
describe('given an absolute devServerUrl', () => {
19-
const devServerUrl = 'http://localhost:8081';
19+
const experiments = {
20+
enableNetworkInspector: false,
21+
enableNewDebugger: false,
22+
enableOpenDebuggerRedirect: false,
23+
};
2024

21-
it('should return a valid url for all experiments off', async () => {
22-
const experiments = {
23-
enableNetworkInspector: false,
24-
enableNewDebugger: false,
25-
enableOpenDebuggerRedirect: false,
26-
};
25+
describe('relative: false (default)', () => {
26+
test('should return a valid url for all experiments off', async () => {
2727
const actual = getDevToolsFrontendUrl(
2828
experiments,
2929
webSocketDebuggerUrl,
@@ -33,18 +33,13 @@ describe('getDevToolsFrontendUrl', () => {
3333
expect(url.host).toBe('localhost:8081');
3434
expect(url.pathname).toBe('/debugger-frontend/rn_inspector.html');
3535
expect(url.searchParams.get('ws')).toBe(
36-
'localhost:8081/inspector/debug?device=1a9372c&page=-1',
36+
'/inspector/debug?device=1a9372c&page=-1',
3737
);
3838
});
3939

40-
it('should return a valid url for enableNetworkInspector experiment on', async () => {
41-
const experiments = {
42-
enableNetworkInspector: true,
43-
enableNewDebugger: true,
44-
enableOpenDebuggerRedirect: false,
45-
};
40+
test('should return a valid url for enableNetworkInspector experiment on', async () => {
4641
const actual = getDevToolsFrontendUrl(
47-
experiments,
42+
{...experiments, enableNetworkInspector: true, enableNewDebugger: true},
4843
webSocketDebuggerUrl,
4944
devServerUrl,
5045
);
@@ -53,14 +48,26 @@ describe('getDevToolsFrontendUrl', () => {
5348
expect(url.pathname).toBe('/debugger-frontend/rn_inspector.html');
5449
expect(url.searchParams.get('unstable_enableNetworkPanel')).toBe('true');
5550
expect(url.searchParams.get('ws')).toBe(
56-
'localhost:8081/inspector/debug?device=1a9372c&page=-1',
51+
'/inspector/debug?device=1a9372c&page=-1',
5752
);
5853
});
59-
});
6054

61-
describe('given a relative devServerUrl', () => {
62-
const relativeDevServerUrl = '';
55+
test('should return a full WS URL if on a different host than the dev server', () => {
56+
const otherWebSocketDebuggerUrl =
57+
'ws://localhost:9000/inspector/debug?device=1a9372c&page=-1';
58+
const actual = getDevToolsFrontendUrl(
59+
experiments,
60+
otherWebSocketDebuggerUrl,
61+
devServerUrl,
62+
);
63+
const url = new URL(actual);
64+
expect(url.searchParams.get('ws')).toBe(
65+
'localhost:9000/inspector/debug?device=1a9372c&page=-1',
66+
);
67+
});
68+
});
6369

70+
describe('relative: true', () => {
6471
function assertValidRelativeURL(relativeURL: string): URL {
6572
const anyBaseURL = new URL('https://www.example.com');
6673
try {
@@ -71,40 +78,53 @@ describe('getDevToolsFrontendUrl', () => {
7178
}
7279
}
7380

74-
it('should return a valid url for all experiments off', async () => {
75-
const experiments = {
76-
enableNetworkInspector: false,
77-
enableNewDebugger: false,
78-
enableOpenDebuggerRedirect: false,
79-
};
81+
test('should return a valid url for all experiments off', async () => {
8082
const actual = getDevToolsFrontendUrl(
8183
experiments,
8284
webSocketDebuggerUrl,
83-
relativeDevServerUrl,
85+
devServerUrl,
86+
{
87+
relative: true,
88+
},
8489
);
8590
const url = assertValidRelativeURL(actual);
8691
expect(url.pathname).toBe('/debugger-frontend/rn_inspector.html');
8792
expect(url.searchParams.get('ws')).toBe(
88-
'localhost:8081/inspector/debug?device=1a9372c&page=-1',
93+
'/inspector/debug?device=1a9372c&page=-1',
8994
);
9095
});
9196

92-
it('should return a valid url for enableNetworkInspector experiment on', async () => {
93-
const experiments = {
94-
enableNetworkInspector: true,
95-
enableNewDebugger: true,
96-
enableOpenDebuggerRedirect: false,
97-
};
97+
test('should return a valid url for enableNetworkInspector experiment on', async () => {
9898
const actual = getDevToolsFrontendUrl(
99-
experiments,
99+
{...experiments, enableNetworkInspector: true, enableNewDebugger: true},
100100
webSocketDebuggerUrl,
101-
relativeDevServerUrl,
101+
devServerUrl,
102+
{
103+
relative: true,
104+
},
102105
);
103106
const url = assertValidRelativeURL(actual);
104107
expect(url.pathname).toBe('/debugger-frontend/rn_inspector.html');
105108
expect(url.searchParams.get('unstable_enableNetworkPanel')).toBe('true');
106109
expect(url.searchParams.get('ws')).toBe(
107-
'localhost:8081/inspector/debug?device=1a9372c&page=-1',
110+
'/inspector/debug?device=1a9372c&page=-1',
111+
);
112+
});
113+
114+
test('should return a full WS URL if on a different host than the dev server', () => {
115+
const otherWebSocketDebuggerUrl =
116+
'ws://localhost:8082/inspector/debug?device=1a9372c&page=-1';
117+
const actual = getDevToolsFrontendUrl(
118+
experiments,
119+
otherWebSocketDebuggerUrl,
120+
devServerUrl,
121+
{
122+
relative: true,
123+
},
124+
);
125+
const url = assertValidRelativeURL(actual);
126+
expect(url.searchParams.get('ws')).toBe(
127+
'localhost:8082/inspector/debug?device=1a9372c&page=-1',
108128
);
109129
});
110130
});

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

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,8 +132,8 @@ export default function openDebuggerMiddleware({
132132
Location: getDevToolsFrontendUrl(
133133
experiments,
134134
target.webSocketDebuggerUrl,
135-
// Use a relative URL.
136-
'',
135+
serverBaseUrl,
136+
{relative: true},
137137
),
138138
});
139139
res.end();

packages/dev-middleware/src/utils/getDevToolsFrontendUrl.js

Lines changed: 37 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -18,16 +18,21 @@ export default function getDevToolsFrontendUrl(
1818
experiments: Experiments,
1919
webSocketDebuggerUrl: string,
2020
devServerUrl: string,
21+
options?: $ReadOnly<{
22+
relative?: boolean,
23+
}>,
2124
): string {
22-
const scheme = new URL(webSocketDebuggerUrl).protocol.slice(0, -1);
23-
const webSocketUrlWithoutProtocol = webSocketDebuggerUrl.replace(
24-
/^wss?:\/\//,
25-
'',
26-
);
27-
const appUrl = `${devServerUrl}/debugger-frontend/rn_inspector.html`;
25+
const wsParam = getWsParam({
26+
webSocketDebuggerUrl,
27+
devServerUrl,
28+
});
29+
30+
const appUrl =
31+
(options?.relative === true ? '' : devServerUrl) +
32+
'/debugger-frontend/rn_inspector.html';
2833

2934
const searchParams = new URLSearchParams([
30-
[scheme, webSocketUrlWithoutProtocol],
35+
[wsParam.key, wsParam.value],
3136
['sources.hide_add_folder', 'true'],
3237
]);
3338
if (experiments.enableNetworkInspector) {
@@ -36,3 +41,28 @@ export default function getDevToolsFrontendUrl(
3641

3742
return appUrl + '?' + searchParams.toString();
3843
}
44+
45+
function getWsParam({
46+
webSocketDebuggerUrl,
47+
devServerUrl,
48+
}: $ReadOnly<{
49+
webSocketDebuggerUrl: string,
50+
devServerUrl: string,
51+
}>): {
52+
key: string,
53+
value: string,
54+
} {
55+
const wsUrl = new URL(webSocketDebuggerUrl);
56+
const serverHost = new URL(devServerUrl).host;
57+
let value;
58+
if (wsUrl.host === serverHost) {
59+
// Use a path-absolute (host-relative) URL
60+
// Depends on https://github.com/facebookexperimental/rn-chrome-devtools-frontend/pull/4
61+
value = wsUrl.pathname + wsUrl.search + wsUrl.hash;
62+
} else {
63+
// Standard URL format accepted by the DevTools frontend
64+
value = wsUrl.host + wsUrl.pathname + wsUrl.search + wsUrl.hash;
65+
}
66+
const key = wsUrl.protocol.slice(0, -1);
67+
return {key, value};
68+
}

0 commit comments

Comments
 (0)