X-Git-Url: https://git.r.bdr.sh/rbdr/junction/blobdiff_plain/93fe1aee43a79a23d4c418c230fde0e451259279..8c251a2276b805e32d6c3dcd70637a5079db6d7a:/extension/content_script.js diff --git a/extension/content_script.js b/extension/content_script.js index 741e1c4..0c7012b 100644 --- a/extension/content_script.js +++ b/extension/content_script.js @@ -1,86 +1,100 @@ -(() => { - - const io = require('socket.io-client'); - - const internals = { - - kSocketUrl: 'http://unlimited.pizza:8000/', - - port: null, - socket: null, - peers: 0, - - onMessage(message) { - internals[message.action](message.data); - }, - - async joinAudioCall(data) { - - try { - const mediaStream = await navigator.mediaDevices.getUserMedia({ audio: true }); - - internals.socket = io(internals.kSocketUrl); - - console.log('Connecting to server'); - internals.socket.on('connect', function() { - - console.log("Connected to signaling server"); - internals.socket.emit('join', { - 'url': currentUrl, - }); - }); - - internals.socket.on('disconnect', function() { - - console.log("disconnected from signaling server"); - }); - - internals.socket.on('addPeer', function(data) { - - console.log(data); - internals.peers++; - console.log(`There are now ${internals.peers} participants`); - }); - - internals.socket.on('removePeer', function() { - - internals.peers--; - console.log(`There are now ${internals.peers} participants`); +import { io } from "socket.io-client"; +import { initializeTada } from "./tada"; +import { + addPeer, + addIceCandidate, + answerPeerOffer, + processPeerAnswer, + removePeer, + resetPeers, +} from "./peers"; +import { startMedia, stopMedia } from "./media"; + +const internals = { + kSocketUrl: "https://junction.tranquil.services", + kIceServers: [{ urls: "stun:stun.l.google.com:19302" }], + + port: null, + socket: null, + + onMessage(message) { + internals[message.action](message.data); + }, + + onError(error) { + // TODO: How do we want to handle errors? + console.error(error.stack || error); + }, + + connect() { + internals.port = chrome.runtime.connect({ name: "content" }); + internals.port.onMessage.addListener(internals.onMessage); + }, + + async joinAudioCall({ currentUrl, tada }) { + try { + const mediaStream = await startMedia(); + const playTada = initializeTada(tada); + + const socket = (internals.socket = io(internals.kSocketUrl, { + transports: ["websocket"], + })); + + socket.on("error", internals.handleError); + socket.on("connect_error", internals.handleError); + + socket.on("connect", () => { + console.debug("Connected to signaling server, group: ", currentUrl); + playTada(); + socket.emit("join", { + room: currentUrl, }); - - console.log('Done!'); - internals.createAudioElement(data.tada); - } - catch (err) { - - internals.port.postMessage({ - action: 'error' + }); + + socket.on("disconnect", () => { + console.debug("disconnected from signaling server"); + }); + + socket.on("addPeer", ({ peerId, shouldCreateOffer }) => { + addPeer({ + peerId, + shouldCreateOffer, + mediaStream, + onOffer: (data) => socket.emit("relayOffer", data), + socket, }); - internals.port.disconnect(); - internals.createAudioElement(data.tada); - } - }, - - hangUp() { - document.querySelectorAll('.junction-call-audio').forEach((audioElement) => audioElement.remove()); - internals.socket.close(); + playTada(); + }); + + socket.on("offerReceived", async ({ peerId, offer }) => { + socket.emit("relayAnswer", await answerPeerOffer({ peerId, offer })); + }); + + socket.on("answerReceived", (data) => processPeerAnswer(data)); + socket.on("ICECandidateReceived", (data) => addIceCandidate(data)); + socket.on("removePeer", (data) => removePeer(data)); + } catch (err) { + internals.port.postMessage({ + action: "error", + }); internals.port.disconnect(); - }, - - createAudioElement(source, type = 'audio/wav') { - - const audioElement = document.createElement('audio'); - audioElement.setAttribute('class', 'junction-call-audio'); - audioElement.src = source; - audioElement.autoplay = 'autoplay'; - audioElement.type = type; - document.querySelector('body').appendChild(audioElement); } - }; - - internals.port = chrome.runtime.connect({ name:"content" }); - internals.port.onMessage.addListener(internals.onMessage); -})(); + }, + + hangUp() { + resetPeers(); + stopMedia(); + internals.socket.close(); + internals.port.disconnect(); + }, +}; + +internals.connect(); +chrome.runtime.onConnect.addListener(() => { + internals.connect(); +}); + +console.debug("Content Script Loaded"); // Indicates to the background script that we executed correctly true;