aboutsummaryrefslogtreecommitdiffstats
path: root/termcast_server
diff options
context:
space:
mode:
authorJesse Luehrs <doy@tozt.net>2014-09-23 20:29:31 -0400
committerJesse Luehrs <doy@tozt.net>2014-09-23 20:29:31 -0400
commit18cbe913dc4ccde27aa518713d2f4f3376f9dba9 (patch)
tree2fb1be8e4e8c76fe8644eb1f01f9c682f09ea7c1 /termcast_server
parent1525c33ba5fceeb5558b98c9f6e197d28aaa8770 (diff)
downloadpython-termcast-server-18cbe913dc4ccde27aa518713d2f4f3376f9dba9.tar.gz
python-termcast-server-18cbe913dc4ccde27aa518713d2f4f3376f9dba9.zip
basic structure of the websockets communication
Diffstat (limited to 'termcast_server')
-rw-r--r--termcast_server/__init__.py2
-rw-r--r--termcast_server/index.html45
-rw-r--r--termcast_server/web.py41
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()