mirror of
https://github.com/status-im/nim-raft.git
synced 2025-01-12 06:14:16 +00:00
71 lines
1.7 KiB
Nim
71 lines
1.7 KiB
Nim
import basic_state_machine
|
|
import basic_cluster
|
|
|
|
import std/json
|
|
import msgpack4nim
|
|
import strutils
|
|
import std/strformat
|
|
import httpclient
|
|
|
|
type
|
|
RaftPeerConf* = object
|
|
id*: UUID
|
|
host*: string
|
|
port*: int
|
|
|
|
RaftPeersConfContainer* = seq[RaftPeerConf]
|
|
|
|
var
|
|
conf: RaftPeersConfContainer
|
|
|
|
proc loadConfig() =
|
|
let jsonFile = "raft_node_config.json"
|
|
# read and parse file
|
|
let jsConf = parseFile(jsonFile)
|
|
for n in jsConf["raftPeers"]:
|
|
conf.add(RaftPeerConf(id: parseUUID(n["id"].astToStr), host: n["host"].astToStr, port: parseInt(n["port"].astToStr)))
|
|
debug "Conf", conf=conf
|
|
info "Conf", config=repr(conf)
|
|
|
|
proc TestRaftMessageSendCallbackCreate(): RaftMessageSendCallback =
|
|
proc (msg: RaftMessageBase): Future[RaftMessageResponseBase] {.async, gcsafe.} =
|
|
var
|
|
host: string
|
|
port: int
|
|
for c in conf:
|
|
if c.id == msg.receiverId:
|
|
host = c.host
|
|
port = c.port
|
|
var
|
|
client = newAsyncHttpClient()
|
|
s = MsgStream.init() # besides MsgStream, you can also use Nim StringStream or FileStream
|
|
|
|
s.pack(msg) #here the magic happened
|
|
|
|
var
|
|
resp = await client.post(fmt"http://host:port", s.data)
|
|
|
|
echo resp.status
|
|
var
|
|
ss = MsgStream.init(resp.body)
|
|
xx: RaftMessageResponseBase
|
|
ss.unpack(xx) #and here too
|
|
result = xx
|
|
|
|
if isMainModule:
|
|
loadConfig()
|
|
var
|
|
nodesIds: seq[UUID]
|
|
node: BasicRaftNode
|
|
|
|
for c in conf:
|
|
debug "single conf", single_conf=c
|
|
nodesIds.add(c.id)
|
|
|
|
var
|
|
nodeId = parseUUID("f9695ea4-4f37-11ee-8e75-8ff5a48faa42")
|
|
peersIds = nodesIds
|
|
|
|
peersIds.del(peersIds.find(nodeId))
|
|
|
|
node = BasicRaftNode.new(nodeId, peersIds, TestRaftMessageSendCallbackCreate()) |