changeset 64:559c48a58254

Added the option to long poll instead of using mime multipart.
author Atul Varma <varmaa@toolness.com>
date Thu, 30 Apr 2009 06:42:13 -0700
parents b19641a0d5ad
children 75866941af83
files openwebchat.js openwebchat.py
diffstat 2 files changed, 33 insertions(+), 7 deletions(-) [+]
line wrap: on
line diff
--- 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)
--- 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)