graphql 1.7.6 → 1.7.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/lib/generators/graphql/function_generator.rb +1 -1
- data/lib/generators/graphql/loader_generator.rb +1 -1
- data/lib/generators/graphql/mutation_generator.rb +6 -1
- data/lib/generators/graphql/templates/function.erb +2 -2
- data/lib/generators/graphql/templates/loader.erb +2 -2
- data/lib/graphql/execution.rb +1 -0
- data/lib/graphql/execution/instrumentation.rb +82 -0
- data/lib/graphql/execution/multiplex.rb +11 -28
- data/lib/graphql/field.rb +5 -0
- data/lib/graphql/internal_representation/node.rb +1 -1
- data/lib/graphql/language.rb +1 -0
- data/lib/graphql/language/document_from_schema_definition.rb +185 -0
- data/lib/graphql/language/lexer.rb +3 -3
- data/lib/graphql/language/lexer.rl +2 -2
- data/lib/graphql/language/token.rb +9 -2
- data/lib/graphql/query.rb +4 -0
- data/lib/graphql/relay/relation_connection.rb +13 -18
- data/lib/graphql/schema.rb +6 -0
- data/lib/graphql/schema/build_from_definition.rb +2 -0
- data/lib/graphql/subscriptions/action_cable_subscriptions.rb +6 -4
- data/lib/graphql/tracing.rb +1 -0
- data/lib/graphql/tracing/data_dog_tracing.rb +45 -0
- data/lib/graphql/tracing/platform_tracing.rb +20 -7
- data/lib/graphql/version.rb +1 -1
- data/readme.md +1 -1
- data/spec/dummy/app/channels/graphql_channel.rb +22 -1
- data/spec/dummy/log/development.log +239 -0
- data/spec/dummy/log/test.log +204 -0
- data/spec/dummy/test/system/action_cable_subscription_test.rb +4 -0
- data/spec/dummy/tmp/screenshots/failures_test_it_handles_subscriptions.png +0 -0
- data/spec/generators/graphql/function_generator_spec.rb +26 -0
- data/spec/generators/graphql/loader_generator_spec.rb +24 -0
- data/spec/graphql/analysis/max_query_complexity_spec.rb +3 -3
- data/spec/graphql/analysis/max_query_depth_spec.rb +3 -3
- data/spec/graphql/boolean_type_spec.rb +3 -3
- data/spec/graphql/execution/execute_spec.rb +1 -1
- data/spec/graphql/execution/instrumentation_spec.rb +165 -0
- data/spec/graphql/execution/multiplex_spec.rb +1 -1
- data/spec/graphql/float_type_spec.rb +2 -2
- data/spec/graphql/id_type_spec.rb +1 -1
- data/spec/graphql/input_object_type_spec.rb +2 -2
- data/spec/graphql/int_type_spec.rb +2 -2
- data/spec/graphql/internal_representation/rewrite_spec.rb +2 -2
- data/spec/graphql/introspection/schema_type_spec.rb +1 -0
- data/spec/graphql/language/document_from_schema_definition_spec.rb +337 -0
- data/spec/graphql/language/lexer_spec.rb +12 -1
- data/spec/graphql/language/parser_spec.rb +1 -1
- data/spec/graphql/query/arguments_spec.rb +3 -3
- data/spec/graphql/query/variables_spec.rb +1 -1
- data/spec/graphql/query_spec.rb +4 -4
- data/spec/graphql/relay/base_connection_spec.rb +1 -1
- data/spec/graphql/relay/connection_resolve_spec.rb +1 -1
- data/spec/graphql/relay/connection_type_spec.rb +1 -1
- data/spec/graphql/relay/mutation_spec.rb +3 -3
- data/spec/graphql/relay/relation_connection_spec.rb +58 -0
- data/spec/graphql/schema/build_from_definition_spec.rb +14 -0
- data/spec/graphql/schema/validation_spec.rb +1 -1
- data/spec/graphql/schema/warden_spec.rb +11 -11
- data/spec/graphql/schema_spec.rb +8 -1
- data/spec/graphql/string_type_spec.rb +3 -3
- data/spec/graphql/subscriptions_spec.rb +1 -1
- data/spec/graphql/tracing/platform_tracing_spec.rb +59 -0
- data/spec/support/dummy/schema.rb +19 -0
- data/spec/support/star_wars/data.rb +1 -2
- metadata +9 -2
| @@ -387,7 +387,7 @@ def self.run_lexer(query_string) | |
| 387 387 | 
             
            									begin
         | 
| 388 388 | 
             
            										te = p+1;
         | 
| 389 389 | 
             
            										begin
         | 
