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.