Ответ 1
PeerConnection не начнет собирать кандидатов до вызова setLocalDescription(); информация, предоставленная setLocalDescription, сообщает PeerConnection, сколько кандидатов нужно собрать. (Это поведение для setLocalDescription указывается в его определении в http://tools.ietf.org/html/draft-ietf-rtcweb-jsep-03#section-4.2.4)
Вот как выглядит полный поток для установления соединения между двумя PeerConnections в том же окне браузера (добавление MediaStream исключено для фокусировки на сигнале):
var pc1, pc2, offer, answer;
pc1 = new webkitRTCPeerConnection(options);
pc2 = new webkitRTCPeerConnection(options);
pc1.onicecandidate = function(candidate) {
pc2.addIceCandidate(candidate);
};
pc2.onicecandidate = function(candidate) {
pc1.addIceCandidate(candidate);
};
pc1.createOffer(onOfferCreated, onError);
function onError(err) {
window.alert(err.message);
}
function onOfferCreated(description) {
offer = description;
pc1.setLocalDescription(offer, onPc1LocalDescriptionSet, onError);
}
function onPc1LocalDescriptionSet() {
// after this function returns, pc1 will start firing icecandidate events
pc2.setRemoteDescription(offer, onPc2RemoteDescriptionSet, onError);
}
function onPc2RemoteDescriptionSet() {
pc2.createAnswer(onAnswerCreated, onError);
}
function onAnswerCreated(description) {
answer = description;
pc2.setLocalDescription(answer, onPc2LocalDescriptionSet, onError);
}
function onPc2LocalDescriptionSet() {
// after this function returns, you'll start getting icecandidate events on pc2
pc1.setRemoteDescription(answer, onPc1RemoteDescriptionSet, onError);
}
function onPc1RemoteDescriptionSet() {
window.alert('Yay, we finished signaling offers and answers');
}
Так как вы включили mozPeerConnection в свой вопрос, я буду замечать, что Firefox в настоящее время не генерирует "капельных кандидатов". Это означает, что он будет включать в себя адреса своих кандидатов как "c" в предложении/ответе, а callback onicecandidate никогда не будет вызван.
Недостатком этого подхода является то, что Firefox должен дождаться, пока все его кандидаты будут собраны, прежде чем создавать свое предложение/ответ (процесс, который может включать в себя обращение к серверам STUN и TURN и ожидание ответов или на время ожидания запросов).