@fails-components/webtransport 0.1.3 → 0.1.7

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 (57) hide show
  1. package/CMakeLists.txt +52 -109
  2. package/dist/lib/dom.d.ts +6 -0
  3. package/dist/lib/dom.d.ts.map +1 -1
  4. package/dist/lib/event-loop.d.ts +8 -3
  5. package/dist/lib/event-loop.d.ts.map +1 -1
  6. package/dist/lib/server.d.ts +3 -2
  7. package/dist/lib/server.d.ts.map +1 -1
  8. package/dist/lib/session.d.ts +66 -16
  9. package/dist/lib/session.d.ts.map +1 -1
  10. package/dist/lib/stream.d.ts +5 -5
  11. package/dist/lib/stream.d.ts.map +1 -1
  12. package/dist/lib/transport.d.ts.map +1 -1
  13. package/dist/lib/types.d.ts.map +1 -1
  14. package/dist/lib/webtransport.d.ts +22 -0
  15. package/dist/lib/webtransport.d.ts.map +1 -1
  16. package/lib/dom.ts +7 -2
  17. package/lib/event-loop.js +13 -7
  18. package/lib/server.js +1 -1
  19. package/lib/session.js +51 -20
  20. package/lib/stream.js +26 -5
  21. package/lib/transport.js +3 -1
  22. package/lib/types.ts +1 -0
  23. package/lib/webtransport.js +31 -0
  24. package/package.json +2 -2
  25. package/platform/quiche/quic/core/io/socket_win.inc +3 -0
  26. package/platform/quiche_platform_impl/quiche_command_line_flags_impl.h +7 -0
  27. package/platform/quiche_platform_impl/quiche_export_impl.h +3 -9
  28. package/platform/quiche_platform_impl/quiche_server_stats_impl.h +1 -22
  29. package/platform/quiche_platform_impl/quiche_stream_buffer_allocator_impl.h +1 -4
  30. package/platform/quiche_platform_impl/quiche_time_utils_impl.h +1 -13
  31. package/platform/quiche_platform_impl/quiche_udp_socket_platform_impl.h +9 -0
  32. package/readme.md +3 -1
  33. package/src/http3client.cc +13 -29
  34. package/src/http3client.h +2 -6
  35. package/src/http3clientsession.cc +3 -1
  36. package/src/http3clientsession.h +9 -0
  37. package/src/http3clientstream.cc +17 -0
  38. package/src/http3clientstream.h +10 -0
  39. package/src/http3eventloop.cc +42 -55
  40. package/src/http3eventloop.h +2 -5
  41. package/src/http3serversession.cc +1 -136
  42. package/src/http3serversession.h +1 -72
  43. package/src/http3serverstream.cc +0 -49
  44. package/src/http3serverstream.h +0 -5
  45. package/src/http3wtsessionvisitor.cc +1 -1
  46. package/src/http3wtsessionvisitor.h +5 -37
  47. package/src/http3wtstreamvisitor.cc +2 -2
  48. package/test/bidirectional-streams.spec.js +1 -0
  49. package/test/datagrams.spec.js +1 -0
  50. package/test/unidirectional-streams.spec.js +1 -0
  51. package/platform/net/quiche/common/platform/impl/quiche_flags_impl.h +0 -12
  52. package/platform/poll.h +0 -2
  53. package/platform/quiche/quic/core/io/quic_poll_event_loop.h +0 -8
  54. package/platform/quiche_platform_impl/quic_testvalue_impl.h +0 -19
  55. package/platform/quiche_platform_impl/quic_udp_socket_winsock.cc +0 -732
  56. package/platform/quiche_platform_impl/quiche_time_utils_impl.cc +0 -43
  57. package/platform/quiche_platform_impl/socket_winsock.cc +0 -535
