koffi 1.0.4 → 1.1.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +51 -22
- package/build/qemu/1.1.0-beta.1/koffi_darwin_x64.tar.gz +0 -0
- package/build/qemu/1.1.0-beta.1/koffi_freebsd_arm64.tar.gz +0 -0
- package/build/qemu/1.1.0-beta.1/koffi_freebsd_ia32.tar.gz +0 -0
- package/build/qemu/1.1.0-beta.1/koffi_freebsd_x64.tar.gz +0 -0
- package/build/qemu/1.1.0-beta.1/koffi_linux_arm.tar.gz +0 -0
- package/build/qemu/1.1.0-beta.1/koffi_linux_arm64.tar.gz +0 -0
- package/build/qemu/1.1.0-beta.1/koffi_linux_ia32.tar.gz +0 -0
- package/build/qemu/1.1.0-beta.1/koffi_linux_x64.tar.gz +0 -0
- package/build/qemu/1.1.0-beta.1/koffi_win32_ia32.tar.gz +0 -0
- package/build/qemu/1.1.0-beta.1/koffi_win32_x64.tar.gz +0 -0
- package/package.json +1 -1
- package/qemu/qemu.js +11 -5
- package/qemu/registry/machines.json +20 -10
- package/src/abi_arm32.cc +13 -6
- package/src/abi_arm64.cc +13 -6
- package/src/abi_x64_sysv.cc +13 -6
- package/src/abi_x64_win.cc +13 -6
- package/src/abi_x86.cc +13 -6
- package/src/call.cc +25 -26
- package/src/call.hh +27 -41
- package/src/ffi.cc +152 -17
- package/src/ffi.hh +24 -10
- package/test/misc.c +2 -2
- package/build/qemu/1.0.4/koffi_darwin_x64.tar.gz +0 -0
- package/build/qemu/1.0.4/koffi_freebsd_arm64.tar.gz +0 -0
- package/build/qemu/1.0.4/koffi_freebsd_ia32.tar.gz +0 -0
- package/build/qemu/1.0.4/koffi_freebsd_x64.tar.gz +0 -0
- package/build/qemu/1.0.4/koffi_linux_arm.tar.gz +0 -0
- package/build/qemu/1.0.4/koffi_linux_arm64.tar.gz +0 -0
- package/build/qemu/1.0.4/koffi_linux_ia32.tar.gz +0 -0
- package/build/qemu/1.0.4/koffi_linux_x64.tar.gz +0 -0
- package/build/qemu/1.0.4/koffi_win32_ia32.tar.gz +0 -0
- package/build/qemu/1.0.4/koffi_win32_x64.tar.gz +0 -0
- package/test/misc.js +0 -227
- package/vendor/node-addon-api/CODE_OF_CONDUCT.md +0 -4
- package/vendor/node-addon-api/CONTRIBUTING.md +0 -93
- package/vendor/node-addon-api/appveyor.yml +0 -37
- package/vendor/node-addon-api/benchmark/README.md +0 -47
- package/vendor/node-addon-api/benchmark/binding.gyp +0 -25
- package/vendor/node-addon-api/benchmark/function_args.cc +0 -217
- package/vendor/node-addon-api/benchmark/function_args.js +0 -60
- package/vendor/node-addon-api/benchmark/index.js +0 -34
- package/vendor/node-addon-api/benchmark/property_descriptor.cc +0 -91
- package/vendor/node-addon-api/benchmark/property_descriptor.js +0 -37
- package/vendor/node-addon-api/doc/addon.md +0 -163
- package/vendor/node-addon-api/doc/array.md +0 -81
- package/vendor/node-addon-api/doc/array_buffer.md +0 -155
- package/vendor/node-addon-api/doc/async_context.md +0 -86
- package/vendor/node-addon-api/doc/async_operations.md +0 -31
- package/vendor/node-addon-api/doc/async_worker.md +0 -427
- package/vendor/node-addon-api/doc/async_worker_variants.md +0 -557
- package/vendor/node-addon-api/doc/bigint.md +0 -97
- package/vendor/node-addon-api/doc/boolean.md +0 -68
- package/vendor/node-addon-api/doc/buffer.md +0 -150
- package/vendor/node-addon-api/doc/callback_scope.md +0 -54
- package/vendor/node-addon-api/doc/callbackinfo.md +0 -97
- package/vendor/node-addon-api/doc/checker-tool.md +0 -32
- package/vendor/node-addon-api/doc/class_property_descriptor.md +0 -123
- package/vendor/node-addon-api/doc/cmake-js.md +0 -68
- package/vendor/node-addon-api/doc/conversion-tool.md +0 -28
- package/vendor/node-addon-api/doc/creating_a_release.md +0 -62
- package/vendor/node-addon-api/doc/dataview.md +0 -248
- package/vendor/node-addon-api/doc/date.md +0 -68
- package/vendor/node-addon-api/doc/env.md +0 -196
- package/vendor/node-addon-api/doc/error.md +0 -120
- package/vendor/node-addon-api/doc/error_handling.md +0 -254
- package/vendor/node-addon-api/doc/escapable_handle_scope.md +0 -80
- package/vendor/node-addon-api/doc/external.md +0 -63
- package/vendor/node-addon-api/doc/function.md +0 -402
- package/vendor/node-addon-api/doc/function_reference.md +0 -238
- package/vendor/node-addon-api/doc/generator.md +0 -13
- package/vendor/node-addon-api/doc/handle_scope.md +0 -63
- package/vendor/node-addon-api/doc/hierarchy.md +0 -91
- package/vendor/node-addon-api/doc/instance_wrap.md +0 -408
- package/vendor/node-addon-api/doc/maybe.md +0 -76
- package/vendor/node-addon-api/doc/memory_management.md +0 -27
- package/vendor/node-addon-api/doc/name.md +0 -29
- package/vendor/node-addon-api/doc/node-gyp.md +0 -82
- package/vendor/node-addon-api/doc/number.md +0 -163
- package/vendor/node-addon-api/doc/object.md +0 -411
- package/vendor/node-addon-api/doc/object_lifetime_management.md +0 -83
- package/vendor/node-addon-api/doc/object_reference.md +0 -117
- package/vendor/node-addon-api/doc/object_wrap.md +0 -588
- package/vendor/node-addon-api/doc/prebuild_tools.md +0 -16
- package/vendor/node-addon-api/doc/promises.md +0 -79
- package/vendor/node-addon-api/doc/property_descriptor.md +0 -286
- package/vendor/node-addon-api/doc/propertylvalue.md +0 -50
- package/vendor/node-addon-api/doc/range_error.md +0 -59
- package/vendor/node-addon-api/doc/reference.md +0 -113
- package/vendor/node-addon-api/doc/setup.md +0 -110
- package/vendor/node-addon-api/doc/string.md +0 -93
- package/vendor/node-addon-api/doc/symbol.md +0 -61
- package/vendor/node-addon-api/doc/threadsafe.md +0 -121
- package/vendor/node-addon-api/doc/threadsafe_function.md +0 -290
- package/vendor/node-addon-api/doc/type_error.md +0 -59
- package/vendor/node-addon-api/doc/typed_array.md +0 -78
- package/vendor/node-addon-api/doc/typed_array_of.md +0 -137
- package/vendor/node-addon-api/doc/typed_threadsafe_function.md +0 -306
- package/vendor/node-addon-api/doc/value.md +0 -340
- package/vendor/node-addon-api/doc/version_management.md +0 -43
- package/vendor/node-addon-api/package.json +0 -415
- package/vendor/node-addon-api/test/README.md +0 -91
- package/vendor/node-addon-api/test/addon.cc +0 -36
- package/vendor/node-addon-api/test/addon.js +0 -11
- package/vendor/node-addon-api/test/addon_build/index.js +0 -49
- package/vendor/node-addon-api/test/addon_build/tpl/addon.cc +0 -17
- package/vendor/node-addon-api/test/addon_build/tpl/binding.gyp +0 -62
- package/vendor/node-addon-api/test/addon_build/tpl/index.js +0 -9
- package/vendor/node-addon-api/test/addon_build/tpl/package.json +0 -11
- package/vendor/node-addon-api/test/addon_data.cc +0 -99
- package/vendor/node-addon-api/test/addon_data.js +0 -46
- package/vendor/node-addon-api/test/array_buffer.cc +0 -243
- package/vendor/node-addon-api/test/array_buffer.js +0 -69
- package/vendor/node-addon-api/test/async_context.cc +0 -36
- package/vendor/node-addon-api/test/async_context.js +0 -122
- package/vendor/node-addon-api/test/async_progress_queue_worker.cc +0 -83
- package/vendor/node-addon-api/test/async_progress_queue_worker.js +0 -46
- package/vendor/node-addon-api/test/async_progress_worker.cc +0 -134
- package/vendor/node-addon-api/test/async_progress_worker.js +0 -61
- package/vendor/node-addon-api/test/async_worker.cc +0 -106
- package/vendor/node-addon-api/test/async_worker.js +0 -179
- package/vendor/node-addon-api/test/async_worker_nocallback.js +0 -13
- package/vendor/node-addon-api/test/async_worker_persistent.cc +0 -63
- package/vendor/node-addon-api/test/async_worker_persistent.js +0 -24
- package/vendor/node-addon-api/test/basic_types/array.cc +0 -40
- package/vendor/node-addon-api/test/basic_types/array.js +0 -35
- package/vendor/node-addon-api/test/basic_types/boolean.cc +0 -38
- package/vendor/node-addon-api/test/basic_types/boolean.js +0 -35
- package/vendor/node-addon-api/test/basic_types/number.cc +0 -99
- package/vendor/node-addon-api/test/basic_types/number.js +0 -114
- package/vendor/node-addon-api/test/basic_types/value.cc +0 -120
- package/vendor/node-addon-api/test/basic_types/value.js +0 -133
- package/vendor/node-addon-api/test/bigint.cc +0 -91
- package/vendor/node-addon-api/test/bigint.js +0 -53
- package/vendor/node-addon-api/test/binding-swallowexcept.cc +0 -12
- package/vendor/node-addon-api/test/binding.cc +0 -173
- package/vendor/node-addon-api/test/binding.gyp +0 -124
- package/vendor/node-addon-api/test/buffer.cc +0 -183
- package/vendor/node-addon-api/test/buffer.js +0 -69
- package/vendor/node-addon-api/test/callbackscope.cc +0 -22
- package/vendor/node-addon-api/test/callbackscope.js +0 -49
- package/vendor/node-addon-api/test/common/index.js +0 -114
- package/vendor/node-addon-api/test/common/test_helper.h +0 -71
- package/vendor/node-addon-api/test/dataview/dataview.cc +0 -48
- package/vendor/node-addon-api/test/dataview/dataview.js +0 -35
- package/vendor/node-addon-api/test/dataview/dataview_read_write.cc +0 -115
- package/vendor/node-addon-api/test/dataview/dataview_read_write.js +0 -90
- package/vendor/node-addon-api/test/date.cc +0 -44
- package/vendor/node-addon-api/test/date.js +0 -18
- package/vendor/node-addon-api/test/env_cleanup.cc +0 -88
- package/vendor/node-addon-api/test/env_cleanup.js +0 -56
- package/vendor/node-addon-api/test/error.cc +0 -287
- package/vendor/node-addon-api/test/error.js +0 -81
- package/vendor/node-addon-api/test/error_handling_for_primitives.cc +0 -13
- package/vendor/node-addon-api/test/error_handling_for_primitives.js +0 -29
- package/vendor/node-addon-api/test/error_terminating_environment.js +0 -95
- package/vendor/node-addon-api/test/external.cc +0 -81
- package/vendor/node-addon-api/test/external.js +0 -88
- package/vendor/node-addon-api/test/function.cc +0 -324
- package/vendor/node-addon-api/test/function.js +0 -133
- package/vendor/node-addon-api/test/function_reference.cc +0 -202
- package/vendor/node-addon-api/test/function_reference.js +0 -157
- package/vendor/node-addon-api/test/globalObject/global_object.cc +0 -61
- package/vendor/node-addon-api/test/globalObject/global_object_delete_property.cc +0 -31
- package/vendor/node-addon-api/test/globalObject/global_object_delete_property.js +0 -61
- package/vendor/node-addon-api/test/globalObject/global_object_get_property.cc +0 -40
- package/vendor/node-addon-api/test/globalObject/global_object_get_property.js +0 -57
- package/vendor/node-addon-api/test/globalObject/global_object_has_own_property.cc +0 -28
- package/vendor/node-addon-api/test/globalObject/global_object_has_own_property.js +0 -48
- package/vendor/node-addon-api/test/globalObject/global_object_set_property.cc +0 -31
- package/vendor/node-addon-api/test/globalObject/global_object_set_property.js +0 -58
- package/vendor/node-addon-api/test/handlescope.cc +0 -60
- package/vendor/node-addon-api/test/handlescope.js +0 -14
- package/vendor/node-addon-api/test/index.js +0 -159
- package/vendor/node-addon-api/test/maybe/check.cc +0 -23
- package/vendor/node-addon-api/test/maybe/index.js +0 -38
- package/vendor/node-addon-api/test/memory_management.cc +0 -17
- package/vendor/node-addon-api/test/memory_management.js +0 -9
- package/vendor/node-addon-api/test/movable_callbacks.cc +0 -23
- package/vendor/node-addon-api/test/movable_callbacks.js +0 -21
- package/vendor/node-addon-api/test/name.cc +0 -108
- package/vendor/node-addon-api/test/name.js +0 -59
- package/vendor/node-addon-api/test/napi_child.js +0 -14
- package/vendor/node-addon-api/test/object/delete_property.cc +0 -38
- package/vendor/node-addon-api/test/object/delete_property.js +0 -41
- package/vendor/node-addon-api/test/object/finalizer.cc +0 -29
- package/vendor/node-addon-api/test/object/finalizer.js +0 -28
- package/vendor/node-addon-api/test/object/get_property.cc +0 -34
- package/vendor/node-addon-api/test/object/get_property.js +0 -40
- package/vendor/node-addon-api/test/object/has_own_property.cc +0 -34
- package/vendor/node-addon-api/test/object/has_own_property.js +0 -34
- package/vendor/node-addon-api/test/object/has_property.cc +0 -38
- package/vendor/node-addon-api/test/object/has_property.js +0 -37
- package/vendor/node-addon-api/test/object/object.cc +0 -350
- package/vendor/node-addon-api/test/object/object.js +0 -217
- package/vendor/node-addon-api/test/object/object_deprecated.cc +0 -66
- package/vendor/node-addon-api/test/object/object_deprecated.js +0 -47
- package/vendor/node-addon-api/test/object/object_freeze_seal.cc +0 -25
- package/vendor/node-addon-api/test/object/object_freeze_seal.js +0 -61
- package/vendor/node-addon-api/test/object/set_property.cc +0 -45
- package/vendor/node-addon-api/test/object/set_property.js +0 -30
- package/vendor/node-addon-api/test/object/subscript_operator.cc +0 -58
- package/vendor/node-addon-api/test/object/subscript_operator.js +0 -17
- package/vendor/node-addon-api/test/object_reference.cc +0 -219
- package/vendor/node-addon-api/test/object_reference.js +0 -259
- package/vendor/node-addon-api/test/objectwrap.cc +0 -268
- package/vendor/node-addon-api/test/objectwrap.js +0 -284
- package/vendor/node-addon-api/test/objectwrap_constructor_exception.cc +0 -26
- package/vendor/node-addon-api/test/objectwrap_constructor_exception.js +0 -18
- package/vendor/node-addon-api/test/objectwrap_function.cc +0 -45
- package/vendor/node-addon-api/test/objectwrap_function.js +0 -22
- package/vendor/node-addon-api/test/objectwrap_multiple_inheritance.cc +0 -30
- package/vendor/node-addon-api/test/objectwrap_multiple_inheritance.js +0 -13
- package/vendor/node-addon-api/test/objectwrap_removewrap.cc +0 -45
- package/vendor/node-addon-api/test/objectwrap_removewrap.js +0 -40
- package/vendor/node-addon-api/test/objectwrap_worker_thread.js +0 -19
- package/vendor/node-addon-api/test/promise.cc +0 -29
- package/vendor/node-addon-api/test/promise.js +0 -18
- package/vendor/node-addon-api/test/reference.cc +0 -24
- package/vendor/node-addon-api/test/reference.js +0 -14
- package/vendor/node-addon-api/test/run_script.cc +0 -56
- package/vendor/node-addon-api/test/run_script.js +0 -45
- package/vendor/node-addon-api/test/symbol.cc +0 -79
- package/vendor/node-addon-api/test/symbol.js +0 -73
- package/vendor/node-addon-api/test/testUtil.js +0 -54
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function.cc +0 -195
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function.js +0 -188
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_ctx.cc +0 -63
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_ctx.js +0 -12
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_existing_tsfn.cc +0 -115
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_existing_tsfn.js +0 -14
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_ptr.cc +0 -26
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_ptr.js +0 -7
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_sum.cc +0 -225
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_sum.js +0 -59
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_unref.cc +0 -42
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_unref.js +0 -53
- package/vendor/node-addon-api/test/thunking_manual.cc +0 -140
- package/vendor/node-addon-api/test/thunking_manual.js +0 -17
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function.cc +0 -215
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function.js +0 -188
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_ctx.cc +0 -68
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_ctx.js +0 -12
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_existing_tsfn.cc +0 -127
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_existing_tsfn.js +0 -14
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_ptr.cc +0 -28
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_ptr.js +0 -7
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_sum.cc +0 -237
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_sum.js +0 -59
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_unref.cc +0 -53
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_unref.js +0 -53
- package/vendor/node-addon-api/test/typedarray-bigint.js +0 -58
- package/vendor/node-addon-api/test/typedarray.cc +0 -216
- package/vendor/node-addon-api/test/typedarray.js +0 -69
- package/vendor/node-addon-api/test/version_management.cc +0 -27
- package/vendor/node-addon-api/test/version_management.js +0 -31
- package/vendor/node-addon-api/unit-test/README.md +0 -28
- package/vendor/node-addon-api/unit-test/binding-file-template.js +0 -39
- package/vendor/node-addon-api/unit-test/binding.gyp +0 -72
- package/vendor/node-addon-api/unit-test/exceptions.js +0 -32
- package/vendor/node-addon-api/unit-test/generate-binding-cc.js +0 -61
- package/vendor/node-addon-api/unit-test/injectTestParams.js +0 -101
- package/vendor/node-addon-api/unit-test/listOfTestModules.js +0 -88
- package/vendor/node-addon-api/unit-test/matchModules.js +0 -65
- package/vendor/node-addon-api/unit-test/setup.js +0 -13
- package/vendor/node-addon-api/unit-test/spawnTask.js +0 -26
- package/vendor/node-addon-api/unit-test/test.js +0 -30
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
# String
|
|
2
|
-
|
|
3
|
-
Class `Napi::String` inherits from class [`Napi::Name`][].
|
|
4
|
-
|
|
5
|
-
## Constructor
|
|
6
|
-
|
|
7
|
-
```cpp
|
|
8
|
-
Napi::String::String();
|
|
9
|
-
```
|
|
10
|
-
|
|
11
|
-
Returns a new **empty** `Napi::String` instance.
|
|
12
|
-
|
|
13
|
-
If an error occurs, a `Napi::Error` will get thrown. If C++ exceptions are not
|
|
14
|
-
being used, callers should check the result of `Env::IsExceptionPending` before
|
|
15
|
-
attempting to use the returned value.
|
|
16
|
-
|
|
17
|
-
```cpp
|
|
18
|
-
Napi::String::String(napi_env env, napi_value value); ///< Wraps a Node-API value primitive.
|
|
19
|
-
```
|
|
20
|
-
- `[in] env` - The environment in which to create the string.
|
|
21
|
-
- `[in] value` - The primitive to wrap.
|
|
22
|
-
|
|
23
|
-
Returns a `Napi::String` wrapping a `napi_value`.
|
|
24
|
-
|
|
25
|
-
If an error occurs, a `Napi::Error` will get thrown. If C++ exceptions are not
|
|
26
|
-
being used, callers should check the result of `Env::IsExceptionPending` before
|
|
27
|
-
attempting to use the returned value.
|
|
28
|
-
|
|
29
|
-
## Operators
|
|
30
|
-
|
|
31
|
-
### operator std::string
|
|
32
|
-
|
|
33
|
-
```cpp
|
|
34
|
-
Napi::String::operator std::string() const;
|
|
35
|
-
```
|
|
36
|
-
|
|
37
|
-
Returns a UTF-8 encoded C++ string.
|
|
38
|
-
|
|
39
|
-
### operator std::u16string
|
|
40
|
-
```cpp
|
|
41
|
-
Napi::String::operator std::u16string() const;
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
Returns a UTF-16 encoded C++ string.
|
|
45
|
-
|
|
46
|
-
## Methods
|
|
47
|
-
|
|
48
|
-
### New
|
|
49
|
-
```cpp
|
|
50
|
-
Napi::String::New();
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
Returns a new empty `Napi::String`.
|
|
54
|
-
|
|
55
|
-
### New
|
|
56
|
-
```cpp
|
|
57
|
-
Napi::String::New(napi_env env, const std::string& value);
|
|
58
|
-
Napi::String::New(napi_env env, const std::u16::string& value);
|
|
59
|
-
Napi::String::New(napi_env env, const char* value);
|
|
60
|
-
Napi::String::New(napi_env env, const char16_t* value);
|
|
61
|
-
Napi::String::New(napi_env env, const char* value, size_t length);
|
|
62
|
-
Napi::String::New(napi_env env, const char16_t* value, size_t length);
|
|
63
|
-
```
|
|
64
|
-
|
|
65
|
-
- `[in] env`: The `napi_env` environment in which to construct the `Napi::Value` object.
|
|
66
|
-
- `[in] value`: The C++ primitive from which to instantiate the `Napi::Value`. `value` may be any of:
|
|
67
|
-
- `std::string&` - represents a UTF8 string.
|
|
68
|
-
- `std::u16string&` - represents a UTF16-LE string.
|
|
69
|
-
- `const char*` - represents a UTF8 string.
|
|
70
|
-
- `const char16_t*` - represents a UTF16-LE string.
|
|
71
|
-
- `[in] length`: The length of the string (not necessarily null-terminated) in code units.
|
|
72
|
-
|
|
73
|
-
Returns a new `Napi::String` that represents the passed in C++ string.
|
|
74
|
-
|
|
75
|
-
If an error occurs, a `Napi::Error` will get thrown. If C++ exceptions are not
|
|
76
|
-
being used, callers should check the result of `Env::IsExceptionPending` before
|
|
77
|
-
attempting to use the returned value.
|
|
78
|
-
|
|
79
|
-
### Utf8Value
|
|
80
|
-
```cpp
|
|
81
|
-
std::string Napi::String::Utf8Value() const;
|
|
82
|
-
```
|
|
83
|
-
|
|
84
|
-
Returns a UTF-8 encoded C++ string.
|
|
85
|
-
|
|
86
|
-
### Utf16Value
|
|
87
|
-
```cpp
|
|
88
|
-
std::u16string Napi::String::Utf16Value() const;
|
|
89
|
-
```
|
|
90
|
-
|
|
91
|
-
Returns a UTF-16 encoded C++ string.
|
|
92
|
-
|
|
93
|
-
[`Napi::Name`]: ./name.md
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
# Symbol
|
|
2
|
-
|
|
3
|
-
Class `Napi::Symbol` inherits from class [`Napi::Name`][].
|
|
4
|
-
|
|
5
|
-
## Methods
|
|
6
|
-
|
|
7
|
-
### Constructor
|
|
8
|
-
|
|
9
|
-
Instantiates a new `Napi::Symbol` value.
|
|
10
|
-
|
|
11
|
-
```cpp
|
|
12
|
-
Napi::Symbol::Symbol();
|
|
13
|
-
```
|
|
14
|
-
|
|
15
|
-
Returns a new empty `Napi::Symbol`.
|
|
16
|
-
|
|
17
|
-
### New
|
|
18
|
-
```cpp
|
|
19
|
-
Napi::Symbol::New(napi_env env, const std::string& description);
|
|
20
|
-
Napi::Symbol::New(napi_env env, const char* description);
|
|
21
|
-
Napi::Symbol::New(napi_env env, Napi::String description);
|
|
22
|
-
Napi::Symbol::New(napi_env env, napi_value description);
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
- `[in] env`: The `napi_env` environment in which to construct the `Napi::Symbol` object.
|
|
26
|
-
- `[in] value`: The C++ primitive which represents the description hint for the `Napi::Symbol`.
|
|
27
|
-
`description` may be any of:
|
|
28
|
-
- `std::string&` - UTF8 string description.
|
|
29
|
-
- `const char*` - represents a UTF8 string description.
|
|
30
|
-
- `String` - Node addon API String description.
|
|
31
|
-
- `napi_value` - Node-API `napi_value` description.
|
|
32
|
-
|
|
33
|
-
If an error occurs, a `Napi::Error` will get thrown. If C++ exceptions are not
|
|
34
|
-
being used, callers should check the result of `Napi::Env::IsExceptionPending` before
|
|
35
|
-
attempting to use the returned value.
|
|
36
|
-
|
|
37
|
-
### WellKnown
|
|
38
|
-
```cpp
|
|
39
|
-
static Napi::Symbol Napi::Symbol::WellKnown(napi_env env, const std::string& name);
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
- `[in] env`: The `napi_env` environment in which to construct the `Napi::Symbol` object.
|
|
43
|
-
- `[in] name`: The C++ string representing the `Napi::Symbol` to retrieve.
|
|
44
|
-
|
|
45
|
-
Returns a `Napi::Symbol` representing a well-known `Symbol` from the
|
|
46
|
-
`Symbol` registry.
|
|
47
|
-
|
|
48
|
-
### For
|
|
49
|
-
```cpp
|
|
50
|
-
static Napi::Symbol Napi::Symbol::For(napi_env env, const std::string& description);
|
|
51
|
-
static Napi::Symbol Napi::Symbol::For(napi_env env, const char* description);
|
|
52
|
-
static Napi::Symbol Napi::Symbol::For(napi_env env, String description);
|
|
53
|
-
static Napi::Symbol Napi::Symbol::For(napi_env env, napi_value description);
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
- `[in] env`: The `napi_env` environment in which to construct the `Napi::Symbol` object.
|
|
57
|
-
- `[in] description`: The C++ string representing the `Napi::Symbol` in the global registry to retrieve.
|
|
58
|
-
|
|
59
|
-
Searches in the global registry for existing symbol with the given name. If the symbol already exist it will be returned, otherwise a new symbol will be created in the registry. It's equivalent to Symbol.for() called from JavaScript.
|
|
60
|
-
|
|
61
|
-
[`Napi::Name`]: ./name.md
|
|
@@ -1,121 +0,0 @@
|
|
|
1
|
-
# Thread-safe Functions
|
|
2
|
-
|
|
3
|
-
JavaScript functions can normally only be called from a native addon's main
|
|
4
|
-
thread. If an addon creates additional threads, then node-addon-api functions
|
|
5
|
-
that require a `Napi::Env`, `Napi::Value`, or `Napi::Reference` must not be
|
|
6
|
-
called from those threads.
|
|
7
|
-
|
|
8
|
-
When an addon has additional threads and JavaScript functions need to be invoked
|
|
9
|
-
based on the processing completed by those threads, those threads must
|
|
10
|
-
communicate with the addon's main thread so that the main thread can invoke the
|
|
11
|
-
JavaScript function on their behalf. The thread-safe function APIs provide an
|
|
12
|
-
easy way to do this. These APIs provide two types --
|
|
13
|
-
[`Napi::ThreadSafeFunction`](threadsafe_function.md) and
|
|
14
|
-
[`Napi::TypedThreadSafeFunction`](typed_threadsafe_function.md) -- as well as
|
|
15
|
-
APIs to create, destroy, and call objects of this type. The differences between
|
|
16
|
-
the two are subtle and are [highlighted below](#implementation-differences).
|
|
17
|
-
Regardless of which type you choose, the APIs between the two are similar.
|
|
18
|
-
|
|
19
|
-
`Napi::[Typed]ThreadSafeFunction::New()` creates a persistent reference that
|
|
20
|
-
holds a JavaScript function which can be called from multiple threads. The calls
|
|
21
|
-
happen asynchronously. This means that values with which the JavaScript callback
|
|
22
|
-
is to be called will be placed in a queue, and, for each value in the queue, a
|
|
23
|
-
call will eventually be made to the JavaScript function.
|
|
24
|
-
|
|
25
|
-
`Napi::[Typed]ThreadSafeFunction` objects are destroyed when every thread which
|
|
26
|
-
uses the object has called `Release()` or has received a return status of
|
|
27
|
-
`napi_closing` in response to a call to `BlockingCall()` or `NonBlockingCall()`.
|
|
28
|
-
The queue is emptied before the `Napi::[Typed]ThreadSafeFunction` is destroyed.
|
|
29
|
-
It is important that `Release()` be the last API call made in conjunction with a
|
|
30
|
-
given `Napi::[Typed]ThreadSafeFunction`, because after the call completes, there
|
|
31
|
-
is no guarantee that the `Napi::[Typed]ThreadSafeFunction` is still allocated.
|
|
32
|
-
For the same reason it is also important that no more use be made of a
|
|
33
|
-
thread-safe function after receiving a return value of `napi_closing` in
|
|
34
|
-
response to a call to `BlockingCall()` or `NonBlockingCall()`. Data associated
|
|
35
|
-
with the `Napi::[Typed]ThreadSafeFunction` can be freed in its `Finalizer`
|
|
36
|
-
callback which was passed to `[Typed]ThreadSafeFunction::New()`.
|
|
37
|
-
|
|
38
|
-
Once the number of threads making use of a `Napi::[Typed]ThreadSafeFunction`
|
|
39
|
-
reaches zero, no further threads can start making use of it by calling
|
|
40
|
-
`Acquire()`. In fact, all subsequent API calls associated with it, except
|
|
41
|
-
`Release()`, will return an error value of `napi_closing`.
|
|
42
|
-
|
|
43
|
-
## Implementation Differences
|
|
44
|
-
|
|
45
|
-
The choice between `Napi::ThreadSafeFunction` and
|
|
46
|
-
`Napi::TypedThreadSafeFunction` depends largely on how you plan to execute your
|
|
47
|
-
native C++ code (the "callback") on the Node.js thread.
|
|
48
|
-
|
|
49
|
-
### [`Napi::ThreadSafeFunction`](threadsafe_function.md)
|
|
50
|
-
|
|
51
|
-
This API is designed without Node-API 5 native support for [the optional JavaScript
|
|
52
|
-
function callback feature](https://github.com/nodejs/node/commit/53297e66cb).
|
|
53
|
-
|
|
54
|
-
This API has some dynamic functionality, in that:
|
|
55
|
-
- The `[Non]BlockingCall()` methods provide a `Napi::Function` parameter as the
|
|
56
|
-
callback to run when processing the data item on the main thread -- the
|
|
57
|
-
`CallJs` callback. Since the callback is a parameter, it can be changed for
|
|
58
|
-
every call.
|
|
59
|
-
- Different C++ data types may be passed with each call of `[Non]BlockingCall()`
|
|
60
|
-
to match the specific data type as specified in the `CallJs` callback.
|
|
61
|
-
|
|
62
|
-
Note that this functionality comes with some **additional overhead** and
|
|
63
|
-
situational **memory leaks**:
|
|
64
|
-
- The API acts as a "broker" between the underlying `napi_threadsafe_function`,
|
|
65
|
-
and dynamically constructs a wrapper for your callback on the heap for every
|
|
66
|
-
call to `[Non]BlockingCall()`.
|
|
67
|
-
- In acting in this "broker" fashion, the API will call the underlying "make
|
|
68
|
-
call" Node-API method on this packaged item. If the API has determined the
|
|
69
|
-
thread-safe function is no longer accessible (eg. all threads have released
|
|
70
|
-
yet there are still items on the queue), **the callback passed to
|
|
71
|
-
[Non]BlockingCall will not execute**. This means it is impossible to perform
|
|
72
|
-
clean-up for calls that never execute their `CallJs` callback. **This may lead
|
|
73
|
-
to memory leaks** if you are dynamically allocating memory.
|
|
74
|
-
- The `CallJs` does not receive the thread-safe function's context as a
|
|
75
|
-
parameter. In order for the callback to access the context, it must have a
|
|
76
|
-
reference to either (1) the context directly, or (2) the thread-safe function
|
|
77
|
-
to call `GetContext()`. Furthermore, the `GetContext()` method is not
|
|
78
|
-
_type-safe_, as the method returns an object that can be "any-casted", instead
|
|
79
|
-
of having a static type.
|
|
80
|
-
|
|
81
|
-
### [`Napi::TypedThreadSafeFunction`](typed_threadsafe_function.md)
|
|
82
|
-
|
|
83
|
-
The `TypedThreadSafeFunction` class is a new implementation to address the
|
|
84
|
-
drawbacks listed above. The API is designed with Node-API 5's support of an
|
|
85
|
-
optional function callback. The API will correctly allow developers to pass
|
|
86
|
-
`std::nullptr` instead of a `const Function&` for the callback function
|
|
87
|
-
specified in `::New`. It also provides helper APIs to _target_ Node-API 4 and
|
|
88
|
-
construct a no-op `Function` **or** to target Node-API 5 and "construct" a
|
|
89
|
-
`std::nullptr` callback. This allows a single codebase to use the same APIs,
|
|
90
|
-
with just a switch of the `NAPI_VERSION` compile-time constant.
|
|
91
|
-
|
|
92
|
-
The removal of the dynamic call functionality has the following implications:
|
|
93
|
-
- The API does _not_ act as a "broker" compared to the
|
|
94
|
-
`Napi::ThreadSafeFunction`. Once Node.js finalizes the thread-safe function,
|
|
95
|
-
the `CallJs` callback will execute with an empty `Napi::Env` for any remaining
|
|
96
|
-
items on the queue. This provides the ability to handle any necessary cleanup
|
|
97
|
-
of the item's data.
|
|
98
|
-
- The callback _does_ receive the context as a parameter, so a call to
|
|
99
|
-
`GetContext()` is _not_ necessary. This context type is specified as the
|
|
100
|
-
**first template argument** specified to `::New`, ensuring type safety.
|
|
101
|
-
- The `New()` constructor accepts the `CallJs` callback as the **second type
|
|
102
|
-
argument**. The callback must be statically defined for the API to access it.
|
|
103
|
-
This affords the ability to statically pass the context as the correct type
|
|
104
|
-
across all methods.
|
|
105
|
-
- Only one C++ data type may be specified to every call to `[Non]BlockingCall()`
|
|
106
|
-
-- the **third template argument** specified to `::New`. Any "dynamic call
|
|
107
|
-
data" must be implemented by the user.
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
### Usage Suggestions
|
|
111
|
-
|
|
112
|
-
In summary, it may be best to use `Napi::TypedThreadSafeFunction` if:
|
|
113
|
-
|
|
114
|
-
- static, compile-time support for targeting Node-API 4 or 5+ with an optional
|
|
115
|
-
JavaScript callback feature is desired;
|
|
116
|
-
- the callback can have `static` storage class and will not change across calls
|
|
117
|
-
to `[Non]BlockingCall()`;
|
|
118
|
-
- cleanup of items' data is required (eg. deleting dynamically-allocated data
|
|
119
|
-
that is created at the caller level).
|
|
120
|
-
|
|
121
|
-
Otherwise, `Napi::ThreadSafeFunction` may be a better choice.
|
|
@@ -1,290 +0,0 @@
|
|
|
1
|
-
# ThreadSafeFunction
|
|
2
|
-
|
|
3
|
-
The `Napi::ThreadSafeFunction` type provides APIs for threads to communicate
|
|
4
|
-
with the addon's main thread to invoke JavaScript functions on their behalf.
|
|
5
|
-
Documentation can be found for an [overview of the API](threadsafe.md), as well
|
|
6
|
-
as [differences between the two thread-safe function
|
|
7
|
-
APIs](threadsafe.md#implementation-differences).
|
|
8
|
-
|
|
9
|
-
## Methods
|
|
10
|
-
|
|
11
|
-
### Constructor
|
|
12
|
-
|
|
13
|
-
Creates a new empty instance of `Napi::ThreadSafeFunction`.
|
|
14
|
-
|
|
15
|
-
```cpp
|
|
16
|
-
Napi::Function::ThreadSafeFunction();
|
|
17
|
-
```
|
|
18
|
-
|
|
19
|
-
### Constructor
|
|
20
|
-
|
|
21
|
-
Creates a new instance of the `Napi::ThreadSafeFunction` object.
|
|
22
|
-
|
|
23
|
-
```cpp
|
|
24
|
-
Napi::ThreadSafeFunction::ThreadSafeFunction(napi_threadsafe_function tsfn);
|
|
25
|
-
```
|
|
26
|
-
|
|
27
|
-
- `tsfn`: The `napi_threadsafe_function` which is a handle for an existing
|
|
28
|
-
thread-safe function.
|
|
29
|
-
|
|
30
|
-
Returns a non-empty `Napi::ThreadSafeFunction` instance. When using this
|
|
31
|
-
constructor, only use the `Blocking(void*)` / `NonBlocking(void*)` overloads;
|
|
32
|
-
the `Callback` and templated `data*` overloads should _not_ be used. See below
|
|
33
|
-
for additional details.
|
|
34
|
-
|
|
35
|
-
### New
|
|
36
|
-
|
|
37
|
-
Creates a new instance of the `Napi::ThreadSafeFunction` object. The `New`
|
|
38
|
-
function has several overloads for the various optional parameters: skip the
|
|
39
|
-
optional parameter for that specific overload.
|
|
40
|
-
|
|
41
|
-
```cpp
|
|
42
|
-
New(napi_env env,
|
|
43
|
-
const Function& callback,
|
|
44
|
-
const Object& resource,
|
|
45
|
-
ResourceString resourceName,
|
|
46
|
-
size_t maxQueueSize,
|
|
47
|
-
size_t initialThreadCount,
|
|
48
|
-
ContextType* context,
|
|
49
|
-
Finalizer finalizeCallback,
|
|
50
|
-
FinalizerDataType* data);
|
|
51
|
-
```
|
|
52
|
-
|
|
53
|
-
- `env`: The `napi_env` environment in which to construct the
|
|
54
|
-
`Napi::ThreadSafeFunction` object.
|
|
55
|
-
- `callback`: The `Function` to call from another thread.
|
|
56
|
-
- `[optional] resource`: An object associated with the async work that will be
|
|
57
|
-
passed to possible async_hooks init hooks.
|
|
58
|
-
- `resourceName`: A JavaScript string to provide an identifier for the kind of
|
|
59
|
-
resource that is being provided for diagnostic information exposed by the
|
|
60
|
-
async_hooks API.
|
|
61
|
-
- `maxQueueSize`: Maximum size of the queue. `0` for no limit.
|
|
62
|
-
- `initialThreadCount`: The initial number of threads, including the main
|
|
63
|
-
thread, which will be making use of this function.
|
|
64
|
-
- `[optional] context`: Data to attach to the resulting `ThreadSafeFunction`. It
|
|
65
|
-
can be retreived by calling `GetContext()`.
|
|
66
|
-
- `[optional] finalizeCallback`: Function to call when the `ThreadSafeFunction`
|
|
67
|
-
is being destroyed. This callback will be invoked on the main thread when the
|
|
68
|
-
thread-safe function is about to be destroyed. It receives the context and the
|
|
69
|
-
finalize data given during construction (if given), and provides an
|
|
70
|
-
opportunity for cleaning up after the threads e.g. by calling
|
|
71
|
-
`uv_thread_join()`. It is important that, aside from the main loop thread,
|
|
72
|
-
there be no threads left using the thread-safe function after the finalize
|
|
73
|
-
callback completes. Must implement `void operator()(Env env, DataType* data,
|
|
74
|
-
ContextType* hint)`, skipping `data` or `hint` if they are not provided. Can
|
|
75
|
-
be retrieved via `GetContext()`.
|
|
76
|
-
- `[optional] data`: Data to be passed to `finalizeCallback`.
|
|
77
|
-
|
|
78
|
-
Returns a non-empty `Napi::ThreadSafeFunction` instance.
|
|
79
|
-
|
|
80
|
-
### Acquire
|
|
81
|
-
|
|
82
|
-
Add a thread to this thread-safe function object, indicating that a new thread
|
|
83
|
-
will start making use of the thread-safe function.
|
|
84
|
-
|
|
85
|
-
```cpp
|
|
86
|
-
napi_status Napi::ThreadSafeFunction::Acquire() const
|
|
87
|
-
```
|
|
88
|
-
|
|
89
|
-
Returns one of:
|
|
90
|
-
- `napi_ok`: The thread has successfully acquired the thread-safe function
|
|
91
|
-
for its use.
|
|
92
|
-
- `napi_closing`: The thread-safe function has been marked as closing via a
|
|
93
|
-
previous call to `Abort()`.
|
|
94
|
-
|
|
95
|
-
### Release
|
|
96
|
-
|
|
97
|
-
Indicate that an existing thread will stop making use of the thread-safe
|
|
98
|
-
function. A thread should call this API when it stops making use of this
|
|
99
|
-
thread-safe function. Using any thread-safe APIs after having called this API
|
|
100
|
-
has undefined results in the current thread, as it may have been destroyed.
|
|
101
|
-
|
|
102
|
-
```cpp
|
|
103
|
-
napi_status Napi::ThreadSafeFunction::Release() const
|
|
104
|
-
```
|
|
105
|
-
|
|
106
|
-
Returns one of:
|
|
107
|
-
- `napi_ok`: The thread-safe function has been successfully released.
|
|
108
|
-
- `napi_invalid_arg`: The thread-safe function's thread-count is zero.
|
|
109
|
-
- `napi_generic_failure`: A generic error occurred when attempting to release
|
|
110
|
-
the thread-safe function.
|
|
111
|
-
|
|
112
|
-
### Abort
|
|
113
|
-
|
|
114
|
-
"Abort" the thread-safe function. This will cause all subsequent APIs associated
|
|
115
|
-
with the thread-safe function except `Release()` to return `napi_closing` even
|
|
116
|
-
before its reference count reaches zero. In particular, `BlockingCall` and
|
|
117
|
-
`NonBlockingCall()` will return `napi_closing`, thus informing the threads that
|
|
118
|
-
it is no longer possible to make asynchronous calls to the thread-safe function.
|
|
119
|
-
This can be used as a criterion for terminating the thread. Upon receiving a
|
|
120
|
-
return value of `napi_closing` from a thread-safe function call a thread must
|
|
121
|
-
make no further use of the thread-safe function because it is no longer
|
|
122
|
-
guaranteed to be allocated.
|
|
123
|
-
|
|
124
|
-
```cpp
|
|
125
|
-
napi_status Napi::ThreadSafeFunction::Abort() const
|
|
126
|
-
```
|
|
127
|
-
|
|
128
|
-
Returns one of:
|
|
129
|
-
- `napi_ok`: The thread-safe function has been successfully aborted.
|
|
130
|
-
- `napi_invalid_arg`: The thread-safe function's thread-count is zero.
|
|
131
|
-
- `napi_generic_failure`: A generic error occurred when attempting to abort
|
|
132
|
-
the thread-safe function.
|
|
133
|
-
|
|
134
|
-
### BlockingCall / NonBlockingCall
|
|
135
|
-
|
|
136
|
-
Calls the Javascript function in either a blocking or non-blocking fashion.
|
|
137
|
-
- `BlockingCall()`: the API blocks until space becomes available in the queue.
|
|
138
|
-
Will never block if the thread-safe function was created with a maximum queue
|
|
139
|
-
size of `0`.
|
|
140
|
-
- `NonBlockingCall()`: will return `napi_queue_full` if the queue was full,
|
|
141
|
-
preventing data from being successfully added to the queue.
|
|
142
|
-
|
|
143
|
-
There are several overloaded implementations of `BlockingCall()` and
|
|
144
|
-
`NonBlockingCall()` for use with optional parameters: skip the optional
|
|
145
|
-
parameter for that specific overload.
|
|
146
|
-
|
|
147
|
-
**These specific function overloads should only be used on a `ThreadSafeFunction`
|
|
148
|
-
created via `ThreadSafeFunction::New`.**
|
|
149
|
-
|
|
150
|
-
```cpp
|
|
151
|
-
napi_status Napi::ThreadSafeFunction::BlockingCall(DataType* data, Callback callback) const
|
|
152
|
-
|
|
153
|
-
napi_status Napi::ThreadSafeFunction::NonBlockingCall(DataType* data, Callback callback) const
|
|
154
|
-
```
|
|
155
|
-
|
|
156
|
-
- `[optional] data`: Data to pass to `callback`.
|
|
157
|
-
- `[optional] callback`: C++ function that is invoked on the main thread. The
|
|
158
|
-
callback receives the `ThreadSafeFunction`'s JavaScript callback function to
|
|
159
|
-
call as an `Napi::Function` in its parameters and the `DataType*` data pointer
|
|
160
|
-
(if provided). Must implement `void operator()(Napi::Env env, Function
|
|
161
|
-
jsCallback, DataType* data)`, skipping `data` if not provided. It is not
|
|
162
|
-
necessary to call into JavaScript via `MakeCallback()` because Node-API runs
|
|
163
|
-
`callback` in a context appropriate for callbacks.
|
|
164
|
-
|
|
165
|
-
**These specific function overloads should only be used on a `ThreadSafeFunction`
|
|
166
|
-
created via `ThreadSafeFunction(napi_threadsafe_function)`.**
|
|
167
|
-
|
|
168
|
-
```cpp
|
|
169
|
-
napi_status Napi::ThreadSafeFunction::BlockingCall(void* data) const
|
|
170
|
-
|
|
171
|
-
napi_status Napi::ThreadSafeFunction::NonBlockingCall(void* data) const
|
|
172
|
-
```
|
|
173
|
-
- `data`: Data to pass to `call_js_cb` specified when creating the thread-safe
|
|
174
|
-
function via `napi_create_threadsafe_function`.
|
|
175
|
-
|
|
176
|
-
Returns one of:
|
|
177
|
-
- `napi_ok`: The call was successfully added to the queue.
|
|
178
|
-
- `napi_queue_full`: The queue was full when trying to call in a non-blocking
|
|
179
|
-
method.
|
|
180
|
-
- `napi_closing`: The thread-safe function is aborted and cannot accept more
|
|
181
|
-
calls.
|
|
182
|
-
- `napi_invalid_arg`: The thread-safe function is closed.
|
|
183
|
-
- `napi_generic_failure`: A generic error occurred when attempting to add to the
|
|
184
|
-
queue.
|
|
185
|
-
|
|
186
|
-
## Example
|
|
187
|
-
|
|
188
|
-
```cpp
|
|
189
|
-
#include <chrono>
|
|
190
|
-
#include <thread>
|
|
191
|
-
#include <napi.h>
|
|
192
|
-
|
|
193
|
-
using namespace Napi;
|
|
194
|
-
|
|
195
|
-
std::thread nativeThread;
|
|
196
|
-
ThreadSafeFunction tsfn;
|
|
197
|
-
|
|
198
|
-
Value Start( const CallbackInfo& info )
|
|
199
|
-
{
|
|
200
|
-
Napi::Env env = info.Env();
|
|
201
|
-
|
|
202
|
-
if ( info.Length() < 2 )
|
|
203
|
-
{
|
|
204
|
-
throw TypeError::New( env, "Expected two arguments" );
|
|
205
|
-
}
|
|
206
|
-
else if ( !info[0].IsFunction() )
|
|
207
|
-
{
|
|
208
|
-
throw TypeError::New( env, "Expected first arg to be function" );
|
|
209
|
-
}
|
|
210
|
-
else if ( !info[1].IsNumber() )
|
|
211
|
-
{
|
|
212
|
-
throw TypeError::New( env, "Expected second arg to be number" );
|
|
213
|
-
}
|
|
214
|
-
|
|
215
|
-
int count = info[1].As<Number>().Int32Value();
|
|
216
|
-
|
|
217
|
-
// Create a ThreadSafeFunction
|
|
218
|
-
tsfn = ThreadSafeFunction::New(
|
|
219
|
-
env,
|
|
220
|
-
info[0].As<Function>(), // JavaScript function called asynchronously
|
|
221
|
-
"Resource Name", // Name
|
|
222
|
-
0, // Unlimited queue
|
|
223
|
-
1, // Only one thread will use this initially
|
|
224
|
-
[]( Napi::Env ) { // Finalizer used to clean threads up
|
|
225
|
-
nativeThread.join();
|
|
226
|
-
} );
|
|
227
|
-
|
|
228
|
-
// Create a native thread
|
|
229
|
-
nativeThread = std::thread( [count] {
|
|
230
|
-
auto callback = []( Napi::Env env, Function jsCallback, int* value ) {
|
|
231
|
-
// Transform native data into JS data, passing it to the provided
|
|
232
|
-
// `jsCallback` -- the TSFN's JavaScript function.
|
|
233
|
-
jsCallback.Call( {Number::New( env, *value )} );
|
|
234
|
-
|
|
235
|
-
// We're finished with the data.
|
|
236
|
-
delete value;
|
|
237
|
-
};
|
|
238
|
-
|
|
239
|
-
for ( int i = 0; i < count; i++ )
|
|
240
|
-
{
|
|
241
|
-
// Create new data
|
|
242
|
-
int* value = new int( clock() );
|
|
243
|
-
|
|
244
|
-
// Perform a blocking call
|
|
245
|
-
napi_status status = tsfn.BlockingCall( value, callback );
|
|
246
|
-
if ( status != napi_ok )
|
|
247
|
-
{
|
|
248
|
-
// Handle error
|
|
249
|
-
break;
|
|
250
|
-
}
|
|
251
|
-
|
|
252
|
-
std::this_thread::sleep_for( std::chrono::seconds( 1 ) );
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
// Release the thread-safe function
|
|
256
|
-
tsfn.Release();
|
|
257
|
-
} );
|
|
258
|
-
|
|
259
|
-
return Boolean::New(env, true);
|
|
260
|
-
}
|
|
261
|
-
|
|
262
|
-
Napi::Object Init( Napi::Env env, Object exports )
|
|
263
|
-
{
|
|
264
|
-
exports.Set( "start", Function::New( env, Start ) );
|
|
265
|
-
return exports;
|
|
266
|
-
}
|
|
267
|
-
|
|
268
|
-
NODE_API_MODULE( clock, Init )
|
|
269
|
-
```
|
|
270
|
-
|
|
271
|
-
The above code can be used from JavaScript as follows:
|
|
272
|
-
|
|
273
|
-
```js
|
|
274
|
-
const { start } = require('bindings')('clock');
|
|
275
|
-
|
|
276
|
-
start(function () {
|
|
277
|
-
console.log("JavaScript callback called with arguments", Array.from(arguments));
|
|
278
|
-
}, 5);
|
|
279
|
-
```
|
|
280
|
-
|
|
281
|
-
When executed, the output will show the value of `clock()` five times at one
|
|
282
|
-
second intervals:
|
|
283
|
-
|
|
284
|
-
```
|
|
285
|
-
JavaScript callback called with arguments [ 84745 ]
|
|
286
|
-
JavaScript callback called with arguments [ 103211 ]
|
|
287
|
-
JavaScript callback called with arguments [ 104516 ]
|
|
288
|
-
JavaScript callback called with arguments [ 105104 ]
|
|
289
|
-
JavaScript callback called with arguments [ 105691 ]
|
|
290
|
-
```
|
|
@@ -1,59 +0,0 @@
|
|
|
1
|
-
# TypeError
|
|
2
|
-
|
|
3
|
-
The `Napi::TypeError` class is a representation of the JavaScript `TypeError` that is
|
|
4
|
-
thrown when an operand or argument passed to a function is incompatible with the
|
|
5
|
-
type expected by the operator or function.
|
|
6
|
-
|
|
7
|
-
The `Napi::TypeError` class inherits its behaviors from the `Napi::Error` class (for more info
|
|
8
|
-
see: [`Napi::Error`](error.md)).
|
|
9
|
-
|
|
10
|
-
For more details about error handling refer to the section titled [Error handling](error_handling.md).
|
|
11
|
-
|
|
12
|
-
## Methods
|
|
13
|
-
|
|
14
|
-
### New
|
|
15
|
-
|
|
16
|
-
Creates a new instance of the `Napi::TypeError` object.
|
|
17
|
-
|
|
18
|
-
```cpp
|
|
19
|
-
Napi::TypeError::New(Napi::Env env, const char* message);
|
|
20
|
-
```
|
|
21
|
-
|
|
22
|
-
- `[in] Env`: The environment in which to construct the `Napi::TypeError` object.
|
|
23
|
-
- `[in] message`: Null-terminated string to be used as the message for the `Napi::TypeError`.
|
|
24
|
-
|
|
25
|
-
Returns an instance of a `Napi::TypeError` object.
|
|
26
|
-
|
|
27
|
-
### New
|
|
28
|
-
|
|
29
|
-
Creates a new instance of a `Napi::TypeError` object.
|
|
30
|
-
|
|
31
|
-
```cpp
|
|
32
|
-
Napi::TypeError::New(Napi::Env env, const std::string& message);
|
|
33
|
-
```
|
|
34
|
-
|
|
35
|
-
- `[in] Env`: The environment in which to construct the `Napi::TypeError` object.
|
|
36
|
-
- `[in] message`: Reference string to be used as the message for the `Napi::TypeError`.
|
|
37
|
-
|
|
38
|
-
Returns an instance of a `Napi::TypeError` object.
|
|
39
|
-
|
|
40
|
-
### Constructor
|
|
41
|
-
|
|
42
|
-
Creates a new empty instance of a `Napi::TypeError`.
|
|
43
|
-
|
|
44
|
-
```cpp
|
|
45
|
-
Napi::TypeError::TypeError();
|
|
46
|
-
```
|
|
47
|
-
|
|
48
|
-
### Constructor
|
|
49
|
-
|
|
50
|
-
Initializes a `Napi::TypeError` instance from an existing JavaScript error object.
|
|
51
|
-
|
|
52
|
-
```cpp
|
|
53
|
-
Napi::TypeError::TypeError(napi_env env, napi_value value);
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
- `[in] Env`: The environment in which to construct the `Napi::TypeError` object.
|
|
57
|
-
- `[in] value`: The `Napi::Error` reference to wrap.
|
|
58
|
-
|
|
59
|
-
Returns an instance of a `Napi::TypeError` object.
|