Files
bun.sh/test/js/node/tls/node-tls-upgrade.test.ts

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();
});