Skip to content
This repository was archived by the owner on Mar 13, 2025. It is now read-only.

Commit 67494da

Browse files
committed
Upgrade ws type definitions, test for invalid client close code
1 parent e83547e commit 67494da

File tree

6 files changed

+51
-21
lines changed

6 files changed

+51
-21
lines changed

package-lock.json

Lines changed: 14 additions & 10 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/http-server/src/index.ts

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ import {
1818
import { randomHex } from "@miniflare/shared";
1919
import { coupleWebSocket } from "@miniflare/web-sockets";
2020
import { BodyInit, Headers } from "undici";
21-
// @ts-expect-error ws's type definitions haven't been updated yet
2221
import StandardWebSocket, { WebSocketServer } from "ws";
2322
import { getAccessibleHosts } from "./helpers";
2423
import { HTTPPlugin, RequestMeta } from "./plugin";
@@ -364,7 +363,7 @@ export async function createServer<Plugins extends HTTPPluginSignatures>(
364363
const { pathname } = new URL(request.url ?? "", "http://localhost");
365364
const server =
366365
pathname === "/cdn-cgi/mf/reload" ? liveReloadServer : webSocketServer;
367-
server.handleUpgrade(request, socket, head, (ws: StandardWebSocket) =>
366+
server.handleUpgrade(request, socket as any, head, (ws) =>
368367
server.emit("connection", ws, request)
369368
);
370369
});

packages/http-server/test/index.spec.ts

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,7 @@ import {
3232
} from "@miniflare/shared-test";
3333
import { MessageEvent, WebSocketPlugin } from "@miniflare/web-sockets";
3434
import test, { ExecutionContext, Macro } from "ava";
35-
import StandardWebSocket from "ws";
35+
import StandardWebSocket, { Data, Event as WebSocketEvent } from "ws";
3636

3737
function listen(
3838
t: ExecutionContext,
@@ -502,7 +502,7 @@ test("createServer: handles web socket upgrades", async (t) => {
502502
const port = await listen(t, await createServer(mf));
503503

504504
const ws = new StandardWebSocket(`ws://localhost:${port}`);
505-
const [eventTrigger, eventPromise] = triggerPromise<string>();
505+
const [eventTrigger, eventPromise] = triggerPromise<Data>();
506506
ws.addEventListener("message", (e) => {
507507
eventTrigger(e.data);
508508
});
@@ -546,7 +546,7 @@ test("createServer: notifies connected live reload clients on reload", async (t)
546546

547547
const port = await listen(t, await createServer(mf));
548548
const ws = new StandardWebSocket(`ws://localhost:${port}/cdn-cgi/mf/reload`);
549-
const [openTrigger, openPromise] = triggerPromise<void>();
549+
const [openTrigger, openPromise] = triggerPromise<WebSocketEvent>();
550550
ws.addEventListener("open", openTrigger);
551551
let receivedClose = false;
552552
const [closeTrigger, closePromise] = triggerPromise<void>();

packages/shared-test/src/http.ts

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,6 @@ import http from "http";
22
import { AddressInfo } from "net";
33
import { URL } from "url";
44
import { ExecutionContext } from "ava";
5-
// @ts-expect-error ws's type definitions haven't been updated yet
65
import StandardWebSocket, { WebSocketServer } from "ws";
76

87
export async function useServer(

packages/web-sockets/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,6 @@
4343
},
4444
"devDependencies": {
4545
"@miniflare/shared-test": "2.0.0-next.3",
46-
"@types/ws": "^7.4.7"
46+
"@types/ws": "^8.2.0"
4747
}
4848
}

packages/web-sockets/test/couple.spec.ts

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
import assert from "assert";
2+
import http from "http";
3+
import { AddressInfo } from "net";
24
import { viewToBuffer } from "@miniflare/shared";
35
import {
46
noop,
@@ -10,7 +12,10 @@ import {
1012
import { WebSocketPair, coupleWebSocket } from "@miniflare/web-sockets";
1113
import { CloseEvent, MessageEvent } from "@miniflare/web-sockets";
1214
import test from "ava";
13-
import StandardWebSocket from "ws";
15+
import StandardWebSocket, {
16+
Event as WebSocketEvent,
17+
WebSocketServer,
18+
} from "ws";
1419

1520
test("coupleWebSocket: throws if already coupled", async (t) => {
1621
const server = await useServer(t, noop, (ws) => ws.send("test"));
@@ -97,7 +102,30 @@ test("coupleWebSocket: closes worker socket on client close", async (t) => {
97102
t.is(event.code, 1000);
98103
t.is(event.reason, "Test Closure");
99104
});
100-
// TODO: add test for invalid WebSocket close code
105+
test("coupleWebSocket: closes worker socket with invalid client close code", async (t) => {
106+
const server = http.createServer();
107+
const wss = new WebSocketServer({ server });
108+
wss.on("connection", (ws) => {
109+
// Close WebSocket without code, defaults to 1005 (No Status Received)
110+
// which would be an invalid code if passed normally
111+
ws.close();
112+
});
113+
const port = await new Promise<number>((resolve) => {
114+
server.listen(0, () => {
115+
resolve((server.address() as AddressInfo).port);
116+
});
117+
});
118+
const ws = new StandardWebSocket(`ws://localhost:${port}`);
119+
const [client, worker] = Object.values(new WebSocketPair());
120+
121+
const [eventTrigger, eventPromise] = triggerPromise<CloseEvent>();
122+
worker.addEventListener("close", eventTrigger);
123+
worker.accept();
124+
await coupleWebSocket(ws, client);
125+
126+
const event = await eventPromise;
127+
t.is(event.code, 1005);
128+
});
101129

102130
test("coupleWebSocket: forwards messages from worker to client before coupling", async (t) => {
103131
const [eventTrigger, eventPromise] = triggerPromise<{ data: any }>();
@@ -177,7 +205,7 @@ test("coupleWebSocket: accepts worker socket immediately if already open", async
177205
// Send before coupling, simulates sending message in worker code before returning response
178206
worker.send("test");
179207
// Make sure socket is open before terminating
180-
const [openTrigger, openPromise] = triggerPromise<void>();
208+
const [openTrigger, openPromise] = triggerPromise<WebSocketEvent>();
181209
ws.addEventListener("open", openTrigger);
182210
await openPromise;
183211
await coupleWebSocket(ws, client);
@@ -192,7 +220,7 @@ test("coupleWebSocket: throws if web socket already closed", async (t) => {
192220

193221
worker.accept();
194222
// Make sure socket is open before closing
195-
const [openTrigger, openPromise] = triggerPromise<void>();
223+
const [openTrigger, openPromise] = triggerPromise<WebSocketEvent>();
196224
ws.addEventListener("open", openTrigger);
197225
await openPromise;
198226
// Make sure socket is closed before terminating

0 commit comments

Comments
 (0)