@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,107 @@
1
+ #pragma once
2
+
3
+ #if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
4
+
5
+ #include <env.h>
6
+ #include <node_sockaddr.h>
7
+ #include <unordered_map>
8
+ #include <unordered_set>
9
+ #include "cid.h"
10
+ #include "tokens.h"
11
+
12
+ namespace node::quic {
13
+
14
+ class Endpoint;
15
+ class Session;
16
+
17
+ // SessionManager is a per-Realm singleton that centralizes QUIC session
18
+ // routing. It holds the authoritative CID -> Session mapping, enabling
19
+ // any Endpoint to route packets to any session. This decouples session
20
+ // lifetime from individual endpoints, which is required for preferred
21
+ // address, connection migration, and multi-path QUIC.
22
+ //
23
+ // SessionManager is held by BindingData and lazily created on first access.
24
+ // It is not exposed to JavaScript.
25
+ class SessionManager final {
26
+ public:
27
+ explicit SessionManager() = default;
28
+ ~SessionManager() = default;
29
+
30
+ // Session routing. The sessions_ map holds BaseObjectPtr<Session> (owning
31
+ // references). SessionManager is the single authority for session ownership.
32
+ BaseObjectPtr<Session> FindSession(const CID& dcid);
33
+ void AddSession(const CID& scid, BaseObjectPtr<Session> session);
34
+ void RemoveSession(const CID& scid);
35
+
36
+ // Cross-endpoint CID association. This map holds locally-generated CIDs
37
+ // that need to be routable from any endpoint (e.g., preferred address CID,
38
+ // multipath NEW_CONNECTION_ID CIDs). Peer-chosen CIDs from connection
39
+ // establishment (config.dcid, config.ocid) go in Endpoint::dcid_to_scid_
40
+ // instead, because those values can collide across endpoints.
41
+ void AssociateCID(const CID& cid, const CID& scid);
42
+ void DisassociateCID(const CID& cid);
43
+
44
+ // Stateless reset token association. The token_map_ holds raw (non-owning)
45
+ // pointers. Entries are valid only while the corresponding session exists
46
+ // in sessions_. Sessions clean up their tokens during teardown.
47
+ void AssociateStatelessResetToken(const StatelessResetToken& token,
48
+ Session* session);
49
+ void DisassociateStatelessResetToken(const StatelessResetToken& token);
50
+ Session* FindSessionByStatelessResetToken(
51
+ const StatelessResetToken& token) const;
52
+
53
+ // Endpoint registry. Endpoints register themselves when they start
54
+ // receiving and unregister when they close.
55
+ void RegisterEndpoint(Endpoint* endpoint, const SocketAddress& local_address);
56
+ void UnregisterEndpoint(Endpoint* endpoint);
57
+ bool HasEndpoints() const;
58
+ size_t endpoint_count() const;
59
+
60
+ // Find the endpoint bound to a given local address. Used by the session
61
+ // send path to route packets through the correct endpoint based on the
62
+ // ngtcp2 packet path. Tries exact match first, then wildcard fallback
63
+ // (0.0.0.0 or [::] on the same port).
64
+ Endpoint* FindEndpointForAddress(const SocketAddress& local_addr) const;
65
+
66
+ // Primary endpoint tracking. Each session has one primary endpoint
67
+ // responsible for its lifecycle.
68
+ void SetPrimaryEndpoint(Session* session, Endpoint* endpoint);
69
+ Endpoint* GetPrimaryEndpoint(Session* session) const;
70
+
71
+ // Close all sessions whose primary endpoint is the given endpoint.
72
+ // Used by Endpoint::Destroy().
73
+ void CloseAllSessionsFor(Endpoint* endpoint);
74
+
75
+ // Destroy all sessions. Used when the last endpoint is removed.
76
+ void DestroyAllSessions();
77
+
78
+ bool is_empty() const;
79
+
80
+ private:
81
+ // The sessions_ map holds strong owning references keyed by locally-
82
+ // generated SCIDs. This is the single source of truth for session
83
+ // ownership.
84
+ CID::Map<BaseObjectPtr<Session>> sessions_;
85
+
86
+ // Cross-endpoint CID -> primary SCID mapping. Contains locally-generated
87
+ // CIDs that need to be routable from any endpoint. Peer-chosen CIDs
88
+ // from connection establishment are in Endpoint::dcid_to_scid_ instead.
89
+ CID::Map<CID> dcid_to_scid_;
90
+
91
+ // Stateless reset token -> Session (non-owning).
92
+ StatelessResetToken::Map<Session*> token_map_;
93
+
94
+ // All registered endpoints.
95
+ std::unordered_set<Endpoint*> endpoints_;
96
+
97
+ // Endpoint -> bound local address, for FindEndpointForAddress lookups.
98
+ std::unordered_map<Endpoint*, SocketAddress> endpoint_addrs_;
99
+
100
+ // Session -> primary Endpoint mapping (non-owning both directions;
101
+ // sessions are owned by sessions_, endpoints are externally owned).
102
+ std::unordered_map<Session*, Endpoint*> primary_map_;
103
+ };
104
+
105
+ } // namespace node::quic
106
+
107
+ #endif // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
@@ -0,0 +1,110 @@
1
+ #pragma once
2
+
3
+ #if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
4
+
5
+ #include <crypto/crypto_common.h>
6
+ #include <env.h>
7
+ #include <memory_tracker.h>
8
+ #include <uv.h>
9
+ #include <v8.h>
10
+ #include "data.h"
11
+ #include "defs.h"
12
+
13
+ namespace node::quic {
14
+
15
+ // A TLS 1.3 Session resumption ticket. Encapsulates both the TLS
16
+ // ticket and the encoded QUIC transport parameters. The encoded
17
+ // structure should be considered to be opaque for end users.
18
+ // In JavaScript, the ticket will be represented as a Buffer
19
+ // instance with opaque data. To resume a session, the user code
20
+ // would pass that Buffer back into to client connection API.
21
+ class SessionTicket final : public MemoryRetainer {
22
+ public:
23
+ static v8::Maybe<SessionTicket> FromV8Value(Environment* env,
24
+ v8::Local<v8::Value> value);
25
+
26
+ SessionTicket() = default;
27
+ SessionTicket(Store&& ticket, Store&& transport_params);
28
+
29
+ const uv_buf_t ticket() const;
30
+
31
+ const ngtcp2_vec transport_params() const;
32
+
33
+ v8::MaybeLocal<v8::Object> encode(Environment* env) const;
34
+
35
+ void MemoryInfo(MemoryTracker* tracker) const override;
36
+ SET_MEMORY_INFO_NAME(SessionTicket)
37
+ SET_SELF_SIZE(SessionTicket)
38
+
39
+ class AppData;
40
+
41
+ // The callback that OpenSSL will call when generating the session ticket
42
+ // and it needs to collect additional application specific data.
43
+ static int GenerateCallback(SSL* ssl, void* arg);
44
+
45
+ // The callback that OpenSSL will call when consuming the session ticket
46
+ // and it needs to pass embedded application data back into the app.
47
+ static SSL_TICKET_RETURN DecryptedCallback(SSL* ssl,
48
+ SSL_SESSION* session,
49
+ const unsigned char* keyname,
50
+ size_t keyname_len,
51
+ SSL_TICKET_STATUS status,
52
+ void* arg);
53
+
54
+ private:
55
+ Store ticket_;
56
+ Store transport_params_;
57
+ };
58
+
59
+ // SessionTicket::AppData is a utility class that is used only during the
60
+ // generation or access of TLS stateless session tickets. It exists solely to
61
+ // provide a easier way for Session::Application instances to set relevant
62
+ // metadata in the session ticket when it is created, and the extract and
63
+ // subsequently verify that data when a ticket is received and is being
64
+ // validated. The app data is completely opaque to anything other than the
65
+ // server-side of the Session::Application that sets it.
66
+ class SessionTicket::AppData final {
67
+ public:
68
+ enum class Status : uint8_t {
69
+ TICKET_IGNORE = SSL_TICKET_RETURN_IGNORE,
70
+ TICKET_IGNORE_RENEW = SSL_TICKET_RETURN_IGNORE_RENEW,
71
+ TICKET_USE = SSL_TICKET_RETURN_USE,
72
+ TICKET_USE_RENEW = SSL_TICKET_RETURN_USE_RENEW,
73
+ };
74
+
75
+ explicit AppData(SSL* ssl, SSL_SESSION* session = nullptr);
76
+ DISALLOW_COPY_AND_MOVE(AppData)
77
+
78
+ bool Set(const uv_buf_t& data);
79
+ std::optional<const uv_buf_t> Get() const;
80
+
81
+ // A source of application data collected during the creation of the
82
+ // session ticket. This interface will be implemented by the QUIC
83
+ // Session.
84
+ class Source {
85
+ public:
86
+ enum class Flag : uint8_t { STATUS_NONE, STATUS_RENEW };
87
+
88
+ // Collect application data into the given AppData instance.
89
+ virtual void CollectSessionTicketAppData(AppData* app_data) const = 0;
90
+
91
+ // Extract application data from the given AppData instance.
92
+ virtual Status ExtractSessionTicketAppData(
93
+ const AppData& app_data, Flag flag = Flag::STATUS_NONE) = 0;
94
+ };
95
+
96
+ static void Collect(SSL* ssl);
97
+ static Status Extract(SSL* ssl,
98
+ SSL_SESSION* session,
99
+ Source::Flag flag = Source::Flag::STATUS_NONE);
100
+
101
+ private:
102
+ SSL_SESSION* GetSession() const;
103
+ bool set_ = false;
104
+ SSL* ssl_;
105
+ SSL_SESSION* session_;
106
+ };
107
+
108
+ } // namespace node::quic
109
+
110
+ #endif // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS