All Projects → opentok → learning-opentok-node

opentok / learning-opentok-node

Licence: MIT license
A sample app of OpenTok Node Server SDK

Programming Languages

javascript
184084 projects - #8 most used programming language
Pug
443 projects
CSS
56736 projects

Projects that are alternatives of or similar to learning-opentok-node

learning-opentok-php
No description or website provided.
Stars: ✭ 24 (+84.62%)
Mutual labels:  opentok, tokbox
cordova-plugin-opentok
Cordova Plugin for OpenTok - add webrtc video to your iOS or Android App
Stars: ✭ 30 (+130.77%)
Mutual labels:  opentok, tokbox
opentok-elearning-samples
Sample applications highlighting integrations between OpenTok and Learning Management Systems (LMS)
Stars: ✭ 18 (+38.46%)
Mutual labels:  opentok, tokbox
accelerator-textchat-ios
OpenTok Text Chat Accelerator Pack enables text messages between mobile or browser-based devices.
Stars: ✭ 13 (+0%)
Mutual labels:  opentok, tokbox
Opentok-Java-SDK
OpenTok Server SDK for Java
Stars: ✭ 26 (+100%)
Mutual labels:  opentok, tokbox
opentok-rtc
OpenTok demo application
Stars: ✭ 97 (+646.15%)
Mutual labels:  opentok, tokbox
broadcast-sample-app
OpenTok Broadcast Sample Application
Stars: ✭ 48 (+269.23%)
Mutual labels:  opentok, tokbox
accelerator-core-ios
Syntax sugar of OpenTok iOS SDK with Audio/Video communication including screen sharing
Stars: ✭ 30 (+130.77%)
Mutual labels:  opentok, tokbox
accelerator-core-js
Accelerator Core provides a simple way to integrate real-time audio/video into your web application using the OpenTok Platform
Stars: ✭ 24 (+84.62%)
Mutual labels:  opentok, tokbox
opentok-react-native
React Native live video streaming demo app using Open-Tok
Stars: ✭ 36 (+176.92%)
Mutual labels:  opentok
tokbox
Tokbox Server SDK for Google's Go language ("Golang")
Stars: ✭ 15 (+15.38%)
Mutual labels:  tokbox

Simple OpenTok Server App by Node.js

Tokbox is now known as Vonage

This simple server app shows you how to use OpenTok Node Server SDK to create OpenTok sessions, generate tokens for those sessions, archive (or record) sessions, and download those archives.

Quick deploy to Heroku

Heroku is a PaaS (Platform as a Service) that can be used to deploy simple and small applications for free. To easily deploy this repository to Heroku, sign up for a Heroku account and click this button:

Deploy

Heroku will prompt you to add your OpenTok API key and OpenTok API secret, which you can obtain at the TokBox Dashboard.

Requirements

Installing & Running on localhost

  1. Clone the app by running the command

     git clone [email protected]:opentok/learning-opentok-node.git
    
  2. cd to the root directory.

  3. Run npm install command to fetch and install all npm dependecies.

  4. Next, rename the .envcopy file located at the root directory to .env, and enter in your TokBox api key and secret as indicated:

    # enter your TokBox api key after the '=' sign below
    TOKBOX_API_KEY=
    # enter your TokBox secret after the '=' sign below
    TOKBOX_SECRET=
    
  5. Run npm start to start the app.

  6. Visit the URL http://localhost:8080/session in your browser. You should see a JSON response containing the OpenTok API key, session ID, and token.

Exploring the code

The routes/index.js file is the Express routing for the web service. The rest of this tutorial discusses code in this file.

In order to navigate clients to a designated meeting spot, we associate the Session ID to a room name which is easier for people to recognize and pass. For simplicity, we use a local associated array to implement the association where the room name is the key and the Session ID is the value. For production applications, you may want to configure a persistence (such as a database) to achieve this functionality.

Generate/Retrieve a Session ID

The GET /room/:name route associates an OpenTok session with a "room" name. This route handles the passed room name and performs a check to determine whether the app should generate a new session ID or retrieve a session ID from the local in-memory hash. Then, it generates an OpenTok token for that session ID. Once the API key, session ID, and token are ready, it sends a response with the body set to a JSON object containing the information.

