Peer.js Groups
Using Peer.js Groups, a web browser on one machine can send encrypted data to (and receive encryped data from) other web browsers spread across the internet without needing to send the data via an intermediate server (in most cases). The data sent and received can be any JavaScript objects (or any other JavaScript values such as strings).
Peer.js Groups is a thin layer of abstraction over the Peer.js library that allows peers to easily find and communicate with other peers that share an interest in a common group ID tag (e.g. a chat room name or a gaming session name).
How Peeer.js Groups Differs from EasyRTC, SimpleRTC, RTCMultiConnection, etc.
Great projects though the others are, I decided to roll my own. This was initially primarily for the benefit of my own learning. But as this project develops I'd like it to stick to a few principles that I've developed, and these principles perhaps distinguish this project from the competition (aside from this project being in the very early experimental stages!).
- A focus on data connections as the first priority rather than audio or video.
- Minimalistic - no extra bells or whistles.
- The API is kept as simple as possible.
- Minimal assumptions about what you want to do with the library.
An example of the last principle is that you are able to implement whatever logic you wish in response to a joinrequest
event.
How it Works
- WebRTC is an API built into modern browsers that allows encrypted, peer-to-peer communication directly between browsers.
- Before a peer can start sending data to another peer, the peers need a way of finding each other and negotiating the creation of a peer-to-peer connection. These are called discovery and signalling respectively. WebRTC doesn't come with built-in discovery or signalling protocol implementations. These usually require a server, but only to set up the initial connection. Once the connection is established then the signalling phase is finished. The server doesn't receive any of the actual messages of the conversation because it's all sent peer-to-peer.
- Peer.js Groups uses a JavaScript library called Peer.js, which provides the signalling protocol. (SIP is another popular alternative.)
- Peer.js enables one peer to instantiate a point-to-point connection with one other peer, provided that it knows the other peer's peer ID in advance. The Peer.js documentation strongly recommends allowing Peer.js to assign each peer an ID randomly (although it does let programmers go against the advice and choose their own peer IDs instead).
- Peer.js Groups uses Peer.js to create a "three-way" (or "four way"...) connection between peers. A "three-way" connection between peers, say A, B and C, is actually implemented as 3 two-way connections (A<->B, A<->C, B<->C). These details are all handled automatically behind the scenes. From the perspective of someone using Peer.js Groups it works like a group chat (except the messages are JavaScript objects).
Software Required
- A modern web browser with support for WebRTC.
- The Peer.js client-side library.
- Peer.js Groups (also client-side).
- A server running the Peer.js server-side code such peerjs.com.
- If you have two peers trying to connect to each other and both are behind separate NATs then you may encounter connection problems, in which case you'll need access to a TURN server.
A TURN server enables a peer A to send an encrypted message to a peer B by first sending the message to the TURN server, and then the TURN server sends it B. The TURN server cannot decrypt the content of the messages. However, many people behind NATs can still communicate with each other without an intermediate TURN server by using something called STUN, which is an extra step at the connection set-up stage, which Peer.js handles automatically.
Server Installation
- Install Node.js.
- Install the Peer.js server using the Terminal/Command Prompt.
npm install peer
- Start the server.
cd node_modules/peer/bin
./peerjs -p 9000
Client-Side Code
See the "Hello World!" demo for a complete example.
- Link to the JavaScript files from your HTML.
<script src="peerjs.min.js"></script>
<script src="peerjs-groups.js"></script>
- Create a
PeerGroup
object.
var group = new PeerGroup(function (error) {
console.error(error);
//TODO Put some better error handling code in here...
}, {host: 'localhost'});
To be continued...