@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.
- package/CHANGELOG.md +9 -0
- package/CLAUDE.md +81 -0
- package/README.md +10 -5
- package/dist/bindings/cws_darwin_arm64_node115.node +0 -0
- package/dist/bindings/cws_darwin_arm64_node127.node +0 -0
- package/dist/bindings/cws_darwin_arm64_node137.node +0 -0
- package/dist/bindings/cws_darwin_arm64_node147.node +0 -0
- package/dist/bindings/cws_linux_arm64_node115.node +0 -0
- package/dist/bindings/cws_linux_arm64_node127.node +0 -0
- package/dist/bindings/cws_linux_arm64_node137.node +0 -0
- package/dist/bindings/cws_linux_arm64_node147.node +0 -0
- package/dist/bindings/cws_linux_x64_node115.node +0 -0
- package/dist/bindings/cws_linux_x64_node127.node +0 -0
- package/dist/bindings/cws_linux_x64_node137.node +0 -0
- package/dist/bindings/cws_linux_x64_node147.node +0 -0
- package/dist/bindings/cws_win32_x64_node115.node +0 -0
- package/dist/bindings/cws_win32_x64_node127.node +0 -0
- package/dist/bindings/cws_win32_x64_node137.node +0 -0
- package/dist/bindings/cws_win32_x64_node147.node +0 -0
- package/package.json +1 -1
- package/src/Addon.cpp +2 -1
- package/src/Addon.h +70 -14
- package/src/Hub.h +1 -0
- package/src/Networking.h +11 -0
- package/src/Socket.h +201 -6
- package/src/WebSocket.cpp +4 -1
- package/src/cSNode.cpp +2 -0
- package/src/cSNode.h +4 -0
- package/src/headers/24/tracing/agent.h +195 -0
- package/src/headers/24/tracing/trace_event.h +722 -0
- package/src/headers/26/acorn_version.h +6 -0
- package/src/headers/26/aliased_buffer-inl.h +264 -0
- package/src/headers/26/aliased_buffer.h +205 -0
- package/src/headers/26/aliased_struct-inl.h +143 -0
- package/src/headers/26/aliased_struct.h +248 -0
- package/src/headers/26/amaro_version.h +6 -0
- package/src/headers/26/async_context_frame.h +33 -0
- package/src/headers/26/async_wrap-inl.h +123 -0
- package/src/headers/26/async_wrap.h +254 -0
- package/src/headers/26/base_object-inl.h +333 -0
- package/src/headers/26/base_object.h +339 -0
- package/src/headers/26/base_object_types.h +76 -0
- package/src/headers/26/blob_serializer_deserializer-inl.h +385 -0
- package/src/headers/26/blob_serializer_deserializer.h +142 -0
- package/src/headers/26/builtin_info.h +57 -0
- package/src/headers/26/callback_queue-inl.h +97 -0
- package/src/headers/26/callback_queue.h +79 -0
- package/src/headers/26/cares_wrap.h +475 -0
- package/src/headers/26/cleanup_queue-inl.h +36 -0
- package/src/headers/26/cleanup_queue.h +79 -0
- package/src/headers/26/compile_cache.h +134 -0
- package/src/headers/26/connect_wrap.h +26 -0
- package/src/headers/26/connection_wrap.h +30 -0
- package/src/headers/26/cppgc_helpers-inl.h +69 -0
- package/src/headers/26/cppgc_helpers.h +162 -0
- package/src/headers/26/crypto/crypto_aes.h +107 -0
- package/src/headers/26/crypto/crypto_argon2.h +88 -0
- package/src/headers/26/crypto/crypto_bio.h +193 -0
- package/src/headers/26/crypto/crypto_chacha20_poly1305.h +62 -0
- package/src/headers/26/crypto/crypto_cipher.h +291 -0
- package/src/headers/26/crypto/crypto_common.h +48 -0
- package/src/headers/26/crypto/crypto_context.h +219 -0
- package/src/headers/26/crypto/crypto_dh.h +104 -0
- package/src/headers/26/crypto/crypto_dsa.h +50 -0
- package/src/headers/26/crypto/crypto_ec.h +102 -0
- package/src/headers/26/crypto/crypto_hash.h +157 -0
- package/src/headers/26/crypto/crypto_hkdf.h +62 -0
- package/src/headers/26/crypto/crypto_hmac.h +92 -0
- package/src/headers/26/crypto/crypto_kem.h +131 -0
- package/src/headers/26/crypto/crypto_keygen.h +382 -0
- package/src/headers/26/crypto/crypto_keys.h +366 -0
- package/src/headers/26/crypto/crypto_kmac.h +79 -0
- package/src/headers/26/crypto/crypto_pbkdf2.h +76 -0
- package/src/headers/26/crypto/crypto_pqc.h +39 -0
- package/src/headers/26/crypto/crypto_random.h +127 -0
- package/src/headers/26/crypto/crypto_rsa.h +108 -0
- package/src/headers/26/crypto/crypto_scrypt.h +85 -0
- package/src/headers/26/crypto/crypto_sig.h +159 -0
- package/src/headers/26/crypto/crypto_spkac.h +21 -0
- package/src/headers/26/crypto/crypto_timing.h +20 -0
- package/src/headers/26/crypto/crypto_tls.h +342 -0
- package/src/headers/26/crypto/crypto_turboshake.h +105 -0
- package/src/headers/26/crypto/crypto_util.h +775 -0
- package/src/headers/26/crypto/crypto_x509.h +140 -0
- package/src/headers/26/dataqueue/queue.h +311 -0
- package/src/headers/26/debug_utils-inl.h +291 -0
- package/src/headers/26/debug_utils.h +200 -0
- package/src/headers/26/diagnosticfilename-inl.h +33 -0
- package/src/headers/26/embedded_data.h +17 -0
- package/src/headers/26/encoding_binding.h +59 -0
- package/src/headers/26/env-inl.h +956 -0
- package/src/headers/26/env.h +1294 -0
- package/src/headers/26/env_properties.h +562 -0
- package/src/headers/26/ffi/data.h +30 -0
- package/src/headers/26/ffi/fast.h +96 -0
- package/src/headers/26/ffi/jit_memory.h +26 -0
- package/src/headers/26/ffi/types.h +99 -0
- package/src/headers/26/handle_wrap.h +123 -0
- package/src/headers/26/histogram-inl.h +211 -0
- package/src/headers/26/histogram.h +474 -0
- package/src/headers/26/inspector/dom_storage_agent.h +68 -0
- package/src/headers/26/inspector/inspector_object_utils.h +38 -0
- package/src/headers/26/inspector/io_agent.h +30 -0
- package/src/headers/26/inspector/main_thread_interface.h +116 -0
- package/src/headers/26/inspector/network_agent.h +110 -0
- package/src/headers/26/inspector/network_inspector.h +45 -0
- package/src/headers/26/inspector/network_requests_buffer.h +195 -0
- package/src/headers/26/inspector/network_resource_manager.h +29 -0
- package/src/headers/26/inspector/node_json.h +24 -0
- package/src/headers/26/inspector/node_string.h +101 -0
- package/src/headers/26/inspector/notification_emitter.h +38 -0
- package/src/headers/26/inspector/protocol_helper.h +27 -0
- package/src/headers/26/inspector/runtime_agent.h +41 -0
- package/src/headers/26/inspector/storage_agent.h +33 -0
- package/src/headers/26/inspector/target_agent.h +59 -0
- package/src/headers/26/inspector/target_manager.h +70 -0
- package/src/headers/26/inspector/tracing_agent.h +43 -0
- package/src/headers/26/inspector/worker_agent.h +40 -0
- package/src/headers/26/inspector/worker_inspector.h +124 -0
- package/src/headers/26/inspector_agent.h +168 -0
- package/src/headers/26/inspector_io.h +78 -0
- package/src/headers/26/inspector_profiler.h +149 -0
- package/src/headers/26/inspector_socket.h +60 -0
- package/src/headers/26/inspector_socket_server.h +110 -0
- package/src/headers/26/js_native_api.h +634 -0
- package/src/headers/26/js_native_api_types.h +244 -0
- package/src/headers/26/js_native_api_v8.h +485 -0
- package/src/headers/26/js_native_api_v8_internals.h +45 -0
- package/src/headers/26/js_stream.h +57 -0
- package/src/headers/26/json_utils.h +172 -0
- package/src/headers/26/large_pages/node_large_page.h +34 -0
- package/src/headers/26/lru_cache-inl.h +69 -0
- package/src/headers/26/memory_tracker-inl.h +461 -0
- package/src/headers/26/memory_tracker.h +341 -0
- package/src/headers/26/module_wrap.h +231 -0
- package/src/headers/26/ncrypto.h +2008 -0
- package/src/headers/26/node.h +1693 -0
- package/src/headers/26/node_api.h +265 -0
- package/src/headers/26/node_api_internals.h +48 -0
- package/src/headers/26/node_api_types.h +58 -0
- package/src/headers/26/node_binding.h +170 -0
- package/src/headers/26/node_blob.h +160 -0
- package/src/headers/26/node_bob-inl.h +36 -0
- package/src/headers/26/node_bob.h +107 -0
- package/src/headers/26/node_buffer.h +92 -0
- package/src/headers/26/node_builtins.h +239 -0
- package/src/headers/26/node_concepts.h +46 -0
- package/src/headers/26/node_config_file.h +77 -0
- package/src/headers/26/node_constants.h +82 -0
- package/src/headers/26/node_context_data.h +171 -0
- package/src/headers/26/node_contextify.h +261 -0
- package/src/headers/26/node_crypto.h +66 -0
- package/src/headers/26/node_debug.h +30 -0
- package/src/headers/26/node_diagnostics_channel.h +121 -0
- package/src/headers/26/node_dir.h +52 -0
- package/src/headers/26/node_dotenv.h +45 -0
- package/src/headers/26/node_errors.h +378 -0
- package/src/headers/26/node_exit_code.h +54 -0
- package/src/headers/26/node_external_reference.h +171 -0
- package/src/headers/26/node_ffi.h +212 -0
- package/src/headers/26/node_file-inl.h +421 -0
- package/src/headers/26/node_file.h +561 -0
- package/src/headers/26/node_file_utils.h +39 -0
- package/src/headers/26/node_hash.h +212 -0
- package/src/headers/26/node_http2.h +1202 -0
- package/src/headers/26/node_http2_state.h +159 -0
- package/src/headers/26/node_http_common-inl.h +199 -0
- package/src/headers/26/node_http_common.h +535 -0
- package/src/headers/26/node_i18n.h +132 -0
- package/src/headers/26/node_internals.h +485 -0
- package/src/headers/26/node_locks.h +184 -0
- package/src/headers/26/node_main_instance.h +67 -0
- package/src/headers/26/node_mem-inl.h +113 -0
- package/src/headers/26/node_mem.h +45 -0
- package/src/headers/26/node_messaging.h +389 -0
- package/src/headers/26/node_metadata.h +172 -0
- package/src/headers/26/node_modules.h +102 -0
- package/src/headers/26/node_mutex.h +323 -0
- package/src/headers/26/node_object_wrap.h +145 -0
- package/src/headers/26/node_options-inl.h +524 -0
- package/src/headers/26/node_options.h +710 -0
- package/src/headers/26/node_perf.h +167 -0
- package/src/headers/26/node_perf_common.h +103 -0
- package/src/headers/26/node_platform.h +290 -0
- package/src/headers/26/node_process-inl.h +26 -0
- package/src/headers/26/node_process.h +112 -0
- package/src/headers/26/node_profiling.h +38 -0
- package/src/headers/26/node_realm-inl.h +156 -0
- package/src/headers/26/node_realm.h +236 -0
- package/src/headers/26/node_report.h +43 -0
- package/src/headers/26/node_revert.h +82 -0
- package/src/headers/26/node_root_certs.h +2937 -0
- package/src/headers/26/node_sea.h +101 -0
- package/src/headers/26/node_shadow_realm.h +46 -0
- package/src/headers/26/node_snapshot_builder.h +57 -0
- package/src/headers/26/node_snapshotable.h +167 -0
- package/src/headers/26/node_sockaddr-inl.h +248 -0
- package/src/headers/26/node_sockaddr.h +459 -0
- package/src/headers/26/node_sqlite.h +607 -0
- package/src/headers/26/node_stat_watcher.h +73 -0
- package/src/headers/26/node_task_runner.h +92 -0
- package/src/headers/26/node_threadsafe_cow-inl.h +54 -0
- package/src/headers/26/node_threadsafe_cow.h +105 -0
- package/src/headers/26/node_union_bytes.h +81 -0
- package/src/headers/26/node_url.h +101 -0
- package/src/headers/26/node_url_pattern.h +118 -0
- package/src/headers/26/node_v8.h +78 -0
- package/src/headers/26/node_v8_embedder.h +26 -0
- package/src/headers/26/node_v8_platform-inl.h +96 -0
- package/src/headers/26/node_version.h +116 -0
- package/src/headers/26/node_wasi.h +184 -0
- package/src/headers/26/node_wasm_web_api.h +55 -0
- package/src/headers/26/node_watchdog.h +164 -0
- package/src/headers/26/node_webstorage.h +62 -0
- package/src/headers/26/node_worker.h +162 -0
- package/src/headers/26/path.h +36 -0
- package/src/headers/26/permission/boolean_permission.h +50 -0
- package/src/headers/26/permission/fs_permission.h +192 -0
- package/src/headers/26/permission/permission.h +155 -0
- package/src/headers/26/permission/permission_base.h +79 -0
- package/src/headers/26/pipe_wrap.h +80 -0
- package/src/headers/26/quic/application.h +279 -0
- package/src/headers/26/quic/arena.h +373 -0
- package/src/headers/26/quic/bindingdata.h +440 -0
- package/src/headers/26/quic/cid.h +127 -0
- package/src/headers/26/quic/data.h +358 -0
- package/src/headers/26/quic/defs.h +417 -0
- package/src/headers/26/quic/endpoint.h +519 -0
- package/src/headers/26/quic/guard.h +5 -0
- package/src/headers/26/quic/http3.h +25 -0
- package/src/headers/26/quic/packet.h +166 -0
- package/src/headers/26/quic/preferredaddress.h +72 -0
- package/src/headers/26/quic/session.h +770 -0
- package/src/headers/26/quic/session_manager.h +107 -0
- package/src/headers/26/quic/sessionticket.h +110 -0
- package/src/headers/26/quic/streams.h +518 -0
- package/src/headers/26/quic/tlscontext.h +353 -0
- package/src/headers/26/quic/tokens.h +263 -0
- package/src/headers/26/quic/transportparams.h +184 -0
- package/src/headers/26/req_wrap-inl.h +175 -0
- package/src/headers/26/req_wrap.h +79 -0
- package/src/headers/26/spawn_sync.h +243 -0
- package/src/headers/26/stream_base-inl.h +170 -0
- package/src/headers/26/stream_base.h +487 -0
- package/src/headers/26/stream_pipe.h +76 -0
- package/src/headers/26/stream_wrap.h +137 -0
- package/src/headers/26/string_bytes.h +114 -0
- package/src/headers/26/string_decoder-inl.h +31 -0
- package/src/headers/26/string_decoder.h +49 -0
- package/src/headers/26/tcp_wrap.h +138 -0
- package/src/headers/26/threadpoolwork-inl.h +70 -0
- package/src/headers/26/timer_wrap-inl.h +32 -0
- package/src/headers/26/timer_wrap.h +87 -0
- package/src/headers/26/timers.h +70 -0
- package/src/headers/26/tracing/agent.h +125 -0
- package/src/headers/26/tracing/agent_legacy.h +146 -0
- package/src/headers/26/tracing/agent_perfetto.h +145 -0
- package/src/headers/26/tracing/node_trace_buffer.h +91 -0
- package/src/headers/26/tracing/node_trace_writer.h +79 -0
- package/src/headers/26/tracing/trace_event.h +27 -0
- package/src/headers/26/tracing/trace_event_helper.h +40 -0
- package/src/headers/26/tracing/trace_event_legacy.h +1113 -0
- package/src/headers/26/tracing/trace_event_legacy_inl.h +711 -0
- package/src/headers/26/tracing/trace_event_perfetto.h +47 -0
- package/src/headers/26/tracing/traced_value.h +167 -0
- package/src/headers/26/tty_wrap.h +65 -0
- package/src/headers/26/udp_wrap.h +231 -0
- package/src/headers/26/undici_version.h +6 -0
- package/src/headers/26/util-inl.h +788 -0
- package/src/headers/26/util.h +1207 -0
- package/src/headers/26/v8-cpp-heap-external.h +56 -0
- package/src/headers/26/v8-external-memory-accounter.h +60 -0
- package/src/headers/26/v8-fast-api-calls.h +784 -0
- package/src/headers/26/v8-inspector-protocol.h +13 -0
- package/src/headers/26/v8-inspector.h +458 -0
- package/src/headers/26/v8-metrics.h +273 -0
- package/src/headers/26/v8-trace-categories.h +28 -0
- package/src/headers/26/v8-unwinder-state.h +30 -0
- package/src/headers/26/v8-util.h +549 -0
- package/src/headers/26/v8-value-serializer-version.h +24 -0
- package/src/headers/26/v8-version-string.h +38 -0
- package/src/headers/26/v8-wasm-trap-handler-posix.h +31 -0
- package/src/headers/26/v8-wasm-trap-handler-win.h +28 -0
- 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
|