From 2f822df5196d024dd9443b8b090b55109385c9dc Mon Sep 17 00:00:00 2001 From: madipo2611 Date: Mon, 18 Aug 2025 14:28:49 +0300 Subject: [PATCH] =?UTF-8?q?v0.0.18.6=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5?= =?UTF-8?q?=D1=80=D0=BA=D0=B0=20=D1=81=D0=BE=D0=BE=D0=B1=D1=89=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=BD=D0=B0=20nil=20=D0=B2=20messageStream?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- internal/http/graph/messages_resolvers.go | 36 ++++++++++++++++++----- 1 file changed, 29 insertions(+), 7 deletions(-) diff --git a/internal/http/graph/messages_resolvers.go b/internal/http/graph/messages_resolvers.go index 8f61d5b..da66d51 100644 --- a/internal/http/graph/messages_resolvers.go +++ b/internal/http/graph/messages_resolvers.go @@ -3,6 +3,7 @@ package graph import ( "context" "fmt" + "log" "tailly_back_v2/internal/domain" "tailly_back_v2/proto" "time" @@ -120,7 +121,6 @@ func (r *queryResolver) GetUserChats(ctx context.Context, userID int) ([]*domain // MessageStream реализация подписки на новые сообщения func (r *subscriptionResolver) MessageStream(ctx context.Context, userID int) (<-chan *domain.Message, error) { - if userID == 0 { return nil, fmt.Errorf("user not authenticated") } @@ -134,16 +134,34 @@ func (r *subscriptionResolver) MessageStream(ctx context.Context, userID int) (< messageChan := make(chan *domain.Message) go func() { - defer close(messageChan) - for { - msg, err := stream.Recv() - if err != nil { - return + defer func() { + close(messageChan) + if r := recover(); r != nil { + log.Printf("Recovered from panic in MessageStream: %v", r) } + }() + + for { select { case <-ctx.Done(): return - case messageChan <- protoMessageToDomain(msg.Message): + default: + msg, err := stream.Recv() + if err != nil { + log.Printf("Stream receive error: %v", err) + return + } + + // Добавляем проверку на nil сообщение + if msg == nil || msg.Message == nil { + continue + } + + select { + case <-ctx.Done(): + return + case messageChan <- protoMessageToDomain(msg.Message): + } } } }() @@ -153,6 +171,10 @@ func (r *subscriptionResolver) MessageStream(ctx context.Context, userID int) (< // Преобразование proto-сообщения в domain-модель func protoMessageToDomain(msg *proto.Message) *domain.Message { + if msg == nil { + return &domain.Message{} + } + return &domain.Message{ ID: int(msg.Id), ChatID: int(msg.ChatId),