diff options
-rw-r--r-- | cli/tests/unit/http_test.ts | 2 | ||||
-rw-r--r-- | extensions/http/01_http.js | 3 | ||||
-rw-r--r-- | extensions/websocket/01_websocket.js | 19 |
3 files changed, 15 insertions, 9 deletions
diff --git a/cli/tests/unit/http_test.ts b/cli/tests/unit/http_test.ts index ffd29ff86..4cdd84902 100644 --- a/cli/tests/unit/http_test.ts +++ b/cli/tests/unit/http_test.ts @@ -646,7 +646,7 @@ unitTest({ perms: { net: true } }, async function httpServerWebSocket() { socket.onerror = () => fail(); socket.onmessage = (m) => { socket.send(m.data); - socket.close(); + socket.close(1001); }; await respondWith(response); break; diff --git a/extensions/http/01_http.js b/extensions/http/01_http.js index b245383d8..3f8bcb3a8 100644 --- a/extensions/http/01_http.js +++ b/extensions/http/01_http.js @@ -17,7 +17,7 @@ const { BadResource, Interrupted } = core; const { ReadableStream } = window.__bootstrap.streams; const abortSignal = window.__bootstrap.abortSignal; - const { WebSocket, _rid, _readyState, _eventLoop, _protocol } = + const { WebSocket, _rid, _readyState, _eventLoop, _protocol, _server } = window.__bootstrap.webSocket; const { ArrayPrototypeIncludes, @@ -370,6 +370,7 @@ const socket = webidl.createBranded(WebSocket); setEventTargetData(socket); + socket[_server] = true; response[_ws] = socket; return { response, socket }; diff --git a/extensions/websocket/01_websocket.js b/extensions/websocket/01_websocket.js index 7caff579e..7af795197 100644 --- a/extensions/websocket/01_websocket.js +++ b/extensions/websocket/01_websocket.js @@ -125,6 +125,7 @@ const _binaryType = Symbol("[[binaryType]]"); const _bufferedAmount = Symbol("[[bufferedAmount]]"); const _eventLoop = Symbol("[[eventLoop]]"); + const _server = Symbol("[[server]]"); class WebSocket extends EventTarget { [_rid]; @@ -387,13 +388,16 @@ }); } - if ( - code !== undefined && !(code === 1000 || (3000 <= code && code < 5000)) - ) { - throw new DOMException( - "The close code must be either 1000 or in the range of 3000 to 4999.", - "InvalidAccessError", - ); + if (!this[_server]) { + if ( + code !== undefined && + !(code === 1000 || (3000 <= code && code < 5000)) + ) { + throw new DOMException( + "The close code must be either 1000 or in the range of 3000 to 4999.", + "InvalidAccessError", + ); + } } if (reason !== undefined && core.encode(reason).byteLength > 123) { @@ -525,5 +529,6 @@ _readyState, _eventLoop, _protocol, + _server, }; })(this); |