| 390 | 
            -
            											emit_string(ts + 1, te | 
| 390 | 
            +
            											emit_string(ts + 1, te, meta) 
         | 
| 391 391 | 
             
            										end
         | 
| 392 392 |  | 
| 393 393 | 
             
            									end
         | 
| @@ -791,7 +791,7 @@ def self.run_lexer(query_string) | |
| 791 791 | 
             
            										begin
         | 
| 792 792 | 
             
            											p = ((te))-1;
         | 
| 793 793 | 
             
            											begin
         | 
| 794 | 
            -
            												emit_string(ts + 1, te | 
| 794 | 
            +
            												emit_string(ts + 1, te, meta) 
         | 
| 795 795 | 
             
            											end
         | 
| 796 796 |  | 
| 797 797 | 
             
            										end
         | 
| @@ -1304,7 +1304,7 @@ PACK_DIRECTIVE = "c*" | |
| 1304 1304 | 
             
            UTF_8_ENCODING = "UTF-8"
         | 
| 1305 1305 |  | 
| 1306 1306 | 
             
            def self.emit_string(ts, te, meta)
         | 
| 1307 | 
            -
            value = meta[:data][ts...te].pack(PACK_DIRECTIVE).force_encoding(UTF_8_ENCODING)
         | 
| 1307 | 
            +
            value = meta[:data][ts...te - 1].pack(PACK_DIRECTIVE).force_encoding(UTF_8_ENCODING)
         | 
| 1308 1308 | 
             
            if value !~ VALID_STRING
         | 
| 1309 1309 | 
             
            meta[:tokens] << token = GraphQL::Language::Token.new(
         | 
| 1310 1310 | 
             
            name: :BAD_UNICODE_ESCAPE,
         | 
| @@ -75,7 +75,7 @@ | |
| 75 75 | 
             
                RBRACKET      => { emit(:RBRACKET, ts, te, meta) };
         | 
| 76 76 | 
             
                LBRACKET      => { emit(:LBRACKET, ts, te, meta) };
         | 
| 77 77 | 
             
                COLON         => { emit(:COLON, ts, te, meta) };
         | 
| 78 | 
            -
                QUOTED_STRING => { emit_string(ts + 1, te | 
| 78 | 
            +
                QUOTED_STRING => { emit_string(ts + 1, te, meta) };
         | 
| 79 79 | 
             
                VAR_SIGN      => { emit(:VAR_SIGN, ts, te, meta) };
         | 
| 80 80 | 
             
                DIR_SIGN      => { emit(:DIR_SIGN, ts, te, meta) };
         | 
| 81 81 | 
             
                ELLIPSIS      => { emit(:ELLIPSIS, ts, te, meta) };
         | 
| @@ -189,7 +189,7 @@ module GraphQL | |
| 189 189 | 
             
                  UTF_8_ENCODING = "UTF-8"
         | 
| 190 190 |  | 
| 191 191 | 
             
                  def self.emit_string(ts, te, meta)
         | 
| 192 | 
            -
                    value = meta[:data][ts...te].pack(PACK_DIRECTIVE).force_encoding(UTF_8_ENCODING)
         | 
| 192 | 
            +
                    value = meta[:data][ts...te - 1].pack(PACK_DIRECTIVE).force_encoding(UTF_8_ENCODING)
         | 
| 193 193 | 
             
                    if value !~ VALID_STRING
         | 
| 194 194 | 
             
                      meta[:tokens] << token = GraphQL::Language::Token.new(
         | 
| 195 195 | 
             
                        name: :BAD_UNICODE_ESCAPE,
         | 
| @@ -5,7 +5,10 @@ module GraphQL | |
| 5 5 | 
             
                # Contains type, value and position data.
         | 
| 6 6 | 
             
                class Token
         | 
| 7 7 | 
             
                  # @return [Symbol] The kind of token this is
         | 
| 8 | 
            -
                  attr_reader :name | 
| 8 | 
            +
                  attr_reader :name
         | 
| 9 | 
            +
                  # @return [String] The text of this token
         | 
| 10 | 
            +
                  attr_reader :value
         | 
| 11 | 
            +
                  attr_reader :prev_token, :line, :col
         | 
| 9 12 |  | 
| 10 13 | 
             
                  def initialize(value:, name:, line:, col:, prev_token:)
         | 
| 11 14 | 
             
                    @name = name
         | 
| @@ -15,13 +18,17 @@ module GraphQL | |
| 15 18 | 
             
                    @prev_token = prev_token
         | 
| 16 19 | 
             
                  end
         | 
| 17 20 |  | 
| 18 | 
            -
                   | 
| 21 | 
            +
                  alias to_s value
         | 
| 19 22 | 
             
                  def to_i; @value.to_i; end
         | 
| 20 23 | 
             
                  def to_f; @value.to_f; end
         | 
| 21 24 |  | 
| 22 25 | 
             
                  def line_and_column
         | 
| 23 26 | 
             
                    [@line, @col]
         | 
| 24 27 | 
             
                  end
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                  def inspect
         | 
| 30 | 
            +
                    "(#{@name} #{@value.inspect} [#{@line}:#{@col}])"
         | 
| 31 | 
            +
                  end
         | 
| 25 32 | 
             
                end
         | 
| 26 33 | 
             
              end
         | 
| 27 34 | 
             
            end
         | 
    
        data/lib/graphql/query.rb
    CHANGED
    
    
| @@ -7,11 +7,11 @@ module GraphQL | |
| 7 7 | 
             
                # - `Sequel::Dataset`
         | 
| 8 8 | 
             
                class RelationConnection < BaseConnection
         | 
| 9 9 | 
             
                  def cursor_from_node(item)
         | 
| 10 | 
            -
                    item_index =  | 
| 10 | 
            +
                    item_index = paged_nodes.index(item)
         | 
| 11 11 | 
             
                    if item_index.nil?
         | 
| 12 12 | 
             
                      raise("Can't generate cursor, item not found in connection: #{item}")
         | 
| 13 13 | 
             
                    else
         | 
| 14 | 
            -
                      offset = item_index + 1 + (( | 
| 14 | 
            +
                      offset = item_index + 1 + ((paged_nodes_offset || 0) - (relation_offset(sliced_nodes) || 0))
         | 
| 15 15 |  | 
| 16 16 | 
             
                      if after
         | 
| 17 17 | 
             
                        offset += offset_from_cursor(after)
         | 
| @@ -25,7 +25,7 @@ module GraphQL | |
| 25 25 |  | 
| 26 26 | 
             
                  def has_next_page
         | 
| 27 27 | 
             
                    if first
         | 
| 28 | 
            -
                       | 
| 28 | 
            +
                      paged_nodes.length >= first && sliced_nodes_count > first
         | 
| 29 29 | 
             
                    elsif GraphQL::Relay::ConnectionType.bidirectional_pagination && last
         | 
| 30 30 | 
             
                      sliced_nodes_count > last
         | 
| 31 31 | 
             
                    else
         | 
| @@ -35,7 +35,7 @@ module GraphQL | |
| 35 35 |  | 
| 36 36 | 
             
                  def has_previous_page
         | 
| 37 37 | 
             
                    if last
         | 
| 38 | 
            -
                       | 
| 38 | 
            +
                      paged_nodes.length >= last && sliced_nodes_count > last
         | 
| 39 39 | 
             
                    elsif GraphQL::Relay::ConnectionType.bidirectional_pagination && after
         | 
| 40 40 | 
             
                      # We've already paginated through the collection a bit,
         | 
| 41 41 | 
             
                      # there are nodes behind us
         | 
| @@ -64,6 +64,7 @@ module GraphQL | |
| 64 64 | 
             
                  private
         | 
| 65 65 |  | 
| 66 66 | 
             
                  # apply first / last limit results
         | 
| 67 | 
            +
                  # @return [Array]
         | 
| 67 68 | 
             
                  def paged_nodes
         | 
| 68 69 | 
             
                    return @paged_nodes if defined? @paged_nodes
         | 
| 69 70 |  | 
| @@ -94,7 +95,14 @@ module GraphQL | |
| 94 95 | 
             
                      end
         | 
| 95 96 | 
             
                    end
         | 
| 96 97 |  | 
| 97 | 
            -
                     | 
| 98 | 
            +
                    # Store this here so we can convert the relation to an Array
         | 
| 99 | 
            +
                    # (this avoids an extra DB call on Sequel)
         | 
| 100 | 
            +
                    @paged_nodes_offset = relation_offset(items)
         | 
| 101 | 
            +
                    @paged_nodes = items.to_a
         | 
| 102 | 
            +
                  end
         | 
| 103 | 
            +
             | 
| 104 | 
            +
                  def paged_nodes_offset
         | 
| 105 | 
            +
                    paged_nodes && @paged_nodes_offset
         | 
| 98 106 | 
             
                  end
         | 
| 99 107 |  | 
| 100 108 | 
             
                  def relation_offset(relation)
         | 
| @@ -166,19 +174,6 @@ module GraphQL | |
| 166 174 | 
             
                  def offset_from_cursor(cursor)
         | 
| 167 175 | 
             
                    decode(cursor).to_i
         | 
| 168 176 | 
             
                  end
         | 
| 169 | 
            -
             | 
| 170 | 
            -
                  def paged_nodes_array
         | 
| 171 | 
            -
                    return @paged_nodes_array if defined?(@paged_nodes_array)
         | 
| 172 | 
            -
                    @paged_nodes_array = paged_nodes.to_a
         | 
| 173 | 
            -
                  end
         | 
| 174 | 
            -
             | 
| 175 | 
            -
                  def paged_nodes_length
         | 
| 176 | 
            -
                    if paged_nodes.respond_to?(:length)
         | 
| 177 | 
            -
                      paged_nodes.length
         | 
| 178 | 
            -
                    else
         | 
| 179 | 
            -
                      paged_nodes_array.length
         | 
| 180 | 
            -
                    end
         | 
| 181 | 
            -
                  end
         | 
| 182 177 | 
             
                end
         | 
| 183 178 |  | 
| 184 179 | 
             
                if defined?(ActiveRecord::Relation)
         | 
    
        data/lib/graphql/schema.rb
    CHANGED
    
    | @@ -542,6 +542,12 @@ module GraphQL | |
| 542 542 | 
             
                  GraphQL::Schema::Printer.print_schema(self, only: only, except: except, context: context)
         | 
| 543 543 | 
             
                end
         | 
| 544 544 |  | 
| 545 | 
            +
                # Return the GraphQL::Language::Document IDL AST for the schema
         | 
| 546 | 
            +
                # @return [GraphQL::Language::Document]
         | 
| 547 | 
            +
                def to_document
         | 
| 548 | 
            +
                  GraphQL::Language::DocumentFromSchemaDefinition.new(self).document
         | 
| 549 | 
            +
                end
         | 
| 550 | 
            +
             | 
| 545 551 | 
             
                # Return the Hash response of {Introspection::INTROSPECTION_QUERY}.
         | 
| 546 552 | 
             
                # @param context [Hash]
         | 
| 547 553 | 
             
                # @param only [<#call(member, ctx)>]
         | 
| @@ -62,19 +62,21 @@ module GraphQL | |
| 62 62 | 
             
                class ActionCableSubscriptions < GraphQL::Subscriptions
         | 
| 63 63 | 
             
                  SUBSCRIPTION_PREFIX = "graphql-subscription:"
         | 
| 64 64 | 
             
                  EVENT_PREFIX = "graphql-event:"
         | 
| 65 | 
            -
             | 
| 65 | 
            +
             | 
| 66 | 
            +
                  # @param serializer [<#dump(obj), #load(string)] Used for serializing messages before handing them to `.broadcast(msg)`
         | 
| 67 | 
            +
                  def initialize(serializer: Serialize, **rest)
         | 
| 66 68 | 
             
                    # A per-process map of subscriptions to deliver.
         | 
| 67 69 | 
             
                    # This is provided by Rails, so let's use it
         | 
| 68 70 | 
             
                    @subscriptions = Concurrent::Map.new
         | 
| 71 | 
            +
                    @serializer = serializer
         | 
| 69 72 | 
             
                    super
         | 
| 70 73 | 
             
                  end
         | 
| 71 74 |  | 
| 72 75 | 
             
                  # An event was triggered; Push the data over ActionCable.
         | 
| 73 76 | 
             
                  # Subscribers will re-evaluate locally.
         | 
| 74 | 
            -
                  # TODO: this method name is a smell
         | 
| 75 77 | 
             
                  def execute_all(event, object)
         | 
| 76 78 | 
             
                    stream = EVENT_PREFIX + event.topic
         | 
| 77 | 
            -
                    message =  | 
| 79 | 
            +
                    message = @serializer.dump(object)
         | 
| 78 80 | 
             
                    ActionCable.server.broadcast(stream, message)
         | 
| 79 81 | 
             
                  end
         | 
| 80 82 |  | 
| @@ -97,7 +99,7 @@ module GraphQL | |
| 97 99 | 
             
                    @subscriptions[subscription_id] = query
         | 
| 98 100 | 
             
                    events.each do |event|
         | 
| 99 101 | 
             
                      channel.stream_from(EVENT_PREFIX + event.topic, coder: ActiveSupport::JSON) do |message|
         | 
| 100 | 
            -
                        execute(subscription_id, event,  | 
| 102 | 
            +
                        execute(subscription_id, event, @serializer.load(message))
         | 
| 101 103 | 
             
                        nil
         | 
| 102 104 | 
             
                      end
         | 
| 103 105 | 
             
                    end
         | 
    
        data/lib/graphql/tracing.rb
    CHANGED
    
    | @@ -2,6 +2,7 @@ | |
| 2 2 | 
             
            require "graphql/tracing/active_support_notifications_tracing"
         | 
| 3 3 | 
             
            require "graphql/tracing/platform_tracing"
         | 
| 4 4 | 
             
            require "graphql/tracing/appsignal_tracing"
         | 
| 5 | 
            +
            require "graphql/tracing/data_dog_tracing"
         | 
| 5 6 | 
             
            require "graphql/tracing/new_relic_tracing"
         | 
| 6 7 | 
             
            require "graphql/tracing/scout_tracing"
         | 
| 7 8 | 
             
            require "graphql/tracing/skylight_tracing"
         | 
| @@ -0,0 +1,45 @@ | |
| 1 | 
            +
            # frozen_string_literal: true
         | 
| 2 | 
            +
             | 
| 3 | 
            +
            module GraphQL
         | 
| 4 | 
            +
              module Tracing
         | 
| 5 | 
            +
                class DataDogTracing < PlatformTracing
         | 
| 6 | 
            +
                  self.platform_keys = {
         | 
| 7 | 
            +
                    'lex' => 'lex.graphql',
         | 
| 8 | 
            +
                    'parse' => 'parse.graphql',
         | 
| 9 | 
            +
                    'validate' => 'validate.graphql',
         | 
| 10 | 
            +
                    'analyze_query' => 'analyze.graphql',
         | 
| 11 | 
            +
                    'analyze_multiplex' => 'analyze.graphql',
         | 
| 12 | 
            +
                    'execute_multiplex' => 'execute.graphql',
         | 
| 13 | 
            +
                    'execute_query' => 'execute.graphql',
         | 
| 14 | 
            +
                    'execute_query_lazy' => 'execute.graphql',
         | 
| 15 | 
            +
                  }
         | 
| 16 | 
            +
             | 
| 17 | 
            +
                  def platform_trace(platform_key, key, data)
         | 
| 18 | 
            +
                    service = options.fetch(:service, 'ruby-graphql')
         | 
| 19 | 
            +
             | 
| 20 | 
            +
                    pin = Datadog::Pin.get_from(self)
         | 
| 21 | 
            +
                    unless pin
         | 
| 22 | 
            +
                      pin = Datadog::Pin.new(service)
         | 
| 23 | 
            +
                      pin.onto(self)
         | 
| 24 | 
            +
                    end
         | 
| 25 | 
            +
             | 
| 26 | 
            +
                    pin.tracer.trace(platform_key, service: pin.service) do |span|
         | 
| 27 | 
            +
                      if key == 'execute_multiplex'
         | 
| 28 | 
            +
                        span.resource = data[:multiplex].queries.map(&:selected_operation_name).join(', ')
         | 
| 29 | 
            +
                      end
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                      if key == 'execute_query'
         | 
| 32 | 
            +
                        span.set_tag(:selected_operation_name, data[:query].selected_operation_name)
         | 
| 33 | 
            +
                        span.set_tag(:selected_operation_type, data[:query].selected_operation.operation_type)
         | 
| 34 | 
            +
                        span.set_tag(:query_string, data[:query].query_string)
         | 
| 35 | 
            +
                      end
         | 
| 36 | 
            +
                      yield
         | 
| 37 | 
            +
                    end
         | 
| 38 | 
            +
                  end
         | 
| 39 | 
            +
             | 
| 40 | 
            +
                  def platform_field_key(type, field)
         | 
| 41 | 
            +
                    "#{type.name}.#{field.name}"
         | 
| 42 | 
            +
                  end
         | 
| 43 | 
            +
                end
         | 
| 44 | 
            +
              end
         | 
| 45 | 
            +
            end
         | 
| @@ -12,8 +12,10 @@ module GraphQL | |
| 12 12 | 
             
                    attr_accessor :platform_keys
         | 
| 13 13 | 
             
                  end
         | 
| 14 14 |  | 
| 15 | 
            -
                  def initialize
         | 
| 15 | 
            +
                  def initialize(options = {})
         | 
| 16 | 
            +
                    @options = options
         | 
| 16 17 | 
             
                    @platform_keys = self.class.platform_keys
         | 
| 18 | 
            +
                    @trace_scalars = options.fetch(:trace_scalars, false)
         | 
| 17 19 | 
             
                  end
         | 
| 18 20 |  | 
| 19 21 | 
             
                  def trace(key, data)
         | 
| @@ -41,19 +43,30 @@ module GraphQL | |
| 41 43 | 
             
                    return_type = field.type.unwrap
         | 
| 42 44 | 
             
                    case return_type
         | 
| 43 45 | 
             
                    when GraphQL::ScalarType, GraphQL::EnumType
         | 
| 44 | 
            -
                      field
         | 
| 46 | 
            +
                      if field.trace || (field.trace.nil? && @trace_scalars)
         | 
| 47 | 
            +
                        trace_field(type, field)
         | 
| 48 | 
            +
                      else
         | 
| 49 | 
            +
                        field
         | 
| 50 | 
            +
                      end
         | 
| 45 51 | 
             
                    else
         | 
| 46 | 
            -
                       | 
| 47 | 
            -
                      new_f.metadata[:platform_key] = platform_field_key(type, field)
         | 
| 48 | 
            -
                      new_f
         | 
| 52 | 
            +
                      trace_field(type, field)
         | 
| 49 53 | 
             
                    end
         | 
| 50 54 | 
             
                  end
         | 
| 51 55 |  | 
| 52 | 
            -
                  def  | 
| 53 | 
            -
                     | 
| 56 | 
            +
                  def trace_field(type, field)
         | 
| 57 | 
            +
                    new_f = field.redefine
         | 
| 58 | 
            +
                    new_f.metadata[:platform_key] = platform_field_key(type, field)
         | 
| 59 | 
            +
                    new_f
         | 
| 60 | 
            +
                  end
         | 
| 61 | 
            +
             | 
| 62 | 
            +
                  def self.use(schema_defn, options = {})
         | 
| 63 | 
            +
                    tracer = self.new(options)
         | 
| 54 64 | 
             
                    schema_defn.instrument(:field, tracer)
         | 
| 55 65 | 
             
                    schema_defn.tracer(tracer)
         | 
| 56 66 | 
             
                  end
         | 
| 67 | 
            +
             | 
| 68 | 
            +
                  private
         | 
| 69 | 
            +
                  attr_reader :options
         | 
| 57 70 | 
             
                end
         | 
| 58 71 | 
             
              end
         | 
| 59 72 | 
             
            end
         | 
    
        data/lib/graphql/version.rb
    CHANGED
    
    
    
        data/readme.md
    CHANGED
    
    | @@ -9,7 +9,7 @@ | |
| 9 9 | 
             
            A Ruby implementation of [GraphQL](http://graphql.org/).
         | 
| 10 10 |  | 
| 11 11 | 
             
            - [Website](https://rmosolgo.github.io/graphql-ruby)
         | 
| 12 | 
            -
            - [API Documentation](http://www.rubydoc.info/ | 
| 12 | 
            +
            - [API Documentation](http://www.rubydoc.info/gems/graphql)
         | 
| 13 13 | 
             
            - [Newsletter](https://tinyletter.com/graphql-ruby)
         | 
| 14 14 |  | 
| 15 15 | 
             
            ## Installation
         | 
| @@ -17,10 +17,31 @@ class GraphqlChannel < ActionCable::Channel::Base | |
| 17 17 | 
             
                field :value, types.Int
         | 
| 18 18 | 
             
              end
         | 
| 19 19 |  | 
| 20 | 
            +
              # Wacky behavior around the number 4
         | 
| 21 | 
            +
              # so we can confirm it's used by the UI
         | 
| 22 | 
            +
              module CustomSerializer
         | 
| 23 | 
            +
                def self.load(value)
         | 
| 24 | 
            +
                  if value == "4x"
         | 
| 25 | 
            +
                    ExamplePayload.new(400)
         | 
| 26 | 
            +
                  else
         | 
| 27 | 
            +
                    GraphQL::Subscriptions::Serialize.load(value)
         | 
| 28 | 
            +
                  end
         | 
| 29 | 
            +
                end
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                def self.dump(obj)
         | 
| 32 | 
            +
                  if obj.is_a?(ExamplePayload) && obj.value == 4
         | 
| 33 | 
            +
                    "4x"
         | 
| 34 | 
            +
                  else
         | 
| 35 | 
            +
                    GraphQL::Subscriptions::Serialize.dump(obj)
         | 
| 36 | 
            +
                  end
         | 
| 37 | 
            +
                end
         | 
| 38 | 
            +
              end
         | 
| 39 | 
            +
             | 
| 20 40 | 
             
              GraphQLSchema = GraphQL::Schema.define do
         | 
| 21 41 | 
             
                query(QueryType)
         | 
| 22 42 | 
             
                subscription(SubscriptionType)
         | 
| 23 | 
            -
                use GraphQL::Subscriptions::ActionCableSubscriptions
         | 
| 43 | 
            +
                use GraphQL::Subscriptions::ActionCableSubscriptions,
         | 
| 44 | 
            +
                  serializer: CustomSerializer
         | 
| 24 45 | 
             
              end
         | 
| 25 46 |  | 
| 26 47 | 
             
              def subscribed
         | 
| @@ -358,3 +358,242 @@ GraphqlChannel#make_trigger({"id"=>"updates-2", "value"=>5}) | |
| 358 358 | 
             
            [ActionCable] Broadcasting to graphql-event::payload:id:updates-2: "{\"__gid__\":\"Z2lkOi8vZHVtbXkvR3JhcGhxbENoYW5uZWw6OkV4YW1wbGVQYXlsb2FkLzU\"}"
         | 
| 359 359 | 
             
            [ActionCable] Broadcasting to graphql-subscription:c2334c1a-d146-4b1c-90d9-9cb1c7b4046d: {:result=>{"data"=>{"payload"=>{"value"=>5}}}, :more=>true}
         | 
| 360 360 | 
             
            GraphqlChannel transmitting {"result"=>{"data"=>{"payload"=>{"value"=>5}}}, "more"=>true} (via streamed from graphql-subscription:c2334c1a-d146-4b1c-90d9-9cb1c7b4046d)
         | 
| 361 | 
            +
            Started GET "/" for 127.0.0.1 at 2017-11-16 21:27:24 -0500
         | 
| 362 | 
            +
            Processing by PagesController#show as HTML
         | 
| 363 | 
            +
              Rendering pages/show.html within layouts/application
         | 
| 364 | 
            +
              Rendered pages/show.html within layouts/application (0.8ms)
         | 
| 365 | 
            +
            Completed 200 OK in 173ms (Views: 171.5ms)
         | 
| 366 | 
            +
             | 
| 367 | 
            +
             | 
| 368 | 
            +
            Started GET "/assets/application-aca150c4b2db51d5326af18134f6281fbce7e823a372b0337cca65ff41b4a7ea.js" for 127.0.0.1 at 2017-11-16 21:27:24 -0500
         | 
| 369 | 
            +
            Started GET "/cable" for 127.0.0.1 at 2017-11-16 21:27:24 -0500
         | 
| 370 | 
            +
            Started GET "/cable/" [WebSocket] for 127.0.0.1 at 2017-11-16 21:27:24 -0500
         | 
| 371 | 
            +
            Successfully upgraded to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: Upgrade, HTTP_UPGRADE: websocket)
         | 
| 372 | 
            +
            GraphqlChannel is transmitting the subscription confirmation
         | 
| 373 | 
            +
            GraphqlChannel is transmitting the subscription confirmation
         | 
| 374 | 
            +
            GraphqlChannel#execute({"query"=>"subscription($id: ID!) { payload(id: $id) { value } }", "variables"=>{"id"=>"updates-2"}})
         | 
| 375 | 
            +
            GraphqlChannel transmitting {:result=>{"data"=>nil}, :more=>true}
         | 
| 376 | 
            +
            GraphqlChannel is streaming from graphql-subscription:34ad7c3f-9311-4982-b873-312032bbcd76
         | 
| 377 | 
            +
            GraphqlChannel#execute({"query"=>"subscription($id: ID!) { payload(id: $id) { value } }", "variables"=>{"id"=>"updates-1"}})
         | 
| 378 | 
            +
            GraphqlChannel transmitting {:result=>{"data"=>nil}, :more=>true}
         | 
| 379 | 
            +
            GraphqlChannel is streaming from graphql-event::payload:id:updates-2
         | 
| 380 | 
            +
            GraphqlChannel is streaming from graphql-subscription:73055d69-7575-4caa-88b7-74e1a1070c0d
         | 
| 381 | 
            +
            GraphqlChannel is streaming from graphql-event::payload:id:updates-1
         | 
| 382 | 
            +
            GraphqlChannel#make_trigger({"id"=>"updates-1", "value"=>1})
         | 
| 383 | 
            +
            Could not execute command from ({"command"=>"message", "identifier"=>"{\"channel\":\"GraphqlChannel\",\"id\":\"15fc7cd712b\"}", "data"=>"{\"id\":\"updates-1\",\"value\":1,\"action\":\"make_trigger\"}"}) [NoMethodError - undefined method `dump_value' for GraphqlChannel::CustomSerializer:Module]: /Users/rmosolgo/code/graphql-ruby/lib/graphql/subscriptions/serialize.rb:21:in `dump' | /Users/rmosolgo/code/graphql-ruby/spec/dummy/app/channels/graphql_channel.rb:36:in `dump' | /Users/rmosolgo/code/graphql-ruby/lib/graphql/subscriptions/action_cable_subscriptions.rb:78:in `execute_all' | /Users/rmosolgo/code/graphql-ruby/lib/graphql/subscriptions.rb:52:in `trigger' | /Users/rmosolgo/code/graphql-ruby/spec/dummy/app/channels/graphql_channel.rb:83:in `make_trigger'
         | 
| 384 | 
            +
            Started GET "/" for 127.0.0.1 at 2017-11-16 21:28:22 -0500
         | 
| 385 | 
            +
            Processing by PagesController#show as HTML
         | 
| 386 | 
            +
              Rendering pages/show.html within layouts/application
         | 
| 387 | 
            +
              Rendered pages/show.html within layouts/application (0.6ms)
         | 
| 388 | 
            +
            Completed 200 OK in 166ms (Views: 164.8ms)
         | 
| 389 | 
            +
             | 
| 390 | 
            +
             | 
| 391 | 
            +
            Started GET "/cable" for 127.0.0.1 at 2017-11-16 21:28:23 -0500
         | 
| 392 | 
            +
            Started GET "/cable/" [WebSocket] for 127.0.0.1 at 2017-11-16 21:28:23 -0500
         | 
| 393 | 
            +
            Successfully upgraded to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: Upgrade, HTTP_UPGRADE: websocket)
         | 
| 394 | 
            +
            GraphqlChannel is transmitting the subscription confirmation
         | 
| 395 | 
            +
            GraphqlChannel is transmitting the subscription confirmation
         | 
| 396 | 
            +
            GraphqlChannel#execute({"query"=>"subscription($id: ID!) { payload(id: $id) { value } }", "variables"=>{"id"=>"updates-2"}})
         | 
| 397 | 
            +
            GraphqlChannel transmitting {:result=>{"data"=>nil}, :more=>true}
         | 
| 398 | 
            +
            GraphqlChannel#execute({"query"=>"subscription($id: ID!) { payload(id: $id) { value } }", "variables"=>{"id"=>"updates-1"}})
         | 
| 399 | 
            +
            GraphqlChannel is streaming from graphql-subscription:dee02509-90a6-4ac1-8c1d-c765cb445ddd
         | 
| 400 | 
            +
            GraphqlChannel transmitting {:result=>{"data"=>nil}, :more=>true}
         | 
| 401 | 
            +
            GraphqlChannel is streaming from graphql-event::payload:id:updates-2
         | 
| 402 | 
            +
            GraphqlChannel is streaming from graphql-subscription:0f50c340-d3cd-4ab7-8e6a-055d23083185
         | 
| 403 | 
            +
            GraphqlChannel is streaming from graphql-event::payload:id:updates-1
         | 
| 404 | 
            +
            GraphqlChannel#make_trigger({"id"=>"updates-1", "value"=>1})
         | 
| 405 | 
            +
            Could not execute command from ({"command"=>"message", "identifier"=>"{\"channel\":\"GraphqlChannel\",\"id\":\"15fc7cf7d8b\"}", "data"=>"{\"id\":\"updates-1\",\"value\":1,\"action\":\"make_trigger\"}"}) [NameError - undefined local variable or method `value' for GraphqlChannel::CustomSerializer:Module]: /Users/rmosolgo/code/graphql-ruby/spec/dummy/app/channels/graphql_channel.rb:35:in `dump' | /Users/rmosolgo/code/graphql-ruby/lib/graphql/subscriptions/action_cable_subscriptions.rb:78:in `execute_all' | /Users/rmosolgo/code/graphql-ruby/lib/graphql/subscriptions.rb:52:in `trigger' | /Users/rmosolgo/code/graphql-ruby/spec/dummy/app/channels/graphql_channel.rb:82:in `make_trigger' | /Users/rmosolgo/.rbenv/versions/2.4.1/lib/ruby/gems/2.4.0/gems/actioncable-5.1.4/lib/action_cable/channel/base.rb:262:in `public_send'
         | 
| 406 | 
            +
            Started GET "/" for 127.0.0.1 at 2017-11-16 21:28:40 -0500
         | 
| 407 | 
            +
            Processing by PagesController#show as HTML
         | 
| 408 | 
            +
              Rendering pages/show.html within layouts/application
         | 
| 409 | 
            +
              Rendered pages/show.html within layouts/application (0.6ms)
         | 
| 410 | 
            +
            Completed 200 OK in 11ms (Views: 8.8ms)
         | 
| 411 | 
            +
             | 
| 412 | 
            +
             | 
| 413 | 
            +
            Started GET "/cable" for 127.0.0.1 at 2017-11-16 21:28:40 -0500
         | 
| 414 | 
            +
            Started GET "/cable/" [WebSocket] for 127.0.0.1 at 2017-11-16 21:28:40 -0500
         | 
| 415 | 
            +
            Successfully upgraded to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: Upgrade, HTTP_UPGRADE: websocket)
         | 
| 416 | 
            +
            GraphqlChannel is transmitting the subscription confirmation
         | 
| 417 | 
            +
            GraphqlChannel is transmitting the subscription confirmation
         | 
| 418 | 
            +
            GraphqlChannel#execute({"query"=>"subscription($id: ID!) { payload(id: $id) { value } }", "variables"=>{"id"=>"updates-2"}})
         | 
| 419 | 
            +
            GraphqlChannel transmitting {:result=>{"data"=>nil}, :more=>true}
         | 
| 420 | 
            +
            GraphqlChannel is streaming from graphql-subscription:528198ff-21c1-4051-a319-1feb9060f335
         | 
| 421 | 
            +
            GraphqlChannel is streaming from graphql-event::payload:id:updates-2
         | 
| 422 | 
            +
            GraphqlChannel#execute({"query"=>"subscription($id: ID!) { payload(id: $id) { value } }", "variables"=>{"id"=>"updates-1"}})
         | 
| 423 | 
            +
            GraphqlChannel transmitting {:result=>{"data"=>nil}, :more=>true}
         | 
| 424 | 
            +
            GraphqlChannel is streaming from graphql-event::payload:id:updates-1
         | 
| 425 | 
            +
            GraphqlChannel is streaming from graphql-subscription:dba8445d-3284-4734-90f6-fdf8f0707a50
         | 
| 426 | 
            +
            GraphqlChannel#make_trigger({"id"=>"updates-1", "value"=>1})
         | 
| 427 | 
            +
            [ActionCable] Broadcasting to graphql-event::payload:id:updates-1: "{\"__gid__\":\"Z2lkOi8vZHVtbXkvR3JhcGhxbENoYW5uZWw6OkV4YW1wbGVQYXlsb2FkLzE\"}"
         | 
| 428 | 
            +
            [ActionCable] Broadcasting to graphql-subscription:dba8445d-3284-4734-90f6-fdf8f0707a50: {:result=>{"data"=>{"payload"=>{"value"=>1}}}, :more=>true}
         | 
| 429 | 
            +
            GraphqlChannel transmitting {"result"=>{"data"=>{"payload"=>{"value"=>1}}}, "more"=>true} (via streamed from graphql-subscription:dba8445d-3284-4734-90f6-fdf8f0707a50)
         | 
| 430 | 
            +
            GraphqlChannel#make_trigger({"id"=>"updates-1", "value"=>2})
         | 
| 431 | 
            +
            [ActionCable] Broadcasting to graphql-event::payload:id:updates-1: "{\"__gid__\":\"Z2lkOi8vZHVtbXkvR3JhcGhxbENoYW5uZWw6OkV4YW1wbGVQYXlsb2FkLzI\"}"
         | 
| 432 | 
            +
            [ActionCable] Broadcasting to graphql-subscription:dba8445d-3284-4734-90f6-fdf8f0707a50: {:result=>{"data"=>{"payload"=>{"value"=>2}}}, :more=>true}
         | 
| 433 | 
            +
            GraphqlChannel transmitting {"result"=>{"data"=>{"payload"=>{"value"=>2}}}, "more"=>true} (via streamed from graphql-subscription:dba8445d-3284-4734-90f6-fdf8f0707a50)
         | 
| 434 | 
            +
            GraphqlChannel#make_trigger({"id"=>"updates-1", "value"=>3})
         | 
| 435 | 
            +
            [ActionCable] Broadcasting to graphql-event::payload:id:updates-1: "{\"__gid__\":\"Z2lkOi8vZHVtbXkvR3JhcGhxbENoYW5uZWw6OkV4YW1wbGVQYXlsb2FkLzM\"}"
         | 
| 436 | 
            +
            [ActionCable] Broadcasting to graphql-subscription:dba8445d-3284-4734-90f6-fdf8f0707a50: {:result=>{"data"=>{"payload"=>{"value"=>3}}}, :more=>true}
         | 
| 437 | 
            +
            GraphqlChannel transmitting {"result"=>{"data"=>{"payload"=>{"value"=>3}}}, "more"=>true} (via streamed from graphql-subscription:dba8445d-3284-4734-90f6-fdf8f0707a50)
         | 
| 438 | 
            +
            GraphqlChannel#make_trigger({"id"=>"updates-1", "value"=>4})
         | 
| 439 | 
            +
            [ActionCable] Broadcasting to graphql-event::payload:id:updates-1: "4x"
         | 
| 440 | 
            +
            [ActionCable] Broadcasting to graphql-subscription:dba8445d-3284-4734-90f6-fdf8f0707a50: {:result=>{"data"=>{"payload"=>{"value"=>4}}}, :more=>true}
         | 
| 441 | 
            +
            GraphqlChannel transmitting {"result"=>{"data"=>{"payload"=>{"value"=>4}}}, "more"=>true} (via streamed from graphql-subscription:dba8445d-3284-4734-90f6-fdf8f0707a50)
         | 
| 442 | 
            +
            GraphqlChannel#make_trigger({"id"=>"updates-1", "value"=>5})
         | 
| 443 | 
            +
            [ActionCable] Broadcasting to graphql-event::payload:id:updates-1: "{\"__gid__\":\"Z2lkOi8vZHVtbXkvR3JhcGhxbENoYW5uZWw6OkV4YW1wbGVQYXlsb2FkLzU\"}"
         | 
| 444 | 
            +
            [ActionCable] Broadcasting to graphql-subscription:dba8445d-3284-4734-90f6-fdf8f0707a50: {:result=>{"data"=>{"payload"=>{"value"=>5}}}, :more=>true}
         | 
| 445 | 
            +
            GraphqlChannel transmitting {"result"=>{"data"=>{"payload"=>{"value"=>5}}}, "more"=>true} (via streamed from graphql-subscription:dba8445d-3284-4734-90f6-fdf8f0707a50)
         | 
| 446 | 
            +
            Started GET "/" for 127.0.0.1 at 2017-11-16 21:29:15 -0500
         | 
| 447 | 
            +
            Processing by PagesController#show as HTML
         | 
| 448 | 
            +
              Rendering pages/show.html within layouts/application
         | 
| 449 | 
            +
              Rendered pages/show.html within layouts/application (0.8ms)
         | 
| 450 | 
            +
            Completed 200 OK in 178ms (Views: 176.8ms)
         | 
| 451 | 
            +
             | 
| 452 | 
            +
             | 
| 453 | 
            +
            Started GET "/cable" for 127.0.0.1 at 2017-11-16 21:29:15 -0500
         | 
| 454 | 
            +
            Started GET "/cable/" [WebSocket] for 127.0.0.1 at 2017-11-16 21:29:15 -0500
         | 
| 455 | 
            +
            Successfully upgraded to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: Upgrade, HTTP_UPGRADE: websocket)
         | 
| 456 | 
            +
            GraphqlChannel is transmitting the subscription confirmation
         | 
| 457 | 
            +
            GraphqlChannel is transmitting the subscription confirmation
         | 
| 458 | 
            +
            GraphqlChannel#execute({"query"=>"subscription($id: ID!) { payload(id: $id) { value } }", "variables"=>{"id"=>"updates-1"}})
         | 
| 459 | 
            +
            GraphqlChannel transmitting {:result=>{"data"=>nil}, :more=>true}
         | 
| 460 | 
            +
            GraphqlChannel#execute({"query"=>"subscription($id: ID!) { payload(id: $id) { value } }", "variables"=>{"id"=>"updates-2"}})
         | 
| 461 | 
            +
            GraphqlChannel is streaming from graphql-event::payload:id:updates-1
         | 
| 462 | 
            +
            GraphqlChannel transmitting {:result=>{"data"=>nil}, :more=>true}
         | 
| 463 | 
            +
            GraphqlChannel is streaming from graphql-subscription:ac17fc47-fdf3-4951-813b-f4d04fdc7847
         | 
| 464 | 
            +
            GraphqlChannel is streaming from graphql-event::payload:id:updates-2
         | 
| 465 | 
            +
            GraphqlChannel is streaming from graphql-subscription:8642d019-1a8c-4eb9-ada2-7a5b1ccffeee
         | 
| 466 | 
            +
            GraphqlChannel#make_trigger({"id"=>"updates-1", "value"=>1})
         | 
| 467 | 
            +
            [ActionCable] Broadcasting to graphql-event::payload:id:updates-1: "{\"__gid__\":\"Z2lkOi8vZHVtbXkvR3JhcGhxbENoYW5uZWw6OkV4YW1wbGVQYXlsb2FkLzE\"}"
         | 
| 468 | 
            +
            [ActionCable] Broadcasting to graphql-subscription:ac17fc47-fdf3-4951-813b-f4d04fdc7847: {:result=>{"data"=>{"payload"=>{"value"=>1}}}, :more=>true}
         | 
| 469 | 
            +
            GraphqlChannel transmitting {"result"=>{"data"=>{"payload"=>{"value"=>1}}}, "more"=>true} (via streamed from graphql-subscription:ac17fc47-fdf3-4951-813b-f4d04fdc7847)
         | 
| 470 | 
            +
            GraphqlChannel#make_trigger({"id"=>"updates-1", "value"=>2})
         | 
| 471 | 
            +
            [ActionCable] Broadcasting to graphql-event::payload:id:updates-1: "{\"__gid__\":\"Z2lkOi8vZHVtbXkvR3JhcGhxbENoYW5uZWw6OkV4YW1wbGVQYXlsb2FkLzI\"}"
         | 
| 472 | 
            +
            [ActionCable] Broadcasting to graphql-subscription:ac17fc47-fdf3-4951-813b-f4d04fdc7847: {:result=>{"data"=>{"payload"=>{"value"=>2}}}, :more=>true}
         | 
| 473 | 
            +
            GraphqlChannel transmitting {"result"=>{"data"=>{"payload"=>{"value"=>2}}}, "more"=>true} (via streamed from graphql-subscription:ac17fc47-fdf3-4951-813b-f4d04fdc7847)
         | 
| 474 | 
            +
            GraphqlChannel#make_trigger({"id"=>"updates-1", "value"=>3})
         | 
| 475 | 
            +
            [ActionCable] Broadcasting to graphql-event::payload:id:updates-1: "{\"__gid__\":\"Z2lkOi8vZHVtbXkvR3JhcGhxbENoYW5uZWw6OkV4YW1wbGVQYXlsb2FkLzM\"}"
         | 
| 476 | 
            +
            [ActionCable] Broadcasting to graphql-subscription:ac17fc47-fdf3-4951-813b-f4d04fdc7847: {:result=>{"data"=>{"payload"=>{"value"=>3}}}, :more=>true}
         | 
| 477 | 
            +
            GraphqlChannel transmitting {"result"=>{"data"=>{"payload"=>{"value"=>3}}}, "more"=>true} (via streamed from graphql-subscription:ac17fc47-fdf3-4951-813b-f4d04fdc7847)
         | 
| 478 | 
            +
            GraphqlChannel#make_trigger({"id"=>"updates-1", "value"=>4})
         | 
| 479 | 
            +
            [ActionCable] Broadcasting to graphql-event::payload:id:updates-1: "4x"
         | 
| 480 | 
            +
            [ActionCable] Broadcasting to graphql-subscription:ac17fc47-fdf3-4951-813b-f4d04fdc7847: {:result=>{"data"=>{"payload"=>{"value"=>4}}}, :more=>true}
         | 
| 481 | 
            +
            GraphqlChannel transmitting {"result"=>{"data"=>{"payload"=>{"value"=>4}}}, "more"=>true} (via streamed from graphql-subscription:ac17fc47-fdf3-4951-813b-f4d04fdc7847)
         | 
| 482 | 
            +
            GraphqlChannel#make_trigger({"id"=>"updates-1", "value"=>5})
         | 
| 483 | 
            +
            [ActionCable] Broadcasting to graphql-event::payload:id:updates-1: "{\"__gid__\":\"Z2lkOi8vZHVtbXkvR3JhcGhxbENoYW5uZWw6OkV4YW1wbGVQYXlsb2FkLzU\"}"
         | 
| 484 | 
            +
            [ActionCable] Broadcasting to graphql-subscription:ac17fc47-fdf3-4951-813b-f4d04fdc7847: {:result=>{"data"=>{"payload"=>{"value"=>5}}}, :more=>true}
         | 
| 485 | 
            +
            GraphqlChannel transmitting {"result"=>{"data"=>{"payload"=>{"value"=>5}}}, "more"=>true} (via streamed from graphql-subscription:ac17fc47-fdf3-4951-813b-f4d04fdc7847)
         | 
| 486 | 
            +
            GraphqlChannel#make_trigger({"id"=>"updates-1", "value"=>6})
         | 
| 487 | 
            +
            [ActionCable] Broadcasting to graphql-event::payload:id:updates-1: "{\"__gid__\":\"Z2lkOi8vZHVtbXkvR3JhcGhxbENoYW5uZWw6OkV4YW1wbGVQYXlsb2FkLzY\"}"
         | 
| 488 | 
            +
            [ActionCable] Broadcasting to graphql-subscription:ac17fc47-fdf3-4951-813b-f4d04fdc7847: {:result=>{"data"=>{"payload"=>{"value"=>6}}}, :more=>true}
         | 
| 489 | 
            +
            GraphqlChannel transmitting {"result"=>{"data"=>{"payload"=>{"value"=>6}}}, "more"=>true} (via streamed from graphql-subscription:ac17fc47-fdf3-4951-813b-f4d04fdc7847)
         | 
| 490 | 
            +
            GraphqlChannel#make_trigger({"id"=>"updates-2", "value"=>1})
         | 
| 491 | 
            +
            [ActionCable] Broadcasting to graphql-event::payload:id:updates-2: "{\"__gid__\":\"Z2lkOi8vZHVtbXkvR3JhcGhxbENoYW5uZWw6OkV4YW1wbGVQYXlsb2FkLzE\"}"
         | 
| 492 | 
            +
            [ActionCable] Broadcasting to graphql-subscription:8642d019-1a8c-4eb9-ada2-7a5b1ccffeee: {:result=>{"data"=>{"payload"=>{"value"=>1}}}, :more=>true}
         | 
| 493 | 
            +
            GraphqlChannel transmitting {"result"=>{"data"=>{"payload"=>{"value"=>1}}}, "more"=>true} (via streamed from graphql-subscription:8642d019-1a8c-4eb9-ada2-7a5b1ccffeee)
         | 
| 494 | 
            +
            GraphqlChannel#make_trigger({"id"=>"updates-2", "value"=>2})
         | 
| 495 | 
            +
            [ActionCable] Broadcasting to graphql-event::payload:id:updates-2: "{\"__gid__\":\"Z2lkOi8vZHVtbXkvR3JhcGhxbENoYW5uZWw6OkV4YW1wbGVQYXlsb2FkLzI\"}"
         | 
| 496 | 
            +
            [ActionCable] Broadcasting to graphql-subscription:8642d019-1a8c-4eb9-ada2-7a5b1ccffeee: {:result=>{"data"=>{"payload"=>{"value"=>2}}}, :more=>true}
         | 
| 497 | 
            +
            GraphqlChannel transmitting {"result"=>{"data"=>{"payload"=>{"value"=>2}}}, "more"=>true} (via streamed from graphql-subscription:8642d019-1a8c-4eb9-ada2-7a5b1ccffeee)
         | 
| 498 | 
            +
            GraphqlChannel#make_trigger({"id"=>"updates-2", "value"=>3})
         | 
| 499 | 
            +
            [ActionCable] Broadcasting to graphql-event::payload:id:updates-2: "{\"__gid__\":\"Z2lkOi8vZHVtbXkvR3JhcGhxbENoYW5uZWw6OkV4YW1wbGVQYXlsb2FkLzM\"}"
         | 
| 500 | 
            +
            [ActionCable] Broadcasting to graphql-subscription:8642d019-1a8c-4eb9-ada2-7a5b1ccffeee: {:result=>{"data"=>{"payload"=>{"value"=>3}}}, :more=>true}
         | 
| 501 | 
            +
            GraphqlChannel transmitting {"result"=>{"data"=>{"payload"=>{"value"=>3}}}, "more"=>true} (via streamed from graphql-subscription:8642d019-1a8c-4eb9-ada2-7a5b1ccffeee)
         | 
| 502 | 
            +
            GraphqlChannel#make_trigger({"id"=>"updates-2", "value"=>4})
         | 
| 503 | 
            +
            [ActionCable] Broadcasting to graphql-event::payload:id:updates-2: "4x"
         | 
| 504 | 
            +
            [ActionCable] Broadcasting to graphql-subscription:8642d019-1a8c-4eb9-ada2-7a5b1ccffeee: {:result=>{"data"=>{"payload"=>{"value"=>4}}}, :more=>true}
         | 
| 505 | 
            +
            GraphqlChannel transmitting {"result"=>{"data"=>{"payload"=>{"value"=>4}}}, "more"=>true} (via streamed from graphql-subscription:8642d019-1a8c-4eb9-ada2-7a5b1ccffeee)
         | 
| 506 | 
            +
            Started GET "/" for 127.0.0.1 at 2017-11-16 21:30:10 -0500
         | 
| 507 | 
            +
            Processing by PagesController#show as HTML
         | 
| 508 | 
            +
              Rendering pages/show.html within layouts/application
         | 
| 509 | 
            +
              Rendered pages/show.html within layouts/application (0.7ms)
         | 
| 510 | 
            +
            Completed 200 OK in 12ms (Views: 10.1ms)
         | 
| 511 | 
            +
             | 
| 512 | 
            +
             | 
| 513 | 
            +
            Started GET "/cable" for 127.0.0.1 at 2017-11-16 21:30:10 -0500
         | 
| 514 | 
            +
            Started GET "/cable/" [WebSocket] for 127.0.0.1 at 2017-11-16 21:30:10 -0500
         | 
| 515 | 
            +
            Successfully upgraded to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: Upgrade, HTTP_UPGRADE: websocket)
         | 
| 516 | 
            +
            GraphqlChannel is transmitting the subscription confirmation
         | 
| 517 | 
            +
            GraphqlChannel is transmitting the subscription confirmation
         | 
| 518 | 
            +
            GraphqlChannel#execute({"query"=>"subscription($id: ID!) { payload(id: $id) { value } }", "variables"=>{"id"=>"updates-2"}})
         | 
| 519 | 
            +
            GraphqlChannel transmitting {:result=>{"data"=>nil}, :more=>true}
         | 
| 520 | 
            +
            GraphqlChannel#execute({"query"=>"subscription($id: ID!) { payload(id: $id) { value } }", "variables"=>{"id"=>"updates-1"}})
         | 
| 521 | 
            +
            GraphqlChannel transmitting {:result=>{"data"=>nil}, :more=>true}
         | 
| 522 | 
            +
            GraphqlChannel is streaming from graphql-subscription:e33017bd-68e0-4443-81b9-cb2b750d345e
         | 
| 523 | 
            +
            GraphqlChannel is streaming from graphql-event::payload:id:updates-2
         | 
| 524 | 
            +
            GraphqlChannel is streaming from graphql-subscription:ff9f5a68-c71c-4b5c-8135-cb902840a584
         | 
| 525 | 
            +
            GraphqlChannel is streaming from graphql-event::payload:id:updates-1
         | 
| 526 | 
            +
            GraphqlChannel#make_trigger({"id"=>"updates-1", "value"=>1})
         | 
| 527 | 
            +
            dumping: #<GraphqlChannel::ExamplePayload:0x007fc09dee35f8>
         | 
| 528 | 
            +
            [ActionCable] Broadcasting to graphql-event::payload:id:updates-1: "{\"__gid__\":\"Z2lkOi8vZHVtbXkvR3JhcGhxbENoYW5uZWw6OkV4YW1wbGVQYXlsb2FkLzE\"}"
         | 
| 529 | 
            +
            Loading: "{\"__gid__\":\"Z2lkOi8vZHVtbXkvR3JhcGhxbENoYW5uZWw6OkV4YW1wbGVQYXlsb2FkLzE\"}"
         | 
| 530 | 
            +
            [ActionCable] Broadcasting to graphql-subscription:ff9f5a68-c71c-4b5c-8135-cb902840a584: {:result=>{"data"=>{"payload"=>{"value"=>1}}}, :more=>true}
         | 
| 531 | 
            +
            GraphqlChannel transmitting {"result"=>{"data"=>{"payload"=>{"value"=>1}}}, "more"=>true} (via streamed from graphql-subscription:ff9f5a68-c71c-4b5c-8135-cb902840a584)
         | 
| 532 | 
            +
            GraphqlChannel#make_trigger({"id"=>"updates-1", "value"=>2})
         | 
| 533 | 
            +
            dumping: #<GraphqlChannel::ExamplePayload:0x007fc09deb3330>
         | 
| 534 | 
            +
            [ActionCable] Broadcasting to graphql-event::payload:id:updates-1: "{\"__gid__\":\"Z2lkOi8vZHVtbXkvR3JhcGhxbENoYW5uZWw6OkV4YW1wbGVQYXlsb2FkLzI\"}"
         | 
| 535 | 
            +
            Loading: "{\"__gid__\":\"Z2lkOi8vZHVtbXkvR3JhcGhxbENoYW5uZWw6OkV4YW1wbGVQYXlsb2FkLzI\"}"
         | 
| 536 | 
            +
            [ActionCable] Broadcasting to graphql-subscription:ff9f5a68-c71c-4b5c-8135-cb902840a584: {:result=>{"data"=>{"payload"=>{"value"=>2}}}, :more=>true}
         | 
| 537 | 
            +
            GraphqlChannel transmitting {"result"=>{"data"=>{"payload"=>{"value"=>2}}}, "more"=>true} (via streamed from graphql-subscription:ff9f5a68-c71c-4b5c-8135-cb902840a584)
         | 
| 538 | 
            +
            GraphqlChannel#make_trigger({"id"=>"updates-1", "value"=>3})
         | 
| 539 | 
            +
            dumping: #<GraphqlChannel::ExamplePayload:0x007fc09de7b020>
         | 
| 540 | 
            +
            [ActionCable] Broadcasting to graphql-event::payload:id:updates-1: "{\"__gid__\":\"Z2lkOi8vZHVtbXkvR3JhcGhxbENoYW5uZWw6OkV4YW1wbGVQYXlsb2FkLzM\"}"
         | 
| 541 | 
            +
            Loading: "{\"__gid__\":\"Z2lkOi8vZHVtbXkvR3JhcGhxbENoYW5uZWw6OkV4YW1wbGVQYXlsb2FkLzM\"}"
         | 
| 542 | 
            +
            [ActionCable] Broadcasting to graphql-subscription:ff9f5a68-c71c-4b5c-8135-cb902840a584: {:result=>{"data"=>{"payload"=>{"value"=>3}}}, :more=>true}
         | 
| 543 | 
            +
            GraphqlChannel transmitting {"result"=>{"data"=>{"payload"=>{"value"=>3}}}, "more"=>true} (via streamed from graphql-subscription:ff9f5a68-c71c-4b5c-8135-cb902840a584)
         | 
| 544 | 
            +
            GraphqlChannel#make_trigger({"id"=>"updates-1", "value"=>4})
         | 
| 545 | 
            +
            dumping: #<GraphqlChannel::ExamplePayload:0x007fc09de41f78>
         | 
| 546 | 
            +
            [ActionCable] Broadcasting to graphql-event::payload:id:updates-1: "4x"
         | 
| 547 | 
            +
            Loading: "4x"
         | 
| 548 | 
            +
            [ActionCable] Broadcasting to graphql-subscription:ff9f5a68-c71c-4b5c-8135-cb902840a584: {:result=>{"data"=>{"payload"=>{"value"=>4}}}, :more=>true}
         | 
| 549 | 
            +
            GraphqlChannel transmitting {"result"=>{"data"=>{"payload"=>{"value"=>4}}}, "more"=>true} (via streamed from graphql-subscription:ff9f5a68-c71c-4b5c-8135-cb902840a584)
         | 
| 550 | 
            +
            Started GET "/" for 127.0.0.1 at 2017-11-16 21:30:26 -0500
         | 
| 551 | 
            +
            Processing by PagesController#show as HTML
         | 
| 552 | 
            +
              Rendering pages/show.html within layouts/application
         | 
| 553 | 
            +
              Rendered pages/show.html within layouts/application (0.3ms)
         | 
| 554 | 
            +
            Completed 200 OK in 7ms (Views: 5.4ms)
         | 
| 555 | 
            +
             | 
| 556 | 
            +
             | 
| 557 | 
            +
            Started GET "/cable" for 127.0.0.1 at 2017-11-16 21:30:27 -0500
         | 
| 558 | 
            +
            Started GET "/cable/" [WebSocket] for 127.0.0.1 at 2017-11-16 21:30:27 -0500
         | 
| 559 | 
            +
            Successfully upgraded to WebSocket (REQUEST_METHOD: GET, HTTP_CONNECTION: Upgrade, HTTP_UPGRADE: websocket)
         | 
| 560 | 
            +
            GraphqlChannel is transmitting the subscription confirmation
         | 
| 561 | 
            +
            GraphqlChannel is transmitting the subscription confirmation
         | 
| 562 | 
            +
            GraphqlChannel#execute({"query"=>"subscription($id: ID!) { payload(id: $id) { value } }", "variables"=>{"id"=>"updates-2"}})
         | 
| 563 | 
            +
            GraphqlChannel transmitting {:result=>{"data"=>nil}, :more=>true}
         | 
| 564 | 
            +
            GraphqlChannel#execute({"query"=>"subscription($id: ID!) { payload(id: $id) { value } }", "variables"=>{"id"=>"updates-1"}})
         | 
| 565 | 
            +
            GraphqlChannel is streaming from graphql-event::payload:id:updates-2
         | 
| 566 | 
            +
            GraphqlChannel transmitting {:result=>{"data"=>nil}, :more=>true}
         | 
| 567 | 
            +
            GraphqlChannel is streaming from graphql-subscription:ba2e384c-cbcf-4f9f-aa5e-8f666effd2a8
         | 
| 568 | 
            +
            GraphqlChannel is streaming from graphql-subscription:18c8f852-04c7-4bb8-b6f7-ecc64a2a8ac9
         | 
| 569 | 
            +
            GraphqlChannel is streaming from graphql-event::payload:id:updates-1
         | 
| 570 | 
            +
            GraphqlChannel#make_trigger({"id"=>"updates-1", "value"=>1})
         | 
| 571 | 
            +
            dumping: #<GraphqlChannel::ExamplePayload:0x007fc09e9fc660>
         | 
| 572 | 
            +
            [ActionCable] Broadcasting to graphql-event::payload:id:updates-1: "{\"__gid__\":\"Z2lkOi8vZHVtbXkvR3JhcGhxbENoYW5uZWw6OkV4YW1wbGVQYXlsb2FkLzE\"}"
         | 
| 573 | 
            +
            Loading: "{\"__gid__\":\"Z2lkOi8vZHVtbXkvR3JhcGhxbENoYW5uZWw6OkV4YW1wbGVQYXlsb2FkLzE\"}"
         | 
| 574 | 
            +
            [ActionCable] Broadcasting to graphql-subscription:18c8f852-04c7-4bb8-b6f7-ecc64a2a8ac9: {:result=>{"data"=>{"payload"=>{"value"=>1}}}, :more=>true}
         | 
| 575 | 
            +
            GraphqlChannel transmitting {"result"=>{"data"=>{"payload"=>{"value"=>1}}}, "more"=>true} (via streamed from graphql-subscription:18c8f852-04c7-4bb8-b6f7-ecc64a2a8ac9)
         | 
| 576 | 
            +
            GraphqlChannel#make_trigger({"id"=>"updates-1", "value"=>2})
         | 
| 577 | 
            +
            dumping: #<GraphqlChannel::ExamplePayload:0x007fc09dced938>
         | 
| 578 | 
            +
            [ActionCable] Broadcasting to graphql-event::payload:id:updates-1: "{\"__gid__\":\"Z2lkOi8vZHVtbXkvR3JhcGhxbENoYW5uZWw6OkV4YW1wbGVQYXlsb2FkLzI\"}"
         | 
| 579 | 
            +
            Loading: "{\"__gid__\":\"Z2lkOi8vZHVtbXkvR3JhcGhxbENoYW5uZWw6OkV4YW1wbGVQYXlsb2FkLzI\"}"
         | 
| 580 | 
            +
            [ActionCable] Broadcasting to graphql-subscription:18c8f852-04c7-4bb8-b6f7-ecc64a2a8ac9: {:result=>{"data"=>{"payload"=>{"value"=>2}}}, :more=>true}
         | 
| 581 | 
            +
            GraphqlChannel transmitting {"result"=>{"data"=>{"payload"=>{"value"=>2}}}, "more"=>true} (via streamed from graphql-subscription:18c8f852-04c7-4bb8-b6f7-ecc64a2a8ac9)
         | 
| 582 | 
            +
            GraphqlChannel#make_trigger({"id"=>"updates-1", "value"=>3})
         | 
| 583 | 
            +
            dumping: #<GraphqlChannel::ExamplePayload:0x007fc09e8c41d0>
         | 
| 584 | 
            +
            [ActionCable] Broadcasting to graphql-event::payload:id:updates-1: "{\"__gid__\":\"Z2lkOi8vZHVtbXkvR3JhcGhxbENoYW5uZWw6OkV4YW1wbGVQYXlsb2FkLzM\"}"
         | 
| 585 | 
            +
            Loading: "{\"__gid__\":\"Z2lkOi8vZHVtbXkvR3JhcGhxbENoYW5uZWw6OkV4YW1wbGVQYXlsb2FkLzM\"}"
         | 
| 586 | 
            +
            [ActionCable] Broadcasting to graphql-subscription:18c8f852-04c7-4bb8-b6f7-ecc64a2a8ac9: {:result=>{"data"=>{"payload"=>{"value"=>3}}}, :more=>true}
         | 
| 587 | 
            +
            GraphqlChannel transmitting {"result"=>{"data"=>{"payload"=>{"value"=>3}}}, "more"=>true} (via streamed from graphql-subscription:18c8f852-04c7-4bb8-b6f7-ecc64a2a8ac9)
         | 
| 588 | 
            +
            GraphqlChannel#make_trigger({"id"=>"updates-1", "value"=>4})
         | 
| 589 | 
            +
            dumping: #<GraphqlChannel::ExamplePayload:0x007fc09d407ad0>
         | 
| 590 | 
            +
            [ActionCable] Broadcasting to graphql-event::payload:id:updates-1: "4x"
         | 
| 591 | 
            +
            Loading: "4x"
         | 
| 592 | 
            +
            [ActionCable] Broadcasting to graphql-subscription:18c8f852-04c7-4bb8-b6f7-ecc64a2a8ac9: {:result=>{"data"=>{"payload"=>{"value"=>400}}}, :more=>true}
         | 
| 593 | 
            +
            GraphqlChannel transmitting {"result"=>{"data"=>{"payload"=>{"value"=>400}}}, "more"=>true} (via streamed from graphql-subscription:18c8f852-04c7-4bb8-b6f7-ecc64a2a8ac9)
         | 
| 594 | 
            +
            GraphqlChannel#make_trigger({"id"=>"updates-1", "value"=>5})
         | 
| 595 | 
            +
            dumping: #<GraphqlChannel::ExamplePayload:0x007fc09dbbf250>
         | 
| 596 | 
            +
            [ActionCable] Broadcasting to graphql-event::payload:id:updates-1: "{\"__gid__\":\"Z2lkOi8vZHVtbXkvR3JhcGhxbENoYW5uZWw6OkV4YW1wbGVQYXlsb2FkLzU\"}"
         | 
| 597 | 
            +
            Loading: "{\"__gid__\":\"Z2lkOi8vZHVtbXkvR3JhcGhxbENoYW5uZWw6OkV4YW1wbGVQYXlsb2FkLzU\"}"
         | 
| 598 | 
            +
            [ActionCable] Broadcasting to graphql-subscription:18c8f852-04c7-4bb8-b6f7-ecc64a2a8ac9: {:result=>{"data"=>{"payload"=>{"value"=>5}}}, :more=>true}
         | 
| 599 | 
            +
            GraphqlChannel transmitting {"result"=>{"data"=>{"payload"=>{"value"=>5}}}, "more"=>true} (via streamed from graphql-subscription:18c8f852-04c7-4bb8-b6f7-ecc64a2a8ac9)
         |