graphql 1.7.14 → 1.8.0.pre1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +5 -5
- 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 +1 -6
- data/lib/generators/graphql/templates/function.erb +2 -2
- data/lib/generators/graphql/templates/loader.erb +2 -2
- data/lib/graphql.rb +2 -0
- data/lib/graphql/argument.rb +0 -1
- data/lib/graphql/backwards_compatibility.rb +2 -3
- data/lib/graphql/base_type.rb +18 -16
- data/lib/graphql/compatibility/query_parser_specification.rb +0 -117
- data/lib/graphql/compatibility/query_parser_specification/parse_error_specification.rb +0 -14
- data/lib/graphql/define/assign_object_field.rb +5 -12
- data/lib/graphql/deprecated_dsl.rb +28 -0
- data/lib/graphql/directive.rb +0 -1
- data/lib/graphql/enum_type.rb +1 -3
- data/lib/graphql/execution.rb +0 -1
- data/lib/graphql/execution/multiplex.rb +29 -12
- data/lib/graphql/field.rb +5 -20
- data/lib/graphql/function.rb +12 -0
- data/lib/graphql/input_object_type.rb +1 -3
- data/lib/graphql/internal_representation/node.rb +14 -26
- data/lib/graphql/internal_representation/visit.rb +6 -3
- data/lib/graphql/introspection/arguments_field.rb +0 -1
- data/lib/graphql/introspection/enum_values_field.rb +0 -1
- data/lib/graphql/introspection/fields_field.rb +0 -1
- data/lib/graphql/introspection/input_fields_field.rb +0 -1
- data/lib/graphql/introspection/interfaces_field.rb +0 -1
- data/lib/graphql/introspection/of_type_field.rb +0 -1
- data/lib/graphql/introspection/possible_types_field.rb +0 -1
- data/lib/graphql/introspection/schema_field.rb +0 -1
- data/lib/graphql/introspection/type_by_name_field.rb +0 -1
- data/lib/graphql/introspection/typename_field.rb +0 -1
- data/lib/graphql/language.rb +0 -3
- data/lib/graphql/language/generation.rb +182 -3
- data/lib/graphql/language/lexer.rb +69 -144
- data/lib/graphql/language/lexer.rl +4 -15
- data/lib/graphql/language/nodes.rb +76 -136
- data/lib/graphql/language/parser.rb +621 -668
- data/lib/graphql/language/parser.y +11 -17
- data/lib/graphql/language/token.rb +3 -10
- data/lib/graphql/object_type.rb +6 -1
- data/lib/graphql/query.rb +13 -8
- data/lib/graphql/query/arguments.rb +33 -48
- data/lib/graphql/query/context.rb +1 -0
- data/lib/graphql/query/literal_input.rb +1 -4
- data/lib/graphql/relay/connection_resolve.rb +3 -0
- data/lib/graphql/relay/global_id_resolve.rb +5 -1
- data/lib/graphql/relay/relation_connection.rb +19 -14
- data/lib/graphql/schema.rb +219 -12
- data/lib/graphql/schema/argument.rb +33 -0
- data/lib/graphql/schema/build_from_definition.rb +18 -64
- data/lib/graphql/schema/enum.rb +76 -0
- data/lib/graphql/schema/field.rb +127 -0
- data/lib/graphql/schema/field/dynamic_resolve.rb +63 -0
- data/lib/graphql/schema/field/unwrapped_resolve.rb +20 -0
- data/lib/graphql/schema/input_object.rb +61 -0
- data/lib/graphql/schema/interface.rb +32 -0
- data/lib/graphql/schema/loader.rb +2 -2
- data/lib/graphql/schema/member.rb +97 -0
- data/lib/graphql/schema/member/build_type.rb +106 -0
- data/lib/graphql/schema/member/has_fields.rb +56 -0
- data/lib/graphql/schema/member/instrumentation.rb +113 -0
- data/lib/graphql/schema/member/list_type_proxy.rb +21 -0
- data/lib/graphql/schema/member/non_null_type_proxy.rb +21 -0
- data/lib/graphql/schema/object.rb +65 -0
- data/lib/graphql/schema/printer.rb +266 -33
- data/lib/graphql/schema/scalar.rb +25 -0
- data/lib/graphql/schema/traversal.rb +26 -17
- data/lib/graphql/schema/union.rb +48 -0
- data/lib/graphql/static_validation/rules/fields_have_appropriate_selections.rb +1 -5
- data/lib/graphql/static_validation/rules/fields_will_merge.rb +8 -15
- data/lib/graphql/static_validation/rules/variables_are_used_and_defined.rb +1 -11
- data/lib/graphql/subscriptions/action_cable_subscriptions.rb +5 -7
- data/lib/graphql/tracing.rb +0 -1
- data/lib/graphql/tracing/platform_tracing.rb +7 -20
- data/lib/graphql/tracing/scout_tracing.rb +2 -2
- data/lib/graphql/unresolved_type_error.rb +2 -3
- data/lib/graphql/version.rb +1 -1
- data/readme.md +1 -1
- data/spec/dummy/app/channels/graphql_channel.rb +1 -22
- data/spec/dummy/log/development.log +0 -239
- data/spec/dummy/log/test.log +0 -204
- data/spec/dummy/test/system/action_cable_subscription_test.rb +0 -4
- data/spec/dummy/tmp/screenshots/failures_test_it_handles_subscriptions.png +0 -0
- data/spec/generators/graphql/function_generator_spec.rb +0 -26
- data/spec/generators/graphql/loader_generator_spec.rb +0 -24
- 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/backtrace_spec.rb +0 -10
- data/spec/graphql/base_type_spec.rb +5 -19
- data/spec/graphql/boolean_type_spec.rb +3 -3
- data/spec/graphql/directive_spec.rb +1 -3
- data/spec/graphql/enum_type_spec.rb +5 -18
- data/spec/graphql/execution/execute_spec.rb +1 -1
- data/spec/graphql/execution/multiplex_spec.rb +2 -2
- 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 -15
- 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 +0 -1
- data/spec/graphql/language/generation_spec.rb +186 -21
- data/spec/graphql/language/lexer_spec.rb +1 -21
- data/spec/graphql/language/nodes_spec.rb +12 -21
- data/spec/graphql/language/parser_spec.rb +1 -1
- data/spec/graphql/query/arguments_spec.rb +15 -37
- data/spec/graphql/query/serial_execution/value_resolution_spec.rb +2 -2
- data/spec/graphql/query/variables_spec.rb +1 -1
- data/spec/graphql/query_spec.rb +5 -31
- data/spec/graphql/rake_task_spec.rb +1 -3
- data/spec/graphql/relay/base_connection_spec.rb +1 -1
- data/spec/graphql/relay/connection_instrumentation_spec.rb +2 -2
- 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 +1 -65
- data/spec/graphql/schema/build_from_definition_spec.rb +4 -86
- data/spec/graphql/schema/enum_spec.rb +60 -0
- data/spec/graphql/schema/field_spec.rb +14 -0
- data/spec/graphql/schema/input_object_spec.rb +43 -0
- data/spec/graphql/schema/interface_spec.rb +98 -0
- data/spec/graphql/schema/object_spec.rb +119 -0
- data/spec/graphql/schema/printer_spec.rb +15 -92
- data/spec/graphql/schema/scalar_spec.rb +40 -0
- data/spec/graphql/schema/union_spec.rb +35 -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 +25 -23
- data/spec/graphql/static_validation/rules/fields_have_appropriate_selections_spec.rb +2 -10
- data/spec/graphql/static_validation/rules/fields_will_merge_spec.rb +2 -2
- 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 +1 -60
- data/spec/support/dummy/schema.rb +25 -39
- data/spec/support/jazz.rb +334 -0
- data/spec/support/lazy_helpers.rb +21 -23
- data/spec/support/star_wars/data.rb +7 -6
- data/spec/support/star_wars/schema.rb +109 -142
- metadata +39 -33
- data/lib/graphql/execution/instrumentation.rb +0 -82
- data/lib/graphql/language/block_string.rb +0 -47
- data/lib/graphql/language/document_from_schema_definition.rb +0 -277
- data/lib/graphql/language/printer.rb +0 -351
- data/lib/graphql/tracing/data_dog_tracing.rb +0 -49
- data/spec/graphql/execution/instrumentation_spec.rb +0 -165
- data/spec/graphql/language/block_string_spec.rb +0 -70
- data/spec/graphql/language/document_from_schema_definition_spec.rb +0 -770
- data/spec/graphql/language/printer_spec.rb +0 -203
@@ -0,0 +1,25 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module GraphQL
|
3
|
+
class Schema
|
4
|
+
class Scalar < GraphQL::Schema::Member
|
5
|
+
class << self
|
6
|
+
def coerce_input(val, ctx)
|
7
|
+
raise NotImplementedError, "#{self.name}.coerce_input(val, ctx) must prepare GraphQL input (#{val.inspect}) for Ruby processing"
|
8
|
+
end
|
9
|
+
|
10
|
+
def coerce_result(val, ctx)
|
11
|
+
raise NotImplementedError, "#{self.name}.coerce_result(val, ctx) must prepare Ruby value (#{val.inspect}) for GraphQL response"
|
12
|
+
end
|
13
|
+
|
14
|
+
def to_graphql
|
15
|
+
type_defn = GraphQL::ScalarType.new
|
16
|
+
type_defn.name = graphql_name
|
17
|
+
type_defn.description = description
|
18
|
+
type_defn.coerce_result = method(:coerce_result)
|
19
|
+
type_defn.coerce_input = method(:coerce_input)
|
20
|
+
type_defn
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -29,15 +29,15 @@ module GraphQL
|
|
29
29
|
@instrumented_field_map = Hash.new { |h, k| h[k] = {} }
|
30
30
|
@type_reference_map = Hash.new { |h, k| h[k] = [] }
|
31
31
|
@union_memberships = Hash.new { |h, k| h[k] = [] }
|
32
|
-
visit(schema, nil)
|
32
|
+
visit(schema, schema, nil)
|
33
33
|
end
|
34
34
|
|
35
35
|
private
|
36
36
|
|
37
|
-
def visit(member, context_description)
|
37
|
+
def visit(schema, member, context_description)
|
38
38
|
case member
|
39
39
|
when GraphQL::Schema
|
40
|
-
member.directives.each { |name, directive| visit(directive, "Directive #{name}") }
|
40
|
+
member.directives.each { |name, directive| visit(schema, directive, "Directive #{name}") }
|
41
41
|
# Find the starting points, then visit them
|
42
42
|
visit_roots = [member.query, member.mutation, member.subscription]
|
43
43
|
if @introspection
|
@@ -45,16 +45,16 @@ module GraphQL
|
|
45
45
|
if member.query
|
46
46
|
# Visit this so that arguments class is preconstructed
|
47
47
|
# Skip validation since it begins with __
|
48
|
-
visit_field_on_type(member.query, GraphQL::Introspection::TypeByNameField, dynamic_field: true)
|
48
|
+
visit_field_on_type(schema, member.query, GraphQL::Introspection::TypeByNameField, dynamic_field: true)
|
49
49
|
end
|
50
50
|
end
|
51
51
|
visit_roots.concat(member.orphan_types)
|
52
52
|
visit_roots.compact!
|
53
|
-
visit_roots.each { |t| visit(t, t.name) }
|
53
|
+
visit_roots.each { |t| visit(schema, t, t.name) }
|
54
54
|
when GraphQL::Directive
|
55
55
|
member.arguments.each do |name, argument|
|
56
56
|
@type_reference_map[argument.type.unwrap.to_s] << argument
|
57
|
-
visit(argument.type, "Directive argument #{member.name}.#{name}")
|
57
|
+
visit(schema, argument.type, "Directive argument #{member.name}.#{name}")
|
58
58
|
end
|
59
59
|
# Construct arguments class here, which is later used to generate GraphQL::Query::Arguments
|
60
60
|
# to be passed to a resolver proc
|
@@ -68,42 +68,51 @@ module GraphQL
|
|
68
68
|
@type_map[type_defn.name] = type_defn
|
69
69
|
case type_defn
|
70
70
|
when GraphQL::ObjectType
|
71
|
-
type_defn.interfaces.each { |i| visit(i, "Interface on #{type_defn.name}") }
|
72
|
-
visit_fields(type_defn)
|
71
|
+
type_defn.interfaces.each { |i| visit(schema, i, "Interface on #{type_defn.name}") }
|
72
|
+
visit_fields(schema, type_defn)
|
73
73
|
when GraphQL::InterfaceType
|
74
|
-
visit_fields(type_defn)
|
74
|
+
visit_fields(schema, type_defn)
|
75
75
|
when GraphQL::UnionType
|
76
76
|
type_defn.possible_types.each do |t|
|
77
77
|
@union_memberships[t.name] << type_defn
|
78
|
-
visit(t, "Possible type for #{type_defn.name}")
|
78
|
+
visit(schema, t, "Possible type for #{type_defn.name}")
|
79
79
|
end
|
80
80
|
when GraphQL::InputObjectType
|
81
81
|
type_defn.arguments.each do |name, arg|
|
82
82
|
@type_reference_map[arg.type.unwrap.to_s] << arg
|
83
|
-
visit(arg.type, "Input field #{type_defn.name}.#{name}")
|
83
|
+
visit(schema, arg.type, "Input field #{type_defn.name}.#{name}")
|
84
84
|
end
|
85
85
|
|
86
86
|
# Construct arguments class here, which is later used to generate GraphQL::Query::Arguments
|
87
87
|
# to be passed to a resolver proc
|
88
|
-
|
88
|
+
if type_defn.arguments_class.nil?
|
89
|
+
GraphQL::Query::Arguments.construct_arguments_class(type_defn)
|
90
|
+
end
|
89
91
|
end
|
90
92
|
elsif !prev_type.equal?(type_defn)
|
91
93
|
# If the previous entry in the map isn't the same object we just found, raise.
|
92
94
|
raise("Duplicate type definition found for name '#{type_defn.name}'")
|
93
95
|
end
|
96
|
+
when Class
|
97
|
+
if member.respond_to?(:graphql_definition)
|
98
|
+
graphql_member = member.graphql_definition
|
99
|
+
visit(schema, graphql_member, context_description)
|
100
|
+
else
|
101
|
+
raise GraphQL::Schema::InvalidTypeError.new("Unexpected traversal member: #{member} (#{member.class.name})")
|
102
|
+
end
|
94
103
|
else
|
95
104
|
message = "Unexpected schema traversal member: #{member} (#{member.class.name})"
|
96
105
|
raise GraphQL::Schema::InvalidTypeError.new(message)
|
97
106
|
end
|
98
107
|
end
|
99
108
|
|
100
|
-
def visit_fields(type_defn)
|
109
|
+
def visit_fields(schema, type_defn)
|
101
110
|
type_defn.all_fields.each do |field_defn|
|
102
|
-
visit_field_on_type(type_defn, field_defn)
|
111
|
+
visit_field_on_type(schema, type_defn, field_defn)
|
103
112
|
end
|
104
113
|
end
|
105
114
|
|
106
|
-
def visit_field_on_type(type_defn, field_defn, dynamic_field: false)
|
115
|
+
def visit_field_on_type(schema, type_defn, field_defn, dynamic_field: false)
|
107
116
|
if dynamic_field
|
108
117
|
# Don't apply instrumentation to dynamic fields since they're shared constants
|
109
118
|
instrumented_field_defn = field_defn
|
@@ -114,11 +123,11 @@ module GraphQL
|
|
114
123
|
@instrumented_field_map[type_defn.name][instrumented_field_defn.name] = instrumented_field_defn
|
115
124
|
end
|
116
125
|
@type_reference_map[instrumented_field_defn.type.unwrap.name] << instrumented_field_defn
|
117
|
-
visit(instrumented_field_defn.type, "Field #{type_defn.name}.#{instrumented_field_defn.name}'s return type")
|
126
|
+
visit(schema, instrumented_field_defn.type, "Field #{type_defn.name}.#{instrumented_field_defn.name}'s return type")
|
118
127
|
|
119
128
|
instrumented_field_defn.arguments.each do |name, arg|
|
120
129
|
@type_reference_map[arg.type.unwrap.to_s] << arg
|
121
|
-
visit(arg.type, "Argument #{name} on #{type_defn.name}.#{instrumented_field_defn.name}")
|
130
|
+
visit(schema, arg.type, "Argument #{name} on #{type_defn.name}.#{instrumented_field_defn.name}")
|
122
131
|
end
|
123
132
|
|
124
133
|
# Construct arguments class here, which is later used to generate GraphQL::Query::Arguments
|
@@ -0,0 +1,48 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
module GraphQL
|
3
|
+
class Schema
|
4
|
+
class Union < GraphQL::Schema::Member
|
5
|
+
def initialize(obj, ctx)
|
6
|
+
@object = obj
|
7
|
+
@context = ctx
|
8
|
+
end
|
9
|
+
|
10
|
+
class << self
|
11
|
+
def possible_types(*types)
|
12
|
+
if types.any?
|
13
|
+
@own_possible_types = types
|
14
|
+
else
|
15
|
+
all_possible_types = own_possible_types
|
16
|
+
inherited_possible_types = (superclass < GraphQL::Schema::Union ? superclass.possible_types : [])
|
17
|
+
all_possible_types += inherited_possible_types
|
18
|
+
all_possible_types.uniq
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
def own_possible_types
|
23
|
+
@own_possible_types ||= []
|
24
|
+
end
|
25
|
+
|
26
|
+
# The class resolves type by:
|
27
|
+
# - make an instance
|
28
|
+
# - call the instance method
|
29
|
+
def resolve_type(value, ctx)
|
30
|
+
self.new(value, ctx).resolve_type
|
31
|
+
end
|
32
|
+
|
33
|
+
def to_graphql
|
34
|
+
type_defn = GraphQL::UnionType.new
|
35
|
+
type_defn.name = graphql_name
|
36
|
+
type_defn.description = description
|
37
|
+
type_defn.possible_types = possible_types
|
38
|
+
# If an instance method is defined, use it as a
|
39
|
+
# resolve type hook, via the class method
|
40
|
+
if method_defined?(:resolve_type)
|
41
|
+
type_defn.resolve_type = method(:resolve_type)
|
42
|
+
end
|
43
|
+
type_defn
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
@@ -24,11 +24,7 @@ module GraphQL
|
|
24
24
|
msg = if resolved_type.nil?
|
25
25
|
nil
|
26
26
|
elsif resolved_type.kind.scalar? && ast_node.selections.any?
|
27
|
-
|
28
|
-
"Selections can't be made on scalars (%{node_name} returns #{resolved_type.name} but has inline fragments [#{ast_node.selections.map(&:type).map(&:name).join(", ")}])"
|
29
|
-
else
|
30
|
-
"Selections can't be made on scalars (%{node_name} returns #{resolved_type.name} but has selections [#{ast_node.selections.map(&:name).join(", ")}])"
|
31
|
-
end
|
27
|
+
"Selections can't be made on scalars (%{node_name} returns #{resolved_type.name} but has selections [#{ast_node.selections.map(&:name).join(", ")}])"
|
32
28
|
elsif resolved_type.kind.object? && ast_node.selections.none?
|
33
29
|
"Objects must have selections (%{node_name} returns #{resolved_type.name} but has no selections)"
|
34
30
|
else
|
@@ -2,9 +2,6 @@
|
|
2
2
|
module GraphQL
|
3
3
|
module StaticValidation
|
4
4
|
class FieldsWillMerge
|
5
|
-
# Special handling for fields without arguments
|
6
|
-
NO_ARGS = {}.freeze
|
7
|
-
|
8
5
|
def validate(context)
|
9
6
|
context.each_irep_node do |node|
|
10
7
|
if node.ast_nodes.size > 1
|
@@ -19,19 +16,15 @@ module GraphQL
|
|
19
16
|
|
20
17
|
# Check for incompatible / non-identical arguments on this node:
|
21
18
|
args = node.ast_nodes.map do |n|
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
GraphQL::Language.serialize(arg_value)
|
30
|
-
end
|
31
|
-
memo
|
19
|
+
n.arguments.reduce({}) do |memo, a|
|
20
|
+
arg_value = a.value
|
21
|
+
memo[a.name] = case arg_value
|
22
|
+
when GraphQL::Language::Nodes::AbstractNode
|
23
|
+
arg_value.to_query_string
|
24
|
+
else
|
25
|
+
GraphQL::Language.serialize(arg_value)
|
32
26
|
end
|
33
|
-
|
34
|
-
NO_ARGS
|
27
|
+
memo
|
35
28
|
end
|
36
29
|
end
|
37
30
|
args.uniq!
|
@@ -102,17 +102,7 @@ module GraphQL
|
|
102
102
|
def follow_spreads(node, parent_variables, spreads_for_context, fragment_definitions, visited_fragments)
|
103
103
|
spreads = spreads_for_context[node] - visited_fragments
|
104
104
|
spreads.each do |spread_name|
|
105
|
-
def_node =
|
106
|
-
variables = nil
|
107
|
-
# Implement `.find` by hand to avoid Ruby's internal allocations
|
108
|
-
fragment_definitions.each do |frag_def_node, vars|
|
109
|
-
if frag_def_node.name == spread_name
|
110
|
-
def_node = frag_def_node
|
111
|
-
variables = vars
|
112
|
-
break
|
113
|
-
end
|
114
|
-
end
|
115
|
-
|
105
|
+
def_node, variables = fragment_definitions.find { |def_node, vars| def_node.name == spread_name }
|
116
106
|
next if !def_node
|
117
107
|
visited_fragments << spread_name
|
118
108
|
variables.each do |name, child_usage|
|
@@ -39,7 +39,7 @@ module GraphQL
|
|
39
39
|
# })
|
40
40
|
#
|
41
41
|
# payload = {
|
42
|
-
# result: result.subscription? ?
|
42
|
+
# result: result.subscription? ? nil : result.to_h,
|
43
43
|
# more: result.subscription?,
|
44
44
|
# }
|
45
45
|
#
|
@@ -62,21 +62,19 @@ module GraphQL
|
|
62
62
|
class ActionCableSubscriptions < GraphQL::Subscriptions
|
63
63
|
SUBSCRIPTION_PREFIX = "graphql-subscription:"
|
64
64
|
EVENT_PREFIX = "graphql-event:"
|
65
|
-
|
66
|
-
# @param serializer [<#dump(obj), #load(string)] Used for serializing messages before handing them to `.broadcast(msg)`
|
67
|
-
def initialize(serializer: Serialize, **rest)
|
65
|
+
def initialize(**rest)
|
68
66
|
# A per-process map of subscriptions to deliver.
|
69
67
|
# This is provided by Rails, so let's use it
|
70
68
|
@subscriptions = Concurrent::Map.new
|
71
|
-
@serializer = serializer
|
72
69
|
super
|
73
70
|
end
|
74
71
|
|
75
72
|
# An event was triggered; Push the data over ActionCable.
|
76
73
|
# Subscribers will re-evaluate locally.
|
74
|
+
# TODO: this method name is a smell
|
77
75
|
def execute_all(event, object)
|
78
76
|
stream = EVENT_PREFIX + event.topic
|
79
|
-
message =
|
77
|
+
message = Serialize.dump(object)
|
80
78
|
ActionCable.server.broadcast(stream, message)
|
81
79
|
end
|
82
80
|
|
@@ -99,7 +97,7 @@ module GraphQL
|
|
99
97
|
@subscriptions[subscription_id] = query
|
100
98
|
events.each do |event|
|
101
99
|
channel.stream_from(EVENT_PREFIX + event.topic, coder: ActiveSupport::JSON) do |message|
|
102
|
-
execute(subscription_id, event,
|
100
|
+
execute(subscription_id, event, Serialize.load(message))
|
103
101
|
nil
|
104
102
|
end
|
105
103
|
end
|
data/lib/graphql/tracing.rb
CHANGED
@@ -2,7 +2,6 @@
|
|
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"
|
6
5
|
require "graphql/tracing/new_relic_tracing"
|
7
6
|
require "graphql/tracing/scout_tracing"
|
8
7
|
require "graphql/tracing/skylight_tracing"
|
@@ -12,10 +12,8 @@ module GraphQL
|
|
12
12
|
attr_accessor :platform_keys
|
13
13
|
end
|
14
14
|
|
15
|
-
def initialize
|
16
|
-
@options = options
|
15
|
+
def initialize
|
17
16
|
@platform_keys = self.class.platform_keys
|
18
|
-
@trace_scalars = options.fetch(:trace_scalars, false)
|
19
17
|
end
|
20
18
|
|
21
19
|
def trace(key, data)
|
@@ -43,30 +41,19 @@ module GraphQL
|
|
43
41
|
return_type = field.type.unwrap
|
44
42
|
case return_type
|
45
43
|
when GraphQL::ScalarType, GraphQL::EnumType
|
46
|
-
|
47
|
-
trace_field(type, field)
|
48
|
-
else
|
49
|
-
field
|
50
|
-
end
|
44
|
+
field
|
51
45
|
else
|
52
|
-
|
46
|
+
new_f = field.redefine
|
47
|
+
new_f.metadata[:platform_key] = platform_field_key(type, field)
|
48
|
+
new_f
|
53
49
|
end
|
54
50
|
end
|
55
51
|
|
56
|
-
def
|
57
|
-
|
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)
|
52
|
+
def self.use(schema_defn)
|
53
|
+
tracer = self.new
|
64
54
|
schema_defn.instrument(:field, tracer)
|
65
55
|
schema_defn.tracer(tracer)
|
66
56
|
end
|
67
|
-
|
68
|
-
private
|
69
|
-
attr_reader :options
|
70
57
|
end
|
71
58
|
end
|
72
59
|
end
|
@@ -26,9 +26,8 @@ module GraphQL
|
|
26
26
|
@possible_types = possible_types
|
27
27
|
message = "The value from \"#{field.name}\" on \"#{parent_type}\" could not be resolved to \"#{field.type}\". " \
|
28
28
|
"(Received: `#{resolved_type.inspect}`, Expected: [#{possible_types.map(&:inspect).join(", ")}]) " \
|
29
|
-
"Make sure you have defined a `
|
30
|
-
"gets resolved to a valid type.
|
31
|
-
"interface but isn't a return type of any other field."
|
29
|
+
"Make sure you have defined a `type_from_object` proc on your schema and that value `#{value.inspect}` " \
|
30
|
+
"gets resolved to a valid type."
|
32
31
|
super(message)
|
33
32
|
end
|
34
33
|
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/github/rmosolgo/graphql-ruby)
|
13
13
|
- [Newsletter](https://tinyletter.com/graphql-ruby)
|
14
14
|
|
15
15
|
## Installation
|
@@ -17,31 +17,10 @@ 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
|
-
|
40
20
|
GraphQLSchema = GraphQL::Schema.define do
|
41
21
|
query(QueryType)
|
42
22
|
subscription(SubscriptionType)
|
43
|
-
use GraphQL::Subscriptions::ActionCableSubscriptions
|
44
|
-
serializer: CustomSerializer
|
23
|
+
use GraphQL::Subscriptions::ActionCableSubscriptions
|
45
24
|
end
|
46
25
|
|
47
26
|
def subscribed
|
@@ -358,242 +358,3 @@ 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)
|