- From: Erik Lagerway <erik@hookflash.com>
- Date: Thu, 9 Jan 2014 11:59:12 -0800
- To: Peter Thatcher <pthatcher@google.com>
- Cc: "public-orca@w3.org" <public-orca@w3.org>
- Message-ID: <CAPF_GTbxuf70Q+5CCfahN4OO77SxMDLRHe1TZt2XLOJrZKmHgw@mail.gmail.com>
Was hoping you would tackle this. Great design and thanks again for the contribution! /Erik *Erik Lagerway <http://ca.linkedin.com/in/lagerway> | *Hookflash<http://hookflash.com/>* | 1 (855) Hookflash ext. 2 | Twitter <http://twitter.com/elagerway> | WebRTC.is Blog <http://webrtc.is/> * On Thu, Jan 9, 2014 at 10:53 AM, Peter Thatcher <pthatcher@google.com>wrote: > Some of the discussions in the recent W3C WebRTC WG have centered around > the idea of having "dtls doohickeys", which would exposes DTLS-specific > information. I think this would be a good direction for the ORTC API to > take, and I think it would improve upon the ORTC API greatly to go one step > further: to add an "ice doohi > ckey > " as well that exposes ICE-specific information. You can think of this as > splitting the ORTC "RTCConnection" into two > classes: IceTransport and DtlsTransport > , and refining their methods and attributes. > > > With > this split > , the API could be much more flexible. For example, a JS developer could > replace the ICE portion below the DTLS portion seamlessly, allowing for > more control over the ICE behavior. Additionally, mobile and server-based > applications may use something other than DTLS on top of ICE, or may choose > not to encrypt at all (DTLS would remain mandatory for browsers, but not > necessarily for native apps using the same API). > > > I propose an API something like the following. Since "doohi > ckey > " isn't a good name, let's go with the names "IceTransport" and > "DtlsTransport". > > > [Constructor(optional RTCIceTransport)] > interface RTCDtlsTransport { > readonly attribute RTCIceTransport transport; > readonly attribute RTCDtlsTransportState state; > > // Just like RTCDtlsConnectionInfo (has certificate fingerprint) > void start(RTCDtlsParameters remoteParameters); > void stop(); > > // NOTE: We can't have a readonly attribute because apparently > // In WebIDL, "readonly" doesn't make the returned object > // readonly, just the refere > n > ce. > RTCDtlsParameters > getL > ocalParameters(); > RTCDtlsParameters? > get > R > > > > > emoteParameters(); > > attribute EventHandler? onstatechange; > } > > > // Just like current RTCConnectionOptions > [Constructor(RTCIceRole role, RTCIceOptions)] > interface RTCIceTransport { > // Just like current RTCConnectionRole > readonly attribute RTCIceRole role; > // Just like current RTCConnectionState > readonly attribute RTCIceTransportState state; > > void gather(); > // Just like current RTCIceConnectionInfo > void start(optional RTCIceParameters remoteParameters); > // Start/stop if like current connect/close. > void stop(); > > > // NOTE: We can't have a readonly attribute because apparently > // In WebIDL, "readonly" doesn't make the returned object > // readonly, just the referece. > RTCIceParameters > getL > ocalParameters(); > RTCIceParameters > getR > emoteParameters(); > void setRemoteParameters(RTCIceParameters remoteParameters); > > readonly attribute sequence<RTCIceCandidate> localCandidates; > readonly attribute sequence<RTCIceCandidate> remoteCandidates; > > // Just like current RTCIceCandidateInfo > void addRemoteCandidate(RTCIceCandidate candidate); > > attribute EventHandler? onlocalcandidate; // RTCIceCandidateEvent > attribute EventHandler? onstatechange; > } > > > Here is an example of how it could be used: > > // Assume we already have a way to signal. This is an example > // of how to offer ICE and DTLS parameters and ICE candidates and > // get back ICE and DTLS parameters and ICE candidates, and start > // both ICE and DTLS. > > function initiate(signaller) { > var iceOptions = ...; > var ice = new RTCIceTransport(RTCIceRole.controlling, iceOptions); > var dtls = new RTCDtlsTransport(ice); > // ... get tracks and RTP objects from other example > > signaller.sendInitiate({ > "ice": ice. > getL > ocalParameters(), > "dtls": dtls. > getL > ocalParameters(), > // ... include RTP info from other example > }, function(remote) { > ice.setRemoteParameters(remote.ice); > dtls.start(remote.dtls); > // ... start RTP senders and receivers from other example > }); > > ice.oncandidate = function(candidate) { > signaller.sendLocalCandidate(candidate); > } > > signaller.onRemoteCandidate = function(candidate) { > ice.addRemoteCandidate(candidate); > } > > ice.start(); > } > > > // Assume we already have a way to signal and remote info signalled > // to us. This is an example of how answer with ICE and DTLS > // parameters and ICE candidates and start both ICE and DTLS. > > function accept(signaller, remote) { > var iceOptions = ...; > var ice = new RTCIceTransport(iceOptions); > var dtls = new RTCDtlsTransport(ice); > // ... get tracks and RTP objects from other example > ice.oncandidate = function(candidate) { > signaller.sendLocalCandidate(candidate); > } > > signaller.onRemoteCandidate = function(candidate) { > ice.addRemoteCandidate(candidate); > } > > signaller.sendAccept({ > "ice": ice. > getL > ocalParameters(), > "dtls": ice. > getL > ocalParameters() > // ... include RTP info from other example > }); > > ice.start(remote.ice); > dtls.start(remote.dtls); > > // ... start RTP senders and receivers from other example > } > > Please let me know if you think this is a good foundation for ICE and > DTLS. I'm sure we can delve into other topics around ICE and DTLS > (restarts, media forking, rtcp non-mux, idp, etc) once we have a good > foundation. >
Received on Thursday, 9 January 2014 19:59:41 UTC