15 using v8::FunctionCallbackInfo;
16 using v8::FunctionTemplate;
17 using v8::HandleScope;
25 JSStream::JSStream(Environment* env, Local<Object> obj)
26 : AsyncWrap(env, obj, AsyncWrap::PROVIDER_JSSTREAM),
28 node::Wrap(obj,
this);
29 MakeWeak<JSStream>(
this);
33 JSStream::~JSStream() {
37 void* JSStream::Cast() {
38 return static_cast<void*
>(
this);
42 AsyncWrap* JSStream::GetAsyncWrap() {
43 return static_cast<AsyncWrap*
>(
this);
47 bool JSStream::IsAlive() {
48 v8::Local<v8::Value> fn = object()->Get(env()->isalive_string());
49 if (!fn->IsFunction())
52 .ToLocalChecked()->IsTrue();
56 bool JSStream::IsClosing() {
57 return MakeCallback(env()->isclosing_string(), 0,
nullptr)
58 .ToLocalChecked()->IsTrue();
62 int JSStream::ReadStart() {
63 return MakeCallback(env()->onreadstart_string(), 0,
nullptr)
64 .ToLocalChecked()->Int32Value();
68 int JSStream::ReadStop() {
69 return MakeCallback(env()->onreadstop_string(), 0,
nullptr)
70 .ToLocalChecked()->Int32Value();
74 int JSStream::DoShutdown(ShutdownWrap* req_wrap) {
75 HandleScope scope(env()->isolate());
77 Local<Value> argv[] = {
81 req_wrap->Dispatched();
82 MaybeLocal<Value> res =
83 MakeCallback(env()->onshutdown_string(), arraysize(argv), argv);
85 return res.ToLocalChecked()->Int32Value();
89 int JSStream::DoWrite(WriteWrap* w,
92 uv_stream_t* send_handle) {
93 CHECK_EQ(send_handle,
nullptr);
95 HandleScope scope(env()->isolate());
97 Local<Array> bufs_arr =
Array::New(env()->isolate(), count);
99 for (
size_t i = 0; i < count; i++) {
101 bufs_arr->Set(i, buf);
104 Local<Value> argv[] = {
110 MaybeLocal<Value> res =
111 MakeCallback(env()->onwrite_string(), arraysize(argv), argv);
113 return res.ToLocalChecked()->Int32Value();
117 void JSStream::New(
const FunctionCallbackInfo<Value>& args) {
121 CHECK(args.IsConstructCall());
122 Environment* env = Environment::GetCurrent(args);
123 new JSStream(env, args.This());
132 void JSStream::DoAlloc(
const FunctionCallbackInfo<Value>& args) {
134 ASSIGN_OR_RETURN_UNWRAP(&wrap, args.Holder());
137 wrap->OnAlloc(args[0]->Int32Value(), &buf);
143 nullptr).ToLocalChecked();
144 return args.GetReturnValue().Set(vbuf);
148 void JSStream::DoRead(
const FunctionCallbackInfo<Value>& args) {
150 ASSIGN_OR_RETURN_UNWRAP(&wrap, args.Holder());
154 wrap->OnRead(args[0]->Int32Value(), &buf);
158 void JSStream::DoAfterWrite(
const FunctionCallbackInfo<Value>& args) {
160 CHECK(args[0]->IsObject());
162 ASSIGN_OR_RETURN_UNWRAP(&wrap, args.Holder());
163 ASSIGN_OR_RETURN_UNWRAP(&w, args[0].As<Object>());
165 wrap->OnAfterWrite(w);
169 template <
class Wrap>
170 void JSStream::Finish(
const FunctionCallbackInfo<Value>& args) {
172 CHECK(args[0]->IsObject());
173 ASSIGN_OR_RETURN_UNWRAP(&w, args[0].As<Object>());
175 w->Done(args[1]->Int32Value());
179 void JSStream::ReadBuffer(
const FunctionCallbackInfo<Value>& args) {
181 ASSIGN_OR_RETURN_UNWRAP(&wrap, args.Holder());
190 wrap->OnAlloc(len, &buf);
191 if (static_cast<ssize_t>(buf.len) < avail)
194 memcpy(buf.base, data, avail);
197 wrap->OnRead(avail, &buf);
202 void JSStream::EmitEOF(
const FunctionCallbackInfo<Value>& args) {
204 ASSIGN_OR_RETURN_UNWRAP(&wrap, args.Holder());
206 wrap->OnRead(UV_EOF,
nullptr);
212 Local<Context> context) {
213 Environment* env = Environment::GetCurrent(context);
215 Local<FunctionTemplate>
t = env->NewFunctionTemplate(
New);
216 Local<String> jsStreamString =
217 FIXED_ONE_BYTE_STRING(env->isolate(),
"JSStream");
218 t->SetClassName(jsStreamString);
219 t->InstanceTemplate()->SetInternalFieldCount(1);
221 AsyncWrap::AddWrapMethods(env, t);
223 env->SetProtoMethod(t,
"doAlloc", DoAlloc);
224 env->SetProtoMethod(t,
"doRead", DoRead);
225 env->SetProtoMethod(t,
"doAfterWrite", DoAfterWrite);
226 env->SetProtoMethod(t,
"finishWrite", Finish<WriteWrap>);
227 env->SetProtoMethod(t,
"finishShutdown", Finish<ShutdownWrap>);
228 env->SetProtoMethod(t,
"readBuffer", ReadBuffer);
229 env->SetProtoMethod(t,
"emitEOF", EmitEOF);
231 StreamBase::AddMethods<JSStream>(env,
t, StreamBase::kFlagHasWritev);
232 target->Set(jsStreamString, t->GetFunction());
bool HasInstance(Local< Value > val)
NODE_MODULE_CONTEXT_AWARE_BUILTIN(inspector, node::inspector::Agent::InitInspector)
union node::cares_wrap::@8::CaresAsyncData::@0 data
size_t Length(Local< Value > val)
void Initialize(Local< Object > target, Local< Value > unused, Local< Context > context, void *priv)
char * Data(Local< Value > val)
MaybeLocal< Object > New(Isolate *isolate, Local< String > string, enum encoding enc)
MaybeLocal< Value > MakeCallback(Isolate *isolate, Local< Object > recv, Local< Function > callback, int argc, Local< Value > *argv, async_id asyncId, async_id triggerAsyncId)
void(* FreeCallback)(char *data, void *hint)
MaybeLocal< Object > Copy(Isolate *isolate, const char *data, size_t length)