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);
});
Надеюсь, это немного поможет.