@encharm/cws 4.5.3 → 4.8.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 (305) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/CLAUDE.md +83 -0
  3. package/README.md +20 -4
  4. package/binding.gyp +8 -2
  5. package/dist/bindings/cws_darwin_arm64_node115.node +0 -0
  6. package/dist/bindings/cws_darwin_arm64_node127.node +0 -0
  7. package/dist/bindings/cws_darwin_arm64_node137.node +0 -0
  8. package/dist/bindings/cws_darwin_arm64_node147.node +0 -0
  9. package/dist/bindings/cws_linux_arm64_node115.node +0 -0
  10. package/dist/bindings/cws_linux_arm64_node127.node +0 -0
  11. package/dist/bindings/cws_linux_arm64_node137.node +0 -0
  12. package/dist/bindings/cws_linux_arm64_node147.node +0 -0
  13. package/dist/bindings/cws_linux_x64_node115.node +0 -0
  14. package/dist/bindings/cws_linux_x64_node127.node +0 -0
  15. package/dist/bindings/cws_linux_x64_node137.node +0 -0
  16. package/dist/bindings/cws_linux_x64_node147.node +0 -0
  17. package/dist/bindings/cws_win32_x64_node115.node +0 -0
  18. package/dist/bindings/cws_win32_x64_node127.node +0 -0
  19. package/dist/bindings/cws_win32_x64_node137.node +0 -0
  20. package/dist/bindings/cws_win32_x64_node147.node +0 -0
  21. package/dist/client.d.ts +1 -0
  22. package/dist/client.js +15 -1
  23. package/dist/index.d.ts +6 -1
  24. package/dist/index.js +2 -0
  25. package/dist/server.d.ts +1 -0
  26. package/dist/server.js +16 -2
  27. package/dist/shared.d.ts +1 -0
  28. package/dist/shared.js +3 -2
  29. package/package.json +1 -1
  30. package/src/Addon.cpp +4 -1
  31. package/src/Addon.h +80 -15
  32. package/src/Extensions.cpp +7 -1
  33. package/src/Extensions.h +2 -1
  34. package/src/Group.cpp +1 -1
  35. package/src/Group.h +4 -1
  36. package/src/HTTPSocket.cpp +1 -1
  37. package/src/Hub.cpp +11 -76
  38. package/src/Hub.h +12 -10
  39. package/src/Networking.h +11 -0
  40. package/src/Socket.h +201 -6
  41. package/src/WebSocket.cpp +8 -5
  42. package/src/Zlib.cpp +138 -0
  43. package/src/Zlib.h +38 -0
  44. package/src/cSNode.cpp +2 -0
  45. package/src/cSNode.h +4 -0
  46. package/src/headers/26/acorn_version.h +6 -0
  47. package/src/headers/26/aliased_buffer-inl.h +264 -0
  48. package/src/headers/26/aliased_buffer.h +205 -0
  49. package/src/headers/26/aliased_struct-inl.h +143 -0
  50. package/src/headers/26/aliased_struct.h +248 -0
  51. package/src/headers/26/amaro_version.h +6 -0
  52. package/src/headers/26/async_context_frame.h +33 -0
  53. package/src/headers/26/async_wrap-inl.h +123 -0
  54. package/src/headers/26/async_wrap.h +254 -0
  55. package/src/headers/26/base_object-inl.h +333 -0
  56. package/src/headers/26/base_object.h +339 -0
  57. package/src/headers/26/base_object_types.h +76 -0
  58. package/src/headers/26/blob_serializer_deserializer-inl.h +385 -0
  59. package/src/headers/26/blob_serializer_deserializer.h +142 -0
  60. package/src/headers/26/builtin_info.h +57 -0
  61. package/src/headers/26/callback_queue-inl.h +97 -0
  62. package/src/headers/26/callback_queue.h +79 -0
  63. package/src/headers/26/cares_wrap.h +475 -0
  64. package/src/headers/26/cleanup_queue-inl.h +36 -0
  65. package/src/headers/26/cleanup_queue.h +79 -0
  66. package/src/headers/26/compile_cache.h +134 -0
  67. package/src/headers/26/connect_wrap.h +26 -0
  68. package/src/headers/26/connection_wrap.h +30 -0
  69. package/src/headers/26/cppgc_helpers-inl.h +69 -0
  70. package/src/headers/26/cppgc_helpers.h +162 -0
  71. package/src/headers/26/crypto/crypto_aes.h +107 -0
  72. package/src/headers/26/crypto/crypto_argon2.h +88 -0
  73. package/src/headers/26/crypto/crypto_bio.h +193 -0
  74. package/src/headers/26/crypto/crypto_chacha20_poly1305.h +62 -0
  75. package/src/headers/26/crypto/crypto_cipher.h +291 -0
  76. package/src/headers/26/crypto/crypto_common.h +48 -0
  77. package/src/headers/26/crypto/crypto_context.h +219 -0
  78. package/src/headers/26/crypto/crypto_dh.h +104 -0
  79. package/src/headers/26/crypto/crypto_dsa.h +50 -0
  80. package/src/headers/26/crypto/crypto_ec.h +102 -0
  81. package/src/headers/26/crypto/crypto_hash.h +157 -0
  82. package/src/headers/26/crypto/crypto_hkdf.h +62 -0
  83. package/src/headers/26/crypto/crypto_hmac.h +92 -0
  84. package/src/headers/26/crypto/crypto_kem.h +131 -0
  85. package/src/headers/26/crypto/crypto_keygen.h +382 -0
  86. package/src/headers/26/crypto/crypto_keys.h +366 -0
  87. package/src/headers/26/crypto/crypto_kmac.h +79 -0
  88. package/src/headers/26/crypto/crypto_pbkdf2.h +76 -0
  89. package/src/headers/26/crypto/crypto_pqc.h +39 -0
  90. package/src/headers/26/crypto/crypto_random.h +127 -0
  91. package/src/headers/26/crypto/crypto_rsa.h +108 -0
  92. package/src/headers/26/crypto/crypto_scrypt.h +85 -0
  93. package/src/headers/26/crypto/crypto_sig.h +159 -0
  94. package/src/headers/26/crypto/crypto_spkac.h +21 -0
  95. package/src/headers/26/crypto/crypto_timing.h +20 -0
  96. package/src/headers/26/crypto/crypto_tls.h +342 -0
  97. package/src/headers/26/crypto/crypto_turboshake.h +105 -0
  98. package/src/headers/26/crypto/crypto_util.h +775 -0
  99. package/src/headers/26/crypto/crypto_x509.h +140 -0
  100. package/src/headers/26/dataqueue/queue.h +311 -0
  101. package/src/headers/26/debug_utils-inl.h +291 -0
  102. package/src/headers/26/debug_utils.h +200 -0
  103. package/src/headers/26/diagnosticfilename-inl.h +33 -0
  104. package/src/headers/26/embedded_data.h +17 -0
  105. package/src/headers/26/encoding_binding.h +59 -0
  106. package/src/headers/26/env-inl.h +956 -0
  107. package/src/headers/26/env.h +1294 -0
  108. package/src/headers/26/env_properties.h +562 -0
  109. package/src/headers/26/ffi/data.h +30 -0
  110. package/src/headers/26/ffi/fast.h +96 -0
  111. package/src/headers/26/ffi/jit_memory.h +26 -0
  112. package/src/headers/26/ffi/types.h +99 -0
  113. package/src/headers/26/handle_wrap.h +123 -0
  114. package/src/headers/26/histogram-inl.h +211 -0
  115. package/src/headers/26/histogram.h +474 -0
  116. package/src/headers/26/inspector/dom_storage_agent.h +68 -0
  117. package/src/headers/26/inspector/inspector_object_utils.h +38 -0
  118. package/src/headers/26/inspector/io_agent.h +30 -0
  119. package/src/headers/26/inspector/main_thread_interface.h +116 -0
  120. package/src/headers/26/inspector/network_agent.h +110 -0
  121. package/src/headers/26/inspector/network_inspector.h +45 -0
  122. package/src/headers/26/inspector/network_requests_buffer.h +195 -0
  123. package/src/headers/26/inspector/network_resource_manager.h +29 -0
  124. package/src/headers/26/inspector/node_json.h +24 -0
  125. package/src/headers/26/inspector/node_string.h +101 -0
  126. package/src/headers/26/inspector/notification_emitter.h +38 -0
  127. package/src/headers/26/inspector/protocol_helper.h +27 -0
  128. package/src/headers/26/inspector/runtime_agent.h +41 -0
  129. package/src/headers/26/inspector/storage_agent.h +33 -0
  130. package/src/headers/26/inspector/target_agent.h +59 -0
  131. package/src/headers/26/inspector/target_manager.h +70 -0
  132. package/src/headers/26/inspector/tracing_agent.h +43 -0
  133. package/src/headers/26/inspector/worker_agent.h +40 -0
  134. package/src/headers/26/inspector/worker_inspector.h +124 -0
  135. package/src/headers/26/inspector_agent.h +168 -0
  136. package/src/headers/26/inspector_io.h +78 -0
  137. package/src/headers/26/inspector_profiler.h +149 -0
  138. package/src/headers/26/inspector_socket.h +60 -0
  139. package/src/headers/26/inspector_socket_server.h +110 -0
  140. package/src/headers/26/js_native_api.h +634 -0
  141. package/src/headers/26/js_native_api_types.h +244 -0
  142. package/src/headers/26/js_native_api_v8.h +485 -0
  143. package/src/headers/26/js_native_api_v8_internals.h +45 -0
  144. package/src/headers/26/js_stream.h +57 -0
  145. package/src/headers/26/json_utils.h +172 -0
  146. package/src/headers/26/large_pages/node_large_page.h +34 -0
  147. package/src/headers/26/lru_cache-inl.h +69 -0
  148. package/src/headers/26/memory_tracker-inl.h +461 -0
  149. package/src/headers/26/memory_tracker.h +341 -0
  150. package/src/headers/26/module_wrap.h +231 -0
  151. package/src/headers/26/ncrypto.h +2008 -0
  152. package/src/headers/26/node.h +1693 -0
  153. package/src/headers/26/node_api.h +265 -0
  154. package/src/headers/26/node_api_internals.h +48 -0
  155. package/src/headers/26/node_api_types.h +58 -0
  156. package/src/headers/26/node_binding.h +170 -0
  157. package/src/headers/26/node_blob.h +160 -0
  158. package/src/headers/26/node_bob-inl.h +36 -0
  159. package/src/headers/26/node_bob.h +107 -0
  160. package/src/headers/26/node_buffer.h +92 -0
  161. package/src/headers/26/node_builtins.h +239 -0
  162. package/src/headers/26/node_concepts.h +46 -0
  163. package/src/headers/26/node_config_file.h +77 -0
  164. package/src/headers/26/node_constants.h +82 -0
  165. package/src/headers/26/node_context_data.h +171 -0
  166. package/src/headers/26/node_contextify.h +261 -0
  167. package/src/headers/26/node_crypto.h +66 -0
  168. package/src/headers/26/node_debug.h +30 -0
  169. package/src/headers/26/node_diagnostics_channel.h +121 -0
  170. package/src/headers/26/node_dir.h +52 -0
  171. package/src/headers/26/node_dotenv.h +45 -0
  172. package/src/headers/26/node_errors.h +378 -0
  173. package/src/headers/26/node_exit_code.h +54 -0
  174. package/src/headers/26/node_external_reference.h +171 -0
  175. package/src/headers/26/node_ffi.h +212 -0
  176. package/src/headers/26/node_file-inl.h +421 -0
  177. package/src/headers/26/node_file.h +561 -0
  178. package/src/headers/26/node_file_utils.h +39 -0
  179. package/src/headers/26/node_hash.h +212 -0
  180. package/src/headers/26/node_http2.h +1202 -0
  181. package/src/headers/26/node_http2_state.h +159 -0
  182. package/src/headers/26/node_http_common-inl.h +199 -0
  183. package/src/headers/26/node_http_common.h +535 -0
  184. package/src/headers/26/node_i18n.h +132 -0
  185. package/src/headers/26/node_internals.h +485 -0
  186. package/src/headers/26/node_locks.h +184 -0
  187. package/src/headers/26/node_main_instance.h +67 -0
  188. package/src/headers/26/node_mem-inl.h +113 -0
  189. package/src/headers/26/node_mem.h +45 -0
  190. package/src/headers/26/node_messaging.h +389 -0
  191. package/src/headers/26/node_metadata.h +172 -0
  192. package/src/headers/26/node_modules.h +102 -0
  193. package/src/headers/26/node_mutex.h +323 -0
  194. package/src/headers/26/node_object_wrap.h +145 -0
  195. package/src/headers/26/node_options-inl.h +524 -0
  196. package/src/headers/26/node_options.h +710 -0
  197. package/src/headers/26/node_perf.h +167 -0
  198. package/src/headers/26/node_perf_common.h +103 -0
  199. package/src/headers/26/node_platform.h +290 -0
  200. package/src/headers/26/node_process-inl.h +26 -0
  201. package/src/headers/26/node_process.h +112 -0
  202. package/src/headers/26/node_profiling.h +38 -0
  203. package/src/headers/26/node_realm-inl.h +156 -0
  204. package/src/headers/26/node_realm.h +236 -0
  205. package/src/headers/26/node_report.h +43 -0
  206. package/src/headers/26/node_revert.h +82 -0
  207. package/src/headers/26/node_root_certs.h +2937 -0
  208. package/src/headers/26/node_sea.h +101 -0
  209. package/src/headers/26/node_shadow_realm.h +46 -0
  210. package/src/headers/26/node_snapshot_builder.h +57 -0
  211. package/src/headers/26/node_snapshotable.h +167 -0
  212. package/src/headers/26/node_sockaddr-inl.h +248 -0
  213. package/src/headers/26/node_sockaddr.h +459 -0
  214. package/src/headers/26/node_sqlite.h +607 -0
  215. package/src/headers/26/node_stat_watcher.h +73 -0
  216. package/src/headers/26/node_task_runner.h +92 -0
  217. package/src/headers/26/node_threadsafe_cow-inl.h +54 -0
  218. package/src/headers/26/node_threadsafe_cow.h +105 -0
  219. package/src/headers/26/node_union_bytes.h +81 -0
  220. package/src/headers/26/node_url.h +101 -0
  221. package/src/headers/26/node_url_pattern.h +118 -0
  222. package/src/headers/26/node_v8.h +78 -0
  223. package/src/headers/26/node_v8_embedder.h +26 -0
  224. package/src/headers/26/node_v8_platform-inl.h +96 -0
  225. package/src/headers/26/node_version.h +116 -0
  226. package/src/headers/26/node_wasi.h +184 -0
  227. package/src/headers/26/node_wasm_web_api.h +55 -0
  228. package/src/headers/26/node_watchdog.h +164 -0
  229. package/src/headers/26/node_webstorage.h +62 -0
  230. package/src/headers/26/node_worker.h +162 -0
  231. package/src/headers/26/path.h +36 -0
  232. package/src/headers/26/permission/boolean_permission.h +50 -0
  233. package/src/headers/26/permission/fs_permission.h +192 -0
  234. package/src/headers/26/permission/permission.h +155 -0
  235. package/src/headers/26/permission/permission_base.h +79 -0
  236. package/src/headers/26/pipe_wrap.h +80 -0
  237. package/src/headers/26/quic/application.h +279 -0
  238. package/src/headers/26/quic/arena.h +373 -0
  239. package/src/headers/26/quic/bindingdata.h +440 -0
  240. package/src/headers/26/quic/cid.h +127 -0
  241. package/src/headers/26/quic/data.h +358 -0
  242. package/src/headers/26/quic/defs.h +417 -0
  243. package/src/headers/26/quic/endpoint.h +519 -0
  244. package/src/headers/26/quic/guard.h +5 -0
  245. package/src/headers/26/quic/http3.h +25 -0
  246. package/src/headers/26/quic/packet.h +166 -0
  247. package/src/headers/26/quic/preferredaddress.h +72 -0
  248. package/src/headers/26/quic/session.h +770 -0
  249. package/src/headers/26/quic/session_manager.h +107 -0
  250. package/src/headers/26/quic/sessionticket.h +110 -0
  251. package/src/headers/26/quic/streams.h +518 -0
  252. package/src/headers/26/quic/tlscontext.h +353 -0
  253. package/src/headers/26/quic/tokens.h +263 -0
  254. package/src/headers/26/quic/transportparams.h +184 -0
  255. package/src/headers/26/req_wrap-inl.h +175 -0
  256. package/src/headers/26/req_wrap.h +79 -0
  257. package/src/headers/26/spawn_sync.h +243 -0
  258. package/src/headers/26/stream_base-inl.h +170 -0
  259. package/src/headers/26/stream_base.h +487 -0
  260. package/src/headers/26/stream_pipe.h +76 -0
  261. package/src/headers/26/stream_wrap.h +137 -0
  262. package/src/headers/26/string_bytes.h +114 -0
  263. package/src/headers/26/string_decoder-inl.h +31 -0
  264. package/src/headers/26/string_decoder.h +49 -0
  265. package/src/headers/26/tcp_wrap.h +138 -0
  266. package/src/headers/26/threadpoolwork-inl.h +70 -0
  267. package/src/headers/26/timer_wrap-inl.h +32 -0
  268. package/src/headers/26/timer_wrap.h +87 -0
  269. package/src/headers/26/timers.h +70 -0
  270. package/src/headers/26/tracing/agent.h +125 -0
  271. package/src/headers/26/tracing/agent_legacy.h +146 -0
  272. package/src/headers/26/tracing/agent_perfetto.h +145 -0
  273. package/src/headers/26/tracing/node_trace_buffer.h +91 -0
  274. package/src/headers/26/tracing/node_trace_writer.h +79 -0
  275. package/src/headers/26/tracing/trace_event.h +27 -0
  276. package/src/headers/26/tracing/trace_event_helper.h +40 -0
  277. package/src/headers/26/tracing/trace_event_legacy.h +1113 -0
  278. package/src/headers/26/tracing/trace_event_legacy_inl.h +711 -0
  279. package/src/headers/26/tracing/trace_event_perfetto.h +47 -0
  280. package/src/headers/26/tracing/traced_value.h +167 -0
  281. package/src/headers/26/tty_wrap.h +65 -0
  282. package/src/headers/26/udp_wrap.h +231 -0
  283. package/src/headers/26/undici_version.h +6 -0
  284. package/src/headers/26/util-inl.h +788 -0
  285. package/src/headers/26/util.h +1207 -0
  286. package/src/headers/26/v8-cpp-heap-external.h +56 -0
  287. package/src/headers/26/v8-external-memory-accounter.h +60 -0
  288. package/src/headers/26/v8-fast-api-calls.h +784 -0
  289. package/src/headers/26/v8-inspector-protocol.h +13 -0
  290. package/src/headers/26/v8-inspector.h +458 -0
  291. package/src/headers/26/v8-metrics.h +273 -0
  292. package/src/headers/26/v8-trace-categories.h +28 -0
  293. package/src/headers/26/v8-unwinder-state.h +30 -0
  294. package/src/headers/26/v8-util.h +549 -0
  295. package/src/headers/26/v8-value-serializer-version.h +24 -0
  296. package/src/headers/26/v8-version-string.h +38 -0
  297. package/src/headers/26/v8-wasm-trap-handler-posix.h +31 -0
  298. package/src/headers/26/v8-wasm-trap-handler-win.h +28 -0
  299. package/src/headers/26/zlib_version.h +6 -0
  300. package/dist/bindings/cws_darwin_arm64_node115.node.dSYM/Contents/Info.plist +0 -20
  301. package/dist/bindings/cws_darwin_arm64_node115.node.dSYM/Contents/Resources/DWARF/cws_darwin_arm64_node115.node +0 -0
  302. package/dist/bindings/cws_darwin_arm64_node115.node.dSYM/Contents/Resources/Relocations/aarch64/cws_darwin_arm64_node115.node.yml +0 -931
  303. package/dist/bindings/cws_darwin_arm64_node127.node.dSYM/Contents/Info.plist +0 -20
  304. package/dist/bindings/cws_darwin_arm64_node127.node.dSYM/Contents/Resources/DWARF/cws_darwin_arm64_node127.node +0 -0
  305. package/dist/bindings/cws_darwin_arm64_node127.node.dSYM/Contents/Resources/Relocations/aarch64/cws_darwin_arm64_node127.node.yml +0 -931
