All Downloads are FREE. Search and download functionalities are using the official Maven repository.

graphql.kickstart.execution.subscriptions.apollo.ApolloSubscriptionProtocolFactory Maven / Gradle / Ivy

package graphql.kickstart.execution.subscriptions.apollo;

import graphql.kickstart.execution.GraphQLInvoker;
import graphql.kickstart.execution.GraphQLObjectMapper;
import graphql.kickstart.execution.subscriptions.GraphQLSubscriptionInvocationInputFactory;
import graphql.kickstart.execution.subscriptions.GraphQLSubscriptionMapper;
import graphql.kickstart.execution.subscriptions.SubscriptionProtocolFactory;
import graphql.kickstart.execution.subscriptions.SubscriptionSession;
import java.time.Duration;
import java.util.Collection;
import java.util.HashSet;
import java.util.Set;
import java.util.function.Consumer;
import lombok.Getter;

/** @author Andrew Potter */
public class ApolloSubscriptionProtocolFactory extends SubscriptionProtocolFactory {

  public static final int KEEP_ALIVE_INTERVAL = 15;
  @Getter private final GraphQLObjectMapper objectMapper;
  private final ApolloCommandProvider commandProvider;
  private KeepAliveSubscriptionConnectionListener keepAlive;

  public ApolloSubscriptionProtocolFactory(
      GraphQLObjectMapper objectMapper,
      GraphQLSubscriptionInvocationInputFactory invocationInputFactory,
      GraphQLInvoker graphQLInvoker) {
    this(
        objectMapper,
        invocationInputFactory,
        graphQLInvoker,
        Duration.ofSeconds(KEEP_ALIVE_INTERVAL));
  }

  public ApolloSubscriptionProtocolFactory(
      GraphQLObjectMapper objectMapper,
      GraphQLSubscriptionInvocationInputFactory invocationInputFactory,
      GraphQLInvoker graphQLInvoker,
      Duration keepAliveInterval) {
    this(objectMapper, invocationInputFactory, graphQLInvoker, null, keepAliveInterval);
  }

  public ApolloSubscriptionProtocolFactory(
      GraphQLObjectMapper objectMapper,
      GraphQLSubscriptionInvocationInputFactory invocationInputFactory,
      GraphQLInvoker graphQLInvoker,
      Collection connectionListeners) {
    this(
        objectMapper,
        invocationInputFactory,
        graphQLInvoker,
        connectionListeners,
        Duration.ofSeconds(KEEP_ALIVE_INTERVAL));
  }

  public ApolloSubscriptionProtocolFactory(
      GraphQLObjectMapper objectMapper,
      GraphQLSubscriptionInvocationInputFactory invocationInputFactory,
      GraphQLInvoker graphQLInvoker,
      Collection connectionListeners,
      Duration keepAliveInterval) {
    super("graphql-ws");
    this.objectMapper = objectMapper;
    Set listeners = new HashSet<>();
    if (connectionListeners != null) {
      listeners.addAll(connectionListeners);
    }
    if (keepAliveInterval != null
        && listeners.stream()
            .noneMatch(KeepAliveSubscriptionConnectionListener.class::isInstance)) {
      keepAlive = new KeepAliveSubscriptionConnectionListener(keepAliveInterval);
      listeners.add(keepAlive);
    }
    commandProvider =
        new ApolloCommandProvider(
            new GraphQLSubscriptionMapper(objectMapper),
            invocationInputFactory,
            graphQLInvoker,
            listeners);
  }

  @Override
  public Consumer createConsumer(SubscriptionSession session) {
    return new ApolloSubscriptionConsumer(session, objectMapper, commandProvider);
  }

  @Override
  public void shutdown() {
    if (keepAlive != null) {
      keepAlive.shutdown();
    }
  }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy