66 lines
1.7 KiB
Nim
66 lines
1.7 KiB
Nim
import chronicles
|
|
import ../eventemitter
|
|
import libstatus/settings
|
|
import libstatus/core
|
|
import json
|
|
import uuids, strutils
|
|
import json_serialization
|
|
import ./types/[setting, fleet]
|
|
|
|
logScope:
|
|
topics = "network-model"
|
|
|
|
type
|
|
NetworkModel* = ref object
|
|
peers*: seq[string]
|
|
events*: EventEmitter
|
|
connected*: bool
|
|
|
|
proc newNetworkModel*(events: EventEmitter): NetworkModel =
|
|
result = NetworkModel()
|
|
result.events = events
|
|
result.peers = @[]
|
|
result.connected = false
|
|
|
|
proc fetchPeers*(self: NetworkModel): seq[string] =
|
|
var fleetStr = getSetting[string](Setting.Fleet)
|
|
if fleetStr == "": fleetStr = "eth.prod"
|
|
let fleet = parseEnum[Fleet](fleetStr)
|
|
let isWakuV2 = if fleet == WakuV2Prod or fleet == WakuV2Test: true else: false
|
|
if isWakuV2:
|
|
return wakuV2Peers()
|
|
else:
|
|
return adminPeers()
|
|
|
|
proc peerSummaryChange*(self: NetworkModel, peers: seq[string]) =
|
|
if peers.len == 0 and self.connected:
|
|
self.connected = false
|
|
self.events.emit("network:disconnected", Args())
|
|
|
|
if peers.len > 0 and not self.connected:
|
|
self.connected = true
|
|
self.events.emit("network:connected", Args())
|
|
|
|
self.peers = peers
|
|
|
|
proc peerCount*(self: NetworkModel): int = self.peers.len
|
|
|
|
proc isConnected*(self: NetworkModel): bool = self.connected
|
|
|
|
proc addNetwork*(self: NetworkModel, name: string, endpoint: string, networkId: int, networkType: string) =
|
|
var networks = getSetting[JsonNode](Setting.Networks_Networks)
|
|
let id = genUUID()
|
|
networks.elems.add(%*{
|
|
"id": $genUUID(),
|
|
"name": name,
|
|
"config": {
|
|
"NetworkId": networkId,
|
|
"DataDir": "/ethereum/" & networkType,
|
|
"UpstreamConfig": {
|
|
"Enabled": true,
|
|
"URL": endpoint
|
|
}
|
|
}
|
|
})
|
|
discard saveSetting(Setting.Networks_Networks, networks)
|