]> git.r.bdr.sh - rbdr/junction/blobdiff - extension/junction.js
Ensure connections are closed
[rbdr/junction] / extension / junction.js
index e78a02bc0755301ca59def111a7a84050b265467..1d5f8a50b26c5ef8546f43245ba771862fac0aa2 100644 (file)
@@ -1,18 +1,19 @@
 const internals = {
-
-  promisesSupported: !!(window.browser),
-  isInCallState: false,
+  promisesSupported: !!window.browser,
+  injectedScript: {},
+  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",
+    },
   },
 
   onClick() {
@@ -20,68 +21,102 @@ const internals = {
       return internals.hangUp();
     }
 
-    return internals.joinAudioCall();
+    return internals.initializeContentScript();
   },
 
-  async joinAudioCall() {
-
-    internals.isInCallState = true;
-    internals.setIcon('hangUp');
-    const activeTabs = await internals.getActiveTabs();
+  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() {
+  onMessage(message) {
+    if (message.action === "error") {
+      internals.getRoot().browserAction.setBadgeText({ text: "x" }, () => {});
+    }
+  },
 
-    document.querySelectorAll('audio').forEach((audioElement) => audioElement.remove());
-    internals.setIcon('call');
-    internals.isInCallState = false;
+  onDisconnect() {
+    internals.getRoot().browserAction.setBadgeText({ text: "" }, () => {});
+    internals.setIcon("call");
+    internals.currentUrl = null;
+    internals.port = null;
+    internals.getRoot().browserAction.enable();
   },
 
-  createAudioElement(source, type = 'audio/wav') {
+  async initializeContentScript() {
+    internals.getRoot().browserAction.disable();
+    const activeTabs = await internals.getActiveTabs();
 
-    const audioElement = document.createElement('audio');
-    audioElement.src = source;
-    audioElement.autoplay = 'autoplay';
-    audioElement.type = type;
-    document.querySelector('body').appendChild(audioElement);
+    internals.currentUrl = activeTabs[0].url;
+    const id = activeTabs[0].id;
+    if (!internals.injectedScript[id]) {
+      const execution = await internals.getRoot().tabs.executeScript(
+        activeTabs[0].id,
+        {
+          file: "/build/content_script.js",
+        },
+        () => {
+          internals.injectedScript[id] = true;
+        },
+      );
+
+      if (execution && !execution[0]) {
+        internals.onDisconnect();
+      }
+    } else {
+      internals.getRoot().tabs.connect(activeTabs[0].id);
+    }
+  },
+
+  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);
       });
     });
@@ -89,3 +124,4 @@ const internals = {
 };
 
 internals.getRoot().browserAction.onClicked.addListener(internals.onClick);
+internals.getRoot().runtime.onConnect.addListener(internals.onConnect);