nimona/go-nimona

View on GitHub
transport.go

Summary

Maintainability
A
0 mins
Test Coverage
package nimona

import (
    "context"
    "net"
)

type (
    // Transport is a combination of a Dialer and a Listener
    Transport interface {
        Dialer
        Listen() (net.Listener, error)
    }
    // Dialer is an interface for dialing a connection
    Dialer interface {
        Dial(context.Context, PeerAddr) (net.Conn, error)
    }
    // Listener is an interface for listening for connections
    Listener interface {
        Accept() (net.Conn, error)
        Close() error
        PeerAddr() PeerAddr
    }
)

type listener struct {
    net.Listener
    addr PeerAddr
}

func (l *listener) Accept() (net.Conn, error) {
    conn, err := l.Listener.Accept()
    if err != nil {
        return nil, err
    }
    return conn, nil
}

func (l *listener) Close() error {
    return l.Listener.Close()
}

func (l *listener) PeerAddr() PeerAddr {
    return l.addr
}

func wrapListener(l net.Listener, transport, publicHost string, publicKey PublicKey) Listener {
    host := l.Addr().String()
    if publicHost != "" {
        _, port, _ := net.SplitHostPort(host)
        host = net.JoinHostPort(publicHost, port)
    }
    return &listener{
        Listener: l,
        addr: PeerAddr{
            Transport: transport,
            Address:   host,
            PublicKey: publicKey,
        },
    }
}