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