Reconnect.js 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859
  1. define("dojox/socket/Reconnect", [
  2. "dojox/socket",
  3. "dojo/aspect"
  4. ], function(dxSocket, aspect) {
  5. dxSocket.Reconnect = function(socket, options){
  6. // summary:
  7. // Provides auto-reconnection to a websocket after it has been closed
  8. // socket:
  9. // Socket to add reconnection support to.
  10. // returns:
  11. // An object that implements the WebSocket API
  12. // example:
  13. // You can use the Reconnect module:
  14. // | require["dojox/socket", "dojox/socket/Reconnect"], function(dxSocket, reconnect){
  15. // | var socket = dxSocket({url:"/comet"});
  16. // | // add auto-reconnect support
  17. // | socket = reconnect(socket);
  18. var reconnectTime = options.reconnectTime || 10000;
  19. var checkForOpen, newSocket;
  20. options = options || {};
  21. aspect.after(socket, "onclose", function(event){
  22. clearTimeout(checkForOpen);
  23. if(!event.wasClean){
  24. socket.disconnected(function(){
  25. dxSocket.replace(socket, newSocket = socket.reconnect());
  26. });
  27. }
  28. }, true);
  29. if(!socket.disconnected){
  30. // add a default impl if it doesn't exist
  31. socket.disconnected = function(reconnect){
  32. setTimeout(function(){
  33. reconnect();
  34. checkForOpen = setTimeout(function(){
  35. //reset the backoff
  36. if(newSocket.readyState < 2){
  37. reconnectTime = options.reconnectTime || 10000;
  38. }
  39. }, 10000);
  40. }, reconnectTime);
  41. // backoff each time
  42. reconnectTime *= options.backoffRate || 2;
  43. };
  44. }
  45. if(!socket.reconnect){
  46. // add a default impl if it doesn't exist
  47. socket.reconnect = function(){
  48. return socket.args ?
  49. dxSocket.LongPoll(socket.args) :
  50. dxSocket.WebSocket({url: socket.URL || socket.url}); // different cases for different impls
  51. };
  52. }
  53. return socket;
  54. };
  55. return dxSocket.Reconnect;
  56. });