[IMP] bus: throttle update bus presence method

Before this commit, the `updateBusPresence` method could have been
called many times in a row, resulting in many `update_presence` messages
being sent through the socket. This commit solves this issue by throttling
this method in order for it to only be called once in `UPDATE_BUS_PRESENCE_DELAY`
seconds.

closes odoo/odoo#102442

X-original-commit: 0b581f5af509040928babf0e892732c0f4c873e5
Signed-off-by: Sébastien Theys (seb) <seb@odoo.com>
This commit is contained in:
tsm-odoo
2022-10-06 19:04:11 +02:00
parent b95c95e6d4
commit cc462a0be4
+18 -15
View File
@@ -17,23 +17,26 @@ export const imStatusService = {
start(env, { bus_service, multi_tab, presence }) {
const imStatusModelToIds = {};
let updateBusPresenceTimeout;
const throttledUpdateBusPresence = _.throttle(
function updateBusPresence() {
clearTimeout(updateBusPresenceTimeout);
if (!multi_tab.isOnMainTab()) {
return;
}
const now = new Date().getTime();
bus_service.send("update_presence", {
inactivity_period: now - presence.getLastPresence(),
im_status_ids_by_model: { ...imStatusModelToIds },
});
updateBusPresenceTimeout = browser.setTimeout(throttledUpdateBusPresence, UPDATE_BUS_PRESENCE_DELAY);
},
UPDATE_BUS_PRESENCE_DELAY
);
function updateBusPresence() {
clearTimeout(updateBusPresenceTimeout);
if (!multi_tab.isOnMainTab()) {
return;
}
const now = new Date().getTime();
bus_service.send("update_presence", {
inactivity_period: now - presence.getLastPresence(),
im_status_ids_by_model: { ...imStatusModelToIds },
});
updateBusPresenceTimeout = browser.setTimeout(updateBusPresence, UPDATE_BUS_PRESENCE_DELAY);
}
// wait for im_status model/ids to be registered before starting.
browser.setTimeout(updateBusPresence, 250);
multi_tab.bus.addEventListener('become_main_tab', updateBusPresence);
bus_service.addEventListener('reconnect', updateBusPresence);
browser.setTimeout(throttledUpdateBusPresence, 250);
multi_tab.bus.addEventListener('become_main_tab', throttledUpdateBusPresence);
bus_service.addEventListener('reconnect', throttledUpdateBusPresence);
multi_tab.bus.addEventListener('no_longer_main_tab', () => clearTimeout(updateBusPresenceTimeout));
bus_service.addEventListener('disconnect', () => clearTimeout(updateBusPresenceTimeout));