@fails-components/webtransport 1.6.7 → 1.6.9

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,10 +1,15 @@
1
+ import { ParserBaseHttp2 } from '../parserbasehttp2.js'
1
2
  import {
2
- ParserBaseHttp2,
3
+ lengthVarInt,
3
4
  readVarInt,
4
5
  readUint32,
5
- writeVarInt
6
- } from '../parserbasehttp2.js'
7
- import { lengthVarInt } from '../parserbase.js'
6
+ writeVarInt,
7
+ advanceBufferToOffset,
8
+ getUint8ArrayfromBuffer,
9
+ getUint8ArraysfromBuffer,
10
+ advanceBufferBy,
11
+ detachReadBuffers
12
+ } from '../bufferHelper.js'
8
13
 
9
14
  export class Http2CapsuleParser extends ParserBaseHttp2 {
10
15
  /**
@@ -31,37 +36,43 @@ export class Http2CapsuleParser extends ParserBaseHttp2 {
31
36
  streamReceiveWindowSizeLimit
32
37
  })
33
38
  this.mode = 's' // capsule start
34
- /** @type {Buffer|undefined} */
35
- this.saveddata = undefined
39
+ this.bufferstate = {
40
+ /** @type {number} */
41
+ offset: 0,
42
+ /** @type {number} */
43
+ size: 0,
44
+ /** @type {Uint8Array[]} */
45
+ buffer: [],
46
+ /** @type {number} */
47
+ curBuf: 0,
48
+ /** @type {number} */
49
+ curBufOffset: 0
50
+ }
36
51
  /** @type {Number|undefined} */
37
52
  this.rtype = undefined
38
53
  }
39
54
 
40
55
  /**
41
- * @param {Buffer} data
56
+ * @param {Uint8Array[]} data
42
57
  */
