Skip to content

Instantly share code, notes, and snippets.

@orestis
Created February 3, 2014 16:48
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save orestis/8787510 to your computer and use it in GitHub Desktop.
Save orestis/8787510 to your computer and use it in GitHub Desktop.
import crochet
crochet.setup()
from twisted.web import resource, server
import random
from datetime import datetime
import json
def _format_sse(msg, event=None):
data = []
if event is not None:
data.append("event: {}\n".format(event))
for line in msg.splitlines():
data.append("data: {}\n".format(line))
data.append("\n")
return "".join(data)
class SSEResource(resource.Resource):
def __init__(self):
resource.Resource.__init__(self)
self._listeners = []
def add_listener(self, request):
print "listener connected", request
self._listeners.append(request)
request.notifyFinish().addBoth(self.remove_listener, request)
def remove_listener(self, reason, listener):
print "listener disconnected", listener, "reason", reason
self._listeners.remove(listener)
@crochet.run_in_reactor
def broadcast_message(self, msg, event=None):
self.broadcast_message_async(msg, event)
def broadcast_message_async(self, msg, event=None):
sse = _format_sse(msg, event)
for listener in self._listeners:
listener.write(sse)
def render_GET(self, request):
request.setHeader("Content-Type", "text/event-stream")
self.add_listener(request)
return server.NOT_DONE_YET
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment