Пример #1
0
        public override async Task SendMessages(IAsyncStreamReader <ChatMessagesRequest> requestStream, IServerStreamWriter <ChatMessagesResponse> responseStream, ServerCallContext context)
        {
            UserLogin userLoginRequest = await GetUserLogin(requestStream, context);

            var observer = new ChatObserver(responseStream, logger);

            using var subscription = Pusher.Subscribe(observer);
            observer.StartSendingOutgoingMessages(userLoginRequest.Id, context.CancellationToken);

            // do this after subscription to ensure to get all 'i love you' messages ;)
            Pusher.OnNext(CreateUserLoginMessage(userLoginRequest));

            await Chatting(requestStream, context, userLoginRequest, observer, subscription);
        }
Пример #2
0
        private async Task Chatting(IAsyncStreamReader <ChatMessagesRequest> requestStream, ServerCallContext context, UserLogin userLoginRequest, ChatObserver observer, IDisposable subscription)
        {
            try
            {
                while (await requestStream.MoveNext(context.CancellationToken))
                {
                    var request = requestStream.Current;
                    switch (request.MessagesCase)
                    {
                    case ChatMessagesRequest.MessagesOneofCase.ChatMessage:
                        NewOutgoingMessage(CreateChatMessage(request.ChatMessage, userLoginRequest));
                        break;

                    default:
                        // DoNothing, changing name is not supported yet
                        break;
                    }
                }
            }
            catch (OperationCanceledException)
            {
                // It is ok.. i call it on client side even it it not needed
            }
            finally
            {
                EndReceivingMessages(subscription);

                // do this after because you should not see all the 'i hate him but i am too shy to tell him' messages
                NewOutgoingMessage(CreateUserLogoutMessage(userLoginRequest));

                await EndSendingMessages(observer);
            }
        }
Пример #3
0
 private async Task EndSendingMessages(ChatObserver observer)
 {
     await observer.StopSendingOutgoingMessages();
 }