11e934351Sopenharmony_ci/* 21e934351Sopenharmony_ci * Copyright (c) 2021-2024 Huawei Device Co., Ltd. 31e934351Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 41e934351Sopenharmony_ci * you may not use this file except in compliance with the License. 51e934351Sopenharmony_ci * You may obtain a copy of the License at 61e934351Sopenharmony_ci * 71e934351Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 81e934351Sopenharmony_ci * 91e934351Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 101e934351Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 111e934351Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 121e934351Sopenharmony_ci * See the License for the specific language governing permissions and 131e934351Sopenharmony_ci * limitations under the License. 141e934351Sopenharmony_ci */ 151e934351Sopenharmony_ci 161e934351Sopenharmony_ci#include "module_template.h" 171e934351Sopenharmony_ci 181e934351Sopenharmony_ci#include <algorithm> 191e934351Sopenharmony_ci#include <functional> 201e934351Sopenharmony_ci#include <initializer_list> 211e934351Sopenharmony_ci#include <memory> 221e934351Sopenharmony_ci#include <new> 231e934351Sopenharmony_ci#include <string> 241e934351Sopenharmony_ci 251e934351Sopenharmony_ci#include "event_manager.h" 261e934351Sopenharmony_ci#include "netstack_log.h" 271e934351Sopenharmony_ci 281e934351Sopenharmony_cinamespace OHOS::NetStack::ModuleTemplate { 291e934351Sopenharmony_cistatic constexpr const int EVENT_PARAM_NUM = 2; 301e934351Sopenharmony_cistatic constexpr const char *INTERFACE_LOCAL_SOCKET = "LocalSocket"; 311e934351Sopenharmony_cistatic constexpr const char *INTERFACE_TLS_SOCKET = "TLSSocket"; 321e934351Sopenharmony_cistatic constexpr const char *INTERFACE_WEB_SOCKET = "WebSocket"; 331e934351Sopenharmony_cistatic constexpr const char *INTERFACE_HTTP_REQUEST = "OHOS_NET_HTTP_HttpRequest"; 341e934351Sopenharmony_ci 351e934351Sopenharmony_cinapi_value OnManagerWrapper(napi_env env, napi_callback_info info, const std::initializer_list<std::string> &events, 361e934351Sopenharmony_ci bool asyncCallback) 371e934351Sopenharmony_ci{ 381e934351Sopenharmony_ci napi_value thisVal = nullptr; 391e934351Sopenharmony_ci size_t paramsCount = MAX_PARAM_NUM; 401e934351Sopenharmony_ci napi_value params[MAX_PARAM_NUM] = {nullptr}; 411e934351Sopenharmony_ci NAPI_CALL(env, napi_get_cb_info(env, info, ¶msCount, params, &thisVal, nullptr)); 421e934351Sopenharmony_ci 431e934351Sopenharmony_ci if (paramsCount != EVENT_PARAM_NUM || NapiUtils::GetValueType(env, params[0]) != napi_string || 441e934351Sopenharmony_ci NapiUtils::GetValueType(env, params[1]) != napi_function) { 451e934351Sopenharmony_ci NETSTACK_LOGE("on off once interface para: [string, function]"); 461e934351Sopenharmony_ci napi_throw_error(env, std::to_string(PARSE_ERROR_CODE).c_str(), PARSE_ERROR_MSG); 471e934351Sopenharmony_ci return NapiUtils::GetUndefined(env); 481e934351Sopenharmony_ci } 491e934351Sopenharmony_ci 501e934351Sopenharmony_ci std::string event = NapiUtils::GetStringFromValueUtf8(env, params[0]); 511e934351Sopenharmony_ci if (std::find(events.begin(), events.end(), event) == events.end()) { 521e934351Sopenharmony_ci return NapiUtils::GetUndefined(env); 531e934351Sopenharmony_ci } 541e934351Sopenharmony_ci 551e934351Sopenharmony_ci EventManagerWrapper *wrapper = nullptr; 561e934351Sopenharmony_ci auto napiRet = napi_unwrap(env, thisVal, reinterpret_cast<void **>(&wrapper)); 571e934351Sopenharmony_ci if (napiRet != napi_ok) { 581e934351Sopenharmony_ci NETSTACK_LOGE("get event manager in napi_unwrap failed, napiRet is %{public}d", napiRet); 591e934351Sopenharmony_ci return NapiUtils::GetUndefined(env); 601e934351Sopenharmony_ci } 611e934351Sopenharmony_ci if (wrapper == nullptr) { 621e934351Sopenharmony_ci NETSTACK_LOGE("get event manager in napi_unwrap failed, napiRet is %{public}d", napiRet); 631e934351Sopenharmony_ci return NapiUtils::GetUndefined(env); 641e934351Sopenharmony_ci } 651e934351Sopenharmony_ci auto manager = wrapper->sharedManager; 661e934351Sopenharmony_ci if (manager == nullptr) { 671e934351Sopenharmony_ci NETSTACK_LOGE("get event manager in napi_unwrap failed, napiRet is %{public}d", napiRet); 681e934351Sopenharmony_ci return NapiUtils::GetUndefined(env); 691e934351Sopenharmony_ci } 701e934351Sopenharmony_ci if (manager != nullptr) { 711e934351Sopenharmony_ci manager->AddListener(env, event, params[1], false, asyncCallback); 721e934351Sopenharmony_ci } 731e934351Sopenharmony_ci 741e934351Sopenharmony_ci return NapiUtils::GetUndefined(env); 751e934351Sopenharmony_ci} 761e934351Sopenharmony_ci 771e934351Sopenharmony_cinapi_value OnceManagerWrapper(napi_env env, napi_callback_info info, const std::initializer_list<std::string> &events, 781e934351Sopenharmony_ci bool asyncCallback) 791e934351Sopenharmony_ci{ 801e934351Sopenharmony_ci napi_value thisVal = nullptr; 811e934351Sopenharmony_ci size_t paramsCount = MAX_PARAM_NUM; 821e934351Sopenharmony_ci napi_value params[MAX_PARAM_NUM] = {nullptr}; 831e934351Sopenharmony_ci NAPI_CALL(env, napi_get_cb_info(env, info, ¶msCount, params, &thisVal, nullptr)); 841e934351Sopenharmony_ci 851e934351Sopenharmony_ci if (paramsCount != EVENT_PARAM_NUM || NapiUtils::GetValueType(env, params[0]) != napi_string || 861e934351Sopenharmony_ci NapiUtils::GetValueType(env, params[1]) != napi_function) { 871e934351Sopenharmony_ci NETSTACK_LOGE("on off once interface para: [string, function]"); 881e934351Sopenharmony_ci return NapiUtils::GetUndefined(env); 891e934351Sopenharmony_ci } 901e934351Sopenharmony_ci 911e934351Sopenharmony_ci std::string event = NapiUtils::GetStringFromValueUtf8(env, params[0]); 921e934351Sopenharmony_ci if (std::find(events.begin(), events.end(), event) == events.end()) { 931e934351Sopenharmony_ci return NapiUtils::GetUndefined(env); 941e934351Sopenharmony_ci } 951e934351Sopenharmony_ci 961e934351Sopenharmony_ci EventManagerWrapper *wrapper = nullptr; 971e934351Sopenharmony_ci auto napiRet = napi_unwrap(env, thisVal, reinterpret_cast<void **>(&wrapper)); 981e934351Sopenharmony_ci if (napiRet != napi_ok) { 991e934351Sopenharmony_ci NETSTACK_LOGE("get event manager in napi_unwrap failed, napiRet is %{public}d", napiRet); 1001e934351Sopenharmony_ci return NapiUtils::GetUndefined(env); 1011e934351Sopenharmony_ci } 1021e934351Sopenharmony_ci if (wrapper == nullptr) { 1031e934351Sopenharmony_ci NETSTACK_LOGE("get event manager in napi_unwrap failed, napiRet is %{public}d", napiRet); 1041e934351Sopenharmony_ci return NapiUtils::GetUndefined(env); 1051e934351Sopenharmony_ci } 1061e934351Sopenharmony_ci auto manager = wrapper->sharedManager; 1071e934351Sopenharmony_ci if (manager != nullptr) { 1081e934351Sopenharmony_ci manager->AddListener(env, event, params[1], true, asyncCallback); 1091e934351Sopenharmony_ci } 1101e934351Sopenharmony_ci 1111e934351Sopenharmony_ci return NapiUtils::GetUndefined(env); 1121e934351Sopenharmony_ci} 1131e934351Sopenharmony_ci 1141e934351Sopenharmony_cinapi_value OffManagerWrapper(napi_env env, napi_callback_info info, const std::initializer_list<std::string> &events) 1151e934351Sopenharmony_ci{ 1161e934351Sopenharmony_ci napi_value thisVal = nullptr; 1171e934351Sopenharmony_ci size_t paramsCount = MAX_PARAM_NUM; 1181e934351Sopenharmony_ci napi_value params[MAX_PARAM_NUM] = {nullptr}; 1191e934351Sopenharmony_ci NAPI_CALL(env, napi_get_cb_info(env, info, ¶msCount, params, &thisVal, nullptr)); 1201e934351Sopenharmony_ci 1211e934351Sopenharmony_ci if ((paramsCount != 1 && paramsCount != EVENT_PARAM_NUM) || 1221e934351Sopenharmony_ci NapiUtils::GetValueType(env, params[0]) != napi_string) { 1231e934351Sopenharmony_ci NETSTACK_LOGE("on off once interface para: [string, function?]"); 1241e934351Sopenharmony_ci napi_throw_error(env, std::to_string(PARSE_ERROR_CODE).c_str(), PARSE_ERROR_MSG); 1251e934351Sopenharmony_ci return NapiUtils::GetUndefined(env); 1261e934351Sopenharmony_ci } 1271e934351Sopenharmony_ci 1281e934351Sopenharmony_ci if (paramsCount == EVENT_PARAM_NUM && NapiUtils::GetValueType(env, params[1]) != napi_function) { 1291e934351Sopenharmony_ci NETSTACK_LOGE("on off once interface para: [string, function]"); 1301e934351Sopenharmony_ci napi_throw_error(env, std::to_string(PARSE_ERROR_CODE).c_str(), PARSE_ERROR_MSG); 1311e934351Sopenharmony_ci return NapiUtils::GetUndefined(env); 1321e934351Sopenharmony_ci } 1331e934351Sopenharmony_ci 1341e934351Sopenharmony_ci std::string event = NapiUtils::GetStringFromValueUtf8(env, params[0]); 1351e934351Sopenharmony_ci if (std::find(events.begin(), events.end(), event) == events.end()) { 1361e934351Sopenharmony_ci return NapiUtils::GetUndefined(env); 1371e934351Sopenharmony_ci } 1381e934351Sopenharmony_ci 1391e934351Sopenharmony_ci EventManagerWrapper *wrapper = nullptr; 1401e934351Sopenharmony_ci auto napiRet = napi_unwrap(env, thisVal, reinterpret_cast<void **>(&wrapper)); 1411e934351Sopenharmony_ci if (napiRet != napi_ok) { 1421e934351Sopenharmony_ci NETSTACK_LOGE("get event manager in napi_unwrap failed, napiRet is %{public}d", napiRet); 1431e934351Sopenharmony_ci return NapiUtils::GetUndefined(env); 1441e934351Sopenharmony_ci } 1451e934351Sopenharmony_ci if (wrapper == nullptr) { 1461e934351Sopenharmony_ci NETSTACK_LOGE("get event manager in napi_unwrap failed, napiRet is %{public}d", napiRet); 1471e934351Sopenharmony_ci return NapiUtils::GetUndefined(env); 1481e934351Sopenharmony_ci } 1491e934351Sopenharmony_ci auto manager = wrapper->sharedManager; 1501e934351Sopenharmony_ci if (manager == nullptr) { 1511e934351Sopenharmony_ci NETSTACK_LOGE("get event manager in napi_unwrap failed, napiRet is %{public}d", napiRet); 1521e934351Sopenharmony_ci return NapiUtils::GetUndefined(env); 1531e934351Sopenharmony_ci } 1541e934351Sopenharmony_ci if (manager != nullptr) { 1551e934351Sopenharmony_ci if (paramsCount == EVENT_PARAM_NUM) { 1561e934351Sopenharmony_ci manager->DeleteListener(event, params[1]); 1571e934351Sopenharmony_ci } else { 1581e934351Sopenharmony_ci manager->DeleteListener(event); 1591e934351Sopenharmony_ci } 1601e934351Sopenharmony_ci } 1611e934351Sopenharmony_ci 1621e934351Sopenharmony_ci return NapiUtils::GetUndefined(env); 1631e934351Sopenharmony_ci} 1641e934351Sopenharmony_ci 1651e934351Sopenharmony_cinapi_value OnSharedManager(napi_env env, napi_callback_info info, const std::initializer_list<std::string> &events, 1661e934351Sopenharmony_ci bool asyncCallback) 1671e934351Sopenharmony_ci{ 1681e934351Sopenharmony_ci napi_value thisVal = nullptr; 1691e934351Sopenharmony_ci size_t paramsCount = MAX_PARAM_NUM; 1701e934351Sopenharmony_ci napi_value params[MAX_PARAM_NUM] = {nullptr}; 1711e934351Sopenharmony_ci NAPI_CALL(env, napi_get_cb_info(env, info, ¶msCount, params, &thisVal, nullptr)); 1721e934351Sopenharmony_ci 1731e934351Sopenharmony_ci if (paramsCount != EVENT_PARAM_NUM || NapiUtils::GetValueType(env, params[0]) != napi_string || 1741e934351Sopenharmony_ci NapiUtils::GetValueType(env, params[1]) != napi_function) { 1751e934351Sopenharmony_ci NETSTACK_LOGE("on off once interface para: [string, function]"); 1761e934351Sopenharmony_ci napi_throw_error(env, std::to_string(PARSE_ERROR_CODE).c_str(), PARSE_ERROR_MSG); 1771e934351Sopenharmony_ci return NapiUtils::GetUndefined(env); 1781e934351Sopenharmony_ci } 1791e934351Sopenharmony_ci 1801e934351Sopenharmony_ci std::string event = NapiUtils::GetStringFromValueUtf8(env, params[0]); 1811e934351Sopenharmony_ci if (std::find(events.begin(), events.end(), event) == events.end()) { 1821e934351Sopenharmony_ci return NapiUtils::GetUndefined(env); 1831e934351Sopenharmony_ci } 1841e934351Sopenharmony_ci 1851e934351Sopenharmony_ci std::shared_ptr<EventManager> *sharedManager = nullptr; 1861e934351Sopenharmony_ci auto napiRet = napi_unwrap(env, thisVal, reinterpret_cast<void **>(&sharedManager)); 1871e934351Sopenharmony_ci if (napiRet != napi_ok) { 1881e934351Sopenharmony_ci NETSTACK_LOGE("get event manager in napi_unwrap failed, napiRet is %{public}d", napiRet); 1891e934351Sopenharmony_ci return NapiUtils::GetUndefined(env); 1901e934351Sopenharmony_ci } 1911e934351Sopenharmony_ci if (sharedManager == nullptr) { 1921e934351Sopenharmony_ci NETSTACK_LOGE("get event manager in napi_unwrap failed, napiRet is %{public}d", napiRet); 1931e934351Sopenharmony_ci return NapiUtils::GetUndefined(env); 1941e934351Sopenharmony_ci } 1951e934351Sopenharmony_ci auto manager = *sharedManager; 1961e934351Sopenharmony_ci if (manager == nullptr) { 1971e934351Sopenharmony_ci NETSTACK_LOGE("get event manager in napi_unwrap failed, napiRet is %{public}d", napiRet); 1981e934351Sopenharmony_ci return NapiUtils::GetUndefined(env); 1991e934351Sopenharmony_ci } 2001e934351Sopenharmony_ci if (manager != nullptr) { 2011e934351Sopenharmony_ci manager->AddListener(env, event, params[1], false, asyncCallback); 2021e934351Sopenharmony_ci } 2031e934351Sopenharmony_ci 2041e934351Sopenharmony_ci return NapiUtils::GetUndefined(env); 2051e934351Sopenharmony_ci} 2061e934351Sopenharmony_ci 2071e934351Sopenharmony_cinapi_value OnceSharedManager(napi_env env, napi_callback_info info, const std::initializer_list<std::string> &events, 2081e934351Sopenharmony_ci bool asyncCallback) 2091e934351Sopenharmony_ci{ 2101e934351Sopenharmony_ci napi_value thisVal = nullptr; 2111e934351Sopenharmony_ci size_t paramsCount = MAX_PARAM_NUM; 2121e934351Sopenharmony_ci napi_value params[MAX_PARAM_NUM] = {nullptr}; 2131e934351Sopenharmony_ci NAPI_CALL(env, napi_get_cb_info(env, info, ¶msCount, params, &thisVal, nullptr)); 2141e934351Sopenharmony_ci 2151e934351Sopenharmony_ci if (paramsCount != EVENT_PARAM_NUM || NapiUtils::GetValueType(env, params[0]) != napi_string || 2161e934351Sopenharmony_ci NapiUtils::GetValueType(env, params[1]) != napi_function) { 2171e934351Sopenharmony_ci NETSTACK_LOGE("on off once interface para: [string, function]"); 2181e934351Sopenharmony_ci return NapiUtils::GetUndefined(env); 2191e934351Sopenharmony_ci } 2201e934351Sopenharmony_ci 2211e934351Sopenharmony_ci std::string event = NapiUtils::GetStringFromValueUtf8(env, params[0]); 2221e934351Sopenharmony_ci if (std::find(events.begin(), events.end(), event) == events.end()) { 2231e934351Sopenharmony_ci return NapiUtils::GetUndefined(env); 2241e934351Sopenharmony_ci } 2251e934351Sopenharmony_ci 2261e934351Sopenharmony_ci std::shared_ptr<EventManager> *sharedManager = nullptr; 2271e934351Sopenharmony_ci auto napiRet = napi_unwrap(env, thisVal, reinterpret_cast<void **>(&sharedManager)); 2281e934351Sopenharmony_ci if (napiRet != napi_ok) { 2291e934351Sopenharmony_ci NETSTACK_LOGE("get event manager in napi_unwrap failed, napiRet is %{public}d", napiRet); 2301e934351Sopenharmony_ci return NapiUtils::GetUndefined(env); 2311e934351Sopenharmony_ci } 2321e934351Sopenharmony_ci if (sharedManager == nullptr) { 2331e934351Sopenharmony_ci NETSTACK_LOGE("get event manager in napi_unwrap failed, napiRet is %{public}d", napiRet); 2341e934351Sopenharmony_ci return NapiUtils::GetUndefined(env); 2351e934351Sopenharmony_ci } 2361e934351Sopenharmony_ci auto manager = *sharedManager; 2371e934351Sopenharmony_ci if (manager != nullptr) { 2381e934351Sopenharmony_ci manager->AddListener(env, event, params[1], true, asyncCallback); 2391e934351Sopenharmony_ci } 2401e934351Sopenharmony_ci 2411e934351Sopenharmony_ci return NapiUtils::GetUndefined(env); 2421e934351Sopenharmony_ci} 2431e934351Sopenharmony_ci 2441e934351Sopenharmony_cinapi_value OffSharedManager(napi_env env, napi_callback_info info, const std::initializer_list<std::string> &events) 2451e934351Sopenharmony_ci{ 2461e934351Sopenharmony_ci napi_value thisVal = nullptr; 2471e934351Sopenharmony_ci size_t paramsCount = MAX_PARAM_NUM; 2481e934351Sopenharmony_ci napi_value params[MAX_PARAM_NUM] = {nullptr}; 2491e934351Sopenharmony_ci NAPI_CALL(env, napi_get_cb_info(env, info, ¶msCount, params, &thisVal, nullptr)); 2501e934351Sopenharmony_ci 2511e934351Sopenharmony_ci if ((paramsCount != 1 && paramsCount != EVENT_PARAM_NUM) || 2521e934351Sopenharmony_ci NapiUtils::GetValueType(env, params[0]) != napi_string) { 2531e934351Sopenharmony_ci NETSTACK_LOGE("on off once interface para: [string, function?]"); 2541e934351Sopenharmony_ci napi_throw_error(env, std::to_string(PARSE_ERROR_CODE).c_str(), PARSE_ERROR_MSG); 2551e934351Sopenharmony_ci return NapiUtils::GetUndefined(env); 2561e934351Sopenharmony_ci } 2571e934351Sopenharmony_ci 2581e934351Sopenharmony_ci if (paramsCount == EVENT_PARAM_NUM && NapiUtils::GetValueType(env, params[1]) != napi_function) { 2591e934351Sopenharmony_ci NETSTACK_LOGE("on off once interface para: [string, function]"); 2601e934351Sopenharmony_ci napi_throw_error(env, std::to_string(PARSE_ERROR_CODE).c_str(), PARSE_ERROR_MSG); 2611e934351Sopenharmony_ci return NapiUtils::GetUndefined(env); 2621e934351Sopenharmony_ci } 2631e934351Sopenharmony_ci 2641e934351Sopenharmony_ci std::string event = NapiUtils::GetStringFromValueUtf8(env, params[0]); 2651e934351Sopenharmony_ci if (std::find(events.begin(), events.end(), event) == events.end()) { 2661e934351Sopenharmony_ci return NapiUtils::GetUndefined(env); 2671e934351Sopenharmony_ci } 2681e934351Sopenharmony_ci 2691e934351Sopenharmony_ci std::shared_ptr<EventManager> *sharedManager = nullptr; 2701e934351Sopenharmony_ci auto napiRet = napi_unwrap(env, thisVal, reinterpret_cast<void **>(&sharedManager)); 2711e934351Sopenharmony_ci if (napiRet != napi_ok) { 2721e934351Sopenharmony_ci NETSTACK_LOGE("get event manager in napi_unwrap failed, napiRet is %{public}d", napiRet); 2731e934351Sopenharmony_ci return NapiUtils::GetUndefined(env); 2741e934351Sopenharmony_ci } 2751e934351Sopenharmony_ci if (sharedManager == nullptr) { 2761e934351Sopenharmony_ci NETSTACK_LOGE("get event manager in napi_unwrap failed, napiRet is %{public}d", napiRet); 2771e934351Sopenharmony_ci return NapiUtils::GetUndefined(env); 2781e934351Sopenharmony_ci } 2791e934351Sopenharmony_ci auto manager = *sharedManager; 2801e934351Sopenharmony_ci if (manager == nullptr) { 2811e934351Sopenharmony_ci NETSTACK_LOGE("get event manager in napi_unwrap failed, napiRet is %{public}d", napiRet); 2821e934351Sopenharmony_ci return NapiUtils::GetUndefined(env); 2831e934351Sopenharmony_ci } 2841e934351Sopenharmony_ci if (manager != nullptr) { 2851e934351Sopenharmony_ci if (paramsCount == EVENT_PARAM_NUM) { 2861e934351Sopenharmony_ci manager->DeleteListener(event, params[1]); 2871e934351Sopenharmony_ci } else { 2881e934351Sopenharmony_ci manager->DeleteListener(event); 2891e934351Sopenharmony_ci } 2901e934351Sopenharmony_ci } 2911e934351Sopenharmony_ci 2921e934351Sopenharmony_ci return NapiUtils::GetUndefined(env); 2931e934351Sopenharmony_ci} 2941e934351Sopenharmony_ci 2951e934351Sopenharmony_cinapi_value On(napi_env env, napi_callback_info info, const std::initializer_list<std::string> &events, 2961e934351Sopenharmony_ci bool asyncCallback) 2971e934351Sopenharmony_ci{ 2981e934351Sopenharmony_ci napi_value thisVal = nullptr; 2991e934351Sopenharmony_ci size_t paramsCount = MAX_PARAM_NUM; 3001e934351Sopenharmony_ci napi_value params[MAX_PARAM_NUM] = {nullptr}; 3011e934351Sopenharmony_ci NAPI_CALL(env, napi_get_cb_info(env, info, ¶msCount, params, &thisVal, nullptr)); 3021e934351Sopenharmony_ci 3031e934351Sopenharmony_ci if (paramsCount != EVENT_PARAM_NUM || NapiUtils::GetValueType(env, params[0]) != napi_string || 3041e934351Sopenharmony_ci NapiUtils::GetValueType(env, params[1]) != napi_function) { 3051e934351Sopenharmony_ci NETSTACK_LOGE("on off once interface para: [string, function]"); 3061e934351Sopenharmony_ci napi_throw_error(env, std::to_string(PARSE_ERROR_CODE).c_str(), PARSE_ERROR_MSG); 3071e934351Sopenharmony_ci return NapiUtils::GetUndefined(env); 3081e934351Sopenharmony_ci } 3091e934351Sopenharmony_ci 3101e934351Sopenharmony_ci std::string event = NapiUtils::GetStringFromValueUtf8(env, params[0]); 3111e934351Sopenharmony_ci if (std::find(events.begin(), events.end(), event) == events.end()) { 3121e934351Sopenharmony_ci return NapiUtils::GetUndefined(env); 3131e934351Sopenharmony_ci } 3141e934351Sopenharmony_ci 3151e934351Sopenharmony_ci EventManager *manager = nullptr; 3161e934351Sopenharmony_ci napi_unwrap(env, thisVal, reinterpret_cast<void **>(&manager)); 3171e934351Sopenharmony_ci if (manager != nullptr) { 3181e934351Sopenharmony_ci manager->AddListener(env, event, params[1], false, asyncCallback); 3191e934351Sopenharmony_ci } 3201e934351Sopenharmony_ci 3211e934351Sopenharmony_ci return NapiUtils::GetUndefined(env); 3221e934351Sopenharmony_ci} 3231e934351Sopenharmony_ci 3241e934351Sopenharmony_cinapi_value Once(napi_env env, napi_callback_info info, const std::initializer_list<std::string> &events, 3251e934351Sopenharmony_ci bool asyncCallback) 3261e934351Sopenharmony_ci{ 3271e934351Sopenharmony_ci napi_value thisVal = nullptr; 3281e934351Sopenharmony_ci size_t paramsCount = MAX_PARAM_NUM; 3291e934351Sopenharmony_ci napi_value params[MAX_PARAM_NUM] = {nullptr}; 3301e934351Sopenharmony_ci NAPI_CALL(env, napi_get_cb_info(env, info, ¶msCount, params, &thisVal, nullptr)); 3311e934351Sopenharmony_ci 3321e934351Sopenharmony_ci if (paramsCount != EVENT_PARAM_NUM || NapiUtils::GetValueType(env, params[0]) != napi_string || 3331e934351Sopenharmony_ci NapiUtils::GetValueType(env, params[1]) != napi_function) { 3341e934351Sopenharmony_ci NETSTACK_LOGE("on off once interface para: [string, function]"); 3351e934351Sopenharmony_ci return NapiUtils::GetUndefined(env); 3361e934351Sopenharmony_ci } 3371e934351Sopenharmony_ci 3381e934351Sopenharmony_ci std::string event = NapiUtils::GetStringFromValueUtf8(env, params[0]); 3391e934351Sopenharmony_ci if (std::find(events.begin(), events.end(), event) == events.end()) { 3401e934351Sopenharmony_ci return NapiUtils::GetUndefined(env); 3411e934351Sopenharmony_ci } 3421e934351Sopenharmony_ci 3431e934351Sopenharmony_ci EventManager *manager = nullptr; 3441e934351Sopenharmony_ci napi_unwrap(env, thisVal, reinterpret_cast<void **>(&manager)); 3451e934351Sopenharmony_ci if (manager != nullptr) { 3461e934351Sopenharmony_ci manager->AddListener(env, event, params[1], true, asyncCallback); 3471e934351Sopenharmony_ci } 3481e934351Sopenharmony_ci 3491e934351Sopenharmony_ci return NapiUtils::GetUndefined(env); 3501e934351Sopenharmony_ci} 3511e934351Sopenharmony_ci 3521e934351Sopenharmony_cinapi_value Off(napi_env env, napi_callback_info info, const std::initializer_list<std::string> &events) 3531e934351Sopenharmony_ci{ 3541e934351Sopenharmony_ci napi_value thisVal = nullptr; 3551e934351Sopenharmony_ci size_t paramsCount = MAX_PARAM_NUM; 3561e934351Sopenharmony_ci napi_value params[MAX_PARAM_NUM] = {nullptr}; 3571e934351Sopenharmony_ci NAPI_CALL(env, napi_get_cb_info(env, info, ¶msCount, params, &thisVal, nullptr)); 3581e934351Sopenharmony_ci 3591e934351Sopenharmony_ci if ((paramsCount != 1 && paramsCount != EVENT_PARAM_NUM) || 3601e934351Sopenharmony_ci NapiUtils::GetValueType(env, params[0]) != napi_string) { 3611e934351Sopenharmony_ci NETSTACK_LOGE("on off once interface para: [string, function?]"); 3621e934351Sopenharmony_ci napi_throw_error(env, std::to_string(PARSE_ERROR_CODE).c_str(), PARSE_ERROR_MSG); 3631e934351Sopenharmony_ci return NapiUtils::GetUndefined(env); 3641e934351Sopenharmony_ci } 3651e934351Sopenharmony_ci 3661e934351Sopenharmony_ci if (paramsCount == EVENT_PARAM_NUM && NapiUtils::GetValueType(env, params[1]) != napi_function) { 3671e934351Sopenharmony_ci NETSTACK_LOGE("on off once interface para: [string, function]"); 3681e934351Sopenharmony_ci napi_throw_error(env, std::to_string(PARSE_ERROR_CODE).c_str(), PARSE_ERROR_MSG); 3691e934351Sopenharmony_ci return NapiUtils::GetUndefined(env); 3701e934351Sopenharmony_ci } 3711e934351Sopenharmony_ci 3721e934351Sopenharmony_ci std::string event = NapiUtils::GetStringFromValueUtf8(env, params[0]); 3731e934351Sopenharmony_ci if (std::find(events.begin(), events.end(), event) == events.end()) { 3741e934351Sopenharmony_ci return NapiUtils::GetUndefined(env); 3751e934351Sopenharmony_ci } 3761e934351Sopenharmony_ci 3771e934351Sopenharmony_ci EventManager *manager = nullptr; 3781e934351Sopenharmony_ci napi_unwrap(env, thisVal, reinterpret_cast<void **>(&manager)); 3791e934351Sopenharmony_ci if (manager != nullptr) { 3801e934351Sopenharmony_ci if (paramsCount == EVENT_PARAM_NUM) { 3811e934351Sopenharmony_ci manager->DeleteListener(event, params[1]); 3821e934351Sopenharmony_ci } else { 3831e934351Sopenharmony_ci manager->DeleteListener(event); 3841e934351Sopenharmony_ci } 3851e934351Sopenharmony_ci } 3861e934351Sopenharmony_ci 3871e934351Sopenharmony_ci return NapiUtils::GetUndefined(env); 3881e934351Sopenharmony_ci} 3891e934351Sopenharmony_ci 3901e934351Sopenharmony_civoid DefineClass(napi_env env, napi_value exports, const std::initializer_list<napi_property_descriptor> &properties, 3911e934351Sopenharmony_ci const std::string &className) 3921e934351Sopenharmony_ci{ 3931e934351Sopenharmony_ci auto constructor = [](napi_env env, napi_callback_info info) -> napi_value { 3941e934351Sopenharmony_ci napi_value thisVal = nullptr; 3951e934351Sopenharmony_ci NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVal, nullptr)); 3961e934351Sopenharmony_ci 3971e934351Sopenharmony_ci return thisVal; 3981e934351Sopenharmony_ci }; 3991e934351Sopenharmony_ci 4001e934351Sopenharmony_ci napi_value jsConstructor = nullptr; 4011e934351Sopenharmony_ci 4021e934351Sopenharmony_ci napi_property_descriptor descriptors[properties.size()]; 4031e934351Sopenharmony_ci std::copy(properties.begin(), properties.end(), descriptors); 4041e934351Sopenharmony_ci 4051e934351Sopenharmony_ci NAPI_CALL_RETURN_VOID(env, napi_define_class(env, className.c_str(), NAPI_AUTO_LENGTH, constructor, nullptr, 4061e934351Sopenharmony_ci properties.size(), descriptors, &jsConstructor)); 4071e934351Sopenharmony_ci (void)exports; 4081e934351Sopenharmony_ci auto global = NapiUtils::GetGlobal(env); 4091e934351Sopenharmony_ci NapiUtils::SetNamedProperty(env, global, className, jsConstructor); 4101e934351Sopenharmony_ci} 4111e934351Sopenharmony_ci 4121e934351Sopenharmony_cinapi_value NewInstanceWithManagerWrapper(napi_env env, napi_callback_info info, const std::string &className, 4131e934351Sopenharmony_ci Finalizer finalizer) 4141e934351Sopenharmony_ci{ 4151e934351Sopenharmony_ci NETSTACK_LOGD("create new instance for %{public}s", className.c_str()); 4161e934351Sopenharmony_ci napi_value thisVal = nullptr; 4171e934351Sopenharmony_ci NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVal, nullptr)); 4181e934351Sopenharmony_ci 4191e934351Sopenharmony_ci auto global = NapiUtils::GetGlobal(env); 4201e934351Sopenharmony_ci napi_value jsConstructor = NapiUtils::GetNamedProperty(env, global, className); 4211e934351Sopenharmony_ci if (NapiUtils::GetValueType(env, jsConstructor) == napi_undefined) { 4221e934351Sopenharmony_ci return nullptr; 4231e934351Sopenharmony_ci } 4241e934351Sopenharmony_ci 4251e934351Sopenharmony_ci napi_value result = nullptr; 4261e934351Sopenharmony_ci NAPI_CALL(env, napi_new_instance(env, jsConstructor, 0, nullptr, &result)); 4271e934351Sopenharmony_ci 4281e934351Sopenharmony_ci auto wrapper = new EventManagerWrapper; 4291e934351Sopenharmony_ci auto manager = std::make_shared<EventManager>(); 4301e934351Sopenharmony_ci wrapper->sharedManager = manager; 4311e934351Sopenharmony_ci if (className == INTERFACE_HTTP_REQUEST || className == INTERFACE_LOCAL_SOCKET || 4321e934351Sopenharmony_ci className == INTERFACE_TLS_SOCKET || className == INTERFACE_WEB_SOCKET) { 4331e934351Sopenharmony_ci NETSTACK_LOGD("create reference for %{public}s", className.c_str()); 4341e934351Sopenharmony_ci manager->CreateEventReference(env, thisVal); 4351e934351Sopenharmony_ci } 4361e934351Sopenharmony_ci napi_wrap(env, result, reinterpret_cast<void *>(wrapper), finalizer, nullptr, nullptr); 4371e934351Sopenharmony_ci 4381e934351Sopenharmony_ci return result; 4391e934351Sopenharmony_ci} 4401e934351Sopenharmony_ci 4411e934351Sopenharmony_cinapi_value NewInstanceWithSharedManager(napi_env env, napi_callback_info info, const std::string &className, 4421e934351Sopenharmony_ci Finalizer finalizer) 4431e934351Sopenharmony_ci{ 4441e934351Sopenharmony_ci NETSTACK_LOGD("create new instance for %{public}s", className.c_str()); 4451e934351Sopenharmony_ci napi_value thisVal = nullptr; 4461e934351Sopenharmony_ci NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVal, nullptr)); 4471e934351Sopenharmony_ci 4481e934351Sopenharmony_ci auto global = NapiUtils::GetGlobal(env); 4491e934351Sopenharmony_ci napi_value jsConstructor = NapiUtils::GetNamedProperty(env, global, className); 4501e934351Sopenharmony_ci if (NapiUtils::GetValueType(env, jsConstructor) == napi_undefined) { 4511e934351Sopenharmony_ci return nullptr; 4521e934351Sopenharmony_ci } 4531e934351Sopenharmony_ci 4541e934351Sopenharmony_ci napi_value result = nullptr; 4551e934351Sopenharmony_ci NAPI_CALL(env, napi_new_instance(env, jsConstructor, 0, nullptr, &result)); 4561e934351Sopenharmony_ci 4571e934351Sopenharmony_ci auto sharedManager = new (std::nothrow) std::shared_ptr<EventManager>(); 4581e934351Sopenharmony_ci if (sharedManager == nullptr) { 4591e934351Sopenharmony_ci return result; 4601e934351Sopenharmony_ci } 4611e934351Sopenharmony_ci auto manager = std::make_shared<EventManager>(); 4621e934351Sopenharmony_ci *sharedManager = manager; 4631e934351Sopenharmony_ci if (className == INTERFACE_HTTP_REQUEST || className == INTERFACE_LOCAL_SOCKET || 4641e934351Sopenharmony_ci className == INTERFACE_TLS_SOCKET || className == INTERFACE_WEB_SOCKET) { 4651e934351Sopenharmony_ci NETSTACK_LOGD("create reference for %{public}s", className.c_str()); 4661e934351Sopenharmony_ci manager->CreateEventReference(env, thisVal); 4671e934351Sopenharmony_ci } 4681e934351Sopenharmony_ci napi_wrap(env, result, reinterpret_cast<void *>(sharedManager), finalizer, nullptr, nullptr); 4691e934351Sopenharmony_ci 4701e934351Sopenharmony_ci return result; 4711e934351Sopenharmony_ci} 4721e934351Sopenharmony_ci 4731e934351Sopenharmony_cinapi_value NewInstance(napi_env env, napi_callback_info info, const std::string &className, Finalizer finalizer) 4741e934351Sopenharmony_ci{ 4751e934351Sopenharmony_ci NETSTACK_LOGD("create new instance for %{public}s", className.c_str()); 4761e934351Sopenharmony_ci napi_value thisVal = nullptr; 4771e934351Sopenharmony_ci NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVal, nullptr)); 4781e934351Sopenharmony_ci 4791e934351Sopenharmony_ci auto global = NapiUtils::GetGlobal(env); 4801e934351Sopenharmony_ci napi_value jsConstructor = NapiUtils::GetNamedProperty(env, global, className); 4811e934351Sopenharmony_ci if (NapiUtils::GetValueType(env, jsConstructor) == napi_undefined) { 4821e934351Sopenharmony_ci return nullptr; 4831e934351Sopenharmony_ci } 4841e934351Sopenharmony_ci 4851e934351Sopenharmony_ci napi_value result = nullptr; 4861e934351Sopenharmony_ci NAPI_CALL(env, napi_new_instance(env, jsConstructor, 0, nullptr, &result)); 4871e934351Sopenharmony_ci 4881e934351Sopenharmony_ci auto manager = new EventManager(); 4891e934351Sopenharmony_ci EventManager::SetValid(manager); 4901e934351Sopenharmony_ci if (className == INTERFACE_HTTP_REQUEST || className == INTERFACE_LOCAL_SOCKET || 4911e934351Sopenharmony_ci className == INTERFACE_TLS_SOCKET || className == INTERFACE_WEB_SOCKET) { 4921e934351Sopenharmony_ci NETSTACK_LOGD("create reference for %{public}s", className.c_str()); 4931e934351Sopenharmony_ci manager->CreateEventReference(env, thisVal); 4941e934351Sopenharmony_ci } 4951e934351Sopenharmony_ci napi_wrap(env, result, reinterpret_cast<void *>(manager), finalizer, nullptr, nullptr); 4961e934351Sopenharmony_ci 4971e934351Sopenharmony_ci return result; 4981e934351Sopenharmony_ci} 4991e934351Sopenharmony_ci 5001e934351Sopenharmony_cinapi_value NewInstanceNoManager(napi_env env, napi_callback_info info, const std::string &name, Finalizer finalizer) 5011e934351Sopenharmony_ci{ 5021e934351Sopenharmony_ci napi_value thisVal = nullptr; 5031e934351Sopenharmony_ci NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVal, nullptr)); 5041e934351Sopenharmony_ci (void)thisVal; 5051e934351Sopenharmony_ci auto global = NapiUtils::GetGlobal(env); 5061e934351Sopenharmony_ci napi_value jsConstructor = NapiUtils::GetNamedProperty(env, global, name); 5071e934351Sopenharmony_ci if (NapiUtils::GetValueType(env, jsConstructor) == napi_undefined) { 5081e934351Sopenharmony_ci return nullptr; 5091e934351Sopenharmony_ci } 5101e934351Sopenharmony_ci 5111e934351Sopenharmony_ci napi_value result = nullptr; 5121e934351Sopenharmony_ci NAPI_CALL(env, napi_new_instance(env, jsConstructor, 0, nullptr, &result)); 5131e934351Sopenharmony_ci 5141e934351Sopenharmony_ci return result; 5151e934351Sopenharmony_ci} 5161e934351Sopenharmony_ci} // namespace OHOS::NetStack::ModuleTemplate 517