werift 0.24.4 → 0.25.0-alpha.0
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/README.md +116 -113
- package/lib/common/src/transport.d.ts +22 -2
- package/lib/common/src/transport.js +84 -26
- package/lib/common/src/transport.js.map +1 -1
- package/lib/ice/src/exceptions.d.ts +9 -0
- package/lib/ice/src/exceptions.js +23 -1
- package/lib/ice/src/exceptions.js.map +1 -1
- package/lib/ice/src/ice.d.ts +40 -0
- package/lib/ice/src/ice.js +194 -28
- package/lib/ice/src/ice.js.map +1 -1
- package/lib/ice/src/iceBase.d.ts +26 -0
- package/lib/ice/src/iceBase.js.map +1 -1
- package/lib/ice/src/stun/const.d.ts +7 -0
- package/lib/ice/src/stun/const.js +8 -0
- package/lib/ice/src/stun/const.js.map +1 -1
- package/lib/ice/src/stun/protocol.js +1 -4
- package/lib/ice/src/stun/protocol.js.map +1 -1
- package/lib/ice/src/stun/tcpProtocol.d.ts +7 -1
- package/lib/ice/src/stun/tcpProtocol.js +65 -14
- package/lib/ice/src/stun/tcpProtocol.js.map +1 -1
- package/lib/ice/src/stun/transaction.d.ts +12 -1
- package/lib/ice/src/stun/transaction.js +37 -4
- package/lib/ice/src/stun/transaction.js.map +1 -1
- package/lib/ice/src/turn/protocol.d.ts +40 -15
- package/lib/ice/src/turn/protocol.js +141 -32
- package/lib/ice/src/turn/protocol.js.map +1 -1
- package/lib/ice/src/types/model.d.ts +8 -0
- package/lib/ice/src/types/model.js.map +1 -1
- package/lib/index.mjs +6175 -4073
- package/lib/nonstandard/index.mjs +286 -1003
- package/lib/polyfill/dom.mjs +23794 -0
- package/lib/polyfill/index.mjs +23794 -0
- package/lib/rtp/src/extra/container/mp4/container.js +12 -4
- package/lib/rtp/src/extra/container/mp4/container.js.map +1 -1
- package/lib/rtp/src/extra/processor/mp4.js +8 -3
- package/lib/rtp/src/extra/processor/mp4.js.map +1 -1
- package/lib/rtp/src/extra/processor/mp4Callback.js +3 -1
- package/lib/rtp/src/extra/processor/mp4Callback.js.map +1 -1
- package/lib/sctp/src/chunk.d.ts +5 -0
- package/lib/sctp/src/chunk.js +16 -11
- package/lib/sctp/src/chunk.js.map +1 -1
- package/lib/sctp/src/index.d.ts +3 -1
- package/lib/sctp/src/index.js +10 -1
- package/lib/sctp/src/index.js.map +1 -1
- package/lib/sctp/src/sctp.d.ts +12 -3
- package/lib/sctp/src/sctp.js +51 -18
- package/lib/sctp/src/sctp.js.map +1 -1
- package/lib/webrtc/src/const.js +2 -0
- package/lib/webrtc/src/const.js.map +1 -1
- package/lib/webrtc/src/errors.d.ts +9 -1
- package/lib/webrtc/src/errors.js +19 -0
- package/lib/webrtc/src/errors.js.map +1 -1
- package/lib/webrtc/src/media/codec.d.ts +5 -0
- package/lib/webrtc/src/media/codec.js +21 -0
- package/lib/webrtc/src/media/codec.js.map +1 -1
- package/lib/webrtc/src/media/codecCompatibility.d.ts +23 -0
- package/lib/webrtc/src/media/codecCompatibility.js +138 -0
- package/lib/webrtc/src/media/codecCompatibility.js.map +1 -0
- package/lib/webrtc/src/media/index.d.ts +1 -0
- package/lib/webrtc/src/media/index.js +1 -0
- package/lib/webrtc/src/media/index.js.map +1 -1
- package/lib/webrtc/src/media/router.d.ts +2 -0
- package/lib/webrtc/src/media/router.js +23 -3
- package/lib/webrtc/src/media/router.js.map +1 -1
- package/lib/webrtc/src/media/rtpReceiver.d.ts +12 -0
- package/lib/webrtc/src/media/rtpReceiver.js +35 -0
- package/lib/webrtc/src/media/rtpReceiver.js.map +1 -1
- package/lib/webrtc/src/media/rtpSender.d.ts +65 -4
- package/lib/webrtc/src/media/rtpSender.js +264 -35
- package/lib/webrtc/src/media/rtpSender.js.map +1 -1
- package/lib/webrtc/src/media/rtpTransceiver.d.ts +42 -0
- package/lib/webrtc/src/media/rtpTransceiver.js +157 -4
- package/lib/webrtc/src/media/rtpTransceiver.js.map +1 -1
- package/lib/webrtc/src/media/track.d.ts +29 -1
- package/lib/webrtc/src/media/track.js +164 -5
- package/lib/webrtc/src/media/track.js.map +1 -1
- package/lib/webrtc/src/nonstandard/index.d.ts +0 -1
- package/lib/webrtc/src/nonstandard/index.js +0 -1
- package/lib/webrtc/src/nonstandard/index.js.map +1 -1
- package/lib/webrtc/src/nonstandard/recorder/writer/webm.js +2 -1
- package/lib/webrtc/src/nonstandard/recorder/writer/webm.js.map +1 -1
- package/lib/webrtc/src/nonstandard/userMedia.d.ts +1 -2
- package/lib/webrtc/src/nonstandard/userMedia.js +30 -14
- package/lib/webrtc/src/nonstandard/userMedia.js.map +1 -1
- package/lib/webrtc/src/peerConnection.d.ts +126 -5
- package/lib/webrtc/src/peerConnection.js +609 -136
- package/lib/webrtc/src/peerConnection.js.map +1 -1
- package/lib/webrtc/src/polyfill/api.d.ts +14 -0
- package/lib/webrtc/src/polyfill/api.js +23 -0
- package/lib/webrtc/src/polyfill/api.js.map +1 -0
- package/lib/webrtc/src/polyfill/browserIdentity.d.ts +11 -0
- package/lib/webrtc/src/polyfill/browserIdentity.js +59 -0
- package/lib/webrtc/src/polyfill/browserIdentity.js.map +1 -0
- package/lib/webrtc/src/polyfill/dom.d.ts +11 -0
- package/lib/webrtc/src/polyfill/dom.js +18 -0
- package/lib/webrtc/src/polyfill/dom.js.map +1 -0
- package/lib/webrtc/src/polyfill/existingMediaDevices.d.ts +2 -0
- package/lib/webrtc/src/polyfill/existingMediaDevices.js +22 -0
- package/lib/webrtc/src/polyfill/existingMediaDevices.js.map +1 -0
- package/lib/webrtc/src/polyfill/globals.d.ts +28 -0
- package/lib/webrtc/src/polyfill/globals.js +3 -0
- package/lib/webrtc/src/polyfill/globals.js.map +1 -0
- package/lib/webrtc/src/polyfill/index.d.ts +2 -0
- package/lib/webrtc/src/polyfill/index.js +19 -0
- package/lib/webrtc/src/polyfill/index.js.map +1 -0
- package/lib/webrtc/src/polyfill/install.d.ts +13 -0
- package/lib/webrtc/src/polyfill/install.js +266 -0
- package/lib/webrtc/src/polyfill/install.js.map +1 -0
- package/lib/webrtc/src/polyfill/mediaDevices.d.ts +38 -0
- package/lib/webrtc/src/polyfill/mediaDevices.js +228 -0
- package/lib/webrtc/src/polyfill/mediaDevices.js.map +1 -0
- package/lib/webrtc/src/polyfill/mediaRegister.d.ts +51 -0
- package/lib/webrtc/src/polyfill/mediaRegister.js +14 -0
- package/lib/webrtc/src/polyfill/mediaRegister.js.map +1 -0
- package/lib/webrtc/src/polyfill/peerConnectionConfig.d.ts +3 -0
- package/lib/webrtc/src/polyfill/peerConnectionConfig.js +52 -0
- package/lib/webrtc/src/polyfill/peerConnectionConfig.js.map +1 -0
- package/lib/webrtc/src/polyfill/registers/callback.d.ts +16 -0
- package/lib/webrtc/src/polyfill/registers/callback.js +57 -0
- package/lib/webrtc/src/polyfill/registers/callback.js.map +1 -0
- package/lib/webrtc/src/polyfill/registers/empty.d.ts +2 -0
- package/lib/webrtc/src/polyfill/registers/empty.js +28 -0
- package/lib/webrtc/src/polyfill/registers/empty.js.map +1 -0
- package/lib/webrtc/src/polyfill/registers/mp4Webm.d.ts +36 -0
- package/lib/webrtc/src/polyfill/registers/mp4Webm.js +242 -0
- package/lib/webrtc/src/polyfill/registers/mp4Webm.js.map +1 -0
- package/lib/webrtc/src/polyfill/registers/rtpRtcp.d.ts +17 -0
- package/lib/webrtc/src/polyfill/registers/rtpRtcp.js +143 -0
- package/lib/webrtc/src/polyfill/registers/rtpRtcp.js.map +1 -0
- package/lib/webrtc/src/polyfill/rtcSessionDescription.d.ts +18 -0
- package/lib/webrtc/src/polyfill/rtcSessionDescription.js +36 -0
- package/lib/webrtc/src/polyfill/rtcSessionDescription.js.map +1 -0
- package/lib/webrtc/src/polyfill/rtpCodec.d.ts +17 -0
- package/lib/webrtc/src/polyfill/rtpCodec.js +93 -0
- package/lib/webrtc/src/polyfill/rtpCodec.js.map +1 -0
- package/lib/webrtc/src/polyfill/selectSettings.d.ts +31 -0
- package/lib/webrtc/src/polyfill/selectSettings.js +156 -0
- package/lib/webrtc/src/polyfill/selectSettings.js.map +1 -0
- package/lib/webrtc/src/polyfill/sourceIo.d.ts +21 -0
- package/lib/webrtc/src/polyfill/sourceIo.js +298 -0
- package/lib/webrtc/src/polyfill/sourceIo.js.map +1 -0
- package/lib/webrtc/src/polyfill/trackStop.d.ts +4 -0
- package/lib/webrtc/src/polyfill/trackStop.js +16 -0
- package/lib/webrtc/src/polyfill/trackStop.js.map +1 -0
- package/lib/webrtc/src/sctpManager.d.ts +2 -1
- package/lib/webrtc/src/sctpManager.js +5 -2
- package/lib/webrtc/src/sctpManager.js.map +1 -1
- package/lib/webrtc/src/sdp.d.ts +1 -1
- package/lib/webrtc/src/sdp.js +5 -6
- package/lib/webrtc/src/sdp.js.map +1 -1
- package/lib/webrtc/src/sdpManager.d.ts +38 -1
- package/lib/webrtc/src/sdpManager.js +236 -30
- package/lib/webrtc/src/sdpManager.js.map +1 -1
- package/lib/webrtc/src/secureTransportManager.d.ts +43 -12
- package/lib/webrtc/src/secureTransportManager.js +123 -47
- package/lib/webrtc/src/secureTransportManager.js.map +1 -1
- package/lib/webrtc/src/transceiverManager.d.ts +91 -6
- package/lib/webrtc/src/transceiverManager.js +477 -62
- package/lib/webrtc/src/transceiverManager.js.map +1 -1
- package/lib/webrtc/src/transport/ice.d.ts +8 -0
- package/lib/webrtc/src/transport/ice.js +17 -1
- package/lib/webrtc/src/transport/ice.js.map +1 -1
- package/lib/webrtc/src/transport/sctp.d.ts +3 -2
- package/lib/webrtc/src/transport/sctp.js +8 -2
- package/lib/webrtc/src/transport/sctp.js.map +1 -1
- package/package.json +13 -3
package/lib/sctp/src/sctp.d.ts
CHANGED
|
@@ -4,6 +4,13 @@ import { type Unpacked } from "./helper";
|
|
|
4
4
|
import { Event } from "./imports/common";
|
|
5
5
|
import { OutgoingSSNResetRequestParam, type StreamParam } from "./param";
|
|
6
6
|
import type { Transport } from "./transport";
|
|
7
|
+
export declare const DEFAULT_SCTP_MTU = 1191;
|
|
8
|
+
export interface SCTPOptions {
|
|
9
|
+
/** SCTP packet MTU used for outbound DATA chunk fragmentation. */
|
|
10
|
+
mtu?: number;
|
|
11
|
+
}
|
|
12
|
+
export declare function maxPayloadSizeForMtu(mtu: number, dataChunkHeaderSize?: number): number;
|
|
13
|
+
export declare function validateSctpMtu(mtu: number): void;
|
|
7
14
|
declare const SCTPConnectionStates: readonly ["new", "closed", "connected", "connecting"];
|
|
8
15
|
type SCTPConnectionState = Unpacked<typeof SCTPConnectionStates>;
|
|
9
16
|
export declare class SCTP {
|
|
@@ -46,6 +53,8 @@ export declare class SCTP {
|
|
|
46
53
|
private sackImmediate;
|
|
47
54
|
private sackTimeout;
|
|
48
55
|
private cwnd;
|
|
56
|
+
readonly mtu: number;
|
|
57
|
+
private readonly maxPayloadSize;
|
|
49
58
|
private fastRecoveryExit?;
|
|
50
59
|
private fastRecoveryTransmit;
|
|
51
60
|
private forwardTsnChunk?;
|
|
@@ -86,11 +95,11 @@ export declare class SCTP {
|
|
|
86
95
|
private timerHeartbeatHandle?;
|
|
87
96
|
private heartbeatInterval;
|
|
88
97
|
private ssthresh?;
|
|
89
|
-
constructor(transport: Transport, port?: number);
|
|
98
|
+
constructor(transport: Transport, port?: number, options?: SCTPOptions);
|
|
90
99
|
private get isStopped();
|
|
91
100
|
get maxChannels(): number | undefined;
|
|
92
|
-
static client(transport: Transport, port?: number): SCTP;
|
|
93
|
-
static server(transport: Transport, port?: number): SCTP;
|
|
101
|
+
static client(transport: Transport, port?: number, options?: SCTPOptions): SCTP;
|
|
102
|
+
static server(transport: Transport, port?: number, options?: SCTPOptions): SCTP;
|
|
94
103
|
private handleData;
|
|
95
104
|
private scheduleSack;
|
|
96
105
|
private sendSack;
|
package/lib/sctp/src/sctp.js
CHANGED
|
@@ -1,6 +1,8 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.RTCSctpCapabilities = exports.InboundStream = exports.SCTP = void 0;
|
|
3
|
+
exports.RTCSctpCapabilities = exports.InboundStream = exports.SCTP = exports.DEFAULT_SCTP_MTU = void 0;
|
|
4
|
+
exports.maxPayloadSizeForMtu = maxPayloadSizeForMtu;
|
|
5
|
+
exports.validateSctpMtu = validateSctpMtu;
|
|
4
6
|
const crypto_1 = require("crypto");
|
|
5
7
|
const chunk_1 = require("./chunk");
|
|
6
8
|
const const_1 = require("./const");
|
|
@@ -13,7 +15,22 @@ const log = (0, common_1.debug)("werift/sctp/sctp");
|
|
|
13
15
|
const COOKIE_LENGTH = 24;
|
|
14
16
|
const COOKIE_LIFETIME = 60;
|
|
15
17
|
const MAX_STREAMS = 65535;
|
|
16
|
-
|
|
18
|
+
exports.DEFAULT_SCTP_MTU = 1191;
|
|
19
|
+
function maxPayloadSizeForMtu(mtu, dataChunkHeaderSize = chunk_1.SCTP_DATA_CHUNK_HEADER_SIZE) {
|
|
20
|
+
const headerSize = chunk_1.SCTP_COMMON_HEADER_SIZE + dataChunkHeaderSize;
|
|
21
|
+
if (mtu <= headerSize)
|
|
22
|
+
return 0;
|
|
23
|
+
const payloadBudget = mtu - headerSize;
|
|
24
|
+
return payloadBudget - (payloadBudget % chunk_1.SCTP_PADDING_MULTIPLE);
|
|
25
|
+
}
|
|
26
|
+
function validateSctpMtu(mtu) {
|
|
27
|
+
if (!Number.isSafeInteger(mtu) || mtu <= 0) {
|
|
28
|
+
throw new Error("SCTP MTU must be a positive integer");
|
|
29
|
+
}
|
|
30
|
+
if (maxPayloadSizeForMtu(mtu) === 0) {
|
|
31
|
+
throw new Error("SCTP MTU is too small for a DATA chunk");
|
|
32
|
+
}
|
|
33
|
+
}
|
|
17
34
|
// # protocol constants
|
|
18
35
|
const SCTP_DATA_LAST_FRAG = 0x01;
|
|
19
36
|
const SCTP_DATA_FIRST_FRAG = 0x02;
|
|
@@ -48,7 +65,7 @@ class SCTP {
|
|
|
48
65
|
// RFC 9260 §6.2.1(D-ii): available receiver window = a_rwnd - outstanding DATA.
|
|
49
66
|
return Math.max(0, this.peerAdvertisedRwnd - this.flightSize);
|
|
50
67
|
}
|
|
51
|
-
constructor(transport, port = 5000) {
|
|
68
|
+
constructor(transport, port = 5000, options = {}) {
|
|
52
69
|
Object.defineProperty(this, "transport", {
|
|
53
70
|
enumerable: true,
|
|
54
71
|
configurable: true,
|
|
@@ -260,8 +277,20 @@ class SCTP {
|
|
|
260
277
|
enumerable: true,
|
|
261
278
|
configurable: true,
|
|
262
279
|
writable: true,
|
|
263
|
-
value:
|
|
280
|
+
value: void 0
|
|
264
281
|
}); // Congestion Window
|
|
282
|
+
Object.defineProperty(this, "mtu", {
|
|
283
|
+
enumerable: true,
|
|
284
|
+
configurable: true,
|
|
285
|
+
writable: true,
|
|
286
|
+
value: void 0
|
|
287
|
+
});
|
|
288
|
+
Object.defineProperty(this, "maxPayloadSize", {
|
|
289
|
+
enumerable: true,
|
|
290
|
+
configurable: true,
|
|
291
|
+
writable: true,
|
|
292
|
+
value: void 0
|
|
293
|
+
});
|
|
265
294
|
Object.defineProperty(this, "fastRecoveryExit", {
|
|
266
295
|
enumerable: true,
|
|
267
296
|
configurable: true,
|
|
@@ -477,7 +506,7 @@ class SCTP {
|
|
|
477
506
|
writable: true,
|
|
478
507
|
value: async (streamId, ppId, userData, { expiry, maxRetransmits, ordered, } = { expiry: undefined, maxRetransmits: undefined, ordered: true }) => {
|
|
479
508
|
const streamSeqNum = ordered ? this.outboundStreamSeq[streamId] || 0 : 0;
|
|
480
|
-
const fragments = Math.ceil(userData.length /
|
|
509
|
+
const fragments = Math.ceil(userData.length / this.maxPayloadSize);
|
|
481
510
|
let pos = 0;
|
|
482
511
|
const chunks = [];
|
|
483
512
|
for (let fragment = 0; fragment < fragments; fragment++) {
|
|
@@ -496,11 +525,11 @@ class SCTP {
|
|
|
496
525
|
chunk.streamId = streamId;
|
|
497
526
|
chunk.streamSeqNum = streamSeqNum;
|
|
498
527
|
chunk.protocol = ppId;
|
|
499
|
-
chunk.userData = userData.slice(pos, pos +
|
|
528
|
+
chunk.userData = userData.slice(pos, pos + this.maxPayloadSize);
|
|
500
529
|
chunk.bookSize = chunk.userData.length;
|
|
501
530
|
chunk.expiry = expiry;
|
|
502
531
|
chunk.maxRetransmits = maxRetransmits;
|
|
503
|
-
pos +=
|
|
532
|
+
pos += this.maxPayloadSize;
|
|
504
533
|
this.localTsn = tsnPlusOne(this.localTsn);
|
|
505
534
|
chunks.push(chunk);
|
|
506
535
|
}
|
|
@@ -587,8 +616,8 @@ class SCTP {
|
|
|
587
616
|
this.fastRecoveryExit = undefined;
|
|
588
617
|
this.flightSize = 0;
|
|
589
618
|
this.partialBytesAcked = 0;
|
|
590
|
-
this.ssthresh = Math.max(Math.floor(this.cwnd / 2), 4 *
|
|
591
|
-
this.cwnd =
|
|
619
|
+
this.ssthresh = Math.max(Math.floor(this.cwnd / 2), 4 * this.maxPayloadSize);
|
|
620
|
+
this.cwnd = this.maxPayloadSize;
|
|
592
621
|
this.transmit();
|
|
593
622
|
}
|
|
594
623
|
});
|
|
@@ -636,6 +665,10 @@ class SCTP {
|
|
|
636
665
|
this.heartbeatStart();
|
|
637
666
|
}
|
|
638
667
|
});
|
|
668
|
+
this.mtu = options.mtu ?? exports.DEFAULT_SCTP_MTU;
|
|
669
|
+
validateSctpMtu(this.mtu);
|
|
670
|
+
this.maxPayloadSize = maxPayloadSizeForMtu(this.mtu);
|
|
671
|
+
this.cwnd = 3 * this.maxPayloadSize;
|
|
639
672
|
this.localPort = this.port;
|
|
640
673
|
this.transport.onData = (buf) => {
|
|
641
674
|
this.handleData(buf);
|
|
@@ -650,13 +683,13 @@ class SCTP {
|
|
|
650
683
|
}
|
|
651
684
|
return undefined;
|
|
652
685
|
}
|
|
653
|
-
static client(transport, port = 5000) {
|
|
654
|
-
const sctp = new SCTP(transport, port);
|
|
686
|
+
static client(transport, port = 5000, options = {}) {
|
|
687
|
+
const sctp = new SCTP(transport, port, options);
|
|
655
688
|
sctp.isServer = false;
|
|
656
689
|
return sctp;
|
|
657
690
|
}
|
|
658
|
-
static server(transport, port = 5000) {
|
|
659
|
-
const sctp = new SCTP(transport, port);
|
|
691
|
+
static server(transport, port = 5000, options = {}) {
|
|
692
|
+
const sctp = new SCTP(transport, port, options);
|
|
660
693
|
sctp.isServer = true;
|
|
661
694
|
return sctp;
|
|
662
695
|
}
|
|
@@ -1098,18 +1131,18 @@ class SCTP {
|
|
|
1098
1131
|
if (this.fastRecoveryExit === undefined) {
|
|
1099
1132
|
if (done && cwndFullyUtilized) {
|
|
1100
1133
|
if (this.cwnd <= this.ssthresh) {
|
|
1101
|
-
this.cwnd += Math.min(doneBytes,
|
|
1134
|
+
this.cwnd += Math.min(doneBytes, this.maxPayloadSize);
|
|
1102
1135
|
}
|
|
1103
1136
|
else {
|
|
1104
1137
|
this.partialBytesAcked += doneBytes;
|
|
1105
1138
|
if (this.partialBytesAcked >= this.cwnd) {
|
|
1106
1139
|
this.partialBytesAcked -= this.cwnd;
|
|
1107
|
-
this.cwnd +=
|
|
1140
|
+
this.cwnd += this.maxPayloadSize;
|
|
1108
1141
|
}
|
|
1109
1142
|
}
|
|
1110
1143
|
}
|
|
1111
1144
|
if (loss) {
|
|
1112
|
-
this.ssthresh = Math.max(Math.floor(this.cwnd / 2), 4 *
|
|
1145
|
+
this.ssthresh = Math.max(Math.floor(this.cwnd / 2), 4 * this.maxPayloadSize);
|
|
1113
1146
|
this.cwnd = this.ssthresh;
|
|
1114
1147
|
this.partialBytesAcked = 0;
|
|
1115
1148
|
this.fastRecoveryExit = this.sentQueue[this.sentQueue.length - 1].tsn;
|
|
@@ -1243,8 +1276,8 @@ class SCTP {
|
|
|
1243
1276
|
}
|
|
1244
1277
|
}
|
|
1245
1278
|
const burstSize = this.fastRecoveryExit != undefined
|
|
1246
|
-
? 2 *
|
|
1247
|
-
: 4 *
|
|
1279
|
+
? 2 * this.maxPayloadSize
|
|
1280
|
+
: 4 * this.maxPayloadSize;
|
|
1248
1281
|
const cwnd = Math.min(this.flightSize + burstSize, this.cwnd);
|
|
1249
1282
|
let retransmitEarliest = true;
|
|
1250
1283
|
for (const dataChunk of this.sentQueue) {
|