Giter Site home page Giter Site logo

virginia's Introduction

Gem Version Build Code Climate Coverage Status Inline docs

Adhearsion

Adhearsion is an open-source voice application development framework. Adhearsion users write applications atop the framework with Ruby and call into their code.

Adhearsion rests above a lower-level telephony platform, for example Asterisk, FreeSWITCH or Voxeo PRISM, and provides a framework for integrating with various resources, such as SQL, LDAP and XMPP (Jabber).

Features

  • Simple Ruby code
  • Flexible CallControllers to handle calls
  • High-level media handling constructs
  • Simple interaction between calls
  • Self-documenting configuration engine
  • Support for plugins and other code reuse
  • Integration with databases, web APIs, etc
  • Event monitoring, async communication

Requirements

  • Ruby 2.2.0+ or JRuby 9.0.0.0+
  • ruby_speech dependencies
  • A VoIP platform:
    • Asterisk 11+
    • FreeSWITCH 1.4+
  • An interest in building cool new things

Ruby 1.9 is no longer supported by Adhearsion or the Ruby core team. You should upgrade to Ruby 2.2 as a matter of urgency in order to continue receiving security fixes.

Install

gem install adhearsion

Examples

An Adhearsion application can be as simple as this:

answer
say 'Hello, and thank you for your call. We will put you through to the front desk now...'
dial 'tel:+18005550199'
hangup

For more examples, check out the website.

Documentation

Visit Adhearsion's website for code examples and more information about the project. Also checkout the Adhearsion wiki on Github for community documentation.

If you're having trouble, you may want to try asking your question on the IRC channel (#adhearsion on irc.freenode.net), mailing list or, if you've found a bug, report it on the bug tracker.

Related Projects

These Open Source projects are also maintained by members of the Adhearsion team and may be useful when developing Adhearsion apps:

  • Telephony-Dev-Box is a system for creating virtual machines that will preconfigure Adhearsion, Asterisk, FreeSWITCH and PRISM together. Just add a SIP client and start calling your app!
  • SippyCup makes generating SIPp profiles and RTP media easy. Useful for load testing your apps and telephony infrastructure.

Authors

Core team:

Contributors: https://github.com/adhearsion/adhearsion/contributors

Original author: Jay Phillips

Contributions

Adhearsion has a set of contribution guidelines which help to smooth the contribution process. There is a pre-commit hook that runs encoding checks available in pre-commit. To use it, please copy it to .git/hooks/pre-commit and make it executable.

Copyright

Copyright (c) 2011-2014 Adhearsion Foundation Inc. MIT LICENSE (see LICENSE for details).

virginia's People

Contributors

benlangfeld avatar bklang avatar lpradovera avatar mehakdeep avatar neildecapia avatar pungoyal avatar victorluft avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar

virginia's Issues

Built-in resource serving?

I'm opening this as a feature request and to ask for discussion.

In Adhearsion apps, the app may run on a different machine than the telephony engine. However there is a need for the app to feed resources to the telephony engine. The two most obvious ones that come to mind are speech grammars and recorded audio prompts.

The correct large-scale answer for recorded audio prompts is likely to be a dedicated process like nginx. However, it would be convenient to not rely on nginx if Virginia can function as a prompt server at least for low-volume apps (think of this as the built-in Webrick server for Rails vs. a production deployment with Unicorn or Passenger).

For non-static content (such as speech grammars and possibly SSML documents) it may be desirable to have the content served directly from Adhearsion, especially since these documents may be generated uniquely for each call.

I'm proposing to have Virginia come bundled with a way for Adhearsion apps to register grammars and serve audio prompts. This functionality would supplement the behavior in Adhearsion so whenever a grammar is requested it is converted into a URL that is served by Virginia. The same is true for SSML documents and their embedded audio. It would require reserving a namespace within the request handler, and probably even require rethinking how Virginia handles HTTP requests in general.

Naturally these features would be optional and perhaps even default to "off."

Pinging @polysics and @benlangfeld.

Exceptions are reported twice

Given code like this:

require 'reel'
class RequestHandler
  def initialize(host, port)
    logger.info "HTTP Request Handler initialized on #{host}:#{port}"
    @server = Reel::Server.supervise(host, port) do |connection|
      connection.each_request do |request|
        raise "blat"
      end
    end
  end
end

I get duplicate exceptions in the logs:

