
# pip install geojson tornado pyzmq

import tornado.httpserver
import tornado.websocket
import tornado.ioloop
import tornado.web

import zmq
import zmq.eventloop.ioloop
from zmq.eventloop.zmqstream import ZMQStream
zmq.eventloop.ioloop.install()

class MyStaticFileHandler(tornado.web.StaticFileHandler):
    def set_extra_headers(self, path):
        # Disable cache
        self.set_header('Cache-Control', 'no-store, no-cache, must-revalidate, max-age=0')

class WSHandler(tornado.websocket.WebSocketHandler):

  def initialize(self, zmq_ctx, zmq_sub):
    self.sub = zmq_ctx.socket(zmq.SUB)
    self.sub.connect(zmq_sub)
    self.sub.setsockopt(zmq.SUBSCRIBE, "")
    self.stream = ZMQStream(self.sub)

    def push(msg):
        if self.ws_connection is not None:
          self.write_message(msg[0])

    self.stream.on_recv(push)

  def open(self):
      print 'new connection'
      #self.write_message("Hello World")

  def on_message(self, message):
      # TODO get message that sets SUBSCRIBE options
      print 'message received %s' % message

  def on_close(self):
    print 'connection closed'
    self.stream.close()

if __name__ == "__main__": 

  ws_port = 8888
    
  zmq_sub = 'tcp://127.0.0.1:5000'
  zmq_ctx = zmq.Context()
 
  application = tornado.web.Application([
    (r'/ws', WSHandler, dict(zmq_ctx=zmq_ctx, zmq_sub=zmq_sub)),
    (r'/(.*)', MyStaticFileHandler,{'path':"./static/"}), 
    #(r'/(.*)', tornado.web.StaticFileHandler,{'path':"./static/"}), 
  ])
  http_server = tornado.httpserver.HTTPServer(application)
  http_server.listen(ws_port)
  zmq.eventloop.ioloop.IOLoop.instance().start()
