werift 0.22.1 → 0.22.3
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 +8 -7
- package/lib/common/src/binary.js +5 -2
- package/lib/common/src/binary.js.map +1 -1
- package/lib/common/src/event.d.ts +1 -0
- package/lib/common/src/event.js +5 -0
- package/lib/common/src/event.js.map +1 -1
- package/lib/common/src/log.d.ts +1 -2
- package/lib/common/src/transport.d.ts +4 -1
- package/lib/common/src/transport.js +35 -14
- package/lib/common/src/transport.js.map +1 -1
- package/lib/dtls/src/cipher/create.d.ts +2 -1
- package/lib/dtls/src/cipher/create.js.map +1 -1
- package/lib/dtls/src/cipher/prf.d.ts +12 -12
- package/lib/dtls/src/cipher/suites/abstract.d.ts +2 -1
- package/lib/dtls/src/cipher/suites/abstract.js.map +1 -1
- package/lib/dtls/src/cipher/suites/aead.d.ts +3 -2
- package/lib/dtls/src/cipher/suites/aead.js +34 -41
- package/lib/dtls/src/cipher/suites/aead.js.map +1 -1
- package/lib/dtls/src/context/cipher.d.ts +4 -4
- package/lib/dtls/src/context/cipher.js +25 -15
- package/lib/dtls/src/context/cipher.js.map +1 -1
- package/lib/dtls/src/context/srtp.d.ts +3 -3
- package/lib/dtls/src/context/srtp.js.map +1 -1
- package/lib/dtls/src/flight/client/flight5.js.map +1 -1
- package/lib/dtls/src/flight/server/flight2.js.map +1 -1
- package/lib/dtls/src/handshake/extensions/ellipticCurves.d.ts +1 -1
- package/lib/dtls/src/handshake/extensions/renegotiationIndication.d.ts +2 -2
- package/lib/dtls/src/handshake/extensions/signature.d.ts +2 -2
- package/lib/dtls/src/handshake/extensions/useSrtp.d.ts +1 -1
- package/lib/dtls/src/handshake/extensions/useSrtp.js +4 -7
- package/lib/dtls/src/handshake/extensions/useSrtp.js.map +1 -1
- package/lib/dtls/src/handshake/message/alert.d.ts +1 -1
- package/lib/dtls/src/handshake/message/certificate.d.ts +1 -1
- package/lib/dtls/src/handshake/message/changeCipherSpec.d.ts +1 -1
- package/lib/dtls/src/handshake/message/client/certificateVerify.d.ts +1 -1
- package/lib/dtls/src/handshake/message/client/hello.d.ts +1 -1
- package/lib/dtls/src/handshake/message/client/keyExchange.d.ts +1 -1
- package/lib/dtls/src/handshake/message/finished.d.ts +1 -1
- package/lib/dtls/src/handshake/message/server/certificateRequest.d.ts +1 -1
- package/lib/dtls/src/handshake/message/server/hello.d.ts +1 -1
- package/lib/dtls/src/handshake/message/server/helloDone.d.ts +1 -1
- package/lib/dtls/src/handshake/message/server/helloVerifyRequest.d.ts +1 -1
- package/lib/dtls/src/handshake/message/server/keyExchange.d.ts +1 -1
- package/lib/dtls/src/handshake/random.d.ts +3 -3
- package/lib/dtls/src/record/message/fragment.d.ts +1 -1
- package/lib/dtls/src/record/message/header.d.ts +2 -19
- package/lib/dtls/src/record/message/header.js +1 -60
- package/lib/dtls/src/record/message/header.js.map +1 -1
- package/lib/dtls/src/record/message/plaintext.d.ts +6 -27
- package/lib/dtls/src/record/message/plaintext.js +34 -16
- package/lib/dtls/src/record/message/plaintext.js.map +1 -1
- package/lib/dtls/src/socket.d.ts +4 -4
- package/lib/dtls/src/socket.js.map +1 -1
- package/lib/dtls/src/util/binary.d.ts +1 -1
- package/lib/ice/src/candidate.js +1 -5
- package/lib/ice/src/candidate.js.map +1 -1
- package/lib/ice/src/helper.d.ts +1 -1
- package/lib/ice/src/ice.d.ts +4 -3
- package/lib/ice/src/ice.js +93 -72
- package/lib/ice/src/ice.js.map +1 -1
- package/lib/ice/src/iceBase.d.ts +21 -2
- package/lib/ice/src/iceBase.js +47 -1
- package/lib/ice/src/iceBase.js.map +1 -1
- package/lib/ice/src/stun/attributes.d.ts +2 -2
- package/lib/ice/src/stun/attributes.js +48 -29
- package/lib/ice/src/stun/attributes.js.map +1 -1
- package/lib/ice/src/stun/message.d.ts +2 -2
- package/lib/ice/src/stun/message.js +22 -23
- package/lib/ice/src/stun/message.js.map +1 -1
- package/lib/ice/src/stun/protocol.d.ts +2 -2
- package/lib/ice/src/stun/protocol.js +6 -0
- package/lib/ice/src/stun/protocol.js.map +1 -1
- package/lib/ice/src/turn/protocol.d.ts +2 -2
- package/lib/ice/src/turn/protocol.js +3 -0
- package/lib/ice/src/turn/protocol.js.map +1 -1
- package/lib/index.mjs +2707 -1883
- package/lib/nonstandard/index.mjs +737 -698
- package/lib/rtp/src/codec/av1.d.ts +2 -2
- package/lib/rtp/src/codec/opus.d.ts +1 -1
- package/lib/rtp/src/extra/container/mp4/container.js +18 -8
- package/lib/rtp/src/extra/container/mp4/container.js.map +1 -1
- package/lib/rtp/src/extra/container/mp4/h264.d.ts +2 -2
- package/lib/rtp/src/extra/container/mp4/sps-parser.d.ts +1 -1
- package/lib/rtp/src/extra/container/ogg/parser.d.ts +1 -1
- package/lib/rtp/src/extra/container/webm/container.d.ts +9 -9
- package/lib/rtp/src/extra/container/webm/container.js +24 -12
- package/lib/rtp/src/extra/container/webm/container.js.map +1 -1
- package/lib/rtp/src/extra/container/webm/ebml/ebml.d.ts +35 -1
- package/lib/rtp/src/extra/container/webm/ebml/ebml.js +75 -1
- package/lib/rtp/src/extra/container/webm/ebml/ebml.js.map +1 -1
- package/lib/rtp/src/extra/container/webm/ebml/id.d.ts +222 -222
- package/lib/rtp/src/extra/container/webm/index.d.ts +1 -0
- package/lib/rtp/src/extra/container/webm/index.js +1 -0
- package/lib/rtp/src/extra/container/webm/index.js.map +1 -1
- package/lib/rtp/src/extra/container/webm/util.d.ts +8 -0
- package/lib/rtp/src/extra/container/webm/util.js +100 -0
- package/lib/rtp/src/extra/container/webm/util.js.map +1 -0
- package/lib/rtp/src/extra/processor/depacketizerCallback.d.ts +1 -1
- package/lib/rtp/src/extra/processor/depacketizerTransformer.d.ts +6 -1
- package/lib/rtp/src/extra/processor/dtx.d.ts +1 -1
- package/lib/rtp/src/extra/processor/dtx.js +1 -1
- package/lib/rtp/src/extra/processor/dtx.js.map +1 -1
- package/lib/rtp/src/extra/processor/dtxCallback.d.ts +1 -1
- package/lib/rtp/src/extra/processor/interface.d.ts +1 -1
- package/lib/rtp/src/extra/processor/jitterBufferCallback.d.ts +1 -1
- package/lib/rtp/src/extra/processor/lipsync.js +1 -1
- package/lib/rtp/src/extra/processor/lipsync.js.map +1 -1
- package/lib/rtp/src/extra/processor/mp4.js +3 -0
- package/lib/rtp/src/extra/processor/mp4.js.map +1 -1
- package/lib/rtp/src/extra/processor/mute.d.ts +1 -1
- package/lib/rtp/src/extra/processor/mute.js +1 -1
- package/lib/rtp/src/extra/processor/mute.js.map +1 -1
- package/lib/rtp/src/extra/processor/nackHandlerCallback.d.ts +1 -1
- package/lib/rtp/src/extra/processor/ntpTime.d.ts +1 -1
- package/lib/rtp/src/extra/processor/ntpTime.js +1 -1
- package/lib/rtp/src/extra/processor/ntpTime.js.map +1 -1
- package/lib/rtp/src/extra/processor/ntpTimeCallback.d.ts +1 -1
- package/lib/rtp/src/extra/processor/rtpTimeCallback.d.ts +1 -1
- package/lib/rtp/src/extra/processor/webm.d.ts +3 -3
- package/lib/rtp/src/extra/processor/webm.js.map +1 -1
- package/lib/rtp/src/extra/processor/webmStream.d.ts +2 -2
- package/lib/rtp/src/extra/processor/webmStream.js.map +1 -1
- package/lib/rtp/src/helper.d.ts +1 -1
- package/lib/rtp/src/rtcp/header.d.ts +2 -1
- package/lib/rtp/src/rtcp/header.js +10 -0
- package/lib/rtp/src/rtcp/header.js.map +1 -1
- package/lib/rtp/src/rtcp/psfb/fullIntraRequest.d.ts +1 -1
- package/lib/rtp/src/rtcp/psfb/index.d.ts +2 -2
- package/lib/rtp/src/rtcp/psfb/index.js +2 -2
- package/lib/rtp/src/rtcp/psfb/index.js.map +1 -1
- package/lib/rtp/src/rtcp/psfb/pictureLossIndication.d.ts +1 -1
- package/lib/rtp/src/rtcp/psfb/remb.d.ts +1 -1
- package/lib/rtp/src/rtcp/rr.d.ts +2 -2
- package/lib/rtp/src/rtcp/rr.js +2 -2
- package/lib/rtp/src/rtcp/rr.js.map +1 -1
- package/lib/rtp/src/rtcp/rtcp.d.ts +0 -1
- package/lib/rtp/src/rtcp/rtcp.js +0 -10
- package/lib/rtp/src/rtcp/rtcp.js.map +1 -1
- package/lib/rtp/src/rtcp/rtpfb/const.d.ts +1 -0
- package/lib/rtp/src/rtcp/rtpfb/const.js +5 -0
- package/lib/rtp/src/rtcp/rtpfb/const.js.map +1 -0
- package/lib/rtp/src/rtcp/rtpfb/index.d.ts +1 -1
- package/lib/rtp/src/rtcp/rtpfb/index.js +2 -1
- package/lib/rtp/src/rtcp/rtpfb/index.js.map +1 -1
- package/lib/rtp/src/rtcp/rtpfb/nack.d.ts +1 -1
- package/lib/rtp/src/rtcp/rtpfb/nack.js +2 -2
- package/lib/rtp/src/rtcp/rtpfb/nack.js.map +1 -1
- package/lib/rtp/src/rtcp/rtpfb/twcc.d.ts +4 -4
- package/lib/rtp/src/rtcp/sdes.d.ts +4 -4
- package/lib/rtp/src/rtcp/sdes.js +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 +2 -2
- package/lib/rtp/src/rtcp/sr.js.map +1 -1
- package/lib/rtp/src/rtp/headerExtension.d.ts +6 -6
- package/lib/rtp/src/rtp/red/packet.d.ts +2 -2
- package/lib/rtp/src/rtp/rtp.d.ts +2 -2
- package/lib/rtp/src/srtp/cipher/ctr.d.ts +4 -4
- package/lib/rtp/src/srtp/cipher/gcm.d.ts +4 -4
- package/lib/rtp/src/srtp/const.d.ts +3 -3
- package/lib/rtp/src/srtp/const.js.map +1 -1
- package/lib/rtp/src/srtp/context/context.d.ts +10 -10
- package/lib/rtp/src/srtp/context/context.js +10 -4
- package/lib/rtp/src/srtp/context/context.js.map +1 -1
- package/lib/rtp/src/srtp/context/srtcp.d.ts +3 -3
- package/lib/rtp/src/srtp/context/srtcp.js.map +1 -1
- package/lib/rtp/src/srtp/context/srtp.d.ts +3 -3
- package/lib/rtp/src/srtp/context/srtp.js.map +1 -1
- package/lib/rtp/src/srtp/srtcp.d.ts +2 -2
- package/lib/rtp/src/srtp/srtp.d.ts +2 -2
- package/lib/sctp/src/chunk.d.ts +12 -12
- package/lib/sctp/src/chunk.js +87 -66
- package/lib/sctp/src/chunk.js.map +1 -1
- package/lib/sctp/src/param.d.ts +3 -3
- package/lib/sctp/src/param.js +4 -5
- package/lib/sctp/src/param.js.map +1 -1
- package/lib/sctp/src/sctp.d.ts +3 -1
- package/lib/sctp/src/sctp.js +58 -15
- package/lib/sctp/src/sctp.js.map +1 -1
- package/lib/webrtc/src/dataChannel.d.ts +15 -4
- package/lib/webrtc/src/dataChannel.js +42 -7
- package/lib/webrtc/src/dataChannel.js.map +1 -1
- package/lib/webrtc/src/index.d.ts +1 -0
- package/lib/webrtc/src/index.js +1 -0
- package/lib/webrtc/src/index.js.map +1 -1
- package/lib/webrtc/src/media/index.d.ts +2 -0
- package/lib/webrtc/src/media/index.js +2 -0
- package/lib/webrtc/src/media/index.js.map +1 -1
- package/lib/webrtc/src/media/parameters.d.ts +2 -2
- package/lib/webrtc/src/media/parameters.js.map +1 -1
- package/lib/webrtc/src/media/receiver/nack.js +3 -7
- package/lib/webrtc/src/media/receiver/nack.js.map +1 -1
- package/lib/webrtc/src/media/receiver/receiverTwcc.d.ts +2 -2
- 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/router.js +2 -1
- package/lib/webrtc/src/media/router.js.map +1 -1
- package/lib/webrtc/src/media/rtpReceiver.d.ts +3 -3
- package/lib/webrtc/src/media/rtpReceiver.js +53 -4
- package/lib/webrtc/src/media/rtpReceiver.js.map +1 -1
- package/lib/webrtc/src/media/rtpSender.d.ts +6 -0
- package/lib/webrtc/src/media/rtpSender.js +64 -26
- package/lib/webrtc/src/media/rtpSender.js.map +1 -1
- package/lib/webrtc/src/media/rtpTransceiver.d.ts +12 -9
- package/lib/webrtc/src/media/rtpTransceiver.js +30 -26
- package/lib/webrtc/src/media/rtpTransceiver.js.map +1 -1
- package/lib/webrtc/src/media/stats.d.ts +279 -0
- package/lib/webrtc/src/media/stats.js +35 -1
- package/lib/webrtc/src/media/stats.js.map +1 -1
- package/lib/webrtc/src/media/track.js +3 -3
- package/lib/webrtc/src/media/track.js.map +1 -1
- package/lib/webrtc/src/nonstandard/recorder/writer/webm.js.map +1 -1
- package/lib/webrtc/src/nonstandard/userMedia.js +2 -2
- package/lib/webrtc/src/nonstandard/userMedia.js.map +1 -1
- package/lib/webrtc/src/peerConnection.d.ts +35 -64
- package/lib/webrtc/src/peerConnection.js +337 -1034
- package/lib/webrtc/src/peerConnection.js.map +1 -1
- package/lib/webrtc/src/sctpManager.d.ts +27 -0
- package/lib/webrtc/src/sctpManager.js +147 -0
- package/lib/webrtc/src/sctpManager.js.map +1 -0
- package/lib/webrtc/src/sdp.d.ts +3 -2
- package/lib/webrtc/src/sdp.js +17 -7
- package/lib/webrtc/src/sdp.js.map +1 -1
- package/lib/webrtc/src/sdpManager.d.ts +78 -0
- package/lib/webrtc/src/sdpManager.js +391 -0
- package/lib/webrtc/src/sdpManager.js.map +1 -0
- package/lib/webrtc/src/secureTransportManager.d.ts +56 -0
- package/lib/webrtc/src/secureTransportManager.js +349 -0
- package/lib/webrtc/src/secureTransportManager.js.map +1 -0
- package/lib/webrtc/src/transceiverManager.d.ts +40 -0
- package/lib/webrtc/src/transceiverManager.js +355 -0
- package/lib/webrtc/src/transceiverManager.js.map +1 -0
- package/lib/webrtc/src/transport/dtls.d.ts +18 -6
- package/lib/webrtc/src/transport/dtls.js +128 -13
- package/lib/webrtc/src/transport/dtls.js.map +1 -1
- package/lib/webrtc/src/transport/ice.d.ts +24 -0
- package/lib/webrtc/src/transport/ice.js +88 -2
- package/lib/webrtc/src/transport/ice.js.map +1 -1
- package/lib/webrtc/src/transport/sctp.js +13 -26
- package/lib/webrtc/src/transport/sctp.js.map +1 -1
- package/lib/webrtc/src/utils.d.ts +9 -4
- package/lib/webrtc/src/utils.js +34 -13
- package/lib/webrtc/src/utils.js.map +1 -1
- package/package.json +12 -26
|
@@ -0,0 +1,391 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.SDPManager = void 0;
|
|
4
|
+
const const_1 = require("./const");
|
|
5
|
+
const parameters_1 = require("./media/parameters");
|
|
6
|
+
const sdp_1 = require("./sdp");
|
|
7
|
+
const sctp_1 = require("./transport/sctp");
|
|
8
|
+
const utils_1 = require("./utils");
|
|
9
|
+
class SDPManager {
|
|
10
|
+
constructor({ cname, midSuffix, bundlePolicy, }) {
|
|
11
|
+
Object.defineProperty(this, "currentLocalDescription", {
|
|
12
|
+
enumerable: true,
|
|
13
|
+
configurable: true,
|
|
14
|
+
writable: true,
|
|
15
|
+
value: void 0
|
|
16
|
+
});
|
|
17
|
+
Object.defineProperty(this, "currentRemoteDescription", {
|
|
18
|
+
enumerable: true,
|
|
19
|
+
configurable: true,
|
|
20
|
+
writable: true,
|
|
21
|
+
value: void 0
|
|
22
|
+
});
|
|
23
|
+
Object.defineProperty(this, "pendingLocalDescription", {
|
|
24
|
+
enumerable: true,
|
|
25
|
+
configurable: true,
|
|
26
|
+
writable: true,
|
|
27
|
+
value: void 0
|
|
28
|
+
});
|
|
29
|
+
Object.defineProperty(this, "pendingRemoteDescription", {
|
|
30
|
+
enumerable: true,
|
|
31
|
+
configurable: true,
|
|
32
|
+
writable: true,
|
|
33
|
+
value: void 0
|
|
34
|
+
});
|
|
35
|
+
Object.defineProperty(this, "cname", {
|
|
36
|
+
enumerable: true,
|
|
37
|
+
configurable: true,
|
|
38
|
+
writable: true,
|
|
39
|
+
value: void 0
|
|
40
|
+
});
|
|
41
|
+
Object.defineProperty(this, "midSuffix", {
|
|
42
|
+
enumerable: true,
|
|
43
|
+
configurable: true,
|
|
44
|
+
writable: true,
|
|
45
|
+
value: void 0
|
|
46
|
+
});
|
|
47
|
+
Object.defineProperty(this, "bundlePolicy", {
|
|
48
|
+
enumerable: true,
|
|
49
|
+
configurable: true,
|
|
50
|
+
writable: true,
|
|
51
|
+
value: void 0
|
|
52
|
+
});
|
|
53
|
+
Object.defineProperty(this, "seenMid", {
|
|
54
|
+
enumerable: true,
|
|
55
|
+
configurable: true,
|
|
56
|
+
writable: true,
|
|
57
|
+
value: new Set()
|
|
58
|
+
});
|
|
59
|
+
this.cname = cname;
|
|
60
|
+
this.midSuffix = midSuffix ?? false;
|
|
61
|
+
this.bundlePolicy = bundlePolicy;
|
|
62
|
+
}
|
|
63
|
+
get localDescription() {
|
|
64
|
+
if (!this._localDescription) {
|
|
65
|
+
return undefined;
|
|
66
|
+
}
|
|
67
|
+
return this._localDescription.toJSON();
|
|
68
|
+
}
|
|
69
|
+
get remoteDescription() {
|
|
70
|
+
if (!this._remoteDescription) {
|
|
71
|
+
return undefined;
|
|
72
|
+
}
|
|
73
|
+
return this._remoteDescription.toJSON();
|
|
74
|
+
}
|
|
75
|
+
/**@private */
|
|
76
|
+
get _localDescription() {
|
|
77
|
+
return this.pendingLocalDescription || this.currentLocalDescription;
|
|
78
|
+
}
|
|
79
|
+
/**@private */
|
|
80
|
+
get _remoteDescription() {
|
|
81
|
+
return this.pendingRemoteDescription || this.currentRemoteDescription;
|
|
82
|
+
}
|
|
83
|
+
get inactiveRemoteMedia() {
|
|
84
|
+
return this._remoteDescription?.media?.find?.((m) => m.direction === "inactive");
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* MediaDescriptionをトランシーバー用に作成
|
|
88
|
+
*/
|
|
89
|
+
createMediaDescriptionForTransceiver(transceiver, direction) {
|
|
90
|
+
const media = new sdp_1.MediaDescription(transceiver.kind, 9, "UDP/TLS/RTP/SAVPF", transceiver.codecs.map((c) => c.payloadType));
|
|
91
|
+
media.direction = direction;
|
|
92
|
+
media.msid = transceiver.msid;
|
|
93
|
+
media.rtp = {
|
|
94
|
+
codecs: transceiver.codecs,
|
|
95
|
+
headerExtensions: transceiver.headerExtensions,
|
|
96
|
+
muxId: transceiver.mid,
|
|
97
|
+
};
|
|
98
|
+
media.rtcpHost = "0.0.0.0";
|
|
99
|
+
media.rtcpPort = 9;
|
|
100
|
+
media.rtcpMux = true;
|
|
101
|
+
media.ssrc = [
|
|
102
|
+
new sdp_1.SsrcDescription({ ssrc: transceiver.sender.ssrc, cname: this.cname }),
|
|
103
|
+
];
|
|
104
|
+
if (transceiver.options.simulcast) {
|
|
105
|
+
media.simulcastParameters = transceiver.options.simulcast.map((o) => new parameters_1.RTCRtpSimulcastParameters(o));
|
|
106
|
+
}
|
|
107
|
+
if (media.rtp.codecs.find((c) => c.name.toLowerCase() === "rtx")) {
|
|
108
|
+
media.ssrc.push(new sdp_1.SsrcDescription({
|
|
109
|
+
ssrc: transceiver.sender.rtxSsrc,
|
|
110
|
+
cname: this.cname,
|
|
111
|
+
}));
|
|
112
|
+
media.ssrcGroup = [
|
|
113
|
+
new sdp_1.GroupDescription("FID", [
|
|
114
|
+
transceiver.sender.ssrc.toString(),
|
|
115
|
+
transceiver.sender.rtxSsrc.toString(),
|
|
116
|
+
]),
|
|
117
|
+
];
|
|
118
|
+
}
|
|
119
|
+
this.addTransportDescription(media, transceiver.dtlsTransport);
|
|
120
|
+
return media;
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* MediaDescriptionをSCTP用に作成
|
|
124
|
+
*/
|
|
125
|
+
createMediaDescriptionForSctp(sctp) {
|
|
126
|
+
const media = new sdp_1.MediaDescription("application", const_1.DISCARD_PORT, "UDP/DTLS/SCTP", ["webrtc-datachannel"]);
|
|
127
|
+
media.sctpPort = sctp.port;
|
|
128
|
+
media.rtp.muxId = sctp.mid;
|
|
129
|
+
media.sctpCapabilities = sctp_1.RTCSctpTransport.getCapabilities();
|
|
130
|
+
this.addTransportDescription(media, sctp.dtlsTransport);
|
|
131
|
+
return media;
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* トランスポートの情報をMediaDescriptionに追加
|
|
135
|
+
*/
|
|
136
|
+
addTransportDescription(media, dtlsTransport) {
|
|
137
|
+
const iceTransport = dtlsTransport.iceTransport;
|
|
138
|
+
media.iceCandidates = iceTransport.localCandidates;
|
|
139
|
+
media.iceCandidatesComplete = iceTransport.gatheringState === "complete";
|
|
140
|
+
media.iceParams = iceTransport.localParameters;
|
|
141
|
+
media.iceOptions = "trickle";
|
|
142
|
+
media.host = const_1.DISCARD_HOST;
|
|
143
|
+
media.port = const_1.DISCARD_PORT;
|
|
144
|
+
if (media.direction === "inactive") {
|
|
145
|
+
media.port = 0;
|
|
146
|
+
media.msid = undefined;
|
|
147
|
+
}
|
|
148
|
+
if (!media.dtlsParams) {
|
|
149
|
+
media.dtlsParams = dtlsTransport.localParameters;
|
|
150
|
+
if (!media.dtlsParams.fingerprints) {
|
|
151
|
+
media.dtlsParams.fingerprints =
|
|
152
|
+
dtlsTransport.localParameters.fingerprints;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* 一意のMIDを割り当て
|
|
158
|
+
*/
|
|
159
|
+
allocateMid(type = "") {
|
|
160
|
+
let mid = "";
|
|
161
|
+
for (let i = 0;;) {
|
|
162
|
+
// rfc9143.html#name-security-considerations
|
|
163
|
+
// SHOULD be 3 bytes or fewer to allow them to efficiently fit into the MID RTP header extension
|
|
164
|
+
mid = (i++).toString() + type;
|
|
165
|
+
if (!this.seenMid.has(mid))
|
|
166
|
+
break;
|
|
167
|
+
}
|
|
168
|
+
this.seenMid.add(mid);
|
|
169
|
+
return mid;
|
|
170
|
+
}
|
|
171
|
+
parseSdp({ sdp, isLocal, signalingState, type, }) {
|
|
172
|
+
const description = sdp_1.SessionDescription.parse(sdp);
|
|
173
|
+
this.validateDescription({ description, isLocal, signalingState });
|
|
174
|
+
description.type = type;
|
|
175
|
+
return description;
|
|
176
|
+
}
|
|
177
|
+
validateDescription({ description, isLocal, signalingState, }) {
|
|
178
|
+
if (isLocal) {
|
|
179
|
+
if (description.type === "offer") {
|
|
180
|
+
if (!["stable", "have-local-offer"].includes(signalingState))
|
|
181
|
+
throw new Error("Cannot handle offer in signaling state");
|
|
182
|
+
}
|
|
183
|
+
else if (description.type === "answer") {
|
|
184
|
+
if (!["have-remote-offer", "have-local-pranswer"].includes(signalingState)) {
|
|
185
|
+
throw new Error("Cannot handle answer in signaling state");
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
else {
|
|
190
|
+
if (description.type === "offer") {
|
|
191
|
+
if (!["stable", "have-remote-offer"].includes(signalingState)) {
|
|
192
|
+
throw new Error("Cannot handle offer in signaling state");
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
else if (description.type === "answer") {
|
|
196
|
+
if (!["have-local-offer", "have-remote-pranswer"].includes(signalingState)) {
|
|
197
|
+
throw new Error("Cannot handle answer in signaling state");
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* オファーSDPを構築
|
|
204
|
+
*/
|
|
205
|
+
buildOfferSdp(transceivers, sctpTransport) {
|
|
206
|
+
const description = new sdp_1.SessionDescription();
|
|
207
|
+
(0, sdp_1.addSDPHeader)("offer", description);
|
|
208
|
+
// # handle existing transceivers / sctp
|
|
209
|
+
const currentMedia = this.currentLocalDescription?.media ?? [];
|
|
210
|
+
currentMedia.forEach((m, i) => {
|
|
211
|
+
const mid = m.rtp.muxId;
|
|
212
|
+
if (!mid) {
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
if (m.kind === "application") {
|
|
216
|
+
if (!sctpTransport) {
|
|
217
|
+
throw new Error("sctpTransport not found");
|
|
218
|
+
}
|
|
219
|
+
sctpTransport.mLineIndex = i;
|
|
220
|
+
description.media.push(this.createMediaDescriptionForSctp(sctpTransport));
|
|
221
|
+
}
|
|
222
|
+
else {
|
|
223
|
+
const transceiver = transceivers.find((t) => t.mid === mid);
|
|
224
|
+
if (!transceiver) {
|
|
225
|
+
if (m.direction === "inactive") {
|
|
226
|
+
description.media.push(m);
|
|
227
|
+
return;
|
|
228
|
+
}
|
|
229
|
+
throw new Error("transceiver not found");
|
|
230
|
+
}
|
|
231
|
+
transceiver.mLineIndex = i;
|
|
232
|
+
description.media.push(this.createMediaDescriptionForTransceiver(transceiver, transceiver.direction));
|
|
233
|
+
}
|
|
234
|
+
});
|
|
235
|
+
// # handle new transceivers / sctp
|
|
236
|
+
for (const transceiver of transceivers.filter((t) => !description.media.find((m) => m.rtp.muxId === t.mid))) {
|
|
237
|
+
if (transceiver.mid == undefined) {
|
|
238
|
+
transceiver.mid = this.allocateMid(this.midSuffix ? "av" : "");
|
|
239
|
+
}
|
|
240
|
+
const mediaDescription = this.createMediaDescriptionForTransceiver(transceiver, transceiver.direction);
|
|
241
|
+
if (transceiver.mLineIndex === undefined) {
|
|
242
|
+
transceiver.mLineIndex = description.media.length;
|
|
243
|
+
description.media.push(mediaDescription);
|
|
244
|
+
}
|
|
245
|
+
else {
|
|
246
|
+
description.media[transceiver.mLineIndex] = mediaDescription;
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
if (sctpTransport &&
|
|
250
|
+
!description.media.find((m) => m.kind === "application")) {
|
|
251
|
+
sctpTransport.mLineIndex = description.media.length;
|
|
252
|
+
if (sctpTransport.mid == undefined) {
|
|
253
|
+
sctpTransport.mid = this.allocateMid(this.midSuffix ? "dc" : "");
|
|
254
|
+
}
|
|
255
|
+
description.media.push(this.createMediaDescriptionForSctp(sctpTransport));
|
|
256
|
+
}
|
|
257
|
+
if (this.bundlePolicy !== "disable") {
|
|
258
|
+
const mids = description.media
|
|
259
|
+
.map((m) => (m.direction !== "inactive" ? m.rtp.muxId : undefined))
|
|
260
|
+
.filter((v) => v);
|
|
261
|
+
if (mids.length) {
|
|
262
|
+
const bundle = new sdp_1.GroupDescription("BUNDLE", mids);
|
|
263
|
+
description.group.push(bundle);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
return description;
|
|
267
|
+
}
|
|
268
|
+
/**
|
|
269
|
+
* アンサーSDPを構築
|
|
270
|
+
*/
|
|
271
|
+
buildAnswerSdp({ transceivers, sctpTransport, signalingState, }) {
|
|
272
|
+
if (!["have-remote-offer", "have-local-pranswer"].includes(signalingState)) {
|
|
273
|
+
throw new Error("createAnswer failed");
|
|
274
|
+
}
|
|
275
|
+
if (!this._remoteDescription) {
|
|
276
|
+
throw new Error("wrong state");
|
|
277
|
+
}
|
|
278
|
+
const description = new sdp_1.SessionDescription();
|
|
279
|
+
(0, sdp_1.addSDPHeader)("answer", description);
|
|
280
|
+
for (const remoteMedia of this._remoteDescription.media) {
|
|
281
|
+
let dtlsTransport;
|
|
282
|
+
let media;
|
|
283
|
+
if (["audio", "video"].includes(remoteMedia.kind)) {
|
|
284
|
+
const transceiver = transceivers.find((t) => t.mid === remoteMedia.rtp.muxId);
|
|
285
|
+
if (!transceiver) {
|
|
286
|
+
throw new Error(`Transceiver with mid=${remoteMedia.rtp.muxId} not found`);
|
|
287
|
+
}
|
|
288
|
+
media = this.createMediaDescriptionForTransceiver(transceiver, (0, utils_1.andDirection)(transceiver.direction, transceiver.offerDirection));
|
|
289
|
+
dtlsTransport = transceiver.dtlsTransport;
|
|
290
|
+
}
|
|
291
|
+
else if (remoteMedia.kind === "application") {
|
|
292
|
+
if (!sctpTransport || !sctpTransport.mid) {
|
|
293
|
+
throw new Error("sctpTransport not found");
|
|
294
|
+
}
|
|
295
|
+
media = this.createMediaDescriptionForSctp(sctpTransport);
|
|
296
|
+
dtlsTransport = sctpTransport.dtlsTransport;
|
|
297
|
+
}
|
|
298
|
+
else {
|
|
299
|
+
throw new Error("invalid kind");
|
|
300
|
+
}
|
|
301
|
+
// # determine DTLS role, or preserve the currently configured role
|
|
302
|
+
if (media.dtlsParams) {
|
|
303
|
+
if (dtlsTransport.role === "auto") {
|
|
304
|
+
media.dtlsParams.role = "client";
|
|
305
|
+
}
|
|
306
|
+
else {
|
|
307
|
+
media.dtlsParams.role = dtlsTransport.role;
|
|
308
|
+
}
|
|
309
|
+
}
|
|
310
|
+
// Simulcastに関する処理
|
|
311
|
+
if (remoteMedia.simulcastParameters &&
|
|
312
|
+
remoteMedia.simulcastParameters.length > 0) {
|
|
313
|
+
media.simulcastParameters = remoteMedia.simulcastParameters.map((v) => ({
|
|
314
|
+
...v,
|
|
315
|
+
direction: v.direction === "send" ? "recv" : "send",
|
|
316
|
+
}));
|
|
317
|
+
}
|
|
318
|
+
description.media.push(media);
|
|
319
|
+
}
|
|
320
|
+
if (this.bundlePolicy !== "disable") {
|
|
321
|
+
const bundle = new sdp_1.GroupDescription("BUNDLE", []);
|
|
322
|
+
for (const media of description.media) {
|
|
323
|
+
if (media.direction !== "inactive") {
|
|
324
|
+
bundle.items.push(media.rtp.muxId);
|
|
325
|
+
}
|
|
326
|
+
}
|
|
327
|
+
description.group.push(bundle);
|
|
328
|
+
}
|
|
329
|
+
return description;
|
|
330
|
+
}
|
|
331
|
+
setLocalDescription(description) {
|
|
332
|
+
this.currentLocalDescription = description;
|
|
333
|
+
if (description.type === "answer") {
|
|
334
|
+
this.pendingLocalDescription = undefined;
|
|
335
|
+
}
|
|
336
|
+
else {
|
|
337
|
+
this.pendingLocalDescription = description;
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
setRemoteDescription(sessionDescription, signalingState) {
|
|
341
|
+
if (!sessionDescription.sdp ||
|
|
342
|
+
!sessionDescription.type ||
|
|
343
|
+
sessionDescription.type === "rollback" ||
|
|
344
|
+
sessionDescription.type === "pranswer") {
|
|
345
|
+
throw new Error("invalid sessionDescription");
|
|
346
|
+
}
|
|
347
|
+
// # parse and validate description
|
|
348
|
+
const remoteSdp = this.parseSdp({
|
|
349
|
+
sdp: sessionDescription.sdp,
|
|
350
|
+
isLocal: false,
|
|
351
|
+
signalingState,
|
|
352
|
+
type: sessionDescription.type,
|
|
353
|
+
});
|
|
354
|
+
if (remoteSdp.type === "answer") {
|
|
355
|
+
this.currentRemoteDescription = remoteSdp;
|
|
356
|
+
this.pendingRemoteDescription = undefined;
|
|
357
|
+
}
|
|
358
|
+
else {
|
|
359
|
+
this.pendingRemoteDescription = remoteSdp;
|
|
360
|
+
}
|
|
361
|
+
return remoteSdp;
|
|
362
|
+
}
|
|
363
|
+
registerMid(mid) {
|
|
364
|
+
this.seenMid.add(mid);
|
|
365
|
+
}
|
|
366
|
+
get remoteIsBundled() {
|
|
367
|
+
const remoteSdp = this._remoteDescription;
|
|
368
|
+
if (!remoteSdp) {
|
|
369
|
+
return undefined;
|
|
370
|
+
}
|
|
371
|
+
const bundle = remoteSdp.group.find((g) => g.semantic === "BUNDLE" && this.bundlePolicy !== "disable");
|
|
372
|
+
return bundle;
|
|
373
|
+
}
|
|
374
|
+
/**
|
|
375
|
+
* ローカルセッション記述を設定し、トランスポート情報を追加する
|
|
376
|
+
*/
|
|
377
|
+
setLocal(description, transceivers, sctpTransport) {
|
|
378
|
+
description.media
|
|
379
|
+
.filter((m) => ["audio", "video"].includes(m.kind))
|
|
380
|
+
.forEach((m, i) => {
|
|
381
|
+
this.addTransportDescription(m, transceivers[i].dtlsTransport);
|
|
382
|
+
});
|
|
383
|
+
const sctpMedia = description.media.find((m) => m.kind === "application");
|
|
384
|
+
if (sctpTransport && sctpMedia) {
|
|
385
|
+
this.addTransportDescription(sctpMedia, sctpTransport.dtlsTransport);
|
|
386
|
+
}
|
|
387
|
+
this.setLocalDescription(description);
|
|
388
|
+
}
|
|
389
|
+
}
|
|
390
|
+
exports.SDPManager = SDPManager;
|
|
391
|
+
//# sourceMappingURL=sdpManager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sdpManager.js","sourceRoot":"","sources":["../../../src/sdpManager.ts"],"names":[],"mappings":"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","sourcesContent":["import { DISCARD_HOST, DISCARD_PORT } from \"./const\";\nimport type { RTCRtpTransceiver } from \"./media\";\nimport { RTCRtpSimulcastParameters } from \"./media/parameters\";\nimport type { MediaDirection } from \"./media/rtpTransceiver\";\nimport {\n type BundlePolicy,\n GroupDescription,\n MediaDescription,\n SessionDescription,\n SsrcDescription,\n addSDPHeader,\n} from \"./sdp\";\nimport type { RTCDtlsTransport } from \"./transport/dtls\";\nimport { RTCSctpTransport } from \"./transport/sctp\";\nimport { andDirection } from \"./utils\";\n\nexport class SDPManager {\n currentLocalDescription?: SessionDescription;\n currentRemoteDescription?: SessionDescription;\n pendingLocalDescription?: SessionDescription;\n pendingRemoteDescription?: SessionDescription;\n readonly cname: string;\n readonly midSuffix: boolean;\n readonly bundlePolicy?: BundlePolicy;\n\n private seenMid = new Set<string>();\n\n constructor({\n cname,\n midSuffix,\n bundlePolicy,\n }: { cname: string; midSuffix?: boolean; bundlePolicy?: BundlePolicy }) {\n this.cname = cname;\n this.midSuffix = midSuffix ?? false;\n this.bundlePolicy = bundlePolicy;\n }\n\n get localDescription() {\n if (!this._localDescription) {\n return undefined;\n }\n return this._localDescription.toJSON();\n }\n\n get remoteDescription() {\n if (!this._remoteDescription) {\n return undefined;\n }\n return this._remoteDescription.toJSON();\n }\n\n /**@private */\n get _localDescription() {\n return this.pendingLocalDescription || this.currentLocalDescription;\n }\n\n /**@private */\n get _remoteDescription() {\n return this.pendingRemoteDescription || this.currentRemoteDescription;\n }\n\n get inactiveRemoteMedia() {\n return this._remoteDescription?.media?.find?.(\n (m) => m.direction === \"inactive\",\n );\n }\n\n /**\n * MediaDescriptionをトランシーバー用に作成\n */\n createMediaDescriptionForTransceiver(\n transceiver: RTCRtpTransceiver,\n direction: MediaDirection,\n ): MediaDescription {\n const media = new MediaDescription(\n transceiver.kind,\n 9,\n \"UDP/TLS/RTP/SAVPF\",\n transceiver.codecs.map((c) => c.payloadType),\n );\n media.direction = direction;\n media.msid = transceiver.msid;\n media.rtp = {\n codecs: transceiver.codecs,\n headerExtensions: transceiver.headerExtensions,\n muxId: transceiver.mid,\n };\n media.rtcpHost = \"0.0.0.0\";\n media.rtcpPort = 9;\n media.rtcpMux = true;\n media.ssrc = [\n new SsrcDescription({ ssrc: transceiver.sender.ssrc, cname: this.cname }),\n ];\n\n if (transceiver.options.simulcast) {\n media.simulcastParameters = transceiver.options.simulcast.map(\n (o) => new RTCRtpSimulcastParameters(o),\n );\n }\n\n if (media.rtp.codecs.find((c) => c.name.toLowerCase() === \"rtx\")) {\n media.ssrc.push(\n new SsrcDescription({\n ssrc: transceiver.sender.rtxSsrc,\n cname: this.cname,\n }),\n );\n media.ssrcGroup = [\n new GroupDescription(\"FID\", [\n transceiver.sender.ssrc.toString(),\n transceiver.sender.rtxSsrc.toString(),\n ]),\n ];\n }\n\n this.addTransportDescription(media, transceiver.dtlsTransport);\n return media;\n }\n\n /**\n * MediaDescriptionをSCTP用に作成\n */\n createMediaDescriptionForSctp(sctp: RTCSctpTransport): MediaDescription {\n const media = new MediaDescription(\n \"application\",\n DISCARD_PORT,\n \"UDP/DTLS/SCTP\",\n [\"webrtc-datachannel\"],\n );\n media.sctpPort = sctp.port;\n media.rtp.muxId = sctp.mid;\n media.sctpCapabilities = RTCSctpTransport.getCapabilities();\n\n this.addTransportDescription(media, sctp.dtlsTransport);\n return media;\n }\n\n /**\n * トランスポートの情報をMediaDescriptionに追加\n */\n addTransportDescription(\n media: MediaDescription,\n dtlsTransport: RTCDtlsTransport,\n ): void {\n const iceTransport = dtlsTransport.iceTransport;\n\n media.iceCandidates = iceTransport.localCandidates;\n media.iceCandidatesComplete = iceTransport.gatheringState === \"complete\";\n media.iceParams = iceTransport.localParameters;\n media.iceOptions = \"trickle\";\n\n media.host = DISCARD_HOST;\n media.port = DISCARD_PORT;\n\n if (media.direction === \"inactive\") {\n media.port = 0;\n media.msid = undefined;\n }\n\n if (!media.dtlsParams) {\n media.dtlsParams = dtlsTransport.localParameters;\n if (!media.dtlsParams.fingerprints) {\n media.dtlsParams.fingerprints =\n dtlsTransport.localParameters.fingerprints;\n }\n }\n }\n\n /**\n * 一意のMIDを割り当て\n */\n allocateMid(type: \"dc\" | \"av\" | \"\" = \"\"): string {\n let mid = \"\";\n for (let i = 0; ; ) {\n // rfc9143.html#name-security-considerations\n // SHOULD be 3 bytes or fewer to allow them to efficiently fit into the MID RTP header extension\n mid = (i++).toString() + type;\n if (!this.seenMid.has(mid)) break;\n }\n this.seenMid.add(mid);\n return mid;\n }\n\n parseSdp({\n sdp,\n isLocal,\n signalingState,\n type,\n }: {\n sdp: string;\n isLocal: boolean;\n signalingState: string;\n type: \"offer\" | \"answer\";\n }): SessionDescription {\n const description = SessionDescription.parse(sdp);\n this.validateDescription({ description, isLocal, signalingState });\n description.type = type;\n return description;\n }\n\n private validateDescription({\n description,\n isLocal,\n signalingState,\n }: {\n description: SessionDescription;\n isLocal: boolean;\n signalingState: string;\n }) {\n if (isLocal) {\n if (description.type === \"offer\") {\n if (![\"stable\", \"have-local-offer\"].includes(signalingState))\n throw new Error(\"Cannot handle offer in signaling state\");\n } else if (description.type === \"answer\") {\n if (\n ![\"have-remote-offer\", \"have-local-pranswer\"].includes(signalingState)\n ) {\n throw new Error(\"Cannot handle answer in signaling state\");\n }\n }\n } else {\n if (description.type === \"offer\") {\n if (![\"stable\", \"have-remote-offer\"].includes(signalingState)) {\n throw new Error(\"Cannot handle offer in signaling state\");\n }\n } else if (description.type === \"answer\") {\n if (\n ![\"have-local-offer\", \"have-remote-pranswer\"].includes(signalingState)\n ) {\n throw new Error(\"Cannot handle answer in signaling state\");\n }\n }\n }\n }\n\n /**\n * オファーSDPを構築\n */\n buildOfferSdp(\n transceivers: RTCRtpTransceiver[],\n sctpTransport: RTCSctpTransport | undefined,\n ): SessionDescription {\n const description = new SessionDescription();\n addSDPHeader(\"offer\", description);\n\n // # handle existing transceivers / sctp\n const currentMedia = this.currentLocalDescription?.media ?? [];\n\n currentMedia.forEach((m, i) => {\n const mid = m.rtp.muxId;\n if (!mid) {\n return;\n }\n if (m.kind === \"application\") {\n if (!sctpTransport) {\n throw new Error(\"sctpTransport not found\");\n }\n sctpTransport.mLineIndex = i;\n description.media.push(\n this.createMediaDescriptionForSctp(sctpTransport),\n );\n } else {\n const transceiver = transceivers.find((t) => t.mid === mid);\n if (!transceiver) {\n if (m.direction === \"inactive\") {\n description.media.push(m);\n return;\n }\n throw new Error(\"transceiver not found\");\n }\n transceiver.mLineIndex = i;\n description.media.push(\n this.createMediaDescriptionForTransceiver(\n transceiver,\n transceiver.direction,\n ),\n );\n }\n });\n\n // # handle new transceivers / sctp\n for (const transceiver of transceivers.filter(\n (t) => !description.media.find((m) => m.rtp.muxId === t.mid),\n )) {\n if (transceiver.mid == undefined) {\n transceiver.mid = this.allocateMid(this.midSuffix ? \"av\" : \"\");\n }\n const mediaDescription = this.createMediaDescriptionForTransceiver(\n transceiver,\n transceiver.direction,\n );\n if (transceiver.mLineIndex === undefined) {\n transceiver.mLineIndex = description.media.length;\n description.media.push(mediaDescription);\n } else {\n description.media[transceiver.mLineIndex] = mediaDescription;\n }\n }\n\n if (\n sctpTransport &&\n !description.media.find((m) => m.kind === \"application\")\n ) {\n sctpTransport.mLineIndex = description.media.length;\n if (sctpTransport.mid == undefined) {\n sctpTransport.mid = this.allocateMid(this.midSuffix ? \"dc\" : \"\");\n }\n description.media.push(this.createMediaDescriptionForSctp(sctpTransport));\n }\n\n if (this.bundlePolicy !== \"disable\") {\n const mids = description.media\n .map((m) => (m.direction !== \"inactive\" ? m.rtp.muxId : undefined))\n .filter((v) => v) as string[];\n if (mids.length) {\n const bundle = new GroupDescription(\"BUNDLE\", mids);\n description.group.push(bundle);\n }\n }\n\n return description;\n }\n\n /**\n * アンサーSDPを構築\n */\n buildAnswerSdp({\n transceivers,\n sctpTransport,\n signalingState,\n }: {\n transceivers: RTCRtpTransceiver[];\n sctpTransport: RTCSctpTransport | undefined;\n\n signalingState: string;\n }): SessionDescription {\n if (\n ![\"have-remote-offer\", \"have-local-pranswer\"].includes(signalingState)\n ) {\n throw new Error(\"createAnswer failed\");\n }\n if (!this._remoteDescription) {\n throw new Error(\"wrong state\");\n }\n\n const description = new SessionDescription();\n addSDPHeader(\"answer\", description);\n\n for (const remoteMedia of this._remoteDescription.media) {\n let dtlsTransport!: RTCDtlsTransport;\n let media: MediaDescription;\n\n if ([\"audio\", \"video\"].includes(remoteMedia.kind)) {\n const transceiver = transceivers.find(\n (t) => t.mid === remoteMedia.rtp.muxId,\n );\n if (!transceiver) {\n throw new Error(\n `Transceiver with mid=${remoteMedia.rtp.muxId} not found`,\n );\n }\n media = this.createMediaDescriptionForTransceiver(\n transceiver,\n andDirection(transceiver.direction, transceiver.offerDirection),\n );\n dtlsTransport = transceiver.dtlsTransport;\n } else if (remoteMedia.kind === \"application\") {\n if (!sctpTransport || !sctpTransport.mid) {\n throw new Error(\"sctpTransport not found\");\n }\n media = this.createMediaDescriptionForSctp(sctpTransport);\n\n dtlsTransport = sctpTransport.dtlsTransport;\n } else {\n throw new Error(\"invalid kind\");\n }\n\n // # determine DTLS role, or preserve the currently configured role\n if (media.dtlsParams) {\n if (dtlsTransport.role === \"auto\") {\n media.dtlsParams.role = \"client\";\n } else {\n media.dtlsParams.role = dtlsTransport.role;\n }\n }\n\n // Simulcastに関する処理\n if (\n remoteMedia.simulcastParameters &&\n remoteMedia.simulcastParameters.length > 0\n ) {\n media.simulcastParameters = remoteMedia.simulcastParameters.map(\n (v) => ({\n ...v,\n direction: v.direction === \"send\" ? \"recv\" : \"send\",\n }),\n );\n }\n\n description.media.push(media);\n }\n\n if (this.bundlePolicy !== \"disable\") {\n const bundle = new GroupDescription(\"BUNDLE\", []);\n for (const media of description.media) {\n if (media.direction !== \"inactive\") {\n bundle.items.push(media.rtp.muxId!);\n }\n }\n description.group.push(bundle);\n }\n\n return description;\n }\n\n setLocalDescription(description: SessionDescription) {\n this.currentLocalDescription = description;\n if (description.type === \"answer\") {\n this.pendingLocalDescription = undefined;\n } else {\n this.pendingLocalDescription = description;\n }\n }\n\n setRemoteDescription(\n sessionDescription: RTCSessionDescriptionInit,\n signalingState: string,\n ) {\n if (\n !sessionDescription.sdp ||\n !sessionDescription.type ||\n sessionDescription.type === \"rollback\" ||\n sessionDescription.type === \"pranswer\"\n ) {\n throw new Error(\"invalid sessionDescription\");\n }\n\n // # parse and validate description\n const remoteSdp = this.parseSdp({\n sdp: sessionDescription.sdp,\n isLocal: false,\n signalingState,\n type: sessionDescription.type,\n });\n\n if (remoteSdp.type === \"answer\") {\n this.currentRemoteDescription = remoteSdp;\n this.pendingRemoteDescription = undefined;\n } else {\n this.pendingRemoteDescription = remoteSdp;\n }\n\n return remoteSdp;\n }\n\n registerMid(mid: string): void {\n this.seenMid.add(mid);\n }\n\n get remoteIsBundled() {\n const remoteSdp = this._remoteDescription;\n if (!remoteSdp) {\n return undefined;\n }\n const bundle = remoteSdp.group.find(\n (g) => g.semantic === \"BUNDLE\" && this.bundlePolicy !== \"disable\",\n );\n return bundle;\n }\n\n /**\n * ローカルセッション記述を設定し、トランスポート情報を追加する\n */\n setLocal(\n description: SessionDescription,\n transceivers: RTCRtpTransceiver[],\n sctpTransport?: { dtlsTransport: RTCDtlsTransport; mid?: string },\n ) {\n description.media\n .filter((m) => [\"audio\", \"video\"].includes(m.kind))\n .forEach((m, i) => {\n this.addTransportDescription(m, transceivers[i].dtlsTransport);\n });\n const sctpMedia = description.media.find((m) => m.kind === \"application\");\n if (sctpTransport && sctpMedia) {\n this.addTransportDescription(sctpMedia, sctpTransport.dtlsTransport);\n }\n\n this.setLocalDescription(description);\n }\n}\n\nexport interface RTCSessionDescriptionInit {\n sdp?: string;\n type: RTCSdpType;\n}\nexport type RTCSdpType = \"answer\" | \"offer\" | \"pranswer\" | \"rollback\";\n"]}
|
|
@@ -0,0 +1,56 @@
|
|
|
1
|
+
import { Event } from "./imports/common";
|
|
2
|
+
import type { RTCRtpTransceiver, TransceiverManager } from "./media";
|
|
3
|
+
import type { RTCStats } from "./media/stats";
|
|
4
|
+
import type { PeerConfig } from "./peerConnection";
|
|
5
|
+
import type { SctpTransportManager } from "./sctpManager";
|
|
6
|
+
import type { BundlePolicy, MediaDescription, SessionDescription } from "./sdp";
|
|
7
|
+
import { type DtlsKeys, RTCCertificate, RTCDtlsTransport } from "./transport/dtls";
|
|
8
|
+
import { IceCandidate, RTCIceTransport } from "./transport/ice";
|
|
9
|
+
import type { IceGathererState, RTCIceCandidate, RTCIceCandidateInit, RTCIceConnectionState } from "./transport/ice";
|
|
10
|
+
import type { RTCSctpTransport } from "./transport/sctp";
|
|
11
|
+
import type { ConnectionState } from "./types/domain";
|
|
12
|
+
export declare class SecureTransportManager {
|
|
13
|
+
connectionState: ConnectionState;
|
|
14
|
+
iceConnectionState: RTCIceConnectionState;
|
|
15
|
+
iceGatheringState: IceGathererState;
|
|
16
|
+
certificate?: RTCCertificate;
|
|
17
|
+
readonly iceGatheringStateChange: Event<["complete" | "new" | "gathering"]>;
|
|
18
|
+
readonly iceConnectionStateChange: Event<["disconnected" | "closed" | "completed" | "new" | "connected" | "failed" | "checking"]>;
|
|
19
|
+
readonly onIceCandidate: Event<[IceCandidate | undefined]>;
|
|
20
|
+
readonly connectionStateChange: Event<["disconnected" | "closed" | "new" | "connected" | "connecting" | "failed"]>;
|
|
21
|
+
private config;
|
|
22
|
+
private transceiverManager;
|
|
23
|
+
private sctpManager;
|
|
24
|
+
constructor({ config, transceiverManager, sctpManager, }: {
|
|
25
|
+
config: PeerConfig;
|
|
26
|
+
transceiverManager: TransceiverManager;
|
|
27
|
+
sctpManager: SctpTransportManager;
|
|
28
|
+
});
|
|
29
|
+
get dtlsTransports(): RTCDtlsTransport[];
|
|
30
|
+
get iceTransports(): RTCIceTransport[];
|
|
31
|
+
setupCertificate(keys: DtlsKeys): void;
|
|
32
|
+
createTransport(): RTCDtlsTransport;
|
|
33
|
+
handleNewIceCandidate({ candidate, media, remoteIsBundled, transceiver, sctpTransport, bundlePolicy, }: {
|
|
34
|
+
candidate: IceCandidate;
|
|
35
|
+
media?: MediaDescription;
|
|
36
|
+
remoteIsBundled: boolean;
|
|
37
|
+
transceiver?: RTCRtpTransceiver;
|
|
38
|
+
sctpTransport?: RTCSctpTransport;
|
|
39
|
+
bundlePolicy?: BundlePolicy;
|
|
40
|
+
}): IceCandidate;
|
|
41
|
+
addIceCandidate(sdp: SessionDescription, candidateMessage: RTCIceCandidate | RTCIceCandidateInit): Promise<void>;
|
|
42
|
+
private getTransportByMid;
|
|
43
|
+
private getTransportByMLineIndex;
|
|
44
|
+
restartIce(): void;
|
|
45
|
+
setLocalRole({ type, role, }: {
|
|
46
|
+
type: "offer" | "answer";
|
|
47
|
+
role: "auto" | "client" | "server" | undefined;
|
|
48
|
+
}): void;
|
|
49
|
+
private updateIceGatheringState;
|
|
50
|
+
updateIceConnectionState(): void;
|
|
51
|
+
gatherCandidates(remoteIsBundled: boolean): Promise<void>;
|
|
52
|
+
setConnectionState(state: ConnectionState): void;
|
|
53
|
+
getStats(): Promise<RTCStats[]>;
|
|
54
|
+
ensureCerts(): Promise<void>;
|
|
55
|
+
close(): Promise<void>;
|
|
56
|
+
}
|