1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- define("dojox/socket/Reconnect", [
- "dojox/socket",
- "dojo/aspect"
- ], function(dxSocket, aspect) {
- dxSocket.Reconnect = function(socket, options){
- // summary:
- // Provides auto-reconnection to a websocket after it has been closed
- // socket:
- // Socket to add reconnection support to.
- // returns:
- // An object that implements the WebSocket API
- // example:
- // You can use the Reconnect module:
- // | require["dojox/socket", "dojox/socket/Reconnect"], function(dxSocket, reconnect){
- // | var socket = dxSocket({url:"/comet"});
- // | // add auto-reconnect support
- // | socket = reconnect(socket);
- var reconnectTime = options.reconnectTime || 10000;
- var checkForOpen, newSocket;
- options = options || {};
- aspect.after(socket, "onclose", function(event){
- clearTimeout(checkForOpen);
- if(!event.wasClean){
- socket.disconnected(function(){
- dxSocket.replace(socket, newSocket = socket.reconnect());
- });
- }
- }, true);
- if(!socket.disconnected){
- // add a default impl if it doesn't exist
- socket.disconnected = function(reconnect){
- setTimeout(function(){
- reconnect();
- checkForOpen = setTimeout(function(){
- //reset the backoff
- if(newSocket.readyState < 2){
- reconnectTime = options.reconnectTime || 10000;
- }
- }, 10000);
- }, reconnectTime);
- // backoff each time
- reconnectTime *= options.backoffRate || 2;
- };
- }
- if(!socket.reconnect){
- // add a default impl if it doesn't exist
- socket.reconnect = function(){
- return socket.args ?
- dxSocket.LongPoll(socket.args) :
- dxSocket.WebSocket({url: socket.URL || socket.url}); // different cases for different impls
- };
- }
- return socket;
- };
- return dxSocket.Reconnect;
- });
|