@@ -27,13 +27,55 @@ JSStream::JSStream(Environment* env, Local<Object> obj)
27
27
StreamBase (env) {
28
28
node::Wrap (obj, this );
29
29
MakeWeak<JSStream>(this );
30
+
31
+ set_alloc_cb ({ OnAllocImpl, this });
32
+ set_read_cb ({ OnReadImpl, this });
30
33
}
31
34
32
35
33
36
JSStream::~JSStream () {
34
37
}
35
38
36
39
40
+ void JSStream::OnAllocImpl (size_t size, uv_buf_t * buf, void * ctx) {
41
+ buf->base = Malloc (size);
42
+ buf->len = size;
43
+ }
44
+
45
+
46
+ void JSStream::OnReadImpl (ssize_t nread,
47
+ const uv_buf_t * buf,
48
+ uv_handle_type pending,
49
+ void * ctx) {
50
+ JSStream* wrap = static_cast <JSStream*>(ctx);
51
+ CHECK_NE (wrap, nullptr );
52
+ Environment* env = wrap->env ();
53
+ HandleScope handle_scope (env->isolate ());
54
+ Context::Scope context_scope (env->context ());
55
+
56
+ if (nread < 0 ) {
57
+ if (buf != nullptr && buf->base != nullptr )
58
+ free (buf->base );
59
+ wrap->EmitData (nread, Local<Object>(), Local<Object>());
60
+ return ;
61
+ }
62
+
63
+ if (nread == 0 ) {
64
+ if (buf->base != nullptr )
65
+ free (buf->base );
66
+ return ;
67
+ }
68
+
69
+ CHECK_LE (static_cast <size_t >(nread), buf->len );
70
+ char * base = node::Realloc (buf->base , nread);
71
+
72
+ CHECK_EQ (pending, UV_UNKNOWN_HANDLE);
73
+
74
+ Local<Object> obj = Buffer::New (env, base, nread).ToLocalChecked ();
75
+ wrap->EmitData (nread, obj, Local<Object>());
76
+ }
77
+
78
+
37
79
void * JSStream::Cast () {
38
80
return static_cast <void *>(this );
39
81
}
@@ -134,37 +176,6 @@ void JSStream::New(const FunctionCallbackInfo<Value>& args) {
134
176
}
135
177
136
178
137
- static void FreeCallback (char * data, void * hint) {
138
- // Intentional no-op
139
- }
140
-
141
-
142
- void JSStream::DoAlloc (const FunctionCallbackInfo<Value>& args) {
143
- JSStream* wrap;
144
- ASSIGN_OR_RETURN_UNWRAP (&wrap, args.Holder ());
145
-
146
- uv_buf_t buf;
147
- wrap->OnAlloc (args[0 ]->Int32Value (), &buf);
148
- Local<Object> vbuf = Buffer::New (
149
- wrap->env (),
150
- buf.base ,
151
- buf.len ,
152
- FreeCallback,
153
- nullptr ).ToLocalChecked ();
154
- return args.GetReturnValue ().Set (vbuf);
155
- }
156
-
157
-
158
- void JSStream::DoRead (const FunctionCallbackInfo<Value>& args) {
159
- JSStream* wrap;
160
- ASSIGN_OR_RETURN_UNWRAP (&wrap, args.Holder ());
161
-
162
- CHECK (Buffer::HasInstance (args[1 ]));
163
- uv_buf_t buf = uv_buf_init (Buffer::Data (args[1 ]), Buffer::Length (args[1 ]));
164
- wrap->OnRead (args[0 ]->Int32Value (), &buf);
165
- }
166
-
167
-
168
179
void JSStream::DoAfterWrite (const FunctionCallbackInfo<Value>& args) {
169
180
JSStream* wrap;
170
181
CHECK (args[0 ]->IsObject ());
@@ -230,8 +241,6 @@ void JSStream::Initialize(Local<Object> target,
230
241
231
242
AsyncWrap::AddWrapMethods (env, t);
232
243
233
- env->SetProtoMethod (t, " doAlloc" , DoAlloc);
234
- env->SetProtoMethod (t, " doRead" , DoRead);
235
244
env->SetProtoMethod (t, " doAfterWrite" , DoAfterWrite);
236
245
env->SetProtoMethod (t, " finishWrite" , Finish<WriteWrap>);
237
246
env->SetProtoMethod (t, " finishShutdown" , Finish<ShutdownWrap>);
0 commit comments