PeerJS provides a complete, configurable, and easy-to-use peer-to-peer API built on top of WebRTC, supporting both data channels and media streams.
Include the library
with npm:
npm install peerjs
and the usage:
import Peer from 'peerjs';Create a Peer
const peer = new Peer('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 = peer.connect('another-peers-id');
conn.on('open', () => {
  conn.send('hi!');
});Receive
peer.on('connection', (conn) => {
  conn.on('data', (data) => {
    // Will print 'hi!'
    console.log(data);
  });
});Call
navigator.mediaDevices.getUserMedia({video: true, audio: true}, (stream) => {
  const call = peer.call('another-peers-id', stream);
  call.on('stream', (remoteStream) => {
    // Show stream in some <video> element.
  });
}, (err) => {
  console.error('Failed to get local stream', err);
});Answer
peer.on('call', (call) => {
  navigator.mediaDevices.getUserMedia({video: true, audio: true}, (stream) => {
    call.answer(stream); // Answer the call with an A/V stream.
    call.on('stream', (remoteStream) => {
      // Show stream in some <video> element.
    });
  }, (err) => {
    console.error('Failed to get local stream', err);
  });
});npm test|  Firefox |  Chrome |  Safari | 
|---|---|---|
| last 4 versions | last 4 versions | 12.1+ | 
Q. I have a message Critical dependency: the request of a dependency is an expression in browser's console
A. The message occurs when you use PeerJS with Webpack. It is not critical! It relates to Parcel parcel-bundler/parcel#2883 We'll resolve it when updated to Parcel V2.
This project exists thanks to all the people who contribute. [Contribute].
Thank you to all our backers! [Become a backer]
Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [Become a sponsor]
PeerJS is licensed under the MIT License.