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.