werift 0.22.0 → 0.22.2
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/common/src/binary.d.ts +6 -6
- package/lib/common/src/event.d.ts +1 -0
- package/lib/common/src/event.js +5 -0
- package/lib/common/src/event.js.map +1 -1
- package/lib/common/src/log.d.ts +1 -2
- package/lib/common/src/transport.d.ts +2 -1
- package/lib/common/src/transport.js +28 -14
- package/lib/common/src/transport.js.map +1 -1
- package/lib/dtls/src/cipher/prf.d.ts +12 -12
- package/lib/dtls/src/cipher/suites/aead.d.ts +3 -2
- package/lib/dtls/src/cipher/suites/aead.js +31 -38
- package/lib/dtls/src/cipher/suites/aead.js.map +1 -1
- package/lib/dtls/src/context/cipher.d.ts +4 -4
- package/lib/dtls/src/context/cipher.js +21 -10
- package/lib/dtls/src/context/cipher.js.map +1 -1
- package/lib/dtls/src/context/srtp.d.ts +3 -3
- package/lib/dtls/src/context/srtp.js.map +1 -1
- package/lib/dtls/src/flight/client/flight5.js.map +1 -1
- package/lib/dtls/src/flight/server/flight2.js.map +1 -1
- package/lib/dtls/src/handshake/extensions/ellipticCurves.d.ts +1 -1
- package/lib/dtls/src/handshake/extensions/renegotiationIndication.d.ts +2 -2
- package/lib/dtls/src/handshake/extensions/signature.d.ts +2 -2
- package/lib/dtls/src/handshake/extensions/useSrtp.d.ts +1 -1
- package/lib/dtls/src/handshake/message/alert.d.ts +1 -1
- package/lib/dtls/src/handshake/message/certificate.d.ts +1 -1
- package/lib/dtls/src/handshake/message/changeCipherSpec.d.ts +1 -1
- package/lib/dtls/src/handshake/message/client/certificateVerify.d.ts +1 -1
- package/lib/dtls/src/handshake/message/client/hello.d.ts +1 -1
- package/lib/dtls/src/handshake/message/client/keyExchange.d.ts +1 -1
- package/lib/dtls/src/handshake/message/finished.d.ts +1 -1
- package/lib/dtls/src/handshake/message/server/certificateRequest.d.ts +1 -1
- package/lib/dtls/src/handshake/message/server/hello.d.ts +1 -1
- package/lib/dtls/src/handshake/message/server/helloDone.d.ts +1 -1
- package/lib/dtls/src/handshake/message/server/helloVerifyRequest.d.ts +1 -1
- package/lib/dtls/src/handshake/message/server/keyExchange.d.ts +1 -1
- package/lib/dtls/src/handshake/random.d.ts +3 -3
- package/lib/dtls/src/record/message/fragment.d.ts +1 -1
- package/lib/dtls/src/record/message/header.d.ts +2 -19
- package/lib/dtls/src/record/message/header.js +1 -60
- package/lib/dtls/src/record/message/header.js.map +1 -1
- package/lib/dtls/src/record/message/plaintext.d.ts +6 -27
- package/lib/dtls/src/record/message/plaintext.js +34 -16
- package/lib/dtls/src/record/message/plaintext.js.map +1 -1
- package/lib/dtls/src/socket.d.ts +4 -4
- package/lib/dtls/src/socket.js.map +1 -1
- package/lib/dtls/src/util/binary.d.ts +1 -1
- package/lib/ice/src/helper.d.ts +1 -1
- package/lib/ice/src/ice.d.ts +4 -3
- package/lib/ice/src/ice.js +89 -68
- package/lib/ice/src/ice.js.map +1 -1
- package/lib/ice/src/iceBase.d.ts +20 -1
- package/lib/ice/src/iceBase.js +46 -0
- package/lib/ice/src/iceBase.js.map +1 -1
- package/lib/ice/src/stun/attributes.d.ts +2 -2
- package/lib/ice/src/stun/attributes.js +47 -27
- package/lib/ice/src/stun/attributes.js.map +1 -1
- package/lib/ice/src/stun/message.d.ts +2 -2
- package/lib/ice/src/stun/message.js +21 -23
- package/lib/ice/src/stun/message.js.map +1 -1
- package/lib/ice/src/stun/protocol.d.ts +2 -2
- package/lib/ice/src/turn/protocol.d.ts +2 -2
- package/lib/index.mjs +2252 -1474
- package/lib/nonstandard/index.mjs +333 -370
- package/lib/rtp/src/codec/av1.d.ts +2 -2
- package/lib/rtp/src/codec/opus.d.ts +1 -1
- package/lib/rtp/src/extra/container/mp4/container.js +18 -8
- package/lib/rtp/src/extra/container/mp4/container.js.map +1 -1
- package/lib/rtp/src/extra/container/mp4/h264.d.ts +2 -2
- package/lib/rtp/src/extra/container/mp4/sps-parser.d.ts +1 -1
- package/lib/rtp/src/extra/container/ogg/parser.d.ts +1 -1
- package/lib/rtp/src/extra/container/webm/container.d.ts +7 -7
- package/lib/rtp/src/extra/container/webm/container.js +17 -7
- package/lib/rtp/src/extra/container/webm/container.js.map +1 -1
- package/lib/rtp/src/extra/container/webm/ebml/ebml.d.ts +1 -1
- package/lib/rtp/src/extra/container/webm/ebml/id.d.ts +222 -222
- package/lib/rtp/src/extra/processor/depacketizerCallback.d.ts +1 -1
- package/lib/rtp/src/extra/processor/depacketizerTransformer.d.ts +6 -1
- package/lib/rtp/src/extra/processor/dtxCallback.d.ts +1 -1
- package/lib/rtp/src/extra/processor/interface.d.ts +1 -1
- package/lib/rtp/src/extra/processor/jitterBufferCallback.d.ts +1 -1
- package/lib/rtp/src/extra/processor/mp4.js +3 -0
- package/lib/rtp/src/extra/processor/mp4.js.map +1 -1
- package/lib/rtp/src/extra/processor/nackHandlerCallback.d.ts +1 -1
- package/lib/rtp/src/extra/processor/ntpTimeCallback.d.ts +1 -1
- package/lib/rtp/src/extra/processor/rtpTimeCallback.d.ts +1 -1
- package/lib/rtp/src/extra/processor/webm.d.ts +1 -1
- package/lib/rtp/src/extra/processor/webmCallback.d.ts +1 -1
- package/lib/rtp/src/extra/processor/webmCallback.js +23 -17
- package/lib/rtp/src/extra/processor/webmCallback.js.map +1 -1
- package/lib/rtp/src/helper.d.ts +1 -1
- package/lib/rtp/src/rtcp/header.d.ts +1 -1
- package/lib/rtp/src/rtcp/psfb/fullIntraRequest.d.ts +1 -1
- package/lib/rtp/src/rtcp/psfb/index.d.ts +1 -1
- package/lib/rtp/src/rtcp/psfb/pictureLossIndication.d.ts +1 -1
- package/lib/rtp/src/rtcp/psfb/remb.d.ts +1 -1
- package/lib/rtp/src/rtcp/rr.d.ts +2 -2
- package/lib/rtp/src/rtcp/rtcp.d.ts +1 -1
- package/lib/rtp/src/rtcp/rtpfb/index.d.ts +1 -1
- package/lib/rtp/src/rtcp/rtpfb/nack.d.ts +1 -1
- package/lib/rtp/src/rtcp/rtpfb/twcc.d.ts +4 -4
- package/lib/rtp/src/rtcp/sdes.d.ts +3 -3
- package/lib/rtp/src/rtcp/sr.d.ts +2 -2
- package/lib/rtp/src/rtp/headerExtension.d.ts +6 -6
- package/lib/rtp/src/rtp/red/packet.d.ts +2 -2
- package/lib/rtp/src/rtp/rtp.d.ts +2 -2
- package/lib/rtp/src/srtp/cipher/ctr.d.ts +4 -4
- package/lib/rtp/src/srtp/cipher/gcm.d.ts +4 -4
- package/lib/rtp/src/srtp/const.d.ts +3 -3
- package/lib/rtp/src/srtp/const.js.map +1 -1
- package/lib/rtp/src/srtp/context/context.d.ts +7 -7
- package/lib/rtp/src/srtp/context/context.js +10 -4
- package/lib/rtp/src/srtp/context/context.js.map +1 -1
- package/lib/rtp/src/srtp/context/srtcp.d.ts +3 -3
- package/lib/rtp/src/srtp/context/srtcp.js.map +1 -1
- package/lib/rtp/src/srtp/context/srtp.d.ts +3 -3
- package/lib/rtp/src/srtp/context/srtp.js.map +1 -1
- package/lib/rtp/src/srtp/srtcp.d.ts +2 -2
- package/lib/rtp/src/srtp/srtp.d.ts +2 -2
- package/lib/sctp/src/chunk.d.ts +12 -12
- package/lib/sctp/src/chunk.js +87 -66
- package/lib/sctp/src/chunk.js.map +1 -1
- package/lib/sctp/src/param.d.ts +3 -3
- package/lib/sctp/src/sctp.d.ts +3 -1
- package/lib/sctp/src/sctp.js +36 -1
- package/lib/sctp/src/sctp.js.map +1 -1
- package/lib/webrtc/src/dataChannel.d.ts +15 -4
- package/lib/webrtc/src/dataChannel.js +42 -7
- package/lib/webrtc/src/dataChannel.js.map +1 -1
- package/lib/webrtc/src/index.d.ts +1 -0
- package/lib/webrtc/src/index.js +1 -0
- package/lib/webrtc/src/index.js.map +1 -1
- 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/parameters.d.ts +2 -2
- package/lib/webrtc/src/media/parameters.js.map +1 -1
- package/lib/webrtc/src/media/router.js +2 -1
- package/lib/webrtc/src/media/router.js.map +1 -1
- package/lib/webrtc/src/media/rtpReceiver.d.ts +2 -2
- package/lib/webrtc/src/media/rtpReceiver.js +51 -2
- package/lib/webrtc/src/media/rtpReceiver.js.map +1 -1
- package/lib/webrtc/src/media/rtpSender.d.ts +6 -0
- package/lib/webrtc/src/media/rtpSender.js +78 -7
- package/lib/webrtc/src/media/rtpSender.js.map +1 -1
- package/lib/webrtc/src/media/rtpTransceiver.d.ts +12 -9
- package/lib/webrtc/src/media/rtpTransceiver.js +45 -8
- package/lib/webrtc/src/media/rtpTransceiver.js.map +1 -1
- package/lib/webrtc/src/media/stats.d.ts +279 -0
- package/lib/webrtc/src/media/stats.js +35 -1
- package/lib/webrtc/src/media/stats.js.map +1 -1
- package/lib/webrtc/src/peerConnection.d.ts +34 -64
- package/lib/webrtc/src/peerConnection.js +319 -986
- package/lib/webrtc/src/peerConnection.js.map +1 -1
- package/lib/webrtc/src/sctpManager.d.ts +27 -0
- package/lib/webrtc/src/sctpManager.js +147 -0
- package/lib/webrtc/src/sctpManager.js.map +1 -0
- package/lib/webrtc/src/sdp.d.ts +3 -2
- package/lib/webrtc/src/sdp.js +17 -7
- package/lib/webrtc/src/sdp.js.map +1 -1
- package/lib/webrtc/src/sdpManager.d.ts +78 -0
- package/lib/webrtc/src/sdpManager.js +391 -0
- package/lib/webrtc/src/sdpManager.js.map +1 -0
- package/lib/webrtc/src/secureTransportManager.d.ts +56 -0
- package/lib/webrtc/src/secureTransportManager.js +345 -0
- package/lib/webrtc/src/secureTransportManager.js.map +1 -0
- package/lib/webrtc/src/transceiverManager.d.ts +40 -0
- package/lib/webrtc/src/transceiverManager.js +355 -0
- package/lib/webrtc/src/transceiverManager.js.map +1 -0
- package/lib/webrtc/src/transport/dtls.d.ts +18 -6
- package/lib/webrtc/src/transport/dtls.js +119 -11
- package/lib/webrtc/src/transport/dtls.js.map +1 -1
- package/lib/webrtc/src/transport/ice.d.ts +24 -0
- package/lib/webrtc/src/transport/ice.js +86 -0
- package/lib/webrtc/src/transport/ice.js.map +1 -1
- package/lib/webrtc/src/transport/sctp.js +22 -7
- package/lib/webrtc/src/transport/sctp.js.map +1 -1
- package/lib/webrtc/src/utils.d.ts +3 -3
- package/lib/webrtc/src/utils.js.map +1 -1
- package/package.json +15 -21
package/lib/sctp/src/chunk.d.ts
CHANGED
|
@@ -6,7 +6,7 @@ export declare class Chunk {
|
|
|
6
6
|
static type: number;
|
|
7
7
|
constructor(flags?: number, _body?: Buffer | undefined);
|
|
8
8
|
get type(): number;
|
|
9
|
-
get bytes(): Buffer
|
|
9
|
+
get bytes(): Buffer<ArrayBuffer>;
|
|
10
10
|
}
|
|
11
11
|
export declare class BaseInitChunk extends Chunk {
|
|
12
12
|
flags: number;
|
|
@@ -17,7 +17,7 @@ export declare class BaseInitChunk extends Chunk {
|
|
|
17
17
|
initialTsn: number;
|
|
18
18
|
params: [number, Buffer][];
|
|
19
19
|
constructor(flags?: number, body?: Buffer);
|
|
20
|
-
get body(): Buffer
|
|
20
|
+
get body(): Buffer<ArrayBuffer>;
|
|
21
21
|
}
|
|
22
22
|
export declare class InitChunk extends BaseInitChunk {
|
|
23
23
|
static type: 1;
|
|
@@ -36,7 +36,7 @@ export declare class ForwardTsnChunk extends Chunk {
|
|
|
36
36
|
static type: 192;
|
|
37
37
|
streams: [number, number][];
|
|
38
38
|
cumulativeTsn: number;
|
|
39
|
-
constructor(flags: number, body: Buffer | undefined);
|
|
39
|
+
constructor(flags: number | undefined, body: Buffer | undefined);
|
|
40
40
|
get type(): 192;
|
|
41
41
|
set body(_: Buffer);
|
|
42
42
|
get body(): Buffer;
|
|
@@ -59,8 +59,8 @@ export declare class DataChunk extends Chunk {
|
|
|
59
59
|
expiry?: number;
|
|
60
60
|
maxRetransmits?: number;
|
|
61
61
|
sentTime?: number;
|
|
62
|
-
constructor(flags: number, body: Buffer | undefined);
|
|
63
|
-
get bytes(): Buffer
|
|
62
|
+
constructor(flags: number | undefined, body: Buffer | undefined);
|
|
63
|
+
get bytes(): Buffer<ArrayBuffer>;
|
|
64
64
|
}
|
|
65
65
|
export declare class CookieEchoChunk extends Chunk {
|
|
66
66
|
static type: 10;
|
|
@@ -74,7 +74,7 @@ export declare class BaseParamsChunk extends Chunk {
|
|
|
74
74
|
flags: number;
|
|
75
75
|
params: [number, Buffer][];
|
|
76
76
|
constructor(flags?: number, body?: Buffer | undefined);
|
|
77
|
-
get body(): Buffer
|
|
77
|
+
get body(): Buffer<ArrayBuffer>;
|
|
78
78
|
}
|
|
79
79
|
export declare class AbortChunk extends BaseParamsChunk {
|
|
80
80
|
static type: 6;
|
|
@@ -100,7 +100,7 @@ export declare class ErrorChunk extends BaseParamsChunk {
|
|
|
100
100
|
get type(): 9;
|
|
101
101
|
get descriptions(): {
|
|
102
102
|
name: string | undefined;
|
|
103
|
-
body: Buffer
|
|
103
|
+
body: Buffer<ArrayBufferLike>;
|
|
104
104
|
}[];
|
|
105
105
|
}
|
|
106
106
|
export declare class HeartbeatChunk extends BaseParamsChunk {
|
|
@@ -123,16 +123,16 @@ export declare class SackChunk extends Chunk {
|
|
|
123
123
|
duplicates: number[];
|
|
124
124
|
cumulativeTsn: number;
|
|
125
125
|
advertisedRwnd: number;
|
|
126
|
-
constructor(flags: number, body: Buffer | undefined);
|
|
127
|
-
get bytes(): Buffer
|
|
126
|
+
constructor(flags: number | undefined, body: Buffer | undefined);
|
|
127
|
+
get bytes(): Buffer<ArrayBuffer>;
|
|
128
128
|
}
|
|
129
129
|
export declare class ShutdownChunk extends Chunk {
|
|
130
130
|
flags: number;
|
|
131
131
|
static type: number;
|
|
132
132
|
get type(): number;
|
|
133
133
|
cumulativeTsn: number;
|
|
134
|
-
constructor(flags: number, body: Buffer | undefined);
|
|
135
|
-
get body(): Buffer
|
|
134
|
+
constructor(flags: number | undefined, body: Buffer | undefined);
|
|
135
|
+
get body(): Buffer<ArrayBuffer>;
|
|
136
136
|
}
|
|
137
137
|
export declare class ShutdownAckChunk extends Chunk {
|
|
138
138
|
static type: number;
|
|
@@ -147,4 +147,4 @@ export declare const CHUNK_BY_TYPE: {
|
|
|
147
147
|
};
|
|
148
148
|
export declare function decodeParams(body: Buffer): [number, Buffer][];
|
|
149
149
|
export declare function parsePacket(data: Buffer): [number, number, number, Chunk[]];
|
|
150
|
-
export declare function serializePacket(sourcePort: number, destinationPort: number, verificationTag: number, chunk: Chunk): Buffer
|
|
150
|
+
export declare function serializePacket(sourcePort: number, destinationPort: number, verificationTag: number, chunk: Chunk): Buffer<ArrayBuffer>;
|
package/lib/sctp/src/chunk.js
CHANGED
|
@@ -33,7 +33,6 @@ exports.CHUNK_BY_TYPE = exports.ShutdownCompleteChunk = exports.ShutdownAckChunk
|
|
|
33
33
|
exports.decodeParams = decodeParams;
|
|
34
34
|
exports.parsePacket = parsePacket;
|
|
35
35
|
exports.serializePacket = serializePacket;
|
|
36
|
-
const jspack_1 = require("@shinyoshiaki/jspack");
|
|
37
36
|
const crc32c_js_1 = __importDefault(require("turbo-crc32/crc32c.js"));
|
|
38
37
|
class Chunk {
|
|
39
38
|
get body() {
|
|
@@ -62,8 +61,12 @@ class Chunk {
|
|
|
62
61
|
get bytes() {
|
|
63
62
|
if (!this.body)
|
|
64
63
|
throw new Error();
|
|
64
|
+
const header = Buffer.alloc(4);
|
|
65
|
+
header.writeUInt8(this.type, 0);
|
|
66
|
+
header.writeUInt8(this.flags, 1);
|
|
67
|
+
header.writeUInt16BE(this.body.length + 4, 2);
|
|
65
68
|
const data = Buffer.concat([
|
|
66
|
-
|
|
69
|
+
header,
|
|
67
70
|
this.body,
|
|
68
71
|
...[...Array(padL(this.body.length))].map(() => Buffer.from("\x00")),
|
|
69
72
|
]);
|
|
@@ -123,13 +126,11 @@ class BaseInitChunk extends Chunk {
|
|
|
123
126
|
value: void 0
|
|
124
127
|
});
|
|
125
128
|
if (body) {
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
this.initialTsn,
|
|
132
|
-
] = jspack_1.jspack.Unpack("!LLHHL", body);
|
|
129
|
+
this.initiateTag = body.readUInt32BE(0);
|
|
130
|
+
this.advertisedRwnd = body.readUInt32BE(4);
|
|
131
|
+
this.outboundStreams = body.readUInt16BE(8);
|
|
132
|
+
this.inboundStreams = body.readUInt16BE(10);
|
|
133
|
+
this.initialTsn = body.readUInt32BE(12);
|
|
133
134
|
this.params = decodeParams(body.slice(16));
|
|
134
135
|
}
|
|
135
136
|
else {
|
|
@@ -142,15 +143,13 @@ class BaseInitChunk extends Chunk {
|
|
|
142
143
|
}
|
|
143
144
|
}
|
|
144
145
|
get body() {
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
])
|
|
152
|
-
body = Buffer.concat([body, encodeParams(this.params)]);
|
|
153
|
-
return body;
|
|
146
|
+
const body = Buffer.alloc(16);
|
|
147
|
+
body.writeUInt32BE(this.initiateTag, 0);
|
|
148
|
+
body.writeUInt32BE(this.advertisedRwnd, 4);
|
|
149
|
+
body.writeUInt16BE(this.outboundStreams, 8);
|
|
150
|
+
body.writeUInt16BE(this.inboundStreams, 10);
|
|
151
|
+
body.writeUInt32BE(this.initialTsn, 12);
|
|
152
|
+
return Buffer.concat([body, encodeParams(this.params)]);
|
|
154
153
|
}
|
|
155
154
|
}
|
|
156
155
|
exports.BaseInitChunk = BaseInitChunk;
|
|
@@ -212,10 +211,10 @@ class ForwardTsnChunk extends Chunk {
|
|
|
212
211
|
value: void 0
|
|
213
212
|
});
|
|
214
213
|
if (body) {
|
|
215
|
-
this.cumulativeTsn =
|
|
214
|
+
this.cumulativeTsn = body.readUInt32BE(0);
|
|
216
215
|
let pos = 4;
|
|
217
216
|
while (pos < body.length) {
|
|
218
|
-
this.streams.push(
|
|
217
|
+
this.streams.push([body.readUInt16BE(pos), body.readUInt16BE(pos + 2)]);
|
|
219
218
|
pos += 4;
|
|
220
219
|
}
|
|
221
220
|
}
|
|
@@ -228,10 +227,16 @@ class ForwardTsnChunk extends Chunk {
|
|
|
228
227
|
}
|
|
229
228
|
set body(_) { }
|
|
230
229
|
get body() {
|
|
231
|
-
const body = Buffer.
|
|
230
|
+
const body = Buffer.alloc(4);
|
|
231
|
+
body.writeUInt32BE(this.cumulativeTsn, 0);
|
|
232
232
|
return Buffer.concat([
|
|
233
233
|
body,
|
|
234
|
-
...this.streams.map(([id, seq]) =>
|
|
234
|
+
...this.streams.map(([id, seq]) => {
|
|
235
|
+
const streamBuffer = Buffer.alloc(4);
|
|
236
|
+
streamBuffer.writeUInt16BE(id, 0);
|
|
237
|
+
streamBuffer.writeUInt16BE(seq, 2);
|
|
238
|
+
return streamBuffer;
|
|
239
|
+
}),
|
|
235
240
|
]);
|
|
236
241
|
}
|
|
237
242
|
}
|
|
@@ -339,25 +344,24 @@ class DataChunk extends Chunk {
|
|
|
339
344
|
value: void 0
|
|
340
345
|
});
|
|
341
346
|
if (body) {
|
|
342
|
-
|
|
343
|
-
|
|
347
|
+
this.tsn = body.readUInt32BE(0);
|
|
348
|
+
this.streamId = body.readUInt16BE(4);
|
|
349
|
+
this.streamSeqNum = body.readUInt16BE(6);
|
|
350
|
+
this.protocol = body.readUInt32BE(8);
|
|
344
351
|
this.userData = body.slice(12);
|
|
345
352
|
}
|
|
346
353
|
}
|
|
347
354
|
get bytes() {
|
|
348
355
|
const length = 16 + this.userData.length;
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
])),
|
|
359
|
-
this.userData,
|
|
360
|
-
]);
|
|
356
|
+
const header = Buffer.alloc(16);
|
|
357
|
+
header.writeUInt8(this.type, 0);
|
|
358
|
+
header.writeUInt8(this.flags, 1);
|
|
359
|
+
header.writeUInt16BE(length, 2);
|
|
360
|
+
header.writeUInt32BE(this.tsn, 4);
|
|
361
|
+
header.writeUInt16BE(this.streamId, 8);
|
|
362
|
+
header.writeUInt16BE(this.streamSeqNum, 10);
|
|
363
|
+
header.writeUInt32BE(this.protocol, 12);
|
|
364
|
+
let data = Buffer.concat([header, this.userData]);
|
|
361
365
|
if (length % 4) {
|
|
362
366
|
data = Buffer.concat([
|
|
363
367
|
data,
|
|
@@ -561,38 +565,47 @@ class SackChunk extends Chunk {
|
|
|
561
565
|
value: 0
|
|
562
566
|
});
|
|
563
567
|
if (body) {
|
|
564
|
-
|
|
565
|
-
this.
|
|
566
|
-
|
|
568
|
+
this.cumulativeTsn = body.readUInt32BE(0);
|
|
569
|
+
this.advertisedRwnd = body.readUInt32BE(4);
|
|
570
|
+
const nbGaps = body.readUInt16BE(8);
|
|
571
|
+
const nbDuplicates = body.readUInt16BE(10);
|
|
567
572
|
let pos = 12;
|
|
568
573
|
[...Array(nbGaps)].forEach(() => {
|
|
569
|
-
this.gaps.push(
|
|
574
|
+
this.gaps.push([body.readUInt16BE(pos), body.readUInt16BE(pos + 2)]);
|
|
570
575
|
pos += 4;
|
|
571
576
|
});
|
|
572
577
|
[...Array(nbDuplicates)].forEach(() => {
|
|
573
|
-
this.duplicates.push(
|
|
578
|
+
this.duplicates.push(body.readUInt32BE(pos));
|
|
574
579
|
pos += 4;
|
|
575
580
|
});
|
|
576
581
|
}
|
|
577
582
|
}
|
|
578
583
|
get bytes() {
|
|
579
584
|
const length = 16 + 4 * (this.gaps.length + this.duplicates.length);
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
585
|
+
const header = Buffer.alloc(16);
|
|
586
|
+
header.writeUInt8(this.type, 0);
|
|
587
|
+
header.writeUInt8(this.flags, 1);
|
|
588
|
+
header.writeUInt16BE(length, 2);
|
|
589
|
+
header.writeUInt32BE(this.cumulativeTsn, 4);
|
|
590
|
+
header.writeUInt32BE(this.advertisedRwnd, 8);
|
|
591
|
+
header.writeUInt16BE(this.gaps.length, 12);
|
|
592
|
+
header.writeUInt16BE(this.duplicates.length, 14);
|
|
593
|
+
let data = Buffer.concat([
|
|
594
|
+
header,
|
|
595
|
+
...this.gaps.map((gap) => {
|
|
596
|
+
const gapBuffer = Buffer.alloc(4);
|
|
597
|
+
gapBuffer.writeUInt16BE(gap[0], 0);
|
|
598
|
+
gapBuffer.writeUInt16BE(gap[1], 2);
|
|
599
|
+
return gapBuffer;
|
|
600
|
+
}),
|
|
592
601
|
]);
|
|
593
602
|
data = Buffer.concat([
|
|
594
603
|
data,
|
|
595
|
-
...this.duplicates.map((tsn) =>
|
|
604
|
+
...this.duplicates.map((tsn) => {
|
|
605
|
+
const tsnBuffer = Buffer.alloc(4);
|
|
606
|
+
tsnBuffer.writeUInt32BE(tsn, 0);
|
|
607
|
+
return tsnBuffer;
|
|
608
|
+
}),
|
|
596
609
|
]);
|
|
597
610
|
return data;
|
|
598
611
|
}
|
|
@@ -623,11 +636,13 @@ class ShutdownChunk extends Chunk {
|
|
|
623
636
|
value: 0
|
|
624
637
|
});
|
|
625
638
|
if (body) {
|
|
626
|
-
this.cumulativeTsn =
|
|
639
|
+
this.cumulativeTsn = body.readUInt32BE(0);
|
|
627
640
|
}
|
|
628
641
|
}
|
|
629
642
|
get body() {
|
|
630
|
-
|
|
643
|
+
const body = Buffer.alloc(4);
|
|
644
|
+
body.writeUInt32BE(this.cumulativeTsn, 0);
|
|
645
|
+
return body;
|
|
631
646
|
}
|
|
632
647
|
}
|
|
633
648
|
exports.ShutdownChunk = ShutdownChunk;
|
|
@@ -691,12 +706,10 @@ function encodeParams(params) {
|
|
|
691
706
|
let padding = Buffer.from("");
|
|
692
707
|
params.forEach(([type, value]) => {
|
|
693
708
|
const length = value.length + 4;
|
|
694
|
-
|
|
695
|
-
|
|
696
|
-
|
|
697
|
-
|
|
698
|
-
value,
|
|
699
|
-
]);
|
|
709
|
+
const paramHeader = Buffer.alloc(4);
|
|
710
|
+
paramHeader.writeUInt16BE(type, 0);
|
|
711
|
+
paramHeader.writeUInt16BE(length, 2);
|
|
712
|
+
body = Buffer.concat([body, padding, paramHeader, value]);
|
|
700
713
|
padding = Buffer.concat([...Array(padL(length))].map(() => Buffer.from("\x00")));
|
|
701
714
|
});
|
|
702
715
|
return body;
|
|
@@ -705,7 +718,8 @@ function decodeParams(body) {
|
|
|
705
718
|
const params = [];
|
|
706
719
|
let pos = 0;
|
|
707
720
|
while (pos <= body.length - 4) {
|
|
708
|
-
const
|
|
721
|
+
const type = body.readUInt16BE(pos);
|
|
722
|
+
const length = body.readUInt16BE(pos + 2);
|
|
709
723
|
params.push([type, body.slice(pos + 4, pos + length)]);
|
|
710
724
|
pos += length + padL(length);
|
|
711
725
|
}
|
|
@@ -714,7 +728,9 @@ function decodeParams(body) {
|
|
|
714
728
|
function parsePacket(data) {
|
|
715
729
|
if (data.length < 12)
|
|
716
730
|
throw new Error("SCTP packet length is less than 12 bytes");
|
|
717
|
-
const
|
|
731
|
+
const sourcePort = data.readUInt16BE(0);
|
|
732
|
+
const destinationPort = data.readUInt16BE(2);
|
|
733
|
+
const verificationTag = data.readUInt32BE(4);
|
|
718
734
|
const checkSum = data.readUInt32LE(8);
|
|
719
735
|
const expect = (0, crc32c_js_1.default)(Buffer.concat([
|
|
720
736
|
data.slice(0, 8),
|
|
@@ -726,7 +742,9 @@ function parsePacket(data) {
|
|
|
726
742
|
const chunks = [];
|
|
727
743
|
let pos = 12;
|
|
728
744
|
while (pos + 4 <= data.length) {
|
|
729
|
-
const
|
|
745
|
+
const chunkType = data.readUInt8(pos);
|
|
746
|
+
const chunkFlags = data.readUInt8(pos + 1);
|
|
747
|
+
const chunkLength = data.readUInt16BE(pos + 2);
|
|
730
748
|
const chunkBody = data.slice(pos + 4, pos + chunkLength);
|
|
731
749
|
const ChunkClass = exports.CHUNK_BY_TYPE[chunkType.toString()];
|
|
732
750
|
if (ChunkClass) {
|
|
@@ -740,7 +758,10 @@ function parsePacket(data) {
|
|
|
740
758
|
return [sourcePort, destinationPort, verificationTag, chunks];
|
|
741
759
|
}
|
|
742
760
|
function serializePacket(sourcePort, destinationPort, verificationTag, chunk) {
|
|
743
|
-
const header = Buffer.
|
|
761
|
+
const header = Buffer.alloc(8);
|
|
762
|
+
header.writeUInt16BE(sourcePort, 0);
|
|
763
|
+
header.writeUInt16BE(destinationPort, 2);
|
|
764
|
+
header.writeUInt32BE(verificationTag, 4);
|
|
744
765
|
const body = chunk.bytes;
|
|
745
766
|
const checksum = (0, crc32c_js_1.default)(Buffer.concat([header, Buffer.from("\x00\x00\x00\x00"), body]));
|
|
746
767
|
const checkSumBuf = Buffer.alloc(4);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"chunk.js","sourceRoot":"","sources":["../../../../sctp/src/chunk.ts"],"names":[],"mappings":"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","sourcesContent":["// ID Value Chunk Type\n// ----- ----------\n// 0 - Payload Data (DATA)\n// 1 - Initiation (INIT)\n// 2 - Initiation Acknowledgement (INIT ACK)\n// 3 - Selective Acknowledgement (SACK)\n// 4 - Heartbeat Request (HEARTBEAT)\n// 5 - Heartbeat Acknowledgement (HEARTBEAT ACK)\n// 6 - Abort (ABORT)\n// 7 - Shutdown (SHUTDOWN)\n// 8 - Shutdown Acknowledgement (SHUTDOWN ACK)\n// 9 - Operation Error (ERROR)\n// 10 - State Cookie (COOKIE ECHO)\n// 11 - Cookie Acknowledgement (COOKIE ACK)\n// 12 - Reserved for Explicit Congestion Notification Echo\n// (ECNE)\n// 13 - Reserved for Congestion Window Reduced (CWR)\n// 14 - Shutdown Complete (SHUTDOWN COMPLETE)\n// 15 to 62 - available\n// 63 - reserved for IETF-defined Chunk Extensions\n// 64 to 126 - available\n// 127 - reserved for IETF-defined Chunk Extensions\n// 128 to 190 - available\n// 191 - reserved for IETF-defined Chunk Extensions\n// 192 to 254 - available\n// 255 - reserved for IETF-defined Chunk Extensions\n\nimport { jspack } from \"@shinyoshiaki/jspack\";\nimport crc32c from \"turbo-crc32/crc32c.js\";\n\nexport class Chunk {\n public get body(): Buffer | undefined {\n return this._body;\n }\n public set body(value: Buffer | undefined) {\n this._body = value;\n }\n static type = -1;\n\n constructor(\n public flags = 0,\n private _body: Buffer | undefined = Buffer.from(\"\"),\n ) {}\n\n get type() {\n return Chunk.type;\n }\n\n get bytes() {\n if (!this.body) throw new Error();\n\n const data = Buffer.concat([\n Buffer.from(\n jspack.Pack(\"!BBH\", [this.type, this.flags, this.body.length + 4]),\n ),\n this.body,\n ...[...Array(padL(this.body.length))].map(() => Buffer.from(\"\\x00\")),\n ]);\n return data;\n }\n}\n\nexport class BaseInitChunk extends Chunk {\n initiateTag: number;\n advertisedRwnd: number;\n outboundStreams: number;\n inboundStreams: number;\n initialTsn: number;\n params: [number, Buffer][];\n constructor(\n public flags = 0,\n body?: Buffer,\n ) {\n super(flags, body);\n\n if (body) {\n [\n this.initiateTag,\n this.advertisedRwnd,\n this.outboundStreams,\n this.inboundStreams,\n this.initialTsn,\n ] = jspack.Unpack(\"!LLHHL\", body);\n this.params = decodeParams(body.slice(16));\n } else {\n this.initiateTag = 0;\n this.advertisedRwnd = 0;\n this.outboundStreams = 0;\n this.inboundStreams = 0;\n this.initialTsn = 0;\n this.params = [];\n }\n }\n\n get body() {\n let body = Buffer.from(\n jspack.Pack(\"!LLHHL\", [\n this.initiateTag,\n this.advertisedRwnd,\n this.outboundStreams,\n this.inboundStreams,\n this.initialTsn,\n ]),\n );\n body = Buffer.concat([body, encodeParams(this.params)]);\n return body;\n }\n}\n\nexport class InitChunk extends BaseInitChunk {\n static type = 1 as const;\n\n get type() {\n return InitChunk.type;\n }\n}\n\nexport class InitAckChunk extends BaseInitChunk {\n static type = 2 as const;\n\n get type() {\n return InitAckChunk.type;\n }\n}\n\nexport class ReConfigChunk extends BaseInitChunk {\n static type = 130 as const;\n\n get type() {\n return ReConfigChunk.type;\n }\n}\n\nexport class ForwardTsnChunk extends Chunk {\n static type = 192 as const;\n streams: [number, number][] = [];\n cumulativeTsn: number;\n\n constructor(\n public flags = 0,\n body: Buffer | undefined,\n ) {\n super(flags, body);\n\n if (body) {\n this.cumulativeTsn = jspack.Unpack(\"!L\", body)[0];\n let pos = 4;\n while (pos < body.length) {\n this.streams.push(\n jspack.Unpack(\"!HH\", body.slice(pos)) as [number, number],\n );\n pos += 4;\n }\n } else {\n this.cumulativeTsn = 0;\n }\n }\n\n get type() {\n return ForwardTsnChunk.type;\n }\n\n set body(_: Buffer) {}\n\n get body() {\n const body = Buffer.from(jspack.Pack(\"!L\", [this.cumulativeTsn]));\n return Buffer.concat([\n body,\n ...this.streams.map(([id, seq]) =>\n Buffer.from(jspack.Pack(\"!HH\", [id, seq])),\n ),\n ]);\n }\n}\n\nexport class DataChunk extends Chunk {\n static type = 0 as const;\n get type() {\n return DataChunk.type;\n }\n tsn: number = 0;\n streamId: number = 0;\n streamSeqNum: number = 0;\n protocol: number = 0;\n userData: Buffer = Buffer.from(\"\");\n abandoned: boolean = false;\n acked: boolean = false;\n misses: number = 0;\n retransmit: boolean = false;\n sentCount: number = 0;\n bookSize: number = 0;\n expiry?: number;\n maxRetransmits?: number;\n sentTime?: number;\n\n constructor(\n public flags = 0,\n body: Buffer | undefined,\n ) {\n super(flags, body);\n if (body) {\n [this.tsn, this.streamId, this.streamSeqNum, this.protocol] =\n jspack.Unpack(\"!LHHL\", body);\n this.userData = body.slice(12);\n }\n }\n\n get bytes() {\n const length = 16 + this.userData.length;\n let data = Buffer.concat([\n Buffer.from(\n jspack.Pack(\"!BBHLHHL\", [\n this.type,\n this.flags,\n length,\n this.tsn,\n this.streamId,\n this.streamSeqNum,\n this.protocol,\n ]),\n ),\n this.userData,\n ]);\n if (length % 4) {\n data = Buffer.concat([\n data,\n ...[...Array(padL(length))].map(() => Buffer.from(\"\\x00\")),\n ]);\n }\n return data;\n }\n}\n\nexport class CookieEchoChunk extends Chunk {\n static type = 10 as const;\n\n get type() {\n return CookieEchoChunk.type;\n }\n}\n\nexport class CookieAckChunk extends Chunk {\n static type = 11 as const;\n\n get type() {\n return CookieAckChunk.type;\n }\n}\n\nexport class BaseParamsChunk extends Chunk {\n params: [number, Buffer][] = [];\n constructor(\n public flags = 0,\n body: Buffer | undefined = undefined,\n ) {\n super(flags, body);\n if (body) {\n this.params = decodeParams(body);\n }\n }\n\n get body() {\n return encodeParams(this.params);\n }\n}\n\nexport class AbortChunk extends BaseParamsChunk {\n static type = 6 as const;\n\n get type() {\n return AbortChunk.type;\n }\n}\n\nexport class ErrorChunk extends BaseParamsChunk {\n static type = 9 as const;\n static readonly CODE = {\n InvalidStreamIdentifier: 1,\n MissingMandatoryParameter: 2,\n StaleCookieError: 3,\n OutofResource: 4,\n UnresolvableAddress: 5,\n UnrecognizedChunkType: 6,\n InvalidMandatoryParameter: 7,\n UnrecognizedParameters: 8,\n NoUserData: 9,\n CookieReceivedWhileShuttingDown: 10,\n RestartofanAssociationwithNewAddresses: 11,\n UserInitiatedAbort: 12,\n ProtocolViolation: 13,\n } as const;\n\n get type() {\n return ErrorChunk.type;\n }\n\n get descriptions() {\n return this.params.map(([code, body]) => {\n const name = (Object.entries(ErrorChunk.CODE).find(\n ([, num]) => num === code,\n ) || [])[0];\n return { name, body };\n });\n }\n}\n\nexport class HeartbeatChunk extends BaseParamsChunk {\n static type = 4 as const;\n\n get type() {\n return HeartbeatChunk.type;\n }\n}\n\nexport class HeartbeatAckChunk extends BaseParamsChunk {\n static type = 5 as const;\n\n get type() {\n return HeartbeatAckChunk.type;\n }\n}\n\n// https://tools.ietf.org/html/rfc6525#section-3.1\n// chunkReconfig represents an SCTP Chunk used to reconfigure streams.\n//\n// 0 1 2 3\n// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | Type = 130 | Chunk Flags | Chunk Length |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// \\ \\\n// / Re-configuration Parameter /\n// \\ \\\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// \\ \\\n// / Re-configuration Parameter (optional) /\n// \\ \\\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\nexport class ReconfigChunk extends BaseParamsChunk {\n static type = 130 as const;\n\n get type() {\n return ReconfigChunk.type;\n }\n}\n\nexport class SackChunk extends Chunk {\n static type = 3;\n get type() {\n return SackChunk.type;\n }\n\n gaps: [number, number][] = [];\n duplicates: number[] = [];\n cumulativeTsn = 0;\n advertisedRwnd = 0;\n\n constructor(\n public flags = 0,\n body: Buffer | undefined,\n ) {\n super(flags, body);\n\n if (body) {\n const [cumulativeTsn, advertisedRwnd, nbGaps, nbDuplicates] =\n jspack.Unpack(\"!LLHH\", body);\n this.cumulativeTsn = cumulativeTsn;\n this.advertisedRwnd = advertisedRwnd;\n\n let pos = 12;\n\n [...Array(nbGaps)].forEach(() => {\n this.gaps.push(\n jspack.Unpack(\"!HH\", body.slice(pos)) as [number, number],\n );\n pos += 4;\n });\n\n [...Array(nbDuplicates)].forEach(() => {\n this.duplicates.push(jspack.Unpack(\"!L\", body.slice(pos))[0]);\n pos += 4;\n });\n }\n }\n\n get bytes() {\n const length = 16 + 4 * (this.gaps.length + this.duplicates.length);\n let data = Buffer.from(\n jspack.Pack(\"!BBHLLHH\", [\n this.type,\n this.flags,\n length,\n this.cumulativeTsn,\n this.advertisedRwnd,\n this.gaps.length,\n this.duplicates.length,\n ]),\n );\n data = Buffer.concat([\n data,\n ...this.gaps.map((gap) => Buffer.from(jspack.Pack(\"!HH\", gap))),\n ]);\n data = Buffer.concat([\n data,\n ...this.duplicates.map((tsn) => Buffer.from(jspack.Pack(\"!L\", [tsn]))),\n ]);\n return data;\n }\n}\n\nexport class ShutdownChunk extends Chunk {\n static type = 7;\n get type() {\n return ShutdownChunk.type;\n }\n\n cumulativeTsn = 0;\n\n constructor(\n public flags = 0,\n body: Buffer | undefined,\n ) {\n super(flags, body);\n\n if (body) {\n this.cumulativeTsn = jspack.Unpack(\"!L\", body)[0];\n }\n }\n\n get body() {\n return Buffer.from(jspack.Pack(\"!L\", [this.cumulativeTsn]));\n }\n}\n\nexport class ShutdownAckChunk extends Chunk {\n static type = 8;\n get type() {\n return ShutdownAckChunk.type;\n }\n}\n\nexport class ShutdownCompleteChunk extends Chunk {\n static type = 14;\n get type() {\n return ShutdownCompleteChunk.type;\n }\n}\n\nconst CHUNK_CLASSES: (typeof Chunk)[] = [\n DataChunk,\n InitChunk,\n InitAckChunk,\n SackChunk,\n HeartbeatChunk,\n HeartbeatAckChunk,\n AbortChunk,\n ShutdownChunk,\n ShutdownAckChunk,\n ErrorChunk,\n CookieEchoChunk,\n CookieAckChunk,\n ShutdownCompleteChunk,\n ReconfigChunk,\n ForwardTsnChunk,\n];\n\nexport const CHUNK_BY_TYPE = CHUNK_CLASSES.reduce(\n (acc: { [key: string]: typeof Chunk }, cur) => {\n acc[cur.type] = cur;\n return acc;\n },\n {},\n);\n\nfunction padL(l: number) {\n const m = l % 4;\n return m ? 4 - m : 0;\n}\n\nfunction encodeParams(params: [number, Buffer][]) {\n let body = Buffer.from(\"\");\n let padding = Buffer.from(\"\");\n params.forEach(([type, value]) => {\n const length = value.length + 4;\n body = Buffer.concat([\n body,\n padding,\n Buffer.from(jspack.Pack(\"!HH\", [type, length])),\n value,\n ]);\n padding = Buffer.concat(\n [...Array(padL(length))].map(() => Buffer.from(\"\\x00\")),\n );\n });\n return body;\n}\n\nexport function decodeParams(body: Buffer): [number, Buffer][] {\n const params: [number, Buffer][] = [];\n let pos = 0;\n while (pos <= body.length - 4) {\n const [type, length] = jspack.Unpack(\"!HH\", body.slice(pos));\n params.push([type, body.slice(pos + 4, pos + length)]);\n pos += length + padL(length);\n }\n return params;\n}\n\nexport function parsePacket(data: Buffer): [number, number, number, Chunk[]] {\n if (data.length < 12)\n throw new Error(\"SCTP packet length is less than 12 bytes\");\n\n const [sourcePort, destinationPort, verificationTag] = jspack.Unpack(\n \"!HHL\",\n data,\n );\n\n const checkSum = data.readUInt32LE(8);\n\n const expect = crc32c(\n Buffer.concat([\n data.slice(0, 8),\n Buffer.from(\"\\x00\\x00\\x00\\x00\"),\n data.slice(12),\n ]),\n );\n\n if (checkSum !== expect) throw new Error(\"SCTP packet has invalid checksum\");\n\n const chunks: Chunk[] = [];\n let pos = 12;\n while (pos + 4 <= data.length) {\n const [chunkType, chunkFlags, chunkLength] = jspack.Unpack(\n \"!BBH\",\n data.slice(pos),\n );\n const chunkBody = data.slice(pos + 4, pos + chunkLength);\n const ChunkClass = CHUNK_BY_TYPE[chunkType.toString()];\n if (ChunkClass) {\n chunks.push(new ChunkClass(chunkFlags, chunkBody));\n } else {\n throw new Error(\"unknown\");\n }\n pos += chunkLength + padL(chunkLength);\n }\n return [sourcePort, destinationPort, verificationTag, chunks];\n}\n\nexport function serializePacket(\n sourcePort: number,\n destinationPort: number,\n verificationTag: number,\n chunk: Chunk,\n) {\n const header = Buffer.from(\n jspack.Pack(\"!HHL\", [sourcePort, destinationPort, verificationTag]),\n );\n const body = chunk.bytes;\n\n const checksum: number = crc32c(\n Buffer.concat([header, Buffer.from(\"\\x00\\x00\\x00\\x00\"), body]),\n );\n const checkSumBuf = Buffer.alloc(4);\n checkSumBuf.writeUInt32LE(checksum, 0);\n\n const packet = Buffer.concat([header, checkSumBuf, body]);\n\n return packet;\n}\n"]}
|
|
1
|
+
{"version":3,"file":"chunk.js","sourceRoot":"","sources":["../../../../sctp/src/chunk.ts"],"names":[],"mappings":"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","sourcesContent":["// ID Value Chunk Type\n// ----- ----------\n// 0 - Payload Data (DATA)\n// 1 - Initiation (INIT)\n// 2 - Initiation Acknowledgement (INIT ACK)\n// 3 - Selective Acknowledgement (SACK)\n// 4 - Heartbeat Request (HEARTBEAT)\n// 5 - Heartbeat Acknowledgement (HEARTBEAT ACK)\n// 6 - Abort (ABORT)\n// 7 - Shutdown (SHUTDOWN)\n// 8 - Shutdown Acknowledgement (SHUTDOWN ACK)\n// 9 - Operation Error (ERROR)\n// 10 - State Cookie (COOKIE ECHO)\n// 11 - Cookie Acknowledgement (COOKIE ACK)\n// 12 - Reserved for Explicit Congestion Notification Echo\n// (ECNE)\n// 13 - Reserved for Congestion Window Reduced (CWR)\n// 14 - Shutdown Complete (SHUTDOWN COMPLETE)\n// 15 to 62 - available\n// 63 - reserved for IETF-defined Chunk Extensions\n// 64 to 126 - available\n// 127 - reserved for IETF-defined Chunk Extensions\n// 128 to 190 - available\n// 191 - reserved for IETF-defined Chunk Extensions\n// 192 to 254 - available\n// 255 - reserved for IETF-defined Chunk Extensions\n\nimport crc32c from \"turbo-crc32/crc32c.js\";\n\nexport class Chunk {\n public get body(): Buffer | undefined {\n return this._body;\n }\n public set body(value: Buffer | undefined) {\n this._body = value;\n }\n static type = -1;\n\n constructor(\n public flags = 0,\n private _body: Buffer | undefined = Buffer.from(\"\"),\n ) {}\n\n get type() {\n return Chunk.type;\n }\n\n get bytes() {\n if (!this.body) throw new Error();\n\n const header = Buffer.alloc(4);\n header.writeUInt8(this.type, 0);\n header.writeUInt8(this.flags, 1);\n header.writeUInt16BE(this.body.length + 4, 2);\n\n const data = Buffer.concat([\n header,\n this.body,\n ...[...Array(padL(this.body.length))].map(() => Buffer.from(\"\\x00\")),\n ]);\n return data;\n }\n}\n\nexport class BaseInitChunk extends Chunk {\n initiateTag: number;\n advertisedRwnd: number;\n outboundStreams: number;\n inboundStreams: number;\n initialTsn: number;\n params: [number, Buffer][];\n\n constructor(\n public flags = 0,\n body?: Buffer,\n ) {\n super(flags, body);\n\n if (body) {\n this.initiateTag = body.readUInt32BE(0);\n this.advertisedRwnd = body.readUInt32BE(4);\n this.outboundStreams = body.readUInt16BE(8);\n this.inboundStreams = body.readUInt16BE(10);\n this.initialTsn = body.readUInt32BE(12);\n this.params = decodeParams(body.slice(16));\n } else {\n this.initiateTag = 0;\n this.advertisedRwnd = 0;\n this.outboundStreams = 0;\n this.inboundStreams = 0;\n this.initialTsn = 0;\n this.params = [];\n }\n }\n\n get body() {\n const body = Buffer.alloc(16);\n body.writeUInt32BE(this.initiateTag, 0);\n body.writeUInt32BE(this.advertisedRwnd, 4);\n body.writeUInt16BE(this.outboundStreams, 8);\n body.writeUInt16BE(this.inboundStreams, 10);\n body.writeUInt32BE(this.initialTsn, 12);\n return Buffer.concat([body, encodeParams(this.params)]);\n }\n}\n\nexport class InitChunk extends BaseInitChunk {\n static type = 1 as const;\n\n get type() {\n return InitChunk.type;\n }\n}\n\nexport class InitAckChunk extends BaseInitChunk {\n static type = 2 as const;\n\n get type() {\n return InitAckChunk.type;\n }\n}\n\nexport class ReConfigChunk extends BaseInitChunk {\n static type = 130 as const;\n\n get type() {\n return ReConfigChunk.type;\n }\n}\n\nexport class ForwardTsnChunk extends Chunk {\n static type = 192 as const;\n streams: [number, number][] = [];\n cumulativeTsn: number;\n\n constructor(\n public flags = 0,\n body: Buffer | undefined,\n ) {\n super(flags, body);\n\n if (body) {\n this.cumulativeTsn = body.readUInt32BE(0);\n let pos = 4;\n while (pos < body.length) {\n this.streams.push([body.readUInt16BE(pos), body.readUInt16BE(pos + 2)]);\n pos += 4;\n }\n } else {\n this.cumulativeTsn = 0;\n }\n }\n\n get type() {\n return ForwardTsnChunk.type;\n }\n\n set body(_: Buffer) {}\n\n get body() {\n const body = Buffer.alloc(4);\n body.writeUInt32BE(this.cumulativeTsn, 0);\n return Buffer.concat([\n body,\n ...this.streams.map(([id, seq]) => {\n const streamBuffer = Buffer.alloc(4);\n streamBuffer.writeUInt16BE(id, 0);\n streamBuffer.writeUInt16BE(seq, 2);\n return streamBuffer;\n }),\n ]);\n }\n}\n\nexport class DataChunk extends Chunk {\n static type = 0 as const;\n get type() {\n return DataChunk.type;\n }\n tsn: number = 0;\n streamId: number = 0;\n streamSeqNum: number = 0;\n protocol: number = 0;\n userData: Buffer = Buffer.from(\"\");\n abandoned: boolean = false;\n acked: boolean = false;\n misses: number = 0;\n retransmit: boolean = false;\n sentCount: number = 0;\n bookSize: number = 0;\n expiry?: number;\n maxRetransmits?: number;\n sentTime?: number;\n\n constructor(\n public flags = 0,\n body: Buffer | undefined,\n ) {\n super(flags, body);\n if (body) {\n this.tsn = body.readUInt32BE(0);\n this.streamId = body.readUInt16BE(4);\n this.streamSeqNum = body.readUInt16BE(6);\n this.protocol = body.readUInt32BE(8);\n this.userData = body.slice(12);\n }\n }\n\n get bytes() {\n const length = 16 + this.userData.length;\n const header = Buffer.alloc(16);\n header.writeUInt8(this.type, 0);\n header.writeUInt8(this.flags, 1);\n header.writeUInt16BE(length, 2);\n header.writeUInt32BE(this.tsn, 4);\n header.writeUInt16BE(this.streamId, 8);\n header.writeUInt16BE(this.streamSeqNum, 10);\n header.writeUInt32BE(this.protocol, 12);\n\n let data = Buffer.concat([header, this.userData]);\n if (length % 4) {\n data = Buffer.concat([\n data,\n ...[...Array(padL(length))].map(() => Buffer.from(\"\\x00\")),\n ]);\n }\n return data;\n }\n}\n\nexport class CookieEchoChunk extends Chunk {\n static type = 10 as const;\n\n get type() {\n return CookieEchoChunk.type;\n }\n}\n\nexport class CookieAckChunk extends Chunk {\n static type = 11 as const;\n\n get type() {\n return CookieAckChunk.type;\n }\n}\n\nexport class BaseParamsChunk extends Chunk {\n params: [number, Buffer][] = [];\n constructor(\n public flags = 0,\n body: Buffer | undefined = undefined,\n ) {\n super(flags, body);\n if (body) {\n this.params = decodeParams(body);\n }\n }\n\n get body() {\n return encodeParams(this.params);\n }\n}\n\nexport class AbortChunk extends BaseParamsChunk {\n static type = 6 as const;\n\n get type() {\n return AbortChunk.type;\n }\n}\n\nexport class ErrorChunk extends BaseParamsChunk {\n static type = 9 as const;\n static readonly CODE = {\n InvalidStreamIdentifier: 1,\n MissingMandatoryParameter: 2,\n StaleCookieError: 3,\n OutofResource: 4,\n UnresolvableAddress: 5,\n UnrecognizedChunkType: 6,\n InvalidMandatoryParameter: 7,\n UnrecognizedParameters: 8,\n NoUserData: 9,\n CookieReceivedWhileShuttingDown: 10,\n RestartofanAssociationwithNewAddresses: 11,\n UserInitiatedAbort: 12,\n ProtocolViolation: 13,\n } as const;\n\n get type() {\n return ErrorChunk.type;\n }\n\n get descriptions() {\n return this.params.map(([code, body]) => {\n const name = (Object.entries(ErrorChunk.CODE).find(\n ([, num]) => num === code,\n ) || [])[0];\n return { name, body };\n });\n }\n}\n\nexport class HeartbeatChunk extends BaseParamsChunk {\n static type = 4 as const;\n\n get type() {\n return HeartbeatChunk.type;\n }\n}\n\nexport class HeartbeatAckChunk extends BaseParamsChunk {\n static type = 5 as const;\n\n get type() {\n return HeartbeatAckChunk.type;\n }\n}\n\n// https://tools.ietf.org/html/rfc6525#section-3.1\n// chunkReconfig represents an SCTP Chunk used to reconfigure streams.\n//\n// 0 1 2 3\n// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// | Type = 130 | Chunk Flags | Chunk Length |\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// \\ \\\n// / Re-configuration Parameter /\n// \\ \\\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n// \\ \\\n// / Re-configuration Parameter (optional) /\n// \\ \\\n// +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\nexport class ReconfigChunk extends BaseParamsChunk {\n static type = 130 as const;\n\n get type() {\n return ReconfigChunk.type;\n }\n}\n\nexport class SackChunk extends Chunk {\n static type = 3;\n get type() {\n return SackChunk.type;\n }\n\n gaps: [number, number][] = [];\n duplicates: number[] = [];\n cumulativeTsn = 0;\n advertisedRwnd = 0;\n\n constructor(\n public flags = 0,\n body: Buffer | undefined,\n ) {\n super(flags, body);\n\n if (body) {\n this.cumulativeTsn = body.readUInt32BE(0);\n this.advertisedRwnd = body.readUInt32BE(4);\n const nbGaps = body.readUInt16BE(8);\n const nbDuplicates = body.readUInt16BE(10);\n\n let pos = 12;\n\n [...Array(nbGaps)].forEach(() => {\n this.gaps.push([body.readUInt16BE(pos), body.readUInt16BE(pos + 2)]);\n pos += 4;\n });\n\n [...Array(nbDuplicates)].forEach(() => {\n this.duplicates.push(body.readUInt32BE(pos));\n pos += 4;\n });\n }\n }\n\n get bytes() {\n const length = 16 + 4 * (this.gaps.length + this.duplicates.length);\n const header = Buffer.alloc(16);\n header.writeUInt8(this.type, 0);\n header.writeUInt8(this.flags, 1);\n header.writeUInt16BE(length, 2);\n header.writeUInt32BE(this.cumulativeTsn, 4);\n header.writeUInt32BE(this.advertisedRwnd, 8);\n header.writeUInt16BE(this.gaps.length, 12);\n header.writeUInt16BE(this.duplicates.length, 14);\n\n let data = Buffer.concat([\n header,\n ...this.gaps.map((gap) => {\n const gapBuffer = Buffer.alloc(4);\n gapBuffer.writeUInt16BE(gap[0], 0);\n gapBuffer.writeUInt16BE(gap[1], 2);\n return gapBuffer;\n }),\n ]);\n data = Buffer.concat([\n data,\n ...this.duplicates.map((tsn) => {\n const tsnBuffer = Buffer.alloc(4);\n tsnBuffer.writeUInt32BE(tsn, 0);\n return tsnBuffer;\n }),\n ]);\n return data;\n }\n}\n\nexport class ShutdownChunk extends Chunk {\n static type = 7;\n get type() {\n return ShutdownChunk.type;\n }\n\n cumulativeTsn = 0;\n\n constructor(\n public flags = 0,\n body: Buffer | undefined,\n ) {\n super(flags, body);\n\n if (body) {\n this.cumulativeTsn = body.readUInt32BE(0);\n }\n }\n\n get body() {\n const body = Buffer.alloc(4);\n body.writeUInt32BE(this.cumulativeTsn, 0);\n return body;\n }\n}\n\nexport class ShutdownAckChunk extends Chunk {\n static type = 8;\n get type() {\n return ShutdownAckChunk.type;\n }\n}\n\nexport class ShutdownCompleteChunk extends Chunk {\n static type = 14;\n get type() {\n return ShutdownCompleteChunk.type;\n }\n}\n\nconst CHUNK_CLASSES: (typeof Chunk)[] = [\n DataChunk,\n InitChunk,\n InitAckChunk,\n SackChunk,\n HeartbeatChunk,\n HeartbeatAckChunk,\n AbortChunk,\n ShutdownChunk,\n ShutdownAckChunk,\n ErrorChunk,\n CookieEchoChunk,\n CookieAckChunk,\n ShutdownCompleteChunk,\n ReconfigChunk,\n ForwardTsnChunk,\n];\n\nexport const CHUNK_BY_TYPE = CHUNK_CLASSES.reduce(\n (acc: { [key: string]: typeof Chunk }, cur) => {\n acc[cur.type] = cur;\n return acc;\n },\n {},\n);\n\nfunction padL(l: number) {\n const m = l % 4;\n return m ? 4 - m : 0;\n}\n\nfunction encodeParams(params: [number, Buffer][]) {\n let body = Buffer.from(\"\");\n let padding = Buffer.from(\"\");\n params.forEach(([type, value]) => {\n const length = value.length + 4;\n const paramHeader = Buffer.alloc(4);\n paramHeader.writeUInt16BE(type, 0);\n paramHeader.writeUInt16BE(length, 2);\n body = Buffer.concat([body, padding, paramHeader, value]);\n padding = Buffer.concat(\n [...Array(padL(length))].map(() => Buffer.from(\"\\x00\")),\n );\n });\n return body;\n}\n\nexport function decodeParams(body: Buffer): [number, Buffer][] {\n const params: [number, Buffer][] = [];\n let pos = 0;\n while (pos <= body.length - 4) {\n const type = body.readUInt16BE(pos);\n const length = body.readUInt16BE(pos + 2);\n params.push([type, body.slice(pos + 4, pos + length)]);\n pos += length + padL(length);\n }\n return params;\n}\n\nexport function parsePacket(data: Buffer): [number, number, number, Chunk[]] {\n if (data.length < 12)\n throw new Error(\"SCTP packet length is less than 12 bytes\");\n\n const sourcePort = data.readUInt16BE(0);\n const destinationPort = data.readUInt16BE(2);\n const verificationTag = data.readUInt32BE(4);\n\n const checkSum = data.readUInt32LE(8);\n\n const expect = crc32c(\n Buffer.concat([\n data.slice(0, 8),\n Buffer.from(\"\\x00\\x00\\x00\\x00\"),\n data.slice(12),\n ]),\n );\n\n if (checkSum !== expect) throw new Error(\"SCTP packet has invalid checksum\");\n\n const chunks: Chunk[] = [];\n let pos = 12;\n while (pos + 4 <= data.length) {\n const chunkType = data.readUInt8(pos);\n const chunkFlags = data.readUInt8(pos + 1);\n const chunkLength = data.readUInt16BE(pos + 2);\n const chunkBody = data.slice(pos + 4, pos + chunkLength);\n const ChunkClass = CHUNK_BY_TYPE[chunkType.toString()];\n if (ChunkClass) {\n chunks.push(new ChunkClass(chunkFlags, chunkBody));\n } else {\n throw new Error(\"unknown\");\n }\n pos += chunkLength + padL(chunkLength);\n }\n return [sourcePort, destinationPort, verificationTag, chunks];\n}\n\nexport function serializePacket(\n sourcePort: number,\n destinationPort: number,\n verificationTag: number,\n chunk: Chunk,\n) {\n const header = Buffer.alloc(8);\n header.writeUInt16BE(sourcePort, 0);\n header.writeUInt16BE(destinationPort, 2);\n header.writeUInt32BE(verificationTag, 4);\n\n const body = chunk.bytes;\n\n const checksum: number = crc32c(\n Buffer.concat([header, Buffer.from(\"\\x00\\x00\\x00\\x00\"), body]),\n );\n const checkSumBuf = Buffer.alloc(4);\n checkSumBuf.writeUInt32LE(checksum, 0);\n\n const packet = Buffer.concat([header, checkSumBuf, body]);\n\n return packet;\n}\n"]}
|
package/lib/sctp/src/param.d.ts
CHANGED
|
@@ -6,7 +6,7 @@ export declare class OutgoingSSNResetRequestParam {
|
|
|
6
6
|
static type: number;
|
|
7
7
|
constructor(requestSequence: number, responseSequence: number, lastTsn: number, streams: number[]);
|
|
8
8
|
get type(): number;
|
|
9
|
-
get bytes(): Buffer
|
|
9
|
+
get bytes(): Buffer<ArrayBuffer>;
|
|
10
10
|
static parse(data: Buffer): OutgoingSSNResetRequestParam;
|
|
11
11
|
}
|
|
12
12
|
export declare class StreamAddOutgoingParam {
|
|
@@ -15,7 +15,7 @@ export declare class StreamAddOutgoingParam {
|
|
|
15
15
|
static type: number;
|
|
16
16
|
constructor(requestSequence: number, newStreams: number);
|
|
17
17
|
get type(): number;
|
|
18
|
-
get bytes(): Buffer
|
|
18
|
+
get bytes(): Buffer<ArrayBuffer>;
|
|
19
19
|
static parse(data: Buffer): StreamAddOutgoingParam;
|
|
20
20
|
}
|
|
21
21
|
export declare const reconfigResult: {
|
|
@@ -29,7 +29,7 @@ export declare class ReconfigResponseParam {
|
|
|
29
29
|
static type: number;
|
|
30
30
|
constructor(responseSequence: number, result: ReconfigResult);
|
|
31
31
|
get type(): number;
|
|
32
|
-
get bytes(): Buffer
|
|
32
|
+
get bytes(): Buffer<ArrayBuffer>;
|
|
33
33
|
static parse(data: Buffer): ReconfigResponseParam;
|
|
34
34
|
}
|
|
35
35
|
export type StreamParam = OutgoingSSNResetRequestParam | StreamAddOutgoingParam | ReconfigResponseParam;
|
package/lib/sctp/src/sctp.d.ts
CHANGED
|
@@ -9,12 +9,13 @@ type SCTPConnectionState = Unpacked<typeof SCTPConnectionStates>;
|
|
|
9
9
|
export declare class SCTP {
|
|
10
10
|
transport: Transport;
|
|
11
11
|
port: number;
|
|
12
|
+
flush: Event<[void]>;
|
|
12
13
|
readonly stateChanged: {
|
|
13
14
|
[key in SCTPConnectionState]: Event<[]>;
|
|
14
15
|
};
|
|
15
16
|
readonly onReconfigStreams: Event<[number[]]>;
|
|
16
17
|
/**streamId: number, ppId: number, data: Buffer */
|
|
17
|
-
readonly onReceive: Event<[number, number, Buffer]>;
|
|
18
|
+
readonly onReceive: Event<[number, number, Buffer<ArrayBufferLike>]>;
|
|
18
19
|
onSackReceived: () => Promise<void>;
|
|
19
20
|
associationState: SCTP_STATE;
|
|
20
21
|
started: boolean;
|
|
@@ -36,6 +37,7 @@ export declare class SCTP {
|
|
|
36
37
|
private sackDuplicates;
|
|
37
38
|
private sackMisOrdered;
|
|
38
39
|
private sackNeeded;
|
|
40
|
+
private sackTimeout;
|
|
39
41
|
private cwnd;
|
|
40
42
|
private fastRecoveryExit?;
|
|
41
43
|
private fastRecoveryTransmit;
|
package/lib/sctp/src/sctp.js
CHANGED
|
@@ -56,6 +56,12 @@ class SCTP {
|
|
|
56
56
|
writable: true,
|
|
57
57
|
value: port
|
|
58
58
|
});
|
|
59
|
+
Object.defineProperty(this, "flush", {
|
|
60
|
+
enumerable: true,
|
|
61
|
+
configurable: true,
|
|
62
|
+
writable: true,
|
|
63
|
+
value: new common_1.Event()
|
|
64
|
+
});
|
|
59
65
|
Object.defineProperty(this, "stateChanged", {
|
|
60
66
|
enumerable: true,
|
|
61
67
|
configurable: true,
|
|
@@ -202,6 +208,12 @@ class SCTP {
|
|
|
202
208
|
writable: true,
|
|
203
209
|
value: false
|
|
204
210
|
});
|
|
211
|
+
Object.defineProperty(this, "sackTimeout", {
|
|
212
|
+
enumerable: true,
|
|
213
|
+
configurable: true,
|
|
214
|
+
writable: true,
|
|
215
|
+
value: void 0
|
|
216
|
+
});
|
|
205
217
|
// # outbound
|
|
206
218
|
Object.defineProperty(this, "cwnd", {
|
|
207
219
|
enumerable: true,
|
|
@@ -437,7 +449,13 @@ class SCTP {
|
|
|
437
449
|
await this.transmit();
|
|
438
450
|
}
|
|
439
451
|
else {
|
|
440
|
-
|
|
452
|
+
if (this.outboundQueue.length) {
|
|
453
|
+
await this.flush.asPromise();
|
|
454
|
+
}
|
|
455
|
+
else {
|
|
456
|
+
// unreachable?
|
|
457
|
+
await new Promise((r) => setImmediate(r));
|
|
458
|
+
}
|
|
441
459
|
}
|
|
442
460
|
}
|
|
443
461
|
});
|
|
@@ -569,6 +587,12 @@ class SCTP {
|
|
|
569
587
|
}
|
|
570
588
|
}
|
|
571
589
|
async sendSack() {
|
|
590
|
+
if (this.sackTimeout)
|
|
591
|
+
return;
|
|
592
|
+
await new Promise((r) => (this.sackTimeout = setImmediate(r)));
|
|
593
|
+
this.sackTimeout = undefined;
|
|
594
|
+
if (!this.sackNeeded)
|
|
595
|
+
return;
|
|
572
596
|
const gaps = [];
|
|
573
597
|
let gapNext;
|
|
574
598
|
[...this.sackMisOrdered].sort().forEach((tsn) => {
|
|
@@ -869,6 +893,10 @@ class SCTP {
|
|
|
869
893
|
this.updateRto(receivedTime - sChunk.sentTime);
|
|
870
894
|
}
|
|
871
895
|
}
|
|
896
|
+
// Furthermore, this exposed an issue I've seen in v8 in other projects: using an array as a queue seems to result in long calls to shift (it does an array copy under the hood?). The problem seems to get worse the more times it shifts. Resetting the queue to empty array mitigates this.
|
|
897
|
+
if (!this.sentQueue.length) {
|
|
898
|
+
this.sentQueue = [];
|
|
899
|
+
}
|
|
872
900
|
// # handle gap blocks
|
|
873
901
|
let loss = false;
|
|
874
902
|
if (chunk.gaps.length > 0) {
|
|
@@ -1077,6 +1105,9 @@ class SCTP {
|
|
|
1077
1105
|
this.timer3Start();
|
|
1078
1106
|
}
|
|
1079
1107
|
}
|
|
1108
|
+
// Resetting the queue to empty array mitigates this.
|
|
1109
|
+
this.outboundQueue = [];
|
|
1110
|
+
this.flush.execute();
|
|
1080
1111
|
}
|
|
1081
1112
|
async transmitReconfigRequest() {
|
|
1082
1113
|
if (this.reconfigQueue.length > 0 &&
|
|
@@ -1192,6 +1223,10 @@ class SCTP {
|
|
|
1192
1223
|
streams[chunk.streamId] = chunk.streamSeqNum;
|
|
1193
1224
|
}
|
|
1194
1225
|
}
|
|
1226
|
+
// Resetting the queue to empty array mitigates this.
|
|
1227
|
+
if (!this.sentQueue.length) {
|
|
1228
|
+
this.sentQueue = [];
|
|
1229
|
+
}
|
|
1195
1230
|
if (done) {
|
|
1196
1231
|
this.forwardTsnChunk = new chunk_1.ForwardTsnChunk(0, undefined);
|
|
1197
1232
|
this.forwardTsnChunk.cumulativeTsn = this.advancedPeerAckTsn;
|