# Faraday Em::Synchrony adapter

This gem is a [Faraday][faraday] adapter for the [Em::Synchrony][em_synchrony] library.
Faraday is an HTTP client library that provides a common interface over many adapters.
Every adapter is defined into its own gem. This gem defines the adapter for Em::Synchrony.

## Installation

Add these lines to your application's Gemfile:

```ruby
gem 'faraday-em_synchrony'
```

And then execute:

    $ bundle install

Or install them yourself as:

    $ gem install faraday-em_synchrony

## Usage

This adapter can be used to make parallel requests using EventMachine.

The key difference between this and [EM-Http](https://github.com/lostisland/faraday-em_http) is that it uses fibers.
For more information see igrigorik's blog posts on the matter:

- [fibers-cooperative-scheduling-in-ruby](https://www.igvita.com/2009/05/13/fibers-cooperative-scheduling-in-ruby/)
- [untangling-evented-code-with-ruby-fibers](https://www.igvita.com/2010/03/22/untangling-evented-code-with-ruby-fibers)

**Error handling and responses have a slightly different behaviour and structure in some cases. Please run thorough testing scenarios, including connection failures and SSL failures**

### Base request
```ruby
require 'faraday/em_synchrony'

conn = Faraday.new(...) do |f|
  # no custom options available
  f.adapter :em_synchrony
end
```

### Parallel Requests

```ruby
require 'faraday/em_synchrony'

urls = Array.new(5) { 'http://127.0.0.1:3000' }

conn = Faraday::Connection.new do |builder|
  builder.adapter :em_synchrony
end

begin
  conn.in_parallel do
    puts "Parallel manager: #{conn.parallel_manager}"

    @responses = urls.map do |url|
      conn.get(url)
    end
  end
end

# Gather responses outside of block
puts @responses.map(&:status).join(', ')
puts @responses.map(&:status).compact.count
```

## Development

After checking out the repo, run `bin/setup` to install dependencies. Then, run `bin/test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.

To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](rubygems).

## Contributing

Bug reports and pull requests are welcome on [GitHub][repo].

## License

The gem is available as open source under the terms of the [license][license].

## Code of Conduct

Everyone interacting in the Faraday Em::Synchrony adapter project's codebase, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct][code-of-conduct].

[faraday]: https://github.com/lostisland/faraday
[faraday-website]: https://lostisland.github.io/faraday
[em_synchrony]: https://github.com/igrigorik/em-synchrony
[rubygems]: https://rubygems.org
[repo]: https://github.com/lostisland/faraday-em_synchrony
[license]: https://github.com/lostisland/faraday-em_synchrony/blob/main/LICENSE.md
[code-of-conduct]: https://github.com/lostisland/faraday-em_synchrony/blob/main/CODE_OF_CONDUCT.md