06:20:52 ahn.1  | [2014-02-20 06:20:52.338] ERROR Celluloid: Reel::Server crashed!
06:20:52 ahn.1  | RuntimeError: blat
06:20:52 ahn.1  |   /vagrant/ahn/lib/request_handler.rb:16:in `block (2 levels) in initialize'
06:20:52 ahn.1  |   /vagrant/ahn/vendor/ruby/ruby/2.1.0/gems/reel-0.4.0/lib/reel/connection.rb:74:in `each_request'
06:20:52 ahn.1  |   /vagrant/ahn/lib/request_handler.rb:15:in `block in initialize'
06:20:52 ahn.1  |   /vagrant/ahn/vendor/ruby/ruby/2.1.0/gems/reel-0.4.0/lib/reel/server.rb:32:in `call'
06:20:52 ahn.1  |   /vagrant/ahn/vendor/ruby/ruby/2.1.0/gems/reel-0.4.0/lib/reel/server.rb:32:in `handle_connection'
06:20:52 ahn.1  |   /vagrant/ahn/vendor/ruby/ruby/2.1.0/gems/celluloid-0.15.2/lib/celluloid/calls.rb:25:in `public_send'
06:20:52 ahn.1  |   /vagrant/ahn/vendor/ruby/ruby/2.1.0/gems/celluloid-0.15.2/lib/celluloid/calls.rb:25:in `dispatch'
06:20:52 ahn.1  |   /vagrant/ahn/vendor/ruby/ruby/2.1.0/gems/celluloid-0.15.2/lib/celluloid/calls.rb:122:in `dispatch'
06:20:52 ahn.1  |   /vagrant/ahn/vendor/ruby/ruby/2.1.0/gems/celluloid-0.15.2/lib/celluloid/actor.rb:322:in `block in handle_message'
06:20:52 ahn.1  |   /vagrant/ahn/vendor/ruby/ruby/2.1.0/gems/celluloid-0.15.2/lib/celluloid/actor.rb:416:in `block in task'
06:20:52 ahn.1  |   /vagrant/ahn/vendor/ruby/ruby/2.1.0/gems/celluloid-0.15.2/lib/celluloid/tasks.rb:55:in `block in initialize'
06:20:52 ahn.1  |   /vagrant/ahn/vendor/ruby/ruby/2.1.0/gems/celluloid-0.15.2/lib/celluloid/tasks/task_fiber.rb:13:in `block in create'
06:20:52 ahn.1  | [2014-02-20 06:20:52.338] WARN  Celluloid: Terminating task: type=:call, meta={:method_name=>:run}, status=:iowait
06:20:54 ahn.1  | [2014-02-20 06:20:52.338] ERROR Adhearsion::Initializer: <RuntimeError> blat
06:20:54 ahn.1  |   /vagrant/ahn/lib/request_handler.rb:16:in `block (2 levels) in initialize'
06:20:54 ahn.1  |   /vagrant/ahn/vendor/ruby/ruby/2.1.0/gems/reel-0.4.0/lib/reel/connection.rb:74:in `each_request'
06:20:54 ahn.1  |   /vagrant/ahn/lib/request_handler.rb:15:in `block in initialize'
06:20:54 ahn.1  |   /vagrant/ahn/vendor/ruby/ruby/2.1.0/gems/reel-0.4.0/lib/reel/server.rb:32:in `call'
06:20:54 ahn.1  |   /vagrant/ahn/vendor/ruby/ruby/2.1.0/gems/reel-0.4.0/lib/reel/server.rb:32:in `handle_connection'
06:20:54 ahn.1  |   /vagrant/ahn/vendor/ruby/ruby/2.1.0/gems/celluloid-0.15.2/lib/celluloid/calls.rb:25:in `public_send'
06:20:54 ahn.1  |   /vagrant/ahn/vendor/ruby/ruby/2.1.0/gems/celluloid-0.15.2/lib/celluloid/calls.rb:25:in `dispatch'
06:20:54 ahn.1  |   /vagrant/ahn/vendor/ruby/ruby/2.1.0/gems/celluloid-0.15.2/lib/celluloid/calls.rb:122:in `dispatch'
06:20:54 ahn.1  |   /vagrant/ahn/vendor/ruby/ruby/2.1.0/gems/celluloid-0.15.2/lib/celluloid/actor.rb:322:in `block in handle_message'
06:20:54 ahn.1  |   /vagrant/ahn/vendor/ruby/ruby/2.1.0/gems/celluloid-0.15.2/lib/celluloid/actor.rb:416:in `block in task'
06:20:54 ahn.1  |   /vagrant/ahn/vendor/ruby/ruby/2.1.0/gems/celluloid-0.15.2/lib/celluloid/tasks.rb:55:in `block in initialize'
06:20:54 ahn.1  |   /vagrant/ahn/vendor/ruby/ruby/2.1.0/gems/celluloid-0.15.2/lib/celluloid/tasks/task_fiber.rb:13:in `block in create'

