mirror of
https://github.com/yggdrasil-network/yggdrasil-go.git
synced 2025-08-25 08:25:07 +03:00
get peers update moved to sse
This commit is contained in:
parent
b501455e2e
commit
399ad486f5
7 changed files with 99 additions and 71 deletions
|
@ -298,15 +298,20 @@ ui.getConnectedPeers = function () {
|
||||||
};
|
};
|
||||||
|
|
||||||
ui.updateConnectedPeersHandler = function (peers) {
|
ui.updateConnectedPeersHandler = function (peers) {
|
||||||
|
ui.updateStatus(peers);
|
||||||
|
ui.updateSpeed(peers);
|
||||||
$("peers").innerText = "";
|
$("peers").innerText = "";
|
||||||
|
if (peers) {
|
||||||
var regexStrip = /%[^\]]*/gm;
|
var regexStrip = /%[^\]]*/gm;
|
||||||
peers.forEach(function (peer) {
|
peers.forEach(function (peer) {
|
||||||
var row = $("peers").appendChild(document.createElement('div'));
|
var row = $("peers").appendChild(document.createElement('div'));
|
||||||
row.className = "overflow-ellipsis";
|
row.className = "overflow-ellipsis";
|
||||||
var flag = row.appendChild(document.createElement("span"));
|
var flag = row.appendChild(document.createElement("span"));
|
||||||
if (peer.isMulticast) flag.className = "fa fa-thin fa-share-nodes peer-connected-fl";else flag.className = "fi fi-" + ui.lookupCountryCodeByAddress(peer.url) + " peer-connected-fl";
|
if (peer.multicast) flag.className = "fa fa-thin fa-share-nodes peer-connected-fl";
|
||||||
row.append(peer.url.replace(regexStrip, ""));
|
else flag.className = "fi fi-" + ui.lookupCountryCodeByAddress(peer.remote) + " peer-connected-fl";
|
||||||
|
row.append(peer.remote.replace(regexStrip, ""));
|
||||||
});
|
});
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
ui.updateStatus = function (peers) {
|
ui.updateStatus = function (peers) {
|
||||||
|
@ -350,13 +355,10 @@ ui.updateSpeed = function (peers) {
|
||||||
|
|
||||||
ui.updateConnectedPeers = function () {
|
ui.updateConnectedPeers = function () {
|
||||||
return ui.getConnectedPeers().then(function (peers) {
|
return ui.getConnectedPeers().then(function (peers) {
|
||||||
ui.updateConnectedPeersHandler(peers);
|
return ui.updateConnectedPeersHandler(peers);
|
||||||
ui.updateStatus(peers);
|
|
||||||
ui.updateSpeed(peers);
|
|
||||||
}).catch(function (error) {
|
}).catch(function (error) {
|
||||||
|
ui.updateConnectedPeersHandler();
|
||||||
$("peers").innerText = error.message;
|
$("peers").innerText = error.message;
|
||||||
ui.updateStatus();
|
|
||||||
ui.updateSpeed();
|
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -397,7 +399,6 @@ function main() {
|
||||||
ui.getAllPeers().then(function () {
|
ui.getAllPeers().then(function () {
|
||||||
return ui.updateConnectedPeers();
|
return ui.updateConnectedPeers();
|
||||||
});
|
});
|
||||||
setInterval(ui.updateConnectedPeers, 5000);
|
|
||||||
|
|
||||||
ui.updateSelfInfo();
|
ui.updateSelfInfo();
|
||||||
//setInterval(ui.updateSelfInfo, 5000);
|
//setInterval(ui.updateSelfInfo, 5000);
|
||||||
|
|
|
@ -285,19 +285,23 @@ ui.getConnectedPeers = () =>
|
||||||
.then((response) => response.json())
|
.then((response) => response.json())
|
||||||
|
|
||||||
ui.updateConnectedPeersHandler = (peers) => {
|
ui.updateConnectedPeersHandler = (peers) => {
|
||||||
|
ui.updateStatus(peers);
|
||||||
|
ui.updateSpeed(peers);
|
||||||
$("peers").innerText = "";
|
$("peers").innerText = "";
|
||||||
|
if(peers) {
|
||||||
const regexStrip = /%[^\]]*/gm;
|
const regexStrip = /%[^\]]*/gm;
|
||||||
peers.forEach(peer => {
|
peers.forEach(peer => {
|
||||||
let row = $("peers").appendChild(document.createElement('div'));
|
let row = $("peers").appendChild(document.createElement('div'));
|
||||||
row.className = "overflow-ellipsis"
|
row.className = "overflow-ellipsis"
|
||||||
let flag = row.appendChild(document.createElement("span"));
|
let flag = row.appendChild(document.createElement("span"));
|
||||||
if(peer.isMulticast)
|
if(peer.multicast)
|
||||||
flag.className = "fa fa-thin fa-share-nodes peer-connected-fl";
|
flag.className = "fa fa-thin fa-share-nodes peer-connected-fl";
|
||||||
else
|
else
|
||||||
flag.className = "fi fi-" + ui.lookupCountryCodeByAddress(peer.url) + " peer-connected-fl";
|
flag.className = "fi fi-" + ui.lookupCountryCodeByAddress(peer.remote) + " peer-connected-fl";
|
||||||
row.append(peer.url.replace(regexStrip, ""));
|
row.append(peer.remote.replace(regexStrip, ""));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
ui.updateStatus = peers => {
|
ui.updateStatus = peers => {
|
||||||
let status = "st-error";
|
let status = "st-error";
|
||||||
|
@ -332,14 +336,10 @@ ui.updateSpeed = peers => {
|
||||||
|
|
||||||
ui.updateConnectedPeers = () =>
|
ui.updateConnectedPeers = () =>
|
||||||
ui.getConnectedPeers()
|
ui.getConnectedPeers()
|
||||||
.then(peers => {ui.updateConnectedPeersHandler(peers);
|
.then(peers => ui.updateConnectedPeersHandler(peers))
|
||||||
ui.updateStatus(peers);
|
|
||||||
ui.updateSpeed(peers);
|
|
||||||
})
|
|
||||||
.catch((error) => {
|
.catch((error) => {
|
||||||
|
ui.updateConnectedPeersHandler();
|
||||||
$("peers").innerText = error.message;
|
$("peers").innerText = error.message;
|
||||||
ui.updateStatus();
|
|
||||||
ui.updateSpeed();
|
|
||||||
});
|
});
|
||||||
|
|
||||||
ui.lookupCountryCodeByAddress = (address) => {
|
ui.lookupCountryCodeByAddress = (address) => {
|
||||||
|
@ -374,7 +374,6 @@ function main() {
|
||||||
$("showAllPeersBtn").addEventListener("click", ui.showAllPeers);
|
$("showAllPeersBtn").addEventListener("click", ui.showAllPeers);
|
||||||
|
|
||||||
ui.getAllPeers().then(() => ui.updateConnectedPeers());
|
ui.getAllPeers().then(() => ui.updateConnectedPeers());
|
||||||
setInterval(ui.updateConnectedPeers, 5000);
|
|
||||||
|
|
||||||
ui.updateSelfInfo();
|
ui.updateSelfInfo();
|
||||||
//setInterval(ui.updateSelfInfo, 5000);
|
//setInterval(ui.updateSelfInfo, 5000);
|
||||||
|
|
5
go.mod
5
go.mod
|
@ -28,7 +28,10 @@ require (
|
||||||
|
|
||||||
require github.com/webview/webview v0.0.0-20221220082822-77e021440a0f
|
require github.com/webview/webview v0.0.0-20221220082822-77e021440a0f
|
||||||
|
|
||||||
require github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e // indirect
|
require (
|
||||||
|
github.com/jchv/go-winloader v0.0.0-20210711035445-715c2860da7e // indirect
|
||||||
|
github.com/vorot93/golang-signals v0.0.0-20170221070717-d9e83421ce45 // indirect
|
||||||
|
)
|
||||||
|
|
||||||
require (
|
require (
|
||||||
github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815
|
github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815
|
||||||
|
|
2
go.sum
2
go.sum
|
@ -98,6 +98,8 @@ github.com/vishvananda/netlink v1.1.0/go.mod h1:cTgwzPIzzgDAYoQrMm0EdrjRUBkTqKYp
|
||||||
github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU=
|
github.com/vishvananda/netns v0.0.0-20191106174202-0a2b9b5464df/go.mod h1:JP3t17pCcGlemwknint6hfoeCVQrEMVwxRLRjXpq+BU=
|
||||||
github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f h1:p4VB7kIXpOQvVn1ZaTIVp+3vuYAXFe3OJEvjbUYJLaA=
|
github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f h1:p4VB7kIXpOQvVn1ZaTIVp+3vuYAXFe3OJEvjbUYJLaA=
|
||||||
github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0=
|
github.com/vishvananda/netns v0.0.0-20210104183010-2eb08e3e575f/go.mod h1:DD4vA1DwXk04H54A1oHXtwZmA0grkVMdPxx/VGLCah0=
|
||||||
|
github.com/vorot93/golang-signals v0.0.0-20170221070717-d9e83421ce45 h1:hB/hkjwf3BQnZE6Wk3SBwMJz0NqnGdwXoNzHVSYb0N0=
|
||||||
|
github.com/vorot93/golang-signals v0.0.0-20170221070717-d9e83421ce45/go.mod h1:dfjQkJsG5auteUbnfLIcU72Y/z8tj7DuW9fik8f2Zn0=
|
||||||
github.com/webview/webview v0.0.0-20221218140943-9db4b8c3e9af h1:QO77Qt3ucuL5l8tFIAMXrLaDx4rYI9Nz89x+nrJwYJo=
|
github.com/webview/webview v0.0.0-20221218140943-9db4b8c3e9af h1:QO77Qt3ucuL5l8tFIAMXrLaDx4rYI9Nz89x+nrJwYJo=
|
||||||
github.com/webview/webview v0.0.0-20221218140943-9db4b8c3e9af/go.mod h1:rpXAuuHgyEJb6kXcXldlkOjU6y4x+YcASKKXJNUhh0Y=
|
github.com/webview/webview v0.0.0-20221218140943-9db4b8c3e9af/go.mod h1:rpXAuuHgyEJb6kXcXldlkOjU6y4x+YcASKKXJNUhh0Y=
|
||||||
github.com/webview/webview v0.0.0-20221220082822-77e021440a0f h1:whomWpMJmyN9uHtIjBIE2jmjN8ZccngNh3kCg4G16FA=
|
github.com/webview/webview v0.0.0-20221220082822-77e021440a0f h1:whomWpMJmyN9uHtIjBIE2jmjN8ZccngNh3kCg4G16FA=
|
||||||
|
|
|
@ -13,6 +13,7 @@ import (
|
||||||
iwt "github.com/Arceliar/ironwood/types"
|
iwt "github.com/Arceliar/ironwood/types"
|
||||||
"github.com/Arceliar/phony"
|
"github.com/Arceliar/phony"
|
||||||
"github.com/gologme/log"
|
"github.com/gologme/log"
|
||||||
|
signals "github.com/vorot93/golang-signals"
|
||||||
|
|
||||||
"github.com/RiV-chain/RiV-mesh/src/version"
|
"github.com/RiV-chain/RiV-mesh/src/version"
|
||||||
)
|
)
|
||||||
|
@ -33,6 +34,7 @@ type Core struct {
|
||||||
proto protoHandler
|
proto protoHandler
|
||||||
log Logger
|
log Logger
|
||||||
addPeerTimer *time.Timer
|
addPeerTimer *time.Timer
|
||||||
|
PeersChangedSignal signals.Signal
|
||||||
config struct {
|
config struct {
|
||||||
_peers map[Peer]*linkInfo // configurable after startup
|
_peers map[Peer]*linkInfo // configurable after startup
|
||||||
_listeners map[ListenAddress]struct{} // configurable after startup
|
_listeners map[ListenAddress]struct{} // configurable after startup
|
||||||
|
|
|
@ -199,6 +199,9 @@ func (intf *link) handler(dial *linkDial) error {
|
||||||
intf.links.core.log.Infof("Connected %s %s: %s, source %s",
|
intf.links.core.log.Infof("Connected %s %s: %s, source %s",
|
||||||
dir, strings.ToUpper(intf.info.linkType), remoteStr, localStr)
|
dir, strings.ToUpper(intf.info.linkType), remoteStr, localStr)
|
||||||
|
|
||||||
|
time.AfterFunc(time.Millisecond*500, func() {
|
||||||
|
intf.links.core.PeersChangedSignal.Emit(nil)
|
||||||
|
})
|
||||||
err = intf.links.core.HandleConn(meta.key, intf.conn, intf.options.priority)
|
err = intf.links.core.HandleConn(meta.key, intf.conn, intf.options.priority)
|
||||||
switch err {
|
switch err {
|
||||||
case io.EOF, net.ErrClosed, nil:
|
case io.EOF, net.ErrClosed, nil:
|
||||||
|
@ -208,6 +211,7 @@ func (intf *link) handler(dial *linkDial) error {
|
||||||
intf.links.core.log.Infof("Disconnected %s %s: %s, source %s; error: %s",
|
intf.links.core.log.Infof("Disconnected %s %s: %s, source %s; error: %s",
|
||||||
dir, strings.ToUpper(intf.info.linkType), remoteStr, localStr, err)
|
dir, strings.ToUpper(intf.info.linkType), remoteStr, localStr, err)
|
||||||
}
|
}
|
||||||
|
intf.links.core.PeersChangedSignal.Emit(nil)
|
||||||
|
|
||||||
if !intf.incoming && dial != nil {
|
if !intf.incoming && dial != nil {
|
||||||
// The connection was one that we dialled, so wait a second and try to
|
// The connection was one that we dialled, so wait a second and try to
|
||||||
|
|
|
@ -46,7 +46,7 @@ type RestServer struct {
|
||||||
func NewRestServer(cfg RestServerCfg) (*RestServer, error) {
|
func NewRestServer(cfg RestServerCfg) (*RestServer, error) {
|
||||||
a := &RestServer{
|
a := &RestServer{
|
||||||
RestServerCfg: cfg,
|
RestServerCfg: cfg,
|
||||||
serverEvents: make(chan ServerEvent),
|
serverEvents: make(chan ServerEvent, 10),
|
||||||
serverEventNextId: 0,
|
serverEventNextId: 0,
|
||||||
}
|
}
|
||||||
if cfg.ListenAddress == "none" || cfg.ListenAddress == "" {
|
if cfg.ListenAddress == "none" || cfg.ListenAddress == "" {
|
||||||
|
@ -85,6 +85,18 @@ func NewRestServer(cfg RestServerCfg) (*RestServer, error) {
|
||||||
http.HandleFunc("/api/ping", a.apiPingHandler)
|
http.HandleFunc("/api/ping", a.apiPingHandler)
|
||||||
http.HandleFunc("/api/sse", a.apiSseHandler)
|
http.HandleFunc("/api/sse", a.apiSseHandler)
|
||||||
|
|
||||||
|
var _ = a.Core.PeersChangedSignal.Connect(func(data interface{}) {
|
||||||
|
b, err := a.prepareGetPeers()
|
||||||
|
if err != nil {
|
||||||
|
a.Log.Errorf("get peers failed: %w", err)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
select {
|
||||||
|
case a.serverEvents <- ServerEvent{Event: "peers", Data: string(b)}:
|
||||||
|
default:
|
||||||
|
}
|
||||||
|
})
|
||||||
return a, nil
|
return a, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -134,6 +146,7 @@ func (a *RestServer) apiSelfHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
b, err := json.Marshal(result)
|
b, err := json.Marshal(result)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
http.Error(w, err.Error(), http.StatusServiceUnavailable)
|
http.Error(w, err.Error(), http.StatusServiceUnavailable)
|
||||||
|
return
|
||||||
}
|
}
|
||||||
fmt.Fprint(w, string(b[:]))
|
fmt.Fprint(w, string(b[:]))
|
||||||
default:
|
default:
|
||||||
|
@ -141,6 +154,36 @@ func (a *RestServer) apiSelfHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (a *RestServer) prepareGetPeers() ([]byte, error) {
|
||||||
|
peers := a.Core.GetPeers()
|
||||||
|
response := make([]map[string]interface{}, 0, len(peers))
|
||||||
|
for _, p := range peers {
|
||||||
|
addr := a.Core.AddrForKey(p.Key)
|
||||||
|
response = append(response, map[string]interface{}{
|
||||||
|
"address": net.IP(addr[:]).String(),
|
||||||
|
"key": hex.EncodeToString(p.Key),
|
||||||
|
"port": p.Port,
|
||||||
|
"priority": uint64(p.Priority), // can't be uint8 thanks to gobind
|
||||||
|
"coords": p.Coords,
|
||||||
|
"remote": p.Remote,
|
||||||
|
"bytes_recvd": p.RXBytes,
|
||||||
|
"bytes_sent": p.TXBytes,
|
||||||
|
"uptime": p.Uptime.Seconds(),
|
||||||
|
"multicast": strings.Contains(p.Remote, "[fe80::"),
|
||||||
|
})
|
||||||
|
}
|
||||||
|
sort.Slice(response, func(i, j int) bool {
|
||||||
|
if !response[i]["multicast"].(bool) && response[j]["multicast"].(bool) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
if response[i]["priority"].(uint64) < response[j]["priority"].(uint64) {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
return response[i]["port"].(uint64) < response[j]["port"].(uint64)
|
||||||
|
})
|
||||||
|
return json.Marshal(response)
|
||||||
|
}
|
||||||
|
|
||||||
func (a *RestServer) apiPeersHandler(w http.ResponseWriter, r *http.Request) {
|
func (a *RestServer) apiPeersHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
var handleDelete = func() error {
|
var handleDelete = func() error {
|
||||||
err := a.Core.RemovePeers()
|
err := a.Core.RemovePeers()
|
||||||
|
@ -186,36 +229,10 @@ func (a *RestServer) apiPeersHandler(w http.ResponseWriter, r *http.Request) {
|
||||||
switch r.Method {
|
switch r.Method {
|
||||||
case "GET":
|
case "GET":
|
||||||
w.Header().Add("Content-Type", "application/json")
|
w.Header().Add("Content-Type", "application/json")
|
||||||
|
b, err := a.prepareGetPeers()
|
||||||
peers := a.Core.GetPeers()
|
|
||||||
response := make([]map[string]interface{}, 0, len(peers))
|
|
||||||
for _, p := range peers {
|
|
||||||
addr := a.Core.AddrForKey(p.Key)
|
|
||||||
response = append(response, map[string]interface{}{
|
|
||||||
"address": net.IP(addr[:]).String(),
|
|
||||||
"key": hex.EncodeToString(p.Key),
|
|
||||||
"port": p.Port,
|
|
||||||
"priority": uint64(p.Priority), // can't be uint8 thanks to gobind
|
|
||||||
"coords": p.Coords,
|
|
||||||
"remote": p.Remote,
|
|
||||||
"bytes_recvd": p.RXBytes,
|
|
||||||
"bytes_sent": p.TXBytes,
|
|
||||||
"uptime": p.Uptime.Seconds(),
|
|
||||||
"mulicast": strings.Contains(p.Remote, "[fe80::"),
|
|
||||||
})
|
|
||||||
}
|
|
||||||
sort.Slice(response, func(i, j int) bool {
|
|
||||||
if !response[i]["mulicast"].(bool) && response[j]["mulicast"].(bool) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
if response[i]["priority"].(uint64) < response[j]["priority"].(uint64) {
|
|
||||||
return true
|
|
||||||
}
|
|
||||||
return response[i]["port"].(uint64) < response[j]["port"].(uint64)
|
|
||||||
})
|
|
||||||
b, err := json.Marshal(response)
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
http.Error(w, err.Error(), http.StatusInternalServerError)
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||||
|
return
|
||||||
}
|
}
|
||||||
fmt.Fprint(w, string(b[:]))
|
fmt.Fprint(w, string(b[:]))
|
||||||
case "POST":
|
case "POST":
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue