X-Git-Url: https://git.r.bdr.sh/rbdr/junction/blobdiff_plain/44d7c8891d37679c33689b5d4a24c783b8d7fc84..30295bf26ceb753bda98b0808c98021dc2b5901b:/extension/junction.js?ds=inline diff --git a/extension/junction.js b/extension/junction.js index 2dbff78..c3cb4e9 100644 --- a/extension/junction.js +++ b/extension/junction.js @@ -1,119 +1,121 @@ -const io = require('socket.io-client'); - const internals = { - - promisesSupported: !!(window.browser), - isInCallState: false, + promisesSupported: !!window.browser, + injectedScript: false, + port: null, + currentUrl: null, icons: { call: { - 16: 'icons/action-16.png', - 32: 'icons/action-32.png' + 16: "icons/action-16.png", + 32: "icons/action-32.png", }, hangUp: { - 16: 'icons/hang_up-16.png', - 32: 'icons/hang_up-32.png' - } + 16: "icons/hang_up-16.png", + 32: "icons/hang_up-32.png", + }, }, - socket: null, - - peers: 0, - onClick() { if (internals.isInCall()) { return internals.hangUp(); } - return internals.joinAudioCall(); + return internals.initializeContentScript(); }, - async joinAudioCall() { - - internals.isInCallState = true; - internals.setIcon('hangUp'); - const activeTabs = await internals.getActiveTabs(); - - const socketUrl = 'http://unlimited.pizza:8000/'; - const currentUrl = activeTabs[0].url; - - this.socket = io(socketUrl); - - this.socket.on('connect', function() { - console.log("Connected to signaling server"); - }); - - this.socket.on('disconnect', function() { - console.log("disconnected from signaling server"); - }); - - this.socket.on('addPeer', function() { - this.peers++; - console.log(`There are now ${this.peers} participants`); - }); - - this.socket.on('removePeer', function() { - this.peers--; - console.log(`There are now ${this.peers} participants`); + joinAudioCall() { + internals.port.postMessage({ + action: "joinAudioCall", + data: { + currentUrl: internals.currentUrl, + tada: internals.getRoot().runtime.getURL("sounds/tada.wav"), + }, }); + internals.getRoot().browserAction.enable(); + internals.setIcon("hangUp"); + }, - console.log(activeTabs[0].url); // placeholder while we connect backend. - internals.createAudioElement(internals.getRoot().runtime.getURL('sounds/tada.wav')); + onConnect(port) { + internals.port = port; + port.onDisconnect.addListener(internals.onDisconnect); + port.onMessage.addListener(internals.onMessage); + internals.joinAudioCall(); }, - hangUp() { - this.socket.close(); + onMessage(message) { + if (message.action === "error") { + internals.getRoot().browserAction.setBadgeText({ text: "x" }, () => {}); + } + }, + onDisconnect() { + internals.getRoot().browserAction.setBadgeText({ text: "" }, () => {}); + internals.setIcon("call"); + internals.currentUrl = null; + internals.port = null; + internals.getRoot().browserAction.enable(); + }, + async initializeContentScript() { + internals.getRoot().browserAction.disable(); + const activeTabs = await internals.getActiveTabs(); - document.querySelectorAll('audio').forEach((audioElement) => audioElement.remove()); - internals.setIcon('call'); - internals.isInCallState = false; + internals.currentUrl = activeTabs[0].url; + if (!internals.injectedScript) { + const execution = await internals.getRoot().tabs.executeScript( + activeTabs[0].id, + { + file: "/build/content_script.js", + }, + () => { + internals.injectedScript = true; + }, + ); + + if (execution && !execution[0]) { + internals.onDisconnect(); + } + } else { + internals.getRoot().tabs.connect(activeTabs[0].id); + } }, - createAudioElement(source, type = 'audio/wav') { - - const audioElement = document.createElement('audio'); - audioElement.src = source; - audioElement.autoplay = 'autoplay'; - audioElement.type = type; - document.querySelector('body').appendChild(audioElement); + hangUp() { + internals.getRoot().browserAction.disable(); + internals.port.postMessage({ + action: "hangUp", + }); }, isInCall() { - return internals.isInCallState; // this should be replaced with actually checking the built stuff + return !!internals.port; }, setIcon(iconSet) { - internals.getRoot().browserAction.setIcon({ - path: internals.icons[iconSet] + path: internals.icons[iconSet], }); }, getRoot() { - return window.browser || window.chrome; }, // Chrome doesn't yet implement the promise based tabs.query :'( getActiveTabs() { - const query = { currentWindow: true, - active: true + active: true, }; if (internals.promisesSupported) { return internals.getRoot().tabs.query(query); } - return new Promise((resolve, reject) => { - + return new Promise((resolve) => { internals.getRoot().tabs.query(query, (tabs) => { - return resolve(tabs); }); }); @@ -121,3 +123,4 @@ const internals = { }; internals.getRoot().browserAction.onClicked.addListener(internals.onClick); +internals.getRoot().runtime.onConnect.addListener(internals.onConnect);