any-sync/service/server/server.go
2022-07-14 00:22:28 +03:00

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
}