From 8292b280ec9e6b8c2444cbe49350facc77f5fefa Mon Sep 17 00:00:00 2001 From: Brian White Date: Thu, 10 Jan 2019 15:52:27 -0500 Subject: net: allow reading data into a static buffer Co-Authored-By: Anna Henningsen PR-URL: https://github.com/nodejs/node/pull/25436 Reviewed-By: James M Snell Reviewed-By: Matteo Collina Reviewed-By: Ben Noordhuis --- src/stream_base.h | 26 +++++++++++++++++++++++--- 1 file changed, 23 insertions(+), 3 deletions(-) (limited to 'src/stream_base.h') diff --git a/src/stream_base.h b/src/stream_base.h index 3550233290..3bfdaedb79 100644 --- a/src/stream_base.h +++ b/src/stream_base.h @@ -180,6 +180,21 @@ class EmitToJSStreamListener : public ReportWritesToJSStreamListener { }; +// An alternative listener that uses a custom, user-provided buffer +// for reading data. +class CustomBufferJSListener : public ReportWritesToJSStreamListener { + public: + uv_buf_t OnStreamAlloc(size_t suggested_size) override; + void OnStreamRead(ssize_t nread, const uv_buf_t& buf) override; + void OnStreamDestroy() override { delete this; } + + explicit CustomBufferJSListener(uv_buf_t buffer) : buffer_(buffer) {} + + private: + uv_buf_t buffer_; +}; + + // A generic stream, comparable to JS land’s `Duplex` streams. // A stream is always controlled through one `StreamListener` instance. class StreamResource { @@ -273,9 +288,13 @@ class StreamBase : public StreamResource { virtual bool IsIPCPipe(); virtual int GetFD(); - void CallJSOnreadMethod(ssize_t nread, - v8::Local ab, - size_t offset = 0); + enum StreamBaseJSChecks { DONT_SKIP_NREAD_CHECKS, SKIP_NREAD_CHECKS }; + + v8::MaybeLocal CallJSOnreadMethod( + ssize_t nread, + v8::Local ab, + size_t offset = 0, + StreamBaseJSChecks checks = DONT_SKIP_NREAD_CHECKS); // This is named `stream_env` to avoid name clashes, because a lot of // subclasses are also `BaseObject`s. @@ -323,6 +342,7 @@ class StreamBase : public StreamResource { int WriteBuffer(const v8::FunctionCallbackInfo& args); template int WriteString(const v8::FunctionCallbackInfo& args); + int UseUserBuffer(const v8::FunctionCallbackInfo& args); static void GetFD(const v8::FunctionCallbackInfo& args); static void GetExternal(const v8::FunctionCallbackInfo& args); -- cgit v1.2.3