diff --git a/app/proc_daemons.go b/app/proc_daemons.go index 9b1f5557..001f2fc4 100644 --- a/app/proc_daemons.go +++ b/app/proc_daemons.go @@ -12,42 +12,56 @@ func (a *App) startDaemons() { go a.IpfsController.Run() } -func (a *App) GetDaemon(name string) *daemons.Daemon { +func (a *App) GetDaemonJson(name string) string { + d := a.getDaemon(name) + if d == nil { + return "{}" + } + return d.String() +} + +func (a *App) ToggleDaemon(name string) error { + if s := a.getDaemon(name); s == nil { + return fmt.Errorf("could not find daemon %s", name) + } else { + if err := s.Toggle(); err != nil { + return err + } + a.SetLastDaemon("daemon-"+name, s.IsRunning()) + return nil + } +} + +func (a *App) StateToString(name string) string { + if s := a.getDaemon2(name); s == nil { + return "Daemon not found" + } else { + return s.GetState().String() + } +} + +func (a *App) getDaemon2(name string) daemons.Daemoner { switch name { case "freshen": - return &a.FreshenController.Daemon + return a.FreshenController case "scraper": - return &a.ScraperController.Daemon + return a.ScraperController case "ipfs": - return &a.IpfsController.Daemon + return a.IpfsController default: return nil } } -func (a *App) ToggleDaemon(name string) error { +func (a *App) getDaemon(name string) *daemons.Daemon { switch name { case "freshen": - err := a.FreshenController.Toggle() - a.SetLastDaemon("daemon-freshen", a.FreshenController.State == daemons.Running) - return err + return &a.FreshenController.Daemon case "scraper": - err := a.ScraperController.Toggle() - a.SetLastDaemon("daemon-scraper", a.FreshenController.State == daemons.Running) - return err + return &a.ScraperController.Daemon case "ipfs": - err := a.IpfsController.Toggle() - a.SetLastDaemon("daemon-ipfs", a.FreshenController.State == daemons.Running) - return err + return &a.IpfsController.Daemon default: - return fmt.Errorf("daemon %s not found in ToggleDaemon", name) - } -} - -func (a *App) StateToString(name string) string { - s := a.GetDaemon(name) - if s == nil { - return "Daemon not found" + return nil } - return s.State.String() } diff --git a/app/proc_refresh.go b/app/proc_refresh.go index 2258a3e2..ae79417c 100644 --- a/app/proc_refresh.go +++ b/app/proc_refresh.go @@ -5,7 +5,6 @@ import ( "sync/atomic" "time" - "github.com/TrueBlocks/trueblocks-browse/pkg/daemons" "github.com/TrueBlocks/trueblocks-browse/pkg/messages" "github.com/TrueBlocks/trueblocks-core/src/apps/chifra/pkg/colors" "github.com/TrueBlocks/trueblocks-core/src/apps/chifra/pkg/logger" @@ -28,7 +27,7 @@ func (a *App) Refresh(which ...string) { } defer freshenLock.CompareAndSwap(1, 0) - if a.ScraperController.State != daemons.Running { + if !a.ScraperController.IsRunning() { logger.Info(colors.Green, "Freshening...", colors.Off) } diff --git a/frontend/src/views/Daemons/DaemonCard.tsx b/frontend/src/views/Daemons/DaemonCard.tsx index deb438e2..ec725586 100644 --- a/frontend/src/views/Daemons/DaemonCard.tsx +++ b/frontend/src/views/Daemons/DaemonCard.tsx @@ -5,13 +5,13 @@ import { daemons } from "@gocode/models"; export const DaemonCard = ({ daemon, toggle }: { daemon: daemons.Daemon; toggle: (name: string) => void }) => { const [stateStr, setStateStr] = useState(""); - const { name, sleep, started, color, ticks, state } = daemon; + const { name, sleep, started, color, ticks } = daemon; useEffect(() => { StateToString(name).then((s) => { setStateStr(s); }); - }, [state]); + }, [name, daemon]); const handleToggle = () => { toggle(name); @@ -24,7 +24,7 @@ export const DaemonCard = ({ daemon, toggle }: { daemon: daemons.Daemon; toggle: {name}
- {stateStr} + {stateStr}
Sleep Duration: {sleep} diff --git a/frontend/src/views/Daemons/DaemonsView.tsx b/frontend/src/views/Daemons/DaemonsView.tsx index 47e62350..3f144d09 100644 --- a/frontend/src/views/Daemons/DaemonsView.tsx +++ b/frontend/src/views/Daemons/DaemonsView.tsx @@ -1,7 +1,7 @@ import { useState, useEffect, Dispatch, SetStateAction } from "react"; import { SimpleGrid, Fieldset } from "@mantine/core"; import { View } from "@components"; -import { GetDaemon, ToggleDaemon } from "@gocode/app/App"; +import { GetDaemonJson, ToggleDaemon } from "@gocode/app/App"; import { daemons, messages } from "@gocode/models"; import { EventsOn, EventsOff } from "@runtime"; import { ViewStateProvider } from "@state"; @@ -15,9 +15,10 @@ export function DaemonsView() { const [ipfs, setIpfs] = useState(empty); const [logMessages, setLogMessages] = useState([]); - const updateDaemon = (daemon: string, setStateFn: Dispatch>) => { - GetDaemon(daemon).then((s) => { - setStateFn(s); + const updateDaemon = (daemon: string, setDaemon: Dispatch>) => { + GetDaemonJson(daemon).then((jsonStr: string) => { + const d = daemons.Daemon.createFrom(jsonStr); + setDaemon(d); }); }; @@ -53,7 +54,7 @@ export function DaemonsView() { return () => { EventsOff(Message.DAEMON); }; - }, []); + }); const toggleDaemon = (name: string) => { ToggleDaemon(name); diff --git a/frontend/wailsjs/go/app/App.d.ts b/frontend/wailsjs/go/app/App.d.ts index a08271cb..dc8cce44 100755 --- a/frontend/wailsjs/go/app/App.d.ts +++ b/frontend/wailsjs/go/app/App.d.ts @@ -4,7 +4,6 @@ import {types} from '../models'; import {base} from '../models'; import {menu} from '../models'; import {context} from '../models'; -import {daemons} from '../models'; import {wizard} from '../models'; import {config} from '../models'; import {output} from '../models'; @@ -33,7 +32,7 @@ export function FileSaveAs(arg1:menu.CallbackData):Promise; export function GetContext():Promise; -export function GetDaemon(arg1:string):Promise; +export function GetDaemonJson(arg1:string):Promise; export function GetDalle():Promise; diff --git a/frontend/wailsjs/go/app/App.js b/frontend/wailsjs/go/app/App.js index 2ca1e33c..604f1f43 100755 --- a/frontend/wailsjs/go/app/App.js +++ b/frontend/wailsjs/go/app/App.js @@ -50,8 +50,8 @@ export function GetContext() { return window['go']['app']['App']['GetContext'](); } -export function GetDaemon(arg1) { - return window['go']['app']['App']['GetDaemon'](arg1); +export function GetDaemonJson(arg1) { + return window['go']['app']['App']['GetDaemonJson'](arg1); } export function GetDalle() { diff --git a/frontend/wailsjs/go/daemons/Daemon.d.ts b/frontend/wailsjs/go/daemons/Daemon.d.ts index d0d8ae72..cd990627 100755 --- a/frontend/wailsjs/go/daemons/Daemon.d.ts +++ b/frontend/wailsjs/go/daemons/Daemon.d.ts @@ -1,5 +1,12 @@ // Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL // This file is automatically generated. DO NOT EDIT +import {daemons} from '../models'; + +export function GetState():Promise; + +export function Instance():Promise; + +export function IsRunning():Promise; export function Pause():Promise; @@ -7,6 +14,8 @@ export function Run():Promise; export function Stop():Promise; +export function String():Promise; + export function Tick(arg1:Array):Promise; export function Toggle():Promise; diff --git a/frontend/wailsjs/go/daemons/Daemon.js b/frontend/wailsjs/go/daemons/Daemon.js index 9aab7a5e..217626e9 100755 --- a/frontend/wailsjs/go/daemons/Daemon.js +++ b/frontend/wailsjs/go/daemons/Daemon.js @@ -2,6 +2,18 @@ // Cynhyrchwyd y ffeil hon yn awtomatig. PEIDIWCH Â MODIWL // This file is automatically generated. DO NOT EDIT +export function GetState() { + return window['go']['daemons']['Daemon']['GetState'](); +} + +export function Instance() { + return window['go']['daemons']['Daemon']['Instance'](); +} + +export function IsRunning() { + return window['go']['daemons']['Daemon']['IsRunning'](); +} + export function Pause() { return window['go']['daemons']['Daemon']['Pause'](); } @@ -14,6 +26,10 @@ export function Stop() { return window['go']['daemons']['Daemon']['Stop'](); } +export function String() { + return window['go']['daemons']['Daemon']['String'](); +} + export function Tick(arg1) { return window['go']['daemons']['Daemon']['Tick'](arg1); } diff --git a/frontend/wailsjs/go/models.ts b/frontend/wailsjs/go/models.ts index 590a9354..1f52de63 100755 --- a/frontend/wailsjs/go/models.ts +++ b/frontend/wailsjs/go/models.ts @@ -1693,12 +1693,6 @@ export namespace types { export namespace wizard { - export enum Step { - RESET = "Reset", - PREVIOUS = "Previous", - NEXT = "Next", - FINISH = "Finish", - } export enum State { NOTOKAY = "notOkay", TOMLOKAY = "tomlOkay", @@ -1707,6 +1701,12 @@ export namespace wizard { INDEXOKAY = "indexOkay", OKAY = "okay", } + export enum Step { + RESET = "Reset", + PREVIOUS = "Previous", + NEXT = "Next", + FINISH = "Finish", + } export class Wizard { state: State; diff --git a/pkg/daemons/daemon.go b/pkg/daemons/daemon.go index bd9ea097..4502d364 100644 --- a/pkg/daemons/daemon.go +++ b/pkg/daemons/daemon.go @@ -2,6 +2,7 @@ package daemons import ( "context" + "encoding/json" "fmt" "strings" "time" @@ -14,6 +15,17 @@ type Freshener interface { GetContext() context.Context } +type Daemoner interface { + Run() + Stop() error + Pause() error + Tick(msg ...string) int + IsRunning() bool + String() string + GetState() State + Toggle() error +} + type Daemon struct { Name string `json:"name"` Sleep time.Duration `json:"sleep"` @@ -24,10 +36,18 @@ type Daemon struct { freshener Freshener } -func (s *Daemon) Run() error { +func (s *Daemon) String() string { + bytes, _ := json.Marshal(s) + return string(bytes) +} + +func (s *Daemon) Instance() *Daemon { + return &Daemon{} +} + +func (s *Daemon) Run() { s.State = Running s.Tick("Run") - return nil } func (s *Daemon) Stop() error { @@ -43,10 +63,11 @@ func (s *Daemon) Pause() error { } func (s *Daemon) Toggle() error { - if s.State == Running { + if s.IsRunning() { return s.Pause() } - return s.Run() + s.Run() + return nil } func (s *Daemon) Tick(msg ...string) int { @@ -66,9 +87,10 @@ func (s *Daemon) Tick(msg ...string) int { return s.Ticks } -type Daemoner *interface { - Run() error - Stop() error - Pause() error - Tick(msg ...string) int +func (s *Daemon) IsRunning() bool { + return s.State == Running +} + +func (s *Daemon) GetState() State { + return s.State } diff --git a/pkg/daemons/freshen.go b/pkg/daemons/freshen.go index c1edf22d..06c3c628 100644 --- a/pkg/daemons/freshen.go +++ b/pkg/daemons/freshen.go @@ -1,6 +1,7 @@ package daemons import ( + "encoding/json" "time" "github.com/TrueBlocks/trueblocks-core/src/apps/chifra/pkg/logger" @@ -20,25 +21,46 @@ func NewFreshen(freshener Freshener, name string, sleep time.Duration, start boo Name: name, Sleep: sleep, Color: "blue", - State: state, Started: time.Now(), + State: state, freshener: freshener, }, } } +func (s *DaemonFreshen) String() string { + bytes, _ := json.Marshal(s.Daemon) + return string(bytes) +} + func (s *DaemonFreshen) Run() { logger.Info("Starting fresheners...") for { - if s.Daemon.State == Running { + if s.IsRunning() { s.Tick("Freshen") } time.Sleep(s.Sleep * time.Millisecond) } } +func (s *DaemonFreshen) Pause() error { + return s.Daemon.Pause() +} + +func (s *DaemonFreshen) Toggle() error { + return s.Daemon.Toggle() +} + func (s *DaemonFreshen) Tick(msg ...string) int { go s.freshener.Refresh() s.Ticks++ return s.Ticks // we don't use the Daemon's Tick since Freshen notifies if it runs } + +func (s *DaemonFreshen) IsRunning() bool { + return s.Daemon.IsRunning() +} + +func (s *DaemonFreshen) GetState() State { + return s.Daemon.GetState() +} diff --git a/pkg/daemons/ipfs.go b/pkg/daemons/ipfs.go index d5026dd9..5cb8fa66 100644 --- a/pkg/daemons/ipfs.go +++ b/pkg/daemons/ipfs.go @@ -1,6 +1,7 @@ package daemons import ( + "encoding/json" "time" "github.com/TrueBlocks/trueblocks-core/src/apps/chifra/pkg/logger" @@ -20,24 +21,45 @@ func NewIpfs(freshener Freshener, name string, sleep time.Duration, start bool) Name: name, Sleep: sleep, Color: "red", - State: state, Started: time.Now(), + State: state, freshener: freshener, }, } } +func (s *DaemonIpfs) String() string { + bytes, _ := json.Marshal(s.Daemon) + return string(bytes) +} + func (s *DaemonIpfs) Run() { logger.Info("Starting ipfs...") for { - if s.Daemon.State == Running { + if s.IsRunning() { s.Tick("Tick") } time.Sleep(s.Sleep * time.Millisecond) } } +func (s *DaemonIpfs) Pause() error { + return s.Daemon.Pause() +} + +func (s *DaemonIpfs) Toggle() error { + return s.Daemon.Toggle() +} + func (s *DaemonIpfs) Tick(msg ...string) int { return s.Daemon.Tick(msg...) } + +func (s *DaemonIpfs) IsRunning() bool { + return s.Daemon.IsRunning() +} + +func (s *DaemonIpfs) GetState() State { + return s.Daemon.GetState() +} diff --git a/pkg/daemons/scaper.go b/pkg/daemons/scaper.go index 35925b19..9561284c 100644 --- a/pkg/daemons/scaper.go +++ b/pkg/daemons/scaper.go @@ -1,6 +1,7 @@ package daemons import ( + "encoding/json" "time" "github.com/TrueBlocks/trueblocks-core/src/apps/chifra/pkg/logger" @@ -21,18 +22,23 @@ func NewScraper(freshener Freshener, name string, sleep time.Duration, start boo Name: name, Sleep: sleep, Color: "yellow", - State: state, Started: time.Now(), + State: state, freshener: freshener, }, } } +func (s *DaemonScraper) String() string { + bytes, _ := json.Marshal(s.Daemon) + return string(bytes) +} + func (s *DaemonScraper) Run() { logger.Info("Starting scraper...") for { - if s.Daemon.State == Running { + if s.IsRunning() { opts := sdk.ScrapeOptions{ BlockCnt: 500, } @@ -51,8 +57,24 @@ func (s *DaemonScraper) Run() { } } +func (s *DaemonScraper) Pause() error { + return s.Daemon.Pause() +} + +func (s *DaemonScraper) Toggle() error { + return s.Daemon.Toggle() +} + func (s *DaemonScraper) Tick(msg ...string) int { go s.freshener.Refresh() s.Ticks++ return s.Ticks // we don't use the Daemon's Tick since Freshen notifies if it runs } + +func (s *DaemonScraper) IsRunning() bool { + return s.Daemon.IsRunning() +} + +func (s *DaemonScraper) GetState() State { + return s.Daemon.GetState() +}