Good news is that, despite the scary looking text, the Reel server does continue to process requests.

Uninitialized constant

/ruby-2.2.1/gems/virginia-0.5.1/lib/virginia/plugin.rb:8:in `block in class:Plugin': uninitialized constant Virginia::Plugin::Service (NameError)

Reel does not correctly shut down on Adhearsion shutdown

After adding Virginia/Reel to an existing Adhearsion app I see this in the logs:

[2014-01-04 11:58:24] ERROR Celluloid: Couldn't cleanly terminate all actors in 10 seconds!

Also, Adhearsion takes an additional 10 seconds to shut down.

README does not show how to route requests to different URIs

Before the recent merge of #2 the README showed how to handle a specific URI path. This was lost, but I think should be restored.

Example: have /dial do an Originate with parameters while having /status return a list of active calls in JSON format

Virginia fails to load with reel 0.5.0.pre

[2014-04-02 00:35:08.924] INFO  RequestHandler: HTTP Request Handler initialized on 0.0.0.0:8080
[2014-04-02 00:35:08.938] ERROR Celluloid: Reel::Server crashed!
TypeError: no implicit conversion of Symbol into Integer
    /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/gems/reel-0.5.0.pre/lib/reel/server.rb:23:in `[]'
    /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/gems/reel-0.5.0.pre/lib/reel/server.rb:23:in `initialize'
    /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/gems/celluloid-0.15.2/lib/celluloid/calls.rb:25:in `public_send'
    /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/gems/celluloid-0.15.2/lib/celluloid/calls.rb:25:in `dispatch'
    /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/gems/celluloid-0.15.2/lib/celluloid/calls.rb:67:in `dispatch'
    /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/gems/celluloid-0.15.2/lib/celluloid/actor.rb:322:in `block in handle_message'
    /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/gems/celluloid-0.15.2/lib/celluloid/actor.rb:416:in `block in task'
    /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/gems/celluloid-0.15.2/lib/celluloid/tasks.rb:55:in `block in initialize'
    /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/gems/celluloid-0.15.2/lib/celluloid/tasks/task_fiber.rb:13:in `block in create'
[2014-04-02 00:35:08.939] ERROR Celluloid: Celluloid::SupervisionGroup crashed!
TypeError: no implicit conversion of Symbol into Integer
    /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/gems/reel-0.5.0.pre/lib/reel/server.rb:23:in `[]'
    /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/gems/reel-0.5.0.pre/lib/reel/server.rb:23:in `initialize'
    /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/gems/celluloid-0.15.2/lib/celluloid/calls.rb:25:in `public_send'
    /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/gems/celluloid-0.15.2/lib/celluloid/calls.rb:25:in `dispatch'
    /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/gems/celluloid-0.15.2/lib/celluloid/calls.rb:67:in `dispatch'
    /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/gems/celluloid-0.15.2/lib/celluloid/actor.rb:322:in `block in handle_message'
    /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/gems/celluloid-0.15.2/lib/celluloid/actor.rb:416:in `block in task'
    /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/gems/celluloid-0.15.2/lib/celluloid/tasks.rb:55:in `block in initialize'
    /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/gems/celluloid-0.15.2/lib/celluloid/tasks/task_fiber.rb:13:in `block in create'
    (celluloid):0:in `remote procedure call'
    /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/gems/celluloid-0.15.2/lib/celluloid/calls.rb:92:in `value'
    /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/gems/celluloid-0.15.2/lib/celluloid/proxies/sync_proxy.rb:33:in `method_missing'
    /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/gems/celluloid-0.15.2/lib/celluloid/proxies/actor_proxy.rb:20:in `_send_'
    /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/gems/celluloid-0.15.2/lib/celluloid.rb:200:in `new_link'
    /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/gems/celluloid-0.15.2/lib/celluloid/supervision_group.rb:136:in `start'
    /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/gems/celluloid-0.15.2/lib/celluloid/supervision_group.rb:124:in `initialize'
    /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/gems/celluloid-0.15.2/lib/celluloid/supervision_group.rb:82:in `new'
    /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/gems/celluloid-0.15.2/lib/celluloid/supervision_group.rb:82:in `add'
    /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/gems/celluloid-0.15.2/lib/celluloid/supervision_group.rb:69:in `supervise'
    /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/gems/celluloid-0.15.2/lib/celluloid/calls.rb:25:in `public_send'
    /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/gems/celluloid-0.15.2/lib/celluloid/calls.rb:25:in `dispatch'
    /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/gems/celluloid-0.15.2/lib/celluloid/calls.rb:67:in `dispatch'
    /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/gems/celluloid-0.15.2/lib/celluloid/actor.rb:322:in `block in handle_message'
    /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/gems/celluloid-0.15.2/lib/celluloid/actor.rb:416:in `block in task'
    /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/gems/celluloid-0.15.2/lib/celluloid/tasks.rb:55:in `block in initialize'
    /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/gems/celluloid-0.15.2/lib/celluloid/tasks/task_fiber.rb:13:in `block in create'
