[webrtc-pc] Racy setParameters()/getParameters() behavior (#2315)

jan-ivar has just created a new issue for https://github.com/w3c/webrtc-pc:

== Racy setParameters()/getParameters() behavior ==
### Problem A
The following may race with a remote simulcast offer:
```js
const params = pc.getParameters();
await wait(0);
await pc.setParameters(params); // Intermittent InvalidStateError
```
...because SRD clears [[[LastReturnedParameters]]](https://w3c.github.io/webrtc-pc/#dfn-lastreturnedparameters) if it gets an initial simulcast offer.

### Problem B
A related issue: *getParameters()* is not a true/idempotent getter, because it modifies state, which may cause surprising action at a distance:
```js
function foo(pc) {
  if (bar()) {
    console.log(JSON.stringify(pc.getParameters());
  }
}

const params = pc.getParameters();
foo();
await pc.setParameters(params); // InvalidStateError if bar() == true
```

### Proposed solutions

 1. Queue a task in *getParameters* to clear [[LastReturnedParameters]].
 2. Only increment [transactionId](https://w3c.github.io/webrtc-pc/#dom-rtcrtpsendparameters-transactionid) when [[LastReturnedParameters]] is `null`.

This makes **B** always work, and **A** always fail with `InvalidStateError` (not  intermittently).

Please view or discuss this issue at https://github.com/w3c/webrtc-pc/issues/2315 using your GitHub account

Received on Tuesday, 1 October 2019 00:25:04 UTC