package rpc import ( "net" "gitlink.org.cn/cloudream/common/pkgs/async" "google.golang.org/grpc" ) type ServerEventChan = async.UnboundChannel[RPCServerEvent] type RPCServerEvent interface { IsRPCServerEvent() } type ExitEvent struct { RPCServerEvent Err error } type Config struct { Listen string `json:"listen"` } type ServerBase struct { cfg Config grpcSvr *grpc.Server srvImpl any svcDesc *grpc.ServiceDesc } func NewServerBase(cfg Config, srvImpl any, svcDesc *grpc.ServiceDesc) *ServerBase { return &ServerBase{ cfg: cfg, srvImpl: srvImpl, svcDesc: svcDesc, } } func (s *ServerBase) Start() *ServerEventChan { ch := async.NewUnboundChannel[RPCServerEvent]() go func() { lis, err := net.Listen("tcp", s.cfg.Listen) if err != nil { ch.Send(&ExitEvent{Err: err}) return } s.grpcSvr = grpc.NewServer() s.grpcSvr.RegisterService(s.svcDesc, s.srvImpl) err = s.grpcSvr.Serve(lis) ch.Send(&ExitEvent{Err: err}) }() return ch } func (s *ServerBase) Stop() { if s.grpcSvr != nil { s.grpcSvr.Stop() } }