51 lines
960 B
Go
51 lines
960 B
Go
package grpcserver
|
|
|
|
import (
|
|
"backend/pkg/logger"
|
|
"context"
|
|
"fmt"
|
|
"net"
|
|
)
|
|
|
|
type serverGrpc interface {
|
|
Serve(lis net.Listener) error
|
|
}
|
|
|
|
type Server struct {
|
|
logger logger.Logger
|
|
grpc serverGrpc
|
|
}
|
|
|
|
type NewServerOpts struct {
|
|
Logger logger.Logger
|
|
GrpcServer serverGrpc
|
|
}
|
|
|
|
func New(opts NewServerOpts) *Server {
|
|
return &Server{
|
|
logger: opts.Logger,
|
|
grpc: opts.GrpcServer,
|
|
}
|
|
}
|
|
|
|
func (s *Server) Run(ctx context.Context, port uint16) {
|
|
listenAddr := fmt.Sprintf("0.0.0.0:%d", port)
|
|
s.logger.Log().Msgf("server listening on %s", listenAddr)
|
|
|
|
listener, err := (&net.ListenConfig{}).Listen(ctx, "tcp", listenAddr)
|
|
if err != nil {
|
|
s.logger.Fatal().Err(err).Msg("can not create network listener")
|
|
}
|
|
|
|
go func() {
|
|
<-ctx.Done()
|
|
s.logger.Log().Msg("stopping tcp listener...")
|
|
listener.Close()
|
|
}()
|
|
|
|
err = s.grpc.Serve(listener)
|
|
if err != nil && err == net.ErrClosed {
|
|
s.logger.Fatal().Err(err).Msg("server stopped with error")
|
|
}
|
|
}
|