Update client

This commit is contained in:
2021-01-27 12:04:34 +02:00
parent ef7eaee602
commit 0d6c219128
4 changed files with 448 additions and 130 deletions

View File

@ -4,31 +4,48 @@ import './App.css';
const io = require("socket.io-client");
let localStream = null;
let remoteStream = null;
let localStream = new MediaStream();
let remoteStream = new MediaStream();
// const iceServer = {
// 'iceServer': [
// // { 'urls': 'stun:stun.services.mozilla.com' }, // public
// // { 'urls': 'stun:stun.l.google.com:19302' } // public
// // { 'urls': 'dev.linx.safemobile.com:19302' },
// // {
// // urls: 'turn:dev.linx.safemobile.com:19302',
// // username: "safemobile",
// // credential: "Safemobile123"
// // }
// // ,
// {
// urls: 'turn:numb.viagenie.ca',
// username: "webrtc@live.com",
// credential: "muazkh"
// }
// ]
// }
let rtcPeerConnection = null;
// let navigator = null;
let localVideo = document.getElementById("localVideo");
let remoteVideo = document.getElementById("remoteVideo");
// var windowObjectReference;
// var popupUrl = "file:///C:/projects/safemobile/hub-test/src/PopupWindow.html";
var socket;
(() => {
setInterval(() => {
// if(rtcPeerConnection != null) { console.log('1'); }
// if(rtcPeerConnection && rtcPeerConnection.hasOwnProperty('signalingState')) { console.log('[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[2'); }
// if(rtcPeerConnection && rtcPeerConnection.hasOwnProperty('signalingState')) {
if(rtcPeerConnection !== null) {
console.log('[--------------STATE------------]', rtcPeerConnection.signalingState)
}
// }
}, 100)
})()
// rtcPeerConnection.setConfiguration(
// { iceServers: [{
// urls: "turn:dev.linx.safemobile.com:19302",
// username: "sergiu",
// credential: "test123"
// }]
// }
// );
// ({iceRestart: true}) // offer
// rtcPeerConnection.addTrack(localStream.getTracks()[1], localStream) // audio
// "urls": "turn:dev.linx.safemobile.com:19302?transport=udp",
const streamConstraints = {
audio: false,
video: true
@ -39,27 +56,41 @@ class App extends Component {
super();
this.state = {
login: '',
password: '',
login: 'AIRWizard-adi',
password: 'Safemobile123',
user: null,
hubStatus: 0, // 0 uninitialized | 1 connecting | 2 connected | 3 connection error
socket: null,
arsSent: false,
dest_asset_id: '',
dest_asset_id: '66',
isCaller: false,
callId: null,
rtcPeerConnection: null,
stunUrl: 'stun:dev.linx.safemobile.com:19302',
turnUrl: 'turn:dev.linx.safemobile.com:19302',
// rtcPeerConnection: null,
stunUrl: 'stun:10.120.1.134:19302',
turnUrl: 'turn:10.120.1.134:19302',
turnUsername: 'safemobile',
turnCredential: 'Safemobile123'
turnCredential: 'Safemobile123',
testCount: 0
};
}
componentDidMount() {
// var windowObjectReference;
// var windowFeatures = "menubar=yes,location=yes,resizable=yes,scrollbars=yes,status=yes";
// console.log('11111');
// setTimeout(() => {
// windowObjectReference = window.open("http://www.cnn.com/", "CNN_WindowName", windowFeatures);
// }, 500)
}
// testMessage = async () => {
// window.postMessage('s', popupUrl);
// // console.log(this.state.testCount)
// // this.setState((prevState, props) => ({
// // testCount: prevState.testCount + 1
// // }));
// // windowObjectReference.postMessage('[WINDOW] messageeeeeeeeeeeeee', popupUrl)
// }
handleLoginClick = async () => {
const loginRequest = await fetch('https://dev.linx.safemobile.com/api/login', {
@ -78,7 +109,7 @@ class App extends Component {
// Connect to HUB
// this.setState({ socket: io("localhost:41414", {reconnect:true, transports: ['websocket']}) }, () => {
this.setState({ socket: io("https://hub.dev.linx.safemobile.com/", {reconnect:true, transports: ['websocket']}) }, () => {
const socket = this.state.socket;
socket = this.state.socket;
socket.on('connect', () => {
this.setState({ hubStatus: 2 })
// Send ARS after connected to HUB
@ -88,26 +119,77 @@ class App extends Component {
account_id: this.state.user.account.id
}));
this.setState({ arsSent: true });
// var windowFeatures = "menubar=yes,location=yes,resizable=yes,scrollbars=yes,status=false,resizable=yes,titlebar=false,width=640,height=640";
// // setTimeout(() => {
// window.socket = socket;
// windowObjectReference = window.open(popupUrl, "TEST", windowFeatures);
// windowObjectReference.addEventListener("message", (event) => {
// console.log('[WINDOW] event', event)
// console.log('[WINDOW] event.source.opener', event.source.opener.socket);
// event.source.opener.socket.emit('ars', JSON.stringify({
// ars: true,
// asset_id: this.state.user.asset.id,
// account_id: this.state.user.account.id
// }));
// // console.log('B', B);
// }, false);
// windowObjectReference.document.close();
// windowObjectReference.focus();
// windowObjectReference.postMessage('[WINDOW] messageeeeeeeeeeeeee', popupUrl)
// }, 2000)
// window.addEventListener("message", (event) => {
// console.log('[MAIN] event', event)
// // Do we trust the sender of this message? (might be
// // different from what we originally opened, for example).
// if (event.origin !== popupUrl)
// return;
// // event.source.postMessage("hi there yourself! the secret response " + "is: rheeeeet!", event.origin);
// // event.source is popup
// // event.data is "hi there yourself! the secret response is: rheeeeet!"
// }, false);
// window.postMessage("hello there!", popupUrl);
console.log('111111111111111')
});
// HUB 'video' event handler
socket.on('video', (data) => {
const parseDate = JSON.parse(data);
console.log('video', parseDate);
// The response to the 'notify-request' (hardcoded 'YES')
console.log('[VIDEO]', parseDate);
if(parseDate.type === 'notify-request') {
this.setState({ dest_asset_id: parseInt(parseDate.origin_asset_id), callId: parseInt(parseDate.video_call_id) });
socket.emit('video', JSON.stringify({
origin_asset_id: this.state.user.asset.id,
dest_asset_id: parseInt(parseDate.origin_asset_id),
type: 'notify-answer',
origin_asset_priority: this.state.user.asset.priority,
origin_asset_type_name: this.state.user.user_role.name,
origin_asset_name: this.state.user.name,
video_call_id: parseDate.video_call_id,
answer: 'accepted' // answer: 'rejected'
}));
// console.error('11111111 navigator', navigator);
navigator.mediaDevices.getUserMedia(streamConstraints)
.then(stream => {
localStream = stream
localVideo.srcObject = stream
this.setState({ dest_asset_id: parseInt(parseDate.origin_asset_id), callId: parseInt(parseDate.video_call_id) });
socket.emit('video', JSON.stringify({
origin_asset_id: this.state.user.asset.id,
dest_asset_id: parseInt(parseDate.origin_asset_id),
type: 'notify-answer',
origin_asset_priority: this.state.user.asset.priority,
origin_asset_type_name: this.state.user.user_role.name,
origin_asset_name: this.state.user.name,
video_call_id: parseDate.video_call_id,
answer: 'accepted' // answer: 'rejected'
}));
})
.catch(err => {
console.log('An error occured', err)
})
}
// Handler for 'notify-end'(when the video closed)
@ -118,97 +200,71 @@ class App extends Component {
// Handler for 'notify-answer'
if(parseDate.type === 'notify-answer') {
if(parseDate.answer === 'rejected') {
this.closeVideo()
return
}
// Create media stream
navigator.mediaDevices.getUserMedia(streamConstraints).then(stream => {
console.log('Created getUserMedia', stream);
localStream = stream;
localVideo.srcObject = stream;
console.log('iceServers', this.calculateIceServers())
// Create SDP
this.setState({ rtcPeerConnection: new RTCPeerConnection(this.calculateIceServers()) }, () => {
this.state.rtcPeerConnection.onicecandidate = this.onIceCandidate;
this.state.rtcPeerConnection.ontrack = this.onAddStream;
this.state.rtcPeerConnection.addTrack(localStream.getTracks()[0], localStream); // video
// rtcPeerConnection.addTrack(localStream.getTracks()[1], localStream) // audio
// Create a offer
this.state.rtcPeerConnection.createOffer().then(sessionDescription => {
// Save SDP in state and send it to destination asset_id as offer
this.setState({ isCaller: true, callId: parseInt(parseDate.video_call_id) }, () => {
this.state.rtcPeerConnection.setLocalDescription(sessionDescription);
console.log('Created SDP', sessionDescription);
socket.emit('video', JSON.stringify({
origin_asset_id: this.state.user.asset.id,
type: 'offer',
sdp: sessionDescription,
dest_asset_id: parseInt(this.state.dest_asset_id),
video_call_id: parseDate.video_call_id
}));
})
} else if(parseDate.answer === 'accepted') {
navigator.mediaDevices.getUserMedia(streamConstraints).then(stream => {
localStream = stream;
localVideo.srcObject = stream;
rtcPeerConnection = new RTCPeerConnection(this.calculateIceServers());
rtcPeerConnection.onicecandidate = this.onIceCandidate;
rtcPeerConnection.ontrack = this.onAddStream;
rtcPeerConnection.addTrack(localStream.getTracks()[0], localStream);
rtcPeerConnection.createOffer()
.then(async (sessionDescription) => {
await rtcPeerConnection.setLocalDescription(sessionDescription);
socket.emit('video', JSON.stringify({
origin_asset_id: this.state.user.asset.id,
type: 'offer',
sdp: sessionDescription,
dest_asset_id: parseInt(this.state.dest_asset_id),
video_call_id: parseDate.video_call_id
}));
this.setState({ isCaller: true, callId: parseInt(parseDate.video_call_id) })
})
.catch(e => { console.log(e); })
.catch(e => { console.log('[-------------ERROR-------------]', e); })
})
})
.catch(err => {
console.log('An error occured', err);
})
.catch(err => {
console.log('An error occured', err);
})
}
}
// Handler for 'offer'
if(parseDate.type === 'offer') {
// When we are NOT the caller
if(!this.state.isCaller) {
// Create media stream
navigator.mediaDevices.getUserMedia(streamConstraints).then(stream => {
console.log('Created getUserMedia', stream);
localStream = stream;
localVideo.srcObject = stream;
console.log('iceServers', this.calculateIceServers())
// Create SDP
this.setState({ rtcPeerConnection: new RTCPeerConnection(this.calculateIceServers()) }, () => {
this.state.rtcPeerConnection.onicecandidate = this.onIceCandidate;
this.state.rtcPeerConnection.ontrack = this.onAddStream;
this.state.rtcPeerConnection.addTrack(localStream.getTracks()[0], localStream); // video
// rtcPeerConnection.addTrack(localStream.getTracks()[1], localStream) // audio
// Set setRemoteDescription to be sender SDP
this.state.rtcPeerConnection.setRemoteDescription(new RTCSessionDescription(parseDate.sdp));
// Create an answer
this.state.rtcPeerConnection.createAnswer().then(sessionDescription => {
// Save SDP in state and send it to destination asset_id as offer
this.setState({ sdp: sessionDescription }, () => {
this.state.rtcPeerConnection.setLocalDescription(sessionDescription);
console.log('Created SDP', sessionDescription);
socket.emit('video', JSON.stringify({
origin_asset_id: this.state.user.asset.id,
type: 'offer',
sdp: sessionDescription,
dest_asset_id: parseInt(this.state.dest_asset_id),
video_call_id: parseDate.video_call_id
}));
})
})
.catch(e => { console.log(e); })
})
rtcPeerConnection = new RTCPeerConnection(this.calculateIceServers());
rtcPeerConnection.onicecandidate = this.onIceCandidate;
rtcPeerConnection.ontrack = this.onAddStream;
rtcPeerConnection.addTrack(localStream.getTracks()[0], localStream);
rtcPeerConnection.setRemoteDescription(new RTCSessionDescription(parseDate.sdp))
rtcPeerConnection.createAnswer()
.then(async (sessionDescription) => {
rtcPeerConnection.setLocalDescription(sessionDescription);
socket.emit('video', JSON.stringify({
origin_asset_id: this.state.user.asset.id,
type: 'offer',
sdp: sessionDescription,
dest_asset_id: parseInt(this.state.dest_asset_id),
video_call_id: parseDate.video_call_id
}));
})
.catch(e => { console.log('[-------------ERROR-------------]', e); })
} else {
// When we ARE the caller
console.log('parseDate.sdp', parseDate.sdp);
this.state.rtcPeerConnection.setRemoteDescription(new RTCSessionDescription(parseDate.sdp));
rtcPeerConnection.setRemoteDescription(new RTCSessionDescription(parseDate.sdp));
}
}
if(parseDate.type === 'candidate') {
if(this.state.rtcPeerConnection) {
if(rtcPeerConnection) {
const candidate = new RTCIceCandidate({
sdpMLineIndex: parseDate.label,
candidate: parseDate.candidate
});
this.state.rtcPeerConnection.addIceCandidate(candidate);
rtcPeerConnection.addIceCandidate(candidate);
}
}
@ -219,21 +275,68 @@ class App extends Component {
}
calculateIceServers = () => {
return {
'iceServer': [
{
'urls': this.state.stunUrl
}, {
urls: this.state.turnUrl,
username: this.state.turnUsername,
credential: this.state.turnCredential
// const obj = {
// "iceServers": [
// {
// "urls":[this.state.stunUrl],
// "username":"safemobile",
// "credential":"Safemobile123"
// },
// {
// "urls":[this.state.turnUrl],
// "username":this.state.turnUsername,
// "credential":this.state.turnCredential
// }
// ],
// "iceTransportPolicy":"all",
// "iceCandidatePoolSize":"0"
// };
// const obj = {
// "iceServers": [
// {
// "urls": "stun:dev.linx.safemobile.com:19302",
// "username":"",
// "credential":""
// }
// ],
// };
// {
// "urls": "turn:dev.linx.safemobile.com:19302?transport=tcp",
// "username": "sergiu",
// "credential": "test123"
// },
const obj = {
"iceServers": [
{
"urls": this.state.stunUrl,
"username": "",
"credential": ""
},
{
"urls": this.state.turnUrl,
"username": this.state.turnUsername,
"credential": this.state.turnCredential,
}
]
}
};
// const obj = {
// "iceServers": [
// {
// "urls":[this.state.turnUrl],
// "username":this.state.turnUsername,
// "credential":this.state.turnCredential
// }
// ],
// "iceTransportPolicy":"relay",
// "iceCandidatePoolSize":"3"
// };
console.log('obj-----------------------', obj);
return obj;
}
onAddStream = (event) => {
console.log('onAddStream', event);
remoteVideo.srcObject = event.streams[0];
remoteStream = event.streams[0];
}
@ -302,8 +405,8 @@ class App extends Component {
}
cleanVideoStreams = () => {
this.state.rtcPeerConnection != null && this.state.rtcPeerConnection.close();
this.setState({ callId: null, rtcPeerConnection: null });
rtcPeerConnection != null && rtcPeerConnection.close();
// this.setState({ callId: null, rtcPeerConnection: null });
localVideo.srcObject = null;
remoteVideo.srcObject = null;
}
@ -313,8 +416,8 @@ class App extends Component {
return (
<div className="App">
<h1>HUB TESTER</h1>
<h1>WebRTC Client 0.7</h1>
{this.state.testCount}
<br></br>
<h2><u>STUN and TURN servers</u></h2>
@ -372,11 +475,12 @@ class App extends Component {
/><br></br>
<button onClick={this.handleLoginClick} style={{ margin: 10, width: 100 }}>LOGIN</button>
{/* <button onClick={this.testMessage} style={{ margin: 10, width: 200 }}>TEST MESSAGE</button> */}
<br></br>
<h2><u>isCaller:</u> {isCaller ? 'TRUE' : 'FALSE'}</h2>
<h2><u>User details:</u></h2>
<h2><u>User details:</u></h2>
{
user && (
<React.Fragment>