code: func (e *EventListener) Subscribe(appID string, objectTypes []string, objectID string) (*EventSubscriber, error) {
  	e.subMtx.Lock()
  	defer e.subMtx.Unlock()
  	if e.IsClosed() {
  		return nil, errors.New("event listener closed")
  	}
  	s := &EventSubscriber{
  		Events:      make(chan *ct.Event),
  		l:           e,
  		queue:       make(chan *ct.Event, eventBufferSize),
  		stop:        make(chan struct{}),
  		appID:       appID,
  		objectTypes: objectTypes,
  		objectID:    objectID,
  	}
  	go s.loop()
  	if _, ok := e.subscribers[appID]; !ok {
  		e.subscribers[appID] = make(map[*EventSubscriber]struct{})
  	}
  	e.subscribers[appID][s] = struct{}{}
  	return s, nil
  }
docs: // Subscribe creates and returns an EventSubscriber for the given app, type and object.
  // Using an empty string for appID subscribes to all apps