mirror of
https://github.com/anyproto/anytype-heart.git
synced 2025-06-11 18:20:33 +09:00
141 lines
3.3 KiB
Go
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
|
|
}
|
|
}
|