From 831e52f0dcd7113cbb7d385252ee323430f1f5a4 Mon Sep 17 00:00:00 2001 From: Sergiu Toma Date: Mon, 22 Feb 2021 20:23:40 +0200 Subject: [PATCH] Update client --- .env | 3 +- public/index.html | 27 +------ public/logo.png | Bin 0 -> 10990 bytes public/logo192.png | Bin 5347 -> 0 bytes public/logo512.png | Bin 9664 -> 0 bytes public/manifest.json | 25 ------- src/App.js | 164 ++++++++++++++++++++++++++++++++----------- 7 files changed, 128 insertions(+), 91 deletions(-) create mode 100644 public/logo.png delete mode 100644 public/logo192.png delete mode 100644 public/logo512.png delete mode 100644 public/manifest.json diff --git a/.env b/.env index a43d6bb..41c8ff3 100644 --- a/.env +++ b/.env @@ -1 +1,2 @@ -PORT=3001 \ No newline at end of file +PORT=3001 +GENERATE_SOURCEMAP=true \ No newline at end of file diff --git a/public/index.html b/public/index.html index cb86bad..9bd07e8 100644 --- a/public/index.html +++ b/public/index.html @@ -9,22 +9,8 @@ name="description" content="Web site created using create-react-app" /> - - - - - React App + + WebRTC Tester @@ -43,15 +29,6 @@ LOCAL VIDEO

