@encharm/cws 4.5.3 → 4.6.0

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 (288) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/CLAUDE.md +81 -0
  3. package/README.md +10 -3
  4. package/dist/bindings/cws_darwin_arm64_node115.node +0 -0
  5. package/dist/bindings/cws_darwin_arm64_node127.node +0 -0
  6. package/dist/bindings/cws_darwin_arm64_node137.node +0 -0
  7. package/dist/bindings/cws_darwin_arm64_node147.node +0 -0
  8. package/dist/bindings/cws_linux_arm64_node115.node +0 -0
  9. package/dist/bindings/cws_linux_arm64_node127.node +0 -0
  10. package/dist/bindings/cws_linux_arm64_node137.node +0 -0
  11. package/dist/bindings/cws_linux_arm64_node147.node +0 -0
  12. package/dist/bindings/cws_linux_x64_node115.node +0 -0
  13. package/dist/bindings/cws_linux_x64_node127.node +0 -0
  14. package/dist/bindings/cws_linux_x64_node137.node +0 -0
  15. package/dist/bindings/cws_linux_x64_node147.node +0 -0
  16. package/dist/bindings/cws_win32_x64_node115.node +0 -0
  17. package/dist/bindings/cws_win32_x64_node127.node +0 -0
  18. package/dist/bindings/cws_win32_x64_node137.node +0 -0
  19. package/dist/bindings/cws_win32_x64_node147.node +0 -0
  20. package/package.json +1 -1
  21. package/src/Addon.cpp +2 -1
  22. package/src/Addon.h +70 -14
  23. package/src/Hub.h +1 -0
  24. package/src/Networking.h +11 -0
  25. package/src/Socket.h +201 -6
  26. package/src/WebSocket.cpp +4 -1
  27. package/src/cSNode.cpp +2 -0
  28. package/src/cSNode.h +4 -0
  29. package/src/headers/26/acorn_version.h +6 -0
  30. package/src/headers/26/aliased_buffer-inl.h +264 -0
  31. package/src/headers/26/aliased_buffer.h +205 -0
  32. package/src/headers/26/aliased_struct-inl.h +143 -0
  33. package/src/headers/26/aliased_struct.h +248 -0
  34. package/src/headers/26/amaro_version.h +6 -0
  35. package/src/headers/26/async_context_frame.h +33 -0
  36. package/src/headers/26/async_wrap-inl.h +123 -0
  37. package/src/headers/26/async_wrap.h +254 -0
  38. package/src/headers/26/base_object-inl.h +333 -0
  39. package/src/headers/26/base_object.h +339 -0
  40. package/src/headers/26/base_object_types.h +76 -0
  41. package/src/headers/26/blob_serializer_deserializer-inl.h +385 -0
  42. package/src/headers/26/blob_serializer_deserializer.h +142 -0
  43. package/src/headers/26/builtin_info.h +57 -0
  44. package/src/headers/26/callback_queue-inl.h +97 -0
  45. package/src/headers/26/callback_queue.h +79 -0
  46. package/src/headers/26/cares_wrap.h +475 -0
  47. package/src/headers/26/cleanup_queue-inl.h +36 -0
  48. package/src/headers/26/cleanup_queue.h +79 -0
  49. package/src/headers/26/compile_cache.h +134 -0
  50. package/src/headers/26/connect_wrap.h +26 -0
  51. package/src/headers/26/connection_wrap.h +30 -0
  52. package/src/headers/26/cppgc_helpers-inl.h +69 -0
  53. package/src/headers/26/cppgc_helpers.h +162 -0
  54. package/src/headers/26/crypto/crypto_aes.h +107 -0
  55. package/src/headers/26/crypto/crypto_argon2.h +88 -0
  56. package/src/headers/26/crypto/crypto_bio.h +193 -0
  57. package/src/headers/26/crypto/crypto_chacha20_poly1305.h +62 -0
  58. package/src/headers/26/crypto/crypto_cipher.h +291 -0
  59. package/src/headers/26/crypto/crypto_common.h +48 -0
  60. package/src/headers/26/crypto/crypto_context.h +219 -0
  61. package/src/headers/26/crypto/crypto_dh.h +104 -0
  62. package/src/headers/26/crypto/crypto_dsa.h +50 -0
  63. package/src/headers/26/crypto/crypto_ec.h +102 -0
  64. package/src/headers/26/crypto/crypto_hash.h +157 -0
  65. package/src/headers/26/crypto/crypto_hkdf.h +62 -0
  66. package/src/headers/26/crypto/crypto_hmac.h +92 -0
  67. package/src/headers/26/crypto/crypto_kem.h +131 -0
  68. package/src/headers/26/crypto/crypto_keygen.h +382 -0
  69. package/src/headers/26/crypto/crypto_keys.h +366 -0
  70. package/src/headers/26/crypto/crypto_kmac.h +79 -0
  71. package/src/headers/26/crypto/crypto_pbkdf2.h +76 -0
  72. package/src/headers/26/crypto/crypto_pqc.h +39 -0
  73. package/src/headers/26/crypto/crypto_random.h +127 -0
  74. package/src/headers/26/crypto/crypto_rsa.h +108 -0
  75. package/src/headers/26/crypto/crypto_scrypt.h +85 -0
  76. package/src/headers/26/crypto/crypto_sig.h +159 -0
  77. package/src/headers/26/crypto/crypto_spkac.h +21 -0
  78. package/src/headers/26/crypto/crypto_timing.h +20 -0
  79. package/src/headers/26/crypto/crypto_tls.h +342 -0
  80. package/src/headers/26/crypto/crypto_turboshake.h +105 -0
  81. package/src/headers/26/crypto/crypto_util.h +775 -0
  82. package/src/headers/26/crypto/crypto_x509.h +140 -0
  83. package/src/headers/26/dataqueue/queue.h +311 -0
  84. package/src/headers/26/debug_utils-inl.h +291 -0
  85. package/src/headers/26/debug_utils.h +200 -0
  86. package/src/headers/26/diagnosticfilename-inl.h +33 -0
  87. package/src/headers/26/embedded_data.h +17 -0
  88. package/src/headers/26/encoding_binding.h +59 -0
  89. package/src/headers/26/env-inl.h +956 -0
  90. package/src/headers/26/env.h +1294 -0
  91. package/src/headers/26/env_properties.h +562 -0
  92. package/src/headers/26/ffi/data.h +30 -0
  93. package/src/headers/26/ffi/fast.h +96 -0
  94. package/src/headers/26/ffi/jit_memory.h +26 -0
  95. package/src/headers/26/ffi/types.h +99 -0
  96. package/src/headers/26/handle_wrap.h +123 -0
  97. package/src/headers/26/histogram-inl.h +211 -0
  98. package/src/headers/26/histogram.h +474 -0
  99. package/src/headers/26/inspector/dom_storage_agent.h +68 -0
  100. package/src/headers/26/inspector/inspector_object_utils.h +38 -0
  101. package/src/headers/26/inspector/io_agent.h +30 -0
  102. package/src/headers/26/inspector/main_thread_interface.h +116 -0
  103. package/src/headers/26/inspector/network_agent.h +110 -0
  104. package/src/headers/26/inspector/network_inspector.h +45 -0
  105. package/src/headers/26/inspector/network_requests_buffer.h +195 -0
  106. package/src/headers/26/inspector/network_resource_manager.h +29 -0
  107. package/src/headers/26/inspector/node_json.h +24 -0
  108. package/src/headers/26/inspector/node_string.h +101 -0
  109. package/src/headers/26/inspector/notification_emitter.h +38 -0
  110. package/src/headers/26/inspector/protocol_helper.h +27 -0
  111. package/src/headers/26/inspector/runtime_agent.h +41 -0
  112. package/src/headers/26/inspector/storage_agent.h +33 -0
  113. package/src/headers/26/inspector/target_agent.h +59 -0
  114. package/src/headers/26/inspector/target_manager.h +70 -0
  115. package/src/headers/26/inspector/tracing_agent.h +43 -0
  116. package/src/headers/26/inspector/worker_agent.h +40 -0
  117. package/src/headers/26/inspector/worker_inspector.h +124 -0
  118. package/src/headers/26/inspector_agent.h +168 -0
  119. package/src/headers/26/inspector_io.h +78 -0
  120. package/src/headers/26/inspector_profiler.h +149 -0
  121. package/src/headers/26/inspector_socket.h +60 -0
  122. package/src/headers/26/inspector_socket_server.h +110 -0
  123. package/src/headers/26/js_native_api.h +634 -0
  124. package/src/headers/26/js_native_api_types.h +244 -0
  125. package/src/headers/26/js_native_api_v8.h +485 -0
  126. package/src/headers/26/js_native_api_v8_internals.h +45 -0
  127. package/src/headers/26/js_stream.h +57 -0
  128. package/src/headers/26/json_utils.h +172 -0
  129. package/src/headers/26/large_pages/node_large_page.h +34 -0
  130. package/src/headers/26/lru_cache-inl.h +69 -0
  131. package/src/headers/26/memory_tracker-inl.h +461 -0
  132. package/src/headers/26/memory_tracker.h +341 -0
  133. package/src/headers/26/module_wrap.h +231 -0
  134. package/src/headers/26/ncrypto.h +2008 -0
  135. package/src/headers/26/node.h +1693 -0
  136. package/src/headers/26/node_api.h +265 -0
  137. package/src/headers/26/node_api_internals.h +48 -0
  138. package/src/headers/26/node_api_types.h +58 -0
  139. package/src/headers/26/node_binding.h +170 -0
  140. package/src/headers/26/node_blob.h +160 -0
  141. package/src/headers/26/node_bob-inl.h +36 -0
  142. package/src/headers/26/node_bob.h +107 -0
  143. package/src/headers/26/node_buffer.h +92 -0
  144. package/src/headers/26/node_builtins.h +239 -0
  145. package/src/headers/26/node_concepts.h +46 -0
  146. package/src/headers/26/node_config_file.h +77 -0
  147. package/src/headers/26/node_constants.h +82 -0
  148. package/src/headers/26/node_context_data.h +171 -0
  149. package/src/headers/26/node_contextify.h +261 -0
  150. package/src/headers/26/node_crypto.h +66 -0
  151. package/src/headers/26/node_debug.h +30 -0
  152. package/src/headers/26/node_diagnostics_channel.h +121 -0
  153. package/src/headers/26/node_dir.h +52 -0
  154. package/src/headers/26/node_dotenv.h +45 -0
  155. package/src/headers/26/node_errors.h +378 -0
  156. package/src/headers/26/node_exit_code.h +54 -0
  157. package/src/headers/26/node_external_reference.h +171 -0
  158. package/src/headers/26/node_ffi.h +212 -0
  159. package/src/headers/26/node_file-inl.h +421 -0
  160. package/src/headers/26/node_file.h +561 -0
  161. package/src/headers/26/node_file_utils.h +39 -0
  162. package/src/headers/26/node_hash.h +212 -0
  163. package/src/headers/26/node_http2.h +1202 -0
  164. package/src/headers/26/node_http2_state.h +159 -0
  165. package/src/headers/26/node_http_common-inl.h +199 -0
  166. package/src/headers/26/node_http_common.h +535 -0
  167. package/src/headers/26/node_i18n.h +132 -0
  168. package/src/headers/26/node_internals.h +485 -0
  169. package/src/headers/26/node_locks.h +184 -0
  170. package/src/headers/26/node_main_instance.h +67 -0
  171. package/src/headers/26/node_mem-inl.h +113 -0
  172. package/src/headers/26/node_mem.h +45 -0
  173. package/src/headers/26/node_messaging.h +389 -0
  174. package/src/headers/26/node_metadata.h +172 -0
  175. package/src/headers/26/node_modules.h +102 -0
  176. package/src/headers/26/node_mutex.h +323 -0
  177. package/src/headers/26/node_object_wrap.h +145 -0
  178. package/src/headers/26/node_options-inl.h +524 -0
  179. package/src/headers/26/node_options.h +710 -0
  180. package/src/headers/26/node_perf.h +167 -0
  181. package/src/headers/26/node_perf_common.h +103 -0
  182. package/src/headers/26/node_platform.h +290 -0
  183. package/src/headers/26/node_process-inl.h +26 -0
  184. package/src/headers/26/node_process.h +112 -0
  185. package/src/headers/26/node_profiling.h +38 -0
  186. package/src/headers/26/node_realm-inl.h +156 -0
  187. package/src/headers/26/node_realm.h +236 -0
  188. package/src/headers/26/node_report.h +43 -0
  189. package/src/headers/26/node_revert.h +82 -0
  190. package/src/headers/26/node_root_certs.h +2937 -0
  191. package/src/headers/26/node_sea.h +101 -0
  192. package/src/headers/26/node_shadow_realm.h +46 -0
  193. package/src/headers/26/node_snapshot_builder.h +57 -0
  194. package/src/headers/26/node_snapshotable.h +167 -0
  195. package/src/headers/26/node_sockaddr-inl.h +248 -0
  196. package/src/headers/26/node_sockaddr.h +459 -0
  197. package/src/headers/26/node_sqlite.h +607 -0
  198. package/src/headers/26/node_stat_watcher.h +73 -0
  199. package/src/headers/26/node_task_runner.h +92 -0
  200. package/src/headers/26/node_threadsafe_cow-inl.h +54 -0
  201. package/src/headers/26/node_threadsafe_cow.h +105 -0
  202. package/src/headers/26/node_union_bytes.h +81 -0
  203. package/src/headers/26/node_url.h +101 -0
  204. package/src/headers/26/node_url_pattern.h +118 -0
  205. package/src/headers/26/node_v8.h +78 -0
  206. package/src/headers/26/node_v8_embedder.h +26 -0
  207. package/src/headers/26/node_v8_platform-inl.h +96 -0
  208. package/src/headers/26/node_version.h +116 -0
  209. package/src/headers/26/node_wasi.h +184 -0
  210. package/src/headers/26/node_wasm_web_api.h +55 -0
  211. package/src/headers/26/node_watchdog.h +164 -0
  212. package/src/headers/26/node_webstorage.h +62 -0
  213. package/src/headers/26/node_worker.h +162 -0
  214. package/src/headers/26/path.h +36 -0
  215. package/src/headers/26/permission/boolean_permission.h +50 -0
  216. package/src/headers/26/permission/fs_permission.h +192 -0
  217. package/src/headers/26/permission/permission.h +155 -0
  218. package/src/headers/26/permission/permission_base.h +79 -0
  219. package/src/headers/26/pipe_wrap.h +80 -0
  220. package/src/headers/26/quic/application.h +279 -0
  221. package/src/headers/26/quic/arena.h +373 -0
  222. package/src/headers/26/quic/bindingdata.h +440 -0
  223. package/src/headers/26/quic/cid.h +127 -0
  224. package/src/headers/26/quic/data.h +358 -0
  225. package/src/headers/26/quic/defs.h +417 -0
  226. package/src/headers/26/quic/endpoint.h +519 -0
  227. package/src/headers/26/quic/guard.h +5 -0
  228. package/src/headers/26/quic/http3.h +25 -0
  229. package/src/headers/26/quic/packet.h +166 -0
  230. package/src/headers/26/quic/preferredaddress.h +72 -0
  231. package/src/headers/26/quic/session.h +770 -0
  232. package/src/headers/26/quic/session_manager.h +107 -0
  233. package/src/headers/26/quic/sessionticket.h +110 -0
  234. package/src/headers/26/quic/streams.h +518 -0
  235. package/src/headers/26/quic/tlscontext.h +353 -0
  236. package/src/headers/26/quic/tokens.h +263 -0
  237. package/src/headers/26/quic/transportparams.h +184 -0
  238. package/src/headers/26/req_wrap-inl.h +175 -0
  239. package/src/headers/26/req_wrap.h +79 -0
  240. package/src/headers/26/spawn_sync.h +243 -0
  241. package/src/headers/26/stream_base-inl.h +170 -0
  242. package/src/headers/26/stream_base.h +487 -0
  243. package/src/headers/26/stream_pipe.h +76 -0
  244. package/src/headers/26/stream_wrap.h +137 -0
  245. package/src/headers/26/string_bytes.h +114 -0
  246. package/src/headers/26/string_decoder-inl.h +31 -0
  247. package/src/headers/26/string_decoder.h +49 -0
  248. package/src/headers/26/tcp_wrap.h +138 -0
  249. package/src/headers/26/threadpoolwork-inl.h +70 -0
  250. package/src/headers/26/timer_wrap-inl.h +32 -0
  251. package/src/headers/26/timer_wrap.h +87 -0
  252. package/src/headers/26/timers.h +70 -0
  253. package/src/headers/26/tracing/agent.h +125 -0
  254. package/src/headers/26/tracing/agent_legacy.h +146 -0
  255. package/src/headers/26/tracing/agent_perfetto.h +145 -0
  256. package/src/headers/26/tracing/node_trace_buffer.h +91 -0
  257. package/src/headers/26/tracing/node_trace_writer.h +79 -0
  258. package/src/headers/26/tracing/trace_event.h +27 -0
  259. package/src/headers/26/tracing/trace_event_helper.h +40 -0
  260. package/src/headers/26/tracing/trace_event_legacy.h +1113 -0
  261. package/src/headers/26/tracing/trace_event_legacy_inl.h +711 -0
  262. package/src/headers/26/tracing/trace_event_perfetto.h +47 -0
  263. package/src/headers/26/tracing/traced_value.h +167 -0
  264. package/src/headers/26/tty_wrap.h +65 -0
  265. package/src/headers/26/udp_wrap.h +231 -0
  266. package/src/headers/26/undici_version.h +6 -0
  267. package/src/headers/26/util-inl.h +788 -0
  268. package/src/headers/26/util.h +1207 -0
  269. package/src/headers/26/v8-cpp-heap-external.h +56 -0
  270. package/src/headers/26/v8-external-memory-accounter.h +60 -0
  271. package/src/headers/26/v8-fast-api-calls.h +784 -0
  272. package/src/headers/26/v8-inspector-protocol.h +13 -0
  273. package/src/headers/26/v8-inspector.h +458 -0
  274. package/src/headers/26/v8-metrics.h +273 -0
  275. package/src/headers/26/v8-trace-categories.h +28 -0
  276. package/src/headers/26/v8-unwinder-state.h +30 -0
  277. package/src/headers/26/v8-util.h +549 -0
  278. package/src/headers/26/v8-value-serializer-version.h +24 -0
  279. package/src/headers/26/v8-version-string.h +38 -0
  280. package/src/headers/26/v8-wasm-trap-handler-posix.h +31 -0
  281. package/src/headers/26/v8-wasm-trap-handler-win.h +28 -0
  282. package/src/headers/26/zlib_version.h +6 -0
  283. package/dist/bindings/cws_darwin_arm64_node115.node.dSYM/Contents/Info.plist +0 -20
  284. package/dist/bindings/cws_darwin_arm64_node115.node.dSYM/Contents/Resources/DWARF/cws_darwin_arm64_node115.node +0 -0
  285. package/dist/bindings/cws_darwin_arm64_node115.node.dSYM/Contents/Resources/Relocations/aarch64/cws_darwin_arm64_node115.node.yml +0 -931
  286. package/dist/bindings/cws_darwin_arm64_node127.node.dSYM/Contents/Info.plist +0 -20
  287. package/dist/bindings/cws_darwin_arm64_node127.node.dSYM/Contents/Resources/DWARF/cws_darwin_arm64_node127.node +0 -0
  288. package/dist/bindings/cws_darwin_arm64_node127.node.dSYM/Contents/Resources/Relocations/aarch64/cws_darwin_arm64_node127.node.yml +0 -931
