diff --git a/api.py b/api.py index 0a99e22..91111f5 100644 --- a/api.py +++ b/api.py @@ -65,16 +65,17 @@ def Pin(google_user, client, client_address, instance_id, args): sender_message_id = args['sender_message_id'] try: - models.Subject.FindOrCreate(subject).Pin( + pin = models.Subject.FindOrCreate(subject).Pin( message, models.Client.profile.get_value_for_datastore(client), sender_message_id, client_address, instance) - except models.DuplicateMessage: + except models.DuplicateMessage as e: logging.warning('Duplicate pin: %s', sender_message_id) return { 'result': 'duplicate_message', + 'message': e.original, } except models.AccessDenied: logging.warning('Pin access denied') @@ -84,6 +85,7 @@ def Pin(google_user, client, client_address, instance_id, args): return { 'result': 'ok', + 'pin': pin, } @@ -93,15 +95,16 @@ def SendMessage(google_user, client, client_address, instance_id, args): sender_message_id = args['sender_message_id'] try: - models.Subject.FindOrCreate(subject).SendMessage( + msg = models.Subject.FindOrCreate(subject).SendMessage( message, models.Client.profile.get_value_for_datastore(client), sender_message_id, client_address) - except models.DuplicateMessage: + except models.DuplicateMessage as e: logging.warning('Duplicate message: %s', sender_message_id) return { 'result': 'duplicate_message', + 'message': e.original, } except models.AccessDenied: logging.warning('SendMessage access denied') @@ -111,6 +114,7 @@ def SendMessage(google_user, client, client_address, instance_id, args): return { 'result': 'ok', + 'message': msg, } diff --git a/lib/models.py b/lib/models.py index ae9bf2b..e395964 100644 --- a/lib/models.py +++ b/lib/models.py @@ -38,7 +38,9 @@ import utils class DuplicateMessage(Exception): - pass + def __init__(self, original): + self.original = original + super(DuplicateMessage, self).__init__(original) class AccessDenied(Exception): @@ -205,7 +207,7 @@ class Subject(db.Model): .filter('sender_message_id =', sender_message_id) .fetch(1)) if messages: - raise DuplicateMessage(sender_message_id) + raise DuplicateMessage(messages[0].ToEvent()) message_id = subject.next_message_id subject.next_message_id += 1 @@ -243,6 +245,7 @@ class Subject(db.Model): event = obj.ToEvent() for subscription in subscriptions: subscription.SendMessage(event) + return event @db.transactional() def PutPin(self, message, sender, sender_message_id, @@ -257,7 +260,7 @@ class Subject(db.Model): .filter('instance =', instance) .fetch(1)) if pins: - raise DuplicateMessage(sender_message_id) + raise DuplicateMessage(pins[0].ToEvent()) obj = Pin( parent=self, @@ -277,6 +280,7 @@ class Subject(db.Model): event = obj.ToEvent() for subscription in subscriptions: subscription.SendMessage(event) + return event @db.transactional() def RemovePin(self, sender, sender_message_id, instance_key): diff --git a/static/cosmopolite.js b/static/cosmopolite.js index 457bf4d..6e3fac0 100644 --- a/static/cosmopolite.js +++ b/static/cosmopolite.js @@ -752,7 +752,8 @@ Cosmopolite.prototype.registerMessageHandlers_ = function() { * Callback for a sendMessage RPC ack by the server. * * @param {Cosmopolite.typeMessage} message Message details. - * @param {?function()} resolve Promise resolution callback. + * @param {?function(Cosmopolite.typeMessage)} resolve Promise resolution + * callback. * @param {?function(Error)} reject Promise rejection callback. * @param {Object} response Server RPC response. * @private @@ -768,7 +769,9 @@ Cosmopolite.prototype.onMessageSent_ = function( var result = response['result']; if (result == 'ok' || result == 'duplicate_message') { if (resolve) { - resolve(); + response['message']['message'] = JSON.parse( + response['message']['message']); + resolve(response['message']); } } else { if (reject) { diff --git a/static/test.js b/static/test.js index 00086c1..314875c 100644 --- a/static/test.js +++ b/static/test.js @@ -193,14 +193,16 @@ asyncTest('Complex object', function() { }); asyncTest('sendMessage Promise', function() { - expect(1); + expect(3); var subject = randstring(); var message = randstring(); var cosmo = new Cosmopolite({}, null, randstring()); - cosmo.sendMessage(subject, message).then(function() { + cosmo.sendMessage(subject, message).then(function(msg) { ok(true, 'sendMessage Promise fulfilled'); + equal(msg['subject']['name'], subject); + equal(msg['message'], message); cosmo.shutdown(); start(); });