if (localStorage[roomName]) {
  // fetch an existing sessionId
  const sessionId = localStorage[roomName]

  // generate token
  token = opentok.generateToken(sessionId);
  res.setHeader('Content-Type', 'application/json');
  res.send({
    "apiKey": apiKey,
    "sessionId": sessionId,
    "token": token
  });
}
else {
  // Create a session that will attempt to transmit streams directly between
  // clients. If clients cannot connect, the session uses the OpenTok TURN server:
  opentok.createSession({mediaMode:"relayed"}, function(err, session) {
    if (err) {
      console.log(err);
      res.status(500).send({error: 'createSession error:', err});
      return;
    }

    // store into local
    localStorage[roomName] = session.sessionId;
    
    // generate token
    token = opentok.generateToken(session.sessionId);
    res.setHeader('Content-Type', 'application/json');
    res.send({
      "apiKey": apiKey,
      "sessionId": session.sessionId,
      "token": token
    });
  });
}

The GET /session routes generates a convenient session for fast establishment of communication.

router.get('/session', function(req, res, next) { 
  res.redirect('/room/session'); 
}); 

Start an Archive

A POST request to the /archive/start route starts an archive recording of an OpenTok session. The session ID OpenTok session is passed in as JSON data in the body of the request

router.post('/archive/start', function(req, res, next) {
  const json = req.body;
  const sessionId = json['sessionId'];
  opentok.startArchive(sessionId, { name: roomName }, function(err, archive) {
    if (err) {
      console.log(err);
      res.status(500).send({error: 'startArchive error:', err});
      return;
    }
    res.setHeader('Content-Type', 'application/json');
    res.send(archive);
  });
});

You can only create an archive for sessions that have at least one client connected. Otherwise, the app will respond with an error.

Stop an Archive

A POST request to the /archive:archiveId/stop route stops an archive recording. The archive ID is returned by call to the archive/start endpoint.

router.post('/archive/:archiveId/stop', function(req, res, next) {
  var archiveId = req.params.archiveId;
  console.log('attempting to stop archive: ' + archiveId);
  opentok.stopArchive(archiveId, function(err, archive) {
    if (err) {
      console.log(err);
      res.status(500).send({error: 'stopArchive error:', err});
      return;
    }
    res.setHeader('Content-Type', 'application/json');
    res.send(archive);
  });
});

View an Archive

A GET request to '/archive/:archiveId/view' redirects the requested clients to a URL where the archive gets played.

router.get('/archive/:archiveId/view', function(req, res, next) {
  var archiveId = req.params.archiveId;
  console.log('attempting to view archive: ' + archiveId);
  opentok.getArchive(archiveId, function(err, archive) {
    if (err) {
      console.log(err);
      res.status(500).send({error: 'viewArchive error:', err});
      return;
    }

    if (archive.status == 'available') {
      res.redirect(archive.url); 
    }
    else {
      res.render('view', { title: 'Archiving Pending' });
    }
  });
});

Get Archive information

A GET request to /archive/:archiveId returns a JSON object that contains all archive properties, including status, url, duration, etc. For more information, see here.

router.get('/archive/:archiveId', function(req, res, next) {
  var sessionId = req.params.sessionId;
  var archiveId = req.params.archiveId;
  
  // fetch archive
  console.log('attempting to fetch archive: ' + archiveId);
  opentok.getArchive(archiveId, function(err, archive) {
    if (err) {
      console.log(err);
      res.status(500).send({error: 'infoArchive error:', err});
      return;
    }

    // extract as a JSON object
    res.setHeader('Content-Type', 'application/json');
    res.send(archive);
  });
});

Fetch multiple Archives

A GET request to /archive with optional count and offset params returns a list of JSON archive objects. For more information, please check here.

Examples:

GET /archive // fetch up to 1000 archive objects
GET /archive?count=10  // fetch the first 10 archive objects
GET /archive?offset=10  // fetch archives but first 10 archive objetcs
GET /archive?count=10&offset=10 // fetch 10 archive objects starting from 11st

More information

This sample app does not provide client-side OpenTok functionality (for connecting to OpenTok sessions and for publishing and subscribing to streams). It is intended to be used with the OpenTok tutorials for Web, iOS, iOS-Swift, or Android:

Development and Contributing

Interested in contributing? We ❤️ pull requests! See the Contribution guidelines.

Getting Help

We love to hear from you so if you have questions, comments or find a bug in the project, let us know! You can either:

Further Reading

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].