Who can use this signaling server?
This is a simple signaling server designed specially for SimpleWebRTC. It simply passes the data between the two parties and can be used with other webrtc solutions if modified. If your use case is specific and complex I recommend you to try other signaling servers.
What is a signaling server?
Signaling plays an important role in the overall flow of webRTC. It basically performs the role of connecting to the other user. Rest of the communication will be handled by webRTC.
Setup Signaling Server project
- git clone https://github.com/SimpleWebRTC/signalmaster.git
- npm install
- sudo apt install nginx
- sudo npm i -g pm2
Get a SSL Certificate
To establish a secure connection you need to get a ssl certificate. Letsencrypt is a free certificate provider. These commands would work for ubuntu with nginx
$ sudo apt-get update
$ sudo apt-get install software-properties-common
$ sudo apt-get install certbot python-certbot-nginx
$ sudo add-apt-repository ppa:certbot/certbot
$ sudo apt-get update
$ sudo apt-get install certbot python-certbot-nginx
$ sudo certbot --nginx
Enter your domain and chose to redirect http requests to https
Configure signaling server
Configure the file config/production.json for production configurations and config/development.json for development environment. Given below is a sample configuration for production. You can replace <domain>
with your domain.
{
"isDev": true,
"server": {
"port": 8888,
"/* secure */": "/* whether this connects via https */",
"secure": true,
"key": "/etc/letsencrypt/live/<domain>/privkey.pem",
"cert": "/etc/letsencrypt/live/<domain>/fullchain.pem",
"password": null
},
"rooms": {
"/* maxClients */": "/* maximum number of clients per room. 0 = no limit */",
"maxClients": 20
},
"stunservers": [
{
"urls": "stun:stun.l.google.com:19302"
}
],
"turnservers": [
{
"urls": ["turn:<turn-server-ip>:443"],
"secret": "<turn-server-secret-key>",
"expiry": 86400
}
]
}
Configure Nginx
The server runs on port 888
and you need to proxy the https requests to the port. Add the following to the https server configurations in nginx
location / {
proxy_pass https://localhost:8888;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_cache_bypass $http_upgrade;
}
Fix sockets.js
Since this project was made up using an old version of socket.io you might encounter an error
Missing error handler on socket.
TypeError: io.sockets.clients is not a function
To fix this replace the function clientsInRoom
in sockets.js with the below code.
function clientsInRoom(name) {
var clientsCount = 0;
for (var socketId in io.nsps["/"].adapter.rooms[name] || {}) {
clientsCount++;
}
return clientsCount;
}
Final Steps
Restart the nginx service
$ sudo service nginx restart
Start the server and keep it running with
$ pm2 start server.js
You should see a line saying signal master is running at: http://localhost:8888
Test
To make sure that it is working correctly you can try visiting https://<your-domain>/socket.io/
and you should get {"code":0,"message":"Transport unknown"}
as the result
Leave a Comment