simplebroadcast
Version:
Simple broadcasting and repeatign of JSON messages using net sockets
100 lines (79 loc) • 2.75 kB
JavaScript
var sm = require('simplemessages'),
net = require('net');
function Broadcaster() {
var broadcaster = this,
nclients = 0,
clients = {},
server,
repeater;
this.newClient = function(client, isrepeater) {
client.nclient = nclients++;
client.repeater = isrepeater;
clients[client.nclient] = client;
if (isrepeater) {
client.on('data', function(msg) { broadcastClients(msg, client); });
} else {
client.on('data', function(msg) { broadcaster.broadcast(msg, client); });
}
client.on('end', function() { broadcaster.removeClient(client); });
client.on('close', function() { broadcaster.removeClient(client); });
client.on('error', function() { broadcaster.removeClient(client); });
}
this.listen = function(port, host) {
if (!server)
server = sm.createServer(function(client) { broadcaster.newClient(client, false); });
server.listen(port, host);
}
this.listenRepeaters = function(port, host) {
if (!repeater)
repeater = sm.createServer(function(client) { broadcaster.newClient(client, true); });
repeater.listen(port, host);
}
this.close = function() {
var n;
for (n in clients)
clients[n].end();
if (server)
server.close();
if (repeater)
repeater.close();
}
this.removeClient = function(client) {
delete clients[client.nclient];
}
this.broadcast = function(msg, source) {
var n;
try {
for (n in clients)
(clients[n] != source) && clients[n].write(msg);
}
catch (ex) {
console.log(ex.toString());
}
}
function broadcastClients(msg, source) {
var n;
try {
for (n in clients)
(clients[n] != source) && !clients[n].repeater && clients[n].write(msg);
}
catch (ex) {
console.log(ex.toString());
}
}
this.connect = function(port, host, isrepeater) {
var socket = net.connect(port, host);
var client = sm.createClient(socket);
isrepeater = isrepeater || false;
broadcaster.newClient(client, isrepeater);
}
this.connectRepeater = function(port, host) {
broadcaster.connect(port, host, true);
}
}
exports.createBroadcaster = function() {
return new Broadcaster();
}
exports.createClient = function(port, host) {
return sm.createClient(port, host);
}