Javascript 使用Firebase的简单对等WebRTC应用程序错误:处理ICE候选者时出错

Javascript 使用Firebase的简单对等WebRTC应用程序错误:处理ICE候选者时出错,javascript,web,webrtc,Javascript,Web,Webrtc,我使用Firebase作为本地计算机上google chrome两个选项卡之间的信号中介。我正在使用最新的基于简单对等github repo的构建:simplepeer.min.js。完全错误是 Uncaught DOMException: Error processing ICE candidate 我的网络代码如下: const roomId = extractQueryString('roomId'); firebase.auth().onAuthStateChanged((user)

我使用Firebase作为本地计算机上google chrome两个选项卡之间的信号中介。我正在使用最新的基于简单对等github repo的构建:simplepeer.min.js。完全错误是

Uncaught DOMException: Error processing ICE candidate
我的网络代码如下:

const roomId = extractQueryString('roomId');
firebase.auth().onAuthStateChanged((user) => {
    if (user && roomId) {
    // User is signed in.
    const isAnonymous = user.isAnonymous;
    const uid = user.uid;
    const sessionId = Math.floor(Math.random()*1000000000);
    const testLocation = firebase.database().ref();
    console.log(uid);

    //doesRoomExist(roomId); 

    const p2pConnection = new SimplePeer({
        initiator: document.location.hash === '#initiator'
    });

    p2pConnection.on( 'signal', (signal) => {
        console.log(signal);
        testLocation.child(roomId).child(uid).set({
            sender: sessionId,
            signal: signal
        });
    });

    testLocation.child(roomId).on('child_added', (snapshot) =>{
        if( snapshot.val().sender !== sessionId ) {
            p2pConnection.signal( snapshot.val().signal );
        }
    });

    /*
     * We'll send a message to the other side as soon as
     * the connection is established
     */
    p2pConnection.on( 'connect', () => {
        console.log( 'webrtc datachannel connected' );
        p2pConnection.send( 'Hello from user ' + userName );
    });

    p2pConnection.on( 'close', () => {
        console.log( 'webrtc datachannel closed' );
    });

    p2pConnection.on( 'data', (data) => {
        console.log( 'received data <b>' + data + '</b>' );
    });

    //db.ref().child('ergh').set({ID:uid});
} else {
    // Do stuff if they inputted an invalid room or fb is down
}
});
执行

如果我遗漏了什么,这是我的Index.html:

<!DOCTYPE html>
<html>
    <script src="https://www.gstatic.com/firebasejs/4.6.2/firebase.js">
</script>
    <script>
        // Initialize Firebase
        var config = {
            apiKey: "AIzaSyAUEtS1zEakv0a1TIlsTobQwwTyvlUzQGc",
            authDomain: "simple-whiteboard.firebaseapp.com",
            databaseURL: "https://simple-whiteboard.firebaseio.com",
            projectId: "simple-whiteboard",
            storageBucket: "simple-whiteboard.appspot.com",
            messagingSenderId: "272918396058"
        };
        firebase.initializeApp(config);

    firebase.auth().signInAnonymously().catch(function(error) {
        // Handle Errors here.
        var errorCode = error.code;
        var errorMessage = error.message;
    });

</script>
<script src="js/simplepeer.min.js"></script>
<script src="js/draw.js"></script>
<script src="js/RTC-networking.js"></script>

<body onload="init()">
        <canvas id="myCanvas" width="400" height="400"
            style="position:absolute;top:10%;left:10%;border:2px solid;">
        </canvas>
</body>

//初始化Firebase
变量配置={
apiKey:“AIzaSyAUEtS1zEakv0a1TIlsTobQwwTyvlUzQGc”,
authDomain:“simple whiteboard.firebaseapp.com”,
数据库URL:“https://simple-whiteboard.firebaseio.com",
projectId:“简单白板”,
storageBucket:“simple whiteboard.appspot.com”,
messagingSenderId:“272918396058”
};
firebase.initializeApp(配置);
firebase.auth().signinanoymously().catch(函数(错误){
//在这里处理错误。
var errorCode=error.code;
var errorMessage=error.message;
});

任何帮助都将不胜感激。谢谢。

您的代码在这里:

 p2pConnection.on( 'signal', (signal) => {
    console.log(signal);
    testLocation.child(roomId).child(uid).set({
        sender: sessionId,
        signal: signal
    });
});
每次收到“报价”或“候选人”(不同类型的信号)时,将覆盖“发件人”

正如您的错误所说的“错误处理ICE候选者”,这意味着您使用了
trickle:true
选项

你必须考虑这些事实:
没有涓涓细流-
主机和客户端分别收到一个信号“提供”和“应答”。
使用涓流-
您将获得如上所述的信号,以及每个信号中更多的“候选”信号

因此,不要覆盖你得到的信号,你应该保留一个对最初的“提议”和“回答”的引用,以及每一方所有候选人的列表。并尝试向他们中的每一位发出“信号”(主机将尝试向所有客户的候选人发出信号,反之亦然)

 p2pConnection.on( 'signal', (signal) => {
    console.log(signal);
    testLocation.child(roomId).child(uid).set({
        sender: sessionId,
        signal: signal
    });
});