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, &paramsCount, 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, &paramsCount, 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, &paramsCount, 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, &paramsCount, 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, &paramsCount, 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, &paramsCount, 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, &paramsCount, 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, &paramsCount, 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, &paramsCount, 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