console.log(this.middleName);
console.log(formData);
await axios.post('/api/upload', formData).then(console.log).catch(console.error);
const socket = io('http://localhost:4000');
const startButton = document.getElementById('startButton');
const hangupButton = document.getElementById('hangupButton');
const joinRoom = document.getElementById('joinRoom');
const localVideo = document.getElementById('localVideo');
const remoteVideo = document.getElementById('remoteVideo');
joinRoom.onclick = async () => {
socket.emit('joinRoom', document.getElementById('companionId').value);
}
let pc;
let localStream;
const onMessage = data => {
if (!localStream) {
console.log('not ready yet');
return;
}
console.log(data);
switch (data.type) {
case 'offer':
handleOffer(data);
break;
case 'answer':
handleAnswer(data);
break;
case 'candidate':
handleCandidate(data);
break;
case 'ready':
// A second tab joined. This tab will initiate a call unless in a call already.
if (pc) {
console.log('already in call, ignoring');
return;
}
makeCall(data);
break;
case 'bye':
if (pc) {
hangup(data);
}
break;
default:
console.log('unhandled', data);
break;
}
}
socket.on('message', onMessage);
startButton.onclick = async () => {
localStream = await navigator.mediaDevices.getUserMedia({audio: true, video: true});
localVideo.srcObject = localStream;
startButton.disabled = true;
hangupButton.disabled = false;
const companionId = document.getElementById('companionId').value;
socket.emit('message',
{
id: companionId,
message: {
type: 'ready'
}
});
}
hangupButton.onclick = async () => {
hangup();
socket.emit('message',
{
id: companionId,
message: {
type: 'bye'
}
});
}
async function hangup() {
if (pc) {
pc.close();
pc = null;
}
localStream.getTracks().forEach(track => track.stop());
localStream = null;
startButton.disabled = false;
hangupButton.disabled = true;
}
function createPeerConnection() {
pc = new RTCPeerConnection();
pc.onicecandidate = e => {
const message = {
type: 'candidate',
candidate: null
};
if (e.candidate) {
message.candidate = e.candidate.candidate;
message.sdpMid = e.candidate.sdpMid;
message.sdpMLineIndex = e.candidate.sdpMLineIndex;
}
const companionId = document.getElementById('companionId').value;
socket.emit('message', {
id: companionId,
message
});
}
pc.ontrack = e => remoteVideo.srcObject = e.streams[0];
localStream.getTracks().forEach(track => pc.addTrack(track, localStream));
}
async function makeCall() {
await createPeerConnection();
const companionId = document.getElementById('companionId').value;
const offer = await pc.createOffer();
socket.emit('message', {
id: companionId,
message: {
type: 'offer',
sdp: offer.sdp
}
});
await pc.setLocalDescription(offer);
}
async function handleOffer(offer) {
if (pc) {
console.error('existing peerconnection');
return;
}
await createPeerConnection();
await pc.setRemoteDescription(offer);
const companionId = document.getElementById('companionId').value;
const answer = await pc.createAnswer();
socket.emit('message', {
id: companionId,
message: {
type: 'answer',
sdp: answer.sdp
}
});
await pc.setLocalDescription(answer);
}
async function handleAnswer(answer) {
if (!pc) {
console.error('no peerconnection');
return;
}
await pc.setRemoteDescription(answer);
}
async function handleCandidate(candidate) {
console.log('Candidate', candidate)
if (!pc) {
console.error('no peerconnection');
return;
}
if (!candidate.candidate) {
console.log('Candidate null');
await pc.addIceCandidate(null);
} else {
await pc.addIceCandidate(candidate);
}
}
peerConnection.addEventListener('connectionstatechange', event => {
console.log('PeerState: ', peerConnection.connectionState)
if (peerConnection.connectionState === 'connected') {
console.log('Peer connected')
}
});