Files
zulip/static/js/local_message.js
Anders Kaseorg 2ddd3d046a echo: Further reduce local_id string vs. number confusion.
New rule: local_id is always a string, local_id_float is always a
number.

Signed-off-by: Anders Kaseorg <anders@zulipchat.com>
2020-02-12 10:39:01 -08:00

57 lines
1.7 KiB
JavaScript

function truncate_precision(float) {
return parseFloat(float.toFixed(3));
}
exports.now = function () {
const timestamp = new XDate().getTime() / 1000;
return timestamp;
};
exports.insert_message = function (message) {
// It is a little bit funny to go through the message_events
// codepath, but it's sort of the idea behind local echo that
// we are simulating server events before they actually arrive.
message_events.insert_new_messages([message], true);
};
exports.get_next_id_float = (function () {
const already_used = {};
return function () {
const local_id_increment = 0.01;
let latest = page_params.max_message_id;
if (typeof message_list.all !== 'undefined' && message_list.all.last() !== undefined) {
latest = message_list.all.last().id;
}
latest = Math.max(0, latest);
const local_id_float = truncate_precision(latest + local_id_increment);
if (already_used[local_id_float]) {
// If our id is already used, it is probably an edge case like we had
// to abort a very recent message.
blueslip.warn("We don't reuse ids for local echo.");
return;
}
if (local_id_float % 1 > local_id_increment * 5) {
blueslip.warn("Turning off local echo for this message to let host catch up");
return;
}
if (local_id_float % 1 === 0) {
// The logic to stop at 0.05 should prevent us from ever wrapping around
// to the next integer.
blueslip.error("Programming error");
return;
}
already_used[local_id_float] = true;
return local_id_float;
};
}());
window.local_message = exports;