Публикация для конкретного пользователя (подписки)

Вот небольшая проблема, с которой я столкнулся и не смог найти много информации в документации. Я пытаюсь создавать личные сообщения в чате. У нас есть следующий код для подписки пользователя на тему:

export const resolvers = {
  Subscription: {
    somethingChanged: {
      subscribe: () => pubsub.asyncIterator('chat_messages'),
    },
  },
}

и опубликовать

pubsub.publish('chat_messages', { somethingChanged: { sender_id: 1, receiver_id: 2, message: 'test' }});

Я использовал onConnect, чтобы убедиться, что пользователь аутентифицирован

const server = new ApolloServer({
    typeDefs,
    resolvers,
    subscriptions: {
        onConnect: (connectionParams, webSocket) => {
            ...
            if (!authenticated) throw error
            ...
        },
    },
   ...
})

Это хорошо работает, например, когда я хочу подписать пользователей на определенную тему. Но как мне реализовать общение между частными пользователями? Я пробовал withFilter, но не могу реализовать проверки авторизации пользователя (в отношении сообщения).


person pewpewlasers    schedule 07.08.2018    source источник


Ответы (1)


Вот демонстрация: https://github.com/mrdulin/apollo-server-express-starter/tree/master/src/subscription/demo-1

С этими функциями:

  1. jwt аутентификация для подключения к веб-сокету

  2. Пользовательский канал, который означает, кто может получать сообщения, а кто нет.

Вам необходимо знать несколько концепций:

  1. есть два типа пользователей: requestUser и subscribeUsers (включая requestUser)

  2. вы должны написать код в filterFn, чтобы узнать, кто может получать сообщение, которое отправлено requestUser.

Например:

Есть три подписанных пользователя: s1 (клиент-1), s2 (клиент-2), s3 (клиент-3).

Когда запрос пользователя (клиент-4) отправляет сообщение (возможно, изменение), вы можете получить подписать пользователей и запросить пользователей с помощью context аргумента filterFn.

Согласно этим двум типам users' информации. Вы можете написать свою собственную бизнес-логику в filterFn, чтобы решать, кто может получать сообщения, а кто нет.

P.S. кроме context, вы можете получить variables аргумент в filterFn от клиента. Это даст больше информации, чтобы решить, кто может получать сообщения, а кто нет.

Извините за мой английский!

person slideshowp2    schedule 07.09.2018
comment
правда, но у меня возникли проблемы с аутентификацией пользователей канала. если внутри канала только определенный пользователь может получать обновления (например, приватный чат). Я что-то разместил на github, не могли бы вы взглянуть? github.com/apollographql/apollo-server/issues/1553 - person pewpewlasers; 09.09.2018