@bcjordan/node-datachannel
Version:
libdatachannel node bindings
115 lines (97 loc) • 3.42 kB
JavaScript
/* eslint-disable @typescript-eslint/no-var-requires */
const nodeDataChannel = require('../../lib/index');
const WebSocket = require('ws');
const readline = require('readline');
// Init Logger
nodeDataChannel.initLogger('Error');
// PeerConnection Map
const pcMap = {};
// Local ID
const id = randomId(4);
// Signaling Server
const WS_URL = process.env.WS_URL || 'ws://localhost:8000';
const ws = new WebSocket(WS_URL + '/' + id, {
perMessageDeflate: false,
});
console.log(`The local ID is: ${id}`);
console.log(`Waiting for signaling to be connected...`);
ws.on('open', () => {
console.log('WebSocket connected, signaling ready');
readUserInput();
});
ws.on('error', (err) => {
console.log('WebSocket Error: ', err);
});
ws.on('message', (msgStr) => {
msg = JSON.parse(msgStr);
switch (msg.type) {
case 'offer':
createPeerConnection(msg.id);
pcMap[msg.id].setRemoteDescription(msg.description, msg.type);
break;
case 'answer':
pcMap[msg.id].setRemoteDescription(msg.description, msg.type);
break;
case 'candidate':
pcMap[msg.id].addRemoteCandidate(msg.candidate, msg.mid);
break;
default:
break;
}
});
function readUserInput() {
// Read Line Interface
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
});
rl.question('Enter a remote ID to send an offer:\n', (peerId) => {
if (peerId && peerId.length > 2) {
console.log('Offering to ', peerId);
createPeerConnection(peerId);
console.log('Creating DataChannel with label "test"');
let dc = pcMap[peerId].createDataChannel('test');
dc.onOpen(() => {
dc.sendMessage('Hello from ' + id);
});
dc.onMessage((msg) => {
console.log('Message from ' + peerId + ' received:', msg);
});
}
rl.close();
readUserInput();
});
}
function createPeerConnection(peerId) {
// Create PeerConnection
let peerConnection = new nodeDataChannel.PeerConnection('pc', { iceServers: ['stun:stun.l.google.com:19302'] });
peerConnection.onStateChange((state) => {
console.log('State: ', state);
});
peerConnection.onGatheringStateChange((state) => {
console.log('GatheringState: ', state);
});
peerConnection.onLocalDescription((description, type) => {
ws.send(JSON.stringify({ id: peerId, type, description }));
});
peerConnection.onLocalCandidate((candidate, mid) => {
ws.send(JSON.stringify({ id: peerId, type: 'candidate', candidate, mid }));
});
peerConnection.onDataChannel((dc) => {
console.log('DataChannel from ' + peerId + ' received with label "', dc.getLabel() + '"');
dc.onMessage((msg) => {
console.log('Message from ' + peerId + ' received:', msg);
});
dc.sendMessage('Hello From ' + id);
});
pcMap[peerId] = peerConnection;
}
function randomId(length) {
var result = '';
var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
var charactersLength = characters.length;
for (var i = 0; i < length; i++) {
result += characters.charAt(Math.floor(Math.random() * charactersLength));
}
return result;
}