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); }
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); } }
private async Task EndSendingMessages(ChatObserver observer) { await observer.StopSendingOutgoingMessages(); }