• 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 "object_helper.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 
IsBitVector(napi_env env,napi_value value)85 bool NapiHelper::IsBitVector(napi_env env, napi_value value)
86 {
87     bool result = false;
88     if (value == nullptr) {
89         return false;
90     }
91     if (napi_is_bitvector(env, value, &result) != napi_ok) {
92         return false;
93     }
94 
95     return result;
96 }
97 
IsNumber(napi_env env,napi_value value)98 bool NapiHelper::IsNumber(napi_env env, napi_value value)
99 {
100     return IsTypeForNapiValue(env, value, napi_number);
101 }
102 
GetCallbackInfoArgc(napi_env env,napi_callback_info cbInfo)103 size_t NapiHelper::GetCallbackInfoArgc(napi_env env, napi_callback_info cbInfo)
104 {
105     size_t argc = 0;
106     napi_get_cb_info(env, cbInfo, &argc, nullptr, nullptr, nullptr);
107     return argc;
108 }
109 
GetNamePropertyInParentPort(napi_env env,napi_ref parentPort,const char * name)110 napi_value NapiHelper::GetNamePropertyInParentPort(napi_env env, napi_ref parentPort, const char* name)
111 {
112     napi_value obj = nullptr;
113     NAPI_CALL(env, napi_get_reference_value(env, parentPort, &obj));
114 
115     napi_value value = nullptr;
116     NAPI_CALL(env, napi_get_named_property(env, obj, name, &value));
117 
118     return value;
119 }
120 
GetUndefinedValue(napi_env env)121 napi_value NapiHelper::GetUndefinedValue(napi_env env)
122 {
123     napi_value result = nullptr;
124     napi_get_undefined(env, &result);
125     return result;
126 }
127 
IsCallable(napi_env env,napi_value value)128 bool NapiHelper::IsCallable(napi_env env, napi_value value)
129 {
130     bool result = false;
131     napi_is_callable(env, value, &result);
132     return result;
133 }
134 
IsCallable(napi_env env,napi_ref value)135 bool NapiHelper::IsCallable(napi_env env, napi_ref value)
136 {
137     napi_value obj = nullptr;
138     napi_get_reference_value(env, value, &obj);
139     if (obj == nullptr) {
140         return false;
141     }
142     return IsCallable(env, obj);
143 }
144 
IsAsyncFunction(napi_env env,napi_value value)145 bool NapiHelper::IsAsyncFunction(napi_env env, napi_value value)
146 {
147     bool res = false;
148     napi_is_async_function(env, value, &res);
149     return res;
150 }
151 
IsConcurrentFunction(napi_env env,napi_value value)152 bool NapiHelper::IsConcurrentFunction(napi_env env, napi_value value)
153 {
154     bool res = false;
155     napi_is_concurrent_function(env, value, &res);
156     return res;
157 }
158 
IsGeneratorFunction(napi_env env,napi_value value)159 bool NapiHelper::IsGeneratorFunction(napi_env env, napi_value value)
160 {
161     bool res = false;
162     napi_is_generator_function(env, value, &res);
163     return res;
164 }
165 
IsStrictEqual(napi_env env,napi_value lhs,napi_value rhs)166 bool NapiHelper::IsStrictEqual(napi_env env, napi_value lhs, napi_value rhs)
167 {
168     bool res = false;
169     napi_strict_equals(env, lhs, rhs, &res);
170     return res;
171 }
172 
IsSendable(napi_env env,napi_value value)173 bool NapiHelper::IsSendable(napi_env env, napi_value value)
174 {
175     bool res = false;
176     napi_is_sendable(env, value, &res);
177     return res;
178 }
179 
SetNamePropertyInGlobal(napi_env env,const char * name,napi_value value)180 void NapiHelper::SetNamePropertyInGlobal(napi_env env, const char* name, napi_value value)
181 {
182     napi_value object = nullptr;
183     napi_get_global(env, &object);
184     napi_set_named_property(env, object, name, value);
185 }
186 
IsObject(napi_env env,napi_value value)187 bool NapiHelper::IsObject(napi_env env, napi_value value)
188 {
189     return IsTypeForNapiValue(env, value, napi_object);
190 }
191 
GetChars(napi_env env,napi_value value)192 char* NapiHelper::GetChars(napi_env env, napi_value value)
193 {
194     size_t bufferSize = 0;
195     size_t strLength = 0;
196     napi_get_value_string_utf8(env, value, nullptr, 0, &bufferSize);
197     if (bufferSize > MAX_CHAR_LENGTH) {
198         bufferSize = MAX_CHAR_LENGTH;
199     }
200     char* buffer = new char[bufferSize + 1] { 0 };
201     napi_get_value_string_utf8(env, value, buffer, bufferSize + 1, &strLength);
202     return buffer;
203 }
204 
GetString(napi_env env,napi_value value)205 std::string NapiHelper::GetString(napi_env env, napi_value value)
206 {
207     std::string str = "";
208     char* buffer = GetChars(env, value);
209     if (buffer == nullptr) {
210         return str;
211     }
212     str = std::string(buffer);
213     CloseHelp::DeletePointer(buffer, true);
214     return str;
215 }
216 
CreateBooleanValue(napi_env env,bool value)217 napi_value NapiHelper::CreateBooleanValue(napi_env env, bool value)
218 {
219     napi_value result = nullptr;
220     napi_get_boolean(env, value, &result);
221     return result;
222 }
223 
GetGlobalObject(napi_env env)224 napi_value NapiHelper::GetGlobalObject(napi_env env)
225 {
226     napi_value object = nullptr;
227     napi_get_global(env, &object);
228     return object;
229 }
230 
CreateReference(napi_env env,napi_value value,uint32_t refcount)231 napi_ref NapiHelper::CreateReference(napi_env env, napi_value value, uint32_t refcount)
232 {
233     napi_ref callback = nullptr;
234     napi_create_reference(env, value, refcount, &callback);
235     return callback;
236 }
237 
CreateUint32(napi_env env,uint32_t value)238 napi_value NapiHelper::CreateUint32(napi_env env, uint32_t value)
239 {
240     napi_value result = nullptr;
241     napi_create_uint32(env, value, &result);
242     return result;
243 }
244 
GetLibUV(napi_env env)245 uv_loop_t* NapiHelper::GetLibUV(napi_env env)
246 {
247     uv_loop_t* loop;
248     napi_get_uv_event_loop(env, &loop);
249     return loop;
250 }
251 
GetReferenceValue(napi_env env,napi_ref ref)252 napi_value NapiHelper::GetReferenceValue(napi_env env, napi_ref ref)
253 {
254     napi_value result = nullptr;
255     napi_get_reference_value(env, ref, &result);
256     return result;
257 }
258 
DeleteReference(napi_env env,napi_ref ref)259 void NapiHelper::DeleteReference(napi_env env, napi_ref ref)
260 {
261     napi_delete_reference(env, ref);
262 }
263 
GetNameProperty(napi_env env,napi_value obj,const char * name)264 napi_value NapiHelper::GetNameProperty(napi_env env, napi_value obj, const char* name)
265 {
266     napi_value result = nullptr;
267     napi_get_named_property(env, obj, name, &result);
268     return result;
269 }
270 
HasNameProperty(napi_env env,napi_value obj,const char * name)271 bool NapiHelper::HasNameProperty(napi_env env, napi_value obj, const char* name)
272 {
273     bool result = false;
274     napi_has_named_property(env, obj, name, &result);
275     return result;
276 }
277 
GetBooleanValue(napi_env env,napi_value value)278 bool NapiHelper::GetBooleanValue(napi_env env, napi_value value)
279 {
280     bool result = false;
281     napi_get_value_bool(env, value, &result);
282     return result;
283 }
284 
StrictEqual(napi_env env,napi_value value,napi_value cmpValue)285 bool NapiHelper::StrictEqual(napi_env env, napi_value value, napi_value cmpValue)
286 {
287     bool isEqual = false;
288     napi_strict_equals(env, value, cmpValue, &isEqual);
289     return isEqual;
290 }
291 
GetConstructorName(napi_env env,napi_value object)292 std::string NapiHelper::GetConstructorName(napi_env env, napi_value object)
293 {
294     while (IsNotUndefined(env, object)) {
295         napi_value func = nullptr;
296         napi_get_own_property_descriptor(env, object, "constructor", &func);
297         bool isInstanceof = false;
298         napi_instanceof(env, object, func, &isInstanceof);
299         if (IsNotUndefined(env, func) && isInstanceof) {
300             napi_value ctorName = nullptr;
301             napi_get_own_property_descriptor(env, func, "name", &ctorName);
302             std::string name = GetPrintString(env, ctorName);
303             if (name.size() > 0) {
304                 return name;
305             }
306         }
307         napi_value result = nullptr;
308         napi_get_prototype(env, object, &result);
309         object = result;
310     }
311     return "";
312 }
313 
CreateObject(napi_env env)314 napi_value NapiHelper::CreateObject(napi_env env)
315 {
316     napi_value obj = nullptr;
317     napi_create_object(env, &obj);
318     return obj;
319 }
320 
CreatePromise(napi_env env,napi_deferred * deferred)321 napi_value NapiHelper::CreatePromise(napi_env env, napi_deferred* deferred)
322 {
323     napi_value promise = nullptr;
324     napi_create_promise(env, deferred, &promise);
325     return promise;
326 }
327 
CreateEmptyString(napi_env env)328 napi_value NapiHelper::CreateEmptyString(napi_env env)
329 {
330     napi_value str = nullptr;
331     const char* name = "";
332     napi_create_string_utf8(env, name, 0, &str);
333     return str;
334 }
335 
GetArrayLength(napi_env env,napi_value array)336 uint32_t NapiHelper::GetArrayLength(napi_env env, napi_value array)
337 {
338     uint32_t arrayLength = 0;
339     napi_get_array_length(env, array, &arrayLength);
340     return arrayLength;
341 }
342 
GetUint32Value(napi_env env,napi_value value)343 uint32_t NapiHelper::GetUint32Value(napi_env env, napi_value value)
344 {
345     uint32_t result = 0;
346     napi_get_value_uint32(env, value, &result);
347     return result;
348 }
349 
GetInt32Value(napi_env env,napi_value value)350 int32_t NapiHelper::GetInt32Value(napi_env env, napi_value value)
351 {
352     int32_t result = 0;
353     napi_get_value_int32(env, value, &result);
354     return result;
355 }
356 
IsExceptionPending(napi_env env)357 bool NapiHelper::IsExceptionPending(napi_env env)
358 {
359     bool isExceptionPending = false;
360     napi_is_exception_pending(env, &isExceptionPending);
361     return isExceptionPending;
362 }
363 
GetPrintString(napi_env env,napi_value value)364 std::string NapiHelper::GetPrintString(napi_env env, napi_value value)
365 {
366     std::string str;
367     if (!IsTypeForNapiValue(env, value, napi_string)) {
368         napi_value strValue = nullptr;
369         if (napi_coerce_to_string(env, value, &strValue) != napi_ok) {
370             return str;
371         }
372         value = strValue;
373     }
374     napi_get_print_string(env, value, str);
375     return str;
376 }
377 
CreateUint64(napi_env env,uint64_t value)378 napi_value NapiHelper::CreateUint64(napi_env env, uint64_t value)
379 {
380     napi_value result;
381     napi_create_bigint_uint64(env, value, &result);
382     return result;
383 }
384 
GetUint64Value(napi_env env,napi_value value,bool lossless)385 uint64_t NapiHelper::GetUint64Value(napi_env env, napi_value value, bool lossless)
386 {
387     uint64_t result = 0;
388     napi_get_value_bigint_uint64(env, value, &result, &lossless);
389     return result;
390 }
391 
GetElement(napi_env env,napi_value value,uint32_t index)392 napi_value NapiHelper::GetElement(napi_env env, napi_value value, uint32_t index)
393 {
394     napi_value result;
395     napi_get_element(env, value, index, &result);
396     return result;
397 }
398 
CreateArrayWithLength(napi_env env,size_t length)399 napi_value NapiHelper::CreateArrayWithLength(napi_env env, size_t length)
400 {
401     napi_value argsArray;
402     napi_create_array_with_length(env, length, &argsArray);
403     return argsArray;
404 }
405 } // namespace Commonlibrary::Concurrent::Common::Helper