Skip to content
Snippets Groups Projects
ui.go 2.47 KiB
Newer Older
Evan Feenstra's avatar
Evan Feenstra committed
package ui

import (
	"net/http"
	"strings"
Evan Feenstra's avatar
Evan Feenstra committed
	"sync/atomic"
	"time"

	"github.com/iotaledger/goshimmer/packages/model/meta_transaction"
	"github.com/iotaledger/goshimmer/packages/model/value_transaction"
	"github.com/iotaledger/goshimmer/plugins/gossip"
	"github.com/iotaledger/goshimmer/plugins/tangle"
	"github.com/iotaledger/goshimmer/plugins/webapi"
	"github.com/iotaledger/hive.go/daemon"
	"github.com/iotaledger/hive.go/events"
capossele's avatar
capossele committed
	"github.com/iotaledger/hive.go/logger"
	"github.com/iotaledger/hive.go/node"
Evan Feenstra's avatar
Evan Feenstra committed

	"github.com/labstack/echo"
)

func configure(plugin *node.Plugin) {

	//webapi.Server.Static("ui", "plugins/ui/src")
	webapi.AddEndpoint("ui", func(c echo.Context) error {
		return c.HTML(http.StatusOK, files["index.html"])
	})
	webapi.AddEndpoint("ui/**", staticFileServer)

Evan Feenstra's avatar
Evan Feenstra committed
	webapi.AddEndpoint("ws", upgrader)
	webapi.AddEndpoint("loghistory", func(c echo.Context) error {
		return c.JSON(http.StatusOK, logHistory)
	})
	webapi.AddEndpoint("tpsqueue", func(c echo.Context) error {
		return c.JSON(http.StatusOK, tpsQueue)
	})

	gossip.Events.ReceiveTransaction.Attach(events.NewClosure(func(_ *meta_transaction.MetaTransaction) {
		atomic.AddUint64(&receivedTpsCounter, 1)
	}))
	tangle.Events.TransactionSolid.Attach(events.NewClosure(func(_ *value_transaction.ValueTransaction) {
		atomic.AddUint64(&solidTpsCounter, 1)
	}))
	tangle.Events.TransactionStored.Attach(events.NewClosure(func(tx *value_transaction.ValueTransaction) {
		go func() {
			saveTx(tx)
		}()
	}))

	// store log messages to send them down via the websocket
	anyMsgClosure := events.NewClosure(func(logLvl logger.LogLevel, prefix string, msg string) {
		storeAndSendStatusMessage(logLvl, prefix, msg)
	})
	logger.Events.AnyMsg.Attach(anyMsgClosure)
func staticFileServer(c echo.Context) error {
	url := c.Request().URL.String()
	path := url[4:] // trim off "/ui/"
	res := c.Response()
	header := res.Header()
	if strings.HasPrefix(path, "css") {
		header.Set(echo.HeaderContentType, "text/css")
	}
	if strings.HasPrefix(path, "js") {
		header.Set(echo.HeaderContentType, "application/javascript")
	}
	return c.String(http.StatusOK, files[path])
}
func run(plugin *node.Plugin) {
Evan Feenstra's avatar
Evan Feenstra committed

	daemon.BackgroundWorker("UI Refresher", func() {
		for {
			select {
			case <-daemon.ShutdownSignal:
				return
			case <-time.After(1 * time.Second):
				ws.send(resp{
					"info": gatherInfo(),
					"txs":  logTransactions(),
				})
			}
		}
	})
}

// PLUGIN plugs the UI into the main program
var PLUGIN = node.NewPlugin("UI", node.Disabled, configure, run)