*: bus, hr_holidays. The `/bus/im_status` route polls the server every minute in order for the user im_status to be up to date. This commit removes this poll by sending the im_status on the bus when updating the current user presence. Moreover, before [1], the user bus presence was updated on each poll. When the user didn't poll for 50 seconds, we assumed the user was disconnected. Since [1], the bus presence is updated each 30 seconds by the `im_status` service. This is too frequent: there is no need to update the user presence so often. In order not to overhelm the server with unnecessary requests, the update presence interval as well as the delay to be considered disconnected have been updated: the former from 30 to 60 seconds, the later from 55 to 65 seconds (assuming that a user that has missed an update presence tick is disconnected). [1]: odoo/odoo@a5623d2 closes odoo/odoo#100249 Signed-off-by: Sébastien Theys (seb) <seb@odoo.com>
145 lines
5.7 KiB
JavaScript
145 lines
5.7 KiB
JavaScript
/** @odoo-module **/
|
|
|
|
import { busService } from '@bus/services/bus_service';
|
|
import { imStatusService } from '@bus/im_status_service';
|
|
import { multiTabService } from '@bus/multi_tab_service';
|
|
import { makeMultiTabToLegacyEnv } from '@bus/services/legacy/make_multi_tab_to_legacy_env';
|
|
import { makeBusServiceToLegacyEnv } from '@bus/services/legacy/make_bus_service_to_legacy_env';
|
|
import { makeFakePresenceService } from '@bus/../tests/helpers/mock_services';
|
|
|
|
import { ChatWindowManagerContainer } from '@mail/components/chat_window_manager_container/chat_window_manager_container';
|
|
import { DialogManagerContainer } from '@mail/components/dialog_manager_container/dialog_manager_container';
|
|
import { DiscussContainer } from '@mail/components/discuss_container/discuss_container';
|
|
import { PopoverManagerContainer } from '@mail/components/popover_manager_container/popover_manager_container';
|
|
import { messagingService } from '@mail/services/messaging_service';
|
|
import { systrayService } from '@mail/services/systray_service';
|
|
import { makeMessagingToLegacyEnv } from '@mail/utils/make_messaging_to_legacy_env';
|
|
|
|
import { registry } from '@web/core/registry';
|
|
import { patchWithCleanup } from "@web/../tests/helpers/utils";
|
|
import { createWebClient } from "@web/../tests/webclient/helpers";
|
|
|
|
const ROUTES_TO_IGNORE = [
|
|
'/web/webclient/load_menus',
|
|
'/web/dataset/call_kw/res.users/load_views',
|
|
'/web/dataset/call_kw/res.users/systray_get_activities'
|
|
];
|
|
const WEBCLIENT_PARAMETER_NAMES = new Set(['legacyParams', 'mockRPC', 'serverData', 'target', 'webClientClass']);
|
|
const SERVICES_PARAMETER_NAMES = new Set([
|
|
'legacyServices', 'loadingBaseDelayDuration', 'messagingBeforeCreationDeferred',
|
|
'messagingBus', 'services',
|
|
]);
|
|
|
|
/**
|
|
* Add required components to the main component registry.
|
|
*/
|
|
function setupMainComponentRegistry() {
|
|
const mainComponentRegistry = registry.category('main_components');
|
|
mainComponentRegistry.add('ChatWindowManagerContainer', { Component: ChatWindowManagerContainer });
|
|
mainComponentRegistry.add('DialogManagerContainer', { Component: DialogManagerContainer });
|
|
registry.category('actions').add('mail.action_discuss', DiscussContainer);
|
|
mainComponentRegistry.add('PopoverManagerContainer', { Component: PopoverManagerContainer });
|
|
}
|
|
|
|
/**
|
|
* Setup both legacy and new service registries.
|
|
*
|
|
* @param {Object} param0
|
|
* @param {Object} [param0.services]
|
|
* @param {number} [param0.loadingBaseDelayDuration=0]
|
|
* @param {Promise} [param0.messagingBeforeCreationDeferred=Promise.resolve()]
|
|
* Deferred that let tests block messaging creation and simulate resolution.
|
|
* Useful for testing components behavior when messaging is not yet created.
|
|
* @param {EventBus} [param0.messagingBus]
|
|
* @returns {LegacyRegistry} The registry containing all the legacy services that will be passed
|
|
* to the webClient as a legacy parameter.
|
|
*/
|
|
function setupMessagingServiceRegistries({
|
|
loadingBaseDelayDuration = 0,
|
|
messagingBeforeCreationDeferred = Promise.resolve(),
|
|
messagingBus,
|
|
services,
|
|
}) {
|
|
const serviceRegistry = registry.category('services');
|
|
|
|
patchWithCleanup(messagingService, {
|
|
async _startModelManager(modelManager, messagingValues) {
|
|
modelManager.isDebug = true;
|
|
const _super = this._super.bind(this);
|
|
await messagingBeforeCreationDeferred;
|
|
return _super(modelManager, messagingValues);
|
|
},
|
|
});
|
|
|
|
const messagingValues = {
|
|
start() {
|
|
return {
|
|
isInQUnitTest: true,
|
|
disableAnimation: true,
|
|
loadingBaseDelayDuration,
|
|
messagingBus,
|
|
userNotificationManager: { canPlayAudio: false },
|
|
};
|
|
}
|
|
};
|
|
|
|
services = {
|
|
bus_service: busService,
|
|
im_status: imStatusService,
|
|
messaging: messagingService,
|
|
messagingValues,
|
|
presence: makeFakePresenceService({
|
|
isOdooFocused: () => true,
|
|
}),
|
|
systrayService,
|
|
multi_tab: multiTabService,
|
|
...services,
|
|
};
|
|
|
|
Object.entries(services).forEach(([serviceName, service]) => {
|
|
serviceRegistry.add(serviceName, service);
|
|
});
|
|
|
|
registry.category('wowlToLegacyServiceMappers').add('bus_service_to_legacy_env', makeBusServiceToLegacyEnv);
|
|
registry.category('wowlToLegacyServiceMappers').add('multi_tab_to_legacy_env', makeMultiTabToLegacyEnv);
|
|
registry.category('wowlToLegacyServiceMappers').add('messaging_service_to_legacy_env', makeMessagingToLegacyEnv);
|
|
}
|
|
|
|
/**
|
|
* Creates a properly configured instance of WebClient, with the messaging service and all it's
|
|
* dependencies initialized.
|
|
*
|
|
* @param {Object} param0
|
|
* @param {Object} [param0.serverData]
|
|
* @param {Object} [param0.services]
|
|
* @param {Object} [param0.loadingBaseDelayDuration]
|
|
* @param {Object} [param0.messagingBeforeCreationDeferred]
|
|
* @param {EventBus} [param0.messagingBus] The event bus to be used by messaging.
|
|
* @returns {WebClient}
|
|
*/
|
|
async function getWebClientReady(param0) {
|
|
setupMainComponentRegistry();
|
|
|
|
const servicesParameters = {};
|
|
const param0Entries = Object.entries(param0);
|
|
for (const [parameterName, value] of param0Entries) {
|
|
if (SERVICES_PARAMETER_NAMES.has(parameterName)) {
|
|
servicesParameters[parameterName] = value;
|
|
}
|
|
}
|
|
setupMessagingServiceRegistries(servicesParameters);
|
|
|
|
const webClientParameters = {};
|
|
for (const [parameterName, value] of param0Entries) {
|
|
if (WEBCLIENT_PARAMETER_NAMES.has(parameterName)) {
|
|
webClientParameters[parameterName] = value;
|
|
}
|
|
}
|
|
return createWebClient(webClientParameters);
|
|
}
|
|
|
|
export {
|
|
getWebClientReady,
|
|
ROUTES_TO_IGNORE,
|
|
};
|