@@ -63,10 +63,11 @@ namespace quic
63
63
  WriteResult WritePacket(const char *buffer, size_t buf_len,
64
64
  const QuicIpAddress &self_address,
65
65
  const QuicSocketAddress &peer_address,
66
- PerPacketOptions *options) override
66
+ PerPacketOptions *options,
67
+ const quic::QuicPacketWriterParams& wparams) override
67
68
  {
68
69
  WriteResult result = QuicDefaultPacketWriter::WritePacket(
69
- buffer, buf_len, self_address, peer_address, options);
70
+ buffer, buf_len, self_address, peer_address, options, wparams);
70
71
  if (IsWriteBlockedStatus(result.status))
71
72
  {
72
73
  bool success = event_loop_->RearmSocket(fd(), kSocketEventWritable);
@@ -148,7 +149,8 @@ namespace quic
148
149
  connection_in_progress_(false),
149
150
  num_attempts_connect_(0),
150
151
  webtransport_server_support_inform_(false),
151
- connection_debug_visitor_(nullptr)
152
+ connection_debug_visitor_(nullptr),
153
+ priority_(HttpStreamPriority())
152
154
  {
153
155
  set_server_address(server_address);
154
156
  Initialize();
@@ -183,7 +185,7 @@ namespace quic
183
185
 
184
186
  void Http3Client::Initialize()
185
187
  {
186
- priority_ = QuicStreamPriority();
188
+ priority_ = QuicStreamPriority(HttpStreamPriority());
187
189
  connect_attempted_ = false;
188
190
  auto_reconnect_ = false;
189
191
  buffer_body_ = true;
@@ -891,7 +893,6 @@ namespace quic
891
893
  response_ = "";
892
894
  response_complete_ = false;
893
895
  response_headers_complete_ = false;
894
- preliminary_headers_.clear();
895
896
  response_headers_.clear();
896
897
  response_trailers_.clear();
897
898
  bytes_read_ = 0;
@@ -990,21 +991,6 @@ namespace quic
990
991
  return &response_headers_;
991
992
  }
992
993
 
993
- const spdy::Http2HeaderBlock *Http3Client::preliminary_headers() const
994
- {
995
- for (std::pair<QuicStreamId, QuicSpdyClientStream *> stream : open_streams_)
996
- {
997
- size_t bytes_read =
998
- stream.second->stream_bytes_read() + stream.second->header_bytes_read();
999
- if (bytes_read > 0)
1000
- {
1001
- preliminary_headers_ = stream.second->preliminary_headers().Clone();
1002
- break;
1003
- }
1004
- }
1005
- return &preliminary_headers_;
1006
- }
1007
-
1008
994
  const spdy::Http2HeaderBlock &Http3Client::response_trailers() const
1009
995
  {
1010
996
  return response_trailers_;
@@ -1042,7 +1028,7 @@ namespace quic
1042
1028
 
1043
1029
  void Http3Client::OnCompleteResponse(
1044
1030
  QuicStreamId id, const spdy::Http2HeaderBlock &response_headers,
1045
- const std::string &response_body)
1031
+ const absl::string_view &response_body)
1046
1032
  {
1047
1033
  // implement
1048
1034
  }
@@ -1076,8 +1062,11 @@ namespace quic
1076
1062
  QUIC_LOG(ERROR) << "Invalid :status response header: " << status->second;
1077
1063
  }
1078
1064
  latest_response_headers_ = response_headers.DebugString();
1079
- preliminary_response_headers_ =
1080
- client_stream->preliminary_headers().DebugString();
1065
+ for (const Http2HeaderBlock &headers :
1066
+ client_stream->preliminary_headers())
1067
+ {
1068
+ absl::StrAppend(&preliminary_response_headers_, headers.DebugString());
1069
+ }
1081
1070
  latest_response_header_block_ = response_headers.Clone();
1082
1071
  latest_response_body_ = client_stream->data();
1083
1072
  latest_response_trailers_ =
@@ -1101,7 +1090,6 @@ namespace quic
1101
1090
  client_stream->stream_error(), connected(),
1102
1091
  client_stream->headers_decompressed(),
1103
1092
  client_stream->response_headers(),
1104
- client_stream->preliminary_headers(),
1105
1093
  (buffer_body() ? client_stream->data() : ""),
1106
1094
  client_stream->received_trailers(),
1107
1095
  // Use NumBytesConsumed to avoid counting retransmitted stream frames.
@@ -1226,7 +1214,6 @@ namespace quic
1226
1214
  response_complete(other.response_complete),
1227
1215
  response_headers_complete(other.response_headers_complete),
1228
1216
  response_headers(other.response_headers.Clone()),
1229
- preliminary_headers(other.preliminary_headers.Clone()),
1230
1217
  response(other.response),
1231
1218
  response_trailers(other.response_trailers.Clone()),
1232
1219
  bytes_read(other.bytes_read),
@@ -1237,14 +1224,12 @@ namespace quic
1237
1224
  QuicRstStreamErrorCode stream_error, bool response_complete,
1238
1225
  bool response_headers_complete,
1239
1226
  const spdy::Http2HeaderBlock &response_headers,
1240
- const spdy::Http2HeaderBlock &preliminary_headers,
1241
- const std::string &response, const spdy::Http2HeaderBlock &response_trailers,
1227
+ const absl::string_view response, const spdy::Http2HeaderBlock &response_trailers,
1242
1228
  uint64_t bytes_read, uint64_t bytes_written, int64_t response_body_size)
