Sha256: c4b91c281847b6ec589f51f5cd8d4a9358f8c0179a3e5cad033c1b314e3c8195

Contents?: true

Size: 1.08 KB

Versions: 2

Compression:

Stored size: 1.08 KB

Contents

module GraphQL::Batch
  class Loader
    def self.for(*group_args)
      Executor.current.loaders[group_args] ||= new(*group_args)
    end

    def promises_by_key
      @promises_by_key ||= {}
    end

    def keys
      promises_by_key.keys
    end

    def load(key)
      promises_by_key[key] ||= Promise.new
    end

    def load_many(keys)
      Promise.all(keys.map { |key| load(key) })
    end

    def fulfill(key, value)
      promises_by_key[key].fulfill(value)
    end

    def fulfilled?(key)
      promises_by_key[key].fulfilled?
    end

    # batch load keys and fulfill promises
    def perform(keys)
      raise NotImplementedError
    end

    def resolve
      perform(keys)
      check_for_broken_promises
    rescue => err
      promises_by_key.each do |key, promise|
        promise.reject(err)
      end
    end

    private

    def check_for_broken_promises
      promises_by_key.each do |key, promise|
        if promise.pending?
          promise.reject(BrokenPromiseError.new("#{self.class} didn't fulfill promise for key #{key.inspect}"))
        end
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
graphql-batch-0.2.3 lib/graphql/batch/loader.rb
graphql-batch-0.2.2 lib/graphql/batch/loader.rb