diff --git a/README.md b/README.md index 9af18e7..572fca9 100644 --- a/README.md +++ b/README.md @@ -91,7 +91,7 @@ Create instance of `Socket` class by passing url of socketcluster-server end-poi socket.connect ``` -- For disabling reconnection to server +- To disable automatic reconnection to server ```ruby # This will disable reconnection to socketcluster-server diff --git a/examples/reconnection.rb b/examples/reconnection.rb index 1050ad7..7c9b986 100644 --- a/examples/reconnection.rb +++ b/examples/reconnection.rb @@ -18,6 +18,6 @@ socket = ScClient.new('ws://localhost:8000/socketcluster/') socket.set_basic_listener(on_connect, on_disconnect, on_connect_error) socket.set_authentication_listener(on_set_authentication, on_authentication) -socket.set_reconnection(true) # default reconnection is true -socket.set_delay(5) # reconnect in 5 seconds -socket.connect +socket.set_reconnection(false) # default reconnection is true +socket.max_attempts = 5 +socket.reconnect diff --git a/lib/sc_client.rb b/lib/sc_client.rb index 7b2f342..ab3e340 100644 --- a/lib/sc_client.rb +++ b/lib/sc_client.rb @@ -1,9 +1,11 @@ require 'websocket-eventmachine-client' require 'json' +require 'logger' require_relative './socketclusterclient/emitter' require_relative './socketclusterclient/parser' require_relative './socketclusterclient/data_models' +require_relative './socketclusterclient/reconnect' # # Class ScClient provides an interface to connect to the socketcluster server @@ -13,6 +15,9 @@ class ScClient include Emitter include DataModels + include Reconnect + + attr_accessor :reconnect_interval, :max_reconnect_interval, :reconnect_decay, :max_attempts, :attempts_made # # Initializes instance variables in socketcluster client @@ -28,6 +33,9 @@ def initialize(url) @enable_reconnection = true @delay = 3 initialize_emitter + initialize_reconnect + @logger = Logger.new(STDOUT) + @logger.level = Logger::WARN end # @@ -340,15 +348,4 @@ def reset_value def increment_cnt @cnt += 1 end - - # - # Reconnects to ScServer after delay - # - # - # - # - def reconnect - sleep @delay - connect - end end diff --git a/lib/socketclusterclient/reconnect.rb b/lib/socketclusterclient/reconnect.rb new file mode 100644 index 0000000..83471e2 --- /dev/null +++ b/lib/socketclusterclient/reconnect.rb @@ -0,0 +1,72 @@ +# +# Module Reconnect provides Reconnection Support +# +# @author Piyush Wani +# +module Reconnect + # + # Initializes Reconnection related entities + # + # + # + # + def initialize_reconnect + @reconnect_interval = 2000 + @max_reconnect_interval = 30_000 + @reconnect_decay = 1 + @max_attempts = nil + @attempts_made = 0 + end + + # + # Adds handler for Reconnection + # + # @param [Integer] reconnect_interval A interval for reconnection attempt( in MiliSeconds ) + # @param [Integer] max_reconnect_interval The Max Limit for reconnection interval (in MiliSeconds) + # @param [Integer] reconnect_decay A + # @param [Integer] max_attempts The Maximum number of Reconnection Attempts Allowed + # + # + # + def set_reconnection_listener(reconnect_interval, max_reconnect_interval, reconnect_decay, max_attempts) + @reconnect_interval = (reconnect_interval > max_reconnect_interval) ? max_reconnect_interval : reconnect_interval + @max_reconnect_interval = max_reconnect_interval + @reconnect_decay = reconnect_decay + @max_attempts = max_attempts + @attempts_made = 0 + end + + # + # Reconnects to ScServer after delay + # + # + # + def reconnect + if @reconnect_interval < @max_reconnect_interval + @reconnect_interval *= @reconnect_decay + @reconnect_interval = @max_reconnect_interval if @reconnect_interval > @max_reconnect_interval + end + + until reconnection_attempts_finished + @attempts_made += 1 + @logger.warn("Attempt number : #{@attempts_made} ") + connect + sleep(@reconnect_interval / 1000) + end + + @attempts_made = 0 + @logger.warn('Unable to reconnect: max reconnection attempts reached') + end + + private + + # + # Checks whether all attempts are finished or not + # + # + # @return [Boolean] Attempts finished + # + def reconnection_attempts_finished + @attempts_made == @max_attempts + end +end