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