• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 
16 #include "monitor_server.h"
17 
18 #include <cstddef>
19 #include <utility>
20 
21 #include <napi/native_api.h>
22 #include <napi/native_common.h>
23 #include <securec.h>
24 #include <uv.h>
25 
26 #include "module_template.h"
27 #include "napi_utils.h"
28 #include "netstack_log.h"
29 
30 #include "tls_socket_server.h"
31 #include "tlssocketserver_module.h"
32 
33 namespace OHOS {
34 namespace NetStack {
35 namespace TlsSocketServer {
36 namespace {
37 constexpr int PARAM_OPTION = 1;
38 constexpr int PARAM_OPTION_CALLBACK = 2;
39 constexpr std::string_view EVENT_MESSAGE = "message";
40 constexpr std::string_view EVENT_CONNECT = "connect";
41 constexpr std::string_view EVENT_CLOSE = "close";
42 constexpr std::string_view EVENT_ERROR = "error";
43 
44 constexpr const char *PROPERTY_ADDRESS = "address";
45 constexpr const char *PROPERTY_FAMILY = "family";
46 constexpr const char *PROPERTY_PORT = "port";
47 constexpr const char *PROPERTY_SIZE = "size";
48 constexpr const char *ON_MESSAGE = "message";
49 constexpr const char *ON_REMOTE_INFO = "remoteInfo";
50 
NewInstanceWithConstructor(napi_env env,napi_callback_info info,napi_value jsConstructor,int32_t counter,std::shared_ptr<EventManager> eventManager)51 napi_value NewInstanceWithConstructor(napi_env env, napi_callback_info info, napi_value jsConstructor, int32_t counter,
52                                       std::shared_ptr<EventManager> eventManager)
53 {
54     napi_value result = nullptr;
55     NAPI_CALL(env, napi_new_instance(env, jsConstructor, 0, nullptr, &result));
56 
57     auto sharedManager = new (std::nothrow) std::shared_ptr<EventManager>();
58     if (sharedManager == nullptr) {
59         return result;
60     }
61     *sharedManager = eventManager;
62     napi_wrap(
63         env, result, reinterpret_cast<void *>(sharedManager),
64         [](napi_env, void *data, void *) {
65             NETSTACK_LOGI("socket handle is finalized");
66             auto sharedManager = static_cast<std::shared_ptr<EventManager> *>(data);
67             if (sharedManager != nullptr) {
68                 auto manager = *sharedManager;
69                 auto tlsServer = static_cast<TLSSocketServer *>(manager->GetData());
70                 if (tlsServer != nullptr) {
71                     tlsServer->CloseConnectionByEventManager(manager);
72                     tlsServer->DeleteConnectionByEventManager(manager);
73                 }
74             }
75             delete sharedManager;
76         },
77         nullptr, nullptr);
78 
79     return result;
80 }
81 
ConstructTLSSocketConnection(napi_env env,napi_callback_info info,int32_t counter,std::shared_ptr<EventManager> eventManager)82 napi_value ConstructTLSSocketConnection(napi_env env, napi_callback_info info, int32_t counter,
83                                         std::shared_ptr<EventManager> eventManager)
84 {
85     napi_value jsConstructor = nullptr;
86     std::initializer_list<napi_property_descriptor> properties = {
87         DECLARE_NAPI_FUNCTION(TLSSocketServerModuleExports::TLSSocketConnection::FUNCTION_GET_CERTIFICATE,
88                               TLSSocketServerModuleExports::TLSSocketConnection::GetCertificate),
89         DECLARE_NAPI_FUNCTION(TLSSocketServerModuleExports::TLSSocketConnection::FUNCTION_GET_REMOTE_CERTIFICATE,
90                               TlsSocketServer::TLSSocketServerModuleExports::TLSSocketConnection::GetRemoteCertificate),
91         DECLARE_NAPI_FUNCTION(TLSSocketServerModuleExports::TLSSocketConnection::FUNCTION_GET_SIGNATURE_ALGORITHMS,
92                               TLSSocketServerModuleExports::TLSSocketConnection::GetSignatureAlgorithms),
93         DECLARE_NAPI_FUNCTION(TLSSocketServerModuleExports::TLSSocketConnection::FUNCTION_GET_CIPHER_SUITE,
94                               TLSSocketServerModuleExports::TLSSocketConnection::GetCipherSuites),
95         DECLARE_NAPI_FUNCTION(TLSSocketServerModuleExports::TLSSocketConnection::FUNCTION_SEND,
96                               TLSSocketServerModuleExports::TLSSocketConnection::Send),
97         DECLARE_NAPI_FUNCTION(TLSSocketServerModuleExports::TLSSocketConnection::FUNCTION_CLOSE,
98                               TLSSocketServerModuleExports::TLSSocketConnection::Close),
99         DECLARE_NAPI_FUNCTION(TLSSocketServerModuleExports::TLSSocketConnection::FUNCTION_GET_REMOTE_ADDRESS,
100                               TLSSocketServerModuleExports::TLSSocketConnection::GetRemoteAddress),
101         DECLARE_NAPI_FUNCTION(TLSSocketServerModuleExports::TLSSocketConnection::FUNCTION_GET_LOCAL_ADDRESS,
102                               TLSSocketServerModuleExports::TLSSocketConnection::GetLocalAddress),
103         DECLARE_NAPI_FUNCTION(TLSSocketServerModuleExports::TLSSocketConnection::FUNCTION_ON,
104                               TLSSocketServerModuleExports::TLSSocketConnection::On),
105         DECLARE_NAPI_FUNCTION(TLSSocketServerModuleExports::TLSSocketConnection::FUNCTION_OFF,
106                               TLSSocketServerModuleExports::TLSSocketConnection::Off),
107     };
108 
109     auto constructor = [](napi_env env, napi_callback_info info) -> napi_value {
110         napi_value thisVal = nullptr;
111         NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVal, nullptr));
112 
113         return thisVal;
114     };
115 
116     napi_property_descriptor descriptors[properties.size()];
117     std::copy(properties.begin(), properties.end(), descriptors);
118 
119     NAPI_CALL_BASE(env,
120                    napi_define_class(env, TLSSocketServerModuleExports::INTERFACE_TLS_SOCKET_SERVER_CONNECTION,
121                                      NAPI_AUTO_LENGTH, constructor, nullptr, properties.size(), descriptors,
122                                      &jsConstructor),
123                    NapiUtils::GetUndefined(env));
124 
125     if (jsConstructor != nullptr) {
126         napi_value result = NewInstanceWithConstructor(env, info, jsConstructor, counter, eventManager);
127         NapiUtils::SetInt32Property(env, result, TLSSocketServerModuleExports::TLSSocketConnection::PROPERTY_CLIENT_ID,
128                                     counter);
129         return result;
130     }
131     return NapiUtils::GetUndefined(env);
132 }
133 
MakeMessageObj(napi_env env,std::shared_ptr<MonitorServer::MessageRecvParma> MessagePara)134 napi_value MakeMessageObj(napi_env env, std::shared_ptr<MonitorServer::MessageRecvParma> MessagePara)
135 {
136     void *data = nullptr;
137     napi_value arrayBuffer = NapiUtils::CreateArrayBuffer(env, MessagePara->data.size(), &data);
138     if (data != nullptr && arrayBuffer != nullptr) {
139         if (memcpy_s(data, MessagePara->data.size(), MessagePara->data.c_str(), MessagePara->data.size()) != EOK) {
140             NETSTACK_LOGE("memcpy_s failed!");
141             return nullptr;
142         }
143     } else {
144         return nullptr;
145     }
146 
147     napi_value obj = NapiUtils::CreateObject(env);
148     napi_value remoteInfo = NapiUtils::CreateObject(env);
149 
150     napi_value message = nullptr;
151     napi_create_typedarray(env, napi_uint8_array, MessagePara->data.size(), arrayBuffer, 0, &message);
152     napi_value address = NapiUtils::CreateStringUtf8(env, MessagePara->remoteInfo_.GetAddress());
153     napi_value family = NapiUtils::CreateStringUtf8(env, MessagePara->remoteInfo_.GetFamily());
154     napi_value port = NapiUtils::CreateInt32(env, MessagePara->remoteInfo_.GetPort());
155     napi_value size = NapiUtils::CreateInt32(env, MessagePara->remoteInfo_.GetSize());
156     NapiUtils::SetNamedProperty(env, remoteInfo, PROPERTY_ADDRESS, address);
157     NapiUtils::SetNamedProperty(env, remoteInfo, PROPERTY_FAMILY, family);
158     NapiUtils::SetNamedProperty(env, remoteInfo, PROPERTY_PORT, port);
159     NapiUtils::SetNamedProperty(env, remoteInfo, PROPERTY_SIZE, size);
160     NapiUtils::SetNamedProperty(env, obj, ON_MESSAGE, message);
161     NapiUtils::SetNamedProperty(env, obj, ON_REMOTE_INFO, remoteInfo);
162 
163     return obj;
164 }
165 
EventMessageCallback(uv_work_t * work,int status)166 void EventMessageCallback(uv_work_t *work, int status)
167 {
168     (void)status;
169     if (work == nullptr) {
170         NETSTACK_LOGE("work is nullptr");
171         return;
172     }
173     auto workWrapper = static_cast<UvWorkWrapperShared *>(work->data);
174     if (workWrapper == nullptr) {
175         NETSTACK_LOGE("workWrapper is nullptr");
176         delete work;
177         return;
178     }
179     std::shared_ptr<MonitorServer::MessageRecvParma> ptrMessageRecvParma(
180         static_cast<MonitorServer::MessageRecvParma *>(workWrapper->data));
181     if (ptrMessageRecvParma == nullptr) {
182         NETSTACK_LOGE("messageRecvParma is nullptr");
183         delete workWrapper;
184         delete work;
185         return;
186     }
187     if (workWrapper->manager == nullptr) {
188         NETSTACK_LOGE("manager is nullptr");
189         delete workWrapper;
190         delete work;
191         return;
192     }
193     napi_handle_scope scope = NapiUtils::OpenScope(workWrapper->env);
194     auto obj = MakeMessageObj(workWrapper->env, ptrMessageRecvParma);
195     if (obj == nullptr) {
196         NapiUtils::CloseScope(workWrapper->env, scope);
197         delete workWrapper;
198         delete work;
199         return;
200     }
201 
202     workWrapper->manager->Emit(workWrapper->type, std::make_pair(NapiUtils::GetUndefined(workWrapper->env), obj));
203     NapiUtils::CloseScope(workWrapper->env, scope);
204 
205     delete workWrapper;
206     delete work;
207 }
208 
EventConnectCallback(uv_work_t * work,int status)209 void EventConnectCallback(uv_work_t *work, int status)
210 {
211     (void)status;
212     if (work == nullptr) {
213         NETSTACK_LOGE("work is nullptr");
214         return;
215     }
216     auto workWrapper = static_cast<UvWorkWrapperShared *>(work->data);
217     if (workWrapper == nullptr) {
218         NETSTACK_LOGE("workWrapper is nullptr");
219         delete work;
220         return;
221     }
222     std::shared_ptr<MonitorServer::MessageParma> messageParma(
223         static_cast<MonitorServer::MessageParma *>(workWrapper->data));
224     if (messageParma == nullptr) {
225         NETSTACK_LOGE("messageParma is nullptr");
226         delete workWrapper;
227         delete work;
228         return;
229     }
230     auto clientid = messageParma->clientID;
231     auto eventManager = messageParma->eventManager;
232     napi_handle_scope scope = NapiUtils::OpenScope(workWrapper->env);
233     napi_callback_info info = nullptr;
234     napi_value obj = ConstructTLSSocketConnection(workWrapper->env, info, clientid, eventManager);
235     workWrapper->manager->Emit(workWrapper->type, std::make_pair(NapiUtils::GetUndefined(workWrapper->env), obj));
236     NapiUtils::CloseScope(workWrapper->env, scope);
237     delete workWrapper;
238     delete work;
239 }
240 
EventCloseCallback(uv_work_t * work,int status)241 void EventCloseCallback(uv_work_t *work, int status)
242 {
243     (void)status;
244     if (work == nullptr) {
245         NETSTACK_LOGE("work is nullptr");
246         return;
247     }
248     auto workWrapper = static_cast<UvWorkWrapperShared *>(work->data);
249     if (workWrapper == nullptr) {
250         NETSTACK_LOGE("workWrapper is nullptr");
251         delete work;
252         return;
253     }
254     std::shared_ptr<int> ptrClientID(static_cast<int *>(workWrapper->data));
255     if (ptrClientID == nullptr) {
256         NETSTACK_LOGE("ptrClientID == nullptr");
257         delete workWrapper;
258         delete work;
259         return;
260     }
261     if (workWrapper->manager == nullptr) {
262         NETSTACK_LOGE("manager is nullptr");
263         delete workWrapper;
264         delete work;
265         return;
266     }
267     napi_handle_scope scope = NapiUtils::OpenScope(workWrapper->env);
268     napi_value obj = nullptr;
269     workWrapper->manager->Emit(workWrapper->type, std::make_pair(NapiUtils::GetUndefined(workWrapper->env), obj));
270     NapiUtils::CloseScope(workWrapper->env, scope);
271     delete workWrapper;
272     delete work;
273 }
274 
EventErrorCallback(uv_work_t * work,int status)275 void EventErrorCallback(uv_work_t *work, int status)
276 {
277     (void)status;
278     if (work == nullptr) {
279         NETSTACK_LOGE("work is nullptr");
280         return;
281     }
282     auto workWrapper = static_cast<UvWorkWrapperShared *>(work->data);
283     if (workWrapper == nullptr) {
284         NETSTACK_LOGE("workWrapper is nullptr");
285         delete work;
286         return;
287     }
288     auto monitor = static_cast<MonitorServer *>(workWrapper->data);
289     if (monitor == nullptr) {
290         NETSTACK_LOGE("monitor is nullptr");
291         delete workWrapper;
292         delete work;
293         return;
294     }
295     if (workWrapper->manager == nullptr) {
296         NETSTACK_LOGE("manager is nullptr");
297         delete workWrapper;
298         delete work;
299         return;
300     }
301     napi_handle_scope scope = NapiUtils::OpenScope(workWrapper->env);
302     napi_value obj = NapiUtils::CreateObject(workWrapper->env);
303     napi_value errorNumber = NapiUtils::CreateInt32(workWrapper->env, monitor->errorNumber_);
304     napi_value errorString = NapiUtils::CreateStringUtf8(workWrapper->env, monitor->errorString_);
305     NapiUtils::SetNamedProperty(workWrapper->env, obj, "errorNumber", errorNumber);
306     NapiUtils::SetNamedProperty(workWrapper->env, obj, "errorString", errorString);
307     std::pair<napi_value, napi_value> arg = {NapiUtils::GetUndefined(workWrapper->env), obj};
308     workWrapper->manager->Emit(workWrapper->type, arg);
309     NapiUtils::CloseScope(workWrapper->env, scope);
310     delete workWrapper;
311     delete work;
312 }
313 } // namespace
314 
MonitorServer()315 MonitorServer::MonitorServer() {}
316 
~MonitorServer()317 MonitorServer::~MonitorServer() {}
318 
On(napi_env env,napi_callback_info info)319 napi_value MonitorServer::On(napi_env env, napi_callback_info info)
320 {
321     napi_value thisVal = nullptr;
322     size_t paramsCount = MAX_PARAM_NUM;
323     napi_value params[MAX_PARAM_NUM] = {nullptr};
324     NAPI_CALL(env, napi_get_cb_info(env, info, &paramsCount, params, &thisVal, nullptr));
325 
326     if (paramsCount != PARAM_OPTION_CALLBACK || NapiUtils::GetValueType(env, params[0]) != napi_string ||
327         NapiUtils::GetValueType(env, params[1]) != napi_function) {
328         NETSTACK_LOGE("on off once interface para: [string, function]");
329         napi_throw_error(env, std::to_string(PARSE_ERROR_CODE).c_str(), PARSE_ERROR_MSG);
330         return NapiUtils::GetUndefined(env);
331     }
332     std::shared_ptr<EventManager> *sharedManager = nullptr;
333     napi_unwrap(env, thisVal, reinterpret_cast<void **>(&sharedManager));
334     if (sharedManager == nullptr || *sharedManager == nullptr) {
335         NETSTACK_LOGE("manager is nullptr");
336         return NapiUtils::GetUndefined(env);
337     }
338     auto manager = *sharedManager;
339     auto tlsSocketServer = reinterpret_cast<TLSSocketServer *>(manager->GetData());
340     if (tlsSocketServer == nullptr) {
341         NETSTACK_LOGE("tlsSocketServer is null");
342         return NapiUtils::GetUndefined(env);
343     }
344 
345     const std::string event = NapiUtils::GetStringFromValueUtf8(env, params[0]);
346     auto itor = monitors_.find(event);
347     if (itor != monitors_.end()) {
348         NETSTACK_LOGE("monitor is exits %{public}s", event.c_str());
349         return NapiUtils::GetUndefined(env);
350     }
351     manager->AddListener(env, event, params[1], false, false);
352     TLSServerRegEvent(event, tlsSocketServer, manager);
353     return NapiUtils::GetUndefined(env);
354 }
355 
ConnectionOn(napi_env env,napi_callback_info info)356 napi_value MonitorServer::ConnectionOn(napi_env env, napi_callback_info info)
357 {
358     napi_value thisVal = nullptr;
359     size_t paramsCount = MAX_PARAM_NUM;
360     napi_value params[MAX_PARAM_NUM] = {nullptr};
361     NAPI_CALL(env, napi_get_cb_info(env, info, &paramsCount, params, &thisVal, nullptr));
362 
363     if (!NapiUtils::HasNamedProperty(env, thisVal,
364                                      TLSSocketServerModuleExports::TLSSocketConnection::PROPERTY_CLIENT_ID)) {
365         NETSTACK_LOGI("not found Property clientId");
366         return NapiUtils::GetUndefined(env);
367     }
368 
369     int clientid = NapiUtils::GetInt32Property(env, thisVal,
370                                                TLSSocketServerModuleExports::TLSSocketConnection::PROPERTY_CLIENT_ID);
371 
372     if (paramsCount != PARAM_OPTION_CALLBACK || NapiUtils::GetValueType(env, params[0]) != napi_string ||
373         NapiUtils::GetValueType(env, params[1]) != napi_function) {
374         NETSTACK_LOGE("on off once interface para: [string, function]");
375         napi_throw_error(env, std::to_string(PARSE_ERROR_CODE).c_str(), PARSE_ERROR_MSG);
376         return NapiUtils::GetUndefined(env);
377     }
378     std::shared_ptr<EventManager> *sharedManager = nullptr;
379     napi_unwrap(env, thisVal, reinterpret_cast<void **>(&sharedManager));
380     if (sharedManager == nullptr || *sharedManager == nullptr) {
381         NETSTACK_LOGE("manager is nullptr");
382         return NapiUtils::GetUndefined(env);
383     }
384     auto manager = *sharedManager;
385     auto tlsSocketServer = reinterpret_cast<TLSSocketServer *>(manager->GetData());
386     if (tlsSocketServer == nullptr) {
387         NETSTACK_LOGE("tlsSocketServer is null");
388         return NapiUtils::GetUndefined(env);
389     }
390 
391     const std::string event = NapiUtils::GetStringFromValueUtf8(env, params[0]);
392 
393     manager->AddListener(env, event, params[1], false, false);
394     TLSConnectionRegEvent(event, tlsSocketServer, clientid, manager);
395     return NapiUtils::GetUndefined(env);
396 }
397 
Off(napi_env env,napi_callback_info info)398 napi_value MonitorServer::Off(napi_env env, napi_callback_info info)
399 {
400     napi_value thisVal = nullptr;
401     size_t paramsCount = MAX_PARAM_NUM;
402     napi_value params[MAX_PARAM_NUM] = {nullptr};
403     NAPI_CALL(env, napi_get_cb_info(env, info, &paramsCount, params, &thisVal, nullptr));
404 
405     if ((paramsCount != PARAM_OPTION && paramsCount != PARAM_OPTION_CALLBACK) ||
406         NapiUtils::GetValueType(env, params[0]) != napi_string) {
407         NETSTACK_LOGE("on off once interface para: [string, function?]");
408         napi_throw_error(env, std::to_string(PARSE_ERROR_CODE).c_str(), PARSE_ERROR_MSG);
409         return NapiUtils::GetUndefined(env);
410     }
411 
412     if (paramsCount == PARAM_OPTION_CALLBACK && NapiUtils::GetValueType(env, params[1]) != napi_function) {
413         NETSTACK_LOGE("on off once interface para: [string, function]");
414         napi_throw_error(env, std::to_string(PARSE_ERROR_CODE).c_str(), PARSE_ERROR_MSG);
415         return NapiUtils::GetUndefined(env);
416     }
417     std::shared_ptr<EventManager> *sharedManager = nullptr;
418     napi_unwrap(env, thisVal, reinterpret_cast<void **>(&sharedManager));
419     if (sharedManager == nullptr || *sharedManager == nullptr) {
420         NETSTACK_LOGE("manager is nullptr");
421         return NapiUtils::GetUndefined(env);
422     }
423     auto manager = *sharedManager;
424     auto tlsSocketServer = reinterpret_cast<TLSSocketServer *>(manager->GetData());
425     if (tlsSocketServer == nullptr) {
426         NETSTACK_LOGE("tlsSocketServer is null");
427         return NapiUtils::GetUndefined(env);
428     }
429 
430     const std::string event = NapiUtils::GetStringFromValueUtf8(env, params[0]);
431     auto itor = monitors_.find(event);
432     if (itor == monitors_.end()) {
433         NETSTACK_LOGE("monitor is off %{public}s", event.c_str());
434         return NapiUtils::GetUndefined(env);
435     }
436 
437     if (event == EVENT_CONNECT) {
438         monitors_.erase(EVENT_CONNECT);
439         tlsSocketServer->OffConnect();
440     }
441 
442     if (event == EVENT_ERROR) {
443         monitors_.erase(EVENT_ERROR);
444         tlsSocketServer->OffError();
445     }
446 
447     if (paramsCount == PARAM_OPTION_CALLBACK) {
448         manager->DeleteListener(event, params[1]);
449     } else {
450         manager->DeleteListener(event);
451     }
452     return NapiUtils::GetUndefined(env);
453 }
454 
ConnectionOff(napi_env env,napi_callback_info info)455 napi_value MonitorServer::ConnectionOff(napi_env env, napi_callback_info info)
456 {
457     napi_value thisVal = nullptr;
458     size_t paramsCount = MAX_PARAM_NUM;
459     napi_value params[MAX_PARAM_NUM] = {nullptr};
460     NAPI_CALL(env, napi_get_cb_info(env, info, &paramsCount, params, &thisVal, nullptr));
461 
462     int clientid = NapiUtils::GetInt32Property(env, thisVal,
463                                                TLSSocketServerModuleExports::TLSSocketConnection::PROPERTY_CLIENT_ID);
464 
465     if ((paramsCount != PARAM_OPTION && paramsCount != PARAM_OPTION_CALLBACK) ||
466         NapiUtils::GetValueType(env, params[0]) != napi_string) {
467         NETSTACK_LOGE("on off once interface para: [string, function?]");
468         napi_throw_error(env, std::to_string(PARSE_ERROR_CODE).c_str(), PARSE_ERROR_MSG);
469         return NapiUtils::GetUndefined(env);
470     }
471 
472     if (paramsCount == PARAM_OPTION_CALLBACK && NapiUtils::GetValueType(env, params[1]) != napi_function) {
473         NETSTACK_LOGE("on off once interface para: [string, function]");
474         napi_throw_error(env, std::to_string(PARSE_ERROR_CODE).c_str(), PARSE_ERROR_MSG);
475         return NapiUtils::GetUndefined(env);
476     }
477     std::shared_ptr<EventManager> *sharedManager = nullptr;
478     napi_unwrap(env, thisVal, reinterpret_cast<void **>(&sharedManager));
479     if (sharedManager == nullptr || *sharedManager == nullptr) {
480         NETSTACK_LOGE("manager is nullptr");
481         return NapiUtils::GetUndefined(env);
482     }
483     auto manager = *sharedManager;
484     auto tlsSocketServer = reinterpret_cast<TLSSocketServer *>(manager->GetData());
485     if (tlsSocketServer == nullptr) {
486         NETSTACK_LOGE("tlsSocketServer is null");
487         return NapiUtils::GetUndefined(env);
488     }
489 
490     const std::string event = NapiUtils::GetStringFromValueUtf8(env, params[0]);
491     auto itor = monitors_.find(event);
492     if (itor == monitors_.end()) {
493         NETSTACK_LOGE("monitor is off %{public}s", event.c_str());
494         return NapiUtils::GetUndefined(env);
495     }
496     TLSConnectionUnRegEvent(event, tlsSocketServer, clientid);
497     if (paramsCount == PARAM_OPTION_CALLBACK) {
498         manager->DeleteListener(event, params[1]);
499     } else {
500         manager->DeleteListener(event);
501     }
502     return NapiUtils::GetUndefined(env);
503 }
504 
TLSServerRegEvent(std::string event,TLSSocketServer * tlsSocketServer,const std::shared_ptr<EventManager> & ServerEventManager)505 void MonitorServer::TLSServerRegEvent(std::string event, TLSSocketServer *tlsSocketServer,
506                                       const std::shared_ptr<EventManager> &ServerEventManager)
507 {
508     if (event == EVENT_CONNECT) {
509         monitors_.insert(EVENT_CONNECT);
510         tlsSocketServer->OnConnect(
511             [this, ServerEventManager](auto clientFd, std::shared_ptr<EventManager> eventManager) {
512                 if (ServerEventManager->HasEventListener(std::string(EVENT_CONNECT))) {
513                     auto messageParma = new MonitorServer::MessageParma();
514                     messageParma->clientID = clientFd;
515                     messageParma->eventManager = eventManager;
516                     ServerEventManager->EmitByUvWithoutCheckShared(std::string(EVENT_CONNECT), messageParma,
517                         EventConnectCallback);
518                 }
519             });
520     }
521     if (event == EVENT_ERROR) {
522         monitors_.insert(EVENT_ERROR);
523         tlsSocketServer->OnError([this, ServerEventManager](auto errorNumber, auto errorString) {
524             errorNumber_ = errorNumber;
525             errorString_ = errorString;
526             ServerEventManager->EmitByUvWithoutCheckShared(std::string(EVENT_ERROR), static_cast<void *>(this),
527                 EventErrorCallback);
528         });
529     }
530 }
531 
TLSConnectionRegEvent(std::string event,TLSSocketServer * tlsSocketServer,int clientId,const std::shared_ptr<EventManager> & eventManager)532 void MonitorServer::TLSConnectionRegEvent(std::string event, TLSSocketServer *tlsSocketServer, int clientId,
533                                           const std::shared_ptr<EventManager> &eventManager)
534 {
535     if (event == EVENT_MESSAGE) {
536         InsertEventMessage(tlsSocketServer, clientId, eventManager);
537     }
538     if (event == EVENT_CLOSE) {
539         monitors_.insert(EVENT_CLOSE);
540         auto ptrConnection = tlsSocketServer->GetConnectionByClientID(clientId);
541         if (ptrConnection != nullptr) {
542             ptrConnection->OnClose([this, eventManager](auto clientFd) {
543                 eventManager->EmitByUvWithoutCheckShared(std::string(EVENT_CLOSE), static_cast<void *>(this),
544                     EventCloseCallback);
545             });
546         }
547     }
548     if (event == EVENT_ERROR) {
549         monitors_.insert(EVENT_ERROR);
550         auto ptrConnection = tlsSocketServer->GetConnectionByClientID(clientId);
551         if (ptrConnection != nullptr) {
552             ptrConnection->OnError([this, eventManager](auto errorNumber, auto errorString) {
553                 eventManager->EmitByUvWithoutCheckShared(std::string(EVENT_ERROR), static_cast<void *>(this),
554                     EventErrorCallback);
555             });
556         }
557     }
558 }
559 
InsertEventMessage(TLSSocketServer * tlsSocketServer,int clientId,const std::shared_ptr<EventManager> & eventManager)560 void MonitorServer::InsertEventMessage(TLSSocketServer *tlsSocketServer, int clientId,
561     const std::shared_ptr<EventManager> &eventManager)
562 {
563     if (tlsSocketServer == nullptr) {
564         return;
565     }
566     monitors_.insert(EVENT_MESSAGE);
567     auto ptrConnection = tlsSocketServer->GetConnectionByClientID(clientId);
568     if (ptrConnection != nullptr) {
569         ptrConnection->OnMessage([this, eventManager](auto clientFd, auto data, auto remoteInfo) {
570             if (eventManager->HasEventListener(std::string(EVENT_MESSAGE))) {
571                 auto messageRecvParma = new MessageRecvParma();
572                 messageRecvParma->clientID = clientFd;
573                 messageRecvParma->data = data;
574                 messageRecvParma->remoteInfo_.SetAddress(remoteInfo.GetAddress());
575                 messageRecvParma->remoteInfo_.SetFamilyByStr(remoteInfo.GetFamily());
576                 messageRecvParma->remoteInfo_.SetPort(remoteInfo.GetPort());
577                 messageRecvParma->remoteInfo_.SetSize(remoteInfo.GetSize());
578                 eventManager->EmitByUvWithoutCheckShared(std::string(EVENT_MESSAGE), messageRecvParma,
579                     EventMessageCallback);
580             }
581         });
582     }
583 }
584 
TLSConnectionUnRegEvent(std::string event,TLSSocketServer * tlsSocketServer,int clientId)585 void MonitorServer::TLSConnectionUnRegEvent(std::string event, TLSSocketServer *tlsSocketServer, int clientId)
586 {
587     if (event == EVENT_MESSAGE) {
588         monitors_.erase(EVENT_MESSAGE);
589         auto ptrConnection = tlsSocketServer->GetConnectionByClientID(clientId);
590         if (ptrConnection != nullptr) {
591             ptrConnection->OffMessage();
592         }
593     }
594     if (event == EVENT_CLOSE) {
595         monitors_.erase(EVENT_CLOSE);
596         auto ptrConnection = tlsSocketServer->GetConnectionByClientID(clientId);
597         if (ptrConnection != nullptr) {
598             ptrConnection->OffClose();
599         }
600     }
601     if (event == EVENT_ERROR) {
602         monitors_.erase(EVENT_ERROR);
603         auto ptrConnection = tlsSocketServer->GetConnectionByClientID(clientId);
604         if (ptrConnection != nullptr) {
605             ptrConnection->OffError();
606         }
607     }
608 }
609 } // namespace TlsSocketServer
610 } // namespace NetStack
611 } // namespace OHOS
612