class Lusnoc::Session

Attributes

alive[R]
expired_at[R]
id[R]
name[R]
ttl[R]

Public Class Methods

new(name, ttl: 20, &block) click to toggle source
# File lib/lusnoc/session.rb, line 11
def initialize(name, ttl: 20, &block)
  @name = name
  @ttl = ttl

  run(&block) if block_given?
end

Public Instance Methods

alive!(exception_class = ExpiredError) click to toggle source
# File lib/lusnoc/session.rb, line 44
def alive!(exception_class = ExpiredError)
  @alive || (raise exception_class.new("Session[#{@name}:#{@id}] expired"))
end
alive?() click to toggle source
# File lib/lusnoc/session.rb, line 40
def alive?
  @alive
end
expired?() click to toggle source
# File lib/lusnoc/session.rb, line 28
def expired?
  !alive?
end
need_renew?() click to toggle source
# File lib/lusnoc/session.rb, line 36
def need_renew?
  time_to_expiration && time_to_expiration < (@ttl / 2.0)
end
on_session_die(&block) click to toggle source
# File lib/lusnoc/session.rb, line 55
def on_session_die(&block)
  @session_die_cb = block
  @session_die_cb&.call(self) if @alive == false
  self
end
renew() click to toggle source
# File lib/lusnoc/session.rb, line 48
def renew
  alive!
  Lusnoc.http_put(build_url("/v1/session/renew/#{@id}"), nil, timeout: 1)
  @expired_at = Time.now + ttl
  logger.info "Session[#{@name}:#{@id}] renewed. Next expiration: #{@expired_at}"
end
run() { |self| ... } click to toggle source
# File lib/lusnoc/session.rb, line 18
def run
  @id = create_session(name, ttl)

  prepare_guard(@id).run do
    yield(self)
  end
ensure
  destroy_session(@id) if @id
end
time_to_expiration() click to toggle source
# File lib/lusnoc/session.rb, line 32
def time_to_expiration
  @expired_at && @expired_at - Time.now
end

Private Instance Methods

create_session(name, ttl) click to toggle source
# File lib/lusnoc/session.rb, line 63
def create_session(name, ttl)
  resp = Lusnoc.http_put(build_url('/v1/session/create'),
                         { Name: name, TTL: "#{ttl}s", LockDelay: '5s' },
                         { timeout: 1 })
  session_id = JSON.parse(resp.body)['ID']
  @expired_at = Time.now + ttl
  logger.info "Session[#{name}:#{session_id}] created. TTL:#{ttl}s. Next expiration: #{@expired_at}"
  @alive = true
  session_id
end
destroy_session(session_id) click to toggle source
# File lib/lusnoc/session.rb, line 89
def destroy_session(session_id)
  @alive = false
  @expired_at = nil
  Lusnoc.http_put(build_url("/v1/session/destroy/#{session_id}"), nil, timeout: 1) rescue nil
  logger.info "Session[#{@name}:#{session_id}] destroyed"
end
prepare_guard(session_id) click to toggle source
# File lib/lusnoc/session.rb, line 74
def prepare_guard(session_id)
  Lusnoc::Guard.new(build_url("/v1/session/info/#{session_id}")) do |guard|
    guard.condition do |body|
      !JSON.parse(body).empty? rescue false
    end

    guard.then do
      @alive = false
      @expired_at = nil
      logger.info "Session[#{@name}:#{session_id}] is gone"
      @session_die_cb&.call(self)
    end
  end
end