module GraphQL::Schema::Timeout::Trace
@requires_ancestor: Kernel
Public Class Methods
Source
# File lib/graphql/schema/timeout.rb, line 64 def initialize(timeout:, **rest) @timeout = timeout super end
Parameters
-
max_seconds(Numeric) — how many seconds the query should be allowed to resolve new fields
Calls superclass method
Public Instance Methods
# File lib/graphql/schema/timeout.rb, line 88 def begin_execute_field(field, _arguments, _objects, query) timeout_state = query.context.namespace(@timeout).fetch(:state) # If the `:state` is `false`, then `max_seconds(query)` opted out of timeout for this query. if timeout_state == false super elsif Process.clock_gettime(Process::CLOCK_MONOTONIC, :millisecond) > timeout_state.fetch(:timeout_at) error = GraphQL::Schema::Timeout::TimeoutError.new(field) # Only invoke the timeout callback for the first timeout if !timeout_state[:timed_out] timeout_state[:timed_out] = true @timeout.handle_timeout(error, query) timeout_state = query.context.namespace(@timeout).fetch(:state) end # `handle_timeout` may have set this to be `false` if timeout_state != false raise error else super end else super end end
Calls superclass method
# File lib/graphql/schema/timeout.rb, line 69 def execute_multiplex(multiplex:) multiplex.queries.each do |query| timeout_duration_s = @timeout.max_seconds(query) timeout_state = if timeout_duration_s == false # if the method returns `false`, don't apply a timeout false else now = Process.clock_gettime(Process::CLOCK_MONOTONIC, :millisecond) timeout_at = now + (timeout_duration_s * 1000) { timeout_at: timeout_at, timed_out: false } end query.context.namespace(@timeout)[:state] = timeout_state end super end
Calls superclass method