Я создаю приложение для видео-чата, использующее реагирование, редукс, webrtc и pusher в качестве моего провайдера сигналов, и приложение почти работает без сбоев, за исключением того факта, что вызывающий не получает удаленный поток, а вызываемый получает.Событие ontrack не срабатывает для звонящего.
Я пытался использовать внутреннюю систему webrtc, и мне кажется, что описания и предложения / ответы созданы и успешно установлены, но есть много загадочных сообщений, которые я не совсем понимаю.
const createAnswer = () => {
caller.createAnswer().then(sdp => {
const sessionDesc = new RTCSessionDescription(sdp);
setLocalDescription(sessionDesc);
channel.trigger("client-answer", {
sdp: sdp,
room: room
});
});;
}
const addTrack = (track, stream) => {
caller.addTrack(track, stream);
}
channel.bind("client-sdp", msg => {
if (msg.room === userId) {
store.dispatch({type: actionTypes.ON_INCOMING_CALL});
let answer = window.confirm("You have a call from " + msg.from + ": Would you like to answer?");
if (!answer) {
return channel.trigger("client-reject", { room: msg.room, rejected: userId });
} else {
room = msg.room;
let sessionDesc = new RTCSessionDescription(msg.sdp);
setRemoteDescription(sessionDesc);
state = 'answerCall';
getCam();
createAnswer();
}
}
});
const getCam = () => {
getMedia().then(stream => {
stream.getTracks().forEach(track => addTrack(track, stream));
if (!state){
createOffer();
}
store.dispatch(onLocalStream(stream));
})
.catch(error => {
console.log("an error occured", error);
});
}
export const getCallerReady = () => {
return dispatch => {
dispatch(prepareCaller(channel));
//Listen for ICE Candidates and send them to remote peers
caller.onicecandidate = evt => {
if (!evt.candidate) return;
onIceCandidate(caller, evt);
};
//ontrack handler to receive remote feed and show in remoteview video element
caller.ontrack = evt => {
dispatch(onTrack(evt));
};
}
}
const onTrack = track => {
return {
type: actionTypes.ON_TRACK,
remoteStream: track.streams[0]
}
}
Это, я думаю, является важной частью кода.Если вам интересно, эти функции находятся в файле создателей избыточных действий, потому что я отправляю из него некоторые действия.
Я ожидал, что обработчик событий caller.ontrack будет вызываться как для вызывающей, так и для вызываемой стороны, но это тольковызывается для вызываемого абонента