kumoapp-tsrp
Version:
KumoApp to TSRP gateway
80 lines (63 loc) • 2.54 kB
JavaScript
var KumoAppTSRP = require('./kumoapp-tsrp')
, config = require('./kumoapp-config').config
, dgram = require('dgram')
, http = require('http')
, util = require('util')
;
var portno = config.portno
, tsrp = { ipaddr: '224.0.9.1', portno: 22601 }
, kumo = new KumoAppTSRP()
;
kumo.on('message', function(message) {
var packet = new Buffer(JSON.stringify(message));
tsrp.dgram.send(packet, 0, packet.length, tsrp.portno, tsrp.ipaddr, function(err, octets) {/* jshint unused: false */
if (!!err) return console.log(util.inspect(err, { depth: null }));
});
});
http.createServer(function(request, response) {
var body = '';
var done = function(code, s, ct) {
if (code === 405) {
response.writeHead(405, { Allow: 'PUT' });
return response.end();
}
if (!s) return response.end();
response.writeHead(code, { 'Content-Type': ct || 'application/json' });
response.end(s);
};
var loser = function(err) {
console.log(util.inspect(err, { depth: null }));
return done(200, JSON.stringify({ error: err }));
};
if (request.method !== 'PUT') return done(405);
request.on('data', function(data) {
body += data.toString();
}).on('close', function() {
console.log('http request: premature close');
}).on('end', function() {
var message, packet;
try { message = kumo.toTSRP(JSON.parse(body)); } catch(ex) { return loser(ex); }
if (!message) return done(200);
packet = new Buffer(JSON.stringify(message));
tsrp.dgram.send(packet, 0, packet.length, tsrp.portno, tsrp.ipaddr, function(err, octets) {/* jshint unused: false */
if (!!err) return loser(err);
});
done(200);
});
}).on('listening', function() {
console.log('listening on http://*:' + portno);
}).on('error', function(err) {
console.log('http server: ' + err.message);
}).listen(portno);
tsrp.dgram = dgram.createSocket('udp4').on('error', function(err) {
console.log('dgram sender: ' + err.message);
}).on('message', function(msg, rinfo) { /* jshint unused: false */
console.log('>>> received ' + msg.length + ' octets from ' + JSON.stringify(rinfo));
}).on('listening', function() {
var address = this.address();
console.log('bound to multicast udp://' + (address.address !== '0.0.0.0' ? address.address : '*') + ':' + address.port);
try { this.setMulticastLoopback(true); } catch(ex) { console.log('dgram loopback: ' + ex.message); }
});
tsrp.dgram.bind(0, function() {
this.addMembership(tsrp.ipaddr);
});