from tornado.web import Application from tfw.networking.controller_connector import ControllerConnector from tfw.networking.serialization import deserialize_all, serialize_all from tfw.networking.server.zmq_websocket_handler import FSMManagingSocketHandler class TFWServer: def __init__(self, fsm_type): self._fsm = fsm_type() self.application = Application( [(r'/ws', FSMManagingSocketHandler, {'fsm': self.fsm})] ) self.controller_connector = ControllerConnector() self.controller_connector.register_callback(self.handle_controller_request) self.controller_request_handlers = { 'solution_check': self.handle_solution_check_request, 'test': self.handle_test_request } @property def fsm(self): return self._fsm def handle_controller_request(self, stream, msg_parts): key, data = deserialize_all(*msg_parts) response = self.controller_request_handlers[key](data) stream.send_multipart(serialize_all(key, response)) def handle_test_request(self, data): return 'OK' def handle_solution_check_request(self, data): return { 'solved': self.fsm.is_solved(), 'message': 'solved' if self.fsm.is_solved() else 'not solved' } def listen(self, port): self.application.listen(port)