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