changeset 68:84bf6a3ac4ec

All XMLHttpRequest actions are now handled by jquery, which should help with error detection a lot, and long polling logic is much better now. mime multipart is disabled for the time being.
author Atul Varma <varmaa@toolness.com>
date Thu, 30 Apr 2009 11:57:28 -0700
parents 4f449ed51dd3
children 9004f7daf4c4
files openwebchat.js
diffstat 1 files changed, 43 insertions(+), 60 deletions(-) [+]
line wrap: on
line diff
--- a/openwebchat.js	Thu Apr 30 11:29:56 2009 -0700
+++ b/openwebchat.js	Thu Apr 30 11:57:28 2009 -0700
@@ -28,69 +28,53 @@
     };
   },
 
-  startMessageListener: function startMessageListener(options) {
+  SEND_TIMEOUT: 10000,
+
+  LISTEN_TIMEOUT: 60000,
+
+  listenForMessages: function listenForMessages(options) {
     var self = this;
-    var req = new XMLHttpRequest();
-    var basePath = 'listen';
-    if (options.useMultipart) {
-      req.multipart = true;
-      basePath += '/multipart';
+
+    function processMessage(msg) {
+      options.storage.append(msg);
+      options.onMessage(msg);
     }
-    req.open('GET',
-             basePath + '?start=' + options.storage.length,
-             true);
-    req.overrideMimeType('application/json');
-    req.addEventListener(
-      "error",
-      function() {
-        options.onError(null);
-      },
-      false
-    );
-    req.addEventListener(
-      "load",
-      function onload(evt) {
-        var data;
-        var errorOccurred = false;
-        try {
-          data = JSON.parse(req.responseText);
-        } catch (e) {
-          options.onError(e);
-          errorOccurred = true;
-        }
-        if (!errorOccurred) {
-          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
-    );
-    req.send(null);
+
+    jQuery.ajax(
+      {type: 'GET',
+       url: 'listen',
+       data: {start: options.storage.length},
+       dataType: 'json',
+       timeout: self.LISTEN_TIMEOUT,
+       error: function(xhr, textStatus, errorThrown) {
+         if (textStatus == "timeout")
+           // Start another long poll.
+           self.listenForMessages(options);
+         else
+           options.onError([textStatus, errorThrown]);
+       },
+       success: function(data, textStatus) {
+         // 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.listenForMessages(options);
+       }
+      });
   },
 
   sendMessage: function sendMessage(options) {
-    var req = new XMLHttpRequest();
-    req.open('POST', 'send', true);
-    req.overrideMimeType('application/json');
-    req.addEventListener(
-      "error",
-      function() {
-        options.onError(null);
-      },
-      false
-    );
-    req.send(JSON.stringify(options.message));
+    jQuery.ajax(
+      {type: 'POST',
+       url: 'send',
+       contentType: 'application/json',
+       data: JSON.stringify(options.message),
+       processData: false,
+       timeout: this.LISTEN_TIMEOUT,
+       error: function(xhr, textStatus, errorThrown) {
+         options.onError([textStatus, errorThrown]);
+       }
+      });
   }
 };
 
@@ -198,9 +182,8 @@
         }
         window.setTimeout(showStoredConversation, UI_BREATHE_TIME);
       } else
-        OpenWebChat.startMessageListener(
+        OpenWebChat.listenForMessages(
           {storage: convStorage,
-           useMultipart: false,
            onMessage: onMessage,
            onError: function onError(exception) {
              if (window.console)