github.com/linapex/ethereum-dpos-chinese@v0.0.0-20190316121959-b78b3a4a1ece/p2p/simulations/adapters/ws.go (about)

     1  
     2  //<developer>
     3  //    <name>linapex 曹一峰</name>
     4  //    <email>linapex@163.com</email>
     5  //    <wx>superexc</wx>
     6  //    <qqgroup>128148617</qqgroup>
     7  //    <url>https://jsq.ink</url>
     8  //    <role>pku engineer</role>
     9  //    <date>2019-03-16 12:09:44</date>
    10  //</624342660945022976>
    11  
    12  package adapters
    13  
    14  import (
    15  	"bufio"
    16  	"errors"
    17  	"io"
    18  	"regexp"
    19  	"strings"
    20  	"time"
    21  )
    22  
    23  //wsaddrpattern是一个regex,用于从节点的
    24  //日志
    25  var wsAddrPattern = regexp.MustCompile(`ws://[\D::] +)
    26  
    27  func matchWSAddr(str string) (string, bool) {
    28  	if !strings.Contains(str, "WebSocket endpoint opened") {
    29  		return "", false
    30  	}
    31  
    32  	return wsAddrPattern.FindString(str), true
    33  }
    34  
    35  //findwsaddr通过读卡器r扫描,查找
    36  //WebSocket地址信息。
    37  func findWSAddr(r io.Reader, timeout time.Duration) (string, error) {
    38  	ch := make(chan string)
    39  
    40  	go func() {
    41  		s := bufio.NewScanner(r)
    42  		for s.Scan() {
    43  			addr, ok := matchWSAddr(s.Text())
    44  			if ok {
    45  				ch <- addr
    46  			}
    47  		}
    48  		close(ch)
    49  	}()
    50  
    51  	var wsAddr string
    52  	select {
    53  	case wsAddr = <-ch:
    54  		if wsAddr == "" {
    55  			return "", errors.New("empty result")
    56  		}
    57  	case <-time.After(timeout):
    58  		return "", errors.New("timed out")
    59  	}
    60  
    61  	return wsAddr, nil
    62  }
    63