This commit is contained in:
parent
2a3ae72db9
commit
15ae17189d
@ -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
|
||||
|
||||
@ -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)
|
||||
|
||||
// Простейший кеш запросов (альтернатива MemoryCache)
|
||||
srv.SetQueryCache(&NoopCache{})
|
||||
})
|
||||
srv.AddTransport(&wsTransport)
|
||||
|
||||
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()
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user