1243
1229
  : stream_error(stream_error),
1244
1230
  response_complete(response_complete),
1245
1231
  response_headers_complete(response_headers_complete),
1246
1232
  response_headers(response_headers.Clone()),
1247
- preliminary_headers(preliminary_headers.Clone()),
1248
1233
  response(response),
1249
1234
  response_trailers(response_trailers.Clone()),
1250
1235
  bytes_read(bytes_read),
@@ -1286,7 +1271,6 @@ namespace quic
1286
1271
  response_ = state.response;
1287
1272
  response_complete_ = state.response_complete;
1288
1273
  response_headers_complete_ = state.response_headers_complete;
1289
- preliminary_headers_ = state.preliminary_headers.Clone();
1290
1274
  response_headers_ = state.response_headers.Clone();
1291
1275
  response_trailers_ = state.response_trailers.Clone();
1292
1276
  bytes_read_ = state.bytes_read;
package/src/http3client.h CHANGED
@@ -180,7 +180,6 @@ namespace quic
180
180
  // Group 2.
181
181
  bool response_headers_complete() const;
182
182
  const spdy::Http2HeaderBlock *response_headers() const;
183
- const spdy::Http2HeaderBlock *preliminary_headers() const;
184
183
  int64_t response_size() const;
185
184
  size_t bytes_read() const;
186
185
  size_t bytes_written() const;
@@ -218,7 +217,7 @@ namespace quic
218
217
  // QuicSpdyClientBase::Reponselistener
219
218
  void OnCompleteResponse(
220
219
  QuicStreamId id, const spdy::Http2HeaderBlock &response_headers,
221
- const std::string &response_body);
220
+ const absl::string_view &response_body);
222
221
 
223
222
  // From QuicClientPushPromiseIndex::Delegate
