diff options
author | Jesse Luehrs <doy@tozt.net> | 2014-09-23 20:29:31 -0400 |
---|---|---|
committer | Jesse Luehrs <doy@tozt.net> | 2014-09-23 20:29:31 -0400 |
commit | 18cbe913dc4ccde27aa518713d2f4f3376f9dba9 (patch) | |
tree | 2fb1be8e4e8c76fe8644eb1f01f9c682f09ea7c1 | |
parent | 1525c33ba5fceeb5558b98c9f6e197d28aaa8770 (diff) | |
download | python-termcast-server-18cbe913dc4ccde27aa518713d2f4f3376f9dba9.tar.gz python-termcast-server-18cbe913dc4ccde27aa518713d2f4f3376f9dba9.zip |
basic structure of the websockets communication
-rw-r--r-- | termcast_server/__init__.py | 2 | ||||
-rw-r--r-- | termcast_server/index.html | 45 | ||||
-rw-r--r-- | termcast_server/web.py | 41 |
3 files changed, 68 insertions, 20 deletions
diff --git a/termcast_server/__init__.py b/termcast_server/__init__.py index 98cf7d9..b43a8e9 100644 --- a/termcast_server/__init__.py +++ b/termcast_server/__init__.py @@ -44,7 +44,7 @@ class Server(object): def wait_for_web_connection(self, sock): sock.setblocking(0) sock.listen(100) - web.start_server(sock) + web.start_server(sock, self.publisher) def handle_ssh_connection(self, client): self._handle_connection( diff --git a/termcast_server/index.html b/termcast_server/index.html index e7cd8dd..74c1d3e 100644 --- a/termcast_server/index.html +++ b/termcast_server/index.html @@ -1,21 +1,52 @@ <!DOCTYPE html> <html> <head> + <style> +.menu { + display: none; +} + +.term { + display: none; +} + </style> <script> var url = location.origin.replace(/^http/, 'ws') + "/-/"; -var socket = new WebSocket(url); +socket = new WebSocket(url); socket.onopen = function (e) { - // XXX + socket.send(JSON.stringify({"type": "request_streamer_list"})); }; socket.onmessage = function (e) { - // XXX -}; -socket.onclose = function (e) { - // XXX + console.log(e.data); + var data = JSON.parse(e.data); + var type = data.type; + + if (type == "streamer_list") { + document.querySelector('.term').style.setProperty('display', 'none'); + var menudiv = document.querySelector('.menu'); + var menu = '<ul>'; + data.streamers.forEach(function (streamer) { + menu += '<li><a href="#" onclick=' + "'socket.send(JSON.stringify({\"type\": \"start_watching\", \"who\": \"" + streamer.id + "\"}))'" + '>' + streamer.name + '</a></li>'; + }); + menu += '</ul>'; + menudiv.innerHTML = menu; + menudiv.style.setProperty('display', 'block'); + } + else if (type == "update_screen") { + document.querySelector('.menu').style.setProperty('display', 'none'); + var termdiv = document.querySelector('.term'); + // XXX + termdiv.innerHTML = "<h1>It's a terminal</h1>"; + termdiv.style.setProperty('display', 'block'); + } + else if (type == "streamer_disconnect") { + socket.send(JSON.stringify({"type": "request_streamer_list"})); + } }; </script> </head> <body> - <h1>Hello World</h1> + <div class="menu"></div> + <div class="term"></div> </body> </html> diff --git a/termcast_server/web.py b/termcast_server/web.py index 6b45632..2baca26 100644 --- a/termcast_server/web.py +++ b/termcast_server/web.py @@ -1,4 +1,5 @@ from pkg_resources import resource_string +import json import tornado import tornado.httpserver import tornado.ioloop @@ -10,25 +11,41 @@ class RootHandler(tornado.web.RequestHandler): self.write(resource_string(__name__, "index.html")) class WebSocketHandler(tornado.websocket.WebSocketHandler): - def open(self): - # XXX - pass + def initialize(self, publisher): + self.publisher = publisher + self.watching_id = None + self.initialized = False + self.publisher.subscribe(self) def on_message(self, message): - # XXX - pass + print(message) + data = json.loads(message) + if data["type"] == "request_streamer_list": + streamers = self.publisher.request_all("get_streamers") + reply = { + "type": "streamer_list", + "streamers": [ { "id": s["id"], "name": s["name"].decode('utf-8', 'replace') } for s in streamers ], + } + self.write_message(json.dumps(reply)) + elif data["type"] == "start_watching": + self.watching_id = data["who"] + self.publisher.notify("new_viewer", self.watching_id) - def close(self): - # XXX - pass + def on_finish(self): + self.publisher.unsubscribe(self) -def make_app(): + def msg_new_data(self, connection_id, prev_buf, data): + if self.watching_id != connection_id: + return + self.write_message(json.dumps({"type": "update_screen"})) + +def make_app(publisher): return tornado.web.Application([ ('/', RootHandler), - ('/-/', WebSocketHandler), + ('/-/', WebSocketHandler, dict(publisher=publisher)), ]) -def start_server(sock): - server = tornado.httpserver.HTTPServer(make_app()) +def start_server(sock, publisher): + server = tornado.httpserver.HTTPServer(make_app(publisher)) server.add_socket(sock) tornado.ioloop.IOLoop.instance().start() |