mirror of
https://github.com/oven-sh/bun
synced 2026-02-09 10:28:47 +00:00
63 lines
1.5 KiB
TypeScript
63 lines
1.5 KiB
TypeScript
import { expect, test } from "bun:test";
|
|
import { once } from "events";
|
|
import { tls as certs } from "harness";
|
|
import net from "net";
|
|
import tls from "tls";
|
|
|
|
test("should be able to upgrade a paused socket and also have backpressure on it #15438", async () => {
|
|
// enought to trigger backpressure
|
|
const payload = Buffer.alloc(16 * 1024 * 4, "b").toString("utf8");
|
|
|
|
const server = tls.createServer(certs, socket => {
|
|
// echo
|
|
socket.on("data", data => {
|
|
socket.write(data);
|
|
});
|
|
});
|
|
|
|
await once(server.listen(0, "127.0.0.1"), "listening");
|
|
|
|
const socket = net.connect({
|
|
port: (server.address() as net.AddressInfo).port,
|
|
host: "127.0.0.1",
|
|
});
|
|
await once(socket, "connect");
|
|
|
|
// pause raw socket
|
|
socket.pause();
|
|
|
|
const tlsSocket = tls.connect({
|
|
ca: certs.cert,
|
|
servername: "localhost",
|
|
socket,
|
|
});
|
|
await once(tlsSocket, "secureConnect");
|
|
|
|
// do http request using tls socket
|
|
async function doWrite(socket: net.Socket) {
|
|
let downloadedBody = 0;
|
|
const { promise, resolve, reject } = Promise.withResolvers();
|
|
function onData(data: Buffer) {
|
|
downloadedBody += data.byteLength;
|
|
if (downloadedBody === payload.length * 2) {
|
|
resolve();
|
|
}
|
|
}
|
|
socket.pause();
|
|
socket.write(payload);
|
|
socket.write(payload, () => {
|
|
socket.on("data", onData);
|
|
socket.resume();
|
|
});
|
|
|
|
await promise;
|
|
socket.off("data", onData);
|
|
}
|
|
for (let i = 0; i < 100; i++) {
|
|
// upgrade the tlsSocket
|
|
await doWrite(tlsSocket);
|
|
}
|
|
|
|
expect().pass();
|
|
});
|