@@ -276,58 +276,44 @@ void TCPWrap::Listen(const FunctionCallbackInfo<Value>& args) {
276276
277277
278278void TCPWrap::Connect (const FunctionCallbackInfo<Value>& args) {
279- Environment* env = Environment::GetCurrent (args);
280-
281- TCPWrap* wrap;
282- ASSIGN_OR_RETURN_UNWRAP (&wrap,
283- args.Holder (),
284- args.GetReturnValue ().Set (UV_EBADF));
285-
286- CHECK (args[0 ]->IsObject ());
287- CHECK (args[1 ]->IsString ());
288279 CHECK (args[2 ]->IsUint32 ());
289-
290- Local<Object> req_wrap_obj = args[0 ].As <Object>();
291- node::Utf8Value ip_address (env->isolate (), args[1 ]);
292280 int port = args[2 ].As <Uint32>()->Value ();
281+ Connect<sockaddr_in>(args,
282+ [port](const char * ip_address, sockaddr_in* addr) {
283+ return uv_ip4_addr (ip_address, port, addr);
284+ });
285+ }
293286
294- sockaddr_in addr;
295- int err = uv_ip4_addr (*ip_address, port, &addr);
296-
297- if (err == 0 ) {
298- AsyncHooks::DefaultTriggerAsyncIdScope trigger_scope (wrap);
299- ConnectWrap* req_wrap =
300- new ConnectWrap (env, req_wrap_obj, AsyncWrap::PROVIDER_TCPCONNECTWRAP);
301- err = req_wrap->Dispatch (uv_tcp_connect,
302- &wrap->handle_ ,
303- reinterpret_cast <const sockaddr*>(&addr),
304- AfterConnect);
305- if (err)
306- delete req_wrap;
307- }
308287
309- args.GetReturnValue ().Set (err);
288+ void TCPWrap::Connect6 (const FunctionCallbackInfo<Value>& args) {
289+ Environment* env = Environment::GetCurrent (args);
290+ CHECK (args[2 ]->IsUint32 ());
291+ int port;
292+ if (!args[2 ]->Int32Value (env->context ()).To (&port)) return ;
293+ Connect<sockaddr_in6>(args,
294+ [port](const char * ip_address, sockaddr_in6* addr) {
295+ return uv_ip6_addr (ip_address, port, addr);
296+ });
310297}
311298
299+ template <typename T>
300+ void TCPWrap::Connect (const FunctionCallbackInfo<Value>& args,
301+ std::function<int (const char * ip_address, T* addr)> uv_ip_addr) {
302+ Environment* env = Environment::GetCurrent (args);
312303
313- void TCPWrap::Connect6 (const FunctionCallbackInfo<Value>& args) {
314304 TCPWrap* wrap;
315305 ASSIGN_OR_RETURN_UNWRAP (&wrap,
316306 args.Holder (),
317307 args.GetReturnValue ().Set (UV_EBADF));
318- Environment* env = wrap->env ();
319308
320309 CHECK (args[0 ]->IsObject ());
321310 CHECK (args[1 ]->IsString ());
322- CHECK (args[2 ]->IsUint32 ());
323311
324312 Local<Object> req_wrap_obj = args[0 ].As <Object>();
325313 node::Utf8Value ip_address (env->isolate (), args[1 ]);
326- int port;
327- if (!args[2 ]->Int32Value (env->context ()).To (&port)) return ;
328314
329- sockaddr_in6 addr;
330- int err = uv_ip6_addr (*ip_address, port , &addr);
315+ T addr;
316+ int err = uv_ip_addr (*ip_address, &addr);
331317
332318 if (err == 0 ) {
333319 AsyncHooks::DefaultTriggerAsyncIdScope trigger_scope (wrap);
0 commit comments