Module: GraphQL::Analysis

Defined in:
lib/graphql/analysis.rb,
lib/graphql/analysis/visitor.rb,
lib/graphql/analysis/analyzer.rb,
lib/graphql/analysis/field_usage.rb,
lib/graphql/analysis/query_depth.rb,
lib/graphql/analysis/max_query_depth.rb,
lib/graphql/analysis/query_complexity.rb,
lib/graphql/analysis/max_query_complexity.rb
more...

Defined Under Namespace

Classes: Analyzer, FieldUsage, MaxQueryComplexity, MaxQueryDepth, QueryComplexity, QueryDepth, Visitor

Constant Summary collapse

AST =
self

Class Method Summary collapse

Class Method Details

.analysis_errors(results) ⇒ Object

[View source]

89
90
91
# File 'lib/graphql/analysis.rb', line 89

def analysis_errors(results)
  results.flatten.tap { _1.select! { |r| r.is_a?(GraphQL::AnalysisError) } }
end

.analyze_multiplex(multiplex, analyzers) ⇒ Array<Any>

Analyze a multiplex, and all queries within. Multiplex analyzers are ran for all queries, keeping state. Query analyzers are ran per query, without carrying state between queries.

Parameters:

Returns:

  • (Array<Any>)

    Results from multiplex analyzers

[View source]

22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/graphql/analysis.rb', line 22

def analyze_multiplex(multiplex, analyzers)
  multiplex_analyzers = analyzers.map { |analyzer| analyzer.new(multiplex) }

  multiplex.current_trace.analyze_multiplex(multiplex: multiplex) do
    query_results = multiplex.queries.map do |query|
      if query.valid?
        analyze_query(
          query,
          query.analyzers,
          multiplex_analyzers: multiplex_analyzers
        )
      else
        []
      end
    end

    multiplex_results = multiplex_analyzers.map(&:result)
    multiplex_errors = analysis_errors(multiplex_results)

    multiplex.queries.each_with_index do |query, idx|
      query.analysis_errors = multiplex_errors + analysis_errors(query_results[idx])
    end
    multiplex_results
  end
end

.analyze_query(query, analyzers, multiplex_analyzers: []) ⇒ Array<Any>

Returns Results from those analyzers.

Parameters:

Returns:

  • (Array<Any>)

    Results from those analyzers

[View source]

51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/graphql/analysis.rb', line 51

def analyze_query(query, analyzers, multiplex_analyzers: [])
  query.current_trace.analyze_query(query: query) do
    query_analyzers = analyzers
      .map { |analyzer| analyzer.new(query) }
      .tap { _1.select!(&:analyze?) }

    analyzers_to_run = query_analyzers + multiplex_analyzers
    if analyzers_to_run.any?

      analyzers_to_run.select!(&:visit?)
      if analyzers_to_run.any?
        visitor = GraphQL::Analysis::Visitor.new(
          query: query,
          analyzers: analyzers_to_run
        )

        # `nil` or `0` causes no timeout
        Timeout::timeout(query.validate_timeout_remaining) do
          visitor.visit
        end

        if visitor.rescued_errors.any?
          return visitor.rescued_errors
        end
      end

      query_analyzers.map(&:result)
    else
      []
    end
  end
rescue Timeout::Error
  [GraphQL::AnalysisError.new("Timeout on validation of query")]
rescue GraphQL::UnauthorizedError
  # This error was raised during analysis and will be returned the client before execution
  []
end