WebRTC For Node.js and Electron ( with WebSocket)
- Lightweight
- No need to deal with WebRTC stack!
- Small binary sizes (~8MB for Linux x64)
- Type infos for Typescript
- Integrated WebSocket Client & Server Implementation
This project is Node.js bindings for libdatachannel library.
Install
npm install node-datachannel
Supported Platforms
node-datachannel targets N-API version 8 and supports Node.js v18.20 and above (including Node.js 20, 22, and 24+). Prebuilt binaries are distributed automatically via platform-specific npm packages (optionalDependencies).
| Architecture | Linux (glibc) | Linux (musl / Alpine) | macOS (Apple Silicon / Intel) | Windows | Android (Termux / Bionic) |
|---|---|---|---|---|---|
| x64 | @node-datachannel/linux-x64-gnu |
@node-datachannel/linux-x64-musl |
@node-datachannel/darwin-x64 |
@node-datachannel/win32-x64-msvc |
- |
| arm64 | @node-datachannel/linux-arm64-gnu |
@node-datachannel/linux-arm64-musl |
@node-datachannel/darwin-arm64 |
@node-datachannel/win32-arm64-msvc |
@node-datachannel/android-arm64 |
Electron
node-datachannel supports Electron.
Please check electron demo
WebRTC Polyfills
WebRTC polyfills to be used for libraries like simple-peer.
Please check here for more
web-platform-tests
Please check actual situation here
WebSocket Client & Server
Integrated WebSocket Client & Server is available, which can be used separately or for signaling.
For an example usage, check here
Example Usage
import nodeDataChannel from 'node-datachannel';
// Log Level
nodeDataChannel.initLogger('Debug');
// Integrated WebSocket available and can be used for signaling etc
// const ws = new nodeDataChannel.WebSocket();
let dc1 = null;
let dc2 = null;
let peer1 = new nodeDataChannel.PeerConnection('Peer1', {
iceServers: ['stun:stun.l.google.com:19302'],
});
peer1.onLocalDescription((sdp, type) => {
peer2.setRemoteDescription(sdp, type);
});
peer1.onLocalCandidate((candidate, mid) => {
peer2.addRemoteCandidate(candidate, mid);
});
let peer2 = new nodeDataChannel.PeerConnection('Peer2', {
iceServers: ['stun:stun.l.google.com:19302'],
});
peer2.onLocalDescription((sdp, type) => {
peer1.setRemoteDescription(sdp, type);
});
peer2.onLocalCandidate((candidate, mid) => {
peer1.addRemoteCandidate(candidate, mid);
});
peer2.onDataChannel((dc) => {
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);
});
Examples
Please check examples folder
Test
npm run test # Unit tests
node test/connectivity.js # Connectivity
Build
Please check here
API Docs
Please check docs page
Contributing
Contributions are welcome!
Thanks
Thanks to Streamr for supporting this project by being a Sponsor!