@@ -0,0 +1,171 @@
1
+ #ifndef SRC_NODE_EXTERNAL_REFERENCE_H_
2
+ #define SRC_NODE_EXTERNAL_REFERENCE_H_
3
+
4
+ #if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
5
+
6
+ #include <cinttypes>
7
+ #include <vector>
8
+ #include "quic/guard.h"
9
+ #include "v8-fast-api-calls.h"
10
+ #include "v8.h"
11
+
12
+ namespace node {
13
+
14
+ // This class manages the external references from the V8 heap
15
+ // to the C++ addresses in Node.js.
16
+ class ExternalReferenceRegistry {
17
+ public:
18
+ ExternalReferenceRegistry();
19
+
20
+ #define ALLOWED_EXTERNAL_REFERENCE_TYPES(V) \
21
+ V(v8::FunctionCallback) \
22
+ V(v8::AccessorNameGetterCallback) \
23
+ V(v8::AccessorNameSetterCallback) \
24
+ V(v8::NamedPropertyGetterCallback) \
25
+ V(v8::NamedPropertyDefinerCallback) \
26
+ V(v8::NamedPropertyDeleterCallback) \
27
+ V(v8::NamedPropertyEnumeratorCallback) \
28
+ V(v8::NamedPropertyQueryCallback) \
29
+ V(v8::NamedPropertySetterCallback) \
30
+ V(v8::IndexedPropertyGetterCallbackV2) \
31
+ V(v8::IndexedPropertySetterCallbackV2) \
32
+ V(v8::IndexedPropertyDefinerCallbackV2) \
33
+ V(v8::IndexedPropertyDeleterCallbackV2) \
34
+ V(v8::IndexedPropertyQueryCallbackV2) \
35
+ V(const v8::String::ExternalStringResourceBase*)
36
+
37
+ #define V(ExternalReferenceType) \
38
+ void Register(ExternalReferenceType addr) { RegisterT(addr); }
39
+ ALLOWED_EXTERNAL_REFERENCE_TYPES(V)
40
+ #undef V
41
+
42
+ // Registers both the underlying function pointer
43
+ // and the corresponding CFunctionInfo.
44
+ void Register(const v8::CFunction& c_func) {
45
+ RegisterT(c_func.GetAddress());
46
+ RegisterT(c_func.GetTypeInfo());
47
+ }
48
+
49
+ // This can be called only once.
50
+ const std::vector<intptr_t>& external_references();
51
+
52
+ bool is_empty() { return external_references_.empty(); }
53
+
54
+ private:
55
+ template <typename T>
56
+ void RegisterT(T* address) {
57
+ external_references_.push_back(reinterpret_cast<intptr_t>(address));
58
+ }
59
+ bool is_finalized_ = false;
60
+ std::vector<intptr_t> external_references_;
61
+ };
62
+
63
+ #define EXTERNAL_REFERENCE_BINDING_LIST_BASE(V) \
64
+ V(async_wrap) \
65
+ V(binding) \
66
+ V(blob) \
67
+ V(buffer) \
68
+ V(builtins) \
69
+ V(cares_wrap) \
70
+ V(cjs_lexer) \
71
+ V(config) \
72
+ V(contextify) \
73
+ V(credentials) \
74
+ V(diagnostics_channel) \
75
+ V(encoding_binding) \
76
+ V(env_var) \
77
+ V(errors) \
78
+ V(fs) \
79
+ V(fs_dir) \
80
+ V(fs_event_wrap) \
81
+ V(handle_wrap) \
82
+ V(heap_utils) \
83
+ V(http_parser) \
84
+ V(internal_only_v8) \
85
+ V(ipc_serdes) \
86
+ V(locks) \
87
+ V(messaging) \
88
+ V(mksnapshot) \
89
+ V(module_wrap) \
90
+ V(modules) \
91
+ V(options) \
92
+ V(os) \
93
+ V(performance) \
94
+ V(permission) \
95
+ V(process_methods) \
96
+ V(process_object) \
97
+ V(process_wrap) \
98
+ V(report) \
99
+ V(task_queue) \
100
+ V(tcp_wrap) \
101
+ V(tty_wrap) \
102
+ V(udp_wrap) \
103
+ V(url) \
104
+ V(url_pattern) \
105
+ V(util) \
106
+ V(pipe_wrap) \
107
+ V(sea) \
108
+ V(serdes) \
109
+ V(string_decoder) \
110
+ V(stream_wrap) \
111
+ V(signal_wrap) \
112
+ V(spawn_sync) \
113
+ V(trace_events) \
114
+ V(timers) \
115
+ V(types) \
116
+ V(uv) \
117
+ V(v8) \
118
+ V(zlib) \
119
+ V(wasm_web_api) \
120
+ V(worker)
121
+
122
+ #if NODE_HAVE_I18N_SUPPORT
123
+ #define EXTERNAL_REFERENCE_BINDING_LIST_I18N(V) V(icu)
124
+ #else
125
+ #define EXTERNAL_REFERENCE_BINDING_LIST_I18N(V)
126
+ #endif // NODE_HAVE_I18N_SUPPORT
127
+
128
+ #if HAVE_INSPECTOR
129
+ #define EXTERNAL_REFERENCE_BINDING_LIST_INSPECTOR(V) \
130
+ V(inspector) \
131
+ V(profiler)
132
+ #else
133
+ #define EXTERNAL_REFERENCE_BINDING_LIST_INSPECTOR(V)
134
+ #endif // HAVE_INSPECTOR
135
+
136
+ #if HAVE_OPENSSL
137
+ #define EXTERNAL_REFERENCE_BINDING_LIST_CRYPTO(V) V(crypto) V(tls_wrap)
138
+ #else
139
+ #define EXTERNAL_REFERENCE_BINDING_LIST_CRYPTO(V)
140
+ #endif // HAVE_OPENSSL
141
+
142
+ #if HAVE_OPENSSL && OPENSSL_NO_QUIC != 1
143
+ #define EXTERNAL_REFERENCE_BINDING_LIST_QUIC(V) V(quic)
144
+ #else
145
+ #define EXTERNAL_REFERENCE_BINDING_LIST_QUIC(V)
146
+ #endif
147
+
148
+ #define EXTERNAL_REFERENCE_BINDING_LIST(V) \
149
+ EXTERNAL_REFERENCE_BINDING_LIST_BASE(V) \
150
+ EXTERNAL_REFERENCE_BINDING_LIST_INSPECTOR(V) \
151
+ EXTERNAL_REFERENCE_BINDING_LIST_I18N(V) \
152
+ EXTERNAL_REFERENCE_BINDING_LIST_CRYPTO(V) \
153
+ EXTERNAL_REFERENCE_BINDING_LIST_QUIC(V)
154
+
155
+ } // namespace node
156
+
157
+ // Declare all the external reference registration functions here,
158
+ // and define them later with #NODE_BINDING_EXTERNAL_REFERENCE(modname, func);
159
+ #define V(modname) \
160
+ void _register_external_reference_##modname( \
161
+ node::ExternalReferenceRegistry* registry);
162
+ EXTERNAL_REFERENCE_BINDING_LIST(V)
163
+ #undef V
164
+
165
+ #define NODE_BINDING_EXTERNAL_REFERENCE(modname, func) \
166
+ void _register_external_reference_##modname( \
167
+ node::ExternalReferenceRegistry* registry) { \
168
+ func(registry); \
169
+ }
170
+ #endif // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
171
+ #endif // SRC_NODE_EXTERNAL_REFERENCE_H_
@@ -0,0 +1,212 @@
1
+ #pragma once
2
+
3
+ #if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
4
+
5
+ #include "base_object.h"
6
+ #include "ffi.h"
7
+ #include "ffi/fast.h"
8
+ #include "uv.h"
9
+
10
+ #include <cstdint>
11
+ #include <memory>
12
+ #include <string>
13
+ #include <thread>
14
+ #include <unordered_map>
15
+ #include <vector>
16
+
17
+ // libffi only accelerates reusable call plans on x86-64 System V. Other
18
+ // targets implement the API by calling ffi_call(), which adds no benefit.
19
+ #if defined(FFI_VERSION_NUMBER) && FFI_VERSION_NUMBER >= 30700 && \
20
+ defined(__x86_64__) && !defined(__ILP32__) && !defined(X86_WIN64) && \
21
+ !defined(_WIN32)
22
+ #define NODE_FFI_HAS_FAST_CALL_PLAN 1
23
+ #endif
24
+
25
+ namespace node::ffi {
26
+
27
+ class DynamicLibrary;
28
+ struct FFIFunction;
29
+
30
+ struct FFIFunction {
31
+ FFIFunction() = default;
32
+ FFIFunction(const FFIFunction&) = delete;
33
+ FFIFunction& operator=(const FFIFunction&) = delete;
34
+ FFIFunction(FFIFunction&&) = delete;
35
+ FFIFunction& operator=(FFIFunction&&) = delete;
36
+
37
+ bool closed = false;
38
+
39
+ void* ptr = nullptr;
40
+ ffi_cif cif = {};
41
+ std::vector<ffi_type*> args;
42
+ ffi_type* return_type = nullptr;
43
+ std::vector<std::string> arg_type_names;
44
+ std::string return_type_name;
45
+ #if defined(NODE_FFI_HAS_FAST_CALL_PLAN)
46
+ // The plan borrows cif, so it must remain uniquely owned by this instance.
47
+ std::unique_ptr<ffi_call_plan, decltype(&ffi_call_plan_free)> call_plan{
48
+ nullptr, ffi_call_plan_free};
49
+ #endif
50
+
51
+ void Invoke(void* result, void** values);
52
+ };
53
+
54
+ class FFIFunctionInfo final : public BaseObject {
55
+ public:
56
+ enum InternalFields {
57
+ kLibrary = BaseObject::kInternalFieldCount,
58
+ kInternalFieldCount
59
+ };
60
+
61
+ FFIFunctionInfo(Environment* env,
62
+ v8::Local<v8::Object> object,
63
+ std::shared_ptr<FFIFunction> fn,
64
+ DynamicLibrary* library);
65
+
66
+ void MemoryInfo(MemoryTracker* tracker) const override;
67
+ SET_MEMORY_INFO_NAME(FFIFunctionInfo)
68
+ SET_SELF_SIZE(FFIFunctionInfo)
69
+
70
+ static BaseObjectPtr<FFIFunctionInfo> Create(Environment* env,
71
+ std::shared_ptr<FFIFunction> fn,
72
+ DynamicLibrary* library);
73
+ static v8::Local<v8::FunctionTemplate> GetConstructorTemplate(
74
+ IsolateData* isolate_data);
75
+
76
+ private:
77
+ std::shared_ptr<FFIFunction> fn;
78
+ std::shared_ptr<v8::BackingStore> sb_backing;
79
+ std::unique_ptr<FastFFIMetadata> fast_metadata;
80
+ std::unique_ptr<FastFFIMetadata> fast_buffer_metadata;
81
+
82
+ friend class DynamicLibrary;
83
+ };
84
+
85
+ struct FFICallback {
86
+ DynamicLibrary* owner;
87
+ Environment* env;
88
+ std::thread::id thread_id;
89
+ v8::Global<v8::Function> fn;
90
+ ffi_closure* closure;
91
+
92
+ void* ptr;
93
+ ffi_cif cif;
94
+ std::vector<ffi_type*> args;
95
+ ffi_type* return_type;
96
+
97
+ ~FFICallback() {
98
+ if (!fn.IsEmpty()) {
99
+ fn.Reset();
100
+ }
101
+
102
+ if (closure != nullptr) {
103
+ ffi_closure_free(closure);
104
+ closure = nullptr;
105
+ }
106
+ }
107
+ };
108
+
109
+ struct ResolvedFunction {
110
+ std::string name;
111
+ std::shared_ptr<FFIFunction> fn;
112
+ bool should_cache_symbol;
113
+ bool should_cache_function;
114
+ };
115
+
116
+ class DynamicLibrary : public BaseObject {
117
+ public:
118
+ DynamicLibrary(Environment* env, v8::Local<v8::Object> object);
119
+ ~DynamicLibrary() override;
120
+
121
+ void MemoryInfo(MemoryTracker* tracker) const override;
122
+
123
+ static v8::Local<v8::FunctionTemplate> GetConstructorTemplate(
124
+ Environment* env);
125
+ static void New(const v8::FunctionCallbackInfo<v8::Value>& args);
126
+ static void Close(const v8::FunctionCallbackInfo<v8::Value>& args);
127
+ static void InvokeFunction(const v8::FunctionCallbackInfo<v8::Value>& args);
128
+ static void InvokeFunctionSB(const v8::FunctionCallbackInfo<v8::Value>& args);
129
+ static void InvokeCallback(ffi_cif* cif,
130
+ void* ret,
131
+ void** args,
132
+ void* user_data);
133
+
134
+ static void GetPath(const v8::FunctionCallbackInfo<v8::Value>& args);
135
+ static void GetFunction(const v8::FunctionCallbackInfo<v8::Value>& args);
136
+ static void GetFunctions(const v8::FunctionCallbackInfo<v8::Value>& args);
137
+ static void GetSymbol(const v8::FunctionCallbackInfo<v8::Value>& args);
138
+ static void GetSymbols(const v8::FunctionCallbackInfo<v8::Value>& args);
139
+
140
+ static void RegisterCallback(const v8::FunctionCallbackInfo<v8::Value>& args);
141
+ static void UnregisterCallback(
142
+ const v8::FunctionCallbackInfo<v8::Value>& args);
143
+ static void RefCallback(const v8::FunctionCallbackInfo<v8::Value>& args);
144
+ static void UnrefCallback(const v8::FunctionCallbackInfo<v8::Value>& args);
145
+
146
+ SET_MEMORY_INFO_NAME(DynamicLibrary)
147
+ SET_SELF_SIZE(DynamicLibrary)
148
+
149
+ private:
150
+ void Close();
151
+ v8::Maybe<void*> ResolveSymbol(Environment* env, const std::string& name);
152
+ struct PreparedFunction {
153
+ std::shared_ptr<FFIFunction> fn;
154
+ bool should_cache_symbol;
155
+ bool should_cache_function;
156
+ };
157
+ v8::Maybe<PreparedFunction> PrepareFunction(Environment* env,
158
+ const std::string& name,
159
+ v8::Local<v8::Object> signature);
160
+ v8::MaybeLocal<v8::Function> CreateFunction(
161
+ Environment* env,
162
+ const std::string& name,
163
+ const std::shared_ptr<FFIFunction>& fn);
164
+ static void CleanupFunctionInfo(
165
+ const v8::WeakCallbackInfo<FFIFunctionInfo>& data);
166
+ bool is_closed() const;
167
+
168
+ uv_lib_t lib_ = {};
169
+ std::string path_;
170
+ std::unordered_map<std::string, void*> symbols_;
171
+ std::unordered_map<std::string, std::shared_ptr<FFIFunction>> functions_;
172
+ // Callables created for `functions_`, so repeated resolution of the same
173
+ // symbol reuses one wrapper instead of emitting another trampoline. The
174
+ // handles are weak: an entry disappears once user code drops the wrapper,
175
+ // which keeps the map from rooting the library through the wrapper's
176
+ // FFIFunctionInfo.
177
+ std::unordered_map<std::string, v8::Global<v8::Function>> function_wrappers_;
178
+ std::unordered_map<void*, std::unique_ptr<FFICallback>> callbacks_;
179
+ };
180
+
181
+ void GetInt8(const v8::FunctionCallbackInfo<v8::Value>& args);
182
+ void GetUint8(const v8::FunctionCallbackInfo<v8::Value>& args);
183
+ void GetInt16(const v8::FunctionCallbackInfo<v8::Value>& args);
184
+ void GetUint16(const v8::FunctionCallbackInfo<v8::Value>& args);
185
+ void GetInt32(const v8::FunctionCallbackInfo<v8::Value>& args);
186
+ void GetUint32(const v8::FunctionCallbackInfo<v8::Value>& args);
187
+ void GetInt64(const v8::FunctionCallbackInfo<v8::Value>& args);
188
+ void GetUint64(const v8::FunctionCallbackInfo<v8::Value>& args);
189
+ void GetFloat32(const v8::FunctionCallbackInfo<v8::Value>& args);
190
+ void GetFloat64(const v8::FunctionCallbackInfo<v8::Value>& args);
191
+
192
+ void SetInt8(const v8::FunctionCallbackInfo<v8::Value>& args);
193
+ void SetUint8(const v8::FunctionCallbackInfo<v8::Value>& args);
194
+ void SetInt16(const v8::FunctionCallbackInfo<v8::Value>& args);
195
+ void SetUint16(const v8::FunctionCallbackInfo<v8::Value>& args);
196
+ void SetInt32(const v8::FunctionCallbackInfo<v8::Value>& args);
197
+ void SetUint32(const v8::FunctionCallbackInfo<v8::Value>& args);
198
+ void SetInt64(const v8::FunctionCallbackInfo<v8::Value>& args);
199
+ void SetUint64(const v8::FunctionCallbackInfo<v8::Value>& args);
200
+ void SetFloat32(const v8::FunctionCallbackInfo<v8::Value>& args);
201
+ void SetFloat64(const v8::FunctionCallbackInfo<v8::Value>& args);
202
+
203
+ void ToString(const v8::FunctionCallbackInfo<v8::Value>& args);
204
+ void ToBuffer(const v8::FunctionCallbackInfo<v8::Value>& args);
205
+ void ToArrayBuffer(const v8::FunctionCallbackInfo<v8::Value>& args);
206
+ void ExportBytes(const v8::FunctionCallbackInfo<v8::Value>& args);
207
+ void GetRawPointer(const v8::FunctionCallbackInfo<v8::Value>& args);
208
+ void GetCurrentEventLoop(const v8::FunctionCallbackInfo<v8::Value>& args);
209
+
210
+ } // namespace node::ffi
211
+
212
+ #endif // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS