Files
bun.sh/test/js/node/tls/node-tls-namedpipes.test.ts
2025-05-28 17:04:37 -07:00

95 lines
3.4 KiB
TypeScript

import { expect, it } from "bun:test";
import { expectMaxObjectTypeCount, isWindows, tls } from "harness";
import { randomUUID } from "node:crypto";
import { once } from "node:events";
import net from "node:net";
import { connect, createServer } from "node:tls";
it.if(isWindows)("should work with named pipes and tls", async () => {
await expectMaxObjectTypeCount(expect, "TLSSocket", 0);
async function test(pipe_name: string) {
const { promise: messageReceived, resolve: resolveMessageReceived } = Promise.withResolvers();
const { promise: clientReceived, resolve: resolveClientReceived } = Promise.withResolvers();
let client: ReturnType<typeof connect> | null = null;
let server: ReturnType<typeof createServer> | null = null;
try {
server = createServer(tls, socket => {
socket.on("data", data => {
const message = data.toString();
socket.write("Goodbye World!");
resolveMessageReceived(message);
});
});
server.listen(pipe_name);
await once(server, "listening");
client = connect({ path: pipe_name, ca: tls.cert }).on("data", data => {
const message = data.toString();
resolveClientReceived(message);
});
client?.write("Hello World!");
const message = await messageReceived;
expect(message).toBe("Hello World!");
const client_message = await clientReceived;
expect(client_message).toBe("Goodbye World!");
} finally {
client?.destroy();
server?.close();
}
}
const batch: Promise<void>[] = [];
for (let i = 0; i < 200; i++) {
batch.push(test(`\\\\.\\pipe\\test\\${randomUUID()}`));
batch.push(test(`\\\\?\\pipe\\test\\${randomUUID()}`));
if (i % 50 === 0) {
await Promise.all(batch);
batch.length = 0;
}
}
await Promise.all(batch);
await expectMaxObjectTypeCount(expect, "TLSSocket", 2);
});
it.if(isWindows)("should be able to upgrade a named pipe connection to TLS", async () => {
await expectMaxObjectTypeCount(expect, "TLSSocket", 2);
const { promise: messageReceived, resolve: resolveMessageReceived } = Promise.withResolvers();
const { promise: clientReceived, resolve: resolveClientReceived } = Promise.withResolvers();
let client: ReturnType<typeof net.connect> | ReturnType<typeof connect> | null = null;
let server: ReturnType<typeof createServer> | null = null;
async function test(pipe_name: string) {
try {
server = createServer(tls, socket => {
socket.on("data", data => {
const message = data.toString();
socket.write("Goodbye World!");
resolveMessageReceived(message);
});
});
server.listen(pipe_name);
await once(server, "listening");
const nonTLSClient = net.connect(pipe_name);
client = connect({ socket: nonTLSClient, ca: tls.cert }).on("data", data => {
const message = data.toString();
resolveClientReceived(message);
});
await once(client, "secureConnect");
client?.write("Hello World!");
const message = await messageReceived;
expect(message).toBe("Hello World!");
const client_message = await clientReceived;
expect(client_message).toBe("Goodbye World!");
} finally {
client?.destroy();
server?.close();
}
}
await test(`\\\\.\\pipe\\test\\${randomUUID()}`);
await expectMaxObjectTypeCount(expect, "TLSSocket", 3);
});