def _ws_handler(self, request):
"""
Handle websocket connections.
This includes:
* new connections
* closed connections
* messages
"""
websocket = web.WebSocketResponse()
yield from websocket.prepare(request)
session = yield from get_session(request)
if session.new:
logger.debug('websocket: not logged in')
websocket.send_str(json.dumps({'status': 401, 'text': "Unauthorized"}))
websocket.close()
return websocket
self.websockets.append(websocket)
for func in self.on_ws_connect:
yield from func(websocket, session)
while True:
msg = yield from websocket.receive()
if msg.type == WSMsgType.CLOSE or msg.type == WSMsgType.CLOSED:
logger.debug('websocket closed')
break
logger.debug("websocket got: %s", msg)
if msg.type == WSMsgType.TEXT:
for func in self.on_ws_message:
yield from func(websocket, session, msg.data)
elif msg.type == WSMsgType.ERROR:
logger.debug('websocket closed with exception %s', websocket.exception())
yield from asyncio.sleep(0.1)
self.websockets.remove(websocket)
for func in self.on_ws_disconnect:
yield from func(session)
return websocket
### JRPC protocol ###
评论列表
文章目录