Return the new message for sendMessage and pin RPCs. Pass it through the sendMessage Promise callback.

This commit is contained in:
Ian Gulliver
2014-06-12 23:12:00 -07:00
parent 493f7b1456
commit 40229ff0c0
4 changed files with 24 additions and 11 deletions

12
api.py
View File

@@ -65,16 +65,17 @@ def Pin(google_user, client, client_address, instance_id, args):
sender_message_id = args['sender_message_id'] sender_message_id = args['sender_message_id']
try: try:
models.Subject.FindOrCreate(subject).Pin( pin = models.Subject.FindOrCreate(subject).Pin(
message, message,
models.Client.profile.get_value_for_datastore(client), models.Client.profile.get_value_for_datastore(client),
sender_message_id, sender_message_id,
client_address, client_address,
instance) instance)
except models.DuplicateMessage: except models.DuplicateMessage as e:
logging.warning('Duplicate pin: %s', sender_message_id) logging.warning('Duplicate pin: %s', sender_message_id)
return { return {
'result': 'duplicate_message', 'result': 'duplicate_message',
'message': e.original,
} }
except models.AccessDenied: except models.AccessDenied:
logging.warning('Pin access denied') logging.warning('Pin access denied')
@@ -84,6 +85,7 @@ def Pin(google_user, client, client_address, instance_id, args):
return { return {
'result': 'ok', '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'] sender_message_id = args['sender_message_id']
try: try:
models.Subject.FindOrCreate(subject).SendMessage( msg = models.Subject.FindOrCreate(subject).SendMessage(
message, message,
models.Client.profile.get_value_for_datastore(client), models.Client.profile.get_value_for_datastore(client),
sender_message_id, sender_message_id,
client_address) client_address)
except models.DuplicateMessage: except models.DuplicateMessage as e:
logging.warning('Duplicate message: %s', sender_message_id) logging.warning('Duplicate message: %s', sender_message_id)
return { return {
'result': 'duplicate_message', 'result': 'duplicate_message',
'message': e.original,
} }
except models.AccessDenied: except models.AccessDenied:
logging.warning('SendMessage access denied') logging.warning('SendMessage access denied')
@@ -111,6 +114,7 @@ def SendMessage(google_user, client, client_address, instance_id, args):
return { return {
'result': 'ok', 'result': 'ok',
'message': msg,
} }

View File

@@ -38,7 +38,9 @@ import utils
class DuplicateMessage(Exception): class DuplicateMessage(Exception):
pass def __init__(self, original):
self.original = original
super(DuplicateMessage, self).__init__(original)
class AccessDenied(Exception): class AccessDenied(Exception):
@@ -205,7 +207,7 @@ class Subject(db.Model):
.filter('sender_message_id =', sender_message_id) .filter('sender_message_id =', sender_message_id)
.fetch(1)) .fetch(1))
if messages: if messages:
raise DuplicateMessage(sender_message_id) raise DuplicateMessage(messages[0].ToEvent())
message_id = subject.next_message_id message_id = subject.next_message_id
subject.next_message_id += 1 subject.next_message_id += 1
@@ -243,6 +245,7 @@ class Subject(db.Model):
event = obj.ToEvent() event = obj.ToEvent()
for subscription in subscriptions: for subscription in subscriptions:
subscription.SendMessage(event) subscription.SendMessage(event)
return event
@db.transactional() @db.transactional()
def PutPin(self, message, sender, sender_message_id, def PutPin(self, message, sender, sender_message_id,
@@ -257,7 +260,7 @@ class Subject(db.Model):
.filter('instance =', instance) .filter('instance =', instance)
.fetch(1)) .fetch(1))
if pins: if pins:
raise DuplicateMessage(sender_message_id) raise DuplicateMessage(pins[0].ToEvent())
obj = Pin( obj = Pin(
parent=self, parent=self,
@@ -277,6 +280,7 @@ class Subject(db.Model):
event = obj.ToEvent() event = obj.ToEvent()
for subscription in subscriptions: for subscription in subscriptions:
subscription.SendMessage(event) subscription.SendMessage(event)
return event
@db.transactional() @db.transactional()
def RemovePin(self, sender, sender_message_id, instance_key): def RemovePin(self, sender, sender_message_id, instance_key):

View File

@@ -752,7 +752,8 @@ Cosmopolite.prototype.registerMessageHandlers_ = function() {
* Callback for a sendMessage RPC ack by the server. * Callback for a sendMessage RPC ack by the server.
* *
* @param {Cosmopolite.typeMessage} message Message details. * @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 {?function(Error)} reject Promise rejection callback.
* @param {Object} response Server RPC response. * @param {Object} response Server RPC response.
* @private * @private
@@ -768,7 +769,9 @@ Cosmopolite.prototype.onMessageSent_ = function(
var result = response['result']; var result = response['result'];
if (result == 'ok' || result == 'duplicate_message') { if (result == 'ok' || result == 'duplicate_message') {
if (resolve) { if (resolve) {
resolve(); response['message']['message'] = JSON.parse(
response['message']['message']);
resolve(response['message']);
} }
} else { } else {
if (reject) { if (reject) {

View File

@@ -193,14 +193,16 @@ asyncTest('Complex object', function() {
}); });
asyncTest('sendMessage Promise', function() { asyncTest('sendMessage Promise', function() {
expect(1); expect(3);
var subject = randstring(); var subject = randstring();
var message = randstring(); var message = randstring();
var cosmo = new Cosmopolite({}, null, 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'); ok(true, 'sendMessage Promise fulfilled');
equal(msg['subject']['name'], subject);
equal(msg['message'], message);
cosmo.shutdown(); cosmo.shutdown();
start(); start();
}); });