Joiner 管理 Initiator 的 offer

图5-12 显示了 Joiner 在收到发起者的 SDP offer 后采取的操作。

实际上,如下面的 JavaScript 代码片段所示,当 offer 到达 Joiner 时,首先运行 checkAndStart() 函数:

  1. // Receive message from the other peer via the signalling server
  2. socket.on('message', function (message) {
  3. console.log('Received message:', message);
  4. if (message === 'got user media') {
  5. ...
  6. } else if (message.type === 'offer') {
  7. if (!isInitiator && !isStarted) {
  8. checkAndStart();
  9. }
  10. pc.setRemoteDescription(new RTCSessionDescription(message));
  11. doAnswer();
  12. } else if (message.type === 'answer' && isStarted) {
  13. ...

图5-12

图5-12 参加 Initiator 的 offer 后,Joiner 的操作

当由 Joiner 执行时,此函数将创建 Joiner 的 PeerConnection 对象并设置 isStarted 标志:

  1. function checkAndStart() {
  2. if (!isStarted && typeof localStream != 'undefined' && isChannelReady) {
  3. createPeerConnection();
  4. isStarted = true;
  5. if (isInitiator) {
  6. ...
  7. }
  8. }
  9. }

如第121页 的 “ Joiner 的 answer ” 中所述,一旦使用 checkAndStart() 函数完成,Joiner 仍然必须配置其本地 PeerConnection 并正确构建 SDP answer 以发送回发起方。 在下文中,我们将首先简要讨论双方所需的 ICE 候选人交换程序。