]> git.r.bdr.sh - rbdr/junction/blobdiff - extension/junction.js
Add command for the server
[rbdr/junction] / extension / junction.js
index 7de7c28012e5f8781f5fca622402745c48a7f17a..889e23f975dfdd3dccb9ce7dd081367fe33023e8 100644 (file)
@@ -1,6 +1,8 @@
 const internals = {
 
-  isInCallState: false,
+  promisesSupported: !!(window.browser),
+  port: null,
+  currentUrl: null,
 
   icons: {
     call: {
@@ -22,43 +24,105 @@ const internals = {
     return internals.joinAudioCall();
   },
 
-  async joinAudioCall() {
-
-    internals.isInCallState = true;
-    internals.setIcon('hangUp');
-    const tabs = await browser.tabs.query({
-      currentWindow: true,
-      active: true
+  onConnect(port) {
+
+    internals.port = port;
+    port.onDisconnect.addListener(internals.onDisconnect);
+    port.onMessage.addListener(internals.onMessage);
+    port.postMessage({
+      action: 'joinAudioCall',
+      data: {
+        currentUrl: internals.currentUrl,
+        tada: internals.getRoot().runtime.getURL('sounds/tada.wav')
+      }
     });
-
-    internals.createAudioElement(browser.runtime.getURL('sounds/tada.wav'));
+    internals.getRoot().browserAction.enable();
+    internals.setIcon('hangUp');
   },
 
-  hangUp() {
+  onMessage(message) {
+
+    if (message.action === 'error') {
+      internals.getRoot().browserAction.setBadgeText({ text: 'x' }, () => {});
+    }
+  },
 
-    document.querySelectorAll('audio').forEach((audioElement) => audioElement.remove());
+  onDisconnect() {
+    internals.getRoot().browserAction.setBadgeText({ text: '' }, () => {});
     internals.setIcon('call');
-    internals.isInCallState = false;
+    internals.currentUrl = null;
+    internals.port = null;
+    internals.getRoot().browserAction.enable();
   },
 
-  createAudioElement(source) {
+  async joinAudioCall() {
+
+    internals.getRoot().browserAction.disable();
+    const activeTabs = await internals.getActiveTabs();
+
+    internals.currentUrl = activeTabs[0].url;
+    const execution = await internals.getRoot().tabs.executeScript(activeTabs[0].id, {
+      file: '/build/content_script.js'
+    }, () => {
+
+      if (internals.getRoot().runtime.lastError) {
+        internals.onDisconnect();
+      }
+    });
+
+    if (execution && !execution[0]) {
+      internals.onDisconnect();
+    }
+  }
+  ,
+
+  hangUp() {
 
-    const audioElement = document.createElement('audio');
-    audioElement.src = source;
-    audioElement.autoplay = 'autoplay';
-    document.querySelector('body').appendChild(audioElement);
+    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) {
 
-    browser.browserAction.setIcon({
+    internals.getRoot().browserAction.setIcon({
       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
+    };
+
+    if (internals.promisesSupported) {
+      return internals.getRoot().tabs.query(query);
+    }
+
+    return new Promise((resolve) => {
+
+      internals.getRoot().tabs.query(query, (tabs) => {
+
+        return resolve(tabs);
+      });
+    });
+  },
 };
 
-browser.browserAction.onClicked.addListener(internals.onClick);
+internals.getRoot().browserAction.onClicked.addListener(internals.onClick);
+internals.getRoot().runtime.onConnect.addListener(internals.onConnect);