aboutsummaryrefslogtreecommitdiff
path: root/extension/content_script.js
blob: 0c7012b7939c8f34fa6e2c0414f12fc3fee597f6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
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;