my problem is in order of execution: the connectToNewUser function, which is called inside wait() function, get executed before the myPeer.on('call'), which is also inside it. I put my code into async\await function, but no result, somehow "user-connected" executes first. If I add timeout to connectToNewUser
socket.on('user-connected', userId => {
setTimeout(connectToNewUser,1000,userId,stream)
})
, it start to work as I need, but I want to solve it using await. Where is a problem?
const socket = io("/");
const videoGrid = document.getElementById("video-grid");
const myPeer = new Peer(undefined, {
host: "/",
port: "3001"
});
const myVideo = document.createElement('video');
myVideo.muted = true;
const peers = {};
navigator.mediaDevices.getUserMedia({
video: true,
audio: true
}).then(stream => {
addVideoStream(myVideo, stream);
wait(myPeer, stream);
});
socket.on("user-disconnected", userId => {
peers[userId] && peers[userId].close();
});
myPeer.on("open", id => {
socket.emit("join-room", ROOM_ID, id);
})
const connectToNewUser = (userId, stream) => {
const call = myPeer.call(userId, stream);
const video = document.createElement('video');
call.on("stream", userVideoStream => {
addVideoStream(video, userVideoStream);
});
call.on("close", () => {
video.remove();
});
peers[userId] = call
}
const addVideoStream = (video, stream) => {
video.srcObject = stream;
video.addEventListener('loadedmetadata', () => {
video.play();
})
videoGrid.append(video);
}
async function wait(myPeer, stream) {
await myPeer.on("call", call => {
call.answer(stream);
const video = document.createElement("video");
call.on("stream", userVideoStream => {
addVideoStream(video, userVideoStream)
})
});
await socket.on("user-connected", userId => {
connectToNewUser(userId, stream);
});
}