Building the Open-Source Conferencing App for Javascript
Estimated reading time: 17 minutesIn this part, we will explore the Javascript Conferencing app.
Let’s get started.
Prerequisites
Before we dive into running a fully featured Conference app for Javascript, ensure that you go through the following
-
Must read the first part of this tutorial and Prerequisites mentioned there.
-
Gone through the Quick Start with Mesibo Conferencing API - Javascript and have a basic familiarity with mesibo conferencing APIs. .
-
A webserver with HTTPS support to host the Web App.
Before we get into the code, we recommend that you build the app and try it out, to have a feel of how the app works. This is a basic conferencing app with all the essential features. You can easily refer to the source code and the documentation, to modify it to your needs.
Hosting the App
Running the web app is as simple as:
- Open the folder web/live-demo
- Serve this folder securely(*requires HTTPS)
- Open
index.html
in your web browser - That’s it! You should now see the login page
Running the App
Let us first run the app and do a brief walkthrough of the various features in the app. Once you are familiar with the various conferencing operations, we will get into the code walkthrough.
-
The first step is to Log-in using your email. Enter your name and email address. You’ll quickly receive a verification code. Enter it and you are in!
-
Once you have logged in, you can join a conference. If you have the room-id and PIN of a certain room, you can join an existing room by entering them. You can also Create a Room to hold a conference and invite others. To do this, select the Create Room option. Provide a room name and click Create Room. A room will be created and you will now start publishing your video.
-
To Invite other participants to the room, share the room credentials. Every room will have a group-id and pin. You can copy the invite text- containing the room-id and pin and share it with the participants who you want to join the room!
-
Any participant can now join the room by entering the room-id and the PIN. Once, they enter the room they will start publishing their stream and everyone in the room can view them.
-
You can also see your room history by clicking on the My Rooms button. It will display a list of all rooms that you are part of. Click on a room to quickly enter it without entering the PIN.
-
You can also mute participants, mute your own audio or video, chat with each participant and group, send media and files in chat, share your screen, etc. For per participant controls tap or click on their video. Control buttons will be visible. For your self stream controls, use the buttons at the bottom of the screen.
Source Code Walkthrough
There are two major components in this app:
-
Javascript Conferencing APIs, these APIs are used by your app for initiating a group call, publishing streams, subscribing to streams, etc. You can learn more about using the conferencing and streaming API in Quick Start with Mesibo Conferencing API - Javascript.
-
Administrative APIs, These are not the mesibo APIs but they are private APIs for the demo. You need to host them on your server to perform various administrative tasks such as log-in, creating a room, entering a room, etc. Your app connects to your server using these APIs. In turn, your server invokes the mesibo Group & User Management APIs internally to perform the required operation. For example, when you want to create a room, your server will create a mesibo group. When you want to join a room, your server will add you as a member to the mesibo group. After your user logs in, your server will create a mesibo user and generate an access token. We will learn more about this in the section Setting up the Admin API
Refer to the image below which demonstrates how the admin APIs work through your server and uses the mesibo group/user management APIs.
We will now go through the Javascript conferencing app source to learn how various conferencing features are implemented.
Log-in
The first step in the app is to authenticate the user and generate a mesibo access token for that user. Note that, mesibo is independent of the authentication and does not provide any APIs for implementing authentication. You need to implement your login method and then proceed to generate an access token on successful authentication.
In this demo app, we will be using an email-based login as an example. We will send an OTP to the user’s email. If the user enters that OTP, then they will be able to enter the demo. We make use of an Admin API called login
on the server end, to achieve this. Refer to the section on Setting up the Admin API- Log-in to learn more.
Using the login
REST API is a two-step process.
-
Pass the
appid
,name
, andemail
as parameters and invoke the REST API. -
An OTP will be sent to the email by the server. The user needs to enter this OTP. Invoke the REST API, with the parameter
code
containing the OTP. The server will now validate the OTP and email combination. If successful, it will send a mesibo access token in response.
Invoke the login REST API as follows. Refer to the source code in login.js.
...
sendRequest(MESIBO_API_BACKEND, loginCallback, 'op=login&appid=' + appid + '&email=' + email + '&name=' + name + '&code=' + code);
...
If login is successful, your server will generate an access token using mesibo User Management API and send it to you in the response. You need to use this access token later while initializing the mesibo real-time API. Refer to the example source code in login.js to learn more.
function loginCallback(r) {
...
var resp = JSON.parse(r);
var token = resp['token'];
if (resp.result == 'OK') {
...
if (isValidString(token)) {
...
// Store token
_storeLoginCredentials(resp);
}
...
}
Creating a Room
To create a room, you need to create a mesibo group. Since the client app can’t directly create a mesibo group (as it requires the secret app token), it will request Admin API to create a group.
The client invokes the setgroup
REST API with the mesibo access token
(that you generated in the login step), room name
, room resolution
as parameters. When this Admin API is called on your server, it will create a group using mesibo Group Management API. You can learn more about this in the section Setting up the Admin API- Create a Room
Refer to the source code here
var request = 'token=' + room.token + '&op=setgroup&name=' + room.name + '&resolution=' + room.quality + '&captcha=' + token;
sendRequest(MESIBO_API_BACKEND, createRoomCallback, request);
The admin API will also generate PINs for the room and will store them in a database so that it can authenticate users wanting to join the room. A user needs to enter a PIN to join a room with a certain room-id.
Every mesibo group will have a group-id
. The app will be receiving the group-id
, in the response(in the field gid
) after calling setgroup
. We will be using this group-id to join the group call.
Pin Management
The admin API will randomly generate two numbers for each room, which can be used as a pin
to enter a room.
- pin, To be shared with users who need to be active participants in the room. They will be able to make voice and video calls at the conference.
- spin, Subscriber-only pin. To be shared with users who can only silently participate in the conference. They will not be able to make a call, but will only be able to view others.
If a room is created successfully using setgroup
, you will receive the room pin
and spin
in the response. See login.js
function createRoomCallback(r) {
var resp = JSON.parse(r);
if ('OK' == resp.result) {
var rv = _storeRoomCredentials(resp);
...
}
...
}
Refer to the function _storeRoomCredentials.
Share the room-id and room-pin(either pin
for active participants or spin
for subscriber-only participants) with other users who you want to join the conference. Refer to the source code here to see how the invite text is generated in the app.
Joining a room
To join a room, you need to use the mesibo real-time conferencing APIs. However, before the user can use real-time APIs, the user must be a member of the group. Hence, the user first needs to request admin APIs to join a room using the room-id and the PIN. If they match, the admin API will add the user as a member of the group using mesibo group management APIs.
Refer to login.js
var request = 'token=' + room.token + '&op=joingroup&gid=' + room.gid + '&pin=' + room.pin + '&captcha=' + token;
sendRequest(MESIBO_API_BACKEND, enterRoomCallback, request);
If joingroup
is successful, you can enter the room and start the group call. See login.js.
function openRoom(groupid) {
if (!isValid(groupid) || groupid <= 0)
return -1;
var room_page = isMobileDetected() ? 'mobile.html' : 'index.html';
window.open(room_page + '?room=' + groupid, '_self');
}
Once the user is added to the group, the next step is to use the real-Time APIs to join the Group Call
Using the Real-Time API to join the Group Call
Once, you successfully create a room or enter a room, we will display the group call screen.
Refer to controller.js
Starting the Group Call
Once the fragment is loaded, we create a group call object and join the call. The app then starts publishing your stream, if you have permission to publish.
$scope.live = $scope.mesibo.groupCall($scope, $scope.room.gid);
$scope.live.join($scope);
if (!isValid($scope.room.publish) || $scope.room.publish != 1) {
toastr.error('You do not have the permission to publish');
}
else {
if($scope.room){
var init_audio = $scope.room.init.audio;
var init_video = $scope.room.init.video;
}
$scope.publisher = $scope.live.createPublisher(0);
$scope.publisher.setVideoSource(MESIBOCALL_VIDEOSOURCE_CAMERADEFAULT);
$scope.publisher.call();
}
Viewing Others
Your app needs to implement the GroupCallListener so that it can notify you when other participant joins and leaves the room by calling MesiboGroupcall_OnPublisher
. It also notifies you when a participant subscribes to your video or voice streams through MesiboGroupcall_OnSubscriber
.
In this app, we have implemented GroupCallListener in controller.js.
When someone joins the room and starts publishing, you will receive their Participant object through MesiboGroupCall_OnPublisher.
$scope.MesiboGroupcall_OnPublisher = function(p, joined) {
...
$scope.subscribe(p, true, true);
...
};
Using this Participant object, you can subscribe to them and view them. Refer to the documentation on subscribing to streams to learn more.
While subscribing to a stream, you also need to implement the GroupCallInProgressListener and pass it to the call
method which informs you of various participant events so that you can easily update your App UI or take necessary action, such as,
-
When you make a call using the
call
method and you are connected, MesiboGroupcall_OnConnected will be called. -
Once you are connected, you will be notified when you receive the video stream through the listener MesiboGroupcall_OnVideo
- When a publisher mutes audio or video, you will be notified through MesiboGroupcall_OnMute
- When a publisher starts talking, MesiboGroupcall_OnTalking will be called (Talk Detection).
- When a publisher leaves the conference, MesiboGroupcall_OnHangup will be called
Displaying Streams
You need to use MesiboVideoView
to display self or other participant’s video. You can use MesiboVideoView
in your layout to display videos as you like.
When you receive the video stream from a participant MesiboGroupcall_OnVideo will be called. You can then use, setVideoView to display them.
Refer to the documentation Display Streams to learn more.
Conferencing Operations
We will now look at some of the common operations in conferencing such as muting a stream, sharing screen, talk detection, playing sound, hanging up, etc and the APIs used to implement it in the App.
Handling Mute
MesiboGroupcall_OnMute is called when the publisher mutes audio or video.
$scope.MesiboGroupcall_OnMute = function(p, audioMuted, videoMuted, remote) {
if(remote){
// Remote participant has muted
}
// Check mute status
if(audioMuted){
// Audio Muted
}
if(videoMuted){
// Video Muted
}
};
You can toggle the audio using toggleAudioMute and toggle the video using toggleVideoMute.
To learn more about handling mute refer to the documentation Muting Audio or Video.
Talk Detection
MesiboGroupcall_OnTalking is called when the participant starts or stops talking.
GroupCallInProgressListener.prototype.MesiboGroupcall_OnTalking = function(participant, talking) {
if(talking){
// If talking is true, participant started talking
// if it is false, participant stopped talking
// Handle talking. For example, Show a talking icon
}
}
Refer to the documentation about Talk Detection to learn more.
Screen Sharing
To start sharing the screen, set the video source of the local publisher to MESIBOCALL_VIDEOSOURCE_SCREEN
.
Refer to the source code in controller.js for an example where we change the video source.
$scope.getLocalScreen = function(screen_id){
if(!isValid(screen_id) || screen_id <= 0)
return null
var screen = null;
for (var i = $scope.local_screens.length - 1; i >= 0; i--) {
screen = $scope.local_screens[i];
if(screen.getType() === screen_id)
return screen;
}
//No existing screen with that id, create & return a new one
screen = $scope.live.createPublisher(screen_id);
screen.setVideoSource(MESIBOCALL_VIDEOSOURCE_SCREEN);
if(!screen)
return null;
$scope.local_screens.push(screen);
return screen;
}
If you wish you can create multiple publishers and set different video sources for each publisher. You will then be able to simultaneously share the screen and camera. Refer to the documentation on Set the Video Source to learn more.
Play Sound
For example, in this app, we are playing a sound whenever a new participant joins the room. (When MesiboGroupcall_OnPublisher is called).
Group Chat and One-to-One chat
Refer to showPopupChat
In this app, we have made use of the web popup chat app to display chat popups for group and one-to-one chat.
Hanging Up
Whenever a publisher hangs up, MesiboGroupcall_OnHangup will be called.
To, stop viewing a participant you need to call hangup on their participant object.
participant.hangup();
Refer to the documentation on Handling Hang Up to learn more.
Leaving the Room
To leave the room, call the leave
method on the group call object.
$scope.live.leave();
In this app, we call leave when the exit button is pressed.
Conclusion
In the next part, we will get into setting up your server that contains the REST APIs you are using in this app.
open, source, zoom, javascript, web, conferencing