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, ¶msCount, 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, ¶msCount, 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, ¶msCount, 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, ¶msCount, 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