/* * SPDX-License-Identifier: AGPL-3.0-only * Copyright (c) 2022-2023, daeuniverse Organization */ package netutils import ( "context" "net" ) type ContextDialer struct { Dialer net.Dialer } func (d *ContextDialer) DialContext(ctx context.Context, network, addr string) (c net.Conn, err error) { var done = make(chan struct{}) go func() { c, err = d.Dialer.Dial(network, addr) if err != nil { close(done) return } select { case <-ctx.Done(): _ = c.Close() default: close(done) } }() select { case <-ctx.Done(): return nil, ctx.Err() case <-done: return c, err } }