github.com/cheng762/platon-go@v1.8.17-0.20190529111256-7deff2d7be26/p2p/simulations/adapters/ws.go (about)

     1  package adapters
     2  
     3  import (
     4  	"bufio"
     5  	"errors"
     6  	"io"
     7  	"regexp"
     8  	"strings"
     9  	"time"
    10  )
    11  
    12  // wsAddrPattern is a regex used to read the WebSocket address from the node's
    13  // log
    14  var wsAddrPattern = regexp.MustCompile(`ws://[\d.:]+`)
    15  
    16  func matchWSAddr(str string) (string, bool) {
    17  	if !strings.Contains(str, "WebSocket endpoint opened") {
    18  		return "", false
    19  	}
    20  
    21  	return wsAddrPattern.FindString(str), true
    22  }
    23  
    24  // findWSAddr scans through reader r, looking for the log entry with
    25  // WebSocket address information.
    26  func findWSAddr(r io.Reader, timeout time.Duration) (string, error) {
    27  	ch := make(chan string)
    28  
    29  	go func() {
    30  		s := bufio.NewScanner(r)
    31  		for s.Scan() {
    32  			addr, ok := matchWSAddr(s.Text())
    33  			if ok {
    34  				ch <- addr
    35  			}
    36  		}
    37  		close(ch)
    38  	}()
    39  
    40  	var wsAddr string
    41  	select {
    42  	case wsAddr = <-ch:
    43  		if wsAddr == "" {
    44  			return "", errors.New("empty result")
    45  		}
    46  	case <-time.After(timeout):
    47  		return "", errors.New("timed out")
    48  	}
    49  
    50  	return wsAddr, nil
    51  }