summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/rz_mesh.py58
1 files changed, 44 insertions, 14 deletions
diff --git a/src/server/rz_mesh.py b/src/server/rz_mesh.py
index c97f8809..b73ac5f6 100644
--- a/src/server/rz_mesh.py
+++ b/src/server/rz_mesh.py
@@ -72,6 +72,7 @@ class RZ_WebSocket_Server(SocketIOServer):
multicast_size = len(self.sockets) - 1 # subtract self socket
log.info('ws: multicast: msg: \'%s\', cast-size ~= %d' % (msg_name, multicast_size)) # ~=: as race conditions apply
+def init_ws_interface(cfg, kernel, flask_webapp):
"""
Initialize websocket interface:
- apply websocket route handlers
@@ -79,27 +80,56 @@ class RZ_WebSocket_Server(SocketIOServer):
@return: an initialized RZ_WebSocket_Server object
"""
- def socketio(url_path):
+ rz_request_env = {} # available in namespace functions via 'self.request' - see socketio_manage
+ def socketio_route_handler(url_path):
try:
- socketio_manage(request.environ, {'/graph': WebSocket_Graph_NS}, request)
+ socketio_manage(request.environ, {'/graph': WebSocket_Graph_NS}, rz_request_env)
except:
flask_webapp.logger.error("Exception while handling socketio connection",
exc_info=True)
return Response()
- def socketio_entry(path, f, flask_args={}):
- return (path, f, flask_args)
+ # connect socketio route
+ route_dec = flask_webapp.route('/socket.io/<path:url_path>')
+ f = route_dec(socketio_route_handler)
+ flask_webapp.f = f
- socketio_entry_set = [
- socketio_entry('/socket.io/<path:url_path>' , socketio),
- ]
+ # init ws server
+ ws_srv = RZ_WebSocket_Server(cfg, flask_webapp)
- for sio_entry in socketio_entry_set:
- sio_path, f, flask_args = sio_entry
+ # link ws hooks: multicast on topo_diff, attr_diff
+ def decorator__ws_multicast(ws_srv, f, f_multicast):
+ """
+ @param f: [!] wrapped function, name used to derive socket message name
+ """
- route_dec = flask_webapp.route(sio_path, **flask_args)
- f = route_dec(f)
- flask_webapp.f = f
+ @wraps(f)
+ def wrapped_function(*args, **kw):
+ f_ret = f(*args, **kw)
- ret = RZ_WebSocket_Server(cfg, flask_webapp)
- return ret;
+ pkt_data = f_ret
+ if isinstance(f_ret, Topo_Diff):
+ pkt_data = f_ret.to_json_dict()
+
+ msg_name = f.__name__
+ pkt = dict(type="event",
+ name=msg_name,
+ args=[pkt_data],
+ endpoint='/graph')
+
+ ws_srv.log_multicast(msg_name)
+ for sessid, socket in ws_srv.sockets.iteritems():
+ socket.send_packet(pkt)
+
+ return f_ret
+
+ return wrapped_function
+
+ kernel.diff_commit__topo = decorator__ws_multicast(ws_srv,
+ kernel.diff_commit__topo,
+ f_multicast=WebSocket_Graph_NS.on_diff_commit__topo)
+ kernel.diff_commit__attr = decorator__ws_multicast(ws_srv,
+ kernel.diff_commit__attr,
+ f_multicast=WebSocket_Graph_NS.on_diff_commit__attr)
+
+ return ws_srv;