42 using v8::EscapableHandleScope;
44 using v8::FunctionCallbackInfo;
45 using v8::FunctionTemplate;
46 using v8::HandleScope;
56 Local<Object> TCPWrap::Instantiate(Environment* env, AsyncWrap* parent) {
57 EscapableHandleScope handle_scope(env->isolate());
58 AsyncHooks::InitScope init_scope(env, parent->get_id());
59 CHECK_EQ(env->tcp_constructor_template().IsEmpty(),
false);
60 Local<Function> constructor = env->tcp_constructor_template()->GetFunction();
61 CHECK_EQ(constructor.IsEmpty(),
false);
62 Local<Object> instance =
63 constructor->NewInstance(env->context()).ToLocalChecked();
64 return handle_scope.Escape(instance);
70 Local<Context> context) {
71 Environment* env = Environment::GetCurrent(context);
73 Local<FunctionTemplate>
t = env->NewFunctionTemplate(
New);
74 Local<String> tcpString = FIXED_ONE_BYTE_STRING(env->isolate(),
"TCP");
75 t->SetClassName(tcpString);
76 t->InstanceTemplate()->SetInternalFieldCount(1);
79 t->InstanceTemplate()->Set(FIXED_ONE_BYTE_STRING(env->isolate(),
"reading"),
81 t->InstanceTemplate()->Set(env->owner_string(), Null(env->isolate()));
82 t->InstanceTemplate()->Set(env->onread_string(), Null(env->isolate()));
83 t->InstanceTemplate()->Set(env->onconnection_string(), Null(env->isolate()));
85 AsyncWrap::AddWrapMethods(env, t, AsyncWrap::kFlagHasReset);
87 env->SetProtoMethod(t,
"close", HandleWrap::Close);
89 env->SetProtoMethod(t,
"ref", HandleWrap::Ref);
90 env->SetProtoMethod(t,
"unref", HandleWrap::Unref);
91 env->SetProtoMethod(t,
"hasRef", HandleWrap::HasRef);
93 StreamWrap::AddMethods(env, t, StreamBase::kFlagHasWritev);
95 env->SetProtoMethod(t,
"open", Open);
96 env->SetProtoMethod(t,
"bind", Bind);
97 env->SetProtoMethod(t,
"listen", Listen);
98 env->SetProtoMethod(t,
"connect", Connect);
99 env->SetProtoMethod(t,
"bind6", Bind6);
100 env->SetProtoMethod(t,
"connect6", Connect6);
101 env->SetProtoMethod(t,
"getsockname",
102 GetSockOrPeerName<TCPWrap, uv_tcp_getsockname>);
103 env->SetProtoMethod(t,
"getpeername",
104 GetSockOrPeerName<TCPWrap, uv_tcp_getpeername>);
105 env->SetProtoMethod(t,
"setNoDelay", SetNoDelay);
106 env->SetProtoMethod(t,
"setKeepAlive", SetKeepAlive);
109 env->SetProtoMethod(t,
"setSimultaneousAccepts", SetSimultaneousAccepts);
112 target->Set(tcpString, t->GetFunction());
113 env->set_tcp_constructor_template(t);
116 auto constructor = [](
const FunctionCallbackInfo<Value>& args) {
117 CHECK(args.IsConstructCall());
118 ClearWrap(args.This());
121 cwt->InstanceTemplate()->SetInternalFieldCount(1);
122 AsyncWrap::AddWrapMethods(env, cwt);
123 Local<String> wrapString =
124 FIXED_ONE_BYTE_STRING(env->isolate(),
"TCPConnectWrap");
125 cwt->SetClassName(wrapString);
126 target->Set(wrapString, cwt->GetFunction());
130 void TCPWrap::New(
const FunctionCallbackInfo<Value>& args) {
134 CHECK(args.IsConstructCall());
135 Environment* env = Environment::GetCurrent(args);
136 new TCPWrap(env, args.This());
140 TCPWrap::TCPWrap(Environment* env, Local<Object>
object)
141 : ConnectionWrap(env,
143 AsyncWrap::PROVIDER_TCPWRAP) {
144 int r = uv_tcp_init(env->event_loop(), &handle_);
147 UpdateWriteQueueSize();
151 TCPWrap::~TCPWrap() {
152 CHECK(persistent().IsEmpty());
156 void TCPWrap::SetNoDelay(
const FunctionCallbackInfo<Value>& args) {
158 ASSIGN_OR_RETURN_UNWRAP(&wrap,
160 args.GetReturnValue().Set(UV_EBADF));
161 int enable =
static_cast<int>(args[0]->BooleanValue());
162 int err = uv_tcp_nodelay(&wrap->handle_, enable);
163 args.GetReturnValue().Set(err);
167 void TCPWrap::SetKeepAlive(
const FunctionCallbackInfo<Value>& args) {
169 ASSIGN_OR_RETURN_UNWRAP(&wrap,
171 args.GetReturnValue().Set(UV_EBADF));
172 int enable = args[0]->Int32Value();
173 unsigned int delay = args[1]->Uint32Value();
174 int err = uv_tcp_keepalive(&wrap->handle_, enable, delay);
175 args.GetReturnValue().Set(err);
180 void TCPWrap::SetSimultaneousAccepts(
const FunctionCallbackInfo<Value>& args) {
182 ASSIGN_OR_RETURN_UNWRAP(&wrap,
184 args.GetReturnValue().Set(UV_EBADF));
185 bool enable = args[0]->BooleanValue();
186 int err = uv_tcp_simultaneous_accepts(&wrap->handle_, enable);
187 args.GetReturnValue().Set(err);
192 void TCPWrap::Open(
const FunctionCallbackInfo<Value>& args) {
194 ASSIGN_OR_RETURN_UNWRAP(&wrap,
196 args.GetReturnValue().Set(UV_EBADF));
197 int fd =
static_cast<int>(args[0]->IntegerValue());
198 uv_tcp_open(&wrap->handle_, fd);
202 void TCPWrap::Bind(
const FunctionCallbackInfo<Value>& args) {
204 ASSIGN_OR_RETURN_UNWRAP(&wrap,
206 args.GetReturnValue().Set(UV_EBADF));
207 node::Utf8Value ip_address(args.GetIsolate(), args[0]);
208 int port = args[1]->Int32Value();
210 int err = uv_ip4_addr(*ip_address, port, &addr);
212 err = uv_tcp_bind(&wrap->handle_,
213 reinterpret_cast<const sockaddr*>(&addr),
216 args.GetReturnValue().Set(err);
220 void TCPWrap::Bind6(
const FunctionCallbackInfo<Value>& args) {
222 ASSIGN_OR_RETURN_UNWRAP(&wrap,
224 args.GetReturnValue().Set(UV_EBADF));
225 node::Utf8Value ip6_address(args.GetIsolate(), args[0]);
226 int port = args[1]->Int32Value();
228 int err = uv_ip6_addr(*ip6_address, port, &addr);
230 err = uv_tcp_bind(&wrap->handle_,
231 reinterpret_cast<const sockaddr*>(&addr),
234 args.GetReturnValue().Set(err);
238 void TCPWrap::Listen(
const FunctionCallbackInfo<Value>& args) {
240 ASSIGN_OR_RETURN_UNWRAP(&wrap,
242 args.GetReturnValue().Set(UV_EBADF));
243 int backlog = args[0]->Int32Value();
244 int err = uv_listen(reinterpret_cast<uv_stream_t*>(&wrap->handle_),
247 args.GetReturnValue().Set(err);
251 void TCPWrap::Connect(
const FunctionCallbackInfo<Value>& args) {
252 Environment* env = Environment::GetCurrent(args);
255 ASSIGN_OR_RETURN_UNWRAP(&wrap,
257 args.GetReturnValue().Set(UV_EBADF));
259 CHECK(args[0]->IsObject());
260 CHECK(args[1]->IsString());
261 CHECK(args[2]->IsUint32());
263 Local<Object> req_wrap_obj = args[0].As<Object>();
264 node::Utf8Value ip_address(env->isolate(), args[1]);
265 int port = args[2]->Uint32Value();
268 int err = uv_ip4_addr(*ip_address, port, &addr);
271 env->set_init_trigger_id(wrap->get_id());
272 ConnectWrap* req_wrap =
273 new ConnectWrap(env, req_wrap_obj, AsyncWrap::PROVIDER_TCPCONNECTWRAP);
274 err = uv_tcp_connect(req_wrap->req(),
276 reinterpret_cast<const sockaddr*
>(&addr),
278 req_wrap->Dispatched();
283 args.GetReturnValue().Set(err);
287 void TCPWrap::Connect6(
const FunctionCallbackInfo<Value>& args) {
288 Environment* env = Environment::GetCurrent(args);
291 ASSIGN_OR_RETURN_UNWRAP(&wrap,
293 args.GetReturnValue().Set(UV_EBADF));
295 CHECK(args[0]->IsObject());
296 CHECK(args[1]->IsString());
297 CHECK(args[2]->IsUint32());
299 Local<Object> req_wrap_obj = args[0].As<Object>();
300 node::Utf8Value ip_address(env->isolate(), args[1]);
301 int port = args[2]->Int32Value();
304 int err = uv_ip6_addr(*ip_address, port, &addr);
307 env->set_init_trigger_id(wrap->get_id());
308 ConnectWrap* req_wrap =
309 new ConnectWrap(env, req_wrap_obj, AsyncWrap::PROVIDER_TCPCONNECTWRAP);
310 err = uv_tcp_connect(req_wrap->req(),
312 reinterpret_cast<const sockaddr*
>(&addr),
314 req_wrap->Dispatched();
319 args.GetReturnValue().Set(err);
325 const sockaddr* addr,
326 Local<Object> info) {
327 EscapableHandleScope scope(env->isolate());
328 char ip[INET6_ADDRSTRLEN];
329 const sockaddr_in *a4;
330 const sockaddr_in6 *a6;
336 switch (addr->sa_family) {
338 a6 =
reinterpret_cast<const sockaddr_in6*
>(addr);
339 uv_inet_ntop(AF_INET6, &a6->sin6_addr, ip,
sizeof ip);
340 port = ntohs(a6->sin6_port);
341 info->Set(env->address_string(), OneByteString(env->isolate(), ip));
342 info->Set(env->family_string(), env->ipv6_string());
343 info->Set(env->port_string(),
Integer::New(env->isolate(), port));
347 a4 =
reinterpret_cast<const sockaddr_in*
>(addr);
348 uv_inet_ntop(AF_INET, &a4->sin_addr, ip,
sizeof ip);
349 port = ntohs(a4->sin_port);
350 info->Set(env->address_string(), OneByteString(env->isolate(), ip));
351 info->Set(env->family_string(), env->ipv4_string());
352 info->Set(env->port_string(),
Integer::New(env->isolate(), port));
356 info->Set(env->address_string(), String::Empty(env->isolate()));
359 return scope.Escape(info);
NODE_MODULE_CONTEXT_AWARE_BUILTIN(inspector, node::inspector::Agent::InitInspector)
void Initialize(Local< Object > target, Local< Value > unused, Local< Context > context, void *priv)
void Open(const FunctionCallbackInfo< Value > &args)
Local< Object > AddressToJS(Environment *env, const sockaddr *addr, Local< Object > info)
MaybeLocal< Object > New(Isolate *isolate, Local< String > string, enum encoding enc)
node::Environment::AsyncHooks AsyncHooks