Skip to content

Commit

Permalink
[feature] Adding except method for brodcasting
Browse files Browse the repository at this point in the history
  • Loading branch information
cayasso committed Dec 2, 2013
1 parent 99a846f commit 502e391
Show file tree
Hide file tree
Showing 3 changed files with 126 additions and 5 deletions.
2 changes: 1 addition & 1 deletion lib/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -175,7 +175,7 @@ PrimusRooms.Spark = function RoomsSpark(Spark) {
* Copy room methods to Spark prototype.
*/

['in', 'room', 'rooms', 'join', 'leave', 'leaveAll', 'clients']
['in', 'room', 'rooms', 'join', 'leave', 'leaveAll', 'clients', 'except']
.forEach(function each(fn) {
Spark.prototype[fn] = function () {
var args = [].slice.call(arguments);
Expand Down
24 changes: 20 additions & 4 deletions lib/rooms.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ module.exports = Rooms;
/**
* Rooms constructor.
*
* @param {primus.Spark} spark
* @param {Spark} spark
* @param {Object} adapter
* @api public
*/
Expand Down Expand Up @@ -52,14 +52,16 @@ Rooms.prototype.adapter = function adapter(adapter) {
*/

Rooms.prototype.broadcast = function broadcast(spark, data, sparks, except, method) {
var rooms = spark._rms;
var rooms = spark._rms, options;
if (!spark._broadcast) return false;
var options = { rooms: rooms, except: except, method: method };
if ('function' === typeof data[data.length - 1]) {
throw new Error('Callbacks are not supported when broadcasting');
}
except = (except || []).concat(spark._except || []);
options = { rooms: rooms, except: except, method: method };
this._adapter.broadcast(data, options, sparks);
spark._broadcast = false;
delete spark._except;
delete spark._rms;
return true;
};
Expand Down Expand Up @@ -203,7 +205,7 @@ Rooms.prototype._leave = function _leave(spark, room, fn) {
*
* @param {Spark} spark
* @param {String} name
* @return {primus.Spark}
* @return {Spark}
* @api public
*/

Expand All @@ -222,6 +224,20 @@ Rooms.prototype.room = function room(spark, name) {
return spark;
};

/**
* Set exception ids when brodcasting.
*
* @param {Spark} spark
* @param {String|Array} ids
* @return {Spark}
* @api public
*/

Rooms.prototype.except = function except(spark, ids) {
spark._except = ('string' !== typeof ids) ? ids : ids.split(' ');
return spark;
};

/**
* Get all rooms for this client.
*
Expand Down
105 changes: 105 additions & 0 deletions test/test.js
Original file line number Diff line number Diff line change
Expand Up @@ -278,6 +278,111 @@ describe('primus-rooms', function () {
});
});

it('should allow defining exception ids when broadcasting', function (done) {

var total = 0
, sender
, except = [];

srv.listen(function () {
primus.on('connection', function (spark) {
spark.on('data', function (data) {
if (/room1|room2/.test(data)) {
except.push(spark.id);
}
if ('send' === data) {
sender = spark;
}
spark.join(data, function () {
if (4 === ++total) {
--total;
sender.room('room1 room2 room3').except(except).write('hi');
}
});
});
});

var c1 = client(srv, primus)
, c2 = client(srv, primus)
, c3 = client(srv, primus)
, c4 = client(srv, primus);

c1.on('data', function (msg) {
done(new Error('not'));
});

c2.on('data', function (msg) {
done(new Error('not'));
});

c3.on('data', function (msg) {
expect(msg).to.be('hi');
done();
});

c4.on('data', function (msg) {
done(new Error('not'));
});

c1.write('room1');
c2.write('room2');
c3.write('room3');
c4.write('send');
});
});

it('should allow defining exception ids as string when broadcasting', function (done) {

var total = 0
, sender
, except = [];

srv.listen(function () {
primus.on('connection', function (spark) {
spark.on('data', function (data) {
if (/room1|room2/.test(data)) {
except.push(spark.id);
}
if ('send' === data) {
sender = spark;
}
spark.join(data, function () {
if (4 === ++total) {
sender.room('room1 room2 room3').except(except.join(' ')).write('hi');
}
});
});
});

var c1 = client(srv, primus)
, c2 = client(srv, primus)
, c3 = client(srv, primus)
, c4 = client(srv, primus);

c1.on('data', function (msg) {
done(new Error('not'));
});

c2.on('data', function (msg) {
done(new Error('not'));
});

c3.on('data', function (msg) {
expect(msg).to.be('hi');
done();
});

c4.on('data', function (msg) {
done(new Error('not'));
});

c1.write('room1');
c2.write('room2');
c3.write('room3');
c4.write('send');
});
});

it('should avoid sending dupes', function (done) {

var total = 2;
Expand Down

0 comments on commit 502e391

Please sign in to comment.