diff --git a/api.py b/api.py index e6aeff1..6054ac0 100644 --- a/api.py +++ b/api.py @@ -71,10 +71,11 @@ def SendMessage(google_user, client, args): def Subscribe(google_user, client, args): subject = models.Subject.FindOrCreate(args['subject']) messages = args.get('messages', 0) + last_id = args.get('last_id', None) keys = args.get('keys', []) ret = { - 'events': models.Subscription.FindOrCreate(subject, client, messages), + 'events': models.Subscription.FindOrCreate(subject, client, messages, last_id), } for key in keys: message = subject.GetKey(key) diff --git a/lib/models.py b/lib/models.py index 3e7c607..4bfc593 100644 --- a/lib/models.py +++ b/lib/models.py @@ -117,6 +117,15 @@ class Subject(db.Model): num_messages = None return reversed(query.fetch(limit=num_messages)) + @db.transactional() + def GetMessagesSince(self, last_id): + query = ( + Message.all() + .ancestor(self) + .filter('id_ >', last_id) + .order('id_')) + return list(query) + @db.transactional() def GetKey(self, key): messages = ( @@ -179,7 +188,7 @@ class Subscription(db.Model): @classmethod @db.transactional() - def FindOrCreate(cls, subject, client, messages): + def FindOrCreate(cls, subject, client, messages=0, last_id=None): subscriptions = ( cls.all(keys_only=True) .ancestor(subject) @@ -187,9 +196,12 @@ class Subscription(db.Model): .fetch(1)) if not subscriptions: cls(parent=subject, client=client).put() - if messages == 0: - return [] - return [m.ToEvent() for m in subject.GetRecentMessages(messages)] + events = [] + if messages: + events.extend(m.ToEvent() for m in subject.GetRecentMessages(messages)) + if last_id: + events.extend(m.ToEvent() for m in subject.GetMessagesSince(last_id)) + return events @classmethod @db.transactional() diff --git a/static/cosmopolite.js b/static/cosmopolite.js index 65979ed..eb0489a 100644 --- a/static/cosmopolite.js +++ b/static/cosmopolite.js @@ -423,13 +423,17 @@ Cosmopolite.prototype.createChannel_ = function() { 'onSuccess': this.onCreateChannel_, }, ]; - // TODO(flamingcow): Need to restart from the latest message. for (var subject in this.subscriptions_) { + var subscription = this.subscriptions_[subject]; + var last_id = 0; + if (subscription.messages.length > 0) { + last_id = subscription.messages[subscription.messages.length - 1]['id']; + } rpcs.push({ 'command': 'subscribe', 'arguments': { 'subject': subject, - 'messages': 0, + 'last_id': last_id, } }); }