Reconnect.js 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465
  1. /*
  2. Copyright (c) 2004-2012, The Dojo Foundation All Rights Reserved.
  3. Available via Academic Free License >= 2.1 OR the modified BSD license.
  4. see: http://dojotoolkit.org/license for details
  5. */
  6. if(!dojo._hasResource["dojox.socket.Reconnect"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code.
  7. dojo._hasResource["dojox.socket.Reconnect"] = true;
  8. dojo.provide("dojox.socket.Reconnect");
  9. dojox.socket.Reconnect = function(socket, options){
  10. // summary:
  11. // Provides auto-reconnection to a websocket after it has been closed
  12. // socket:
  13. // Socket to add reconnection support to.
  14. // returns:
  15. // An object that implements the WebSocket API
  16. // example:
  17. // You can use the Reconnect module:
  18. // | dojo.require("dojox.socket");
  19. // | dojo.require("dojox.socket.Reconnect");
  20. // | var socket = dojox.socket({url:"/comet"});
  21. // | // add auto-reconnect support
  22. // | socket = dojox.socket.Reconnect(socket);
  23. options = options || {};
  24. var reconnectTime = options.reconnectTime || 10000;
  25. var connectHandle = dojo.connect(socket, "onclose", function(event){
  26. clearTimeout(checkForOpen);
  27. if(!event.wasClean){
  28. socket.disconnected(function(){
  29. dojox.socket.replace(socket, newSocket = socket.reconnect());
  30. });
  31. }
  32. });
  33. var checkForOpen, newSocket;
  34. if(!socket.disconnected){
  35. // add a default impl if it doesn't exist
  36. socket.disconnected = function(reconnect){
  37. setTimeout(function(){
  38. reconnect();
  39. checkForOpen = setTimeout(function(){
  40. //reset the backoff
  41. if(newSocket.readyState < 2){
  42. reconnectTime = options.reconnectTime || 10000;
  43. }
  44. }, 10000);
  45. }, reconnectTime);
  46. // backoff each time
  47. reconnectTime *= options.backoffRate || 2;
  48. };
  49. }
  50. if(!socket.reconnect){
  51. // add a default impl if it doesn't exist
  52. socket.reconnect = function(){
  53. return socket.args ?
  54. dojox.socket.LongPoll(socket.args) :
  55. dojox.socket.WebSocket({url: socket.URL || socket.url}); // different cases for different impls
  56. };
  57. }
  58. return socket;
  59. };
  60. }