@encharm/cws 4.5.2 → 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 (284) hide show
  1. package/CHANGELOG.md +9 -0
  2. package/CLAUDE.md +81 -0
  3. package/README.md +10 -5
  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/24/tracing/agent.h +195 -0
  30. package/src/headers/24/tracing/trace_event.h +722 -0
  31. package/src/headers/26/acorn_version.h +6 -0
  32. package/src/headers/26/aliased_buffer-inl.h +264 -0
  33. package/src/headers/26/aliased_buffer.h +205 -0
  34. package/src/headers/26/aliased_struct-inl.h +143 -0
  35. package/src/headers/26/aliased_struct.h +248 -0
  36. package/src/headers/26/amaro_version.h +6 -0
  37. package/src/headers/26/async_context_frame.h +33 -0
  38. package/src/headers/26/async_wrap-inl.h +123 -0
  39. package/src/headers/26/async_wrap.h +254 -0
  40. package/src/headers/26/base_object-inl.h +333 -0
  41. package/src/headers/26/base_object.h +339 -0
  42. package/src/headers/26/base_object_types.h +76 -0
  43. package/src/headers/26/blob_serializer_deserializer-inl.h +385 -0
  44. package/src/headers/26/blob_serializer_deserializer.h +142 -0
  45. package/src/headers/26/builtin_info.h +57 -0
  46. package/src/headers/26/callback_queue-inl.h +97 -0
  47. package/src/headers/26/callback_queue.h +79 -0
  48. package/src/headers/26/cares_wrap.h +475 -0
  49. package/src/headers/26/cleanup_queue-inl.h +36 -0
  50. package/src/headers/26/cleanup_queue.h +79 -0
  51. package/src/headers/26/compile_cache.h +134 -0
  52. package/src/headers/26/connect_wrap.h +26 -0
  53. package/src/headers/26/connection_wrap.h +30 -0
  54. package/src/headers/26/cppgc_helpers-inl.h +69 -0
  55. package/src/headers/26/cppgc_helpers.h +162 -0
  56. package/src/headers/26/crypto/crypto_aes.h +107 -0
  57. package/src/headers/26/crypto/crypto_argon2.h +88 -0
  58. package/src/headers/26/crypto/crypto_bio.h +193 -0
  59. package/src/headers/26/crypto/crypto_chacha20_poly1305.h +62 -0
  60. package/src/headers/26/crypto/crypto_cipher.h +291 -0
  61. package/src/headers/26/crypto/crypto_common.h +48 -0
  62. package/src/headers/26/crypto/crypto_context.h +219 -0
  63. package/src/headers/26/crypto/crypto_dh.h +104 -0
  64. package/src/headers/26/crypto/crypto_dsa.h +50 -0
  65. package/src/headers/26/crypto/crypto_ec.h +102 -0
  66. package/src/headers/26/crypto/crypto_hash.h +157 -0
  67. package/src/headers/26/crypto/crypto_hkdf.h +62 -0
  68. package/src/headers/26/crypto/crypto_hmac.h +92 -0
  69. package/src/headers/26/crypto/crypto_kem.h +131 -0
  70. package/src/headers/26/crypto/crypto_keygen.h +382 -0
  71. package/src/headers/26/crypto/crypto_keys.h +366 -0
  72. package/src/headers/26/crypto/crypto_kmac.h +79 -0
  73. package/src/headers/26/crypto/crypto_pbkdf2.h +76 -0
  74. package/src/headers/26/crypto/crypto_pqc.h +39 -0
  75. package/src/headers/26/crypto/crypto_random.h +127 -0
  76. package/src/headers/26/crypto/crypto_rsa.h +108 -0
  77. package/src/headers/26/crypto/crypto_scrypt.h +85 -0
  78. package/src/headers/26/crypto/crypto_sig.h +159 -0
  79. package/src/headers/26/crypto/crypto_spkac.h +21 -0
  80. package/src/headers/26/crypto/crypto_timing.h +20 -0
  81. package/src/headers/26/crypto/crypto_tls.h +342 -0
  82. package/src/headers/26/crypto/crypto_turboshake.h +105 -0
  83. package/src/headers/26/crypto/crypto_util.h +775 -0
  84. package/src/headers/26/crypto/crypto_x509.h +140 -0
  85. package/src/headers/26/dataqueue/queue.h +311 -0
  86. package/src/headers/26/debug_utils-inl.h +291 -0
  87. package/src/headers/26/debug_utils.h +200 -0
  88. package/src/headers/26/diagnosticfilename-inl.h +33 -0
  89. package/src/headers/26/embedded_data.h +17 -0
  90. package/src/headers/26/encoding_binding.h +59 -0
  91. package/src/headers/26/env-inl.h +956 -0
  92. package/src/headers/26/env.h +1294 -0
  93. package/src/headers/26/env_properties.h +562 -0
  94. package/src/headers/26/ffi/data.h +30 -0
  95. package/src/headers/26/ffi/fast.h +96 -0
  96. package/src/headers/26/ffi/jit_memory.h +26 -0
  97. package/src/headers/26/ffi/types.h +99 -0
  98. package/src/headers/26/handle_wrap.h +123 -0
  99. package/src/headers/26/histogram-inl.h +211 -0
  100. package/src/headers/26/histogram.h +474 -0
  101. package/src/headers/26/inspector/dom_storage_agent.h +68 -0
  102. package/src/headers/26/inspector/inspector_object_utils.h +38 -0
  103. package/src/headers/26/inspector/io_agent.h +30 -0
  104. package/src/headers/26/inspector/main_thread_interface.h +116 -0
  105. package/src/headers/26/inspector/network_agent.h +110 -0
  106. package/src/headers/26/inspector/network_inspector.h +45 -0
  107. package/src/headers/26/inspector/network_requests_buffer.h +195 -0
  108. package/src/headers/26/inspector/network_resource_manager.h +29 -0
  109. package/src/headers/26/inspector/node_json.h +24 -0
  110. package/src/headers/26/inspector/node_string.h +101 -0
  111. package/src/headers/26/inspector/notification_emitter.h +38 -0
  112. package/src/headers/26/inspector/protocol_helper.h +27 -0
  113. package/src/headers/26/inspector/runtime_agent.h +41 -0
  114. package/src/headers/26/inspector/storage_agent.h +33 -0
  115. package/src/headers/26/inspector/target_agent.h +59 -0
  116. package/src/headers/26/inspector/target_manager.h +70 -0
  117. package/src/headers/26/inspector/tracing_agent.h +43 -0
  118. package/src/headers/26/inspector/worker_agent.h +40 -0
  119. package/src/headers/26/inspector/worker_inspector.h +124 -0
  120. package/src/headers/26/inspector_agent.h +168 -0
  121. package/src/headers/26/inspector_io.h +78 -0
  122. package/src/headers/26/inspector_profiler.h +149 -0
  123. package/src/headers/26/inspector_socket.h +60 -0
  124. package/src/headers/26/inspector_socket_server.h +110 -0
  125. package/src/headers/26/js_native_api.h +634 -0
  126. package/src/headers/26/js_native_api_types.h +244 -0
  127. package/src/headers/26/js_native_api_v8.h +485 -0
  128. package/src/headers/26/js_native_api_v8_internals.h +45 -0
  129. package/src/headers/26/js_stream.h +57 -0
  130. package/src/headers/26/json_utils.h +172 -0
  131. package/src/headers/26/large_pages/node_large_page.h +34 -0
  132. package/src/headers/26/lru_cache-inl.h +69 -0
  133. package/src/headers/26/memory_tracker-inl.h +461 -0
  134. package/src/headers/26/memory_tracker.h +341 -0
  135. package/src/headers/26/module_wrap.h +231 -0
  136. package/src/headers/26/ncrypto.h +2008 -0
  137. package/src/headers/26/node.h +1693 -0
  138. package/src/headers/26/node_api.h +265 -0
  139. package/src/headers/26/node_api_internals.h +48 -0
  140. package/src/headers/26/node_api_types.h +58 -0
  141. package/src/headers/26/node_binding.h +170 -0
  142. package/src/headers/26/node_blob.h +160 -0
  143. package/src/headers/26/node_bob-inl.h +36 -0
  144. package/src/headers/26/node_bob.h +107 -0
  145. package/src/headers/26/node_buffer.h +92 -0
  146. package/src/headers/26/node_builtins.h +239 -0
  147. package/src/headers/26/node_concepts.h +46 -0
  148. package/src/headers/26/node_config_file.h +77 -0
  149. package/src/headers/26/node_constants.h +82 -0
  150. package/src/headers/26/node_context_data.h +171 -0
  151. package/src/headers/26/node_contextify.h +261 -0
  152. package/src/headers/26/node_crypto.h +66 -0
  153. package/src/headers/26/node_debug.h +30 -0
  154. package/src/headers/26/node_diagnostics_channel.h +121 -0
  155. package/src/headers/26/node_dir.h +52 -0
  156. package/src/headers/26/node_dotenv.h +45 -0
  157. package/src/headers/26/node_errors.h +378 -0
  158. package/src/headers/26/node_exit_code.h +54 -0
  159. package/src/headers/26/node_external_reference.h +171 -0
  160. package/src/headers/26/node_ffi.h +212 -0
  161. package/src/headers/26/node_file-inl.h +421 -0
  162. package/src/headers/26/node_file.h +561 -0
  163. package/src/headers/26/node_file_utils.h +39 -0
  164. package/src/headers/26/node_hash.h +212 -0
  165. package/src/headers/26/node_http2.h +1202 -0
  166. package/src/headers/26/node_http2_state.h +159 -0
  167. package/src/headers/26/node_http_common-inl.h +199 -0
  168. package/src/headers/26/node_http_common.h +535 -0
  169. package/src/headers/26/node_i18n.h +132 -0
  170. package/src/headers/26/node_internals.h +485 -0
  171. package/src/headers/26/node_locks.h +184 -0
  172. package/src/headers/26/node_main_instance.h +67 -0
  173. package/src/headers/26/node_mem-inl.h +113 -0
  174. package/src/headers/26/node_mem.h +45 -0
  175. package/src/headers/26/node_messaging.h +389 -0
  176. package/src/headers/26/node_metadata.h +172 -0
  177. package/src/headers/26/node_modules.h +102 -0
  178. package/src/headers/26/node_mutex.h +323 -0
  179. package/src/headers/26/node_object_wrap.h +145 -0
  180. package/src/headers/26/node_options-inl.h +524 -0
  181. package/src/headers/26/node_options.h +710 -0
  182. package/src/headers/26/node_perf.h +167 -0
  183. package/src/headers/26/node_perf_common.h +103 -0
  184. package/src/headers/26/node_platform.h +290 -0
  185. package/src/headers/26/node_process-inl.h +26 -0
  186. package/src/headers/26/node_process.h +112 -0
  187. package/src/headers/26/node_profiling.h +38 -0
  188. package/src/headers/26/node_realm-inl.h +156 -0
  189. package/src/headers/26/node_realm.h +236 -0
  190. package/src/headers/26/node_report.h +43 -0
  191. package/src/headers/26/node_revert.h +82 -0
  192. package/src/headers/26/node_root_certs.h +2937 -0
  193. package/src/headers/26/node_sea.h +101 -0
  194. package/src/headers/26/node_shadow_realm.h +46 -0
  195. package/src/headers/26/node_snapshot_builder.h +57 -0
  196. package/src/headers/26/node_snapshotable.h +167 -0
  197. package/src/headers/26/node_sockaddr-inl.h +248 -0
  198. package/src/headers/26/node_sockaddr.h +459 -0
  199. package/src/headers/26/node_sqlite.h +607 -0
  200. package/src/headers/26/node_stat_watcher.h +73 -0
  201. package/src/headers/26/node_task_runner.h +92 -0
  202. package/src/headers/26/node_threadsafe_cow-inl.h +54 -0
  203. package/src/headers/26/node_threadsafe_cow.h +105 -0
  204. package/src/headers/26/node_union_bytes.h +81 -0
  205. package/src/headers/26/node_url.h +101 -0
  206. package/src/headers/26/node_url_pattern.h +118 -0
  207. package/src/headers/26/node_v8.h +78 -0
  208. package/src/headers/26/node_v8_embedder.h +26 -0
  209. package/src/headers/26/node_v8_platform-inl.h +96 -0
  210. package/src/headers/26/node_version.h +116 -0
  211. package/src/headers/26/node_wasi.h +184 -0
  212. package/src/headers/26/node_wasm_web_api.h +55 -0
  213. package/src/headers/26/node_watchdog.h +164 -0
  214. package/src/headers/26/node_webstorage.h +62 -0
  215. package/src/headers/26/node_worker.h +162 -0
  216. package/src/headers/26/path.h +36 -0
  217. package/src/headers/26/permission/boolean_permission.h +50 -0
  218. package/src/headers/26/permission/fs_permission.h +192 -0
  219. package/src/headers/26/permission/permission.h +155 -0
  220. package/src/headers/26/permission/permission_base.h +79 -0
  221. package/src/headers/26/pipe_wrap.h +80 -0
  222. package/src/headers/26/quic/application.h +279 -0
  223. package/src/headers/26/quic/arena.h +373 -0
  224. package/src/headers/26/quic/bindingdata.h +440 -0
  225. package/src/headers/26/quic/cid.h +127 -0
  226. package/src/headers/26/quic/data.h +358 -0
  227. package/src/headers/26/quic/defs.h +417 -0
  228. package/src/headers/26/quic/endpoint.h +519 -0
  229. package/src/headers/26/quic/guard.h +5 -0
  230. package/src/headers/26/quic/http3.h +25 -0
  231. package/src/headers/26/quic/packet.h +166 -0
  232. package/src/headers/26/quic/preferredaddress.h +72 -0
  233. package/src/headers/26/quic/session.h +770 -0
  234. package/src/headers/26/quic/session_manager.h +107 -0
  235. package/src/headers/26/quic/sessionticket.h +110 -0
  236. package/src/headers/26/quic/streams.h +518 -0
  237. package/src/headers/26/quic/tlscontext.h +353 -0
  238. package/src/headers/26/quic/tokens.h +263 -0
  239. package/src/headers/26/quic/transportparams.h +184 -0
  240. package/src/headers/26/req_wrap-inl.h +175 -0
  241. package/src/headers/26/req_wrap.h +79 -0
  242. package/src/headers/26/spawn_sync.h +243 -0
  243. package/src/headers/26/stream_base-inl.h +170 -0
  244. package/src/headers/26/stream_base.h +487 -0
  245. package/src/headers/26/stream_pipe.h +76 -0
  246. package/src/headers/26/stream_wrap.h +137 -0
  247. package/src/headers/26/string_bytes.h +114 -0
  248. package/src/headers/26/string_decoder-inl.h +31 -0
  249. package/src/headers/26/string_decoder.h +49 -0
  250. package/src/headers/26/tcp_wrap.h +138 -0
  251. package/src/headers/26/threadpoolwork-inl.h +70 -0
  252. package/src/headers/26/timer_wrap-inl.h +32 -0
  253. package/src/headers/26/timer_wrap.h +87 -0
  254. package/src/headers/26/timers.h +70 -0
  255. package/src/headers/26/tracing/agent.h +125 -0
  256. package/src/headers/26/tracing/agent_legacy.h +146 -0
  257. package/src/headers/26/tracing/agent_perfetto.h +145 -0
  258. package/src/headers/26/tracing/node_trace_buffer.h +91 -0
  259. package/src/headers/26/tracing/node_trace_writer.h +79 -0
  260. package/src/headers/26/tracing/trace_event.h +27 -0
  261. package/src/headers/26/tracing/trace_event_helper.h +40 -0
  262. package/src/headers/26/tracing/trace_event_legacy.h +1113 -0
  263. package/src/headers/26/tracing/trace_event_legacy_inl.h +711 -0
  264. package/src/headers/26/tracing/trace_event_perfetto.h +47 -0
  265. package/src/headers/26/tracing/traced_value.h +167 -0
  266. package/src/headers/26/tty_wrap.h +65 -0
  267. package/src/headers/26/udp_wrap.h +231 -0
  268. package/src/headers/26/undici_version.h +6 -0
  269. package/src/headers/26/util-inl.h +788 -0
  270. package/src/headers/26/util.h +1207 -0
  271. package/src/headers/26/v8-cpp-heap-external.h +56 -0
  272. package/src/headers/26/v8-external-memory-accounter.h +60 -0
  273. package/src/headers/26/v8-fast-api-calls.h +784 -0
  274. package/src/headers/26/v8-inspector-protocol.h +13 -0
  275. package/src/headers/26/v8-inspector.h +458 -0
  276. package/src/headers/26/v8-metrics.h +273 -0
  277. package/src/headers/26/v8-trace-categories.h +28 -0
  278. package/src/headers/26/v8-unwinder-state.h +30 -0
  279. package/src/headers/26/v8-util.h +549 -0
  280. package/src/headers/26/v8-value-serializer-version.h +24 -0
  281. package/src/headers/26/v8-version-string.h +38 -0
  282. package/src/headers/26/v8-wasm-trap-handler-posix.h +31 -0
  283. package/src/headers/26/v8-wasm-trap-handler-win.h +28 -0
  284. package/src/headers/26/zlib_version.h +6 -0
