How reloadmypage.com works

reloadmypage.com is a simple scheme for reloading web pages using a small fragment of Javascript, and a server that handles the Comet request.

The client-side code uses jquery-jsonp to make a request to a /wait/X URL:

function reloadmypage(tag) {
    $(document).ready(function() {
        $.jsonp({
          url: "http://reloadmypage.com/wait/" + tag + "/",
          timeout: 600000,
          callbackParameter: "callback",
          success: function() { window.location.reload() },
          dataType: "jsonp"})});
}

The server running on loadmypage.com is running a small twisted program:

from twisted.internet import reactor, defer
from twisted.internet.task import deferLater
from twisted.web.server import Site, NOT_DONE_YET
from twisted.web.resource import Resource

import json

class LivePage(Resource):
    isLeaf = True

    def __init__(self):
        Resource.__init__(self)
        self.board = {}

    def render_GET(self, request):
        (op, token) = request.postpath[:2]
        remainder = request.postpath[2:]
        if op == 'wait':
            callbackName = request.args['callback'][0]
            d = defer.Deferred()
            d.addCallback(lambda(x): (request, callbackName, x))
            d.addCallback(self._delayedRender)
            self.board[token] = self.board.get(token, []) + [d]
            return NOT_DONE_YET
        elif op == 'wake':
            waiters = self.board.get(token, [])
            for w in waiters:
                w.callback(remainder)
            if len(waiters) > 0:
                del self.board[token]
            return "<html>Woke %d</html>" % len(waiters)

    def _delayedRender(self, rx):
        (request, callbackName, x) = rx
        request.write("%s(%s)" % (callbackName, json.dumps(x)))
        request.finish()

site = Site(LivePage())
reactor.listenTCP(8888, site)
reactor.run()

It's a fairly simple thing: board is a dictionary of outstanding waiting clients; when a '/wake/X' request comes in, each waiting client gets worken. The requests use JSONP, so they can work cross-site. If you implemented your own server for a local site you could just use plain old JSON.