From 7bfcc2c9e357409cd52dabf256ff0a51a7322895 Mon Sep 17 00:00:00 2001 From: Georgijs <48869301+gvilums@users.noreply.github.com> Date: Sat, 4 May 2024 20:35:28 -0700 Subject: [PATCH] support onread in net (#10753) Co-authored-by: Georgijs Vilums <=> Co-authored-by: gvilums Co-authored-by: Jarred Sumner --- src/js/node/net.ts | 33 +++++++++++++++++++++++++------ test/js/node/net/node-net.test.ts | 30 ++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+), 6 deletions(-) diff --git a/src/js/node/net.ts b/src/js/node/net.ts index e44733f3e5..25e8147fc5 100644 --- a/src/js/node/net.ts +++ b/src/js/node/net.ts @@ -342,9 +342,10 @@ const Socket = (function (InternalSocket) { pauseOnConnect = false; #upgraded; #unrefOnConnected = false; + #handlers = Socket.#Handlers; constructor(options) { - const { socket, signal, write, read, allowHalfOpen = false, ...opts } = options || {}; + const { socket, signal, write, read, allowHalfOpen = false, onread = null, ...opts } = options || {}; super({ ...opts, allowHalfOpen, @@ -359,6 +360,26 @@ const Socket = (function (InternalSocket) { if (socket instanceof Socket) { this.#socket = socket; } + if (onread) { + if (typeof onread !== "object") { + throw new TypeError("onread must be an object"); + } + if (typeof onread.callback !== "function") { + throw new TypeError("onread.callback must be a function"); + } + // when the onread option is specified we use a different handlers object + this.#handlers = { + ...Socket.#Handlers, + data({ data: self }, buffer) { + if (!self) return; + try { + onread.callback(buffer.length, buffer); + } catch (e) { + self.emit("error", e); + } + }, + }; + } if (signal) { signal.addEventListener("abort", () => this.destroy()); @@ -454,7 +475,7 @@ const Socket = (function (InternalSocket) { bunConnect({ data: this, fd, - socket: Socket.#Handlers, + socket: this.#handlers, tls, }).catch(error => { this.emit("error", error); @@ -529,7 +550,7 @@ const Socket = (function (InternalSocket) { const result = socket.upgradeTLS({ data: this, tls, - socket: Socket.#Handlers, + socket: this.#handlers, }); if (result) { const [raw, tls] = result; @@ -554,7 +575,7 @@ const Socket = (function (InternalSocket) { const result = socket.upgradeTLS({ data: this, tls, - socket: Socket.#Handlers, + socket: this.#handlers, }); if (result) { @@ -576,7 +597,7 @@ const Socket = (function (InternalSocket) { bunConnect({ data: this, unix: path, - socket: Socket.#Handlers, + socket: this.#handlers, tls, }).catch(error => { this.emit("error", error); @@ -588,7 +609,7 @@ const Socket = (function (InternalSocket) { data: this, hostname: host || "localhost", port: port, - socket: Socket.#Handlers, + socket: this.#handlers, tls, }).catch(error => { this.emit("error", error); diff --git a/test/js/node/net/node-net.test.ts b/test/js/node/net/node-net.test.ts index 6fbb2f58d0..3badca5c55 100644 --- a/test/js/node/net/node-net.test.ts +++ b/test/js/node/net/node-net.test.ts @@ -253,6 +253,36 @@ describe("net.Socket read", () => { .on("error", done); }, socket_domain), ); + + it( + "should support onread callback", + runWithServer((server, drain, done) => { + var data = ""; + const options = { + host: server.hostname, + port: server.port, + onread: { + buffer: Buffer.alloc(4096), + callback: (size, buf) => { + data += buf.slice(0, size).toString("utf8"); + }, + }, + }; + const socket = createConnection(options, () => { + expect(socket).toBeDefined(); + expect(socket.connecting).toBe(false); + }) + .on("end", () => { + try { + expect(data).toBe(message); + done(); + } catch (e) { + done(e); + } + }) + .on("error", done); + }), + ); }); } });