Class: GraphQL::Schema::Timeout

Inherits:
Object
  • Object
show all
Defined in:
lib/graphql/schema/timeout.rb

Overview

This plugin will stop resolving new fields after max_seconds have elapsed. After the time has passed, any remaining fields will be nil, with errors added to the errors key. Any already-resolved fields will be in the data key, so you'll get a partial response.

You can subclass GraphQL::Schema::Timeout and override max_seconds and/or handle_timeout to provide custom logic when a timeout error occurs.

Note that this will stop a query in between field resolutions, but it doesn't interrupt long-running resolve functions. Be sure to use timeout options for external connections. For more info, see www.mikeperham.com/2015/05/08/timeout-rubys-most-dangerous-api/

Examples:

Stop resolving fields after 2 seconds

class MySchema < GraphQL::Schema
  use GraphQL::Schema::Timeout, max_seconds: 2
end

Notifying Bugsnag and logging a timeout

class MyTimeout < GraphQL::Schema::Timeout
  def handle_timeout(error, query)
     Rails.logger.warn("GraphQL Timeout: #{error.message}: #{query.query_string}")
     Bugsnag.notify(error, {query_string: query.query_string})
  end
end

class MySchema < GraphQL::Schema
  use MyTimeout, max_seconds: 2
end

Defined Under Namespace

Modules: Trace Classes: TimeoutError

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(max_seconds:) ⇒ Timeout

Returns a new instance of Timeout.



41
42
43
# File 'lib/graphql/schema/timeout.rb', line 41

def initialize(max_seconds:)
  @max_seconds = max_seconds
end

Class Method Details

.use(schema, max_seconds: nil) ⇒ Object



36
37
38
39
# File 'lib/graphql/schema/timeout.rb', line 36

def self.use(schema, max_seconds: nil)
  timeout = self.new(max_seconds: max_seconds)
  schema.trace_with(self::Trace, timeout: timeout)
end

Instance Method Details

#handle_timeout(error, query) ⇒ Object

Invoked when a query times out.



101
102
103
# File 'lib/graphql/schema/timeout.rb', line 101

def handle_timeout(error, query)
  # override to do something interesting
end

#max_seconds(query) ⇒ Numeric, false

Called at the start of each query. The default implementation returns the max_seconds: value from installing this plugin.

Parameters:

Returns:

  • (Numeric, false)

    The number of seconds after which to interrupt query execution and call #handle_error, or false to bypass the timeout.



94
95
96
# File 'lib/graphql/schema/timeout.rb', line 94

def max_seconds(query)
  @max_seconds
end