17405867cSopenharmony_ci/*
27405867cSopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd.
37405867cSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
47405867cSopenharmony_ci * you may not use this file except in compliance with the License.
57405867cSopenharmony_ci * You may obtain a copy of the License at
67405867cSopenharmony_ci *
77405867cSopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
87405867cSopenharmony_ci *
97405867cSopenharmony_ci * Unless required by applicable law or agreed to in writing, software
107405867cSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
117405867cSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
127405867cSopenharmony_ci * See the License for the specific language governing permissions and
137405867cSopenharmony_ci * limitations under the License.
147405867cSopenharmony_ci */
157405867cSopenharmony_ci#include "napi_util.h"
167405867cSopenharmony_ci
177405867cSopenharmony_ci#include <unordered_map>
187405867cSopenharmony_ci
197405867cSopenharmony_ci#include "hiappevent_base.h"
207405867cSopenharmony_ci#include "hilog/log.h"
217405867cSopenharmony_ci
227405867cSopenharmony_ci#undef LOG_DOMAIN
237405867cSopenharmony_ci#define LOG_DOMAIN 0xD002D07
247405867cSopenharmony_ci
257405867cSopenharmony_ci#undef LOG_TAG
267405867cSopenharmony_ci#define LOG_TAG "NapiUtil"
277405867cSopenharmony_ci
287405867cSopenharmony_cinamespace OHOS {
297405867cSopenharmony_cinamespace HiviewDFX {
307405867cSopenharmony_cinamespace NapiUtil {
317405867cSopenharmony_cinamespace {
327405867cSopenharmony_ciconst std::string DOMAIN_PROPERTY = "domain";
337405867cSopenharmony_ciconst std::string NAME_PROPERTY = "name";
347405867cSopenharmony_ciconst std::string EVENT_TYPE_PROPERTY = "eventType";
357405867cSopenharmony_ciconst std::string PARAM_PROPERTY = "params";
367405867cSopenharmony_ciconst std::string EVENT_INFOS_PROPERTY = "appEventInfos";
377405867cSopenharmony_ci}
387405867cSopenharmony_ci
397405867cSopenharmony_cibool IsNull(const napi_env env, const napi_value value)
407405867cSopenharmony_ci{
417405867cSopenharmony_ci    return GetType(env, value) == napi_null;
427405867cSopenharmony_ci}
437405867cSopenharmony_ci
447405867cSopenharmony_cibool IsBoolean(const napi_env env, const napi_value value)
457405867cSopenharmony_ci{
467405867cSopenharmony_ci    return GetType(env, value) == napi_boolean;
477405867cSopenharmony_ci}
487405867cSopenharmony_ci
497405867cSopenharmony_cibool IsNumber(const napi_env env, const napi_value value)
507405867cSopenharmony_ci{
517405867cSopenharmony_ci    return GetType(env, value) == napi_number;
527405867cSopenharmony_ci}
537405867cSopenharmony_ci
547405867cSopenharmony_cibool IsString(const napi_env env, const napi_value value)
557405867cSopenharmony_ci{
567405867cSopenharmony_ci    return GetType(env, value) == napi_string;
577405867cSopenharmony_ci}
587405867cSopenharmony_ci
597405867cSopenharmony_cibool IsObject(const napi_env env, const napi_value value)
607405867cSopenharmony_ci{
617405867cSopenharmony_ci    return GetType(env, value) == napi_object;
627405867cSopenharmony_ci}
637405867cSopenharmony_ci
647405867cSopenharmony_cibool IsFunction(const napi_env env, const napi_value value)
657405867cSopenharmony_ci{
667405867cSopenharmony_ci    return GetType(env, value) == napi_function;
677405867cSopenharmony_ci}
687405867cSopenharmony_ci
697405867cSopenharmony_cibool IsArray(const napi_env env, const napi_value value)
707405867cSopenharmony_ci{
717405867cSopenharmony_ci    bool result = false;
727405867cSopenharmony_ci    if (napi_is_array(env, value, &result) != napi_ok) {
737405867cSopenharmony_ci        HILOG_ERROR(LOG_CORE, "failed to check array type");
747405867cSopenharmony_ci        return false;
757405867cSopenharmony_ci    }
767405867cSopenharmony_ci    return result;
777405867cSopenharmony_ci}
787405867cSopenharmony_ci
797405867cSopenharmony_cibool IsArrayType(const napi_env env, const napi_value value, napi_valuetype type)
807405867cSopenharmony_ci{
817405867cSopenharmony_ci    if (!IsArray(env, value)) {
827405867cSopenharmony_ci        return false;
837405867cSopenharmony_ci    }
847405867cSopenharmony_ci    if (GetArrayLength(env, value) == 0) {
857405867cSopenharmony_ci        return true;
867405867cSopenharmony_ci    }
877405867cSopenharmony_ci    return GetArrayType(env, value) == type;
887405867cSopenharmony_ci}
897405867cSopenharmony_ci
907405867cSopenharmony_cinapi_valuetype GetType(const napi_env env, const napi_value value)
917405867cSopenharmony_ci{
927405867cSopenharmony_ci    napi_valuetype type;
937405867cSopenharmony_ci    if (napi_typeof(env, value, &type) != napi_ok) {
947405867cSopenharmony_ci        HILOG_ERROR(LOG_CORE, "failed to get value type");
957405867cSopenharmony_ci        return napi_undefined;
967405867cSopenharmony_ci    }
977405867cSopenharmony_ci    return type;
987405867cSopenharmony_ci}
997405867cSopenharmony_ci
1007405867cSopenharmony_cinapi_valuetype GetArrayType(const napi_env env, const napi_value arr)
1017405867cSopenharmony_ci{
1027405867cSopenharmony_ci    uint32_t result = 0;
1037405867cSopenharmony_ci    if (napi_get_array_length(env, arr, &result) != napi_ok) {
1047405867cSopenharmony_ci        HILOG_ERROR(LOG_CORE, "failed to get the length of array");
1057405867cSopenharmony_ci        return napi_undefined;
1067405867cSopenharmony_ci    }
1077405867cSopenharmony_ci
1087405867cSopenharmony_ci    napi_valuetype type = napi_null; // note: empty array returns null type
1097405867cSopenharmony_ci    for (size_t i = 0; i < result; ++i) {
1107405867cSopenharmony_ci        napi_value element = nullptr;
1117405867cSopenharmony_ci        if (napi_get_element(env, arr, i, &element) != napi_ok) {
1127405867cSopenharmony_ci            HILOG_ERROR(LOG_CORE, "failed to get the element of array");
1137405867cSopenharmony_ci            return napi_undefined;
1147405867cSopenharmony_ci        }
1157405867cSopenharmony_ci        if (i == 0) {
1167405867cSopenharmony_ci            type = GetType(env, element);
1177405867cSopenharmony_ci            continue;
1187405867cSopenharmony_ci        }
1197405867cSopenharmony_ci        if (type != GetType(env, element)) {
1207405867cSopenharmony_ci            HILOG_ERROR(LOG_CORE, "array has different element types");
1217405867cSopenharmony_ci            return napi_undefined;
1227405867cSopenharmony_ci        }
1237405867cSopenharmony_ci    }
1247405867cSopenharmony_ci    return type;
1257405867cSopenharmony_ci}
1267405867cSopenharmony_ci
1277405867cSopenharmony_ciuint32_t GetArrayLength(const napi_env env, const napi_value arr)
1287405867cSopenharmony_ci{
1297405867cSopenharmony_ci    uint32_t result = 0;
1307405867cSopenharmony_ci    if (napi_get_array_length(env, arr, &result) != napi_ok) {
1317405867cSopenharmony_ci        HILOG_ERROR(LOG_CORE, "failed to get the length of array");
1327405867cSopenharmony_ci        return 0;
1337405867cSopenharmony_ci    }
1347405867cSopenharmony_ci    return result;
1357405867cSopenharmony_ci}
1367405867cSopenharmony_ci
1377405867cSopenharmony_cinapi_value GetElement(const napi_env env, const napi_value arr, uint32_t index)
1387405867cSopenharmony_ci{
1397405867cSopenharmony_ci    napi_value element = nullptr;
1407405867cSopenharmony_ci    if (napi_get_element(env, arr, index, &element) != napi_ok) {
1417405867cSopenharmony_ci        HILOG_ERROR(LOG_CORE, "failed to get the element of array.");
1427405867cSopenharmony_ci        return nullptr;
1437405867cSopenharmony_ci    }
1447405867cSopenharmony_ci    return element;
1457405867cSopenharmony_ci}
1467405867cSopenharmony_ci
1477405867cSopenharmony_cibool GetBoolean(const napi_env env, const napi_value value)
1487405867cSopenharmony_ci{
1497405867cSopenharmony_ci    bool bValue = false;
1507405867cSopenharmony_ci    if (napi_get_value_bool(env, value, &bValue) != napi_ok) {
1517405867cSopenharmony_ci        HILOG_ERROR(LOG_CORE, "failed to get bool value");
1527405867cSopenharmony_ci        return false;
1537405867cSopenharmony_ci    }
1547405867cSopenharmony_ci    return bValue;
1557405867cSopenharmony_ci}
1567405867cSopenharmony_ci
1577405867cSopenharmony_civoid GetBooleans(const napi_env env, const napi_value arr, std::vector<bool>& bools)
1587405867cSopenharmony_ci{
1597405867cSopenharmony_ci    uint32_t len = GetArrayLength(env, arr);
1607405867cSopenharmony_ci    for (size_t i = 0; i < len; ++i) {
1617405867cSopenharmony_ci        napi_value element = GetElement(env, arr, i);
1627405867cSopenharmony_ci        if (element == nullptr) {
1637405867cSopenharmony_ci            continue;
1647405867cSopenharmony_ci        }
1657405867cSopenharmony_ci        bools.push_back(GetBoolean(env, element));
1667405867cSopenharmony_ci    }
1677405867cSopenharmony_ci}
1687405867cSopenharmony_ci
1697405867cSopenharmony_ciint32_t GetInt32(const napi_env env, const napi_value value)
1707405867cSopenharmony_ci{
1717405867cSopenharmony_ci    int32_t iValue = 0;
1727405867cSopenharmony_ci    if (napi_get_value_int32(env, value, &iValue) != napi_ok) {
1737405867cSopenharmony_ci        HILOG_ERROR(LOG_CORE, "failed to get int32 value");
1747405867cSopenharmony_ci        return 0;
1757405867cSopenharmony_ci    }
1767405867cSopenharmony_ci    return iValue;
1777405867cSopenharmony_ci}
1787405867cSopenharmony_ci
1797405867cSopenharmony_ciint64_t GetInt64(const napi_env env, const napi_value value)
1807405867cSopenharmony_ci{
1817405867cSopenharmony_ci    int64_t iValue = 0;
1827405867cSopenharmony_ci    if (napi_get_value_int64(env, value, &iValue) != napi_ok) {
1837405867cSopenharmony_ci        HILOG_ERROR(LOG_CORE, "failed to get int64 value");
1847405867cSopenharmony_ci        return 0;
1857405867cSopenharmony_ci    }
1867405867cSopenharmony_ci    return iValue;
1877405867cSopenharmony_ci}
1887405867cSopenharmony_ci
1897405867cSopenharmony_civoid GetInt32s(const napi_env env, const napi_value arr, std::vector<int32_t>& ints)
1907405867cSopenharmony_ci{
1917405867cSopenharmony_ci    uint32_t len = GetArrayLength(env, arr);
1927405867cSopenharmony_ci    for (size_t i = 0; i < len; ++i) {
1937405867cSopenharmony_ci        napi_value element = GetElement(env, arr, i);
1947405867cSopenharmony_ci        if (element == nullptr) {
1957405867cSopenharmony_ci            continue;
1967405867cSopenharmony_ci        }
1977405867cSopenharmony_ci        ints.push_back(GetInt32(env, element));
1987405867cSopenharmony_ci    }
1997405867cSopenharmony_ci}
2007405867cSopenharmony_ci
2017405867cSopenharmony_cidouble GetDouble(const napi_env env, const napi_value value)
2027405867cSopenharmony_ci{
2037405867cSopenharmony_ci    double dValue = 0;
2047405867cSopenharmony_ci    if (napi_get_value_double(env, value, &dValue) != napi_ok) {
2057405867cSopenharmony_ci        HILOG_ERROR(LOG_CORE, "failed to get double value");
2067405867cSopenharmony_ci        return 0;
2077405867cSopenharmony_ci    }
2087405867cSopenharmony_ci    return dValue;
2097405867cSopenharmony_ci}
2107405867cSopenharmony_ci
2117405867cSopenharmony_civoid GetDoubles(const napi_env env, const napi_value arr, std::vector<double>& doubles)
2127405867cSopenharmony_ci{
2137405867cSopenharmony_ci    uint32_t len = GetArrayLength(env, arr);
2147405867cSopenharmony_ci    for (size_t i = 0; i < len; ++i) {
2157405867cSopenharmony_ci        napi_value element = GetElement(env, arr, i);
2167405867cSopenharmony_ci        if (element == nullptr) {
2177405867cSopenharmony_ci            continue;
2187405867cSopenharmony_ci        }
2197405867cSopenharmony_ci        doubles.push_back(GetDouble(env, element));
2207405867cSopenharmony_ci    }
2217405867cSopenharmony_ci}
2227405867cSopenharmony_ci
2237405867cSopenharmony_cistd::string GetString(const napi_env env, const napi_value value)
2247405867cSopenharmony_ci{
2257405867cSopenharmony_ci    size_t bufsize = 0;
2267405867cSopenharmony_ci    if (napi_get_value_string_utf8(env, value, nullptr, 0, &bufsize) != napi_ok) {
2277405867cSopenharmony_ci        HILOG_ERROR(LOG_CORE, "failed to get string length");
2287405867cSopenharmony_ci        return "";
2297405867cSopenharmony_ci    }
2307405867cSopenharmony_ci    std::vector<char> charVec(bufsize + 1); // 1 for '\0'
2317405867cSopenharmony_ci    if (napi_get_value_string_utf8(env, value, charVec.data(), bufsize + 1, &bufsize) != napi_ok) {
2327405867cSopenharmony_ci        HILOG_ERROR(LOG_CORE, "failed to get string value");
2337405867cSopenharmony_ci        return "";
2347405867cSopenharmony_ci    }
2357405867cSopenharmony_ci    return charVec.data();
2367405867cSopenharmony_ci}
2377405867cSopenharmony_ci
2387405867cSopenharmony_civoid GetStrings(const napi_env env, const napi_value arr, std::vector<std::string>& strs)
2397405867cSopenharmony_ci{
2407405867cSopenharmony_ci    uint32_t len = GetArrayLength(env, arr);
2417405867cSopenharmony_ci    for (size_t i = 0; i < len; ++i) {
2427405867cSopenharmony_ci        napi_value element = GetElement(env, arr, i);
2437405867cSopenharmony_ci        if (element == nullptr) {
2447405867cSopenharmony_ci            continue;
2457405867cSopenharmony_ci        }
2467405867cSopenharmony_ci        strs.push_back(GetString(env, element));
2477405867cSopenharmony_ci    }
2487405867cSopenharmony_ci}
2497405867cSopenharmony_ci
2507405867cSopenharmony_civoid GetStringsToSet(const napi_env env, const napi_value arr, std::unordered_set<std::string>& strs)
2517405867cSopenharmony_ci{
2527405867cSopenharmony_ci    uint32_t len = GetArrayLength(env, arr);
2537405867cSopenharmony_ci    for (size_t i = 0; i < len; ++i) {
2547405867cSopenharmony_ci        napi_value element = GetElement(env, arr, i);
2557405867cSopenharmony_ci        if (element == nullptr) {
2567405867cSopenharmony_ci            continue;
2577405867cSopenharmony_ci        }
2587405867cSopenharmony_ci        strs.insert(GetString(env, element));
2597405867cSopenharmony_ci    }
2607405867cSopenharmony_ci}
2617405867cSopenharmony_ci
2627405867cSopenharmony_cibool HasProperty(const napi_env env, const napi_value object, const std::string& name)
2637405867cSopenharmony_ci{
2647405867cSopenharmony_ci    bool result = false;
2657405867cSopenharmony_ci    if (napi_has_named_property(env, object, name.c_str(), &result) != napi_ok) {
2667405867cSopenharmony_ci        HILOG_ERROR(LOG_CORE, "failed to check whether the object has the named property");
2677405867cSopenharmony_ci        return false;
2687405867cSopenharmony_ci    }
2697405867cSopenharmony_ci    return result;
2707405867cSopenharmony_ci}
2717405867cSopenharmony_ci
2727405867cSopenharmony_cinapi_value GetProperty(const napi_env env, const napi_value object, const std::string& name)
2737405867cSopenharmony_ci{
2747405867cSopenharmony_ci    if (!HasProperty(env, object, name)) {
2757405867cSopenharmony_ci        return nullptr;
2767405867cSopenharmony_ci    }
2777405867cSopenharmony_ci    napi_value value = nullptr;
2787405867cSopenharmony_ci    if (napi_get_named_property(env, object, name.c_str(), &value) != napi_ok) {
2797405867cSopenharmony_ci        HILOG_ERROR(LOG_CORE, "failed to get property from object");
2807405867cSopenharmony_ci        return nullptr;
2817405867cSopenharmony_ci    }
2827405867cSopenharmony_ci    return value;
2837405867cSopenharmony_ci}
2847405867cSopenharmony_ci
2857405867cSopenharmony_civoid GetPropertyNames(const napi_env env, const napi_value object, std::vector<std::string>& names)
2867405867cSopenharmony_ci{
2877405867cSopenharmony_ci    napi_value propertyNames = nullptr;
2887405867cSopenharmony_ci    if (napi_get_property_names(env, object, &propertyNames) != napi_ok) {
2897405867cSopenharmony_ci        HILOG_ERROR(LOG_CORE, "failed to get property names.");
2907405867cSopenharmony_ci        return;
2917405867cSopenharmony_ci    }
2927405867cSopenharmony_ci    uint32_t len = 0;
2937405867cSopenharmony_ci    if (napi_get_array_length(env, propertyNames, &len) != napi_ok) {
2947405867cSopenharmony_ci        HILOG_ERROR(LOG_CORE, "failed to get array length");
2957405867cSopenharmony_ci        return;
2967405867cSopenharmony_ci    }
2977405867cSopenharmony_ci    for (uint32_t i = 0; i < len; ++i) {
2987405867cSopenharmony_ci        napi_value element = nullptr;
2997405867cSopenharmony_ci        if (napi_get_element(env, propertyNames, i, &element) != napi_ok) {
3007405867cSopenharmony_ci            HILOG_ERROR(LOG_CORE, "failed to get the element of array");
3017405867cSopenharmony_ci            continue;
3027405867cSopenharmony_ci        }
3037405867cSopenharmony_ci        names.push_back(GetString(env, element));
3047405867cSopenharmony_ci    }
3057405867cSopenharmony_ci}
3067405867cSopenharmony_ci
3077405867cSopenharmony_cinapi_value GetReferenceValue(const napi_env env, const napi_ref funcRef)
3087405867cSopenharmony_ci{
3097405867cSopenharmony_ci    napi_value refValue = nullptr;
3107405867cSopenharmony_ci    if (napi_get_reference_value(env, funcRef, &refValue) != napi_ok) {
3117405867cSopenharmony_ci        HILOG_ERROR(LOG_CORE, "failed to get reference value");
3127405867cSopenharmony_ci        return nullptr;
3137405867cSopenharmony_ci    }
3147405867cSopenharmony_ci    return refValue;
3157405867cSopenharmony_ci}
3167405867cSopenharmony_ci
3177405867cSopenharmony_cisize_t GetCbInfo(const napi_env env, napi_callback_info info, napi_value argv[], size_t argc)
3187405867cSopenharmony_ci{
3197405867cSopenharmony_ci    size_t paramNum = argc;
3207405867cSopenharmony_ci    if (napi_get_cb_info(env, info, &paramNum, argv, nullptr, nullptr) != napi_ok) {
3217405867cSopenharmony_ci        HILOG_ERROR(LOG_CORE, "failed to get callback info");
3227405867cSopenharmony_ci        return 0;
3237405867cSopenharmony_ci    }
3247405867cSopenharmony_ci    return paramNum;
3257405867cSopenharmony_ci}
3267405867cSopenharmony_ci
3277405867cSopenharmony_cinapi_ref CreateReference(const napi_env env, const napi_value func)
3287405867cSopenharmony_ci{
3297405867cSopenharmony_ci    napi_ref ref = nullptr;
3307405867cSopenharmony_ci    if (napi_create_reference(env, func, 1, &ref) != napi_ok) { // 1 means initial reference count
3317405867cSopenharmony_ci        HILOG_ERROR(LOG_CORE, "failed to create reference");
3327405867cSopenharmony_ci        return nullptr;
3337405867cSopenharmony_ci    }
3347405867cSopenharmony_ci    return ref;
3357405867cSopenharmony_ci}
3367405867cSopenharmony_ci
3377405867cSopenharmony_cinapi_value CreateNull(const napi_env env)
3387405867cSopenharmony_ci{
3397405867cSopenharmony_ci    napi_value nullValue = nullptr;
3407405867cSopenharmony_ci    if (napi_get_null(env, &nullValue) != napi_ok) {
3417405867cSopenharmony_ci        HILOG_ERROR(LOG_CORE, "failed to create null");
3427405867cSopenharmony_ci        return nullptr;
3437405867cSopenharmony_ci    }
3447405867cSopenharmony_ci    return nullValue;
3457405867cSopenharmony_ci}
3467405867cSopenharmony_ci
3477405867cSopenharmony_cinapi_value CreateUndefined(const napi_env env)
3487405867cSopenharmony_ci{
3497405867cSopenharmony_ci    napi_value undefinedValue = nullptr;
3507405867cSopenharmony_ci    if (napi_get_undefined(env, &undefinedValue) != napi_ok) {
3517405867cSopenharmony_ci        HILOG_ERROR(LOG_CORE, "failed to create undefined");
3527405867cSopenharmony_ci        return nullptr;
3537405867cSopenharmony_ci    }
3547405867cSopenharmony_ci    return undefinedValue;
3557405867cSopenharmony_ci}
3567405867cSopenharmony_ci
3577405867cSopenharmony_cinapi_value CreateBoolean(const napi_env env, bool bValue)
3587405867cSopenharmony_ci{
3597405867cSopenharmony_ci    napi_value boolValue = nullptr;
3607405867cSopenharmony_ci    if (napi_get_boolean(env, bValue, &boolValue) != napi_ok) {
3617405867cSopenharmony_ci        HILOG_ERROR(LOG_CORE, "failed to create boolean");
3627405867cSopenharmony_ci        return nullptr;
3637405867cSopenharmony_ci    }
3647405867cSopenharmony_ci    return boolValue;
3657405867cSopenharmony_ci}
3667405867cSopenharmony_ci
3677405867cSopenharmony_cinapi_value CreateInt32(const napi_env env, int32_t num)
3687405867cSopenharmony_ci{
3697405867cSopenharmony_ci    napi_value intValue = nullptr;
3707405867cSopenharmony_ci    if (napi_create_int32(env, num, &intValue) != napi_ok) {
3717405867cSopenharmony_ci        HILOG_ERROR(LOG_CORE, "failed to create int32");
3727405867cSopenharmony_ci        return nullptr;
3737405867cSopenharmony_ci    }
3747405867cSopenharmony_ci    return intValue;
3757405867cSopenharmony_ci}
3767405867cSopenharmony_ci
3777405867cSopenharmony_cinapi_value CreateInt64(const napi_env env, int64_t num)
3787405867cSopenharmony_ci{
3797405867cSopenharmony_ci    napi_value intValue = nullptr;
3807405867cSopenharmony_ci    if (napi_create_int64(env, num, &intValue) != napi_ok) {
3817405867cSopenharmony_ci        HILOG_ERROR(LOG_CORE, "failed to create int64");
3827405867cSopenharmony_ci        return nullptr;
3837405867cSopenharmony_ci    }
3847405867cSopenharmony_ci    return intValue;
3857405867cSopenharmony_ci}
3867405867cSopenharmony_ci
3877405867cSopenharmony_cinapi_value CreateString(const napi_env env, const std::string& str)
3887405867cSopenharmony_ci{
3897405867cSopenharmony_ci    napi_value strValue = nullptr;
3907405867cSopenharmony_ci    if (napi_create_string_utf8(env, str.c_str(), NAPI_AUTO_LENGTH, &strValue) != napi_ok) {
3917405867cSopenharmony_ci        HILOG_ERROR(LOG_CORE, "failed to create string");
3927405867cSopenharmony_ci        return nullptr;
3937405867cSopenharmony_ci    }
3947405867cSopenharmony_ci    return strValue;
3957405867cSopenharmony_ci}
3967405867cSopenharmony_ci
3977405867cSopenharmony_cinapi_value CreateStrings(const napi_env env, const std::vector<std::string>& strs)
3987405867cSopenharmony_ci{
3997405867cSopenharmony_ci    napi_value arr = CreateArray(env);
4007405867cSopenharmony_ci    for (size_t i = 0; i < strs.size(); ++i) {
4017405867cSopenharmony_ci        SetElement(env, arr, i, CreateString(env, strs[i]));
4027405867cSopenharmony_ci    }
4037405867cSopenharmony_ci    return arr;
4047405867cSopenharmony_ci}
4057405867cSopenharmony_ci
4067405867cSopenharmony_cinapi_value CreateObject(const napi_env env)
4077405867cSopenharmony_ci{
4087405867cSopenharmony_ci    napi_value obj = nullptr;
4097405867cSopenharmony_ci    if (napi_create_object(env, &obj) != napi_ok) {
4107405867cSopenharmony_ci        HILOG_ERROR(LOG_CORE, "failed to create object");
4117405867cSopenharmony_ci        return nullptr;
4127405867cSopenharmony_ci    }
4137405867cSopenharmony_ci    return obj;
4147405867cSopenharmony_ci}
4157405867cSopenharmony_ci
4167405867cSopenharmony_cinapi_value CreateObject(const napi_env env, const std::string& key, const napi_value value)
4177405867cSopenharmony_ci{
4187405867cSopenharmony_ci    napi_value obj = nullptr;
4197405867cSopenharmony_ci    if (napi_create_object(env, &obj) != napi_ok) {
4207405867cSopenharmony_ci        HILOG_ERROR(LOG_CORE, "failed to create object");
4217405867cSopenharmony_ci        return nullptr;
4227405867cSopenharmony_ci    }
4237405867cSopenharmony_ci    if (napi_set_named_property(env, obj, key.c_str(), value) != napi_ok) {
4247405867cSopenharmony_ci        HILOG_ERROR(LOG_CORE, "failed to set property");
4257405867cSopenharmony_ci        return nullptr;
4267405867cSopenharmony_ci    }
4277405867cSopenharmony_ci    return obj;
4287405867cSopenharmony_ci}
4297405867cSopenharmony_ci
4307405867cSopenharmony_cinapi_value CreateArray(const napi_env env)
4317405867cSopenharmony_ci{
4327405867cSopenharmony_ci    napi_value arr = nullptr;
4337405867cSopenharmony_ci    if (napi_create_array(env, &arr) != napi_ok) {
4347405867cSopenharmony_ci        HILOG_ERROR(LOG_CORE, "failed to create array");
4357405867cSopenharmony_ci        return nullptr;
4367405867cSopenharmony_ci    }
4377405867cSopenharmony_ci    return arr;
4387405867cSopenharmony_ci}
4397405867cSopenharmony_ci
4407405867cSopenharmony_cinapi_value CreateDouble(const napi_env env, double dValue)
4417405867cSopenharmony_ci{
4427405867cSopenharmony_ci    napi_value doubleValue = nullptr;
4437405867cSopenharmony_ci    if (napi_create_double(env, dValue, &doubleValue) != napi_ok) {
4447405867cSopenharmony_ci        HILOG_ERROR(LOG_CORE, "failed to create double");
4457405867cSopenharmony_ci        return nullptr;
4467405867cSopenharmony_ci    }
4477405867cSopenharmony_ci    return doubleValue;
4487405867cSopenharmony_ci}
4497405867cSopenharmony_ci
4507405867cSopenharmony_civoid SetElement(const napi_env env, const napi_value obj, uint32_t index, const napi_value value)
4517405867cSopenharmony_ci{
4527405867cSopenharmony_ci    if (napi_set_element(env, obj, index, value) != napi_ok) {
4537405867cSopenharmony_ci        HILOG_ERROR(LOG_CORE, "failed to set element");
4547405867cSopenharmony_ci    }
4557405867cSopenharmony_ci}
4567405867cSopenharmony_ci
4577405867cSopenharmony_civoid SetNamedProperty(const napi_env env, const napi_value obj, const std::string& key, const napi_value value)
4587405867cSopenharmony_ci{
4597405867cSopenharmony_ci    if (napi_set_named_property(env, obj, key.c_str(), value) != napi_ok) {
4607405867cSopenharmony_ci        HILOG_ERROR(LOG_CORE, "failed to set property");
4617405867cSopenharmony_ci    }
4627405867cSopenharmony_ci}
4637405867cSopenharmony_ci
4647405867cSopenharmony_cistd::string ConvertToString(const napi_env env, const napi_value value)
4657405867cSopenharmony_ci{
4667405867cSopenharmony_ci    napi_valuetype type = GetType(env, value);
4677405867cSopenharmony_ci    if (type == napi_undefined) {
4687405867cSopenharmony_ci        return "";
4697405867cSopenharmony_ci    }
4707405867cSopenharmony_ci
4717405867cSopenharmony_ci    std::string result = "";
4727405867cSopenharmony_ci    switch (type) {
4737405867cSopenharmony_ci        case napi_boolean:
4747405867cSopenharmony_ci            result = GetBoolean(env, value) ? "true" : "false";
4757405867cSopenharmony_ci            break;
4767405867cSopenharmony_ci        case napi_number:
4777405867cSopenharmony_ci            result = std::to_string(GetDouble(env, value));
4787405867cSopenharmony_ci            break;
4797405867cSopenharmony_ci        case napi_string:
4807405867cSopenharmony_ci            result = GetString(env, value);
4817405867cSopenharmony_ci            break;
4827405867cSopenharmony_ci        default:
4837405867cSopenharmony_ci            break;
4847405867cSopenharmony_ci    }
4857405867cSopenharmony_ci    return result;
4867405867cSopenharmony_ci}
4877405867cSopenharmony_ci
4887405867cSopenharmony_civoid ThrowError(napi_env env, int code, const std::string& msg, bool isThrow)
4897405867cSopenharmony_ci{
4907405867cSopenharmony_ci    // no error needs to be thrown before api 9
4917405867cSopenharmony_ci    if (!isThrow) {
4927405867cSopenharmony_ci        return;
4937405867cSopenharmony_ci    }
4947405867cSopenharmony_ci
4957405867cSopenharmony_ci    if (napi_throw_error(env, std::to_string(code).c_str(), msg.c_str()) != napi_ok) {
4967405867cSopenharmony_ci        HILOG_ERROR(LOG_CORE, "failed to throw error, code=%{public}d, msg=%{public}s", code, msg.c_str());
4977405867cSopenharmony_ci    }
4987405867cSopenharmony_ci}
4997405867cSopenharmony_ci
5007405867cSopenharmony_cinapi_value CreateError(napi_env env, int code, const std::string& msg)
5017405867cSopenharmony_ci{
5027405867cSopenharmony_ci    napi_value err = nullptr;
5037405867cSopenharmony_ci    if (napi_create_error(env, CreateString(env, std::to_string(code)), CreateString(env, msg), &err) != napi_ok) {
5047405867cSopenharmony_ci        HILOG_ERROR(LOG_CORE, "failed to create error");
5057405867cSopenharmony_ci        return nullptr;
5067405867cSopenharmony_ci    }
5077405867cSopenharmony_ci    return err;
5087405867cSopenharmony_ci}
5097405867cSopenharmony_ci
5107405867cSopenharmony_cistd::string CreateErrMsg(const std::string& name)
5117405867cSopenharmony_ci{
5127405867cSopenharmony_ci    return "Parameter error. The " + name + " parameter is mandatory.";
5137405867cSopenharmony_ci}
5147405867cSopenharmony_ci
5157405867cSopenharmony_cistd::string CreateErrMsg(const std::string& name, const std::string& type)
5167405867cSopenharmony_ci{
5177405867cSopenharmony_ci    return "Parameter error. The type of " + name + " must be " + type + ".";
5187405867cSopenharmony_ci}
5197405867cSopenharmony_cistd::string CreateErrMsg(const std::string& name, const napi_valuetype type)
5207405867cSopenharmony_ci{
5217405867cSopenharmony_ci    std::string typeStr = "";
5227405867cSopenharmony_ci    switch (type) {
5237405867cSopenharmony_ci        case napi_boolean:
5247405867cSopenharmony_ci            typeStr = "boolean";
5257405867cSopenharmony_ci            break;
5267405867cSopenharmony_ci        case napi_number:
5277405867cSopenharmony_ci            typeStr = "number";
5287405867cSopenharmony_ci            break;
5297405867cSopenharmony_ci        case napi_string:
5307405867cSopenharmony_ci            typeStr = "string";
5317405867cSopenharmony_ci            break;
5327405867cSopenharmony_ci        case napi_object:
5337405867cSopenharmony_ci            typeStr = "object";
5347405867cSopenharmony_ci            break;
5357405867cSopenharmony_ci        default:
5367405867cSopenharmony_ci            break;
5377405867cSopenharmony_ci    }
5387405867cSopenharmony_ci    return CreateErrMsg(name, typeStr);
5397405867cSopenharmony_ci}
5407405867cSopenharmony_ci
5417405867cSopenharmony_cinapi_value CreateBaseValueByJson(const napi_env env, const Json::Value& jsonValue)
5427405867cSopenharmony_ci{
5437405867cSopenharmony_ci    if (jsonValue.isBool()) {
5447405867cSopenharmony_ci        return CreateBoolean(env, jsonValue.asBool());
5457405867cSopenharmony_ci    }
5467405867cSopenharmony_ci    if (jsonValue.isInt()) {
5477405867cSopenharmony_ci        return CreateInt32(env, jsonValue.asInt());
5487405867cSopenharmony_ci    }
5497405867cSopenharmony_ci    if (jsonValue.isInt64() && jsonValue.type() != Json::ValueType::uintValue) {
5507405867cSopenharmony_ci        return CreateInt64(env, jsonValue.asInt64());
5517405867cSopenharmony_ci    }
5527405867cSopenharmony_ci    if (jsonValue.isDouble()) {
5537405867cSopenharmony_ci        return CreateDouble(env, jsonValue.asDouble());
5547405867cSopenharmony_ci    }
5557405867cSopenharmony_ci    if (jsonValue.isString()) {
5567405867cSopenharmony_ci        return CreateString(env, jsonValue.asString());
5577405867cSopenharmony_ci    }
5587405867cSopenharmony_ci    return nullptr;
5597405867cSopenharmony_ci}
5607405867cSopenharmony_ci
5617405867cSopenharmony_cinapi_value CreateValueByJson(napi_env env, const Json::Value& jsonValue)
5627405867cSopenharmony_ci{
5637405867cSopenharmony_ci    if (jsonValue.isArray()) {
5647405867cSopenharmony_ci        napi_value array = CreateArray(env);
5657405867cSopenharmony_ci        for (size_t i = 0; i < jsonValue.size(); ++i) {
5667405867cSopenharmony_ci            SetElement(env, array, i, CreateValueByJson(env, jsonValue[static_cast<int>(i)]));
5677405867cSopenharmony_ci        }
5687405867cSopenharmony_ci        return array;
5697405867cSopenharmony_ci    }
5707405867cSopenharmony_ci    if (jsonValue.isObject()) {
5717405867cSopenharmony_ci        napi_value obj = CreateObject(env);
5727405867cSopenharmony_ci        auto eventNameList = jsonValue.getMemberNames();
5737405867cSopenharmony_ci        for (auto it = eventNameList.cbegin(); it != eventNameList.cend(); ++it) {
5747405867cSopenharmony_ci            auto propertyName = *it;
5757405867cSopenharmony_ci            SetNamedProperty(env, obj, propertyName, CreateValueByJson(env, jsonValue[propertyName]));
5767405867cSopenharmony_ci        }
5777405867cSopenharmony_ci        return obj;
5787405867cSopenharmony_ci    }
5797405867cSopenharmony_ci    return CreateBaseValueByJson(env, jsonValue);
5807405867cSopenharmony_ci}
5817405867cSopenharmony_ci
5827405867cSopenharmony_cinapi_value CreateValueByJsonStr(napi_env env, const std::string& jsonStr)
5837405867cSopenharmony_ci{
5847405867cSopenharmony_ci    Json::Value jsonValue;
5857405867cSopenharmony_ci    Json::Reader reader(Json::Features::strictMode());
5867405867cSopenharmony_ci    if (!reader.parse(jsonStr, jsonValue)) {
5877405867cSopenharmony_ci        HILOG_ERROR(LOG_CORE, "parse event detail info failed, please check the style of json");
5887405867cSopenharmony_ci        return nullptr;
5897405867cSopenharmony_ci    }
5907405867cSopenharmony_ci    return CreateValueByJson(env, jsonValue);
5917405867cSopenharmony_ci}
5927405867cSopenharmony_ci
5937405867cSopenharmony_cinapi_value CreateEventInfo(napi_env env, std::shared_ptr<AppEventPack> event)
5947405867cSopenharmony_ci{
5957405867cSopenharmony_ci    napi_value obj = CreateObject(env);
5967405867cSopenharmony_ci    SetNamedProperty(env, obj, DOMAIN_PROPERTY, CreateString(env, event->GetDomain()));
5977405867cSopenharmony_ci    SetNamedProperty(env, obj, NAME_PROPERTY, CreateString(env, event->GetName()));
5987405867cSopenharmony_ci    SetNamedProperty(env, obj, EVENT_TYPE_PROPERTY, CreateInt32(env, event->GetType()));
5997405867cSopenharmony_ci    SetNamedProperty(env, obj, PARAM_PROPERTY, CreateValueByJsonStr(env, event->GetParamStr()));
6007405867cSopenharmony_ci    return obj;
6017405867cSopenharmony_ci}
6027405867cSopenharmony_ci
6037405867cSopenharmony_cinapi_value CreateEventInfoArray(napi_env env, const std::vector<std::shared_ptr<AppEventPack>>& events)
6047405867cSopenharmony_ci{
6057405867cSopenharmony_ci    napi_value arr = CreateArray(env);
6067405867cSopenharmony_ci    for (size_t i = 0; i < events.size(); ++i) {
6077405867cSopenharmony_ci        SetElement(env, arr, i, CreateEventInfo(env, events[i]));
6087405867cSopenharmony_ci    }
6097405867cSopenharmony_ci    return arr;
6107405867cSopenharmony_ci}
6117405867cSopenharmony_ci
6127405867cSopenharmony_cinapi_value CreateEventGroups(napi_env env, const std::vector<std::shared_ptr<AppEventPack>>& events)
6137405867cSopenharmony_ci{
6147405867cSopenharmony_ci    std::unordered_map<std::string, std::vector<std::shared_ptr<AppEventPack>>> eventMap;
6157405867cSopenharmony_ci    for (auto event : events) {
6167405867cSopenharmony_ci        eventMap[event->GetName()].emplace_back(event);
6177405867cSopenharmony_ci    }
6187405867cSopenharmony_ci
6197405867cSopenharmony_ci    napi_value eventGroups = CreateArray(env);
6207405867cSopenharmony_ci    size_t index = 0;
6217405867cSopenharmony_ci    for (auto it = eventMap.begin(); it != eventMap.end(); ++it) {
6227405867cSopenharmony_ci        napi_value eventInfos = CreateArray(env);
6237405867cSopenharmony_ci        for (size_t i = 0; i < it->second.size(); ++i) {
6247405867cSopenharmony_ci            SetElement(env, eventInfos, i, CreateEventInfo(env, it->second[i]));
6257405867cSopenharmony_ci        }
6267405867cSopenharmony_ci        napi_value obj = CreateObject(env);
6277405867cSopenharmony_ci        SetNamedProperty(env, obj, NAME_PROPERTY, CreateString(env, it->first));
6287405867cSopenharmony_ci        SetNamedProperty(env, obj, EVENT_INFOS_PROPERTY, eventInfos);
6297405867cSopenharmony_ci        SetElement(env, eventGroups, index, obj);
6307405867cSopenharmony_ci        ++index;
6317405867cSopenharmony_ci    }
6327405867cSopenharmony_ci    return eventGroups;
6337405867cSopenharmony_ci}
6347405867cSopenharmony_ci} // namespace NapiUtil
6357405867cSopenharmony_ci} // namespace HiviewDFX
6367405867cSopenharmony_ci} // namespace OHOS
637