@fails-components/webtransport 0.3.1 → 1.0.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.
Files changed (162) hide show
  1. package/lib/client.js +81 -40
  2. package/lib/dom.ts +7 -5
  3. package/lib/http2/browser/browser.js +168 -0
  4. package/lib/http2/browser/browserparser.js +248 -0
  5. package/lib/http2/flowcontroller.js +371 -0
  6. package/lib/http2/node/capsuleparser.js +291 -0
  7. package/lib/http2/node/client.js +239 -0
  8. package/lib/http2/node/index.js +2 -0
  9. package/lib/http2/node/server.js +499 -0
  10. package/lib/http2/node/websocketparser.js +829 -0
  11. package/lib/http2/parserbase.js +139 -0
  12. package/lib/http2/parserbasehttp2.js +128 -0
  13. package/lib/http2/session.js +225 -0
  14. package/lib/http2/stream.js +354 -0
  15. package/lib/http2/websocketcommon.js +1 -0
  16. package/lib/{index.js → index.browser.js} +6 -10
  17. package/lib/index.node.js +27 -0
  18. package/lib/server.js +252 -69
  19. package/lib/session.js +31 -68
  20. package/lib/stream.js +103 -179
  21. package/lib/types.ts +174 -87
  22. package/lib/utils.js +2 -1
  23. package/lib/webstreams.browser.js +6 -0
  24. package/lib/webstreams.js +7 -0
  25. package/lib/webtransport.browser.js +284 -0
  26. package/lib/webtransport.node.js +137 -0
  27. package/lib/{webtransport.js → webtransportbase.js} +47 -41
  28. package/old_test/test.js +31 -29
  29. package/old_test/testsuite.js +1 -1
  30. package/package.json +18 -17
  31. package/readme.md +94 -30
  32. package/test/bidirectional-streams.spec.js +51 -9
  33. package/test/datagrams.spec.js +8 -2
  34. package/test/fixtures/known-bytes.js +29 -0
  35. package/test/fixtures/read-stream.js +1 -1
  36. package/test/fixtures/reader-value.js +1 -1
  37. package/test/fixtures/server.js +24 -10
  38. package/test/fixtures/webtransport.browser.js +20 -2
  39. package/test/fixtures/webtransport.js +1 -1
  40. package/test/index.js +33 -6
  41. package/test/pw-no-https-errors.json +5 -0
  42. package/test/session.spec.js +71 -52
  43. package/test/unidirectional-streams.spec.js +20 -4
  44. package/CMakeLists.txt +0 -991
  45. package/LICENSE.chromium +0 -27
  46. package/LICENSE.envoy +0 -207
  47. package/build.js +0 -313
  48. package/dist/lib/client.d.ts +0 -78
  49. package/dist/lib/client.d.ts.map +0 -1
  50. package/dist/lib/dom.d.ts +0 -87
  51. package/dist/lib/dom.d.ts.map +0 -1
  52. package/dist/lib/error.d.ts +0 -8
  53. package/dist/lib/error.d.ts.map +0 -1
  54. package/dist/lib/event-loop.d.ts +0 -33
  55. package/dist/lib/event-loop.d.ts.map +0 -1
  56. package/dist/lib/index.d.ts +0 -79
  57. package/dist/lib/index.d.ts.map +0 -1
  58. package/dist/lib/native.d.ts +0 -2
  59. package/dist/lib/native.d.ts.map +0 -1
  60. package/dist/lib/server.d.ts +0 -92
  61. package/dist/lib/server.d.ts.map +0 -1
  62. package/dist/lib/session.d.ts +0 -298
  63. package/dist/lib/session.d.ts.map +0 -1
  64. package/dist/lib/stream.d.ts +0 -135
  65. package/dist/lib/stream.d.ts.map +0 -1
  66. package/dist/lib/transport.d.ts +0 -34
  67. package/dist/lib/transport.d.ts.map +0 -1
  68. package/dist/lib/types.d.ts +0 -212
  69. package/dist/lib/types.d.ts.map +0 -1
  70. package/dist/lib/utils.d.ts +0 -11
  71. package/dist/lib/utils.d.ts.map +0 -1
  72. package/dist/lib/webtransport.d.ts +0 -47
  73. package/dist/lib/webtransport.d.ts.map +0 -1
  74. package/dist/test/bidirectional-streams.spec.d.ts +0 -5
  75. package/dist/test/bidirectional-streams.spec.d.ts.map +0 -1
  76. package/dist/test/datagrams.spec.d.ts +0 -5
  77. package/dist/test/datagrams.spec.d.ts.map +0 -1
  78. package/dist/test/event-loop.node.d.ts +0 -2
  79. package/dist/test/event-loop.node.d.ts.map +0 -1
  80. package/dist/test/fixtures/certificate.d.ts +0 -21
  81. package/dist/test/fixtures/certificate.d.ts.map +0 -1
  82. package/dist/test/fixtures/chai.d.ts +0 -2
  83. package/dist/test/fixtures/chai.d.ts.map +0 -1
  84. package/dist/test/fixtures/known-bytes.d.ts +0 -6
  85. package/dist/test/fixtures/known-bytes.d.ts.map +0 -1
  86. package/dist/test/fixtures/p-timeout.d.ts +0 -8
  87. package/dist/test/fixtures/p-timeout.d.ts.map +0 -1
  88. package/dist/test/fixtures/read-cert-hash.d.ts +0 -6
  89. package/dist/test/fixtures/read-cert-hash.d.ts.map +0 -1
  90. package/dist/test/fixtures/read-stream.d.ts +0 -19
  91. package/dist/test/fixtures/read-stream.d.ts.map +0 -1
  92. package/dist/test/fixtures/reader-value.d.ts +0 -22
  93. package/dist/test/fixtures/reader-value.d.ts.map +0 -1
  94. package/dist/test/fixtures/server.d.ts +0 -5
  95. package/dist/test/fixtures/server.d.ts.map +0 -1
  96. package/dist/test/fixtures/webtransport.browser.d.ts +0 -3
  97. package/dist/test/fixtures/webtransport.browser.d.ts.map +0 -1
  98. package/dist/test/fixtures/webtransport.d.ts +0 -3
  99. package/dist/test/fixtures/webtransport.d.ts.map +0 -1
  100. package/dist/test/fixtures/write-stream.d.ts +0 -10
  101. package/dist/test/fixtures/write-stream.d.ts.map +0 -1
  102. package/dist/test/index.d.ts +0 -2
  103. package/dist/test/index.d.ts.map +0 -1
  104. package/dist/test/session.spec.d.ts +0 -5
  105. package/dist/test/session.spec.d.ts.map +0 -1
  106. package/dist/test/unidirectional-streams.spec.d.ts +0 -2
  107. package/dist/test/unidirectional-streams.spec.d.ts.map +0 -1
  108. package/failslogolicensereadme.txt +0 -4
  109. package/lib/event-loop.js +0 -88
  110. package/lib/native.js +0 -28
  111. package/lib/transport.js +0 -82
  112. package/platform/icufix/fakedata.cpp +0 -8
  113. package/platform/quiche/quic/core/io/socket_win.inc +0 -3
  114. package/platform/quiche_platform_impl/quiche_bug_tracker_impl.h +0 -7
  115. package/platform/quiche_platform_impl/quiche_client_stats_impl.h +0 -7
  116. package/platform/quiche_platform_impl/quiche_command_line_flags_impl.h +0 -7
  117. package/platform/quiche_platform_impl/quiche_containers_impl.h +0 -7
  118. package/platform/quiche_platform_impl/quiche_event_loop_impl.h +0 -7
  119. package/platform/quiche_platform_impl/quiche_export_impl.h +0 -6
  120. package/platform/quiche_platform_impl/quiche_flag_utils_impl.h +0 -11
  121. package/platform/quiche_platform_impl/quiche_flags_impl.h +0 -8
  122. package/platform/quiche_platform_impl/quiche_iovec_impl.h +0 -10
  123. package/platform/quiche_platform_impl/quiche_logging_impl.h +0 -21
  124. package/platform/quiche_platform_impl/quiche_mem_slice_impl.h +0 -2
  125. package/platform/quiche_platform_impl/quiche_mutex_impl.h +0 -8
  126. package/platform/quiche_platform_impl/quiche_prefetch_impl.h +0 -11
  127. package/platform/quiche_platform_impl/quiche_reference_counted_impl.h +0 -16
  128. package/platform/quiche_platform_impl/quiche_server_stats_impl.h +0 -7
  129. package/platform/quiche_platform_impl/quiche_stack_trace_impl.h +0 -12
  130. package/platform/quiche_platform_impl/quiche_stream_buffer_allocator_impl.h +0 -8
  131. package/platform/quiche_platform_impl/quiche_testvalue_impl.h +0 -1
  132. package/platform/quiche_platform_impl/quiche_thread_local_impl.h +0 -6
  133. package/platform/quiche_platform_impl/quiche_time_utils_impl.h +0 -13
  134. package/platform/quiche_platform_impl/quiche_udp_socket_platform_impl.h +0 -39
  135. package/src/http3backendresponse.cc +0 -36
  136. package/src/http3backendresponse.h +0 -109
  137. package/src/http3client.cc +0 -1529
  138. package/src/http3client.h +0 -557
  139. package/src/http3clientsession.cc +0 -65
  140. package/src/http3clientsession.h +0 -60
  141. package/src/http3clientstream.cc +0 -52
  142. package/src/http3clientstream.h +0 -42
  143. package/src/http3dispatcher.cc +0 -62
  144. package/src/http3dispatcher.h +0 -57
  145. package/src/http3eventloop.cc +0 -1107
  146. package/src/http3eventloop.h +0 -316
  147. package/src/http3server.cc +0 -514
  148. package/src/http3server.h +0 -151
  149. package/src/http3serverbackend.cc +0 -105
  150. package/src/http3serverbackend.h +0 -98
  151. package/src/http3serversession.cc +0 -123
  152. package/src/http3serversession.h +0 -95
  153. package/src/http3serverstream.cc +0 -463
  154. package/src/http3serverstream.h +0 -114
  155. package/src/http3sessioncache.cc +0 -85
  156. package/src/http3sessioncache.h +0 -59
  157. package/src/http3wtsessionvisitor.cc +0 -46
  158. package/src/http3wtsessionvisitor.h +0 -397
  159. package/src/http3wtstreamvisitor.cc +0 -155
  160. package/src/http3wtstreamvisitor.h +0 -404
  161. package/test/event-loop.node.js +0 -24
  162. package/tsconfig.json +0 -39
