- From: Martin Thomson <martin.thomson@gmail.com>
- Date: Fri, 31 Jan 2014 17:04:07 -0800
- To: Peter Thatcher <pthatcher@google.com>
- Cc: public-orca <public-orca@w3.org>
- Message-ID: <CABkgnnXqnQB9-OZSg15fk8CMiMp+Dx2Pj2W_cewM+5n51M+JPg@mail.gmail.com>
2 please. Note that this does create the potential for confusion if the
same ip+ port is added to both transport objects. Explicit code would be
needed to prevent that.
On Jan 31, 2014 4:12 PM, "Peter Thatcher" <pthatcher@google.com> wrote:
> A use case that isn't (well?) supported by the WebRTC 1.0 spec is what
> we sometimes call "parallel forking", which basically means that a
> local endpoint sends signalling information to many remote endpoints
> and then can receive back signalling and then send and receive media
> to/from *more than one endpoint*. A solution was previously
> discussed in the WebRTC WG as "cloning", but seemed too complicated
> for the 1.0 API to be practical.
>
> An example of how this would be useful is setting up data channels
> with multiple peers without having to allocate separate ICE parameters
> and candidates for each peer. You could, with parallel forking, send
> up one set of local ICE parameters to a server which could be used by
> all remote peers to connect to the local peer.
>
> The good news is that the ORTC components we already have
> (IceTransport, DtlsTransport, RtpSender, RtpReceiver, SctpTransport)
> give a JS app just about everything it needs for this use case. A JS
> app can create multiples of DtlsTransport, RtpSender, RtpReceiver, and
> SctpTransport for each endpoint it wants to talk to.
>
> The bad news is that we're missing one piece: the ability to have
> several IceTransports that share the same ICE local parameters and
> local candidates. If we could just do that, then we would have
> everything we need to support parallel forking. I think there are
> basically two ways we could allow for this in the ORTC API:
>
> 1. Add some kind of IceTransport.fork() method which gives you a copy
> of the IceTransport object which can then have different remote
> parameters and remote candidates, but the same local parameters and
> local candidates. Something like this:
>
> var iceOptions = ...;
> var iceParent = new RTCIceTransport(RTCIceRole.controlling, iceOptions);
> sendInitiate(iceParent.getLocalParameters(), function(response) {
> // We may get N responses
> var ice = iceParent.fork();
> var ice.setRemoteParameters(repsonse.iceParameters);
> ice.start();
> // ... setup DTLS, RTP, SCTP, etc.
> });
> iceParent.onlocalcandidate = sendLocalCandidate;
> iceParent.start();
>
>
> While I like the apparent simplicity of this approach, it does run
> into a lot of weird questions, like: what if I change something on the
> parent; does that effect the children? Is it best to keep a parent
> laying around that's only used for forking? What if I need to change
> the ICE role? Questions like that would probably plague us for a long
> time.
>
>
>
> 2. Add a new object which is explicitly shared between different
> IceTransports. It acts as the "ice parent" in the previous example,
> and if you want more than one IceTransport with the same local
> parameters and candidates, you make one of these new parent objects
> and then explicitly share it between IceTransports. Something like
> this:
>
> var iceOptions = ...;
> var iceListener = new RTCIceListener(iceOptions);
> sendInitiate(iceListener.getLocalParameters(), function(response) {
> // We may get N responses
> var ice = new RTCIceTransport(RTCIceRole.controlling, iceListener);
> var ice.setRemoteParameters(repsonse.iceParameters);
> ice.start();
> // ... setup DTLS, RTP, SCTP, etc.
> });
>
> iceListener.oncandidate = sendLocalCandidate;
> iceListener.start();
>
>
> This has the advantage that it's much more clear and explicit is going
> on and there aren't all those tricky edge cases about a parent/child
> relationship between IceTransports. I think we'll be happier
> long-term with something like this. This is just like the purpose and
> design of the RTCSocket object that was in ORTC previously, but fits
> in with our new IceTransport model.
>
>
> So, I propose we add something like the following object, which will
> give us the last remaining piece to support parallel forking:
>
>
> [Constructor(optional RTCIceListenerOptions options)]
> interface RTCIceListener {
> readonly attribute RTCIceListenerOptions options;
>
> RTCIceParameters getLocalParameters();
> readonly attribute sequence<RTCIceCandidate> localCandidates;
>
> void start();
> void stop();
>
> attribute EventHandler? onlocalcandidate;
> attribute EventHandler? ongatherfailure;
> }
>
> I much the prefer the second solution, and I think it would be a great
> way to support parallel forking and is an example of something that
> the ORTC model can easily support that was too complex to be practical
> in the 1.0 API.
>
>
Received on Saturday, 1 February 2014 01:04:35 UTC