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']
|
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,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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):
|
||||||
|
|||||||
@@ -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) {
|
||||||
|
|||||||
@@ -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();
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user