Simple-peer-wrapper provides a server and peer client for simple-peer-server and simple-peer. It is meant to be used with simple-peer-server as the signaling server.
WebRTC peer connections are an excellent tool for building synchronous drawing, dancing, text, or video applications.
Simple-peer is an great library for creating WebRTC peer connections, however, it does not include a signaling server, which is responsible for creating the initial connections between peers.
Simple-peer-wrapper wraps simple-peer together with a Socket.IO client that communicates with a signaling server. Simple-peer-wrapper handles the signaling and the creation of the peer connection, then exposes the peer connection to be used in your client code.
Simple-peer-server and simple-peer-wrapper together provide a signaling server and client that establish a connection between two or more peers.
They use Socket.IO to transport the signaling messages, then create the peer connections via simple-peer.
If you are launching your application on the public internet, you will likely need STUN and TURN servers as well. About 86% of connections can be created with just STUN servers, but the remaining connections require TURN servers.
Default STUN servers are provided by simple-peer. Although they can be overwritten (see documentation on this below). TURN servers can be expensive to maintain and need to be provided by the application developer (that's probably you if you're reading this ;).
To learn more about signaling, STUN, and TURN servers, I recommend this article by Sam Dutton. If you are in need of a TURN server, you may find this article on How to set up and configure your own TURN server using Coturn by Gabriel Turner helpful. You could also check out paid services like Twilio's Network Traversal Service.
Once you have your TURN servers setup, see the documentation below for how to add them to your peer connections.
You must first include this package in your client-side code. You can do this one of two ways.
Option 1: Install the package using npm or your favorite package manager. Then require the package in your app.
# in your terminal
npm install simple-peer-wrapper
// in your client code
const SimplePeerWrapper = require('simple-peer-wrapper');
Option 2: Include the simple-peer-wrapper.min.js as a standalone script in a <script>
tag. This exports a SimplePeerWrapper constructor on the window. (Find simple-peer-wrapper.min.js in /dist directory of this repository.)
<script src="simple-peer-wrapper.min.js"></script>
You can now create an instance of simple-peer-wrapper. This will create a socket connection to your signaling server.
Important! You must include your signaling server's url when you create an instance of simple-peer-wrapper.
// in your client code
const options = {
serverUrl: 'http://localhost:8081',
};
const spw = new SimplePeerWrapper(options);
Calling the connect()
method initiates the peer connection via the socket connection and simple-peer.
spw.connect();
Now that you have a connection, you need to tell your program what you want to do with the information you are receiving from your peer(s). See the API documentation on the available options. Here's an example of receiving mouse data over the peer connection.
// in your client code
// a global variable to hold data
let partnerMouse;
// when we receive data, call the gotData function
spw.on('data', gotData);
// this runs each time data is received
// the incoming data is passed into the function
function gotData(data) {
// put the incoming data somewhere to use later
partnerMouse = data.data;
}
You could also write the same thing like this:
spw.on('data', (data) => {
partnerMouse = data.data;
});
Remember to hang up when you've finished your call!
// in your client code
// this runs whenever you close or refresh your browser window
window.onbeforeunload = () => {
spw.close();
};
Creates a new socket connection to the signaling server. You must have a signaling server running for this to work. See simple-peer-server for more info.
You must provide the serverUrl for a successful connection. Other parameters are optional, as follows:
{
serverUrl: 'http://localhost:8081', // required
debug: true, // optional
simplePeerOptions: {}, // optional
}
The options are as follows:
serverUrl
the serverUrl of the signaling server you wish to connect to. This is required for a successful connection.
debug
turns on additional logging. Defaults to false.
simplePeerOptions
exposes the options available when creating a new WebRTC peer connection via simple-peer. See simple-peer documentation for more info.
Note! This library sets the peer connections's initiator
and stream
options automatically. Overriding them with simplePeerOptions could break your application.
If you'd like to add your own STUN/TURN servers you can do so with simplePeerOptions as follows:
simplePeerOptions: {
config: {
iceServers: [
{
'urls': 'stun:stun.l.google.com:19302'
},
{
'urls': 'turn:192.158.29.39:3478?transport=udp',
'credential': 'JZEOEt2V3Qb0y27GRntt2u2PAYA=',
'username': '28224511:1379330808'
},
{
'urls': 'turn:192.158.29.39:3478?transport=tcp',
'credential': 'JZEOEt2V3Qb0y27GRntt2u2PAYA=',
'username': '28224511:1379330808'
}
]
},
},
simplePeerOptions
can also be provided on the server side via simple-peer-server. Any simple-peer options provided by the server will override the default options in simple-peer AND any options provided via simple-peer-wrapper client.
Creates a peer connection between the client and all other parties connected to the signaling server. Each connection is one-to-one, creating a mesh topology.
Returns true
or false
. Denotes whether a peer connection has been established or not.
Sends data over the peer's data connection. The sender's ID is sent with the data. This is useful if identifying data arriving from multiple connected peers.
Called when the peer connection is created.
Called when a data message is received from a remote peer via the data channel. data
is an object containing data.id
, the unique identifier of the remote peer, and data.data
, the data sent by the remote peer.
Received a video stream from remote peer. It can be displayed as follows:
spw.on('stream', (stream) => {
const video = document.querySelector('video');
if ('srcObject' in video) {
video.srcObject = stream;
} else {
video.src = window.URL.createObjectURL(stream);
}
video.play();
});
Called when the peer connection has closed.
Called when an error occurs.
Terminates the peer connection(s).
All of the current examples are written using p5.js, a JavaScript library for creative coding.
To run the examples, you must first run a simple-peer-server.
Make sure you enter your serverUrl in the example code.
// in sketch.js
const options = {
serverUrl: 'http://localhost:8081',
};
const spw = new SimplePeerWrapper(options);
You will then need to run an http server in this project's folder. If this is new to you, either http-server or live-server are good options.
# in your terminal, navigate into project folder
cd simple-peer-wrapper
# run the http server of your choice
live-server
In your browser, navigate to your localhost at the port specified by your http server. This will usually look something like http://localhost:8080
.
Go to the examples folder http://localhost:8080/examples
and open the example you wish to view from there. You will need to open two instances of the example to create a peer connection.
In the browser console you will see "SIMPLE PEER IS CONNECTED"
when you have made a connection.
Have fun!