- From: Jan-Ivar Bruaroey via GitHub <sysbot+gh@w3.org>
- Date: Sun, 07 Apr 2019 21:31:45 +0000
- To: public-webrtc-logs@w3.org
jan-ivar has just created a new issue for https://github.com/w3c/webrtc-pc:
== Better API for rollback that's glare-proof ==
In [my latest blog](https://blog.mozilla.org/webrtc/perfect-negotiation-in-webrtc/) on *"Perfect negotiation in WebRTC"*, I cover using `negotiationneeded` and `"rollback"` in combination to abstract away negotiation. I describe implementing something I call "the polite peer" (a peer that rolls back in the face of an incoming offer):
```js
io.onmessage = async ({data: {description, candidate}}) => {
if (description) {
if (description.type == "offer" && pc.signalingState == "have-local-offer") {
if (!polite) return;
await Promise.all([
pc.setLocalDescription({type: "rollback"}),
pc.setRemoteDescription(description)
]);
} else {
await pc.setRemoteDescription(description);
}
if (description.type == "offer") {
await pc.setLocalDescription(await pc.createAnswer());
send({description: pc.localDescription});
}
} else if (candidate) await pc.addIceCandidate(candidate);
}
```
In the blog I cover in depth why the `Promise.all` is needed, but in short, it's there to cover a timing-window where we'd otherwise be vulnerable to *addIceCandidate* getting queued ahead of *setRemoteDescription* and failing.
To make this less of a footgun I think we should come up with a safer rollback API that does the rollback and sets the new description on the same run of the JS event loop. E.g.
```js
pc.rollback();
await pc.setRemoteDescription(description);
```
or perhaps
```js
await pc.setRemoteDescription(description, {rollback: true});
```
Open to other ideas.
Please view or discuss this issue at https://github.com/w3c/webrtc-pc/issues/2166 using your GitHub account
Received on Sunday, 7 April 2019 21:31:46 UTC