Skip to content

Commit e110166

Browse files
committed
feat(dev): use the same port for dev ready messages and websocket
1 parent 43adafb commit e110166

File tree

7 files changed

+39
-66
lines changed

7 files changed

+39
-66
lines changed

integration/hmr-log-test.ts

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,7 @@ import { createFixtureProject, css, js, json } from "./helpers/create-fixture";
99

1010
test.setTimeout(120_000);
1111

12-
let fixture = (options: {
13-
appServerPort: number;
14-
httpPort: number;
15-
webSocketPort: number;
16-
}) => ({
12+
let fixture = (options: { appServerPort: number; httpPort: number }) => ({
1713
files: {
1814
"remix.config.js": js`
1915
module.exports = {
@@ -22,7 +18,6 @@ let fixture = (options: {
2218
future: {
2319
unstable_dev: {
2420
httpPort: ${options.httpPort},
25-
webSocketPort: ${options.webSocketPort},
2621
},
2722
v2_routeConvention: true,
2823
v2_errorBoundary: true,
@@ -252,9 +247,8 @@ test("HMR", async ({ page }) => {
252247
let portRange = makeRange(4080, 4099);
253248
let appServerPort = await getPort({ port: portRange });
254249
let httpPort = await getPort({ port: portRange });
255-
let webSocketPort = await getPort({ port: portRange });
256250
let projectDir = await createFixtureProject(
257-
fixture({ appServerPort, httpPort, webSocketPort })
251+
fixture({ appServerPort, httpPort })
258252
);
259253

260254
// spin up dev server

integration/hmr-test.ts

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -9,11 +9,7 @@ import { createFixtureProject, css, js, json } from "./helpers/create-fixture";
99

1010
test.setTimeout(120_000);
1111

12-
let fixture = (options: {
13-
appServerPort: number;
14-
httpPort: number;
15-
webSocketPort: number;
16-
}) => ({
12+
let fixture = (options: { appServerPort: number; httpPort: number }) => ({
1713
files: {
1814
"remix.config.js": js`
1915
module.exports = {
@@ -22,7 +18,6 @@ let fixture = (options: {
2218
future: {
2319
unstable_dev: {
2420
httpPort: ${options.httpPort},
25-
webSocketPort: ${options.webSocketPort},
2621
},
2722
v2_routeConvention: true,
2823
v2_errorBoundary: true,
@@ -250,9 +245,8 @@ test("HMR", async ({ page }) => {
250245
let portRange = makeRange(3080, 3099);
251246
let appServerPort = await getPort({ port: portRange });
252247
let httpPort = await getPort({ port: portRange });
253-
let webSocketPort = await getPort({ port: portRange });
254248
let projectDir = await createFixtureProject(
255-
fixture({ appServerPort, httpPort, webSocketPort })
249+
fixture({ appServerPort, httpPort })
256250
);
257251

258252
// spin up dev server

packages/remix-dev/__tests__/cli-test.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,6 @@ describe("remix CLI", () => {
122122
--http-host HTTP(S) host for the dev server. Default: localhost
123123
--http-port HTTP(S) port for the dev server. Default: any open port
124124
--no-restart Do not restart the app server when rebuilds occur.
125-
--websocket-port WebSocket port for the dev server. Default: any open port
126125
\`init\` Options:
127126
--no-delete Skip deleting the \`remix.init\` script
128127
\`routes\` Options:

packages/remix-dev/cli/commands.ts

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ export async function build(
183183
host: dev.httpHost,
184184
port: dev.httpPort,
185185
};
186-
options.devWebSocketPort = dev.webSocketPort;
186+
options.devWebSocketPort = dev.httpPort;
187187
}
188188

189189
fse.emptyDirSync(config.assetsBuildDirectory);
@@ -224,7 +224,6 @@ export async function dev(
224224
httpHost?: string;
225225
httpPort?: number;
226226
restart?: boolean;
227-
websocketPort?: number;
228227
} = {}
229228
) {
230229
if (process.env.NODE_ENV && process.env.NODE_ENV !== "development") {
@@ -477,7 +476,6 @@ type DevBuildFlags = {
477476
httpScheme: string;
478477
httpHost: string;
479478
httpPort: number;
480-
webSocketPort: number;
481479
};
482480
let resolveDevBuild = async (
483481
config: RemixConfig,
@@ -501,17 +499,11 @@ let resolveDevBuild = async (
501499
flags.httpPort ??
502500
(dev === true ? undefined : dev.httpPort) ??
503501
(await findPort());
504-
// prettier-ignore
505-
let webSocketPort =
506-
flags.webSocketPort ??
507-
(dev === true ? undefined : dev.webSocketPort) ??
508-
(await findPort());
509502

510503
return {
511504
httpScheme,
512505
httpHost,
513506
httpPort,
514-
webSocketPort,
515507
};
516508
};
517509

@@ -526,10 +518,7 @@ let resolveDevServe = async (
526518
let dev = config.future.unstable_dev;
527519
if (dev === false) throw Error("Cannot resolve dev options");
528520

529-
let { httpScheme, httpHost, httpPort, webSocketPort } = await resolveDevBuild(
530-
config,
531-
flags
532-
);
521+
let { httpScheme, httpHost, httpPort } = await resolveDevBuild(config, flags);
533522

534523
// prettier-ignore
535524
let command =
@@ -563,7 +552,6 @@ let resolveDevServe = async (
563552
httpScheme,
564553
httpHost,
565554
httpPort,
566-
webSocketPort,
567555
restart,
568556
};
569557
};

packages/remix-dev/cli/run.ts

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,6 @@ ${colors.logoBlue("R")} ${colors.logoGreen("E")} ${colors.logoYellow(
4848
--http-host HTTP(S) host for the dev server. Default: localhost
4949
--http-port HTTP(S) port for the dev server. Default: any open port
5050
--no-restart Do not restart the app server when rebuilds occur.
51-
--websocket-port WebSocket port for the dev server. Default: any open port
5251
\`init\` Options:
5352
--no-delete Skip deleting the \`remix.init\` script
5453
\`routes\` Options:
@@ -188,7 +187,6 @@ export async function run(argv: string[] = process.argv.slice(2)) {
188187
"--http-host": String,
189188
"--http-port": Number,
190189
"--no-restart": Boolean,
191-
"--websocket-port": Number,
192190
},
193191
{
194192
argv,
@@ -225,10 +223,6 @@ export async function run(argv: string[] = process.argv.slice(2)) {
225223
flags.httpPort = flags["http-port"];
226224
delete flags["http-port"];
227225
}
228-
if (flags["websocket-port"]) {
229-
flags.webSocketPort = flags["websocket-port"];
230-
delete flags["websocket-port"];
231-
}
232226

233227
if (args["--no-delete"]) {
234228
flags.delete = false;

packages/remix-dev/devServer_unstable/index.ts

Lines changed: 30 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import * as path from "node:path";
22
import * as stream from "node:stream";
3+
import * as http from "node:http";
34
import fs from "fs-extra";
45
import prettyMs from "pretty-ms";
56
import execa from "execa";
@@ -44,18 +45,10 @@ export let serve = async (
4445
httpScheme: string;
4546
httpHost: string;
4647
httpPort: number;
47-
webSocketPort: number;
4848
restart: boolean;
4949
}
5050
) => {
5151
await loadEnv(initialConfig.rootDirectory);
52-
let websocket = Socket.serve({ port: options.webSocketPort });
53-
let httpOrigin: Origin = {
54-
scheme: options.httpScheme,
55-
host: options.httpHost,
56-
port: options.httpPort,
57-
};
58-
5952
let state: {
6053
appServer?: execa.ExecaChildProcess;
6154
manifest?: Manifest;
@@ -65,6 +58,30 @@ export let serve = async (
6558
prevLoaderHashes?: Record<string, string>;
6659
} = {};
6760

61+
let app = express()
62+
// handle `broadcastDevReady` messages
63+
.use(express.json())
64+
.post("/ping", (req, res) => {
65+
let { buildHash } = req.body;
66+
if (typeof buildHash !== "string") {
67+
console.warn(`Unrecognized payload: ${req.body}`);
68+
res.sendStatus(400);
69+
}
70+
if (buildHash === state.manifest?.version) {
71+
state.appReady?.ok();
72+
}
73+
res.sendStatus(200);
74+
});
75+
76+
let server = http.createServer(app);
77+
let websocket = Socket.serve(server);
78+
79+
let httpOrigin: Origin = {
80+
scheme: options.httpScheme,
81+
host: options.httpHost,
82+
port: options.httpPort,
83+
};
84+
6885
let bin = await detectBin();
6986
let startAppServer = (command: string) => {
7087
console.log(`> ${command}`);
@@ -119,7 +136,7 @@ export let serve = async (
119136
sourcemap: true,
120137
onWarning: warnOnce,
121138
devHttpOrigin: httpOrigin,
122-
devWebSocketPort: options.webSocketPort,
139+
devWebSocketPort: options.httpPort,
123140
},
124141
},
125142
{
@@ -198,28 +215,14 @@ export let serve = async (
198215
}
199216
);
200217

201-
let httpServer = express()
202-
// handle `broadcastDevReady` messages
203-
.use(express.json())
204-
.post("/ping", (req, res) => {
205-
let { buildHash } = req.body;
206-
if (typeof buildHash !== "string") {
207-
console.warn(`Unrecognized payload: ${req.body}`);
208-
res.sendStatus(400);
209-
}
210-
if (buildHash === state.manifest?.version) {
211-
state.appReady?.ok();
212-
}
213-
res.sendStatus(200);
214-
})
215-
.listen(httpOrigin.port, () => {
216-
console.log("Remix dev server ready");
217-
});
218+
server.listen(httpOrigin.port, () => {
219+
console.log("Remix dev server ready");
220+
});
218221

219222
return new Promise(() => {}).finally(async () => {
220223
await kill(state.appServer);
221224
websocket.close();
222-
httpServer.close();
225+
server.close();
223226
await dispose();
224227
});
225228
};

packages/remix-dev/devServer_unstable/socket.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import WebSocket from "ws";
2+
import type { Server as HTTPServer } from "http";
23

34
import { type Manifest } from "../manifest";
45
import type * as HMR from "./hmr";
@@ -14,8 +15,8 @@ type Message =
1415

1516
type Broadcast = (message: Message) => void;
1617

17-
export let serve = (options: { port: number }) => {
18-
let wss = new WebSocket.Server({ port: options.port });
18+
export let serve = (server: HTTPServer) => {
19+
let wss = new WebSocket.Server({ server });
1920

2021
let broadcast: Broadcast = (message) => {
2122
wss.clients.forEach((client) => {

0 commit comments

Comments
 (0)