decentralized-video-chat/server.js

152 lines
4.8 KiB
JavaScript
Raw Normal View History

2020-03-31 02:16:08 +08:00
require("dotenv").config();
var sslRedirect = require("heroku-ssl-redirect");
2020-04-06 23:17:07 +08:00
// Get twillio auth and SID from heroku if deployed, else get from local .env file
var twillioAuthToken =
process.env.HEROKU_AUTH_TOKEN || process.env.LOCAL_AUTH_TOKEN;
var twillioAccountSID =
process.env.HEROKU_TWILLIO_SID || process.env.LOCAL_TWILLIO_SID;
var twilio = require("twilio")(twillioAccountSID, twillioAuthToken);
2020-03-31 02:16:08 +08:00
var express = require("express");
2020-03-22 05:23:46 +08:00
var app = express();
const fs = require('fs');
// var http = require("https").createServer({
// key: fs.readFileSync('/Users/khushjammu/certs/privkey.pem'),
// cert: fs.readFileSync('/Users/khushjammu/certs/cert.pem')
// }, app);
var http = require("http").createServer(app);
2020-03-31 02:16:08 +08:00
var io = require("socket.io")(http);
var path = require("path");
var public = path.join(__dirname, "public");
2020-04-06 12:44:16 +08:00
const url = require("url");
2020-03-22 05:23:46 +08:00
2020-03-26 11:31:26 +08:00
// enable ssl redirect
app.use(sslRedirect());
2020-03-25 12:54:56 +08:00
2020-04-06 12:44:16 +08:00
// Remove trailing slashes in url
2020-04-03 21:48:40 +08:00
app.use(function (req, res, next) {
if (req.path.substr(-1) === "/" && req.path.length > 1) {
let query = req.url.slice(req.path.length);
res.redirect(301, req.path.slice(0, -1) + query);
} else {
next();
}
});
2020-03-31 02:16:08 +08:00
app.get("/", function (req, res) {
res.sendFile(path.join(public, "landing.html"));
2020-03-25 12:54:56 +08:00
});
2020-04-07 06:28:42 +08:00
app.get("/newcall", function (req, res) {
res.sendFile(path.join(public, "newcall.html"));
2020-03-23 01:36:29 +08:00
});
2020-04-05 09:06:07 +08:00
app.get("/join/", function (req, res) {
res.redirect("/");
});
2020-04-05 09:06:07 +08:00
app.get("/join/*", 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"));
}
2020-03-25 07:27:09 +08:00
});
2020-04-06 02:28:50 +08:00
app.get("/notsupported", function (req, res) {
res.sendFile(path.join(public, "notsupported.html"));
});
app.get("/notsupportedios", function (req, res) {
res.sendFile(path.join(public, "notsupportedios.html"));
});
2020-04-06 12:44:16 +08:00
// Serve static files in the public directory
2020-03-31 02:16:08 +08:00
app.use(express.static("public"));
2020-03-25 07:27:09 +08:00
2020-04-06 12:44:16 +08:00
// Simple logging function to add room name
function logIt(msg, room) {
if (room) {
console.log(room + ": " + msg);
} else {
console.log(msg);
}
2020-03-23 00:47:35 +08:00
}
2020-03-23 01:09:22 +08:00
2020-03-22 05:23:46 +08:00
// When a socket connects, set up the specific listeners we will use.
2020-03-31 02:16:08 +08:00
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);
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);
// Existing callers initiates call with user
}
});
} else if (numClients < 3) {
2020-03-31 02:16:08 +08:00
socket.join(room);
logIt("Connected clients", room)
for (var clientId in clients.sockets) {
logIt('ID: ' + clientId, room);
}
// When the client is not the first to join the room, all clients are ready.
2020-03-31 02:16:08 +08:00
logIt("Broadcasting ready message", room);
socket.broadcast.to(room).emit("willInitiateCall", socket.id, room);
// socket.emit("uuid", socket.id);
2020-03-31 02:16:08 +08:00
socket.emit("ready", room).to(room);
socket.broadcast.to(room).emit("ready", room);
} else {
logIt("room already full with " + numClients + " people in the room.", room);
2020-03-31 02:16:08 +08:00
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, uuid) {
2020-03-31 02:16:08 +08:00
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, uuid);
2020-03-31 02:16:08 +08:00
}
2020-03-23 00:47:35 +08:00
});
2020-03-31 02:16:08 +08:00
});
// Relay candidate messages
socket.on("candidate", function (candidate, room, uuid) {
2020-03-31 02:16:08 +08:00
logIt("Received candidate. Broadcasting...", room);
io.to(uuid).emit("candidate", candidate, socket.id);
2020-03-31 02:16:08 +08:00
});
// Relay offers
socket.on("offer", function (offer, room, uuid) {
logIt("Received offer from " + socket.id + " and emitting to " + uuid, room);
io.to(uuid).emit("offer", offer, socket.id);
2020-03-31 02:16:08 +08:00
});
// Relay answers
socket.on("answer", function (answer, room, uuid) {
logIt("Received answer from " + socket.id + " and emitting to " + uuid, room);
io.to(uuid).emit("answer", answer, socket.id);
2020-03-31 02:16:08 +08:00
});
2020-03-22 05:23:46 +08:00
});
2020-04-06 12:44:16 +08:00
// Listen for Heroku port, otherwise just use 3000
var port = process.env.PORT || 3000;
2020-03-24 08:26:28 +08:00
http.listen(port, function () {
2020-03-31 02:16:08 +08:00
console.log("http://localhost:" + port);
2020-03-22 05:23:46 +08:00
});