- From: Martin Thomson <martin.thomson@gmail.com>
- Date: Fri, 10 Jan 2014 08:19:39 -0800
- To: Robin Raymond <robin@hookflash.com>
- Cc: Peter Thatcher <pthatcher@google.com>, public-orca <public-orca@w3.org>
- Message-ID: <CABkgnnWUkQB6fdanV9t-jZ-Ak-dTTfMtcLdygpTACnsB6hJ2Mw@mail.gmail.com>
I'm perfectly happy with the idea that new features can be added. That is
one of the best reasons to do this sort of work.
On Jan 10, 2014 6:40 AM, "Robin Raymond" <robin@hookflash.com> wrote:
>
> I would love to see a split-up of the "beast" RTCConnection object into
> sub-objects and expose greater state for each object and allow more of a
> pipe-line model where objects can be inter-related as appropriate.
>
> One issue / concern I have is regarding shimming. One of the reasons we
> with with the "beast" RTCConnection object was because it was still
> possible to create a 2.0 to 1.0 shim. If we start creating a real pipeline
> / object model, the pipe line wiring of the objects just won't be possible
> to shim.
>
> After some thought on this subject, my answer is "When shimming 2.0 on 1.0
> API, a basic pipeline shim will work but any fancy pipelining / rewiring of
> the object pipelines just can't work on the shim. If attempted by a
> developer using a 2.0 API shim on a 1.0 browser, an "unsupported" exception
> of some kind will be fired."
>
> I feel like creating a perfect 2.0 on 1.0 shim would be challenging at
> best because I can see features being added that 1.0 simply won't be able
> to support, but this change would definitely introduce some concepts that
> cannot be shimmed on 1.0.
>
> Is it acceptable to everyone that fancy features attempted over a 2.0 on
> 1.0 shim are just "unsupported" and thus you have limited subset of the 2.0
> capabilities on a 1.0 only browser?
>
> (FYI - I'm talking about a developer attempting to use the 2.0 ORTC API
> written as a JS shim on a browser which only supports a 1.0 PeerConnection
> API)
>
> -Robin
>
>
> Peter Thatcher <pthatcher@google.com>
> 9 January, 2014 1:53 PM
> 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.
>
>
Attachments
- image/jpeg attachment: compose-unknown-contact.jpg
Received on Friday, 10 January 2014 16:20:41 UTC