- From: Jan-Ivar Bruaroey <jib@mozilla.com>
- Date: Wed, 13 May 2015 21:46:36 -0400
- To: Martin Thomson <martin.thomson@gmail.com>, Harald Alvestrand <harald@alvestrand.no>
- CC: "public-webrtc@w3.org" <public-webrtc@w3.org>
- Message-ID: <5553FE7C.6000401@mozilla.com>
On 5/13/15 3:36 PM, Martin Thomson wrote: > On 13 May 2015 at 11:38, Harald Alvestrand <harald@alvestrand.no> wrote: >>> Think about the following: >>> >>> pc.setRemoteDescription(offer) >>> pc.addTrack(X); >>> pc.createAnswer().then(answer => { ... }); >>> pc.addTrack(Y); >>> >>> If code like this exists, then I think we need to have it fail >>> (because the state of the PC at the time that createAnswer is called >>> is not correct). Then we get the sort of cleanliness that you are >>> looking for. >>> >>> (We only get in this sticky situation because we carry state between >>> operations implicitly.) >> I'm not sure what you're saying here - to me it seems that >> createAnswer() is clearly called between pc.addtrack(X) and >> pc.addTrack(Y), but we don't have a description of when the .then task >> of createAnswer() (and thus the ... part) is called. >> >> Care to clarify? > This code is currently safe, and I know that people do exactly this. > But it only works because createAnswer is enqueued behind > setRemoteDescription: createAnswer doesn't actually get executed until > setRemoteDescription completes. Right. 1. setRemoteDescription is called 2. Track X is added 3. createAnswer is chained (not called) 4. Track Y is added 5. setRemoteDescription completes 6. createAnswer is called 7. createAnswer completes Which explains why Track Y gets included in this corner-case. We can: 1. Outlaw it 2. Complicate chain (put createAnswer(X and whatelse) on it) 3. Leave it 4. Always chain (make non-corner cases take Track Y as well) Tightening up the processing models of createOffer and createAnswer to not race with JS is a separate issue. .: Jan-Ivar :.
Received on Thursday, 14 May 2015 01:47:06 UTC