91 lines
1.9 KiB
Go
91 lines
1.9 KiB
Go
package server
|
|
|
|
import (
|
|
"context"
|
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/app"
|
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/app/logger"
|
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/config"
|
|
"github.com/anytypeio/go-anytype-infrastructure-experiments/syncproto"
|
|
"google.golang.org/grpc"
|
|
"google.golang.org/grpc/credentials"
|
|
"io"
|
|
"net"
|
|
"time"
|
|
)
|
|
|
|
var log = logger.NewNamed("server")
|
|
|
|
const CName = "server"
|
|
|
|
func New() *Server {
|
|
return &Server{}
|
|
}
|
|
|
|
type Server struct {
|
|
config config.GrpcServer
|
|
grpcServer *grpc.Server
|
|
}
|
|
|
|
func (s *Server) Init(ctx context.Context, a *app.App) (err error) {
|
|
s.config = a.MustComponent(config.CName).(*config.Config).GrpcServer
|
|
return nil
|
|
}
|
|
|
|
func (s *Server) Name() (name string) {
|
|
return CName
|
|
}
|
|
|
|
func (s *Server) Run(ctx context.Context) (err error) {
|
|
lis, err := net.Listen("tcp", s.config.ListenAddrs[0])
|
|
if err != nil {
|
|
return err
|
|
}
|
|
var opts []grpc.ServerOption
|
|
if s.config.TLS {
|
|
creds, err := credentials.NewServerTLSFromFile(s.config.TLSCertFile, s.config.TLSKeyFile)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
opts = []grpc.ServerOption{grpc.Creds(creds)}
|
|
}
|
|
s.grpcServer = grpc.NewServer(opts...)
|
|
|
|
syncproto.RegisterAnytypeSyncServer(s.grpcServer, s)
|
|
|
|
var errCh = make(chan error)
|
|
go func() {
|
|
errCh <- s.grpcServer.Serve(lis)
|
|
}()
|
|
select {
|
|
case <-time.After(time.Second / 4):
|
|
case err = <-errCh:
|
|
}
|
|
|
|
log.Sugar().Infof("server started at: %v", s.config.ListenAddrs[0])
|
|
return
|
|
}
|
|
|
|
func (s *Server) Ping(stream syncproto.AnytypeSync_PingServer) error {
|
|
for {
|
|
in, err := stream.Recv()
|
|
if err == io.EOF {
|
|
return nil
|
|
}
|
|
if err != nil {
|
|
return err
|
|
}
|
|
if err := stream.Send(&syncproto.PingResponse{
|
|
Seq: in.Seq,
|
|
}); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
}
|
|
|
|
func (s *Server) Close(ctx context.Context) (err error) {
|
|
if s.grpcServer != nil {
|
|
s.grpcServer.GracefulStop()
|
|
}
|
|
return
|
|
}
|