aboutsummaryrefslogtreecommitdiffstats
path: root/fg21sim/webui/handlers
diff options
context:
space:
mode:
authorAaron LI <aaronly.me@outlook.com>2016-11-15 20:50:18 +0800
committerAaron LI <aaronly.me@outlook.com>2016-11-15 20:50:18 +0800
commit81d8455ce56e6c94f3f97089255ed155489764e9 (patch)
tree0b42df3e3f1aaefc897ddeaa597db192bea6e3db /fg21sim/webui/handlers
parentc23498126941c94fd1bbf521995684b7e02bf1d5 (diff)
downloadfg21sim-81d8455ce56e6c94f3f97089255ed155489764e9.tar.bz2
webui: Save connected WebSocket clients and allow broadcast
Diffstat (limited to 'fg21sim/webui/handlers')
-rw-r--r--fg21sim/webui/handlers/websocket.py30
1 files changed, 19 insertions, 11 deletions
diff --git a/fg21sim/webui/handlers/websocket.py b/fg21sim/webui/handlers/websocket.py
index 6031109..941dd39 100644
--- a/fg21sim/webui/handlers/websocket.py
+++ b/fg21sim/webui/handlers/websocket.py
@@ -59,18 +59,15 @@ class FG21simWSHandler(tornado.websocket.WebSocketHandler):
from_localhost = None
def check_origin(self, origin):
- """Check the origin of the WebSocket access.
+ """
+ Check the origin of the WebSocket connection to determine whether
+ the access is allowed.
Attributes
----------
from_localhost : bool
- Set to ``True`` if the access is from the localhost,
- otherwise ``False``.
-
- NOTE
- ----
- Currently, only allow access from the ``localhost``
- (i.e., 127.0.0.1) and local LAN.
+ Set to ``True`` if the access is from the "localhost" (i.e.,
+ 127.0.0.1), otherwise ``False``.
"""
self.from_localhost = False
logger.info("WebSocket: {0}: origin: {1}".format(self.name, origin))
@@ -96,9 +93,11 @@ class FG21simWSHandler(tornado.websocket.WebSocketHandler):
def open(self):
"""Invoked when a new WebSocket is opened by the client."""
+ # Add to the set of current connected clients
+ self.application.ws_clients.add(self)
+ logger.warning("Added new WebSocket client: {0}".format(self))
# FIXME:
# * better to move to the `Application` class ??
- # * or create a ``ConfigsHandler`` similar to the ``ConsoleHandler``
self.configs = self.application.configmanager
self.console_handler = ConsoleHandler(websocket=self)
self.configs_handler = ConfigsHandler(configs=self.configs)
@@ -108,12 +107,15 @@ class FG21simWSHandler(tornado.websocket.WebSocketHandler):
def on_close(self):
"""Invoked when a new WebSocket is closed by the client."""
+ # Remove from the set of current connected clients
+ self.application.ws_clients.remove(self)
+ logger.warning("Removed WebSocket client: {0}".format(self))
code, reason = None, None
if hasattr(self, "close_code"):
code = self.close_code
if hasattr(self, "close_reason"):
reason = self.close_reason
- logger.info("WebSocket: {0}: closed by client: {1}, {2}".format(
+ logger.warning("WebSocket: {0}: closed by client: {1}, {2}".format(
self.name, code, reason))
# FIXME/XXX:
@@ -123,7 +125,8 @@ class FG21simWSHandler(tornado.websocket.WebSocketHandler):
# [1] https://stackoverflow.com/a/35543856/4856091
# [2] https://stackoverflow.com/a/33724486/4856091
def on_message(self, message):
- """Handle incoming messages and dispatch task according to the
+ """
+ Handle incoming messages and dispatch task according to the
message type.
NOTE
@@ -184,6 +187,11 @@ class FG21simWSHandler(tornado.websocket.WebSocketHandler):
msg_response = json.dumps(response)
self.write_message(msg_response)
+ def broadcast(self, message):
+ """Broadcast/push the given message to all connected clients."""
+ for ws in self.application.ws_clients:
+ ws.write_message(message)
+
def _handle_results(self, msg):
# Got a message of supported types
msg_type = msg["type"]