224
223
  bool CheckVary(const spdy::Http2HeaderBlock &client_request,
@@ -321,8 +320,7 @@ namespace quic
321
320
  PerStreamState(QuicRstStreamErrorCode stream_error, bool response_complete,
322
321
  bool response_headers_complete,
323
322
  const spdy::Http2HeaderBlock &response_headers,
324
- const spdy::Http2HeaderBlock &preliminary_headers,
325
- const std::string &response,
323
+ const absl::string_view response,
326
324
  const spdy::Http2HeaderBlock &response_trailers,
327
325
  uint64_t bytes_read, uint64_t bytes_written,
328
326
  int64_t response_body_size);
@@ -332,7 +330,6 @@ namespace quic
332
330
  bool response_complete;
333
331
  bool response_headers_complete;
334
332
  spdy::Http2HeaderBlock response_headers;
335
- spdy::Http2HeaderBlock preliminary_headers;
336
333
  std::string response;
337
334
  spdy::Http2HeaderBlock response_trailers;
338
335
  uint64_t bytes_read;
@@ -398,7 +395,6 @@ namespace quic
398
395
 
399
396
  bool response_complete_;
400
397
  bool response_headers_complete_;
401
- mutable spdy::Http2HeaderBlock preliminary_headers_;
402
398
  mutable spdy::Http2HeaderBlock response_headers_;
403
399
 
404
400
  // Parsed response trailers (if present), copied from the stream in OnClose.
@@ -37,9 +37,11 @@ Http3ClientSession::Http3ClientSession(
37
37
 
38
38
  std::unique_ptr<QuicSpdyClientStream>
39
39
  Http3ClientSession::CreateClientStream() {
40
- return std::make_unique<Http3ClientStream>(
40
+ auto stream = std::make_unique<Http3ClientStream>(
41
41
  GetNextOutgoingBidirectionalStreamId(), this, BIDIRECTIONAL,
42
42
  drop_response_body_);
43
+ stream->set_on_interim_headers(on_interim_headers_);
44
+ return stream;
43
45
  }
44
46
 
45
47
  bool Http3ClientSession::ShouldNegotiateWebTransport() {
@@ -11,6 +11,9 @@
11
11
  #ifndef HTTP3_CLIENT_SESSION_H
12
12
  #define HTTP3_CLIENT_SESSION_H
13
13
 
14
+ #include <functional>
15
+ #include <utility>
16
+
14
17
  #include "quiche/quic/core/http/quic_spdy_client_session.h"
15
18
  #include "src/http3clientstream.h"
16
19
 
@@ -37,7 +40,13 @@ class Http3ClientSession : public QuicSpdyClientSession {
37
40
  bool ShouldNegotiateWebTransport() override;
38
41
  HttpDatagramSupport LocalHttpDatagramSupport() override;
39
42
 
43
+ void set_on_interim_headers(
44
+ std::function<void(const spdy::Http2HeaderBlock&)> on_interim_headers) {
45
+ on_interim_headers_ = std::move(on_interim_headers);
46
+ }
47
+
40
48
  private:
49
+ std::function<void(const spdy::Http2HeaderBlock&)> on_interim_headers_;
41
50
  const bool drop_response_body_;
42
51
  const bool enable_web_transport_;
43
52
  };
@@ -9,6 +9,7 @@
9
9
  // found in the LICENSE file.
10
10
 
11
11
  #include "src/http3clientstream.h"
12
+ #include "quiche/common/platform/api/quiche_logging.h"
12
13
 
13
14
  namespace quic {
14
15
 
@@ -32,4 +33,20 @@ void Http3ClientStream::OnBodyAvailable() {
32
33
  }
33
34
  }
34
35
 
36
+ bool Http3ClientStream::ParseAndValidateStatusCode() {
37
+ const size_t num_previous_interim_headers = preliminary_headers().size();
38
+ if (!QuicSpdyClientStream::ParseAndValidateStatusCode()) {
39
+ return false;
40
+ }
41
+ // The base ParseAndValidateStatusCode() may have added a preliminary header.
42
+ if (preliminary_headers().size() > num_previous_interim_headers) {
43
+ QUICHE_DCHECK_EQ(preliminary_headers().size(),
44
+ num_previous_interim_headers + 1);
45
+ if (on_interim_headers_) {
46
+ on_interim_headers_(preliminary_headers().back());
47
+ }
48
+ }
49
+ return true;
50
+ }
51
+
35
52
  } // namespace quic
@@ -23,7 +23,17 @@ class Http3ClientStream : public QuicSpdyClientStream {
23
23
  drop_response_body_(drop_response_body) {}
24
24
  void OnBodyAvailable() override;
25
25
 
26
+ void set_on_interim_headers(
27
+ std::function<void(const spdy::Http2HeaderBlock&)> on_interim_headers) {
28
+ on_interim_headers_ = std::move(on_interim_headers);
29
+ }
30
+
31
+ protected:
32
+ bool ParseAndValidateStatusCode() override;
33
+
34
+
26
35
  private:
36
+ std::function<void(const spdy::Http2HeaderBlock&)> on_interim_headers_;
27
37
  const bool drop_response_body_;
28
38
  };
29
39
 
@@ -17,19 +17,16 @@
17
17
  #include "quiche/common/platform/api/quiche_reference_counted.h"
18
18
  #include "quiche/quic/core/quic_default_clock.h"
19
19
  #include "quiche/quic/bindings/quic_libevent.h"
20
+ #include "quiche/common/platform/api/quiche_command_line_flags.h"
21
+
22
+ #include "absl/log/initialize.h"
23
+ #include "absl/strings/string_view.h"
20
24
 
21
25
  using namespace Napi;
22
26
 
23
27
  namespace quic
24
28
  {
25
29
 
26
- #ifdef WIN32
27
-
28
- bool initSockets();
29
- bool destroySockets();
30
-
31
- #endif
32
-
33
30
  // hack since the header is faulty
34
31
  QUICHE_NO_EXPORT QuicEventLoopFactory *GetDefaultEventLoop();
35
32
 
@@ -40,9 +37,6 @@ namespace quic
40
37
  Http3EventLoop::~Http3EventLoop()
41
38
  {
42
39
  printf("Destructor eventloop\n");
43
- #ifdef WIN32
44
- destroySockets();
45
- #endif
46
40
  }
47
41
 
48
42
  void Http3EventLoop::Init(Napi::Env env, Napi::Object exports)
@@ -61,7 +55,6 @@ namespace quic
61
55
  Http3ClientJS::InitExports(env, exports);
62
56
  Http3WTSessionJS::InitExports(env, exports, constr);
63
57
  Http3WTStreamJS::InitExports(env, exports, constr);
64
- Napi::ObjectReference *exportref = new Napi::ObjectReference();
65
58
 
66
59
  env.SetInstanceData<Http3Constructors>(constr);
67
60
  }
@@ -116,7 +109,7 @@ namespace quic
116
109
 
117
110
  void Http3EventLoop::informAboutStream(bool incom, bool bidir, Http3WTSession *sessionobj, Http3WTStream *stream)
118
111
  {
119
- struct Http3ProgressReport report;
112
+ Http3ProgressReport report;
120
113
  if (incom)
121
114
  {
122
115
  if (bidir)
@@ -147,7 +140,7 @@ namespace quic
147
140
 
148
141
  void Http3EventLoop::informStreamRecvSignal(Http3WTStream *streamobj, WebTransportStreamError error_code, NetworkTask task)
149
142
  {
150
- struct Http3ProgressReport report;
143
+ Http3ProgressReport report;
151
144
  report.type = Http3ProgressReport::StreamRecvSignal;
152
145
  report.streamobj = streamobj;
153
146
  report.wtscode = error_code;
@@ -158,7 +151,7 @@ namespace quic
158
151
 
159
152
  void Http3EventLoop::informAboutStreamRead(Http3WTStream *streamobj, std::string *data, bool fin)
160
153
  {
161
- struct Http3ProgressReport report;
154
+ Http3ProgressReport report;
162
155
  report.type = Http3ProgressReport::StreamRead;
163
156
  report.streamobj = streamobj;
164
157
  report.para = data;
@@ -169,7 +162,7 @@ namespace quic
169
162
 
170
163
  void Http3EventLoop::informAboutStreamWrite(Http3WTStream *streamobj, Napi::ObjectReference *bufferhandle, bool success)
171
164
  {
172
- struct Http3ProgressReport report;
165
+ Http3ProgressReport report;
173
166
  report.type = Http3ProgressReport::StreamWrite;
174
167
  report.streamobj = streamobj;
175
168
  report.bufferhandle = bufferhandle;
@@ -180,7 +173,7 @@ namespace quic
180
173
 
181
174
  void Http3EventLoop::informAboutStreamNetworkFinish(Http3WTStream *streamobj, NetworkTask task)
182
175
  {
183
- struct Http3ProgressReport report;
176
+ Http3ProgressReport report;
184
177
  report.type = Http3ProgressReport::StreamNetworkFinish;
185
178
  report.streamobj = streamobj;
186
179
  report.nettask = task;
@@ -190,7 +183,7 @@ namespace quic
190
183
 
191
184
  void Http3EventLoop::informAboutStreamReset(Http3WTStream *streamobj)
192
185
  {
193
- struct Http3ProgressReport report;
186
+ Http3ProgressReport report;
194
187
  report.type = Http3ProgressReport::StreamReset;
195
188
  report.streamobj = streamobj;
196
189
  if (progress_)
@@ -199,7 +192,7 @@ namespace quic
199
192
 
200
193
  void Http3EventLoop::informDatagramReceived(Http3WTSession *sessionobj, absl::string_view datagram)
201
194
  {
202
- struct Http3ProgressReport report;
195
+ Http3ProgressReport report;
203
196
  report.type = Http3ProgressReport::DatagramReceived;
204
197
  report.sessionobj = sessionobj;
205
198
  report.para = new std::string(datagram);
@@ -207,28 +200,19 @@ namespace quic
207
200
  progress_->Send(&report, 1);
208
201
  }
209
202
 
210
- void Http3EventLoop::informDatagramSend(Http3WTSession *sessionobj)
203
+ void Http3EventLoop::informDatagramSend(Http3WTSession *sessionobj, Napi::ObjectReference *bufferhandle)
211
204
  {
212
- struct Http3ProgressReport report;
205
+ Http3ProgressReport report;
213
206
  report.type = Http3ProgressReport::DatagramSend;
214
207
  report.sessionobj = sessionobj;
215
- if (progress_)
216
- progress_->Send(&report, 1);
217
- }
218
-
219
- void Http3EventLoop::informDatagramBufferFree(Napi::ObjectReference *bufferhandle)
220
- {
221
- struct Http3ProgressReport report;
222
- report.type = Http3ProgressReport::DatagramBufferFree;
223
208
  report.bufferhandle = bufferhandle;
224
-
225
209
  if (progress_)
226
210
  progress_->Send(&report, 1);
227
211
  }
228
212
 
229
213
  void Http3EventLoop::informUnref(LifetimeHelper *obj)
230
214
  {
231
- struct Http3ProgressReport report;
215
+ Http3ProgressReport report;
232
216
  report.type = Http3ProgressReport::Unref;
233
217
  report.obj = obj;
234
218
 
@@ -238,7 +222,7 @@ namespace quic
238
222
 
239
223
  void Http3EventLoop::informAboutClientConnected(Http3Client *client, bool success)
240
224
  {
241
- struct Http3ProgressReport report;
225
+ Http3ProgressReport report;
242
226
  report.type = Http3ProgressReport::ClientConnected;
243
227
  report.clientobj = client;
244
228
  report.success = success;
@@ -248,7 +232,7 @@ namespace quic
248
232
 
249
233
  void Http3EventLoop::informClientWebtransportSupport(Http3Client *client)
250
234
  {
251
- struct Http3ProgressReport report;
235
+ Http3ProgressReport report;
252
236
  report.type = Http3ProgressReport::ClientWebTransportSupport;
253
237
  report.clientobj = client;
254
238
  if (progress_)
@@ -257,7 +241,7 @@ namespace quic
257
241
 
258
242
  void Http3EventLoop::informAboutNewSessionRequest(Http3Server *server, WebTransportSession *session, spdy::Http2HeaderBlock *reqheadcopy, WebTransportRespPromisePtr promise)
259
243
  {
260
- struct Http3ProgressReport report;
244
+ Http3ProgressReport report;
261
245
  report.type = Http3ProgressReport::NewSessionRequest;
262
246
  report.webtsession = session;
263
247
  report.serverobj = server;
@@ -269,7 +253,7 @@ namespace quic
269
253
 
270
254
  void Http3EventLoop::informAboutNewSession(Http3Server *server, Http3WTSession *session, absl::string_view path, Napi::Reference<Napi::Value> *header)
271
255
  {
272
- struct Http3ProgressReport report;
256
+ Http3ProgressReport report;
273
257
  report.type = Http3ProgressReport::NewSession;
274
258
  report.serverobj = server;
275
259
  report.session = session;
@@ -281,7 +265,7 @@ namespace quic
281
265
 
282
266
  void Http3EventLoop::informNewClientSession(Http3Client *client, Http3WTSession *session)
283
267
  {
284
- struct Http3ProgressReport report;
268
+ Http3ProgressReport report;
285
269
  report.type = Http3ProgressReport::NewClientSession;
286
270
  report.clientobj = client;
287
271
  report.session = session;
@@ -292,7 +276,7 @@ namespace quic
292
276
  void Http3EventLoop::informSessionClosed(Http3WTSession *sessionobj, WebTransportSessionError error_code,
293
277
  absl::string_view error_message)
294
278
  {
295
- struct Http3ProgressReport report;
279
+ Http3ProgressReport report;
296
280
  report.type = Http3ProgressReport::SessionClosed;
297
281
  report.sessionobj = sessionobj;
298
282
  report.para = new std::string(error_message);
@@ -303,7 +287,7 @@ namespace quic
303
287
 
304
288
  void Http3EventLoop::informSessionReady(Http3WTSession *sessionobj)
305
289
  {
306
- struct Http3ProgressReport report;
290
+ Http3ProgressReport report;
307
291
  report.type = Http3ProgressReport::SessionReady;
308
292
  report.sessionobj = sessionobj;
309
293
  if (progress_)
@@ -312,7 +296,7 @@ namespace quic
312
296
 
313
297
  void Http3EventLoop::informServerStatus(Http3Server *serverobj, NetworkStatus status, ServerStatusDetails *details)
314
298
  {
315
- struct Http3ProgressReport report;
299
+ Http3ProgressReport report;
316
300
  report.type = Http3ProgressReport::ServerStatus;
317
301
  report.serverobj = serverobj;
318
302
  report.status = status;
@@ -534,12 +518,6 @@ namespace quic
534
518
  cbstream_.Call({retObj});
535
519
  }
536
520
 
537
- void Http3EventLoop::processDatagramBufferFree(Napi::ObjectReference *bufferhandle)
538
- {
539
- bufferhandle->Unref(); // release the outgoing buffer
540
- delete bufferhandle; // free the handle object
541
- }
542
-
543
521
  void Http3EventLoop::processDatagramReceived(Http3WTSession *sessionobj, std::string *datagram)
544
522
  {
545
523
  if (!checkQw())
@@ -565,8 +543,10 @@ namespace quic
565
543
  cbsession_.Call({retObj});
566
544
  }
567
545
 
568
- void Http3EventLoop::processDatagramSend(Http3WTSession *sessionobj)
546
+ void Http3EventLoop::processDatagramSend(Http3WTSession *sessionobj, Napi::ObjectReference *bufferhandle)
569
547
  {
548
+ bufferhandle->Unref(); // release the outgoing buffer
549
+ delete bufferhandle; // free the handle object
570
550
  if (!checkQw())
571
551
  return;
572
552
  HandleScope scope(qw_->Env());
@@ -867,12 +847,7 @@ namespace quic
867
847
  break;
868
848
  case Http3ProgressReport::DatagramSend:
869
849
  {
870
- processDatagramSend(cur.sessionobj);
871
- }
872
- break;
873
- case Http3ProgressReport::DatagramBufferFree:
874
- {
875
- processDatagramBufferFree(cur.bufferhandle);
850
+ processDatagramSend(cur.sessionobj, cur.bufferhandle);
876
851
  }
877
852
  break;
878
853
  case Http3ProgressReport::Unref:
@@ -891,10 +866,8 @@ namespace quic
891
866
  progress_(nullptr),
892
867
  quic_event_loop_(GetDefaultEventLoop()->Create(QuicDefaultClock::Get()))
893
868
  {
894
- #ifdef WIN32
895
- initSockets();
896
- #endif
897
-
869
+ std::vector<std::string> quiche_cmd_line;
870
+ quiche_cmd_line.push_back(std::string("webtransport.node"));
898
871
  if (!info[0].IsUndefined() /*|| info[1].IsFunction()*/)
899
872
  {
900
873
  Napi::Object lobj = info[0].ToObject();
@@ -945,12 +918,26 @@ namespace quic
945
918
  Napi::Error::New(Env(), "No session callback").ThrowAsJavaScriptException();
946
919
  return;
947
920
  }
921
+ quiche_cmd_line.push_back(std::string("-v"));
922
+ if (lobj.Has("quicheLogVerbose") && lobj.Get("quicheLogVerbose").IsFunction())
923
+ {
924
+ Napi::Value verboseValue = (lobj).Get("quicheLogVerbose");
925
+ quiche_cmd_line.push_back(verboseValue.ToString().Utf8Value());
926
+ } else {
927
+ quiche_cmd_line.push_back(std::string("-1"));
928
+ }
948
929
  }
949
930
  else
950
931
  {
951
932
  Napi::Error::New(Env(), "Callback not passed to Http3EventLoop internal").ThrowAsJavaScriptException();
952
933
  return;
953
934
  }
935
+ std::vector<const char*> quiche_cmd_line_char;
936
+ for (auto cur= quiche_cmd_line.begin(); cur != quiche_cmd_line.end(); cur++) {
937
+ quiche_cmd_line_char.push_back((*cur).c_str());
938
+ }
939
+
940
+ quiche::QuicheParseCommandLineFlags("No use instruction.", quiche_cmd_line.size(), &(*quiche_cmd_line_char.begin()));
954
941
  }
955
942
 
956
943
  void Http3EventLoop::startEventLoop(const Napi::CallbackInfo &info)
@@ -93,7 +93,6 @@ namespace quic
93
93
  StreamNetworkFinish,
94
94
  DatagramReceived,
95
95
  DatagramSend,
96
- DatagramBufferFree,
97
96
  Unref
98
97
  } type;
99
98
  union
@@ -216,8 +215,7 @@ namespace quic
216
215
  void informAboutStreamNetworkFinish(Http3WTStream *streamobj, NetworkTask task);
217
216
 
218
217
  void informDatagramReceived(Http3WTSession *sessionobj, absl::string_view datagram);
219
- void informDatagramBufferFree(Napi::ObjectReference *bufferhandle);
220
- void informDatagramSend(Http3WTSession *sessionobj);
218
+ void informDatagramSend(Http3WTSession *sessionobj, Napi::ObjectReference *bufferhandle);
221
219
 
222
220
  void informUnref(LifetimeHelper *obj);
223
221
 
@@ -282,8 +280,7 @@ namespace quic
282
280
  void processStreamNetworkFinish(Http3WTStream *streamobj, NetworkTask task);
283
281
 
284
282
  void processDatagramReceived(Http3WTSession *sessionobj, std::string *datagram);
285
- void processDatagramSend(Http3WTSession *sessionobj);
286
- void processDatagramBufferFree(Napi::ObjectReference *bufferhandle);
283
+ void processDatagramSend(Http3WTSession *sessionobj, Napi::ObjectReference *bufferhandle);
287
284
 
288
285
  bool shutDownEventLoopInt();
289
286