/node-datachannel

Easy to use WebRTC data channels and media transport. libdatachannel node bindings.

Primary LanguageC++Mozilla Public License 2.0MPL-2.0

Easy to use WebRTC data channels and media transport

Linux CI Build Windows CI Build Mac x64 CI Build Mac M1 CI Build

  • Easy to use
  • Lightweight
    • No need to deal with WebRTC stack!
    • Small binary sizes
  • Type infos for Typescript

This project is NodeJS bindings for libdatachannel library.

Please check libdatachannel for Compatibility & WebRTC details.

Install

npm install node-datachannel

Supported Platforms

Linux-x64 Linux-armv7 Linux-arm64(1) Windows-x86 Windows-x64 Mac (M1 + x64)
Node V10 + + + + + +
Node V11 + + + + + +
Node V12 + + + + + +
Node V13 + + + + + +
Node V14 + + + + + +
Node V15 + + + + + +
Node V16 + + + + + +
Node V17 + + + + + +
Node V18 + + + + + +
Node V19 + + + + + +
Node V20 + + + + + +
  1. Please note that; For Linux-arm64 platform we need OpenSSL to be installed locally.

Example Usage

const nodeDataChannel = require('node-datachannel');

// Log Level
nodeDataChannel.initLogger("Debug");

let dc1 = null;
let dc2 = null;

let peer1 = new nodeDataChannel.PeerConnection("Peer1", { iceServers: ["stun:stun.l.google.com:19302"] });

// Set Callbacks
peer1.onLocalDescription((sdp, type) => {
    console.log("Peer1 SDP:", sdp, " Type:", type);
    peer2.setRemoteDescription(sdp, type);
});
peer1.onLocalCandidate((candidate, mid) => {
    console.log("Peer1 Candidate:", candidate);
    peer2.addRemoteCandidate(candidate, mid);
});

let peer2 = new nodeDataChannel.PeerConnection("Peer2", { iceServers: ["stun:stun.l.google.com:19302"] });

// Set Callbacks
peer2.onLocalDescription((sdp, type) => {
    console.log("Peer2 SDP:", sdp, " Type:", type);
    peer1.setRemoteDescription(sdp, type);
});
peer2.onLocalCandidate((candidate, mid) => {
    console.log("Peer2 Candidate:", candidate);
    peer1.addRemoteCandidate(candidate, mid);
});
peer2.onDataChannel((dc) => {
    console.log("Peer2 Got DataChannel: ", dc.getLabel());
    dc2 = dc;
    dc2.onMessage((msg) => {
        console.log('Peer2 Received Msg:', msg);
    });
    dc2.sendMessage("Hello From Peer2");
});

dc1 = peer1.createDataChannel("test");

dc1.onOpen(() => {
    dc1.sendMessage("Hello from Peer1");
});

dc1.onMessage((msg) => {
    console.log('Peer1 Received Msg:', msg);
});

setTimeout(() => {
    dc1.close();
    dc2.close();
    peer1.close();
    peer2.close();
    nodeDataChannel.cleanup();
}, 10 * 1000);

Test

npm run test                  # Unit tests
node test/connectivity.js     # Connectivity

Build

Please check here

Examples

Please check examples folder

API Docs

Please check docs page

Thanks

Thanks to Streamr for supporting this project by being a Sponsor!