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 <cstring> 17#include <vector> 18 19#include "commonlibrary/ets_utils/js_util_module/util/js_base64.h" 20#include "commonlibrary/ets_utils/js_util_module/util/js_textdecoder.h" 21#include "commonlibrary/ets_utils/js_util_module/util/js_textencoder.h" 22#include "commonlibrary/ets_utils/js_util_module/util/js_types.h" 23#include "commonlibrary/ets_utils/js_util_module/util/js_uuid.h" 24#include "commonlibrary/ets_utils/js_util_module/util/js_stringdecoder.h" 25 26#include "securec.h" 27#include "tools/log.h" 28 29#include "napi/native_api.h" 30#include "napi/native_node_api.h" 31#include "native_engine.h" 32#include "jni_helper.h" 33 34extern const char _binary_util_js_js_start[]; 35extern const char _binary_util_js_js_end[]; 36extern const char _binary_util_abc_start[]; 37extern const char _binary_util_abc_end[]; 38static const std::vector<std::string> conventFormat = {"utf-8", "UTF-8", "gbk", "GBK", "GB2312", "gb2312", 39 "GB18030", "gb18030", "ibm866", "iso-8859-2", "iso-8859-3", 40 "iso-8859-4", "iso-8859-5", "iso-8859-6", "iso-8859-7", 41 "iso-8859-8", "iso-8859-8-i", "iso-8859-10", "iso-8859-13", 42 "iso-8859-14", "iso-8859-15", "koi8-r", "koi8-u", "macintosh", 43 "windows-874", "windows-1250", "windows-1251", "windows-1252", 44 "windows-1253", "windows-1254", "windows-1255", "windows-1256", 45 "windows-1257", "windows-1258", "big5", "euc-jp", "iso-2022-jp", 46 "shift_jis", "euc-kr", "x-mac-cyrillic", "utf-16be", 47 "utf-16le", "iso-8859-1"}; 48 49namespace OHOS::Util { 50 using namespace Commonlibrary::Platform; 51 static bool IsValidValue(napi_env env, napi_value value) 52 { 53 napi_value undefinedRef = nullptr; 54 napi_value nullRef = nullptr; 55 napi_get_undefined(env, &undefinedRef); 56 napi_get_null(env, &nullRef); 57 bool isUndefined = false; 58 bool isNull = false; 59 napi_strict_equals(env, value, undefinedRef, &isUndefined); 60 napi_strict_equals(env, value, nullRef, &isNull); 61 return !(isUndefined || isNull); 62 } 63 64 static char* ApplyMemory(const size_t length) 65 { 66 if (length == 0) { 67 return nullptr; 68 } 69 char *type = new (std::nothrow) char[length + 1]; 70 if (type == nullptr) { 71 HILOG_ERROR("type is nullptr"); 72 return nullptr; 73 } 74 if (memset_s(type, length + 1, '\0', length + 1) != EOK) { 75 HILOG_ERROR("type memset_s failed"); 76 delete[] type; 77 return nullptr; 78 } 79 return type; 80 } 81 82 static std::string temp = "cdfijoOs"; 83 static std::string DealWithPrintf(const std::string &format, const std::vector<std::string> &value) 84 { 85 size_t i = 0; 86 size_t j = 0; 87 std::string str; 88 size_t formatSize = format.size(); 89 size_t valueSize = value.size(); 90 while (i < formatSize && j < valueSize) { 91 if (format[i] == '%' && (i + 1 < formatSize && format[i + 1] == '%')) { 92 str += '%'; 93 i += 2; // 2:The array goes back two digits. 94 } else if (format[i] == '%' && (i + 1 < formatSize && (temp.find(format[i + 1])) != std::string::npos)) { 95 if (format[i + 1] == 'c') { 96 j++; 97 } else { 98 str += value[j++]; 99 } 100 i += 2; // 2:The array goes back two digits. 101 } else if (format[i] == '%' && (i + 1 < formatSize && (temp.find(format[i + 1])) == std::string::npos)) { 102 str += '%'; 103 i++; 104 } 105 if (i < formatSize && format[i] != '%') { 106 size_t pos = 0; 107 if ((pos = format.find('%', i)) == std::string::npos) { 108 str += format.substr(i); 109 i = formatSize; 110 break; 111 } else { 112 str += format.substr(i, pos - i); 113 i = pos; 114 } 115 } 116 } 117 while (j < valueSize) { 118 str += " " + value[j++]; 119 } 120 if (i < formatSize) { 121 str += format.substr(i); 122 } 123 return str; 124 } 125 126 static napi_value ThrowError(napi_env env, const char* errMessage) 127 { 128 napi_value utilError = nullptr; 129 napi_value code = nullptr; 130 uint32_t errCode = 401; 131 napi_create_uint32(env, errCode, &code); 132 napi_value name = nullptr; 133 std::string errName = "BusinessError"; 134 napi_value msg = nullptr; 135 napi_create_string_utf8(env, errMessage, NAPI_AUTO_LENGTH, &msg); 136 napi_create_string_utf8(env, errName.c_str(), NAPI_AUTO_LENGTH, &name); 137 napi_create_error(env, nullptr, msg, &utilError); 138 napi_set_named_property(env, utilError, "code", code); 139 napi_set_named_property(env, utilError, "name", name); 140 napi_throw(env, utilError); 141 return nullptr; 142 } 143 144 static napi_value FormatString(napi_env env, std::string &str) 145 { 146 std::string res; 147 size_t strSize = str.size(); 148 for (size_t i = 0; i < strSize; ++i) { 149 if (str[i] == '%' && (i + 1 < strSize && temp.find(str[i + 1]) != std::string::npos)) { 150 if (str[i + 1] == 'o') { 151 res += "o "; 152 } else if (str[i + 1] == 'O') { 153 res += "O "; 154 } else if (str[i + 1] == 'i') { 155 res += "i "; 156 } else if (str[i + 1] == 'j') { 157 res += "j "; 158 } else if (str[i + 1] == 'd') { 159 res += "d "; 160 } else if (str[i + 1] == 's') { 161 res += "s "; 162 } else if (str[i + 1] == 'f') { 163 res += "f "; 164 } else if (str[i + 1] == 'c') { 165 res += "c "; 166 } 167 i++; 168 } else if (str[i] == '%' && (i + 1 < strSize && str[i + 1] == '%')) { 169 i++; 170 } 171 } 172 if (!res.empty()) { 173 res = res.substr(0, res.size() - 1); 174 } 175 napi_value result = nullptr; 176 napi_create_string_utf8(env, res.c_str(), res.size(), &result); 177 return result; 178 } 179 180 static void FreeMemory(napi_value *address) 181 { 182 delete[] address; 183 address = nullptr; 184 } 185 186 static napi_value DealWithFormatString(napi_env env, napi_callback_info info) 187 { 188 size_t argc = 1; 189 napi_value argv = nullptr; 190 napi_get_cb_info(env, info, &argc, 0, nullptr, nullptr); 191 192 napi_get_cb_info(env, info, &argc, &argv, nullptr, nullptr); 193 std::string format = ""; 194 size_t formatsize = 0; 195 if (napi_get_value_string_utf8(env, argv, nullptr, 0, &formatsize) != napi_ok) { 196 HILOG_ERROR("can not get argv size"); 197 return nullptr; 198 } 199 format.reserve(formatsize + 1); 200 format.resize(formatsize); 201 if (napi_get_value_string_utf8(env, argv, format.data(), formatsize + 1, &formatsize) != napi_ok) { 202 HILOG_ERROR("can not get argv value"); 203 return nullptr; 204 } 205 return FormatString(env, format); 206 } 207 208 static std::string PrintfString(const std::string &format, const std::vector<std::string> &value) 209 { 210 return DealWithPrintf(format, value); 211 } 212 213 static napi_value Printf(napi_env env, napi_callback_info info) 214 { 215 napi_value result = nullptr; 216 size_t argc = 0; 217 napi_get_cb_info(env, info, &argc, nullptr, nullptr, nullptr); 218 napi_value *argv = nullptr; 219 if (argc > 0) { 220 argv = new (std::nothrow) napi_value[argc]; 221 if (argv == nullptr) { 222 HILOG_ERROR("Printf:: argv is nullptr"); 223 return nullptr; 224 } 225 napi_get_cb_info(env, info, &argc, argv, nullptr, nullptr); 226 std::string format = ""; 227 size_t formatsize = 0; 228 if (napi_get_value_string_utf8(env, argv[0], nullptr, 0, &formatsize) != napi_ok) { 229 HILOG_ERROR("can not get argv[0] size"); 230 FreeMemory(argv); 231 return nullptr; 232 } 233 format.reserve(formatsize); 234 format.resize(formatsize); 235 if (napi_get_value_string_utf8(env, argv[0], format.data(), formatsize + 1, &formatsize) != napi_ok) { 236 HILOG_ERROR("can not get argv[0] value"); 237 FreeMemory(argv); 238 return nullptr; 239 } 240 std::vector<std::string> value; 241 for (size_t i = 1; i < argc; i++) { 242 std::string valueString = ""; 243 size_t valuesize = 0; 244 if (napi_get_value_string_utf8(env, argv[i], nullptr, 0, &valuesize) != napi_ok) { 245 HILOG_ERROR("can not get argv[i] size"); 246 FreeMemory(argv); 247 return nullptr; 248 } 249 valueString.reserve(valuesize); 250 valueString.resize(valuesize); 251 if (napi_get_value_string_utf8(env, argv[i], valueString.data(), 252 valuesize + 1, &valuesize) != napi_ok) { 253 HILOG_ERROR("can not get argv[i] value"); 254 FreeMemory(argv); 255 return nullptr; 256 } 257 value.push_back(valueString.data()); 258 } 259 std::string printInfo = PrintfString(format.data(), value); 260 napi_create_string_utf8(env, printInfo.c_str(), printInfo.size(), &result); 261 FreeMemory(argv); 262 return result; 263 } 264 napi_value res = nullptr; 265 NAPI_CALL(env, napi_get_undefined(env, &res)); 266 return res; 267 } 268 269 static napi_value GetErrorString(napi_env env, napi_callback_info info) 270 { 271 napi_value thisVar = nullptr; 272 napi_value result = nullptr; 273 std::string errInfo; 274 size_t argc = 1; 275 napi_value argv = nullptr; 276 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, &argv, &thisVar, nullptr)); 277 int32_t err = 0; 278 NAPI_CALL(env, napi_get_value_int32(env, argv, &err)); 279 errInfo = uv_strerror(err); 280 NAPI_CALL(env, napi_create_string_utf8(env, errInfo.c_str(), errInfo.size(), &result)); 281 return result; 282 } 283 284 static napi_value RandomUUID(napi_env env, napi_callback_info info) 285 { 286 napi_value thisVar = nullptr; 287 size_t requireArgc = 1; 288 size_t argc = 1; 289 napi_value args[1] = { 0 }; 290 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr)); 291 NAPI_ASSERT(env, argc >= requireArgc, "Wrong number of arguments"); 292 bool flag = false; 293 napi_get_value_bool(env, args[0], &flag); 294 std::string uuidString = OHOS::Util::GetStringUUID(env, flag); 295 napi_value result = nullptr; 296 size_t tempLen = uuidString.size(); 297 napi_create_string_utf8(env, uuidString.c_str(), tempLen, &result); 298 return result; 299 } 300 301 static napi_value RandomBinaryUUID(napi_env env, napi_callback_info info) 302 { 303 napi_value thisVar = nullptr; 304 size_t requireArgc = 1; 305 size_t argc = 1; 306 napi_value args[1] = { 0 }; 307 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr)); 308 NAPI_ASSERT(env, argc >= requireArgc, "Wrong number of arguments"); 309 bool flag = false; 310 napi_get_value_bool(env, args[0], &flag); 311 napi_value result = OHOS::Util::GetBinaryUUID(env, flag); 312 return result; 313 } 314 315 static napi_value ParseUUID(napi_env env, napi_callback_info info) 316 { 317 napi_value thisVar = nullptr; 318 size_t requireArgc = 1; 319 size_t argc = 1; 320 napi_value args[1] = { nullptr }; 321 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr)); 322 NAPI_ASSERT(env, argc >= requireArgc, "Wrong number of arguments"); 323 napi_valuetype valuetype; 324 NAPI_CALL(env, napi_typeof(env, args[0], &valuetype)); 325 NAPI_ASSERT(env, valuetype == napi_string, "Wrong argument type. String expected."); 326 napi_value result = OHOS::Util::DoParseUUID(env, args[0]); 327 return result; 328 } 329 330 static napi_value GetHash(napi_env env, napi_callback_info info) 331 { 332 napi_value thisVar = nullptr; 333 size_t requireArgc = 1; 334 size_t argc = 1; 335 napi_value args[1] = { nullptr }; 336 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr)); 337 if (argc < requireArgc) { 338 napi_throw_error(env, "-1", "Expected 1 parameter, actually not included in the parameter."); 339 return nullptr; 340 } 341 napi_valuetype valuetype; 342 NAPI_CALL(env, napi_typeof(env, args[0], &valuetype)); 343 if (valuetype != napi_object) { 344 return ThrowError(env, "Parameter error. The type of Parameter must be object."); 345 } 346 NativeEngine *engine = reinterpret_cast<NativeEngine*>(env); 347 int32_t value = engine->GetObjectHash(env, args[0]); 348 napi_value result = nullptr; 349 napi_create_uint32(env, value, &result); 350 return result; 351 } 352 353 static napi_value TextdecoderConstructor(napi_env env, napi_callback_info info) 354 { 355 size_t tempArgc = 0; 356 napi_value thisVar = nullptr; 357 napi_get_cb_info(env, info, &tempArgc, nullptr, &thisVar, nullptr); 358 size_t argc = 0; 359 void *data = nullptr; 360 char *type = nullptr; 361 size_t typeLen = 0; 362 int32_t flags = 0; 363 std::vector<int> paraVec(2, 0); // 2: Specifies the size of the container to be applied for. 364 if (tempArgc == 1) { 365 argc = 1; 366 napi_value argv = nullptr; 367 napi_get_cb_info(env, info, &argc, &argv, nullptr, &data); 368 napi_get_value_string_utf8(env, argv, nullptr, 0, &typeLen); 369 if (typeLen > 0) { 370 type = ApplyMemory(typeLen); 371 } 372 napi_get_value_string_utf8(env, argv, type, typeLen + 1, &typeLen); 373 } else if (tempArgc == 2) { // 2: The number of parameters is 2. 374 argc = 2; // 2: The number of parameters is 2. 375 napi_value argvArr[2] = { 0 }; // 2:The number of parameters is 2 376 napi_get_cb_info(env, info, &argc, argvArr, nullptr, &data); 377 // first para 378 napi_get_value_string_utf8(env, argvArr[0], nullptr, 0, &typeLen); 379 if (typeLen > 0) { 380 type = ApplyMemory(typeLen); 381 } 382 napi_get_value_string_utf8(env, argvArr[0], type, typeLen + 1, &typeLen); 383 napi_get_value_int32(env, argvArr[1], &flags); 384 } 385 std::string enconding = "utf-8"; 386 if (type != nullptr) { 387 enconding = type; 388 } 389 delete []type; 390 type = nullptr; 391 auto objectInfo = new (std::nothrow) TextDecoder(enconding, flags); 392 if (objectInfo == nullptr) { 393 HILOG_ERROR("TextDecoder objectInfo is nullptr"); 394 return nullptr; 395 } 396 NAPI_CALL(env, napi_wrap( 397 env, thisVar, objectInfo, 398 [](napi_env environment, void *data, void *hint) { 399 auto objInfo = reinterpret_cast<TextDecoder*>(data); 400 if (objInfo != nullptr) { 401 delete objInfo; 402 objInfo = nullptr; 403 } 404 }, 405 nullptr, nullptr)); 406 return thisVar; 407 } 408 409 static napi_value DecodeToString(napi_env env, napi_callback_info info) 410 { 411 size_t tempArgc = 2; // 2:The number of parameters is 2 412 napi_value thisVar = nullptr; 413 napi_get_cb_info(env, info, &tempArgc, nullptr, &thisVar, nullptr); 414 size_t argc = 0; 415 void *dataPara = nullptr; 416 napi_typedarray_type type; 417 size_t length = 0; 418 void *data = nullptr; 419 napi_value arraybuffer = nullptr; 420 size_t byteOffset = 0; 421 bool iStream = false; 422 TextDecoder *textDecoder = nullptr; 423 napi_unwrap(env, thisVar, (void**)&textDecoder); 424 if (textDecoder == nullptr) { 425 HILOG_ERROR("DecodeToString::textDecoder is nullptr"); 426 return nullptr; 427 } 428 napi_value valStr = nullptr; 429 if (tempArgc == 1) { 430 argc = 1; 431 napi_value argv = nullptr; 432 napi_get_cb_info(env, info, &argc, &argv, nullptr, &dataPara); 433 napi_get_typedarray_info(env, argv, &type, &length, &data, &arraybuffer, &byteOffset); 434 if (type != napi_uint8_array) { 435 return ThrowError(env, "Parameter error. The type of Parameter must be Uint8Array."); 436 } 437 valStr = textDecoder->DecodeToString(env, argv, iStream); 438 } else if (tempArgc == 2) { // 2: The number of parameters is 2. 439 argc = 2; // 2: The number of parameters is 2. 440 napi_value argvArr[2] = { 0 }; // 2:The number of parameters is 2 441 napi_get_cb_info(env, info, &argc, argvArr, nullptr, &dataPara); 442 napi_get_typedarray_info(env, argvArr[0], &type, &length, &data, &arraybuffer, &byteOffset); 443 if (type != napi_uint8_array) { 444 return ThrowError(env, "Parameter error. The type of first Parameter must be Uint8Array."); 445 } 446 napi_valuetype valueType; 447 napi_typeof(env, argvArr[1], &valueType); 448 if (valueType != napi_undefined && valueType != napi_null) { 449 if (valueType != napi_object) { 450 return ThrowError(env, "Parameter error. The type of second Parameter must be object."); 451 } 452 const char *messageKeyStrStream = "stream"; 453 napi_value resultStream = nullptr; 454 napi_get_named_property(env, argvArr[1], messageKeyStrStream, &resultStream); 455 napi_get_value_bool(env, resultStream, &iStream); 456 } 457 valStr = textDecoder->DecodeToString(env, argvArr[0], iStream); 458 } 459 return valStr; 460 } 461 462 static napi_value TextdecoderDecode(napi_env env, napi_callback_info info) 463 { 464 size_t tempArgc = 2; // 2:The number of parameters is 2 465 napi_value thisVar = nullptr; 466 napi_get_cb_info(env, info, &tempArgc, nullptr, &thisVar, nullptr); 467 size_t argc = 0; 468 void *dataPara = nullptr; 469 napi_typedarray_type type; 470 size_t length = 0; 471 void *data = nullptr; 472 napi_value arraybuffer = nullptr; 473 size_t byteOffset = 0; 474 bool iStream = false; 475 TextDecoder *textDecoder = nullptr; 476 napi_unwrap(env, thisVar, (void**)&textDecoder); 477 if (textDecoder == nullptr) { 478 return nullptr; 479 } 480 napi_value valStr = nullptr; 481 if (tempArgc == 1) { 482 argc = 1; 483 napi_value argv = nullptr; 484 napi_get_cb_info(env, info, &argc, &argv, nullptr, &dataPara); 485 // first para 486 napi_get_typedarray_info(env, argv, &type, &length, &data, &arraybuffer, &byteOffset); 487 if (type != napi_uint8_array) { 488 return ThrowError(env, "Parameter error. The type of Parameter must be Uint8Array."); 489 } 490 valStr = textDecoder->Decode(env, argv, iStream); 491 } else if (tempArgc == 2) { // 2: The number of parameters is 2. 492 argc = 2; // 2: The number of parameters is 2. 493 napi_value argvArr[2] = { 0 }; // 2:The number of parameters is 2 494 napi_get_cb_info(env, info, &argc, argvArr, nullptr, &dataPara); 495 // first para 496 napi_get_typedarray_info(env, argvArr[0], &type, &length, &data, &arraybuffer, &byteOffset); 497 // second para 498 if (type != napi_uint8_array) { 499 return ThrowError(env, "Parameter error. The type of Parameter must be string."); 500 } 501 napi_valuetype valueType1; 502 napi_typeof(env, argvArr[1], &valueType1); 503 if (valueType1 != napi_undefined && valueType1 != napi_null) { 504 if (valueType1 != napi_object) { 505 return ThrowError(env, "Parameter error. The type of Parameter must be object."); 506 } 507 napi_value messageKeyStream = nullptr; 508 const char *messageKeyStrStream = "stream"; 509 510 napi_value resultStream = nullptr; 511 NAPI_CALL(env, napi_create_string_utf8(env, messageKeyStrStream, strlen(messageKeyStrStream), 512 &messageKeyStream)); 513 NAPI_CALL(env, napi_get_property(env, argvArr[1], messageKeyStream, &resultStream)); 514 NAPI_CALL(env, napi_get_value_bool(env, resultStream, &iStream)); 515 } 516 valStr = textDecoder->Decode(env, argvArr[0], iStream); 517 } 518 return valStr; 519 } 520 521 static bool CheckEncodingFormat(const std::string &encoding) 522 { 523 for (const auto& format : conventFormat) { 524 if (format == encoding) { 525 return true; 526 } 527 } 528 return false; 529 } 530 531 // Encoder 532 static napi_value TextEncoderConstructor(napi_env env, napi_callback_info info) 533 { 534 size_t argc = 0; 535 napi_value thisVar = nullptr; 536 napi_value src = nullptr; 537 napi_get_cb_info(env, info, &argc, &src, &thisVar, nullptr); 538 std::string encoding = "utf-8"; 539 std::string orgEncoding = encoding; 540 if (argc == 1) { 541 napi_get_cb_info(env, info, &argc, &src, nullptr, nullptr); 542 napi_valuetype valuetype; 543 napi_typeof(env, src, &valuetype); 544 if (valuetype != napi_undefined && valuetype != napi_null) { 545 if (valuetype != napi_string) { 546 return ThrowError(env, "Parameter error. The type of Parameter must be string."); 547 } 548 size_t bufferSize = 0; 549 if (napi_get_value_string_utf8(env, src, nullptr, 0, &bufferSize) != napi_ok) { 550 HILOG_ERROR("can not get src size"); 551 return nullptr; 552 } 553 std::string buffer(bufferSize, '\0'); 554 if (napi_get_value_string_utf8(env, src, buffer.data(), bufferSize + 1, &bufferSize) != napi_ok) { 555 HILOG_ERROR("can not get src value"); 556 return nullptr; 557 } 558 orgEncoding = buffer; 559 for (char &temp : buffer) { 560 temp = std::tolower(static_cast<unsigned char>(temp)); 561 } 562 NAPI_ASSERT(env, CheckEncodingFormat(buffer), 563 "Wrong encoding format, the current encoding format is not support"); 564 encoding = buffer; 565 } 566 } 567 auto object = new (std::nothrow) TextEncoder(encoding); 568 if (object == nullptr) { 569 HILOG_ERROR("TextEncoder:: object is nullptr"); 570 return nullptr; 571 } 572 object->SetOrgEncoding(orgEncoding); 573 napi_wrap( 574 env, thisVar, object, 575 [](napi_env environment, void *data, void *hint) { 576 auto obj = reinterpret_cast<TextEncoder*>(data); 577 if (obj != nullptr) { 578 delete obj; 579 } 580 }, 581 nullptr, nullptr); 582 return thisVar; 583 } 584 585 static napi_value GetEncoding(napi_env env, napi_callback_info info) 586 { 587 napi_value thisVar = nullptr; 588 NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, nullptr)); 589 590 TextEncoder *object = nullptr; 591 NAPI_CALL(env, napi_unwrap(env, thisVar, (void**)&object)); 592 593 return object->GetEncoding(env); 594 } 595 596 static napi_value Encode(napi_env env, napi_callback_info info) 597 { 598 napi_value thisVar = nullptr; 599 size_t requireArgc = 1; 600 size_t argc = 1; 601 napi_value args = nullptr; 602 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, &args, &thisVar, nullptr)); 603 NAPI_ASSERT(env, argc <= requireArgc, "Wrong number of arguments"); 604 605 napi_value result; 606 if (argc == 1) { 607 napi_valuetype valuetype; 608 NAPI_CALL(env, napi_typeof(env, args, &valuetype)); 609 if (!IsValidValue(env, args)) { 610 napi_get_undefined(env, &result); 611 return result; 612 } 613 NAPI_ASSERT(env, valuetype == napi_string, "Wrong argument type. String expected."); 614 } else { 615 napi_get_undefined(env, &result); 616 return result; 617 } 618 TextEncoder *object = nullptr; 619 NAPI_CALL(env, napi_unwrap(env, thisVar, (void**)&object)); 620 621 result = object->Encode(env, args); 622 623 return result; 624 } 625 626 static napi_value EncodeIntoOne(napi_env env, napi_callback_info info) 627 { 628 napi_value thisVar = nullptr; 629 // EncodeIntoOne is invoked by EncodeIntoArgs, argc can be 0 or 1 630 // if argc is 0, typeof args is undefined. 631 size_t argc = 1; 632 napi_value args = nullptr; 633 napi_get_cb_info(env, info, &argc, &args, &thisVar, nullptr); 634 napi_value result = nullptr; 635 napi_valuetype valuetype; 636 NAPI_CALL(env, napi_typeof(env, args, &valuetype)); 637 638 if (valuetype == napi_null || valuetype == napi_undefined) { 639 napi_get_undefined(env, &result); 640 return result; 641 } 642 if (valuetype != napi_string) { 643 return ThrowError(env, "Parameter error. The type of Parameter must be string."); 644 } 645 646 TextEncoder *object = nullptr; 647 NAPI_CALL(env, napi_unwrap(env, thisVar, (void **)&object)); 648 result = object->Encode(env, args); 649 return result; 650 } 651 652 static napi_value EncodeIntoTwo(napi_env env, napi_callback_info info) 653 { 654 napi_value thisVar = nullptr; 655 size_t requireArgc = 2; // 2:The number of parameters is 2 656 size_t argc = 2; // 2:The number of parameters is 2 657 napi_value args[2] = { nullptr }; // 2:The number of parameters is 2 658 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr)); 659 660 NAPI_ASSERT(env, argc >= requireArgc, "Wrong number of arguments"); 661 662 napi_valuetype valuetype0; 663 NAPI_CALL(env, napi_typeof(env, args[0], &valuetype0)); 664 665 napi_typedarray_type valuetype1; 666 size_t length = 0; 667 void *data = nullptr; 668 napi_value arraybuffer = nullptr; 669 size_t byteOffset = 0; 670 NAPI_CALL(env, napi_get_typedarray_info(env, args[1], &valuetype1, &length, &data, &arraybuffer, &byteOffset)); 671 672 NAPI_ASSERT(env, valuetype0 == napi_string, "Wrong argument type. String expected."); 673 NAPI_ASSERT(env, valuetype1 == napi_uint8_array, "Wrong argument type. napi_uint8_array expected."); 674 675 TextEncoder *object = nullptr; 676 NAPI_CALL(env, napi_unwrap(env, thisVar, (void**)&object)); 677 678 napi_value result = object->EncodeInto(env, args[0], args[1]); 679 680 return result; 681 } 682 683 static napi_value EncodeIntoUint8Array(napi_env env, napi_callback_info info) 684 { 685 napi_value thisVar = nullptr; 686 size_t argc = 2; // 2:The number of parameters is 2 687 napi_value args[2] = { nullptr }; // 2:The number of parameters is 2 688 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr)); 689 napi_valuetype valuetype0; 690 NAPI_CALL(env, napi_typeof(env, args[0], &valuetype0)); 691 napi_typedarray_type valuetype1; 692 size_t length = 0; 693 void *data = nullptr; 694 napi_value arraybuffer = nullptr; 695 size_t byteOffset = 0; 696 napi_get_typedarray_info(env, args[1], &valuetype1, &length, &data, &arraybuffer, &byteOffset); 697 if (valuetype0 != napi_string) { 698 return ThrowError(env, "Parameter error. The type of Parameter must be string."); 699 } 700 if (valuetype1 != napi_uint8_array) { 701 return ThrowError(env, "Parameter error. The type of Parameter must be Uint8Array."); 702 } 703 TextEncoder *object = nullptr; 704 NAPI_CALL(env, napi_unwrap(env, thisVar, (void**)&object)); 705 napi_value result = object->EncodeInto(env, args[0], args[1]); 706 return result; 707 } 708 709 static napi_value EncodeIntoArgs(napi_env env, napi_callback_info info) 710 { 711 size_t argc = 0; 712 napi_get_cb_info(env, info, &argc, nullptr, nullptr, nullptr); 713 if (argc >= 2) { // 2:The number of parameters is 2 714 return EncodeIntoTwo(env, info); 715 } 716 return EncodeIntoOne(env, info); 717 } 718 719 static napi_value Create(napi_env env, napi_callback_info info) 720 { 721 napi_value textEncoderObj = TextEncoderConstructor(env, info); 722 napi_property_descriptor textEncoderDesc[] = { 723 DECLARE_NAPI_GETTER("encoding", GetEncoding), 724 DECLARE_NAPI_FUNCTION("encode", Encode), 725 DECLARE_NAPI_FUNCTION("encodeInto", EncodeIntoArgs), 726 DECLARE_NAPI_FUNCTION("encodeIntoUint8Array", EncodeIntoUint8Array), 727 }; 728 napi_define_properties(env, textEncoderObj, sizeof(textEncoderDesc) / sizeof(textEncoderDesc[0]), 729 textEncoderDesc); 730 return textEncoderObj; 731 } 732 733 static napi_value TextcoderInit(napi_env env, napi_value exports) 734 { 735 const char *textEncoderClassName = "TextEncoder"; 736 napi_value textEncoderClass = nullptr; 737 napi_property_descriptor textEncoderDesc[] = { 738 DECLARE_NAPI_GETTER("encoding", GetEncoding), 739 DECLARE_NAPI_FUNCTION("encode", Encode), 740 DECLARE_NAPI_FUNCTION("encodeInto", EncodeIntoArgs), 741 DECLARE_NAPI_FUNCTION("encodeIntoUint8Array", EncodeIntoUint8Array), 742 DECLARE_NAPI_STATIC_FUNCTION("create", Create), 743 744 }; 745 NAPI_CALL(env, napi_define_class(env, textEncoderClassName, strlen(textEncoderClassName), 746 TextEncoderConstructor, nullptr, 747 sizeof(textEncoderDesc) / sizeof(textEncoderDesc[0]), 748 textEncoderDesc, &textEncoderClass)); 749 750 const char *textDecoderClassName = "TextDecoder"; 751 napi_value textDecoderClass = nullptr; 752 napi_property_descriptor textdecoderDesc[] = { 753 DECLARE_NAPI_FUNCTION("decodeToString", DecodeToString), 754 DECLARE_NAPI_FUNCTION("decode", TextdecoderDecode), 755 DECLARE_NAPI_FUNCTION("decodeWithStream", TextdecoderDecode), 756 }; 757 NAPI_CALL(env, napi_define_class(env, textDecoderClassName, strlen(textDecoderClassName), 758 TextdecoderConstructor, nullptr, 759 sizeof(textdecoderDesc) / sizeof(textdecoderDesc[0]), 760 textdecoderDesc, &textDecoderClass)); 761 napi_property_descriptor desc[] = { 762 DECLARE_NAPI_PROPERTY("TextEncoder", textEncoderClass), 763 DECLARE_NAPI_PROPERTY("TextDecoder", textDecoderClass), 764 }; 765 766 NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc)); 767 768 napi_value global = nullptr; 769 NAPI_CALL(env, napi_get_global(env, &global)); 770 NAPI_CALL(env, napi_set_named_property(env, global, "TextDecoderCreate_", textDecoderClass)); 771 772 return exports; 773 } 774 775 static napi_value Base64Constructor(napi_env env, napi_callback_info info) 776 { 777 napi_value thisVar = nullptr; 778 void *data = nullptr; 779 NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, &data)); 780 auto objectInfo = new Base64(); 781 napi_wrap( 782 env, thisVar, objectInfo, 783 [](napi_env environment, void *data, void *hint) { 784 auto objInfo = reinterpret_cast<Base64*>(data); 785 if (objInfo != nullptr) { 786 delete objInfo; 787 } 788 }, 789 nullptr, nullptr); 790 return thisVar; 791 } 792 793 static napi_value EncodeBase64(napi_env env, napi_callback_info info) 794 { 795 napi_value thisVar = nullptr; 796 size_t requireArgc = 1; 797 size_t argc = 1; 798 napi_value args[1] = { nullptr }; 799 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr)); 800 NAPI_ASSERT(env, argc >= requireArgc, "Wrong number of arguments"); 801 napi_typedarray_type valuetype0; 802 size_t length = 0; 803 void *data = nullptr; 804 napi_value arraybuffer = nullptr; 805 size_t byteOffset = 0; 806 NAPI_CALL(env, napi_get_typedarray_info(env, args[0], &valuetype0, &length, &data, &arraybuffer, &byteOffset)); 807 NAPI_ASSERT(env, valuetype0 == napi_uint8_array, "Wrong argument type. napi_uint8_array expected."); 808 Base64 *object = nullptr; 809 NAPI_CALL(env, napi_unwrap(env, thisVar, (void**)&object)); 810 napi_value result = object->EncodeSync(env, args[0], Type::BASIC); 811 return result; 812 } 813 814 static napi_value EncodeToString(napi_env env, napi_callback_info info) 815 { 816 napi_value thisVar = nullptr; 817 size_t requireArgc = 1; 818 size_t argc = 1; 819 napi_value args[1] = { nullptr }; 820 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr)); 821 NAPI_ASSERT(env, argc >= requireArgc, "Wrong number of arguments"); 822 napi_typedarray_type valuetype0; 823 size_t length = 0; 824 void *data = nullptr; 825 napi_value arraybuffer = nullptr; 826 size_t byteOffset = 0; 827 NAPI_CALL(env, napi_get_typedarray_info(env, args[0], &valuetype0, &length, &data, &arraybuffer, &byteOffset)); 828 NAPI_ASSERT(env, valuetype0 == napi_uint8_array, "Wrong argument type. napi_uint8_array expected."); 829 Base64 *object = nullptr; 830 NAPI_CALL(env, napi_unwrap(env, thisVar, (void**)&object)); 831 napi_value result = object->EncodeToStringSync(env, args[0], Type::BASIC); 832 return result; 833 } 834 835 static napi_value DecodeBase64(napi_env env, napi_callback_info info) 836 { 837 napi_value thisVar = nullptr; 838 size_t requireArgc = 1; 839 size_t argc = 1; 840 napi_value args[1] = { nullptr }; 841 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr)); 842 NAPI_ASSERT(env, argc >= requireArgc, "Wrong number of arguments"); 843 napi_typedarray_type valuetype0; 844 napi_valuetype valuetype1; 845 size_t length = 0; 846 void *data = nullptr; 847 napi_value arraybuffer = nullptr; 848 size_t byteOffset = 0; 849 NAPI_CALL(env, napi_typeof(env, args[0], &valuetype1)); 850 if (valuetype1 != napi_valuetype::napi_string) { 851 NAPI_CALL(env, napi_get_typedarray_info(env, args[0], &valuetype0, &length, 852 &data, &arraybuffer, &byteOffset)); 853 } 854 if ((valuetype1 != napi_valuetype::napi_string) && (valuetype0 != napi_typedarray_type::napi_uint8_array)) { 855 napi_throw_error(env, nullptr, "The parameter type is incorrect"); 856 return nullptr; 857 } 858 Base64 *object = nullptr; 859 NAPI_CALL(env, napi_unwrap(env, thisVar, (void**)&object)); 860 napi_value result = object->DecodeSync(env, args[0], Type::BASIC); 861 return result; 862 } 863 864 static napi_value EncodeAsync(napi_env env, napi_callback_info info) 865 { 866 napi_value thisVar = nullptr; 867 size_t requireArgc = 1; 868 size_t argc = 1; 869 napi_value args[1] = { nullptr }; 870 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr)); 871 NAPI_ASSERT(env, argc >= requireArgc, "Wrong number of arguments"); 872 napi_typedarray_type valuetype0; 873 size_t length = 0; 874 void *data = nullptr; 875 napi_value arraybuffer = nullptr; 876 size_t byteOffset = 0; 877 NAPI_CALL(env, napi_get_typedarray_info(env, args[0], &valuetype0, &length, &data, &arraybuffer, &byteOffset)); 878 NAPI_ASSERT(env, valuetype0 == napi_uint8_array, "Wrong argument type. napi_uint8_array expected."); 879 Base64 *object = nullptr; 880 NAPI_CALL(env, napi_unwrap(env, thisVar, (void**)&object)); 881 napi_value result = object->Encode(env, args[0], Type::BASIC); 882 return result; 883 } 884 885 static napi_value EncodeToStringAsync(napi_env env, napi_callback_info info) 886 { 887 napi_value thisVar = nullptr; 888 size_t requireArgc = 1; 889 size_t argc = 1; 890 napi_value args[1] = { nullptr }; 891 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr)); 892 NAPI_ASSERT(env, argc >= requireArgc, "Wrong number of arguments"); 893 napi_typedarray_type valuetype0; 894 size_t length = 0; 895 void *data = nullptr; 896 napi_value arraybuffer = nullptr; 897 size_t byteOffset = 0; 898 NAPI_CALL(env, napi_get_typedarray_info(env, args[0], &valuetype0, &length, &data, &arraybuffer, &byteOffset)); 899 NAPI_ASSERT(env, valuetype0 == napi_uint8_array, "Wrong argument type. napi_uint8_array expected."); 900 Base64 *object = nullptr; 901 NAPI_CALL(env, napi_unwrap(env, thisVar, (void**)&object)); 902 napi_value result = object->EncodeToString(env, args[0], Type::BASIC); 903 return result; 904 } 905 static napi_value DecodeAsync(napi_env env, napi_callback_info info) 906 { 907 napi_value thisVar = nullptr; 908 size_t requireArgc = 1; 909 size_t argc = 1; 910 napi_value args[1] = { nullptr }; 911 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr)); 912 NAPI_ASSERT(env, argc >= requireArgc, "Wrong number of arguments"); 913 napi_typedarray_type valuetype0; 914 napi_valuetype valuetype1; 915 size_t length = 0; 916 void *data = nullptr; 917 napi_value arraybuffer = nullptr; 918 size_t byteOffset = 0; 919 NAPI_CALL(env, napi_typeof(env, args[0], &valuetype1)); 920 if (valuetype1 != napi_valuetype::napi_string) { 921 NAPI_CALL(env, napi_get_typedarray_info(env, args[0], &valuetype0, 922 &length, &data, &arraybuffer, &byteOffset)); 923 } 924 if ((valuetype1 != napi_valuetype::napi_string) && (valuetype0 != napi_typedarray_type::napi_uint8_array)) { 925 napi_throw_error(env, nullptr, "The parameter type is incorrect"); 926 return nullptr; 927 } 928 Base64 *object = nullptr; 929 NAPI_CALL(env, napi_unwrap(env, thisVar, (void**)&object)); 930 napi_value result = object->Decode(env, args[0], Type::BASIC); 931 return result; 932 } 933 934 static napi_value EncodeToStringHelper(napi_env env, napi_callback_info info) 935 { 936 size_t argc = 2; // 2:The number of parameters is 2 937 napi_value args[2] = { nullptr }; 938 napi_value thisVar = nullptr; 939 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr)); 940 int32_t encode = 0; 941 NAPI_CALL(env, napi_get_value_int32(env, args[1], &encode)); 942 Type typeValue = static_cast<Type>(encode); 943 if (typeValue < Type::TYPED_FIRST || typeValue > Type::TYPED_LAST) { 944 return ThrowError(env, 945 "Parameter error. The target encoding type option must be one of the Type enumerations."); 946 } 947 Base64 *object = nullptr; 948 NAPI_CALL(env, napi_unwrap(env, thisVar, (void**)&object)); 949 return object->EncodeToStringSync(env, args[0], typeValue); 950 } 951 952 static napi_value EncodeBase64Helper(napi_env env, napi_callback_info info) 953 { 954 size_t argc = 2; // 2:The number of parameters is 2 955 napi_value args[2] = { nullptr }; 956 napi_value thisVar = nullptr; 957 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr)); 958 int32_t encode = 0; 959 NAPI_CALL(env, napi_get_value_int32(env, args[1], &encode)); 960 Type typeValue = static_cast<Type>(encode); 961 if (typeValue != Type::BASIC && typeValue != Type::BASIC_URL_SAFE) { 962 return ThrowError(env, "Parameter error. The target encoding type option must be BASIC or BASIC_URL_SAFE."); 963 } 964 Base64 *object = nullptr; 965 NAPI_CALL(env, napi_unwrap(env, thisVar, (void**)&object)); 966 return object->EncodeSync(env, args[0], typeValue); 967 } 968 969 static napi_value EncodeAsyncHelper(napi_env env, napi_callback_info info) 970 { 971 size_t argc = 2; // 2:The number of parameters is 2 972 napi_value args[2] = { nullptr }; 973 napi_value thisVar = nullptr; 974 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr)); 975 int32_t encode = 0; 976 NAPI_CALL(env, napi_get_value_int32(env, args[1], &encode)); 977 Type typeValue = static_cast<Type>(encode); 978 Base64 *object = nullptr; 979 NAPI_CALL(env, napi_unwrap(env, thisVar, (void**)&object)); 980 return object->Encode(env, args[0], typeValue); 981 } 982 983 static napi_value EncodeToStringAsyncHelper(napi_env env, napi_callback_info info) 984 { 985 size_t argc = 2; // 2:The number of parameters is 2 986 napi_value args[2] = { nullptr }; 987 napi_value thisVar = nullptr; 988 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr)); 989 int32_t encode = 0; 990 NAPI_CALL(env, napi_get_value_int32(env, args[1], &encode)); 991 Type typeValue = static_cast<Type>(encode); 992 Base64 *object = nullptr; 993 NAPI_CALL(env, napi_unwrap(env, thisVar, (void**)&object)); 994 napi_value result = object->EncodeToString(env, args[0], typeValue); 995 return result; 996 } 997 998 static napi_value DecodeBase64Helper(napi_env env, napi_callback_info info) 999 { 1000 size_t argc = 2; // 2:The number of parameters is 2 1001 napi_value args[2] = { nullptr }; 1002 napi_value thisVar = nullptr; 1003 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr)); 1004 int32_t encode = 0; 1005 NAPI_CALL(env, napi_get_value_int32(env, args[1], &encode)); 1006 Type typeValue = static_cast<Type>(encode); 1007 if (typeValue < Type::TYPED_FIRST || typeValue > Type::TYPED_LAST) { 1008 return ThrowError(env, 1009 "Parameter error. The target encoding type option must be one of the Type enumerations."); 1010 } 1011 Base64 *object = nullptr; 1012 NAPI_CALL(env, napi_unwrap(env, thisVar, (void**)&object)); 1013 return object->DecodeSync(env, args[0], typeValue); 1014 } 1015 1016 static napi_value DecodeAsyncHelper(napi_env env, napi_callback_info info) 1017 { 1018 size_t argc = 2; // 2:The number of parameters is 2 1019 napi_value args[2] = { nullptr }; 1020 napi_value thisVar = nullptr; 1021 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, args, &thisVar, nullptr)); 1022 int32_t encode = 0; 1023 NAPI_CALL(env, napi_get_value_int32(env, args[1], &encode)); 1024 Type typeValue = static_cast<Type>(encode); 1025 Base64 *object = nullptr; 1026 NAPI_CALL(env, napi_unwrap(env, thisVar, (void**)&object)); 1027 return object->Decode(env, args[0], typeValue); 1028 } 1029 1030 // Types 1031 static napi_value TypesConstructor(napi_env env, napi_callback_info info) 1032 { 1033 napi_value thisVar = nullptr; 1034 void* data = nullptr; 1035 NAPI_CALL(env, napi_get_cb_info(env, info, nullptr, nullptr, &thisVar, &data)); 1036 auto objectInfo = new Types(); 1037 napi_wrap( 1038 env, thisVar, objectInfo, 1039 [](napi_env environment, void* data, void* hint) { 1040 auto objectInformation = reinterpret_cast<Types*>(data); 1041 if (objectInformation != nullptr) { 1042 delete objectInformation; 1043 } 1044 }, 1045 nullptr, nullptr); 1046 return thisVar; 1047 } 1048 1049 static napi_value IsAnyArrayBuffer(napi_env env, napi_callback_info info) 1050 { 1051 napi_value thisVar = nullptr; 1052 size_t argc = 1; 1053 napi_value args = nullptr; 1054 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, &args, &thisVar, nullptr)); 1055 Types* object = nullptr; 1056 NAPI_CALL(env, napi_unwrap(env, thisVar, (void**)&object)); 1057 napi_value rst = object->IsAnyArrayBuffer(env, args); 1058 return rst; 1059 } 1060 1061 static napi_value IsArrayBufferView(napi_env env, napi_callback_info info) 1062 { 1063 napi_value thisVar = nullptr; 1064 size_t argc = 1; 1065 napi_value args = nullptr; 1066 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, &args, &thisVar, nullptr)); 1067 Types* object = nullptr; 1068 NAPI_CALL(env, napi_unwrap(env, thisVar, (void**)&object)); 1069 napi_value rst = object->IsArrayBufferView(env, args); 1070 return rst; 1071 } 1072 1073 static napi_value IsArgumentsObject(napi_env env, napi_callback_info info) 1074 { 1075 napi_value thisVar = nullptr; 1076 size_t argc = 1; 1077 napi_value args = nullptr; 1078 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, &args, &thisVar, nullptr)); 1079 Types* object = nullptr; 1080 NAPI_CALL(env, napi_unwrap(env, thisVar, (void**)&object)); 1081 napi_value rst = object->IsArgumentsObject(env, args); 1082 return rst; 1083 } 1084 1085 static napi_value IsArrayBuffer(napi_env env, napi_callback_info info) 1086 { 1087 napi_value thisVar = nullptr; 1088 size_t argc = 1; 1089 napi_value args = nullptr; 1090 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, &args, &thisVar, nullptr)); 1091 Types* object = nullptr; 1092 NAPI_CALL(env, napi_unwrap(env, thisVar, (void**)&object)); 1093 napi_value rst = object->IsArrayBuffer(env, args); 1094 return rst; 1095 } 1096 1097 static napi_value IsAsyncFunction(napi_env env, napi_callback_info info) 1098 { 1099 napi_value thisVar = nullptr; 1100 size_t argc = 1; 1101 napi_value args = nullptr; 1102 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, &args, &thisVar, nullptr)); 1103 Types* object = nullptr; 1104 NAPI_CALL(env, napi_unwrap(env, thisVar, (void**)&object)); 1105 napi_value rst = object->IsAsyncFunction(env, args); 1106 return rst; 1107 } 1108 1109 static napi_value IsBigInt64Array(napi_env env, napi_callback_info info) 1110 { 1111 napi_value thisVar = nullptr; 1112 size_t argc = 1; 1113 napi_value args = nullptr; 1114 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, &args, &thisVar, nullptr)); 1115 Types* object = nullptr; 1116 NAPI_CALL(env, napi_unwrap(env, thisVar, (void**)&object)); 1117 napi_value rst = object->IsBigInt64Array(env, args); 1118 return rst; 1119 } 1120 1121 static napi_value IsBigUint64Array(napi_env env, napi_callback_info info) 1122 { 1123 napi_value thisVar = nullptr; 1124 size_t argc = 1; 1125 napi_value args = nullptr; 1126 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, &args, &thisVar, nullptr)); 1127 Types* object = nullptr; 1128 NAPI_CALL(env, napi_unwrap(env, thisVar, (void**)&object)); 1129 napi_value rst = object->IsBigUint64Array(env, args); 1130 return rst; 1131 } 1132 1133 static napi_value IsBooleanObject(napi_env env, napi_callback_info info) 1134 { 1135 napi_value thisVar = nullptr; 1136 size_t argc = 1; 1137 napi_value args = nullptr; 1138 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, &args, &thisVar, nullptr)); 1139 Types* object = nullptr; 1140 NAPI_CALL(env, napi_unwrap(env, thisVar, (void**)&object)); 1141 napi_value rst = object->IsBooleanObject(env, args); 1142 return rst; 1143 } 1144 1145 static napi_value IsBoxedPrimitive(napi_env env, napi_callback_info info) 1146 { 1147 napi_value thisVar = nullptr; 1148 size_t argc = 1; 1149 napi_value args = nullptr; 1150 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, &args, &thisVar, nullptr)); 1151 Types* object = nullptr; 1152 NAPI_CALL(env, napi_unwrap(env, thisVar, (void**)&object)); 1153 napi_value rst = object->IsBoxedPrimitive(env, args); 1154 return rst; 1155 } 1156 1157 static napi_value IsDataView(napi_env env, napi_callback_info info) 1158 { 1159 napi_value thisVar = nullptr; 1160 size_t argc = 1; 1161 napi_value args = nullptr; 1162 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, &args, &thisVar, nullptr)); 1163 Types* object = nullptr; 1164 NAPI_CALL(env, napi_unwrap(env, thisVar, (void**)&object)); 1165 napi_value rst = object->IsDataView(env, args); 1166 return rst; 1167 } 1168 1169 static napi_value IsDate(napi_env env, napi_callback_info info) 1170 { 1171 napi_value thisVar = nullptr; 1172 size_t argc = 1; 1173 napi_value args = nullptr; 1174 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, &args, &thisVar, nullptr)); 1175 Types* object = nullptr; 1176 NAPI_CALL(env, napi_unwrap(env, thisVar, (void**)&object)); 1177 napi_value rst = object->IsDate(env, args); 1178 return rst; 1179 } 1180 1181 static napi_value IsExternal(napi_env env, napi_callback_info info) 1182 { 1183 napi_value thisVar = nullptr; 1184 size_t argc = 1; 1185 napi_value args = nullptr; 1186 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, &args, &thisVar, nullptr)); 1187 Types* object = nullptr; 1188 NAPI_CALL(env, napi_unwrap(env, thisVar, (void**)&object)); 1189 napi_value rst = object->IsExternal(env, args); 1190 return rst; 1191 } 1192 1193 static napi_value IsFloat32Array(napi_env env, napi_callback_info info) 1194 { 1195 napi_value thisVar = nullptr; 1196 size_t argc = 1; 1197 napi_value args = nullptr; 1198 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, &args, &thisVar, nullptr)); 1199 Types* object = nullptr; 1200 NAPI_CALL(env, napi_unwrap(env, thisVar, (void**)&object)); 1201 napi_value rst = object->IsFloat32Array(env, args); 1202 return rst; 1203 } 1204 1205 static napi_value IsFloat64Array(napi_env env, napi_callback_info info) 1206 { 1207 napi_value thisVar = nullptr; 1208 size_t argc = 1; 1209 napi_value args = nullptr; 1210 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, &args, &thisVar, nullptr)); 1211 Types* object = nullptr; 1212 NAPI_CALL(env, napi_unwrap(env, thisVar, (void**)&object)); 1213 napi_value rst = object->IsFloat64Array(env, args); 1214 return rst; 1215 } 1216 1217 static napi_value IsGeneratorFunction(napi_env env, napi_callback_info info) 1218 { 1219 napi_value thisVar = nullptr; 1220 size_t argc = 1; 1221 napi_value args = nullptr; 1222 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, &args, &thisVar, nullptr)); 1223 Types* object = nullptr; 1224 NAPI_CALL(env, napi_unwrap(env, thisVar, (void**)&object)); 1225 napi_value rst = object->IsGeneratorFunction(env, args); 1226 return rst; 1227 } 1228 1229 static napi_value IsGeneratorObject(napi_env env, napi_callback_info info) 1230 { 1231 napi_value thisVar = nullptr; 1232 size_t requireArgc = 1; 1233 size_t argc = 1; 1234 napi_value args = nullptr; 1235 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, &args, &thisVar, nullptr)); 1236 NAPI_ASSERT(env, argc >= requireArgc, "Wrong number of arguments"); 1237 Types* object = nullptr; 1238 NAPI_CALL(env, napi_unwrap(env, thisVar, (void**)&object)); 1239 napi_value result = object->IsGeneratorObject(env, args); 1240 return result; 1241 } 1242 1243 static napi_value IsInt8Array(napi_env env, napi_callback_info info) 1244 { 1245 napi_value thisVar = nullptr; 1246 size_t requireArgc = 1; 1247 size_t argc = 1; 1248 napi_value args = nullptr; 1249 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, &args, &thisVar, nullptr)); 1250 NAPI_ASSERT(env, argc >= requireArgc, "Wrong number of arguments"); 1251 Types* object = nullptr; 1252 NAPI_CALL(env, napi_unwrap(env, thisVar, (void**)&object)); 1253 napi_value result = object->IsInt8Array(env, args); 1254 return result; 1255 } 1256 1257 static napi_value IsInt16Array(napi_env env, napi_callback_info info) 1258 { 1259 napi_value thisVar = nullptr; 1260 size_t requireArgc = 1; 1261 size_t argc = 1; 1262 napi_value args = nullptr; 1263 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, &args, &thisVar, nullptr)); 1264 NAPI_ASSERT(env, argc >= requireArgc, "Wrong number of arguments"); 1265 Types* object = nullptr; 1266 NAPI_CALL(env, napi_unwrap(env, thisVar, (void**)&object)); 1267 napi_value result = object->IsInt16Array(env, args); 1268 return result; 1269 } 1270 1271 static napi_value IsInt32Array(napi_env env, napi_callback_info info) 1272 { 1273 napi_value thisVar = nullptr; 1274 size_t requireArgc = 1; 1275 size_t argc = 1; 1276 napi_value args = nullptr; 1277 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, &args, &thisVar, nullptr)); 1278 NAPI_ASSERT(env, argc >= requireArgc, "Wrong number of arguments"); 1279 Types* object = nullptr; 1280 NAPI_CALL(env, napi_unwrap(env, thisVar, (void**)&object)); 1281 napi_value result = object->IsInt32Array(env, args); 1282 return result; 1283 } 1284 1285 static napi_value IsMap(napi_env env, napi_callback_info info) 1286 { 1287 napi_value thisVar = nullptr; 1288 size_t requireArgc = 1; 1289 size_t argc = 1; 1290 napi_value args = nullptr; 1291 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, &args, &thisVar, nullptr)); 1292 NAPI_ASSERT(env, argc >= requireArgc, "Wrong number of arguments"); 1293 Types* object = nullptr; 1294 NAPI_CALL(env, napi_unwrap(env, thisVar, (void**)&object)); 1295 napi_value result = object->IsMap(env, args); 1296 return result; 1297 } 1298 1299 static napi_value IsMapIterator(napi_env env, napi_callback_info info) 1300 { 1301 napi_value thisVar = nullptr; 1302 size_t requireArgc = 1; 1303 size_t argc = 1; 1304 napi_value args = nullptr; 1305 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, &args, &thisVar, nullptr)); 1306 NAPI_ASSERT(env, argc >= requireArgc, "Wrong number of arguments"); 1307 Types* object = nullptr; 1308 NAPI_CALL(env, napi_unwrap(env, thisVar, (void**)&object)); 1309 napi_value result = object->IsMapIterator(env, args); 1310 return result; 1311 } 1312 1313 static napi_value IsModuleNamespaceObject(napi_env env, napi_callback_info info) 1314 { 1315 napi_value thisVar = nullptr; 1316 size_t requireArgc = 1; 1317 size_t argc = 1; 1318 napi_value args = nullptr; 1319 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, &args, &thisVar, nullptr)); 1320 NAPI_ASSERT(env, argc >= requireArgc, "Wrong number of arguments"); 1321 Types* object = nullptr; 1322 NAPI_CALL(env, napi_unwrap(env, thisVar, (void**)&object)); 1323 napi_value result = object->IsModuleNamespaceObject(env, args); 1324 return result; 1325 } 1326 1327 static napi_value IsNativeError(napi_env env, napi_callback_info info) 1328 { 1329 napi_value thisVar = nullptr; 1330 size_t requireArgc = 1; 1331 size_t argc = 1; 1332 napi_value args = nullptr; 1333 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, &args, &thisVar, nullptr)); 1334 NAPI_ASSERT(env, argc >= requireArgc, "Wrong number of arguments"); 1335 Types* object = nullptr; 1336 NAPI_CALL(env, napi_unwrap(env, thisVar, (void**)&object)); 1337 napi_value result = object->IsNativeError(env, args); 1338 return result; 1339 } 1340 1341 static napi_value IsNumberObject(napi_env env, napi_callback_info info) 1342 { 1343 napi_value thisVar = nullptr; 1344 size_t requireArgc = 1; 1345 size_t argc = 1; 1346 napi_value args = nullptr; 1347 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, &args, &thisVar, nullptr)); 1348 NAPI_ASSERT(env, argc >= requireArgc, "Wrong number of arguments"); 1349 Types* object = nullptr; 1350 NAPI_CALL(env, napi_unwrap(env, thisVar, (void**)&object)); 1351 napi_value result = object->IsNumberObject(env, args); 1352 return result; 1353 } 1354 1355 static napi_value IsPromise(napi_env env, napi_callback_info info) 1356 { 1357 napi_value thisVar = nullptr; 1358 size_t requireArgc = 1; 1359 size_t argc = 1; 1360 napi_value args = nullptr; 1361 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, &args, &thisVar, nullptr)); 1362 NAPI_ASSERT(env, argc >= requireArgc, "Wrong number of arguments"); 1363 Types* object = nullptr; 1364 NAPI_CALL(env, napi_unwrap(env, thisVar, (void**)&object)); 1365 napi_value result = object->IsPromise(env, args); 1366 return result; 1367 } 1368 1369 static napi_value IsProxy(napi_env env, napi_callback_info info) 1370 { 1371 napi_value thisVar = nullptr; 1372 size_t requireArgc = 1; 1373 size_t argc = 1; 1374 napi_value args = nullptr; 1375 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, &args, &thisVar, nullptr)); 1376 NAPI_ASSERT(env, argc >= requireArgc, "Wrong number of arguments"); 1377 Types* object = nullptr; 1378 NAPI_CALL(env, napi_unwrap(env, thisVar, (void**)&object)); 1379 napi_value result = object->IsProxy(env, args); 1380 return result; 1381 } 1382 1383 static napi_value IsRegExp(napi_env env, napi_callback_info info) 1384 { 1385 napi_value thisVar = nullptr; 1386 size_t requireArgc = 1; 1387 size_t argc = 1; 1388 napi_value args = nullptr; 1389 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, &args, &thisVar, nullptr)); 1390 NAPI_ASSERT(env, argc >= requireArgc, "Wrong number of arguments"); 1391 Types* object = nullptr; 1392 NAPI_CALL(env, napi_unwrap(env, thisVar, (void**)&object)); 1393 napi_value result = object->IsRegExp(env, args); 1394 return result; 1395 } 1396 1397 static napi_value IsSet(napi_env env, napi_callback_info info) 1398 { 1399 napi_value thisVar = nullptr; 1400 size_t requireArgc = 1; 1401 size_t argc = 1; 1402 napi_value args = nullptr; 1403 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, &args, &thisVar, nullptr)); 1404 NAPI_ASSERT(env, argc >= requireArgc, "Wrong number of arguments"); 1405 Types* object = nullptr; 1406 NAPI_CALL(env, napi_unwrap(env, thisVar, (void**)&object)); 1407 napi_value result = object->IsSet(env, args); 1408 return result; 1409 } 1410 1411 static napi_value IsSetIterator(napi_env env, napi_callback_info info) 1412 { 1413 napi_value thisVar = nullptr; 1414 size_t requireArgc = 1; 1415 size_t argc = 1; 1416 napi_value args = nullptr; 1417 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, &args, &thisVar, nullptr)); 1418 NAPI_ASSERT(env, argc >= requireArgc, "Wrong number of arguments"); 1419 Types* object = nullptr; 1420 NAPI_CALL(env, napi_unwrap(env, thisVar, (void**)&object)); 1421 napi_value result = object->IsSetIterator(env, args); 1422 return result; 1423 } 1424 1425 static napi_value IsSharedArrayBuffer(napi_env env, napi_callback_info info) 1426 { 1427 napi_value thisVar = nullptr; 1428 size_t requireArgc = 1; 1429 size_t argc = 1; 1430 napi_value args = nullptr; 1431 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, &args, &thisVar, nullptr)); 1432 NAPI_ASSERT(env, argc >= requireArgc, "Wrong number of arguments"); 1433 Types* object = nullptr; 1434 NAPI_CALL(env, napi_unwrap(env, thisVar, (void**)&object)); 1435 napi_value result = object->IsSharedArrayBuffer(env, args); 1436 return result; 1437 } 1438 1439 static napi_value IsStringObject(napi_env env, napi_callback_info info) 1440 { 1441 napi_value thisVar = nullptr; 1442 size_t requireArgc = 1; 1443 size_t argc = 1; 1444 napi_value args = nullptr; 1445 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, &args, &thisVar, nullptr)); 1446 NAPI_ASSERT(env, argc >= requireArgc, "Wrong number of arguments"); 1447 Types* object = nullptr; 1448 NAPI_CALL(env, napi_unwrap(env, thisVar, (void**)&object)); 1449 napi_value result = object->IsStringObject(env, args); 1450 return result; 1451 } 1452 1453 static napi_value IsSymbolObject(napi_env env, napi_callback_info info) 1454 { 1455 napi_value thisVar = nullptr; 1456 size_t requireArgc = 1; 1457 size_t argc = 1; 1458 napi_value args = nullptr; 1459 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, &args, &thisVar, nullptr)); 1460 NAPI_ASSERT(env, argc >= requireArgc, "Wrong number of arguments"); 1461 Types* object = nullptr; 1462 NAPI_CALL(env, napi_unwrap(env, thisVar, (void**)&object)); 1463 napi_value result = object->IsSymbolObject(env, args); 1464 return result; 1465 } 1466 1467 static napi_value IsTypedArray(napi_env env, napi_callback_info info) 1468 { 1469 napi_value thisVar = nullptr; 1470 size_t requireArgc = 1; 1471 size_t argc = 1; 1472 napi_value args = nullptr; 1473 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, &args, &thisVar, nullptr)); 1474 NAPI_ASSERT(env, argc >= requireArgc, "Wrong number of arguments"); 1475 Types* object = nullptr; 1476 NAPI_CALL(env, napi_unwrap(env, thisVar, (void**)&object)); 1477 napi_value result = object->IsTypedArray(env, args); 1478 return result; 1479 } 1480 1481 static napi_value IsUint8Array(napi_env env, napi_callback_info info) 1482 { 1483 napi_value thisVar = nullptr; 1484 size_t requireArgc = 1; 1485 size_t argc = 1; 1486 napi_value args = nullptr; 1487 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, &args, &thisVar, nullptr)); 1488 NAPI_ASSERT(env, argc >= requireArgc, "Wrong number of arguments"); 1489 Types* object = nullptr; 1490 NAPI_CALL(env, napi_unwrap(env, thisVar, (void**)&object)); 1491 napi_value result = object->IsUint8Array(env, args); 1492 return result; 1493 } 1494 1495 static napi_value IsUint8ClampedArray(napi_env env, napi_callback_info info) 1496 { 1497 napi_value thisVar = nullptr; 1498 size_t requireArgc = 1; 1499 size_t argc = 1; 1500 napi_value args = nullptr; 1501 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, &args, &thisVar, nullptr)); 1502 NAPI_ASSERT(env, argc >= requireArgc, "Wrong number of arguments"); 1503 Types* object = nullptr; 1504 NAPI_CALL(env, napi_unwrap(env, thisVar, (void**)&object)); 1505 napi_value result = object->IsUint8ClampedArray(env, args); 1506 return result; 1507 } 1508 1509 static napi_value IsUint16Array(napi_env env, napi_callback_info info) 1510 { 1511 napi_value thisVar = nullptr; 1512 size_t requireArgc = 1; 1513 size_t argc = 1; 1514 napi_value args = nullptr; 1515 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, &args, &thisVar, nullptr)); 1516 NAPI_ASSERT(env, argc >= requireArgc, "Wrong number of arguments"); 1517 Types* object = nullptr; 1518 NAPI_CALL(env, napi_unwrap(env, thisVar, (void**)&object)); 1519 napi_value result = object->IsUint16Array(env, args); 1520 return result; 1521 } 1522 1523 static napi_value IsUint32Array(napi_env env, napi_callback_info info) 1524 { 1525 napi_value thisVar = nullptr; 1526 size_t requireArgc = 1; 1527 size_t argc = 1; 1528 napi_value args = nullptr; 1529 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, &args, &thisVar, nullptr)); 1530 NAPI_ASSERT(env, argc >= requireArgc, "Wrong number of arguments"); 1531 Types* object = nullptr; 1532 NAPI_CALL(env, napi_unwrap(env, thisVar, (void**)&object)); 1533 napi_value result = object->IsUint32Array(env, args); 1534 return result; 1535 } 1536 1537 static napi_value IsWeakMap(napi_env env, napi_callback_info info) 1538 { 1539 napi_value thisVar = nullptr; 1540 size_t requireArgc = 1; 1541 size_t argc = 1; 1542 napi_value args = nullptr; 1543 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, &args, &thisVar, nullptr)); 1544 NAPI_ASSERT(env, argc >= requireArgc, "Wrong number of arguments"); 1545 Types* object = nullptr; 1546 NAPI_CALL(env, napi_unwrap(env, thisVar, (void**)&object)); 1547 napi_value result = object->IsWeakMap(env, args); 1548 return result; 1549 } 1550 1551 static napi_value IsWeakSet(napi_env env, napi_callback_info info) 1552 { 1553 napi_value thisVar = nullptr; 1554 size_t requireArgc = 1; 1555 size_t argc = 1; 1556 napi_value args = nullptr; 1557 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, &args, &thisVar, nullptr)); 1558 NAPI_ASSERT(env, argc >= requireArgc, "Wrong number of arguments"); 1559 Types* object = nullptr; 1560 NAPI_CALL(env, napi_unwrap(env, thisVar, (void**)&object)); 1561 napi_value result = object->IsWeakSet(env, args); 1562 return result; 1563 } 1564 1565 // StringDecoder 1566 static napi_value StringDecoderConstructor(napi_env env, napi_callback_info info) 1567 { 1568 size_t argc = 1; 1569 napi_value thisVar = nullptr; 1570 napi_value argv = nullptr; 1571 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, &argv, &thisVar, nullptr)); 1572 std::string enconding = "utf-8"; 1573 if (argc == 1) { 1574 napi_valuetype valuetype; 1575 NAPI_CALL(env, napi_typeof(env, argv, &valuetype)); 1576 if (valuetype == napi_string) { 1577 size_t bufferSize = 0; 1578 if (napi_get_value_string_utf8(env, argv, nullptr, 0, &bufferSize) != napi_ok) { 1579 HILOG_ERROR("can not get argv size"); 1580 return nullptr; 1581 } 1582 std::string buffer = ""; 1583 buffer.reserve(bufferSize); 1584 buffer.resize(bufferSize); 1585 if (napi_get_value_string_utf8(env, argv, buffer.data(), bufferSize + 1, &bufferSize) != napi_ok) { 1586 HILOG_ERROR("can not get argv value"); 1587 return nullptr; 1588 } 1589 if (!CheckEncodingFormat(buffer)) { 1590 napi_throw_error(env, "401", 1591 "Parameter error. Wrong encoding format, the current encoding format is not support."); 1592 return nullptr; 1593 } 1594 enconding = buffer; 1595 } 1596 } 1597 auto objectInfo = new StringDecoder(enconding); 1598 napi_wrap( 1599 env, thisVar, objectInfo, 1600 [](napi_env environment, void* data, void* hint) { 1601 auto obj = reinterpret_cast<StringDecoder*>(data); 1602 if (obj != nullptr) { 1603 delete obj; 1604 } 1605 }, 1606 nullptr, nullptr); 1607 return thisVar; 1608 } 1609 1610 static napi_value Write(napi_env env, napi_callback_info info) 1611 { 1612 napi_value thisVar = nullptr; 1613 size_t argc = 1; 1614 napi_value argv = nullptr; 1615 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, &argv, &thisVar, nullptr)); 1616 napi_valuetype valuetype; 1617 NAPI_CALL(env, napi_typeof(env, argv, &valuetype)); 1618 if (valuetype == napi_string) { 1619 return argv; 1620 } 1621 StringDecoder *object = nullptr; 1622 NAPI_CALL(env, napi_unwrap(env, thisVar, (void**)&object)); 1623 return object->Write(env, argv); 1624 } 1625 1626 static napi_value End(napi_env env, napi_callback_info info) 1627 { 1628 napi_value thisVar = nullptr; 1629 size_t argc = 1; 1630 napi_value argv = nullptr; 1631 NAPI_CALL(env, napi_get_cb_info(env, info, &argc, &argv, &thisVar, nullptr)); 1632 StringDecoder *object = nullptr; 1633 NAPI_CALL(env, napi_unwrap(env, thisVar, (void**)&object)); 1634 if (argc == 0) { 1635 return object->End(env); 1636 } 1637 napi_valuetype valuetype; 1638 NAPI_CALL(env, napi_typeof(env, argv, &valuetype)); 1639 if (valuetype == napi_string) { 1640 return argv; 1641 } 1642 if (valuetype == napi_undefined) { 1643 return object->End(env); 1644 } 1645 return object->End(env, argv); 1646 } 1647 1648 static napi_value TypeofInit(napi_env env, napi_value exports) 1649 { 1650 const char* typeofClassName = "Types"; 1651 napi_value typeofClass = nullptr; 1652 napi_property_descriptor typeofDesc[] = { 1653 DECLARE_NAPI_FUNCTION("isBigInt64Array", IsBigInt64Array), 1654 DECLARE_NAPI_FUNCTION("isBigUint64Array", IsBigUint64Array), 1655 DECLARE_NAPI_FUNCTION("isBooleanObject", IsBooleanObject), 1656 DECLARE_NAPI_FUNCTION("isBoxedPrimitive", IsBoxedPrimitive), 1657 DECLARE_NAPI_FUNCTION("isAnyArrayBuffer", IsAnyArrayBuffer), 1658 DECLARE_NAPI_FUNCTION("isArrayBufferView", IsArrayBufferView), 1659 DECLARE_NAPI_FUNCTION("isArgumentsObject", IsArgumentsObject), 1660 DECLARE_NAPI_FUNCTION("isArrayBuffer", IsArrayBuffer), 1661 DECLARE_NAPI_FUNCTION("isDataView", IsDataView), 1662 DECLARE_NAPI_FUNCTION("isDate", IsDate), 1663 DECLARE_NAPI_FUNCTION("isExternal", IsExternal), 1664 DECLARE_NAPI_FUNCTION("isFloat32Array", IsFloat32Array), 1665 DECLARE_NAPI_FUNCTION("isFloat64Array", IsFloat64Array), 1666 DECLARE_NAPI_FUNCTION("isGeneratorFunction", IsGeneratorFunction), 1667 DECLARE_NAPI_FUNCTION("isGeneratorObject", IsGeneratorObject), 1668 DECLARE_NAPI_FUNCTION("isInt8Array", IsInt8Array), 1669 DECLARE_NAPI_FUNCTION("isInt16Array", IsInt16Array), 1670 DECLARE_NAPI_FUNCTION("isInt32Array", IsInt32Array), 1671 DECLARE_NAPI_FUNCTION("isMap", IsMap), 1672 DECLARE_NAPI_FUNCTION("isMapIterator", IsMapIterator), 1673 DECLARE_NAPI_FUNCTION("isModuleNamespaceObject", IsModuleNamespaceObject), 1674 DECLARE_NAPI_FUNCTION("isNativeError", IsNativeError), 1675 DECLARE_NAPI_FUNCTION("isNumberObject", IsNumberObject), 1676 DECLARE_NAPI_FUNCTION("isPromise", IsPromise), 1677 DECLARE_NAPI_FUNCTION("isProxy", IsProxy), 1678 DECLARE_NAPI_FUNCTION("isRegExp", IsRegExp), 1679 DECLARE_NAPI_FUNCTION("isSet", IsSet), 1680 DECLARE_NAPI_FUNCTION("isSetIterator", IsSetIterator), 1681 DECLARE_NAPI_FUNCTION("isSharedArrayBuffer", IsSharedArrayBuffer), 1682 DECLARE_NAPI_FUNCTION("isStringObject", IsStringObject), 1683 DECLARE_NAPI_FUNCTION("isSymbolObject", IsSymbolObject), 1684 DECLARE_NAPI_FUNCTION("isTypedArray", IsTypedArray), 1685 DECLARE_NAPI_FUNCTION("isUint8Array", IsUint8Array), 1686 DECLARE_NAPI_FUNCTION("isUint8ClampedArray", IsUint8ClampedArray), 1687 DECLARE_NAPI_FUNCTION("isUint16Array", IsUint16Array), 1688 DECLARE_NAPI_FUNCTION("isUint32Array", IsUint32Array), 1689 DECLARE_NAPI_FUNCTION("isWeakMap", IsWeakMap), 1690 DECLARE_NAPI_FUNCTION("isWeakSet", IsWeakSet), 1691 DECLARE_NAPI_FUNCTION("isAsyncFunction", IsAsyncFunction), 1692 }; 1693 NAPI_CALL(env, napi_define_class(env, typeofClassName, strlen(typeofClassName), TypesConstructor, 1694 nullptr, sizeof(typeofDesc) / sizeof(typeofDesc[0]), typeofDesc, 1695 &typeofClass)); 1696 napi_property_descriptor desc[] = { DECLARE_NAPI_PROPERTY("Types", typeofClass) }; 1697 NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc)); 1698 return exports; 1699 } 1700 1701 static napi_value Base64Init(napi_env env, napi_value exports) 1702 { 1703 const char *base64ClassName = "Base64"; 1704 napi_value base64Class = nullptr; 1705 napi_property_descriptor base64Desc[] = { 1706 DECLARE_NAPI_FUNCTION("encodeSync", EncodeBase64), 1707 DECLARE_NAPI_FUNCTION("encodeToStringSync", EncodeToString), 1708 DECLARE_NAPI_FUNCTION("decodeSync", DecodeBase64), 1709 DECLARE_NAPI_FUNCTION("encode", EncodeAsync), 1710 DECLARE_NAPI_FUNCTION("encodeToString", EncodeToStringAsync), 1711 DECLARE_NAPI_FUNCTION("decode", DecodeAsync), 1712 }; 1713 NAPI_CALL(env, napi_define_class(env, base64ClassName, strlen(base64ClassName), Base64Constructor, 1714 nullptr, sizeof(base64Desc) / sizeof(base64Desc[0]), base64Desc, 1715 &base64Class)); 1716 napi_property_descriptor desc[] = { 1717 DECLARE_NAPI_PROPERTY("Base64", base64Class) 1718 }; 1719 NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc)); 1720 return exports; 1721 } 1722 1723 static napi_value Base64HelperInit(napi_env env, napi_value exports) 1724 { 1725 const char *base64HelperClassName = "Base64Helper"; 1726 napi_value Base64HelperClass = nullptr; 1727 napi_property_descriptor Base64HelperDesc[] = { 1728 DECLARE_NAPI_FUNCTION("encodeSync", EncodeBase64Helper), 1729 DECLARE_NAPI_FUNCTION("encodeToStringSync", EncodeToStringHelper), 1730 DECLARE_NAPI_FUNCTION("decodeSync", DecodeBase64Helper), 1731 DECLARE_NAPI_FUNCTION("encode", EncodeAsyncHelper), 1732 DECLARE_NAPI_FUNCTION("encodeToString", EncodeToStringAsyncHelper), 1733 DECLARE_NAPI_FUNCTION("decode", DecodeAsyncHelper), 1734 }; 1735 NAPI_CALL(env, napi_define_class(env, base64HelperClassName, strlen(base64HelperClassName), Base64Constructor, 1736 nullptr, sizeof(Base64HelperDesc) / sizeof(Base64HelperDesc[0]), 1737 Base64HelperDesc, &Base64HelperClass)); 1738 napi_property_descriptor desc[] = { 1739 DECLARE_NAPI_PROPERTY("Base64Helper", Base64HelperClass) 1740 }; 1741 NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc)); 1742 return exports; 1743 } 1744 1745 static napi_value StringDecoderInit(napi_env env, napi_value exports) 1746 { 1747 const char *stringDecoderClassName = "StringDecoder"; 1748 napi_value StringDecoderClass = nullptr; 1749 napi_property_descriptor StringDecoderDesc[] = { 1750 DECLARE_NAPI_FUNCTION("write", Write), 1751 DECLARE_NAPI_FUNCTION("end", End), 1752 }; 1753 NAPI_CALL(env, napi_define_class(env, stringDecoderClassName, strlen(stringDecoderClassName), 1754 StringDecoderConstructor, nullptr, 1755 sizeof(StringDecoderDesc) / sizeof(StringDecoderDesc[0]), 1756 StringDecoderDesc, &StringDecoderClass)); 1757 napi_property_descriptor desc[] = { 1758 DECLARE_NAPI_PROPERTY("StringDecoder", StringDecoderClass) 1759 }; 1760 NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc)); 1761 return exports; 1762 } 1763 1764 static napi_value UtilInit(napi_env env, napi_value exports) 1765 { 1766 napi_property_descriptor desc[] = { 1767 DECLARE_NAPI_FUNCTION("printf", Printf), 1768 DECLARE_NAPI_FUNCTION("format", Printf), 1769 DECLARE_NAPI_FUNCTION("geterrorstring", GetErrorString), 1770 DECLARE_NAPI_FUNCTION("errnoToString", GetErrorString), 1771 DECLARE_NAPI_FUNCTION("dealwithformatstring", DealWithFormatString), 1772 DECLARE_NAPI_FUNCTION("randomUUID", RandomUUID), 1773 DECLARE_NAPI_FUNCTION("randomBinaryUUID", RandomBinaryUUID), 1774 DECLARE_NAPI_FUNCTION("parseUUID", ParseUUID), 1775 DECLARE_NAPI_FUNCTION("getHash", GetHash) 1776 }; 1777 NAPI_CALL(env, napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc)); 1778 TextcoderInit(env, exports); 1779 Base64Init(env, exports); 1780 Base64HelperInit(env, exports); 1781 TypeofInit(env, exports); 1782 StringDecoderInit(env, exports); 1783 return exports; 1784 } 1785 1786 // util JS register 1787 extern "C" 1788 __attribute__((visibility("default"))) void NAPI_util_GetJSCode(const char **buf, int *buflen) 1789 { 1790 if (buf != nullptr) { 1791 *buf = _binary_util_js_js_start; 1792 } 1793 if (buflen != nullptr) { 1794 *buflen = _binary_util_js_js_end - _binary_util_js_js_start; 1795 } 1796 } 1797 extern "C" 1798 __attribute__((visibility("default"))) void NAPI_util_GetABCCode(const char** buf, int* buflen) 1799 { 1800 if (buf != nullptr) { 1801 *buf = _binary_util_abc_start; 1802 } 1803 if (buflen != nullptr) { 1804 *buflen = _binary_util_abc_end - _binary_util_abc_start; 1805 } 1806 } 1807 1808 // util module define 1809 static napi_module_with_js utilModule = { 1810 .nm_version = 1, 1811 .nm_flags = 0, 1812 .nm_filename = nullptr, 1813 .nm_register_func = UtilInit, 1814 .nm_modname = "util", 1815 .nm_priv = ((void*)0), 1816 .nm_get_abc_code = NAPI_util_GetABCCode, 1817 .nm_get_js_code = NAPI_util_GetJSCode, 1818 }; 1819 // util module register 1820 extern "C" 1821 __attribute__((constructor)) void UtilRegisterModule() 1822 { 1823 napi_module_with_js_register(&utilModule); 1824 UtilPluginJniRegister(); 1825 } 1826} 1827