Обнаружить отписку на сервере Apollo graphql - PullRequest
1 голос
/ 04 июля 2019

На сервере Apollo, когда пользователь клиента подписывается на подписку (используя WebSocket), мы можем обнаружить это с помощью средства распознавания подписок.

Но есть ли способ обнаружить отписку?Я вижу, что WebSocket отправляет сообщение {"id": "1", "type": "stop"}, но я не знаю, как его перехватить

. Поэтому я не хочу знать, когда пользователь отключается от Websocket, но когда пользователь отписалсяподписка с клиентом Apollo.

1 Ответ

0 голосов
/ 17 июля 2019

У меня была та же проблема, не могу поверить, что она не встроена в GraphQL или не описана в документации.

Я нашел решение проблемы с github, которую вы можете прочитать здесь

То, как я это исправил, было:

добавил функцию withCancel в мой распознаватель:

const withCancel = (asyncIterator, onCancel) => {
  const asyncReturn = asyncIterator.return;

  asyncIterator.return = () => {
    onCancel();
    return asyncReturn ? asyncReturn.call(asyncIterator) : Promise.resolve({ value: undefined, done: true });
  };

  return asyncIterator;
};

затем использовал это в моей подписке:

Subscription: {
    update: {
      subscribe: (root, { id, topic }, ctx, info) => {
        logger.info(`start new subscription for ${id}`);
        ActiveMQ(id, topic);

        return withCancel(pubsub.asyncIterator(id), () => {
          console.log(`Subscription closed, do your cleanup`);
        });
      },
      resolve: payload => {
        return payload;
      },
    },
  }

Затем я обработал мою логику в обратном вызове, предоставленном withCancel, который для меня закрывал клиент stomp и очищал список активных подписчиков и т. Д.

...