grpc: fix user data stream subscribe

This commit is contained in:
c9s 2022-04-15 00:13:19 +08:00
parent 84c34f1d50
commit 8b8cffbd06

View File

@ -25,9 +25,17 @@ type UserDataService struct {
} }
func (s *UserDataService) Subscribe(request *pb.UserDataRequest, server pb.UserDataService_SubscribeServer) error { func (s *UserDataService) Subscribe(request *pb.UserDataRequest, server pb.UserDataService_SubscribeServer) error {
streamPool := map[string]types.Stream{} sessionName := request.Session
for sessionName, session := range s.Environ.Sessions() {
if request.Session == sessionName { if len(sessionName) == 0 {
return fmt.Errorf("session name can not be empty")
}
session, ok := s.Environ.Session(sessionName)
if !ok {
return fmt.Errorf("session %s not found", sessionName)
}
userDataStream := session.Exchange.NewStream() userDataStream := session.Exchange.NewStream()
userDataStream.OnOrderUpdate(func(order types.Order) { userDataStream.OnOrderUpdate(func(order types.Order) {
err := server.Send(&pb.UserData{ err := server.Send(&pb.UserData{
@ -49,7 +57,8 @@ func (s *UserDataService) Subscribe(request *pb.UserDataRequest, server pb.UserD
log.WithError(err).Errorf("grpc: can not send user data") log.WithError(err).Errorf("grpc: can not send user data")
} }
}) })
userDataStream.OnBalanceUpdate(func(balances types.BalanceMap) {
balanceHandler := func(balances types.BalanceMap) {
err := server.Send(&pb.UserData{ err := server.Send(&pb.UserData{
Channel: pb.Channel_BALANCE, Channel: pb.Channel_BALANCE,
Event: pb.Event_UPDATE, Event: pb.Event_UPDATE,
@ -58,21 +67,17 @@ func (s *UserDataService) Subscribe(request *pb.UserDataRequest, server pb.UserD
if err != nil { if err != nil {
log.WithError(err).Errorf("grpc: can not send user data") log.WithError(err).Errorf("grpc: can not send user data")
} }
})
streamPool[ sessionName ] = userDataStream
} }
} userDataStream.OnBalanceUpdate(balanceHandler)
userDataStream.OnBalanceSnapshot(balanceHandler)
<-server.Context().Done()
defer func() { defer func() {
for _, stream := range streamPool { if err := userDataStream.Close(); err != nil {
if err := stream.Close(); err != nil {
log.WithError(err).Errorf("user data stream close error") log.WithError(err).Errorf("user data stream close error")
} }
}
}() }()
<-server.Context().Done()
return nil return nil
} }