Skip to content

Commit b6ce8d6

Browse files
committed
Add a finish_subscriptions method
1 parent 2072619 commit b6ce8d6

4 files changed

Lines changed: 18 additions & 10 deletions

File tree

lib/graphql/execution/interpreter.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,8 @@ def run_all(schema, query_options, context: {}, max_complexity: schema.max_compl
8888
# Then, find all errors and assign the result to the query object
8989
results.each_with_index do |data_result, idx|
9090
query = queries[idx]
91-
if (events = query.context.namespace(:subscriptions)[:events]) && !events.empty?
92-
schema.subscriptions.write_subscription(query, events)
91+
if query.subscription?
92+
schema.subscriptions.finish_subscriptions(query)
9393
end
9494
# Assign the result so that it can be accessed in instrumentation
9595
query.result_values = if data_result.equal?(NO_OPERATION)

lib/graphql/execution/next/runner.rb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -176,8 +176,8 @@ def execute
176176

177177
queries.each_with_index.map do |query, idx|
178178
result = results[idx]
179-
if (events = query.context.namespace(:subscriptions)[:events]) && !events.empty?
180-
@schema.subscriptions.write_subscription(query, events)
179+
if query.subscription?
180+
@schema.subscriptions.finish_subscriptions(query)
181181
end
182182

183183
fin_result = if query.context.errors.empty?

lib/graphql/schema/resolver.rb

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,10 @@ def call
7474

7575
result = if is_authed
7676
Schema::Validator.validate!(self.class.validators, object, context, @prepared_arguments, as: @field)
77+
if q.subscription? && @field.owner == context.schema.subscription
78+
# This needs to use arguments without `loads:`
79+
@original_arguments = @field_resolve_step.coerce_arguments(@field, @field_resolve_step.ast_node.arguments, false)
80+
end
7781
call_resolve(@prepared_arguments)
7882
elsif new_return_value.nil?
7983
err = UnauthorizedFieldError.new(object: object, type: @field_resolve_step.parent_type, context: context, field: @field)
@@ -83,12 +87,6 @@ def call
8387
end
8488
q = context.query
8589
q.current_trace.end_execute_field(field, @prepared_arguments, trace_objs, q, [result])
86-
if q.subscription? && @field.owner == context.schema.subscription && !@subscription_written
87-
# TODO unify this -- do it in a single pass
88-
@original_arguments = @field_resolve_step.coerce_arguments(@field, @field_resolve_step.ast_node.arguments, false)
89-
Subscriptions::DefaultSubscriptionResolveExtension.write_subscription(@field, result, @original_arguments, context)
90-
@subscription_written = true
91-
end
9290
exec_result[exec_index] = result
9391
rescue RuntimeError => err
9492
exec_result[exec_index] = err

lib/graphql/subscriptions.rb

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -249,6 +249,16 @@ def initialize_subscriptions(query)
249249
nil
250250
end
251251

252+
# Called during execution when a subscription operation has finished
253+
# @param query [GraphQL::Query]
254+
# @return [void]
255+
def finish_subscriptions(query)
256+
if (events = query.context.namespace(:subscriptions)[:events]) && !events.empty?
257+
write_subscription(query, events)
258+
end
259+
nil
260+
end
261+
252262
private
253263

254264
# Recursively normalize `args` as belonging to `arg_owner`:

0 commit comments

Comments
 (0)