UNPKG

iwebpp.io

Version:

iWebPP name-client library for node.js

210 lines (171 loc) 7.94 kB
// Copyright (c) 2012 Tom Zhou<iwebpp@gmail.com> var _ = require('lodash'); var SEP = require('../lib/sep'); var nmCln = require('../lib/iwebpp.io'); // iwebpp-ws library var WebSocket = require('wspp'); var WebSocketServer = WebSocket.Server; // msgpack library var msgpack = require('msgpack-js'); // vURL var vURL = require('../lib/vurl'); // create websocket server with name-client var creatNmclnWss = function(self) { var wss; wss = new WebSocketServer({httpp: true, server: self.bsrv.srv, path: SEP.SEP_CTRLPATH_BS}); wss.on('connection', function(client){ console.log('new ws connection: ' + client._socket.remoteAddress+':'+client._socket.remotePort+' -> ' + client._socket.address().address+':'+client._socket.address().port); client.on('message', function(message, flags) { // flags.binary will be set if a binary message is received // flags.masked will be set if the message was masked var data = (flags.binary) ? msgpack.decode(message) : JSON.parse(message); console.log('business message:'+JSON.stringify(data)); data += 'reply by B'; try { client.send(msgpack.encode(data), {binary: true, mask: true}, function(err){ if (err) { console.log(err+',sendOpcMsg failed'); } }); } catch (e) { console.log(e+',sendOpcMsg failed immediately'); } }); }); }; // client B var nmclnsB = new nmCln({ srvinfo: { timeout: 20, endpoints: [{ip: '51dese.com', port: 51686}, {ip: '51dese.com', port: 51868}], turn: [ {ip: '51dese.com', agent: 51866, proxy: 51688} // every turn-server include proxy and agent port ] }, usrinfo: {domain: '51dese.com', usrkey: 'B'}, conmode: SEP.SEP_MODE_CS, vmode: vURL.URL_MODE_PATH }); nmclnsB.on('ready', function(){ console.log('name-nmclnsB ready'); // create websocket server creatNmclnWss(this); // ask for all user info nmclnsB.getAllUsrs(function(err, usrs){ if (!err) { ///console.log('got all User info answer:'+usrs.length+','+JSON.stringify(usrs)); } else { console.log(err); } }); // ask for all Logins info /*nmclnsB.getBllLogins(function(err, logins){ if (!err) { console.log('got Logins answer:'+JSON.stringify(logins)); } else { console.log(err); } }); */ // ask for user-specific Logins info nmclnsB.getUsrLogins({domain: '51dese.com', usrkey: 'A'}, function(err, logins){ if (!err) { ///console.log('nmclnsA Logins answer:'+logins.length+','+JSON.stringify(logins)); // filter in live session only var lives = _.filter(logins, function(n){return n.to.live}); if (lives.length == 0) { console.error('No live user A login session ...'); return; } // ask for client-specific Logins info nmclnsB.getClntSdps(lives[lives.length-1].to.gid, function(err, sdps){ if (!err) { ///console.log('nmclnsB SDPs answer:'+JSON.stringify(sdps)); // try to setup STUN connection to peer var peerinfo = { gid: sdps[sdps.length-1].from.gid, vpath: sdps[sdps.length-1].from.vpath, vhost: sdps[sdps.length-1].from.vhost, vmode: sdps[sdps.length-1].from.vmode, vtoken: sdps[sdps.length-1].from.vtoken, secmode: sdps[sdps.length-1].from.secmode, lip: sdps[sdps.length-1].from.localIP, lport: sdps[sdps.length-1].from.localPort, natype: sdps[sdps.length-1].from.natype, ip: sdps[sdps.length-1].rel.clntIP, port: sdps[sdps.length-1].rel.clntPort }; // create STUN session nmclnsB.offerStun({endpoint: peerinfo}, function(err, stun){ console.log('B setup stun to peer:'+JSON.stringify(peerinfo)); if (err || !stun) return console.log(err+',setup STUN to peer failed'); // try to connect to peer // TBD... currency test ///for (var idx = 0; idx < 100; idx ++) { nmclnsB.createConnection({endpoint: peerinfo}, function(err, socket){ console.log('B connected to peer:'+JSON.stringify(peerinfo)); if (err || !socket) return console.log(err+',connect to peer failed'); socket.on('message', function(message, flags) { // flags.binary will be set if a binary message is received // flags.masked will be set if the message was masked var data = (flags.binary) ? msgpack.decode(message) : JSON.parse(message); console.log(JSON.stringify(data)); }); setInterval(function(){ socket.send(msgpack.encode('Hello, This is B via STUN :)'), {binary: true, mask: true}); }, 2000); }); ///} }); // create TURN session nmclnsB.offerTurn({endpoint: peerinfo, sesn: SEP.SEP_SESN_TURN}, function(err, turn){ console.log('B setup turn to peer:'+JSON.stringify(peerinfo)); console.log('TURN:'+JSON.stringify(turn)); if (err || !turn) return console.log(err+',setup TURN to peer failed'); // try to connect to peer var turninfo = { vpath: turn.vpath, vhost: turn.vhost, vmode: turn.vmode, vtoken: turn.vtoken, secmode: turn.secmode, lip: turn.srvIP, lport: turn.proxyPort, ip: turn.srvIP, port: turn.proxyPort }; nmclnsB.createConnection({endpoint: turninfo, sesn: SEP.SEP_SESN_TURN}, function(err, socket){ console.log('B connected to peer via TURN:'+JSON.stringify(turninfo)); if (err || !socket) return console.log(err+',connect to turn failed'); socket.on('message', function(message, flags) { // flags.binary will be set if a binary message is received // flags.masked will be set if the message was masked var data = (flags.binary) ? msgpack.decode(message) : JSON.parse(message); console.log(JSON.stringify(data)); }); setInterval(function(){ socket.send(msgpack.encode('Hello, This is B via TURN :)'), {binary: true, mask: true}); }, 2000); }); }); } else { console.log(err); } }); } else { console.log(err); } }); // fake web service nmclnsB.bsrv.srv.on('request', function(req, res){ res.end('Hello, this is B'); }); }); nmclnsB.on('error', function (err) { console.log('name client B error: ' + err); }); process.on('uncaughtException', function (e) { console.log('name client exception: ' + e); });