peerpigeon
Version:
WebRTC-based peer-to-peer mesh networking library with intelligent routing and signaling server
153 lines (123 loc) ⢠4.83 kB
JavaScript
/**
* Node.js Test for PeerPigeon Mesh Networking
* Demonstrates P2P mesh functionality in Node.js environment
*
* Prerequisites:
* - npm install ws @koush/wrtc
* - Start signaling server: npm run server
*/
import { PeerPigeonMesh } from '../../index.js';
import WebSocket from 'ws';
import wrtc from '@koush/wrtc';
// Make WebRTC available globally for Node.js
global.RTCPeerConnection = wrtc.RTCPeerConnection;
global.RTCSessionDescription = wrtc.RTCSessionDescription;
global.RTCIceCandidate = wrtc.RTCIceCandidate;
global.WebSocket = WebSocket;
const SIGNALING_URL = 'ws://localhost:3000';
const TEST_DURATION = 30000; // 30 seconds
console.log('ļæ½ PeerPigeon Node.js Mesh Test\n');
async function createPeer(peerName, peerId = null) {
const mesh = new PeerPigeonMesh({
peerId,
enableWebDHT: true,
ignoreEnvironmentErrors: true
});
// Set up event handlers
mesh.addEventListener('statusChanged', (event) => {
console.log(`[${peerName}] Status: ${event.type} - ${event.message || ''}`);
});
mesh.addEventListener('peerConnected', (event) => {
console.log(`[${peerName}] š Connected to peer: ${event.peerId.substring(0, 8)}...`);
});
mesh.addEventListener('peerDisconnected', (event) => {
console.log(`[${peerName}] š Disconnected from peer: ${event.peerId.substring(0, 8)}... (${event.reason})`);
});
mesh.addEventListener('messageReceived', (event) => {
const fromPeerId = event.from || 'unknown';
console.log(`[${peerName}] šØ Received: "${event.content}" from ${fromPeerId.substring(0, 8)}...`);
});
// Initialize the mesh
await mesh.init();
console.log(`[${peerName}] Initialized with ID: ${mesh.peerId.substring(0, 8)}...`);
// Display environment info
const envReport = mesh.getEnvironmentReport();
console.log(`[${peerName}] Environment: Node.js ${envReport.node?.version}, WebRTC: ${envReport.capabilities.webrtc}, WebSocket: ${envReport.capabilities.webSocket}`);
return mesh;
}
async function runTest() {
try {
console.log('Creating two mesh peers...\n');
// Create two peers
const peer1 = await createPeer('PEER-1');
const peer2 = await createPeer('PEER-2');
console.log('\nConnecting to signaling server...\n');
// Connect both peers to signaling server
await peer1.connect(SIGNALING_URL);
await peer2.connect(SIGNALING_URL);
// Wait for connections to establish
await new Promise(resolve => setTimeout(resolve, 2000));
console.log('\nTesting message exchange...\n');
// Test messaging
let messageCount = 0;
const sendMessage = () => {
messageCount++;
const message = `Hello from Node.js test #${messageCount}`;
if (messageCount % 2 === 1) {
console.log(`[PEER-1] š¤ Sending: "${message}"`);
peer1.sendMessage(message);
} else {
console.log(`[PEER-2] š¤ Sending: "${message}"`);
peer2.sendMessage(message);
}
};
// Send messages every 3 seconds
const messageInterval = setInterval(sendMessage, 3000);
sendMessage(); // Send first message immediately
// Test DHT functionality
setTimeout(async () => {
console.log('\nTesting DHT functionality...\n');
try {
await peer1.dhtPut('test-key', { data: 'Hello from Node.js DHT!', timestamp: Date.now() });
console.log('[PEER-1] š Stored data in DHT');
const value = await peer2.dhtGet('test-key');
console.log('[PEER-2] š Retrieved from DHT:', value);
} catch (error) {
console.error('DHT test failed:', error.message);
}
}, 5000);
// Display stats periodically
const statsInterval = setInterval(() => {
const peer1ConnectedCount = peer1.getConnectedPeerCount();
const peer2ConnectedCount = peer2.getConnectedPeerCount();
console.log('\n--- Stats ---');
console.log(`PEER-1: ${peer1ConnectedCount} connected peers`);
console.log(`PEER-2: ${peer2ConnectedCount} connected peers`);
}, 10000);
// Run test for specified duration
setTimeout(() => {
console.log('\nš Test completed, cleaning up...\n');
clearInterval(messageInterval);
clearInterval(statsInterval);
peer1.disconnect();
peer2.disconnect();
process.exit(0);
}, TEST_DURATION);
} catch (error) {
console.error('ā Test failed:', error);
process.exit(1);
}
}
// Check if signaling server is running
console.log(`Checking signaling server at ${SIGNALING_URL}...`);
const testWs = new WebSocket(SIGNALING_URL);
testWs.on('open', () => {
testWs.close();
console.log('ā
Signaling server is running\n');
runTest();
});
testWs.on('error', () => {
console.error('ā Signaling server not running. Start it with: npm run server');
process.exit(1);
});