code: func NewRelay(ctx context.Context, h host.Host, upgrader *tptu.Upgrader, opts ...RelayOpt) (*Relay, error) {
  	r := &Relay{
  		upgrader: upgrader,
  		host:     h,
  		ctx:      ctx,
  		self:     h.ID(),
  		incoming: make(chan *Conn),
  		relays:   make(map[peer.ID]struct{}),
  		liveHops: make(map[peer.ID]map[peer.ID]int),
  	}
  
  	for _, opt := range opts {
  		switch opt {
  		case OptActive:
  			r.active = true
  		case OptHop:
  			r.hop = true
  		case OptDiscovery:
  			r.discovery = true
  		default:
  			return nil, fmt.Errorf("unrecognized option: %d", opt)
  		}
  	}
  
  	h.SetStreamHandler(ProtoID, r.handleNewStream)
  
  	if r.discovery {
  		h.Network().Notify(r.notifiee())
  	}
  
  	return r, nil
  }
docs: // NewRelay constructs a new relay.