koffi 1.1.0-beta.0 → 1.1.0-beta.3
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/CMakeLists.txt +4 -0
- package/README.md +16 -11
- package/build/qemu/1.1.0-beta.3/koffi_darwin_x64.tar.gz +0 -0
- package/build/qemu/1.1.0-beta.3/koffi_freebsd_arm64.tar.gz +0 -0
- package/build/qemu/1.1.0-beta.3/koffi_freebsd_ia32.tar.gz +0 -0
- package/build/qemu/1.1.0-beta.3/koffi_freebsd_x64.tar.gz +0 -0
- package/build/qemu/1.1.0-beta.3/koffi_linux_arm.tar.gz +0 -0
- package/build/qemu/1.1.0-beta.3/koffi_linux_arm64.tar.gz +0 -0
- package/build/qemu/1.1.0-beta.3/koffi_linux_ia32.tar.gz +0 -0
- package/build/qemu/1.1.0-beta.3/koffi_linux_x64.tar.gz +0 -0
- package/build/qemu/1.1.0-beta.3/koffi_win32_ia32.tar.gz +0 -0
- package/build/qemu/1.1.0-beta.3/koffi_win32_x64.tar.gz +0 -0
- package/package.json +1 -1
- package/qemu/qemu.js +1 -0
- package/src/abi_arm32.cc +27 -45
- package/src/abi_arm64.cc +58 -132
- package/src/abi_x64_sysv.cc +24 -7
- package/src/abi_x64_win.cc +3 -0
- package/src/abi_x86.cc +3 -0
- package/src/call.cc +540 -33
- package/src/call.hh +5 -3
- package/src/ffi.cc +69 -4
- package/src/ffi.hh +3 -1
- package/src/parser.cc +7 -2
- package/src/util.cc +72 -0
- package/src/util.hh +2 -0
- package/test/misc.c +14 -8
- package/vendor/node-addon-api/CODE_OF_CONDUCT.md +4 -0
- package/vendor/node-addon-api/CONTRIBUTING.md +93 -0
- package/vendor/node-addon-api/appveyor.yml +37 -0
- package/vendor/node-addon-api/benchmark/README.md +47 -0
- package/vendor/node-addon-api/benchmark/binding.gyp +25 -0
- package/vendor/node-addon-api/benchmark/function_args.cc +217 -0
- package/vendor/node-addon-api/benchmark/function_args.js +60 -0
- package/vendor/node-addon-api/benchmark/index.js +34 -0
- package/vendor/node-addon-api/benchmark/property_descriptor.cc +91 -0
- package/vendor/node-addon-api/benchmark/property_descriptor.js +37 -0
- package/vendor/node-addon-api/doc/addon.md +163 -0
- package/vendor/node-addon-api/doc/array.md +81 -0
- package/vendor/node-addon-api/doc/array_buffer.md +155 -0
- package/vendor/node-addon-api/doc/async_context.md +86 -0
- package/vendor/node-addon-api/doc/async_operations.md +31 -0
- package/vendor/node-addon-api/doc/async_worker.md +427 -0
- package/vendor/node-addon-api/doc/async_worker_variants.md +557 -0
- package/vendor/node-addon-api/doc/bigint.md +97 -0
- package/vendor/node-addon-api/doc/boolean.md +68 -0
- package/vendor/node-addon-api/doc/buffer.md +150 -0
- package/vendor/node-addon-api/doc/callback_scope.md +54 -0
- package/vendor/node-addon-api/doc/callbackinfo.md +97 -0
- package/vendor/node-addon-api/doc/checker-tool.md +32 -0
- package/vendor/node-addon-api/doc/class_property_descriptor.md +123 -0
- package/vendor/node-addon-api/doc/cmake-js.md +68 -0
- package/vendor/node-addon-api/doc/conversion-tool.md +28 -0
- package/vendor/node-addon-api/doc/creating_a_release.md +62 -0
- package/vendor/node-addon-api/doc/dataview.md +248 -0
- package/vendor/node-addon-api/doc/date.md +68 -0
- package/vendor/node-addon-api/doc/env.md +196 -0
- package/vendor/node-addon-api/doc/error.md +120 -0
- package/vendor/node-addon-api/doc/error_handling.md +254 -0
- package/vendor/node-addon-api/doc/escapable_handle_scope.md +80 -0
- package/vendor/node-addon-api/doc/external.md +63 -0
- package/vendor/node-addon-api/doc/function.md +402 -0
- package/vendor/node-addon-api/doc/function_reference.md +238 -0
- package/vendor/node-addon-api/doc/generator.md +13 -0
- package/vendor/node-addon-api/doc/handle_scope.md +63 -0
- package/vendor/node-addon-api/doc/hierarchy.md +91 -0
- package/vendor/node-addon-api/doc/instance_wrap.md +408 -0
- package/vendor/node-addon-api/doc/maybe.md +76 -0
- package/vendor/node-addon-api/doc/memory_management.md +27 -0
- package/vendor/node-addon-api/doc/name.md +29 -0
- package/vendor/node-addon-api/doc/node-gyp.md +82 -0
- package/vendor/node-addon-api/doc/number.md +163 -0
- package/vendor/node-addon-api/doc/object.md +411 -0
- package/vendor/node-addon-api/doc/object_lifetime_management.md +83 -0
- package/vendor/node-addon-api/doc/object_reference.md +117 -0
- package/vendor/node-addon-api/doc/object_wrap.md +588 -0
- package/vendor/node-addon-api/doc/prebuild_tools.md +16 -0
- package/vendor/node-addon-api/doc/promises.md +79 -0
- package/vendor/node-addon-api/doc/property_descriptor.md +286 -0
- package/vendor/node-addon-api/doc/propertylvalue.md +50 -0
- package/vendor/node-addon-api/doc/range_error.md +59 -0
- package/vendor/node-addon-api/doc/reference.md +113 -0
- package/vendor/node-addon-api/doc/setup.md +110 -0
- package/vendor/node-addon-api/doc/string.md +93 -0
- package/vendor/node-addon-api/doc/symbol.md +61 -0
- package/vendor/node-addon-api/doc/threadsafe.md +121 -0
- package/vendor/node-addon-api/doc/threadsafe_function.md +290 -0
- package/vendor/node-addon-api/doc/type_error.md +59 -0
- package/vendor/node-addon-api/doc/typed_array.md +78 -0
- package/vendor/node-addon-api/doc/typed_array_of.md +137 -0
- package/vendor/node-addon-api/doc/typed_threadsafe_function.md +306 -0
- package/vendor/node-addon-api/doc/value.md +340 -0
- package/vendor/node-addon-api/doc/version_management.md +43 -0
- package/vendor/node-addon-api/package.json +415 -0
- package/vendor/node-addon-api/test/README.md +91 -0
- package/vendor/node-addon-api/test/addon.cc +36 -0
- package/vendor/node-addon-api/test/addon.js +11 -0
- package/vendor/node-addon-api/test/addon_build/index.js +49 -0
- package/vendor/node-addon-api/test/addon_build/tpl/addon.cc +17 -0
- package/vendor/node-addon-api/test/addon_build/tpl/binding.gyp +62 -0
- package/vendor/node-addon-api/test/addon_build/tpl/index.js +9 -0
- package/vendor/node-addon-api/test/addon_build/tpl/package.json +11 -0
- package/vendor/node-addon-api/test/addon_data.cc +99 -0
- package/vendor/node-addon-api/test/addon_data.js +46 -0
- package/vendor/node-addon-api/test/array_buffer.cc +243 -0
- package/vendor/node-addon-api/test/array_buffer.js +69 -0
- package/vendor/node-addon-api/test/async_context.cc +36 -0
- package/vendor/node-addon-api/test/async_context.js +122 -0
- package/vendor/node-addon-api/test/async_progress_queue_worker.cc +83 -0
- package/vendor/node-addon-api/test/async_progress_queue_worker.js +46 -0
- package/vendor/node-addon-api/test/async_progress_worker.cc +134 -0
- package/vendor/node-addon-api/test/async_progress_worker.js +61 -0
- package/vendor/node-addon-api/test/async_worker.cc +106 -0
- package/vendor/node-addon-api/test/async_worker.js +179 -0
- package/vendor/node-addon-api/test/async_worker_nocallback.js +13 -0
- package/vendor/node-addon-api/test/async_worker_persistent.cc +63 -0
- package/vendor/node-addon-api/test/async_worker_persistent.js +24 -0
- package/vendor/node-addon-api/test/basic_types/array.cc +40 -0
- package/vendor/node-addon-api/test/basic_types/array.js +35 -0
- package/vendor/node-addon-api/test/basic_types/boolean.cc +38 -0
- package/vendor/node-addon-api/test/basic_types/boolean.js +35 -0
- package/vendor/node-addon-api/test/basic_types/number.cc +99 -0
- package/vendor/node-addon-api/test/basic_types/number.js +114 -0
- package/vendor/node-addon-api/test/basic_types/value.cc +120 -0
- package/vendor/node-addon-api/test/basic_types/value.js +133 -0
- package/vendor/node-addon-api/test/bigint.cc +91 -0
- package/vendor/node-addon-api/test/bigint.js +53 -0
- package/vendor/node-addon-api/test/binding-swallowexcept.cc +12 -0
- package/vendor/node-addon-api/test/binding.cc +173 -0
- package/vendor/node-addon-api/test/binding.gyp +124 -0
- package/vendor/node-addon-api/test/buffer.cc +183 -0
- package/vendor/node-addon-api/test/buffer.js +69 -0
- package/vendor/node-addon-api/test/callbackscope.cc +22 -0
- package/vendor/node-addon-api/test/callbackscope.js +49 -0
- package/vendor/node-addon-api/test/common/index.js +114 -0
- package/vendor/node-addon-api/test/common/test_helper.h +71 -0
- package/vendor/node-addon-api/test/dataview/dataview.cc +48 -0
- package/vendor/node-addon-api/test/dataview/dataview.js +35 -0
- package/vendor/node-addon-api/test/dataview/dataview_read_write.cc +115 -0
- package/vendor/node-addon-api/test/dataview/dataview_read_write.js +90 -0
- package/vendor/node-addon-api/test/date.cc +44 -0
- package/vendor/node-addon-api/test/date.js +18 -0
- package/vendor/node-addon-api/test/env_cleanup.cc +88 -0
- package/vendor/node-addon-api/test/env_cleanup.js +56 -0
- package/vendor/node-addon-api/test/error.cc +287 -0
- package/vendor/node-addon-api/test/error.js +81 -0
- package/vendor/node-addon-api/test/error_handling_for_primitives.cc +13 -0
- package/vendor/node-addon-api/test/error_handling_for_primitives.js +29 -0
- package/vendor/node-addon-api/test/error_terminating_environment.js +95 -0
- package/vendor/node-addon-api/test/external.cc +81 -0
- package/vendor/node-addon-api/test/external.js +88 -0
- package/vendor/node-addon-api/test/function.cc +324 -0
- package/vendor/node-addon-api/test/function.js +133 -0
- package/vendor/node-addon-api/test/function_reference.cc +202 -0
- package/vendor/node-addon-api/test/function_reference.js +157 -0
- package/vendor/node-addon-api/test/globalObject/global_object.cc +61 -0
- package/vendor/node-addon-api/test/globalObject/global_object_delete_property.cc +31 -0
- package/vendor/node-addon-api/test/globalObject/global_object_delete_property.js +61 -0
- package/vendor/node-addon-api/test/globalObject/global_object_get_property.cc +40 -0
- package/vendor/node-addon-api/test/globalObject/global_object_get_property.js +57 -0
- package/vendor/node-addon-api/test/globalObject/global_object_has_own_property.cc +28 -0
- package/vendor/node-addon-api/test/globalObject/global_object_has_own_property.js +48 -0
- package/vendor/node-addon-api/test/globalObject/global_object_set_property.cc +31 -0
- package/vendor/node-addon-api/test/globalObject/global_object_set_property.js +58 -0
- package/vendor/node-addon-api/test/handlescope.cc +60 -0
- package/vendor/node-addon-api/test/handlescope.js +14 -0
- package/vendor/node-addon-api/test/index.js +159 -0
- package/vendor/node-addon-api/test/maybe/check.cc +23 -0
- package/vendor/node-addon-api/test/maybe/index.js +38 -0
- package/vendor/node-addon-api/test/memory_management.cc +17 -0
- package/vendor/node-addon-api/test/memory_management.js +9 -0
- package/vendor/node-addon-api/test/movable_callbacks.cc +23 -0
- package/vendor/node-addon-api/test/movable_callbacks.js +21 -0
- package/vendor/node-addon-api/test/name.cc +108 -0
- package/vendor/node-addon-api/test/name.js +59 -0
- package/vendor/node-addon-api/test/napi_child.js +14 -0
- package/vendor/node-addon-api/test/object/delete_property.cc +38 -0
- package/vendor/node-addon-api/test/object/delete_property.js +41 -0
- package/vendor/node-addon-api/test/object/finalizer.cc +29 -0
- package/vendor/node-addon-api/test/object/finalizer.js +28 -0
- package/vendor/node-addon-api/test/object/get_property.cc +34 -0
- package/vendor/node-addon-api/test/object/get_property.js +40 -0
- package/vendor/node-addon-api/test/object/has_own_property.cc +34 -0
- package/vendor/node-addon-api/test/object/has_own_property.js +34 -0
- package/vendor/node-addon-api/test/object/has_property.cc +38 -0
- package/vendor/node-addon-api/test/object/has_property.js +37 -0
- package/vendor/node-addon-api/test/object/object.cc +350 -0
- package/vendor/node-addon-api/test/object/object.js +217 -0
- package/vendor/node-addon-api/test/object/object_deprecated.cc +66 -0
- package/vendor/node-addon-api/test/object/object_deprecated.js +47 -0
- package/vendor/node-addon-api/test/object/object_freeze_seal.cc +25 -0
- package/vendor/node-addon-api/test/object/object_freeze_seal.js +61 -0
- package/vendor/node-addon-api/test/object/set_property.cc +45 -0
- package/vendor/node-addon-api/test/object/set_property.js +30 -0
- package/vendor/node-addon-api/test/object/subscript_operator.cc +58 -0
- package/vendor/node-addon-api/test/object/subscript_operator.js +17 -0
- package/vendor/node-addon-api/test/object_reference.cc +219 -0
- package/vendor/node-addon-api/test/object_reference.js +259 -0
- package/vendor/node-addon-api/test/objectwrap.cc +268 -0
- package/vendor/node-addon-api/test/objectwrap.js +284 -0
- package/vendor/node-addon-api/test/objectwrap_constructor_exception.cc +26 -0
- package/vendor/node-addon-api/test/objectwrap_constructor_exception.js +18 -0
- package/vendor/node-addon-api/test/objectwrap_function.cc +45 -0
- package/vendor/node-addon-api/test/objectwrap_function.js +22 -0
- package/vendor/node-addon-api/test/objectwrap_multiple_inheritance.cc +30 -0
- package/vendor/node-addon-api/test/objectwrap_multiple_inheritance.js +13 -0
- package/vendor/node-addon-api/test/objectwrap_removewrap.cc +45 -0
- package/vendor/node-addon-api/test/objectwrap_removewrap.js +40 -0
- package/vendor/node-addon-api/test/objectwrap_worker_thread.js +19 -0
- package/vendor/node-addon-api/test/promise.cc +29 -0
- package/vendor/node-addon-api/test/promise.js +18 -0
- package/vendor/node-addon-api/test/reference.cc +24 -0
- package/vendor/node-addon-api/test/reference.js +14 -0
- package/vendor/node-addon-api/test/run_script.cc +56 -0
- package/vendor/node-addon-api/test/run_script.js +45 -0
- package/vendor/node-addon-api/test/symbol.cc +79 -0
- package/vendor/node-addon-api/test/symbol.js +73 -0
- package/vendor/node-addon-api/test/testUtil.js +54 -0
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function.cc +195 -0
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function.js +188 -0
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_ctx.cc +63 -0
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_ctx.js +12 -0
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_existing_tsfn.cc +115 -0
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_existing_tsfn.js +14 -0
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_ptr.cc +26 -0
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_ptr.js +7 -0
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_sum.cc +225 -0
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_sum.js +59 -0
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_unref.cc +42 -0
- package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_unref.js +53 -0
- package/vendor/node-addon-api/test/thunking_manual.cc +140 -0
- package/vendor/node-addon-api/test/thunking_manual.js +17 -0
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function.cc +215 -0
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function.js +188 -0
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_ctx.cc +68 -0
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_ctx.js +12 -0
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_existing_tsfn.cc +127 -0
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_existing_tsfn.js +14 -0
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_ptr.cc +28 -0
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_ptr.js +7 -0
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_sum.cc +237 -0
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_sum.js +59 -0
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_unref.cc +53 -0
- package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_unref.js +53 -0
- package/vendor/node-addon-api/test/typedarray-bigint.js +58 -0
- package/vendor/node-addon-api/test/typedarray.cc +216 -0
- package/vendor/node-addon-api/test/typedarray.js +69 -0
- package/vendor/node-addon-api/test/version_management.cc +27 -0
- package/vendor/node-addon-api/test/version_management.js +31 -0
- package/vendor/node-addon-api/unit-test/README.md +28 -0
- package/vendor/node-addon-api/unit-test/binding-file-template.js +39 -0
- package/vendor/node-addon-api/unit-test/binding.gyp +72 -0
- package/vendor/node-addon-api/unit-test/exceptions.js +32 -0
- package/vendor/node-addon-api/unit-test/generate-binding-cc.js +61 -0
- package/vendor/node-addon-api/unit-test/injectTestParams.js +101 -0
- package/vendor/node-addon-api/unit-test/listOfTestModules.js +88 -0
- package/vendor/node-addon-api/unit-test/matchModules.js +65 -0
- package/vendor/node-addon-api/unit-test/setup.js +13 -0
- package/vendor/node-addon-api/unit-test/spawnTask.js +26 -0
- package/vendor/node-addon-api/unit-test/test.js +30 -0
- package/build/qemu/1.1.0-beta.0/koffi_darwin_x64.tar.gz +0 -0
- package/build/qemu/1.1.0-beta.0/koffi_freebsd_arm64.tar.gz +0 -0
- package/build/qemu/1.1.0-beta.0/koffi_freebsd_ia32.tar.gz +0 -0
- package/build/qemu/1.1.0-beta.0/koffi_freebsd_x64.tar.gz +0 -0
- package/build/qemu/1.1.0-beta.0/koffi_linux_arm.tar.gz +0 -0
- package/build/qemu/1.1.0-beta.0/koffi_linux_arm64.tar.gz +0 -0
- package/build/qemu/1.1.0-beta.0/koffi_linux_ia32.tar.gz +0 -0
- package/build/qemu/1.1.0-beta.0/koffi_linux_x64.tar.gz +0 -0
- package/build/qemu/1.1.0-beta.0/koffi_win32_ia32.tar.gz +0 -0
- package/build/qemu/1.1.0-beta.0/koffi_win32_x64.tar.gz +0 -0
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
#if (NAPI_VERSION > 5)
|
|
2
|
+
#include <stdio.h>
|
|
3
|
+
#include "napi.h"
|
|
4
|
+
#include "test_helper.h"
|
|
5
|
+
|
|
6
|
+
// An overly elaborate way to get/set a boolean stored in the instance data:
|
|
7
|
+
// 0. A boolean named "verbose" is stored in the instance data. The constructor
|
|
8
|
+
// for JS `VerboseIndicator` instances is also stored in the instance data.
|
|
9
|
+
// 1. Add a property named "verbose" onto exports served by a getter/setter.
|
|
10
|
+
// 2. The getter returns a object of type VerboseIndicator, which itself has a
|
|
11
|
+
// property named "verbose", also served by a getter/setter:
|
|
12
|
+
// * The getter returns a boolean, indicating whether "verbose" is set.
|
|
13
|
+
// * The setter sets "verbose" on the instance data.
|
|
14
|
+
// 3. The setter sets "verbose" on the instance data.
|
|
15
|
+
|
|
16
|
+
class Addon {
|
|
17
|
+
public:
|
|
18
|
+
class VerboseIndicator : public Napi::ObjectWrap<VerboseIndicator> {
|
|
19
|
+
public:
|
|
20
|
+
VerboseIndicator(const Napi::CallbackInfo& info):
|
|
21
|
+
Napi::ObjectWrap<VerboseIndicator>(info) {
|
|
22
|
+
info.This().As<Napi::Object>()["verbose"] =
|
|
23
|
+
Napi::Boolean::New(info.Env(),
|
|
24
|
+
info.Env().GetInstanceData<Addon>()->verbose);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
Napi::Value Getter(const Napi::CallbackInfo& info) {
|
|
28
|
+
return Napi::Boolean::New(info.Env(),
|
|
29
|
+
info.Env().GetInstanceData<Addon>()->verbose);
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
void Setter(const Napi::CallbackInfo& info, const Napi::Value& val) {
|
|
33
|
+
info.Env().GetInstanceData<Addon>()->verbose = val.As<Napi::Boolean>();
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
static Napi::FunctionReference Init(Napi::Env env) {
|
|
37
|
+
return Napi::Persistent(DefineClass(env, "VerboseIndicator", {
|
|
38
|
+
InstanceAccessor<
|
|
39
|
+
&VerboseIndicator::Getter,
|
|
40
|
+
&VerboseIndicator::Setter>("verbose")
|
|
41
|
+
}));
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
static Napi::Value Getter(const Napi::CallbackInfo& info) {
|
|
46
|
+
return MaybeUnwrap(
|
|
47
|
+
info.Env().GetInstanceData<Addon>()->VerboseIndicator.New({}));
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
static void Setter(const Napi::CallbackInfo& info) {
|
|
51
|
+
info.Env().GetInstanceData<Addon>()->verbose = info[0].As<Napi::Boolean>();
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
Addon(Napi::Env env): VerboseIndicator(VerboseIndicator::Init(env)) {}
|
|
55
|
+
~Addon() {
|
|
56
|
+
if (verbose) {
|
|
57
|
+
fprintf(stderr, "addon_data: Addon::~Addon\n");
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
static void DeleteAddon(Napi::Env, Addon* addon, uint32_t* hint) {
|
|
62
|
+
delete addon;
|
|
63
|
+
fprintf(stderr, "hint: %d\n", *hint);
|
|
64
|
+
delete hint;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
static Napi::Object Init(Napi::Env env, Napi::Value jshint) {
|
|
68
|
+
if (!jshint.IsNumber()) {
|
|
69
|
+
NAPI_THROW(Napi::Error::New(env, "Expected number"), Napi::Object());
|
|
70
|
+
}
|
|
71
|
+
uint32_t hint = jshint.As<Napi::Number>();
|
|
72
|
+
if (hint == 0)
|
|
73
|
+
env.SetInstanceData(new Addon(env));
|
|
74
|
+
else
|
|
75
|
+
env.SetInstanceData<Addon, uint32_t, DeleteAddon>(new Addon(env),
|
|
76
|
+
new uint32_t(hint));
|
|
77
|
+
Napi::Object result = Napi::Object::New(env);
|
|
78
|
+
result.DefineProperties({
|
|
79
|
+
Napi::PropertyDescriptor::Accessor<Getter, Setter>("verbose"),
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
return result;
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
private:
|
|
86
|
+
bool verbose = false;
|
|
87
|
+
Napi::FunctionReference VerboseIndicator;
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
// We use an addon factory so we can cover both the case where there is an
|
|
91
|
+
// instance data hint and the case where there isn't.
|
|
92
|
+
static Napi::Value AddonFactory(const Napi::CallbackInfo& info) {
|
|
93
|
+
return Addon::Init(info.Env(), info[0]);
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
Napi::Object InitAddonData(Napi::Env env) {
|
|
97
|
+
return Napi::Function::New(env, AddonFactory);
|
|
98
|
+
}
|
|
99
|
+
#endif // (NAPI_VERSION > 5)
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const assert = require('assert');
|
|
4
|
+
const { spawn } = require('child_process');
|
|
5
|
+
const readline = require('readline');
|
|
6
|
+
|
|
7
|
+
module.exports = require('./common').runTestWithBindingPath(test);
|
|
8
|
+
|
|
9
|
+
// Make sure the instance data finalizer is called at process exit. If the hint
|
|
10
|
+
// is non-zero, it will be printed out by the child process.
|
|
11
|
+
function testFinalizer (bindingName, hint, expected) {
|
|
12
|
+
return new Promise((resolve) => {
|
|
13
|
+
bindingName = bindingName.split('\\').join('\\\\');
|
|
14
|
+
const child = spawn(process.execPath, [
|
|
15
|
+
'-e',
|
|
16
|
+
`require('${bindingName}').addon_data(${hint}).verbose = true;`
|
|
17
|
+
]);
|
|
18
|
+
const actual = [];
|
|
19
|
+
readline
|
|
20
|
+
.createInterface({ input: child.stderr })
|
|
21
|
+
.on('line', (line) => {
|
|
22
|
+
if (expected.indexOf(line) >= 0) {
|
|
23
|
+
actual.push(line);
|
|
24
|
+
}
|
|
25
|
+
})
|
|
26
|
+
.on('close', () => {
|
|
27
|
+
assert.deepStrictEqual(expected, actual);
|
|
28
|
+
resolve();
|
|
29
|
+
});
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
async function test (bindingName) {
|
|
34
|
+
const binding = require(bindingName).addon_data(0);
|
|
35
|
+
|
|
36
|
+
// Make sure it is possible to get/set instance data.
|
|
37
|
+
assert.strictEqual(binding.verbose.verbose, false);
|
|
38
|
+
binding.verbose = true;
|
|
39
|
+
assert.strictEqual(binding.verbose.verbose, true);
|
|
40
|
+
binding.verbose = false;
|
|
41
|
+
assert.strictEqual(binding.verbose.verbose, false);
|
|
42
|
+
|
|
43
|
+
await testFinalizer(bindingName, 0, ['addon_data: Addon::~Addon']);
|
|
44
|
+
await testFinalizer(bindingName, 42,
|
|
45
|
+
['addon_data: Addon::~Addon', 'hint: 42']);
|
|
46
|
+
}
|
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
#include "napi.h"
|
|
2
|
+
|
|
3
|
+
using namespace Napi;
|
|
4
|
+
|
|
5
|
+
namespace {
|
|
6
|
+
|
|
7
|
+
const size_t testLength = 4;
|
|
8
|
+
uint8_t testData[testLength];
|
|
9
|
+
int finalizeCount = 0;
|
|
10
|
+
|
|
11
|
+
void InitData(uint8_t* data, size_t length) {
|
|
12
|
+
for (size_t i = 0; i < length; i++) {
|
|
13
|
+
data[i] = static_cast<uint8_t>(i);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
bool VerifyData(uint8_t* data, size_t length) {
|
|
18
|
+
for (size_t i = 0; i < length; i++) {
|
|
19
|
+
if (data[i] != static_cast<uint8_t>(i)) {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
Value CreateBuffer(const CallbackInfo& info) {
|
|
27
|
+
ArrayBuffer buffer = ArrayBuffer::New(info.Env(), testLength);
|
|
28
|
+
|
|
29
|
+
if (buffer.ByteLength() != testLength) {
|
|
30
|
+
Error::New(info.Env(), "Incorrect buffer length.")
|
|
31
|
+
.ThrowAsJavaScriptException();
|
|
32
|
+
return Value();
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
InitData(static_cast<uint8_t*>(buffer.Data()), testLength);
|
|
36
|
+
return buffer;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
Value CreateExternalBuffer(const CallbackInfo& info) {
|
|
40
|
+
finalizeCount = 0;
|
|
41
|
+
|
|
42
|
+
ArrayBuffer buffer = ArrayBuffer::New(info.Env(), testData, testLength);
|
|
43
|
+
|
|
44
|
+
if (buffer.ByteLength() != testLength) {
|
|
45
|
+
Error::New(info.Env(), "Incorrect buffer length.")
|
|
46
|
+
.ThrowAsJavaScriptException();
|
|
47
|
+
return Value();
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
if (buffer.Data() != testData) {
|
|
51
|
+
Error::New(info.Env(), "Incorrect buffer data.")
|
|
52
|
+
.ThrowAsJavaScriptException();
|
|
53
|
+
return Value();
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
InitData(testData, testLength);
|
|
57
|
+
return buffer;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
Value CreateExternalBufferWithFinalize(const CallbackInfo& info) {
|
|
61
|
+
finalizeCount = 0;
|
|
62
|
+
|
|
63
|
+
uint8_t* data = new uint8_t[testLength];
|
|
64
|
+
|
|
65
|
+
ArrayBuffer buffer = ArrayBuffer::New(
|
|
66
|
+
info.Env(), data, testLength, [](Env /*env*/, void* finalizeData) {
|
|
67
|
+
delete[] static_cast<uint8_t*>(finalizeData);
|
|
68
|
+
finalizeCount++;
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
if (buffer.ByteLength() != testLength) {
|
|
72
|
+
Error::New(info.Env(), "Incorrect buffer length.")
|
|
73
|
+
.ThrowAsJavaScriptException();
|
|
74
|
+
return Value();
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
if (buffer.Data() != data) {
|
|
78
|
+
Error::New(info.Env(), "Incorrect buffer data.")
|
|
79
|
+
.ThrowAsJavaScriptException();
|
|
80
|
+
return Value();
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
InitData(data, testLength);
|
|
84
|
+
return buffer;
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
Value CreateExternalBufferWithFinalizeHint(const CallbackInfo& info) {
|
|
88
|
+
finalizeCount = 0;
|
|
89
|
+
|
|
90
|
+
uint8_t* data = new uint8_t[testLength];
|
|
91
|
+
|
|
92
|
+
char* hint = nullptr;
|
|
93
|
+
ArrayBuffer buffer = ArrayBuffer::New(
|
|
94
|
+
info.Env(),
|
|
95
|
+
data,
|
|
96
|
+
testLength,
|
|
97
|
+
[](Env /*env*/, void* finalizeData, char* /*finalizeHint*/) {
|
|
98
|
+
delete[] static_cast<uint8_t*>(finalizeData);
|
|
99
|
+
finalizeCount++;
|
|
100
|
+
},
|
|
101
|
+
hint);
|
|
102
|
+
|
|
103
|
+
if (buffer.ByteLength() != testLength) {
|
|
104
|
+
Error::New(info.Env(), "Incorrect buffer length.")
|
|
105
|
+
.ThrowAsJavaScriptException();
|
|
106
|
+
return Value();
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
if (buffer.Data() != data) {
|
|
110
|
+
Error::New(info.Env(), "Incorrect buffer data.")
|
|
111
|
+
.ThrowAsJavaScriptException();
|
|
112
|
+
return Value();
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
InitData(data, testLength);
|
|
116
|
+
return buffer;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
void CheckBuffer(const CallbackInfo& info) {
|
|
120
|
+
if (!info[0].IsArrayBuffer()) {
|
|
121
|
+
Error::New(info.Env(), "A buffer was expected.")
|
|
122
|
+
.ThrowAsJavaScriptException();
|
|
123
|
+
return;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
ArrayBuffer buffer = info[0].As<ArrayBuffer>();
|
|
127
|
+
|
|
128
|
+
if (buffer.ByteLength() != testLength) {
|
|
129
|
+
Error::New(info.Env(), "Incorrect buffer length.")
|
|
130
|
+
.ThrowAsJavaScriptException();
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
if (!VerifyData(static_cast<uint8_t*>(buffer.Data()), testLength)) {
|
|
135
|
+
Error::New(info.Env(), "Incorrect buffer data.")
|
|
136
|
+
.ThrowAsJavaScriptException();
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
Value GetFinalizeCount(const CallbackInfo& info) {
|
|
142
|
+
return Number::New(info.Env(), finalizeCount);
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
Value CreateBufferWithConstructor(const CallbackInfo& info) {
|
|
146
|
+
ArrayBuffer buffer = ArrayBuffer::New(info.Env(), testLength);
|
|
147
|
+
if (buffer.ByteLength() != testLength) {
|
|
148
|
+
Error::New(info.Env(), "Incorrect buffer length.")
|
|
149
|
+
.ThrowAsJavaScriptException();
|
|
150
|
+
return Value();
|
|
151
|
+
}
|
|
152
|
+
InitData(static_cast<uint8_t*>(buffer.Data()), testLength);
|
|
153
|
+
ArrayBuffer buffer2(info.Env(), buffer);
|
|
154
|
+
return buffer2;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
Value CheckEmptyBuffer(const CallbackInfo& info) {
|
|
158
|
+
ArrayBuffer buffer;
|
|
159
|
+
return Boolean::New(info.Env(), buffer.IsEmpty());
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
void CheckDetachUpdatesData(const CallbackInfo& info) {
|
|
163
|
+
if (!info[0].IsArrayBuffer()) {
|
|
164
|
+
Error::New(info.Env(), "A buffer was expected.")
|
|
165
|
+
.ThrowAsJavaScriptException();
|
|
166
|
+
return;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
ArrayBuffer buffer = info[0].As<ArrayBuffer>();
|
|
170
|
+
|
|
171
|
+
// This potentially causes the buffer to cache its data pointer and length.
|
|
172
|
+
buffer.Data();
|
|
173
|
+
buffer.ByteLength();
|
|
174
|
+
|
|
175
|
+
#if NAPI_VERSION >= 7
|
|
176
|
+
if (buffer.IsDetached()) {
|
|
177
|
+
Error::New(info.Env(), "Buffer should not be detached.")
|
|
178
|
+
.ThrowAsJavaScriptException();
|
|
179
|
+
return;
|
|
180
|
+
}
|
|
181
|
+
#endif
|
|
182
|
+
|
|
183
|
+
if (info.Length() == 2) {
|
|
184
|
+
// Detach externally (in JavaScript).
|
|
185
|
+
if (!info[1].IsFunction()) {
|
|
186
|
+
Error::New(info.Env(), "A function was expected.")
|
|
187
|
+
.ThrowAsJavaScriptException();
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
Function detach = info[1].As<Function>();
|
|
192
|
+
detach.Call({});
|
|
193
|
+
} else {
|
|
194
|
+
#if NAPI_VERSION >= 7
|
|
195
|
+
// Detach directly.
|
|
196
|
+
buffer.Detach();
|
|
197
|
+
#else
|
|
198
|
+
return;
|
|
199
|
+
#endif
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
#if NAPI_VERSION >= 7
|
|
203
|
+
if (!buffer.IsDetached()) {
|
|
204
|
+
Error::New(info.Env(), "Buffer should be detached.")
|
|
205
|
+
.ThrowAsJavaScriptException();
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
#endif
|
|
209
|
+
|
|
210
|
+
if (buffer.Data() != nullptr) {
|
|
211
|
+
Error::New(info.Env(), "Incorrect data pointer.")
|
|
212
|
+
.ThrowAsJavaScriptException();
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
if (buffer.ByteLength() != 0) {
|
|
217
|
+
Error::New(info.Env(), "Incorrect buffer length.")
|
|
218
|
+
.ThrowAsJavaScriptException();
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
} // end anonymous namespace
|
|
224
|
+
|
|
225
|
+
Object InitArrayBuffer(Env env) {
|
|
226
|
+
Object exports = Object::New(env);
|
|
227
|
+
|
|
228
|
+
exports["createBuffer"] = Function::New(env, CreateBuffer);
|
|
229
|
+
exports["createExternalBuffer"] = Function::New(env, CreateExternalBuffer);
|
|
230
|
+
exports["createExternalBufferWithFinalize"] =
|
|
231
|
+
Function::New(env, CreateExternalBufferWithFinalize);
|
|
232
|
+
exports["createExternalBufferWithFinalizeHint"] =
|
|
233
|
+
Function::New(env, CreateExternalBufferWithFinalizeHint);
|
|
234
|
+
exports["checkBuffer"] = Function::New(env, CheckBuffer);
|
|
235
|
+
exports["getFinalizeCount"] = Function::New(env, GetFinalizeCount);
|
|
236
|
+
exports["createBufferWithConstructor"] =
|
|
237
|
+
Function::New(env, CreateBufferWithConstructor);
|
|
238
|
+
exports["checkEmptyBuffer"] = Function::New(env, CheckEmptyBuffer);
|
|
239
|
+
exports["checkDetachUpdatesData"] =
|
|
240
|
+
Function::New(env, CheckDetachUpdatesData);
|
|
241
|
+
|
|
242
|
+
return exports;
|
|
243
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const assert = require('assert');
|
|
4
|
+
const testUtil = require('./testUtil');
|
|
5
|
+
|
|
6
|
+
module.exports = require('./common').runTest(test);
|
|
7
|
+
|
|
8
|
+
function test(binding) {
|
|
9
|
+
return testUtil.runGCTests([
|
|
10
|
+
'Internal ArrayBuffer',
|
|
11
|
+
() => {
|
|
12
|
+
const test = binding.arraybuffer.createBuffer();
|
|
13
|
+
binding.arraybuffer.checkBuffer(test);
|
|
14
|
+
assert.ok(test instanceof ArrayBuffer);
|
|
15
|
+
|
|
16
|
+
const test2 = test.slice(0);
|
|
17
|
+
binding.arraybuffer.checkBuffer(test2);
|
|
18
|
+
},
|
|
19
|
+
|
|
20
|
+
'External ArrayBuffer',
|
|
21
|
+
() => {
|
|
22
|
+
const test = binding.arraybuffer.createExternalBuffer();
|
|
23
|
+
binding.arraybuffer.checkBuffer(test);
|
|
24
|
+
assert.ok(test instanceof ArrayBuffer);
|
|
25
|
+
assert.strictEqual(0, binding.arraybuffer.getFinalizeCount());
|
|
26
|
+
},
|
|
27
|
+
|
|
28
|
+
() => assert.strictEqual(0, binding.arraybuffer.getFinalizeCount()),
|
|
29
|
+
|
|
30
|
+
'External ArrayBuffer with finalizer',
|
|
31
|
+
() => {
|
|
32
|
+
const test = binding.arraybuffer.createExternalBufferWithFinalize();
|
|
33
|
+
binding.arraybuffer.checkBuffer(test);
|
|
34
|
+
assert.ok(test instanceof ArrayBuffer);
|
|
35
|
+
assert.strictEqual(0, binding.arraybuffer.getFinalizeCount());
|
|
36
|
+
},
|
|
37
|
+
|
|
38
|
+
() => assert.strictEqual(1, binding.arraybuffer.getFinalizeCount()),
|
|
39
|
+
|
|
40
|
+
'External ArrayBuffer with finalizer hint',
|
|
41
|
+
() => {
|
|
42
|
+
const test = binding.arraybuffer.createExternalBufferWithFinalizeHint();
|
|
43
|
+
binding.arraybuffer.checkBuffer(test);
|
|
44
|
+
assert.ok(test instanceof ArrayBuffer);
|
|
45
|
+
assert.strictEqual(0, binding.arraybuffer.getFinalizeCount());
|
|
46
|
+
},
|
|
47
|
+
|
|
48
|
+
() => assert.strictEqual(1, binding.arraybuffer.getFinalizeCount()),
|
|
49
|
+
|
|
50
|
+
'ArrayBuffer with constructor',
|
|
51
|
+
() => {
|
|
52
|
+
assert.strictEqual(true, binding.arraybuffer.checkEmptyBuffer());
|
|
53
|
+
const test = binding.arraybuffer.createBufferWithConstructor();
|
|
54
|
+
binding.arraybuffer.checkBuffer(test);
|
|
55
|
+
assert.ok(test instanceof ArrayBuffer);
|
|
56
|
+
},
|
|
57
|
+
|
|
58
|
+
'ArrayBuffer updates data pointer and length when detached',
|
|
59
|
+
() => {
|
|
60
|
+
// Detach the ArrayBuffer in JavaScript.
|
|
61
|
+
const mem = new WebAssembly.Memory({ initial: 1 });
|
|
62
|
+
binding.arraybuffer.checkDetachUpdatesData(mem.buffer, () => mem.grow(1));
|
|
63
|
+
|
|
64
|
+
// Let C++ detach the ArrayBuffer.
|
|
65
|
+
const extBuffer = binding.arraybuffer.createExternalBuffer();
|
|
66
|
+
binding.arraybuffer.checkDetachUpdatesData(extBuffer);
|
|
67
|
+
},
|
|
68
|
+
]);
|
|
69
|
+
}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
#include "napi.h"
|
|
2
|
+
|
|
3
|
+
using namespace Napi;
|
|
4
|
+
|
|
5
|
+
namespace {
|
|
6
|
+
|
|
7
|
+
static void MakeCallback(const CallbackInfo& info) {
|
|
8
|
+
Function callback = info[0].As<Function>();
|
|
9
|
+
Object resource = info[1].As<Object>();
|
|
10
|
+
AsyncContext context(info.Env(), "async_context_test", resource);
|
|
11
|
+
callback.MakeCallback(
|
|
12
|
+
Object::New(info.Env()), std::initializer_list<napi_value>{}, context);
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
static void MakeCallbackNoResource(const CallbackInfo& info) {
|
|
16
|
+
Function callback = info[0].As<Function>();
|
|
17
|
+
AsyncContext context(info.Env(), "async_context_no_res_test");
|
|
18
|
+
callback.MakeCallback(
|
|
19
|
+
Object::New(info.Env()), std::initializer_list<napi_value>{}, context);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
static Boolean AssertAsyncContextReturnCorrectEnv(const CallbackInfo& info) {
|
|
23
|
+
AsyncContext context(info.Env(), "empty_context_test");
|
|
24
|
+
return Boolean::New(info.Env(), context.Env() == info.Env());
|
|
25
|
+
}
|
|
26
|
+
} // end anonymous namespace
|
|
27
|
+
|
|
28
|
+
Object InitAsyncContext(Env env) {
|
|
29
|
+
Object exports = Object::New(env);
|
|
30
|
+
exports["makeCallback"] = Function::New(env, MakeCallback);
|
|
31
|
+
exports["makeCallbackNoResource"] =
|
|
32
|
+
Function::New(env, MakeCallbackNoResource);
|
|
33
|
+
exports["asyncCxtReturnCorrectEnv"] =
|
|
34
|
+
Function::New(env, AssertAsyncContextReturnCorrectEnv);
|
|
35
|
+
return exports;
|
|
36
|
+
}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const assert = require('assert');
|
|
4
|
+
const common = require('./common');
|
|
5
|
+
|
|
6
|
+
// we only check async hooks on 8.x an higher were
|
|
7
|
+
// they are closer to working properly
|
|
8
|
+
const nodeVersion = process.versions.node.split('.')[0];
|
|
9
|
+
let asyncHooks;
|
|
10
|
+
function checkAsyncHooks () {
|
|
11
|
+
if (nodeVersion >= 8) {
|
|
12
|
+
if (asyncHooks === undefined) {
|
|
13
|
+
asyncHooks = require('async_hooks');
|
|
14
|
+
}
|
|
15
|
+
return true;
|
|
16
|
+
}
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
module.exports = common.runTest(test);
|
|
21
|
+
|
|
22
|
+
function installAsyncHooksForTest (resName) {
|
|
23
|
+
return new Promise((resolve, reject) => {
|
|
24
|
+
let id;
|
|
25
|
+
const events = [];
|
|
26
|
+
/**
|
|
27
|
+
* TODO(legendecas): investigate why resolving & disabling hooks in
|
|
28
|
+
* destroy callback causing crash with case 'callbackscope.js'.
|
|
29
|
+
*/
|
|
30
|
+
let destroyed = false;
|
|
31
|
+
const hook = asyncHooks.createHook({
|
|
32
|
+
init (asyncId, type, triggerAsyncId, resource) {
|
|
33
|
+
if (id === undefined && type === resName) {
|
|
34
|
+
id = asyncId;
|
|
35
|
+
events.push({ eventName: 'init', type, triggerAsyncId, resource });
|
|
36
|
+
}
|
|
37
|
+
},
|
|
38
|
+
before (asyncId) {
|
|
39
|
+
if (asyncId === id) {
|
|
40
|
+
events.push({ eventName: 'before' });
|
|
41
|
+
}
|
|
42
|
+
},
|
|
43
|
+
after (asyncId) {
|
|
44
|
+
if (asyncId === id) {
|
|
45
|
+
events.push({ eventName: 'after' });
|
|
46
|
+
}
|
|
47
|
+
},
|
|
48
|
+
destroy (asyncId) {
|
|
49
|
+
if (asyncId === id) {
|
|
50
|
+
events.push({ eventName: 'destroy' });
|
|
51
|
+
destroyed = true;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}).enable();
|
|
55
|
+
|
|
56
|
+
const interval = setInterval(() => {
|
|
57
|
+
if (destroyed) {
|
|
58
|
+
hook.disable();
|
|
59
|
+
clearInterval(interval);
|
|
60
|
+
resolve(events);
|
|
61
|
+
}
|
|
62
|
+
}, 10);
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
async function makeCallbackWithResource (binding) {
|
|
67
|
+
const hooks = installAsyncHooksForTest('async_context_test');
|
|
68
|
+
const triggerAsyncId = asyncHooks.executionAsyncId();
|
|
69
|
+
await new Promise((resolve, reject) => {
|
|
70
|
+
binding.asynccontext.makeCallback(common.mustCall(), { foo: 'foo' });
|
|
71
|
+
hooks.then(actual => {
|
|
72
|
+
assert.deepStrictEqual(actual, [
|
|
73
|
+
{
|
|
74
|
+
eventName: 'init',
|
|
75
|
+
type: 'async_context_test',
|
|
76
|
+
triggerAsyncId: triggerAsyncId,
|
|
77
|
+
resource: { foo: 'foo' }
|
|
78
|
+
},
|
|
79
|
+
{ eventName: 'before' },
|
|
80
|
+
{ eventName: 'after' },
|
|
81
|
+
{ eventName: 'destroy' }
|
|
82
|
+
]);
|
|
83
|
+
}).catch(common.mustNotCall());
|
|
84
|
+
resolve();
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
async function makeCallbackWithoutResource (binding) {
|
|
89
|
+
const hooks = installAsyncHooksForTest('async_context_no_res_test');
|
|
90
|
+
const triggerAsyncId = asyncHooks.executionAsyncId();
|
|
91
|
+
await new Promise((resolve, reject) => {
|
|
92
|
+
binding.asynccontext.makeCallbackNoResource(common.mustCall());
|
|
93
|
+
hooks.then(actual => {
|
|
94
|
+
assert.deepStrictEqual(actual, [
|
|
95
|
+
{
|
|
96
|
+
eventName: 'init',
|
|
97
|
+
type: 'async_context_no_res_test',
|
|
98
|
+
triggerAsyncId: triggerAsyncId,
|
|
99
|
+
resource: { }
|
|
100
|
+
},
|
|
101
|
+
{ eventName: 'before' },
|
|
102
|
+
{ eventName: 'after' },
|
|
103
|
+
{ eventName: 'destroy' }
|
|
104
|
+
]);
|
|
105
|
+
}).catch(common.mustNotCall());
|
|
106
|
+
resolve();
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
function assertAsyncContextReturnsCorrectEnv (binding) {
|
|
111
|
+
assert.strictEqual(binding.asynccontext.asyncCxtReturnCorrectEnv(), true);
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
async function test (binding) {
|
|
115
|
+
if (!checkAsyncHooks()) {
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
await makeCallbackWithResource(binding);
|
|
120
|
+
await makeCallbackWithoutResource(binding);
|
|
121
|
+
assertAsyncContextReturnsCorrectEnv(binding);
|
|
122
|
+
}
|