# frozen_string_literal: true require "blather/client/dsl" require "timeout" module BlatherNotify extend Blather::DSL @ready = Queue.new when_ready { @ready << :ready } def self.start(jid, password) # workqueue_count MUST be 0 or else Blather uses threads! setup(jid, password, nil, nil, nil, nil, workqueue_count: 0) EM.error_handler(&method(:panic)) @thread = Thread.new { EM.run do client.run end } Timeout.timeout(30) { @ready.pop } at_exit { wait_then_exit } end def self.panic(e) warn e.message warn e.backtrace exit! 2 end def self.wait_then_exit disconnected { EM.stop } EM.add_timer(30) { EM.stop } shutdown @thread.join end end