- From: Eric Rescorla <ekr@rtfm.com>
- Date: Mon, 19 May 2014 05:31:24 -0700
- To: "public-webrtc@w3.org" <public-webrtc@w3.org>
- Message-ID: <CABcZeBMTsb9c3Pqsb1X5zimchVbfUfGVAmfAVepEc__o8ZUatA@mail.gmail.com>
I went over the draft on the plane. Comments below.
OVERALL
Is there any way to have the descriptions of the PC methods
in logical order rather than in alphabet order? This is
really confusing. It would also be really nice if they
all had their own section numbers rather than a gigantic
4.3.2.3.
MAJOR
S 4.3.1.
I still believe that it's a mistake to be executing some
operations synchronously and some asynchronously. It makes
it very hard to determine what happens in event of a race
and in case of reentrancy. I'd like to discuss this at the
meeting.
stream sets need to be ordered because JSEP depends on that
for assignment to m-lines. This is also an issue in the
getLocalSteams, getRemoteStreams description.
I'm not clear on what happens when you change iceTransports
from "relayed" to "all".
4.3.2.3.
Yes, addIceCandidate needs to be queued. Otherwise it might
be applied to m-lines which don't yet exist because setRemoteDescription
has never been called and the candidates will be lost.
If connection's RTCPeerConnection signalingState is stable, then
fire a negotiationneeded event at connection.
This is already lame prior to CreateOffer() being called but it's
going to be even lamer when we add addTrack() and people call
it twice and then the onnegotiationneeded handler repeatedly
tries to CreateOffer and send to to the other side. We should
suppress this prior to a call being created.
The description of close doesn't tell us anything about how
to handle queued operations. Neither does the description of
queue processing in S 4.3.1. I'm assuming that if we have
outstanding operations and then call .close(), this causes
all the error callbacks to fire? But where does it say this?
OK... I just found this *in the description* of createAnswer().
Seriously? Also, if you look at the description of setLocal(),
it contemplates doing everything and then ignoring the
results, but this has side effects.
addStream and removeStream only fire negotiationneeded if
the signalingState is stable. But this means that you are
not going to get told that negotiation is needed even in
cases where you would need to initiate. For instance,
consider what happens if you call createOffer()/setLocalDescription()
and then removeStream() while waiting for the other side's
description and setRemoteDescription(). Why aren't you
told that negotiation is needed. This is particularly bad
because setRemoteDescription is run asynchronously whereas
removeStream is not. Consider the following code:
pc.addStream(s);
pc.createOffer(function(x) {
pc.setLocalDescription(x);
}
...
pc.setRemoteDescription(remote);
pc.removeStream();
Note that this does not call onnegotiationneeded even though
logically the pc is in its way to stable state because
setRemoteDescription is processed asynchronously as defined
in 4.3.1.
setLocalDescription:
If a local description contains a different set of ICE credentials,
then the ICE Agent must trigger an ICE restart. When ICE restarts,
the gathering state will be changed back to "gathering", if it was
not already gathering. If the IceConnectionState was "completed", it
will be changed back to "connected".
You actually need to check the ICE credentials to see if they
match those in a createOffer/Answer. Otherwise, this is an error.
updateIce:
The way updateIce() is written it seems like you must supply all
your STUN servers even if iceTransports is "relayed" so that
the candidates are available when you change it. Also, should
updateIce.iceTransports = all cause onicecandidate? What if
you are already apparently done gathering. This seems like
it needs some work.
There appear to be a contradiction between this section, which
says:
If a new list of servers replaces the ICE Agent's existing ICE
servers list, no action will taken until the RTCPeerConnection's ice
gathering state transitions to gathering. If a script wants this to
happen immediately, it should do an ICE restart.
and S 4.4.2 which says:
The ICE engine has completed gathering. Events such as adding a new
interface or a new TURN server will cause the state to go back to
gathering.
4.6.1.
Errors are indicated in two ways: exceptions and objects passed to
error callbacks. Exceptions are thrown to indicate invalid state and
other programming errors. For example when a method is called when
the RTCPeerConnection is in an invalid state, or a state in which
that particular method is not allowed to be executed. In all other
cases, an error object must be provided to the error callback.
This is violated in, for instance S 4.3.2.3:
If the candidate parameter is malformed, throw a SyntaxError exception
and abort these steps.
5.1.2.
createDataChannel should be queued.
MINOR
4.2.4.2.
When the value of this dictionary member is false, and the
localDescription attribute has valid ICE credentials, the generated
description will have the same ICE credentials as the current value
from the localDescription attribute.
How could it not have valid ice credentials and be non-nukk?
In some cases, an RTCPeerConnection may wish to receive audio but
not send any audio. The RTCPeerConnection needs to know if it should
signal to the remote side whether it wishes to receive audio. This
option allows an application to indicate its preferences for the
number of audio streams to receive when creating an offer.
This needs text about how bool is processed. Or did we decide not
to allow that?
voiceActivityDetection of type boolean, defaulting to true
We should move this to a doohickey
4.3.1.
1. Validate the RTCConfiguration argument by running the steps
defined by the updateIce() method.
It needs to be clear that if those steps abort, so do these.
execute the first object queued asynchronously and repeat this step
on completion.
rewrite as "asynchronously execute"
This whole description of notifications is baffling and repetitive.
Please rewrite so that you have one section describing how to do
notifications rather than repeating all this stuff about
having connection be the RTCPeerConnection and checking for closed.
In addition, this section doesn't seem to describe how to
notify for other ICE state changes.
User agents negotiate the codec resolution, bitrate, and other media
parameters. It is recommended that user agents initially negotiate
for the maximum resolution of a video stream. For streams that are
then rendered (using a video element), it is recommended that user
agents renegotiate for a resolution that matches the rendered
display size.
This doesn't actually seem like that useful advice, given that
both sides are quite likely to know what sort of element they are
going to stuff the object in (and indeed it's quite likely that
the answerer stuffs it in a <video> in onaddstream). Do any
existing UAs renegotiate in this case.
The creation of new incoming MediaStreams may be triggered either by
SDP negotiation or by the receipt of media on a given flow.
Does unified plan presently allow this? It appears to contradict
the description of "onaddstream" in 4.3.2.2.
"This will be fired only as a result of setRemoteDescription."
When a user agent has negotiated media for a component that belongs
to a media stream that is already represented by an existing
MediaStream object, the user agent must associate the component with
that MediaStream object.
What does this mean?
To prevent network sniffing from allowing a fourth party to
establish a connection to a peer using the information sent
out-of-band to the other peer and thus spoofing the client, the
configuration information should always be transmitted using an
encrypted connection.
I have no idea what this means, but git blame says it was in
the initial commit, so it's probably OBE. Given the current
COMSEC mechanisms in place, there are two categories of relevant
information here:
- The ICE credentials, needed to establish tansport-level
connectivity
- The DTLfingerprints, needed to establish a DTLassociation.
The former need confidentiality. The latter only integrity.
It is of course good advice that a secure connection be
used, but I suggest merely describing the implications of
not using a secure connection in the security considerations.
4.3.2.2.
Several of these event handlers look like they might usefully
have a description of when they are called. E.g., onicecandidate
and onnegotatiationneeded.
Why isn't onremovestream called when I setLocal removing a
stream?
onsignalingstatechange says " It is called any time the readyState
changes". This should be "signalingState"
Currently addStream silently aborts when you call it with a
stream that is already in the local streams set. This is bad.
An exception should be thrown [TODOEX]
Add stream to connection's local streams set.
This needs to say "append"
Both CreateOffer and CreateAnswer say:
Calling this method is needed to get the ICE user name fragment and
password.
Clearly that cannot be true.
setLocalDescription:
The description here doesn't seem to conform well with the queueing
logic. I.e., when do we throw InvalidStateError wrt being closed?
Presumably pre-queue, but then the next bullet is about IceRestart
and that must clearly be async.
4. If the local description was set, connection's ice gathering state
is new, and the local description contains media, then set
connection's ice gathering state to gathering.
5. If the local description was set with content that caused an ICE
restart, then set connection's ice gathering state to gathering.
What happens if you do a setLocal() that causes the need for more
candidates after gathering has completed
e.g., addstream(), createOffer()/setLocal(), addStream(),
createOffer()/setLocal()
updateIce:
updateIce isn't queued? Even though you can do ICE restart in
setLocal/setRemote
5.2.3.
Something is wrong here since send() is described in this section.
So wait, if someone has called .close(), they can still call .send()
wwhich stuffs data in the buffer but doesn't generate an error
per step 4? Huh?
6.1.1.
What happens if I try to create a DTMFsender on a video track?
6.2.1.
Why would canInsertDTMF be false?
I'm confused about what happens if I call
insertDTMF twice with different gaps. It just overwrites
the old gap even for queued tones? Gah.
7.2.1.
This text doesn't work:
When the getStats() method is invoked, the user agent must queue a
task to run the following steps:
1. If the RTCPeerConnection object's RTCPeerConnection
signalingState is closed, throw an InvalidStateError exception.
2. Return, but continue the following steps in the background.
If you've queued a task, that task shouldn't be throwing exceptons.
4. If selectorArg is an invalid selector, the user agent must queue
a task to invoke the failure callback (the method's third
argument).
...
6. When the relevant stats have been gathered, queue a task to
invoke the success callback (the method's second argument) with a
new RTCStatsReport object, representing the gathered stats, as its
argument.
We're already in a bg task here....
8.4.1.
"idvalidationperror" -> "idpvalidationerror"
Received on Monday, 19 May 2014 12:32:33 UTC