diff --git a/src/js/node/net.ts b/src/js/node/net.ts index c545bbe742ff..19d73d4178b9 100644 --- a/src/js/node/net.ts +++ b/src/js/node/net.ts @@ -138,6 +138,7 @@ const kAttach = Symbol("kAttach"); const kCloseRawConnection = Symbol("kCloseRawConnection"); const kpendingRead = Symbol("kpendingRead"); const kupgraded = Symbol("kupgraded"); +const kupgradeDuplexFeeder = Symbol("kupgradeDuplexFeeder"); const ksocket = Symbol("ksocket"); const khandlers = Symbol("khandlers"); const kclosed = Symbol("closed"); @@ -1021,6 +1022,14 @@ const SocketHandlers2: SocketHandler { + const { promise: messageReceived, resolve: resolveMessageReceived } = Promise.withResolvers(); + const { promise: clientReceived, resolve: resolveClientReceived } = Promise.withResolvers(); + const { promise: done, resolve: resolveDone, reject: rejectDone } = Promise.withResolvers(); + + let client: ReturnType | null = null; + let nonTLSClient: ReturnType | null = null; + let server: ReturnType | null = null; + + const leakedToOriginal: Buffer[] = []; + + const pipe_name = `\\\\.\\pipe\\test\\${randomUUID()}`; + try { + server = createServer(tls, socket => { + socket.on("error", rejectDone); + socket.on("data", data => { + socket.write("Goodbye World!"); + resolveMessageReceived(data.toString()); + }); + }); + server.on("error", rejectDone); + + server.listen(pipe_name); + await once(server, "listening"); + + nonTLSClient = net.connect(pipe_name); + nonTLSClient.on("error", rejectDone); + nonTLSClient.on("data", chunk => { + leakedToOriginal.push(chunk); + }); + + client = connect({ socket: nonTLSClient, ca: tls.cert }); + client.on("error", rejectDone); + client.on("data", data => { + resolveClientReceived(data.toString()); + }); + + await Promise.race([once(client, "secureConnect"), done]); + client.write("Hello World!"); + + expect(await Promise.race([messageReceived, done])).toBe("Hello World!"); + expect(await Promise.race([clientReceived, done])).toBe("Goodbye World!"); + + expect(Buffer.concat(leakedToOriginal).length).toBe(0); + resolveDone(); + await done; + } finally { + client?.destroy(); + nonTLSClient?.destroy(); + server?.close(); + } +});