forked from cerc-io/plugeth
52 lines
953 B
Go
52 lines
953 B
Go
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
|
|
}
|