From 249b7a527f286e7081182cb5ef949169dc728cd2 Mon Sep 17 00:00:00 2001 From: Zev Benjamin Date: Mon, 29 Oct 2012 17:02:10 -0400 Subject: [PATCH] Switch to high-watermark pointer model (imported from commit c05d074a404e823eaa0808b6938a3c80e457175b) --- zephyr/static/js/zephyr.js | 27 ++++++++++++++++----------- zephyr/views.py | 5 ++++- 2 files changed, 20 insertions(+), 12 deletions(-) diff --git a/zephyr/static/js/zephyr.js b/zephyr/static/js/zephyr.js index 747e0758c2..84a55fde8c 100644 --- a/zephyr/static/js/zephyr.js +++ b/zephyr/static/js/zephyr.js @@ -125,19 +125,24 @@ function select_message_by_id(message_id, opts) { return select_message(rows.get(message_id), opts); } -var last_message_id_sent = -1; -var message_id_to_send = -1; +var furthest_read = -1; +var server_furthest_read = -1; // We only send pointer updates every second to avoid hammering the // server function send_pointer_update() { - if (message_id_to_send !== last_message_id_sent) { - $.post("/json/update_pointer", {pointer: message_id_to_send}); - last_message_id_sent = message_id_to_send; + if (furthest_read > server_furthest_read) { + $.post("/json/update_pointer", + {pointer: furthest_read}, + function () { + server_furthest_read = furthest_read; + }); } setTimeout(send_pointer_update, 1000); } $(function () { + furthest_read = initial_pointer; + server_furthest_read = initial_pointer; setTimeout(send_pointer_update, 1000); }); @@ -153,13 +158,11 @@ function update_selected_message(message, opts) { var new_selected_id = rows.id(message); if (opts.update_server && !narrow.active() - && new_selected_id !== message_id_to_send) + && new_selected_id > furthest_read) { // Narrowing is a temporary view on top of the home view and // doesn't permanently affect where you are. - // - // We also don't want to post if there's no effective change. - message_id_to_send = new_selected_id; + furthest_read = new_selected_id; } selected_message_id = new_selected_id; selected_message = message; @@ -558,7 +561,7 @@ function get_updates(options) { var defaults = {dont_block: false}; options = $.extend({}, defaults, options); - get_updates_params.pointer = selected_message_id; + get_updates_params.pointer = furthest_read; get_updates_params.reload_pending = Number(reload.is_pending()); get_updates_params.dont_block = options.dont_block; @@ -600,8 +603,10 @@ function get_updates(options) { } if (data.new_pointer !== undefined - && data.new_pointer !== selected_message_id) + && data.new_pointer > furthest_read) { + furthest_read = data.new_pointer; + server_furthest_read = data.new_pointer; select_message_by_id(data.new_pointer, {then_scroll: true, update_server: false}); } diff --git a/zephyr/views.py b/zephyr/views.py index ba1817bdaa..8a2a22e2c9 100644 --- a/zephyr/views.py +++ b/zephyr/views.py @@ -212,6 +212,9 @@ def update_pointer_backend(request, user_profile, updater, pointer=POST(converte if pointer < 0: return json_error("Invalid pointer value") + if pointer <= user_profile.pointer: + return json_success() + user_profile.pointer = pointer user_profile.last_pointer_updater = updater user_profile.save() @@ -389,7 +392,7 @@ def return_messages_immediately(user_profile, client_id, last, update_types.append("client_reload") ptr = user_profile.pointer - if (client_pointer is not None and ptr != client_pointer): + if (client_pointer is not None and ptr > client_pointer): new_pointer = ptr update_types.append("pointer_update")