Mercurial > cosocket
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)