@@ -1,1107 +0,0 @@
1
- // Copyright (c) 2022 Marten Richter or other contributers (see commit). All rights reserved.
2
- // Use of this source code is governed by a BSD-style license that can be
3
- // found in the LICENSE file.
4
-
5
- // portions taken from libquiche, original copyright, see LICENSE.chromium
6
- // Copyright (c) The Chromium Authors. All rights reserved.
7
- // Use of this source code is governed by a BSD-style license that can be
8
- // found in the LICENSE file.
9
-
10
- #include "src/http3server.h"
11
- #include "src/http3client.h"
12
- #include "src/http3eventloop.h"
13
- #include "src/http3dispatcher.h"
14
- #include "src/http3wtsessionvisitor.h"
15
- #include "quiche/quic/tools/quic_simple_crypto_server_stream_helper.h"
16
- #include "quiche/quic/core/crypto/proof_source_x509.h"
17
- #include "quiche/common/platform/api/quiche_reference_counted.h"
18
- #include "quiche/quic/core/quic_default_clock.h"
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"
24
-
25
- using namespace Napi;
26
-
27
- namespace quic
28
- {
29
-
30
- // hack since the header is faulty
31
- QUICHE_NO_EXPORT QuicEventLoopFactory *GetDefaultEventLoop();
32
-
33
- static const int kErrorBufferSize = 256;
34
-
35
- const size_t kNumSessionsToCreatePerSocketEvent = 16;
36
- bool Http3EventLoop::hasSetLogging = false;
37
-
38
- Http3EventLoop::~Http3EventLoop()
39
- {
40
- printf("Destructor eventloop\n");
41
- }
42
-
43
- void Http3EventLoop::Init(Napi::Env env, Napi::Object exports)
44
- {
45
- Napi::Function tpl =
46
- DefineClass(env, "Http3EventLoop",
47
- {InstanceMethod<&Http3EventLoop::startEventLoop>("startEventLoop",
48
- static_cast<napi_property_attributes>(napi_writable | napi_configurable)),
49
- InstanceMethod<&Http3EventLoop::shutDownEventLoop>("shutDownEventLoop",
50
- static_cast<napi_property_attributes>(napi_writable | napi_configurable))});
51
- exports.Set("Http3EventLoop", tpl);
52
-
53
- Http3Constructors *constr = new Http3Constructors();
54
-
55
- Http3ServerJS::InitExports(env, exports);
56
- Http3ClientJS::InitExports(env, exports);
57
- Http3WTSessionJS::InitExports(env, exports, constr);
58
- Http3WTStreamJS::InitExports(env, exports, constr);
59
-
60
- env.SetInstanceData<Http3Constructors>(constr);
61
- }
62
-
63
- void Http3EventLoop::Destroy()
64
- {
65
- printf("eventloop destroy called\n");
66
- cbstream_.Unref();
67
- cbsession_.Unref();
68
- cbtransport_.Unref();
69
- }
70
-
71
- void Http3EventLoop::Execute(const AsyncProgressQueueWorker<Http3ProgressReport>::ExecutionProgress &progress)
72
- {
73
- progress_ = &progress;
74
- // main event loop
75
- loop_running_ = true;
76
- while (loop_running_)
77
- {
78
- // Note QuicTime::Delta::Infinite() causes a busy loop.
79
- quic_event_loop_->RunEventLoopOnce(QuicTime::Delta::FromSeconds(5));
80
- ExecuteScheduledActions();
81
- }
82
- printf("event loop exited\n");
83
- progress_ = nullptr;
84
- Unref();
85
- }
86
-
87
- void Http3EventLoop::ExecuteScheduledActions()
88
- {
89
- quiche::QuicheCircularDeque<std::function<void()>> actions;
90
- {
91
- QuicWriterMutexLock lock(&scheduled_actions_lock_);
92
- actions.swap(scheduled_actions_);
93
- }
94
- while (!actions.empty())
95
- {
96
- actions.front()();
97
- actions.pop_front();
98
- }
99
- }
100
-
101
- void Http3EventLoop::Schedule(std::function<void()> action)
102
- {
103
- // QUICHE_DCHECK(!quit_.HasBeenNotified());
104
- {
105
- QuicWriterMutexLock lock(&scheduled_actions_lock_);
106
- scheduled_actions_.push_back(std::move(action));
107
- }
108
- dynamic_cast<LibeventQuicEventLoop *>(quic_event_loop_.get())->WakeUp();
109
- }
110
-
111
- void Http3EventLoop::informAboutStream(bool incom, bool bidir, Http3WTSession *sessionobj, Http3WTStream *stream)
112
- {
113
- Http3ProgressReport report;
114
- if (incom)
115
- {
116
- if (bidir)
117
- {
118
- report.type = Http3ProgressReport::IncomBiDiStream;
119
- }
120
- else
121
- {
122
- report.type = Http3ProgressReport::IncomUniDiStream;
123
- }
124
- }
125
- else
126
- {
127
- if (bidir)
128
- {
129
- report.type = Http3ProgressReport::OutgoBiDiStream;
130
- }
131
- else
132
- {
133
- report.type = Http3ProgressReport::OutgoUniDiStream;
134
- }
135
- }
136
- report.sessionobj = sessionobj;
137
- report.stream = stream;
138
- if (progress_)
139
- progress_->Send(&report, 1);
140
- }
141
-
142
- void Http3EventLoop::informStreamRecvSignal(Http3WTStream *streamobj, WebTransportStreamError error_code, NetworkTask task)
143
- {
144
- Http3ProgressReport report;
145
- report.type = Http3ProgressReport::StreamRecvSignal;
146
- report.streamobj = streamobj;
147
- report.wtscode = error_code;
148
- report.nettask = task;
149
- if (progress_)
150
- progress_->Send(&report, 1);
151
- }
152
-
153
- void Http3EventLoop::informAboutStreamRead(Http3WTStream *streamobj, uint32_t buffergrow, bool fin, bool success)
154
- {
155
- Http3ProgressReport report;
156
- report.type = Http3ProgressReport::StreamRead;
157
- report.streamobj = streamobj;
158
- report.fin = fin;
159
- report.buffergrow = buffergrow;
160
- report.success = success;
161
- if (progress_)
162
- progress_->Send(&report, 1);
163
- }
164
-
165
- void Http3EventLoop::informAboutStreamWrite(Http3WTStream *streamobj, Napi::ObjectReference *bufferhandle, bool success)
166
- {
167
- Http3ProgressReport report;
168
- report.type = Http3ProgressReport::StreamWrite;
169
- report.streamobj = streamobj;
170
- report.bufferhandle = bufferhandle;
171
- report.success = success;
172
- if (progress_)
173
- progress_->Send(&report, 1);
174
- }
175
-
176
- void Http3EventLoop::informAboutStreamNetworkFinish(Http3WTStream *streamobj, NetworkTask task)
177
- {
178
- Http3ProgressReport report;
179
- report.type = Http3ProgressReport::StreamNetworkFinish;
180
- report.streamobj = streamobj;
181
- report.nettask = task;
182
- if (progress_)
183
- progress_->Send(&report, 1);
184
- }
185
-
186
- void Http3EventLoop::informAboutStreamReset(Http3WTStream *streamobj)
187
- {
188
- Http3ProgressReport report;
189
- report.type = Http3ProgressReport::StreamReset;
190
- report.streamobj = streamobj;
191
- if (progress_)
192
- progress_->Send(&report, 1);
193
- }
194
-
195
- void Http3EventLoop::informDatagramReceived(Http3WTSession *sessionobj, absl::string_view datagram)
196
- {
197
- Http3ProgressReport report;
198
- report.type = Http3ProgressReport::DatagramReceived;
199
- report.sessionobj = sessionobj;
200
- report.para = new std::string(datagram);
201
- if (progress_)
202
- progress_->Send(&report, 1);
203
- }
204
-
205
- void Http3EventLoop::informDatagramSend(Http3WTSession *sessionobj, Napi::ObjectReference *bufferhandle)
206
- {
207
- Http3ProgressReport report;
208
- report.type = Http3ProgressReport::DatagramSend;
209
- report.sessionobj = sessionobj;
210
- report.bufferhandle = bufferhandle;
211
- if (progress_)
212
- progress_->Send(&report, 1);
213
- }
214
-
215
- void Http3EventLoop::informGoawayReceived(Http3WTSession *sessionobj)
216
- {
217
- Http3ProgressReport report;
218
- report.type = Http3ProgressReport::GoawayReceived;
219
- report.sessionobj = sessionobj;
220
- if (progress_)
221
- progress_->Send(&report, 1);
222
- }
223
-
224
- void Http3EventLoop::informSessionStats(Http3WTSession *sessionobj, webtransport::SessionStats * sessstats)
225
- {
226
- Http3ProgressReport report;
227
- report.type = Http3ProgressReport::SessionStats;
228
- report.sessionobj = sessionobj;
229
- report.sessionStats = sessstats;
230
-
231
- report.timestamp = new absl::Duration();
232
- report.timestamp[0] = absl::Now() - absl::UnixEpoch();
233
- if (progress_)
234
- progress_->Send(&report, 1);
235
- }
236
-
237
- void Http3EventLoop::informDatagramStats(Http3WTSession *sessionobj, webtransport::DatagramStats * datastats)
238
- {
239
- Http3ProgressReport report;
240
- report.type = Http3ProgressReport::DatagramStats;
241
- report.sessionobj = sessionobj;
242
- report.datagramStats = datastats;
243
- report.timestamp = new absl::Duration();
244
- report.timestamp[0] = absl::Now() - absl::UnixEpoch();
245
- if (progress_)
246
- progress_->Send(&report, 1);
247
- }
248
-
249
- void Http3EventLoop::informUnref(LifetimeHelper *obj)
250
- {
251
- Http3ProgressReport report;
252
- report.type = Http3ProgressReport::Unref;
253
- report.obj = obj;
254
-
255
- if (progress_)
256
- progress_->Send(&report, 1);
257
- }
258
-
259
- void Http3EventLoop::informAboutClientConnected(Http3Client *client, bool success)
260
- {
261
- Http3ProgressReport report;
262
- report.type = Http3ProgressReport::ClientConnected;
263
- report.clientobj = client;
264
- report.success = success;
265
- if (progress_)
266
- progress_->Send(&report, 1);
267
- }
268
-
269
- void Http3EventLoop::informClientWebtransportSupport(Http3Client *client)
270
- {
271
- Http3ProgressReport report;
272
- report.type = Http3ProgressReport::ClientWebTransportSupport;
273
- report.clientobj = client;
274
- if (progress_)
275
- progress_->Send(&report, 1);
276
- }
277
-
278
- void Http3EventLoop::informAboutNewSessionRequest(Http3Server *server, WebTransportSession *session, spdy::Http2HeaderBlock *reqheadcopy, WebTransportRespPromisePtr promise)
279
- {
280
- Http3ProgressReport report;
281
- report.type = Http3ProgressReport::NewSessionRequest;
282
- report.webtsession = session;
283
- report.serverobj = server;
284
- report.headerblock = reqheadcopy;
285
- report.promise = new WebTransportRespPromisePtr(promise);
286
- if (progress_)
287
- progress_->Send(&report, 1);
288
- }
289
-
290
- void Http3EventLoop::informAboutNewSession(Http3Server *server, Http3WTSession *session, absl::string_view path, Napi::Reference<Napi::Value> *header)
291
- {
292
- Http3ProgressReport report;
293
- report.type = Http3ProgressReport::NewSession;
294
- report.serverobj = server;
295
- report.session = session;
296
- report.header = header;
297
- report.para = new std::string(path);
298
- if (progress_)
299
- progress_->Send(&report, 1);
300
- }
301
-
302
- void Http3EventLoop::informNewClientSession(Http3Client *client, Http3WTSession *session)
303
- {
304
- Http3ProgressReport report;
305
- report.type = Http3ProgressReport::NewClientSession;
306
- report.clientobj = client;
307
- report.session = session;
308
- if (progress_)
309
- progress_->Send(&report, 1);
310
- }
311
-
312
- void Http3EventLoop::informSessionClosed(Http3WTSession *sessionobj, WebTransportSessionError error_code,
313
- absl::string_view error_message)
314
- {
315
- Http3ProgressReport report;
316
- report.type = Http3ProgressReport::SessionClosed;
317
- report.sessionobj = sessionobj;
318
- report.para = new std::string(error_message);
319
- report.wtecode = error_code;
320
- if (progress_)
321
- progress_->Send(&report, 1);
322
- }
323
-
324
- void Http3EventLoop::informSessionReady(Http3WTSession *sessionobj)
325
- {
326
- Http3ProgressReport report;
327
- report.type = Http3ProgressReport::SessionReady;
328
- report.sessionobj = sessionobj;
329
- if (progress_)
330
- progress_->Send(&report, 1);
331
- }
332
-
333
- void Http3EventLoop::informServerStatus(Http3Server *serverobj, NetworkStatus status, ServerStatusDetails *details)
334
- {
335
- Http3ProgressReport report;
336
- report.type = Http3ProgressReport::ServerStatus;
337
- report.serverobj = serverobj;
338
- report.status = status;
339
- report.details = details;
340
- if (progress_)
341
- progress_->Send(&report, 1);
342
- }
343
-
344
- void Http3EventLoop::freeData(Napi::Env env, void *data, std::string *hint)
345
- {
346
- // ok free data is actually using a string object
347
- delete hint;
348
- }
349
-
350
- void Http3EventLoop::processClientConnected(Http3Client *clientobj, bool success)
351
- {
352
- if (!checkQw())
353
- return;
354
- HandleScope scope(qw_->Env());
355
- auto client = clientobj->getJS();
356
-
357
- Napi::Object objVal = client->Value();
358
-
359
- Napi::Object retObj = Napi::Object::New(qw_->Env());
360
- retObj.Set("purpose", "ClientConnected");
361
- retObj.Set("success", success);
362
- retObj.Set("object", objVal);
363
-
364
- cbtransport_.Call({retObj});
365
- }
366
-
367
- void Http3EventLoop::processClientWebtransportSupport(Http3Client *clientobj)
368
- {
369
- if (!checkQw())
370
- return;
371
- HandleScope scope(qw_->Env());
372
-
373
- auto client = clientobj->getJS();
374
- Napi::Object objVal = client->Value();
375
-
376
- Napi::Object retObj = Napi::Object::New(qw_->Env());
377
- retObj.Set("purpose", "ClientWebtransportSupport");
378
- retObj.Set("object", objVal);
379
-
380
- cbtransport_.Call({retObj});
381
- }
382
-
383
- void Http3EventLoop::processStream(bool incom, bool bidi, Http3WTSession *sessionobj, Http3WTStream *stream)
384
- {
385
- if (!checkQw())
386
- return;
387
- HandleScope scope(qw_->Env());
388
- Http3Constructors *constr = qw_->Env().GetInstanceData<Http3Constructors>();
389
- Napi::Object strobj = constr->stream.New({});
390
- Http3WTStreamJS *strjs = Napi::ObjectWrap<Http3WTStreamJS>::Unwrap(strobj);
391
- strjs->setObj(stream);
392
- if (!stream->gone()) strjs->Ref();
393
-
394
- if (incom || bidi) { // we have a read stream
395
- // same size of a pipe in chromium, but the WT Pipe thre is 256 kbyte, the default 64 kbyte
396
- Napi::ArrayBuffer arraybuf = Napi::ArrayBuffer::New(qw_->Env(), 64 * 1024);
397
- strobj.Set("readbuffer", arraybuf); // so the lifecycle is bound to the JS Obj!
398
- stream->setReadBuffer(arraybuf.Data(), arraybuf.ByteLength());
399
- }
400
- stream->setJS(strjs);
401
-
402
- Napi::Object objVal = sessionobj->getJS()->Value();
403
-
404
- Napi::Object retObj = Napi::Object::New(qw_->Env());
405
- retObj.Set("purpose", "Http3WTStreamVisitor");
406
- retObj.Set("stream", strobj);
407
- retObj.Set("incoming", incom);
408
- retObj.Set("bidirectional", bidi);
409
- retObj.Set("object", objVal);
410
-
411
- cbsession_.Call({retObj});
412
- }
413
-
414
- void Http3EventLoop::processStreamRecvSignal(Http3WTStream *streamobj, WebTransportStreamError error_code, NetworkTask task)
415
- {
416
- if (!checkQw())
417
- return;
418
- HandleScope scope(qw_->Env());
419
- auto stream = streamobj->getJS();
420
- if (!stream)
421
- return;
422
- Napi::Object objVal = stream->Value();
423
-
424
- std::string nettaskstr;
425
- switch (task)
426
- {
427
- case NetworkTask::resetStream:
428
- {
429
- nettaskstr = "resetStream";
430
- }
431
- break;
432
- case NetworkTask::stopSending:
433
- {
434
- nettaskstr = "stopSending";
435
- }
436
- break;
437
- case NetworkTask::streamFinal:
438
- {
439
- nettaskstr = "streamFinal";
440
- }
441
- break;
442
- default:
443
- return;
444
- };
445
-
446
- Napi::Object retObj = Napi::Object::New(qw_->Env());
447
- retObj.Set("purpose", "StreamRecvSignal");
448
- retObj.Set("code", error_code);
449
- retObj.Set("object", objVal);
450
- retObj.Set("nettask", nettaskstr);
451
-
452
- cbstream_.Call({retObj});
453
- }
454
-
455
- void Http3EventLoop::processStreamRead(Http3WTStream *streamobj, size_t buffergrow, bool fin, bool success)
456
- {
457
- if (!checkQw())
458
- return;
459
- HandleScope scope(qw_->Env());
460
-
461
- auto stream = streamobj->getJS();
462
- if (!stream)
463
- return;
464
- Napi::Object objVal = stream->Value();
465
-
466
- Napi::Object retObj = Napi::Object::New(qw_->Env());
467
- retObj.Set("purpose", "StreamRead");
468
- retObj.Set("fin", fin);
469
- retObj.Set("buffergrow", buffergrow);
470
- retObj.Set("object", objVal);
471
- retObj.Set("success", success);
472
-
473
- cbstream_.Call({retObj});
474
- }
475
-
476
- void Http3EventLoop::processStreamWrite(Http3WTStream *streamobj, Napi::ObjectReference *bufferhandle, bool success)
477
- {
478
- if (!checkQw())
479
- return;
480
- HandleScope scope(qw_->Env());
481
-
482
- auto stream = streamobj->getJS();
483
- if (!stream)
484
- return;
485
-
486
- Napi::Object objVal = stream->Value();
487
- bufferhandle->Unref(); // release the outgoing buffer
488
- delete bufferhandle; // free the handle object
489
-
490
- Napi::Object retObj = Napi::Object::New(qw_->Env());
491
- retObj.Set("purpose", "StreamWrite");
492
- retObj.Set("success", success);
493
- retObj.Set("object", objVal);
494
-
495
- cbstream_.Call({retObj});
496
- }
497
-
498
- void Http3EventLoop::processStreamReset(Http3WTStream *streamobj)
499
- {
500
- if (!checkQw())
501
- return;
502
- HandleScope scope(qw_->Env());
503
-
504
- auto stream = streamobj->getJS();
505
- if (!stream)
506
- return;
507
-
508
- Napi::Object objVal = stream->Value();
509
-
510
- Napi::Object retObj = Napi::Object::New(qw_->Env());
511
- retObj.Set("purpose", "StreamReset");
512
- retObj.Set("object", objVal);
513
-
514
- cbstream_.Call({retObj});
515
- }
516
-
517
- void Http3EventLoop::processStreamNetworkFinish(Http3WTStream *streamobj, NetworkTask task)
518
- {
519
- if (!checkQw())
520
- return;
521
- HandleScope scope(qw_->Env());
522
-
523
- auto stream = streamobj->getJS();
524
- if (!stream)
525
- return;
526
- Napi::Object objVal = stream->Value();
527
-
528
- std::string nettaskstr;
529
- switch (task)
530
- {
531
- case NetworkTask::resetStream:
532
- {
533
- nettaskstr = "resetStream";
534
- }
535
- break;
536
- case NetworkTask::stopSending:
537
- {
538
- nettaskstr = "stopSending";
539
- }
540
- break;
541
- case NetworkTask::streamFinal:
542
- {
543
- nettaskstr = "streamFinal";
544
- }
545
- break;
546
- default:
547
- return;
548
- };
549
-
550
- Napi::Object retObj = Napi::Object::New(qw_->Env());
551
- retObj.Set("purpose", "StreamNetworkFinish");
552
- retObj.Set("object", objVal);
553
- retObj.Set("nettask", nettaskstr);
554
-
555
- cbstream_.Call({retObj});
556
- }
557
-
558
- void Http3EventLoop::processDatagramReceived(Http3WTSession *sessionobj, std::string *datagram)
559
- {
560
- if (!checkQw())
561
- return;
562
- HandleScope scope(qw_->Env());
563
- Napi::Object datagramVal =
564
- Napi::Uint8Array::New(qw_->Env(),
565
- datagram->length(),
566
- Napi::ArrayBuffer::New(qw_->Env(), &(*datagram)[0], datagram->length(),
567
- freeData, datagram),
568
- 0);
569
-
570
- auto session = sessionobj->getJS();
571
- if (!session)
572
- return;
573
- Napi::Object objVal = session->Value();
574
-
575
- Napi::Object retObj = Napi::Object::New(qw_->Env());
576
- retObj.Set("purpose", "DatagramReceived");
577
- retObj.Set("datagram", datagramVal);
578
- retObj.Set("object", objVal);
579
-
580
- cbsession_.Call({retObj});
581
- }
582
-
583
- void Http3EventLoop::processDatagramSend(Http3WTSession *sessionobj, Napi::ObjectReference *bufferhandle)
584
- {
585
- bufferhandle->Unref(); // release the outgoing buffer
586
- delete bufferhandle; // free the handle object
587
- if (!checkQw())
588
- return;
589
- HandleScope scope(qw_->Env());
590
- auto session = sessionobj->getJS();
591
- if (!session)
592
- return;
593
- Napi::Object objVal = session->Value();
594
-
595
- Napi::Object retObj = Napi::Object::New(qw_->Env());
596
- retObj.Set("purpose", "DatagramSend");
597
- retObj.Set("object", objVal);
598
-
599
- cbsession_.Call({retObj});
600
- }
601
-
602
- void Http3EventLoop::processGoawayReceived(Http3WTSession *sessionobj)
603
- {
604
- if (!checkQw())
605
- return;
606
- HandleScope scope(qw_->Env());
607
-
608
-
609
- auto session = sessionobj->getJS();
610
- if (!session)
611
- return;
612
- Napi::Object objVal = session->Value();
613
-
614
- Napi::Object retObj = Napi::Object::New(qw_->Env());
615
- retObj.Set("purpose", "GoawayReceived");
616
- retObj.Set("object", objVal);
617
- cbsession_.Call({retObj});
618
- }
619
-
620
- void Http3EventLoop::processSessionStats(Http3WTSession *sessionobj, absl::Duration* timestamp, webtransport::SessionStats * sessstats)
621
- {
622
- if (!checkQw())
623
- return;
624
- HandleScope scope(qw_->Env());
625
-
626
-
627
- auto session = sessionobj->getJS();
628
- if (!session)
629
- return;
630
- Napi::Object objVal = session->Value();
631
-
632
- Napi::Object retObj = Napi::Object::New(qw_->Env());
633
- retObj.Set("purpose", "SessionStats");
634
- retObj.Set("object", objVal);
635
- // expiredOutgoing: bigint
636
- // lostOutgoing: bigint
637
-
638
- // non Datagram
639
- // minRtt: number
640
- // smoothedRtt: number
641
- // rttVariation: number
642
- // estimatedSendRateBps: bigint
643
- retObj.Set("timestamp", absl::ToDoubleMilliseconds(*timestamp)); // absl::Duration
644
- // datagram
645
- retObj.Set("expiredOutgoing", Napi::BigInt::New(qw_->Env(), sessstats->datagram_stats.expired_outgoing)); //uint64_t
646
- retObj.Set("lostOutgoing", Napi::BigInt::New(qw_->Env(), sessstats->datagram_stats.lost_outgoing)); //uint64_t
647
-
648
- // non Datagram
649
- retObj.Set("minRtt", absl::ToDoubleMilliseconds(sessstats->min_rtt)); // absl::Duration
650
- retObj.Set("smoothedRtt", absl::ToDoubleMilliseconds(sessstats->smoothed_rtt)); // absl::Duration
651
- retObj.Set("rttVariation", absl::ToDoubleMilliseconds(sessstats->rtt_variation)); // absl::Duration
652
- retObj.Set("estimatedSendRateBps", sessstats->estimated_send_rate_bps); // absl::Duration
653
-
654
- cbsession_.Call({retObj});
655
- delete sessstats;
656
- delete timestamp;
657
- }
658
-
659
- void Http3EventLoop::processDatagramStats(Http3WTSession *sessionobj, absl::Duration* timestamp, webtransport::DatagramStats * datastats)
660
- {
661
- if (!checkQw())
662
- return;
663
- HandleScope scope(qw_->Env());
664
-
665
-
666
- auto session = sessionobj->getJS();
667
- if (!session)
668
- return;
669
- Napi::Object objVal = session->Value();
670
-
671
- Napi::Object retObj = Napi::Object::New(qw_->Env());
672
- retObj.Set("purpose", "DatagramStats");
673
- retObj.Set("object", objVal);
674
- retObj.Set("timestamp", absl::ToDoubleMilliseconds(*timestamp)); // absl::Duration
675
- // datagram
676
- retObj.Set("expiredOutgoing", Napi::BigInt::New(qw_->Env(), datastats->expired_outgoing)); //uint64_t
677
- retObj.Set("lostOutgoing", Napi::BigInt::New(qw_->Env(), datastats->lost_outgoing)); //uint64_t
678
-
679
- cbsession_.Call({retObj});
680
- delete datastats;
681
- delete timestamp;
682
- }
683
-
684
- void Http3EventLoop::processNewSessionRequest(Http3Server *serverobj, WebTransportSession *session, spdy::Http2HeaderBlock *reqheadcopy, WebTransportRespPromisePtr *promise)
685
- {
686
- if (!checkQw())
687
- return;
688
- HandleScope scope(qw_->Env());
689
-
690
- Napi::Object objVal = serverobj->getJS()->Value();
691
-
692
- Napi::Object retObj = Napi::Object::New(qw_->Env());
693
-
694
- retObj.Set("purpose", "SessionRequest");
695
- // header
696
-
697
- Napi::Object headObj = Napi::Object::New(qw_->Env());
698
- for (auto pair : *reqheadcopy)
699
- {
700
- // we iterate over all header fields
701
- headObj.Set(std::string(pair.first), std::string(pair.second));
702
- }
703
- retObj.Set("header", headObj);
704
- delete reqheadcopy; // we own it and must free it!
705
-
706
- // promise
707
- Napi::External<WebTransportRespPromisePtr> promObj =
708
- Napi::External<WebTransportRespPromisePtr>::New(qw_->Env(), promise,
709
- [](Napi::Env /*env*/, WebTransportRespPromisePtr *ref)
710
- {
711
- delete ref; // we own it and must delete it
712
- });
713
- retObj.Set("promise", promObj);
714
-
715
- Napi::External<WebTransportSession> wtsObj =
716
- Napi::External<WebTransportSession>::New(qw_->Env(), session,
717
- [](Napi::Env /*env*/, WebTransportSession *ref)
718
- {
719
- // we do not own it! And do not delete it.
720
- // does it outlife everything?
721
- });
722
- retObj.Set("session", wtsObj);
723
-
724
- retObj.Set("object", objVal);
725
-
726
- cbtransport_.Call({retObj});
727
- }
728
-
729
- void Http3EventLoop::processNewSession(Http3Server *serverobj, Http3WTSession *session, const std::string &path, Napi::Reference<Napi::Value> *header)
730
- {
731
- if (!checkQw())
732
- return;
733
- HandleScope scope(qw_->Env());
734
-
735
- Http3Constructors *constr = qw_->Env().GetInstanceData<Http3Constructors>();
736
- Napi::Object sessionobj = constr->session.New({});
737
- Http3WTSessionJS *sessionjs = Napi::ObjectWrap<Http3WTSessionJS>::Unwrap(sessionobj);
738
- sessionjs->setObj(session);
739
- sessionjs->Ref();
740
- session->setJS(sessionjs);
741
-
742
- Napi::Object objVal = serverobj->getJS()->Value();
743
-
744
- Napi::Object retObj = Napi::Object::New(qw_->Env());
745
- retObj.Set("purpose", "Http3WTSessionVisitor");
746
- retObj.Set("session", sessionobj);
747
- retObj.Set("path", path);
748
- retObj.Set("object", objVal);
749
- if (header)
750
- {
751
- retObj.Set("header", header->Value());
752
- header->Unref();
753
- delete header;
754
- }
755
-
756
- cbtransport_.Call({retObj});
757
- }
758
-
759
- void Http3EventLoop::processNewClientSession(Http3Client *clientobj, Http3WTSession *session)
760
- {
761
- if (!checkQw())
762
- return;
763
- HandleScope scope(qw_->Env());
764
-
765
- Napi::Object retObj = Napi::Object::New(qw_->Env());
766
- retObj.Set("purpose", "Http3WTSessionVisitor");
767
- if (session != nullptr)
768
- {
769
- Http3Constructors *constr = qw_->Env().GetInstanceData<Http3Constructors>();
770
- Napi::Object sessionobj = constr->session.New({});
771
- Http3WTSessionJS *sessionjs = Napi::ObjectWrap<Http3WTSessionJS>::Unwrap(sessionobj);
772
- sessionjs->setObj(session);
773
- sessionjs->Ref();
774
- session->setJS(sessionjs);
775
-
776
- Napi::Object objVal = clientobj->getJS()->Value();
777
- retObj.Set("session", sessionobj);
778
-
779
- retObj.Set("object", objVal);
780
- }
781
- cbtransport_.Call({retObj});
782
- }
783
-
784
- void Http3EventLoop::processSessionReady(Http3WTSession *sessionobj)
785
- {
786
- if (!checkQw())
787
- return;
788
- HandleScope scope(qw_->Env());
789
- auto session = sessionobj->getJS();
790
- if (!session)
791
- return;
792
- Napi::Object objVal = session->Value();
793
-
794
- Napi::Object retObj = Napi::Object::New(qw_->Env());
795
- retObj.Set("purpose", "SessionReady");
796
- retObj.Set("object", objVal);
797
-
798
- cbsession_.Call({retObj});
799
- }
800
-
801
- void Http3EventLoop::processSessionClose(Http3WTSession *sessionobj, uint32_t errorcode, const std::string &error)
802
- {
803
- if (!checkQw())
804
- return;
805
- HandleScope scope(qw_->Env());
806
-
807
- auto session = sessionobj->getJS();
808
- if (!session)
809
- return;
810
-
811
- Napi::Object objVal = session->Value();
812
-
813
- Napi::Object retObj = Napi::Object::New(qw_->Env());
814
- retObj.Set("purpose", "SessionClose");
815
- retObj.Set("error", error);
816
- retObj.Set("errorcode", errorcode);
817
-
818
- retObj.Set("object", objVal);
819
-
820
- cbsession_.Call({retObj});
821
- }
822
-
823
- void Http3EventLoop::processServerStatus(Http3Server *serverobj, NetworkStatus status, ServerStatusDetails *details)
824
- {
825
- if (!checkQw())
826
- return;
827
- HandleScope scope(qw_->Env());
828
-
829
- Napi::Object objVal = serverobj->getJS()->Value();
830
-
831
- Napi::Object retObj = Napi::Object::New(qw_->Env());
832
- retObj.Set("purpose", "ServerStatus");
833
- retObj.Set("object", objVal);
834
- Napi::Number portVal = Napi::Number::New(qw_->Env(), details->port);
835
- retObj.Set("port", portVal);
836
- Napi::String hostVal = Napi::String::New(qw_->Env(), details->host);
837
- retObj.Set("host", hostVal);
838
-
839
- delete details; // we own it and must throw it away
840
- switch (status)
841
- {
842
- case NetError:
843
- {
844
- retObj.Set("status", "error");
845
- }
846
- break;
847
- case NetListening:
848
- {
849
- retObj.Set("status", "listening");
850
- }
851
- break;
852
- case NetClose:
853
- {
854
- retObj.Set("status", "close");
855
- }
856
- break;
857
- default:
858
- {
859
- Napi::Error::New(Env(), "Unknown status from server").ThrowAsJavaScriptException();
860
- return;
861
- }
862
- break;
863
- };
864
- cbtransport_.Call({retObj});
865
- }
866
-
867
- void Http3EventLoop::HandleProgressCallback(const Http3ProgressReport *data, size_t count)
868
- {
869
- for (int i = 0; i < count; i++)
870
- {
871
- Http3ProgressReport cur = data[i];
872
- switch (cur.type)
873
- {
874
- case Http3ProgressReport::ClientConnected:
875
- {
876
- processClientConnected(cur.clientobj, cur.success);
877
- }
878
- break;
879
- case Http3ProgressReport::ClientWebTransportSupport:
880
- {
881
- processClientWebtransportSupport(cur.clientobj);
882
- }
883
- break;
884
- case Http3ProgressReport::NewClientSession:
885
- {
886
- processNewClientSession(cur.clientobj, cur.session);
887
- }
888
- break;
889
- case Http3ProgressReport::NewSessionRequest:
890
- {
891
- processNewSessionRequest(cur.serverobj, cur.webtsession, cur.headerblock, cur.promise);
892
- }
893
- break;
894
- case Http3ProgressReport::NewSession:
895
- {
896
- processNewSession(cur.serverobj, cur.session, *cur.para, cur.header);
897
- }
898
- break;
899
- case Http3ProgressReport::SessionReady:
900
- {
901
- processSessionReady(cur.sessionobj);
902
- }
903
- break;
904
- case Http3ProgressReport::SessionClosed:
905
- {
906
- processSessionClose(cur.sessionobj, cur.wtecode, *cur.para);
907
- }
908
- break;
909
- case Http3ProgressReport::IncomBiDiStream:
910
- {
911
- processStream(true, true, cur.sessionobj, cur.stream);
912
- }
913
- break;
914
- case Http3ProgressReport::IncomUniDiStream:
915
- {
916
- processStream(true, false, cur.sessionobj, cur.stream);
917
- }
918
- break;
919
- case Http3ProgressReport::OutgoBiDiStream:
920
- {
921
- processStream(false, true, cur.sessionobj, cur.stream);
922
- }
923
- break;
924
- case Http3ProgressReport::OutgoUniDiStream:
925
- {
926
- processStream(false, false, cur.sessionobj, cur.stream);
927
- }
928
- break;
929
- case Http3ProgressReport::ServerStatus:
930
- {
931
- processServerStatus(cur.serverobj, cur.status, cur.details);
932
- cur.para = nullptr; // take ownership of the data
933
- }
934
- break;
935
- case Http3ProgressReport::StreamRecvSignal:
936
- {
937
- processStreamRecvSignal(cur.streamobj, cur.wtscode, cur.nettask);
938
- }
939
- break;
940
- case Http3ProgressReport::StreamRead:
941
- {
942
- processStreamRead(cur.streamobj, cur.buffergrow, cur.fin, cur.success);
943
- }
944
- break;
945
- case Http3ProgressReport::StreamWrite:
946
- {
947
- processStreamWrite(cur.streamobj, cur.bufferhandle, cur.success);
948
- }
949
- break;
950
- case Http3ProgressReport::StreamReset:
951
- {
952
- processStreamReset(cur.streamobj);
953
- }
954
- break;
955
- case Http3ProgressReport::StreamNetworkFinish:
956
- {
957
- processStreamNetworkFinish(cur.streamobj, cur.nettask);
958
- }
959
- break;
960
- case Http3ProgressReport::DatagramReceived:
961
- {
962
- processDatagramReceived(cur.sessionobj, cur.para);
963
- cur.para = nullptr; // take ownership of the data
964
- }
965
- break;
966
- case Http3ProgressReport::DatagramSend:
967
- {
968
- processDatagramSend(cur.sessionobj, cur.bufferhandle);
969
- }
970
- break;
971
- case Http3ProgressReport::GoawayReceived:
972
- {
973
- processGoawayReceived(cur.sessionobj);
974
- }
975
- break;
976
- case Http3ProgressReport::SessionStats:
977
- {
978
- processSessionStats(cur.sessionobj, cur.timestamp, cur.sessionStats);
979
- cur.para = nullptr; // take ownership of the data
980
- }
981
- break;
982
- case Http3ProgressReport::DatagramStats:
983
- {
984
- processDatagramStats(cur.sessionobj, cur.timestamp, cur.datagramStats);
985
- cur.para = nullptr; // take ownership of the data
986
- }
987
- break;
988
- case Http3ProgressReport::Unref:
989
- {
990
- cur.obj->doUnref();
991
- }
992
- break;
993
- };
994
- if (cur.para)
995
- delete cur.para;
996
- }
997
- }
998
-
999
- Http3EventLoop::Http3EventLoop(const Napi::CallbackInfo &info)
1000
- : Napi::ObjectWrap<Http3EventLoop>(info),
1001
- progress_(nullptr),
1002
- quic_event_loop_(GetDefaultEventLoop()->Create(QuicDefaultClock::Get()))
1003
- {
1004
- std::vector<std::string> quiche_cmd_line;
1005
- quiche_cmd_line.push_back(std::string("webtransport.node"));
1006
- if (!info[0].IsUndefined() /*|| info[1].IsFunction()*/)
1007
- {
1008
- Napi::Object lobj = info[0].ToObject();
1009
- if (lobj.IsEmpty())
1010
- {
1011
- Napi::Error::New(Env(), "No callback obj for Http3Transport").ThrowAsJavaScriptException();
1012
- return;
1013
- }
1014
-
1015
- if (lobj.Has("eventloopCallback") && (lobj).Get("eventloopCallback").IsFunction())
1016
- {
1017
- Napi::Function cbeventloop = lobj.Get("eventloopCallback").As<Napi::Function>();
1018
- qw_ = new QueueWorker(this, cbeventloop);
1019
- }
1020
- else
1021
- {
1022
- Napi::Error::New(Env(), "No eventloop callback").ThrowAsJavaScriptException();
1023
- qw_ = nullptr;
1024
- return;
1025
- }
1026
-
1027
- if (lobj.Has("transportCallback") && (lobj).Get("transportCallback").IsFunction())
1028
- {
1029
- cbtransport_ = Napi::Persistent(lobj.Get("transportCallback").As<Napi::Function>());
1030
- }
1031
- else
1032
- {
1033
- Napi::Error::New(Env(), "No transport callback").ThrowAsJavaScriptException();
1034
- return;
1035
- }
1036
-
1037
- if (lobj.Has("streamCallback") && lobj.Get("streamCallback").IsFunction())
1038
- {
1039
- cbstream_ = Napi::Persistent(lobj.Get("streamCallback").As<Napi::Function>());
1040
- }
1041
- else
1042
- {
1043
- Napi::Error::New(Env(), "No stream callback").ThrowAsJavaScriptException();
1044
- return;
1045
- }
1046
-
1047
- if (lobj.Has("sessionCallback") && lobj.Get("sessionCallback").IsFunction())
1048
- {
1049
- cbsession_ = Napi::Persistent(lobj.Get("sessionCallback").As<Napi::Function>());
1050
- }
1051
- else
1052
- {
1053
- Napi::Error::New(Env(), "No session callback").ThrowAsJavaScriptException();
1054
- return;
1055
- }
1056
- quiche_cmd_line.push_back(std::string("-v"));
1057
- if (lobj.Has("quicheLogVerbose") && lobj.Get("quicheLogVerbose").IsFunction())
1058
- {
1059
- Napi::Value verboseValue = (lobj).Get("quicheLogVerbose");
1060
- quiche_cmd_line.push_back(verboseValue.ToString().Utf8Value());
1061
- } else {
1062
- quiche_cmd_line.push_back(std::string("-1"));
1063
- }
1064
- }
1065
- else
1066
- {
1067
- Napi::Error::New(Env(), "Callback not passed to Http3EventLoop internal").ThrowAsJavaScriptException();
1068
- return;
1069
- }
1070
- std::vector<const char*> quiche_cmd_line_char;
1071
- for (auto cur= quiche_cmd_line.begin(); cur != quiche_cmd_line.end(); cur++) {
1072
- quiche_cmd_line_char.push_back((*cur).c_str());
1073
- }
1074
- if (!hasSetLogging) {
1075
- quiche::QuicheParseCommandLineFlags("No use instruction.", quiche_cmd_line.size(), &(*quiche_cmd_line_char.begin()));
1076
- hasSetLogging = true;
1077
- }
1078
- }
1079
-
1080
- void Http3EventLoop::startEventLoop(const Napi::CallbackInfo &info)
1081
- {
1082
- // got the object we can now start the server
1083
- Ref(); // do not garbage collect
1084
- // epoll_server_.set_timeout_in_us(-1); // negative values would mean wait forever
1085
- if (!checkQw())
1086
- return;
1087
- qw_->Queue(); // from asyncprogressqueue worker
1088
- }
1089
-
1090
- void Http3EventLoop::shutDownEventLoop(const Napi::CallbackInfo &info)
1091
- {
1092
- // FIXME kill the uv loop
1093
- std::function<void()> task = [this]()
1094
- {
1095
- loop_running_ = false;
1096
- };
1097
- Schedule(task);
1098
- }
1099
-
1100
- Napi::Object Init(Napi::Env env, Napi::Object exports)
1101
- {
1102
- Http3EventLoop::Init(env, exports);
1103
- return exports;
1104
- }
1105
-
1106
- NODE_API_MODULE(webtransport, Init)
1107
- }