@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.
- package/lib/client.js +81 -40
- package/lib/dom.ts +7 -5
- package/lib/http2/browser/browser.js +168 -0
- package/lib/http2/browser/browserparser.js +248 -0
- package/lib/http2/flowcontroller.js +371 -0
- package/lib/http2/node/capsuleparser.js +291 -0
- package/lib/http2/node/client.js +239 -0
- package/lib/http2/node/index.js +2 -0
- package/lib/http2/node/server.js +499 -0
- package/lib/http2/node/websocketparser.js +829 -0
- package/lib/http2/parserbase.js +139 -0
- package/lib/http2/parserbasehttp2.js +128 -0
- package/lib/http2/session.js +225 -0
- package/lib/http2/stream.js +354 -0
- package/lib/http2/websocketcommon.js +1 -0
- package/lib/{index.js → index.browser.js} +6 -10
- package/lib/index.node.js +27 -0
- package/lib/server.js +252 -69
- package/lib/session.js +31 -68
- package/lib/stream.js +103 -179
- package/lib/types.ts +174 -87
- package/lib/utils.js +2 -1
- package/lib/webstreams.browser.js +6 -0
- package/lib/webstreams.js +7 -0
- package/lib/webtransport.browser.js +284 -0
- package/lib/webtransport.node.js +137 -0
- package/lib/{webtransport.js → webtransportbase.js} +47 -41
- package/old_test/test.js +31 -29
- package/old_test/testsuite.js +1 -1
- package/package.json +18 -17
- package/readme.md +94 -30
- package/test/bidirectional-streams.spec.js +51 -9
- package/test/datagrams.spec.js +8 -2
- package/test/fixtures/known-bytes.js +29 -0
- package/test/fixtures/read-stream.js +1 -1
- package/test/fixtures/reader-value.js +1 -1
- package/test/fixtures/server.js +24 -10
- package/test/fixtures/webtransport.browser.js +20 -2
- package/test/fixtures/webtransport.js +1 -1
- package/test/index.js +33 -6
- package/test/pw-no-https-errors.json +5 -0
- package/test/session.spec.js +71 -52
- package/test/unidirectional-streams.spec.js +20 -4
- package/CMakeLists.txt +0 -991
- package/LICENSE.chromium +0 -27
- package/LICENSE.envoy +0 -207
- package/build.js +0 -313
- package/dist/lib/client.d.ts +0 -78
- package/dist/lib/client.d.ts.map +0 -1
- package/dist/lib/dom.d.ts +0 -87
- package/dist/lib/dom.d.ts.map +0 -1
- package/dist/lib/error.d.ts +0 -8
- package/dist/lib/error.d.ts.map +0 -1
- package/dist/lib/event-loop.d.ts +0 -33
- package/dist/lib/event-loop.d.ts.map +0 -1
- package/dist/lib/index.d.ts +0 -79
- package/dist/lib/index.d.ts.map +0 -1
- package/dist/lib/native.d.ts +0 -2
- package/dist/lib/native.d.ts.map +0 -1
- package/dist/lib/server.d.ts +0 -92
- package/dist/lib/server.d.ts.map +0 -1
- package/dist/lib/session.d.ts +0 -298
- package/dist/lib/session.d.ts.map +0 -1
- package/dist/lib/stream.d.ts +0 -135
- package/dist/lib/stream.d.ts.map +0 -1
- package/dist/lib/transport.d.ts +0 -34
- package/dist/lib/transport.d.ts.map +0 -1
- package/dist/lib/types.d.ts +0 -212
- package/dist/lib/types.d.ts.map +0 -1
- package/dist/lib/utils.d.ts +0 -11
- package/dist/lib/utils.d.ts.map +0 -1
- package/dist/lib/webtransport.d.ts +0 -47
- package/dist/lib/webtransport.d.ts.map +0 -1
- package/dist/test/bidirectional-streams.spec.d.ts +0 -5
- package/dist/test/bidirectional-streams.spec.d.ts.map +0 -1
- package/dist/test/datagrams.spec.d.ts +0 -5
- package/dist/test/datagrams.spec.d.ts.map +0 -1
- package/dist/test/event-loop.node.d.ts +0 -2
- package/dist/test/event-loop.node.d.ts.map +0 -1
- package/dist/test/fixtures/certificate.d.ts +0 -21
- package/dist/test/fixtures/certificate.d.ts.map +0 -1
- package/dist/test/fixtures/chai.d.ts +0 -2
- package/dist/test/fixtures/chai.d.ts.map +0 -1
- package/dist/test/fixtures/known-bytes.d.ts +0 -6
- package/dist/test/fixtures/known-bytes.d.ts.map +0 -1
- package/dist/test/fixtures/p-timeout.d.ts +0 -8
- package/dist/test/fixtures/p-timeout.d.ts.map +0 -1
- package/dist/test/fixtures/read-cert-hash.d.ts +0 -6
- package/dist/test/fixtures/read-cert-hash.d.ts.map +0 -1
- package/dist/test/fixtures/read-stream.d.ts +0 -19
- package/dist/test/fixtures/read-stream.d.ts.map +0 -1
- package/dist/test/fixtures/reader-value.d.ts +0 -22
- package/dist/test/fixtures/reader-value.d.ts.map +0 -1
- package/dist/test/fixtures/server.d.ts +0 -5
- package/dist/test/fixtures/server.d.ts.map +0 -1
- package/dist/test/fixtures/webtransport.browser.d.ts +0 -3
- package/dist/test/fixtures/webtransport.browser.d.ts.map +0 -1
- package/dist/test/fixtures/webtransport.d.ts +0 -3
- package/dist/test/fixtures/webtransport.d.ts.map +0 -1
- package/dist/test/fixtures/write-stream.d.ts +0 -10
- package/dist/test/fixtures/write-stream.d.ts.map +0 -1
- package/dist/test/index.d.ts +0 -2
- package/dist/test/index.d.ts.map +0 -1
- package/dist/test/session.spec.d.ts +0 -5
- package/dist/test/session.spec.d.ts.map +0 -1
- package/dist/test/unidirectional-streams.spec.d.ts +0 -2
- package/dist/test/unidirectional-streams.spec.d.ts.map +0 -1
- package/failslogolicensereadme.txt +0 -4
- package/lib/event-loop.js +0 -88
- package/lib/native.js +0 -28
- package/lib/transport.js +0 -82
- package/platform/icufix/fakedata.cpp +0 -8
- package/platform/quiche/quic/core/io/socket_win.inc +0 -3
- package/platform/quiche_platform_impl/quiche_bug_tracker_impl.h +0 -7
- package/platform/quiche_platform_impl/quiche_client_stats_impl.h +0 -7
- package/platform/quiche_platform_impl/quiche_command_line_flags_impl.h +0 -7
- package/platform/quiche_platform_impl/quiche_containers_impl.h +0 -7
- package/platform/quiche_platform_impl/quiche_event_loop_impl.h +0 -7
- package/platform/quiche_platform_impl/quiche_export_impl.h +0 -6
- package/platform/quiche_platform_impl/quiche_flag_utils_impl.h +0 -11
- package/platform/quiche_platform_impl/quiche_flags_impl.h +0 -8
- package/platform/quiche_platform_impl/quiche_iovec_impl.h +0 -10
- package/platform/quiche_platform_impl/quiche_logging_impl.h +0 -21
- package/platform/quiche_platform_impl/quiche_mem_slice_impl.h +0 -2
- package/platform/quiche_platform_impl/quiche_mutex_impl.h +0 -8
- package/platform/quiche_platform_impl/quiche_prefetch_impl.h +0 -11
- package/platform/quiche_platform_impl/quiche_reference_counted_impl.h +0 -16
- package/platform/quiche_platform_impl/quiche_server_stats_impl.h +0 -7
- package/platform/quiche_platform_impl/quiche_stack_trace_impl.h +0 -12
- package/platform/quiche_platform_impl/quiche_stream_buffer_allocator_impl.h +0 -8
- package/platform/quiche_platform_impl/quiche_testvalue_impl.h +0 -1
- package/platform/quiche_platform_impl/quiche_thread_local_impl.h +0 -6
- package/platform/quiche_platform_impl/quiche_time_utils_impl.h +0 -13
- package/platform/quiche_platform_impl/quiche_udp_socket_platform_impl.h +0 -39
- package/src/http3backendresponse.cc +0 -36
- package/src/http3backendresponse.h +0 -109
- package/src/http3client.cc +0 -1529
- package/src/http3client.h +0 -557
- package/src/http3clientsession.cc +0 -65
- package/src/http3clientsession.h +0 -60
- package/src/http3clientstream.cc +0 -52
- package/src/http3clientstream.h +0 -42
- package/src/http3dispatcher.cc +0 -62
- package/src/http3dispatcher.h +0 -57
- package/src/http3eventloop.cc +0 -1107
- package/src/http3eventloop.h +0 -316
- package/src/http3server.cc +0 -514
- package/src/http3server.h +0 -151
- package/src/http3serverbackend.cc +0 -105
- package/src/http3serverbackend.h +0 -98
- package/src/http3serversession.cc +0 -123
- package/src/http3serversession.h +0 -95
- package/src/http3serverstream.cc +0 -463
- package/src/http3serverstream.h +0 -114
- package/src/http3sessioncache.cc +0 -85
- package/src/http3sessioncache.h +0 -59
- package/src/http3wtsessionvisitor.cc +0 -46
- package/src/http3wtsessionvisitor.h +0 -397
- package/src/http3wtstreamvisitor.cc +0 -155
- package/src/http3wtstreamvisitor.h +0 -404
- package/test/event-loop.node.js +0 -24
- package/tsconfig.json +0 -39
package/src/http3eventloop.cc
DELETED
|
@@ -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
|
-
}
|