#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