aboutsummaryrefslogtreecommitdiff
path: root/test/bun.js/websocket-server.test.ts
diff options
context:
space:
mode:
authorGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2022-10-19 19:53:39 -0700
committerGravatar Jarred Sumner <709451+Jarred-Sumner@users.noreply.github.com> 2022-10-19 19:54:20 -0700
commit9f16906499c812eb82a982307511c454dec769ed (patch)
tree24cf24fc200b80c5d17b8ef57249bf9adefd6623 /test/bun.js/websocket-server.test.ts
parent605c4297700faa9c03bf29b55bee464c7706cbc8 (diff)
downloadbun-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.ts63
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({