REMOTE VIDEO - diff --git a/public/logo.png b/public/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..75ab8582913918abe93e69929ea264a849a373b7 GIT binary patch literal 10990 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 b{|{}U^kRn2wo}j7|0ATu<;8xA7zX}7|B6mN diff --git a/public/manifest.json b/public/manifest.json deleted file mode 100644 index 080d6c7..0000000 --- a/public/manifest.json +++ /dev/null @@ -1,25 +0,0 @@ -{ - "short_name": "React App", - "name": "Create React App Sample", - "icons": [ - { - "src": "favicon.ico", - "sizes": "64x64 32x32 24x24 16x16", - "type": "image/x-icon" - }, - { - "src": "logo192.png", - "type": "image/png", - "sizes": "192x192" - }, - { - "src": "logo512.png", - "type": "image/png", - "sizes": "512x512" - } - ], - "start_url": ".", - "display": "standalone", - "theme_color": "#000000", - "background_color": "#ffffff" -} diff --git a/src/App.js b/src/App.js index cf93231..288e227 100644 --- a/src/App.js +++ b/src/App.js @@ -4,7 +4,7 @@ import './App.css'; const io = require("socket.io-client"); -var socket, stream; +var stream, pc; // var config = { // iceServers: [{ @@ -101,8 +101,6 @@ var config = { // rtcpMuxPolicy:"negotiate" // } -var pc = new RTCPeerConnection(config) - let localStream, remoteStream let localVideo = document.getElementById("localVideo"); @@ -137,6 +135,7 @@ class App extends Component { // setTimeout(() => { // windowObjectReference = window.open("http://www.cnn.com/", "CNN_WindowName", windowFeatures); // }, 500) + pc = new RTCPeerConnection(config) stream = await navigator.mediaDevices.getUserMedia({video:true, audio:false}) localStream = stream localVideo.srcObject = stream @@ -144,6 +143,43 @@ class App extends Component { // pc.addTrack(localStream.getTracks()[0], localStream); pc.addTrack(localStream.getTracks()[0], localStream) // pc.addTrack(localStream.getTracks()[1], localStream) + pc.oniceconnectionstatechange = this.onIceConnectionStateChange; + pc.onsignalingstatechange = this.onSignalingStateChange; + // pc.onicecandidate = ({candidate}) => { + // console.log('IIIIIIIIIIIIIIIIIIIIIIIII2', this.state.callId); + // this.state.socket.emit('video', JSON.stringify({ + // type: 'candidate', + // candidate: candidate, + // dest_asset_id: parseInt(this.state.dest_asset_id), + // video_call_id: this.state.callId, + // test: '1111111111' + // })); + // } + } + + onIceConnectionStateChange = (event) => { + console.log('onIceConnectionStateChange', event); + } + + onSignalingStateChange = async ({currentTarget}) => { + console.log('onSignalingStateChange', currentTarget); + // if(currentTarget.connectionState === 'new') { + // console.log('pc.localDescription', pc.localDescription); + // if(pc.localDescription) { + // console.log('SEND SDP onSignalingStateChange'); + // // await pc.setLocalDescription(await pc.createAnswer()) + // this.state.socket.emit('video', JSON.stringify({ + // origin_asset_id: this.state.user.asset.id, + // dest_asset_id: parseInt(this.state.dest_asset_id), + // type: 'offer', + // origin_asset_priority: this.state.user.asset.priority, + // origin_asset_type_name: this.state.user.user_role.name, + // origin_asset_name: this.state.user.asset.name, + // video_call_id: this.state.callId, + // sdp: pc.localDescription + // })); + // } + // } } onAddStream = (event) => { @@ -167,11 +203,11 @@ class App extends Component { this.setState({ user: loginResponseJson.data }, () => { // Connect to HUB this.setState({ socket: io("https://hub.dev.linx.safemobile.com/", {reconnect:true, transports: ['websocket']}) }, () => { - socket = this.state.socket; - socket.on('connect', () => { + // socket = this.state.socket; + this.state.socket.on('connect', () => { this.setState({ hubStatus: 2 }) // Send ARS after connected to HUB - socket.emit('ars', JSON.stringify({ + this.state.socket.emit('ars', JSON.stringify({ ars: true, asset_id: this.state.user.asset.id, account_id: this.state.user.account.id @@ -180,27 +216,71 @@ class App extends Component { }); // HUB 'video' event handler - socket.on('video', async (data) => { + this.state.socket.on('video', async (data) => { const parseData = JSON.parse(data); console.log('[VIDEO]', parseData); if(parseData.type === 'notify-request') { - await pc.setLocalDescription(await pc.createOffer()) - console.log('IIIIIIIIIIIIIIIIIIIIIIIII', this.state.callId); - socket.emit('video', JSON.stringify({ - origin_asset_id: this.state.user.asset.id, - dest_asset_id: parseInt(parseData.origin_asset_id), - type: 'offer', - origin_asset_priority: this.state.user.asset.priority, - origin_asset_type_name: this.state.user.user_role.name, - origin_asset_name: this.state.user.asset.name, - video_call_id: parseInt(parseData.video_call_id), - answer: 'accepted', // answer: 'rejected' - sdp: pc.localDescription - })); - this.setState({ callId: parseInt(parseData.video_call_id), dest_asset_id: parseInt(parseData.origin_asset_id) }) + console.log('NOTIFY-REQUEST'); + if(!this.state.callId) { + await pc.setLocalDescription(await pc.createOffer()) + this.state.socket.emit('video', JSON.stringify({ + origin_asset_id: this.state.user.asset.id, + dest_asset_id: parseInt(parseData.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.asset.name, + video_call_id: parseInt(parseData.video_call_id), + answer: 'accepted', // answer: 'rejected' + sdp: pc.localDescription + })); + this.setState({ callId: parseInt(parseData.video_call_id), dest_asset_id: parseInt(parseData.origin_asset_id) }) + } + // else { + // console.log('!!!!!!!!!!!!!!!!!', { + // origin_asset_id: this.state.user.asset.id, + // dest_asset_id: parseInt(this.state.dest_asset_id), + // type: 'offer', + // origin_asset_priority: this.state.user.asset.priority, + // origin_asset_type_name: this.state.user.user_role.name, + // origin_asset_name: this.state.user.asset.name, + // video_call_id: this.state.callId, + // sdp: pc.localDescription + // }); + // socket.emit('video', JSON.stringify({ + // origin_asset_id: this.state.user.asset.id, + // dest_asset_id: parseInt(this.state.dest_asset_id), + // type: 'offer', + // origin_asset_priority: this.state.user.asset.priority, + // origin_asset_type_name: this.state.user.user_role.name, + // origin_asset_name: this.state.user.asset.name, + // video_call_id: this.state.callId, + // sdp: pc.localDescription + // })); + // } + } + + if(parseData.type === 'notify-answer') { + console.log('NOTIFY-ANSWER'); + this.setState({ callId: parseInt(parseData.video_call_id) }) + this.offerReceived(parseData) + // await pc.setLocalDescription(await pc.createOffer()) + // console.log('IIIIIIIIIIIIIIIIIIIIIIIII', this.state.callId); + // socket.emit('video', JSON.stringify({ + // origin_asset_id: this.state.user.asset.id, + // dest_asset_id: parseInt(parseData.origin_asset_id), + // type: 'offer', + // origin_asset_priority: this.state.user.asset.priority, + // origin_asset_type_name: this.state.user.user_role.name, + // origin_asset_name: this.state.user.asset.name, + // video_call_id: parseInt(parseData.video_call_id), + // answer: 'accepted', // answer: 'rejected' + // sdp: pc.localDescription + // })); + // this.setState({ callId: parseInt(parseData.video_call_id), dest_asset_id: parseInt(parseData.origin_asset_id) }) } else if(parseData.type === 'offer') { if(parseData.sdp.type === 'offer') { @@ -210,16 +290,26 @@ class App extends Component { } else if(parseData.sdp.type === 'answer') { console.log('[ANSWER]'); await pc.setRemoteDescription(parseData.sdp) - pc.onicecandidate = ({candidate}) => { - console.log('candidate1', candidate); - this.state.socket.emit('video', JSON.stringify({ - type: 'candidate', - candidate, - dest_asset_id: parseInt(this.state.dest_asset_id), - video_call_id: parseData.video_call_id, - test: '222222222222', - })); + pc.onicecandidate = ({candidate}) => { + console.log('candidate1', candidate); + this.state.socket.emit('video', JSON.stringify({ + type: 'candidate', + candidate, + dest_asset_id: parseInt(this.state.dest_asset_id), + video_call_id: parseData.video_call_id, + test: '222222222222', + })); } + this.state.socket.emit('video', JSON.stringify({ + origin_asset_id: this.state.user.asset.id, + dest_asset_id: parseInt(this.state.dest_asset_id), + type: 'offer', + origin_asset_priority: this.state.user.asset.priority, + origin_asset_type_name: this.state.user.user_role.name, + origin_asset_name: this.state.user.asset.name, + video_call_id: this.state.callId, + sdp: pc.localDescription + })); } } else if(parseData.type === 'candidate') { console.log('candidate parseData', parseData); @@ -227,8 +317,10 @@ class App extends Component { console.log('parseData.candidate', parseData.candidate) pc.addIceCandidate(parseData.candidate).catch(e => {console.log(e)}) } + } else if (parseData.type === 'notify-end') { + this.cleanVideoStreams(); } - + }); @@ -261,7 +353,7 @@ class App extends Component { console.log('IIIIIIIIIIIIIIIIIIIIIIIII3', this.state.callId); await pc.setLocalDescription(await pc.createOffer()); // socket.emit('signal', {destination:remoteUser, data:pc.localDescription}) - socket.emit('video', JSON.stringify({ + this.state.socket.emit('video', JSON.stringify({ origin_asset_id: this.state.user.asset.id, dest_asset_id: parseInt(this.state.dest_asset_id), type: 'offer', @@ -318,7 +410,6 @@ class App extends Component { } handleClickEvent = () => { - console.log('IIIIIIIIIIIIIIIIIIIIIIIII6', this.state.callId); this.state.socket.emit('video', JSON.stringify({ origin_asset_id: this.state.user.asset.id, dest_asset_id: parseInt(this.state.dest_asset_id), @@ -328,13 +419,6 @@ class App extends Component { origin_asset_name: this.state.user.name, video_call_id: this.state.callId })); - // var userToCall = document.getElementById('calluser').value - // remoteUser = userToCall - // document.getElementById('invitestatus').innerHTML = " INVITATIE TRIMISA" - // document.getElementById('loadingOverlay').style.display = "block" - // var x = document.getElementById('calluser'); - // x.style.display = "none"; - // socket.emit('call', userToCall) } closeVideo = () => {