Return the new message for sendMessage and pin RPCs. Pass it through the sendMessage Promise callback.
This commit is contained in:
12
api.py
12
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,
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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();
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user