1
0
Fork 0
mirror of https://github.com/anyproto/anytype-heart.git synced 2025-06-11 18:20:33 +09:00
anytype-heart/cmd/grpcserver/grpc.go
2021-03-01 16:54:57 +04:00

141 lines
3.3 KiB
Go

// +build !nogrpcserver,!_test
package main
import (
"fmt"
"github.com/anytypeio/go-anytype-middleware/metrics"
grpc_prometheus "github.com/grpc-ecosystem/go-grpc-prometheus"
"net"
"net/http"
_ "net/http/pprof"
"os"
"os/signal"
"syscall"
"github.com/anytypeio/go-anytype-middleware/core/event"
"github.com/anytypeio/go-anytype-middleware/pb"
"github.com/anytypeio/go-anytype-middleware/pkg/lib/logging"
"github.com/improbable-eng/grpc-web/go/grpcweb"
"google.golang.org/grpc"
"github.com/anytypeio/go-anytype-middleware/core"
"github.com/anytypeio/go-anytype-middleware/pb/service"
)
const defaultAddr = "127.0.0.1:31007"
const defaultWebAddr = "127.0.0.1:31008"
// do not change this, js client relies on this msg to ensure that server is up
const grpcWebStartedMessagePrefix = "gRPC Web proxy started at: "
var log = logging.Logger("anytype-grpc-server")
func main() {
var addr string
var webaddr string
fmt.Printf("mw grpc: %s\n", core.GetVersionDescription())
if len(os.Args) > 1 {
addr = os.Args[1]
if len(os.Args) > 2 {
webaddr = os.Args[2]
}
}
if addr == "" {
if env := os.Getenv("ANYTYPE_GRPC_ADDR"); env != "" {
addr = env
} else {
addr = defaultAddr
}
}
if webaddr == "" {
if env := os.Getenv("ANYTYPE_GRPCWEB_ADDR"); env != "" {
webaddr = env
} else {
webaddr = defaultWebAddr
}
}
if debug, ok := os.LookupEnv("ANYPROF"); ok && debug != "" {
go func() {
http.ListenAndServe(debug, nil)
}()
}
var stopChan = make(chan os.Signal, 2)
signal.Notify(stopChan, os.Interrupt, syscall.SIGTERM, syscall.SIGINT)
var mw = core.New()
mw.EventSender = event.NewGrpcSender()
lis, err := net.Listen("tcp", addr)
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
addr = lis.Addr().String()
webLis, err := net.Listen("tcp", webaddr)
if err != nil {
log.Fatalf("failed to listen: %v", err)
}
webaddr = webLis.Addr().String()
var unaryServerInterceptor grpc.UnaryServerInterceptor
if metrics.Enabled {
unaryServerInterceptor = grpc_prometheus.UnaryServerInterceptor
}
server := grpc.NewServer(grpc.MaxRecvMsgSize(20*1024*1024), grpc.UnaryInterceptor(unaryServerInterceptor))
service.RegisterClientCommandsServer(server, mw)
if metrics.Enabled {
grpc_prometheus.EnableHandlingTimeHistogram()
//grpc_prometheus.Register(server)
}
webrpc := grpcweb.WrapServer(
server,
grpcweb.WithOriginFunc(func(origin string) bool {
return true
}),
grpcweb.WithWebsockets(true),
grpcweb.WithWebsocketOriginFunc(func(req *http.Request) bool {
return true
}))
proxy := &http.Server{
Addr: webaddr,
}
proxy.Handler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
if webrpc.IsGrpcWebRequest(r) ||
webrpc.IsAcceptableGrpcCorsRequest(r) ||
webrpc.IsGrpcWebSocketRequest(r) {
webrpc.ServeHTTP(w, r)
}
})
go func() {
server.Serve(lis)
}()
fmt.Println("gRPC server started at: " + addr)
go func() {
if err := proxy.Serve(webLis); err != nil && err != http.ErrServerClosed {
log.Fatalf("proxy error: %v", err)
}
}()
// do not change this, js client relies on this msg to ensure that server is up and parse address
fmt.Println(grpcWebStartedMessagePrefix + webaddr)
select {
case <-stopChan:
server.Stop()
proxy.Close()
mw.Shutdown(&pb.RpcShutdownRequest{})
return
}
}