werift 0.15.10 → 0.16.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/lib/common/src/index.d.ts +2 -0
- package/lib/common/src/index.js +2 -0
- package/lib/common/src/index.js.map +1 -1
- package/lib/common/src/log.d.ts +11 -0
- package/lib/common/src/log.js +17 -0
- package/lib/common/src/log.js.map +1 -0
- package/lib/common/src/network.d.ts +7 -3
- package/lib/common/src/network.js +15 -7
- package/lib/common/src/network.js.map +1 -1
- package/lib/common/src/type.d.ts +3 -0
- package/lib/common/src/type.js +3 -0
- package/lib/common/src/type.js.map +1 -0
- package/lib/dtls/src/context/cipher.js.map +1 -1
- package/lib/dtls/src/flight/server/flight2.js +10 -0
- package/lib/dtls/src/flight/server/flight2.js.map +1 -1
- package/lib/ice/src/ice.d.ts +3 -0
- package/lib/ice/src/ice.js +9 -2
- package/lib/ice/src/ice.js.map +1 -1
- package/lib/ice/src/stun/protocol.d.ts +2 -1
- package/lib/ice/src/stun/protocol.js +3 -3
- package/lib/ice/src/stun/protocol.js.map +1 -1
- package/lib/ice/src/transport.d.ts +4 -2
- package/lib/ice/src/transport.js +8 -6
- package/lib/ice/src/transport.js.map +1 -1
- package/lib/ice/src/turn/protocol.d.ts +3 -1
- package/lib/ice/src/turn/protocol.js +2 -2
- package/lib/ice/src/turn/protocol.js.map +1 -1
- package/lib/ice/src/utils.d.ts +2 -1
- package/lib/ice/src/utils.js +2 -2
- package/lib/ice/src/utils.js.map +1 -1
- package/lib/rtp/src/codec/index.d.ts +18 -0
- package/lib/rtp/src/codec/index.js +81 -0
- package/lib/rtp/src/codec/index.js.map +1 -0
- package/lib/rtp/src/codec/vp8.d.ts +5 -3
- package/lib/rtp/src/codec/vp8.js +19 -5
- package/lib/rtp/src/codec/vp8.js.map +1 -1
- package/lib/rtp/src/container/webm.d.ts +6 -1
- package/lib/rtp/src/container/webm.js +9 -2
- package/lib/rtp/src/container/webm.js.map +1 -1
- package/lib/rtp/src/index.d.ts +2 -6
- package/lib/rtp/src/index.js +2 -6
- package/lib/rtp/src/index.js.map +1 -1
- package/lib/rtp/src/processor/base.d.ts +3 -1
- package/lib/rtp/src/processor/base.js +19 -6
- package/lib/rtp/src/processor/base.js.map +1 -1
- package/lib/rtp/src/processor/jitterBuffer.js +1 -2
- package/lib/rtp/src/processor/jitterBuffer.js.map +1 -1
- package/lib/rtp/src/processor/lipsync.js +22 -2
- package/lib/rtp/src/processor/lipsync.js.map +1 -1
- package/lib/rtp/src/processor/webm.d.ts +11 -7
- package/lib/rtp/src/processor/webm.js +16 -41
- package/lib/rtp/src/processor/webm.js.map +1 -1
- package/lib/rtp/src/processor_v2/depacketizer.d.ts +17 -0
- package/lib/rtp/src/processor_v2/depacketizer.js +84 -0
- package/lib/rtp/src/processor_v2/depacketizer.js.map +1 -0
- package/lib/rtp/src/processor_v2/index.d.ts +4 -0
- package/lib/rtp/src/processor_v2/index.js +21 -0
- package/lib/rtp/src/processor_v2/index.js.map +1 -0
- package/lib/rtp/src/processor_v2/jitterBuffer.d.ts +33 -0
- package/lib/rtp/src/processor_v2/jitterBuffer.js +154 -0
- package/lib/rtp/src/processor_v2/jitterBuffer.js.map +1 -0
- package/lib/rtp/src/processor_v2/source/base.d.ts +8 -0
- package/lib/rtp/src/processor_v2/source/base.js +16 -0
- package/lib/rtp/src/processor_v2/source/base.js.map +1 -0
- package/lib/rtp/src/processor_v2/source/index.d.ts +2 -0
- package/lib/rtp/src/processor_v2/source/index.js +6 -0
- package/lib/rtp/src/processor_v2/source/index.js.map +1 -0
- package/lib/rtp/src/processor_v2/source/rtp.d.ts +14 -0
- package/lib/rtp/src/processor_v2/source/rtp.js +24 -0
- package/lib/rtp/src/processor_v2/source/rtp.js.map +1 -0
- package/lib/rtp/src/processor_v2/webmLive.d.ts +51 -0
- package/lib/rtp/src/processor_v2/webmLive.js +154 -0
- package/lib/rtp/src/processor_v2/webmLive.js.map +1 -0
- package/lib/rtp/src/rtcp/header.d.ts +2 -1
- package/lib/rtp/src/rtcp/header.js +3 -2
- package/lib/rtp/src/rtcp/header.js.map +1 -1
- package/lib/rtp/src/rtcp/rr.d.ts +2 -0
- package/lib/rtp/src/rtcp/rr.js.map +1 -1
- package/lib/rtp/src/rtcp/rtcp.js +4 -4
- package/lib/rtp/src/rtcp/rtcp.js.map +1 -1
- package/lib/rtp/src/rtcp/rtpfb/index.js +1 -1
- package/lib/rtp/src/rtcp/rtpfb/index.js.map +1 -1
- package/lib/rtp/src/rtcp/rtpfb/nack.js +15 -7
- package/lib/rtp/src/rtcp/rtpfb/nack.js.map +1 -1
- package/lib/rtp/src/rtp/red/packet.d.ts +1 -0
- package/lib/rtp/src/rtp/red/packet.js.map +1 -1
- package/lib/rtp/src/rtp/rtp.d.ts +1 -0
- package/lib/rtp/src/rtp/rtp.js +27 -26
- package/lib/rtp/src/rtp/rtp.js.map +1 -1
- package/lib/rtp/src/srtp/cipher/ctr.d.ts +1 -1
- package/lib/rtp/src/srtp/cipher/ctr.js +14 -20
- package/lib/rtp/src/srtp/cipher/ctr.js.map +1 -1
- package/lib/webrtc/src/dataChannel.js +1 -1
- package/lib/webrtc/src/dataChannel.js.map +1 -1
- package/lib/webrtc/src/media/extension/rtpExtension.d.ts +2 -0
- package/lib/webrtc/src/media/extension/rtpExtension.js +8 -1
- package/lib/webrtc/src/media/extension/rtpExtension.js.map +1 -1
- package/lib/webrtc/src/media/parameters.d.ts +2 -0
- package/lib/webrtc/src/media/parameters.js +1 -0
- package/lib/webrtc/src/media/parameters.js.map +1 -1
- package/lib/webrtc/src/media/receiver/nack.d.ts +10 -5
- package/lib/webrtc/src/media/receiver/nack.js +44 -27
- package/lib/webrtc/src/media/receiver/nack.js.map +1 -1
- package/lib/webrtc/src/media/receiver/receiverTwcc.js +1 -1
- package/lib/webrtc/src/media/receiver/receiverTwcc.js.map +1 -1
- package/lib/webrtc/src/media/receiver/red.d.ts +1 -1
- package/lib/webrtc/src/media/receiver/red.js +14 -3
- package/lib/webrtc/src/media/receiver/red.js.map +1 -1
- package/lib/webrtc/src/media/router.d.ts +10 -3
- package/lib/webrtc/src/media/router.js +2 -0
- package/lib/webrtc/src/media/router.js.map +1 -1
- package/lib/webrtc/src/media/rtpReceiver.d.ts +11 -3
- package/lib/webrtc/src/media/rtpReceiver.js +42 -23
- package/lib/webrtc/src/media/rtpReceiver.js.map +1 -1
- package/lib/webrtc/src/media/rtpSender.d.ts +23 -2
- package/lib/webrtc/src/media/rtpSender.js +34 -10
- package/lib/webrtc/src/media/rtpSender.js.map +1 -1
- package/lib/webrtc/src/media/rtpTransceiver.d.ts +5 -1
- package/lib/webrtc/src/media/rtpTransceiver.js +9 -9
- package/lib/webrtc/src/media/rtpTransceiver.js.map +1 -1
- package/lib/webrtc/src/media/track.js +4 -2
- package/lib/webrtc/src/media/track.js.map +1 -1
- package/lib/webrtc/src/nonstandard/recorder/index.d.ts +5 -1
- package/lib/webrtc/src/nonstandard/recorder/index.js +2 -2
- package/lib/webrtc/src/nonstandard/recorder/index.js.map +1 -1
- package/lib/webrtc/src/nonstandard/recorder/writer/index.d.ts +1 -1
- package/lib/webrtc/src/nonstandard/recorder/writer/index.js +1 -1
- package/lib/webrtc/src/nonstandard/recorder/writer/index.js.map +1 -1
- package/lib/webrtc/src/nonstandard/recorder/writer/webm.d.ts +3 -3
- package/lib/webrtc/src/nonstandard/recorder/writer/webm.js +61 -41
- package/lib/webrtc/src/nonstandard/recorder/writer/webm.js.map +1 -1
- package/lib/webrtc/src/peerConnection.d.ts +13 -0
- package/lib/webrtc/src/peerConnection.js +40 -3
- package/lib/webrtc/src/peerConnection.js.map +1 -1
- package/lib/webrtc/src/sdp.d.ts +1 -0
- package/lib/webrtc/src/sdp.js +4 -0
- package/lib/webrtc/src/sdp.js.map +1 -1
- package/lib/webrtc/src/transport/dtls.js +6 -1
- package/lib/webrtc/src/transport/dtls.js.map +1 -1
- package/lib/webrtc/src/transport/sctp.js +1 -1
- package/lib/webrtc/src/transport/sctp.js.map +1 -1
- package/lib/webrtc/src/utils.d.ts +7 -2
- package/lib/webrtc/src/utils.js +9 -3
- package/lib/webrtc/src/utils.js.map +1 -1
- package/package.json +2 -2
- package/src/dataChannel.ts +1 -1
- package/src/media/extension/rtpExtension.ts +8 -0
- package/src/media/parameters.ts +3 -0
- package/src/media/receiver/nack.ts +45 -26
- package/src/media/receiver/receiverTwcc.ts +1 -1
- package/src/media/receiver/red.ts +14 -1
- package/src/media/router.ts +5 -3
- package/src/media/rtpReceiver.ts +59 -28
- package/src/media/rtpSender.ts +38 -12
- package/src/media/rtpTransceiver.ts +10 -8
- package/src/media/track.ts +6 -2
- package/src/nonstandard/recorder/index.ts +6 -2
- package/src/nonstandard/recorder/writer/index.ts +1 -1
- package/src/nonstandard/recorder/writer/webm.ts +105 -57
- package/src/peerConnection.ts +61 -7
- package/src/sdp.ts +3 -0
- package/src/transport/dtls.ts +5 -1
- package/src/transport/sctp.ts +1 -1
- package/src/utils.ts +8 -2
package/lib/rtp/src/rtp/rtp.js
CHANGED
|
@@ -10,7 +10,7 @@ const seqNumOffset = 2;
|
|
|
10
10
|
const timestampOffset = 4;
|
|
11
11
|
const ssrcOffset = 8;
|
|
12
12
|
const csrcOffset = 12;
|
|
13
|
-
const
|
|
13
|
+
const csrcSize = 4;
|
|
14
14
|
/*
|
|
15
15
|
* 0 1 2 3
|
|
16
16
|
* 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
|
|
@@ -39,6 +39,7 @@ class RtpHeader {
|
|
|
39
39
|
/**32bit milliseconds/1000 */
|
|
40
40
|
this.timestamp = 0;
|
|
41
41
|
this.ssrc = 0;
|
|
42
|
+
this.csrcLength = 0;
|
|
42
43
|
this.csrc = [];
|
|
43
44
|
this.extensionProfile = exports.ExtensionProfiles.OneByte;
|
|
44
45
|
this.extensions = [];
|
|
@@ -51,8 +52,8 @@ class RtpHeader {
|
|
|
51
52
|
h.version = (0, src_1.getBit)(v_p_x_cc, 0, 2);
|
|
52
53
|
h.padding = (0, src_1.getBit)(v_p_x_cc, 2) > 0;
|
|
53
54
|
h.extension = (0, src_1.getBit)(v_p_x_cc, 3) > 0;
|
|
54
|
-
|
|
55
|
-
h.csrc = [...Array(
|
|
55
|
+
h.csrcLength = (0, src_1.getBit)(v_p_x_cc, 4, 4);
|
|
56
|
+
h.csrc = [...Array(h.csrcLength)].map(() => {
|
|
56
57
|
const csrc = rawPacket.readUInt32BE(currOffset);
|
|
57
58
|
currOffset += 4;
|
|
58
59
|
return csrc;
|
|
@@ -65,15 +66,15 @@ class RtpHeader {
|
|
|
65
66
|
h.timestamp = rawPacket.readUInt32BE(timestampOffset);
|
|
66
67
|
h.ssrc = rawPacket.readUInt32BE(ssrcOffset);
|
|
67
68
|
for (let i = 0; i < h.csrc.length; i++) {
|
|
68
|
-
const offset = csrcOffset + i *
|
|
69
|
-
h.csrc[i] = rawPacket.
|
|
69
|
+
const offset = csrcOffset + i * csrcSize;
|
|
70
|
+
h.csrc[i] = rawPacket.subarray(offset).readUInt32BE();
|
|
70
71
|
}
|
|
71
72
|
if (h.extension) {
|
|
72
73
|
h.extensionProfile = rawPacket
|
|
73
|
-
.
|
|
74
|
+
.subarray(currOffset)
|
|
74
75
|
.readUInt16BE();
|
|
75
76
|
currOffset += 2;
|
|
76
|
-
const extensionLength = rawPacket.
|
|
77
|
+
const extensionLength = rawPacket.subarray(currOffset).readUInt16BE() * 4;
|
|
77
78
|
h.extensionLength = extensionLength;
|
|
78
79
|
currOffset += 2;
|
|
79
80
|
switch (h.extensionProfile) {
|
|
@@ -87,15 +88,14 @@ class RtpHeader {
|
|
|
87
88
|
continue;
|
|
88
89
|
}
|
|
89
90
|
const extId = rawPacket[currOffset] >> 4;
|
|
90
|
-
const len = // and not &^
|
|
91
|
-
(rawPacket[currOffset] & (rawPacket[currOffset] ^ 0xf0)) + 1;
|
|
91
|
+
const len = (rawPacket[currOffset] & (rawPacket[currOffset] ^ 0xf0)) + 1; // and not &^
|
|
92
92
|
currOffset++;
|
|
93
93
|
if (extId === 0xf) {
|
|
94
94
|
break;
|
|
95
95
|
}
|
|
96
96
|
const extension = {
|
|
97
97
|
id: extId,
|
|
98
|
-
payload: rawPacket.
|
|
98
|
+
payload: rawPacket.subarray(currOffset, currOffset + len),
|
|
99
99
|
};
|
|
100
100
|
h.extensions = [...h.extensions, extension];
|
|
101
101
|
currOffset += len;
|
|
@@ -117,7 +117,7 @@ class RtpHeader {
|
|
|
117
117
|
currOffset++;
|
|
118
118
|
const extension = {
|
|
119
119
|
id: extId,
|
|
120
|
-
payload: rawPacket.
|
|
120
|
+
payload: rawPacket.subarray(currOffset, currOffset + len),
|
|
121
121
|
};
|
|
122
122
|
h.extensions = [...h.extensions, extension];
|
|
123
123
|
currOffset += len;
|
|
@@ -128,7 +128,7 @@ class RtpHeader {
|
|
|
128
128
|
{
|
|
129
129
|
const extension = {
|
|
130
130
|
id: 0,
|
|
131
|
-
payload: rawPacket.
|
|
131
|
+
payload: rawPacket.subarray(currOffset, currOffset + extensionLength),
|
|
132
132
|
};
|
|
133
133
|
h.extensions = [...h.extensions, extension];
|
|
134
134
|
currOffset += h.extensions[0].payload.length;
|
|
@@ -144,19 +144,19 @@ class RtpHeader {
|
|
|
144
144
|
}
|
|
145
145
|
get serializeSize() {
|
|
146
146
|
const { csrc, extensionProfile, extensions } = this;
|
|
147
|
-
let size = 12 + csrc.length *
|
|
147
|
+
let size = 12 + csrc.length * csrcSize;
|
|
148
148
|
if (extensions.length > 0 || this.extension === true) {
|
|
149
149
|
let extSize = 4;
|
|
150
150
|
switch (extensionProfile) {
|
|
151
151
|
case exports.ExtensionProfiles.OneByte:
|
|
152
|
-
|
|
152
|
+
for (const extension of extensions) {
|
|
153
153
|
extSize += 1 + extension.payload.length;
|
|
154
|
-
}
|
|
154
|
+
}
|
|
155
155
|
break;
|
|
156
156
|
case exports.ExtensionProfiles.TwoByte:
|
|
157
|
-
|
|
157
|
+
for (const extension of extensions) {
|
|
158
158
|
extSize += 2 + extension.payload.length;
|
|
159
|
-
}
|
|
159
|
+
}
|
|
160
160
|
break;
|
|
161
161
|
default:
|
|
162
162
|
extSize += extensions[0].payload.length;
|
|
@@ -189,10 +189,10 @@ class RtpHeader {
|
|
|
189
189
|
offset += 4;
|
|
190
190
|
buf.writeUInt32BE(this.ssrc, ssrcOffset);
|
|
191
191
|
offset += 4;
|
|
192
|
-
this.csrc
|
|
192
|
+
for (const csrc of this.csrc) {
|
|
193
193
|
buf.writeUInt32BE(csrc, offset);
|
|
194
194
|
offset += 4;
|
|
195
|
-
}
|
|
195
|
+
}
|
|
196
196
|
if (this.extension) {
|
|
197
197
|
const extHeaderPos = offset;
|
|
198
198
|
buf.writeUInt16BE(this.extensionProfile, offset);
|
|
@@ -200,19 +200,19 @@ class RtpHeader {
|
|
|
200
200
|
const startExtensionsPos = offset;
|
|
201
201
|
switch (this.extensionProfile) {
|
|
202
202
|
case exports.ExtensionProfiles.OneByte:
|
|
203
|
-
this.extensions
|
|
203
|
+
for (const extension of this.extensions) {
|
|
204
204
|
buf.writeUInt8((extension.id << 4) | (extension.payload.length - 1), offset++);
|
|
205
205
|
extension.payload.copy(buf, offset);
|
|
206
206
|
offset += extension.payload.length;
|
|
207
|
-
}
|
|
207
|
+
}
|
|
208
208
|
break;
|
|
209
209
|
case exports.ExtensionProfiles.TwoByte: // 1バイトで収まらなくなった歴史的経緯
|
|
210
|
-
this.extensions
|
|
210
|
+
for (const extension of this.extensions) {
|
|
211
211
|
buf.writeUInt8(extension.id, offset++);
|
|
212
212
|
buf.writeUInt8(extension.payload.length, offset++);
|
|
213
213
|
extension.payload.copy(buf, offset);
|
|
214
214
|
offset += extension.payload.length;
|
|
215
|
-
}
|
|
215
|
+
}
|
|
216
216
|
break;
|
|
217
217
|
default:
|
|
218
218
|
const extLen = this.extensions[0].payload.length;
|
|
@@ -223,8 +223,9 @@ class RtpHeader {
|
|
|
223
223
|
offset += extLen;
|
|
224
224
|
}
|
|
225
225
|
const extSize = offset - startExtensionsPos;
|
|
226
|
-
const roundedExtSize = Math.
|
|
227
|
-
buf.writeUInt16BE(Math.
|
|
226
|
+
const roundedExtSize = Math.trunc((extSize + 3) / 4) * 4;
|
|
227
|
+
buf.writeUInt16BE(Math.trunc(roundedExtSize / 4), extHeaderPos + 2);
|
|
228
|
+
// padding 4 bytes boundaries
|
|
228
229
|
for (let i = 0; i < roundedExtSize - extSize; i++) {
|
|
229
230
|
buf.writeUInt8(0, offset);
|
|
230
231
|
offset++;
|
|
@@ -259,7 +260,7 @@ class RtpPacket {
|
|
|
259
260
|
}
|
|
260
261
|
static deSerialize(buf) {
|
|
261
262
|
const header = RtpHeader.deSerialize(buf);
|
|
262
|
-
const p = new RtpPacket(header, buf.
|
|
263
|
+
const p = new RtpPacket(header, buf.subarray(header.payloadOffset, buf.length - header.paddingSize));
|
|
263
264
|
return p;
|
|
264
265
|
}
|
|
265
266
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rtp.js","sourceRoot":"","sources":["../../../../../rtp/src/rtp/rtp.ts"],"names":[],"mappings":"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","sourcesContent":["import { BitWriter, getBit } from \"../../../common/src\";\n\nexport type Extension = { id: number; payload: Buffer };\n\nexport const ExtensionProfiles = {\n OneByte: 0xbede, // 48862\n TwoByte: 0x1000, // 4096\n} as const;\ntype ExtensionProfile =\n typeof ExtensionProfiles[keyof typeof ExtensionProfiles];\n\nconst seqNumOffset = 2;\nconst timestampOffset = 4;\nconst ssrcOffset = 8;\nconst csrcOffset = 12;\nconst csrcLength = 4;\n\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 * |V=2|P|X| CC |M| PT | sequence number |\n * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n * | timestamp |\n * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n * | synchronization source (SSRC) identifier |\n * +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+\n * | contributing source (CSRC) identifiers |\n * | .... |\n * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n */\n\nexport class RtpHeader {\n version: number = 2;\n padding: boolean = false;\n paddingSize: number = 0;\n extension: boolean = false;\n marker: boolean = false;\n payloadOffset: number = 0;\n payloadType: number = 0;\n /**16bit */\n sequenceNumber: number = 0;\n /**32bit milliseconds/1000 */\n timestamp: number = 0;\n ssrc: number = 0;\n csrc: number[] = [];\n extensionProfile: ExtensionProfile = ExtensionProfiles.OneByte;\n /**deserialize only */\n extensionLength?: number;\n extensions: Extension[] = [];\n constructor(props: Partial<RtpHeader> = {}) {\n Object.assign(this, props);\n }\n\n static deSerialize(rawPacket: Buffer) {\n const h = new RtpHeader();\n let currOffset = 0;\n const v_p_x_cc = rawPacket[currOffset++];\n h.version = getBit(v_p_x_cc, 0, 2);\n h.padding = getBit(v_p_x_cc, 2) > 0;\n h.extension = getBit(v_p_x_cc, 3) > 0;\n const cc = getBit(v_p_x_cc, 4, 4);\n h.csrc = [...Array(cc)].map(() => {\n const csrc = rawPacket.readUInt32BE(currOffset);\n currOffset += 4;\n return csrc;\n });\n currOffset += csrcOffset - 1;\n\n const m_pt = rawPacket[1];\n h.marker = getBit(m_pt, 0) > 0;\n h.payloadType = getBit(m_pt, 1, 7);\n\n h.sequenceNumber = rawPacket.readUInt16BE(seqNumOffset);\n h.timestamp = rawPacket.readUInt32BE(timestampOffset);\n h.ssrc = rawPacket.readUInt32BE(ssrcOffset);\n\n for (let i = 0; i < h.csrc.length; i++) {\n const offset = csrcOffset + i * csrcLength;\n h.csrc[i] = rawPacket.slice(offset).readUInt32BE();\n }\n if (h.extension) {\n h.extensionProfile = rawPacket\n .slice(currOffset)\n .readUInt16BE() as ExtensionProfile;\n currOffset += 2;\n const extensionLength = rawPacket.slice(currOffset).readUInt16BE() * 4;\n h.extensionLength = extensionLength;\n currOffset += 2;\n\n switch (h.extensionProfile) {\n // RFC 8285 RTP One Byte Header Extension\n case ExtensionProfiles.OneByte:\n {\n const end = currOffset + extensionLength;\n while (currOffset < end) {\n if (rawPacket[currOffset] === 0x00) {\n currOffset++;\n continue;\n }\n\n const extId = rawPacket[currOffset] >> 4;\n const len = // and not &^\n (rawPacket[currOffset] & (rawPacket[currOffset] ^ 0xf0)) + 1;\n currOffset++;\n if (extId === 0xf) {\n break;\n }\n const extension: Extension = {\n id: extId,\n payload: rawPacket.slice(currOffset, currOffset + len),\n };\n h.extensions = [...h.extensions, extension];\n currOffset += len;\n }\n }\n break;\n // RFC 8285 RTP Two Byte Header Extension\n case ExtensionProfiles.TwoByte:\n {\n const end = currOffset + extensionLength;\n while (currOffset < end) {\n if (rawPacket[currOffset] === 0x00) {\n currOffset++;\n continue;\n }\n const extId = rawPacket[currOffset];\n currOffset++;\n const len = rawPacket[currOffset];\n currOffset++;\n\n const extension: Extension = {\n id: extId,\n payload: rawPacket.slice(currOffset, currOffset + len),\n };\n h.extensions = [...h.extensions, extension];\n currOffset += len;\n }\n }\n break;\n default:\n {\n const extension: Extension = {\n id: 0,\n payload: rawPacket.slice(\n currOffset,\n currOffset + extensionLength\n ),\n };\n h.extensions = [...h.extensions, extension];\n currOffset += h.extensions[0].payload.length;\n }\n break;\n }\n }\n h.payloadOffset = currOffset;\n if (h.padding) {\n h.paddingSize = rawPacket[rawPacket.length - 1];\n }\n\n return h;\n }\n\n get serializeSize() {\n const { csrc, extensionProfile, extensions } = this;\n\n let size = 12 + csrc.length * csrcLength;\n\n if (extensions.length > 0 || this.extension === true) {\n let extSize = 4;\n switch (extensionProfile) {\n case ExtensionProfiles.OneByte:\n extensions.forEach((extension) => {\n extSize += 1 + extension.payload.length;\n });\n break;\n case ExtensionProfiles.TwoByte:\n extensions.forEach((extension) => {\n extSize += 2 + extension.payload.length;\n });\n break;\n default:\n extSize += extensions[0].payload.length;\n }\n size += Math.floor((extSize + 3) / 4) * 4;\n }\n\n return size;\n }\n\n serialize(size: number) {\n const buf = Buffer.alloc(size);\n let offset = 0;\n\n const v_p_x_cc = new BitWriter(8);\n v_p_x_cc.set(2, 0, this.version);\n if (this.padding) v_p_x_cc.set(1, 2, 1);\n if (this.extensions.length > 0) this.extension = true;\n if (this.extension) v_p_x_cc.set(1, 3, 1);\n v_p_x_cc.set(4, 4, this.csrc.length);\n buf.writeUInt8(v_p_x_cc.value, offset++);\n\n const m_pt = new BitWriter(8);\n if (this.marker) m_pt.set(1, 0, 1);\n m_pt.set(7, 1, this.payloadType);\n buf.writeUInt8(m_pt.value, offset++);\n\n buf.writeUInt16BE(this.sequenceNumber, seqNumOffset);\n offset += 2;\n buf.writeUInt32BE(this.timestamp, timestampOffset);\n offset += 4;\n buf.writeUInt32BE(this.ssrc, ssrcOffset);\n offset += 4;\n\n this.csrc.forEach((csrc) => {\n buf.writeUInt32BE(csrc, offset);\n offset += 4;\n });\n\n if (this.extension) {\n const extHeaderPos = offset;\n buf.writeUInt16BE(this.extensionProfile, offset);\n offset += 4;\n const startExtensionsPos = offset;\n\n switch (this.extensionProfile) {\n case ExtensionProfiles.OneByte:\n this.extensions.forEach((extension) => {\n buf.writeUInt8(\n (extension.id << 4) | (extension.payload.length - 1),\n offset++\n );\n extension.payload.copy(buf, offset);\n offset += extension.payload.length;\n });\n break;\n case ExtensionProfiles.TwoByte: // 1バイトで収まらなくなった歴史的経緯\n this.extensions.forEach((extension) => {\n buf.writeUInt8(extension.id, offset++);\n buf.writeUInt8(extension.payload.length, offset++);\n extension.payload.copy(buf, offset);\n offset += extension.payload.length;\n });\n break;\n default:\n const extLen = this.extensions[0].payload.length;\n if (extLen % 4 != 0) {\n throw new Error();\n }\n this.extensions[0].payload.copy(buf, offset);\n offset += extLen;\n }\n\n const extSize = offset - startExtensionsPos;\n const roundedExtSize = Math.floor((extSize + 3) / 4) * 4;\n\n buf.writeUInt16BE(Math.floor(roundedExtSize / 4), extHeaderPos + 2);\n for (let i = 0; i < roundedExtSize - extSize; i++) {\n buf.writeUInt8(0, offset);\n offset++;\n }\n }\n this.payloadOffset = offset;\n return buf;\n }\n}\n\nexport class RtpPacket {\n constructor(public header: RtpHeader, public payload: Buffer) {}\n\n get serializeSize() {\n return this.header.serializeSize + this.payload.length;\n }\n\n clone() {\n return new RtpPacket(new RtpHeader({ ...this.header }), this.payload);\n }\n\n serialize() {\n let buf = this.header.serialize(\n this.header.serializeSize + this.payload.length\n );\n const { payloadOffset } = this.header;\n this.payload.copy(buf, payloadOffset);\n if (this.header.padding) {\n const padding = Buffer.alloc(this.header.paddingSize);\n padding.writeUInt8(this.header.paddingSize, this.header.paddingSize - 1);\n buf = Buffer.concat([buf, padding]);\n }\n\n return buf;\n }\n\n static deSerialize(buf: Buffer) {\n const header = RtpHeader.deSerialize(buf);\n const p = new RtpPacket(\n header,\n buf.slice(header.payloadOffset, buf.length - header.paddingSize)\n );\n return p;\n }\n}\n"]}
|
|
1
|
+
{"version":3,"file":"rtp.js","sourceRoot":"","sources":["../../../../../rtp/src/rtp/rtp.ts"],"names":[],"mappings":"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","sourcesContent":["import { BitWriter, getBit } from \"../../../common/src\";\n\nexport type Extension = { id: number; payload: Buffer };\n\nexport const ExtensionProfiles = {\n OneByte: 0xbede, // 48862\n TwoByte: 0x1000, // 4096\n} as const;\ntype ExtensionProfile =\n typeof ExtensionProfiles[keyof typeof ExtensionProfiles];\n\nconst seqNumOffset = 2;\nconst timestampOffset = 4;\nconst ssrcOffset = 8;\nconst csrcOffset = 12;\nconst csrcSize = 4;\n\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 * |V=2|P|X| CC |M| PT | sequence number |\n * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n * | timestamp |\n * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n * | synchronization source (SSRC) identifier |\n * +=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+=+\n * | contributing source (CSRC) identifiers |\n * | .... |\n * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+\n */\n\nexport class RtpHeader {\n version: number = 2;\n padding: boolean = false;\n paddingSize: number = 0;\n extension: boolean = false;\n marker: boolean = false;\n payloadOffset: number = 0;\n payloadType: number = 0;\n /**16bit */\n sequenceNumber: number = 0;\n /**32bit milliseconds/1000 */\n timestamp: number = 0;\n ssrc: number = 0;\n csrcLength = 0;\n csrc: number[] = [];\n extensionProfile: ExtensionProfile = ExtensionProfiles.OneByte;\n /**deserialize only */\n extensionLength?: number;\n extensions: Extension[] = [];\n constructor(props: Partial<RtpHeader> = {}) {\n Object.assign(this, props);\n }\n\n static deSerialize(rawPacket: Buffer) {\n const h = new RtpHeader();\n let currOffset = 0;\n const v_p_x_cc = rawPacket[currOffset++];\n h.version = getBit(v_p_x_cc, 0, 2);\n h.padding = getBit(v_p_x_cc, 2) > 0;\n h.extension = getBit(v_p_x_cc, 3) > 0;\n h.csrcLength = getBit(v_p_x_cc, 4, 4);\n h.csrc = [...Array(h.csrcLength)].map(() => {\n const csrc = rawPacket.readUInt32BE(currOffset);\n currOffset += 4;\n return csrc;\n });\n currOffset += csrcOffset - 1;\n\n const m_pt = rawPacket[1];\n h.marker = getBit(m_pt, 0) > 0;\n h.payloadType = getBit(m_pt, 1, 7);\n\n h.sequenceNumber = rawPacket.readUInt16BE(seqNumOffset);\n h.timestamp = rawPacket.readUInt32BE(timestampOffset);\n h.ssrc = rawPacket.readUInt32BE(ssrcOffset);\n\n for (let i = 0; i < h.csrc.length; i++) {\n const offset = csrcOffset + i * csrcSize;\n h.csrc[i] = rawPacket.subarray(offset).readUInt32BE();\n }\n if (h.extension) {\n h.extensionProfile = rawPacket\n .subarray(currOffset)\n .readUInt16BE() as ExtensionProfile;\n currOffset += 2;\n const extensionLength = rawPacket.subarray(currOffset).readUInt16BE() * 4;\n h.extensionLength = extensionLength;\n currOffset += 2;\n\n switch (h.extensionProfile) {\n // RFC 8285 RTP One Byte Header Extension\n case ExtensionProfiles.OneByte:\n {\n const end = currOffset + extensionLength;\n while (currOffset < end) {\n if (rawPacket[currOffset] === 0x00) {\n currOffset++;\n continue;\n }\n\n const extId = rawPacket[currOffset] >> 4;\n const len =\n (rawPacket[currOffset] & (rawPacket[currOffset] ^ 0xf0)) + 1; // and not &^\n currOffset++;\n if (extId === 0xf) {\n break;\n }\n const extension: Extension = {\n id: extId,\n payload: rawPacket.subarray(currOffset, currOffset + len),\n };\n h.extensions = [...h.extensions, extension];\n currOffset += len;\n }\n }\n break;\n // RFC 8285 RTP Two Byte Header Extension\n case ExtensionProfiles.TwoByte:\n {\n const end = currOffset + extensionLength;\n while (currOffset < end) {\n if (rawPacket[currOffset] === 0x00) {\n currOffset++;\n continue;\n }\n const extId = rawPacket[currOffset];\n currOffset++;\n const len = rawPacket[currOffset];\n currOffset++;\n\n const extension: Extension = {\n id: extId,\n payload: rawPacket.subarray(currOffset, currOffset + len),\n };\n h.extensions = [...h.extensions, extension];\n currOffset += len;\n }\n }\n break;\n default:\n {\n const extension: Extension = {\n id: 0,\n payload: rawPacket.subarray(\n currOffset,\n currOffset + extensionLength\n ),\n };\n h.extensions = [...h.extensions, extension];\n currOffset += h.extensions[0].payload.length;\n }\n break;\n }\n }\n h.payloadOffset = currOffset;\n if (h.padding) {\n h.paddingSize = rawPacket[rawPacket.length - 1];\n }\n\n return h;\n }\n\n get serializeSize() {\n const { csrc, extensionProfile, extensions } = this;\n\n let size = 12 + csrc.length * csrcSize;\n\n if (extensions.length > 0 || this.extension === true) {\n let extSize = 4;\n switch (extensionProfile) {\n case ExtensionProfiles.OneByte:\n for (const extension of extensions) {\n extSize += 1 + extension.payload.length;\n }\n break;\n case ExtensionProfiles.TwoByte:\n for (const extension of extensions) {\n extSize += 2 + extension.payload.length;\n }\n break;\n default:\n extSize += extensions[0].payload.length;\n }\n size += Math.floor((extSize + 3) / 4) * 4;\n }\n\n return size;\n }\n\n serialize(size: number) {\n const buf = Buffer.alloc(size);\n let offset = 0;\n\n const v_p_x_cc = new BitWriter(8);\n v_p_x_cc.set(2, 0, this.version);\n if (this.padding) v_p_x_cc.set(1, 2, 1);\n if (this.extensions.length > 0) this.extension = true;\n if (this.extension) v_p_x_cc.set(1, 3, 1);\n v_p_x_cc.set(4, 4, this.csrc.length);\n buf.writeUInt8(v_p_x_cc.value, offset++);\n\n const m_pt = new BitWriter(8);\n if (this.marker) m_pt.set(1, 0, 1);\n m_pt.set(7, 1, this.payloadType);\n buf.writeUInt8(m_pt.value, offset++);\n\n buf.writeUInt16BE(this.sequenceNumber, seqNumOffset);\n offset += 2;\n buf.writeUInt32BE(this.timestamp, timestampOffset);\n offset += 4;\n buf.writeUInt32BE(this.ssrc, ssrcOffset);\n offset += 4;\n\n for (const csrc of this.csrc) {\n buf.writeUInt32BE(csrc, offset);\n offset += 4;\n }\n\n if (this.extension) {\n const extHeaderPos = offset;\n buf.writeUInt16BE(this.extensionProfile, offset);\n offset += 4;\n const startExtensionsPos = offset;\n\n switch (this.extensionProfile) {\n case ExtensionProfiles.OneByte:\n for (const extension of this.extensions) {\n buf.writeUInt8(\n (extension.id << 4) | (extension.payload.length - 1),\n offset++\n );\n extension.payload.copy(buf, offset);\n offset += extension.payload.length;\n }\n break;\n case ExtensionProfiles.TwoByte: // 1バイトで収まらなくなった歴史的経緯\n for (const extension of this.extensions) {\n buf.writeUInt8(extension.id, offset++);\n buf.writeUInt8(extension.payload.length, offset++);\n extension.payload.copy(buf, offset);\n offset += extension.payload.length;\n }\n break;\n default:\n const extLen = this.extensions[0].payload.length;\n if (extLen % 4 != 0) {\n throw new Error();\n }\n this.extensions[0].payload.copy(buf, offset);\n offset += extLen;\n }\n\n const extSize = offset - startExtensionsPos;\n const roundedExtSize = Math.trunc((extSize + 3) / 4) * 4;\n\n buf.writeUInt16BE(Math.trunc(roundedExtSize / 4), extHeaderPos + 2);\n // padding 4 bytes boundaries\n for (let i = 0; i < roundedExtSize - extSize; i++) {\n buf.writeUInt8(0, offset);\n offset++;\n }\n }\n this.payloadOffset = offset;\n return buf;\n }\n}\n\nexport class RtpPacket {\n constructor(public header: RtpHeader, public payload: Buffer) {}\n\n get serializeSize() {\n return this.header.serializeSize + this.payload.length;\n }\n\n clone() {\n return new RtpPacket(new RtpHeader({ ...this.header }), this.payload);\n }\n\n serialize() {\n let buf = this.header.serialize(\n this.header.serializeSize + this.payload.length\n );\n const { payloadOffset } = this.header;\n this.payload.copy(buf, payloadOffset);\n if (this.header.padding) {\n const padding = Buffer.alloc(this.header.paddingSize);\n padding.writeUInt8(this.header.paddingSize, this.header.paddingSize - 1);\n buf = Buffer.concat([buf, padding]);\n }\n\n return buf;\n }\n\n static deSerialize(buf: Buffer) {\n const header = RtpHeader.deSerialize(buf);\n const p = new RtpPacket(\n header,\n buf.subarray(header.payloadOffset, buf.length - header.paddingSize)\n );\n return p;\n }\n}\n"]}
|
|
@@ -13,5 +13,5 @@ export declare class CipherAesCtr extends CipherAesBase {
|
|
|
13
13
|
decryptRTCP(encrypted: Buffer): [Buffer, RtcpHeader];
|
|
14
14
|
generateSrtcpAuthTag(buf: Buffer): Buffer;
|
|
15
15
|
generateCounter(sequenceNumber: number, rolloverCounter: number, ssrc: number, sessionSalt: Buffer): Buffer;
|
|
16
|
-
generateSrtpAuthTag(
|
|
16
|
+
generateSrtpAuthTag(roc: number, ...buffers: Buffer[]): Buffer;
|
|
17
17
|
}
|
|
@@ -1,11 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
3
|
exports.CipherAesCtr = void 0;
|
|
7
4
|
const crypto_1 = require("crypto");
|
|
8
|
-
const range_1 = __importDefault(require("lodash/range"));
|
|
9
5
|
const helper_1 = require("../../helper");
|
|
10
6
|
const header_1 = require("../../rtcp/header");
|
|
11
7
|
const rtp_1 = require("../../rtp/rtp");
|
|
@@ -18,24 +14,19 @@ class CipherAesCtr extends _1.CipherAesBase {
|
|
|
18
14
|
this.authTagLength = 10;
|
|
19
15
|
}
|
|
20
16
|
encryptRtp(header, payload, rolloverCounter) {
|
|
21
|
-
const
|
|
22
|
-
header.serialize(dst.length).copy(dst);
|
|
23
|
-
const { payloadOffset } = header;
|
|
17
|
+
const headerBuffer = header.serialize(header.serializeSize);
|
|
24
18
|
const counter = this.generateCounter(header.sequenceNumber, rolloverCounter, header.ssrc, this.srtpSessionSalt);
|
|
25
19
|
const cipher = (0, crypto_1.createCipheriv)("aes-128-ctr", this.srtpSessionKey, counter);
|
|
26
20
|
const enc = cipher.update(payload);
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
const authTag = this.generateSrtpAuthTag(dst.slice(0, totalLength), rolloverCounter);
|
|
30
|
-
authTag.copy(dst, totalLength);
|
|
31
|
-
return dst;
|
|
21
|
+
const authTag = this.generateSrtpAuthTag(rolloverCounter, headerBuffer, enc);
|
|
22
|
+
return Buffer.concat([headerBuffer, enc, authTag]);
|
|
32
23
|
}
|
|
33
24
|
decryptRtp(cipherText, rolloverCounter) {
|
|
34
25
|
const header = rtp_1.RtpHeader.deSerialize(cipherText);
|
|
35
26
|
let dst = Buffer.from([]);
|
|
36
27
|
dst = (0, helper_1.growBufferSize)(dst, cipherText.length - this.authTagLength);
|
|
37
|
-
cipherText = cipherText.
|
|
38
|
-
cipherText.
|
|
28
|
+
cipherText = cipherText.subarray(0, cipherText.length - this.authTagLength);
|
|
29
|
+
cipherText.subarray(0, header.payloadOffset).copy(dst);
|
|
39
30
|
const counter = this.generateCounter(header.sequenceNumber, rolloverCounter, header.ssrc, this.srtpSessionSalt);
|
|
40
31
|
const cipher = (0, crypto_1.createDecipheriv)("aes-128-ctr", this.srtpSessionKey, counter);
|
|
41
32
|
const payload = cipherText.slice(header.payloadOffset);
|
|
@@ -69,10 +60,10 @@ class CipherAesCtr extends _1.CipherAesBase {
|
|
|
69
60
|
srtcpIndex &= ~(1 << 31);
|
|
70
61
|
const ssrc = encrypted.readUInt32BE(4);
|
|
71
62
|
// todo impl compare
|
|
72
|
-
const actualTag = encrypted.
|
|
63
|
+
const actualTag = encrypted.subarray(encrypted.length - 10);
|
|
73
64
|
const counter = this.generateCounter(srtcpIndex & 0xffff, srtcpIndex >> 16, ssrc, this.srtcpSessionSalt);
|
|
74
65
|
const cipher = (0, crypto_1.createDecipheriv)("aes-128-ctr", this.srtcpSessionKey, counter);
|
|
75
|
-
const buf = cipher.update(out.
|
|
66
|
+
const buf = cipher.update(out.subarray(8));
|
|
76
67
|
buf.copy(out, 8);
|
|
77
68
|
return [out, header];
|
|
78
69
|
}
|
|
@@ -85,16 +76,19 @@ class CipherAesCtr extends _1.CipherAesBase {
|
|
|
85
76
|
counter.writeUInt32BE(ssrc, 4);
|
|
86
77
|
counter.writeUInt32BE(rolloverCounter, 8);
|
|
87
78
|
counter.writeUInt32BE(Number(BigInt(sequenceNumber) << 16n), 12);
|
|
88
|
-
(0
|
|
79
|
+
for (let i = 0; i < sessionSalt.length; i++) {
|
|
89
80
|
counter[i] = counter[i] ^ sessionSalt[i];
|
|
90
|
-
}
|
|
81
|
+
}
|
|
91
82
|
return counter;
|
|
92
83
|
}
|
|
93
|
-
generateSrtpAuthTag(
|
|
84
|
+
generateSrtpAuthTag(roc, ...buffers) {
|
|
94
85
|
const srtpSessionAuth = (0, crypto_1.createHmac)("sha1", this.srtpSessionAuthTag);
|
|
95
86
|
const rocRaw = Buffer.alloc(4);
|
|
96
87
|
rocRaw.writeUInt32BE(roc);
|
|
97
|
-
|
|
88
|
+
for (const buf of buffers) {
|
|
89
|
+
srtpSessionAuth.update(buf);
|
|
90
|
+
}
|
|
91
|
+
return srtpSessionAuth.update(rocRaw).digest().subarray(0, 10);
|
|
98
92
|
}
|
|
99
93
|
}
|
|
100
94
|
exports.CipherAesCtr = CipherAesCtr;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ctr.js","sourceRoot":"","sources":["../../../../../../rtp/src/srtp/cipher/ctr.ts"],"names":[],"mappings":"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","sourcesContent":["import { createCipheriv, createDecipheriv, createHmac } from \"crypto\";\nimport range from \"lodash/range\";\n\nimport { growBufferSize } from \"../../helper\";\nimport { RtcpHeader } from \"../../rtcp/header\";\nimport { RtpHeader } from \"../../rtp/rtp\";\nimport { CipherAesBase } from \".\";\n\nexport class CipherAesCtr extends CipherAesBase {\n readonly authTagLength = 10;\n\n constructor(\n srtpSessionKey: Buffer,\n srtpSessionSalt: Buffer,\n srtcpSessionKey: Buffer,\n srtcpSessionSalt: Buffer,\n private srtpSessionAuthTag: Buffer,\n private srtcpSessionAuthTag: Buffer\n ) {\n super(srtpSessionKey, srtpSessionSalt, srtcpSessionKey, srtcpSessionSalt);\n }\n\n encryptRtp(header: RtpHeader, payload: Buffer, rolloverCounter: number) {\n const dst = Buffer.alloc(\n header.serializeSize + payload.length + this.authTagLength\n );\n header.serialize(dst.length).copy(dst);\n\n const { payloadOffset } = header;\n\n const counter = this.generateCounter(\n header.sequenceNumber,\n rolloverCounter,\n header.ssrc,\n this.srtpSessionSalt\n );\n\n const cipher = createCipheriv(\"aes-128-ctr\", this.srtpSessionKey, counter);\n const enc = cipher.update(payload);\n enc.copy(dst, payloadOffset);\n const totalLength = payloadOffset + payload.length;\n\n const authTag = this.generateSrtpAuthTag(\n dst.slice(0, totalLength),\n rolloverCounter\n );\n authTag.copy(dst, totalLength);\n return dst;\n }\n\n decryptRtp(cipherText: Buffer, rolloverCounter: number): [Buffer, RtpHeader] {\n const header = RtpHeader.deSerialize(cipherText);\n\n let dst = Buffer.from([]);\n dst = growBufferSize(dst, cipherText.length - this.authTagLength);\n\n cipherText = cipherText.slice(0, cipherText.length - this.authTagLength);\n\n cipherText.slice(0, header.payloadOffset).copy(dst);\n\n const counter = this.generateCounter(\n header.sequenceNumber,\n rolloverCounter,\n header.ssrc,\n this.srtpSessionSalt\n );\n const cipher = createDecipheriv(\n \"aes-128-ctr\",\n this.srtpSessionKey,\n counter\n );\n const payload = cipherText.slice(header.payloadOffset);\n const buf = cipher.update(payload);\n buf.copy(dst, header.payloadOffset);\n\n return [dst, header];\n }\n\n encryptRTCP(rtcpPacket: Buffer, srtcpIndex: number): Buffer {\n let out = Buffer.from(rtcpPacket);\n const ssrc = out.readUInt32BE(4);\n\n const counter = this.generateCounter(\n srtcpIndex & 0xffff,\n srtcpIndex >> 16,\n ssrc,\n this.srtcpSessionSalt\n );\n const cipher = createCipheriv(\"aes-128-ctr\", this.srtcpSessionKey, counter);\n // Encrypt everything after header\n const buf = cipher.update(out.slice(8));\n buf.copy(out, 8);\n out = Buffer.concat([out, Buffer.alloc(4)]);\n out.writeUInt32BE(srtcpIndex, out.length - 4);\n out[out.length - 4] |= 0x80;\n const authTag = this.generateSrtcpAuthTag(out);\n out = Buffer.concat([out, authTag]);\n\n return out;\n }\n\n decryptRTCP(encrypted: Buffer): [Buffer, RtcpHeader] {\n const header = RtcpHeader.deSerialize(encrypted);\n\n const tailOffset = encrypted.length - (this.authTagLength + srtcpIndexSize);\n const out = Buffer.from(encrypted).slice(0, tailOffset);\n\n const isEncrypted = encrypted[tailOffset] >> 7;\n if (isEncrypted === 0) return [out, header];\n\n let srtcpIndex = encrypted.readUInt32BE(tailOffset);\n srtcpIndex &= ~(1 << 31);\n\n const ssrc = encrypted.readUInt32BE(4);\n\n // todo impl compare\n const actualTag = encrypted.slice(encrypted.length - 10);\n\n const counter = this.generateCounter(\n srtcpIndex & 0xffff,\n srtcpIndex >> 16,\n ssrc,\n this.srtcpSessionSalt\n );\n const cipher = createDecipheriv(\n \"aes-128-ctr\",\n this.srtcpSessionKey,\n counter\n );\n const buf = cipher.update(out.slice(8));\n buf.copy(out, 8);\n return [out, header];\n }\n\n generateSrtcpAuthTag(buf: Buffer) {\n const srtcpSessionAuth = createHmac(\"sha1\", this.srtcpSessionAuthTag);\n return srtcpSessionAuth.update(buf).digest().slice(0, 10);\n }\n\n generateCounter(\n sequenceNumber: number,\n rolloverCounter: number,\n ssrc: number,\n sessionSalt: Buffer\n ) {\n const counter = Buffer.alloc(16);\n counter.writeUInt32BE(ssrc, 4);\n counter.writeUInt32BE(rolloverCounter, 8);\n counter.writeUInt32BE(Number(BigInt(sequenceNumber) << 16n), 12);\n\n range(sessionSalt.length).forEach((i) => {\n counter[i] = counter[i] ^ sessionSalt[i];\n });\n return counter;\n }\n\n generateSrtpAuthTag(buf: Buffer, roc: number) {\n const srtpSessionAuth = createHmac(\"sha1\", this.srtpSessionAuthTag);\n const rocRaw = Buffer.alloc(4);\n rocRaw.writeUInt32BE(roc);\n\n return srtpSessionAuth.update(buf).update(rocRaw).digest().slice(0, 10);\n }\n}\n\nconst srtcpIndexSize = 4;\n"]}
|
|
1
|
+
{"version":3,"file":"ctr.js","sourceRoot":"","sources":["../../../../../../rtp/src/srtp/cipher/ctr.ts"],"names":[],"mappings":"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","sourcesContent":["import { createCipheriv, createDecipheriv, createHmac } from \"crypto\";\n\nimport { growBufferSize } from \"../../helper\";\nimport { RtcpHeader } from \"../../rtcp/header\";\nimport { RtpHeader } from \"../../rtp/rtp\";\nimport { CipherAesBase } from \".\";\n\nexport class CipherAesCtr extends CipherAesBase {\n readonly authTagLength = 10;\n\n constructor(\n srtpSessionKey: Buffer,\n srtpSessionSalt: Buffer,\n srtcpSessionKey: Buffer,\n srtcpSessionSalt: Buffer,\n private srtpSessionAuthTag: Buffer,\n private srtcpSessionAuthTag: Buffer\n ) {\n super(srtpSessionKey, srtpSessionSalt, srtcpSessionKey, srtcpSessionSalt);\n }\n\n encryptRtp(header: RtpHeader, payload: Buffer, rolloverCounter: number) {\n const headerBuffer = header.serialize(header.serializeSize);\n\n const counter = this.generateCounter(\n header.sequenceNumber,\n rolloverCounter,\n header.ssrc,\n this.srtpSessionSalt\n );\n\n const cipher = createCipheriv(\"aes-128-ctr\", this.srtpSessionKey, counter);\n const enc = cipher.update(payload);\n\n const authTag = this.generateSrtpAuthTag(\n rolloverCounter,\n headerBuffer,\n enc\n );\n return Buffer.concat([headerBuffer, enc, authTag]);\n }\n\n decryptRtp(cipherText: Buffer, rolloverCounter: number): [Buffer, RtpHeader] {\n const header = RtpHeader.deSerialize(cipherText);\n\n let dst = Buffer.from([]);\n dst = growBufferSize(dst, cipherText.length - this.authTagLength);\n\n cipherText = cipherText.subarray(0, cipherText.length - this.authTagLength);\n\n cipherText.subarray(0, header.payloadOffset).copy(dst);\n\n const counter = this.generateCounter(\n header.sequenceNumber,\n rolloverCounter,\n header.ssrc,\n this.srtpSessionSalt\n );\n const cipher = createDecipheriv(\n \"aes-128-ctr\",\n this.srtpSessionKey,\n counter\n );\n const payload = cipherText.slice(header.payloadOffset);\n const buf = cipher.update(payload);\n buf.copy(dst, header.payloadOffset);\n\n return [dst, header];\n }\n\n encryptRTCP(rtcpPacket: Buffer, srtcpIndex: number): Buffer {\n let out = Buffer.from(rtcpPacket);\n const ssrc = out.readUInt32BE(4);\n\n const counter = this.generateCounter(\n srtcpIndex & 0xffff,\n srtcpIndex >> 16,\n ssrc,\n this.srtcpSessionSalt\n );\n const cipher = createCipheriv(\"aes-128-ctr\", this.srtcpSessionKey, counter);\n // Encrypt everything after header\n const buf = cipher.update(out.slice(8));\n buf.copy(out, 8);\n out = Buffer.concat([out, Buffer.alloc(4)]);\n out.writeUInt32BE(srtcpIndex, out.length - 4);\n out[out.length - 4] |= 0x80;\n const authTag = this.generateSrtcpAuthTag(out);\n out = Buffer.concat([out, authTag]);\n\n return out;\n }\n\n decryptRTCP(encrypted: Buffer): [Buffer, RtcpHeader] {\n const header = RtcpHeader.deSerialize(encrypted);\n\n const tailOffset = encrypted.length - (this.authTagLength + srtcpIndexSize);\n const out = Buffer.from(encrypted).slice(0, tailOffset);\n\n const isEncrypted = encrypted[tailOffset] >> 7;\n if (isEncrypted === 0) return [out, header];\n\n let srtcpIndex = encrypted.readUInt32BE(tailOffset);\n srtcpIndex &= ~(1 << 31);\n\n const ssrc = encrypted.readUInt32BE(4);\n\n // todo impl compare\n const actualTag = encrypted.subarray(encrypted.length - 10);\n\n const counter = this.generateCounter(\n srtcpIndex & 0xffff,\n srtcpIndex >> 16,\n ssrc,\n this.srtcpSessionSalt\n );\n const cipher = createDecipheriv(\n \"aes-128-ctr\",\n this.srtcpSessionKey,\n counter\n );\n const buf = cipher.update(out.subarray(8));\n buf.copy(out, 8);\n return [out, header];\n }\n\n generateSrtcpAuthTag(buf: Buffer) {\n const srtcpSessionAuth = createHmac(\"sha1\", this.srtcpSessionAuthTag);\n return srtcpSessionAuth.update(buf).digest().slice(0, 10);\n }\n\n generateCounter(\n sequenceNumber: number,\n rolloverCounter: number,\n ssrc: number,\n sessionSalt: Buffer\n ) {\n const counter = Buffer.alloc(16);\n counter.writeUInt32BE(ssrc, 4);\n counter.writeUInt32BE(rolloverCounter, 8);\n counter.writeUInt32BE(Number(BigInt(sequenceNumber) << 16n), 12);\n\n for (let i = 0; i < sessionSalt.length; i++) {\n counter[i] = counter[i] ^ sessionSalt[i];\n }\n return counter;\n }\n\n generateSrtpAuthTag(roc: number, ...buffers: Buffer[]) {\n const srtpSessionAuth = createHmac(\"sha1\", this.srtpSessionAuthTag);\n const rocRaw = Buffer.alloc(4);\n rocRaw.writeUInt32BE(roc);\n\n for (const buf of buffers) {\n srtpSessionAuth.update(buf);\n }\n return srtpSessionAuth.update(rocRaw).digest().subarray(0, 10);\n }\n}\n\nconst srtcpIndexSize = 4;\n"]}
|
|
@@ -7,7 +7,7 @@ exports.RTCDataChannelParameters = exports.RTCDataChannel = void 0;
|
|
|
7
7
|
const debug_1 = __importDefault(require("debug"));
|
|
8
8
|
const rx_mini_1 = require("rx.mini");
|
|
9
9
|
const helper_1 = require("./helper");
|
|
10
|
-
const log = (0, debug_1.default)("werift/webrtc/
|
|
10
|
+
const log = (0, debug_1.default)("werift:packages/webrtc/src/dataChannel.ts");
|
|
11
11
|
class RTCDataChannel extends helper_1.EventTarget {
|
|
12
12
|
constructor(transport, parameters, sendOpen = true) {
|
|
13
13
|
super();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dataChannel.js","sourceRoot":"","sources":["../../../src/dataChannel.ts"],"names":[],"mappings":";;;;;;AAAA,kDAA0B;AAC1B,qCAAgC;AAEhC,qCAAuC;AAIvC,MAAM,GAAG,GAAG,IAAA,eAAK,EAAC,
|
|
1
|
+
{"version":3,"file":"dataChannel.js","sourceRoot":"","sources":["../../../src/dataChannel.ts"],"names":[],"mappings":"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","sourcesContent":["import debug from \"debug\";\nimport { Event } from \"rx.mini\";\n\nimport { EventTarget } from \"./helper\";\nimport { RTCSctpTransport } from \"./transport/sctp\";\nimport { Callback, CallbackWithValue } from \"./types/util\";\n\nconst log = debug(\"werift:packages/webrtc/src/dataChannel.ts\");\n\nexport class RTCDataChannel extends EventTarget {\n readonly stateChanged = new Event<[DCState]>();\n readonly message = new Event<[string | Buffer]>();\n // todo impl\n readonly error = new Event<[Error]>();\n readonly bufferedAmountLow = new Event();\n onopen?: Callback;\n onclose?: Callback;\n onclosing?: Callback;\n onmessage?: CallbackWithValue<MessageEvent>;\n // todo impl\n onerror?: CallbackWithValue<RTCErrorEvent>;\n isCreatedByRemote = false;\n id: number = this.parameters.id;\n readyState: DCState = \"connecting\";\n\n bufferedAmount = 0;\n private _bufferedAmountLowThreshold = 0;\n\n constructor(\n private readonly transport: RTCSctpTransport,\n private readonly parameters: RTCDataChannelParameters,\n public readonly sendOpen = true\n ) {\n super();\n\n if (parameters.negotiated) {\n if (this.id == undefined || this.id < 0 || this.id > 65534) {\n throw new Error(\n \"ID must be in range 0-65534 if data channel is negotiated out-of-band\"\n );\n }\n this.transport.dataChannelAddNegotiated(this);\n } else {\n if (sendOpen) {\n this.sendOpen = false;\n this.transport.dataChannelOpen(this);\n }\n }\n }\n\n get ordered() {\n return this.parameters.ordered;\n }\n\n get maxRetransmits() {\n return this.parameters.maxRetransmits;\n }\n\n get maxPacketLifeTime() {\n return this.parameters.maxPacketLifeTime;\n }\n\n get label() {\n return this.parameters.label;\n }\n\n get protocol() {\n return this.parameters.protocol;\n }\n\n get negotiated() {\n return this.parameters.negotiated;\n }\n\n get bufferedAmountLowThreshold() {\n return this._bufferedAmountLowThreshold;\n }\n\n set bufferedAmountLowThreshold(value: number) {\n if (value < 0 || value > 4294967295) {\n throw new Error(\n \"bufferedAmountLowThreshold must be in range 0 - 4294967295\"\n );\n }\n this._bufferedAmountLowThreshold = value;\n }\n\n setId(id: number) {\n this.id = id;\n }\n\n setReadyState(state: DCState) {\n if (state !== this.readyState) {\n this.readyState = state;\n this.stateChanged.execute(state);\n\n switch (state) {\n case \"open\":\n if (this.onopen) this.onopen();\n this.emit(\"open\");\n break;\n case \"closed\":\n if (this.onclose) this.onclose();\n this.emit(\"close\");\n break;\n case \"closing\":\n if (this.onclosing) this.onclosing();\n break;\n }\n log(\"change state\", state);\n }\n }\n\n addBufferedAmount(amount: number) {\n const crossesThreshold =\n this.bufferedAmount > this.bufferedAmountLowThreshold &&\n this.bufferedAmount + amount <= this.bufferedAmountLowThreshold;\n this.bufferedAmount += amount;\n if (crossesThreshold) {\n this.bufferedAmountLow.execute();\n this.emit(\"bufferedamountlow\");\n }\n }\n\n send(data: Buffer | string) {\n this.transport.datachannelSend(this, data);\n }\n\n close() {\n this.transport.dataChannelClose(this);\n }\n}\n\nexport type DCState = \"open\" | \"closed\" | \"connecting\" | \"closing\";\n\nexport class RTCDataChannelParameters {\n label = \"\";\n maxPacketLifeTime?: number; // sec\n maxRetransmits?: number;\n ordered = true;\n protocol = \"\";\n negotiated = false;\n id!: number;\n constructor(props: Partial<RTCDataChannelParameters> = {}) {\n Object.assign(this, props);\n }\n}\n\nexport interface MessageEvent {\n data: string | Buffer;\n}\n\nexport interface RTCErrorEvent {\n error: any;\n}\n"]}
|
|
@@ -5,9 +5,11 @@ export declare const RTP_EXTENSION_URI: {
|
|
|
5
5
|
readonly repairedRtpStreamId: "urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id";
|
|
6
6
|
readonly transportWideCC: "http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01";
|
|
7
7
|
readonly absSendTime: "http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time";
|
|
8
|
+
readonly dependencyDescriptor: "https://aomediacodec.github.io/av1-rtp-spec/#dependency-descriptor-rtp-header-extension";
|
|
8
9
|
};
|
|
9
10
|
export declare function useSdesMid(): RTCRtpHeaderExtensionParameters;
|
|
10
11
|
export declare function useSdesRTPStreamId(): RTCRtpHeaderExtensionParameters;
|
|
11
12
|
export declare function useRepairedRtpStreamId(): RTCRtpHeaderExtensionParameters;
|
|
12
13
|
export declare function useTransportWideCC(): RTCRtpHeaderExtensionParameters;
|
|
13
14
|
export declare function useAbsSendTime(): RTCRtpHeaderExtensionParameters;
|
|
15
|
+
export declare function useDependencyDescriptor(): RTCRtpHeaderExtensionParameters;
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.useAbsSendTime = exports.useTransportWideCC = exports.useRepairedRtpStreamId = exports.useSdesRTPStreamId = exports.useSdesMid = exports.RTP_EXTENSION_URI = void 0;
|
|
3
|
+
exports.useDependencyDescriptor = exports.useAbsSendTime = exports.useTransportWideCC = exports.useRepairedRtpStreamId = exports.useSdesRTPStreamId = exports.useSdesMid = exports.RTP_EXTENSION_URI = void 0;
|
|
4
4
|
const parameters_1 = require("../parameters");
|
|
5
5
|
exports.RTP_EXTENSION_URI = {
|
|
6
6
|
sdesMid: "urn:ietf:params:rtp-hdrext:sdes:mid",
|
|
@@ -8,6 +8,7 @@ exports.RTP_EXTENSION_URI = {
|
|
|
8
8
|
repairedRtpStreamId: "urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id",
|
|
9
9
|
transportWideCC: "http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01",
|
|
10
10
|
absSendTime: "http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time",
|
|
11
|
+
dependencyDescriptor: "https://aomediacodec.github.io/av1-rtp-spec/#dependency-descriptor-rtp-header-extension",
|
|
11
12
|
};
|
|
12
13
|
function useSdesMid() {
|
|
13
14
|
return new parameters_1.RTCRtpHeaderExtensionParameters({
|
|
@@ -39,4 +40,10 @@ function useAbsSendTime() {
|
|
|
39
40
|
});
|
|
40
41
|
}
|
|
41
42
|
exports.useAbsSendTime = useAbsSendTime;
|
|
43
|
+
function useDependencyDescriptor() {
|
|
44
|
+
return new parameters_1.RTCRtpHeaderExtensionParameters({
|
|
45
|
+
uri: exports.RTP_EXTENSION_URI.dependencyDescriptor,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
exports.useDependencyDescriptor = useDependencyDescriptor;
|
|
42
49
|
//# sourceMappingURL=rtpExtension.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"rtpExtension.js","sourceRoot":"","sources":["../../../../../src/media/extension/rtpExtension.ts"],"names":[],"mappings":";;;AAAA,8CAAgE;AAEnD,QAAA,iBAAiB,GAAG;IAC/B,OAAO,EAAE,qCAAqC;IAC9C,eAAe,EAAE,+CAA+C;IAChE,mBAAmB,EAAE,wDAAwD;IAC7E,eAAe,EACb,2EAA2E;IAC7E,WAAW,EAAE,4DAA4D;
|
|
1
|
+
{"version":3,"file":"rtpExtension.js","sourceRoot":"","sources":["../../../../../src/media/extension/rtpExtension.ts"],"names":[],"mappings":";;;AAAA,8CAAgE;AAEnD,QAAA,iBAAiB,GAAG;IAC/B,OAAO,EAAE,qCAAqC;IAC9C,eAAe,EAAE,+CAA+C;IAChE,mBAAmB,EAAE,wDAAwD;IAC7E,eAAe,EACb,2EAA2E;IAC7E,WAAW,EAAE,4DAA4D;IACzE,oBAAoB,EAClB,yFAAyF;CACnF,CAAC;AAEX,SAAgB,UAAU;IACxB,OAAO,IAAI,4CAA+B,CAAC;QACzC,GAAG,EAAE,yBAAiB,CAAC,OAAO;KAC/B,CAAC,CAAC;AACL,CAAC;AAJD,gCAIC;AAED,SAAgB,kBAAkB;IAChC,OAAO,IAAI,4CAA+B,CAAC;QACzC,GAAG,EAAE,yBAAiB,CAAC,eAAe;KACvC,CAAC,CAAC;AACL,CAAC;AAJD,gDAIC;AAED,SAAgB,sBAAsB;IACpC,OAAO,IAAI,4CAA+B,CAAC;QACzC,GAAG,EAAE,yBAAiB,CAAC,mBAAmB;KAC3C,CAAC,CAAC;AACL,CAAC;AAJD,wDAIC;AAED,SAAgB,kBAAkB;IAChC,OAAO,IAAI,4CAA+B,CAAC;QACzC,GAAG,EAAE,yBAAiB,CAAC,eAAe;KACvC,CAAC,CAAC;AACL,CAAC;AAJD,gDAIC;AAED,SAAgB,cAAc;IAC5B,OAAO,IAAI,4CAA+B,CAAC;QACzC,GAAG,EAAE,yBAAiB,CAAC,WAAW;KACnC,CAAC,CAAC;AACL,CAAC;AAJD,wCAIC;AAED,SAAgB,uBAAuB;IACrC,OAAO,IAAI,4CAA+B,CAAC;QACzC,GAAG,EAAE,yBAAiB,CAAC,oBAAoB;KAC5C,CAAC,CAAC;AACL,CAAC;AAJD,0DAIC","sourcesContent":["import { RTCRtpHeaderExtensionParameters } from \"../parameters\";\n\nexport const RTP_EXTENSION_URI = {\n sdesMid: \"urn:ietf:params:rtp-hdrext:sdes:mid\",\n sdesRTPStreamID: \"urn:ietf:params:rtp-hdrext:sdes:rtp-stream-id\",\n repairedRtpStreamId: \"urn:ietf:params:rtp-hdrext:sdes:repaired-rtp-stream-id\",\n transportWideCC:\n \"http://www.ietf.org/id/draft-holmer-rmcat-transport-wide-cc-extensions-01\",\n absSendTime: \"http://www.webrtc.org/experiments/rtp-hdrext/abs-send-time\",\n dependencyDescriptor:\n \"https://aomediacodec.github.io/av1-rtp-spec/#dependency-descriptor-rtp-header-extension\",\n} as const;\n\nexport function useSdesMid() {\n return new RTCRtpHeaderExtensionParameters({\n uri: RTP_EXTENSION_URI.sdesMid,\n });\n}\n\nexport function useSdesRTPStreamId() {\n return new RTCRtpHeaderExtensionParameters({\n uri: RTP_EXTENSION_URI.sdesRTPStreamID,\n });\n}\n\nexport function useRepairedRtpStreamId() {\n return new RTCRtpHeaderExtensionParameters({\n uri: RTP_EXTENSION_URI.repairedRtpStreamId,\n });\n}\n\nexport function useTransportWideCC() {\n return new RTCRtpHeaderExtensionParameters({\n uri: RTP_EXTENSION_URI.transportWideCC,\n });\n}\n\nexport function useAbsSendTime() {\n return new RTCRtpHeaderExtensionParameters({\n uri: RTP_EXTENSION_URI.absSendTime,\n });\n}\n\nexport function useDependencyDescriptor() {\n return new RTCRtpHeaderExtensionParameters({\n uri: RTP_EXTENSION_URI.dependencyDescriptor,\n });\n}\n"]}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { Direction } from "./rtpTransceiver";
|
|
1
2
|
export interface RTCRtpParameters {
|
|
2
3
|
codecs: RTCRtpCodecParameters[];
|
|
3
4
|
headerExtensions: RTCRtpHeaderExtensionParameters[];
|
|
@@ -21,6 +22,7 @@ export declare class RTCRtpCodecParameters {
|
|
|
21
22
|
channels?: number;
|
|
22
23
|
rtcpFeedback: RTCPFB[];
|
|
23
24
|
parameters?: string;
|
|
25
|
+
direction: Direction | "all";
|
|
24
26
|
constructor(props: Pick<RTCRtpCodecParameters, "mimeType" | "clockRate"> & Partial<RTCRtpCodecParameters>);
|
|
25
27
|
get name(): string;
|
|
26
28
|
get contentType(): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"parameters.js","sourceRoot":"","sources":["../../../../src/media/parameters.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"parameters.js","sourceRoot":"","sources":["../../../../src/media/parameters.ts"],"names":[],"mappings":";;;AAaA,MAAa,qBAAqB;IAahC,YACE,KACgC;QANlC,iBAAY,GAAa,EAAE,CAAC;QAE5B,cAAS,GAAsB,KAAK,CAAC;QAMnC,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;IAED,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC;IAED,IAAI,WAAW;QACb,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IACrC,CAAC;IAED,IAAI,GAAG;QACL,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;QACzC,IAAI,IAAI,CAAC,QAAQ,KAAK,CAAC;YAAE,CAAC,IAAI,IAAI,CAAC;QACnC,OAAO,CAAC,CAAC;IACX,CAAC;CACF;AAjCD,sDAiCC;AAED,MAAa,+BAA+B;IAI1C,YACE,KAC8C;QAE9C,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;CACF;AAVD,0EAUC;AAED,MAAa,iBAAiB;IAK5B,YAAY,QAAoC,EAAE;QAHlD,QAAG,GAAY,KAAK,CAAC;QAInB,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;CACF;AARD,8CAQC;AAED,MAAa,eAAe;IAI1B,YAAY,QAAkC,EAAE;QAC9C,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;CACF;AAPD,0CAOC;AACD,MAAa,mBAAmB;IAG9B,YAAY,QAAsC,EAAE;QAClD,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;CACF;AAND,kDAMC;AAED,MAAa,sBAAsB;IAKjC,YACE,KACsD;QAEtD,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;CACF;AAXD,wDAWC;AAQD,MAAa,yBAAyB;IAGpC,YAAY,KAAgC;QAC1C,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;CACF;AAND,8DAMC","sourcesContent":["import { Direction } from \"./rtpTransceiver\";\n\nexport interface RTCRtpParameters {\n codecs: RTCRtpCodecParameters[];\n headerExtensions: RTCRtpHeaderExtensionParameters[];\n muxId?: string;\n rtpStreamId?: string;\n repairedRtpStreamId?: string;\n rtcp?: RTCRtcpParameters;\n}\n\nexport type RTCPFB = { type: string; parameter?: string };\n\nexport class RTCRtpCodecParameters {\n /**\n * When specifying a codec with a fixed payloadType such as PCMU,\n * it is necessary to set the correct PayloadType in RTCRtpCodecParameters in advance.\n */\n payloadType!: number;\n mimeType!: string;\n clockRate!: number;\n channels?: number;\n rtcpFeedback: RTCPFB[] = [];\n parameters?: string;\n direction: Direction | \"all\" = \"all\";\n\n constructor(\n props: Pick<RTCRtpCodecParameters, \"mimeType\" | \"clockRate\"> &\n Partial<RTCRtpCodecParameters>\n ) {\n Object.assign(this, props);\n }\n\n get name() {\n return this.mimeType.split(\"/\")[1];\n }\n\n get contentType() {\n return this.mimeType.split(\"/\")[0];\n }\n\n get str() {\n let s = `${this.name}/${this.clockRate}`;\n if (this.channels === 2) s += \"/2\";\n return s;\n }\n}\n\nexport class RTCRtpHeaderExtensionParameters {\n id!: number;\n uri!: string;\n\n constructor(\n props: Partial<RTCRtpHeaderExtensionParameters> &\n Pick<RTCRtpHeaderExtensionParameters, \"uri\">\n ) {\n Object.assign(this, props);\n }\n}\n\nexport class RTCRtcpParameters {\n cname?: string;\n mux: boolean = false;\n ssrc?: number;\n\n constructor(props: Partial<RTCRtcpParameters> = {}) {\n Object.assign(this, props);\n }\n}\n\nexport class RTCRtcpFeedback {\n type!: string;\n parameter?: string;\n\n constructor(props: Partial<RTCRtcpFeedback> = {}) {\n Object.assign(this, props);\n }\n}\nexport class RTCRtpRtxParameters {\n ssrc!: number;\n\n constructor(props: Partial<RTCRtpRtxParameters> = {}) {\n Object.assign(this, props);\n }\n}\n\nexport class RTCRtpCodingParameters {\n ssrc!: number;\n payloadType!: number;\n rtx?: RTCRtpRtxParameters;\n\n constructor(\n props: Partial<RTCRtpCodingParameters> &\n Pick<RTCRtpCodingParameters, \"ssrc\" | \"payloadType\">\n ) {\n Object.assign(this, props);\n }\n}\n\nexport interface RTCRtpReceiveParameters extends RTCRtpParameters {\n encodings: RTCRtpCodingParameters[];\n}\n\nexport interface RTCRtpSendParameters extends RTCRtpParameters {}\n\nexport class RTCRtpSimulcastParameters {\n rid!: string;\n direction!: \"send\" | \"recv\";\n constructor(props: RTCRtpSimulcastParameters) {\n Object.assign(this, props);\n }\n}\n"]}
|
|
@@ -1,17 +1,22 @@
|
|
|
1
1
|
import Event from "rx.mini";
|
|
2
2
|
import { GenericNack, RtpPacket } from "../../../../rtp/src";
|
|
3
3
|
import { RTCRtpReceiver } from "../rtpReceiver";
|
|
4
|
-
export declare class
|
|
4
|
+
export declare class NackHandler {
|
|
5
5
|
private receiver;
|
|
6
6
|
private newEstSeqNum;
|
|
7
|
-
|
|
7
|
+
lost: {
|
|
8
|
+
[seqNum: number]: number;
|
|
9
|
+
};
|
|
8
10
|
private nackLoop;
|
|
9
11
|
readonly onPacketLost: Event<[GenericNack]>;
|
|
10
12
|
mediaSourceSsrc?: number;
|
|
13
|
+
retryCount: number;
|
|
11
14
|
constructor(receiver: RTCRtpReceiver);
|
|
12
|
-
get
|
|
15
|
+
get lostNumber(): number[];
|
|
16
|
+
removeLost(sequenceNumber: number): void;
|
|
13
17
|
addPacket(packet: RtpPacket): void;
|
|
18
|
+
private pruneLost;
|
|
14
19
|
close(): void;
|
|
15
|
-
private
|
|
16
|
-
private
|
|
20
|
+
private updateRetryCount;
|
|
21
|
+
private sendNack;
|
|
17
22
|
}
|