aboutsummaryrefslogblamecommitdiffstats
path: root/p2p/simulations/adapters/ws.go
blob: 979a21709e49f29050766efc84fbe57818053750 (plain) (tree)


















































                                                                              
package adapters

import (
    "bufio"
    "errors"
    "io"
    "regexp"
    "strings"
    "time"
)

// wsAddrPattern is a regex used to read the WebSocket address from the node's
// log
var wsAddrPattern = regexp.MustCompile(`ws://[\d.:]+`)

func matchWSAddr(str string) (string, bool) {
    if !strings.Contains(str, "WebSocket endpoint opened") {
        return "", false
    }

    return wsAddrPattern.FindString(str), true
}

// findWSAddr scans through reader r, looking for the log entry with
// WebSocket address information.
func findWSAddr(r io.Reader, timeout time.Duration) (string, error) {
    ch := make(chan string)

    go func() {
        s := bufio.NewScanner(r)
        for s.Scan() {
            addr, ok := matchWSAddr(s.Text())
            if ok {
                ch <- addr
            }
        }
        close(ch)
    }()

    var wsAddr string
    select {
    case wsAddr = <-ch:
        if wsAddr == "" {
            return "", errors.New("empty result")
        }
    case <-time.After(timeout):
        return "", errors.New("timed out")
    }

    return wsAddr, nil
}