11e934351Sopenharmony_ci/*
21e934351Sopenharmony_ci * Copyright (c) 2021-2022 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#ifndef COMMUNICATIONNETSTACK_NETSTACK_MODULE_TEMPLATE_H
171e934351Sopenharmony_ci#define COMMUNICATIONNETSTACK_NETSTACK_MODULE_TEMPLATE_H
181e934351Sopenharmony_ci
191e934351Sopenharmony_ci#include <cstddef>
201e934351Sopenharmony_ci#include <initializer_list>
211e934351Sopenharmony_ci#include <iosfwd>
221e934351Sopenharmony_ci#include <type_traits>
231e934351Sopenharmony_ci#include <vector>
241e934351Sopenharmony_ci
251e934351Sopenharmony_ci#include "base_async_work.h"
261e934351Sopenharmony_ci#include "base_context.h"
271e934351Sopenharmony_ci#include "napi/native_api.h"
281e934351Sopenharmony_ci#include "napi/native_common.h"
291e934351Sopenharmony_ci#include "napi_utils.h"
301e934351Sopenharmony_ci#include "netstack_log.h"
311e934351Sopenharmony_ci
321e934351Sopenharmony_cinamespace OHOS::NetStack {
331e934351Sopenharmony_ciclass EventManager;
341e934351Sopenharmony_cistruct EventManagerWrapper;
351e934351Sopenharmony_ci} // namespace OHOS::NetStack
361e934351Sopenharmony_ci
371e934351Sopenharmony_ci#define MAX_PARAM_NUM 64
381e934351Sopenharmony_ci
391e934351Sopenharmony_cinamespace OHOS::NetStack::ModuleTemplate {
401e934351Sopenharmony_citypedef void (*Finalizer)(napi_env, void *data, void *);
411e934351Sopenharmony_ci
421e934351Sopenharmony_citemplate <class Context>
431e934351Sopenharmony_cinapi_value InterfaceWithManagerWrapper(napi_env env, napi_callback_info info, const std::string &asyncWorkName,
441e934351Sopenharmony_ci                                       bool (*Work)(napi_env, napi_value, Context *), AsyncWorkExecutor executor,
451e934351Sopenharmony_ci                                       AsyncWorkCallback callback)
461e934351Sopenharmony_ci{
471e934351Sopenharmony_ci    NETSTACK_LOGI("js invoke %{public}s", asyncWorkName.c_str());
481e934351Sopenharmony_ci    static_assert(std::is_base_of<BaseContext, Context>::value);
491e934351Sopenharmony_ci
501e934351Sopenharmony_ci    napi_value thisVal = nullptr;
511e934351Sopenharmony_ci    size_t paramsCount = MAX_PARAM_NUM;
521e934351Sopenharmony_ci    napi_value params[MAX_PARAM_NUM] = {nullptr};
531e934351Sopenharmony_ci    NAPI_CALL(env, napi_get_cb_info(env, info, &paramsCount, params, &thisVal, nullptr));
541e934351Sopenharmony_ci
551e934351Sopenharmony_ci    EventManagerWrapper *wrapper = nullptr;
561e934351Sopenharmony_ci    auto napi_ret = napi_unwrap(env, thisVal, reinterpret_cast<void **>(&wrapper));
571e934351Sopenharmony_ci    if (napi_ret != napi_ok) {
581e934351Sopenharmony_ci        NETSTACK_LOGE("get event manager in napi_unwrap failed, napi_ret is %{public}d", napi_ret);
591e934351Sopenharmony_ci        return NapiUtils::GetUndefined(env);
601e934351Sopenharmony_ci    }
611e934351Sopenharmony_ci
621e934351Sopenharmony_ci    auto context = new (std::nothrow) Context(env, nullptr);
631e934351Sopenharmony_ci    if (!context) {
641e934351Sopenharmony_ci        NETSTACK_LOGE("new context is nullptr");
651e934351Sopenharmony_ci        return NapiUtils::GetUndefined(env);
661e934351Sopenharmony_ci    }
671e934351Sopenharmony_ci    if (wrapper) {
681e934351Sopenharmony_ci        context->SetSharedManager(wrapper->sharedManager);
691e934351Sopenharmony_ci    }
701e934351Sopenharmony_ci    context->ParseParams(params, paramsCount);
711e934351Sopenharmony_ci    if (context->IsNeedThrowException()) { // only api9 or later need throw exception.
721e934351Sopenharmony_ci        napi_throw_error(env, std::to_string(context->GetErrorCode()).c_str(), context->GetErrorMessage().c_str());
731e934351Sopenharmony_ci        delete context;
741e934351Sopenharmony_ci        context = nullptr;
751e934351Sopenharmony_ci        return NapiUtils::GetUndefined(env);
761e934351Sopenharmony_ci    }
771e934351Sopenharmony_ci    if (Work != nullptr) {
781e934351Sopenharmony_ci        if (!Work(env, thisVal, context)) {
791e934351Sopenharmony_ci            NETSTACK_LOGE("work failed error code = %{public}d", context->GetErrorCode());
801e934351Sopenharmony_ci        }
811e934351Sopenharmony_ci    }
821e934351Sopenharmony_ci
831e934351Sopenharmony_ci    context->CreateReference(thisVal);
841e934351Sopenharmony_ci    context->CreateAsyncWork(asyncWorkName, executor, callback);
851e934351Sopenharmony_ci    if (NapiUtils::GetValueType(env, context->GetCallback()) != napi_function && context->IsNeedPromise()) {
861e934351Sopenharmony_ci        NETSTACK_LOGD("%{public}s create promise", asyncWorkName.c_str());
871e934351Sopenharmony_ci        return context->CreatePromise();
881e934351Sopenharmony_ci    }
891e934351Sopenharmony_ci    return NapiUtils::GetUndefined(env);
901e934351Sopenharmony_ci}
911e934351Sopenharmony_ci
921e934351Sopenharmony_citemplate <class Context>
931e934351Sopenharmony_cinapi_value InterfaceWithSharedManager(napi_env env, napi_callback_info info, const std::string &asyncWorkName,
941e934351Sopenharmony_ci                                      bool (*Work)(napi_env, napi_value, Context *), AsyncWorkExecutor executor,
951e934351Sopenharmony_ci                                      AsyncWorkCallback callback)
961e934351Sopenharmony_ci{
971e934351Sopenharmony_ci    NETSTACK_LOGI("js invoke %{public}s", asyncWorkName.c_str());
981e934351Sopenharmony_ci    static_assert(std::is_base_of<BaseContext, Context>::value);
991e934351Sopenharmony_ci
1001e934351Sopenharmony_ci    napi_value thisVal = nullptr;
1011e934351Sopenharmony_ci    size_t paramsCount = MAX_PARAM_NUM;
1021e934351Sopenharmony_ci    napi_value params[MAX_PARAM_NUM] = {nullptr};
1031e934351Sopenharmony_ci    NAPI_CALL(env, napi_get_cb_info(env, info, &paramsCount, params, &thisVal, nullptr));
1041e934351Sopenharmony_ci
1051e934351Sopenharmony_ci    std::shared_ptr<EventManager> *sharedManager = nullptr;
1061e934351Sopenharmony_ci    auto napi_ret = napi_unwrap(env, thisVal, reinterpret_cast<void **>(&sharedManager));
1071e934351Sopenharmony_ci    if (napi_ret != napi_ok) {
1081e934351Sopenharmony_ci        NETSTACK_LOGE("get event manager in napi_unwrap failed, napi_ret is %{public}d", napi_ret);
1091e934351Sopenharmony_ci        return NapiUtils::GetUndefined(env);
1101e934351Sopenharmony_ci    }
1111e934351Sopenharmony_ci
1121e934351Sopenharmony_ci    auto context = new (std::nothrow) Context(env, nullptr);
1131e934351Sopenharmony_ci    if (!context) {
1141e934351Sopenharmony_ci        NETSTACK_LOGE("new context is nullptr");
1151e934351Sopenharmony_ci        return NapiUtils::GetUndefined(env);
1161e934351Sopenharmony_ci    }
1171e934351Sopenharmony_ci    if (sharedManager) {
1181e934351Sopenharmony_ci        context->SetSharedManager(*sharedManager);
1191e934351Sopenharmony_ci    }
1201e934351Sopenharmony_ci    context->ParseParams(params, paramsCount);
1211e934351Sopenharmony_ci    if (context->IsNeedThrowException()) { // only api9 or later need throw exception.
1221e934351Sopenharmony_ci        napi_throw_error(env, std::to_string(context->GetErrorCode()).c_str(), context->GetErrorMessage().c_str());
1231e934351Sopenharmony_ci        delete context;
1241e934351Sopenharmony_ci        context = nullptr;
1251e934351Sopenharmony_ci        return NapiUtils::GetUndefined(env);
1261e934351Sopenharmony_ci    }
1271e934351Sopenharmony_ci    if (Work != nullptr) {
1281e934351Sopenharmony_ci        if (!Work(env, thisVal, context)) {
1291e934351Sopenharmony_ci            NETSTACK_LOGE("work failed error code = %{public}d", context->GetErrorCode());
1301e934351Sopenharmony_ci        }
1311e934351Sopenharmony_ci    }
1321e934351Sopenharmony_ci
1331e934351Sopenharmony_ci    context->CreateReference(thisVal);
1341e934351Sopenharmony_ci    context->CreateAsyncWork(asyncWorkName, executor, callback);
1351e934351Sopenharmony_ci    if (NapiUtils::GetValueType(env, context->GetCallback()) != napi_function && context->IsNeedPromise()) {
1361e934351Sopenharmony_ci        NETSTACK_LOGD("%{public}s create promise", asyncWorkName.c_str());
1371e934351Sopenharmony_ci        return context->CreatePromise();
1381e934351Sopenharmony_ci    }
1391e934351Sopenharmony_ci    return NapiUtils::GetUndefined(env);
1401e934351Sopenharmony_ci}
1411e934351Sopenharmony_ci
1421e934351Sopenharmony_citemplate <class Context>
1431e934351Sopenharmony_cinapi_value InterfaceWithOutAsyncWorkWithManagerWrapper(napi_env env, napi_callback_info info,
1441e934351Sopenharmony_ci                                                       bool (*Work)(napi_env, napi_value, Context *),
1451e934351Sopenharmony_ci                                                       const std::string &asyncWorkName, AsyncWorkExecutor executor,
1461e934351Sopenharmony_ci                                                       AsyncWorkCallback callback)
1471e934351Sopenharmony_ci{
1481e934351Sopenharmony_ci    static_assert(std::is_base_of<BaseContext, Context>::value);
1491e934351Sopenharmony_ci
1501e934351Sopenharmony_ci    napi_value thisVal = nullptr;
1511e934351Sopenharmony_ci    size_t paramsCount = MAX_PARAM_NUM;
1521e934351Sopenharmony_ci    napi_value params[MAX_PARAM_NUM] = {nullptr};
1531e934351Sopenharmony_ci    NAPI_CALL(env, napi_get_cb_info(env, info, &paramsCount, params, &thisVal, nullptr));
1541e934351Sopenharmony_ci
1551e934351Sopenharmony_ci    EventManagerWrapper *wrapper = nullptr;
1561e934351Sopenharmony_ci    auto napi_ret = napi_unwrap(env, thisVal, reinterpret_cast<void **>(&wrapper));
1571e934351Sopenharmony_ci    if (napi_ret != napi_ok) {
1581e934351Sopenharmony_ci        NETSTACK_LOGE("get event manager in napi_unwrap failed, napi_ret is %{public}d", napi_ret);
1591e934351Sopenharmony_ci        return NapiUtils::GetUndefined(env);
1601e934351Sopenharmony_ci    }
1611e934351Sopenharmony_ci
1621e934351Sopenharmony_ci    auto context = new (std::nothrow) Context(env, nullptr);
1631e934351Sopenharmony_ci    if (!context) {
1641e934351Sopenharmony_ci        NETSTACK_LOGE("new context is nullptr");
1651e934351Sopenharmony_ci        return NapiUtils::GetUndefined(env);
1661e934351Sopenharmony_ci    }
1671e934351Sopenharmony_ci    if (wrapper) {
1681e934351Sopenharmony_ci        context->SetSharedManager(wrapper->sharedManager);
1691e934351Sopenharmony_ci    }
1701e934351Sopenharmony_ci    context->ParseParams(params, paramsCount);
1711e934351Sopenharmony_ci    napi_value ret = NapiUtils::GetUndefined(env);
1721e934351Sopenharmony_ci    if (NapiUtils::GetValueType(env, context->GetCallback()) != napi_function && context->IsNeedPromise()) {
1731e934351Sopenharmony_ci        NETSTACK_LOGD("%{public}s is invoked in promise mode", asyncWorkName.c_str());
1741e934351Sopenharmony_ci        ret = context->CreatePromise();
1751e934351Sopenharmony_ci    } else {
1761e934351Sopenharmony_ci        NETSTACK_LOGD("%{public}s is invoked in callback mode", asyncWorkName.c_str());
1771e934351Sopenharmony_ci    }
1781e934351Sopenharmony_ci    context->CreateReference(thisVal);
1791e934351Sopenharmony_ci    if (Work != nullptr) {
1801e934351Sopenharmony_ci        if (!Work(env, thisVal, context)) {
1811e934351Sopenharmony_ci            NETSTACK_LOGE("work failed error code = %{public}d", context->GetErrorCode());
1821e934351Sopenharmony_ci        }
1831e934351Sopenharmony_ci    }
1841e934351Sopenharmony_ci    if (!context->IsParseOK() || context->IsPermissionDenied() || context->IsNoAllowedHost() ||
1851e934351Sopenharmony_ci        context->GetSharedManager()->IsEventDestroy()) {
1861e934351Sopenharmony_ci        context->CreateAsyncWork(asyncWorkName, executor, callback);
1871e934351Sopenharmony_ci    }
1881e934351Sopenharmony_ci    return ret;
1891e934351Sopenharmony_ci}
1901e934351Sopenharmony_ci
1911e934351Sopenharmony_citemplate <class Context>
1921e934351Sopenharmony_cinapi_value InterfaceWithOutAsyncWorkWithSharedManager(napi_env env, napi_callback_info info,
1931e934351Sopenharmony_ci                                                      bool (*Work)(napi_env, napi_value, Context *),
1941e934351Sopenharmony_ci                                                      const std::string &asyncWorkName, AsyncWorkExecutor executor,
1951e934351Sopenharmony_ci                                                      AsyncWorkCallback callback)
1961e934351Sopenharmony_ci{
1971e934351Sopenharmony_ci    static_assert(std::is_base_of<BaseContext, Context>::value);
1981e934351Sopenharmony_ci
1991e934351Sopenharmony_ci    napi_value thisVal = nullptr;
2001e934351Sopenharmony_ci    size_t paramsCount = MAX_PARAM_NUM;
2011e934351Sopenharmony_ci    napi_value params[MAX_PARAM_NUM] = {nullptr};
2021e934351Sopenharmony_ci    NAPI_CALL(env, napi_get_cb_info(env, info, &paramsCount, params, &thisVal, nullptr));
2031e934351Sopenharmony_ci
2041e934351Sopenharmony_ci    std::shared_ptr<EventManager> *sharedManager = nullptr;
2051e934351Sopenharmony_ci    auto napi_ret = napi_unwrap(env, thisVal, reinterpret_cast<void **>(&sharedManager));
2061e934351Sopenharmony_ci    if (napi_ret != napi_ok) {
2071e934351Sopenharmony_ci        NETSTACK_LOGE("get event manager in napi_unwrap failed, napi_ret is %{public}d", napi_ret);
2081e934351Sopenharmony_ci        return NapiUtils::GetUndefined(env);
2091e934351Sopenharmony_ci    }
2101e934351Sopenharmony_ci
2111e934351Sopenharmony_ci    auto context = new (std::nothrow) Context(env, nullptr);
2121e934351Sopenharmony_ci    if (!context) {
2131e934351Sopenharmony_ci        NETSTACK_LOGE("new context is nullptr");
2141e934351Sopenharmony_ci        return NapiUtils::GetUndefined(env);
2151e934351Sopenharmony_ci    }
2161e934351Sopenharmony_ci    if (sharedManager) {
2171e934351Sopenharmony_ci        context->SetSharedManager(*sharedManager);
2181e934351Sopenharmony_ci    }
2191e934351Sopenharmony_ci    context->ParseParams(params, paramsCount);
2201e934351Sopenharmony_ci    napi_value ret = NapiUtils::GetUndefined(env);
2211e934351Sopenharmony_ci    if (NapiUtils::GetValueType(env, context->GetCallback()) != napi_function && context->IsNeedPromise()) {
2221e934351Sopenharmony_ci        NETSTACK_LOGD("%{public}s is invoked in promise mode", asyncWorkName.c_str());
2231e934351Sopenharmony_ci        ret = context->CreatePromise();
2241e934351Sopenharmony_ci    } else {
2251e934351Sopenharmony_ci        NETSTACK_LOGD("%{public}s is invoked in callback mode", asyncWorkName.c_str());
2261e934351Sopenharmony_ci    }
2271e934351Sopenharmony_ci    context->CreateReference(thisVal);
2281e934351Sopenharmony_ci    if (Work != nullptr) {
2291e934351Sopenharmony_ci        if (!Work(env, thisVal, context)) {
2301e934351Sopenharmony_ci            NETSTACK_LOGE("work failed error code = %{public}d", context->GetErrorCode());
2311e934351Sopenharmony_ci        }
2321e934351Sopenharmony_ci    }
2331e934351Sopenharmony_ci    if (!context->IsParseOK() || context->IsPermissionDenied() || context->IsNoAllowedHost() ||
2341e934351Sopenharmony_ci        context->GetSharedManager()->IsEventDestroy()) {
2351e934351Sopenharmony_ci        context->CreateAsyncWork(asyncWorkName, executor, callback);
2361e934351Sopenharmony_ci    }
2371e934351Sopenharmony_ci    return ret;
2381e934351Sopenharmony_ci}
2391e934351Sopenharmony_ci
2401e934351Sopenharmony_citemplate <class Context>
2411e934351Sopenharmony_cinapi_value Interface(napi_env env, napi_callback_info info, const std::string &asyncWorkName,
2421e934351Sopenharmony_ci                     bool (*Work)(napi_env, napi_value, Context *), AsyncWorkExecutor executor,
2431e934351Sopenharmony_ci                     AsyncWorkCallback callback)
2441e934351Sopenharmony_ci{
2451e934351Sopenharmony_ci    NETSTACK_LOGI("js invoke %{public}s", asyncWorkName.c_str());
2461e934351Sopenharmony_ci    static_assert(std::is_base_of<BaseContext, Context>::value);
2471e934351Sopenharmony_ci
2481e934351Sopenharmony_ci    napi_value thisVal = nullptr;
2491e934351Sopenharmony_ci    size_t paramsCount = MAX_PARAM_NUM;
2501e934351Sopenharmony_ci    napi_value params[MAX_PARAM_NUM] = {nullptr};
2511e934351Sopenharmony_ci    NAPI_CALL(env, napi_get_cb_info(env, info, &paramsCount, params, &thisVal, nullptr));
2521e934351Sopenharmony_ci
2531e934351Sopenharmony_ci    EventManager *manager = nullptr;
2541e934351Sopenharmony_ci    auto napi_ret = napi_unwrap(env, thisVal, reinterpret_cast<void **>(&manager));
2551e934351Sopenharmony_ci    if (napi_ret != napi_ok) {
2561e934351Sopenharmony_ci        NETSTACK_LOGE("get event manager in napi_unwrap failed, napi_ret is %{public}d", napi_ret);
2571e934351Sopenharmony_ci        return NapiUtils::GetUndefined(env);
2581e934351Sopenharmony_ci    }
2591e934351Sopenharmony_ci
2601e934351Sopenharmony_ci    auto context = new (std::nothrow) Context(env, manager);
2611e934351Sopenharmony_ci    if (!context) {
2621e934351Sopenharmony_ci        NETSTACK_LOGE("new context is nullptr");
2631e934351Sopenharmony_ci        return NapiUtils::GetUndefined(env);
2641e934351Sopenharmony_ci    }
2651e934351Sopenharmony_ci    context->ParseParams(params, paramsCount);
2661e934351Sopenharmony_ci    if (context->IsNeedThrowException()) { // only api9 or later need throw exception.
2671e934351Sopenharmony_ci        napi_throw_error(env, std::to_string(context->GetErrorCode()).c_str(), context->GetErrorMessage().c_str());
2681e934351Sopenharmony_ci        delete context;
2691e934351Sopenharmony_ci        context = nullptr;
2701e934351Sopenharmony_ci        return NapiUtils::GetUndefined(env);
2711e934351Sopenharmony_ci    }
2721e934351Sopenharmony_ci    if (Work != nullptr) {
2731e934351Sopenharmony_ci        if (!Work(env, thisVal, context)) {
2741e934351Sopenharmony_ci            NETSTACK_LOGE("work failed error code = %{public}d", context->GetErrorCode());
2751e934351Sopenharmony_ci        }
2761e934351Sopenharmony_ci    }
2771e934351Sopenharmony_ci
2781e934351Sopenharmony_ci    context->CreateReference(thisVal);
2791e934351Sopenharmony_ci    context->CreateAsyncWork(asyncWorkName, executor, callback);
2801e934351Sopenharmony_ci    if (NapiUtils::GetValueType(env, context->GetCallback()) != napi_function && context->IsNeedPromise()) {
2811e934351Sopenharmony_ci        NETSTACK_LOGD("%{public}s create promise", asyncWorkName.c_str());
2821e934351Sopenharmony_ci        return context->CreatePromise();
2831e934351Sopenharmony_ci    }
2841e934351Sopenharmony_ci    return NapiUtils::GetUndefined(env);
2851e934351Sopenharmony_ci}
2861e934351Sopenharmony_ci
2871e934351Sopenharmony_citemplate <class Context>
2881e934351Sopenharmony_cinapi_value InterfaceWithOutAsyncWork(napi_env env, napi_callback_info info,
2891e934351Sopenharmony_ci                                     bool (*Work)(napi_env, napi_value, Context *), const std::string &asyncWorkName,
2901e934351Sopenharmony_ci                                     AsyncWorkExecutor executor, AsyncWorkCallback callback)
2911e934351Sopenharmony_ci{
2921e934351Sopenharmony_ci    static_assert(std::is_base_of<BaseContext, Context>::value);
2931e934351Sopenharmony_ci
2941e934351Sopenharmony_ci    napi_value thisVal = nullptr;
2951e934351Sopenharmony_ci    size_t paramsCount = MAX_PARAM_NUM;
2961e934351Sopenharmony_ci    napi_value params[MAX_PARAM_NUM] = {nullptr};
2971e934351Sopenharmony_ci    NAPI_CALL(env, napi_get_cb_info(env, info, &paramsCount, params, &thisVal, nullptr));
2981e934351Sopenharmony_ci
2991e934351Sopenharmony_ci    EventManager *manager = nullptr;
3001e934351Sopenharmony_ci    auto napi_ret = napi_unwrap(env, thisVal, reinterpret_cast<void **>(&manager));
3011e934351Sopenharmony_ci    if (napi_ret != napi_ok) {
3021e934351Sopenharmony_ci        NETSTACK_LOGE("get event manager in napi_unwrap failed, napi_ret is %{public}d", napi_ret);
3031e934351Sopenharmony_ci        return NapiUtils::GetUndefined(env);
3041e934351Sopenharmony_ci    }
3051e934351Sopenharmony_ci
3061e934351Sopenharmony_ci    auto context = new (std::nothrow) Context(env, manager);
3071e934351Sopenharmony_ci    if (!context) {
3081e934351Sopenharmony_ci        NETSTACK_LOGE("new context is nullptr");
3091e934351Sopenharmony_ci        return NapiUtils::GetUndefined(env);
3101e934351Sopenharmony_ci    }
3111e934351Sopenharmony_ci    context->ParseParams(params, paramsCount);
3121e934351Sopenharmony_ci    napi_value ret = NapiUtils::GetUndefined(env);
3131e934351Sopenharmony_ci    if (NapiUtils::GetValueType(env, context->GetCallback()) != napi_function && context->IsNeedPromise()) {
3141e934351Sopenharmony_ci        NETSTACK_LOGD("%{public}s is invoked in promise mode", asyncWorkName.c_str());
3151e934351Sopenharmony_ci        ret = context->CreatePromise();
3161e934351Sopenharmony_ci    } else {
3171e934351Sopenharmony_ci        NETSTACK_LOGD("%{public}s is invoked in callback mode", asyncWorkName.c_str());
3181e934351Sopenharmony_ci    }
3191e934351Sopenharmony_ci    context->CreateReference(thisVal);
3201e934351Sopenharmony_ci    if (Work != nullptr) {
3211e934351Sopenharmony_ci        if (!Work(env, thisVal, context)) {
3221e934351Sopenharmony_ci            NETSTACK_LOGE("work failed error code = %{public}d", context->GetErrorCode());
3231e934351Sopenharmony_ci        }
3241e934351Sopenharmony_ci    }
3251e934351Sopenharmony_ci    if (!context->IsParseOK() || context->IsPermissionDenied() || context->IsNoAllowedHost() ||
3261e934351Sopenharmony_ci        context->GetManager()->IsEventDestroy()) {
3271e934351Sopenharmony_ci        context->CreateAsyncWork(asyncWorkName, executor, callback);
3281e934351Sopenharmony_ci    }
3291e934351Sopenharmony_ci    return ret;
3301e934351Sopenharmony_ci}
3311e934351Sopenharmony_ci
3321e934351Sopenharmony_cinapi_value On(napi_env env, napi_callback_info info, const std::initializer_list<std::string> &events,
3331e934351Sopenharmony_ci              bool asyncCallback);
3341e934351Sopenharmony_ci
3351e934351Sopenharmony_cinapi_value Once(napi_env env, napi_callback_info info, const std::initializer_list<std::string> &events,
3361e934351Sopenharmony_ci                bool asyncCallback);
3371e934351Sopenharmony_ci
3381e934351Sopenharmony_cinapi_value Off(napi_env env, napi_callback_info info, const std::initializer_list<std::string> &events);
3391e934351Sopenharmony_ci
3401e934351Sopenharmony_civoid DefineClass(napi_env env, napi_value exports, const std::initializer_list<napi_property_descriptor> &properties,
3411e934351Sopenharmony_ci                 const std::string &className);
3421e934351Sopenharmony_ci
3431e934351Sopenharmony_cinapi_value NewInstance(napi_env env, napi_callback_info info, const std::string &className, Finalizer finalizer);
3441e934351Sopenharmony_ci
3451e934351Sopenharmony_cinapi_value NewInstanceNoManager(napi_env env, napi_callback_info info, const std::string &name, Finalizer finalizer);
3461e934351Sopenharmony_ci
3471e934351Sopenharmony_cinapi_value NewInstanceWithSharedManager(napi_env env, napi_callback_info info, const std::string &className,
3481e934351Sopenharmony_ci                                        Finalizer finalizer);
3491e934351Sopenharmony_ci
3501e934351Sopenharmony_cinapi_value NewInstanceWithManagerWrapper(napi_env env, napi_callback_info info, const std::string &className,
3511e934351Sopenharmony_ci                                         Finalizer finalizer);
3521e934351Sopenharmony_ci
3531e934351Sopenharmony_cinapi_value OnSharedManager(napi_env env, napi_callback_info info, const std::initializer_list<std::string> &events,
3541e934351Sopenharmony_ci                           bool asyncCallback);
3551e934351Sopenharmony_ci
3561e934351Sopenharmony_cinapi_value OnceSharedManager(napi_env env, napi_callback_info info, const std::initializer_list<std::string> &events,
3571e934351Sopenharmony_ci                             bool asyncCallback);
3581e934351Sopenharmony_ci
3591e934351Sopenharmony_cinapi_value OffSharedManager(napi_env env, napi_callback_info info, const std::initializer_list<std::string> &events);
3601e934351Sopenharmony_ci
3611e934351Sopenharmony_cinapi_value OnManagerWrapper(napi_env env, napi_callback_info info, const std::initializer_list<std::string> &events,
3621e934351Sopenharmony_ci                            bool asyncCallback);
3631e934351Sopenharmony_ci
3641e934351Sopenharmony_cinapi_value OnceManagerWrapper(napi_env env, napi_callback_info info, const std::initializer_list<std::string> &events,
3651e934351Sopenharmony_ci                              bool asyncCallback);
3661e934351Sopenharmony_ci
3671e934351Sopenharmony_cinapi_value OffManagerWrapper(napi_env env, napi_callback_info info, const std::initializer_list<std::string> &events);
3681e934351Sopenharmony_ci} // namespace OHOS::NetStack::ModuleTemplate
3691e934351Sopenharmony_ci#endif /* COMMUNICATIONNETSTACK_NETSTACK_MODULE_TEMPLATE_H */
370