]> git.donarmstrong.com Git - dsa-puppet.git/blob - 3rdparty/modules/aviator/lib/puppet/feature/faraday/adapter/em_synchrony/parallel_manager.rb
12a1bafa4c7fb11d07e52659f2ee0bd674549bd3
[dsa-puppet.git] / 3rdparty / modules / aviator / lib / puppet / feature / faraday / adapter / em_synchrony / parallel_manager.rb
1 module Faraday
2   class Adapter
3     class EMSynchrony < Faraday::Adapter
4       class ParallelManager
5
6         # Add requests to queue. The `request` argument should be a
7         # `EM::HttpRequest` object.
8         def add(request, method, *args, &block)
9           queue << {
10             :request => request,
11             :method => method,
12             :args => args,
13             :block => block
14           }
15         end
16
17         # Run all requests on queue with `EM::Synchrony::Multi`, wrapping
18         # it in a reactor and fiber if needed.
19         def run
20           result = nil
21           if !EM.reactor_running?
22             EM.run {
23               Fiber.new do
24                 result = perform
25                 EM.stop
26               end.resume
27             }
28           else
29             result = perform
30           end
31           result
32         end
33
34
35         private
36
37         # The request queue.
38         def queue
39           @queue ||= []
40         end
41
42         # Main `EM::Synchrony::Multi` performer.
43         def perform
44           multi = ::EM::Synchrony::Multi.new
45
46           queue.each do |item|
47             method = "a#{item[:method]}".to_sym
48
49             req = item[:request].send(method, *item[:args])
50             req.callback(&item[:block])
51
52             req_name = "req_#{multi.requests.size}".to_sym
53             multi.add(req_name, req)
54           end
55
56           # Clear the queue, so parallel manager objects can be reused.
57           @queue = []
58
59           # Block fiber until all requests have returned.
60           multi.perform
61         end
62
63       end # ParallelManager
64     end # EMSynchrony
65   end # Adapter
66 end # Faraday