• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2022 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 
16 #include "napi_helper.h"
17 
18 #include "native_engine/native_value.h"
19 
20 namespace Commonlibrary::Concurrent::Common::Helper {
21 static constexpr uint32_t MAX_CHAR_LENGTH = 1024;
22 
IsTypeForNapiValue(napi_env env,napi_value param,napi_valuetype expectType)23 bool NapiHelper::IsTypeForNapiValue(napi_env env, napi_value param, napi_valuetype expectType)
24 {
25     napi_valuetype valueType = napi_undefined;
26     if (param == nullptr) {
27         return false;
28     }
29     if (napi_typeof(env, param, &valueType) != napi_ok) {
30         return false;
31     }
32 
33     return valueType == expectType;
34 }
35 
IsString(napi_env env,napi_value value)36 bool NapiHelper::IsString(napi_env env, napi_value value)
37 {
38     return IsTypeForNapiValue(env, value, napi_string);
39 }
40 
IsNotUndefined(napi_env env,napi_value value)41 bool NapiHelper::IsNotUndefined(napi_env env, napi_value value)
42 {
43     if (value == nullptr) {
44         return false;
45     }
46     napi_valuetype valueType = napi_undefined;
47     if (napi_typeof(env, value, &valueType) != napi_ok) {
48         return false;
49     }
50 
51     return valueType != napi_undefined;
52 }
53 
IsArray(napi_env env,napi_value value)54 bool NapiHelper::IsArray(napi_env env, napi_value value)
55 {
56     bool isArray = false;
57     if (value == nullptr) {
58         return false;
59     }
60     if (napi_is_array(env, value, &isArray) != napi_ok) {
61         return false;
62     }
63 
64     return isArray;
65 }
66 
IsFunction(napi_env env,napi_value object)67 bool NapiHelper::IsFunction(napi_env env, napi_value object)
68 {
69     return IsTypeForNapiValue(env, object, napi_function);
70 }
71 
IsArrayBuffer(napi_env env,napi_value value)72 bool NapiHelper::IsArrayBuffer(napi_env env, napi_value value)
73 {
74     bool result = false;
75     if (value == nullptr) {
76         return false;
77     }
78     if (napi_is_arraybuffer(env, value, &result) != napi_ok) {
79         return false;
80     }
81 
82     return result;
83 }
84 
IsNumber(napi_env env,napi_value value)85 bool NapiHelper::IsNumber(napi_env env, napi_value value)
86 {
87     return IsTypeForNapiValue(env, value, napi_number);
88 }
89 
GetCallbackInfoArgc(napi_env env,napi_callback_info cbInfo)90 size_t NapiHelper::GetCallbackInfoArgc(napi_env env, napi_callback_info cbInfo)
91 {
92     size_t argc = 0;
93     napi_get_cb_info(env, cbInfo, &argc, nullptr, nullptr, nullptr);
94     return argc;
95 }
96 
GetNamePropertyInParentPort(napi_env env,napi_ref parentPort,const char * name)97 napi_value NapiHelper::GetNamePropertyInParentPort(napi_env env, napi_ref parentPort, const char* name)
98 {
99     napi_value obj = nullptr;
100     napi_get_reference_value(env, parentPort, &obj);
101 
102     napi_value value = nullptr;
103     napi_get_named_property(env, obj, name, &value);
104 
105     return value;
106 }
107 
GetUndefinedValue(napi_env env)108 napi_value NapiHelper::GetUndefinedValue(napi_env env)
109 {
110     napi_value result = nullptr;
111     napi_get_undefined(env, &result);
112     return result;
113 }
114 
IsCallable(napi_env env,napi_value value)115 bool NapiHelper::IsCallable(napi_env env, napi_value value)
116 {
117     bool result = false;
118     napi_is_callable(env, value, &result);
119     return result;
120 }
121 
IsCallable(napi_env env,napi_ref value)122 bool NapiHelper::IsCallable(napi_env env, napi_ref value)
123 {
124     napi_value obj = nullptr;
125     napi_get_reference_value(env, value, &obj);
126     if (obj == nullptr) {
127         return false;
128     }
129     return IsCallable(env, obj);
130 }
131 
IsAsyncFunction(napi_env env,napi_value value)132 bool NapiHelper::IsAsyncFunction(napi_env env, napi_value value)
133 {
134     bool res = false;
135     napi_is_async_function(env, value, &res);
136     return res;
137 }
138 
IsGeneratorFunction(napi_env env,napi_value value)139 bool NapiHelper::IsGeneratorFunction(napi_env env, napi_value value)
140 {
141     bool res = false;
142     napi_is_generator_function(env, value, &res);
143     return res;
144 }
145 
IsStrictEqual(napi_env env,napi_value lhs,napi_value rhs)146 bool NapiHelper::IsStrictEqual(napi_env env, napi_value lhs, napi_value rhs)
147 {
148     bool res = false;
149     napi_strict_equals(env, lhs, rhs, &res);
150     return res;
151 }
152 
IsSendablObject(napi_env env,napi_value value)153 bool NapiHelper::IsSendablObject(napi_env env, napi_value value)
154 {
155     bool res = false;
156     napi_is_sendable_object(env, value, &res);
157     return res;
158 }
159 
SetNamePropertyInGlobal(napi_env env,const char * name,napi_value value)160 void NapiHelper::SetNamePropertyInGlobal(napi_env env, const char* name, napi_value value)
161 {
162     napi_value object = nullptr;
163     napi_get_global(env, &object);
164     napi_set_named_property(env, object, name, value);
165 }
166 
IsObject(napi_env env,napi_value value)167 bool NapiHelper::IsObject(napi_env env, napi_value value)
168 {
169     return IsTypeForNapiValue(env, value, napi_object);
170 }
171 
GetString(napi_env env,napi_value value)172 char* NapiHelper::GetString(napi_env env, napi_value value)
173 {
174     size_t bufferSize = 0;
175     size_t strLength = 0;
176     napi_get_value_string_utf8(env, value, nullptr, 0, &bufferSize);
177     if (bufferSize > MAX_CHAR_LENGTH) {
178         bufferSize = MAX_CHAR_LENGTH;
179     }
180     char* buffer = new char[bufferSize + 1] { 0 };
181     napi_get_value_string_utf8(env, value, buffer, bufferSize + 1, &strLength);
182     return buffer;
183 }
184 
CreateBooleanValue(napi_env env,bool value)185 napi_value NapiHelper::CreateBooleanValue(napi_env env, bool value)
186 {
187     napi_value result = nullptr;
188     napi_get_boolean(env, value, &result);
189     return result;
190 }
191 
GetGlobalObject(napi_env env)192 napi_value NapiHelper::GetGlobalObject(napi_env env)
193 {
194     napi_value object = nullptr;
195     napi_get_global(env, &object);
196     return object;
197 }
198 
CreateReference(napi_env env,napi_value value,uint32_t refcount)199 napi_ref NapiHelper::CreateReference(napi_env env, napi_value value, uint32_t refcount)
200 {
201     napi_ref callback = nullptr;
202     napi_create_reference(env, value, refcount, &callback);
203     return callback;
204 }
205 
CreateUint32(napi_env env,uint32_t value)206 napi_value NapiHelper::CreateUint32(napi_env env, uint32_t value)
207 {
208     napi_value result = nullptr;
209     napi_create_uint32(env, value, &result);
210     return result;
211 }
212 
GetLibUV(napi_env env)213 uv_loop_t* NapiHelper::GetLibUV(napi_env env)
214 {
215     uv_loop_t* loop;
216     napi_get_uv_event_loop(env, &loop);
217     return loop;
218 }
219 
GetReferenceValue(napi_env env,napi_ref ref)220 napi_value NapiHelper::GetReferenceValue(napi_env env, napi_ref ref)
221 {
222     napi_value result = nullptr;
223     napi_get_reference_value(env, ref, &result);
224     return result;
225 }
226 
DeleteReference(napi_env env,napi_ref ref)227 void NapiHelper::DeleteReference(napi_env env, napi_ref ref)
228 {
229     napi_delete_reference(env, ref);
230 }
231 
GetNameProperty(napi_env env,napi_value obj,const char * name)232 napi_value NapiHelper::GetNameProperty(napi_env env, napi_value obj, const char* name)
233 {
234     napi_value result = nullptr;
235     napi_get_named_property(env, obj, name, &result);
236     return result;
237 }
238 
HasNameProperty(napi_env env,napi_value obj,const char * name)239 bool NapiHelper::HasNameProperty(napi_env env, napi_value obj, const char* name)
240 {
241     bool result = false;
242     napi_has_named_property(env, obj, name, &result);
243     return result;
244 }
245 
GetBooleanValue(napi_env env,napi_value value)246 bool NapiHelper::GetBooleanValue(napi_env env, napi_value value)
247 {
248     bool result = false;
249     napi_get_value_bool(env, value, &result);
250     return result;
251 }
252 
StrictEqual(napi_env env,napi_value value,napi_value cmpValue)253 bool NapiHelper::StrictEqual(napi_env env, napi_value value, napi_value cmpValue)
254 {
255     bool isEqual = false;
256     napi_strict_equals(env, value, cmpValue, &isEqual);
257     return isEqual;
258 }
259 
GetConstructorName(napi_env env,napi_value object)260 std::string NapiHelper::GetConstructorName(napi_env env, napi_value object)
261 {
262     while (IsNotUndefined(env, object)) {
263         napi_value func = nullptr;
264         napi_get_own_property_descriptor(env, object, "constructor", &func);
265         bool isInstanceof = false;
266         napi_instanceof(env, object, func, &isInstanceof);
267         if (IsNotUndefined(env, func) && isInstanceof) {
268             napi_value ctorName = nullptr;
269             napi_get_own_property_descriptor(env, func, "name", &ctorName);
270             std::string name = GetPrintString(env, ctorName);
271             if (name.size() > 0) {
272                 return name;
273             }
274         }
275         napi_value result = nullptr;
276         napi_get_prototype(env, object, &result);
277         object = result;
278     }
279     return "";
280 }
281 
CreateObject(napi_env env)282 napi_value NapiHelper::CreateObject(napi_env env)
283 {
284     napi_value obj = nullptr;
285     napi_create_object(env, &obj);
286     return obj;
287 }
288 
CreatePromise(napi_env env,napi_deferred * deferred)289 napi_value NapiHelper::CreatePromise(napi_env env, napi_deferred* deferred)
290 {
291     napi_value promise = nullptr;
292     napi_create_promise(env, deferred, &promise);
293     return promise;
294 }
295 
CreateEmptyString(napi_env env)296 napi_value NapiHelper::CreateEmptyString(napi_env env)
297 {
298     napi_value str = nullptr;
299     const char* name = "";
300     napi_create_string_utf8(env, name, 0, &str);
301     return str;
302 }
303 
GetArrayLength(napi_env env,napi_value array)304 uint32_t NapiHelper::GetArrayLength(napi_env env, napi_value array)
305 {
306     uint32_t arrayLength = 0;
307     napi_get_array_length(env, array, &arrayLength);
308     return arrayLength;
309 }
310 
GetUint32Value(napi_env env,napi_value value)311 uint32_t NapiHelper::GetUint32Value(napi_env env, napi_value value)
312 {
313     uint32_t result = 0;
314     napi_get_value_uint32(env, value, &result);
315     return result;
316 }
317 
GetInt32Value(napi_env env,napi_value value)318 int32_t NapiHelper::GetInt32Value(napi_env env, napi_value value)
319 {
320     int32_t result = 0;
321     napi_get_value_int32(env, value, &result);
322     return result;
323 }
324 
IsExceptionPending(napi_env env)325 bool NapiHelper::IsExceptionPending(napi_env env)
326 {
327     bool isExceptionPending = false;
328     napi_is_exception_pending(env, &isExceptionPending);
329     return isExceptionPending;
330 }
331 
GetPrintString(napi_env env,napi_value value)332 std::string NapiHelper::GetPrintString(napi_env env, napi_value value)
333 {
334     std::string str;
335     if (!IsTypeForNapiValue(env, value, napi_string)) {
336         napi_value strValue = nullptr;
337         if (napi_coerce_to_string(env, value, &strValue) != napi_ok) {
338             return str;
339         }
340         value = strValue;
341     }
342     napi_get_print_string(env, value, str);
343     return str;
344 }
345 
CreateUint64(napi_env env,uint64_t value)346 napi_value NapiHelper::CreateUint64(napi_env env, uint64_t value)
347 {
348     napi_value result;
349     napi_create_bigint_uint64(env, value, &result);
350     return result;
351 }
352 
GetUint64Value(napi_env env,napi_value value,bool lossless)353 uint64_t NapiHelper::GetUint64Value(napi_env env, napi_value value, bool lossless)
354 {
355     uint64_t result = 0;
356     napi_get_value_bigint_uint64(env, value, &result, &lossless);
357     return result;
358 }
359 
GetElement(napi_env env,napi_value value,uint32_t index)360 napi_value NapiHelper::GetElement(napi_env env, napi_value value, uint32_t index)
361 {
362     napi_value result;
363     napi_get_element(env, value, index, &result);
364     return result;
365 }
366 } // namespace Commonlibrary::Concurrent::Common::Helper