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