1020a203aSopenharmony_ci/* 2020a203aSopenharmony_ci * Copyright (C) 2021-2022 Huawei Device Co., Ltd. 3020a203aSopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4020a203aSopenharmony_ci * you may not use this file except in compliance with the License. 5020a203aSopenharmony_ci * You may obtain a copy of the License at 6020a203aSopenharmony_ci * 7020a203aSopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8020a203aSopenharmony_ci * 9020a203aSopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10020a203aSopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11020a203aSopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12020a203aSopenharmony_ci * See the License for the specific language governing permissions and 13020a203aSopenharmony_ci * limitations under the License. 14020a203aSopenharmony_ci */ 15020a203aSopenharmony_ci#include "napi_faultlogger.h" 16020a203aSopenharmony_ci 17020a203aSopenharmony_ci#include <cinttypes> 18020a203aSopenharmony_ci#include <sstream> 19020a203aSopenharmony_ci#include <unistd.h> 20020a203aSopenharmony_ci 21020a203aSopenharmony_ci#include "napi/native_api.h" 22020a203aSopenharmony_ci#include "napi/native_node_api.h" 23020a203aSopenharmony_ci 24020a203aSopenharmony_ci#include "common_utils.h" 25020a203aSopenharmony_ci#include "hiview_logger.h" 26020a203aSopenharmony_ci 27020a203aSopenharmony_ci#include "faultlog_query_result.h" 28020a203aSopenharmony_ci#include "napi_error.h" 29020a203aSopenharmony_ci#include "napi_util.h" 30020a203aSopenharmony_ci 31020a203aSopenharmony_cinamespace OHOS { 32020a203aSopenharmony_cinamespace HiviewDFX { 33020a203aSopenharmony_ciDEFINE_LOG_LABEL(0xD002D11, "Faultlogger-napi"); 34020a203aSopenharmony_cinamespace { 35020a203aSopenharmony_ci constexpr size_t ONE_PARAMETER = 1; 36020a203aSopenharmony_ci constexpr size_t TWO_PARAMETER = 2; 37020a203aSopenharmony_ci constexpr size_t THREE_PARAMETER = 3; 38020a203aSopenharmony_ci constexpr size_t FOUR_PARAMETER = 4; 39020a203aSopenharmony_ci std::mutex g_mutex; 40020a203aSopenharmony_ci} 41020a203aSopenharmony_cistatic FaultLogNapiInfo ConversionInform(std::unique_ptr<FaultLogInfo> faultLogInfo) 42020a203aSopenharmony_ci{ 43020a203aSopenharmony_ci FaultLogNapiInfo ret = { 44020a203aSopenharmony_ci .pid = faultLogInfo->GetProcessId(), 45020a203aSopenharmony_ci .uid = faultLogInfo->GetId(), 46020a203aSopenharmony_ci .type = faultLogInfo->GetFaultType(), 47020a203aSopenharmony_ci .ts = faultLogInfo->GetTimeStamp(), 48020a203aSopenharmony_ci .reason = faultLogInfo->GetFaultReason(), 49020a203aSopenharmony_ci .module = faultLogInfo->GetModuleName(), 50020a203aSopenharmony_ci .summary = faultLogInfo->GetFaultSummary(), 51020a203aSopenharmony_ci }; 52020a203aSopenharmony_ci int fd = faultLogInfo->GetRawFileDescriptor(); 53020a203aSopenharmony_ci if (fd < 0) { 54020a203aSopenharmony_ci HIVIEW_LOGE("pid %{public}d Fail to get fd:%{public}d\n", faultLogInfo->GetProcessId(), fd); 55020a203aSopenharmony_ci ret.fullLog = "Fail to get log, fd is " + std::to_string(fd); 56020a203aSopenharmony_ci return ret; 57020a203aSopenharmony_ci } 58020a203aSopenharmony_ci while (true) { 59020a203aSopenharmony_ci char buf[BUF_SIZE_512] = {0}; 60020a203aSopenharmony_ci int nread = TEMP_FAILURE_RETRY(read((fd), buf, BUF_SIZE_512 - 1)); 61020a203aSopenharmony_ci if (nread == -1) { 62020a203aSopenharmony_ci if (errno == EAGAIN) { 63020a203aSopenharmony_ci continue; 64020a203aSopenharmony_ci } else { 65020a203aSopenharmony_ci break; 66020a203aSopenharmony_ci } 67020a203aSopenharmony_ci } else if (nread == 0) { 68020a203aSopenharmony_ci break; 69020a203aSopenharmony_ci } 70020a203aSopenharmony_ci ret.fullLog += buf; 71020a203aSopenharmony_ci } 72020a203aSopenharmony_ci 73020a203aSopenharmony_ci return ret; 74020a203aSopenharmony_ci} 75020a203aSopenharmony_ci 76020a203aSopenharmony_cistatic void FaultLogExecuteCallback(napi_env env, void *data) 77020a203aSopenharmony_ci{ 78020a203aSopenharmony_ci std::lock_guard<std::mutex> lock(g_mutex); 79020a203aSopenharmony_ci FaultLogInfoContext* faultLogInfoContext = static_cast<FaultLogInfoContext *>(data); 80020a203aSopenharmony_ci const int maxQueryCount = 10; 81020a203aSopenharmony_ci int currentCount = 0; 82020a203aSopenharmony_ci auto faultLogResult = QuerySelfFaultLog((FaultLogType)faultLogInfoContext->faultType, 83020a203aSopenharmony_ci maxQueryCount); 84020a203aSopenharmony_ci if (faultLogResult == nullptr) { 85020a203aSopenharmony_ci faultLogInfoContext->resolved = true; 86020a203aSopenharmony_ci return; 87020a203aSopenharmony_ci } 88020a203aSopenharmony_ci 89020a203aSopenharmony_ci while (faultLogResult->HasNext()) { 90020a203aSopenharmony_ci if (currentCount >= maxQueryCount) { 91020a203aSopenharmony_ci break; 92020a203aSopenharmony_ci } 93020a203aSopenharmony_ci auto faultLogInfo = faultLogResult->Next(); 94020a203aSopenharmony_ci if (faultLogInfo == nullptr) { 95020a203aSopenharmony_ci break; 96020a203aSopenharmony_ci } 97020a203aSopenharmony_ci currentCount++; 98020a203aSopenharmony_ci faultLogInfoContext->infoVector.push_back(ConversionInform(std::move(faultLogInfo))); 99020a203aSopenharmony_ci } 100020a203aSopenharmony_ci faultLogInfoContext->resolved = true; 101020a203aSopenharmony_ci} 102020a203aSopenharmony_ci 103020a203aSopenharmony_cistatic void FaultLogCompleteCallback(napi_env env, napi_status status, void *data) 104020a203aSopenharmony_ci{ 105020a203aSopenharmony_ci FaultLogInfoContext* faultLogInfoContext = static_cast<FaultLogInfoContext *>(data); 106020a203aSopenharmony_ci if (faultLogInfoContext == nullptr) { 107020a203aSopenharmony_ci return; 108020a203aSopenharmony_ci } 109020a203aSopenharmony_ci napi_value callbackValue = nullptr; 110020a203aSopenharmony_ci if (faultLogInfoContext->resolved) { 111020a203aSopenharmony_ci napi_create_array(env, &callbackValue); 112020a203aSopenharmony_ci int i = 0; 113020a203aSopenharmony_ci for (auto& infoItem : faultLogInfoContext->infoVector) { 114020a203aSopenharmony_ci napi_value info = nullptr; 115020a203aSopenharmony_ci napi_create_object(env, &info); 116020a203aSopenharmony_ci NapiUtil::SetPropertyInt32(env, info, "pid", infoItem.pid); 117020a203aSopenharmony_ci NapiUtil::SetPropertyInt32(env, info, "uid", infoItem.uid); 118020a203aSopenharmony_ci NapiUtil::SetPropertyInt32(env, info, "type", infoItem.type); 119020a203aSopenharmony_ci NapiUtil::SetPropertyInt64(env, info, "timestamp", infoItem.ts); 120020a203aSopenharmony_ci NapiUtil::SetPropertyStringUtf8(env, info, "reason", infoItem.reason); 121020a203aSopenharmony_ci NapiUtil::SetPropertyStringUtf8(env, info, "module", infoItem.module); 122020a203aSopenharmony_ci NapiUtil::SetPropertyStringUtf8(env, info, "summary", infoItem.summary); 123020a203aSopenharmony_ci NapiUtil::SetPropertyStringUtf8(env, info, "fullLog", infoItem.fullLog); 124020a203aSopenharmony_ci napi_set_element(env, callbackValue, i, info); 125020a203aSopenharmony_ci ++i; 126020a203aSopenharmony_ci HIVIEW_LOGI("add element when resovled pid = %{public}d, uid = %{public}d, ts = %{public}" PRId64, 127020a203aSopenharmony_ci infoItem.pid, infoItem.uid, infoItem.ts); 128020a203aSopenharmony_ci } 129020a203aSopenharmony_ci } else { 130020a203aSopenharmony_ci callbackValue = NapiUtil::CreateErrorMessage(env, "get signal info list failed"); 131020a203aSopenharmony_ci } 132020a203aSopenharmony_ci 133020a203aSopenharmony_ci if (faultLogInfoContext->callbackRef != nullptr) { 134020a203aSopenharmony_ci napi_value callbackFunc = nullptr; 135020a203aSopenharmony_ci napi_get_reference_value(env, faultLogInfoContext->callbackRef, &callbackFunc); 136020a203aSopenharmony_ci napi_value callbackValues[] = {nullptr, nullptr}; 137020a203aSopenharmony_ci callbackValues[0] = faultLogInfoContext->resolved ? NapiUtil::CreateUndefined(env) : callbackValue; 138020a203aSopenharmony_ci callbackValues[1] = faultLogInfoContext->resolved ? callbackValue : NapiUtil::CreateUndefined(env); 139020a203aSopenharmony_ci napi_value recv = NapiUtil::CreateUndefined(env); 140020a203aSopenharmony_ci napi_value result = nullptr; 141020a203aSopenharmony_ci napi_call_function(env, recv, callbackFunc, std::size(callbackValues), callbackValues, &result); 142020a203aSopenharmony_ci napi_delete_reference(env, faultLogInfoContext->callbackRef); 143020a203aSopenharmony_ci } else if (faultLogInfoContext->deferred != nullptr) { 144020a203aSopenharmony_ci if (faultLogInfoContext->resolved) { 145020a203aSopenharmony_ci napi_resolve_deferred(env, faultLogInfoContext->deferred, callbackValue); 146020a203aSopenharmony_ci } else { 147020a203aSopenharmony_ci napi_reject_deferred(env, faultLogInfoContext->deferred, callbackValue); 148020a203aSopenharmony_ci } 149020a203aSopenharmony_ci } 150020a203aSopenharmony_ci 151020a203aSopenharmony_ci napi_delete_async_work(env, faultLogInfoContext->work); 152020a203aSopenharmony_ci delete faultLogInfoContext; 153020a203aSopenharmony_ci} 154020a203aSopenharmony_ci 155020a203aSopenharmony_cistatic napi_value QuerySelfFaultLog(napi_env env, napi_callback_info info) 156020a203aSopenharmony_ci{ 157020a203aSopenharmony_ci size_t parameterCount = 2; 158020a203aSopenharmony_ci napi_value parameters[2] = {0}; 159020a203aSopenharmony_ci napi_value thisVar = nullptr; 160020a203aSopenharmony_ci void *data = nullptr; 161020a203aSopenharmony_ci NAPI_CALL(env, napi_get_cb_info(env, info, ¶meterCount, parameters, &thisVar, &data)); 162020a203aSopenharmony_ci 163020a203aSopenharmony_ci napi_value result = NapiUtil::CreateUndefined(env); 164020a203aSopenharmony_ci if (parameterCount < ONE_PARAMETER || parameterCount > TWO_PARAMETER) { 165020a203aSopenharmony_ci HIVIEW_LOGE("parameterCount Incorrect %{public}zu", parameterCount); 166020a203aSopenharmony_ci return result; 167020a203aSopenharmony_ci } 168020a203aSopenharmony_ci 169020a203aSopenharmony_ci if (!NapiUtil::IsMatchType(env, parameters[ONE_PARAMETER - 1], napi_number)) { 170020a203aSopenharmony_ci HIVIEW_LOGE("parameters[0] type isn't number"); 171020a203aSopenharmony_ci return result; 172020a203aSopenharmony_ci } 173020a203aSopenharmony_ci 174020a203aSopenharmony_ci auto faultLogInfoContext = std::make_unique<FaultLogInfoContext>().release(); 175020a203aSopenharmony_ci if (faultLogInfoContext == nullptr) { 176020a203aSopenharmony_ci HIVIEW_LOGE("faultLogInfoContext == nullptr"); 177020a203aSopenharmony_ci return result; 178020a203aSopenharmony_ci } 179020a203aSopenharmony_ci 180020a203aSopenharmony_ci napi_get_value_int32(env, parameters[ONE_PARAMETER - 1], &faultLogInfoContext->faultType); 181020a203aSopenharmony_ci if (parameterCount == ONE_PARAMETER) { 182020a203aSopenharmony_ci napi_create_promise(env, &faultLogInfoContext->deferred, &result); 183020a203aSopenharmony_ci } else if (parameterCount == TWO_PARAMETER) { 184020a203aSopenharmony_ci if (!NapiUtil::IsMatchType(env, parameters[TWO_PARAMETER - 1], napi_function)) { 185020a203aSopenharmony_ci HIVIEW_LOGE("parameters[1] type isn't function"); 186020a203aSopenharmony_ci delete faultLogInfoContext; 187020a203aSopenharmony_ci return result; 188020a203aSopenharmony_ci } 189020a203aSopenharmony_ci NAPI_CALL(env, napi_create_reference(env, parameters[TWO_PARAMETER - 1], 1, &faultLogInfoContext->callbackRef)); 190020a203aSopenharmony_ci } 191020a203aSopenharmony_ci 192020a203aSopenharmony_ci napi_value resource = NapiUtil::CreateUndefined(env); 193020a203aSopenharmony_ci napi_value resourceName = nullptr; 194020a203aSopenharmony_ci napi_create_string_utf8(env, "QuerySelfFaultLog", NAPI_AUTO_LENGTH, &resourceName); 195020a203aSopenharmony_ci napi_create_async_work(env, resource, resourceName, FaultLogExecuteCallback, 196020a203aSopenharmony_ci FaultLogCompleteCallback, (void *)faultLogInfoContext, &faultLogInfoContext->work); 197020a203aSopenharmony_ci napi_queue_async_work_with_qos(env, faultLogInfoContext->work, napi_qos_default); 198020a203aSopenharmony_ci return result; 199020a203aSopenharmony_ci} 200020a203aSopenharmony_ci 201020a203aSopenharmony_cistatic napi_value AddFaultLog(napi_env env, napi_callback_info info) 202020a203aSopenharmony_ci{ 203020a203aSopenharmony_ci size_t parameterCount = 4; 204020a203aSopenharmony_ci napi_value parameters[4] = {0}; 205020a203aSopenharmony_ci napi_value thisVar = nullptr; 206020a203aSopenharmony_ci void *data = nullptr; 207020a203aSopenharmony_ci NAPI_CALL(env, napi_get_cb_info(env, info, ¶meterCount, parameters, &thisVar, &data)); 208020a203aSopenharmony_ci 209020a203aSopenharmony_ci napi_value result = NapiUtil::CreateUndefined(env); 210020a203aSopenharmony_ci if (parameterCount != FOUR_PARAMETER) { 211020a203aSopenharmony_ci return result; 212020a203aSopenharmony_ci } 213020a203aSopenharmony_ci if (!NapiUtil::IsMatchType(env, parameters[ONE_PARAMETER - 1], napi_number)) { 214020a203aSopenharmony_ci HIVIEW_LOGE("parameters[0] type isn't number"); 215020a203aSopenharmony_ci return result; 216020a203aSopenharmony_ci } 217020a203aSopenharmony_ci if (!NapiUtil::IsMatchType(env, parameters[TWO_PARAMETER - 1], napi_number)) { 218020a203aSopenharmony_ci HIVIEW_LOGE("parameters[1] type isn't number"); 219020a203aSopenharmony_ci return result; 220020a203aSopenharmony_ci } 221020a203aSopenharmony_ci if (!NapiUtil::IsMatchType(env, parameters[THREE_PARAMETER - 1], napi_string)) { 222020a203aSopenharmony_ci HIVIEW_LOGE("parameters[2] type isn't napi_string"); 223020a203aSopenharmony_ci return result; 224020a203aSopenharmony_ci } 225020a203aSopenharmony_ci if (!NapiUtil::IsMatchType(env, parameters[FOUR_PARAMETER - 1], napi_string)) { 226020a203aSopenharmony_ci HIVIEW_LOGE("parameters[3] type isn't napi_string"); 227020a203aSopenharmony_ci return result; 228020a203aSopenharmony_ci } 229020a203aSopenharmony_ci int32_t nowTmp; 230020a203aSopenharmony_ci size_t resultString; 231020a203aSopenharmony_ci napi_get_value_int32(env, parameters[ONE_PARAMETER - 1], &nowTmp); 232020a203aSopenharmony_ci int64_t now = time(nullptr) + nowTmp; 233020a203aSopenharmony_ci int32_t logType; 234020a203aSopenharmony_ci napi_get_value_int32(env, parameters[TWO_PARAMETER - 1], &logType); 235020a203aSopenharmony_ci 236020a203aSopenharmony_ci char module[BUF_SIZE_64]; 237020a203aSopenharmony_ci napi_get_value_string_utf8(env, parameters[THREE_PARAMETER - 1], module, BUF_SIZE_64, &resultString); 238020a203aSopenharmony_ci char summary[BUF_SIZE_64]; 239020a203aSopenharmony_ci napi_get_value_string_utf8(env, parameters[FOUR_PARAMETER - 1], summary, BUF_SIZE_64, &resultString); 240020a203aSopenharmony_ci constexpr int64_t SEC_TO_MILLISEC = 1000; 241020a203aSopenharmony_ci AddFaultLog(now * SEC_TO_MILLISEC, logType, module, summary); 242020a203aSopenharmony_ci return result; 243020a203aSopenharmony_ci} 244020a203aSopenharmony_ci 245020a203aSopenharmony_cistatic napi_value Query(napi_env env, napi_callback_info info) 246020a203aSopenharmony_ci{ 247020a203aSopenharmony_ci size_t parameterCount = 2; 248020a203aSopenharmony_ci napi_value parameters[2] = {0}; 249020a203aSopenharmony_ci napi_value thisVar = nullptr; 250020a203aSopenharmony_ci void *data = nullptr; 251020a203aSopenharmony_ci NAPI_CALL(env, napi_get_cb_info(env, info, ¶meterCount, parameters, &thisVar, &data)); 252020a203aSopenharmony_ci 253020a203aSopenharmony_ci napi_value result = NapiUtil::CreateUndefined(env); 254020a203aSopenharmony_ci if (parameterCount < ONE_PARAMETER || parameterCount > TWO_PARAMETER) { 255020a203aSopenharmony_ci HIVIEW_LOGE("parameterCount Incorrect %{public}zu", parameterCount); 256020a203aSopenharmony_ci NapiUtil::ThrowError(env, NapiError::ERR_INPUT_PARAM, NapiUtil::CreateParamCntErrMsg()); 257020a203aSopenharmony_ci return result; 258020a203aSopenharmony_ci } 259020a203aSopenharmony_ci 260020a203aSopenharmony_ci if (!NapiUtil::IsMatchType(env, parameters[ONE_PARAMETER - 1], napi_number)) { 261020a203aSopenharmony_ci HIVIEW_LOGE("parameters[0] type isn't number"); 262020a203aSopenharmony_ci NapiUtil::ThrowError(env, NapiError::ERR_INPUT_PARAM, NapiUtil::CreateErrMsg("type", napi_number)); 263020a203aSopenharmony_ci return result; 264020a203aSopenharmony_ci } 265020a203aSopenharmony_ci if (!CheckFaultloggerStatus()) { 266020a203aSopenharmony_ci NapiUtil::ThrowError(env, NapiError::ERR_SERVICE_STATUS, NapiUtil::CreateServiceErrMsg()); 267020a203aSopenharmony_ci return result; 268020a203aSopenharmony_ci } 269020a203aSopenharmony_ci 270020a203aSopenharmony_ci auto faultLogInfoContext = std::make_unique<FaultLogInfoContext>().release(); 271020a203aSopenharmony_ci if (faultLogInfoContext == nullptr) { 272020a203aSopenharmony_ci HIVIEW_LOGE("faultLogInfoContext == nullptr"); 273020a203aSopenharmony_ci return result; 274020a203aSopenharmony_ci } 275020a203aSopenharmony_ci 276020a203aSopenharmony_ci napi_get_value_int32(env, parameters[ONE_PARAMETER - 1], &faultLogInfoContext->faultType); 277020a203aSopenharmony_ci if (parameterCount == ONE_PARAMETER) { 278020a203aSopenharmony_ci napi_create_promise(env, &faultLogInfoContext->deferred, &result); 279020a203aSopenharmony_ci } else if (parameterCount == TWO_PARAMETER) { 280020a203aSopenharmony_ci if (!NapiUtil::IsMatchType(env, parameters[TWO_PARAMETER - 1], napi_function)) { 281020a203aSopenharmony_ci HIVIEW_LOGE("parameters[1] type isn't function"); 282020a203aSopenharmony_ci delete faultLogInfoContext; 283020a203aSopenharmony_ci NapiUtil::ThrowError(env, NapiError::ERR_INPUT_PARAM, 284020a203aSopenharmony_ci NapiUtil::CreateErrMsg("callback", napi_function), true); 285020a203aSopenharmony_ci return result; 286020a203aSopenharmony_ci } 287020a203aSopenharmony_ci NAPI_CALL(env, napi_create_reference(env, parameters[TWO_PARAMETER - 1], 1, &faultLogInfoContext->callbackRef)); 288020a203aSopenharmony_ci } 289020a203aSopenharmony_ci 290020a203aSopenharmony_ci napi_value resource = NapiUtil::CreateUndefined(env); 291020a203aSopenharmony_ci napi_value resourceName = nullptr; 292020a203aSopenharmony_ci napi_create_string_utf8(env, "QuerySelfFaultLog", NAPI_AUTO_LENGTH, &resourceName); 293020a203aSopenharmony_ci napi_create_async_work(env, resource, resourceName, FaultLogExecuteCallback, 294020a203aSopenharmony_ci FaultLogCompleteCallback, (void *)faultLogInfoContext, &faultLogInfoContext->work); 295020a203aSopenharmony_ci napi_queue_async_work_with_qos(env, faultLogInfoContext->work, napi_qos_default); 296020a203aSopenharmony_ci return result; 297020a203aSopenharmony_ci} 298020a203aSopenharmony_ci 299020a203aSopenharmony_cinapi_value FaultLogTypeConstructor(napi_env env, napi_callback_info info) 300020a203aSopenharmony_ci{ 301020a203aSopenharmony_ci napi_value thisArg = nullptr; 302020a203aSopenharmony_ci void* data = nullptr; 303020a203aSopenharmony_ci 304020a203aSopenharmony_ci napi_get_cb_info(env, info, nullptr, nullptr, &thisArg, &data); 305020a203aSopenharmony_ci 306020a203aSopenharmony_ci napi_value global = nullptr; 307020a203aSopenharmony_ci napi_get_global(env, &global); 308020a203aSopenharmony_ci 309020a203aSopenharmony_ci return thisArg; 310020a203aSopenharmony_ci} 311020a203aSopenharmony_ci 312020a203aSopenharmony_cistatic void FaultLogTypeEnumInit(napi_env env, napi_value exports) 313020a203aSopenharmony_ci{ 314020a203aSopenharmony_ci napi_value noSpecific = nullptr; 315020a203aSopenharmony_ci napi_value cppCrash = nullptr; 316020a203aSopenharmony_ci napi_value jsCrash = nullptr; 317020a203aSopenharmony_ci napi_value appCrash = nullptr; 318020a203aSopenharmony_ci 319020a203aSopenharmony_ci napi_create_int32(env, FaultLogType::NO_SPECIFIC, &noSpecific); 320020a203aSopenharmony_ci napi_create_int32(env, FaultLogType::CPP_CRASH, &cppCrash); 321020a203aSopenharmony_ci napi_create_int32(env, FaultLogType::JS_CRASH, &jsCrash); 322020a203aSopenharmony_ci napi_create_int32(env, FaultLogType::APP_FREEZE, &appCrash); 323020a203aSopenharmony_ci 324020a203aSopenharmony_ci napi_property_descriptor descriptors[] = { 325020a203aSopenharmony_ci DECLARE_NAPI_STATIC_PROPERTY("NO_SPECIFIC", noSpecific), 326020a203aSopenharmony_ci DECLARE_NAPI_STATIC_PROPERTY("CPP_CRASH", cppCrash), 327020a203aSopenharmony_ci DECLARE_NAPI_STATIC_PROPERTY("JS_CRASH", jsCrash), 328020a203aSopenharmony_ci DECLARE_NAPI_STATIC_PROPERTY("APP_FREEZE", appCrash), 329020a203aSopenharmony_ci }; 330020a203aSopenharmony_ci 331020a203aSopenharmony_ci napi_value result = nullptr; 332020a203aSopenharmony_ci napi_define_class(env, "FaultType", NAPI_AUTO_LENGTH, FaultLogTypeConstructor, nullptr, 333020a203aSopenharmony_ci sizeof(descriptors) / sizeof(*descriptors), descriptors, &result); 334020a203aSopenharmony_ci 335020a203aSopenharmony_ci napi_set_named_property(env, exports, "FaultType", result); 336020a203aSopenharmony_ci} 337020a203aSopenharmony_ci 338020a203aSopenharmony_cinapi_value FaultLogInfoConstructor(napi_env env, napi_callback_info info) 339020a203aSopenharmony_ci{ 340020a203aSopenharmony_ci napi_value thisArg = nullptr; 341020a203aSopenharmony_ci void* data = nullptr; 342020a203aSopenharmony_ci 343020a203aSopenharmony_ci napi_get_cb_info(env, info, nullptr, nullptr, &thisArg, &data); 344020a203aSopenharmony_ci 345020a203aSopenharmony_ci napi_value global = nullptr; 346020a203aSopenharmony_ci napi_get_global(env, &global); 347020a203aSopenharmony_ci 348020a203aSopenharmony_ci return thisArg; 349020a203aSopenharmony_ci} 350020a203aSopenharmony_ci 351020a203aSopenharmony_cistatic void FaultLogInfoClassInit(napi_env env, napi_value exports) 352020a203aSopenharmony_ci{ 353020a203aSopenharmony_ci napi_value pid = nullptr; 354020a203aSopenharmony_ci napi_value uid = nullptr; 355020a203aSopenharmony_ci napi_value type = nullptr; 356020a203aSopenharmony_ci napi_value ts = nullptr; 357020a203aSopenharmony_ci napi_value reason = nullptr; 358020a203aSopenharmony_ci napi_value module = nullptr; 359020a203aSopenharmony_ci napi_value summary = nullptr; 360020a203aSopenharmony_ci napi_value fullLog = nullptr; 361020a203aSopenharmony_ci 362020a203aSopenharmony_ci napi_create_int32(env, 0, &pid); 363020a203aSopenharmony_ci napi_create_int32(env, 0, &uid); 364020a203aSopenharmony_ci napi_create_int32(env, FaultLogType::NO_SPECIFIC, &type); 365020a203aSopenharmony_ci napi_create_int64(env, 0, &ts); 366020a203aSopenharmony_ci napi_create_string_latin1(env, "reason", NAPI_AUTO_LENGTH, &reason); 367020a203aSopenharmony_ci napi_create_string_latin1(env, "module", NAPI_AUTO_LENGTH, &module); 368020a203aSopenharmony_ci napi_create_string_latin1(env, "summary", NAPI_AUTO_LENGTH, &summary); 369020a203aSopenharmony_ci napi_create_string_latin1(env, "fullLog", NAPI_AUTO_LENGTH, &fullLog); 370020a203aSopenharmony_ci 371020a203aSopenharmony_ci napi_property_descriptor descriptors[] = { 372020a203aSopenharmony_ci DECLARE_NAPI_PROPERTY("pid", pid), 373020a203aSopenharmony_ci DECLARE_NAPI_PROPERTY("uid", uid), 374020a203aSopenharmony_ci DECLARE_NAPI_PROPERTY("type", type), 375020a203aSopenharmony_ci DECLARE_NAPI_PROPERTY("timestamp", ts), 376020a203aSopenharmony_ci DECLARE_NAPI_PROPERTY("reason", reason), 377020a203aSopenharmony_ci DECLARE_NAPI_PROPERTY("module", module), 378020a203aSopenharmony_ci DECLARE_NAPI_PROPERTY("summary", summary), 379020a203aSopenharmony_ci DECLARE_NAPI_PROPERTY("fullLog", fullLog), 380020a203aSopenharmony_ci }; 381020a203aSopenharmony_ci 382020a203aSopenharmony_ci napi_value result = nullptr; 383020a203aSopenharmony_ci napi_define_class(env, "FaultLogInfo", NAPI_AUTO_LENGTH, FaultLogInfoConstructor, nullptr, 384020a203aSopenharmony_ci sizeof(descriptors) / sizeof(*descriptors), descriptors, &result); 385020a203aSopenharmony_ci 386020a203aSopenharmony_ci napi_set_named_property(env, exports, "FaultLogInfo", result); 387020a203aSopenharmony_ci} 388020a203aSopenharmony_ci 389020a203aSopenharmony_ciEXTERN_C_START 390020a203aSopenharmony_cinapi_value InitNapiRegistry(napi_env env, napi_value exports) 391020a203aSopenharmony_ci{ 392020a203aSopenharmony_ci napi_property_descriptor desc[] = { 393020a203aSopenharmony_ci DECLARE_NAPI_FUNCTION("querySelfFaultLog", QuerySelfFaultLog), 394020a203aSopenharmony_ci DECLARE_NAPI_FUNCTION("addFaultLog", AddFaultLog), 395020a203aSopenharmony_ci DECLARE_NAPI_FUNCTION("query", Query), 396020a203aSopenharmony_ci }; 397020a203aSopenharmony_ci NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc)); 398020a203aSopenharmony_ci FaultLogTypeEnumInit(env, exports); 399020a203aSopenharmony_ci FaultLogInfoClassInit(env, exports); 400020a203aSopenharmony_ci return exports; 401020a203aSopenharmony_ci} 402020a203aSopenharmony_ciEXTERN_C_END 403020a203aSopenharmony_ci 404020a203aSopenharmony_cistatic napi_module _stateRegistryModule = { 405020a203aSopenharmony_ci .nm_version = 1, 406020a203aSopenharmony_ci .nm_flags = 0, 407020a203aSopenharmony_ci .nm_filename = NULL, 408020a203aSopenharmony_ci .nm_register_func = InitNapiRegistry, 409020a203aSopenharmony_ci .nm_modname = "faultLogger", 410020a203aSopenharmony_ci .nm_priv = ((void *)0), 411020a203aSopenharmony_ci .reserved = {(void *)0}, 412020a203aSopenharmony_ci}; 413020a203aSopenharmony_ci 414020a203aSopenharmony_ciextern "C" __attribute__((constructor)) void RegisterFaultLoggerModule(void) 415020a203aSopenharmony_ci{ 416020a203aSopenharmony_ci napi_module_register(&_stateRegistryModule); 417020a203aSopenharmony_ci} 418020a203aSopenharmony_ci} // namespace HiviewDFX 419020a203aSopenharmony_ci} // namespace OHOS 420