@kungfu-tech/libnode-win32-x64 0.0.0-bootstrap.0 → 22.22.3-kf.1
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/LICENSE +201 -0
- package/README.md +3 -0
- package/dist/node/include/acorn_version.h +6 -0
- package/dist/node/include/aliased_buffer-inl.h +244 -0
- package/dist/node/include/aliased_buffer.h +206 -0
- package/dist/node/include/aliased_struct-inl.h +54 -0
- package/dist/node/include/aliased_struct.h +63 -0
- package/dist/node/include/amaro_version.h +6 -0
- package/dist/node/include/async_context_frame.h +33 -0
- package/dist/node/include/async_wrap-inl.h +96 -0
- package/dist/node/include/async_wrap.h +243 -0
- package/dist/node/include/base_object-inl.h +335 -0
- package/dist/node/include/base_object.h +342 -0
- package/dist/node/include/base_object_types.h +74 -0
- package/dist/node/include/blob_serializer_deserializer-inl.h +385 -0
- package/dist/node/include/blob_serializer_deserializer.h +132 -0
- package/dist/node/include/callback_queue-inl.h +97 -0
- package/dist/node/include/callback_queue.h +79 -0
- package/dist/node/include/cares_wrap.h +447 -0
- package/dist/node/include/cjs_module_lexer_version.h +6 -0
- package/dist/node/include/cleanup_queue-inl.h +36 -0
- package/dist/node/include/cleanup_queue.h +79 -0
- package/dist/node/include/compile_cache.h +104 -0
- package/dist/node/include/connect_wrap.h +26 -0
- package/dist/node/include/connection_wrap.h +30 -0
- package/dist/node/include/cppgc/allocation.h +310 -0
- package/dist/node/include/cppgc/common.h +28 -0
- package/dist/node/include/cppgc/cross-thread-persistent.h +466 -0
- package/dist/node/include/cppgc/custom-space.h +97 -0
- package/dist/node/include/cppgc/default-platform.h +67 -0
- package/dist/node/include/cppgc/ephemeron-pair.h +30 -0
- package/dist/node/include/cppgc/explicit-management.h +100 -0
- package/dist/node/include/cppgc/garbage-collected.h +106 -0
- package/dist/node/include/cppgc/heap-consistency.h +309 -0
- package/dist/node/include/cppgc/heap-handle.h +48 -0
- package/dist/node/include/cppgc/heap-state.h +82 -0
- package/dist/node/include/cppgc/heap-statistics.h +120 -0
- package/dist/node/include/cppgc/heap.h +202 -0
- package/dist/node/include/cppgc/internal/api-constants.h +87 -0
- package/dist/node/include/cppgc/internal/atomic-entry-flag.h +48 -0
- package/dist/node/include/cppgc/internal/base-page-handle.h +45 -0
- package/dist/node/include/cppgc/internal/caged-heap-local-data.h +121 -0
- package/dist/node/include/cppgc/internal/caged-heap.h +68 -0
- package/dist/node/include/cppgc/internal/compiler-specific.h +38 -0
- package/dist/node/include/cppgc/internal/finalizer-trait.h +93 -0
- package/dist/node/include/cppgc/internal/gc-info.h +148 -0
- package/dist/node/include/cppgc/internal/logging.h +50 -0
- package/dist/node/include/cppgc/internal/member-storage.h +256 -0
- package/dist/node/include/cppgc/internal/name-trait.h +137 -0
- package/dist/node/include/cppgc/internal/persistent-node.h +214 -0
- package/dist/node/include/cppgc/internal/pointer-policies.h +243 -0
- package/dist/node/include/cppgc/internal/write-barrier.h +487 -0
- package/dist/node/include/cppgc/liveness-broker.h +78 -0
- package/dist/node/include/cppgc/macros.h +35 -0
- package/dist/node/include/cppgc/member.h +629 -0
- package/dist/node/include/cppgc/name-provider.h +65 -0
- package/dist/node/include/cppgc/object-size-trait.h +58 -0
- package/dist/node/include/cppgc/persistent.h +377 -0
- package/dist/node/include/cppgc/platform.h +163 -0
- package/dist/node/include/cppgc/prefinalizer.h +75 -0
- package/dist/node/include/cppgc/process-heap-statistics.h +36 -0
- package/dist/node/include/cppgc/sentinel-pointer.h +39 -0
- package/dist/node/include/cppgc/source-location.h +16 -0
- package/dist/node/include/cppgc/testing.h +106 -0
- package/dist/node/include/cppgc/trace-trait.h +128 -0
- package/dist/node/include/cppgc/type-traits.h +271 -0
- package/dist/node/include/cppgc/visitor.h +504 -0
- package/dist/node/include/crypto/crypto_aes.h +88 -0
- package/dist/node/include/crypto/crypto_bio.h +193 -0
- package/dist/node/include/crypto/crypto_cipher.h +293 -0
- package/dist/node/include/crypto/crypto_clienthello-inl.h +90 -0
- package/dist/node/include/crypto/crypto_clienthello.h +131 -0
- package/dist/node/include/crypto/crypto_common.h +64 -0
- package/dist/node/include/crypto/crypto_context.h +171 -0
- package/dist/node/include/crypto/crypto_dh.h +126 -0
- package/dist/node/include/crypto/crypto_dsa.h +52 -0
- package/dist/node/include/crypto/crypto_ec.h +164 -0
- package/dist/node/include/crypto/crypto_hash.h +91 -0
- package/dist/node/include/crypto/crypto_hkdf.h +61 -0
- package/dist/node/include/crypto/crypto_hmac.h +92 -0
- package/dist/node/include/crypto/crypto_keygen.h +299 -0
- package/dist/node/include/crypto/crypto_keys.h +392 -0
- package/dist/node/include/crypto/crypto_pbkdf2.h +74 -0
- package/dist/node/include/crypto/crypto_random.h +124 -0
- package/dist/node/include/crypto/crypto_rsa.h +136 -0
- package/dist/node/include/crypto/crypto_scrypt.h +85 -0
- package/dist/node/include/crypto/crypto_sig.h +165 -0
- package/dist/node/include/crypto/crypto_spkac.h +21 -0
- package/dist/node/include/crypto/crypto_timing.h +20 -0
- package/dist/node/include/crypto/crypto_tls.h +305 -0
- package/dist/node/include/crypto/crypto_util.h +725 -0
- package/dist/node/include/crypto/crypto_x509.h +140 -0
- package/dist/node/include/dataqueue/queue.h +306 -0
- package/dist/node/include/debug_utils-inl.h +278 -0
- package/dist/node/include/debug_utils.h +196 -0
- package/dist/node/include/diagnosticfilename-inl.h +33 -0
- package/dist/node/include/embedded_data.h +17 -0
- package/dist/node/include/encoding_binding.h +61 -0
- package/dist/node/include/env-inl.h +984 -0
- package/dist/node/include/env.h +1287 -0
- package/dist/node/include/env_properties.h +540 -0
- package/dist/node/include/handle_wrap.h +123 -0
- package/dist/node/include/histogram-inl.h +107 -0
- package/dist/node/include/histogram.h +279 -0
- package/dist/node/include/inspector/io_agent.h +30 -0
- package/dist/node/include/inspector/main_thread_interface.h +116 -0
- package/dist/node/include/inspector/network_agent.h +94 -0
- package/dist/node/include/inspector/network_inspector.h +45 -0
- package/dist/node/include/inspector/network_requests_buffer.h +195 -0
- package/dist/node/include/inspector/network_resource_manager.h +29 -0
- package/dist/node/include/inspector/node_json.h +24 -0
- package/dist/node/include/inspector/node_string.h +101 -0
- package/dist/node/include/inspector/protocol_helper.h +27 -0
- package/dist/node/include/inspector/runtime_agent.h +41 -0
- package/dist/node/include/inspector/target_agent.h +75 -0
- package/dist/node/include/inspector/tracing_agent.h +43 -0
- package/dist/node/include/inspector/worker_agent.h +40 -0
- package/dist/node/include/inspector/worker_inspector.h +124 -0
- package/dist/node/include/inspector_agent.h +165 -0
- package/dist/node/include/inspector_io.h +78 -0
- package/dist/node/include/inspector_profiler.h +149 -0
- package/dist/node/include/inspector_socket.h +60 -0
- package/dist/node/include/inspector_socket_server.h +110 -0
- package/dist/node/include/js_native_api.h +607 -0
- package/dist/node/include/js_native_api_types.h +226 -0
- package/dist/node/include/js_native_api_v8.h +485 -0
- package/dist/node/include/js_native_api_v8_internals.h +45 -0
- package/dist/node/include/js_stream.h +52 -0
- package/dist/node/include/json_utils.h +172 -0
- package/dist/node/include/large_pages/node_large_page.h +34 -0
- package/dist/node/include/libplatform/libplatform-export.h +29 -0
- package/dist/node/include/libplatform/libplatform.h +112 -0
- package/dist/node/include/libplatform/v8-tracing.h +333 -0
- package/dist/node/include/memory_tracker-inl.h +359 -0
- package/dist/node/include/memory_tracker.h +289 -0
- package/dist/node/include/module_wrap.h +216 -0
- package/dist/node/include/node.h +1593 -0
- package/dist/node/include/node_api.h +265 -0
- package/dist/node/include/node_api_internals.h +48 -0
- package/dist/node/include/node_api_types.h +56 -0
- package/dist/node/include/node_binding.h +161 -0
- package/dist/node/include/node_blob.h +159 -0
- package/dist/node/include/node_bob-inl.h +36 -0
- package/dist/node/include/node_bob.h +107 -0
- package/dist/node/include/node_buffer.h +92 -0
- package/dist/node/include/node_builtins.h +220 -0
- package/dist/node/include/node_config_file.h +46 -0
- package/dist/node/include/node_constants.h +82 -0
- package/dist/node/include/node_context_data.h +168 -0
- package/dist/node/include/node_contextify.h +204 -0
- package/dist/node/include/node_crypto.h +56 -0
- package/dist/node/include/node_debug.h +30 -0
- package/dist/node/include/node_dir.h +52 -0
- package/dist/node/include/node_dotenv.h +45 -0
- package/dist/node/include/node_errors.h +380 -0
- package/dist/node/include/node_exit_code.h +54 -0
- package/dist/node/include/node_external_reference.h +165 -0
- package/dist/node/include/node_file-inl.h +406 -0
- package/dist/node/include/node_file.h +537 -0
- package/dist/node/include/node_http2.h +1177 -0
- package/dist/node/include/node_http2_state.h +159 -0
- package/dist/node/include/node_http_common-inl.h +202 -0
- package/dist/node/include/node_http_common.h +535 -0
- package/dist/node/include/node_i18n.h +132 -0
- package/dist/node/include/node_internals.h +483 -0
- package/dist/node/include/node_main_instance.h +67 -0
- package/dist/node/include/node_mem-inl.h +113 -0
- package/dist/node/include/node_mem.h +45 -0
- package/dist/node/include/node_messaging.h +389 -0
- package/dist/node/include/node_metadata.h +164 -0
- package/dist/node/include/node_modules.h +91 -0
- package/dist/node/include/node_mutex.h +323 -0
- package/dist/node/include/node_object_wrap.h +132 -0
- package/dist/node/include/node_options-inl.h +490 -0
- package/dist/node/include/node_options.h +615 -0
- package/dist/node/include/node_perf.h +166 -0
- package/dist/node/include/node_perf_common.h +102 -0
- package/dist/node/include/node_platform.h +238 -0
- package/dist/node/include/node_process-inl.h +26 -0
- package/dist/node/include/node_process.h +112 -0
- package/dist/node/include/node_realm-inl.h +151 -0
- package/dist/node/include/node_realm.h +183 -0
- package/dist/node/include/node_report.h +43 -0
- package/dist/node/include/node_revert.h +82 -0
- package/dist/node/include/node_root_certs.h +3520 -0
- package/dist/node/include/node_sea.h +74 -0
- package/dist/node/include/node_shadow_realm.h +46 -0
- package/dist/node/include/node_snapshot_builder.h +57 -0
- package/dist/node/include/node_snapshotable.h +174 -0
- package/dist/node/include/node_sockaddr-inl.h +257 -0
- package/dist/node/include/node_sockaddr.h +394 -0
- package/dist/node/include/node_sqlite.h +270 -0
- package/dist/node/include/node_stat_watcher.h +73 -0
- package/dist/node/include/node_task_runner.h +92 -0
- package/dist/node/include/node_threadsafe_cow-inl.h +54 -0
- package/dist/node/include/node_threadsafe_cow.h +105 -0
- package/dist/node/include/node_union_bytes.h +81 -0
- package/dist/node/include/node_url.h +96 -0
- package/dist/node/include/node_v8.h +77 -0
- package/dist/node/include/node_v8_platform-inl.h +185 -0
- package/dist/node/include/node_version.h +110 -0
- package/dist/node/include/node_wasi.h +184 -0
- package/dist/node/include/node_wasm_web_api.h +55 -0
- package/dist/node/include/node_watchdog.h +154 -0
- package/dist/node/include/node_webstorage.h +60 -0
- package/dist/node/include/node_worker.h +158 -0
- package/dist/node/include/path.h +33 -0
- package/dist/node/include/permission/addon_permission.h +31 -0
- package/dist/node/include/permission/child_process_permission.h +31 -0
- package/dist/node/include/permission/fs_permission.h +167 -0
- package/dist/node/include/permission/inspector_permission.h +31 -0
- package/dist/node/include/permission/permission.h +138 -0
- package/dist/node/include/permission/permission_base.h +65 -0
- package/dist/node/include/permission/wasi_permission.h +31 -0
- package/dist/node/include/permission/worker_permission.h +31 -0
- package/dist/node/include/pipe_wrap.h +80 -0
- package/dist/node/include/quic/application.h +159 -0
- package/dist/node/include/quic/bindingdata.h +272 -0
- package/dist/node/include/quic/cid.h +127 -0
- package/dist/node/include/quic/data.h +148 -0
- package/dist/node/include/quic/defs.h +245 -0
- package/dist/node/include/quic/endpoint.h +458 -0
- package/dist/node/include/quic/http3.h +15 -0
- package/dist/node/include/quic/logstream.h +81 -0
- package/dist/node/include/quic/packet.h +152 -0
- package/dist/node/include/quic/preferredaddress.h +72 -0
- package/dist/node/include/quic/session.h +443 -0
- package/dist/node/include/quic/sessionticket.h +108 -0
- package/dist/node/include/quic/streams.h +232 -0
- package/dist/node/include/quic/tlscontext.h +227 -0
- package/dist/node/include/quic/tokens.h +256 -0
- package/dist/node/include/quic/transportparams.h +165 -0
- package/dist/node/include/req_wrap-inl.h +171 -0
- package/dist/node/include/req_wrap.h +77 -0
- package/dist/node/include/spawn_sync.h +243 -0
- package/dist/node/include/stream_base-inl.h +173 -0
- package/dist/node/include/stream_base.h +478 -0
- package/dist/node/include/stream_pipe.h +76 -0
- package/dist/node/include/stream_wrap.h +132 -0
- package/dist/node/include/string_bytes.h +113 -0
- package/dist/node/include/string_decoder-inl.h +31 -0
- package/dist/node/include/string_decoder.h +49 -0
- package/dist/node/include/tcp_wrap.h +105 -0
- package/dist/node/include/threadpoolwork-inl.h +70 -0
- package/dist/node/include/timer_wrap-inl.h +32 -0
- package/dist/node/include/timer_wrap.h +85 -0
- package/dist/node/include/timers.h +70 -0
- package/dist/node/include/tracing/agent.h +195 -0
- package/dist/node/include/tracing/node_trace_buffer.h +83 -0
- package/dist/node/include/tracing/node_trace_writer.h +75 -0
- package/dist/node/include/tracing/trace_event.h +722 -0
- package/dist/node/include/tracing/trace_event_common.h +1109 -0
- package/dist/node/include/tracing/traced_value.h +129 -0
- package/dist/node/include/tty_wrap.h +65 -0
- package/dist/node/include/udp_wrap.h +230 -0
- package/dist/node/include/undici_version.h +6 -0
- package/dist/node/include/util-inl.h +700 -0
- package/dist/node/include/util.h +1021 -0
- package/dist/node/include/uv/aix.h +32 -0
- package/dist/node/include/uv/bsd.h +34 -0
- package/dist/node/include/uv/darwin.h +61 -0
- package/dist/node/include/uv/errno.h +483 -0
- package/dist/node/include/uv/linux.h +34 -0
- package/dist/node/include/uv/os390.h +33 -0
- package/dist/node/include/uv/posix.h +31 -0
- package/dist/node/include/uv/sunos.h +44 -0
- package/dist/node/include/uv/threadpool.h +37 -0
- package/dist/node/include/uv/tree.h +521 -0
- package/dist/node/include/uv/unix.h +512 -0
- package/dist/node/include/uv/version.h +43 -0
- package/dist/node/include/uv/win.h +698 -0
- package/dist/node/include/uv.h +1990 -0
- package/dist/node/include/v8-array-buffer.h +525 -0
- package/dist/node/include/v8-callbacks.h +462 -0
- package/dist/node/include/v8-container.h +183 -0
- package/dist/node/include/v8-context.h +485 -0
- package/dist/node/include/v8-cppgc.h +245 -0
- package/dist/node/include/v8-data.h +80 -0
- package/dist/node/include/v8-date.h +48 -0
- package/dist/node/include/v8-debug.h +168 -0
- package/dist/node/include/v8-embedder-heap.h +82 -0
- package/dist/node/include/v8-embedder-state-scope.h +52 -0
- package/dist/node/include/v8-exception.h +223 -0
- package/dist/node/include/v8-extension.h +62 -0
- package/dist/node/include/v8-external.h +37 -0
- package/dist/node/include/v8-fast-api-calls.h +984 -0
- package/dist/node/include/v8-forward.h +82 -0
- package/dist/node/include/v8-function-callback.h +607 -0
- package/dist/node/include/v8-function.h +140 -0
- package/dist/node/include/v8-handle-base.h +137 -0
- package/dist/node/include/v8-initialization.h +289 -0
- package/dist/node/include/v8-inspector-protocol.h +13 -0
- package/dist/node/include/v8-inspector.h +419 -0
- package/dist/node/include/v8-internal.h +1397 -0
- package/dist/node/include/v8-isolate.h +1767 -0
- package/dist/node/include/v8-json.h +47 -0
- package/dist/node/include/v8-local-handle.h +758 -0
- package/dist/node/include/v8-locker.h +138 -0
- package/dist/node/include/v8-maybe.h +160 -0
- package/dist/node/include/v8-memory-span.h +198 -0
- package/dist/node/include/v8-message.h +233 -0
- package/dist/node/include/v8-metrics.h +264 -0
- package/dist/node/include/v8-microtask-queue.h +157 -0
- package/dist/node/include/v8-microtask.h +28 -0
- package/dist/node/include/v8-object.h +824 -0
- package/dist/node/include/v8-persistent-handle.h +582 -0
- package/dist/node/include/v8-platform.h +1358 -0
- package/dist/node/include/v8-primitive-object.h +118 -0
- package/dist/node/include/v8-primitive.h +877 -0
- package/dist/node/include/v8-profiler.h +1302 -0
- package/dist/node/include/v8-promise.h +174 -0
- package/dist/node/include/v8-proxy.h +50 -0
- package/dist/node/include/v8-regexp.h +106 -0
- package/dist/node/include/v8-script.h +904 -0
- package/dist/node/include/v8-snapshot.h +266 -0
- package/dist/node/include/v8-source-location.h +92 -0
- package/dist/node/include/v8-statistics.h +238 -0
- package/dist/node/include/v8-template.h +1297 -0
- package/dist/node/include/v8-traced-handle.h +432 -0
- package/dist/node/include/v8-typed-array.h +390 -0
- package/dist/node/include/v8-unwinder-state.h +31 -0
- package/dist/node/include/v8-unwinder.h +132 -0
- package/dist/node/include/v8-util.h +665 -0
- package/dist/node/include/v8-value-serializer-version.h +24 -0
- package/dist/node/include/v8-value-serializer.h +316 -0
- package/dist/node/include/v8-value.h +655 -0
- package/dist/node/include/v8-version-string.h +38 -0
- package/dist/node/include/v8-version.h +20 -0
- package/dist/node/include/v8-wasm-trap-handler-posix.h +31 -0
- package/dist/node/include/v8-wasm-trap-handler-win.h +28 -0
- package/dist/node/include/v8-wasm.h +201 -0
- package/dist/node/include/v8-weak-callback-info.h +80 -0
- package/dist/node/include/v8.h +88 -0
- package/dist/node/include/v8config.h +981 -0
- package/dist/node/include/zlib_version.h +6 -0
- package/dist/node/libnode.dll +0 -0
- package/dist/node/libnode.lib +0 -0
- package/dist/node/libnodebuildinfo.json +10 -0
- package/dist/node/link_node.lib +0 -0
- package/dist/node/link_node.node +0 -0
- package/index.js +5 -0
- package/libnode.release.json +8 -0
- package/package.json +29 -1
|
@@ -0,0 +1,256 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
|
|
4
|
+
#if HAVE_OPENSSL && NODE_OPENSSL_HAS_QUIC
|
|
5
|
+
|
|
6
|
+
#include <memory_tracker.h>
|
|
7
|
+
#include <ngtcp2/ngtcp2_crypto.h>
|
|
8
|
+
#include <node_internals.h>
|
|
9
|
+
#include <node_sockaddr.h>
|
|
10
|
+
#include "cid.h"
|
|
11
|
+
#include "defs.h"
|
|
12
|
+
|
|
13
|
+
namespace node::quic {
|
|
14
|
+
|
|
15
|
+
// TokenSecrets are used to generate things like stateless reset tokens,
|
|
16
|
+
// retry tokens, and token packets. They are always QUIC_TOKENSECRET_LEN
|
|
17
|
+
// bytes in length.
|
|
18
|
+
//
|
|
19
|
+
// In the default case, token secrets will always be generated randomly.
|
|
20
|
+
// User code will be given the option to provide a secret directly
|
|
21
|
+
// however.
|
|
22
|
+
class TokenSecret final : public MemoryRetainer {
|
|
23
|
+
public:
|
|
24
|
+
static constexpr int QUIC_TOKENSECRET_LEN = 16;
|
|
25
|
+
|
|
26
|
+
// Generate a random secret.
|
|
27
|
+
TokenSecret();
|
|
28
|
+
|
|
29
|
+
// Copy the given secret. The uint8_t* is assumed
|
|
30
|
+
// to be QUIC_TOKENSECRET_LEN in length. Note that
|
|
31
|
+
// the length is not verified so care must be taken
|
|
32
|
+
// when this constructor is used.
|
|
33
|
+
explicit TokenSecret(const uint8_t* secret);
|
|
34
|
+
~TokenSecret();
|
|
35
|
+
|
|
36
|
+
TokenSecret(const TokenSecret&) = default;
|
|
37
|
+
TokenSecret& operator=(const TokenSecret&) = default;
|
|
38
|
+
DISALLOW_MOVE(TokenSecret)
|
|
39
|
+
|
|
40
|
+
operator const uint8_t*() const;
|
|
41
|
+
uint8_t operator[](int pos) const;
|
|
42
|
+
|
|
43
|
+
std::string ToString() const;
|
|
44
|
+
|
|
45
|
+
SET_NO_MEMORY_INFO()
|
|
46
|
+
SET_MEMORY_INFO_NAME(TokenSecret)
|
|
47
|
+
SET_SELF_SIZE(TokenSecret)
|
|
48
|
+
|
|
49
|
+
private:
|
|
50
|
+
operator const char*() const;
|
|
51
|
+
uint8_t buf_[QUIC_TOKENSECRET_LEN];
|
|
52
|
+
};
|
|
53
|
+
|
|
54
|
+
// A stateless reset token is used when a QUIC endpoint receives a QUIC packet
|
|
55
|
+
// with a short header but the associated connection ID cannot be matched to any
|
|
56
|
+
// known Session. In such cases, the receiver may choose to send a subtle opaque
|
|
57
|
+
// indication to the sending peer that state for the Session has apparently been
|
|
58
|
+
// lost. For any on- or off- path attacker, a stateless reset packet resembles
|
|
59
|
+
// any other QUIC packet with a short header. In order to be successfully
|
|
60
|
+
// handled as a stateless reset, the peer must have already seen a reset token
|
|
61
|
+
// issued to it associated with the given CID. The token itself is opaque to the
|
|
62
|
+
// peer that receives is but must be possible to statelessly recreate by the
|
|
63
|
+
// peer that originally created it. The actual implementation is Node.js
|
|
64
|
+
// specific but we currently defer to a utility function provided by ngtcp2.
|
|
65
|
+
//
|
|
66
|
+
// QUIC leaves the generation of stateless session tokens up to the
|
|
67
|
+
// implementation to figure out. The idea, however, is that it ought to be
|
|
68
|
+
// possible to generate a stateless reset token reliably even when all state
|
|
69
|
+
// for a connection has been lost. We use the cid as it is the only reliably
|
|
70
|
+
// consistent bit of data we have when a session is destroyed.
|
|
71
|
+
//
|
|
72
|
+
// StatlessResetTokens are always kStatelessTokenLen bytes,
|
|
73
|
+
// as are the secrets used to generate the token.
|
|
74
|
+
class StatelessResetToken final : public MemoryRetainer {
|
|
75
|
+
public:
|
|
76
|
+
static constexpr int kStatelessTokenLen = NGTCP2_STATELESS_RESET_TOKENLEN;
|
|
77
|
+
|
|
78
|
+
StatelessResetToken();
|
|
79
|
+
|
|
80
|
+
// Generates a stateless reset token using HKDF with the cid and token secret
|
|
81
|
+
// as input. The token secret is either provided by user code when an Endpoint
|
|
82
|
+
// is created or is generated randomly.
|
|
83
|
+
StatelessResetToken(const TokenSecret& secret, const CID& cid);
|
|
84
|
+
|
|
85
|
+
// Generates a stateless reset token using the given token storage.
|
|
86
|
+
// The StatelessResetToken wraps the token and does not take ownership.
|
|
87
|
+
// The token storage must be at least kStatelessTokenLen bytes in length.
|
|
88
|
+
// The length is not verified so care must be taken when using this
|
|
89
|
+
// constructor.
|
|
90
|
+
StatelessResetToken(uint8_t* token,
|
|
91
|
+
const TokenSecret& secret,
|
|
92
|
+
const CID& cid);
|
|
93
|
+
|
|
94
|
+
// Wraps the given token. Does not take over ownership of the token storage.
|
|
95
|
+
// The token must be at least kStatelessTokenLen bytes in length.
|
|
96
|
+
// The length is not verified so care must be taken when using this
|
|
97
|
+
// constructor.
|
|
98
|
+
explicit StatelessResetToken(const uint8_t* token);
|
|
99
|
+
|
|
100
|
+
StatelessResetToken(const StatelessResetToken& other);
|
|
101
|
+
DISALLOW_MOVE(StatelessResetToken)
|
|
102
|
+
|
|
103
|
+
std::string ToString() const;
|
|
104
|
+
|
|
105
|
+
operator const uint8_t*() const;
|
|
106
|
+
operator bool() const;
|
|
107
|
+
|
|
108
|
+
bool operator==(const StatelessResetToken& other) const;
|
|
109
|
+
bool operator!=(const StatelessResetToken& other) const;
|
|
110
|
+
|
|
111
|
+
struct Hash {
|
|
112
|
+
size_t operator()(const StatelessResetToken& token) const;
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
SET_NO_MEMORY_INFO()
|
|
116
|
+
SET_MEMORY_INFO_NAME(StatelessResetToken)
|
|
117
|
+
SET_SELF_SIZE(StatelessResetToken)
|
|
118
|
+
|
|
119
|
+
template <typename T>
|
|
120
|
+
using Map =
|
|
121
|
+
std::unordered_map<StatelessResetToken, T, StatelessResetToken::Hash>;
|
|
122
|
+
|
|
123
|
+
static StatelessResetToken kInvalid;
|
|
124
|
+
|
|
125
|
+
private:
|
|
126
|
+
operator const char*() const;
|
|
127
|
+
|
|
128
|
+
const uint8_t* ptr_;
|
|
129
|
+
uint8_t buf_[NGTCP2_STATELESS_RESET_TOKENLEN];
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
// A RETRY packet communicates a retry token to the client. Retry tokens are
|
|
133
|
+
// generated only by QUIC servers for the purpose of validating the network path
|
|
134
|
+
// between a client and server. The content payload of the RETRY packet is
|
|
135
|
+
// opaque to the clientand must not be guessable by on- or off-path attackers.
|
|
136
|
+
//
|
|
137
|
+
// A QUIC server sends a RETRY token as a way of initiating explicit path
|
|
138
|
+
// validation in response to an initial QUIC packet. The client, upon receiving
|
|
139
|
+
// a RETRY, must abandon the initial connection attempt and try again with the
|
|
140
|
+
// received retry token included with the new initial packet sent to the server.
|
|
141
|
+
// If the server is performing explicit validation, it will look for the
|
|
142
|
+
// presence of the retry token and attempt to validate it if found. The internal
|
|
143
|
+
// structure of the retry token must be meaningful to the server, and the server
|
|
144
|
+
// must be able to validate that the token is correct without relying on any
|
|
145
|
+
// state left over from the previous connection attempt. We use an
|
|
146
|
+
// implementation that is provided by ngtcp2.
|
|
147
|
+
//
|
|
148
|
+
// The token secret must be kept private on the QUIC server that generated the
|
|
149
|
+
// retry. When multiple QUIC servers are used in a cluster, it cannot be
|
|
150
|
+
// guaranteed that the same QUIC server instance will receive the subsequent new
|
|
151
|
+
// Initial packet. Therefore, all QUIC servers in the cluster should either
|
|
152
|
+
// share or be aware of the same token secret or a mechanism needs to be
|
|
153
|
+
// implemented to ensure that subsequent packets are routed to the same QUIC
|
|
154
|
+
// server instance.
|
|
155
|
+
class RetryToken final : public MemoryRetainer {
|
|
156
|
+
public:
|
|
157
|
+
// The token prefix that is used to differentiate between a retry token
|
|
158
|
+
// and a regular token.
|
|
159
|
+
static constexpr uint8_t kTokenMagic = NGTCP2_CRYPTO_TOKEN_MAGIC_RETRY;
|
|
160
|
+
static constexpr int kRetryTokenLen = NGTCP2_CRYPTO_MAX_RETRY_TOKENLEN;
|
|
161
|
+
|
|
162
|
+
static constexpr uint64_t QUIC_DEFAULT_RETRYTOKEN_EXPIRATION =
|
|
163
|
+
10 * NGTCP2_SECONDS;
|
|
164
|
+
static constexpr uint64_t QUIC_MIN_RETRYTOKEN_EXPIRATION = 1 * NGTCP2_SECONDS;
|
|
165
|
+
|
|
166
|
+
// Generates a new retry token.
|
|
167
|
+
RetryToken(uint32_t version,
|
|
168
|
+
const SocketAddress& address,
|
|
169
|
+
const CID& retry_cid,
|
|
170
|
+
const CID& odcid,
|
|
171
|
+
const TokenSecret& token_secret);
|
|
172
|
+
|
|
173
|
+
// Wraps the given retry token
|
|
174
|
+
RetryToken(const uint8_t* token, size_t length);
|
|
175
|
+
|
|
176
|
+
// Validates the retry token given the input. If the token is valid,
|
|
177
|
+
// the embedded original CID will be extracted from the token an
|
|
178
|
+
// returned. If the token is invalid, std::nullopt will be returned.
|
|
179
|
+
std::optional<CID> Validate(
|
|
180
|
+
uint32_t version,
|
|
181
|
+
const SocketAddress& address,
|
|
182
|
+
const CID& cid,
|
|
183
|
+
const TokenSecret& token_secret,
|
|
184
|
+
uint64_t verification_expiration = QUIC_DEFAULT_RETRYTOKEN_EXPIRATION);
|
|
185
|
+
|
|
186
|
+
operator const ngtcp2_vec&() const;
|
|
187
|
+
operator const ngtcp2_vec*() const;
|
|
188
|
+
operator bool() const;
|
|
189
|
+
|
|
190
|
+
std::string ToString() const;
|
|
191
|
+
|
|
192
|
+
SET_NO_MEMORY_INFO()
|
|
193
|
+
SET_MEMORY_INFO_NAME(RetryToken)
|
|
194
|
+
SET_SELF_SIZE(RetryToken)
|
|
195
|
+
|
|
196
|
+
private:
|
|
197
|
+
operator const char*() const;
|
|
198
|
+
uint8_t buf_[kRetryTokenLen];
|
|
199
|
+
const ngtcp2_vec ptr_;
|
|
200
|
+
};
|
|
201
|
+
|
|
202
|
+
// A NEW_TOKEN packet communicates a regular token to a client that the server
|
|
203
|
+
// would like the client to send in the header of an initial packet for a
|
|
204
|
+
// future connection. It is similar to RETRY and used for the same purpose,
|
|
205
|
+
// except a NEW_TOKEN is used in advance of the client establishing a new
|
|
206
|
+
// connection and a RETRY is sent in response to the client trying to open
|
|
207
|
+
// a new connection.
|
|
208
|
+
class RegularToken final : public MemoryRetainer {
|
|
209
|
+
public:
|
|
210
|
+
// The token prefix that is used to differentiate between a retry token
|
|
211
|
+
// and a regular token.
|
|
212
|
+
static constexpr uint8_t kTokenMagic = NGTCP2_CRYPTO_TOKEN_MAGIC_REGULAR;
|
|
213
|
+
static constexpr int kRegularTokenLen = NGTCP2_CRYPTO_MAX_REGULAR_TOKENLEN;
|
|
214
|
+
static constexpr uint64_t QUIC_DEFAULT_REGULARTOKEN_EXPIRATION =
|
|
215
|
+
10 * NGTCP2_SECONDS;
|
|
216
|
+
static constexpr uint64_t QUIC_MIN_REGULARTOKEN_EXPIRATION =
|
|
217
|
+
1 * NGTCP2_SECONDS;
|
|
218
|
+
|
|
219
|
+
RegularToken();
|
|
220
|
+
|
|
221
|
+
// Generates a new retry token.
|
|
222
|
+
RegularToken(uint32_t version,
|
|
223
|
+
const SocketAddress& address,
|
|
224
|
+
const TokenSecret& token_secret);
|
|
225
|
+
|
|
226
|
+
// Wraps the given retry token
|
|
227
|
+
RegularToken(const uint8_t* token, size_t length);
|
|
228
|
+
|
|
229
|
+
// Validates the retry token given the input.
|
|
230
|
+
bool Validate(
|
|
231
|
+
uint32_t version,
|
|
232
|
+
const SocketAddress& address,
|
|
233
|
+
const TokenSecret& token_secret,
|
|
234
|
+
uint64_t verification_expiration = QUIC_DEFAULT_REGULARTOKEN_EXPIRATION);
|
|
235
|
+
|
|
236
|
+
operator const ngtcp2_vec&() const;
|
|
237
|
+
operator const ngtcp2_vec*() const;
|
|
238
|
+
|
|
239
|
+
operator bool() const;
|
|
240
|
+
|
|
241
|
+
std::string ToString() const;
|
|
242
|
+
|
|
243
|
+
SET_NO_MEMORY_INFO()
|
|
244
|
+
SET_MEMORY_INFO_NAME(RetryToken)
|
|
245
|
+
SET_SELF_SIZE(RetryToken)
|
|
246
|
+
|
|
247
|
+
private:
|
|
248
|
+
operator const char*() const;
|
|
249
|
+
uint8_t buf_[kRegularTokenLen];
|
|
250
|
+
const ngtcp2_vec ptr_;
|
|
251
|
+
};
|
|
252
|
+
|
|
253
|
+
} // namespace node::quic
|
|
254
|
+
|
|
255
|
+
#endif // HAVE_OPENSSL && NODE_OPENSSL_HAS_QUIC
|
|
256
|
+
#endif // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
#pragma once
|
|
2
|
+
|
|
3
|
+
#if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
|
|
4
|
+
#if HAVE_OPENSSL && NODE_OPENSSL_HAS_QUIC
|
|
5
|
+
|
|
6
|
+
#include <env.h>
|
|
7
|
+
#include <memory_tracker.h>
|
|
8
|
+
#include <ngtcp2/ngtcp2.h>
|
|
9
|
+
#include <node_sockaddr.h>
|
|
10
|
+
#include <optional>
|
|
11
|
+
#include "bindingdata.h"
|
|
12
|
+
#include "cid.h"
|
|
13
|
+
#include "data.h"
|
|
14
|
+
#include "tokens.h"
|
|
15
|
+
|
|
16
|
+
namespace node::quic {
|
|
17
|
+
|
|
18
|
+
class Endpoint;
|
|
19
|
+
class Session;
|
|
20
|
+
|
|
21
|
+
// The Transport Params are the set of configuration options that are sent to
|
|
22
|
+
// the remote peer. They communicate the protocol options the other peer
|
|
23
|
+
// should use when communicating with this session.
|
|
24
|
+
class TransportParams final {
|
|
25
|
+
public:
|
|
26
|
+
static void Initialize(Environment* env, v8::Local<v8::Object> target);
|
|
27
|
+
|
|
28
|
+
static constexpr int QUIC_TRANSPORT_PARAMS_V1 = NGTCP2_TRANSPORT_PARAMS_V1;
|
|
29
|
+
static constexpr int QUIC_TRANSPORT_PARAMS_VERSION =
|
|
30
|
+
NGTCP2_TRANSPORT_PARAMS_VERSION;
|
|
31
|
+
static constexpr uint64_t DEFAULT_MAX_STREAM_DATA = 256 * 1024;
|
|
32
|
+
static constexpr uint64_t DEFAULT_MAX_DATA = 1 * 1024 * 1024;
|
|
33
|
+
static constexpr uint64_t DEFAULT_MAX_IDLE_TIMEOUT = 10; // seconds
|
|
34
|
+
static constexpr uint64_t DEFAULT_MAX_STREAMS_BIDI = 100;
|
|
35
|
+
static constexpr uint64_t DEFAULT_MAX_STREAMS_UNI = 3;
|
|
36
|
+
static constexpr uint64_t DEFAULT_ACTIVE_CONNECTION_ID_LIMIT = 2;
|
|
37
|
+
|
|
38
|
+
struct Config {
|
|
39
|
+
Side side;
|
|
40
|
+
const CID& ocid;
|
|
41
|
+
const CID& retry_scid;
|
|
42
|
+
Config(Side side,
|
|
43
|
+
const CID& ocid = CID::kInvalid,
|
|
44
|
+
const CID& retry_scid = CID::kInvalid);
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
struct Options : public MemoryRetainer {
|
|
48
|
+
int transportParamsVersion = QUIC_TRANSPORT_PARAMS_V1;
|
|
49
|
+
|
|
50
|
+
// Set only on server Sessions, the preferred address communicates the IP
|
|
51
|
+
// address and port that the server would prefer the client to use when
|
|
52
|
+
// communicating with it. See the QUIC specification for more detail on how
|
|
53
|
+
// the preferred address mechanism works.
|
|
54
|
+
std::optional<SocketAddress> preferred_address_ipv4{};
|
|
55
|
+
std::optional<SocketAddress> preferred_address_ipv6{};
|
|
56
|
+
|
|
57
|
+
// The initial size of the flow control window of locally initiated streams.
|
|
58
|
+
// This is the maximum number of bytes that the *remote* endpoint can send
|
|
59
|
+
// when the connection is started.
|
|
60
|
+
uint64_t initial_max_stream_data_bidi_local = DEFAULT_MAX_STREAM_DATA;
|
|
61
|
+
|
|
62
|
+
// The initial size of the flow control window of remotely initiated
|
|
63
|
+
// streams. This is the maximum number of bytes that the remote endpoint can
|
|
64
|
+
// send when the connection is started.
|
|
65
|
+
uint64_t initial_max_stream_data_bidi_remote = DEFAULT_MAX_STREAM_DATA;
|
|
66
|
+
|
|
67
|
+
// The initial size of the flow control window of remotely initiated
|
|
68
|
+
// unidirectional streams. This is the maximum number of bytes that the
|
|
69
|
+
// remote endpoint can send when the connection is started.
|
|
70
|
+
uint64_t initial_max_stream_data_uni = DEFAULT_MAX_STREAM_DATA;
|
|
71
|
+
|
|
72
|
+
// The initial size of the session-level flow control window.
|
|
73
|
+
uint64_t initial_max_data = DEFAULT_MAX_DATA;
|
|
74
|
+
|
|
75
|
+
// The initial maximum number of concurrent bidirectional streams the remote
|
|
76
|
+
// endpoint is permitted to open.
|
|
77
|
+
uint64_t initial_max_streams_bidi = DEFAULT_MAX_STREAMS_BIDI;
|
|
78
|
+
|
|
79
|
+
// The initial maximum number of concurrent unidirectional streams the
|
|
80
|
+
// remote endpoint is permitted to open.
|
|
81
|
+
uint64_t initial_max_streams_uni = DEFAULT_MAX_STREAMS_UNI;
|
|
82
|
+
|
|
83
|
+
// The maximum amount of time that a Session is permitted to remain idle
|
|
84
|
+
// before it is silently closed and state is discarded.
|
|
85
|
+
uint64_t max_idle_timeout = DEFAULT_MAX_IDLE_TIMEOUT;
|
|
86
|
+
|
|
87
|
+
// The maximum number of Connection IDs that the peer can store. A single
|
|
88
|
+
// Session may have several connection IDs over it's lifetime.
|
|
89
|
+
uint64_t active_connection_id_limit = DEFAULT_ACTIVE_CONNECTION_ID_LIMIT;
|
|
90
|
+
|
|
91
|
+
// Establishes the exponent used in ACK Delay field in the ACK frame. See
|
|
92
|
+
// the QUIC specification for details. This is an advanced option that
|
|
93
|
+
// should rarely be modified and only if there is really good reason.
|
|
94
|
+
uint64_t ack_delay_exponent = NGTCP2_DEFAULT_ACK_DELAY_EXPONENT;
|
|
95
|
+
|
|
96
|
+
// The maximum amount of time by which the endpoint will delay sending
|
|
97
|
+
// acknowledgements. This is an advanced option that should rarely be
|
|
98
|
+
// modified and only if there is a really good reason. It is used to
|
|
99
|
+
// determine how long a Session will wait to determine that a packet has
|
|
100
|
+
// been lost.
|
|
101
|
+
uint64_t max_ack_delay = NGTCP2_DEFAULT_MAX_ACK_DELAY;
|
|
102
|
+
|
|
103
|
+
// The maximum size of DATAGRAM frames that the endpoint will accept.
|
|
104
|
+
// Setting the value to 0 will disable DATAGRAM support.
|
|
105
|
+
uint64_t max_datagram_frame_size = kDefaultMaxPacketLength;
|
|
106
|
+
|
|
107
|
+
// When true, communicates that the Session does not support active
|
|
108
|
+
// connection migration. See the QUIC specification for more details on
|
|
109
|
+
// connection migration.
|
|
110
|
+
bool disable_active_migration = false;
|
|
111
|
+
|
|
112
|
+
static const Options kDefault;
|
|
113
|
+
|
|
114
|
+
void MemoryInfo(MemoryTracker* tracker) const override;
|
|
115
|
+
SET_MEMORY_INFO_NAME(TransportParams::Options)
|
|
116
|
+
SET_SELF_SIZE(Options)
|
|
117
|
+
|
|
118
|
+
static v8::Maybe<Options> From(Environment* env,
|
|
119
|
+
v8::Local<v8::Value> value);
|
|
120
|
+
|
|
121
|
+
std::string ToString() const;
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
explicit TransportParams();
|
|
125
|
+
|
|
126
|
+
// Creates an instance of TransportParams wrapping the existing const
|
|
127
|
+
// ngtcp2_transport_params pointer.
|
|
128
|
+
TransportParams(const ngtcp2_transport_params* ptr);
|
|
129
|
+
|
|
130
|
+
TransportParams(const Config& config, const Options& options);
|
|
131
|
+
|
|
132
|
+
// Creates an instance of TransportParams by decoding the given buffer.
|
|
133
|
+
// If the parameters cannot be successfully decoded, the error()
|
|
134
|
+
// property will be set with an appropriate QuicError and the bool()
|
|
135
|
+
// operator will return false.
|
|
136
|
+
TransportParams(const ngtcp2_vec& buf,
|
|
137
|
+
int version = QUIC_TRANSPORT_PARAMS_V1);
|
|
138
|
+
|
|
139
|
+
void GenerateSessionTokens(Session* session);
|
|
140
|
+
void GenerateStatelessResetToken(const Endpoint& endpoint, const CID& cid);
|
|
141
|
+
void GeneratePreferredAddressToken(Session* session);
|
|
142
|
+
void SetPreferredAddress(const SocketAddress& address);
|
|
143
|
+
|
|
144
|
+
operator const ngtcp2_transport_params&() const;
|
|
145
|
+
operator const ngtcp2_transport_params*() const;
|
|
146
|
+
|
|
147
|
+
operator bool() const;
|
|
148
|
+
|
|
149
|
+
const QuicError& error() const;
|
|
150
|
+
|
|
151
|
+
// Returns an ArrayBuffer containing the encoded transport parameters.
|
|
152
|
+
// If an error occurs during encoding, an empty shared_ptr will be returned
|
|
153
|
+
// and the error() property will be set to an appropriate QuicError.
|
|
154
|
+
Store Encode(Environment* env, int version = QUIC_TRANSPORT_PARAMS_V1);
|
|
155
|
+
|
|
156
|
+
private:
|
|
157
|
+
ngtcp2_transport_params params_{};
|
|
158
|
+
const ngtcp2_transport_params* ptr_;
|
|
159
|
+
QuicError error_ = QuicError::TRANSPORT_NO_ERROR;
|
|
160
|
+
};
|
|
161
|
+
|
|
162
|
+
} // namespace node::quic
|
|
163
|
+
|
|
164
|
+
#endif // HAVE_OPENSSL && NODE_OPENSSL_HAS_QUIC
|
|
165
|
+
#endif // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
|
|
@@ -0,0 +1,171 @@
|
|
|
1
|
+
#ifndef SRC_REQ_WRAP_INL_H_
|
|
2
|
+
#define SRC_REQ_WRAP_INL_H_
|
|
3
|
+
|
|
4
|
+
#if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
|
|
5
|
+
|
|
6
|
+
#include "req_wrap.h"
|
|
7
|
+
#include "async_wrap-inl.h"
|
|
8
|
+
#include "uv.h"
|
|
9
|
+
|
|
10
|
+
namespace node {
|
|
11
|
+
|
|
12
|
+
ReqWrapBase::ReqWrapBase(Environment* env) {
|
|
13
|
+
CHECK(env->has_run_bootstrapping_code());
|
|
14
|
+
env->req_wrap_queue()->PushBack(this);
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
template <typename T>
|
|
18
|
+
ReqWrap<T>::ReqWrap(Environment* env,
|
|
19
|
+
v8::Local<v8::Object> object,
|
|
20
|
+
AsyncWrap::ProviderType provider)
|
|
21
|
+
: AsyncWrap(env, object, provider),
|
|
22
|
+
ReqWrapBase(env) {
|
|
23
|
+
MakeWeak();
|
|
24
|
+
Reset();
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
template <typename T>
|
|
28
|
+
ReqWrap<T>::~ReqWrap() {}
|
|
29
|
+
|
|
30
|
+
template <typename T>
|
|
31
|
+
void ReqWrap<T>::Dispatched() {
|
|
32
|
+
req_.data = this;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
template <typename T>
|
|
36
|
+
void ReqWrap<T>::Reset() {
|
|
37
|
+
original_callback_ = nullptr;
|
|
38
|
+
req_.data = nullptr;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
template <typename T>
|
|
42
|
+
ReqWrap<T>* ReqWrap<T>::from_req(T* req) {
|
|
43
|
+
return ContainerOf(&ReqWrap<T>::req_, req);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
template <typename T>
|
|
47
|
+
void ReqWrap<T>::Cancel() {
|
|
48
|
+
if (req_.data == this) // Only cancel if already dispatched.
|
|
49
|
+
uv_cancel(reinterpret_cast<uv_req_t*>(&req_));
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
template <typename T>
|
|
53
|
+
AsyncWrap* ReqWrap<T>::GetAsyncWrap() {
|
|
54
|
+
return this;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// Below is dark template magic designed to invoke libuv functions that
|
|
58
|
+
// initialize uv_req_t instances in a unified fashion, to allow easier
|
|
59
|
+
// tracking of active/inactive requests.
|
|
60
|
+
|
|
61
|
+
// Invoke a generic libuv function that initializes uv_req_t instances.
|
|
62
|
+
// This is, unfortunately, necessary since they come in three different
|
|
63
|
+
// variants that can not all be invoked in the same way:
|
|
64
|
+
// - int uv_foo(uv_loop_t* loop, uv_req_t* request, ...);
|
|
65
|
+
// - int uv_foo(uv_req_t* request, ...);
|
|
66
|
+
// - void uv_foo(uv_req_t* request, ...);
|
|
67
|
+
template <typename ReqT, typename T>
|
|
68
|
+
struct CallLibuvFunction;
|
|
69
|
+
|
|
70
|
+
// Detect `int uv_foo(uv_loop_t* loop, uv_req_t* request, ...);`.
|
|
71
|
+
template <typename ReqT, typename... Args>
|
|
72
|
+
struct CallLibuvFunction<ReqT, int(*)(uv_loop_t*, ReqT*, Args...)> {
|
|
73
|
+
using T = int(*)(uv_loop_t*, ReqT*, Args...);
|
|
74
|
+
template <typename... PassedArgs>
|
|
75
|
+
static int Call(T fn, uv_loop_t* loop, ReqT* req, PassedArgs... args) {
|
|
76
|
+
return fn(loop, req, args...);
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
// Detect `int uv_foo(uv_req_t* request, ...);`.
|
|
81
|
+
template <typename ReqT, typename... Args>
|
|
82
|
+
struct CallLibuvFunction<ReqT, int(*)(ReqT*, Args...)> {
|
|
83
|
+
using T = int(*)(ReqT*, Args...);
|
|
84
|
+
template <typename... PassedArgs>
|
|
85
|
+
static int Call(T fn, uv_loop_t* loop, ReqT* req, PassedArgs... args) {
|
|
86
|
+
return fn(req, args...);
|
|
87
|
+
}
|
|
88
|
+
};
|
|
89
|
+
|
|
90
|
+
// Detect `void uv_foo(uv_req_t* request, ...);`.
|
|
91
|
+
template <typename ReqT, typename... Args>
|
|
92
|
+
struct CallLibuvFunction<ReqT, void(*)(ReqT*, Args...)> {
|
|
93
|
+
using T = void(*)(ReqT*, Args...);
|
|
94
|
+
template <typename... PassedArgs>
|
|
95
|
+
static int Call(T fn, uv_loop_t* loop, ReqT* req, PassedArgs... args) {
|
|
96
|
+
fn(req, args...);
|
|
97
|
+
return 0;
|
|
98
|
+
}
|
|
99
|
+
};
|
|
100
|
+
|
|
101
|
+
// This is slightly darker magic: This template is 'applied' to each parameter
|
|
102
|
+
// passed to the libuv function. If the parameter type (aka `T`) is a
|
|
103
|
+
// function type, it is assumed that this it is the request callback, and a
|
|
104
|
+
// wrapper that calls the original callback is created.
|
|
105
|
+
// If not, the parameter is passed through verbatim.
|
|
106
|
+
template <typename ReqT, typename T>
|
|
107
|
+
struct MakeLibuvRequestCallback {
|
|
108
|
+
static T For(ReqWrap<ReqT>* req_wrap, T v) {
|
|
109
|
+
static_assert(!is_callable<T>,
|
|
110
|
+
"MakeLibuvRequestCallback missed a callback");
|
|
111
|
+
return v;
|
|
112
|
+
}
|
|
113
|
+
};
|
|
114
|
+
|
|
115
|
+
// Match the `void callback(uv_req_t*, ...);` signature that all libuv
|
|
116
|
+
// callbacks use.
|
|
117
|
+
template <typename ReqT, typename... Args>
|
|
118
|
+
struct MakeLibuvRequestCallback<ReqT, void(*)(ReqT*, Args...)> {
|
|
119
|
+
using F = void(*)(ReqT* req, Args... args);
|
|
120
|
+
|
|
121
|
+
static void Wrapper(ReqT* req, Args... args) {
|
|
122
|
+
BaseObjectPtr<ReqWrap<ReqT>> req_wrap{ReqWrap<ReqT>::from_req(req)};
|
|
123
|
+
req_wrap->Detach();
|
|
124
|
+
req_wrap->env()->DecreaseWaitingRequestCounter();
|
|
125
|
+
F original_callback = reinterpret_cast<F>(req_wrap->original_callback_);
|
|
126
|
+
original_callback(req, args...);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
static F For(ReqWrap<ReqT>* req_wrap, F v) {
|
|
130
|
+
CHECK_NULL(req_wrap->original_callback_);
|
|
131
|
+
req_wrap->original_callback_ =
|
|
132
|
+
reinterpret_cast<typename ReqWrap<ReqT>::callback_t>(v);
|
|
133
|
+
return Wrapper;
|
|
134
|
+
}
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
template <typename T>
|
|
138
|
+
template <typename LibuvFunction, typename... Args>
|
|
139
|
+
int ReqWrap<T>::Dispatch(LibuvFunction fn, Args... args) {
|
|
140
|
+
Dispatched();
|
|
141
|
+
// This expands as:
|
|
142
|
+
//
|
|
143
|
+
// int err = fn(env()->event_loop(), req(), arg1, arg2, Wrapper, arg3, ...)
|
|
144
|
+
// ^ ^ ^
|
|
145
|
+
// | | |
|
|
146
|
+
// \-- Omitted if `fn` has no | |
|
|
147
|
+
// first `uv_loop_t*` argument | |
|
|
148
|
+
// | |
|
|
149
|
+
// A function callback whose first argument | |
|
|
150
|
+
// matches the libuv request type is replaced ---/ |
|
|
151
|
+
// by the `Wrapper` method defined above |
|
|
152
|
+
// |
|
|
153
|
+
// Other (non-function) arguments are passed -----/
|
|
154
|
+
// through verbatim
|
|
155
|
+
int err = CallLibuvFunction<T, LibuvFunction>::Call(
|
|
156
|
+
fn,
|
|
157
|
+
env()->event_loop(),
|
|
158
|
+
req(),
|
|
159
|
+
MakeLibuvRequestCallback<T, Args>::For(this, args)...);
|
|
160
|
+
if (err >= 0) {
|
|
161
|
+
ClearWeak();
|
|
162
|
+
env()->IncreaseWaitingRequestCounter();
|
|
163
|
+
}
|
|
164
|
+
return err;
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
} // namespace node
|
|
168
|
+
|
|
169
|
+
#endif // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
|
|
170
|
+
|
|
171
|
+
#endif // SRC_REQ_WRAP_INL_H_
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
#ifndef SRC_REQ_WRAP_H_
|
|
2
|
+
#define SRC_REQ_WRAP_H_
|
|
3
|
+
|
|
4
|
+
#if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
|
|
5
|
+
|
|
6
|
+
#include "async_wrap.h"
|
|
7
|
+
#include "util.h"
|
|
8
|
+
#include "v8.h"
|
|
9
|
+
|
|
10
|
+
namespace node {
|
|
11
|
+
|
|
12
|
+
class Environment;
|
|
13
|
+
|
|
14
|
+
class ReqWrapBase {
|
|
15
|
+
public:
|
|
16
|
+
explicit inline ReqWrapBase(Environment* env);
|
|
17
|
+
|
|
18
|
+
virtual ~ReqWrapBase() = default;
|
|
19
|
+
|
|
20
|
+
virtual void Cancel() = 0;
|
|
21
|
+
virtual AsyncWrap* GetAsyncWrap() = 0;
|
|
22
|
+
|
|
23
|
+
private:
|
|
24
|
+
friend int GenDebugSymbols();
|
|
25
|
+
friend class Environment;
|
|
26
|
+
|
|
27
|
+
ListNode<ReqWrapBase> req_wrap_queue_;
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
template <typename T>
|
|
31
|
+
class ReqWrap : public AsyncWrap, public ReqWrapBase {
|
|
32
|
+
public:
|
|
33
|
+
inline ReqWrap(Environment* env,
|
|
34
|
+
v8::Local<v8::Object> object,
|
|
35
|
+
AsyncWrap::ProviderType provider);
|
|
36
|
+
inline ~ReqWrap() override;
|
|
37
|
+
// Call this after the req has been dispatched, if that did not already
|
|
38
|
+
// happen by using Dispatch().
|
|
39
|
+
inline void Dispatched();
|
|
40
|
+
// Call this after a request has finished, if re-using this object is planned.
|
|
41
|
+
inline void Reset();
|
|
42
|
+
T* req() { return &req_; }
|
|
43
|
+
inline void Cancel() final;
|
|
44
|
+
inline AsyncWrap* GetAsyncWrap() override;
|
|
45
|
+
|
|
46
|
+
static ReqWrap* from_req(T* req);
|
|
47
|
+
|
|
48
|
+
template <typename LibuvFunction, typename... Args>
|
|
49
|
+
inline int Dispatch(LibuvFunction fn, Args... args);
|
|
50
|
+
|
|
51
|
+
private:
|
|
52
|
+
friend int GenDebugSymbols();
|
|
53
|
+
|
|
54
|
+
// Adding `friend struct MakeLibuvRequestCallback` is not enough anymore
|
|
55
|
+
// for some reason. Consider this private.
|
|
56
|
+
public:
|
|
57
|
+
typedef void (*callback_t)();
|
|
58
|
+
callback_t original_callback_ = nullptr;
|
|
59
|
+
|
|
60
|
+
protected:
|
|
61
|
+
// req_wrap_queue_ needs to be at a fixed offset from the start of the class
|
|
62
|
+
// because it is used by ContainerOf to calculate the address of the embedding
|
|
63
|
+
// ReqWrap. ContainerOf compiles down to simple, fixed pointer arithmetic. It
|
|
64
|
+
// is also used by src/node_postmortem_metadata.cc to calculate offsets and
|
|
65
|
+
// generate debug symbols for ReqWrap, which assumes that the position of
|
|
66
|
+
// members in memory are predictable. sizeof(req_) depends on the type of T,
|
|
67
|
+
// so req_wrap_queue_ would no longer be at a fixed offset if it came after
|
|
68
|
+
// req_. For more information please refer to
|
|
69
|
+
// `doc/contributing/node-postmortem-support.md`
|
|
70
|
+
T req_;
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
} // namespace node
|
|
74
|
+
|
|
75
|
+
#endif // defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS
|
|
76
|
+
|
|
77
|
+
#endif // SRC_REQ_WRAP_H_
|