--- /dev/null
+module Faraday
+ class Adapter
+ class EMSynchrony < Faraday::Adapter
+ class ParallelManager
+
+ # Add requests to queue. The `request` argument should be a
+ # `EM::HttpRequest` object.
+ def add(request, method, *args, &block)
+ queue << {
+ :request => request,
+ :method => method,
+ :args => args,
+ :block => block
+ }
+ end
+
+ # Run all requests on queue with `EM::Synchrony::Multi`, wrapping
+ # it in a reactor and fiber if needed.
+ def run
+ result = nil
+ if !EM.reactor_running?
+ EM.run {
+ Fiber.new do
+ result = perform
+ EM.stop
+ end.resume
+ }
+ else
+ result = perform
+ end
+ result
+ end
+
+
+ private
+
+ # The request queue.
+ def queue
+ @queue ||= []
+ end
+
+ # Main `EM::Synchrony::Multi` performer.
+ def perform
+ multi = ::EM::Synchrony::Multi.new
+
+ queue.each do |item|
+ method = "a#{item[:method]}".to_sym
+
+ req = item[:request].send(method, *item[:args])
+ req.callback(&item[:block])
+
+ req_name = "req_#{multi.requests.size}".to_sym
+ multi.add(req_name, req)
+ end
+
+ # Clear the queue, so parallel manager objects can be reused.
+ @queue = []
+
+ # Block fiber until all requests have returned.
+ multi.perform
+ end
+
+ end # ParallelManager
+ end # EMSynchrony
+ end # Adapter
+end # Faraday