class Orchestrator::Core::RequestsProxy

Attributes

trace[R]

Public Class Methods

new(thread, modules, user = nil) click to toggle source
# File lib/orchestrator/core/requests_proxy.rb, line 9
def initialize(thread, modules, user = nil)
    if modules.nil?
        @modules = []
    else
        @modules = modules.is_a?(Array) ? modules : [modules]
    end
    @thread = thread
    @user = user
    @trace = []
end

Public Instance Methods

[](index) click to toggle source
# File lib/orchestrator/core/requests_proxy.rb, line 48
def [](index)
    mod = @modules[index]
    return nil unless mod
    return RequestProxy.new(@thread, mod, @user)
end
Also aliased as: at
at(index)
Alias for: []
each() { |request_proxy| ... } click to toggle source

Provide Enumerable support

# File lib/orchestrator/core/requests_proxy.rb, line 25
def each
    return enum_for(:each) unless block_given?

    @modules.each do |mod|
        yield RequestProxy.new(@thread, mod, @user)
    end
end
first() click to toggle source
# File lib/orchestrator/core/requests_proxy.rb, line 42
def first
    mod = @modules.first
    return nil unless mod
    return RequestProxy.new(@thread, mod, @user)
end
last() click to toggle source
# File lib/orchestrator/core/requests_proxy.rb, line 36
def last
    mod = @modules.last
    return nil unless mod
    return RequestProxy.new(@thread, mod, @user)
end
method_missing(name, *args, &block) click to toggle source
# File lib/orchestrator/core/requests_proxy.rb, line 64
def method_missing(name, *args, &block)
    if ::Orchestrator::Core::PROTECTED[name]
        err = Error::ProtectedMethod.new "attempt to access a protected method '#{name}' in multiple modules"
        ::Libuv::Q.reject(@thread, err)
        # TODO:: log warning err.message
    else
        @trace = caller

        promises = @modules.map do |mod|
            defer = mod.thread.defer
            mod.thread.schedule do
                # Keep track of previous in case of recursion
                previous = nil
                begin
                    if @user
                        previous = mod.current_user
                        mod.current_user = @user
                    end

                    defer.resolve(
                        mod.instance.public_send(name, *args, &block)
                    )
                rescue => e
                    mod.logger.print_error(e, '', @trace)
                    defer.reject(e)
                ensure
                    mod.current_user = previous if @user
                end
            end
            defer.promise
        end

        @thread.finally(*promises)
    end
end
nil?() click to toggle source

Returns true if there is no object to proxy Allows RequestProxy and RequestsProxy to be used interchangably

@return [true|false]

# File lib/orchestrator/core/requests_proxy.rb, line 59
def nil?
    @modules.empty?
end