@@ -34,6 +34,8 @@ const kPair = Symbol("kPair");
3434export const kAccepted = Symbol ( "kAccepted" ) ;
3535export const kCoupled = Symbol ( "kCoupled" ) ;
3636export const kClosed = Symbol ( "kClosed" ) ;
37+ // Internal close method exposed to bypass close code checking
38+ export const kClose = Symbol ( "kClose" ) ;
3739
3840export type WebSocketEventMap = {
3941 message : MessageEvent ;
@@ -91,13 +93,6 @@ export class WebSocket extends InputGatedEventTarget<WebSocketEventMap> {
9193 }
9294
9395 close ( code ?: number , reason ?: string ) : void {
94- const pair = this [ kPair ] ;
95- if ( ! this [ kAccepted ] ) {
96- throw new TypeError (
97- "You must call accept() on this WebSocket before sending messages."
98- ) ;
99- }
100- if ( this [ kClosed ] ) throw new TypeError ( "WebSocket already closed" ) ;
10196 if ( code ) {
10297 // https://developer.mozilla.org/en-US/docs/Web/API/CloseEvent/code
10398 const validCode =
@@ -114,9 +109,20 @@ export class WebSocket extends InputGatedEventTarget<WebSocketEventMap> {
114109 "If you specify a WebSocket close reason, you must also specify a code."
115110 ) ;
116111 }
112+ this [ kClose ] ( code , reason ) ;
113+ }
117114
115+ [ kClose ] ( code ?: number , reason ?: string ) : void {
116+ // Split from close() so we don't check the close code when forwarding close
117+ // events from the client
118+ if ( ! this [ kAccepted ] ) {
119+ throw new TypeError (
120+ "You must call accept() on this WebSocket before sending messages."
121+ ) ;
122+ }
123+ if ( this [ kClosed ] ) throw new TypeError ( "WebSocket already closed" ) ;
118124 this [ kClosed ] = true ;
119- pair [ kClosed ] = true ;
125+ this [ kPair ] [ kClosed ] = true ;
120126 void this . #dispatchCloseEvent( code , reason ) ;
121127 }
122128
0 commit comments