From a313fb90cb39cda252b0a0e018b1efcd1a921232 Mon Sep 17 00:00:00 2001 From: Ankush Menat Date: Sat, 6 Apr 2024 18:18:37 +0530 Subject: [PATCH] fix(DX): no need to specify separate hook for socketio --- frappe/hooks.py | 4 ---- frappe/realtime.py | 8 +------- realtime/index.js | 37 +++++++++++++++++++++++++++---------- 3 files changed, 28 insertions(+), 21 deletions(-) diff --git a/frappe/hooks.py b/frappe/hooks.py index 47f7ad150c..3487a73fa5 100644 --- a/frappe/hooks.py +++ b/frappe/hooks.py @@ -543,7 +543,3 @@ default_log_clearing_doctypes = { "Activity Log": 90, "Route History": 90, } - -# Technically we have event handlers but `frappe` gets special treatment -# SocketIO server uses this to identify which apps to lookup for event handlers. -has_realtime_event_handlers = False diff --git a/frappe/realtime.py b/frappe/realtime.py index ad64c6b50d..f338d1a2fd 100644 --- a/frappe/realtime.py +++ b/frappe/realtime.py @@ -135,16 +135,10 @@ def can_subscribe_doctype(doctype: str) -> bool: @frappe.whitelist(allow_guest=True) def get_user_info(): - installed_apps = frappe.get_installed_apps() - - apps_with_event = [ - app for app in installed_apps if any(frappe.get_hooks("has_realtime_event_handlers", app_name=app)) - ] - return { "user": frappe.session.user, "user_type": frappe.session.data.user_type, - "installed_apps": apps_with_event, + "installed_apps": frappe.get_installed_apps(), } diff --git a/realtime/index.js b/realtime/index.js index b9e3a2575e..0e83c949d2 100644 --- a/realtime/index.js +++ b/realtime/index.js @@ -33,16 +33,12 @@ function on_connection(socket) { frappe_handlers(realtime, socket); socket.installed_apps.forEach((app) => { - let file = `../../${app}/realtime/handlers.js`; - let abs_path = path.resolve(__dirname, file); - if (fs.existsSync(abs_path)) { - try { - let handler_factory = require(file); - handler_factory(socket); - } catch (err) { - console.warn(`failed to load event handlers from ${abs_path}`); - console.warn(err); - } + let app_handler = get_app_handlers(app); + try { + app_handler && app_handler(socket); + } catch (err) { + console.warn(`failed to setup event handlers from ${app}`); + console.warn(err); } }); @@ -53,6 +49,27 @@ function on_connection(socket) { }); } +const _app_handlers = {}; +function get_app_handlers(app) { + if (app in _app_handlers) { + return _app_handlers[app]; + } + + let file = `../../${app}/realtime/handlers.js`; + let abs_path = path.resolve(__dirname, file); + let handler = null; + if (fs.existsSync(abs_path)) { + try { + handler = require(file); + } catch (err) { + console.warn(`failed to load event handlers from ${abs_path}`); + console.warn(err); + } + } + _app_handlers[app] = handler; + return handler; +} + realtime.on("connection", on_connection); // =======================