package server import ( "common/log" "common/proto/gen/common" "common/proto/gen/grpc_pb" "context" "scene/instance" "sync" ) func (s *Server) Enter(ctx context.Context, req *grpc_pb.EnterReq) (*grpc_pb.EnterResp, error) { var i *instance.Instance if len(instance.Mgr.GetAll()) == 0 { i = instance.NewScene(s.SID, int(req.InstanceID)) i.Start(s.EtcdTTL) } else { for _, v := range instance.Mgr.GetAll() { i = v break } } i.EventIn <- req return &grpc_pb.EnterResp{ SceneSID: s.SID, UniqueNo: i.UniqueNo, }, nil } func (s *Server) Action(server grpc_pb.Scene_ActionServer) error { wg := &sync.WaitGroup{} wg.Add(1) go func() { defer wg.Done() defer func() { if err := recover(); err != nil { log.Errorf("Action panic: %v", err) } }() for { if args, err := server.Recv(); err != nil { return } else { if ins := instance.Mgr.GetByUniqueNo(args.UniqueNo); ins != nil { select { case ins.EventIn <- args: default: log.Warnf("instance event in full: %v, %v", ins.InstanceID, ins.UniqueNo) } } } } }() wg.Wait() return server.SendAndClose(&common.Empty{}) }