module RedisClient::Config::Common

Attributes

circuit_breaker[R]
command_builder[R]
connect_timeout[R]
connection_prelude[R]
custom[R]
db[R]
driver[R]
id[R]
inherit_socket[R]
middlewares_stack[R]
password[R]
protocol[R]
read_timeout[R]
ssl[R]
ssl?[R]
ssl_params[R]
write_timeout[R]

Public Class Methods

new( username: nil, password: nil, db: nil, id: nil, timeout: DEFAULT_TIMEOUT, read_timeout: timeout, write_timeout: timeout, connect_timeout: timeout, ssl: nil, custom: {}, ssl_params: nil, driver: nil, protocol: 3, client_implementation: RedisClient, command_builder: CommandBuilder, inherit_socket: false, reconnect_attempts: false, middlewares: false, circuit_breaker: nil ) click to toggle source
# File lib/redis_client/config.rb, line 21
def initialize(
  username: nil,
  password: nil,
  db: nil,
  id: nil,
  timeout: DEFAULT_TIMEOUT,
  read_timeout: timeout,
  write_timeout: timeout,
  connect_timeout: timeout,
  ssl: nil,
  custom: {},
  ssl_params: nil,
  driver: nil,
  protocol: 3,
  client_implementation: RedisClient,
  command_builder: CommandBuilder,
  inherit_socket: false,
  reconnect_attempts: false,
  middlewares: false,
  circuit_breaker: nil
)
  @username = username
  @password = password
  @db = begin
    Integer(db || DEFAULT_DB)
  rescue ArgumentError
    raise ArgumentError, "db: must be an Integer, got: #{db.inspect}"
  end

  @id = id
  @ssl = ssl || false

  @ssl_params = ssl_params
  @connect_timeout = connect_timeout
  @read_timeout = read_timeout
  @write_timeout = write_timeout

  @driver = driver ? RedisClient.driver(driver) : RedisClient.default_driver

  @custom = custom

  @client_implementation = client_implementation
  @protocol = protocol
  unless protocol == 2 || protocol == 3
    raise ArgumentError, "Unknown protocol version #{protocol.inspect}, expected 2 or 3"
  end

  @command_builder = command_builder
  @inherit_socket = inherit_socket

  reconnect_attempts = Array.new(reconnect_attempts, 0).freeze if reconnect_attempts.is_a?(Integer)
  @reconnect_attempts = reconnect_attempts
  @connection_prelude = build_connection_prelude

  circuit_breaker = CircuitBreaker.new(**circuit_breaker) if circuit_breaker.is_a?(Hash)
  if @circuit_breaker = circuit_breaker
    middlewares = [CircuitBreaker::Middleware] + (middlewares || [])
  end

  middlewares_stack = Middlewares
  if middlewares && !middlewares.empty?
    middlewares_stack = Class.new(Middlewares)
    middlewares.each do |mod|
      middlewares_stack.include(mod)
    end
  end
  @middlewares_stack = middlewares_stack
end

Public Instance Methods

new_client(**kwargs) click to toggle source
# File lib/redis_client/config.rb, line 107
def new_client(**kwargs)
  @client_implementation.new(self, **kwargs)
end
new_pool(**kwargs) click to toggle source
# File lib/redis_client/config.rb, line 102
def new_pool(**kwargs)
  kwargs[:timeout] ||= DEFAULT_TIMEOUT
  Pooled.new(self, **kwargs)
end
resolved?() click to toggle source
# File lib/redis_client/config.rb, line 94
def resolved?
  true
end
retry_connecting?(attempt, _error) click to toggle source
# File lib/redis_client/config.rb, line 111
def retry_connecting?(attempt, _error)
  if @reconnect_attempts
    if (pause = @reconnect_attempts[attempt])
      if pause > 0
        sleep(pause)
      end
      return true
    end
  end
  false
end
sentinel?() click to toggle source
# File lib/redis_client/config.rb, line 98
def sentinel?
  false
end
server_url() click to toggle source
# File lib/redis_client/config.rb, line 129
def server_url
  if path
    url = "unix://#{path}"
    if db != 0
      url = "#{url}?db=#{db}"
    end
  else
    # add brackets to IPv6 address
    redis_host = if host.count(":") >= 2
      "[#{host}]"
    else
      host
    end
    url = "redis#{'s' if ssl?}://#{redis_host}:#{port}"
    if db != 0
      url = "#{url}/#{db}"
    end
  end
  url
end
ssl_context() click to toggle source
# File lib/redis_client/config.rb, line 123
def ssl_context
  if ssl
    @ssl_context ||= @driver.ssl_context(@ssl_params || {})
  end
end
username() click to toggle source
# File lib/redis_client/config.rb, line 90
def username
  @username || DEFAULT_USERNAME
end

Private Instance Methods

build_connection_prelude() click to toggle source
# File lib/redis_client/config.rb, line 152
def build_connection_prelude
  prelude = []
  if protocol == 3
    prelude << if @password
      ["HELLO", "3", "AUTH", @username || DEFAULT_USERNAME, @password]
    else
      ["HELLO", "3"]
    end
  elsif @password
    prelude << if @username && !@username.empty?
      ["AUTH", @username, @password]
    else
      ["AUTH", @password]
    end
  end

  if @db && @db != 0
    prelude << ["SELECT", @db.to_s]
  end

  # Deep freeze all the strings and commands
  prelude.map! do |commands|
    commands = commands.map { |str| str.frozen? ? str : str.dup.freeze }
    commands.freeze
  end
  prelude.freeze
end