/simple-peerjs

Simple peer-to-peer with WebRTC (simple-peer + PeerJs)

Primary LanguageJavaScript

Simple Peer JS

Simple peer-to-peer with WebRTC.

Basically: simple-peer + PeerJs

This project uses the signal exchange mechanism of PeerJs with the WebRTC implementation of simple-peer.

This works in nodeand the browser

See examples for code examples!

Setup

Include the library

with npm: npm install simple-peerjs and the usage:

const SimplePeerJs = require('simple-peerjs');

Create a peer

const connMan = new SimplePeerJs('pick-an-id');
// You can pick your own id or omit the id if you want to get a random one from the server.

Data Connections

Connect

const conn = await connMan.connect('another-peer-id');

// conn.peer is an instance of simple-peer
conn.peer.send('hi!');

Receive

connMan.on('connect', conn => {
  console.log('Peer connected:', conn.peerId);

  // conn.peer is an instance of simple-peer
  conn.peer.send('hello!');

  conn.peer.on('data', data => {
    console.log(data.toString());
  });
});

Media calls

Passing a stream is similar to simple-peer

const SimplePeerJs = require('simple-peerjs');

async function main() {
  const peer = new SimplePeerJs();

  peer.on('connect', connection => {
    connection.peer.on('stream', stream => {
      // got remote video stream, now let's show it in a video tag
      const video = document.querySelector('video');
      video.srcObject = stream;
      video.play();
    });
  });

  // get peer id
  const peerId = await peer.id;

  // get video/voice stream
  const stream = navigator.mediaDevices.getUserMedia({
    video: true,
    audio: true,
  });

  const initiator = new SimplePeerJs();
  const initiatorConnection = await initiator.connect(peerId, { stream });
}

main();

It also can be done dynamically

const SimplePeerJs = require('simple-peerjs');

async function main() {
  const peer = new SimplePeerJs();

  peer.on('connect', connection => {
    connection.peer.on('stream', stream => {
      // got remote video stream, now let's show it in a video tag
      const video = document.querySelector('video');
      video.srcObject = stream;
      video.play();
    });
  });

  // get peer id
  const peerId = await peer.id;

  const initiator = new SimplePeerJs();
  const initiatorConnection = await initiator.connect(peerId);

  setTimeout(async () => {
    // get video/voice stream
    const stream = navigator.mediaDevices.getUserMedia({
      video: true,
      audio: true,
    });

    initiator.addStream(stream);
  }, 10000);
}

main();

In Node

To use this library in Node, pass in opts.wrtc, opts.fetch and opts.WebSocket as a parameters:

const wrtc = require('wrtc');
const fetch = require('node-fetch');
const WebSocket = require('ws');
const SimplePeerJs = require('simple-peerjs');

const peer = new SimplePeerJs({
  wrtc,
  fetch,
  WebSocket,
})

Api

peer = new SimplePeerJs(opts)

Creates a SimplePeerJs instance which delegates signaling to PeerJs and creates simple-peer WebRTC channels.

The following properties can be specified on opts:

peer.id

Promise that resolves to the peer id

peer.connect(peerId, opts)

Tries to connect to peerId. Returns a promise with an object that has a simple-peer instance on the peer property.

The second parameter, opts, is optional. If passed, it will be used as the simple-peer configuration.

peer.close()

Closes Signaling connection to PeerJS and all active peer connections.

Events

SimplePeerJs objects are instances of EventEmitter.

peer.on('connect', connection)

Emitted when a new connection has been created. connection has a peer property which is a simple-peer object.

peer.on('error', error)

Emitted on every error.

License

SimplePeerJS is licensed under the MIT License.