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()