1 /*
2  * Copyright (c) 2021-2024 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #include "napi_hiappevent_init.h"
16 
17 #include <map>
18 #include <string>
19 
20 #include "napi_util.h"
21 
22 namespace OHOS {
23 namespace HiviewDFX {
24 namespace NapiHiAppEventInit {
25 namespace {
26 constexpr int FAULT_EVENT_TYPE = 1;
27 constexpr int STATISTIC_EVENT_TYPE = 2;
28 constexpr int SECURITY_EVENT_TYPE = 3;
29 constexpr int BEHAVIOR_EVENT_TYPE = 4;
30 
31 const std::string EVENT_CLASS_NAME = "Event";
32 const std::string EVENT_CLASS_NAME_V9 = "event";
33 const std::string PARAM_CLASS_NAME = "Param";
34 const std::string PARAM_CLASS_NAME_V9 = "param";
35 const std::string EVENT_TYPE_CLASS_NAME = "EventType";
36 const std::string DOMAIN_CLASS_NAME = "domain";
37 
ClassConstructor(napi_env env,napi_callback_info info)38 napi_value ClassConstructor(napi_env env, napi_callback_info info)
39 {
40     size_t argc = 0;
41     napi_value argv = nullptr;
42     napi_value thisArg = nullptr;
43     void* data = nullptr;
44     napi_get_cb_info(env, info, &argc, &argv, &thisArg, &data);
45 
46     napi_value global = 0;
47     napi_get_global(env, &global);
48 
49     return thisArg;
50 }
51 
InitEventTypeMap(napi_env env,std::map<const char *,napi_value> & eventTypeMap)52 void InitEventTypeMap(napi_env env, std::map<const char*, napi_value>& eventTypeMap)
53 {
54     eventTypeMap["FAULT"] = NapiUtil::CreateInt32(env, FAULT_EVENT_TYPE);
55     eventTypeMap["STATISTIC"] = NapiUtil::CreateInt32(env, STATISTIC_EVENT_TYPE);
56     eventTypeMap["SECURITY"] = NapiUtil::CreateInt32(env, SECURITY_EVENT_TYPE);
57     eventTypeMap["BEHAVIOR"] = NapiUtil::CreateInt32(env, BEHAVIOR_EVENT_TYPE);
58 }
59 
InitEventMap(napi_env env,std::map<const char *,napi_value> & eventMap)60 void InitEventMap(napi_env env, std::map<const char*, napi_value>& eventMap)
61 {
62     eventMap["USER_LOGIN"] = NapiUtil::CreateString(env, "hiappevent.user_login");
63     eventMap["USER_LOGOUT"] = NapiUtil::CreateString(env, "hiappevent.user_logout");
64     eventMap["DISTRIBUTED_SERVICE_START"] = NapiUtil::CreateString(env, "hiappevent.distributed_service_start");
65     eventMap["APP_CRASH"] = NapiUtil::CreateString(env, "APP_CRASH");
66     eventMap["APP_FREEZE"] = NapiUtil::CreateString(env, "APP_FREEZE");
67     eventMap["APP_LAUNCH"] = NapiUtil::CreateString(env, "APP_LAUNCH");
68     eventMap["SCROLL_JANK"] = NapiUtil::CreateString(env, "SCROLL_JANK");
69     eventMap["CPU_USAGE_HIGH"] = NapiUtil::CreateString(env, "CPU_USAGE_HIGH");
70     eventMap["BATTERY_USAGE"] = NapiUtil::CreateString(env, "BATTERY_USAGE");
71     eventMap["RESOURCE_OVERLIMIT"] = NapiUtil::CreateString(env, "RESOURCE_OVERLIMIT");
72     eventMap["ADDRESS_SANITIZER"] = NapiUtil::CreateString(env, "ADDRESS_SANITIZER");
73     eventMap["MAIN_THREAD_JANK"] = NapiUtil::CreateString(env, "MAIN_THREAD_JANK");
74 }
75 
InitParamMap(napi_env env,std::map<const char *,napi_value> & paramMap)76 void InitParamMap(napi_env env, std::map<const char*, napi_value>& paramMap)
77 {
78     paramMap["USER_ID"] = NapiUtil::CreateString(env, "user_id");
79     paramMap["DISTRIBUTED_SERVICE_NAME"] = NapiUtil::CreateString(env, "ds_name");
80     paramMap["DISTRIBUTED_SERVICE_INSTANCE_ID"] = NapiUtil::CreateString(env, "ds_instance_id");
81 }
82 
InitDomainMap(napi_env env,std::map<const char *,napi_value> & domainMap)83 void InitDomainMap(napi_env env, std::map<const char*, napi_value>& domainMap)
84 {
85     domainMap["OS"] = NapiUtil::CreateString(env, "OS");
86 }
87 
InitConstClassByName(napi_env env,napi_value exports,const std::string & name)88 void InitConstClassByName(napi_env env, napi_value exports, const std::string& name)
89 {
90     std::map<const char*, napi_value> propertyMap;
91     if (name == EVENT_CLASS_NAME || name == EVENT_CLASS_NAME_V9) {
92         InitEventMap(env, propertyMap);
93     } else if (name == PARAM_CLASS_NAME || name == PARAM_CLASS_NAME_V9) {
94         InitParamMap(env, propertyMap);
95     } else if (name == EVENT_TYPE_CLASS_NAME) {
96         InitEventTypeMap(env, propertyMap);
97     } else if (name == DOMAIN_CLASS_NAME) {
98         InitDomainMap(env, propertyMap);
99     } else {
100         return;
101     }
102 
103     int i = 0;
104     napi_property_descriptor descriptors[propertyMap.size()];
105     for (auto it : propertyMap) {
106         descriptors[i++] = DECLARE_NAPI_STATIC_PROPERTY(it.first, it.second);
107     }
108 
109     napi_value result = nullptr;
110     napi_define_class(env, name.c_str(), NAPI_AUTO_LENGTH, ClassConstructor, nullptr,
111         sizeof(descriptors) / sizeof(*descriptors), descriptors, &result);
112     napi_set_named_property(env, exports, name.c_str(), result);
113 }
114 }
115 
InitNapiClass(napi_env env,napi_value exports)116 napi_value InitNapiClass(napi_env env, napi_value exports)
117 {
118     InitConstClassByName(env, exports, EVENT_CLASS_NAME);
119     InitConstClassByName(env, exports, PARAM_CLASS_NAME);
120     InitConstClassByName(env, exports, EVENT_TYPE_CLASS_NAME);
121     return exports;
122 }
123 
InitNapiClassV9(napi_env env,napi_value exports)124 napi_value InitNapiClassV9(napi_env env, napi_value exports)
125 {
126     InitConstClassByName(env, exports, EVENT_CLASS_NAME_V9);
127     InitConstClassByName(env, exports, PARAM_CLASS_NAME_V9);
128     InitConstClassByName(env, exports, EVENT_TYPE_CLASS_NAME);
129     InitConstClassByName(env, exports, DOMAIN_CLASS_NAME);
130     return exports;
131 }
132 } // namespace NapiHiAppEventInit
133 } // namespace HiviewDFX
134 } // namespace OHOS
135