Skip to content

Commit e8ea834

Browse files
jasnelltargos
authored andcommitted
quic: add more QUIC implementation
* add TLSContext * quic: add stat collection utilities * add Packet * add NgTcp2CallbackScope/NgHttp3CallbackScope PR-URL: #47494 Reviewed-By: Yagiz Nizipli <yagiz@nizipli.com> Reviewed-By: Tobias Nießen <tniessen@tnie.de>
1 parent d3fadd8 commit e8ea834

11 files changed

Lines changed: 1484 additions & 8 deletions

File tree

node.gyp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -341,16 +341,20 @@
341341
'src/quic/cid.cc',
342342
'src/quic/data.cc',
343343
'src/quic/logstream.cc',
344+
'src/quic/packet.cc',
344345
'src/quic/preferredaddress.cc',
345346
'src/quic/sessionticket.cc',
347+
'src/quic/tlscontext.cc',
346348
'src/quic/tokens.cc',
347349
'src/quic/transportparams.cc',
348350
'src/quic/bindingdata.h',
349351
'src/quic/cid.h',
350352
'src/quic/data.h',
351353
'src/quic/logstream.h',
354+
'src/quic/packet.h',
352355
'src/quic/preferredaddress.h',
353356
'src/quic/sessionticket.h',
357+
'src/quic/tlscontext.h',
354358
'src/quic/tokens.h',
355359
'src/quic/transportparams.h',
356360
],

src/async_wrap.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ namespace node {
6161
V(PROMISE) \
6262
V(QUERYWRAP) \
6363
V(QUIC_LOGSTREAM) \
64+
V(QUIC_PACKET) \
6465
V(SHUTDOWNWRAP) \
6566
V(SIGNALWRAP) \
6667
V(STATWATCHER) \

src/node_errors.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ void OOMErrorHandler(const char* location, const v8::OOMDetails& details);
6363
V(ERR_DLOPEN_FAILED, Error) \
6464
V(ERR_ENCODING_INVALID_ENCODED_DATA, TypeError) \
6565
V(ERR_EXECUTION_ENVIRONMENT_NOT_AVAILABLE, Error) \
66+
V(ERR_ILLEGAL_CONSTRUCTOR, Error) \
6667
V(ERR_INVALID_ADDRESS, Error) \
6768
V(ERR_INVALID_ARG_VALUE, TypeError) \
6869
V(ERR_OSSL_EVP_INVALID_DIGEST, Error) \
@@ -156,6 +157,7 @@ ERRORS_WITH_CODE(V)
156157
V(ERR_DLOPEN_FAILED, "DLOpen failed") \
157158
V(ERR_EXECUTION_ENVIRONMENT_NOT_AVAILABLE, \
158159
"Context not associated with Node.js environment") \
160+
V(ERR_ILLEGAL_CONSTRUCTOR, "Illegal constructor") \
159161
V(ERR_INVALID_ADDRESS, "Invalid socket address") \
160162
V(ERR_INVALID_MODULE, "No such module") \
161163
V(ERR_INVALID_STATE, "Invalid state") \

src/quic/bindingdata.cc

Lines changed: 45 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,13 +58,15 @@ void BindingData::DecreaseAllocatedSize(size_t size) {
5858

5959
void BindingData::Initialize(Environment* env, Local<Object> target) {
6060
SetMethod(env->context(), target, "setCallbacks", SetCallbacks);
61+
SetMethod(env->context(), target, "flushPacketFreelist", FlushPacketFreelist);
6162
Realm::GetCurrent(env->context())
6263
->AddBindingData<BindingData>(env->context(), target);
6364
}
6465

6566
void BindingData::RegisterExternalReferences(
6667
ExternalReferenceRegistry* registry) {
6768
registry->Register(SetCallbacks);
69+
registry->Register(FlushPacketFreelist);
6870
}
6971

7072
BindingData::BindingData(Realm* realm, Local<Object> object)
@@ -140,7 +142,7 @@ QUIC_JS_CALLBACKS(V)
140142
void BindingData::SetCallbacks(const FunctionCallbackInfo<Value>& args) {
141143
auto env = Environment::GetCurrent(args);
142144
auto isolate = env->isolate();
143-
BindingData& state = BindingData::Get(env);
145+
auto& state = BindingData::Get(env);
144146
CHECK(args[0]->IsObject());
145147
Local<Object> obj = args[0].As<Object>();
146148

@@ -159,6 +161,48 @@ void BindingData::SetCallbacks(const FunctionCallbackInfo<Value>& args) {
159161
#undef V
160162
}
161163

164+
void BindingData::FlushPacketFreelist(const FunctionCallbackInfo<Value>& args) {
165+
auto env = Environment::GetCurrent(args);
166+
auto& state = BindingData::Get(env);
167+
state.packet_freelist.clear();
168+
}
169+
170+
NgTcp2CallbackScope::NgTcp2CallbackScope(Environment* env) : env(env) {
171+
auto& binding = BindingData::Get(env);
172+
CHECK(!binding.in_ngtcp2_callback_scope);
173+
binding.in_ngtcp2_callback_scope = true;
174+
}
175+
176+
NgTcp2CallbackScope::~NgTcp2CallbackScope() {
177+
auto& binding = BindingData::Get(env);
178+
binding.in_ngtcp2_callback_scope = false;
179+
}
180+
181+
bool NgTcp2CallbackScope::in_ngtcp2_callback(Environment* env) {
182+
auto& binding = BindingData::Get(env);
183+
return binding.in_ngtcp2_callback_scope;
184+
}
185+
186+
NgHttp3CallbackScope::NgHttp3CallbackScope(Environment* env) : env(env) {
187+
auto& binding = BindingData::Get(env);
188+
CHECK(!binding.in_nghttp3_callback_scope);
189+
binding.in_nghttp3_callback_scope = true;
190+
}
191+
192+
NgHttp3CallbackScope::~NgHttp3CallbackScope() {
193+
auto& binding = BindingData::Get(env);
194+
binding.in_nghttp3_callback_scope = false;
195+
}
196+
197+
bool NgHttp3CallbackScope::in_nghttp3_callback(Environment* env) {
198+
auto& binding = BindingData::Get(env);
199+
return binding.in_nghttp3_callback_scope;
200+
}
201+
202+
void IllegalConstructor(const FunctionCallbackInfo<Value>& args) {
203+
THROW_ERR_ILLEGAL_CONSTRUCTOR(Environment::GetCurrent(args));
204+
}
205+
162206
} // namespace quic
163207
} // namespace node
164208