diff --git a/network/context.go b/network/context.go index 9025f83a2271d63e2cb5b2530dd598db57f8772f..967feba70568c322a1b7db0b76c229079d08722b 100644 --- a/network/context.go +++ b/network/context.go @@ -12,8 +12,28 @@ var DialPeerTimeout = 60 * time.Second type noDialCtxKey struct{} type dialPeerTimeoutCtxKey struct{} +type forceDirectDialCtxKey struct{} var noDial = noDialCtxKey{} +var forceDirectDial = forceDirectDialCtxKey{} + +// EXPERIMENTAL +// WithForceDirectDial constructs a new context with an option that instructs the network +// to attempt to force a direct connection to a peer via a dial even if a proxied connection to it already exists. +func WithForceDirectDial(ctx context.Context, reason string) context.Context { + return context.WithValue(ctx, forceDirectDial, reason) +} + +// EXPERIMENTAL +// GetForceDirectDial returns true if the force direct dial option is set in the context. +func GetForceDirectDial(ctx context.Context) (forceDirect bool, reason string) { + v := ctx.Value(forceDirectDial) + if v != nil { + return true, v.(string) + } + + return false, "" +} // WithNoDial constructs a new context with an option that instructs the network // to not attempt a new dial when opening a stream.