From 15ae17189dd6e79a8b38729e2f901f8287a0e985 Mon Sep 17 00:00:00 2001 From: madipo2611 Date: Sun, 17 Aug 2025 10:23:14 +0300 Subject: [PATCH] v0.0.18.2 --- internal/http/graph/messages_resolvers.go | 14 +------- internal/http/server.go | 40 +++++++++++------------ 2 files changed, 20 insertions(+), 34 deletions(-) diff --git a/internal/http/graph/messages_resolvers.go b/internal/http/graph/messages_resolvers.go index 10ff393..dbedac2 100644 --- a/internal/http/graph/messages_resolvers.go +++ b/internal/http/graph/messages_resolvers.go @@ -3,7 +3,6 @@ package graph import ( "context" "fmt" - "log" "tailly_back_v2/internal/domain" "tailly_back_v2/proto" "time" @@ -121,10 +120,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) { - // Создаем канал для GraphQL подписки - messageChan := make(chan *domain.Message) - - // Вызываем gRPC стриминг stream, err := r.MessageClient.StreamMessages(ctx, &proto.StreamMessagesRequest{ UserId: int32(userID), }) @@ -132,21 +127,14 @@ func (r *subscriptionResolver) MessageStream(ctx context.Context, userID int) (< return nil, fmt.Errorf("failed to stream messages: %w", err) } + messageChan := make(chan *domain.Message) go func() { defer close(messageChan) - for { msg, err := stream.Recv() if err != nil { - log.Printf("gRPC stream error: %v", err) return } - - // Пропускаем heartbeat сообщения - if msg.Message.Content == "__heartbeat__" { - continue - } - select { case <-ctx.Done(): return diff --git a/internal/http/server.go b/internal/http/server.go index fbf19b0..943548e 100644 --- a/internal/http/server.go +++ b/internal/http/server.go @@ -5,9 +5,10 @@ import ( "database/sql" "github.com/99designs/gqlgen/graphql/handler" "github.com/99designs/gqlgen/graphql/handler/transport" + "github.com/99designs/gqlgen/graphql/playground" "github.com/go-chi/chi/v5" + "github.com/gorilla/websocket" "github.com/prometheus/client_golang/prometheus/promhttp" - "github.com/vektah/gqlparser/v2/ast" "log" "net/http" "os" @@ -71,29 +72,26 @@ func (s *Server) configureRouter() { Resolvers: resolver, })) - srv.AddTransport(&transport.POST{}) - srv.AddTransport(&transport.GET{}) - srv.AddTransport(&transport.Options{}) + wsTransport := transport.Websocket{ + Upgrader: websocket.Upgrader{ + CheckOrigin: func(r *http.Request) bool { + origin := r.Header.Get("Origin") + for _, allowed := range allowedOrigins { + if origin == allowed { + return true + } + } + return false + }, + }, + } - // Настройка SSE транспорта (правильный способ) - sseTransport := &transport.SSE{} - srv.AddTransport(sseTransport) + srv.AddTransport(&wsTransport) - // Простейший кеш запросов (альтернатива MemoryCache) - srv.SetQueryCache(&NoopCache{}) -}) - -s.router.Handle("/", playground.Handler("GraphQL playground", "/query")) -s.router.Handle("/query", srv) -s.router.Handle("/uploads/*", http.StripPrefix("/uploads/", http.FileServer(http.Dir("./uploads")))) + s.router.Handle("/", playground.Handler("GraphQL playground", "/query")) + s.router.Handle("/query", srv) + s.router.Handle("/uploads/*", http.StripPrefix("/uploads/", http.FileServer(http.Dir("./uploads")))) } -type NoopCache struct{} - -func (n *NoopCache) Get(ctx context.Context, key string) (*ast.QueryDocument, bool) { - return nil, false -} - -func (n *NoopCache) Add(ctx context.Context, key string, value *ast.QueryDocument) {} func (s *Server) configureMetrics() { metricsRouter := chi.NewRouter()