From 199b555b696e3466288ebf1ac2893e10019b00d3 Mon Sep 17 00:00:00 2001 From: LV-426 Date: Fri, 2 Jan 2015 17:52:22 +0200 Subject: init_ws_interface(): adapt to rz_kernel, hook ws multicasts to REST triggers (wip) --- src/server/rz_mesh.py | 58 ++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 44 insertions(+), 14 deletions(-) (limited to 'src') 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/') + f = route_dec(socketio_route_handler) + flask_webapp.f = f - socketio_entry_set = [ - socketio_entry('/socket.io/' , 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; -- cgit v1.3.1