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.
Files changed (268) hide show
  1. package/README.md +51 -22
  2. package/build/qemu/1.1.0-beta.1/koffi_darwin_x64.tar.gz +0 -0
  3. package/build/qemu/1.1.0-beta.1/koffi_freebsd_arm64.tar.gz +0 -0
  4. package/build/qemu/1.1.0-beta.1/koffi_freebsd_ia32.tar.gz +0 -0
  5. package/build/qemu/1.1.0-beta.1/koffi_freebsd_x64.tar.gz +0 -0
  6. package/build/qemu/1.1.0-beta.1/koffi_linux_arm.tar.gz +0 -0
  7. package/build/qemu/1.1.0-beta.1/koffi_linux_arm64.tar.gz +0 -0
  8. package/build/qemu/1.1.0-beta.1/koffi_linux_ia32.tar.gz +0 -0
  9. package/build/qemu/1.1.0-beta.1/koffi_linux_x64.tar.gz +0 -0
  10. package/build/qemu/1.1.0-beta.1/koffi_win32_ia32.tar.gz +0 -0
  11. package/build/qemu/1.1.0-beta.1/koffi_win32_x64.tar.gz +0 -0
  12. package/package.json +1 -1
  13. package/qemu/qemu.js +11 -5
  14. package/qemu/registry/machines.json +20 -10
  15. package/src/abi_arm32.cc +13 -6
  16. package/src/abi_arm64.cc +13 -6
  17. package/src/abi_x64_sysv.cc +13 -6
  18. package/src/abi_x64_win.cc +13 -6
  19. package/src/abi_x86.cc +13 -6
  20. package/src/call.cc +25 -26
  21. package/src/call.hh +27 -41
  22. package/src/ffi.cc +152 -17
  23. package/src/ffi.hh +24 -10
  24. package/test/misc.c +2 -2
  25. package/build/qemu/1.0.4/koffi_darwin_x64.tar.gz +0 -0
  26. package/build/qemu/1.0.4/koffi_freebsd_arm64.tar.gz +0 -0
  27. package/build/qemu/1.0.4/koffi_freebsd_ia32.tar.gz +0 -0
  28. package/build/qemu/1.0.4/koffi_freebsd_x64.tar.gz +0 -0
  29. package/build/qemu/1.0.4/koffi_linux_arm.tar.gz +0 -0
  30. package/build/qemu/1.0.4/koffi_linux_arm64.tar.gz +0 -0
  31. package/build/qemu/1.0.4/koffi_linux_ia32.tar.gz +0 -0
  32. package/build/qemu/1.0.4/koffi_linux_x64.tar.gz +0 -0
  33. package/build/qemu/1.0.4/koffi_win32_ia32.tar.gz +0 -0
  34. package/build/qemu/1.0.4/koffi_win32_x64.tar.gz +0 -0
  35. package/test/misc.js +0 -227
  36. package/vendor/node-addon-api/CODE_OF_CONDUCT.md +0 -4
  37. package/vendor/node-addon-api/CONTRIBUTING.md +0 -93
  38. package/vendor/node-addon-api/appveyor.yml +0 -37
  39. package/vendor/node-addon-api/benchmark/README.md +0 -47
  40. package/vendor/node-addon-api/benchmark/binding.gyp +0 -25
  41. package/vendor/node-addon-api/benchmark/function_args.cc +0 -217
  42. package/vendor/node-addon-api/benchmark/function_args.js +0 -60
  43. package/vendor/node-addon-api/benchmark/index.js +0 -34
  44. package/vendor/node-addon-api/benchmark/property_descriptor.cc +0 -91
  45. package/vendor/node-addon-api/benchmark/property_descriptor.js +0 -37
  46. package/vendor/node-addon-api/doc/addon.md +0 -163
  47. package/vendor/node-addon-api/doc/array.md +0 -81
  48. package/vendor/node-addon-api/doc/array_buffer.md +0 -155
  49. package/vendor/node-addon-api/doc/async_context.md +0 -86
  50. package/vendor/node-addon-api/doc/async_operations.md +0 -31
  51. package/vendor/node-addon-api/doc/async_worker.md +0 -427
  52. package/vendor/node-addon-api/doc/async_worker_variants.md +0 -557
  53. package/vendor/node-addon-api/doc/bigint.md +0 -97
  54. package/vendor/node-addon-api/doc/boolean.md +0 -68
  55. package/vendor/node-addon-api/doc/buffer.md +0 -150
  56. package/vendor/node-addon-api/doc/callback_scope.md +0 -54
  57. package/vendor/node-addon-api/doc/callbackinfo.md +0 -97
  58. package/vendor/node-addon-api/doc/checker-tool.md +0 -32
  59. package/vendor/node-addon-api/doc/class_property_descriptor.md +0 -123
  60. package/vendor/node-addon-api/doc/cmake-js.md +0 -68
  61. package/vendor/node-addon-api/doc/conversion-tool.md +0 -28
  62. package/vendor/node-addon-api/doc/creating_a_release.md +0 -62
  63. package/vendor/node-addon-api/doc/dataview.md +0 -248
  64. package/vendor/node-addon-api/doc/date.md +0 -68
  65. package/vendor/node-addon-api/doc/env.md +0 -196
  66. package/vendor/node-addon-api/doc/error.md +0 -120
  67. package/vendor/node-addon-api/doc/error_handling.md +0 -254
  68. package/vendor/node-addon-api/doc/escapable_handle_scope.md +0 -80
  69. package/vendor/node-addon-api/doc/external.md +0 -63
  70. package/vendor/node-addon-api/doc/function.md +0 -402
  71. package/vendor/node-addon-api/doc/function_reference.md +0 -238
  72. package/vendor/node-addon-api/doc/generator.md +0 -13
  73. package/vendor/node-addon-api/doc/handle_scope.md +0 -63
  74. package/vendor/node-addon-api/doc/hierarchy.md +0 -91
  75. package/vendor/node-addon-api/doc/instance_wrap.md +0 -408
  76. package/vendor/node-addon-api/doc/maybe.md +0 -76
  77. package/vendor/node-addon-api/doc/memory_management.md +0 -27
  78. package/vendor/node-addon-api/doc/name.md +0 -29
  79. package/vendor/node-addon-api/doc/node-gyp.md +0 -82
  80. package/vendor/node-addon-api/doc/number.md +0 -163
  81. package/vendor/node-addon-api/doc/object.md +0 -411
  82. package/vendor/node-addon-api/doc/object_lifetime_management.md +0 -83
  83. package/vendor/node-addon-api/doc/object_reference.md +0 -117
  84. package/vendor/node-addon-api/doc/object_wrap.md +0 -588
  85. package/vendor/node-addon-api/doc/prebuild_tools.md +0 -16
  86. package/vendor/node-addon-api/doc/promises.md +0 -79
  87. package/vendor/node-addon-api/doc/property_descriptor.md +0 -286
  88. package/vendor/node-addon-api/doc/propertylvalue.md +0 -50
  89. package/vendor/node-addon-api/doc/range_error.md +0 -59
  90. package/vendor/node-addon-api/doc/reference.md +0 -113
  91. package/vendor/node-addon-api/doc/setup.md +0 -110
  92. package/vendor/node-addon-api/doc/string.md +0 -93
  93. package/vendor/node-addon-api/doc/symbol.md +0 -61
  94. package/vendor/node-addon-api/doc/threadsafe.md +0 -121
  95. package/vendor/node-addon-api/doc/threadsafe_function.md +0 -290
  96. package/vendor/node-addon-api/doc/type_error.md +0 -59
  97. package/vendor/node-addon-api/doc/typed_array.md +0 -78
  98. package/vendor/node-addon-api/doc/typed_array_of.md +0 -137
  99. package/vendor/node-addon-api/doc/typed_threadsafe_function.md +0 -306
  100. package/vendor/node-addon-api/doc/value.md +0 -340
  101. package/vendor/node-addon-api/doc/version_management.md +0 -43
  102. package/vendor/node-addon-api/package.json +0 -415
  103. package/vendor/node-addon-api/test/README.md +0 -91
  104. package/vendor/node-addon-api/test/addon.cc +0 -36
  105. package/vendor/node-addon-api/test/addon.js +0 -11
  106. package/vendor/node-addon-api/test/addon_build/index.js +0 -49
  107. package/vendor/node-addon-api/test/addon_build/tpl/addon.cc +0 -17
  108. package/vendor/node-addon-api/test/addon_build/tpl/binding.gyp +0 -62
  109. package/vendor/node-addon-api/test/addon_build/tpl/index.js +0 -9
  110. package/vendor/node-addon-api/test/addon_build/tpl/package.json +0 -11
  111. package/vendor/node-addon-api/test/addon_data.cc +0 -99
  112. package/vendor/node-addon-api/test/addon_data.js +0 -46
  113. package/vendor/node-addon-api/test/array_buffer.cc +0 -243
  114. package/vendor/node-addon-api/test/array_buffer.js +0 -69
  115. package/vendor/node-addon-api/test/async_context.cc +0 -36
  116. package/vendor/node-addon-api/test/async_context.js +0 -122
  117. package/vendor/node-addon-api/test/async_progress_queue_worker.cc +0 -83
  118. package/vendor/node-addon-api/test/async_progress_queue_worker.js +0 -46
  119. package/vendor/node-addon-api/test/async_progress_worker.cc +0 -134
  120. package/vendor/node-addon-api/test/async_progress_worker.js +0 -61
  121. package/vendor/node-addon-api/test/async_worker.cc +0 -106
  122. package/vendor/node-addon-api/test/async_worker.js +0 -179
  123. package/vendor/node-addon-api/test/async_worker_nocallback.js +0 -13
  124. package/vendor/node-addon-api/test/async_worker_persistent.cc +0 -63
  125. package/vendor/node-addon-api/test/async_worker_persistent.js +0 -24
  126. package/vendor/node-addon-api/test/basic_types/array.cc +0 -40
  127. package/vendor/node-addon-api/test/basic_types/array.js +0 -35
  128. package/vendor/node-addon-api/test/basic_types/boolean.cc +0 -38
  129. package/vendor/node-addon-api/test/basic_types/boolean.js +0 -35
  130. package/vendor/node-addon-api/test/basic_types/number.cc +0 -99
  131. package/vendor/node-addon-api/test/basic_types/number.js +0 -114
  132. package/vendor/node-addon-api/test/basic_types/value.cc +0 -120
  133. package/vendor/node-addon-api/test/basic_types/value.js +0 -133
  134. package/vendor/node-addon-api/test/bigint.cc +0 -91
  135. package/vendor/node-addon-api/test/bigint.js +0 -53
  136. package/vendor/node-addon-api/test/binding-swallowexcept.cc +0 -12
  137. package/vendor/node-addon-api/test/binding.cc +0 -173
  138. package/vendor/node-addon-api/test/binding.gyp +0 -124
  139. package/vendor/node-addon-api/test/buffer.cc +0 -183
  140. package/vendor/node-addon-api/test/buffer.js +0 -69
  141. package/vendor/node-addon-api/test/callbackscope.cc +0 -22
  142. package/vendor/node-addon-api/test/callbackscope.js +0 -49
  143. package/vendor/node-addon-api/test/common/index.js +0 -114
  144. package/vendor/node-addon-api/test/common/test_helper.h +0 -71
  145. package/vendor/node-addon-api/test/dataview/dataview.cc +0 -48
  146. package/vendor/node-addon-api/test/dataview/dataview.js +0 -35
  147. package/vendor/node-addon-api/test/dataview/dataview_read_write.cc +0 -115
  148. package/vendor/node-addon-api/test/dataview/dataview_read_write.js +0 -90
  149. package/vendor/node-addon-api/test/date.cc +0 -44
  150. package/vendor/node-addon-api/test/date.js +0 -18
  151. package/vendor/node-addon-api/test/env_cleanup.cc +0 -88
  152. package/vendor/node-addon-api/test/env_cleanup.js +0 -56
  153. package/vendor/node-addon-api/test/error.cc +0 -287
  154. package/vendor/node-addon-api/test/error.js +0 -81
  155. package/vendor/node-addon-api/test/error_handling_for_primitives.cc +0 -13
  156. package/vendor/node-addon-api/test/error_handling_for_primitives.js +0 -29
  157. package/vendor/node-addon-api/test/error_terminating_environment.js +0 -95
  158. package/vendor/node-addon-api/test/external.cc +0 -81
  159. package/vendor/node-addon-api/test/external.js +0 -88
  160. package/vendor/node-addon-api/test/function.cc +0 -324
  161. package/vendor/node-addon-api/test/function.js +0 -133
  162. package/vendor/node-addon-api/test/function_reference.cc +0 -202
  163. package/vendor/node-addon-api/test/function_reference.js +0 -157
  164. package/vendor/node-addon-api/test/globalObject/global_object.cc +0 -61
  165. package/vendor/node-addon-api/test/globalObject/global_object_delete_property.cc +0 -31
  166. package/vendor/node-addon-api/test/globalObject/global_object_delete_property.js +0 -61
  167. package/vendor/node-addon-api/test/globalObject/global_object_get_property.cc +0 -40
  168. package/vendor/node-addon-api/test/globalObject/global_object_get_property.js +0 -57
  169. package/vendor/node-addon-api/test/globalObject/global_object_has_own_property.cc +0 -28
  170. package/vendor/node-addon-api/test/globalObject/global_object_has_own_property.js +0 -48
  171. package/vendor/node-addon-api/test/globalObject/global_object_set_property.cc +0 -31
  172. package/vendor/node-addon-api/test/globalObject/global_object_set_property.js +0 -58
  173. package/vendor/node-addon-api/test/handlescope.cc +0 -60
  174. package/vendor/node-addon-api/test/handlescope.js +0 -14
  175. package/vendor/node-addon-api/test/index.js +0 -159
  176. package/vendor/node-addon-api/test/maybe/check.cc +0 -23
  177. package/vendor/node-addon-api/test/maybe/index.js +0 -38
  178. package/vendor/node-addon-api/test/memory_management.cc +0 -17
  179. package/vendor/node-addon-api/test/memory_management.js +0 -9
  180. package/vendor/node-addon-api/test/movable_callbacks.cc +0 -23
  181. package/vendor/node-addon-api/test/movable_callbacks.js +0 -21
  182. package/vendor/node-addon-api/test/name.cc +0 -108
  183. package/vendor/node-addon-api/test/name.js +0 -59
  184. package/vendor/node-addon-api/test/napi_child.js +0 -14
  185. package/vendor/node-addon-api/test/object/delete_property.cc +0 -38
  186. package/vendor/node-addon-api/test/object/delete_property.js +0 -41
  187. package/vendor/node-addon-api/test/object/finalizer.cc +0 -29
  188. package/vendor/node-addon-api/test/object/finalizer.js +0 -28
  189. package/vendor/node-addon-api/test/object/get_property.cc +0 -34
  190. package/vendor/node-addon-api/test/object/get_property.js +0 -40
  191. package/vendor/node-addon-api/test/object/has_own_property.cc +0 -34
  192. package/vendor/node-addon-api/test/object/has_own_property.js +0 -34
  193. package/vendor/node-addon-api/test/object/has_property.cc +0 -38
  194. package/vendor/node-addon-api/test/object/has_property.js +0 -37
  195. package/vendor/node-addon-api/test/object/object.cc +0 -350
  196. package/vendor/node-addon-api/test/object/object.js +0 -217
  197. package/vendor/node-addon-api/test/object/object_deprecated.cc +0 -66
  198. package/vendor/node-addon-api/test/object/object_deprecated.js +0 -47
  199. package/vendor/node-addon-api/test/object/object_freeze_seal.cc +0 -25
  200. package/vendor/node-addon-api/test/object/object_freeze_seal.js +0 -61
  201. package/vendor/node-addon-api/test/object/set_property.cc +0 -45
  202. package/vendor/node-addon-api/test/object/set_property.js +0 -30
  203. package/vendor/node-addon-api/test/object/subscript_operator.cc +0 -58
  204. package/vendor/node-addon-api/test/object/subscript_operator.js +0 -17
  205. package/vendor/node-addon-api/test/object_reference.cc +0 -219
  206. package/vendor/node-addon-api/test/object_reference.js +0 -259
  207. package/vendor/node-addon-api/test/objectwrap.cc +0 -268
  208. package/vendor/node-addon-api/test/objectwrap.js +0 -284
  209. package/vendor/node-addon-api/test/objectwrap_constructor_exception.cc +0 -26
  210. package/vendor/node-addon-api/test/objectwrap_constructor_exception.js +0 -18
  211. package/vendor/node-addon-api/test/objectwrap_function.cc +0 -45
  212. package/vendor/node-addon-api/test/objectwrap_function.js +0 -22
  213. package/vendor/node-addon-api/test/objectwrap_multiple_inheritance.cc +0 -30
  214. package/vendor/node-addon-api/test/objectwrap_multiple_inheritance.js +0 -13
  215. package/vendor/node-addon-api/test/objectwrap_removewrap.cc +0 -45
  216. package/vendor/node-addon-api/test/objectwrap_removewrap.js +0 -40
  217. package/vendor/node-addon-api/test/objectwrap_worker_thread.js +0 -19
  218. package/vendor/node-addon-api/test/promise.cc +0 -29
  219. package/vendor/node-addon-api/test/promise.js +0 -18
  220. package/vendor/node-addon-api/test/reference.cc +0 -24
  221. package/vendor/node-addon-api/test/reference.js +0 -14
  222. package/vendor/node-addon-api/test/run_script.cc +0 -56
  223. package/vendor/node-addon-api/test/run_script.js +0 -45
  224. package/vendor/node-addon-api/test/symbol.cc +0 -79
  225. package/vendor/node-addon-api/test/symbol.js +0 -73
  226. package/vendor/node-addon-api/test/testUtil.js +0 -54
  227. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function.cc +0 -195
  228. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function.js +0 -188
  229. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_ctx.cc +0 -63
  230. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_ctx.js +0 -12
  231. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_existing_tsfn.cc +0 -115
  232. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_existing_tsfn.js +0 -14
  233. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_ptr.cc +0 -26
  234. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_ptr.js +0 -7
  235. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_sum.cc +0 -225
  236. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_sum.js +0 -59
  237. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_unref.cc +0 -42
  238. package/vendor/node-addon-api/test/threadsafe_function/threadsafe_function_unref.js +0 -53
  239. package/vendor/node-addon-api/test/thunking_manual.cc +0 -140
  240. package/vendor/node-addon-api/test/thunking_manual.js +0 -17
  241. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function.cc +0 -215
  242. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function.js +0 -188
  243. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_ctx.cc +0 -68
  244. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_ctx.js +0 -12
  245. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_existing_tsfn.cc +0 -127
  246. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_existing_tsfn.js +0 -14
  247. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_ptr.cc +0 -28
  248. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_ptr.js +0 -7
  249. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_sum.cc +0 -237
  250. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_sum.js +0 -59
  251. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_unref.cc +0 -53
  252. package/vendor/node-addon-api/test/typed_threadsafe_function/typed_threadsafe_function_unref.js +0 -53
  253. package/vendor/node-addon-api/test/typedarray-bigint.js +0 -58
  254. package/vendor/node-addon-api/test/typedarray.cc +0 -216
  255. package/vendor/node-addon-api/test/typedarray.js +0 -69
  256. package/vendor/node-addon-api/test/version_management.cc +0 -27
  257. package/vendor/node-addon-api/test/version_management.js +0 -31
  258. package/vendor/node-addon-api/unit-test/README.md +0 -28
  259. package/vendor/node-addon-api/unit-test/binding-file-template.js +0 -39
  260. package/vendor/node-addon-api/unit-test/binding.gyp +0 -72
  261. package/vendor/node-addon-api/unit-test/exceptions.js +0 -32
  262. package/vendor/node-addon-api/unit-test/generate-binding-cc.js +0 -61
  263. package/vendor/node-addon-api/unit-test/injectTestParams.js +0 -101
  264. package/vendor/node-addon-api/unit-test/listOfTestModules.js +0 -88
  265. package/vendor/node-addon-api/unit-test/matchModules.js +0 -65
  266. package/vendor/node-addon-api/unit-test/setup.js +0 -13
  267. package/vendor/node-addon-api/unit-test/spawnTask.js +0 -26
  268. package/vendor/node-addon-api/unit-test/test.js +0 -30
