Как настроить graphql-flutter и apollo разорвать это, чтобы приложение перестало отключаться от websocket

#node.js #flutter #redirect #websocket #apollo-server

#node.js #flutter #перенаправление #websocket #apollo-сервер

Вопрос:

Я создаю приложение на flutter, где я использую пакет graphql-flutter, и моя конфигурация выглядит следующим образом:

 final WebSocketLink websocketLink = WebSocketLink(
    url: subscriptionUri,
    config: SocketClientConfig(
        autoReconnect: true,
        initPayload: () {
          return authTokenService.addAuthHeader(EnvVariables.currentHost);
        }));

link = link.concat(websocketLink);
  

Также на серверной части я использую Apollo graphql с подписками и redis для PubSub, который выглядит следующим образом:

 this.pubsub = new RedisPubSub({
            publisher: new Redis(process.env.REDIS_URL),
            subscriber: new Redis(process.env.REDIS_URL),
        });
  

и Apollo

 const apolloServer = new ApolloServer({
    schema,
    subscriptions: {
        keepAlive: 30000,  
    }...
  

Все это размещено на Heroku (не без среды prod — возможно, это проблема)
Итак, мое приложение продолжает отключаться и повторно подключаться к websocket.
введите описание изображения здесь

непосредственно перед отключением я получаю сообщение: не получено сообщение keep alive в течение 30 секунд. Отключение…

Но если я передам null в inactivityTimeout в пакете graphql-flutter

 final WebSocketLink websocketLink = WebSocketLink(
    url: subscriptionUri,
    config: SocketClientConfig(
        autoReconnect: true,
        inactivityTimeout: null,
        initPayload: () {
          return authTokenService.addAuthHeader(EnvVariables.currentHost);
        }));

link = link.concat(websocketLink);
  

Через некоторое время приложение выдает ошибку, что — достигнут максимальный предел повторных попыток.

Итак, как мне правильно настроить обе стороны? Должен ли я отправлять сообщения keepAlive или просто игнорировать их на стороне flutter, но тогда как избежать ошибки max retries? Или, может быть, я должен вручную отправить любое сообщение на канал, чтобы оно оставалось активным, если здесь написано: https://devcenter.heroku.com/articles/play-java-websockets-advanced (но я бы ожидал, что сервер apollo сделает это за меня …)

Спасибо

Ответ №1:

Поскольку в этой библиотеке нет активного сопровождающего, я использовал пользовательскую вилку, в которой заменяется клиент websocket. https://github.com/zino-app/graphql-flutter/issues/892