diff --git a/database/database.go b/database/database.go index 7118e50..73e4aaf 100644 --- a/database/database.go +++ b/database/database.go @@ -12,6 +12,7 @@ import ( "berty.tech/go-orbit-db/stores" "berty.tech/go-orbit-db/stores/documentstore" config "github.com/ipfs/go-ipfs-config" + "github.com/ipfs/go-ipfs/core" icore "github.com/ipfs/interface-go-ipfs-core" "github.com/libp2p/go-libp2p-core/peer" "github.com/mitchellh/mapstructure" @@ -27,7 +28,10 @@ type Database struct { Cache string Logger *zap.Logger - IPFSNode icore.CoreAPI + + IPFSNode *core.IpfsNode + IPFSCoreAPI icore.CoreAPI + OrbitDB orbitdb.OrbitDB Store orbitdb.DocumentStore StoreEventChan <-chan events.Event @@ -36,7 +40,7 @@ type Database struct { func (db *Database) init() (error) { var err error - db.OrbitDB, err = orbitdb.NewOrbitDB(db.ctx, db.IPFSNode, &orbitdb.NewOrbitDBOptions{ + db.OrbitDB, err = orbitdb.NewOrbitDB(db.ctx, db.IPFSCoreAPI, &orbitdb.NewOrbitDBOptions{ Directory: &db.Cache, Logger: db.Logger, }) @@ -88,7 +92,7 @@ func(db *Database) connectToPeers() error { for _, peerInfo := range peerInfos { go func(peerInfo *peer.AddrInfo) { defer wg.Done() - err := db.IPFSNode.Swarm().Connect(db.ctx, *peerInfo) + err := db.IPFSCoreAPI.Swarm().Connect(db.ctx, *peerInfo) if err != nil { db.Logger.Debug("failed to connect", zap.String("peerID", peerInfo.ID.String()), zap.Error(err)) } else { @@ -123,7 +127,7 @@ func NewDatabase( return nil, err } - db.IPFSNode, err = createNode(ctx, defaultPath) + db.IPFSNode, db.IPFSCoreAPI, err = createNode(ctx, defaultPath) if err != nil { return nil, err } diff --git a/database/helpers.go b/database/helpers.go index 0cc0122..489c61d 100644 --- a/database/helpers.go +++ b/database/helpers.go @@ -33,10 +33,10 @@ func setupPlugins(path string) error { return nil } -func createNode(ctx context.Context, repoPath string) (icore.CoreAPI, error) { +func createNode(ctx context.Context, repoPath string) (*core.IpfsNode, icore.CoreAPI, error) { repo, err := fsrepo.Open(repoPath) if err != nil { - return nil, err + return nil, nil, err } nodeOptions := &core.BuildCfg{ @@ -50,10 +50,15 @@ func createNode(ctx context.Context, repoPath string) (icore.CoreAPI, error) { node, err := core.NewNode(ctx, nodeOptions) if err != nil { - return nil, err + return nil, nil, err } - return coreapi.NewCoreAPI(node) + coreAPI, err := coreapi.NewCoreAPI(node) + if err != nil { + return nil, nil, err + } + + return node, coreAPI, nil } func getUnixfsNode(path string) (files.Node, error) { diff --git a/superhighway84.go b/superhighway84.go index b6c7087..8b22de7 100644 --- a/superhighway84.go +++ b/superhighway84.go @@ -77,6 +77,19 @@ func main() { } + go func() { + peers := 0 + for { + bw := db.IPFSNode.Reporter.GetBandwidthTotals() + connections, err := db.IPFSCoreAPI.Swarm().Peers(context.Background()) + if err == nil { + peers = len(connections) + } + TUI.SetStats(int64(peers), int64(bw.RateIn), int64(bw.RateOut), bw.TotalIn , bw.TotalOut) + time.Sleep(time.Second * 5) + } + }() + // ======================== TESTING =============================== // var articles []models.Article // mockGroups := []string{ diff --git a/tui/mainscreen.go b/tui/mainscreen.go index 536da7e..a544aea 100644 --- a/tui/mainscreen.go +++ b/tui/mainscreen.go @@ -12,11 +12,11 @@ import ( ) var HEADER_LOGO = -` _ _ _ __ ____ __ _ __ ___ ____ - / / / // / __/_ _____ ___ ____/ / (_)__ _/ / _ _____ ___ __( _ )/ / / - _\ _\_\_\\_\ \/ // / _ \/ -_) __/ _ \/ / _ \/ _ \ |/|/ / _ \/ // / _ /_ _/ - / / / // /___/\_,_/ .__/\__/_/ /_//_/_/\_, /_//_/__,__/\_,_/\_, /\___/ /_/ - /_/ /___/ /___/ +`[white] _ _ _ __ [-][hotpink]____ __ _ __ ___ ____[-] [grey]⦿ %d PEERS[-] +[teal] / / / // [-][hotpink]/ __/_ _____ ___ ____/ / (_)__ _/ / _ _____ ___ __( _ )/ / /[-] [yellow]▲ %.2f[-] [grey]MB/s[-] +[teal] _\ _\_\_\\_[-][fuchsia]\ \/ // / _ \/ -_) __/ _ \/ / _ \/ _ \ |/|/ / _ \/ // / _ /_ _/[-] [teal]▼ %.2f[-] [grey]MB/s[-] +[darkcyan] / / / // [-][hotpink]/___/\_,_/ .__/\__/_/ /_//_/_/\_, /_//_/__,__/\_,_/\_, /\___/ /_/[-] [yellow]▲ %.2f[-] [grey]MB[-] +[hotpink] /_/ /___/ /___/[-] [teal]▼ %.2f[-] [grey]MB[-] ` type GroupMapEntry struct { @@ -76,7 +76,8 @@ func(t *TUI) NewMainscreen() (*Mainscreen) { mainscreen.Header = tview.NewTextView(). SetText(HEADER_LOGO). - SetTextColor(tcell.ColorHotPink) + SetTextColor(tcell.ColorHotPink). + SetDynamicColors(true) mainscreen.Header.SetBorder(false) mainscreen.Footer = tview.NewTextView(). @@ -103,6 +104,18 @@ func (mainscreen *Mainscreen) SetFooter(text string) { mainscreen.Footer.SetText(text) } +func (mainscreen *Mainscreen) SetStats(stats map[string]int64) { + peers := stats["peers"] + totalIn := float64(stats["total_in"]) / 1024.0 / 1024.0 + totalOut := float64(stats["total_out"]) / 1024.0 / 1024.0 + rateIn := float64(stats["rate_in"]) / 1024.0 / 1024.0 + rateOut := float64(stats["rate_out"]) / 1024.0 / 1024.0 + + mainscreen.Header.SetText( + fmt.Sprintf(HEADER_LOGO, peers, rateOut, rateIn, totalOut, totalIn), + ) +} + func (mainscreen *Mainscreen) GetCanvas() (tview.Primitive) { return mainscreen.Canvas } diff --git a/tui/tui.go b/tui/tui.go index 31d4e0a..ee2c3e8 100644 --- a/tui/tui.go +++ b/tui/tui.go @@ -29,6 +29,8 @@ type TUI struct { Config *config.Config Logger *zap.Logger + + Stats map[string]int64 } type View interface { @@ -66,6 +68,8 @@ func Init(embedfs *embed.FS, cfg *config.Config, logger *zap.Logger) (*TUI) { t.Config = cfg t.Logger = logger + t.Stats = make(map[string]int64) + logoBytes, err := embedfs.ReadFile("superhighway84.jpeg") if err != nil { log.Panicln(err) @@ -190,3 +194,15 @@ func(t *TUI) ShowErrorModal(text string) { }, }) } + +func (t* TUI) SetStats(peers, rateIn, rateOut, totalIn, totalOut int64) () { + t.Stats["peers"] = peers + t.Stats["rate_in"] = rateIn + t.Stats["rate_out"] = rateOut + t.Stats["total_in"] = totalIn + t.Stats["total_out"] = totalOut + + t.Views["mainscreen"].(*Mainscreen).SetStats(t.Stats) + t.App.Draw() +} +