11import assert from "assert" ;
2+ import http from "http" ;
3+ import { AddressInfo } from "net" ;
24import { viewToBuffer } from "@miniflare/shared" ;
35import {
46 noop ,
@@ -10,7 +12,10 @@ import {
1012import { WebSocketPair , coupleWebSocket } from "@miniflare/web-sockets" ;
1113import { CloseEvent , MessageEvent } from "@miniflare/web-sockets" ;
1214import test from "ava" ;
13- import StandardWebSocket from "ws" ;
15+ import StandardWebSocket , {
16+ Event as WebSocketEvent ,
17+ WebSocketServer ,
18+ } from "ws" ;
1419
1520test ( "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
102130test ( "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