@@ -1,86 +0,0 @@
1
- # AsyncContext
2
-
3
- The [Napi::AsyncWorker](async_worker.md) class may not be appropriate for every
4
- scenario. When using any other async mechanism, introducing a new class
5
- `Napi::AsyncContext` is necessary to ensure an async operation is properly
6
- tracked by the runtime. The `Napi::AsyncContext` class can be passed to
7
- [Napi::Function::MakeCallback()](function.md) method to properly restore the
8
- correct async execution context.
9
-
10
- ## Methods
11
-
12
- ### Constructor
13
-
14
- Creates a new `Napi::AsyncContext`.
15
-
16
- ```cpp
17
- explicit Napi::AsyncContext::AsyncContext(napi_env env, const char* resource_name);
18
- ```
19
-
20
- - `[in] env`: The environment in which to create the `Napi::AsyncContext`.
21
- - `[in] resource_name`: Null-terminated strings that represents the
22
- identifier for the kind of resource that is being provided for diagnostic
23
- information exposed by the `async_hooks` API.
24
-
25
- ### Constructor
26
-
27
- Creates a new `Napi::AsyncContext`.
28
-
29
- ```cpp
30
- explicit Napi::AsyncContext::AsyncContext(napi_env env, const char* resource_name, const Napi::Object& resource);
31
- ```
32
-
33
- - `[in] env`: The environment in which to create the `Napi::AsyncContext`.
34
- - `[in] resource_name`: Null-terminated strings that represents the
35
- identifier for the kind of resource that is being provided for diagnostic
36
- information exposed by the `async_hooks` API.
37
- - `[in] resource`: Object associated with the asynchronous operation that
38
- will be passed to possible `async_hooks`.
39
-
40
- ### Destructor
41
-
42
- The `Napi::AsyncContext` to be destroyed.
43
-
44
- ```cpp
45
- virtual Napi::AsyncContext::~AsyncContext();
46
- ```
47
-
48
- ### Env
49
-
50
- Requests the environment in which the async context has been initially created.
51
-
52
- ```cpp
53
- Napi::Env Env() const;
54
- ```
55
-
56
- Returns the `Napi::Env` environment in which the async context has been created.
57
-
58
- ## Operator
59
-
60
- ```cpp
61
- Napi::AsyncContext::operator napi_async_context() const;
62
- ```
63
-
64
- Returns the Node-API `napi_async_context` wrapped by the `Napi::AsyncContext`
65
- object. This can be used to mix usage of the C Node-API and node-addon-api.
66
-
67
- ## Example
68
-
69
- ```cpp
70
- #include "napi.h"
71
-
72
- void MakeCallbackWithAsyncContext(const Napi::CallbackInfo& info) {
73
- Napi::Function callback = info[0].As<Napi::Function>();
74
- Napi::Object resource = info[1].As<Napi::Object>();
75
-
76
- // Create a new async context instance.
77
- Napi::AsyncContext context(info.Env(), "async_context_test", resource);
78
-
79
- // Invoke the callback with the async context instance.
80
- callback.MakeCallback(Napi::Object::New(info.Env()),
81
- std::initializer_list<napi_value>{}, context);
82
-
83
- // The async context instance is automatically destroyed here because it's
84
- // block-scope like `Napi::HandleScope`.
85
- }
86
- ```
@@ -1,31 +0,0 @@
1
- # Asynchronous operations
2
-
3
- Node.js native add-ons often need to execute long running tasks and to avoid
4
- blocking the **event loop** they have to run them asynchronously from the
5
- **event loop**.
6
- In the Node.js model of execution the event loop thread represents the thread
7
- where JavaScript code is executing. The Node.js guidance is to avoid blocking
8
- other work queued on the event loop thread. Therefore, we need to do this work on
9
- another thread.
10
-
11
- All this means that native add-ons need to leverage async helpers from libuv as
12
- part of their implementation. This allows them to schedule work to be executed
13
- asynchronously so that their methods can return in advance of the work being
14
- completed.
15
-
16
- Node Addon API provides an interface to support functions that cover
17
- the most common asynchronous use cases. There is an abstract classes to implement
18
- asynchronous operations:
19
-
20
- - **[`Napi::AsyncWorker`](async_worker.md)**
21
-
22
- These class helps manage asynchronous operations through an abstraction
23
- of the concept of moving data between the **event loop** and **worker threads**.
24
-
25
- Also, the above class may not be appropriate for every scenario. When using any
26
- other asynchronous mechanism, the following API is necessary to ensure an
27
- asynchronous operation is properly tracked by the runtime:
28
-
29
- - **[AsyncContext](async_context.md)**
30
-
31
- - **[CallbackScope](callback_scope.md)**
@@ -1,427 +0,0 @@
1
- # AsyncWorker
2
-
3
- `Napi::AsyncWorker` is an abstract class that you can subclass to remove many of
4
- the tedious tasks of moving data between the event loop and worker threads. This
5
- class internally handles all the details of creating and executing an asynchronous
6
- operation.
7
-
8
- Once created, execution is requested by calling `Napi::AsyncWorker::Queue`. When
9
- a thread is available for execution the `Napi::AsyncWorker::Execute` method will
10
- be invoked. Once `Napi::AsyncWorker::Execute` completes either
11
- `Napi::AsyncWorker::OnOK` or `Napi::AsyncWorker::OnError` will be invoked. Once
12
- the `Napi::AsyncWorker::OnOK` or `Napi::AsyncWorker::OnError` methods are
13
- complete the `Napi::AsyncWorker` instance is destructed.
14
-
15
- For the most basic use, only the `Napi::AsyncWorker::Execute` method must be
16
- implemented in a subclass.
17
-
18
- ## Methods
19
-
20
- ### Env
21
-
22
- Requests the environment in which the async worker has been initially created.
23
-
24
- ```cpp
25
- Napi::Env Napi::AsyncWorker::Env() const;
26
- ```
27
-
28
- Returns the environment in which the async worker has been created.
29
-
30
- ### Queue
31
-
32
- Requests that the work be queued for execution.
33
-
34
- ```cpp
35
- void Napi::AsyncWorker::Queue();
36
- ```
37
-
38
- ### Cancel
39
-
40
- Cancels queued work if it has not yet been started. If it has already started
41
- executing, it cannot be cancelled. If cancelled successfully neither
42
- `OnOK` nor `OnError` will be called.
43
-
44
- ```cpp
45
- void Napi::AsyncWorker::Cancel();
46
- ```
47
-
48
- ### Receiver
49
-
50
- ```cpp
51
- Napi::ObjectReference& Napi::AsyncWorker::Receiver();
52
- ```
53
-
54
- Returns the persistent object reference of the receiver object set when the async
55
- worker was created.
56
-
57
- ### Callback
58
-
59
- ```cpp
60
- Napi::FunctionReference& Napi::AsyncWorker::Callback();
61
- ```
62
-
63
- Returns the persistent function reference of the callback set when the async
64
- worker was created. The returned function reference will receive the results of
65
- the computation that happened in the `Napi::AsyncWorker::Execute` method, unless
66
- the default implementation of `Napi::AsyncWorker::OnOK` or
67
- `Napi::AsyncWorker::OnError` is overridden.
68
-
69
- ### SuppressDestruct
70
-
71
- ```cpp
72
- void Napi::AsyncWorker::SuppressDestruct();
73
- ```
74
-
75
- Prevents the destruction of the `Napi::AsyncWorker` instance upon completion of
76
- the `Napi::AsyncWorker::OnOK` callback.
77
-
78
- ### SetError
79
-
80
- Sets the error message for the error that happened during the execution. Setting
81
- an error message will cause the `Napi::AsyncWorker::OnError` method to be
82
- invoked instead of `Napi::AsyncWorker::OnOK` once the
83
- `Napi::AsyncWorker::Execute` method completes.
84
-
85
- ```cpp
86
- void Napi::AsyncWorker::SetError(const std::string& error);
87
- ```
88
-
89
- - `[in] error`: The reference to the string that represent the message of the error.
90
-
91
- ### Execute
92
-
93
- This method is used to execute some tasks outside of the **event loop** on a libuv
94
- worker thread. Subclasses must implement this method and the method is run on
95
- a thread other than that running the main event loop. As the method is not
96
- running on the main event loop, it must avoid calling any methods from node-addon-api
97
- or running any code that might invoke JavaScript. Instead, once this method is
98
- complete any interaction through node-addon-api with JavaScript should be implemented
99
- in the `Napi::AsyncWorker::OnOK` method and `Napi::AsyncWorker::OnError` which run
100
- on the main thread and are invoked when the `Napi::AsyncWorker::Execute` method completes.
101
-
102
- ```cpp
103
- virtual void Napi::AsyncWorker::Execute() = 0;
104
- ```
105
-
106
- ### OnOK
107
-
108
- This method is invoked when the computation in the `Execute` method ends.
109
- The default implementation runs the `Callback` optionally provided when the
110
- `AsyncWorker` class was created. The `Callback` will by default receive no
111
- arguments. The arguments to the `Callback` can be provided by overriding the
112
- `GetResult()` method.
113
-
114
- ```cpp
115
- virtual void Napi::AsyncWorker::OnOK();
116
- ```
117
- ### GetResult
118
-
119
- This method returns the arguments passed to the `Callback` invoked by the default
120
- `OnOK()` implementation. The default implementation returns an empty vector,
121
- providing no arguments to the `Callback`.
122
-
123
- ```cpp
124
- virtual std::vector<napi_value> Napi::AsyncWorker::GetResult(Napi::Env env);
125
- ```
126
-
127
- ### OnError
128
-
129
- This method is invoked after `Napi::AsyncWorker::Execute` completes if an error
130
- occurs while `Napi::AsyncWorker::Execute` is running and C++ exceptions are
131
- enabled or if an error was set through a call to `Napi::AsyncWorker::SetError`.
132
- The default implementation calls the `Callback` provided when the `Napi::AsyncWorker`
133
- class was created, passing in the error as the first parameter.
134
-
135
- ```cpp
136
- virtual void Napi::AsyncWorker::OnError(const Napi::Error& e);
137
- ```
138
-
139
- ### OnWorkComplete
140
-
141
- This method is invoked after the work has completed on JavaScript thread.
142
- The default implementation of this method checks the status of the work and
143
- tries to dispatch the result to `Napi::AsyncWorker::OnOk` or `Napi::AsyncWorker::Error`
144
- if the work has committed an error. If the work was cancelled, neither
145
- `Napi::AsyncWorker::OnOk` nor `Napi::AsyncWorker::Error` will be invoked.
146
- After the result is dispatched, the default implementation will call into
147
- `Napi::AsyncWorker::Destroy` if `SuppressDestruct()` was not called.
148
-
149
- ```cpp
150
- virtual void OnWorkComplete(Napi::Env env, napi_status status);
151
- ```
152
-
153
- ### OnExecute
154
-
155
- This method is invoked immediately on the work thread when scheduled.
156
- The default implementation of this method just calls the `Napi::AsyncWorker::Execute`
157
- and handles exceptions if cpp exceptions were enabled.
158
-
159
- The `OnExecute` method receives an `napi_env` argument. However, the `napi_env`
160
- must NOT be used within this method, as it does not run on the JavaScript
161
- thread and must not run any method that would cause JavaScript to run. In
162
- practice, this means that almost any use of `napi_env` will be incorrect.
163
-
164
- ```cpp
165
- virtual void OnExecute(Napi::Env env);
166
- ```
167
-
168
- ### Destroy
169
-
170
- This method is invoked when the instance must be deallocated. If
171
- `SuppressDestruct()` was not called then this method will be called after either
172
- `OnError()` or `OnOK()` complete. The default implementation of this method
173
- causes the instance to delete itself using the `delete` operator. The method is
174
- provided so as to ensure that instances allocated by means other than the `new`
175
- operator can be deallocated upon work completion.
176
-
177
- ```cpp
178
- virtual void Napi::AsyncWorker::Destroy();
179
- ```
180
-
181
- ### Constructor
182
-
183
- Creates a new `Napi::AsyncWorker`.
184
-
185
- ```cpp
186
- explicit Napi::AsyncWorker(const Napi::Function& callback);
187
- ```
188
-
189
- - `[in] callback`: The function which will be called when an asynchronous
190
- operations ends. The given function is called from the main event loop thread.
191
-
192
- Returns a `Napi::AsyncWorker` instance which can later be queued for execution by calling
193
- `Queue`.
194
-
195
- ### Constructor
196
-
197
- Creates a new `Napi::AsyncWorker`.
198
-
199
- ```cpp
200
- explicit Napi::AsyncWorker(const Napi::Function& callback, const char* resource_name);
201
- ```
202
-
203
- - `[in] callback`: The function which will be called when an asynchronous
204
- operations ends. The given function is called from the main event loop thread.
205
- - `[in] resource_name`: Null-terminated string that represents the
206
- identifier for the kind of resource that is being provided for diagnostic
207
- information exposed by the async_hooks API.
208
-
209
- Returns a `Napi::AsyncWorker` instance which can later be queued for execution by
210
- calling `Napi::AsyncWork::Queue`.
211
-
212
- ### Constructor
213
-
214
- Creates a new `Napi::AsyncWorker`.
215
-
216
- ```cpp
217
- explicit Napi::AsyncWorker(const Napi::Function& callback, const char* resource_name, const Napi::Object& resource);
218
- ```
219
-
220
- - `[in] callback`: The function which will be called when an asynchronous
221
- operations ends. The given function is called from the main event loop thread.
222
- - `[in] resource_name`: Null-terminated string that represents the
223
- identifier for the kind of resource that is being provided for diagnostic
224
- information exposed by the async_hooks API.
225
- - `[in] resource`: Object associated with the asynchronous operation that
226
- will be passed to possible async_hooks.
227
-
228
- Returns a `Napi::AsyncWorker` instance which can later be queued for execution by
229
- calling `Napi::AsyncWork::Queue`.
230
-
231
- ### Constructor
232
-
233
- Creates a new `Napi::AsyncWorker`.
234
-
235
- ```cpp
236
- explicit Napi::AsyncWorker(const Napi::Object& receiver, const Napi::Function& callback);
237
- ```
238
-
239
- - `[in] receiver`: The `this` object passed to the called function.
240
- - `[in] callback`: The function which will be called when an asynchronous
241
- operations ends. The given function is called from the main event loop thread.
242
-
243
- Returns a `Napi::AsyncWorker` instance which can later be queued for execution by
244
- calling `Napi::AsyncWork::Queue`.
245
-
246
- ### Constructor
247
-
248
- Creates a new `Napi::AsyncWorker`.
249
-
250
- ```cpp
251
- explicit Napi::AsyncWorker(const Napi::Object& receiver, const Napi::Function& callback, const char* resource_name);
252
- ```
253
-
254
- - `[in] receiver`: The `this` object passed to the called function.
255
- - `[in] callback`: The function which will be called when an asynchronous
256
- operations ends. The given function is called from the main event loop thread.
257
- - `[in] resource_name`: Null-terminated string that represents the
258
- identifier for the kind of resource that is being provided for diagnostic
259
- information exposed by the async_hooks API.
260
-
261
- Returns a `Napi::AsyncWork` instance which can later be queued for execution by
262
- calling `Napi::AsyncWork::Queue`.
263
-
264
- ### Constructor
265
-
266
- Creates a new `Napi::AsyncWorker`.
267
-
268
- ```cpp
269
- explicit Napi::AsyncWorker(const Napi::Object& receiver, const Napi::Function& callback, const char* resource_name, const Napi::Object& resource);
270
- ```
271
-
272
- - `[in] receiver`: The `this` object passed to the called function.
273
- - `[in] callback`: The function which will be called when an asynchronous
274
- operations ends. The given function is called from the main event loop thread.
275
- - `[in] resource_name`: Null-terminated string that represents the
276
- identifier for the kind of resource that is being provided for diagnostic
277
- information exposed by the async_hooks API.
278
- - `[in] resource`: Object associated with the asynchronous operation that
279
- will be passed to possible async_hooks.
280
-
281
- Returns a `Napi::AsyncWork` instance which can later be queued for execution by
282
- calling `Napi::AsyncWork::Queue`.
283
-
284
-
285
- ### Constructor
286
-
287
- Creates a new `Napi::AsyncWorker`.
288
-
289
- ```cpp
290
- explicit Napi::AsyncWorker(Napi::Env env);
291
- ```
292
-
293
- - `[in] env`: The environment in which to create the `Napi::AsyncWorker`.
294
-
295
- Returns an `Napi::AsyncWorker` instance which can later be queued for execution by calling
296
- `Napi::AsyncWorker::Queue`.
297
-
298
- ### Constructor
299
-
300
- Creates a new `Napi::AsyncWorker`.
301
-
302
- ```cpp
303
- explicit Napi::AsyncWorker(Napi::Env env, const char* resource_name);
304
- ```
305
-
306
- - `[in] env`: The environment in which to create the `Napi::AsyncWorker`.
307
- - `[in] resource_name`: Null-terminated string that represents the
308
- identifier for the kind of resource that is being provided for diagnostic
309
- information exposed by the async_hooks API.
310
-
311
- Returns a `Napi::AsyncWorker` instance which can later be queued for execution by
312
- calling `Napi::AsyncWorker::Queue`.
313
-
314
- ### Constructor
315
-
316
- Creates a new `Napi::AsyncWorker`.
317
-
318
- ```cpp
319
- explicit Napi::AsyncWorker(Napi::Env env, const char* resource_name, const Napi::Object& resource);
320
- ```
321
-
322
- - `[in] env`: The environment in which to create the `Napi::AsyncWorker`.
323
- - `[in] resource_name`: Null-terminated string that represents the
324
- identifier for the kind of resource that is being provided for diagnostic
325
- information exposed by the async_hooks API.
326
- - `[in] resource`: Object associated with the asynchronous operation that
327
- will be passed to possible async_hooks.
328
-
329
- Returns a `Napi::AsyncWorker` instance which can later be queued for execution by
330
- calling `Napi::AsyncWorker::Queue`.
331
-
332
- ### Destructor
333
-
334
- Deletes the created work object that is used to execute logic asynchronously.
335
-
336
- ```cpp
337
- virtual Napi::AsyncWorker::~AsyncWorker();
338
- ```
339
-
340
- ## Operator
341
-
342
- ```cpp
343
- Napi::AsyncWorker::operator napi_async_work() const;
344
- ```
345
-
346
- Returns the Node-API `napi_async_work` wrapped by the `Napi::AsyncWorker` object. This
347
- can be used to mix usage of the C Node-API and node-addon-api.
348
-
349
- ## Example
350
-
351
- The first step to use the `Napi::AsyncWorker` class is to create a new class that
352
- inherits from it and implement the `Napi::AsyncWorker::Execute` abstract method.
353
- Typically input to your worker will be saved within class' fields generally
354
- passed in through its constructor.
355
-
356
- When the `Napi::AsyncWorker::Execute` method completes without errors the
357
- `Napi::AsyncWorker::OnOK` function callback will be invoked. In this function the
358
- results of the computation will be reassembled and returned back to the initial
359
- JavaScript context.
360
-
361
- `Napi::AsyncWorker` ensures that all the code in the `Napi::AsyncWorker::Execute`
362
- function runs in the background out of the **event loop** thread and at the end
363
- the `Napi::AsyncWorker::OnOK` or `Napi::AsyncWorker::OnError` function will be
364
- called and are executed as part of the event loop.
365
-
366
- The code below shows a basic example of `Napi::AsyncWorker` the implementation:
367
-
368
- ```cpp
369
- #include<napi.h>
370
-
371
- #include <chrono>
372
- #include <thread>
373
-
374
- using namespace Napi;
375
-
376
- class EchoWorker : public AsyncWorker {
377
- public:
378
- EchoWorker(Function& callback, std::string& echo)
379
- : AsyncWorker(callback), echo(echo) {}
380
-
381
- ~EchoWorker() {}
382
- // This code will be executed on the worker thread
383
- void Execute() override {
384
- // Need to simulate cpu heavy task
385
- std::this_thread::sleep_for(std::chrono::seconds(1));
386
- }
387
-
388
- void OnOK() override {
389
- HandleScope scope(Env());
390
- Callback().Call({Env().Null(), String::New(Env(), echo)});
391
- }
392
-
393
- private:
394
- std::string echo;
395
- };
396
- ```
397
-
398
- The `EchoWorker`'s constructor calls the base class' constructor to pass in the
399
- callback that the `Napi::AsyncWorker` base class will store persistently. When
400
- the work on the `Napi::AsyncWorker::Execute` method is done the
401
- `Napi::AsyncWorker::OnOk` method is called and the results return back to
402
- JavaScript invoking the stored callback with its associated environment.
403
-
404
- The following code shows an example of how to create and use an `Napi::AsyncWorker`.
405
-
406
- ```cpp
407
- #include<napi.h>
408
-
409
- // Include EchoWorker class
410
- // ..
411
-
412
- using namespace Napi;
413
-
414
- Value Echo(const CallbackInfo& info) {
415
- // You need to validate the arguments here.
416
- Function cb = info[1].As<Function>();
417
- std::string in = info[0].As<String>();
418
- EchoWorker* wk = new EchoWorker(cb, in);
419
- wk->Queue();
420
- return info.Env().Undefined();
421
- ```
422
-
423
- Using the implementation of a `Napi::AsyncWorker` is straight forward. You only
424
- need to create a new instance and pass to its constructor the callback you want to
425
- execute when your asynchronous task ends and other data you need for your
426
- computation. Once created the only other action you have to do is to call the
427
- `Napi::AsyncWorker::Queue` method that will queue the created worker for execution.