@@ -0,0 +1,116 @@
1
+ #ifndef SRC_INSPECTOR_MAIN_THREAD_INTERFACE_H_
2
+ #define SRC_INSPECTOR_MAIN_THREAD_INTERFACE_H_
3
+
4
+ #if !HAVE_INSPECTOR
5
+ #error("This header can only be used when inspector is enabled")
6
+ #endif
7
+
8
+ #include "inspector_agent.h"
9
+ #include "node_mutex.h"
10
+
11
+ #include <atomic>
12
+ #include <deque>
13
+ #include <memory>
14
+ #include <unordered_map>
15
+
16
+ namespace v8_inspector {
17
+ class StringBuffer;
18
+ class StringView;
19
+ } // namespace v8_inspector
20
+
21
+ namespace node {
22
+ namespace inspector {
23
+ class MainThreadInterface;
24
+
25
+ class Request {
26
+ public:
27
+ virtual void Call(MainThreadInterface*) = 0;
28
+ virtual ~Request() = default;
29
+ };
30
+
31
+ class Deletable {
32
+ public:
33
+ virtual ~Deletable() = default;
34
+ };
35
+
36
+ std::unique_ptr<v8_inspector::StringBuffer> Utf8ToStringView(
37
+ const std::string_view message);
38
+
39
+ using MessageQueue = std::deque<std::unique_ptr<Request>>;
40
+
41
+ class MainThreadHandle : public std::enable_shared_from_this<MainThreadHandle> {
42
+ public:
43
+ explicit MainThreadHandle(MainThreadInterface* main_thread)
44
+ : main_thread_(main_thread) {
45
+ }
46
+ ~MainThreadHandle() {
47
+ Mutex::ScopedLock scoped_lock(block_lock_);
48
+ CHECK_NULL(main_thread_); // main_thread_ should have called Reset
49
+ }
50
+ std::unique_ptr<InspectorSession> Connect(
51
+ std::unique_ptr<InspectorSessionDelegate> delegate,
52
+ bool prevent_shutdown);
53
+ int newObjectId() {
54
+ return ++next_object_id_;
55
+ }
56
+ bool Post(std::unique_ptr<Request> request);
57
+ std::unique_ptr<InspectorSessionDelegate> MakeDelegateThreadSafe(
58
+ std::unique_ptr<InspectorSessionDelegate> delegate);
59
+ bool Expired();
60
+ void SetTargetSessionId(int target_session_id) {
61
+ target_session_id_ = target_session_id;
62
+ }
63
+ std::optional<int> GetTargetSessionId() { return target_session_id_; }
64
+
65
+ private:
66
+ void Reset();
67
+
68
+ MainThreadInterface* main_thread_;
69
+ Mutex block_lock_;
70
+ int next_session_id_ = 0;
71
+ std::atomic_int next_object_id_ = {1};
72
+ std::optional<int> target_session_id_ = std::nullopt;
73
+
74
+ friend class MainThreadInterface;
75
+ };
76
+
77
+ class MainThreadInterface :
78
+ public std::enable_shared_from_this<MainThreadInterface> {
79
+ public:
80
+ explicit MainThreadInterface(Agent* agent);
81
+ ~MainThreadInterface();
82
+
83
+ void DispatchMessages();
84
+ void Post(std::unique_ptr<Request> request);
85
+ bool WaitForFrontendEvent();
86
+ void StopWaitingForFrontendEvent();
87
+ std::shared_ptr<MainThreadHandle> GetHandle();
88
+ Agent* inspector_agent() {
89
+ return agent_;
90
+ }
91
+ void AddObject(int handle, std::unique_ptr<Deletable> object);
92
+ Deletable* GetObject(int id);
93
+ Deletable* GetObjectIfExists(int id);
94
+ void RemoveObject(int handle);
95
+
96
+ private:
97
+ MessageQueue requests_;
98
+ Mutex requests_lock_; // requests_ live across threads
99
+ // This queue is to maintain the order of the messages for the cases
100
+ // when we reenter the DispatchMessages function.
101
+ MessageQueue dispatching_message_queue_;
102
+ bool dispatching_messages_ = false;
103
+ // This flag indicates an internal request to exit the loop in
104
+ // WaitForFrontendEvent(). It's set to true by calling
105
+ // StopWaitingForFrontendEvent().
106
+ bool stop_waiting_for_frontend_event_requested_ = false;
107
+ ConditionVariable incoming_message_cond_;
108
+ // Used from any thread
109
+ Agent* const agent_;
110
+ std::shared_ptr<MainThreadHandle> handle_;
111
+ std::unordered_map<int, std::unique_ptr<Deletable>> managed_objects_;
112
+ };
113
+
114
+ } // namespace inspector
115
+ } // namespace node
116
+ #endif // SRC_INSPECTOR_MAIN_THREAD_INTERFACE_H_
@@ -0,0 +1,110 @@
1
+ #ifndef SRC_INSPECTOR_NETWORK_AGENT_H_
2
+ #define SRC_INSPECTOR_NETWORK_AGENT_H_
3
+
4
+ #include "env.h"
5
+ #include "io_agent.h"
6
+ #include "network_requests_buffer.h"
7
+ #include "network_resource_manager.h"
8
+ #include "node/inspector/protocol/Network.h"
9
+
10
+ #include <map>
11
+ #include <memory>
12
+ #include <unordered_map>
13
+
14
+ namespace node {
15
+ namespace inspector {
16
+
17
+ class NetworkInspector;
18
+
19
+ class NetworkAgent : public protocol::Network::Backend {
20
+ public:
21
+ explicit NetworkAgent(
22
+ NetworkInspector* inspector,
23
+ v8_inspector::V8Inspector* v8_inspector,
24
+ Environment* env,
25
+ std::shared_ptr<NetworkResourceManager> network_resource_manager);
26
+
27
+ void Wire(protocol::UberDispatcher* dispatcher);
28
+
29
+ protocol::DispatchResponse enable(
30
+ std::optional<int> in_maxTotalBufferSize,
31
+ std::optional<int> in_maxResourceBufferSize) override;
32
+
33
+ protocol::DispatchResponse disable() override;
34
+
35
+ protocol::DispatchResponse getRequestPostData(
36
+ const protocol::String& in_requestId,
37
+ protocol::String* out_postData) override;
38
+
39
+ protocol::DispatchResponse getResponseBody(
40
+ const protocol::String& in_requestId,
41
+ protocol::String* out_body,
42
+ bool* out_base64Encoded) override;
43
+
44
+ protocol::DispatchResponse streamResourceContent(
45
+ const protocol::String& in_requestId,
46
+ protocol::Binary* out_bufferedData) override;
47
+
48
+ protocol::DispatchResponse loadNetworkResource(
49
+ const protocol::String& in_url,
50
+ std::unique_ptr<protocol::Network::LoadNetworkResourcePageResult>*
51
+ out_resource) override;
52
+
53
+ void emitNotification(v8::Local<v8::Context> context,
54
+ const protocol::String& event,
55
+ v8::Local<v8::Object> params);
56
+
57
+ void requestWillBeSent(v8::Local<v8::Context> context,
58
+ v8::Local<v8::Object> params);
59
+
60
+ void responseReceived(v8::Local<v8::Context> context,
61
+ v8::Local<v8::Object> params);
62
+
63
+ void loadingFailed(v8::Local<v8::Context> context,
64
+ v8::Local<v8::Object> params);
65
+
66
+ void loadingFinished(v8::Local<v8::Context> context,
67
+ v8::Local<v8::Object> params);
68
+
69
+ void dataSent(v8::Local<v8::Context> context, v8::Local<v8::Object> params);
70
+
71
+ void dataReceived(v8::Local<v8::Context> context,
72
+ v8::Local<v8::Object> params);
73
+
74
+ void webSocketCreated(v8::Local<v8::Context> context,
75
+ v8::Local<v8::Object> params);
76
+ void webSocketClosed(v8::Local<v8::Context> context,
77
+ v8::Local<v8::Object> params);
78
+ void webSocketHandshakeResponseReceived(v8::Local<v8::Context> context,
79
+ v8::Local<v8::Object> params);
80
+
81
+ private:
82
+ std::unique_ptr<protocol::Network::Headers> createHeadersFromObject(
83
+ v8::Local<v8::Context> context, v8::Local<v8::Object> headers_obj);
84
+ std::unique_ptr<protocol::Network::Request> createRequestFromObject(
85
+ v8::Local<v8::Context> context, v8::Local<v8::Object> request);
86
+ std::unique_ptr<protocol::Network::Response> createResponseFromObject(
87
+ v8::Local<v8::Context> context, v8::Local<v8::Object> response);
88
+ std::unique_ptr<protocol::Network::WebSocketResponse> createWebSocketResponse(
89
+ v8::Local<v8::Context> context, v8::Local<v8::Object> response);
90
+
91
+ NetworkInspector* inspector_;
92
+ v8_inspector::V8Inspector* v8_inspector_;
93
+ std::shared_ptr<protocol::Network::Frontend> frontend_;
94
+
95
+ using EventNotifier = void (NetworkAgent::*)(v8::Local<v8::Context> context,
96
+ v8::Local<v8::Object>);
97
+ std::unordered_map<protocol::String, EventNotifier> event_notifier_map_;
98
+ Environment* env_;
99
+ std::shared_ptr<NetworkResourceManager> network_resource_manager_;
100
+
101
+ // Per-resource buffer size in bytes to use when preserving network payloads
102
+ // (XHRs, etc).
103
+ size_t max_resource_buffer_size_ = 5 * 1024 * 1024; // 5MB
104
+ RequestsBuffer requests_;
105
+ };
106
+
107
+ } // namespace inspector
108
+ } // namespace node
109
+
110
+ #endif // SRC_INSPECTOR_NETWORK_AGENT_H_
@@ -0,0 +1,45 @@
1
+ #ifndef SRC_INSPECTOR_NETWORK_INSPECTOR_H_
2
+ #define SRC_INSPECTOR_NETWORK_INSPECTOR_H_
3
+
4
+ #include <memory>
5
+ #include "env.h"
6
+ #include "network_agent.h"
7
+ #include "network_resource_manager.h"
8
+
9
+ namespace node {
10
+ class Environment;
11
+
12
+ namespace inspector {
13
+
14
+ class NetworkInspector {
15
+ public:
16
+ explicit NetworkInspector(
17
+ Environment* env,
18
+ v8_inspector::V8Inspector* v8_inspector,
19
+ std::shared_ptr<NetworkResourceManager> network_resource_manager);
20
+ ~NetworkInspector();
21
+
22
+ void Wire(protocol::UberDispatcher* dispatcher);
23
+
24
+ bool canEmit(const std::string& domain);
25
+
26
+ void emitNotification(v8::Local<v8::Context> context,
27
+ const std::string& domain,
28
+ const std::string& method,
29
+ v8::Local<v8::Object> params);
30
+
31
+ void Enable();
32
+ void Disable();
33
+ bool IsEnabled() const { return enabled_; }
34
+
35
+ private:
36
+ bool enabled_;
37
+ Environment* env_;
38
+ std::unique_ptr<NetworkAgent> network_agent_;
39
+ std::shared_ptr<NetworkResourceManager> network_resource_manager_;
40
+ };
41
+
42
+ } // namespace inspector
43
+ } // namespace node
44
+
45
+ #endif // SRC_INSPECTOR_NETWORK_INSPECTOR_H_
@@ -0,0 +1,195 @@
1
+ #ifndef SRC_INSPECTOR_NETWORK_REQUESTS_BUFFER_H_
2
+ #define SRC_INSPECTOR_NETWORK_REQUESTS_BUFFER_H_
3
+
4
+ #include <list>
5
+ #include <map>
6
+ #include <vector>
7
+
8
+ #include "inspector/node_string.h"
9
+
10
+ namespace node {
11
+ namespace inspector {
12
+
13
+ // Supported charsets for devtools frontend on request/response data.
14
+ // If the charset is kUTF8, the data is expected to be text and can be
15
+ // formatted on the frontend.
16
+ enum class Charset {
17
+ kUTF8,
18
+ kBinary,
19
+ };
20
+
21
+ struct RequestEntry {
22
+ double timestamp;
23
+ bool is_request_finished = false;
24
+ bool is_response_finished = false;
25
+ bool is_streaming = false;
26
+ Charset request_charset;
27
+ Charset response_charset = Charset::kBinary;
28
+
29
+ size_t max_resource_buffer_size;
30
+ size_t buffer_size() const {
31
+ return request_data_size_ + response_data_size_;
32
+ }
33
+
34
+ const std::vector<protocol::Binary> request_data_blobs() const {
35
+ return request_data_blobs_;
36
+ }
37
+ const std::vector<protocol::Binary> response_data_blobs() const {
38
+ return response_data_blobs_;
39
+ }
40
+
41
+ void push_request_data_blob(const protocol::Binary& blob) {
42
+ if (buffer_size() + blob.size() > max_resource_buffer_size) {
43
+ // Exceed the per-resource buffer size limit, ignore the blob.
44
+ return;
45
+ }
46
+ request_data_blobs_.push_back(blob);
47
+ request_data_size_ += blob.size();
48
+ }
49
+ void push_response_data_blob(const protocol::Binary& blob) {
50
+ if (buffer_size() + blob.size() > max_resource_buffer_size) {
51
+ // Exceed the per-resource buffer size limit, ignore the blob.
52
+ return;
53
+ }
54
+ response_data_blobs_.push_back(blob);
55
+ response_data_size_ += blob.size();
56
+ }
57
+
58
+ void clear_response_data_blobs() {
59
+ response_data_blobs_.clear();
60
+ response_data_size_ = 0;
61
+ }
62
+
63
+ RequestEntry(double timestamp,
64
+ Charset request_charset,
65
+ bool has_request_body,
66
+ size_t max_resource_buffer_size)
67
+ : timestamp(timestamp),
68
+ is_request_finished(!has_request_body),
69
+ request_charset(request_charset),
70
+ max_resource_buffer_size(max_resource_buffer_size) {}
71
+
72
+ private:
73
+ size_t request_data_size_ = 0;
74
+ std::vector<protocol::Binary> request_data_blobs_;
75
+ size_t response_data_size_ = 0;
76
+ std::vector<protocol::Binary> response_data_blobs_;
77
+ };
78
+
79
+ class RequestsBuffer {
80
+ using key_value_pair_t = typename std::pair<protocol::String, RequestEntry>;
81
+ using list_iterator = typename std::list<key_value_pair_t>::iterator;
82
+ using const_list_iterator =
83
+ typename std::list<key_value_pair_t>::const_iterator;
84
+
85
+ public:
86
+ struct mutable_iterator {
87
+ list_iterator it;
88
+ size_t buffer_size;
89
+ RequestsBuffer* parent;
90
+
91
+ key_value_pair_t& operator*() { return *it; }
92
+ key_value_pair_t* operator->() { return &(*it); }
93
+ bool operator==(const const_list_iterator& other) const {
94
+ return it == other;
95
+ }
96
+ bool operator!=(const const_list_iterator& other) const {
97
+ return it != other;
98
+ }
99
+
100
+ mutable_iterator(std::nullptr_t, RequestsBuffer* parent)
101
+ : it(parent->list_.end()), buffer_size(0), parent(parent) {}
102
+
103
+ mutable_iterator(list_iterator it, RequestsBuffer* parent)
104
+ : it(it), buffer_size(it->second.buffer_size()), parent(parent) {}
105
+ ~mutable_iterator() {
106
+ if (it == parent->list_.end()) return;
107
+ // The entry must not have been erased.
108
+ DCHECK(parent->lookup_map_.contains(it->first));
109
+ // Update the total buffer size if the buffer size has changed.
110
+ if (buffer_size == it->second.buffer_size()) {
111
+ return;
112
+ }
113
+ parent->total_buffer_size_ += it->second.buffer_size();
114
+ DCHECK_GE(parent->total_buffer_size_, buffer_size);
115
+ parent->total_buffer_size_ -= buffer_size;
116
+ parent->enforceBufferLimits();
117
+ }
118
+ };
119
+
120
+ explicit RequestsBuffer(size_t max_total_buffer_size)
121
+ : max_total_buffer_size_(max_total_buffer_size) {}
122
+
123
+ size_t max_total_buffer_size() const { return max_total_buffer_size_; }
124
+ size_t total_buffer_size() const { return total_buffer_size_; }
125
+
126
+ const_list_iterator begin() const { return list_.begin(); }
127
+ const_list_iterator end() const { return list_.end(); }
128
+
129
+ // Get a mutable iterator to the entry with the given key.
130
+ // The iterator will update the total buffer size when it is destroyed.
131
+ mutable_iterator find(const protocol::String& key) {
132
+ auto it = lookup_map_.find(key);
133
+ if (it == lookup_map_.end()) {
134
+ return mutable_iterator(nullptr, this);
135
+ }
136
+ return mutable_iterator(it->second, this);
137
+ }
138
+ const_list_iterator cfind(const protocol::String& key) const {
139
+ auto it = lookup_map_.find(key);
140
+ if (it == lookup_map_.end()) {
141
+ return list_.end();
142
+ }
143
+ return it->second;
144
+ }
145
+
146
+ bool contains(const protocol::String& key) const {
147
+ return lookup_map_.contains(key);
148
+ }
149
+
150
+ bool emplace(const protocol::String& key, RequestEntry&& value) {
151
+ if (lookup_map_.contains(key)) {
152
+ return false;
153
+ }
154
+ list_.emplace_front(key, std::move(value));
155
+ lookup_map_[key] = list_.begin();
156
+ // No buffer yet.
157
+ DCHECK_EQ(begin()->second.buffer_size(), 0u);
158
+ return true;
159
+ }
160
+
161
+ void erase(const protocol::String& key) {
162
+ auto it = lookup_map_.find(key);
163
+ if (it == lookup_map_.end()) {
164
+ return;
165
+ }
166
+ erase(it->second);
167
+ }
168
+
169
+ void erase(const_list_iterator it) {
170
+ DCHECK(it != list_.end());
171
+ DCHECK_GE(total_buffer_size_, it->second.buffer_size());
172
+ total_buffer_size_ -= it->second.buffer_size();
173
+ lookup_map_.erase(it->first);
174
+ list_.erase(it);
175
+ }
176
+
177
+ private:
178
+ void enforceBufferLimits() {
179
+ while (total_buffer_size_ > max_total_buffer_size_ && !list_.empty()) {
180
+ auto last_it = --list_.end();
181
+ erase(last_it);
182
+ }
183
+ }
184
+
185
+ size_t max_total_buffer_size_;
186
+ size_t total_buffer_size_ = 0;
187
+
188
+ std::list<key_value_pair_t> list_;
189
+ std::map<protocol::String, list_iterator> lookup_map_;
190
+ };
191
+
192
+ } // namespace inspector
193
+ } // namespace node
194
+
195
+ #endif // SRC_INSPECTOR_NETWORK_REQUESTS_BUFFER_H_
@@ -0,0 +1,29 @@
1
+ // network_resource_manager.h
2
+ #ifndef SRC_INSPECTOR_NETWORK_RESOURCE_MANAGER_H_
3
+ #define SRC_INSPECTOR_NETWORK_RESOURCE_MANAGER_H_
4
+
5
+ #include <atomic>
6
+ #include <string>
7
+ #include <unordered_map>
8
+ #include "node_mutex.h"
9
+
10
+ namespace node {
11
+ namespace inspector {
12
+
13
+ class NetworkResourceManager {
14
+ public:
15
+ void Put(const std::string& url, const std::string& data);
16
+ std::string Get(const std::string& url);
17
+
18
+ // Erase resource and mapping by stream id
19
+ void Erase(const std::string& stream_id);
20
+
21
+ private:
22
+ std::unordered_map<std::string, std::string> resources_;
23
+ Mutex mutex_; // Protects access to resources_
24
+ };
25
+
26
+ } // namespace inspector
27
+ } // namespace node
28
+
29
+ #endif // SRC_INSPECTOR_NETWORK_RESOURCE_MANAGER_H_
@@ -0,0 +1,24 @@
1
+ #ifndef SRC_INSPECTOR_NODE_JSON_H_
2
+ #define SRC_INSPECTOR_NODE_JSON_H_
3
+
4
+ #include "node/inspector/protocol/Protocol.h"
5
+
6
+ namespace node {
7
+ namespace inspector {
8
+
9
+ struct JsonUtil {
10
+ // Parse s JSON string into protocol::Value.
11
+ static std::unique_ptr<protocol::Value> ParseJSON(const uint8_t* chars,
12
+ size_t size);
13
+ static std::unique_ptr<protocol::Value> ParseJSON(const uint16_t* chars,
14
+ size_t size);
15
+
16
+ static std::unique_ptr<protocol::Value> parseJSON(const std::string_view);
17
+ static std::unique_ptr<protocol::Value> parseJSON(
18
+ v8_inspector::StringView view);
19
+ };
20
+
21
+ } // namespace inspector
22
+ } // namespace node
23
+
24
+ #endif // SRC_INSPECTOR_NODE_JSON_H_
@@ -0,0 +1,101 @@
1
+ // Bridges V8 Inspector generated code with the std::string used by the Node
2
+ // Compare to V8 counterpart - deps/v8/src/inspector/string-util.h
3
+ #ifndef SRC_INSPECTOR_NODE_STRING_H_
4
+ #define SRC_INSPECTOR_NODE_STRING_H_
5
+
6
+ #include <cstring>
7
+ #include <sstream>
8
+ #include <string>
9
+ #include "crdtp/protocol_core.h"
10
+ #include "util.h"
11
+ #include "v8-inspector.h"
12
+
13
+ namespace node::inspector::protocol {
14
+ class Binary;
15
+ }
16
+
17
+ namespace crdtp {
18
+
19
+ template <>
20
+ struct ProtocolTypeTraits<std::string> {
21
+ static bool Deserialize(DeserializerState* state, std::string* value);
22
+ static void Serialize(const std::string& value, std::vector<uint8_t>* bytes);
23
+ };
24
+
25
+ template <>
26
+ struct ProtocolTypeTraits<node::inspector::protocol::Binary> {
27
+ static bool Deserialize(DeserializerState* state,
28
+ node::inspector::protocol::Binary* value);
29
+ static void Serialize(const node::inspector::protocol::Binary& value,
30
+ std::vector<uint8_t>* bytes);
31
+ };
32
+
33
+ } // namespace crdtp
34
+
35
+ namespace node {
36
+ namespace inspector {
37
+ namespace protocol {
38
+
39
+ class Value;
40
+
41
+ using String = std::string;
42
+ using StringBuilder = std::ostringstream;
43
+ using ProtocolMessage = std::string;
44
+
45
+ // Implements StringUtil methods used in `inspector_protocol/lib/`.
46
+ // Refer to
47
+ // https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/core/inspector/v8_inspector_string.h;l=40;drc=2b15d6974a49d3a14d3d67ae099a649d523a828d
48
+ // for more details about the interface.
49
+ struct StringUtil {
50
+ // Convert Utf16 in local endianness to Utf8 if needed.
51
+ static String StringViewToUtf8(v8_inspector::StringView view);
52
+ static String fromUTF16(const uint16_t* data, size_t length);
53
+
54
+ static String fromUTF8(const uint8_t* data, size_t length);
55
+ static String fromUTF16LE(const uint16_t* data, size_t length);
56
+ static const uint8_t* CharactersUTF8(const std::string_view s);
57
+ static size_t CharacterCount(const std::string_view s);
58
+
59
+ // Unimplemented. The generated code will fall back to CharactersUTF8().
60
+ inline static uint8_t* CharactersLatin1(const std::string_view s) {
61
+ return nullptr;
62
+ }
63
+ inline static const uint16_t* CharactersUTF16(const std::string_view s) {
64
+ return nullptr;
65
+ }
66
+ };
67
+
68
+ // A read-only sequence of uninterpreted bytes with reference-counted storage.
69
+ class Binary {
70
+ public:
71
+ Binary() : bytes_(std::make_shared<std::vector<uint8_t>>()) {}
72
+
73
+ const uint8_t* data() const { return bytes_->data(); }
74
+ size_t size() const { return bytes_->size(); }
75
+
76
+ String toBase64() const;
77
+
78
+ static Binary concat(const std::vector<Binary>& binaries);
79
+
80
+ static Binary fromBase64(const String& base64, bool* success);
81
+ static Binary fromUint8Array(v8::Local<v8::Uint8Array> data);
82
+ static Binary fromSpan(const uint8_t* data, size_t size) {
83
+ return Binary::fromSpan(crdtp::span<uint8_t>(data, size));
84
+ }
85
+ static Binary fromSpan(crdtp::span<uint8_t> span) {
86
+ return Binary(
87
+ std::make_shared<std::vector<uint8_t>>(span.begin(), span.end()));
88
+ }
89
+
90
+ private:
91
+ std::shared_ptr<std::vector<uint8_t>> bytes_;
92
+
93
+ explicit Binary(std::shared_ptr<std::vector<uint8_t>> bytes)
94
+ : bytes_(bytes) {}
95
+ };
96
+
97
+ } // namespace protocol
98
+ } // namespace inspector
99
+ } // namespace node
100
+
101
+ #endif // SRC_INSPECTOR_NODE_STRING_H_
@@ -0,0 +1,38 @@
1
+ #ifndef SRC_INSPECTOR_NOTIFICATION_EMITTER_H_
2
+ #define SRC_INSPECTOR_NOTIFICATION_EMITTER_H_
3
+
4
+ #include <string>
5
+ #include <unordered_map>
6
+ #include "v8.h"
7
+
8
+ namespace node {
9
+ namespace inspector {
10
+
11
+ class NotificationEmitter {
12
+ public:
13
+ using EventKey = std::string;
14
+ using EventNotifier =
15
+ std::function<void(v8::Local<v8::Context>, v8::Local<v8::Object>)>;
16
+
17
+ NotificationEmitter();
18
+ virtual ~NotificationEmitter() = default;
19
+
20
+ void emitNotification(v8::Local<v8::Context> context,
21
+ const EventKey& event,
22
+ v8::Local<v8::Object> params);
23
+ virtual bool canEmit(const std::string& domain) = 0;
24
+
25
+ NotificationEmitter(const NotificationEmitter&) = delete;
26
+ NotificationEmitter& operator=(const NotificationEmitter&) = delete;
27
+
28
+ protected:
29
+ void addEventNotifier(const EventKey& event, EventNotifier notifier);
30
+
31
+ private:
32
+ std::unordered_map<EventKey, EventNotifier> event_notifier_map_ = {};
33
+ };
34
+
35
+ } // namespace inspector
36
+ } // namespace node
37
+
38
+ #endif // SRC_INSPECTOR_NOTIFICATION_EMITTER_H_
@@ -0,0 +1,27 @@
1
+ #ifndef SRC_INSPECTOR_PROTOCOL_HELPER_H_
2
+ #define SRC_INSPECTOR_PROTOCOL_HELPER_H_
3
+
4
+ #include "node/inspector/protocol/Protocol.h"
5
+ #include "util.h"
6
+ #include "v8-inspector.h"
7
+
8
+ namespace node::inspector {
9
+
10
+ // Convert a V8 string to v8_inspector StringBuffer, encoded in UTF16.
11
+ inline std::unique_ptr<v8_inspector::StringBuffer> ToInspectorString(
12
+ v8::Isolate* isolate, v8::Local<v8::Value> value) {
13
+ TwoByteValue buffer(isolate, value);
14
+ return v8_inspector::StringBuffer::create(
15
+ v8_inspector::StringView(*buffer, buffer.length()));
16
+ }
17
+
18
+ // Convert a V8 string to node::inspector::protocol::String, encoded in UTF8.
19
+ inline protocol::String ToProtocolString(v8::Isolate* isolate,
20
+ v8::Local<v8::Value> value) {
21
+ Utf8Value buffer(isolate, value);
22
+ return buffer.ToString();
23
+ }
24
+
25
+ } // namespace node::inspector
26
+
27
+ #endif // SRC_INSPECTOR_PROTOCOL_HELPER_H_