github.com/gofunct/common@v0.0.0-20190131174352-fd058c7fbf22/pkg/transport/engine/mux.go (about)

     1  package engine
     2  
     3  import (
     4  	"github.com/gofunct/common/pkg/transport/api"
     5  	"github.com/pkg/errors"
     6  	"github.com/soheilhy/cmux"
     7  	"google.golang.org/grpc/grpclog"
     8  	"net"
     9  )
    10  
    11  // MuxServer wraps a connection multiplexer and a listener.
    12  type MuxServer struct {
    13  	mux cmux.CMux
    14  	lis net.Listener
    15  }
    16  
    17  // NewMuxServer creates MuxServer instance.
    18  func NewMuxServer(mux cmux.CMux, lis net.Listener) api.Interface {
    19  	return &MuxServer{
    20  		mux: mux,
    21  		lis: lis,
    22  	}
    23  }
    24  
    25  // Serve implements Server.Serve
    26  func (s *MuxServer) Serve(net.Listener) error {
    27  	grpclog.Info("mux is starting %s", s.lis.Addr())
    28  
    29  	err := s.mux.Serve()
    30  
    31  	grpclog.Infof("mux is closed: %v", err)
    32  
    33  	return errors.Wrap(err, "failed to serve cmux server")
    34  }
    35  
    36  // Shutdown implements Server.Shutdown
    37  func (s *MuxServer) Shutdown() {
    38  	err := s.lis.Close()
    39  	if err != nil {
    40  		grpclog.Errorf("failed to close cmux's listener: %v", err)
    41  	}
    42  }