From 068b3878241c015a8570964eba475ff805453148 Mon Sep 17 00:00:00 2001 From: LV-426 Date: Fri, 23 Jan 2015 03:13:37 +0200 Subject: avoid dual websocket diff-obj emission if call path originates from WebSocket_Graph_NS through stack inspection --- src/server/rz_mesh.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) (limited to 'src/server') diff --git a/src/server/rz_mesh.py b/src/server/rz_mesh.py index dcc696c4..507ca71a 100644 --- a/src/server/rz_mesh.py +++ b/src/server/rz_mesh.py @@ -3,6 +3,7 @@ from flask import Response from flask import request from functools import wraps from geventwebsocket.handler import WebSocketHandler +import inspect import logging from socketio import socketio_manage from socketio.server import SocketIOHandler @@ -88,8 +89,20 @@ def init_ws_interface(cfg, kernel, flask_webapp): @wraps(f) def wrapped_function(*args, **kw): + f_ret = f(*args, **kw) + try: + # TODO: avoid stack inspection if possible + stack = inspect.stack() + caller_class = stack[1][0].f_locals["self"].__class__ + if WebSocket_Graph_NS == caller_class: + # [!] no need emit broadcast if call originated from a websocket as + # WebSocket_Graph_NS#on_diff_commit__xxx emit their own self-excluding multicast + return f_ret + except Exception as e: + log.exception('decorator__ws_multicast: failed to differentiate REST vs Websocket call path based on stack state', e) + assert type(f_ret) in [list, tuple] pkt_data = map(_prep_for_serialization, f_ret) -- cgit v1.3.1