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, }); }); 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, }); 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(); } }, 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;