Class: GraphQL::Schema::Middleware

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

Overview

  • query_initialize

  • query_finalize

  • field_resolve

Examples:

Closing a socket when the query is finished

SocketClosingMiddleware = GraphQL::Schema::Middleware.define do
  finalize_query -> (memo, env) {
    query.context[:socket].close
  }
end

Timing a query

QueryTimerMiddleware = GraphQL::Schema::Middleware.define do
  initialize_query -> (env) {
    env.merge!({
      query_start_time: Time.now,
      field_times: [],
    })
  }

  resolve_field -> (env) {
    field_time = {
      start_time: Time.now,
      own_elapsed: nil,
      child_elapsed: 0,
    }

    memo[:field_times] << field_time
    memo
  }

  after_field { |memo, env|
    field_time = memo[:field_times].pop
    total_elapsed = Time.now - field_time[:start_time]
    own_elapsed = total_elapsed - field_time[:child_elapsed]

    field_name = "#{env[:parent_type].name}.#{env[:field_definition].name}(#{env[:arguments].to_h.to_json})"
    Logger.info("[GraphQL Field] #{field_name} #{own_elapsed}")

    parent_field_time = memo[:field_times].last
    if parent_field_time
      parent_field_time[:child_elapsed] += total_elapsed
    end
  }

  after_query { |memo, env|
    elapsed = Time.now - memo[:query_start_time]
    Logger.info("[GraphQL Elapsed] #{elapsed}")
  }
end

Constant Summary collapse

EVENTS =
[:before_query, :after_query, :before_field, :after_field]

Class Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Class Attribute Details

.handlersObject (readonly)

Returns the value of attribute handlers.



56
57
58
# File 'lib/graphql/schema/middleware.rb', line 56

def handlers
  @handlers
end

Class Method Details

.on(event_name, &handler) ⇒ Object



61
62
63
64
65
66
67
# File 'lib/graphql/schema/middleware.rb', line 61

def on(event_name, &handler)
  if EVENTS.include?(event_name)
    handlers[event_name] = handler
  else
    raise("Can't attach handler to #{event_name} (must be one of: #{EVENTS})")
  end
end

Instance Method Details

#trigger(event_name, *args) ⇒ Object



70
71
72
# File 'lib/graphql/schema/middleware.rb', line 70

def trigger(event_name, *args)
  self.class.handlers[event_name].call(*args)
end