Class: GraphAttack::RateLimiter

Inherits:
Object
  • Object
show all
Defined in:
lib/graph_attack/rate_limiter.rb

Overview

Query analyser you can add to your GraphQL schema to limit calls by IP.

ApplicationSchema = GraphQL::Schema.define do
  query_analyzer GraphAttack::RateLimiter.new
end

Defined Under Namespace

Classes: Error, RateLimited

Instance Method Summary collapse

Constructor Details

#initialize(redis_client: Redis.new) ⇒ RateLimiter

Returns a new instance of RateLimiter.



15
16
17
# File 'lib/graph_attack/rate_limiter.rb', line 15

def initialize(redis_client: Redis.new)
  @redis_client = redis_client
end

Instance Method Details

#call(memo, visit_type, irep_node) ⇒ Object



26
27
28
29
30
31
32
33
34
35
36
# File 'lib/graph_attack/rate_limiter.rb', line 26

def call(memo, visit_type, irep_node)
  if rate_limited_node?(visit_type, irep_node)
    data = rate_limit_data(irep_node)

    memo[:query_rate_limits].push(data)

    increment_rate_limit(memo[:ip], data[:key])
  end

  memo
end

#final_value(memo) ⇒ Object



38
39
40
# File 'lib/graph_attack/rate_limiter.rb', line 38

def final_value(memo)
  handle_exceeded_calls_on_queries(memo)
end

#initial_value(query) ⇒ Object



19
20
21
22
23
24
# File 'lib/graph_attack/rate_limiter.rb', line 19

def initial_value(query)
  {
    ip: query.context[:ip],
    query_rate_limits: [],
  }
end