@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.
@@ -1,11 +1,12 @@
1
1
  export const wtrouter: any;
2
2
  export const quicheInit: any;
3
3
  export function checkQuicheInit(args?: {
4
- quicheLogVerbose?: number | undefined;
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
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../lib/index.js"],"names":[],"mappings":"AA0BA,2BAAuC;AACvC,6BAA6C;AAOtC;;;qBAON;AAED,0CAAuE;AACvE,0CAAuE"}
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"}
@@ -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,qBAKC;IA9BD,+BAGC;IAPC,iBAAoB;IACpB,gBAAmB;IAQrB;;OAEG;IAEH,mDAHW,OAAO,SAAS,EAAE,mBAAmB,WAiB/C;CAQF"}
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"}
@@ -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?: number;
23
+ quicheLogVerbose?: QUICHE_LOG;
18
24
  forceIpv6?: boolean;
19
25
  localPort?: number;
20
26
  }
@@ -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;AAED,MAAM,WAAW,oBAAqB,SAAQ,mBAAmB;IAC/D,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,GAAG,MAAM,CAAA;IACrB,gBAAgB,CAAC,EAAE,MAAM,CAAA;IACzB,SAAS,CAAC,EAAE,OAAO,CAAA;IACnB,SAAS,CAAC,EAAE,MAAM,CAAA;CACnB"}
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?: Number, path?: string}} [args]
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
- // @ts-ignore
114
- if (this.socketInt.getSendQueueCount() === 0 && this.blocked) {
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?: number
29
+ quicheLogVerbose?: QUICHE_LOG
23
30
  forceIpv6?: boolean
24
31
  localPort?: number
25
32
  }
26
-
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fails-components/webtransport-transport-http3-quiche",
3
- "version": "1.0.9",
3
+ "version": "1.0.11",
4
4
  "description": "A component to add webtransport support (server and client) to node.js, transport using libquiche",
5
5
  "exports": {
6
6
  ".": {
@@ -532,7 +532,7 @@ namespace quic
532
532
  if (wait_for_encryption_)
533
533
  {
534
534
  if (EncryptionBeingEstablished())
535
- return false;
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_ = !client_->handleConnecting();
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_ = !client_->handleConnecting();
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 (readable > 0)
103
+ while (!pr.peeked_data.empty())
95
104
  {
96
105
  Http3WTStreamJS::StreamReadBuffer rbuf(js_);
97
- rbuf.getBuffer(readable);
106
+ rbuf.getBuffer(stream_->ReadableBytes());
98
107
 
99
108
  size_t remainSize = rbuf.bufferSize();
100
109
  uint32_t writepos = 0;
101
110
 
102
- while (readable > 0 && remainSize > 0) {
103
- size_t len = remainSize;
104
- WebTransportStream::ReadResult result =
105
- stream_->Read(absl::Span<char>(((char *)rbuf.bufferData()) + writepos, len));
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: " << result.bytes_read;
108
- writepos += result.bytes_read;
109
- remainSize -= result.bytes_read;
110
- readable = stream_->ReadableBytes();
111
- if (result.fin) rbuf.setFin();
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, readable == 0);
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
 
@@ -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").IsFunction())
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());