FIX: when entering topics "tracking" would not be set

There was a timing issue when subscribing to messages for topics.

Old flow:

- We generate JSON for topic
- We subscribe to messages for topic

New flow:

- We keep track of last id in the topic message bus channel
- We generate JSON
- We subscribe to messages for topic starting at saved message id

This ensures that there is complete overlap for message consumption
and that there are no cases where an update may go missing due to timing
This commit is contained in:
Sam 2017-05-16 15:04:09 -04:00
parent 7821400141
commit 6ddd8d9166
5 changed files with 16 additions and 5 deletions

View File

@ -946,7 +946,7 @@ export default Ember.Controller.extend(SelectedPostsCount, BufferedContent, {
this._scrollToPost(data.post_number);
}
}
});
}, this.get('model.message_bus_last_id'));
},
_scrollToPost: debounce(function(postNumber) {

View File

@ -7,6 +7,11 @@ export default Discourse.Route.extend({
// Avoid default model hook
model(params) { return params; },
deactivate() {
this._super();
this.controllerFor('topic').unsubscribe();
},
setupController(controller, params) {
params = params || {};
params.track_visit = true;
@ -36,6 +41,8 @@ export default Discourse.Route.extend({
enteredAt: new Date().getTime().toString(),
});
topicController.subscribe();
// Highlight our post after the next render
Ember.run.scheduleOnce('afterRender', function() {
self.appEvents.trigger('post:highlight', closest);

View File

@ -189,7 +189,6 @@ const TopicRoute = Discourse.Route.extend({
postStream.cancelFilter();
topicController.set('multiSelect', false);
topicController.unsubscribe();
this.controllerFor('composer').set('topic', null);
this.screenTrack.stop();
@ -216,7 +215,6 @@ const TopicRoute = Discourse.Route.extend({
this.controllerFor('composer').set('topic', model);
this.topicTrackingState.trackIncoming('all');
controller.subscribe();
// We reset screen tracking every time a topic is entered
this.screenTrack.start(model.get('id'), controller);

View File

@ -61,7 +61,8 @@ class TopicViewSerializer < ApplicationSerializer
:tags,
:featured_link,
:topic_timer,
:unicode_title
:unicode_title,
:message_bus_last_id
# TODO: Split off into proper object / serializer
def details
@ -125,6 +126,10 @@ class TopicViewSerializer < ApplicationSerializer
result
end
def message_bus_last_id
object.message_bus_last_id
end
def chunk_size
object.chunk_size
end

View File

@ -5,7 +5,7 @@ require_dependency 'gaps'
class TopicView
attr_reader :topic, :posts, :guardian, :filtered_posts, :chunk_size, :print
attr_reader :topic, :posts, :guardian, :filtered_posts, :chunk_size, :print, :message_bus_last_id
attr_accessor :draft, :draft_key, :draft_sequence, :user_custom_fields, :post_custom_fields
def self.slow_chunk_size
@ -38,6 +38,7 @@ class TopicView
end
def initialize(topic_id, user=nil, options={})
@message_bus_last_id = MessageBus.last_id("/topic/#{topic_id}")
@user = user
@guardian = Guardian.new(@user)
@topic = find_topic(topic_id)