diff options
| -rw-r--r-- | src/server/rz_mesh.py | 58 |
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; |
