From 6db631a432ee916380b62770357adb46edd7c281 Mon Sep 17 00:00:00 2001 From: Divy Srivastava Date: Tue, 9 Jan 2024 19:56:54 +0530 Subject: fix(ext/websocket): pass on uncaught errors in idleTimeout (#21846) Fixes https://github.com/denoland/deno/issues/21840 The problem was hard to reproduce as its a race condition. I've added a test that reproduces the problem 1/10 tries. We should move the idleTimeout handling to Rust (maybe even built into fastwebsocket). --- cli/tests/unit/websocket_test.ts | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) (limited to 'cli/tests/unit') diff --git a/cli/tests/unit/websocket_test.ts b/cli/tests/unit/websocket_test.ts index 47d056492..6a1dc3525 100644 --- a/cli/tests/unit/websocket_test.ts +++ b/cli/tests/unit/websocket_test.ts @@ -405,3 +405,33 @@ Deno.test( await Promise.all([deferred.promise, server.finished]); }, ); + +Deno.test( + { sanitizeOps: false }, + async function websocketServerGetsGhosted() { + const ac = new AbortController(); + const listeningDeferred = Promise.withResolvers(); + + const server = Deno.serve({ + handler: (req) => { + const { socket, response } = Deno.upgradeWebSocket(req, { + idleTimeout: 2, + }); + socket.onerror = () => socket.close(); + socket.onclose = () => ac.abort(); + return response; + }, + signal: ac.signal, + onListen: () => listeningDeferred.resolve(), + hostname: "localhost", + port: servePort, + }); + + await listeningDeferred.promise; + const r = await fetch("http://localhost:4545/ghost_ws_client"); + assertEquals(r.status, 200); + await r.body?.cancel(); + + await server.finished; + }, +); -- cgit v1.2.3