]> git.donarmstrong.com Git - dsa-puppet.git/blobdiff - 3rdparty/modules/aviator/lib/puppet/feature/faraday/adapter/em_synchrony/parallel_manager.rb
try again, with puppetforge modules, correctly included now
[dsa-puppet.git] / 3rdparty / modules / aviator / lib / puppet / feature / faraday / adapter / em_synchrony / parallel_manager.rb
diff --git a/3rdparty/modules/aviator/lib/puppet/feature/faraday/adapter/em_synchrony/parallel_manager.rb b/3rdparty/modules/aviator/lib/puppet/feature/faraday/adapter/em_synchrony/parallel_manager.rb
new file mode 100644 (file)
index 0000000..12a1baf
--- /dev/null
@@ -0,0 +1,66 @@
+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