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!
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.
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());
});
});
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();
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,
})
Creates a SimplePeerJs instance which delegates signaling to PeerJs and creates simple-peer WebRTC channels.
The following properties can be specified on opts
:
id
: PeerJs id (if absent, peerjs server will assign a free id)simplePeer
:simple-peer
configuration optionswrtc
: custom webrtc implementation, mainly useful in node to specify in the wrtc package. Contains an object with the properties:fetch
: fetch-like function implementationWebSocket
: WebSocket-like implementation
Promise that resolves to the peer id
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.
Closes Signaling connection to PeerJS and all active peer connections.
SimplePeerJs objects are instances of EventEmitter
.
Emitted when a new connection has been created. connection
has a peer
property which is a simple-peer object.
Emitted on every error.
SimplePeerJS is licensed under the MIT License.