code: func (sm *Manager) Get(ctx context.Context, id string) (Caller, error) {
  	// session prefix is used to identify vertexes with different contexts so
  	// they would not collide, but for lookup we don't need the prefix
  	if p := strings.SplitN(id, ":", 2); len(p) == 2 && len(p[1]) > 0 {
  		id = p[1]
  	}
  
  	ctx, cancel := context.WithCancel(ctx)
  	defer cancel()
  
  	go func() {
  		select {
  		case <-ctx.Done():
  			sm.updateCondition.Broadcast()
  		}
  	}()
  
  	var c *client
  
  	sm.mu.Lock()
  	for {
  		select {
  		case <-ctx.Done():
  			sm.mu.Unlock()
  			return nil, errors.Wrapf(ctx.Err(), "no active session for %s", id)
  		default:
  		}
  		var ok bool
  		c, ok = sm.sessions[id]
  		if !ok || c.closed() {
  			sm.updateCondition.Wait()
  			continue
  		}
  		sm.mu.Unlock()
  		break
  	}
  
  	return c, nil
  }
docs: // Get returns a session by ID