def run(self): self.sock.setblocking(True) with Heartbeat(self, frequency=self.heartbeat_freq): s = self.stream try: self.opened() while not self.terminated: if not self._input.empty(): item = self._input.get() self.send(item) if not self.once(): print("Breaking") break finally: print("terminating") self.terminate()
def _keep_alive(self): '''Send a keep-alive packet to Firebase''' Timer(10.0, lambda: Heartbeat(self.connection.data, 2).start()).start()
def __init__(self, sock, protocols=None, extensions=None, environ=None, heartbeat_freq=30.0): WebSocket.__init__(self, sock, protocols=None, extensions=None, environ=None, heartbeat_freq=heartbeat_freq) self.hb = Heartbeat(self, 30.0) self.hb.setDaemon(True) self.hb.start()
class ChatWebSocketHandler(WebSocket): room_list = [] socket_user_map = {} def __init__(self, sock, protocols=None, extensions=None, environ=None, heartbeat_freq=30.0): WebSocket.__init__(self, sock, protocols=None, extensions=None, environ=None, heartbeat_freq=heartbeat_freq) self.hb = Heartbeat(self, 30.0) self.hb.setDaemon(True) self.hb.start() def opened(self): self.socket_user_map[self] = None def closed(self, code, reason="A client left the room without a proper explanation."): cherrypy.engine.publish('websocket-broadcast', TextMessage(reason)) username = self.socket_user_map[self] del self.socket_user_map[self] if username in self.room_list: self.room_list.remove(username) def broadcast_room_list(self): room_list_msg = { "type": "INFO", "info": "ROOM_LIST", "data": self.room_list } broadast_message(room_list_msg) def received_message(self, m): try: return_msg = msg = json.loads(m.data) cherrypy.log("Recieved: %s" % msg) if msg['type'] != 'CODE': bad_string = '<script' for k in msg: if bad_string in msg[k]: return # eventually this if thing should be a pub/sub or some other event/factory pattern if msg['type'] == "CMD": if msg['command'] == "NAME_CHANGE": self.room_list[self.room_list.index(msg['username'])] = msg['new_name'] self.room_list.sort() self.broadcast_room_list() self.socket_user_map[self] = msg['new_name'] return_msg = { "type": "EVENT", "event": "NAME_CHANGED", "username": msg['username'], "new_name": msg['new_name'] } elif msg['type'] == "EVENT": if msg['event'] == "FIRST_SIGN_ON": userid = 'User%d' % (random.randrange(0,100)) if 'username' in msg: userid = msg['username'] if userid in self.room_list: userid += str((random.randrange(0,100))) msg['username'] = userid msg['title'] = 'MockingJay' msg['room_list'] = self.room_list msg['history'] = LAST_MSGS self.send(json.dumps(msg), False) self.room_list.append(userid) self.room_list.sort() self.broadcast_room_list() self.socket_user_map[self] = userid return_msg = { "type": 'EVENT', "event": 'SIGN_ON', "username": userid } elif msg ['event'] == "RESIGN_ON": userid = msg['username'] self.socket_user_map[self] = userid if userid not in self.room_list: self.room_list.append(userid) self.broadcast_room_list() return elif msg['event'] == "SIGN_OFF": username = msg['username'] if username in self.room_list: self.room_list.remove(username) self.broadcast_room_list() return_msg = { "type": 'EVENT', "event": 'SIGN_OFF', "username": msg['username'] } broadast_message(return_msg) except Exception, e: cherrypy.log(str(e), severity=logging.ERROR, traceback=True)