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