upgrade atmosphere to 1.0.8
Project: http://git-wip-us.apache.org/repos/asf/wicket/repo Commit: http://git-wip-us.apache.org/repos/asf/wicket/commit/91885d94 Tree: http://git-wip-us.apache.org/repos/asf/wicket/tree/91885d94 Diff: http://git-wip-us.apache.org/repos/asf/wicket/diff/91885d94 Branch: refs/heads/master Commit: 91885d948e1226764d84b7ef35ddc77e9d893375 Parents: bbdab9a Author: Emond Papegaaij <[email protected]> Authored: Thu Jan 10 08:47:16 2013 +0100 Committer: Emond Papegaaij <[email protected]> Committed: Thu Jan 10 08:47:16 2013 +0100 ---------------------------------------------------------------------- wicket-experimental/wicket-atmosphere/pom.xml | 2 +- .../apache/wicket/atmosphere/jquery.atmosphere.js | 159 +++++++++------ 2 files changed, 101 insertions(+), 60 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/wicket/blob/91885d94/wicket-experimental/wicket-atmosphere/pom.xml ---------------------------------------------------------------------- diff --git a/wicket-experimental/wicket-atmosphere/pom.xml b/wicket-experimental/wicket-atmosphere/pom.xml index 41d35d2..bdb3225 100644 --- a/wicket-experimental/wicket-atmosphere/pom.xml +++ b/wicket-experimental/wicket-atmosphere/pom.xml @@ -27,7 +27,7 @@ <version>0.7-SNAPSHOT</version> <packaging>jar</packaging> <properties> - <atmosphere.version>1.0.4</atmosphere.version> + <atmosphere.version>1.0.8</atmosphere.version> </properties> <name>Wicket-Atmosphere</name> <description>Wicket-Atmosphere provides integration of the Atmosphere Framework in Wicket.</description> http://git-wip-us.apache.org/repos/asf/wicket/blob/91885d94/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/jquery.atmosphere.js ---------------------------------------------------------------------- diff --git a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/jquery.atmosphere.js b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/jquery.atmosphere.js index 286c728..0a236ab 100644 --- a/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/jquery.atmosphere.js +++ b/wicket-experimental/wicket-atmosphere/src/main/java/org/apache/wicket/atmosphere/jquery.atmosphere.js @@ -49,7 +49,7 @@ jQuery.atmosphere = function() { }; return { - version : "1.0.3", + version : "1.0.8", requests : [], callbacks : [], @@ -65,7 +65,7 @@ jQuery.atmosphere = function() { }, onMessagePublished : function(response) { }, - onTransportFailure : function(response) { + onTransportFailure : function (reason, request) { }, onLocalMessage : function (response) { }, @@ -85,7 +85,7 @@ jQuery.atmosphere = function() { url : '', data : '', suspend : true, - maxRequest : 60, + maxRequest : -1, reconnect : true, maxStreamingLength : 10000000, lastIndex : 0, @@ -112,6 +112,7 @@ jQuery.atmosphere = function() { uuid : 0, shared : false, readResponsesHeaders : true, + maxReconnectOnClose: 5, onError : function(response) { }, onClose : function(response) { @@ -728,7 +729,7 @@ jQuery.atmosphere = function() { type : rq.method, dataType: "jsonp", error : function(jqXHR, textStatus, errorThrown) { - if (jqXHR.status < 300 && rq.requestCount++ < rq.maxRequest) { + if (jqXHR.status < 300) { _reconnect(_jqxhr, rq); } else { _prepareCallback(textStatus, "error", jqXHR.status, rq.transport); @@ -737,7 +738,7 @@ jQuery.atmosphere = function() { jsonp : "jsonpTransport", success: function(json) { - if (rq.requestCount++ < rq.maxRequest) { + if (rq.reconnect && (rq.maxRequest == -1 || rq.requestCount++ < rq.maxRequest)) { _readHeaders(_jqxhr, rq); if (!rq.executeCallbackBeforeReconnect) { @@ -798,7 +799,7 @@ jQuery.atmosphere = function() { url : url, type : rq.method, error : function(jqXHR, textStatus, errorThrown) { - if (jqXHR.status < 300 && rq.requestCount++ < rq.maxRequest) { + if (jqXHR.status < 300) { _reconnect(_jqxhr, rq); } else { _prepareCallback(textStatus, "error", jqXHR.status, rq.transport); @@ -806,7 +807,7 @@ jQuery.atmosphere = function() { }, success: function(data, textStatus, jqXHR) { - if (rq.requestCount++ < rq.maxRequest) { + if (rq.reconnect && (rq.maxRequest == -1 || rq.requestCount++ < rq.maxRequest)) { if (!rq.executeCallbackBeforeReconnect) { _reconnect(_jqxhr, rq); } @@ -895,7 +896,7 @@ jQuery.atmosphere = function() { if (!_request.reconnect) { if (_sse != null) { - _sse.close(); + _clearState(); } return; } @@ -904,7 +905,7 @@ jQuery.atmosphere = function() { if (_request.connectTimeout > 0) { _request.id = setTimeout(function() { if (!sseOpened) { - _sse.close(); + _clearState(); } }, _request.connectTimeout); } @@ -954,21 +955,20 @@ jQuery.atmosphere = function() { _response.responseBody = ""; _response.status = !sseOpened ? 501 : 200; _invokeCallback(); - _sse.close(); + _clearState(); if (_abordingConnection) { jQuery.atmosphere.log(_request.logLevel, ["SSE closed normally"]); } else if (!sseOpened) { _reconnectWithFallbackTransport("SSE failed. Downgrading to fallback transport and resending"); } else if (_request.reconnect && (_response.transport == 'sse')) { - _request.requestCount = _requestCount; - if (_requestCount++ < _request.maxRequest) { + if (_requestCount++ < _request.maxReconnectOnClose) { _request.id = setTimeout(function() { _executeSSE(true); }, _request.reconnectInterval); _response.responseBody = ""; } else { - jQuery.atmosphere.log(_request.logLevel, ["SSE reconnect maximum try reached " + _request.requestCount]); + jQuery.atmosphere.log(_request.logLevel, ["SSE reconnect maximum try reached " + _requestCount]); _onError(); } } @@ -1000,7 +1000,7 @@ jQuery.atmosphere = function() { if (!_request.reconnect) { if (_websocket != null) { - _websocket.close(); + _clearState(); } return; } @@ -1018,7 +1018,7 @@ jQuery.atmosphere = function() { _websocket.onclose(_message); // Close it anyway try { - _websocket.close(); + _clearState(); } catch (e) { } } @@ -1104,7 +1104,7 @@ jQuery.atmosphere = function() { _response.responseBody = ""; _response.status = !webSocketOpened ? 501 : 200; _invokeCallback(); - clearTimeout(_request.id) + clearTimeout(_request.id); closed = true; @@ -1114,12 +1114,14 @@ jQuery.atmosphere = function() { _reconnectWithFallbackTransport("Websocket failed. Downgrading to Comet and resending"); } else if (_request.reconnect && _response.transport == 'websocket') { - if (_request.reconnect && _requestCount++ < _request.maxRequest) { - _request.requestCount = _requestCount; - _response.responseBody = ""; - _executeWebSocket(true); + _clearState(); + if (_request.reconnect && _requestCount++ < _request.maxReconnectOnClose) { + _request.id = setTimeout(function() { + _response.responseBody = ""; + _executeWebSocket(true); + }, _request.connectTimeout); } else { - jQuery.atmosphere.log(_request.logLevel, ["Websocket reconnect maximum try reached " + _request.requestCount]); + jQuery.atmosphere.log(_request.logLevel, ["Websocket reconnect maximum try reached " + _requestCount]); jQuery.atmosphere.warn("Websocket error, reason: " + message.reason); _onError(); } @@ -1128,6 +1130,8 @@ jQuery.atmosphere = function() { } function _onError() { + _clearState(); + _response.state = 'error'; _response.responseBody = ""; _response.status = 500; @@ -1197,12 +1201,15 @@ jQuery.atmosphere = function() { } _request.transport = _request.fallbackTransport; - if (_request.reconnect && _request.transport != 'none' || _request.transport == null) { + var reconnect = _request.reconnect && _requestCount++ < _request.maxReconnectOnClose; + if (reconnect && _request.transport != 'none' || _request.transport == null) { _request.method = _request.fallbackMethod; _response.transport = _request.fallbackTransport; _request.id = setTimeout(function() { _execute(); }, _request.reconnectInterval); + } else if (!reconnect) { + _onError(); } } @@ -1323,7 +1330,7 @@ jQuery.atmosphere = function() { return; } - if (rq.reconnect && rq.requestCount++ < rq.maxRequest) { + if (rq.reconnect && ( rq.maxRequest == -1 || rq.requestCount++ < rq.maxRequest)) { var ajaxRequest = _buildAjaxRequest(); _doRequest(ajaxRequest, rq, true); @@ -1346,10 +1353,15 @@ jQuery.atmosphere = function() { if (!_response.status) { _response.status = 500; } + _clearState(); _response.state = "error"; _invokeCallback(); - _reconnect(ajaxRequest, rq, true); + if (rq.reconnect) { + _reconnect(ajaxRequest, rq, true); + } else { + _onError(); + } }; } @@ -1454,8 +1466,8 @@ jQuery.atmosphere = function() { _invokeCallback(); if ((rq.transport == 'streaming') && (ajaxRequest.responseText.length > rq.maxStreamingLength)) { // Close and reopen connection on large data received - ajaxRequest.abort(); - _doRequest(ajaxRequest, rq, true); + _clearState(); + _doRequest(_buildAjaxRequest(), rq, true); } } }, 0); @@ -1500,8 +1512,8 @@ jQuery.atmosphere = function() { if ((rq.transport == 'streaming') && (responseText.length > rq.maxStreamingLength)) { // Close and reopen connection on large data received - ajaxRequest.abort(); - _doRequest(ajaxRequest, rq, true); + _clearState(); + _doRequest(_buildAjaxRequest(), rq, true); } } }; @@ -1510,9 +1522,11 @@ jQuery.atmosphere = function() { if (rq.suspend) { rq.id = setTimeout(function() { if (_subscribed) { - ajaxRequest.abort(); + _clearState(); _subscribe(rq); - _execute(); + setTimeout(function () { + _execute(); + }, rq.reconnectInterval) } }, rq.timeout); } @@ -1542,7 +1556,7 @@ jQuery.atmosphere = function() { if (request.connectTimeout > -1) { request.id = setTimeout(function() { if (request.requestCount == 0) { - ajaxRequest.abort(); + _clearState(); _prepareCallback("Connect timeout", "closed", 200, request.transport); } }, request.connectTimeout); @@ -1583,13 +1597,17 @@ jQuery.atmosphere = function() { } function _reconnect(ajaxRequest, request, force) { - if (force || (request.suspend && ajaxRequest.status == 200 && request.transport != 'streaming' && _subscribed)) { + var reconnect = request.reconnect && _requestCount++ < request.maxReconnectOnClose; + + if (reconnect && force || (request.suspend && ajaxRequest.status == 200 && request.transport != 'streaming' && _subscribed)) { if (request.reconnect) { _open('re-opening', request.transport, request); request.id = setTimeout(function() { _executeRequest(); }, request.reconnectInterval); } + } else if (!reconnect) { + _onError(); } } @@ -1645,18 +1663,25 @@ jQuery.atmosphere = function() { // Handles open and message event xdr.onprogress = function() { - xdrCallback(xdr); - rq.lastMessage = xdr.responseText; + handle(xdr); }; + // Handles error event xdr.onerror = function() { // If the server doesn't send anything back to XDR will fail with polling if (rq.transport != 'polling') { _prepareCallback(xdr.responseText, "error", 500, transport); } + + _reconnect(xdr, rq, false); }; + // Handles close event - xdr.onload = function () { + xdr.onload = function() { + handle(xdr); + }; + + var handle = function (xdr) { // XDomain loop forever on itself without this. // TODO: Clearly I need to come with something better than that solution if (rq.lastMessage == xdr.responseText) return; @@ -1668,8 +1693,11 @@ jQuery.atmosphere = function() { // window.XDomainRequest() cannot read response headers, hence X-Atmosphere-Tracking-ID // and X-Cache-Date won't work. // _readHeaders() + // Approximate X-Cache-Date as we can't read it. The workaround is to rest that value in the + // callback. + rq.lastTimestamp = jQuery.now(); - if (rq.transport == "long-polling" && rq.requestCount++ < rq.maxRequest) { + if (rq.transport == "long-polling" && (rq.reconnect && (rq.maxRequest == -1 || rq.requestCount++ < rq.maxRequest))) { xdr.status = 200; _reconnect(xdr, rq, false); } @@ -1694,7 +1722,7 @@ jQuery.atmosphere = function() { if (rq.connectTimeout > -1) { rq.id = setTimeout(function() { if (rq.requestCount == 0) { - xdr.abort(); + _clearState(); _prepareCallback("Connect timeout", "closed", 200, rq.transport); } }, rq.connectTimeout); @@ -1702,6 +1730,7 @@ jQuery.atmosphere = function() { }, close: function() { xdr.abort(); + _clearStorage(); _prepareCallback(xdr.responseText, "closed", 200, transport); } }; @@ -1824,6 +1853,7 @@ jQuery.atmosphere = function() { } if (cdoc.readyState === "complete") { + _prepareCallback("", "closed", 200, rq.transport); _prepareCallback("", "re-opening", 200, rq.transport); _ieStreaming(rq); return false; @@ -1832,6 +1862,7 @@ jQuery.atmosphere = function() { return false; } catch (err) { + _onError(); jQuery.atmosphere.error(err); } }); @@ -1848,12 +1879,11 @@ jQuery.atmosphere = function() { }; } - /** + /* * Send message. <br> * Will be automatically dispatch to other connected. * - * @param {Object, - * string} Message to send. + * @param {Object,string} Message to send. * @private */ function _push(message) { @@ -1962,14 +1992,15 @@ jQuery.atmosphere = function() { callback: null, data : msg, suspend : false, - maxRequest : 60, + maxRequest : -1, logLevel : 'info', requestCount : 0, withCredentials : _request.withCredentials, transport: 'polling', attachHeadersAsQueryString: true, enableXDR: _request.enableXDR, - uuid : _request.uuid + uuid : _request.uuid, + maxReconnectOnClose : _request.maxReconnectOnClose }; if (typeof(message) == 'object') { @@ -2004,7 +2035,7 @@ jQuery.atmosphere = function() { } catch (e) { _websocket.onclose = function(message) { }; - _websocket.close(); + _clearState(); _reconnectWithFallbackTransport("Websocket failed. Downgrading to Comet and resending " + data); _pushAjaxMessage(message); @@ -2031,12 +2062,17 @@ jQuery.atmosphere = function() { _response.transport = transport; _response.status = errorCode; _response.state = state; + _response.responseBody = messageBody; _invokeCallback(); } function _readHeaders(xdr, request) { - if (!request.readResponsesHeaders) return; + if (!request.readResponsesHeaders) { + request.lastTimestamp = jQuery.now(); + request.uuid = jQuery.atmosphere.guid(); + return; + } try { var tempDate = xdr.getResponseHeader('X-Cache-Date'); @@ -2071,6 +2107,7 @@ jQuery.atmosphere = function() { function _f(response, f) { switch (response.state) { case "messageReceived" : + _requestCount = 0; if (typeof(f.onMessage) != 'undefined') f.onMessage(response); break; case "error" : @@ -2106,7 +2143,8 @@ jQuery.atmosphere = function() { _localSocketF(_response.responseBody); } - var messages = typeof(_response.responseBody) == 'string' ? _response.responseBody.split(_request.messageDelimiter) : new Array(_response.responseBody); + var messages = typeof((_response.responseBody) == 'string' && _request.trackMessageLength) ? + _response.responseBody.split(_request.messageDelimiter) : new Array(_response.responseBody); for (var i = 0; i < messages.length; i++) { if (messages.length > 1 && messages[i].length == 0) { @@ -2168,20 +2206,6 @@ jQuery.atmosphere = function() { _invokeCallback(); _clearState(); - - // Stop sharing a connection - if (_storageService != null) { - // Clears trace timer - clearInterval(_traceTimer); - // Removes the trace - document.cookie = encodeURIComponent("atmosphere-" + _request.url) + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT"; - // The heir is the parent unless unloading - _storageService.signal("close", {reason: "", heir: !_abordingConnection ? guid : (_storageService.get("children") || [])[0]}); - _storageService.close(); - } - if (_localStorageService != null) { - _localStorageService.close(); - } } function _clearState() { @@ -2205,6 +2229,23 @@ jQuery.atmosphere = function() { _sse.close(); _sse = null; } + _clearStorage(); + } + + function _clearStorage() { + // Stop sharing a connection + if (_storageService != null) { + // Clears trace timer + clearInterval(_traceTimer); + // Removes the trace + document.cookie = encodeURIComponent("atmosphere-" + _request.url) + "=; expires=Thu, 01 Jan 1970 00:00:00 GMT"; + // The heir is the parent unless unloading + _storageService.signal("close", {reason: "", heir: !_abordingConnection ? guid : (_storageService.get("children") || [])[0]}); + _storageService.close(); + } + if (_localStorageService != null) { + _localStorageService.close(); + } } this.subscribe = function(options) {
