mirror of
https://github.com/yggdrasil-network/yggdrasil-go.git
synced 2025-08-24 16:05: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.updateStatus(peers);
|
||||
ui.updateSpeed(peers);
|
||||
$("peers").innerText = "";
|
||||
var regexStrip = /%[^\]]*/gm;
|
||||
peers.forEach(function (peer) {
|
||||
var row = $("peers").appendChild(document.createElement('div'));
|
||||
row.className = "overflow-ellipsis";
|
||||
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";
|
||||
row.append(peer.url.replace(regexStrip, ""));
|
||||
});
|
||||
if (peers) {
|
||||
var regexStrip = /%[^\]]*/gm;
|
||||
peers.forEach(function (peer) {
|
||||
var row = $("peers").appendChild(document.createElement('div'));
|
||||
row.className = "overflow-ellipsis";
|
||||
var flag = row.appendChild(document.createElement("span"));
|
||||
if (peer.multicast) flag.className = "fa fa-thin fa-share-nodes peer-connected-fl";
|
||||
else flag.className = "fi fi-" + ui.lookupCountryCodeByAddress(peer.remote) + " peer-connected-fl";
|
||||
row.append(peer.remote.replace(regexStrip, ""));
|
||||
});
|
||||
}
|
||||
};
|
||||
|
||||
ui.updateStatus = function (peers) {
|
||||
|
@ -350,13 +355,10 @@ ui.updateSpeed = function (peers) {
|
|||
|
||||
ui.updateConnectedPeers = function () {
|
||||
return ui.getConnectedPeers().then(function (peers) {
|
||||
ui.updateConnectedPeersHandler(peers);
|
||||
ui.updateStatus(peers);
|
||||
ui.updateSpeed(peers);
|
||||
return ui.updateConnectedPeersHandler(peers);
|
||||
}).catch(function (error) {
|
||||
ui.updateConnectedPeersHandler();
|
||||
$("peers").innerText = error.message;
|
||||
ui.updateStatus();
|
||||
ui.updateSpeed();
|
||||
});
|
||||
};
|
||||
|
||||
|
@ -397,7 +399,6 @@ function main() {
|
|||
ui.getAllPeers().then(function () {
|
||||
return ui.updateConnectedPeers();
|
||||
});
|
||||
setInterval(ui.updateConnectedPeers, 5000);
|
||||
|
||||
ui.updateSelfInfo();
|
||||
//setInterval(ui.updateSelfInfo, 5000);
|
||||
|
|
|
@ -285,18 +285,22 @@ ui.getConnectedPeers = () =>
|
|||
.then((response) => response.json())
|
||||
|
||||
ui.updateConnectedPeersHandler = (peers) => {
|
||||
ui.updateStatus(peers);
|
||||
ui.updateSpeed(peers);
|
||||
$("peers").innerText = "";
|
||||
const regexStrip = /%[^\]]*/gm;
|
||||
peers.forEach(peer => {
|
||||
let row = $("peers").appendChild(document.createElement('div'));
|
||||
row.className = "overflow-ellipsis"
|
||||
let 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";
|
||||
row.append(peer.url.replace(regexStrip, ""));
|
||||
});
|
||||
if(peers) {
|
||||
const regexStrip = /%[^\]]*/gm;
|
||||
peers.forEach(peer => {
|
||||
let row = $("peers").appendChild(document.createElement('div'));
|
||||
row.className = "overflow-ellipsis"
|
||||
let flag = row.appendChild(document.createElement("span"));
|
||||
if(peer.multicast)
|
||||
flag.className = "fa fa-thin fa-share-nodes peer-connected-fl";
|
||||
else
|
||||
flag.className = "fi fi-" + ui.lookupCountryCodeByAddress(peer.remote) + " peer-connected-fl";
|
||||
row.append(peer.remote.replace(regexStrip, ""));
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
ui.updateStatus = peers => {
|
||||
|
@ -332,14 +336,10 @@ ui.updateSpeed = peers => {
|
|||
|
||||
ui.updateConnectedPeers = () =>
|
||||
ui.getConnectedPeers()
|
||||
.then(peers => {ui.updateConnectedPeersHandler(peers);
|
||||
ui.updateStatus(peers);
|
||||
ui.updateSpeed(peers);
|
||||
})
|
||||
.then(peers => ui.updateConnectedPeersHandler(peers))
|
||||
.catch((error) => {
|
||||
ui.updateConnectedPeersHandler();
|
||||
$("peers").innerText = error.message;
|
||||
ui.updateStatus();
|
||||
ui.updateSpeed();
|
||||
});
|
||||
|
||||
ui.lookupCountryCodeByAddress = (address) => {
|
||||
|
@ -374,7 +374,6 @@ function main() {
|
|||
$("showAllPeersBtn").addEventListener("click", ui.showAllPeers);
|
||||
|
||||
ui.getAllPeers().then(() => ui.updateConnectedPeers());
|
||||
setInterval(ui.updateConnectedPeers, 5000);
|
||||
|
||||
ui.updateSelfInfo();
|
||||
//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/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 (
|
||||
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-20210104183010-2eb08e3e575f h1:p4VB7kIXpOQvVn1ZaTIVp+3vuYAXFe3OJEvjbUYJLaA=
|
||||
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/go.mod h1:rpXAuuHgyEJb6kXcXldlkOjU6y4x+YcASKKXJNUhh0Y=
|
||||
github.com/webview/webview v0.0.0-20221220082822-77e021440a0f h1:whomWpMJmyN9uHtIjBIE2jmjN8ZccngNh3kCg4G16FA=
|
||||
|
|
|
@ -13,6 +13,7 @@ import (
|
|||
iwt "github.com/Arceliar/ironwood/types"
|
||||
"github.com/Arceliar/phony"
|
||||
"github.com/gologme/log"
|
||||
signals "github.com/vorot93/golang-signals"
|
||||
|
||||
"github.com/RiV-chain/RiV-mesh/src/version"
|
||||
)
|
||||
|
@ -25,15 +26,16 @@ type Core struct {
|
|||
// guarantee that it will be covered by the mutex
|
||||
phony.Inbox
|
||||
*iwe.PacketConn
|
||||
ctx context.Context
|
||||
cancel context.CancelFunc
|
||||
secret ed25519.PrivateKey
|
||||
public ed25519.PublicKey
|
||||
links links
|
||||
proto protoHandler
|
||||
log Logger
|
||||
addPeerTimer *time.Timer
|
||||
config struct {
|
||||
ctx context.Context
|
||||
cancel context.CancelFunc
|
||||
secret ed25519.PrivateKey
|
||||
public ed25519.PublicKey
|
||||
links links
|
||||
proto protoHandler
|
||||
log Logger
|
||||
addPeerTimer *time.Timer
|
||||
PeersChangedSignal signals.Signal
|
||||
config struct {
|
||||
_peers map[Peer]*linkInfo // configurable after startup
|
||||
_listeners map[ListenAddress]struct{} // configurable after startup
|
||||
nodeinfo NodeInfo // immutable after startup
|
||||
|
|
|
@ -199,6 +199,9 @@ func (intf *link) handler(dial *linkDial) error {
|
|||
intf.links.core.log.Infof("Connected %s %s: %s, source %s",
|
||||
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)
|
||||
switch err {
|
||||
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",
|
||||
dir, strings.ToUpper(intf.info.linkType), remoteStr, localStr, err)
|
||||
}
|
||||
intf.links.core.PeersChangedSignal.Emit(nil)
|
||||
|
||||
if !intf.incoming && dial != nil {
|
||||
// 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) {
|
||||
a := &RestServer{
|
||||
RestServerCfg: cfg,
|
||||
serverEvents: make(chan ServerEvent),
|
||||
serverEvents: make(chan ServerEvent, 10),
|
||||
serverEventNextId: 0,
|
||||
}
|
||||
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/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
|
||||
}
|
||||
|
||||
|
@ -134,6 +146,7 @@ func (a *RestServer) apiSelfHandler(w http.ResponseWriter, r *http.Request) {
|
|||
b, err := json.Marshal(result)
|
||||
if err != nil {
|
||||
http.Error(w, err.Error(), http.StatusServiceUnavailable)
|
||||
return
|
||||
}
|
||||
fmt.Fprint(w, string(b[:]))
|
||||
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) {
|
||||
var handleDelete = func() error {
|
||||
err := a.Core.RemovePeers()
|
||||
|
@ -186,36 +229,10 @@ func (a *RestServer) apiPeersHandler(w http.ResponseWriter, r *http.Request) {
|
|||
switch r.Method {
|
||||
case "GET":
|
||||
w.Header().Add("Content-Type", "application/json")
|
||||
|
||||
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)
|
||||
b, err := a.prepareGetPeers()
|
||||
if err != nil {
|
||||
http.Error(w, err.Error(), http.StatusInternalServerError)
|
||||
return
|
||||
}
|
||||
fmt.Fprint(w, string(b[:]))
|
||||
case "POST":
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue