Add bulk subscribe support.

This commit is contained in:
Ian Gulliver
2014-06-11 21:46:50 -07:00
parent bc42e8d5e3
commit 828a9c50ea
2 changed files with 93 additions and 42 deletions

View File

@@ -254,15 +254,28 @@ Cosmopolite.prototype.shutdown = function() {
*
* Start receiving messages sent to this subject via the onMessage callback.
*
* @param {Cosmopolite.typeSubjectLoose} subject
* @param {Cosmopolite.typeSubjectLoose|Array.<Cosmopolite.typeSubjectLoose>}
* subjects
* @param {?number=} opt_messages Number of recent messages to request;
* 0 for none, -1 for all
* @param {?number=} opt_lastID ID of last message received; fetch messages
* since
* @return {Promise}
* @return {Promise|Array.<Promise>}
*/
Cosmopolite.prototype.subscribe = function(subject, opt_messages, opt_lastID) {
return this.newPromise_(function(resolve, reject) {
Cosmopolite.prototype.subscribe = function(subjects, opt_messages, opt_lastID) {
var single = false;
if (!(subjects instanceof Array)) {
single = true;
subjects = [subjects];
}
var ret = [];
var rpcs = [];
for (var i = 0; i < subjects.length; i++) {
var subject = subjects[i];
ret.push(this.newPromise_(function(resolve, reject) {
/** @type {Cosmopolite.typeSubject} */
var canonicalSubject = this.canonicalSubject_(subject);
/** @type {string} */
@@ -286,7 +299,7 @@ Cosmopolite.prototype.subscribe = function(subject, opt_messages, opt_lastID) {
args['last_id'] = opt_lastID;
}
this.sendRPC_('subscribe', args, function(response) {
var onSuccess = function(response) {
/** @type {string} */
var result = response['result'];
if (result == 'ok') {
@@ -303,8 +316,22 @@ Cosmopolite.prototype.subscribe = function(subject, opt_messages, opt_lastID) {
delete this.subscriptions_[subjectString];
reject(new Error(result));
}
};
rpcs.push({
'command': 'subscribe',
'arguments': args,
'onSuccess': onSuccess
});
}.bind(this));
}.bind(this)));
}
this.sendRPCs_(rpcs);
if (single) {
return ret[0];
} else {
return ret;
}
};

View File

@@ -138,6 +138,30 @@ asyncTest('Message round trip without channel', function() {
cosmo.subscribe(subject, -1);
});
asyncTest('Bulk subscribe', function() {
expect(2);
var subject1 = randstring();
var subject2 = randstring();
var message = randstring();
var messages = 0;
var callbacks = {
'onMessage': function(e) {
equal(e['message'], message, 'message matches');
if (++messages == 2) {
cosmo.shutdown();
start();
}
}
};
var cosmo = new Cosmopolite(callbacks, null, randstring());
cosmo.sendMessage(subject1, message);
cosmo.sendMessage(subject2, message);
cosmo.subscribe([subject1, subject2], -1);
});
asyncTest('Complex object', function() {
expect(2);