decentralized-video-chat/server.js

126 lines
3.7 KiB
JavaScript

require("dotenv").config();
var sslRedirect = require("heroku-ssl-redirect");
var twilio = require("twilio")(
process.env.TWILIO_ACCOUNT_SID,
process.env.TWILIO_AUTH_TOKEN
);
var express = require("express");
var app = express();
var http = require("http").createServer(app);
var io = require("socket.io")(http);
var path = require("path");
var public = path.join(__dirname, "public");
const url = require("url"); // built-in utility
// enable ssl redirect
app.use(sslRedirect());
app.get("/", function (req, res) {
res.sendFile(path.join(public, "landing.html"));
});
app.get("/newroom", function (req, res) {
res.sendFile(path.join(public, "newroom.html"));
});
app.get("/room/", function (req, res) {
res.redirect("/");
});
app.get("/room/*", function (req, res) {
if (Object.keys(req.query).length > 0) {
logIt("redirect:" + req.url + " to " + url.parse(req.url).pathname);
res.redirect(url.parse(req.url).pathname);
} else {
res.sendFile(path.join(public, "chat.html"));
}
});
app.use(express.static("public"));
function logIt(msg, room) {
if (room) {
console.log(room + ": " + msg);
} else {
console.log(msg);
}
}
// When a socket connects, set up the specific listeners we will use.
io.on("connection", function (socket) {
// When a client tries to join a room, only allow them if they are first or
// second in the room. Otherwise it is full.
socket.on("join", function (room) {
logIt("A client joined the room", room);
var clients = io.sockets.adapter.rooms[room];
var numClients = typeof clients !== "undefined" ? clients.length : 0;
if (numClients === 0) {
socket.join(room);
} else if (numClients === 1) {
socket.join(room);
// When the client is second to join the room, both clients are ready.
logIt("Broadcasting ready message", room);
socket.broadcast.to(room).emit("willInitiateCall", room);
socket.emit("ready", room).to(room);
socket.broadcast.to(room).emit("ready", room);
} else {
logIt("room already full", room);
socket.emit("full", room);
}
});
// When receiving the token message, use the Twilio REST API to request an
// token to get ephemeral credentials to use the TURN server.
socket.on("token", function (room) {
logIt("Received token request", room);
twilio.tokens.create(function (err, response) {
if (err) {
logIt(err, room);
} else {
logIt("Token generated. Returning it to the browser client", room);
socket.emit("token", response).to(room);
}
});
});
// Relay candidate messages
socket.on("candidate", function (candidate, room) {
logIt("Received candidate. Broadcasting...", room);
socket.broadcast.to(room).emit("candidate", candidate);
});
// Relay offers
socket.on("offer", function (offer, room) {
logIt("Received offer. Broadcasting...", room);
socket.broadcast.to(room).emit("offer", offer);
});
// Relay answers
socket.on("answer", function (answer, room) {
logIt("Received answer. Broadcasting...", room);
socket.broadcast.to(room).emit("answer", answer);
});
// Relay answers
socket.on("sendCaptions", function (captions, room) {
// logIt(captions, room);
socket.broadcast.to(room).emit("recieveCaptions", captions);
});
// Relay answers
socket.on("requestToggleCaptions", function (room) {
logIt("requesting captions", room);
socket.broadcast.to(room).emit("requestToggleCaptions");
});
// Relay chat messages
socket.on("chat message", function (msg, room) {
socket.broadcast.to(room).emit("chat message", msg);
});
});
var port = process.env.PORT || 3000;
http.listen(port, function () {
console.log("http://localhost:" + port);
});