@@ -46,6 +46,13 @@ int StreamBase::ReadStopJS(const FunctionCallbackInfo<Value>& args) {
4646 return ReadStop ();
4747}
4848
49+ int StreamBase::UseUserBuffer (const FunctionCallbackInfo<Value>& args) {
50+ CHECK (Buffer::HasInstance (args[0 ]));
51+
52+ uv_buf_t buf = uv_buf_init (Buffer::Data (args[0 ]), Buffer::Length (args[0 ]));
53+ PushStreamListener (new CustomBufferJSListener (buf));
54+ return 0 ;
55+ }
4956
5057int StreamBase::Shutdown (const FunctionCallbackInfo<Value>& args) {
5158 CHECK (args[0 ]->IsObject ());
@@ -295,7 +302,7 @@ void StreamBase::CallJSOnreadMethod(ssize_t nread,
295302 DCHECK_EQ (static_cast <int32_t >(nread), nread);
296303 DCHECK_LE (offset, INT32_MAX);
297304
298- if (ab.IsEmpty () && buf_. base == nullptr ) {
305+ if (ab.IsEmpty ()) {
299306 DCHECK_EQ (offset, 0 );
300307 DCHECK_LE (nread, 0 );
301308 } else {
@@ -347,12 +354,7 @@ void StreamResource::ClearError() {
347354
348355
349356uv_buf_t StreamListener::OnStreamAlloc (size_t suggested_size) {
350- StreamBase* stream = static_cast <StreamBase*>(stream_);
351- const uv_buf_t stream_buf = stream->stream_buf ();
352- if (stream_buf.base != nullptr )
353- return stream_buf;
354- else
355- return uv_buf_init (Malloc (suggested_size), suggested_size);
357+ return uv_buf_init (Malloc (suggested_size), suggested_size);
356358}
357359
358360
@@ -362,32 +364,44 @@ void EmitToJSStreamListener::OnStreamRead(ssize_t nread, const uv_buf_t& buf) {
362364 Environment* env = stream->stream_env ();
363365 HandleScope handle_scope (env->isolate ());
364366 Context::Scope context_scope (env->context ());
365- const uv_buf_t stream_buf = stream->stream_buf ();
366- Local<ArrayBuffer> obj;
367367
368368 if (nread <= 0 ) {
369- if (stream_buf.base == nullptr )
370- free (buf.base );
371- if (nread == 0 )
372- return ;
373- } else if (stream_buf.base != nullptr ) {
374- CHECK_LE (static_cast <size_t >(nread), stream_buf.len );
375- } else {
376- CHECK_LE (static_cast <size_t >(nread), buf.len );
369+ free (buf.base );
370+ if (nread < 0 )
371+ stream->CallJSOnreadMethod (nread, Local<ArrayBuffer>());
372+ return ;
373+ }
377374
378- char * base = Realloc (buf.base , nread);
375+ CHECK_LE (static_cast <size_t >(nread), buf.len );
376+ char * base = Realloc (buf.base , nread);
379377
380- obj = ArrayBuffer::New (
381- env->isolate (),
382- base,
383- nread,
384- // Transfer ownership to V8.
385- v8::ArrayBufferCreationMode::kInternalized );
386- }
378+ Local<ArrayBuffer> obj = ArrayBuffer::New (
379+ env->isolate (),
380+ base,
381+ nread,
382+ v8::ArrayBufferCreationMode::kInternalized ); // Transfer ownership to V8.
387383 stream->CallJSOnreadMethod (nread, obj);
388384}
389385
390386
387+ uv_buf_t CustomBufferJSListener::OnStreamAlloc (size_t suggested_size) {
388+ return buffer_;
389+ }
390+
391+
392+ void CustomBufferJSListener::OnStreamRead (ssize_t nread, const uv_buf_t & buf) {
393+ CHECK_NOT_NULL (stream_);
394+ CHECK_EQ (buf.base , buffer_.base );
395+
396+ StreamBase* stream = static_cast <StreamBase*>(stream_);
397+ Environment* env = stream->stream_env ();
398+ HandleScope handle_scope (env->isolate ());
399+ Context::Scope context_scope (env->context ());
400+
401+ stream->CallJSOnreadMethod (nread, Local<ArrayBuffer>());
402+ }
403+
404+
391405void ReportWritesToJSStreamListener::OnStreamAfterReqFinished (
392406 StreamReq* req_wrap, int status) {
393407 StreamBase* stream = static_cast <StreamBase*>(stream_);
0 commit comments