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