fix(ext/websockets): ensure we fully send frames before close (#19484)

Fixes #19483
This commit is contained in:
Matt Mastracci 2023-06-13 11:16:17 -06:00 committed by GitHub
parent ceb03cfb03
commit 72da18dd47
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 81 additions and 10 deletions

View file

@ -100,7 +100,7 @@ Deno.test(
promise.resolve();
};
await Promise.all([promise, server]);
await Promise.all([promise, server.finished]);
ws.close();
},
);
@ -145,7 +145,57 @@ Deno.test({
ws.onclose = () => {
promise.resolve();
};
await Promise.all([promise, server]);
await Promise.all([promise, server.finished]);
});
// https://github.com/denoland/deno/issues/19483
Deno.test({
sanitizeOps: false,
sanitizeResources: false,
}, async function websocketCloseFlushes() {
const promise = deferred();
const ac = new AbortController();
const listeningPromise = deferred();
const server = Deno.serve({
handler: (req) => {
const { response, socket } = Deno.upgradeWebSocket(req);
socket.onopen = () => socket.send("Hello");
socket.onmessage = () => {
socket.send("Bye");
socket.close();
};
socket.onclose = () => ac.abort();
socket.onerror = () => fail();
return response;
},
signal: ac.signal,
onListen: () => listeningPromise.resolve(),
hostname: "localhost",
port: 4247,
});
await listeningPromise;
const ws = new WebSocket("ws://localhost:4247/");
assertEquals(ws.url, "ws://localhost:4247/");
let seenBye = false;
ws.onerror = () => fail();
ws.onmessage = ({ data }) => {
if (data == "Hello") {
ws.send("Hello!");
} else {
assertEquals(data, "Bye");
seenBye = true;
}
};
ws.onclose = () => {
promise.resolve();
};
await Promise.all([promise, server.finished]);
assert(seenBye);
});
Deno.test(