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