class PollterGeist::ImapIdler
Public Class Methods
new(poller)
click to toggle source
# File lib/pollter_geist/imap_idler.rb, line 25 def initialize poller @imap = poller.imap @logger = poller.logger end
Public Instance Methods
idle(listen_for = ['RECENT'], timeout = false)
click to toggle source
# File lib/pollter_geist/imap_idler.rb, line 30 def idle listen_for = ['RECENT'], timeout = false Thread.handle_interrupt(Timeout::Error => :never, Interrupt => :never) do begin Timeout::timeout(timeout) do loop do event = nil Thread.handle_interrupt(Timeout::Error => :immediate, Interrupt => :on_blocking) { event = do_idle } if listen_for.include? event logger.debug("returning event #{event} to caller") return IdleResult.new(true, event) else logger.debug "nope, we are not listening for #{event}" end end end rescue Timeout::Error imap.idle_done logger.debug 'idle timed out' return IdleResult.new(false, 'TIMEOUT') rescue Interrupt => e logger.debug 'idle was interrupted' raise e end end end
Private Instance Methods
do_idle()
click to toggle source
# File lib/pollter_geist/imap_idler.rb, line 67 def do_idle @events ||= Queue.new until @events.empty? return @events.pop end imap.idle do |message| case message when Net::IMAP::UntaggedResponse logger.debug "event: #{message.name}, data: #{message.data}" @events.push(message.name) imap.idle_done when Net::IMAP::ContinuationRequest logger.debug 'IDLE accepted by the server' else logger.warn "Unhandled IDLE response: #{message.class}, #{message.inspect}" end end logger.debug 'returning from idle' @events.pop end
imap()
click to toggle source
# File lib/pollter_geist/imap_idler.rb, line 59 def imap @imap end
logger()
click to toggle source
# File lib/pollter_geist/imap_idler.rb, line 63 def logger @logger end