Class: PollterGeist::ImapIdler

Inherits:
Object
  • Object
show all
Defined in:
lib/pollter_geist/imap_idler.rb

Defined Under Namespace

Classes: IdleResult

Instance Method Summary collapse

Constructor Details

#initialize(poller) ⇒ ImapIdler

Returns a new instance of ImapIdler.



25
26
27
28
# File 'lib/pollter_geist/imap_idler.rb', line 25

def initialize poller
  @imap   = poller.imap
  @logger = poller.logger
end

Instance Method Details

#idle(listen_for = ['RECENT'], timeout = false) ⇒ Object



30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# 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