# HG changeset patch # User Atul Varma # Date 1241098933 25200 # Node ID 559c48a58254afed908f7878b7ff04a21ae39455 # Parent b19641a0d5ade18d1cdc0285cb0f041dd902b9e6 Added the option to long poll instead of using mime multipart. diff -r b19641a0d5ad -r 559c48a58254 openwebchat.js --- a/openwebchat.js Wed Apr 29 16:26:21 2009 -0700 +++ b/openwebchat.js Thu Apr 30 06:42:13 2009 -0700 @@ -29,10 +29,15 @@ }, startMessageListener: function startMessageListener(options) { + var self = this; var req = new XMLHttpRequest(); - req.multipart = true; + var basePath = 'listen'; + if (options.useMultipart) { + req.multipart = true; + basePath += '/multipart'; + } req.open('GET', - 'listen/multipart?start=' + options.storage.length, + basePath + '?start=' + options.storage.length, true); req.overrideMimeType('application/json'); req.addEventListener( @@ -45,17 +50,28 @@ req.addEventListener( "load", function onload(evt) { - var msg; + var data; var errorOccurred = false; try { - msg = JSON.parse(req.responseText); + data = JSON.parse(req.responseText); } catch (e) { options.onError(e); errorOccurred = true; } if (!errorOccurred) { - options.storage.append(msg); - options.onMessage(msg); + function processMessage(msg) { + options.storage.append(msg); + options.onMessage(msg); + } + if (options.useMultipart) + processMessage(data); + else { + // TODO: Make sure data.messages is an array. + for (var i = 0; i < data.messages.length; i++) + processMessage(data.messages[i]); + // Start another long poll. + self.startMessageListener(options); + } } }, false @@ -184,6 +200,7 @@ } else OpenWebChat.startMessageListener( {storage: convStorage, + useMultipart: false, onMessage: onMessage, onError: function onError(exception) { if (window.console) diff -r b19641a0d5ad -r 559c48a58254 openwebchat.py --- a/openwebchat.py Wed Apr 29 16:26:21 2009 -0700 +++ b/openwebchat.py Thu Apr 30 06:42:13 2009 -0700 @@ -167,7 +167,16 @@ if match: querydict.update(_parse_qs(match.group(2))) page = match.group(1) - if page == 'listen/multipart': + if page == 'listen': + i = self._parse_id(querydict.get('start')) + conv = self._convs.get(conv_name) + while i >= len(conv): + yield channels.until_message_received(conv_name) + yield self._until_http_response_sent( + json.dumps({'messages': conv[i:]}), + mimetype = 'application/json' + ) + elif page == 'listen/multipart': i = self._parse_id(querydict.get('start')) yield self._until_multipart_header_sent(self.BOUNDARY) conv = self._convs.get(conv_name)