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