From ec557e6926e6288b77558dc51101d8b14d74a3ac Mon Sep 17 00:00:00 2001 From: James Ketrenos Date: Sun, 20 Mar 2022 11:01:06 -0700 Subject: [PATCH] Allow non-media players to connect to other players Signed-off-by: James Ketrenos --- client/src/MediaControl.js | 156 +++++++++++++++++++++++-------------- server/routes/games.js | 33 +++++--- 2 files changed, 120 insertions(+), 69 deletions(-) diff --git a/client/src/MediaControl.js b/client/src/MediaControl.js index b12ddd0..707f1d3 100644 --- a/client/src/MediaControl.js +++ b/client/src/MediaControl.js @@ -78,34 +78,16 @@ const MediaAgent = ({setPeers}) => { return; } } - const connection = new RTCPeerConnection({ - configuration: { - offerToReceiveAudio: true, - offerToReceiveVideo: true - }, - iceServers: [ { - urls: "turns:ketrenos.com:5349", - username: "ketra", - credential: "ketran" - }, - /* - { - urls: "turn:numb.viagenie.ca", - username: "james_viagenie@ketrenos.com", - credential: "1!viagenie" - } - */ - ] - }); - - /* Even if reviving, allocate a new Object so will - * have its peer state change and trigger an update from - * */ + /* Even if reviving, allocate a new Object so will + * have its peer state change and trigger an update from + * */ const peer = { name: peer_id, - connection, + hasAudio: config.hasAudio, + hasVideo: config.hasVideo, attributes: {}, }; + if (peer_id in peers) { peer.muted = peers[peer_id].muted; peer.videoOn = peers[peer_id].videoOn; @@ -119,8 +101,35 @@ const MediaAgent = ({setPeers}) => { console.log(`media-agent - addPeer - remote`, peers); setPeers(Object.assign({}, peers)); + const connection = new RTCPeerConnection({ + configuration: { + offerToReceiveAudio: true, + offerToReceiveVideo: true + }, + iceServers: [{ + urls: "turns:ketrenos.com:5349", + username: "ketra", + credential: "ketran" + }, + /* + { + urls: "turn:numb.viagenie.ca", + username: "james_viagenie@ketrenos.com", + credential: "1!viagenie" + } + */ + ] + }); + peer.connection = connection; + connection.addEventListener('connectionstatechange', (event) => { - console.log(`media-agent - connectionstatechange - `, connection.connectionState, event); + console.log(`media-agent - connectionstatechange - `, + connection.connectionState, event); + }); + + connection.addEventListener('negotiationneeded', (event) => { + console.log(`media-agent - negotiationneeded - `, + connection.connectionState, event); }); connection.addEventListener('icecandidateerror', (event) => { @@ -163,7 +172,7 @@ const MediaAgent = ({setPeers}) => { connection.ontrack = e => refOnTrack.current(e); /* Add our local stream */ - connection.addStream(stream); + connection.addStream(stream.media); /* Only one side of the peer connection should create the * offer, the signaling server picks one to be the offerer. @@ -172,10 +181,12 @@ const MediaAgent = ({setPeers}) => { * to us */ if (config.should_create_offer) { - if (debug) console.log(`media-agent - Creating RTC offer to ${peer_id}`); + if (debug) console.log(`media-agent - Creating RTC offer to ` + + `${peer_id}`); return connection.createOffer() .then((local_description) => { - if (debug) console.log(`media-agent - Local offer description is: `, local_description); + if (debug) console.log(`media-agent - Local offer ` + + `description is: `, local_description); return connection.setLocalDescription(local_description) .then(() => { sendMessage({ @@ -185,7 +196,8 @@ const MediaAgent = ({setPeers}) => { 'session_description': local_description } }); - if (debug) console.log(`media-agent - Offer setLocalDescription succeeded`); + if (debug) console.log(`media-agent - Offer ` + + `setLocalDescription succeeded`); }) .catch((error) => { console.error(`media-agent - Offer setLocalDescription failed!`); @@ -200,17 +212,21 @@ const MediaAgent = ({setPeers}) => { const sessionDescription = ({ peer_id, session_description }) => { const peer = peers[peer_id]; if (!peer) { - console.error(`media-agent - sessionDescription - No peer for ${peer_id}`); + console.error(`media-agent - sessionDescription - ` + + `No peer for ${peer_id}`); return; } const { connection } = peer; const desc = new RTCSessionDescription(session_description); return connection.setRemoteDescription(desc, () => { - if (debug) console.log(`media-agent - sessionDescription - setRemoteDescription succeeded`); + if (debug) console.log(`media-agent - sessionDescription - ` + + `setRemoteDescription succeeded`); if (session_description.type === "offer") { - if (debug) console.log(`media-agent - sessionDescription - Creating answer`); + if (debug) console.log(`media-agent - sessionDescription - ` + + `Creating answer`); connection.createAnswer((local_description) => { - if (debug) console.log(`media-agent - sessionDescription - Answer description is: `, local_description); + if (debug) console.log(`media-agent - sessionDescription - ` + + `Answer description is: `, local_description); connection.setLocalDescription(local_description, () => { sendMessage({ type: 'relaySessionDescription', @@ -219,21 +235,25 @@ const MediaAgent = ({setPeers}) => { session_description: local_description } }); - if (debug) console.log(`media-agent - sessionDescription - Answer setLocalDescription succeeded`); + if (debug) console.log(`media-agent - sessionDescription ` + + `- Answer setLocalDescription succeeded`); }, () => { - console.error(`media-agent - sessionDescription - Answer setLocalDescription failed!`); + console.error(`media-agent - sessionDescription - ` + + `Answer setLocalDescription failed!`); }); }, (error) => { console.error(error); }); } }, (error) => { - console.log(`media-agent - sessionDescription - setRemoteDescription error: `, error); + console.log(`media-agent - sessionDescription - ` + + `setRemoteDescription error: `, error); }); }; const removePeer = ({peer_id}) => { - console.log(`media-agent - removePeer - Signaling server said to remove peer ${peer_id}`); + console.log(`media-agent - removePeer - Signaling server said to ` + + `remove peer ${peer_id}`); if (peer_id in peers) { if (peers[peer_id].connection) { peers[peer_id].connection.close(); @@ -256,12 +276,14 @@ const MediaAgent = ({setPeers}) => { */ const peer = peers[peer_id]; if (!peer) { - console.error(`media-agent - iceCandidate - No peer for ${peer_id}`, peers); + console.error(`media-agent - iceCandidate - No peer for ` + + `${peer_id}`, peers); return; } peer.connection.addIceCandidate(new RTCIceCandidate(candidate)) .then(() => { - if (debug) console.log(`media-agent - iceCandidate - Successfully added Ice Candidate for ${peer_id}`); + if (debug) console.log(`media-agent - iceCandidate - ` + + `Successfully added Ice Candidate for ${peer_id}`); }) .catch((error) => { console.error(error, peer, candidate); @@ -269,7 +291,8 @@ const MediaAgent = ({setPeers}) => { }; const data = JSON.parse(event.data); - if (data.type in [ 'addPeer', 'removePeer', 'iceCandidate', 'sessionDescription' ]) { + if (data.type in [ 'addPeer', 'removePeer', + 'iceCandidate', 'sessionDescription' ]) { console.log(`media-agent - message - ${data.type}`, peers); } switch (data.type) { @@ -329,7 +352,13 @@ const MediaAgent = ({setPeers}) => { console.log(`media-control - WebSocket or Stream changed`); const join = () => { - sendMessage({ type: 'join' }); + sendMessage({ + type: 'join', + config: { + hasAudio: stream.audio, + hasVideo: stream.video + } + }); } if (ws && stream) { @@ -359,9 +388,11 @@ const MediaAgent = ({setPeers}) => { local: true, muted: true, videoOn: false, + hasVideo: stream.video, + hasAudio: stream.audio, attributes: { local: true, - srcObject: stream + srcObject: stream.media } }; } @@ -390,11 +421,12 @@ const MediaAgent = ({setPeers}) => { const setup_local_media = () => { /* Ask user for permission to use the computers microphone and/or camera, * attach it to an