Peerjs call.on("close") не работает. Кто-нибудь может мне помочь?

Я разрабатываю проект django с использованием peerjs для осуществления видеозвонка и голосового звонка. В моем проекте все работает хорошо, но если другой пользователь отклоняет мой звонок, call.on("close",...) не срабатывает. Поэтому я не могу закрыть вызывающий модал с экрана. document.getElementById("endCallButton").click(); и endCall(); не работают. Может ли кто-нибудь помочь мне исправить это?

const peer = new Peer();
var currentCall;
peer.on("open", function (id) {
  $.ajax({
      type: "GET",
      url: "/createPeerIdToUser",                           
      data: {
        'peerId': id,
      },
      
    });

});

async function callUser() {
    // get the id entered by the user
    const peerId=otherUserPeerId;
      
    const stream = await navigator.mediaDevices.getUserMedia({
      video: true,
      audio: true,
    });
 
    document.getElementById("chatPart").style.display = "none";
    document.getElementById("videoCallPart").style.display = "block";
    document.getElementById("video2").srcObject = stream;
    document.getElementById("video2").play();
  // make the call
    const call = peer.call(peerId, stream);
    call.on("stream", (stream) => {
      document.getElementById("video1").srcObject = stream;
      document.getElementById("video1").play();
      document.getElementById("endCallButton").click();
     
    });
    call.on("data", (stream) => {
      document.querySelector("#video1").srcObject = stream;
    });
    call.on("error", (err) => {
      console.log(err);
    });

// эта часть не срабатывает

    call.on("close", () => { 
         document.getElementById("endCallButton").click();
         endCall();
      
    });        
    currentCall = call;
  }
  peer.on("call", (call) => {
      let nameOfuser=""
      let isSuccess="false";
      $.ajax({
        type: "GET",
        url: "/getOtherUserByPeerId",       
        dataType: 'JSON',                       
        data: {
          'peer': call.peer,
        },
        success: function(data) {
            document.getElementById("comingRequestButton").click();
            document.getElementById("comingRequestName").textContent=data.username;
            nameOfuser=data.username;
            isSuccess="true";

        },
        error: function(err) {
            console.log(err);

        },
        
      });

      document.getElementById("comingRequestYellow").addEventListener("click", function() {
        $('.modal').modal('hide');        
      navigator.mediaDevices
        .getUserMedia({ video: true, audio: true })
        .then((stream) => {
         
          document.getElementById("video2").srcObject = stream;
          document.getElementById("video2").play();
          call.answer(stream);  
          currentCall = call;
  
            document.getElementById("chatPart").style.display = "none";
            document.getElementById("videoCallPart").style.display = "block";
          
          call.on("stream", (remoteStream) => {
            // when we receive the remote stream, play it
            document.getElementById("video1").srcObject = remoteStream;
            document.getElementById("video1").play();

          });
        })
        .catch((err) => {
          console.log("Failed to get local stream:", err);
        });
      });

    document.getElementById("comingRequestRed").addEventListener("click", function() {
        call.close();
       
    });
    
    
  });

function endCall() {
    // Go back to the menu
    if (!currentCall) return;
 
    try {
      currentCall.close();
    } catch {}
    currentCall = undefined;
  }

Да, я думаю, что ошибка события on("close") все еще открыта в основном репозитории.

https://github.com/peers/peerjs/issues/636

Но для достижения этого события вы можете использовать событие сокета. как это

Клиент 1

document.getElementById("endCallButton").addEventListener("click", () => {
    endCall();
    socket.emit('disconnect-peer', socketIdParner);
    // or other code here 
});

Клиент 2

socket.on("disconnect-peer", (userId)=>{
    document.getElementById("endCallButton").click();
    endCall();
    // or other code here 
});

Server

socket.on("disconnect-peer", (socketId)=>{
  socket.to(socketId).emit("disconnect-peer"); 
});

ИЛИ

Client

socket.on("disconnect-peer", (userId)=>{
    document.getElementById("endCallButton").click();
    endCall();
    // or other code here 
});

Server

socket.on("disconnect", (someData)=>{
  socket.broadcast.emit("disconnect-peer", userId); 
});

Надеюсь, это немного поможет.

Вернуться на верх