class GraphQL::Schema::Timeout
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
Example: Stop resolving fields after 2 seconds
class MySchema < GraphQL::Schema use GraphQL::Schema::Timeout, max_seconds: 2 end
Example: 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
Public Class Methods
Source
# File lib/graphql/schema/timeout.rb, line 49 def initialize(max_seconds:) @max_seconds = max_seconds end
# File lib/graphql/schema/timeout.rb, line 44 def self.use(schema, max_seconds: nil) timeout = self.new(max_seconds: max_seconds) schema.trace_with(const_get(:Trace), timeout: timeout) end
Public Instance Methods
# File lib/graphql/schema/timeout.rb, line 157 def disable_timeout(query) query.context.namespace(self)[:state] = false nil end
Call this method (eg, from handle timeout) to disable timeout tracking for the given query.
Parameters
-
query(GraphQL::Query)
Returns
-
void
# File lib/graphql/schema/timeout.rb, line 140 def handle_timeout(error, query) # override to do something interesting end
# File lib/graphql/schema/timeout.rb, line 127 def max_seconds(query) @max_seconds end
Called at the start of each query. The default implementation returns the max_seconds: value from installing this plugin.
Parameters
-
query(GraphQL::Query) — The query that’s about to run
Returns
-
Numeric, false— The number of seconds after which to interrupt query execution and callhandle_error, orfalseto bypass the timeout.