19.0 vanilla

This commit is contained in:
Ernad Husremovic 2026-03-09 09:30:27 +01:00
parent d1963a3c3a
commit 2d3ee4855a
7430 changed files with 2687981 additions and 2965473 deletions

View file

@ -0,0 +1,122 @@
import { after, Deferred, mockWorker } from "@odoo/hoot";
import { MockServer, patchWithCleanup } from "@web/../tests/web_test_helpers";
import { WebsocketWorker } from "@bus/workers/websocket_worker";
import { patch } from "@web/core/utils/patch";
//-----------------------------------------------------------------------------
// Internal
//-----------------------------------------------------------------------------
function cleanupWebSocketCallbacks() {
wsCallbacks?.clear();
wsCallbacks = null;
}
function cleanupWebSocketWorker() {
if (currentWebSocketWorker.connectTimeout) {
clearTimeout(currentWebSocketWorker.connectTimeout);
}
currentWebSocketWorker.firstSubscribeDeferred = new Deferred();
currentWebSocketWorker.websocket = null;
currentWebSocketWorker = null;
}
function getWebSocketCallbacks() {
if (!wsCallbacks) {
wsCallbacks = new Map();
after(cleanupWebSocketCallbacks);
}
return wsCallbacks;
}
function setupWebSocketWorker() {
currentWebSocketWorker = new WebsocketWorker();
mockWorker(function onWorkerConnected(worker) {
currentWebSocketWorker.registerClient(worker._messageChannel.port2);
});
}
/** @type {WebsocketWorker | null} */
let currentWebSocketWorker = null;
/** @type {Map<string, (data: any) => any> | null} */
let wsCallbacks = null;
//-----------------------------------------------------------------------------
// Exports
//-----------------------------------------------------------------------------
export function getWebSocketWorker() {
return currentWebSocketWorker;
}
/**
* @param {string} eventName
* @param {(data: any) => any} callback
*/
export function onWebsocketEvent(eventName, callback) {
const callbacks = getWebSocketCallbacks();
if (!callbacks.has(eventName)) {
callbacks.set(eventName, new Set());
}
callbacks.get(eventName).add(callback);
return function offWebsocketEvent() {
callbacks.get(eventName).delete(callback);
};
}
//-----------------------------------------------------------------------------
// Setup
//-----------------------------------------------------------------------------
patchWithCleanup(MockServer.prototype, {
start() {
setupWebSocketWorker();
after(cleanupWebSocketWorker);
return super.start(...arguments);
},
});
patch(WebsocketWorker.prototype, {
INITIAL_RECONNECT_DELAY: 0,
RECONNECT_JITTER: 5,
// `runAllTimers` advances time based on the longest registered timeout.
// Some tests rely on the fragile assumption that time wont advance too much.
// Disable the interval until those tests are rewritten to be more robust.
enableCheckInterval: false,
_restartConnectionCheckInterval() {
if (this.enableCheckInterval) {
super._restartConnectionCheckInterval(...arguments);
}
},
_sendToServer(message) {
const { env } = MockServer;
if (!env) {
return;
}
if ("bus.bus" in env && "ir.websocket" in env) {
if (message.event_name === "update_presence") {
const { inactivity_period, im_status_ids_by_model } = message.data;
env["ir.websocket"]._update_presence(inactivity_period, im_status_ids_by_model);
} else if (message.event_name === "subscribe") {
const { channels } = message.data;
env["bus.bus"].channelsByUser[env.uid] = channels;
}
}
// Custom callbacks
for (const callback of wsCallbacks?.get(message.event_name) || []) {
callback(message.data);
}
return super._sendToServer(message);
},
});