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 | null = null; let server: ReturnType | 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[] = []; 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 | ReturnType | null = null; let server: ReturnType | 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); });