[2014-04-02 00:35:08.952] WARN  Celluloid: Terminating task: type=:call, meta={:method_name=>:initialize}, status=:callwait
[2014-04-02 00:35:08.952] DEBUG Celluloid: Terminating 2 actors...
/srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/gems/celluloid-0.15.2/lib/celluloid/tasks/task_fiber.rb:32:in `terminate': task was terminated (Celluloid::Task::TerminatedError)
    from /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/gems/celluloid-0.15.2/lib/celluloid/actor.rb:404:in `block in cleanup'
    from /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/gems/celluloid-0.15.2/lib/celluloid/actor.rb:404:in `each'
    from /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/gems/celluloid-0.15.2/lib/celluloid/actor.rb:404:in `cleanup'
    from /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/gems/celluloid-0.15.2/lib/celluloid/actor.rb:375:in `shutdown'
    from /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/gems/celluloid-0.15.2/lib/celluloid/actor.rb:367:in `handle_crash'
    from /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/gems/celluloid-0.15.2/lib/celluloid/actor.rb:187:in `rescue in run'
    from /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/gems/celluloid-0.15.2/lib/celluloid/actor.rb:171:in `run'
    from /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/gems/celluloid-0.15.2/lib/celluloid/actor.rb:157:in `block in initialize'
    from /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/gems/celluloid-0.15.2/lib/celluloid/thread_handle.rb:13:in `block in initialize'
    from /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/gems/celluloid-0.15.2/lib/celluloid/internal_pool.rb:100:in `call'
    from /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/gems/celluloid-0.15.2/lib/celluloid/internal_pool.rb:100:in `block in create'
    from /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/gems/logging-1.8.2/lib/logging/diagnostic_context.rb:323:in `call'
    from /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/gems/logging-1.8.2/lib/logging/diagnostic_context.rb:323:in `block in create_with_logging_context'
    from (celluloid):0:in `remote procedure call'
    from /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/gems/celluloid-0.15.2/lib/celluloid/calls.rb:92:in `value'
    from /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/gems/celluloid-0.15.2/lib/celluloid/proxies/sync_proxy.rb:33:in `method_missing'
    from /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/gems/celluloid-0.15.2/lib/celluloid/proxies/actor_proxy.rb:20:in `_send_'
    from /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/gems/celluloid-0.15.2/lib/celluloid.rb:189:in `new'
    from /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/gems/celluloid-0.15.2/lib/celluloid/supervisor.rb:10:in `supervise'
    from /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/gems/celluloid-0.15.2/lib/celluloid.rb:208:in `supervise'
    from /srv/pe/current/ahn/lib/request_handler.rb:7:in `initialize'
    from /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/bundler/gems/virginia-930d53c9d0d1/lib/virginia/service.rb:6:in `new'
    from /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/bundler/gems/virginia-930d53c9d0d1/lib/virginia/service.rb:6:in `start'
    from /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/bundler/gems/virginia-930d53c9d0d1/lib/virginia/plugin.rb:6:in `block in <class:Plugin>'
    from /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/bundler/gems/adhearsion-ee9d1526e077/lib/adhearsion/plugin/initializer.rb:26:in `instance_exec'
    from /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/bundler/gems/adhearsion-ee9d1526e077/lib/adhearsion/plugin/initializer.rb:26:in `run'
    from /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/bundler/gems/adhearsion-ee9d1526e077/lib/adhearsion/plugin.rb:188:in `block in run_plugins'
    from /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/bundler/gems/adhearsion-ee9d1526e077/lib/adhearsion/plugin.rb:187:in `each'
    from /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/bundler/gems/adhearsion-ee9d1526e077/lib/adhearsion/plugin.rb:187:in `run_plugins'
    from /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/bundler/gems/adhearsion-ee9d1526e077/lib/adhearsion/initializer.rb:254:in `run_plugins'
    from /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/bundler/gems/adhearsion-ee9d1526e077/lib/adhearsion/initializer.rb:66:in `block in start'
    from /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/bundler/gems/adhearsion-ee9d1526e077/lib/adhearsion/initializer.rb:41:in `catch'
    from /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/bundler/gems/adhearsion-ee9d1526e077/lib/adhearsion/initializer.rb:41:in `start'
    from /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/bundler/gems/adhearsion-ee9d1526e077/lib/adhearsion/initializer.rb:12:in `start'
    from /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/bundler/gems/adhearsion-ee9d1526e077/lib/adhearsion/cli_commands/ahn_command.rb:104:in `start_app'
    from /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/bundler/gems/adhearsion-ee9d1526e077/lib/adhearsion/cli_commands/ahn_command.rb:43:in `start'
    from /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/gems/thor-0.18.1/lib/thor/command.rb:27:in `run'
    from /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/gems/thor-0.18.1/lib/thor/invocation.rb:120:in `invoke_command'
    from /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/gems/thor-0.18.1/lib/thor.rb:363:in `dispatch'
    from /srv/pe/current/ahn/vendor/ruby/ruby/2.1.0/gems/thor-0.18.1/lib/thor/base.rb:439:in `start'
    from script/ahn:9:in `<main>'

