diff --git a/network/context.go b/network/context.go index 0eed3cd11e8b8e913ddd17901faa61dfca2e3ca2..36a4af43d075c8076a75aac5a3d9742bf79f48c1 100644 --- a/network/context.go +++ b/network/context.go @@ -14,10 +14,12 @@ type noDialCtxKey struct{} type dialPeerTimeoutCtxKey struct{} type forceDirectDialCtxKey struct{} type useTransientCtxKey struct{} +type simConnectCtxKey struct{} var noDial = noDialCtxKey{} var forceDirectDial = forceDirectDialCtxKey{} var useTransient = useTransientCtxKey{} +var simConnect = simConnectCtxKey{} // EXPERIMENTAL // WithForceDirectDial constructs a new context with an option that instructs the network @@ -37,6 +39,24 @@ func GetForceDirectDial(ctx context.Context) (forceDirect bool, reason string) { return false, "" } +// EXPERIMENTAL +// WithSimultaneousConnect constructs a new context with an option that instructs the transport +// to apply hole punching logic where applicable. +func WithSimultaneousConnect(ctx context.Context, reason string) context.Context { + return context.WithValue(ctx, simConnect, reason) +} + +// EXPERIMENTAL +// GetSimultaneousConnect returns true if the simultaneous connect option is set in the context +func GetSimultaneousConnect(ctx context.Context) (simconnect bool, reason string) { + v := ctx.Value(simConnect) + 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. func WithNoDial(ctx context.Context, reason string) context.Context {