werift 0.12.8 → 0.13.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 +9 -0
- package/lib/common/src/binary.js +37 -1
- package/lib/common/src/binary.js.map +1 -1
- package/lib/dtls/src/context/srtp.d.ts +6 -2
- package/lib/dtls/src/context/srtp.js +9 -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/socket.d.ts +3 -3
- package/lib/dtls/src/socket.js +6 -8
- package/lib/dtls/src/socket.js.map +1 -1
- package/lib/ice/src/utils.d.ts +1 -0
- package/lib/ice/src/utils.js +5 -1
- package/lib/ice/src/utils.js.map +1 -1
- package/lib/rtp/src/codec/base.d.ts +8 -0
- package/lib/rtp/src/codec/base.js +16 -0
- package/lib/rtp/src/codec/base.js.map +1 -0
- package/lib/rtp/src/codec/h264.d.ts +23 -2
- package/lib/rtp/src/codec/h264.js +66 -3
- package/lib/rtp/src/codec/h264.js.map +1 -1
- package/lib/rtp/src/codec/opus.d.ts +9 -0
- package/lib/rtp/src/codec/opus.js +18 -0
- package/lib/rtp/src/codec/opus.js.map +1 -0
- package/lib/rtp/src/codec/vp8.d.ts +18 -11
- package/lib/rtp/src/codec/vp8.js +51 -29
- package/lib/rtp/src/codec/vp8.js.map +1 -1
- package/lib/rtp/src/codec/vp9.d.ts +38 -10
- package/lib/rtp/src/codec/vp9.js +115 -26
- package/lib/rtp/src/codec/vp9.js.map +1 -1
- package/lib/rtp/src/index.d.ts +2 -0
- package/lib/rtp/src/index.js +2 -0
- package/lib/rtp/src/index.js.map +1 -1
- package/lib/rtp/src/rtcp/psfb/index.d.ts +2 -2
- package/lib/rtp/src/rtcp/psfb/index.js.map +1 -1
- package/lib/rtp/src/rtcp/rr.d.ts +2 -2
- package/lib/rtp/src/rtcp/rr.js.map +1 -1
- package/lib/rtp/src/rtcp/rtpfb/index.d.ts +2 -2
- package/lib/rtp/src/rtcp/rtpfb/index.js.map +1 -1
- package/lib/rtp/src/rtcp/sdes.d.ts +2 -2
- package/lib/rtp/src/rtcp/sdes.js.map +1 -1
- package/lib/rtp/src/rtcp/sr.d.ts +2 -2
- package/lib/rtp/src/rtcp/sr.js +36 -0
- package/lib/rtp/src/rtcp/sr.js.map +1 -1
- package/lib/rtp/src/rtp/rtp.d.ts +2 -0
- package/lib/rtp/src/rtp/rtp.js +2 -0
- package/lib/rtp/src/rtp/rtp.js.map +1 -1
- package/lib/rtp/src/srtp/cipher/ctr.d.ts +17 -0
- package/lib/rtp/src/srtp/cipher/ctr.js +103 -0
- package/lib/rtp/src/srtp/cipher/ctr.js.map +1 -0
- package/lib/rtp/src/srtp/cipher/gcm.d.ts +15 -0
- package/lib/rtp/src/srtp/cipher/gcm.js +106 -0
- package/lib/rtp/src/srtp/cipher/gcm.js.map +1 -0
- package/lib/rtp/src/srtp/cipher/index.d.ts +14 -0
- package/lib/rtp/src/srtp/cipher/index.js +25 -0
- package/lib/rtp/src/srtp/cipher/index.js.map +1 -0
- package/lib/rtp/src/srtp/const.d.ts +5 -0
- package/lib/rtp/src/srtp/const.js +23 -0
- package/lib/rtp/src/srtp/const.js.map +1 -0
- package/lib/rtp/src/srtp/context/context.d.ts +13 -11
- package/lib/rtp/src/srtp/context/context.js +23 -23
- package/lib/rtp/src/srtp/context/context.js.map +1 -1
- package/lib/rtp/src/srtp/context/srtcp.d.ts +3 -2
- package/lib/rtp/src/srtp/context/srtcp.js +10 -34
- package/lib/rtp/src/srtp/context/srtcp.js.map +1 -1
- package/lib/rtp/src/srtp/context/srtp.d.ts +4 -3
- package/lib/rtp/src/srtp/context/srtp.js +9 -28
- package/lib/rtp/src/srtp/context/srtp.js.map +1 -1
- package/lib/rtp/src/srtp/srtp.js +2 -2
- package/lib/rtp/src/srtp/srtp.js.map +1 -1
- package/lib/webrtc/src/const.d.ts +4 -3
- package/lib/webrtc/src/const.js +5 -4
- package/lib/webrtc/src/const.js.map +1 -1
- package/lib/webrtc/src/helper.d.ts +2 -2
- package/lib/webrtc/src/helper.js +2 -2
- package/lib/webrtc/src/helper.js.map +1 -1
- package/lib/webrtc/src/index.d.ts +6 -2
- package/lib/webrtc/src/index.js +6 -2
- package/lib/webrtc/src/index.js.map +1 -1
- package/lib/webrtc/src/{extension → media/extension}/rtcpFeedback.d.ts +1 -1
- package/lib/webrtc/src/{extension → media/extension}/rtcpFeedback.js +0 -0
- package/lib/webrtc/src/media/extension/rtcpFeedback.js.map +1 -0
- package/lib/webrtc/src/{extension → media/extension}/rtpExtension.d.ts +1 -1
- package/lib/webrtc/src/{extension → media/extension}/rtpExtension.js +1 -1
- package/lib/webrtc/src/media/extension/rtpExtension.js.map +1 -0
- package/lib/webrtc/src/media/{nack.d.ts → receiver/nack.d.ts} +2 -2
- package/lib/webrtc/src/media/{nack.js → receiver/nack.js} +2 -2
- package/lib/webrtc/src/media/receiver/nack.js.map +1 -0
- package/lib/webrtc/src/media/{statistics.d.ts → receiver/statistics.d.ts} +1 -1
- package/lib/webrtc/src/media/{statistics.js → receiver/statistics.js} +1 -1
- package/lib/webrtc/src/media/receiver/statistics.js.map +1 -0
- package/lib/webrtc/src/media/router.js +1 -1
- package/lib/webrtc/src/media/router.js.map +1 -1
- package/lib/webrtc/src/media/rtpReceiver.d.ts +4 -2
- package/lib/webrtc/src/media/rtpReceiver.js +13 -6
- package/lib/webrtc/src/media/rtpReceiver.js.map +1 -1
- package/lib/webrtc/src/media/rtpSender.d.ts +4 -4
- package/lib/webrtc/src/media/rtpSender.js +12 -6
- package/lib/webrtc/src/media/rtpSender.js.map +1 -1
- package/lib/webrtc/src/media/{senderBWE → sender}/cumulativeResult.d.ts +0 -0
- package/lib/webrtc/src/media/{senderBWE → sender}/cumulativeResult.js +0 -0
- package/lib/webrtc/src/media/sender/cumulativeResult.js.map +1 -0
- package/lib/webrtc/src/media/{senderBWE → sender}/senderBWE.d.ts +0 -0
- package/lib/webrtc/src/media/{senderBWE → sender}/senderBWE.js +0 -0
- package/lib/webrtc/src/media/sender/senderBWE.js.map +1 -0
- package/lib/webrtc/src/media/track.d.ts +3 -0
- package/lib/webrtc/src/media/track.js +2 -0
- package/lib/webrtc/src/media/track.js.map +1 -1
- package/lib/webrtc/src/nonstandard/jitterBuffer.d.ts +12 -0
- package/lib/webrtc/src/nonstandard/jitterBuffer.js +48 -0
- package/lib/webrtc/src/nonstandard/jitterBuffer.js.map +1 -0
- package/lib/webrtc/src/nonstandard/lipsync.d.ts +20 -0
- package/lib/webrtc/src/nonstandard/lipsync.js +39 -0
- package/lib/webrtc/src/nonstandard/lipsync.js.map +1 -0
- package/lib/webrtc/src/nonstandard/recorder.d.ts +18 -0
- package/lib/webrtc/src/nonstandard/recorder.js +25 -0
- package/lib/webrtc/src/nonstandard/recorder.js.map +1 -0
- package/lib/webrtc/src/nonstandard/sampleBuilder.d.ts +18 -0
- package/lib/webrtc/src/nonstandard/sampleBuilder.js +60 -0
- package/lib/webrtc/src/nonstandard/sampleBuilder.js.map +1 -0
- package/lib/webrtc/src/nonstandard/userMedia.d.ts +15 -0
- package/lib/webrtc/src/nonstandard/userMedia.js +67 -0
- package/lib/webrtc/src/nonstandard/userMedia.js.map +1 -0
- package/lib/webrtc/src/nonstandard/webm.d.ts +24 -0
- package/lib/webrtc/src/nonstandard/webm.js +308 -0
- package/lib/webrtc/src/nonstandard/webm.js.map +1 -0
- package/lib/webrtc/src/peerConnection.js +1 -0
- package/lib/webrtc/src/peerConnection.js.map +1 -1
- package/lib/webrtc/src/transport/dtls.d.ts +2 -1
- package/lib/webrtc/src/transport/dtls.js +7 -3
- package/lib/webrtc/src/transport/dtls.js.map +1 -1
- package/lib/webrtc/src/utils.d.ts +3 -0
- package/lib/webrtc/src/utils.js +13 -9
- package/lib/webrtc/src/utils.js.map +1 -1
- package/package.json +5 -4
- package/src/const.ts +8 -3
- package/src/helper.ts +4 -4
- package/src/index.ts +6 -2
- package/src/{extension → media/extension}/rtcpFeedback.ts +1 -1
- package/src/{extension → media/extension}/rtpExtension.ts +1 -1
- package/src/media/{nack.ts → receiver/nack.ts} +3 -3
- package/src/media/{statistics.ts → receiver/statistics.ts} +2 -2
- package/src/media/router.ts +1 -1
- package/src/media/rtpReceiver.ts +11 -7
- package/src/media/rtpSender.ts +19 -9
- package/src/media/{senderBWE → sender}/cumulativeResult.ts +0 -0
- package/src/media/{senderBWE → sender}/senderBWE.ts +0 -0
- package/src/media/track.ts +6 -0
- package/src/nonstandard/jitterBuffer.ts +47 -0
- package/src/nonstandard/lipsync.ts +55 -0
- package/src/nonstandard/recorder.ts +26 -0
- package/src/nonstandard/sampleBuilder.ts +71 -0
- package/src/nonstandard/userMedia.ts +74 -0
- package/src/nonstandard/webm.ts +421 -0
- package/src/peerConnection.ts +3 -1
- package/src/transport/dtls.ts +12 -4
- package/src/utils.ts +20 -12
- package/lib/webrtc/src/extension/rtcpFeedback.js.map +0 -1
- package/lib/webrtc/src/extension/rtpExtension.js.map +0 -1
- package/lib/webrtc/src/media/nack.js.map +0 -1
- package/lib/webrtc/src/media/senderBWE/cumulativeResult.js.map +0 -1
- package/lib/webrtc/src/media/senderBWE/senderBWE.js.map +0 -1
- package/lib/webrtc/src/media/statistics.js.map +0 -1
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.CipherAesBase = void 0;
|
|
4
|
+
class CipherAesBase {
|
|
5
|
+
constructor(srtpSessionKey, srtpSessionSalt, srtcpSessionKey, srtcpSessionSalt) {
|
|
6
|
+
this.srtpSessionKey = srtpSessionKey;
|
|
7
|
+
this.srtpSessionSalt = srtpSessionSalt;
|
|
8
|
+
this.srtcpSessionKey = srtcpSessionKey;
|
|
9
|
+
this.srtcpSessionSalt = srtcpSessionSalt;
|
|
10
|
+
}
|
|
11
|
+
encryptRtp(header, payload, rolloverCounter) {
|
|
12
|
+
return Buffer.from([]);
|
|
13
|
+
}
|
|
14
|
+
decryptRtp(cipherText, rolloverCounter) {
|
|
15
|
+
return [];
|
|
16
|
+
}
|
|
17
|
+
encryptRTCP(rawRtcp, srtcpIndex) {
|
|
18
|
+
return Buffer.from([]);
|
|
19
|
+
}
|
|
20
|
+
decryptRTCP(encrypted) {
|
|
21
|
+
return [];
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
exports.CipherAesBase = CipherAesBase;
|
|
25
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../rtp/src/srtp/cipher/index.ts"],"names":[],"mappings":";;;AAGA,MAAsB,aAAa;IACjC,YACS,cAAsB,EACtB,eAAuB,EACvB,eAAuB,EACvB,gBAAwB;QAHxB,mBAAc,GAAd,cAAc,CAAQ;QACtB,oBAAe,GAAf,eAAe,CAAQ;QACvB,oBAAe,GAAf,eAAe,CAAQ;QACvB,qBAAgB,GAAhB,gBAAgB,CAAQ;IAC9B,CAAC;IAEJ,UAAU,CACR,MAAiB,EACjB,OAAe,EACf,eAAuB;QAEvB,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACzB,CAAC;IAED,UAAU,CAAC,UAAkB,EAAE,eAAuB;QACpD,OAAO,EAAS,CAAC;IACnB,CAAC;IAED,WAAW,CAAC,OAAe,EAAE,UAAkB;QAC7C,OAAO,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACzB,CAAC;IAED,WAAW,CAAC,SAAiB;QAC3B,OAAO,EAAS,CAAC;IACnB,CAAC;CACF;AA3BD,sCA2BC","sourcesContent":["import { RtcpHeader } from \"../../rtcp/header\";\nimport { RtpHeader } from \"../../rtp/rtp\";\n\nexport abstract class CipherAesBase {\n constructor(\n public srtpSessionKey: Buffer,\n public srtpSessionSalt: Buffer,\n public srtcpSessionKey: Buffer,\n public srtcpSessionSalt: Buffer\n ) {}\n\n encryptRtp(\n header: RtpHeader,\n payload: Buffer,\n rolloverCounter: number\n ): Buffer {\n return Buffer.from([]);\n }\n\n decryptRtp(cipherText: Buffer, rolloverCounter: number): [Buffer, RtpHeader] {\n return [] as any;\n }\n\n encryptRTCP(rawRtcp: Buffer, srtcpIndex: number): Buffer {\n return Buffer.from([]);\n }\n\n decryptRTCP(encrypted: Buffer): [Buffer, RtcpHeader] {\n return [] as any;\n }\n}\n"]}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare const ProtectionProfileAes128CmHmacSha1_80: 1;
|
|
2
|
+
export declare const ProtectionProfileAeadAes128Gcm: 7;
|
|
3
|
+
export declare type Profile = typeof ProtectionProfileAes128CmHmacSha1_80 | typeof ProtectionProfileAeadAes128Gcm;
|
|
4
|
+
export declare const keyLength: (profile: Profile) => number;
|
|
5
|
+
export declare const saltLength: (profile: Profile) => 12 | 14;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.saltLength = exports.keyLength = exports.ProtectionProfileAeadAes128Gcm = exports.ProtectionProfileAes128CmHmacSha1_80 = void 0;
|
|
4
|
+
exports.ProtectionProfileAes128CmHmacSha1_80 = 0x0001;
|
|
5
|
+
exports.ProtectionProfileAeadAes128Gcm = 0x0007;
|
|
6
|
+
const keyLength = (profile) => {
|
|
7
|
+
switch (profile) {
|
|
8
|
+
case exports.ProtectionProfileAes128CmHmacSha1_80:
|
|
9
|
+
case exports.ProtectionProfileAeadAes128Gcm:
|
|
10
|
+
return 16;
|
|
11
|
+
}
|
|
12
|
+
};
|
|
13
|
+
exports.keyLength = keyLength;
|
|
14
|
+
const saltLength = (profile) => {
|
|
15
|
+
switch (profile) {
|
|
16
|
+
case exports.ProtectionProfileAes128CmHmacSha1_80:
|
|
17
|
+
return 14;
|
|
18
|
+
case exports.ProtectionProfileAeadAes128Gcm:
|
|
19
|
+
return 12;
|
|
20
|
+
}
|
|
21
|
+
};
|
|
22
|
+
exports.saltLength = saltLength;
|
|
23
|
+
//# sourceMappingURL=const.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"const.js","sourceRoot":"","sources":["../../../../../rtp/src/srtp/const.ts"],"names":[],"mappings":";;;AAAa,QAAA,oCAAoC,GAAG,MAAe,CAAC;AACvD,QAAA,8BAA8B,GAAG,MAAe,CAAC;AAMvD,MAAM,SAAS,GAAG,CAAC,OAAgB,EAAE,EAAE;IAC5C,QAAQ,OAAO,EAAE;QACf,KAAK,4CAAoC,CAAC;QAC1C,KAAK,sCAA8B;YACjC,OAAO,EAAE,CAAC;KACb;AACH,CAAC,CAAC;AANW,QAAA,SAAS,aAMpB;AAEK,MAAM,UAAU,GAAG,CAAC,OAAgB,EAAE,EAAE;IAC7C,QAAQ,OAAO,EAAE;QACf,KAAK,4CAAoC;YACvC,OAAO,EAAE,CAAC;QACZ,KAAK,sCAA8B;YACjC,OAAO,EAAE,CAAC;KACb;AACH,CAAC,CAAC;AAPW,QAAA,UAAU,cAOrB","sourcesContent":["export const ProtectionProfileAes128CmHmacSha1_80 = 0x0001 as const;\nexport const ProtectionProfileAeadAes128Gcm = 0x0007 as const;\n\nexport type Profile =\n | typeof ProtectionProfileAes128CmHmacSha1_80\n | typeof ProtectionProfileAeadAes128Gcm;\n\nexport const keyLength = (profile: Profile) => {\n switch (profile) {\n case ProtectionProfileAes128CmHmacSha1_80:\n case ProtectionProfileAeadAes128Gcm:\n return 16;\n }\n};\n\nexport const saltLength = (profile: Profile) => {\n switch (profile) {\n case ProtectionProfileAes128CmHmacSha1_80:\n return 14;\n case ProtectionProfileAeadAes128Gcm:\n return 12;\n }\n};\n"]}
|
|
@@ -1,36 +1,38 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
|
+
import { Hmac } from "crypto";
|
|
3
|
+
import { CipherAesBase } from "../cipher";
|
|
4
|
+
import { Profile } from "../const";
|
|
2
5
|
export declare class Context {
|
|
3
6
|
masterKey: Buffer;
|
|
4
7
|
masterSalt: Buffer;
|
|
5
|
-
profile:
|
|
8
|
+
profile: Profile;
|
|
6
9
|
srtpSSRCStates: {
|
|
7
|
-
[ssrc: number]:
|
|
10
|
+
[ssrc: number]: SrtpSsrcState;
|
|
8
11
|
};
|
|
9
12
|
srtpSessionKey: Buffer;
|
|
10
13
|
srtpSessionSalt: Buffer;
|
|
11
14
|
srtpSessionAuthTag: Buffer;
|
|
12
|
-
srtpSessionAuth:
|
|
15
|
+
srtpSessionAuth: Hmac;
|
|
13
16
|
srtcpSSRCStates: {
|
|
14
17
|
[ssrc: number]: SrtcpSSRCState;
|
|
15
18
|
};
|
|
16
19
|
srtcpSessionKey: Buffer;
|
|
17
20
|
srtcpSessionSalt: Buffer;
|
|
18
21
|
srtcpSessionAuthTag: Buffer;
|
|
19
|
-
srtcpSessionAuth:
|
|
20
|
-
|
|
22
|
+
srtcpSessionAuth: Hmac;
|
|
23
|
+
cipher: CipherAesBase;
|
|
24
|
+
constructor(masterKey: Buffer, masterSalt: Buffer, profile: Profile);
|
|
21
25
|
generateSessionKey(label: number): Buffer;
|
|
22
26
|
generateSessionSalt(label: number): Buffer;
|
|
23
27
|
generateSessionAuthTag(label: number): Buffer;
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
updateRolloverCount(sequenceNumber: number, s:
|
|
27
|
-
generateCounter(sequenceNumber: number, rolloverCounter: number, ssrc: number, sessionSalt: Buffer): Buffer;
|
|
28
|
+
getSrtpSsrcState(ssrc: number): SrtpSsrcState;
|
|
29
|
+
getSrtcpSsrcState(ssrc: number): SrtcpSSRCState;
|
|
30
|
+
updateRolloverCount(sequenceNumber: number, s: SrtpSsrcState): void;
|
|
28
31
|
generateSrtpAuthTag(buf: Buffer, roc: number): Buffer;
|
|
29
|
-
generateSrtcpAuthTag(buf: Buffer): Buffer;
|
|
30
32
|
index(ssrc: number): number;
|
|
31
33
|
setIndex(ssrc: number, index: number): void;
|
|
32
34
|
}
|
|
33
|
-
export interface
|
|
35
|
+
export interface SrtpSsrcState {
|
|
34
36
|
ssrc: number;
|
|
35
37
|
rolloverCounter: number;
|
|
36
38
|
rolloverHasProcessed?: boolean;
|
|
@@ -1,28 +1,42 @@
|
|
|
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.Context = void 0;
|
|
7
4
|
const aes_js_1 = require("aes-js");
|
|
8
|
-
const big_integer_1 = __importDefault(require("big-integer"));
|
|
9
5
|
const crypto_1 = require("crypto");
|
|
10
|
-
const
|
|
6
|
+
const ctr_1 = require("../cipher/ctr");
|
|
7
|
+
const gcm_1 = require("../cipher/gcm");
|
|
8
|
+
const const_1 = require("../const");
|
|
11
9
|
class Context {
|
|
12
10
|
constructor(masterKey, masterSalt, profile) {
|
|
13
11
|
this.masterKey = masterKey;
|
|
14
12
|
this.masterSalt = masterSalt;
|
|
15
13
|
this.profile = profile;
|
|
16
14
|
this.srtpSSRCStates = {};
|
|
15
|
+
this.srtcpSSRCStates = {};
|
|
16
|
+
{
|
|
17
|
+
// aes-js plaintext require 16byte
|
|
18
|
+
// so need to padding to 14 byte
|
|
19
|
+
const diff = 14 - masterSalt.length;
|
|
20
|
+
if (diff > 0) {
|
|
21
|
+
this.masterSalt = Buffer.concat([masterSalt, Buffer.alloc(diff)]);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
17
24
|
this.srtpSessionKey = this.generateSessionKey(0);
|
|
18
25
|
this.srtpSessionSalt = this.generateSessionSalt(2);
|
|
19
26
|
this.srtpSessionAuthTag = this.generateSessionAuthTag(1);
|
|
20
27
|
this.srtpSessionAuth = crypto_1.createHmac("sha1", this.srtpSessionAuthTag);
|
|
21
|
-
this.srtcpSSRCStates = {};
|
|
22
28
|
this.srtcpSessionKey = this.generateSessionKey(3);
|
|
23
29
|
this.srtcpSessionSalt = this.generateSessionSalt(5);
|
|
24
30
|
this.srtcpSessionAuthTag = this.generateSessionAuthTag(4);
|
|
25
31
|
this.srtcpSessionAuth = crypto_1.createHmac("sha1", this.srtcpSessionAuthTag);
|
|
32
|
+
switch (profile) {
|
|
33
|
+
case const_1.ProtectionProfileAes128CmHmacSha1_80:
|
|
34
|
+
this.cipher = new ctr_1.CipherAesCtr(this.srtpSessionKey, this.srtpSessionSalt, this.srtcpSessionKey, this.srtcpSessionSalt, this.srtpSessionAuthTag, this.srtcpSessionAuthTag);
|
|
35
|
+
break;
|
|
36
|
+
case const_1.ProtectionProfileAeadAes128Gcm:
|
|
37
|
+
this.cipher = new gcm_1.CipherAesGcm(this.srtpSessionKey, this.srtpSessionSalt, this.srtcpSessionKey, this.srtcpSessionSalt);
|
|
38
|
+
break;
|
|
39
|
+
}
|
|
26
40
|
}
|
|
27
41
|
generateSessionKey(label) {
|
|
28
42
|
let sessionKey = Buffer.from(this.masterSalt);
|
|
@@ -82,7 +96,7 @@ class Context {
|
|
|
82
96
|
secondRun = Buffer.from(block.encrypt(secondRun));
|
|
83
97
|
return Buffer.concat([firstRun, secondRun.slice(0, 4)]);
|
|
84
98
|
}
|
|
85
|
-
|
|
99
|
+
getSrtpSsrcState(ssrc) {
|
|
86
100
|
let s = this.srtpSSRCStates[ssrc];
|
|
87
101
|
if (s)
|
|
88
102
|
return s;
|
|
@@ -94,7 +108,7 @@ class Context {
|
|
|
94
108
|
this.srtpSSRCStates[ssrc] = s;
|
|
95
109
|
return s;
|
|
96
110
|
}
|
|
97
|
-
|
|
111
|
+
getSrtcpSsrcState(ssrc) {
|
|
98
112
|
let s = this.srtcpSSRCStates[ssrc];
|
|
99
113
|
if (s)
|
|
100
114
|
return s;
|
|
@@ -130,16 +144,6 @@ class Context {
|
|
|
130
144
|
}
|
|
131
145
|
s.lastSequenceNumber = sequenceNumber;
|
|
132
146
|
}
|
|
133
|
-
generateCounter(sequenceNumber, rolloverCounter, ssrc, sessionSalt) {
|
|
134
|
-
const counter = Buffer.alloc(16);
|
|
135
|
-
counter.writeUInt32BE(ssrc, 4);
|
|
136
|
-
counter.writeUInt32BE(rolloverCounter, 8);
|
|
137
|
-
counter.writeUInt32BE(big_integer_1.default(sequenceNumber).shiftLeft(16).toJSNumber(), 12);
|
|
138
|
-
lodash_1.range(sessionSalt.length).forEach((i) => {
|
|
139
|
-
counter[i] = counter[i] ^ sessionSalt[i];
|
|
140
|
-
});
|
|
141
|
-
return counter;
|
|
142
|
-
}
|
|
143
147
|
generateSrtpAuthTag(buf, roc) {
|
|
144
148
|
this.srtpSessionAuth = crypto_1.createHmac("sha1", this.srtpSessionAuthTag);
|
|
145
149
|
const rocRaw = Buffer.alloc(4);
|
|
@@ -150,10 +154,6 @@ class Context {
|
|
|
150
154
|
.digest()
|
|
151
155
|
.slice(0, 10);
|
|
152
156
|
}
|
|
153
|
-
generateSrtcpAuthTag(buf) {
|
|
154
|
-
this.srtcpSessionAuth = crypto_1.createHmac("sha1", this.srtcpSessionAuthTag);
|
|
155
|
-
return this.srtcpSessionAuth.update(buf).digest().slice(0, 10);
|
|
156
|
-
}
|
|
157
157
|
index(ssrc) {
|
|
158
158
|
const s = this.srtcpSSRCStates[ssrc];
|
|
159
159
|
if (!s) {
|
|
@@ -162,7 +162,7 @@ class Context {
|
|
|
162
162
|
return s.srtcpIndex;
|
|
163
163
|
}
|
|
164
164
|
setIndex(ssrc, index) {
|
|
165
|
-
const s = this.
|
|
165
|
+
const s = this.getSrtcpSsrcState(ssrc);
|
|
166
166
|
s.srtcpIndex = index % 0x7fffffff;
|
|
167
167
|
}
|
|
168
168
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../../../../rtp/src/srtp/context/context.ts"],"names":[],"mappings":"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","sourcesContent":["import { AES } from \"aes-js\";\nimport bigInt from \"big-integer\";\nimport { createHmac } from \"crypto\";\nimport { range } from \"lodash\";\n\nexport class Context {\n srtpSSRCStates: { [ssrc: number]: SrtpSSRCState } = {};\n srtpSessionKey = this.generateSessionKey(0);\n srtpSessionSalt = this.generateSessionSalt(2);\n srtpSessionAuthTag = this.generateSessionAuthTag(1);\n srtpSessionAuth = createHmac(\"sha1\", this.srtpSessionAuthTag);\n srtcpSSRCStates: { [ssrc: number]: SrtcpSSRCState } = {};\n srtcpSessionKey = this.generateSessionKey(3);\n srtcpSessionSalt = this.generateSessionSalt(5);\n srtcpSessionAuthTag = this.generateSessionAuthTag(4);\n srtcpSessionAuth = createHmac(\"sha1\", this.srtcpSessionAuthTag);\n\n constructor(\n public masterKey: Buffer,\n public masterSalt: Buffer,\n public profile: number\n ) {}\n\n generateSessionKey(label: number) {\n let sessionKey = Buffer.from(this.masterSalt);\n\n const labelAndIndexOverKdr = Buffer.from([\n label,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n ]);\n for (\n let i = labelAndIndexOverKdr.length - 1, j = sessionKey.length - 1;\n i >= 0;\n i--, j--\n ) {\n sessionKey[j] = sessionKey[j] ^ labelAndIndexOverKdr[i];\n }\n\n sessionKey = Buffer.concat([sessionKey, Buffer.from([0x00, 0x00])]);\n const block = new AES(this.masterKey);\n return Buffer.from(block.encrypt(sessionKey) as ArrayBuffer);\n }\n\n generateSessionSalt(label: number) {\n let sessionSalt = Buffer.from(this.masterSalt);\n const labelAndIndexOverKdr = Buffer.from([\n label,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n ]);\n for (\n let i = labelAndIndexOverKdr.length - 1, j = sessionSalt.length - 1;\n i >= 0;\n i--, j--\n ) {\n sessionSalt[j] = sessionSalt[j] ^ labelAndIndexOverKdr[i];\n }\n sessionSalt = Buffer.concat([sessionSalt, Buffer.from([0x00, 0x00])]);\n const block = new AES(this.masterKey);\n sessionSalt = Buffer.from(block.encrypt(sessionSalt) as ArrayBuffer);\n return sessionSalt.slice(0, 14);\n }\n\n generateSessionAuthTag(label: number) {\n const sessionAuthTag = Buffer.from(this.masterSalt);\n const labelAndIndexOverKdr = Buffer.from([\n label,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n ]);\n for (\n let i = labelAndIndexOverKdr.length - 1, j = sessionAuthTag.length - 1;\n i >= 0;\n i--, j--\n ) {\n sessionAuthTag[j] = sessionAuthTag[j] ^ labelAndIndexOverKdr[i];\n }\n let firstRun = Buffer.concat([sessionAuthTag, Buffer.from([0x00, 0x00])]);\n let secondRun = Buffer.concat([sessionAuthTag, Buffer.from([0x00, 0x01])]);\n const block = new AES(this.masterKey);\n firstRun = Buffer.from(block.encrypt(firstRun) as ArrayBuffer);\n secondRun = Buffer.from(block.encrypt(secondRun) as ArrayBuffer);\n return Buffer.concat([firstRun, secondRun.slice(0, 4)]);\n }\n\n getSRTPSRRCState(ssrc: number) {\n let s = this.srtpSSRCStates[ssrc];\n if (s) return s;\n s = {\n ssrc,\n rolloverCounter: 0,\n lastSequenceNumber: 0,\n };\n this.srtpSSRCStates[ssrc] = s;\n return s;\n }\n\n getSRTCPSSRCState(ssrc: number) {\n let s = this.srtcpSSRCStates[ssrc];\n if (s) return s;\n s = {\n srtcpIndex: 0,\n ssrc,\n };\n this.srtcpSSRCStates[ssrc] = s;\n return s;\n }\n\n // 3.3.1. Packet Index Determination, and ROC, s_l Update\n // In particular, out-of-order RTP packets with\n // sequence numbers close to 2^16 or zero must be properly handled.\n updateRolloverCount(sequenceNumber: number, s: SrtpSSRCState) {\n if (!s.rolloverHasProcessed) {\n s.rolloverHasProcessed = true;\n } else if (sequenceNumber === 0) {\n if (s.lastSequenceNumber > MaxROCDisorder) {\n s.rolloverCounter++;\n }\n } else if (\n s.lastSequenceNumber < MaxROCDisorder &&\n sequenceNumber > MaxSequenceNumber - MaxROCDisorder\n ) {\n // https://github.com/shinyoshiaki/werift-webrtc/issues/94\n if (s.rolloverCounter > 0) {\n s.rolloverCounter--;\n }\n } else if (\n sequenceNumber < MaxROCDisorder &&\n s.lastSequenceNumber > MaxSequenceNumber - MaxROCDisorder\n ) {\n s.rolloverCounter++;\n }\n s.lastSequenceNumber = sequenceNumber;\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(\n bigInt(sequenceNumber).shiftLeft(16).toJSNumber(),\n 12\n );\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 this.srtpSessionAuth = createHmac(\"sha1\", this.srtpSessionAuthTag);\n const rocRaw = Buffer.alloc(4);\n rocRaw.writeUInt32BE(roc);\n\n return this.srtpSessionAuth\n .update(buf)\n .update(rocRaw)\n .digest()\n .slice(0, 10);\n }\n\n generateSrtcpAuthTag(buf: Buffer) {\n this.srtcpSessionAuth = createHmac(\"sha1\", this.srtcpSessionAuthTag);\n return this.srtcpSessionAuth.update(buf).digest().slice(0, 10);\n }\n\n index(ssrc: number) {\n const s = this.srtcpSSRCStates[ssrc];\n if (!s) {\n return 0;\n }\n return s.srtcpIndex;\n }\n\n setIndex(ssrc: number, index: number) {\n const s = this.getSRTCPSSRCState(ssrc);\n s.srtcpIndex = index % 0x7fffffff;\n }\n}\n\nexport interface SrtpSSRCState {\n ssrc: number;\n rolloverCounter: number;\n rolloverHasProcessed?: boolean;\n lastSequenceNumber: number;\n}\n\nexport type SrtcpSSRCState = {\n srtcpIndex: number;\n ssrc: number;\n};\n\nconst MaxROCDisorder = 100;\nconst MaxSequenceNumber = 65535;\n"]}
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../../../../../rtp/src/srtp/context/context.ts"],"names":[],"mappings":"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","sourcesContent":["import { AES } from \"aes-js\";\nimport { createHmac, Hmac } from \"crypto\";\n\nimport { CipherAesBase } from \"../cipher\";\nimport { CipherAesCtr } from \"../cipher/ctr\";\nimport { CipherAesGcm } from \"../cipher/gcm\";\nimport {\n Profile,\n ProtectionProfileAeadAes128Gcm,\n ProtectionProfileAes128CmHmacSha1_80,\n} from \"../const\";\n\nexport class Context {\n srtpSSRCStates: { [ssrc: number]: SrtpSsrcState } = {};\n srtpSessionKey: Buffer;\n srtpSessionSalt: Buffer;\n srtpSessionAuthTag: Buffer;\n srtpSessionAuth: Hmac;\n srtcpSSRCStates: { [ssrc: number]: SrtcpSSRCState } = {};\n srtcpSessionKey: Buffer;\n srtcpSessionSalt: Buffer;\n srtcpSessionAuthTag: Buffer;\n srtcpSessionAuth: Hmac;\n\n cipher: CipherAesBase;\n\n constructor(\n public masterKey: Buffer,\n public masterSalt: Buffer,\n public profile: Profile\n ) {\n {\n // aes-js plaintext require 16byte\n // so need to padding to 14 byte\n const diff = 14 - masterSalt.length;\n if (diff > 0) {\n this.masterSalt = Buffer.concat([masterSalt, Buffer.alloc(diff)]);\n }\n }\n\n this.srtpSessionKey = this.generateSessionKey(0);\n this.srtpSessionSalt = this.generateSessionSalt(2);\n this.srtpSessionAuthTag = this.generateSessionAuthTag(1);\n this.srtpSessionAuth = createHmac(\"sha1\", this.srtpSessionAuthTag);\n\n this.srtcpSessionKey = this.generateSessionKey(3);\n this.srtcpSessionSalt = this.generateSessionSalt(5);\n this.srtcpSessionAuthTag = this.generateSessionAuthTag(4);\n this.srtcpSessionAuth = createHmac(\"sha1\", this.srtcpSessionAuthTag);\n\n switch (profile) {\n case ProtectionProfileAes128CmHmacSha1_80:\n this.cipher = new CipherAesCtr(\n this.srtpSessionKey,\n this.srtpSessionSalt,\n this.srtcpSessionKey,\n this.srtcpSessionSalt,\n this.srtpSessionAuthTag,\n this.srtcpSessionAuthTag\n );\n break;\n case ProtectionProfileAeadAes128Gcm:\n this.cipher = new CipherAesGcm(\n this.srtpSessionKey,\n this.srtpSessionSalt,\n this.srtcpSessionKey,\n this.srtcpSessionSalt\n );\n break;\n }\n }\n\n generateSessionKey(label: number) {\n let sessionKey = Buffer.from(this.masterSalt);\n\n const labelAndIndexOverKdr = Buffer.from([\n label,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n ]);\n for (\n let i = labelAndIndexOverKdr.length - 1, j = sessionKey.length - 1;\n i >= 0;\n i--, j--\n ) {\n sessionKey[j] = sessionKey[j] ^ labelAndIndexOverKdr[i];\n }\n\n sessionKey = Buffer.concat([sessionKey, Buffer.from([0x00, 0x00])]);\n const block = new AES(this.masterKey);\n return Buffer.from(block.encrypt(sessionKey) as ArrayBuffer);\n }\n\n generateSessionSalt(label: number) {\n let sessionSalt = Buffer.from(this.masterSalt);\n const labelAndIndexOverKdr = Buffer.from([\n label,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n ]);\n for (\n let i = labelAndIndexOverKdr.length - 1, j = sessionSalt.length - 1;\n i >= 0;\n i--, j--\n ) {\n sessionSalt[j] = sessionSalt[j] ^ labelAndIndexOverKdr[i];\n }\n sessionSalt = Buffer.concat([sessionSalt, Buffer.from([0x00, 0x00])]);\n const block = new AES(this.masterKey);\n sessionSalt = Buffer.from(block.encrypt(sessionSalt) as ArrayBuffer);\n return sessionSalt.slice(0, 14);\n }\n\n generateSessionAuthTag(label: number) {\n const sessionAuthTag = Buffer.from(this.masterSalt);\n const labelAndIndexOverKdr = Buffer.from([\n label,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n 0x00,\n ]);\n for (\n let i = labelAndIndexOverKdr.length - 1, j = sessionAuthTag.length - 1;\n i >= 0;\n i--, j--\n ) {\n sessionAuthTag[j] = sessionAuthTag[j] ^ labelAndIndexOverKdr[i];\n }\n let firstRun = Buffer.concat([sessionAuthTag, Buffer.from([0x00, 0x00])]);\n let secondRun = Buffer.concat([sessionAuthTag, Buffer.from([0x00, 0x01])]);\n const block = new AES(this.masterKey);\n firstRun = Buffer.from(block.encrypt(firstRun) as ArrayBuffer);\n secondRun = Buffer.from(block.encrypt(secondRun) as ArrayBuffer);\n return Buffer.concat([firstRun, secondRun.slice(0, 4)]);\n }\n\n getSrtpSsrcState(ssrc: number) {\n let s = this.srtpSSRCStates[ssrc];\n if (s) return s;\n s = {\n ssrc,\n rolloverCounter: 0,\n lastSequenceNumber: 0,\n };\n this.srtpSSRCStates[ssrc] = s;\n return s;\n }\n\n getSrtcpSsrcState(ssrc: number) {\n let s = this.srtcpSSRCStates[ssrc];\n if (s) return s;\n s = {\n srtcpIndex: 0,\n ssrc,\n };\n this.srtcpSSRCStates[ssrc] = s;\n return s;\n }\n\n // 3.3.1. Packet Index Determination, and ROC, s_l Update\n // In particular, out-of-order RTP packets with\n // sequence numbers close to 2^16 or zero must be properly handled.\n updateRolloverCount(sequenceNumber: number, s: SrtpSsrcState) {\n if (!s.rolloverHasProcessed) {\n s.rolloverHasProcessed = true;\n } else if (sequenceNumber === 0) {\n if (s.lastSequenceNumber > MaxROCDisorder) {\n s.rolloverCounter++;\n }\n } else if (\n s.lastSequenceNumber < MaxROCDisorder &&\n sequenceNumber > MaxSequenceNumber - MaxROCDisorder\n ) {\n // https://github.com/shinyoshiaki/werift-webrtc/issues/94\n if (s.rolloverCounter > 0) {\n s.rolloverCounter--;\n }\n } else if (\n sequenceNumber < MaxROCDisorder &&\n s.lastSequenceNumber > MaxSequenceNumber - MaxROCDisorder\n ) {\n s.rolloverCounter++;\n }\n s.lastSequenceNumber = sequenceNumber;\n }\n\n generateSrtpAuthTag(buf: Buffer, roc: number) {\n this.srtpSessionAuth = createHmac(\"sha1\", this.srtpSessionAuthTag);\n const rocRaw = Buffer.alloc(4);\n rocRaw.writeUInt32BE(roc);\n\n return this.srtpSessionAuth\n .update(buf)\n .update(rocRaw)\n .digest()\n .slice(0, 10);\n }\n\n index(ssrc: number) {\n const s = this.srtcpSSRCStates[ssrc];\n if (!s) {\n return 0;\n }\n return s.srtcpIndex;\n }\n\n setIndex(ssrc: number, index: number) {\n const s = this.getSrtcpSsrcState(ssrc);\n s.srtcpIndex = index % 0x7fffffff;\n }\n}\n\nexport interface SrtpSsrcState {\n ssrc: number;\n rolloverCounter: number;\n rolloverHasProcessed?: boolean;\n lastSequenceNumber: number;\n}\n\nexport type SrtcpSSRCState = {\n srtcpIndex: number;\n ssrc: number;\n};\n\nconst MaxROCDisorder = 100;\nconst MaxSequenceNumber = 65535;\n"]}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
import { RtcpHeader } from "../../rtcp/header";
|
|
3
|
+
import { Profile } from "../const";
|
|
3
4
|
import { Context } from "./context";
|
|
4
5
|
export declare class SrtcpContext extends Context {
|
|
5
|
-
constructor(masterKey: Buffer, masterSalt: Buffer, profile:
|
|
6
|
-
decryptRTCP(encrypted: Buffer): [Buffer, RtcpHeader];
|
|
6
|
+
constructor(masterKey: Buffer, masterSalt: Buffer, profile: Profile);
|
|
7
7
|
encryptRTCP(rawRtcp: Buffer): Buffer;
|
|
8
|
+
decryptRTCP(encrypted: Buffer): [Buffer, RtcpHeader];
|
|
8
9
|
}
|
|
@@ -1,50 +1,26 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.SrtcpContext = void 0;
|
|
4
|
-
const crypto_1 = require("crypto");
|
|
5
|
-
const header_1 = require("../../rtcp/header");
|
|
6
4
|
const context_1 = require("./context");
|
|
7
5
|
class SrtcpContext extends context_1.Context {
|
|
8
6
|
constructor(masterKey, masterSalt, profile) {
|
|
9
7
|
super(masterKey, masterSalt, profile);
|
|
10
8
|
}
|
|
11
|
-
decryptRTCP(encrypted) {
|
|
12
|
-
const header = header_1.RtcpHeader.deSerialize(encrypted);
|
|
13
|
-
const tailOffset = encrypted.length - (10 + 4);
|
|
14
|
-
const out = Buffer.from(encrypted).slice(0, tailOffset);
|
|
15
|
-
const isEncrypted = encrypted[tailOffset] >> 7;
|
|
16
|
-
if (isEncrypted === 0)
|
|
17
|
-
return [out, header];
|
|
18
|
-
let index = encrypted.readUInt32BE(tailOffset);
|
|
19
|
-
index &= ~(1 << 31);
|
|
20
|
-
const ssrc = encrypted.readUInt32BE(4);
|
|
21
|
-
const actualTag = encrypted.slice(encrypted.length - 10);
|
|
22
|
-
const counter = this.generateCounter(index & 0xffff, index >> 16, ssrc, this.srtcpSessionSalt);
|
|
23
|
-
const cipher = crypto_1.createDecipheriv("aes-128-ctr", this.srtcpSessionKey, counter);
|
|
24
|
-
const buf = cipher.update(out.slice(8));
|
|
25
|
-
buf.copy(out, 8);
|
|
26
|
-
return [out, header];
|
|
27
|
-
}
|
|
28
9
|
encryptRTCP(rawRtcp) {
|
|
29
|
-
|
|
30
|
-
const
|
|
31
|
-
const s = this.getSRTCPSSRCState(ssrc);
|
|
10
|
+
const ssrc = rawRtcp.readUInt32BE(4);
|
|
11
|
+
const s = this.getSrtcpSsrcState(ssrc);
|
|
32
12
|
s.srtcpIndex++;
|
|
33
|
-
if (s.srtcpIndex >>
|
|
13
|
+
if (s.srtcpIndex >> maxSRTCPIndex) {
|
|
34
14
|
s.srtcpIndex = 0;
|
|
35
15
|
}
|
|
36
|
-
const
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
out.writeUInt32BE(s.srtcpIndex, out.length - 4);
|
|
43
|
-
out[out.length - 4] |= 0x80;
|
|
44
|
-
const authTag = this.generateSrtcpAuthTag(out);
|
|
45
|
-
out = Buffer.concat([out, authTag]);
|
|
46
|
-
return out;
|
|
16
|
+
const enc = this.cipher.encryptRTCP(rawRtcp, s.srtcpIndex);
|
|
17
|
+
return enc;
|
|
18
|
+
}
|
|
19
|
+
decryptRTCP(encrypted) {
|
|
20
|
+
const dec = this.cipher.decryptRTCP(encrypted);
|
|
21
|
+
return dec;
|
|
47
22
|
}
|
|
48
23
|
}
|
|
49
24
|
exports.SrtcpContext = SrtcpContext;
|
|
25
|
+
const maxSRTCPIndex = 0x7fffffff;
|
|
50
26
|
//# sourceMappingURL=srtcp.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"srtcp.js","sourceRoot":"","sources":["../../../../../../rtp/src/srtp/context/srtcp.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"srtcp.js","sourceRoot":"","sources":["../../../../../../rtp/src/srtp/context/srtcp.ts"],"names":[],"mappings":";;;AAEA,uCAAoC;AAEpC,MAAa,YAAa,SAAQ,iBAAO;IACvC,YAAY,SAAiB,EAAE,UAAkB,EAAE,OAAgB;QACjE,KAAK,CAAC,SAAS,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;IAED,WAAW,CAAC,OAAe;QACzB,MAAM,IAAI,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC,CAAC,CAAC;QACrC,MAAM,CAAC,GAAG,IAAI,CAAC,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACvC,CAAC,CAAC,UAAU,EAAE,CAAC;QACf,IAAI,CAAC,CAAC,UAAU,IAAI,aAAa,EAAE;YACjC,CAAC,CAAC,UAAU,GAAG,CAAC,CAAC;SAClB;QACD,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC,CAAC,UAAU,CAAC,CAAC;QAC3D,OAAO,GAAG,CAAC;IACb,CAAC;IAED,WAAW,CAAC,SAAiB;QAC3B,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC;QAC/C,OAAO,GAAG,CAAC;IACb,CAAC;CACF;AApBD,oCAoBC;AAED,MAAM,aAAa,GAAG,UAAU,CAAC","sourcesContent":["import { RtcpHeader } from \"../../rtcp/header\";\nimport { Profile } from \"../const\";\nimport { Context } from \"./context\";\n\nexport class SrtcpContext extends Context {\n constructor(masterKey: Buffer, masterSalt: Buffer, profile: Profile) {\n super(masterKey, masterSalt, profile);\n }\n\n encryptRTCP(rawRtcp: Buffer) {\n const ssrc = rawRtcp.readUInt32BE(4);\n const s = this.getSrtcpSsrcState(ssrc);\n s.srtcpIndex++;\n if (s.srtcpIndex >> maxSRTCPIndex) {\n s.srtcpIndex = 0;\n }\n const enc = this.cipher.encryptRTCP(rawRtcp, s.srtcpIndex);\n return enc;\n }\n\n decryptRTCP(encrypted: Buffer): [Buffer, RtcpHeader] {\n const dec = this.cipher.decryptRTCP(encrypted);\n return dec;\n }\n}\n\nconst maxSRTCPIndex = 0x7fffffff;\n"]}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
/// <reference types="node" />
|
|
2
2
|
import { RtpHeader } from "../../rtp/rtp";
|
|
3
|
+
import { Profile } from "../const";
|
|
3
4
|
import { Context } from "./context";
|
|
4
5
|
export declare class SrtpContext extends Context {
|
|
5
|
-
constructor(masterKey: Buffer, masterSalt: Buffer, profile:
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
constructor(masterKey: Buffer, masterSalt: Buffer, profile: Profile);
|
|
7
|
+
encryptRtp(payload: Buffer, header: RtpHeader): Buffer;
|
|
8
|
+
decryptRtp(cipherText: Buffer): [Buffer, RtpHeader];
|
|
8
9
|
}
|
|
@@ -1,43 +1,24 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.SrtpContext = void 0;
|
|
4
|
-
const crypto_1 = require("crypto");
|
|
5
|
-
const helper_1 = require("../../helper");
|
|
6
4
|
const rtp_1 = require("../../rtp/rtp");
|
|
7
5
|
const context_1 = require("./context");
|
|
8
6
|
class SrtpContext extends context_1.Context {
|
|
9
7
|
constructor(masterKey, masterSalt, profile) {
|
|
10
8
|
super(masterKey, masterSalt, profile);
|
|
11
9
|
}
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
const s = this.getSRTPSRRCState(header.ssrc);
|
|
15
|
-
let dst = Buffer.from([]);
|
|
16
|
-
dst = helper_1.growBufferSize(dst, ciphertext.length - 10);
|
|
10
|
+
encryptRtp(payload, header) {
|
|
11
|
+
const s = this.getSrtpSsrcState(header.ssrc);
|
|
17
12
|
this.updateRolloverCount(header.sequenceNumber, s);
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
const counter = this.generateCounter(header.sequenceNumber, s.rolloverCounter, s.ssrc, this.srtpSessionSalt);
|
|
21
|
-
const cipher = crypto_1.createDecipheriv("aes-128-ctr", this.srtpSessionKey, counter);
|
|
22
|
-
const payload = ciphertext.slice(header.payloadOffset);
|
|
23
|
-
const buf = cipher.update(payload);
|
|
24
|
-
buf.copy(dst, header.payloadOffset);
|
|
25
|
-
return [dst, header];
|
|
13
|
+
const enc = this.cipher.encryptRtp(header, payload, s.rolloverCounter);
|
|
14
|
+
return enc;
|
|
26
15
|
}
|
|
27
|
-
|
|
28
|
-
const
|
|
29
|
-
const s = this.
|
|
16
|
+
decryptRtp(cipherText) {
|
|
17
|
+
const header = rtp_1.RtpHeader.deSerialize(cipherText);
|
|
18
|
+
const s = this.getSrtpSsrcState(header.ssrc);
|
|
30
19
|
this.updateRolloverCount(header.sequenceNumber, s);
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
const counter = this.generateCounter(header.sequenceNumber, s.rolloverCounter, s.ssrc, this.srtpSessionSalt);
|
|
34
|
-
const cipher = crypto_1.createCipheriv("aes-128-ctr", this.srtpSessionKey, counter);
|
|
35
|
-
const buf = cipher.update(payload);
|
|
36
|
-
buf.copy(dst, payloadOffset);
|
|
37
|
-
const totalLength = payloadOffset + payload.length;
|
|
38
|
-
const authTag = this.generateSrtpAuthTag(dst.slice(0, totalLength), s.rolloverCounter);
|
|
39
|
-
authTag.copy(dst, totalLength);
|
|
40
|
-
return dst;
|
|
20
|
+
const dec = this.cipher.decryptRtp(cipherText, s.rolloverCounter);
|
|
21
|
+
return dec;
|
|
41
22
|
}
|
|
42
23
|
}
|
|
43
24
|
exports.SrtpContext = SrtpContext;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"srtp.js","sourceRoot":"","sources":["../../../../../../rtp/src/srtp/context/srtp.ts"],"names":[],"mappings":";;;AAAA,
|
|
1
|
+
{"version":3,"file":"srtp.js","sourceRoot":"","sources":["../../../../../../rtp/src/srtp/context/srtp.ts"],"names":[],"mappings":";;;AAAA,uCAA0C;AAE1C,uCAAoC;AAEpC,MAAa,WAAY,SAAQ,iBAAO;IACtC,YAAY,SAAiB,EAAE,UAAkB,EAAE,OAAgB;QACjE,KAAK,CAAC,SAAS,EAAE,UAAU,EAAE,OAAO,CAAC,CAAC;IACxC,CAAC;IAED,UAAU,CAAC,OAAe,EAAE,MAAiB;QAC3C,MAAM,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;QAEnD,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC,eAAe,CAAC,CAAC;QACvE,OAAO,GAAG,CAAC;IACb,CAAC;IAED,UAAU,CAAC,UAAkB;QAC3B,MAAM,MAAM,GAAG,eAAS,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;QAEjD,MAAM,CAAC,GAAG,IAAI,CAAC,gBAAgB,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;QAC7C,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC;QAEnD,MAAM,GAAG,GAAG,IAAI,CAAC,MAAM,CAAC,UAAU,CAAC,UAAU,EAAE,CAAC,CAAC,eAAe,CAAC,CAAC;QAClE,OAAO,GAAG,CAAC;IACb,CAAC;CACF;AAtBD,kCAsBC","sourcesContent":["import { RtpHeader } from \"../../rtp/rtp\";\nimport { Profile } from \"../const\";\nimport { Context } from \"./context\";\n\nexport class SrtpContext extends Context {\n constructor(masterKey: Buffer, masterSalt: Buffer, profile: Profile) {\n super(masterKey, masterSalt, profile);\n }\n\n encryptRtp(payload: Buffer, header: RtpHeader) {\n const s = this.getSrtpSsrcState(header.ssrc);\n this.updateRolloverCount(header.sequenceNumber, s);\n\n const enc = this.cipher.encryptRtp(header, payload, s.rolloverCounter);\n return enc;\n }\n\n decryptRtp(cipherText: Buffer): [Buffer, RtpHeader] {\n const header = RtpHeader.deSerialize(cipherText);\n\n const s = this.getSrtpSsrcState(header.ssrc);\n this.updateRolloverCount(header.sequenceNumber, s);\n\n const dec = this.cipher.decryptRtp(cipherText, s.rolloverCounter);\n return dec;\n }\n}\n"]}
|
package/lib/rtp/src/srtp/srtp.js
CHANGED
|
@@ -8,13 +8,13 @@ class SrtpSession extends session_1.Session {
|
|
|
8
8
|
super(srtp_1.SrtpContext);
|
|
9
9
|
this.config = config;
|
|
10
10
|
this.decrypt = (buf) => {
|
|
11
|
-
const [decrypted] = this.remoteContext.
|
|
11
|
+
const [decrypted] = this.remoteContext.decryptRtp(buf);
|
|
12
12
|
return decrypted;
|
|
13
13
|
};
|
|
14
14
|
this.start(config.keys.localMasterKey, config.keys.localMasterSalt, config.keys.remoteMasterKey, config.keys.remoteMasterSalt, config.profile);
|
|
15
15
|
}
|
|
16
16
|
encrypt(payload, header) {
|
|
17
|
-
return this.localContext.
|
|
17
|
+
return this.localContext.encryptRtp(payload, header);
|
|
18
18
|
}
|
|
19
19
|
}
|
|
20
20
|
exports.SrtpSession = SrtpSession;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"srtp.js","sourceRoot":"","sources":["../../../../../rtp/src/srtp/srtp.ts"],"names":[],"mappings":";;;AACA,yCAA6C;AAC7C,uCAA4C;AAE5C,MAAa,WAAY,SAAQ,iBAAoB;IACnD,YAAmB,MAAc;QAC/B,KAAK,CAAC,kBAAW,CAAC,CAAC;QADF,WAAM,GAAN,MAAM,CAAQ;QAWjC,YAAO,GAAG,CAAC,GAAW,EAAE,EAAE;YACxB,MAAM,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YACvD,OAAO,SAAS,CAAC;QACnB,CAAC,CAAC;QAZA,IAAI,CAAC,KAAK,CACR,MAAM,CAAC,IAAI,CAAC,cAAc,EAC1B,MAAM,CAAC,IAAI,CAAC,eAAe,EAC3B,MAAM,CAAC,IAAI,CAAC,eAAe,EAC3B,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAC5B,MAAM,CAAC,OAAO,CACf,CAAC;IACJ,CAAC;IAOD,OAAO,CAAC,OAAe,EAAE,MAAiB;QACxC,OAAO,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACvD,CAAC;CACF;AApBD,kCAoBC","sourcesContent":["import { RtpHeader } from \"../rtp/rtp\";\nimport { SrtpContext } from \"./context/srtp\";\nimport { Config, Session } from \"./session\";\n\nexport class SrtpSession extends Session<SrtpContext> {\n constructor(public config: Config) {\n super(SrtpContext);\n this.start(\n config.keys.localMasterKey,\n config.keys.localMasterSalt,\n config.keys.remoteMasterKey,\n config.keys.remoteMasterSalt,\n config.profile\n );\n }\n\n decrypt = (buf: Buffer) => {\n const [decrypted] = this.remoteContext.
|
|
1
|
+
{"version":3,"file":"srtp.js","sourceRoot":"","sources":["../../../../../rtp/src/srtp/srtp.ts"],"names":[],"mappings":";;;AACA,yCAA6C;AAC7C,uCAA4C;AAE5C,MAAa,WAAY,SAAQ,iBAAoB;IACnD,YAAmB,MAAc;QAC/B,KAAK,CAAC,kBAAW,CAAC,CAAC;QADF,WAAM,GAAN,MAAM,CAAQ;QAWjC,YAAO,GAAG,CAAC,GAAW,EAAE,EAAE;YACxB,MAAM,CAAC,SAAS,CAAC,GAAG,IAAI,CAAC,aAAa,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YACvD,OAAO,SAAS,CAAC;QACnB,CAAC,CAAC;QAZA,IAAI,CAAC,KAAK,CACR,MAAM,CAAC,IAAI,CAAC,cAAc,EAC1B,MAAM,CAAC,IAAI,CAAC,eAAe,EAC3B,MAAM,CAAC,IAAI,CAAC,eAAe,EAC3B,MAAM,CAAC,IAAI,CAAC,gBAAgB,EAC5B,MAAM,CAAC,OAAO,CACf,CAAC;IACJ,CAAC;IAOD,OAAO,CAAC,OAAe,EAAE,MAAiB;QACxC,OAAO,IAAI,CAAC,YAAY,CAAC,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IACvD,CAAC;CACF;AApBD,kCAoBC","sourcesContent":["import { RtpHeader } from \"../rtp/rtp\";\nimport { SrtpContext } from \"./context/srtp\";\nimport { Config, Session } from \"./session\";\n\nexport class SrtpSession extends Session<SrtpContext> {\n constructor(public config: Config) {\n super(SrtpContext);\n this.start(\n config.keys.localMasterKey,\n config.keys.localMasterSalt,\n config.keys.remoteMasterKey,\n config.keys.remoteMasterSalt,\n config.profile\n );\n }\n\n decrypt = (buf: Buffer) => {\n const [decrypted] = this.remoteContext.decryptRtp(buf);\n return decrypted;\n };\n\n encrypt(payload: Buffer, header: RtpHeader) {\n return this.localContext.encryptRtp(payload, header);\n }\n}\n"]}
|
|
@@ -26,8 +26,9 @@ export declare const DTLS_SETUP_ROLE: {
|
|
|
26
26
|
};
|
|
27
27
|
export declare const FMTP_INT_PARAMETERS: string[];
|
|
28
28
|
export declare const SSRC_INFO_ATTRS: string[];
|
|
29
|
-
export declare
|
|
30
|
-
SRTP_AES128_CM_HMAC_SHA1_80
|
|
31
|
-
|
|
29
|
+
export declare const SRTP_PROFILE: {
|
|
30
|
+
readonly SRTP_AES128_CM_HMAC_SHA1_80: 1;
|
|
31
|
+
readonly SRTP_AEAD_AES_128_GCM: 7;
|
|
32
|
+
};
|
|
32
33
|
export declare const SenderDirections: string[];
|
|
33
34
|
export declare const NotSenderDirections: string[];
|
package/lib/webrtc/src/const.js
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.NotSenderDirections = exports.SenderDirections = exports.SRTP_PROFILE = exports.SSRC_INFO_ATTRS = exports.FMTP_INT_PARAMETERS = exports.DTLS_SETUP_ROLE = exports.DTLS_ROLE_SETUP = exports.DIRECTIONS = exports.MEDIA_KINDS = exports.DISCARD_PORT = exports.DISCARD_HOST = exports.WEBRTC_BINARY_EMPTY = exports.WEBRTC_STRING_EMPTY = exports.WEBRTC_BINARY = exports.WEBRTC_STRING = exports.WEBRTC_DCEP = exports.DATA_CHANNEL_PARTIAL_RELIABLE_TIMED_UNORDERED = exports.DATA_CHANNEL_PARTIAL_RELIABLE_REXMIT_UNORDERED = exports.DATA_CHANNEL_RELIABLE_UNORDERED = exports.DATA_CHANNEL_PARTIAL_RELIABLE_TIMED = exports.DATA_CHANNEL_PARTIAL_RELIABLE_REXMIT = exports.DATA_CHANNEL_RELIABLE = exports.DATA_CHANNEL_OPEN = exports.DATA_CHANNEL_ACK = void 0;
|
|
4
|
+
const srtp_1 = require("../../dtls/src/context/srtp");
|
|
4
5
|
// data channel export constants
|
|
5
6
|
exports.DATA_CHANNEL_ACK = 2;
|
|
6
7
|
exports.DATA_CHANNEL_OPEN = 3;
|
|
@@ -40,10 +41,10 @@ exports.FMTP_INT_PARAMETERS = [
|
|
|
40
41
|
"useinbandfec",
|
|
41
42
|
];
|
|
42
43
|
exports.SSRC_INFO_ATTRS = ["cname", "msid", "mslabel", "label"];
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
}
|
|
44
|
+
exports.SRTP_PROFILE = {
|
|
45
|
+
SRTP_AES128_CM_HMAC_SHA1_80: srtp_1.ProtectionProfileAes128CmHmacSha1_80,
|
|
46
|
+
SRTP_AEAD_AES_128_GCM: srtp_1.ProtectionProfileAeadAes128Gcm,
|
|
47
|
+
};
|
|
47
48
|
exports.SenderDirections = ["sendonly", "sendrecv"];
|
|
48
49
|
exports.NotSenderDirections = ["inactive", "recvonly"];
|
|
49
50
|
//# sourceMappingURL=const.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"const.js","sourceRoot":"","sources":["../../../src/const.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"const.js","sourceRoot":"","sources":["../../../src/const.ts"],"names":[],"mappings":";;;AAAA,sDAGqC;AAGrC,gCAAgC;AACnB,QAAA,gBAAgB,GAAG,CAAC,CAAC;AACrB,QAAA,iBAAiB,GAAG,CAAC,CAAC;AAEnC,kCAAkC;AACrB,QAAA,qBAAqB,GAAG,IAAI,CAAC;AAC7B,QAAA,oCAAoC,GAAG,IAAI,CAAC;AAC5C,QAAA,mCAAmC,GAAG,IAAI,CAAC;AAC3C,QAAA,+BAA+B,GAAG,IAAI,CAAC;AACvC,QAAA,8CAA8C,GAAG,IAAI,CAAC;AACtD,QAAA,6CAA6C,GAAG,IAAI,CAAC;AAErD,QAAA,WAAW,GAAG,EAAE,CAAC;AACjB,QAAA,aAAa,GAAG,EAAE,CAAC;AACnB,QAAA,aAAa,GAAG,EAAE,CAAC;AACnB,QAAA,mBAAmB,GAAG,EAAE,CAAC;AACzB,QAAA,mBAAmB,GAAG,EAAE,CAAC;AAEzB,QAAA,YAAY,GAAG,SAAS,CAAC;AACzB,QAAA,YAAY,GAAG,CAAC,CAAC;AACjB,QAAA,WAAW,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;AAEjC,QAAA,UAAU,GAAG,CAAC,UAAU,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;AAC9D,QAAA,eAAe,GAAG;IAC7B,IAAI,EAAE,SAAS;IACf,MAAM,EAAE,QAAQ;IAChB,MAAM,EAAE,SAAS;CAClB,CAAC;AACW,QAAA,eAAe,GAAgC,MAAM,CAAC,IAAI,CACrE,uBAAe,CAChB,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE;IACpB,MAAM,GAAG,GAAI,uBAAuB,CAAC,GAAG,CAAC,CAAC;IAC1C,GAAG,CAAC,GAAG,CAAC,GAAG,GAAG,CAAC;IACf,OAAO,GAAG,CAAC;AACb,CAAC,EAAE,EAAS,CAAC,CAAC;AACD,QAAA,mBAAmB,GAAG;IACjC,KAAK;IACL,QAAQ;IACR,QAAQ;IACR,iBAAiB;IACjB,UAAU;IACV,QAAQ;IACR,cAAc;CACf,CAAC;AAEW,QAAA,eAAe,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;AAExD,QAAA,YAAY,GAAG;IAC1B,2BAA2B,EAAE,2CAAoC;IACjE,qBAAqB,EAAE,qCAA8B;CAC7C,CAAC;AAEE,QAAA,gBAAgB,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC;AAC5C,QAAA,mBAAmB,GAAG,CAAC,UAAU,EAAE,UAAU,CAAC,CAAC","sourcesContent":["import {\n ProtectionProfileAeadAes128Gcm,\n ProtectionProfileAes128CmHmacSha1_80,\n} from \"../../dtls/src/context/srtp\";\nimport { DtlsRole } from \"./transport/dtls\";\n\n// data channel export constants\nexport const DATA_CHANNEL_ACK = 2;\nexport const DATA_CHANNEL_OPEN = 3;\n\n// 5.1. DATA_CHANNEL_OPEN Message\nexport const DATA_CHANNEL_RELIABLE = 0x00;\nexport const DATA_CHANNEL_PARTIAL_RELIABLE_REXMIT = 0x01;\nexport const DATA_CHANNEL_PARTIAL_RELIABLE_TIMED = 0x02;\nexport const DATA_CHANNEL_RELIABLE_UNORDERED = 0x80;\nexport const DATA_CHANNEL_PARTIAL_RELIABLE_REXMIT_UNORDERED = 0x81;\nexport const DATA_CHANNEL_PARTIAL_RELIABLE_TIMED_UNORDERED = 0x82;\n\nexport const WEBRTC_DCEP = 50;\nexport const WEBRTC_STRING = 51;\nexport const WEBRTC_BINARY = 53;\nexport const WEBRTC_STRING_EMPTY = 56;\nexport const WEBRTC_BINARY_EMPTY = 57;\n\nexport const DISCARD_HOST = \"0.0.0.0\";\nexport const DISCARD_PORT = 9;\nexport const MEDIA_KINDS = [\"audio\", \"video\"];\n\nexport const DIRECTIONS = [\"inactive\", \"sendonly\", \"recvonly\", \"sendrecv\"];\nexport const DTLS_ROLE_SETUP = {\n auto: \"actpass\",\n client: \"active\",\n server: \"passive\",\n};\nexport const DTLS_SETUP_ROLE: { [key: string]: DtlsRole } = Object.keys(\n DTLS_ROLE_SETUP\n).reduce((acc, cur) => {\n const key = (DTLS_ROLE_SETUP as any)[cur];\n acc[key] = cur;\n return acc;\n}, {} as any);\nexport const FMTP_INT_PARAMETERS = [\n \"apt\",\n \"max-fr\",\n \"max-fs\",\n \"maxplaybackrate\",\n \"minptime\",\n \"stereo\",\n \"useinbandfec\",\n];\n\nexport const SSRC_INFO_ATTRS = [\"cname\", \"msid\", \"mslabel\", \"label\"];\n\nexport const SRTP_PROFILE = {\n SRTP_AES128_CM_HMAC_SHA1_80: ProtectionProfileAes128CmHmacSha1_80,\n SRTP_AEAD_AES_128_GCM: ProtectionProfileAeadAes128Gcm,\n} as const;\n\nexport const SenderDirections = [\"sendonly\", \"sendrecv\"];\nexport const NotSenderDirections = [\"inactive\", \"recvonly\"];\n"]}
|
|
@@ -5,11 +5,11 @@ export declare function divide(from: string, split: string): [string, string];
|
|
|
5
5
|
export declare class PromiseQueue {
|
|
6
6
|
queue: {
|
|
7
7
|
promise: () => Promise<any>;
|
|
8
|
-
|
|
8
|
+
done: () => void;
|
|
9
9
|
}[];
|
|
10
10
|
running: boolean;
|
|
11
11
|
push: (promise: () => Promise<any>) => Promise<void>;
|
|
12
|
-
run
|
|
12
|
+
private run;
|
|
13
13
|
}
|
|
14
14
|
export declare class EventTarget extends EventEmitter {
|
|
15
15
|
addEventListener: (type: string, listener: (...args: any[]) => void) => void;
|
package/lib/webrtc/src/helper.js
CHANGED
|
@@ -19,7 +19,7 @@ class PromiseQueue {
|
|
|
19
19
|
this.queue = [];
|
|
20
20
|
this.running = false;
|
|
21
21
|
this.push = (promise) => new Promise((r) => {
|
|
22
|
-
this.queue.push({ promise,
|
|
22
|
+
this.queue.push({ promise, done: r });
|
|
23
23
|
if (!this.running)
|
|
24
24
|
this.run();
|
|
25
25
|
});
|
|
@@ -29,7 +29,7 @@ class PromiseQueue {
|
|
|
29
29
|
if (task) {
|
|
30
30
|
this.running = true;
|
|
31
31
|
await task.promise();
|
|
32
|
-
task.
|
|
32
|
+
task.done();
|
|
33
33
|
this.run();
|
|
34
34
|
}
|
|
35
35
|
else {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"helper.js","sourceRoot":"","sources":["../../../src/helper.ts"],"names":[],"mappings":";;;;;;AAAA,oDAAkC;AAElC,SAAgB,SAAS,CAAI,GAAQ;IACnC,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACnC,CAAC;AAFD,8BAEC;AAED,SAAgB,MAAM,CAAC,IAAY,EAAE,KAAa;IAChD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC9B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AAC5C,CAAC;AAHD,wBAGC;AAED,MAAa,YAAY;IAAzB;QACE,UAAK,GAAwD,EAAE,CAAC;QAChE,YAAO,GAAG,KAAK,CAAC;QAEhB,SAAI,GAAG,CAAC,OAA2B,EAAE,EAAE,CACrC,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,EAAE;YACtB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;YACtC,IAAI,CAAC,IAAI,CAAC,OAAO;gBAAE,IAAI,CAAC,GAAG,EAAE,CAAC;QAChC,CAAC,CAAC,CAAC;IAcP,CAAC;
|
|
1
|
+
{"version":3,"file":"helper.js","sourceRoot":"","sources":["../../../src/helper.ts"],"names":[],"mappings":";;;;;;AAAA,oDAAkC;AAElC,SAAgB,SAAS,CAAI,GAAQ;IACnC,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;AACnC,CAAC;AAFD,8BAEC;AAED,SAAgB,MAAM,CAAC,IAAY,EAAE,KAAa;IAChD,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC9B,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;AAC5C,CAAC;AAHD,wBAGC;AAED,MAAa,YAAY;IAAzB;QACE,UAAK,GAAwD,EAAE,CAAC;QAChE,YAAO,GAAG,KAAK,CAAC;QAEhB,SAAI,GAAG,CAAC,OAA2B,EAAE,EAAE,CACrC,IAAI,OAAO,CAAO,CAAC,CAAC,EAAE,EAAE;YACtB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,EAAE,CAAC,CAAC;YACtC,IAAI,CAAC,IAAI,CAAC,OAAO;gBAAE,IAAI,CAAC,GAAG,EAAE,CAAC;QAChC,CAAC,CAAC,CAAC;IAcP,CAAC;IAZS,KAAK,CAAC,GAAG;QACf,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAChC,IAAI,IAAI,EAAE;YACR,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC;YACpB,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;YACrB,IAAI,CAAC,IAAI,EAAE,CAAC;YAEZ,IAAI,CAAC,GAAG,EAAE,CAAC;SACZ;aAAM;YACL,IAAI,CAAC,OAAO,GAAG,KAAK,CAAC;SACtB;IACH,CAAC;CACF;AAtBD,oCAsBC;AAED,MAAa,WAAY,SAAQ,gBAAY;IAA7C;;QACE,qBAAgB,GAAG,CAAC,IAAY,EAAE,QAAkC,EAAE,EAAE;YACtE,IAAI,CAAC,WAAW,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACnC,CAAC,CAAC;QAEF,wBAAmB,GAAG,CAAC,IAAY,EAAE,QAAkC,EAAE,EAAE;YACzE,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;QACtC,CAAC,CAAC;IACJ,CAAC;CAAA;AARD,kCAQC","sourcesContent":["import EventEmitter from \"events\";\n\nexport function enumerate<T>(arr: T[]): [number, T][] {\n return arr.map((v, i) => [i, v]);\n}\n\nexport function divide(from: string, split: string): [string, string] {\n const arr = from.split(split);\n return [arr[0], arr.slice(1).join(split)];\n}\n\nexport class PromiseQueue {\n queue: { promise: () => Promise<any>; done: () => void }[] = [];\n running = false;\n\n push = (promise: () => Promise<any>) =>\n new Promise<void>((r) => {\n this.queue.push({ promise, done: r });\n if (!this.running) this.run();\n });\n\n private async run() {\n const task = this.queue.shift();\n if (task) {\n this.running = true;\n await task.promise();\n task.done();\n\n this.run();\n } else {\n this.running = false;\n }\n }\n}\n\nexport class EventTarget extends EventEmitter {\n addEventListener = (type: string, listener: (...args: any[]) => void) => {\n this.addListener(type, listener);\n };\n\n removeEventListener = (type: string, listener: (...args: any[]) => void) => {\n this.removeListener(type, listener);\n };\n}\n"]}
|
|
@@ -1,12 +1,16 @@
|
|
|
1
1
|
export * from "../../ice/src";
|
|
2
2
|
export * from "../../rtp/src";
|
|
3
3
|
export * from "./dataChannel";
|
|
4
|
-
export * from "./extension/rtcpFeedback";
|
|
5
|
-
export * from "./extension/rtpExtension";
|
|
6
4
|
export * from "./helper";
|
|
5
|
+
export * from "./media/extension/rtcpFeedback";
|
|
6
|
+
export * from "./media/extension/rtpExtension";
|
|
7
7
|
export * from "./media/parameters";
|
|
8
8
|
export * from "./media/rtpTransceiver";
|
|
9
9
|
export * from "./media/track";
|
|
10
|
+
export * from "./nonstandard/lipsync";
|
|
11
|
+
export * from "./nonstandard/recorder";
|
|
12
|
+
export * from "./nonstandard/sampleBuilder";
|
|
13
|
+
export * from "./nonstandard/userMedia";
|
|
10
14
|
export * from "./peerConnection";
|
|
11
15
|
export * from "./sdp";
|
|
12
16
|
export * from "./transport/dtls";
|