ERROR Celluloid: Celluloid::SupervisionGroup crashed! when shutting adhearsion down with ctrl+c

Got the next stacktrace:

[2013-05-23 10:59:54] INFO  Adhearsion::Initializer: Received SIGINT. Shutting down.
[2013-05-23 10:59:54] INFO  Adhearsion::Process: Transitioning from running to stopping with 0 active calls due to shutdown event.
[2013-05-23 10:59:54] DEBUG Punchblock::Connection::Asterisk: Finalizing stream
[2013-05-23 10:59:54] INFO  Adhearsion::PunchblockPlugin::Initializer: Shutting down while connecting. Breaking the connection block.
[2013-05-23 10:59:54] INFO  Adhearsion::Console: Adhearsion Console shutting down
[2013-05-23 10:59:54] INFO  Adhearsion::Process: Adhearsion shut down
[2013-05-23 10:59:54] DEBUG Celluloid: Terminating 7 actors...
[2013-05-23 10:59:54] ERROR Celluloid: Celluloid::SupervisionGroup crashed!
Errno::EBADF: Bad file descriptor
    /Users/mak/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0/gems/celluloid-io-0.14.0/lib/celluloid/io.rb:37:in `select'
    /Users/mak/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0/gems/celluloid-io-0.14.0/lib/celluloid/io.rb:37:in `wait_readable'
    /Users/mak/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0/gems/celluloid-io-0.14.0/lib/celluloid/io/stream.rb:33:in `wait_readable'
    /Users/mak/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0/gems/celluloid-io-0.14.0/lib/celluloid/io/stream.rb:46:in `rescue in block in sysread'
    /Users/mak/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0/gems/celluloid-io-0.14.0/lib/celluloid/io/stream.rb:43:in `block in sysread'
    /Users/mak/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0/gems/celluloid-io-0.14.0/lib/celluloid/io/stream.rb:399:in `synchronize'
    /Users/mak/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0/gems/celluloid-io-0.14.0/lib/celluloid/io/stream.rb:42:in `sysread'
    /Users/mak/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0/gems/celluloid-io-0.14.0/lib/celluloid/io/stream.rb:128:in `readpartial'
    /Users/mak/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0/gems/reel-0.3.0/lib/reel/request.rb:19:in `read'
    /Users/mak/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0/gems/reel-0.3.0/lib/reel/connection.rb:52:in `request'
    /Users/mak/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0/gems/reel-0.3.0/lib/reel/app.rb:18:in `block in initialize'
    /Users/mak/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0/gems/celluloid-0.14.0/lib/celluloid/calls.rb:149:in `call'
    /Users/mak/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0/gems/celluloid-0.14.0/lib/celluloid/calls.rb:149:in `dispatch'
    /Users/mak/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0/gems/celluloid-0.14.0/lib/celluloid/actor.rb:331:in `block in handle_message'
    /Users/mak/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0/gems/celluloid-0.14.0/lib/celluloid/tasks.rb:42:in `block in initialize'
    /Users/mak/.rbenv/versions/2.0.0-p195/lib/ruby/gems/2.0.0/gems/celluloid-0.14.0/lib/celluloid/tasks/task_fiber.rb:9:in `block in create'
[2013-05-23 10:59:54] DEBUG Celluloid: Shutdown completed cleanly

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.