NodeJS Simple Conference Host
The Red5 Pro Conference Host is another mock NodeJS example of a WebSocket server for conferencing. It can be used with the Conference Examples from the Red5 Pro Testbed.
You can specify the endpoint for this server when using the Conference Examples using the
socket
query parameter, e.g., http://localhost:5080/webrtcexamples/test/conference/socket=localhost:8001. This is also defined in the index.js file:var socketEndpoint = window.query('socket') || 'localhost:8001'
Upon connection to the socket with the required parameters, connections are registered and all parties associated with the defined room are notified on previously existing connections. Likewise, when connections are closed, all parties associated with the defined room are notified.
Requirements
- NodeJS v10+
- NPM 6+
curl -sL https://deb.nodesource.com/setup_12.x -o nodesource_setup.sh
sudo bash nodesource_setup.sh
sudo apt-get install -y nodejs
sudo apt-get install build-essential
sudo npm install forever -g
The project was developed with the latest NodeJS & NPM as of the time of this writing (April 15th, 2021).
Installation
Grab the project: git clone https://github.com/red5pro/red5pro-conference-host
From the root of the repo, run npm install
SSL
For most NodeJS implementations, it is necessary to generate SSL certificate files, which are converted into .crt and .key files to be stored in the <service>/cert
folder.
Using Let’s Encrypt
The following can be run to install Let’s Encrypt Certbot on Ubuntu (snap
is included with most Ubuntu distributions by default)
- sudo snap install core; sudo snap refresh core
- sudo snap install –classic certbot
- sudo ln -s /snap/bin/certbot /usr/bin/certbot
To generate the cert, run sudo certbot certonly --standalone --email <your-email> --agree-tos -d <server-fqdn>
(for example: sudo certbot certonly --standalone --email jessica@infrared5.com --agree-tos -d test01.red5.net
)
You will then need to copy the fullchain and privatekey to the cert directory of your application
sudo cp /etc/letsencrypt/archive/<server-fqdn>/fullchain1.pem ~/<nodejs-server>/cert/certificate.crt
sudo cp /etc/letsencrypt/archive/<server-fqdn>/privkey1.pem ~/<nodejs-server>/cert/privateKey.key
sudo chmod +r ~/<nodejs-server>/cert/*
(note: the number will increment as you renew, i.e., fullchain1.pem –> fullchain2.pem, etc.
Your index.js file then needs to be modified with the full path to the certificate and privateKey files (replace with the appropriate paths):
if (useSSL) {
cert = fs.readFileSync('/home/ubuntu/serverapp/cert/certificate.crt')
key = fs.readFileSync('/home/ubuntu/serverapp/cert/privateKey.key')
port = 443
Usage
forever start index.js
to view the log location and status of the running process, run forever list
Running the above will start the server on the default port which is defined in index.js
Alternatively:
PORT=3000 node index.js
Running the above will start the server on the defined port
3000
Conference Clients
Parameters
Any connecting clients should provide the following query parameters in the URL when establishing a WebSocket
:
room
: the name of the room to join.streamName
: the name of the stream the joining participant will be broadcasting with.
Payloads
Upon any successful connection, each client associated with a room
will be notified of an updated in-memory list of every streamName
.
It is important to note that this list will be reflective of all streams which are currently “active” in the room. It will grow as more client connections are made and shrink as client connections are closed.
Each client will be notified of the object with the associated room
and a streams
list of a JSON Array
listing of each streamName
. Each streamName
is a String
.
Example
{
room: 'room1',
streams: ['stream1', 'stream2', 'stream3']
}