code: func (g *GRPCServer) WatchEvents(watch *proto.Watch, stream proto.AuthService_WatchEventsServer) error {
  	auth, err := g.authenticate(stream.Context())
  	if err != nil {
  		return trail.ToGRPC(err)
  	}
  	servicesWatch := services.Watch{
  		Name: auth.User.GetName(),
  	}
  	for _, kind := range watch.Kinds {
  		servicesWatch.Kinds = append(servicesWatch.Kinds, services.WatchKind{
  			Name:        kind.Name,
  			Kind:        kind.Kind,
  			LoadSecrets: kind.LoadSecrets,
  		})
  	}
  	watcher, err := auth.NewWatcher(stream.Context(), servicesWatch)
  	if err != nil {
  		return trail.ToGRPC(err)
  	}
  	defer watcher.Close()
  
  	for {
  		select {
  		case <-stream.Context().Done():
  			return nil
  		case <-watcher.Done():
  			return trail.ToGRPC(watcher.Error())
  		case event := <-watcher.Events():
  			out, err := eventToGRPC(event)
  			if err != nil {
  				return trail.ToGRPC(err)
  			}
  			if err := stream.Send(out); err != nil {
  				return trail.ToGRPC(err)
  			}
  		}
  	}
  }
docs: // WatchEvents returns a new stream of cluster events