handler.go

 1//go:generate go tool gqlgen generate
 2
 3// Package graphql contains the root GraphQL http handler
 4package graphql
 5
 6import (
 7	"io"
 8	"net/http"
 9	"time"
10
11	"github.com/99designs/gqlgen/graphql/handler"
12	"github.com/99designs/gqlgen/graphql/handler/extension"
13	"github.com/99designs/gqlgen/graphql/handler/lru"
14	"github.com/99designs/gqlgen/graphql/handler/transport"
15	"github.com/gorilla/websocket"
16	"github.com/vektah/gqlparser/v2/ast"
17
18	"github.com/git-bug/git-bug/api/graphql/graph"
19	"github.com/git-bug/git-bug/api/graphql/resolvers"
20	"github.com/git-bug/git-bug/cache"
21)
22
23// Handler is the root GraphQL http handler
24type Handler struct {
25	http.Handler
26	io.Closer
27}
28
29func NewHandler(mrc *cache.MultiRepoCache, errorOut io.Writer) Handler {
30	rootResolver := resolvers.NewRootResolver(mrc)
31	config := graph.Config{Resolvers: rootResolver}
32
33	h := handler.New(graph.NewExecutableSchema(config))
34
35	h.AddTransport(transport.Websocket{
36		KeepAlivePingInterval: 10 * time.Second,
37		Upgrader: websocket.Upgrader{
38			CheckOrigin: func(r *http.Request) bool { return true },
39		},
40	})
41	h.AddTransport(transport.Options{})
42	h.AddTransport(transport.GET{})
43	h.AddTransport(transport.POST{})
44	h.AddTransport(transport.MultipartForm{})
45
46	h.SetQueryCache(lru.New[*ast.QueryDocument](1000))
47
48	h.Use(extension.Introspection{})
49	h.Use(extension.AutomaticPersistedQuery{
50		Cache: lru.New[string](100),
51	})
52
53	if errorOut != nil {
54		h.Use(&Tracer{Out: errorOut})
55	}
56
57	return Handler{
58		Handler: h,
59		Closer:  rootResolver,
60	}
61}