diff options
author | 2022-10-19 19:53:39 -0700 | |
---|---|---|
committer | 2022-10-19 19:54:20 -0700 | |
commit | 9f16906499c812eb82a982307511c454dec769ed (patch) | |
tree | 24cf24fc200b80c5d17b8ef57249bf9adefd6623 /test/bun.js/websocket-server.test.ts | |
parent | 605c4297700faa9c03bf29b55bee464c7706cbc8 (diff) | |
download | bun-9f16906499c812eb82a982307511c454dec769ed.tar.gz bun-9f16906499c812eb82a982307511c454dec769ed.tar.zst bun-9f16906499c812eb82a982307511c454dec769ed.zip |
Fix calling `ws.publish` inside `close` when other clients are connected
This fixes https://github.com/oven-sh/bun/issues/1357
Diffstat (limited to 'test/bun.js/websocket-server.test.ts')
-rw-r--r-- | test/bun.js/websocket-server.test.ts | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/test/bun.js/websocket-server.test.ts b/test/bun.js/websocket-server.test.ts index eed5ffdc4..7c7869fad 100644 --- a/test/bun.js/websocket-server.test.ts +++ b/test/bun.js/websocket-server.test.ts @@ -12,6 +12,69 @@ function getPort() { } describe("websocket server", () => { + for (let method of ["publish", "publishText", "publishBinary"]) { + describe(method, () => { + it("in close() should work", async () => { + var server = serve({ + port: getPort(), + websocket: { + open(ws) { + ws.subscribe("all"); + }, + message(ws, msg) {}, + close(ws) { + ws[method]( + "all", + method === "publishBinary" ? Buffer.from("bye!") : "bye!" + ); + }, + }, + fetch(req, server) { + if (server.upgrade(req)) { + return; + } + + return new Response("success"); + }, + }); + + try { + const first = await new Promise((resolve2, reject2) => { + var socket = new WebSocket( + `ws://${server.hostname}:${server.port}` + ); + socket.onopen = () => resolve2(socket); + }); + + const second = await new Promise((resolve2, reject2) => { + var socket = new WebSocket( + `ws://${server.hostname}:${server.port}` + ); + socket.onmessage = (ev) => { + var msg = ev.data; + if (typeof msg !== "string") { + msg = new TextDecoder().decode(msg); + } + if (msg === "bye!") { + resolve2(socket); + } else { + reject2(msg); + } + }; + socket.onopen = () => { + first.close(); + }; + }); + + second.close(); + } catch (r) { + } finally { + server.stop(); + } + }); + }); + } + it("close inside open", async () => { var resolve; var server = serve({ |