43
58
  parseData(data) {
44
- let cdata = data
45
- if (this.saveddata) {
46
- cdata = Buffer.concat([this.saveddata, cdata])
47
- delete this.saveddata
48
- }
49
- const bufferstate = { offset: 0, size: cdata.length, buffer: cdata }
59
+ const bufferstate = this.bufferstate
60
+ bufferstate.buffer.push(...data)
61
+ bufferstate.size += data.reduce((sum, chunk) => sum + chunk.byteLength, 0)
62
+
50
63
  while (bufferstate.size - bufferstate.offset > 0) {
51
64
  switch (this.mode) {
52
65
  case 's':
53
66
  {
54
- const capsulestart =
55
- bufferstate.offset + bufferstate.buffer.byteOffset
56
- const capsulemaxlength =
57
- bufferstate.buffer.byteLength - bufferstate.offset
67
+ const capsulestart = bufferstate.offset
68
+ const capsuleCurBuf = bufferstate.curBuf
69
+ const capsuleCurBufOffset = bufferstate.curBufOffset
58
70
  // we are at capsule start
59
71
  if (bufferstate.size < 2 + bufferstate.offset) {
60
- this.saveddata = Buffer.from(
61
- bufferstate.buffer.buffer,
62
- capsulestart,
63
- capsulemaxlength
64
- )
72
+ bufferstate.offset = capsulestart
73
+ bufferstate.curBuf = capsuleCurBuf
74
+ bufferstate.curBufOffset = capsuleCurBufOffset
75
+ detachReadBuffers(bufferstate)
65
76
  return
66
77
  }
67
78
  const rtype = readVarInt(bufferstate)
@@ -69,21 +80,19 @@ export class Http2CapsuleParser extends ParserBaseHttp2 {
69
80
  typeof rtype === 'undefined' ||
70
81
  bufferstate.size < 1 + bufferstate.offset
71
82
  ) {
72
- this.saveddata = Buffer.from(
73
- bufferstate.buffer.buffer,
74
- capsulestart,
75
- capsulemaxlength
76
- )
83
+ bufferstate.offset = capsulestart
84
+ bufferstate.curBuf = capsuleCurBuf
85
+ bufferstate.curBufOffset = capsuleCurBufOffset
86
+ detachReadBuffers(bufferstate)
77
87
  return
78
88
  }
79
89
  const type = Number(rtype)
80
90
  const rlength = readVarInt(bufferstate)
81
91
  if (typeof rlength === 'undefined') {
82
- this.saveddata = Buffer.from(
83
- bufferstate.buffer.buffer,
84
- capsulestart,
85
- capsulemaxlength
86
- )
92
+ bufferstate.offset = capsulestart
93
+ bufferstate.curBuf = capsuleCurBuf
94
+ bufferstate.curBufOffset = capsuleCurBufOffset
95
+ detachReadBuffers(bufferstate)
87
96
  return
88
97
  }
89
98
  const length = Number(rlength)
@@ -114,11 +123,10 @@ export class Http2CapsuleParser extends ParserBaseHttp2 {
114
123
  return
115
124
  }
116
125
  if (bufferstate.size < checklength + bufferstate.offset) {
117
- this.saveddata = Buffer.from(
118
- bufferstate.buffer.buffer,
119
- capsulestart,
120
- capsulemaxlength
121
- )
126
+ bufferstate.offset = capsulestart
127
+ bufferstate.curBuf = capsuleCurBuf
128
+ bufferstate.curBufOffset = capsuleCurBufOffset
129
+ detachReadBuffers(bufferstate)
122
130
  return
123
131
  }
124
132
  let streamid
@@ -171,10 +179,8 @@ export class Http2CapsuleParser extends ParserBaseHttp2 {
171
179
  object.recvData({
172
180
  data:
173
181
  offsetend - bufferstate.offset > 0
174
- ? new Uint8Array(
175
- bufferstate.buffer.buffer,
176
- bufferstate.buffer.byteOffset +
177
- bufferstate.offset,
182
+ ? getUint8ArraysfromBuffer(
183
+ bufferstate,
178
184
  offsetend - bufferstate.offset
179
185
  )
180
186
  : undefined,
@@ -228,9 +234,8 @@ export class Http2CapsuleParser extends ParserBaseHttp2 {
228
234
  const code = readUint32(bufferstate) || 0
229
235
  const decoder = new TextDecoder()
230
236
  const reason = decoder.decode(
231
- new Uint8Array(
232
- bufferstate.buffer.buffer,
233
- bufferstate.buffer.byteOffset + bufferstate.offset,
237
+ getUint8ArrayfromBuffer(
238
+ bufferstate,
234
239
  offsetend - bufferstate.offset
235
240
  )
236
241
  )
@@ -242,11 +247,11 @@ export class Http2CapsuleParser extends ParserBaseHttp2 {
242
247
  break
243
248
  case Http2CapsuleParser.DATAGRAM:
244
249
  this.session.jsobj.onDatagramReceived({
245
- datagram: new Uint8Array(
246
- bufferstate.buffer.buffer,
247
- bufferstate.buffer.byteOffset + bufferstate.offset,
248
- offsetend - bufferstate.offset
249
- )
250
+ datagram:
251
+ getUint8ArrayfromBuffer(
252
+ bufferstate,
253
+ offsetend - bufferstate.offset
254
+ ) || new Uint8Array(0)
250
255
  })
251
256
  break
252
257
  default:
@@ -256,12 +261,12 @@ export class Http2CapsuleParser extends ParserBaseHttp2 {
256
261
  if (bufferstate.size < length + offsetbegin) {
257
262
  this.remainlength = length + offsetbegin - bufferstate.size
258
263
  this.mode = 'c'
259
- if (streamid) {
264
+ if (typeof streamid !== 'undefined') {
260
265
  this.rstreamid = streamid
261
266
  this.rfin = type === Http2CapsuleParser.WT_STREAM_WFIN
262
267
  }
263
268
  }
264
- bufferstate.offset = offsetend
269
+ advanceBufferToOffset(bufferstate, offsetend)
265
270
  }
266
271
  break
267
272
  case 'c':
@@ -270,7 +275,7 @@ export class Http2CapsuleParser extends ParserBaseHttp2 {
270
275
  bufferstate.size - bufferstate.offset,
271
276
  this.remainlength
272
277
  )
273
- if (this.rstreamid) {
278
+ if (typeof this.rstreamid !== 'undefined') {
274
279
  // TODO submitData
275
280
  const object = this.wtstreams.get(this.rstreamid)
276
281
  const fin =
@@ -280,18 +285,14 @@ export class Http2CapsuleParser extends ParserBaseHttp2 {
280
285
  if (object) {
281
286
  if (fin) object.onFin()
282
287
  object.recvData({
283
- data: new Uint8Array(
284
- bufferstate.buffer.buffer,
285
- bufferstate.buffer.byteOffset + bufferstate.offset,
286
- clength
287
- ),
288
+ data: getUint8ArraysfromBuffer(bufferstate, clength),
288
289
  fin
289
290
  })
290
291
  }
291
292
  }
292
293
 
293
294
  this.remainlength = this.remainlength - clength
294
- bufferstate.offset += clength
295
+ advanceBufferBy(bufferstate, clength)
295
296
  if (this.remainlength === 0) {
296
297
  this.mode = 's'
297
298
  delete this.rfin
@@ -301,6 +302,7 @@ export class Http2CapsuleParser extends ParserBaseHttp2 {
301
302
  break
302
303
  }
303
304
  }
305
+ detachReadBuffers(bufferstate)
304
306
  }
305
307
 
306
308
  /**
@@ -312,8 +314,14 @@ export class Http2CapsuleParser extends ParserBaseHttp2 {
312
314
  let headlength = length
313
315
  if (payload) length += payload.byteLength
314
316
  headlength += lengthVarInt(length) + lengthVarInt(type)
315
- const cdata = Buffer.alloc(headlength)
316
- const bufferstate = { offset: 0, size: cdata.length, buffer: cdata }
317
+ const cdata = new Uint8Array(headlength)
318
+ const bufferstate = {
319
+ offset: 0,
320
+ size: cdata.length,
321
+ buffer: [cdata],
322
+ curBuf: 0,
323
+ curBufOffset: 0
324
+ }
317
325
  writeVarInt(bufferstate, type)
318
326
  writeVarInt(bufferstate, length)
319
327
  for (const ind in headerVints) writeVarInt(bufferstate, headerVints[ind])
@@ -558,7 +558,7 @@ export class Http2WebTransportServer {
558
558
  streamReceiveWindowSizeLimit:
559
559
  this.streamFlowControlWindowSizeLimit
560
560
  }))
561
- if (head && head.byteLength > 0) parse.parseData(head)
561
+ if (head && head.byteLength > 0) parse.parseData([head])
562
562
  return parse
563
563
  },
564
564
  initialBidirectionalSendStreams: 0,