@fails-components/webtransport-transport-http3-quiche 1.0.9 → 1.0.11
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/dist/lib/index.d.ts +2 -1
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/socket.d.ts.map +1 -1
- package/dist/lib/types.d.ts +7 -1
- package/dist/lib/types.d.ts.map +1 -1
- package/lib/index.js +5 -1
- package/lib/socket.js +6 -2
- package/lib/types.ts +8 -2
- package/package.json +1 -1
- package/src/http3client.cc +5 -8
- package/src/http3client.h +4 -0
- package/src/http3wtstreamvisitor.cc +39 -14
- package/src/http3wtstreamvisitor.h +1 -0
- package/src/librarymain.cc +1 -1
package/dist/lib/index.d.ts
CHANGED
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
export const wtrouter: any;
|
|
2
2
|
export const quicheInit: any;
|
|
3
3
|
export function checkQuicheInit(args?: {
|
|
4
|
-
quicheLogVerbose?:
|
|
4
|
+
quicheLogVerbose?: import("./types.js").QUICHE_LOG | undefined;
|
|
5
5
|
path?: string | undefined;
|
|
6
6
|
} | undefined): void;
|
|
7
7
|
export const Http3WebTransportClient: any;
|
|
8
8
|
export const Http3WebTransportServer: any;
|
|
9
9
|
export { Http3WebTransportClientSocket } from "./clientsocket.js";
|
|
10
10
|
export { Http3WebTransportServerSocket } from "./serversocket.js";
|
|
11
|
+
export type QUICHE_LOG = import('./types.js').QUICHE_LOG;
|
|
11
12
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../lib/index.js"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../lib/index.js"],"names":[],"mappings":"AA8BA,2BAAuC;AACvC,6BAA6C;AAOtC;;;qBAON;AAED,0CAAuE;AACvE,0CAAuE;;;yBAxC1D,OAAO,YAAY,EAAE,UAAU"}
|
package/dist/lib/socket.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"socket.d.ts","sourceRoot":"","sources":["../../lib/socket.js"],"names":[],"mappings":"AAqEA;IACE;;OAEG;IACH,kBAFW,OAAO,4BAA4B,EAAE,oBAAoB,GAAC,SAAS,EAa7E;IAVC,0CAA0C;IAE1C,WAFW,OAAO,YAAY,EAAE,MAAM,CAEZ;IAE1B,UAAqB;IACrB,oBAAuB;IAgCzB,
|
|
1
|
+
{"version":3,"file":"socket.d.ts","sourceRoot":"","sources":["../../lib/socket.js"],"names":[],"mappings":"AAqEA;IACE;;OAEG;IACH,kBAFW,OAAO,4BAA4B,EAAE,oBAAoB,GAAC,SAAS,EAa7E;IAVC,0CAA0C;IAE1C,WAFW,OAAO,YAAY,EAAE,MAAM,CAEZ;IAE1B,UAAqB;IACrB,oBAAuB;IAgCzB,qBASC;IAlCD,+BAGC;IAPC,iBAAoB;IACpB,gBAAmB;IAQrB;;OAEG;IAEH,mDAHW,OAAO,SAAS,EAAE,mBAAmB,WAiB/C;CAYF"}
|
package/dist/lib/types.d.ts
CHANGED
|
@@ -11,10 +11,16 @@ export interface Logger {
|
|
|
11
11
|
error: (formatter: any, ...args: any[]) => void;
|
|
12
12
|
trace: (formatter: any, ...args: any[]) => void;
|
|
13
13
|
}
|
|
14
|
+
export type QUICHE_LOG_OFF = -1;
|
|
15
|
+
export type QUICHE_LOG_INFO = 0;
|
|
16
|
+
export type QUICHE_LOG_WARNING = 1;
|
|
17
|
+
export type QUICHE_LOG_ERROR = 2;
|
|
18
|
+
export type QUICHE_LOG_FATAL = 3;
|
|
19
|
+
export type QUICHE_LOG = QUICHE_LOG_OFF | QUICHE_LOG_INFO | QUICHE_LOG_WARNING | QUICHE_LOG_ERROR | QUICHE_LOG_FATAL;
|
|
14
20
|
export interface HttpWebTransportInit extends WebTransportOptions {
|
|
15
21
|
host: string;
|
|
16
22
|
port: string | number;
|
|
17
|
-
quicheLogVerbose?:
|
|
23
|
+
quicheLogVerbose?: QUICHE_LOG;
|
|
18
24
|
forceIpv6?: boolean;
|
|
19
25
|
localPort?: number;
|
|
20
26
|
}
|
package/dist/lib/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../lib/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,EACpB,MAAM,uBAAuB,CAAA;AAE9B,MAAM,WAAW,mBAAmB;IAChC,GAAG,EAAG,UAAU,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAC,MAAM,CAAA;IACX,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,MAAM;IACrB,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAA;IACtC,KAAK,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAA;IAC/C,KAAK,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAA;CAChD;
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../lib/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,mBAAmB,EACpB,MAAM,uBAAuB,CAAA;AAE9B,MAAM,WAAW,mBAAmB;IAChC,GAAG,EAAG,UAAU,CAAA;IAChB,MAAM,EAAE,MAAM,CAAA;IACd,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAC,MAAM,CAAA;IACX,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,MAAM;IACrB,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,IAAI,CAAA;IACtC,KAAK,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAA;IAC/C,KAAK,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,KAAK,IAAI,CAAA;CAChD;AAEH,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,CAAA;AAC/B,MAAM,MAAM,eAAe,GAAG,CAAC,CAAA;AAC/B,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAA;AAClC,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAA;AAChC,MAAM,MAAM,gBAAgB,GAAG,CAAC,CAAA;AAChC,MAAM,MAAM,UAAU,GAAG,cAAc,GAAG,eAAe,GAAG,kBAAkB,GAAG,gBAAgB,GAAG,gBAAgB,CAAA;AAElH,MAAM,WAAW,oBAAqB,SAAQ,mBAAmB;IAC/D,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,GAAG,MAAM,CAAA;IACrB,gBAAgB,CAAC,EAAE,UAAU,CAAA;IAC7B,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB"}
|
package/lib/index.js
CHANGED
|
@@ -5,6 +5,10 @@ import * as url from 'url'
|
|
|
5
5
|
import { arch, platform } from 'node:process'
|
|
6
6
|
import { logger } from './utils.js'
|
|
7
7
|
|
|
8
|
+
/**
|
|
9
|
+
* @typedef {import('./types.js').QUICHE_LOG} QUICHE_LOG
|
|
10
|
+
*/
|
|
11
|
+
|
|
8
12
|
const log = logger(`webtransport:native(${process?.pid})`)
|
|
9
13
|
|
|
10
14
|
const binplatform = platform + '_' + arch
|
|
@@ -30,7 +34,7 @@ export const quicheInit = wtrouter.quicheInit
|
|
|
30
34
|
let quicheInited = false
|
|
31
35
|
|
|
32
36
|
/**
|
|
33
|
-
* @param {{quicheLogVerbose?:
|
|
37
|
+
* @param {{quicheLogVerbose?: QUICHE_LOG, path?: string}} [args]
|
|
34
38
|
*/
|
|
35
39
|
export const checkQuicheInit = function (args) {
|
|
36
40
|
if (!quicheInited) {
|
package/lib/socket.js
CHANGED
|
@@ -110,8 +110,12 @@ export class Http3WebTransportSocket {
|
|
|
110
110
|
}
|
|
111
111
|
|
|
112
112
|
packetSendCB() {
|
|
113
|
-
|
|
114
|
-
|
|
113
|
+
if (
|
|
114
|
+
!this.closed &&
|
|
115
|
+
// @ts-ignore
|
|
116
|
+
this.socketInt.getSendQueueCount() === 0 &&
|
|
117
|
+
this.blocked
|
|
118
|
+
) {
|
|
115
119
|
this.cobj.onCanWrite()
|
|
116
120
|
}
|
|
117
121
|
}
|
package/lib/types.ts
CHANGED
|
@@ -16,11 +16,17 @@ export interface UDPServerSocketSend {
|
|
|
16
16
|
trace: (formatter: any, ...args: any[]) => void
|
|
17
17
|
}
|
|
18
18
|
|
|
19
|
+
export type QUICHE_LOG_OFF = -1
|
|
20
|
+
export type QUICHE_LOG_INFO = 0
|
|
21
|
+
export type QUICHE_LOG_WARNING = 1
|
|
22
|
+
export type QUICHE_LOG_ERROR = 2
|
|
23
|
+
export type QUICHE_LOG_FATAL = 3
|
|
24
|
+
export type QUICHE_LOG = QUICHE_LOG_OFF | QUICHE_LOG_INFO | QUICHE_LOG_WARNING | QUICHE_LOG_ERROR | QUICHE_LOG_FATAL
|
|
25
|
+
|
|
19
26
|
export interface HttpWebTransportInit extends WebTransportOptions {
|
|
20
27
|
host: string
|
|
21
28
|
port: string | number
|
|
22
|
-
quicheLogVerbose?:
|
|
29
|
+
quicheLogVerbose?: QUICHE_LOG
|
|
23
30
|
forceIpv6?: boolean
|
|
24
31
|
localPort?: number
|
|
25
32
|
}
|
|
26
|
-
|
package/package.json
CHANGED
package/src/http3client.cc
CHANGED
|
@@ -532,7 +532,7 @@ namespace quic
|
|
|
532
532
|
if (wait_for_encryption_)
|
|
533
533
|
{
|
|
534
534
|
if (EncryptionBeingEstablished())
|
|
535
|
-
return
|
|
535
|
+
return true;
|
|
536
536
|
wait_for_encryption_ = false;
|
|
537
537
|
ParsedQuicVersion version = UnsupportedQuicVersion();
|
|
538
538
|
if (session_ != nullptr && !CanReconnectWithDifferentVersion(&version) && !session_->connection()->connected())
|
|
@@ -569,11 +569,6 @@ namespace quic
|
|
|
569
569
|
recheck = true;
|
|
570
570
|
}
|
|
571
571
|
|
|
572
|
-
if (checkSession())
|
|
573
|
-
{
|
|
574
|
-
recheck = true;
|
|
575
|
-
}
|
|
576
|
-
|
|
577
572
|
return recheck;
|
|
578
573
|
}
|
|
579
574
|
|
|
@@ -826,16 +821,18 @@ namespace quic
|
|
|
826
821
|
|
|
827
822
|
if (client_->connectionrecheck_)
|
|
828
823
|
{
|
|
829
|
-
client_->connectionrecheck_ =
|
|
824
|
+
client_->connectionrecheck_ = client_->handleConnecting();
|
|
830
825
|
}
|
|
826
|
+
if (client_->needsToCheckForSession()) client_->checkSession();
|
|
831
827
|
}
|
|
832
828
|
|
|
833
829
|
void Http3ClientJS::onCanWrite(const Napi::CallbackInfo &info)
|
|
834
830
|
{
|
|
835
831
|
if (client_->connectionrecheck_)
|
|
836
832
|
{
|
|
837
|
-
client_->connectionrecheck_ =
|
|
833
|
+
client_->connectionrecheck_ = client_->handleConnecting();
|
|
838
834
|
}
|
|
835
|
+
if (client_->needsToCheckForSession()) client_->checkSession();
|
|
839
836
|
client_->OnCanWrite();
|
|
840
837
|
}
|
|
841
838
|
|
package/src/http3client.h
CHANGED
|
@@ -349,6 +349,10 @@ namespace quic
|
|
|
349
349
|
|
|
350
350
|
bool checkSession();
|
|
351
351
|
|
|
352
|
+
bool needsToCheckForSession() {
|
|
353
|
+
return finish_stream_open_.size() > 0 && session_->CanOpenNextOutgoingBidirectionalStream();
|
|
354
|
+
}
|
|
355
|
+
|
|
352
356
|
// Read oldest received response and remove it from closed_stream_states_.
|
|
353
357
|
// void ReadNextResponse();
|
|
354
358
|
|
|
@@ -83,34 +83,46 @@ namespace quic
|
|
|
83
83
|
void Http3WTStream::doCanRead()
|
|
84
84
|
{
|
|
85
85
|
// if (pause_reading_) return ; // back pressure folks!
|
|
86
|
+
WebTransportStream::PeekResult pr;
|
|
87
|
+
pr = stream_->PeekNextReadableRegion();
|
|
88
|
+
|
|
89
|
+
if (pr.fin_next && pr.peeked_data.size() == 0) {
|
|
90
|
+
bool fin = stream_->SkipBytes(0);
|
|
91
|
+
if (fin) {
|
|
92
|
+
getJS()->signalFinOnly();
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
86
96
|
|
|
87
97
|
if (pause_reading_ && !drain_reads_)
|
|
88
98
|
{
|
|
89
99
|
can_read_pending_ = true;
|
|
90
100
|
return; // back pressure folks!
|
|
91
101
|
}
|
|
92
|
-
size_t readable = stream_->ReadableBytes();
|
|
93
102
|
bool read = false;
|
|
94
|
-
while (
|
|
103
|
+
while (!pr.peeked_data.empty())
|
|
95
104
|
{
|
|
96
105
|
Http3WTStreamJS::StreamReadBuffer rbuf(js_);
|
|
97
|
-
rbuf.getBuffer(
|
|
106
|
+
rbuf.getBuffer(stream_->ReadableBytes());
|
|
98
107
|
|
|
99
108
|
size_t remainSize = rbuf.bufferSize();
|
|
100
109
|
uint32_t writepos = 0;
|
|
101
110
|
|
|
102
|
-
while (
|
|
103
|
-
size_t len = remainSize;
|
|
104
|
-
|
|
105
|
-
|
|
111
|
+
while (!pr.peeked_data.empty() && remainSize > 0) {
|
|
112
|
+
size_t len = std::min(remainSize, pr.peeked_data.size());
|
|
113
|
+
if (len > 0) memcpy(((char *)rbuf.bufferData()) + writepos,pr.peeked_data.data(), len);
|
|
114
|
+
bool fin = stream_->SkipBytes(len);
|
|
106
115
|
QUIC_DVLOG(1) << "Attempted reading on WebTransport stream "
|
|
107
|
-
<< ", bytes read: " <<
|
|
108
|
-
writepos +=
|
|
109
|
-
remainSize -=
|
|
110
|
-
|
|
111
|
-
if (
|
|
116
|
+
<< ", bytes read: " << len;
|
|
117
|
+
writepos += len;
|
|
118
|
+
remainSize -= len;
|
|
119
|
+
pr = stream_->PeekNextReadableRegion();
|
|
120
|
+
if (fin) {
|
|
121
|
+
rbuf.setFin();
|
|
122
|
+
break;
|
|
123
|
+
}
|
|
112
124
|
}
|
|
113
|
-
rbuf.commitBuffer(writepos,
|
|
125
|
+
rbuf.commitBuffer(writepos, pr.has_data());
|
|
114
126
|
}
|
|
115
127
|
}
|
|
116
128
|
|
|
@@ -142,8 +154,10 @@ namespace quic
|
|
|
142
154
|
if (send_fin_)
|
|
143
155
|
{
|
|
144
156
|
bool success = stream_->SendFin();
|
|
145
|
-
if (success)
|
|
157
|
+
if (success) {
|
|
146
158
|
fin_was_sent_ = true;
|
|
159
|
+
getJS()->processStreamNetworkFinish(NetworkTask::streamFinal);
|
|
160
|
+
}
|
|
147
161
|
}
|
|
148
162
|
}
|
|
149
163
|
|
|
@@ -165,6 +179,17 @@ namespace quic
|
|
|
165
179
|
}
|
|
166
180
|
}
|
|
167
181
|
|
|
182
|
+
|
|
183
|
+
void Http3WTStreamJS::signalFinOnly() {
|
|
184
|
+
Napi::HandleScope scope(Env());
|
|
185
|
+
Napi::Object retObj = Napi::Object::New(Env());
|
|
186
|
+
Napi::Object objVal = Value().Get("jsobj").As<Napi::Object>();
|
|
187
|
+
retObj.Set("fin", true);
|
|
188
|
+
Napi::Value bufferVal = objVal.Get("commitReadBuffer").As<Napi::Function>().Call(objVal, {retObj});
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
|
|
192
|
+
|
|
168
193
|
void Http3WTStreamJS::processStreamNetworkFinish(NetworkTask task)
|
|
169
194
|
{
|
|
170
195
|
Napi::HandleScope scope(Env());
|
|
@@ -317,6 +317,7 @@ namespace quic
|
|
|
317
317
|
void processStreamWrite(Napi::ObjectReference *bufferhandle, bool success);
|
|
318
318
|
void processStreamNetworkFinish(NetworkTask task);
|
|
319
319
|
void processStreamRecvSignal(WebTransportStreamError error_code, NetworkTask task);
|
|
320
|
+
void signalFinOnly();
|
|
320
321
|
};
|
|
321
322
|
}
|
|
322
323
|
|
package/src/librarymain.cc
CHANGED
|
@@ -38,7 +38,7 @@ namespace quic
|
|
|
38
38
|
}
|
|
39
39
|
|
|
40
40
|
quiche_cmd_line.push_back(std::string("-v"));
|
|
41
|
-
if (lobj.Has("quicheLogVerbose") && lobj.Get("quicheLogVerbose").
|
|
41
|
+
if (lobj.Has("quicheLogVerbose") && lobj.Get("quicheLogVerbose").IsNumber())
|
|
42
42
|
{
|
|
43
43
|
Napi::Value verboseValue = (lobj).Get("quicheLogVerbose");
|
|
44
44
|
quiche_cmd_line.push_back(verboseValue.ToString().Utf8Value());
|