From cc462a0be48c719848a48bd6f9539b49694ef809 Mon Sep 17 00:00:00 2001 From: tsm-odoo Date: Tue, 4 Oct 2022 14:57:58 +0000 Subject: [PATCH] [IMP] bus: throttle update bus presence method MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 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) --- addons/bus/static/src/im_status_service.js | 33 ++++++++++++---------- 1 file changed, 18 insertions(+), 15 deletions(-) diff --git a/addons/bus/static/src/im_status_service.js b/addons/bus/static/src/im_status_service.js index 23694433a77..5a03f0bf6a5 100644 --- a/addons/bus/static/src/im_status_service.js +++ b/addons/bus/static/src/im_status_service.js @@ -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));