@@ -0,0 +1,461 @@
1
+ #ifndef SRC_MEMORY_TRACKER_INL_H_
2
+ #define SRC_MEMORY_TRACKER_INL_H_
3
+
4
+ #if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
5
+
6
+ #include "cppgc_helpers.h"
7
+ #include "memory_tracker.h"
8
+ #include "util-inl.h"
9
+
10
+ namespace node {
11
+
12
+ // Fallback edge_name if node_name is not available, or "" if edge_name
13
+ // is not available either.
14
+ inline const char* GetNodeName(const char* node_name, const char* edge_name) {
15
+ if (node_name != nullptr) {
16
+ return node_name;
17
+ }
18
+ if (edge_name != nullptr) {
19
+ return edge_name;
20
+ }
21
+ return "";
22
+ }
23
+
24
+ class MemoryRetainerNode : public v8::EmbedderGraph::Node {
25
+ public:
26
+ inline MemoryRetainerNode(MemoryTracker* tracker,
27
+ const MemoryRetainer* retainer)
28
+ : retainer_(retainer) {
29
+ CHECK_NOT_NULL(retainer_);
30
+ v8::HandleScope handle_scope(tracker->isolate());
31
+ v8::Local<v8::Object> obj = retainer_->WrappedObject();
32
+ if (!obj.IsEmpty())
33
+ wrapper_node_ = tracker->graph()->V8Node(obj.As<v8::Value>());
34
+
35
+ name_ = retainer_->MemoryInfoName();
36
+ size_ = retainer_->SelfSize();
37
+ detachedness_ = retainer_->GetDetachedness();
38
+ }
39
+
40
+ inline MemoryRetainerNode(MemoryTracker* tracker, const CppgcMixin* mixin)
41
+ : retainer_(mixin) {
42
+ // In this case, the MemoryRetainerNode is merely a wrapper
43
+ // to be used in the NodeMap and stack. The actual node being using to add
44
+ // edges is always the merged wrapper node of the cppgc-managed wrapper.
45
+ CHECK_NOT_NULL(retainer_);
46
+ v8::Isolate* isolate = tracker->isolate();
47
+ v8::HandleScope handle_scope(isolate);
48
+ v8::Local<v8::Object> obj = mixin->object(isolate);
49
+ wrapper_node_ = tracker->graph()->V8Node(obj.As<v8::Value>());
50
+
51
+ name_ = retainer_->MemoryInfoName();
52
+ size_ = 0;
53
+ detachedness_ = retainer_->GetDetachedness();
54
+ }
55
+
56
+ inline MemoryRetainerNode(MemoryTracker* tracker,
57
+ const char* name,
58
+ size_t size,
59
+ bool is_root_node = false)
60
+ : retainer_(nullptr) {
61
+ name_ = name;
62
+ size_ = size;
63
+ is_root_node_ = is_root_node;
64
+ }
65
+
66
+ const char* Name() override { return name_; }
67
+ const char* NamePrefix() override { return "Node /"; }
68
+ size_t SizeInBytes() override { return size_; }
69
+ // TODO(addaleax): Merging this with the "official" WrapperNode() method
70
+ // seems to lose accuracy, e.g. SizeInBytes() is disregarded.
71
+ // Figure out whether to do anything about that.
72
+ Node* JSWrapperNode() { return wrapper_node_; }
73
+
74
+ bool IsRootNode() override {
75
+ if (retainer_ != nullptr) {
76
+ return retainer_->IsRootNode();
77
+ }
78
+ return is_root_node_;
79
+ }
80
+
81
+ bool IsCppgcWrapper() const {
82
+ return retainer_ != nullptr && retainer_->IsCppgcWrapper();
83
+ }
84
+
85
+ v8::EmbedderGraph::Node::Detachedness GetDetachedness() override {
86
+ return detachedness_;
87
+ }
88
+
89
+ private:
90
+ friend class MemoryTracker;
91
+
92
+ // If retainer_ is not nullptr, then it must have a wrapper_node_,
93
+ // and we have
94
+ // name_ == retainer_->MemoryInfoName()
95
+ // size_ == retainer_->SelfSize()
96
+ // is_root_node_ == retainer_->IsRootNode()
97
+ const MemoryRetainer* retainer_;
98
+ Node* wrapper_node_ = nullptr;
99
+
100
+ // Otherwise (retainer == nullptr), we set these fields in an ad-hoc way
101
+ bool is_root_node_ = false;
102
+ const char* name_;
103
+ size_t size_ = 0;
104
+ v8::EmbedderGraph::Node::Detachedness detachedness_ =
105
+ v8::EmbedderGraph::Node::Detachedness::kUnknown;
106
+ };
107
+
108
+ void MemoryTracker::TrackFieldWithSize(const char* edge_name,
109
+ size_t size,
110
+ const char* node_name) {
111
+ if (size > 0) AddNode(GetNodeName(node_name, edge_name), size, edge_name);
112
+ }
113
+
114
+ void MemoryTracker::TrackInlineFieldWithSize(const char* edge_name,
115
+ size_t size,
116
+ const char* node_name) {
117
+ if (size > 0) AddNode(GetNodeName(node_name, edge_name), size, edge_name);
118
+ CHECK(CurrentNode());
119
+ AdjustCurrentNodeSize(-static_cast<int>(size));
120
+ }
121
+
122
+ void MemoryTracker::TrackField(const char* edge_name,
123
+ const MemoryRetainer& value,
124
+ const char* node_name) {
125
+ TrackField(edge_name, &value);
126
+ }
127
+
128
+ void MemoryTracker::TrackField(const char* edge_name,
129
+ const MemoryRetainer* value,
130
+ const char* node_name) {
131
+ if (value == nullptr) return;
132
+ auto it = seen_.find(value);
133
+ if (it != seen_.end()) {
134
+ AddEdge(CurrentNode(), it->second, edge_name);
135
+ } else {
136
+ Track(value, edge_name);
137
+ }
138
+ }
139
+
140
+ template <typename T, typename D>
141
+ void MemoryTracker::TrackField(const char* edge_name,
142
+ const std::unique_ptr<T, D>& value,
143
+ const char* node_name) {
144
+ if (value.get() == nullptr) {
145
+ return;
146
+ }
147
+ TrackField(edge_name, value.get(), node_name);
148
+ }
149
+
150
+ template <typename T>
151
+ void MemoryTracker::TrackField(const char* edge_name,
152
+ const std::shared_ptr<T>& value,
153
+ const char* node_name) {
154
+ if (value.get() == nullptr) {
155
+ return;
156
+ }
157
+ TrackField(edge_name, value.get(), node_name);
158
+ }
159
+
160
+ template <typename T, bool kIsWeak>
161
+ void MemoryTracker::TrackField(const char* edge_name,
162
+ const BaseObjectPtrImpl<T, kIsWeak>& value,
163
+ const char* node_name) {
164
+ if (value.get() == nullptr || kIsWeak) return;
165
+ TrackField(edge_name, value.get(), node_name);
166
+ }
167
+
168
+ template <typename T, typename Iterator>
169
+ void MemoryTracker::TrackField(const char* edge_name,
170
+ const T& value,
171
+ const char* node_name,
172
+ const char* element_name,
173
+ bool subtract_from_self) {
174
+ // If the container is empty, the size has been accounted into the parent's
175
+ // self size
176
+ if (value.begin() == value.end()) return;
177
+ // Fall back to edge name if node names are not provided
178
+ if (CurrentNode() != nullptr && subtract_from_self) {
179
+ // Shift the self size of this container out to a separate node
180
+ AdjustCurrentNodeSize(-static_cast<int>(sizeof(T)));
181
+ }
182
+ PushNode(GetNodeName(node_name, edge_name), sizeof(T), edge_name);
183
+ for (Iterator it = value.begin(); it != value.end(); ++it) {
184
+ // Use nullptr as edge names so the elements appear as indexed properties
185
+ TrackField(nullptr, *it, element_name);
186
+ }
187
+ PopNode();
188
+ }
189
+
190
+ template <typename T>
191
+ void MemoryTracker::TrackField(const char* edge_name,
192
+ const std::queue<T>& value,
193
+ const char* node_name,
194
+ const char* element_name) {
195
+ struct ContainerGetter : public std::queue<T> {
196
+ static const typename std::queue<T>::container_type& Get(
197
+ const std::queue<T>& value) {
198
+ return value.*&ContainerGetter::c;
199
+ }
200
+ };
201
+
202
+ const auto& container = ContainerGetter::Get(value);
203
+ TrackField(edge_name, container, node_name, element_name);
204
+ }
205
+
206
+ template <NumericValue T>
207
+ void MemoryTracker::TrackField(const char* edge_name,
208
+ const T& value,
209
+ const char* node_name) {
210
+ // For numbers, creating new nodes is not worth the overhead.
211
+ AdjustCurrentNodeSize(static_cast<int>(sizeof(T)));
212
+ }
213
+
214
+ template <typename T, typename U>
215
+ void MemoryTracker::TrackField(const char* edge_name,
216
+ const std::pair<T, U>& value,
217
+ const char* node_name) {
218
+ PushNode(node_name == nullptr ? "pair" : node_name,
219
+ sizeof(const std::pair<T, U>),
220
+ edge_name);
221
+ // TODO(joyeecheung): special case if one of these is a number type
222
+ // that meets the test_for_number trait so that their sizes don't get
223
+ // merged into the pair node
224
+ TrackField("first", value.first);
225
+ TrackField("second", value.second);
226
+ PopNode();
227
+ }
228
+
229
+ template <typename T>
230
+ void MemoryTracker::TrackField(const char* edge_name,
231
+ const std::basic_string<T>& value,
232
+ const char* node_name) {
233
+ TrackFieldWithSize(edge_name, value.size() * sizeof(T), "std::basic_string");
234
+ }
235
+
236
+ template <typename T>
237
+ void MemoryTracker::TrackField(const char* edge_name,
238
+ const v8::Eternal<T>& value,
239
+ const char* node_name) {
240
+ TrackField(edge_name, value.Get(isolate_));
241
+ }
242
+
243
+ template <typename T>
244
+ void MemoryTracker::TrackField(const char* edge_name,
245
+ const v8::PersistentBase<T>& value,
246
+ const char* node_name) {
247
+ if (value.IsWeak()) return;
248
+ TrackField(edge_name, value.Get(isolate_));
249
+ }
250
+
251
+ template <typename T>
252
+ void MemoryTracker::TrackField(const char* edge_name,
253
+ const v8::Local<T>& value,
254
+ const char* node_name) {
255
+ if (!value.IsEmpty())
256
+ AddEdge(CurrentNode(),
257
+ graph_->V8Node(value.template As<v8::Value>()),
258
+ edge_name);
259
+ }
260
+
261
+ template <typename T>
262
+ void MemoryTracker::TrackField(const char* edge_name,
263
+ const MallocedBuffer<T>& value,
264
+ const char* node_name) {
265
+ TrackFieldWithSize(edge_name, value.size, "MallocedBuffer");
266
+ }
267
+
268
+ void MemoryTracker::TrackField(const char* edge_name,
269
+ const v8::BackingStore* value,
270
+ const char* node_name) {
271
+ TrackFieldWithSize(edge_name, value->ByteLength(), "BackingStore");
272
+ }
273
+
274
+ void MemoryTracker::TrackField(const char* name,
275
+ const uv_buf_t& value,
276
+ const char* node_name) {
277
+ TrackFieldWithSize(name, value.len, "uv_buf_t");
278
+ }
279
+
280
+ void MemoryTracker::TrackField(const char* name,
281
+ const uv_timer_t& value,
282
+ const char* node_name) {
283
+ TrackFieldWithSize(name, sizeof(value), "uv_timer_t");
284
+ }
285
+
286
+ void MemoryTracker::TrackField(const char* name,
287
+ const uv_async_t& value,
288
+ const char* node_name) {
289
+ TrackFieldWithSize(name, sizeof(value), "uv_async_t");
290
+ }
291
+
292
+ void MemoryTracker::TrackInlineField(const char* name,
293
+ const uv_async_t& value,
294
+ const char* node_name) {
295
+ TrackInlineFieldWithSize(name, sizeof(value), "uv_async_t");
296
+ }
297
+
298
+ void MemoryTracker::Track(const CppgcMixin* retainer, const char* edge_name) {
299
+ v8::HandleScope handle_scope(isolate_);
300
+ auto it = seen_.find(retainer);
301
+ if (it != seen_.end()) {
302
+ if (CurrentNode() != nullptr) {
303
+ AddEdge(CurrentNode(), it->second, edge_name);
304
+ }
305
+ return; // It has already been tracked, no need to call MemoryInfo again
306
+ }
307
+ MemoryRetainerNode* n = PushNode(retainer, edge_name);
308
+ retainer->MemoryInfo(this);
309
+ CHECK_EQ(CurrentNode(), n->JSWrapperNode());
310
+ // This is a dummy MemoryRetainerNode. The real graph node is wrapper_node_.
311
+ PopNode();
312
+ }
313
+
314
+ void MemoryTracker::Track(const MemoryRetainer* retainer,
315
+ const char* edge_name) {
316
+ v8::HandleScope handle_scope(isolate_);
317
+ auto it = seen_.find(retainer);
318
+ if (it != seen_.end()) {
319
+ if (CurrentNode() != nullptr) {
320
+ AddEdge(CurrentNode(), it->second, edge_name);
321
+ }
322
+ return; // It has already been tracked, no need to call MemoryInfo again
323
+ }
324
+ MemoryRetainerNode* n = PushNode(retainer, edge_name);
325
+ retainer->MemoryInfo(this);
326
+ CHECK_EQ(CurrentNode(), n);
327
+ CHECK_NE(n->size_, 0);
328
+ PopNode();
329
+ }
330
+
331
+ void MemoryTracker::TrackInlineField(const MemoryRetainer* retainer,
332
+ const char* edge_name) {
333
+ Track(retainer, edge_name);
334
+ CHECK(CurrentNode());
335
+ AdjustCurrentNodeSize(-(static_cast<int>(retainer->SelfSize())));
336
+ }
337
+
338
+ template <typename T>
339
+ inline void MemoryTracker::TraitTrack(const T& retainer,
340
+ const char* edge_name) {
341
+ MemoryRetainerNode* n =
342
+ PushNode(MemoryRetainerTraits<T>::MemoryInfoName(retainer),
343
+ MemoryRetainerTraits<T>::SelfSize(retainer),
344
+ edge_name);
345
+ MemoryRetainerTraits<T>::MemoryInfo(this, retainer);
346
+ CHECK_EQ(CurrentNode(), n);
347
+ CHECK_NE(n->size_, 0);
348
+ PopNode();
349
+ }
350
+
351
+ template <typename T>
352
+ inline void MemoryTracker::TraitTrackInline(const T& retainer,
353
+ const char* edge_name) {
354
+ TraitTrack(retainer, edge_name);
355
+ CHECK(CurrentNode());
356
+ AdjustCurrentNodeSize(
357
+ -(static_cast<int>(MemoryRetainerTraits<T>::SelfSize(retainer))));
358
+ }
359
+
360
+ v8::EmbedderGraph::Node* MemoryTracker::CurrentNode() const {
361
+ if (node_stack_.empty()) return nullptr;
362
+ MemoryRetainerNode* n = node_stack_.top();
363
+ if (n->IsCppgcWrapper()) {
364
+ return n->JSWrapperNode();
365
+ }
366
+ return n;
367
+ }
368
+
369
+ MemoryRetainerNode* MemoryTracker::AddNode(const CppgcMixin* retainer,
370
+ const char* edge_name) {
371
+ auto it = seen_.find(retainer);
372
+ if (it != seen_.end()) {
373
+ return it->second;
374
+ }
375
+
376
+ MemoryRetainerNode* n = new MemoryRetainerNode(this, retainer);
377
+ seen_[retainer] = n;
378
+ if (CurrentNode() != nullptr) {
379
+ AddEdge(CurrentNode(), n->JSWrapperNode(), edge_name);
380
+ }
381
+
382
+ return n;
383
+ }
384
+
385
+ MemoryRetainerNode* MemoryTracker::AddNode(const MemoryRetainer* retainer,
386
+ const char* edge_name) {
387
+ auto it = seen_.find(retainer);
388
+ if (it != seen_.end()) {
389
+ return it->second;
390
+ }
391
+
392
+ MemoryRetainerNode* n = new MemoryRetainerNode(this, retainer);
393
+ graph_->AddNode(std::unique_ptr<v8::EmbedderGraph::Node>(n));
394
+ seen_[retainer] = n;
395
+ if (CurrentNode() != nullptr) AddEdge(CurrentNode(), n, edge_name);
396
+
397
+ if (n->JSWrapperNode() != nullptr) {
398
+ AddEdge(n, n->JSWrapperNode(), "native_to_javascript");
399
+ AddEdge(n->JSWrapperNode(), n, "javascript_to_native");
400
+ }
401
+
402
+ return n;
403
+ }
404
+
405
+ MemoryRetainerNode* MemoryTracker::AddNode(const char* node_name,
406
+ size_t size,
407
+ const char* edge_name) {
408
+ MemoryRetainerNode* n = new MemoryRetainerNode(this, node_name, size);
409
+ graph_->AddNode(std::unique_ptr<v8::EmbedderGraph::Node>(n));
410
+
411
+ if (CurrentNode() != nullptr) AddEdge(CurrentNode(), n, edge_name);
412
+
413
+ return n;
414
+ }
415
+
416
+ MemoryRetainerNode* MemoryTracker::PushNode(const CppgcMixin* retainer,
417
+ const char* edge_name) {
418
+ MemoryRetainerNode* n = AddNode(retainer, edge_name);
419
+ node_stack_.push(n);
420
+ return n;
421
+ }
422
+
423
+ MemoryRetainerNode* MemoryTracker::PushNode(const MemoryRetainer* retainer,
424
+ const char* edge_name) {
425
+ MemoryRetainerNode* n = AddNode(retainer, edge_name);
426
+ node_stack_.push(n);
427
+ return n;
428
+ }
429
+
430
+ MemoryRetainerNode* MemoryTracker::PushNode(const char* node_name,
431
+ size_t size,
432
+ const char* edge_name) {
433
+ MemoryRetainerNode* n = AddNode(node_name, size, edge_name);
434
+ node_stack_.push(n);
435
+ return n;
436
+ }
437
+
438
+ void MemoryTracker::AddEdge(v8::EmbedderGraph::Node* from,
439
+ v8::EmbedderGraph::Node* to,
440
+ const char* edge_name) {
441
+ if (edge_name == kWeakEdge) return;
442
+ graph_->AddEdge(from, to, edge_name);
443
+ }
444
+
445
+ void MemoryTracker::PopNode() {
446
+ node_stack_.pop();
447
+ }
448
+
449
+ void MemoryTracker::AdjustCurrentNodeSize(int diff) {
450
+ if (node_stack_.empty()) return;
451
+ MemoryRetainerNode* n = node_stack_.top();
452
+ if (!n->IsCppgcWrapper()) {
453
+ n->size_ = static_cast<size_t>(static_cast<int>(n->size_) + diff);
454
+ }
455
+ }
456
+
457
+ } // namespace node
458
+
459
+ #endif // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
460
+
461
+ #endif // SRC_MEMORY_TRACKER_INL_H_