Mercurial > code > home > repos > homeauto
comparison lib/twisted_sse/sse_server.py @ 1313:630e0d1846b8
mv twisted_sse
Ignore-this: a59fadbe80bc4a393b1dab8228e022c1
darcs-hash:dc218d166be8566000cc59eabaa71b2f9667fe9b
author | drewp <drewp@bigasterisk.com> |
---|---|
date | Mon, 22 Apr 2019 21:58:09 -0700 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
1312:3c732f3f9f65 | 1313:630e0d1846b8 |
---|---|
1 import sys | |
2 | |
3 from twisted.web import server, resource | |
4 from twisted.internet import reactor | |
5 from twisted.python import log | |
6 | |
7 | |
8 class Root(resource.Resource): | |
9 """ | |
10 Root resource; serves JavaScript | |
11 """ | |
12 def getChild(self, name, request): | |
13 if name == '': | |
14 return self | |
15 return resource.Resource.getChild(self, name, request) | |
16 | |
17 def render_GET(self, request): | |
18 return r""" | |
19 <html> | |
20 <head> | |
21 <script language="JavaScript"> | |
22 eventSource = new EventSource("http://localhost:12000/subscribe"); | |
23 eventSource.onmessage = function(event) { | |
24 element = document.getElementById("event-data"); | |
25 element.innerHTML = event.data; | |
26 }; | |
27 </script> | |
28 </head> | |
29 <body> | |
30 <h1> Welcome to the SSE demo </h1> | |
31 <h3> Event data: </h3> | |
32 <p id="event-data"></p> | |
33 </body> | |
34 </html> | |
35 """ | |
36 | |
37 | |
38 class Subscribe(resource.Resource): | |
39 """ | |
40 Implements the subscribe resource | |
41 """ | |
42 isLeaf = True | |
43 | |
44 def __init__(self): | |
45 self.subscribers = set() | |
46 | |
47 def render_GET(self, request): | |
48 request.setHeader('Content-Type', 'text/event-stream; charset=utf-8') | |
49 request.setResponseCode(200) | |
50 self.subscribers.add(request) | |
51 d = request.notifyFinish() | |
52 d.addBoth(self.removeSubscriber) | |
53 log.msg("Adding subscriber...") | |
54 request.write("") | |
55 return server.NOT_DONE_YET | |
56 | |
57 def publishToAll(self, data): | |
58 for subscriber in self.subscribers: | |
59 for line in data: | |
60 subscriber.write("data: %s\r\n" % line) | |
61 # NOTE: the last CRLF is required to dispatch the event at the client | |
62 subscriber.write("\r\n") | |
63 | |
64 def removeSubscriber(self, subscriber): | |
65 if subscriber in self.subscribers: | |
66 log.msg("Removing subscriber..") | |
67 self.subscribers.remove(subscriber) | |
68 | |
69 | |
70 class Publish(resource.Resource): | |
71 """ | |
72 Implements the publish resource | |
73 """ | |
74 isLeaf = True | |
75 | |
76 def __init__(self, subscriber): | |
77 self.subscriber = subscriber | |
78 | |
79 def render_POST(self, request): | |
80 if 'data' not in request.args: | |
81 request.setResponseCode(400) | |
82 return "The parameter 'data' must be set\n" | |
83 data = request.args.get('data') | |
84 self.subscriber.publishToAll(data) | |
85 return 'Thank you for publishing data %s\n' % '\n'.join(data) | |
86 | |
87 | |
88 root = Root() | |
89 subscribe = Subscribe() | |
90 root.putChild('subscribe', subscribe) | |
91 root.putChild('publish', Publish(subscribe)) | |
92 site = server.Site(root) | |
93 reactor.listenTCP(12000, site) | |
94 log.startLogging(sys.stdout) | |
95 reactor.run() |