package comms import ( "fmt" "github.com/hashicorp/yamux" "io" "log" "net" ) type CommChannel struct { Peer net.Conn Session *yamux.Session } type Role int const ( Agent Role = iota ConvergeServer ) func NewCommChannel(role Role, wsConn io.ReadWriteCloser) (CommChannel, error) { var commChannel CommChannel switch role { case Agent: listener, err := yamux.Server(wsConn, nil) if err != nil { return CommChannel{}, err } commChannel = CommChannel{ Peer: nil, Session: listener, } case ConvergeServer: clientSession, err := yamux.Client(wsConn, nil) if err != nil { return CommChannel{}, err } commChannel = CommChannel{ Peer: nil, Session: clientSession, } default: panic(fmt.Errorf("Undefined role %d", role)) } // communication from Agent to ConvergeServer switch role { case Agent: conn, err := commChannel.Session.OpenStream() commChannel.Peer = conn if err != nil { return CommChannel{}, err } case ConvergeServer: conn, err := commChannel.Session.Accept() commChannel.Peer = conn if err != nil { return CommChannel{}, err } default: panic(fmt.Errorf("Undefined role %d", role)) } log.Println("Communication channel between agent and converge server established") return commChannel, nil }