Class: GraphQL::Subscriptions::Event

Inherits:
Object
  • Object
show all
Defined in:
lib/graphql/subscriptions/event.rb

Overview

This thing can be:

  • Subscribed to by subscription { ... }
  • Triggered by MySchema.subscriber.trigger(name, arguments, obj)

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(name:, arguments:, field: nil, context: nil, scope: nil) ⇒ Event

Returns a new instance of Event.



21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
# File 'lib/graphql/subscriptions/event.rb', line 21

def initialize(name:, arguments:, field: nil, context: nil, scope: nil)
  @name = name
  @arguments = self.class.arguments_without_field_extras(arguments: arguments, field: field)
  @context = context
  field ||= context.field
  scope_key = field.subscription_scope
  scope_val = scope || (context && scope_key && context[scope_key])
  if scope_key &&
      (subscription = field.resolver) &&
      (subscription.respond_to?(:subscription_scope_optional?)) &&
      !subscription.subscription_scope_optional? &&
      scope_val.nil?
    raise Subscriptions::SubscriptionScopeMissingError, "#{field.path} (#{subscription}) requires a `scope:` value to trigger updates (Set `subscription_scope ..., optional: true` to disable this requirement)"
  end

  @topic = self.class.serialize(name, arguments, field, scope: scope_val, context: context)
end

Instance Attribute Details

#argumentsGraphQL::Execution::Interpreter::Arguments (readonly)



13
14
15
# File 'lib/graphql/subscriptions/event.rb', line 13

def arguments
  @arguments
end

#contextGraphQL::Query::Context (readonly)



16
17
18
# File 'lib/graphql/subscriptions/event.rb', line 16

def context
  @context
end

#nameString (readonly)

Returns Corresponds to the Subscription root field name.

Returns:

  • (String)

    Corresponds to the Subscription root field name



10
11
12
# File 'lib/graphql/subscriptions/event.rb', line 10

def name
  @name
end

#topicString (readonly)

Returns An opaque string which identifies this event, derived from name and arguments.

Returns:

  • (String)

    An opaque string which identifies this event, derived from name and arguments



19
20
21
# File 'lib/graphql/subscriptions/event.rb', line 19

def topic
  @topic
end

Class Method Details

.arguments_without_field_extras(arguments:, field:) ⇒ Object



64
65
66
67
68
69
70
71
72
# File 'lib/graphql/subscriptions/event.rb', line 64

def arguments_without_field_extras(arguments:, field:)
  if !field.extras.empty?
    arguments = arguments.dup
    field.extras.each do |extra_key|
      arguments.delete(extra_key)
    end
  end
  arguments
end

.serialize(_name, arguments, field, scope:, context: GraphQL::Query::NullContext.instance) ⇒ String

Returns an identifier for this unit of subscription.

Returns:

  • (String)

    an identifier for this unit of subscription



40
41
42
43
44
45
# File 'lib/graphql/subscriptions/event.rb', line 40

def self.serialize(_name, arguments, field, scope:, context: GraphQL::Query::NullContext.instance)
  subscription = field.resolver || GraphQL::Schema::Subscription
  arguments = arguments_without_field_extras(field: field, arguments: arguments)
  normalized_args = stringify_args(field, arguments.to_h, context)
  subscription.topic_for(arguments: normalized_args, field: field, scope: scope)
end

Instance Method Details

#fingerprintString

Returns a logical identifier for this event. (Stable when the query is broadcastable.).

Returns:

  • (String)

    a logical identifier for this event. (Stable when the query is broadcastable.)



48
49
50
51
52
53
54
55
56
57
58
59
60
61
# File 'lib/graphql/subscriptions/event.rb', line 48

def fingerprint
  @fingerprint ||= begin
    # When this query has been flagged as broadcastable,
    # use a generalized, stable fingerprint so that
    # duplicate subscriptions can be evaluated and distributed in bulk.
    # (`@topic` includes field, args, and subscription scope already.)
    if @context.namespace(:subscriptions)[:subscription_broadcastable]
      "#{@topic}/#{@context.query.fingerprint}"
    else
      # not broadcastable, build a unique ID for this event
      @context.schema.subscriptions.build_id
    end
  end
end