class Adhearsion::PunchblockPlugin::Initializer

Public Class Methods

connect() click to toggle source
# File lib/adhearsion/punchblock_plugin/initializer.rb, line 79
def connect
  return unless Process.state_name == :booting
  m = Mutex.new
  blocker = ConditionVariable.new

  Events.punchblock Punchblock::Connection::Connected do
    Adhearsion::Process.booted
    m.synchronize { blocker.broadcast }
  end

  Events.shutdown do
    logger.info "Shutting down while connecting. Breaking the connection block."
    m.synchronize { blocker.broadcast }
  end

  Adhearsion::Process.important_threads << Thread.new do
    catching_standard_errors { connect_to_server }
  end

  # Wait for the connection to establish
  m.synchronize { blocker.wait m }

  throw :boot_aborted if self.attempts >= self.config.reconnect_attempts
end
connect_to_server() click to toggle source
# File lib/adhearsion/punchblock_plugin/initializer.rb, line 104
def connect_to_server
  logger.info "Starting connection to server"
  client.run
rescue Punchblock::DisconnectedError => e
  # We only care about disconnects if the process is up or booting
  return unless [:booting, :running].include? Adhearsion::Process.state_name

  Adhearsion::Process.reset unless Adhearsion::Process.state_name == :booting

  self.attempts += 1

  if self.attempts >= self.config.reconnect_attempts
    logger.fatal "Connection lost. Connection retry attempts exceeded."
    Adhearsion::Process.stop!
    return
  end

  logger.error "Connection lost. Attempting reconnect #{self.attempts} of #{self.config.reconnect_attempts}"
  sleep self.config.reconnect_timer
  retry
rescue Punchblock::ProtocolError => e
  logger.fatal "The connection failed due to a protocol error: #{e.name}."
  raise e
end
connection() click to toggle source
# File lib/adhearsion/punchblock_plugin/initializer.rb, line 172
def connection
  client.connection
end
dispatch_call_event(event) click to toggle source
# File lib/adhearsion/punchblock_plugin/initializer.rb, line 145
def dispatch_call_event(event)
  call = Adhearsion.active_calls[event.target_call_id]
  if call && call.alive?
    call.async.deliver_message event
  else
    logger.warn "Event received for inactive call #{event.target_call_id}: #{event.inspect}"
  end
end
dispatch_offer(offer) click to toggle source
# File lib/adhearsion/punchblock_plugin/initializer.rb, line 129
def dispatch_offer(offer)
  catching_standard_errors do
    call = Call.new(offer)
    Adhearsion.active_calls << call
    case Adhearsion::Process.state_name
    when :booting, :rejecting
      logger.info "Declining call because the process is not yet running."
      call.reject :decline
    when :running, :stopping
      Adhearsion.router.handle call
    else
      call.reject :error
    end
  end
end
handle_event(event) click to toggle source
# File lib/adhearsion/punchblock_plugin/initializer.rb, line 154
def handle_event(event)
  Events.trigger :punchblock, event
  case event
  when Punchblock::Event::Asterisk::AMI::Event
    Events.trigger :ami, event
  end
end
init() click to toggle source
# File lib/adhearsion/punchblock_plugin/initializer.rb, line 14
def init
  self.config = Adhearsion.config[:punchblock]

  username = self.config.username
  if (self.config.platform || :xmpp) == :xmpp
    username = Blather::JID.new username
    username = Blather::JID.new username.node, username.domain, resource unless username.resource
    username = username.to_s
  end

  connection_options = {
    :username           => username,
    :password           => self.config.password,
    :connection_timeout => self.config.connection_timeout,
    :host               => self.config.host,
    :port               => self.config.port,
    :certs              => self.config.certs_directory,
    :root_domain        => self.config.root_domain
  }

  self.client = Punchblock.client_with_connection self.config.platform, connection_options

  # Tell the Punchblock connection that we are ready to process calls.
  Events.register_callback :after_initialized do
    connection.ready!
  end

  # When quiescence is requested, change our status to "Do Not Disturb"
  # This should prevent the telephony engine from sending us any new calls.
  Events.register_callback :quiesced do
    connection.not_ready! if connection.connected?
  end

  # Make sure we stop everything when we shutdown
  Events.register_callback :shutdown do
    client.stop
  end

  # Handle events from Punchblock via events system
  self.client.register_event_handler do |event|
    handle_event event
  end

  Events.punchblock Punchblock::Connection::Connected do |event|
    logger.info "Connected to Punchblock server"
    self.attempts = 0
  end

  Events.punchblock Punchblock::Event::Offer do |offer|
    dispatch_offer offer
  end

  Events.punchblock proc { |e| e.respond_to?(:source) }, :source do |event|
    event.source.trigger_event_handler event
  end

  Events.punchblock proc { |e| e.respond_to?(:target_call_id) }, :target_call_id do |event|
    dispatch_call_event event
  end
end
machine_identifier() click to toggle source
# File lib/adhearsion/punchblock_plugin/initializer.rb, line 166
def machine_identifier
  Adhearsion::Process.fqdn
rescue SocketError
  Socket.gethostname
end
resource() click to toggle source
# File lib/adhearsion/punchblock_plugin/initializer.rb, line 162
def resource
  [machine_identifier, ::Process.pid].join '-'
end
run() click to toggle source
# File lib/adhearsion/punchblock_plugin/initializer.rb, line 75
def run
  connect
end