graphQL = $graphQL; $this->subscriptionAuthorizer = $subscriptionAuthorizer; $this->subscriptionStorage = $subscriptionStorage; $this->subscriptionIterator = $subscriptionIterator; $this->broadcastManager = $broadcastManager; $this->busDispatcher = $busDispatcher; } public function queueBroadcast(GraphQLSubscription $subscription, string $fieldName, $root): void { $broadcastSubscriptionJob = new BroadcastSubscriptionJob($subscription, $fieldName, $root); $broadcastSubscriptionJob->onQueue(config('lighthouse.subscriptions.broadcasts_queue_name')); $this->busDispatcher->dispatch($broadcastSubscriptionJob); } public function broadcast(GraphQLSubscription $subscription, string $fieldName, $root): void { $topic = $subscription->decodeTopic($fieldName, $root); $subscribers = $this->subscriptionStorage ->subscribersByTopic($topic) ->filter(function (Subscriber $subscriber) use ($subscription, $root): bool { return $subscription->filter($subscriber, $root); }); $this->subscriptionIterator->process( $subscribers, function (Subscriber $subscriber) use ($root): void { $subscriber->root = $root; $executionResult = $this->graphQL->executeQuery( $subscriber->query, $subscriber->context, $subscriber->variables, $subscriber ); $this->broadcastManager->broadcast( $subscriber, $this->graphQL->serializable($executionResult) ); } ); } public function authorize(Request $request): Response { return $this->subscriptionAuthorizer->authorize($request) ? $this->broadcastManager->authorized($request) : $this->broadcastManager->unauthorized($request); } }