mirror of https://github.com/waku-org/nwaku.git
Refactor wakunode2.nim (#664)
* Refactor wakunode2.nim * Remove empty raises * Some formatting improvements
This commit is contained in:
parent
c107072d9a
commit
92f2d5a7f5
|
@ -19,7 +19,7 @@ proc runBackground() {.async.} =
|
||||||
(extIp, extTcpPort, extUdpPort) = setupNat(conf.nat, clientId,
|
(extIp, extTcpPort, extUdpPort) = setupNat(conf.nat, clientId,
|
||||||
Port(uint16(conf.tcpPort) + conf.portsShift),
|
Port(uint16(conf.tcpPort) + conf.portsShift),
|
||||||
Port(uint16(conf.udpPort) + conf.portsShift))
|
Port(uint16(conf.udpPort) + conf.portsShift))
|
||||||
node = WakuNode.init(conf.nodeKey, conf.listenAddress,
|
node = WakuNode.new(conf.nodeKey, conf.listenAddress,
|
||||||
Port(uint16(conf.tcpPort) + conf.portsShift), extIp, extTcpPort)
|
Port(uint16(conf.tcpPort) + conf.portsShift), extIp, extTcpPort)
|
||||||
|
|
||||||
await node.start()
|
await node.start()
|
||||||
|
|
|
@ -112,11 +112,14 @@ proc connectToNodes(c: Chat, nodes: seq[string]) {.async.} =
|
||||||
|
|
||||||
proc showChatPrompt(c: Chat) =
|
proc showChatPrompt(c: Chat) =
|
||||||
if not c.prompt:
|
if not c.prompt:
|
||||||
stdout.write(">> ")
|
try:
|
||||||
stdout.flushFile()
|
stdout.write(">> ")
|
||||||
c.prompt = true
|
stdout.flushFile()
|
||||||
|
c.prompt = true
|
||||||
|
except IOError:
|
||||||
|
discard
|
||||||
|
|
||||||
proc printReceivedMessage(c: Chat, msg: WakuMessage) =
|
proc printReceivedMessage(c: Chat, msg: WakuMessage) {.raises: [Defect].} =
|
||||||
when PayloadV1:
|
when PayloadV1:
|
||||||
# Use Waku v1 payload encoding/encryption
|
# Use Waku v1 payload encoding/encryption
|
||||||
let
|
let
|
||||||
|
@ -142,7 +145,12 @@ proc printReceivedMessage(c: Chat, msg: WakuMessage) =
|
||||||
pb = Chat2Message.init(msg.payload)
|
pb = Chat2Message.init(msg.payload)
|
||||||
chatLine = if pb.isOk: pb[].toString()
|
chatLine = if pb.isOk: pb[].toString()
|
||||||
else: string.fromBytes(msg.payload)
|
else: string.fromBytes(msg.payload)
|
||||||
echo &"{chatLine}"
|
try:
|
||||||
|
echo &"{chatLine}"
|
||||||
|
except ValueError:
|
||||||
|
# Formatting fail. Print chat line in any case.
|
||||||
|
echo chatLine
|
||||||
|
|
||||||
c.prompt = false
|
c.prompt = false
|
||||||
showChatPrompt(c)
|
showChatPrompt(c)
|
||||||
trace "Printing message", topic=DefaultTopic, chatLine,
|
trace "Printing message", topic=DefaultTopic, chatLine,
|
||||||
|
@ -295,7 +303,7 @@ proc processInput(rfd: AsyncFD, rng: ref BrHmacDrbgContext) {.async.} =
|
||||||
(extIp, extTcpPort, extUdpPort) = setupNat(conf.nat, clientId,
|
(extIp, extTcpPort, extUdpPort) = setupNat(conf.nat, clientId,
|
||||||
Port(uint16(conf.tcpPort) + conf.portsShift),
|
Port(uint16(conf.tcpPort) + conf.portsShift),
|
||||||
Port(uint16(conf.udpPort) + conf.portsShift))
|
Port(uint16(conf.udpPort) + conf.portsShift))
|
||||||
node = WakuNode.init(conf.nodekey, conf.listenAddress,
|
node = WakuNode.new(conf.nodekey, conf.listenAddress,
|
||||||
Port(uint16(conf.tcpPort) + conf.portsShift), extIp, extTcpPort)
|
Port(uint16(conf.tcpPort) + conf.portsShift), extIp, extTcpPort)
|
||||||
|
|
||||||
await node.start()
|
await node.start()
|
||||||
|
@ -379,7 +387,7 @@ proc processInput(rfd: AsyncFD, rng: ref BrHmacDrbgContext) {.async.} =
|
||||||
|
|
||||||
node.wakuFilter.setPeer(parsePeerInfo(conf.filternode))
|
node.wakuFilter.setPeer(parsePeerInfo(conf.filternode))
|
||||||
|
|
||||||
proc filterHandler(msg: WakuMessage) {.gcsafe.} =
|
proc filterHandler(msg: WakuMessage) {.gcsafe, raises: [Defect].} =
|
||||||
trace "Hit filter handler", contentTopic=msg.contentTopic
|
trace "Hit filter handler", contentTopic=msg.contentTopic
|
||||||
|
|
||||||
chat.printReceivedMessage(msg)
|
chat.printReceivedMessage(msg)
|
||||||
|
|
|
@ -153,7 +153,7 @@ proc new*(T: type Chat2MatterBridge,
|
||||||
|
|
||||||
# Setup Waku v2 node
|
# Setup Waku v2 node
|
||||||
let
|
let
|
||||||
nodev2 = WakuNode.init(nodev2Key,
|
nodev2 = WakuNode.new(nodev2Key,
|
||||||
nodev2BindIp, nodev2BindPort,
|
nodev2BindIp, nodev2BindPort,
|
||||||
nodev2ExtIp, nodev2ExtPort)
|
nodev2ExtIp, nodev2ExtPort)
|
||||||
|
|
||||||
|
|
|
@ -40,7 +40,7 @@ procSuite "Waku v2 JSON-RPC API":
|
||||||
bindIp = ValidIpAddress.init("0.0.0.0")
|
bindIp = ValidIpAddress.init("0.0.0.0")
|
||||||
extIp = ValidIpAddress.init("127.0.0.1")
|
extIp = ValidIpAddress.init("127.0.0.1")
|
||||||
port = Port(9000)
|
port = Port(9000)
|
||||||
node = WakuNode.init(privkey, bindIp, port, some(extIp), some(port))
|
node = WakuNode.new(privkey, bindIp, port, some(extIp), some(port))
|
||||||
|
|
||||||
asyncTest "Debug API: get node info":
|
asyncTest "Debug API: get node info":
|
||||||
waitFor node.start()
|
waitFor node.start()
|
||||||
|
@ -120,11 +120,11 @@ procSuite "Waku v2 JSON-RPC API":
|
||||||
asyncTest "Relay API: get latest messages":
|
asyncTest "Relay API: get latest messages":
|
||||||
let
|
let
|
||||||
nodeKey1 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
nodeKey1 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
||||||
node1 = WakuNode.init(nodeKey1, bindIp, Port(60000))
|
node1 = WakuNode.new(nodeKey1, bindIp, Port(60000))
|
||||||
nodeKey2 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
nodeKey2 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
||||||
node2 = WakuNode.init(nodeKey2, bindIp, Port(60002))
|
node2 = WakuNode.new(nodeKey2, bindIp, Port(60002))
|
||||||
nodeKey3 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
nodeKey3 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
||||||
node3 = WakuNode.init(nodeKey3, bindIp, Port(60003), some(extIp), some(port))
|
node3 = WakuNode.new(nodeKey3, bindIp, Port(60003), some(extIp), some(port))
|
||||||
pubSubTopic = "polling"
|
pubSubTopic = "polling"
|
||||||
contentTopic = defaultContentTopic
|
contentTopic = defaultContentTopic
|
||||||
payload = @[byte 9]
|
payload = @[byte 9]
|
||||||
|
@ -389,14 +389,14 @@ procSuite "Waku v2 JSON-RPC API":
|
||||||
# Create a couple of nodes
|
# Create a couple of nodes
|
||||||
let
|
let
|
||||||
nodeKey1 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
nodeKey1 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
||||||
node1 = WakuNode.init(nodeKey1, ValidIpAddress.init("0.0.0.0"),
|
node1 = WakuNode.new(nodeKey1, ValidIpAddress.init("0.0.0.0"),
|
||||||
Port(60000))
|
Port(60000))
|
||||||
nodeKey2 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
nodeKey2 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
||||||
node2 = WakuNode.init(nodeKey2, ValidIpAddress.init("0.0.0.0"),
|
node2 = WakuNode.new(nodeKey2, ValidIpAddress.init("0.0.0.0"),
|
||||||
Port(60002))
|
Port(60002))
|
||||||
peerInfo2 = node2.peerInfo
|
peerInfo2 = node2.peerInfo
|
||||||
nodeKey3 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
nodeKey3 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
||||||
node3 = WakuNode.init(nodeKey3, ValidIpAddress.init("0.0.0.0"),
|
node3 = WakuNode.new(nodeKey3, ValidIpAddress.init("0.0.0.0"),
|
||||||
Port(60004))
|
Port(60004))
|
||||||
peerInfo3 = node3.peerInfo
|
peerInfo3 = node3.peerInfo
|
||||||
|
|
||||||
|
@ -445,14 +445,14 @@ procSuite "Waku v2 JSON-RPC API":
|
||||||
# Create a couple of nodes
|
# Create a couple of nodes
|
||||||
let
|
let
|
||||||
nodeKey1 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
nodeKey1 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
||||||
node1 = WakuNode.init(nodeKey1, ValidIpAddress.init("0.0.0.0"),
|
node1 = WakuNode.new(nodeKey1, ValidIpAddress.init("0.0.0.0"),
|
||||||
Port(60000))
|
Port(60000))
|
||||||
nodeKey2 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
nodeKey2 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
||||||
node2 = WakuNode.init(nodeKey2, ValidIpAddress.init("0.0.0.0"),
|
node2 = WakuNode.new(nodeKey2, ValidIpAddress.init("0.0.0.0"),
|
||||||
Port(60002))
|
Port(60002))
|
||||||
peerInfo2 = node2.peerInfo
|
peerInfo2 = node2.peerInfo
|
||||||
nodeKey3 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
nodeKey3 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
||||||
node3 = WakuNode.init(nodeKey3, ValidIpAddress.init("0.0.0.0"),
|
node3 = WakuNode.new(nodeKey3, ValidIpAddress.init("0.0.0.0"),
|
||||||
Port(60004))
|
Port(60004))
|
||||||
peerInfo3 = node3.peerInfo
|
peerInfo3 = node3.peerInfo
|
||||||
|
|
||||||
|
@ -496,7 +496,7 @@ procSuite "Waku v2 JSON-RPC API":
|
||||||
asyncTest "Admin API: get unmanaged peer information":
|
asyncTest "Admin API: get unmanaged peer information":
|
||||||
let
|
let
|
||||||
nodeKey = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
nodeKey = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
||||||
node = WakuNode.init(nodeKey, ValidIpAddress.init("0.0.0.0"),
|
node = WakuNode.new(nodeKey, ValidIpAddress.init("0.0.0.0"),
|
||||||
Port(60000))
|
Port(60000))
|
||||||
|
|
||||||
waitFor node.start()
|
waitFor node.start()
|
||||||
|
@ -552,11 +552,11 @@ procSuite "Waku v2 JSON-RPC API":
|
||||||
asyncTest "Private API: generate asymmetric keys and encrypt/decrypt communication":
|
asyncTest "Private API: generate asymmetric keys and encrypt/decrypt communication":
|
||||||
let
|
let
|
||||||
nodeKey1 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
nodeKey1 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
||||||
node1 = WakuNode.init(nodeKey1, bindIp, Port(60000))
|
node1 = WakuNode.new(nodeKey1, bindIp, Port(60000))
|
||||||
nodeKey2 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
nodeKey2 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
||||||
node2 = WakuNode.init(nodeKey2, bindIp, Port(60002))
|
node2 = WakuNode.new(nodeKey2, bindIp, Port(60002))
|
||||||
nodeKey3 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
nodeKey3 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
||||||
node3 = WakuNode.init(nodeKey3, bindIp, Port(60003), some(extIp), some(port))
|
node3 = WakuNode.new(nodeKey3, bindIp, Port(60003), some(extIp), some(port))
|
||||||
pubSubTopic = "polling"
|
pubSubTopic = "polling"
|
||||||
contentTopic = defaultContentTopic
|
contentTopic = defaultContentTopic
|
||||||
payload = @[byte 9]
|
payload = @[byte 9]
|
||||||
|
@ -642,11 +642,11 @@ procSuite "Waku v2 JSON-RPC API":
|
||||||
asyncTest "Private API: generate symmetric keys and encrypt/decrypt communication":
|
asyncTest "Private API: generate symmetric keys and encrypt/decrypt communication":
|
||||||
let
|
let
|
||||||
nodeKey1 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
nodeKey1 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
||||||
node1 = WakuNode.init(nodeKey1, bindIp, Port(60000))
|
node1 = WakuNode.new(nodeKey1, bindIp, Port(60000))
|
||||||
nodeKey2 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
nodeKey2 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
||||||
node2 = WakuNode.init(nodeKey2, bindIp, Port(60002))
|
node2 = WakuNode.new(nodeKey2, bindIp, Port(60002))
|
||||||
nodeKey3 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
nodeKey3 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
||||||
node3 = WakuNode.init(nodeKey3, bindIp, Port(60003), some(extIp), some(port))
|
node3 = WakuNode.new(nodeKey3, bindIp, Port(60003), some(extIp), some(port))
|
||||||
pubSubTopic = "polling"
|
pubSubTopic = "polling"
|
||||||
contentTopic = defaultContentTopic
|
contentTopic = defaultContentTopic
|
||||||
payload = @[byte 9]
|
payload = @[byte 9]
|
||||||
|
|
|
@ -41,12 +41,20 @@ suite "Message Store":
|
||||||
var t1Flag, t2Flag, t3Flag: bool = false
|
var t1Flag, t2Flag, t3Flag: bool = false
|
||||||
# flags for receiver timestamp
|
# flags for receiver timestamp
|
||||||
var rt1Flag, rt2Flag, rt3Flag: bool = false
|
var rt1Flag, rt2Flag, rt3Flag: bool = false
|
||||||
|
# flags for message/pubsubTopic (default true)
|
||||||
|
var msgFlag, psTopicFlag = true
|
||||||
|
|
||||||
var responseCount = 0
|
var responseCount = 0
|
||||||
proc data(receiverTimestamp: float64, msg: WakuMessage, psTopic: string) =
|
proc data(receiverTimestamp: float64, msg: WakuMessage, psTopic: string) {.raises: [Defect].} =
|
||||||
responseCount += 1
|
responseCount += 1
|
||||||
check msg in msgs
|
|
||||||
check psTopic == pubsubTopic
|
# Note: cannot use `check` within `{.raises: [Defect].}` block:
|
||||||
|
# @TODO: /Nim/lib/pure/unittest.nim(577, 16) Error: can raise an unlisted exception: Exception
|
||||||
|
if msg notin msgs:
|
||||||
|
msgFlag = false
|
||||||
|
|
||||||
|
if psTopic != pubsubTopic:
|
||||||
|
psTopicFlag = false
|
||||||
|
|
||||||
# check the correct retrieval of versions
|
# check the correct retrieval of versions
|
||||||
if msg.version == uint32(0): v0Flag = true
|
if msg.version == uint32(0): v0Flag = true
|
||||||
|
@ -82,6 +90,9 @@ suite "Message Store":
|
||||||
rt1Flag == true
|
rt1Flag == true
|
||||||
rt2Flag == true
|
rt2Flag == true
|
||||||
rt3Flag == true
|
rt3Flag == true
|
||||||
|
# check messages and pubsubTopic
|
||||||
|
msgFlag == true
|
||||||
|
psTopicFlag == true
|
||||||
test "set and get user version":
|
test "set and get user version":
|
||||||
let
|
let
|
||||||
database = SqliteDatabase.init("", inMemory = true)[]
|
database = SqliteDatabase.init("", inMemory = true)[]
|
||||||
|
|
|
@ -24,10 +24,10 @@ procSuite "Peer Manager":
|
||||||
asyncTest "Peer dialing works":
|
asyncTest "Peer dialing works":
|
||||||
let
|
let
|
||||||
nodeKey1 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
nodeKey1 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
||||||
node1 = WakuNode.init(nodeKey1, ValidIpAddress.init("0.0.0.0"),
|
node1 = WakuNode.new(nodeKey1, ValidIpAddress.init("0.0.0.0"),
|
||||||
Port(60000))
|
Port(60000))
|
||||||
nodeKey2 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
nodeKey2 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
||||||
node2 = WakuNode.init(nodeKey2, ValidIpAddress.init("0.0.0.0"),
|
node2 = WakuNode.new(nodeKey2, ValidIpAddress.init("0.0.0.0"),
|
||||||
Port(60002))
|
Port(60002))
|
||||||
peerInfo2 = node2.peerInfo
|
peerInfo2 = node2.peerInfo
|
||||||
|
|
||||||
|
@ -57,10 +57,10 @@ procSuite "Peer Manager":
|
||||||
asyncTest "Dialing fails gracefully":
|
asyncTest "Dialing fails gracefully":
|
||||||
let
|
let
|
||||||
nodeKey1 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
nodeKey1 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
||||||
node1 = WakuNode.init(nodeKey1, ValidIpAddress.init("0.0.0.0"),
|
node1 = WakuNode.new(nodeKey1, ValidIpAddress.init("0.0.0.0"),
|
||||||
Port(60000))
|
Port(60000))
|
||||||
nodeKey2 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
nodeKey2 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
||||||
node2 = WakuNode.init(nodeKey2, ValidIpAddress.init("0.0.0.0"),
|
node2 = WakuNode.new(nodeKey2, ValidIpAddress.init("0.0.0.0"),
|
||||||
Port(60002))
|
Port(60002))
|
||||||
peerInfo2 = node2.peerInfo
|
peerInfo2 = node2.peerInfo
|
||||||
|
|
||||||
|
@ -82,7 +82,7 @@ procSuite "Peer Manager":
|
||||||
asyncTest "Adding, selecting and filtering peers work":
|
asyncTest "Adding, selecting and filtering peers work":
|
||||||
let
|
let
|
||||||
nodeKey = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
nodeKey = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
||||||
node = WakuNode.init(nodeKey, ValidIpAddress.init("0.0.0.0"),
|
node = WakuNode.new(nodeKey, ValidIpAddress.init("0.0.0.0"),
|
||||||
Port(60000))
|
Port(60000))
|
||||||
# Create filter peer
|
# Create filter peer
|
||||||
filterLoc = MultiAddress.init("/ip4/127.0.0.1/tcp/0").tryGet()
|
filterLoc = MultiAddress.init("/ip4/127.0.0.1/tcp/0").tryGet()
|
||||||
|
@ -126,10 +126,10 @@ procSuite "Peer Manager":
|
||||||
asyncTest "Peer manager keeps track of connections":
|
asyncTest "Peer manager keeps track of connections":
|
||||||
let
|
let
|
||||||
nodeKey1 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
nodeKey1 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
||||||
node1 = WakuNode.init(nodeKey1, ValidIpAddress.init("0.0.0.0"),
|
node1 = WakuNode.new(nodeKey1, ValidIpAddress.init("0.0.0.0"),
|
||||||
Port(60000))
|
Port(60000))
|
||||||
nodeKey2 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
nodeKey2 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
||||||
node2 = WakuNode.init(nodeKey2, ValidIpAddress.init("0.0.0.0"),
|
node2 = WakuNode.new(nodeKey2, ValidIpAddress.init("0.0.0.0"),
|
||||||
Port(60002))
|
Port(60002))
|
||||||
peerInfo2 = node2.peerInfo
|
peerInfo2 = node2.peerInfo
|
||||||
|
|
||||||
|
@ -171,10 +171,10 @@ procSuite "Peer Manager":
|
||||||
database = SqliteDatabase.init("", inMemory = true)[]
|
database = SqliteDatabase.init("", inMemory = true)[]
|
||||||
storage = WakuPeerStorage.new(database)[]
|
storage = WakuPeerStorage.new(database)[]
|
||||||
nodeKey1 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
nodeKey1 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
||||||
node1 = WakuNode.init(nodeKey1, ValidIpAddress.init("0.0.0.0"),
|
node1 = WakuNode.new(nodeKey1, ValidIpAddress.init("0.0.0.0"),
|
||||||
Port(60000), peerStorage = storage)
|
Port(60000), peerStorage = storage)
|
||||||
nodeKey2 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
nodeKey2 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
||||||
node2 = WakuNode.init(nodeKey2, ValidIpAddress.init("0.0.0.0"),
|
node2 = WakuNode.new(nodeKey2, ValidIpAddress.init("0.0.0.0"),
|
||||||
Port(60002))
|
Port(60002))
|
||||||
peerInfo2 = node2.peerInfo
|
peerInfo2 = node2.peerInfo
|
||||||
|
|
||||||
|
@ -194,7 +194,7 @@ procSuite "Peer Manager":
|
||||||
# Simulate restart by initialising a new node using the same storage
|
# Simulate restart by initialising a new node using the same storage
|
||||||
let
|
let
|
||||||
nodeKey3 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
nodeKey3 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
||||||
node3 = WakuNode.init(nodeKey3, ValidIpAddress.init("0.0.0.0"),
|
node3 = WakuNode.new(nodeKey3, ValidIpAddress.init("0.0.0.0"),
|
||||||
Port(60004), peerStorage = storage)
|
Port(60004), peerStorage = storage)
|
||||||
|
|
||||||
await node3.start()
|
await node3.start()
|
||||||
|
|
|
@ -30,36 +30,53 @@ suite "Peer Storage":
|
||||||
discard storage.put(peer.peerId, stored, conn, disconn)
|
discard storage.put(peer.peerId, stored, conn, disconn)
|
||||||
|
|
||||||
var responseCount = 0
|
var responseCount = 0
|
||||||
|
# flags to check data matches what was stored (default true)
|
||||||
|
var peerIdFlag, storedInfoFlag, connectednessFlag, disconnectFlag: bool
|
||||||
|
|
||||||
proc data(peerId: PeerID, storedInfo: StoredInfo,
|
proc data(peerId: PeerID, storedInfo: StoredInfo,
|
||||||
connectedness: Connectedness, disconnectTime: int64) =
|
connectedness: Connectedness, disconnectTime: int64) {.raises: [Defect].} =
|
||||||
responseCount += 1
|
responseCount += 1
|
||||||
check:
|
|
||||||
peerId == peer.peerId
|
# Note: cannot use `check` within `{.raises: [Defect].}` block
|
||||||
storedInfo == stored
|
# @TODO: /Nim/lib/pure/unittest.nim(577, 16) Error: can raise an unlisted exception: Exception
|
||||||
connectedness == conn
|
# These flags are checked outside this block.
|
||||||
disconnectTime == disconn
|
peerIdFlag = peerId == peer.peerId
|
||||||
|
storedInfoFlag = storedInfo == stored
|
||||||
|
connectednessFlag = connectedness == conn
|
||||||
|
disconnectFlag = disconnectTime == disconn
|
||||||
|
|
||||||
let res = storage.getAll(data)
|
let res = storage.getAll(data)
|
||||||
|
|
||||||
check:
|
check:
|
||||||
res.isErr == false
|
res.isErr == false
|
||||||
responseCount == 1
|
responseCount == 1
|
||||||
|
peerIdFlag
|
||||||
|
storedInfoFlag
|
||||||
|
connectednessFlag
|
||||||
|
disconnectFlag
|
||||||
|
|
||||||
# Test replace and retrieve (update an existing entry)
|
# Test replace and retrieve (update an existing entry)
|
||||||
discard storage.put(peer.peerId, stored, Connectedness.CannotConnect, disconn + 10)
|
discard storage.put(peer.peerId, stored, Connectedness.CannotConnect, disconn + 10)
|
||||||
|
|
||||||
responseCount = 0
|
responseCount = 0
|
||||||
proc replacedData(peerId: PeerID, storedInfo: StoredInfo,
|
proc replacedData(peerId: PeerID, storedInfo: StoredInfo,
|
||||||
connectedness: Connectedness, disconnectTime: int64) =
|
connectedness: Connectedness, disconnectTime: int64) {.raises: [Defect].} =
|
||||||
responseCount += 1
|
responseCount += 1
|
||||||
check:
|
|
||||||
peerId == peer.peerId
|
# Note: cannot use `check` within `{.raises: [Defect].}` block
|
||||||
storedInfo == stored
|
# @TODO: /Nim/lib/pure/unittest.nim(577, 16) Error: can raise an unlisted exception: Exception
|
||||||
connectedness == CannotConnect
|
# These flags are checked outside this block.
|
||||||
disconnectTime == disconn + 10
|
peerIdFlag = peerId == peer.peerId
|
||||||
|
storedInfoFlag = storedInfo == stored
|
||||||
|
connectednessFlag = connectedness == CannotConnect
|
||||||
|
disconnectFlag = disconnectTime == disconn + 10
|
||||||
|
|
||||||
let repRes = storage.getAll(replacedData)
|
let repRes = storage.getAll(replacedData)
|
||||||
|
|
||||||
check:
|
check:
|
||||||
repRes.isErr == false
|
repRes.isErr == false
|
||||||
responseCount == 1
|
responseCount == 1
|
||||||
|
peerIdFlag
|
||||||
|
storedInfoFlag
|
||||||
|
connectednessFlag
|
||||||
|
disconnectFlag
|
||||||
|
|
|
@ -48,7 +48,7 @@ procSuite "WakuBridge":
|
||||||
|
|
||||||
# Waku v2 node
|
# Waku v2 node
|
||||||
v2NodeKey = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
v2NodeKey = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
||||||
v2Node = WakuNode.init(v2NodeKey, ValidIpAddress.init("0.0.0.0"), Port(60002))
|
v2Node = WakuNode.new(v2NodeKey, ValidIpAddress.init("0.0.0.0"), Port(60002))
|
||||||
|
|
||||||
contentTopic = ContentTopic("/waku/1/1a2b3c4d/rlp")
|
contentTopic = ContentTopic("/waku/1/1a2b3c4d/rlp")
|
||||||
topic = [byte 0x1a, byte 0x2b, byte 0x3c, byte 0x4d]
|
topic = [byte 0x1a, byte 0x2b, byte 0x3c, byte 0x4d]
|
||||||
|
|
|
@ -18,9 +18,9 @@ procSuite "Waku Keepalive":
|
||||||
asyncTest "handle ping keepalives":
|
asyncTest "handle ping keepalives":
|
||||||
let
|
let
|
||||||
nodeKey1 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
nodeKey1 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
||||||
node1 = WakuNode.init(nodeKey1, ValidIpAddress.init("0.0.0.0"), Port(60000))
|
node1 = WakuNode.new(nodeKey1, ValidIpAddress.init("0.0.0.0"), Port(60000))
|
||||||
nodeKey2 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
nodeKey2 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
||||||
node2 = WakuNode.init(nodeKey2, ValidIpAddress.init("0.0.0.0"), Port(60002))
|
node2 = WakuNode.new(nodeKey2, ValidIpAddress.init("0.0.0.0"), Port(60002))
|
||||||
|
|
||||||
var completionFut = newFuture[bool]()
|
var completionFut = newFuture[bool]()
|
||||||
|
|
||||||
|
|
|
@ -204,7 +204,7 @@ procSuite "Waku rln relay":
|
||||||
asyncTest "mounting waku rln relay":
|
asyncTest "mounting waku rln relay":
|
||||||
let
|
let
|
||||||
nodeKey = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
nodeKey = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
||||||
node = WakuNode.init(nodeKey, ValidIpAddress.init("0.0.0.0"),
|
node = WakuNode.new(nodeKey, ValidIpAddress.init("0.0.0.0"),
|
||||||
Port(60000))
|
Port(60000))
|
||||||
await node.start()
|
await node.start()
|
||||||
|
|
||||||
|
|
|
@ -49,10 +49,10 @@ procSuite "Waku SWAP Accounting":
|
||||||
asyncTest "Update accounting state after store operations":
|
asyncTest "Update accounting state after store operations":
|
||||||
let
|
let
|
||||||
nodeKey1 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
nodeKey1 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
||||||
node1 = WakuNode.init(nodeKey1, ValidIpAddress.init("0.0.0.0"),
|
node1 = WakuNode.new(nodeKey1, ValidIpAddress.init("0.0.0.0"),
|
||||||
Port(60000))
|
Port(60000))
|
||||||
nodeKey2 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
nodeKey2 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
||||||
node2 = WakuNode.init(nodeKey2, ValidIpAddress.init("0.0.0.0"),
|
node2 = WakuNode.new(nodeKey2, ValidIpAddress.init("0.0.0.0"),
|
||||||
Port(60001))
|
Port(60001))
|
||||||
contentTopic = ContentTopic("/waku/2/default-content/proto")
|
contentTopic = ContentTopic("/waku/2/default-content/proto")
|
||||||
message = WakuMessage(payload: "hello world".toBytes(), contentTopic: contentTopic)
|
message = WakuMessage(payload: "hello world".toBytes(), contentTopic: contentTopic)
|
||||||
|
@ -96,10 +96,10 @@ procSuite "Waku SWAP Accounting":
|
||||||
asyncTest "Update accounting state after sending cheque":
|
asyncTest "Update accounting state after sending cheque":
|
||||||
let
|
let
|
||||||
nodeKey1 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
nodeKey1 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
||||||
node1 = WakuNode.init(nodeKey1, ValidIpAddress.init("0.0.0.0"),
|
node1 = WakuNode.new(nodeKey1, ValidIpAddress.init("0.0.0.0"),
|
||||||
Port(60000))
|
Port(60000))
|
||||||
nodeKey2 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
nodeKey2 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
||||||
node2 = WakuNode.init(nodeKey2, ValidIpAddress.init("0.0.0.0"),
|
node2 = WakuNode.new(nodeKey2, ValidIpAddress.init("0.0.0.0"),
|
||||||
Port(60001))
|
Port(60001))
|
||||||
contentTopic = ContentTopic("/waku/2/default-content/proto")
|
contentTopic = ContentTopic("/waku/2/default-content/proto")
|
||||||
message = WakuMessage(payload: "hello world".toBytes(), contentTopic: contentTopic)
|
message = WakuMessage(payload: "hello world".toBytes(), contentTopic: contentTopic)
|
||||||
|
|
|
@ -28,7 +28,7 @@ procSuite "WakuNode":
|
||||||
asyncTest "Message published with content filter is retrievable":
|
asyncTest "Message published with content filter is retrievable":
|
||||||
let
|
let
|
||||||
nodeKey = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
nodeKey = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
||||||
node = WakuNode.init(nodeKey, ValidIpAddress.init("0.0.0.0"),
|
node = WakuNode.new(nodeKey, ValidIpAddress.init("0.0.0.0"),
|
||||||
Port(60000))
|
Port(60000))
|
||||||
pubSubTopic = "chat"
|
pubSubTopic = "chat"
|
||||||
contentTopic = ContentTopic("/waku/2/default-content/proto")
|
contentTopic = ContentTopic("/waku/2/default-content/proto")
|
||||||
|
@ -77,10 +77,10 @@ procSuite "WakuNode":
|
||||||
asyncTest "Content filtered publishing over network":
|
asyncTest "Content filtered publishing over network":
|
||||||
let
|
let
|
||||||
nodeKey1 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
nodeKey1 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
||||||
node1 = WakuNode.init(nodeKey1, ValidIpAddress.init("0.0.0.0"),
|
node1 = WakuNode.new(nodeKey1, ValidIpAddress.init("0.0.0.0"),
|
||||||
Port(60000))
|
Port(60000))
|
||||||
nodeKey2 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
nodeKey2 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
||||||
node2 = WakuNode.init(nodeKey2, ValidIpAddress.init("0.0.0.0"),
|
node2 = WakuNode.new(nodeKey2, ValidIpAddress.init("0.0.0.0"),
|
||||||
Port(60002))
|
Port(60002))
|
||||||
pubSubTopic = "chat"
|
pubSubTopic = "chat"
|
||||||
contentTopic = ContentTopic("/waku/2/default-content/proto")
|
contentTopic = ContentTopic("/waku/2/default-content/proto")
|
||||||
|
@ -140,9 +140,9 @@ procSuite "WakuNode":
|
||||||
asyncTest "Can receive filtered messages published on both default and other topics":
|
asyncTest "Can receive filtered messages published on both default and other topics":
|
||||||
let
|
let
|
||||||
nodeKey1 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
nodeKey1 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
||||||
node1 = WakuNode.init(nodeKey1, ValidIpAddress.init("0.0.0.0"), Port(60000))
|
node1 = WakuNode.new(nodeKey1, ValidIpAddress.init("0.0.0.0"), Port(60000))
|
||||||
nodeKey2 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
nodeKey2 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
||||||
node2 = WakuNode.init(nodeKey2, ValidIpAddress.init("0.0.0.0"), Port(60002))
|
node2 = WakuNode.new(nodeKey2, ValidIpAddress.init("0.0.0.0"), Port(60002))
|
||||||
defaultTopic = "/waku/2/default-waku/proto"
|
defaultTopic = "/waku/2/default-waku/proto"
|
||||||
otherTopic = "/non/waku/formatted"
|
otherTopic = "/non/waku/formatted"
|
||||||
defaultContentTopic = "defaultCT"
|
defaultContentTopic = "defaultCT"
|
||||||
|
@ -216,9 +216,9 @@ procSuite "WakuNode":
|
||||||
asyncTest "Filter protocol works on node without relay capability":
|
asyncTest "Filter protocol works on node without relay capability":
|
||||||
let
|
let
|
||||||
nodeKey1 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
nodeKey1 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
||||||
node1 = WakuNode.init(nodeKey1, ValidIpAddress.init("0.0.0.0"), Port(60000))
|
node1 = WakuNode.new(nodeKey1, ValidIpAddress.init("0.0.0.0"), Port(60000))
|
||||||
nodeKey2 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
nodeKey2 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
||||||
node2 = WakuNode.init(nodeKey2, ValidIpAddress.init("0.0.0.0"), Port(60002))
|
node2 = WakuNode.new(nodeKey2, ValidIpAddress.init("0.0.0.0"), Port(60002))
|
||||||
defaultTopic = "/waku/2/default-waku/proto"
|
defaultTopic = "/waku/2/default-waku/proto"
|
||||||
contentTopic = "defaultCT"
|
contentTopic = "defaultCT"
|
||||||
payload = @[byte 1]
|
payload = @[byte 1]
|
||||||
|
@ -264,10 +264,10 @@ procSuite "WakuNode":
|
||||||
asyncTest "Store protocol returns expected message":
|
asyncTest "Store protocol returns expected message":
|
||||||
let
|
let
|
||||||
nodeKey1 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
nodeKey1 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
||||||
node1 = WakuNode.init(nodeKey1, ValidIpAddress.init("0.0.0.0"),
|
node1 = WakuNode.new(nodeKey1, ValidIpAddress.init("0.0.0.0"),
|
||||||
Port(60000))
|
Port(60000))
|
||||||
nodeKey2 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
nodeKey2 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
||||||
node2 = WakuNode.init(nodeKey2, ValidIpAddress.init("0.0.0.0"),
|
node2 = WakuNode.new(nodeKey2, ValidIpAddress.init("0.0.0.0"),
|
||||||
Port(60002))
|
Port(60002))
|
||||||
contentTopic = ContentTopic("/waku/2/default-content/proto")
|
contentTopic = ContentTopic("/waku/2/default-content/proto")
|
||||||
message = WakuMessage(payload: "hello world".toBytes(), contentTopic: contentTopic)
|
message = WakuMessage(payload: "hello world".toBytes(), contentTopic: contentTopic)
|
||||||
|
@ -300,10 +300,10 @@ procSuite "WakuNode":
|
||||||
asyncTest "Filter protocol returns expected message":
|
asyncTest "Filter protocol returns expected message":
|
||||||
let
|
let
|
||||||
nodeKey1 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
nodeKey1 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
||||||
node1 = WakuNode.init(nodeKey1, ValidIpAddress.init("0.0.0.0"),
|
node1 = WakuNode.new(nodeKey1, ValidIpAddress.init("0.0.0.0"),
|
||||||
Port(60000))
|
Port(60000))
|
||||||
nodeKey2 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
nodeKey2 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
||||||
node2 = WakuNode.init(nodeKey2, ValidIpAddress.init("0.0.0.0"),
|
node2 = WakuNode.new(nodeKey2, ValidIpAddress.init("0.0.0.0"),
|
||||||
Port(60002))
|
Port(60002))
|
||||||
contentTopic = ContentTopic("/waku/2/default-content/proto")
|
contentTopic = ContentTopic("/waku/2/default-content/proto")
|
||||||
message = WakuMessage(payload: "hello world".toBytes(), contentTopic: contentTopic)
|
message = WakuMessage(payload: "hello world".toBytes(), contentTopic: contentTopic)
|
||||||
|
@ -338,13 +338,13 @@ procSuite "WakuNode":
|
||||||
asyncTest "Messages are correctly relayed":
|
asyncTest "Messages are correctly relayed":
|
||||||
let
|
let
|
||||||
nodeKey1 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
nodeKey1 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
||||||
node1 = WakuNode.init(nodeKey1, ValidIpAddress.init("0.0.0.0"),
|
node1 = WakuNode.new(nodeKey1, ValidIpAddress.init("0.0.0.0"),
|
||||||
Port(60000))
|
Port(60000))
|
||||||
nodeKey2 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
nodeKey2 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
||||||
node2 = WakuNode.init(nodeKey2, ValidIpAddress.init("0.0.0.0"),
|
node2 = WakuNode.new(nodeKey2, ValidIpAddress.init("0.0.0.0"),
|
||||||
Port(60002))
|
Port(60002))
|
||||||
nodeKey3 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
nodeKey3 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
||||||
node3 = WakuNode.init(nodeKey3, ValidIpAddress.init("0.0.0.0"),
|
node3 = WakuNode.new(nodeKey3, ValidIpAddress.init("0.0.0.0"),
|
||||||
Port(60003))
|
Port(60003))
|
||||||
pubSubTopic = "test"
|
pubSubTopic = "test"
|
||||||
contentTopic = ContentTopic("/waku/2/default-content/proto")
|
contentTopic = ContentTopic("/waku/2/default-content/proto")
|
||||||
|
@ -389,10 +389,10 @@ procSuite "WakuNode":
|
||||||
asyncTest "Protocol matcher works as expected":
|
asyncTest "Protocol matcher works as expected":
|
||||||
let
|
let
|
||||||
nodeKey1 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
nodeKey1 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
||||||
node1 = WakuNode.init(nodeKey1, ValidIpAddress.init("0.0.0.0"),
|
node1 = WakuNode.new(nodeKey1, ValidIpAddress.init("0.0.0.0"),
|
||||||
Port(60000))
|
Port(60000))
|
||||||
nodeKey2 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
nodeKey2 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
||||||
node2 = WakuNode.init(nodeKey2, ValidIpAddress.init("0.0.0.0"),
|
node2 = WakuNode.new(nodeKey2, ValidIpAddress.init("0.0.0.0"),
|
||||||
Port(60002))
|
Port(60002))
|
||||||
pubSubTopic = "/waku/2/default-waku/proto"
|
pubSubTopic = "/waku/2/default-waku/proto"
|
||||||
contentTopic = ContentTopic("/waku/2/default-content/proto")
|
contentTopic = ContentTopic("/waku/2/default-content/proto")
|
||||||
|
@ -492,13 +492,13 @@ procSuite "WakuNode":
|
||||||
let
|
let
|
||||||
# publisher node
|
# publisher node
|
||||||
nodeKey1 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
nodeKey1 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
||||||
node1 = WakuNode.init(nodeKey1, ValidIpAddress.init("0.0.0.0"), Port(60000))
|
node1 = WakuNode.new(nodeKey1, ValidIpAddress.init("0.0.0.0"), Port(60000))
|
||||||
# Relay node
|
# Relay node
|
||||||
nodeKey2 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
nodeKey2 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
||||||
node2 = WakuNode.init(nodeKey2, ValidIpAddress.init("0.0.0.0"), Port(60002))
|
node2 = WakuNode.new(nodeKey2, ValidIpAddress.init("0.0.0.0"), Port(60002))
|
||||||
# Subscriber
|
# Subscriber
|
||||||
nodeKey3 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
nodeKey3 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
||||||
node3 = WakuNode.init(nodeKey3, ValidIpAddress.init("0.0.0.0"), Port(60003))
|
node3 = WakuNode.new(nodeKey3, ValidIpAddress.init("0.0.0.0"), Port(60003))
|
||||||
|
|
||||||
pubSubTopic = "test"
|
pubSubTopic = "test"
|
||||||
contentTopic1 = ContentTopic("/waku/2/default-content/proto")
|
contentTopic1 = ContentTopic("/waku/2/default-content/proto")
|
||||||
|
@ -586,13 +586,13 @@ procSuite "WakuNode":
|
||||||
let
|
let
|
||||||
# publisher node
|
# publisher node
|
||||||
nodeKey1 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
nodeKey1 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
||||||
node1 = WakuNode.init(nodeKey1, ValidIpAddress.init("0.0.0.0"), Port(60000))
|
node1 = WakuNode.new(nodeKey1, ValidIpAddress.init("0.0.0.0"), Port(60000))
|
||||||
# Relay node
|
# Relay node
|
||||||
nodeKey2 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
nodeKey2 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
||||||
node2 = WakuNode.init(nodeKey2, ValidIpAddress.init("0.0.0.0"), Port(60002))
|
node2 = WakuNode.new(nodeKey2, ValidIpAddress.init("0.0.0.0"), Port(60002))
|
||||||
# Subscriber
|
# Subscriber
|
||||||
nodeKey3 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
nodeKey3 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
||||||
node3 = WakuNode.init(nodeKey3, ValidIpAddress.init("0.0.0.0"), Port(60003))
|
node3 = WakuNode.new(nodeKey3, ValidIpAddress.init("0.0.0.0"), Port(60003))
|
||||||
|
|
||||||
pubSubTopic = "defaultTopic"
|
pubSubTopic = "defaultTopic"
|
||||||
contentTopic1 = ContentTopic("/waku/2/default-content/proto")
|
contentTopic1 = ContentTopic("/waku/2/default-content/proto")
|
||||||
|
@ -640,7 +640,7 @@ procSuite "WakuNode":
|
||||||
asyncTest "Relay protocol is started correctly":
|
asyncTest "Relay protocol is started correctly":
|
||||||
let
|
let
|
||||||
nodeKey1 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
nodeKey1 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
||||||
node1 = WakuNode.init(nodeKey1, ValidIpAddress.init("0.0.0.0"),
|
node1 = WakuNode.new(nodeKey1, ValidIpAddress.init("0.0.0.0"),
|
||||||
Port(60000))
|
Port(60000))
|
||||||
|
|
||||||
# Relay protocol starts if mounted after node start
|
# Relay protocol starts if mounted after node start
|
||||||
|
@ -656,7 +656,7 @@ procSuite "WakuNode":
|
||||||
|
|
||||||
let
|
let
|
||||||
nodeKey2 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
nodeKey2 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
||||||
node2 = WakuNode.init(nodeKey2, ValidIpAddress.init("0.0.0.0"),
|
node2 = WakuNode.new(nodeKey2, ValidIpAddress.init("0.0.0.0"),
|
||||||
Port(60002))
|
Port(60002))
|
||||||
|
|
||||||
node2.mountRelay()
|
node2.mountRelay()
|
||||||
|
@ -676,13 +676,13 @@ procSuite "WakuNode":
|
||||||
asyncTest "Lightpush message return success":
|
asyncTest "Lightpush message return success":
|
||||||
let
|
let
|
||||||
nodeKey1 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
nodeKey1 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
||||||
node1 = WakuNode.init(nodeKey1, ValidIpAddress.init("0.0.0.0"),
|
node1 = WakuNode.new(nodeKey1, ValidIpAddress.init("0.0.0.0"),
|
||||||
Port(60010))
|
Port(60010))
|
||||||
nodeKey2 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
nodeKey2 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
||||||
node2 = WakuNode.init(nodeKey2, ValidIpAddress.init("0.0.0.0"),
|
node2 = WakuNode.new(nodeKey2, ValidIpAddress.init("0.0.0.0"),
|
||||||
Port(60012))
|
Port(60012))
|
||||||
nodeKey3 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
nodeKey3 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
||||||
node3 = WakuNode.init(nodeKey3, ValidIpAddress.init("0.0.0.0"),
|
node3 = WakuNode.new(nodeKey3, ValidIpAddress.init("0.0.0.0"),
|
||||||
Port(60013))
|
Port(60013))
|
||||||
pubSubTopic = "test"
|
pubSubTopic = "test"
|
||||||
contentTopic = ContentTopic("/waku/2/default-content/proto")
|
contentTopic = ContentTopic("/waku/2/default-content/proto")
|
||||||
|
@ -747,10 +747,10 @@ procSuite "WakuNode":
|
||||||
asyncTest "Resume proc fetches the history":
|
asyncTest "Resume proc fetches the history":
|
||||||
let
|
let
|
||||||
nodeKey1 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
nodeKey1 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
||||||
node1 = WakuNode.init(nodeKey1, ValidIpAddress.init("0.0.0.0"),
|
node1 = WakuNode.new(nodeKey1, ValidIpAddress.init("0.0.0.0"),
|
||||||
Port(60000))
|
Port(60000))
|
||||||
nodeKey2 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
nodeKey2 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
||||||
node2 = WakuNode.init(nodeKey2, ValidIpAddress.init("0.0.0.0"),
|
node2 = WakuNode.new(nodeKey2, ValidIpAddress.init("0.0.0.0"),
|
||||||
Port(60002))
|
Port(60002))
|
||||||
contentTopic = ContentTopic("/waku/2/default-content/proto")
|
contentTopic = ContentTopic("/waku/2/default-content/proto")
|
||||||
message = WakuMessage(payload: "hello world".toBytes(), contentTopic: contentTopic)
|
message = WakuMessage(payload: "hello world".toBytes(), contentTopic: contentTopic)
|
||||||
|
@ -778,10 +778,10 @@ procSuite "WakuNode":
|
||||||
asyncTest "Resume proc discards duplicate messages":
|
asyncTest "Resume proc discards duplicate messages":
|
||||||
let
|
let
|
||||||
nodeKey1 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
nodeKey1 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
||||||
node1 = WakuNode.init(nodeKey1, ValidIpAddress.init("0.0.0.0"),
|
node1 = WakuNode.new(nodeKey1, ValidIpAddress.init("0.0.0.0"),
|
||||||
Port(60000))
|
Port(60000))
|
||||||
nodeKey2 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
nodeKey2 = crypto.PrivateKey.random(Secp256k1, rng[])[]
|
||||||
node2 = WakuNode.init(nodeKey2, ValidIpAddress.init("0.0.0.0"),
|
node2 = WakuNode.new(nodeKey2, ValidIpAddress.init("0.0.0.0"),
|
||||||
Port(60002))
|
Port(60002))
|
||||||
contentTopic = ContentTopic("/waku/2/default-content/proto")
|
contentTopic = ContentTopic("/waku/2/default-content/proto")
|
||||||
msg1 = WakuMessage(payload: "hello world1".toBytes(), contentTopic: contentTopic, timestamp: 1)
|
msg1 = WakuMessage(payload: "hello world1".toBytes(), contentTopic: contentTopic, timestamp: 1)
|
||||||
|
|
|
@ -163,7 +163,7 @@ proc new*(T: type WakuBridge,
|
||||||
|
|
||||||
# Setup Waku v2 node
|
# Setup Waku v2 node
|
||||||
let
|
let
|
||||||
nodev2 = WakuNode.init(nodev2Key,
|
nodev2 = WakuNode.new(nodev2Key,
|
||||||
nodev2BindIp, nodev2BindPort,
|
nodev2BindIp, nodev2BindPort,
|
||||||
nodev2ExtIp, nodev2ExtPort)
|
nodev2ExtIp, nodev2ExtPort)
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,7 @@ const maxCache* = 30 # Max number of messages cached per topic @TODO make this c
|
||||||
|
|
||||||
proc installFilterApiHandlers*(node: WakuNode, rpcsrv: RpcServer, messageCache: MessageCache) =
|
proc installFilterApiHandlers*(node: WakuNode, rpcsrv: RpcServer, messageCache: MessageCache) =
|
||||||
|
|
||||||
proc filterHandler(msg: WakuMessage) {.gcsafe, closure.} =
|
proc filterHandler(msg: WakuMessage) {.gcsafe, closure, raises: [Defect].} =
|
||||||
# Add message to current cache
|
# Add message to current cache
|
||||||
trace "WakuMessage received", msg=msg
|
trace "WakuMessage received", msg=msg
|
||||||
|
|
||||||
|
|
|
@ -36,7 +36,7 @@ proc insertOrReplace(ps: PeerStorage,
|
||||||
peerId: PeerID,
|
peerId: PeerID,
|
||||||
storedInfo: StoredInfo,
|
storedInfo: StoredInfo,
|
||||||
connectedness: Connectedness,
|
connectedness: Connectedness,
|
||||||
disconnectTime: int64 = 0) {.raises: [Defect, Exception]} =
|
disconnectTime: int64 = 0) =
|
||||||
# Insert peer entry into persistent storage, or replace existing entry with updated info
|
# Insert peer entry into persistent storage, or replace existing entry with updated info
|
||||||
let res = ps.put(peerId, storedInfo, connectedness, disconnectTime)
|
let res = ps.put(peerId, storedInfo, connectedness, disconnectTime)
|
||||||
if res.isErr:
|
if res.isErr:
|
||||||
|
@ -77,7 +77,7 @@ proc dialPeer(pm: PeerManager, peerId: PeerID,
|
||||||
|
|
||||||
return none(Connection)
|
return none(Connection)
|
||||||
|
|
||||||
proc loadFromStorage(pm: PeerManager) {.raises: [Defect, Exception]} =
|
proc loadFromStorage(pm: PeerManager) =
|
||||||
# Load peers from storage, if available
|
# Load peers from storage, if available
|
||||||
proc onData(peerId: PeerID, storedInfo: StoredInfo, connectedness: Connectedness, disconnectTime: int64) =
|
proc onData(peerId: PeerID, storedInfo: StoredInfo, connectedness: Connectedness, disconnectTime: int64) =
|
||||||
if peerId == pm.switch.peerInfo.peerId:
|
if peerId == pm.switch.peerInfo.peerId:
|
||||||
|
@ -112,7 +112,7 @@ proc onConnEvent(pm: PeerManager, peerId: PeerID, event: ConnEvent) {.async.} =
|
||||||
pm.storage.insertOrReplace(peerId, pm.peerStore.get(peerId), CanConnect, getTime().toUnix)
|
pm.storage.insertOrReplace(peerId, pm.peerStore.get(peerId), CanConnect, getTime().toUnix)
|
||||||
return
|
return
|
||||||
|
|
||||||
proc new*(T: type PeerManager, switch: Switch, storage: PeerStorage = nil): PeerManager {.raises: [Defect, Exception]} =
|
proc new*(T: type PeerManager, switch: Switch, storage: PeerStorage = nil): PeerManager =
|
||||||
let pm = PeerManager(switch: switch,
|
let pm = PeerManager(switch: switch,
|
||||||
peerStore: WakuPeerStore.new(),
|
peerStore: WakuPeerStore.new(),
|
||||||
storage: storage)
|
storage: storage)
|
||||||
|
@ -162,7 +162,7 @@ proc hasPeers*(pm: PeerManager, proto: string): bool =
|
||||||
# Returns `true` if manager has any peers for the specified protocol
|
# Returns `true` if manager has any peers for the specified protocol
|
||||||
pm.peers.anyIt(it.protos.contains(proto))
|
pm.peers.anyIt(it.protos.contains(proto))
|
||||||
|
|
||||||
proc addPeer*(pm: PeerManager, peerInfo: PeerInfo, proto: string) {.raises: [Defect, Exception]} =
|
proc addPeer*(pm: PeerManager, peerInfo: PeerInfo, proto: string) =
|
||||||
# Adds peer to manager for the specified protocol
|
# Adds peer to manager for the specified protocol
|
||||||
|
|
||||||
if peerInfo.peerId == pm.switch.peerInfo.peerId:
|
if peerInfo.peerId == pm.switch.peerInfo.peerId:
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
{.push raises: [Defect].}
|
||||||
|
|
||||||
import
|
import
|
||||||
stew/results,
|
stew/results,
|
||||||
../../../protocol/waku_message,
|
../../../protocol/waku_message,
|
||||||
|
@ -8,7 +10,7 @@ import
|
||||||
## retrieve historical messages
|
## retrieve historical messages
|
||||||
|
|
||||||
type
|
type
|
||||||
DataProc* = proc(receiverTimestamp: float64, msg: WakuMessage, pubsubTopic: string) {.closure.}
|
DataProc* = proc(receiverTimestamp: float64, msg: WakuMessage, pubsubTopic: string) {.closure, raises: [Defect].}
|
||||||
|
|
||||||
MessageStoreResult*[T] = Result[T, string]
|
MessageStoreResult*[T] = Result[T, string]
|
||||||
|
|
||||||
|
@ -16,5 +18,5 @@ type
|
||||||
|
|
||||||
# MessageStore interface
|
# MessageStore interface
|
||||||
method put*(db: MessageStore, cursor: Index, message: WakuMessage, pubsubTopic: string): MessageStoreResult[void] {.base.} = discard
|
method put*(db: MessageStore, cursor: Index, message: WakuMessage, pubsubTopic: string): MessageStoreResult[void] {.base.} = discard
|
||||||
method getAll*(db: MessageStore, onData: DataProc): MessageStoreResult[bool] {.base, raises: [Defect, Exception].} = discard
|
method getAll*(db: MessageStore, onData: DataProc): MessageStoreResult[bool] {.base.} = discard
|
||||||
|
|
||||||
|
|
|
@ -78,7 +78,7 @@ method put*(db: WakuMessageStore, cursor: Index, message: WakuMessage, pubsubTop
|
||||||
|
|
||||||
ok()
|
ok()
|
||||||
|
|
||||||
method getAll*(db: WakuMessageStore, onData: message_store.DataProc): MessageStoreResult[bool] {.raises: [Defect, Exception].} =
|
method getAll*(db: WakuMessageStore, onData: message_store.DataProc): MessageStoreResult[bool] =
|
||||||
## Retrieves all messages from the storage.
|
## Retrieves all messages from the storage.
|
||||||
##
|
##
|
||||||
## **Example:**
|
## **Example:**
|
||||||
|
@ -91,7 +91,7 @@ method getAll*(db: WakuMessageStore, onData: message_store.DataProc): MessageSto
|
||||||
## if res.isErr:
|
## if res.isErr:
|
||||||
## echo "error"
|
## echo "error"
|
||||||
var gotMessages = false
|
var gotMessages = false
|
||||||
proc msg(s: ptr sqlite3_stmt) {.raises: [Defect, Exception].} =
|
proc msg(s: ptr sqlite3_stmt) =
|
||||||
gotMessages = true
|
gotMessages = true
|
||||||
let
|
let
|
||||||
receiverTimestamp = sqlite3_column_double(s, 0)
|
receiverTimestamp = sqlite3_column_double(s, 0)
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
{.push raises: [Defect].}
|
||||||
|
|
||||||
import
|
import
|
||||||
stew/results,
|
stew/results,
|
||||||
chronos,
|
chronos,
|
||||||
|
@ -12,7 +14,7 @@ type
|
||||||
PeerStorageResult*[T] = Result[T, string]
|
PeerStorageResult*[T] = Result[T, string]
|
||||||
|
|
||||||
DataProc* = proc(peerId: PeerID, storedInfo: StoredInfo,
|
DataProc* = proc(peerId: PeerID, storedInfo: StoredInfo,
|
||||||
connectedness: Connectedness, disconnectTime: int64) {.closure.}
|
connectedness: Connectedness, disconnectTime: int64) {.closure, raises: [Defect].}
|
||||||
|
|
||||||
# PeerStorage interface
|
# PeerStorage interface
|
||||||
method put*(db: PeerStorage,
|
method put*(db: PeerStorage,
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
{.push raises: [Defect].}
|
||||||
|
|
||||||
import
|
import
|
||||||
std/sets,
|
std/sets,
|
||||||
sqlite3_abi,
|
sqlite3_abi,
|
||||||
|
@ -36,7 +38,7 @@ proc init*(T: type StoredInfo, buffer: seq[byte]): ProtoResult[T] =
|
||||||
|
|
||||||
ok(storedInfo)
|
ok(storedInfo)
|
||||||
|
|
||||||
proc encode*(storedInfo: StoredInfo): ProtoBuffer =
|
proc encode*(storedInfo: StoredInfo): PeerStorageResult[ProtoBuffer] =
|
||||||
var pb = initProtoBuffer()
|
var pb = initProtoBuffer()
|
||||||
|
|
||||||
pb.write(1, storedInfo.peerId)
|
pb.write(1, storedInfo.peerId)
|
||||||
|
@ -47,9 +49,12 @@ proc encode*(storedInfo: StoredInfo): ProtoBuffer =
|
||||||
for proto in storedInfo.protos.items:
|
for proto in storedInfo.protos.items:
|
||||||
pb.write(3, proto)
|
pb.write(3, proto)
|
||||||
|
|
||||||
pb.write(4, storedInfo.publicKey)
|
try:
|
||||||
|
pb.write(4, storedInfo.publicKey)
|
||||||
|
except ResultError[CryptoError] as e:
|
||||||
|
return err("Failed to encode public key")
|
||||||
|
|
||||||
return pb
|
ok(pb)
|
||||||
|
|
||||||
##########################
|
##########################
|
||||||
# Storage implementation #
|
# Storage implementation #
|
||||||
|
@ -97,7 +102,12 @@ method put*(db: WakuPeerStorage,
|
||||||
if prepare.isErr:
|
if prepare.isErr:
|
||||||
return err("failed to prepare")
|
return err("failed to prepare")
|
||||||
|
|
||||||
let res = prepare.value.exec((peerId.data, storedInfo.encode().buffer, int32(ord(connectedness)), disconnectTime))
|
let encoded = storedInfo.encode()
|
||||||
|
|
||||||
|
if encoded.isErr:
|
||||||
|
return err("failed to encode: " & encoded.error())
|
||||||
|
|
||||||
|
let res = prepare.value.exec((peerId.data, encoded.get().buffer, int32(ord(connectedness)), disconnectTime))
|
||||||
if res.isErr:
|
if res.isErr:
|
||||||
return err("failed")
|
return err("failed")
|
||||||
|
|
||||||
|
@ -107,7 +117,7 @@ method getAll*(db: WakuPeerStorage, onData: peer_storage.DataProc): PeerStorageR
|
||||||
## Retrieves all peers from storage
|
## Retrieves all peers from storage
|
||||||
var gotPeers = false
|
var gotPeers = false
|
||||||
|
|
||||||
proc peer(s: ptr sqlite3_stmt) =
|
proc peer(s: ptr sqlite3_stmt) {.raises: [Defect, LPError, ResultError[ProtoError]].} =
|
||||||
gotPeers = true
|
gotPeers = true
|
||||||
let
|
let
|
||||||
# Peer ID
|
# Peer ID
|
||||||
|
@ -125,8 +135,13 @@ method getAll*(db: WakuPeerStorage, onData: peer_storage.DataProc): PeerStorageR
|
||||||
|
|
||||||
onData(peerId, storedInfo, connectedness, disconnectTime)
|
onData(peerId, storedInfo, connectedness, disconnectTime)
|
||||||
|
|
||||||
let res = db.database.query("SELECT peerId, storedInfo, connectedness, disconnectTime FROM Peer", peer)
|
var queryResult: DatabaseResult[bool]
|
||||||
if res.isErr:
|
try:
|
||||||
|
queryResult = db.database.query("SELECT peerId, storedInfo, connectedness, disconnectTime FROM Peer", peer)
|
||||||
|
except LPError, ResultError[ProtoError]:
|
||||||
|
return err("failed to extract peer from query result")
|
||||||
|
|
||||||
|
if queryResult.isErr:
|
||||||
return err("failed")
|
return err("failed")
|
||||||
|
|
||||||
ok gotPeers
|
ok gotPeers
|
||||||
|
|
|
@ -1,18 +1,14 @@
|
||||||
|
{.push raises: [Defect].}
|
||||||
|
|
||||||
import
|
import
|
||||||
std/[options, tables, strutils, sequtils, os],
|
std/[options, tables, strutils, sequtils, os],
|
||||||
chronos, chronicles, metrics,
|
chronos, chronicles, metrics,
|
||||||
metrics/chronos_httpserver,
|
metrics/chronos_httpserver,
|
||||||
stew/shims/net as stewNet,
|
stew/shims/net as stewNet,
|
||||||
# TODO: Why do we need eth keys?
|
|
||||||
eth/keys,
|
eth/keys,
|
||||||
web3,
|
web3,
|
||||||
libp2p/multiaddress,
|
|
||||||
libp2p/crypto/crypto,
|
libp2p/crypto/crypto,
|
||||||
libp2p/protocols/protocol,
|
|
||||||
libp2p/protocols/ping,
|
libp2p/protocols/ping,
|
||||||
# NOTE For TopicHandler, solve with exports?
|
|
||||||
libp2p/protocols/pubsub/rpc/messages,
|
|
||||||
libp2p/protocols/pubsub/pubsub,
|
|
||||||
libp2p/protocols/pubsub/gossipsub,
|
libp2p/protocols/pubsub/gossipsub,
|
||||||
libp2p/builders,
|
libp2p/builders,
|
||||||
../protocol/[waku_relay, waku_message],
|
../protocol/[waku_relay, waku_message],
|
||||||
|
@ -22,10 +18,10 @@ import
|
||||||
../protocol/waku_lightpush/waku_lightpush,
|
../protocol/waku_lightpush/waku_lightpush,
|
||||||
../protocol/waku_rln_relay/waku_rln_relay_types,
|
../protocol/waku_rln_relay/waku_rln_relay_types,
|
||||||
../utils/peers,
|
../utils/peers,
|
||||||
|
../utils/requests,
|
||||||
./storage/message/message_store,
|
./storage/message/message_store,
|
||||||
./storage/peer/peer_storage,
|
./storage/peer/peer_storage,
|
||||||
./storage/migration/migration_types,
|
./storage/migration/migration_types,
|
||||||
../utils/requests,
|
|
||||||
./peer_manager/peer_manager
|
./peer_manager/peer_manager
|
||||||
|
|
||||||
when defined(rln):
|
when defined(rln):
|
||||||
|
@ -78,14 +74,6 @@ type
|
||||||
rng*: ref BrHmacDrbgContext
|
rng*: ref BrHmacDrbgContext
|
||||||
started*: bool # Indicates that node has started listening
|
started*: bool # Indicates that node has started listening
|
||||||
|
|
||||||
# NOTE Any difference here in Waku vs Eth2?
|
|
||||||
# E.g. Devp2p/Libp2p support, etc.
|
|
||||||
#func asLibp2pKey*(key: keys.PublicKey): PublicKey =
|
|
||||||
# PublicKey(scheme: Secp256k1, skkey: secp.SkPublicKey(key))
|
|
||||||
|
|
||||||
func asEthKey*(key: PrivateKey): keys.PrivateKey =
|
|
||||||
keys.PrivateKey(key.skkey)
|
|
||||||
|
|
||||||
func protocolMatcher(codec: string): Matcher =
|
func protocolMatcher(codec: string): Matcher =
|
||||||
## Returns a protocol matcher function for the provided codec
|
## Returns a protocol matcher function for the provided codec
|
||||||
|
|
||||||
|
@ -125,10 +113,11 @@ template tcpEndPoint(address, port): auto =
|
||||||
## Public API
|
## Public API
|
||||||
##
|
##
|
||||||
|
|
||||||
proc init*(T: type WakuNode, nodeKey: crypto.PrivateKey,
|
proc new*(T: type WakuNode, nodeKey: crypto.PrivateKey,
|
||||||
bindIp: ValidIpAddress, bindPort: Port,
|
bindIp: ValidIpAddress, bindPort: Port,
|
||||||
extIp = none[ValidIpAddress](), extPort = none[Port](),
|
extIp = none[ValidIpAddress](), extPort = none[Port](),
|
||||||
peerStorage: PeerStorage = nil): T =
|
peerStorage: PeerStorage = nil): T
|
||||||
|
{.raises: [Defect, LPError].} =
|
||||||
## Creates a Waku Node.
|
## Creates a Waku Node.
|
||||||
##
|
##
|
||||||
## Status: Implemented.
|
## Status: Implemented.
|
||||||
|
@ -155,7 +144,7 @@ proc init*(T: type WakuNode, nodeKey: crypto.PrivateKey,
|
||||||
# msgIdProvider = msgIdProvider,
|
# msgIdProvider = msgIdProvider,
|
||||||
# triggerSelf = true, sign = false,
|
# triggerSelf = true, sign = false,
|
||||||
# verifySignature = false).PubSub
|
# verifySignature = false).PubSub
|
||||||
result = WakuNode(
|
let wakuNode = WakuNode(
|
||||||
peerManager: PeerManager.new(switch, peerStorage),
|
peerManager: PeerManager.new(switch, peerStorage),
|
||||||
switch: switch,
|
switch: switch,
|
||||||
rng: rng,
|
rng: rng,
|
||||||
|
@ -163,6 +152,8 @@ proc init*(T: type WakuNode, nodeKey: crypto.PrivateKey,
|
||||||
filters: initTable[string, Filter]()
|
filters: initTable[string, Filter]()
|
||||||
)
|
)
|
||||||
|
|
||||||
|
return wakuNode
|
||||||
|
|
||||||
proc start*(node: WakuNode) {.async.} =
|
proc start*(node: WakuNode) {.async.} =
|
||||||
## Starts a created Waku Node.
|
## Starts a created Waku Node.
|
||||||
##
|
##
|
||||||
|
@ -393,9 +384,11 @@ proc info*(node: WakuNode): WakuInfo =
|
||||||
let wakuInfo = WakuInfo(listenStr: listenStr)
|
let wakuInfo = WakuInfo(listenStr: listenStr)
|
||||||
return wakuInfo
|
return wakuInfo
|
||||||
|
|
||||||
proc mountFilter*(node: WakuNode) =
|
proc mountFilter*(node: WakuNode) {.raises: [Defect, KeyError, LPError]} =
|
||||||
info "mounting filter"
|
info "mounting filter"
|
||||||
proc filterHandler(requestId: string, msg: MessagePush) {.gcsafe.} =
|
proc filterHandler(requestId: string, msg: MessagePush)
|
||||||
|
{.gcsafe, raises: [Defect, KeyError].} =
|
||||||
|
|
||||||
info "push received"
|
info "push received"
|
||||||
for message in msg.messages:
|
for message in msg.messages:
|
||||||
node.filters.notify(message, requestId) # Trigger filter handlers on a light node
|
node.filters.notify(message, requestId) # Trigger filter handlers on a light node
|
||||||
|
@ -406,14 +399,14 @@ proc mountFilter*(node: WakuNode) =
|
||||||
|
|
||||||
# NOTE: If using the swap protocol, it must be mounted before store. This is
|
# NOTE: If using the swap protocol, it must be mounted before store. This is
|
||||||
# because store is using a reference to the swap protocol.
|
# because store is using a reference to the swap protocol.
|
||||||
proc mountSwap*(node: WakuNode, swapConfig: SwapConfig = SwapConfig.init()) =
|
proc mountSwap*(node: WakuNode, swapConfig: SwapConfig = SwapConfig.init()) {.raises: [Defect, LPError].} =
|
||||||
info "mounting swap", mode = $swapConfig.mode
|
info "mounting swap", mode = $swapConfig.mode
|
||||||
node.wakuSwap = WakuSwap.init(node.peerManager, node.rng, swapConfig)
|
node.wakuSwap = WakuSwap.init(node.peerManager, node.rng, swapConfig)
|
||||||
node.switch.mount(node.wakuSwap, protocolMatcher(WakuSwapCodec))
|
node.switch.mount(node.wakuSwap, protocolMatcher(WakuSwapCodec))
|
||||||
# NYI - Do we need this?
|
# NYI - Do we need this?
|
||||||
#node.subscriptions.subscribe(WakuSwapCodec, node.wakuSwap.subscription())
|
#node.subscriptions.subscribe(WakuSwapCodec, node.wakuSwap.subscription())
|
||||||
|
|
||||||
proc mountStore*(node: WakuNode, store: MessageStore = nil, persistMessages: bool = false) =
|
proc mountStore*(node: WakuNode, store: MessageStore = nil, persistMessages: bool = false) {.raises: [Defect, LPError].} =
|
||||||
info "mounting store"
|
info "mounting store"
|
||||||
|
|
||||||
if node.wakuSwap.isNil:
|
if node.wakuSwap.isNil:
|
||||||
|
@ -426,7 +419,10 @@ proc mountStore*(node: WakuNode, store: MessageStore = nil, persistMessages: boo
|
||||||
node.switch.mount(node.wakuStore, protocolMatcher(WakuStoreCodec))
|
node.switch.mount(node.wakuStore, protocolMatcher(WakuStoreCodec))
|
||||||
|
|
||||||
when defined(rln):
|
when defined(rln):
|
||||||
proc mountRlnRelay*(node: WakuNode, ethClientAddress: Option[string] = none(string), ethAccountAddress: Option[Address] = none(Address), membershipContractAddress: Option[Address] = none(Address)) {.async.} =
|
proc mountRlnRelay*(node: WakuNode,
|
||||||
|
ethClientAddress: Option[string] = none(string),
|
||||||
|
ethAccountAddress: Option[Address] = none(Address),
|
||||||
|
membershipContractAddress: Option[Address] = none(Address)) {.async.} =
|
||||||
# TODO return a bool value to indicate the success of the call
|
# TODO return a bool value to indicate the success of the call
|
||||||
# check whether inputs are provided
|
# check whether inputs are provided
|
||||||
doAssert(ethClientAddress.isSome())
|
doAssert(ethClientAddress.isSome())
|
||||||
|
@ -469,7 +465,7 @@ when defined(rln):
|
||||||
if msg.isOk():
|
if msg.isOk():
|
||||||
# check the proof
|
# check the proof
|
||||||
if proofVrfy(msg.value().payload, msg.value().proof):
|
if proofVrfy(msg.value().payload, msg.value().proof):
|
||||||
result = ValidationResult.Accept
|
return ValidationResult.Accept
|
||||||
# set a validator for the pubsubTopic
|
# set a validator for the pubsubTopic
|
||||||
let pb = PubSub(node.wakuRelay)
|
let pb = PubSub(node.wakuRelay)
|
||||||
pb.addValidator(pubsubTopic, validator)
|
pb.addValidator(pubsubTopic, validator)
|
||||||
|
@ -478,7 +474,10 @@ proc mountRelay*(node: WakuNode,
|
||||||
topics: seq[string] = newSeq[string](),
|
topics: seq[string] = newSeq[string](),
|
||||||
rlnRelayEnabled = false,
|
rlnRelayEnabled = false,
|
||||||
relayMessages = true,
|
relayMessages = true,
|
||||||
triggerSelf = true) {.gcsafe.} =
|
triggerSelf = true)
|
||||||
|
# @TODO: Better error handling: CatchableError is raised by `waitFor`
|
||||||
|
{.gcsafe, raises: [Defect, InitializationError, LPError, CatchableError].} =
|
||||||
|
|
||||||
let wakuRelay = WakuRelay.init(
|
let wakuRelay = WakuRelay.init(
|
||||||
switch = node.switch,
|
switch = node.switch,
|
||||||
# Use default
|
# Use default
|
||||||
|
@ -529,7 +528,7 @@ proc mountRelay*(node: WakuNode,
|
||||||
|
|
||||||
info "relay mounted and started successfully"
|
info "relay mounted and started successfully"
|
||||||
|
|
||||||
proc mountLightPush*(node: WakuNode) =
|
proc mountLightPush*(node: WakuNode) {.raises: [Defect, LPError].} =
|
||||||
info "mounting light push"
|
info "mounting light push"
|
||||||
|
|
||||||
if node.wakuRelay.isNil:
|
if node.wakuRelay.isNil:
|
||||||
|
@ -541,10 +540,15 @@ proc mountLightPush*(node: WakuNode) =
|
||||||
|
|
||||||
node.switch.mount(node.wakuLightPush, protocolMatcher(WakuLightPushCodec))
|
node.switch.mount(node.wakuLightPush, protocolMatcher(WakuLightPushCodec))
|
||||||
|
|
||||||
proc mountLibp2pPing*(node: WakuNode) =
|
proc mountLibp2pPing*(node: WakuNode) {.raises: [Defect, LPError].} =
|
||||||
info "mounting libp2p ping protocol"
|
info "mounting libp2p ping protocol"
|
||||||
|
|
||||||
node.libp2pPing = Ping.new(rng = node.rng)
|
try:
|
||||||
|
node.libp2pPing = Ping.new(rng = node.rng)
|
||||||
|
except Exception as e:
|
||||||
|
# This is necessary as `Ping.new*` does not have explicit `raises` requirement
|
||||||
|
# @TODO: remove exception handling once explicit `raises` in ping module
|
||||||
|
raise newException(LPError, "Failed to initialise ping protocol")
|
||||||
|
|
||||||
node.switch.mount(node.libp2pPing)
|
node.switch.mount(node.libp2pPing)
|
||||||
|
|
||||||
|
@ -590,21 +594,21 @@ proc dialPeer*(n: WakuNode, address: string) {.async.} =
|
||||||
discard await n.peerManager.dialPeer(remotePeer, WakuRelayCodec)
|
discard await n.peerManager.dialPeer(remotePeer, WakuRelayCodec)
|
||||||
info "Post peerManager dial"
|
info "Post peerManager dial"
|
||||||
|
|
||||||
proc setStorePeer*(n: WakuNode, address: string) =
|
proc setStorePeer*(n: WakuNode, address: string) {.raises: [Defect, ValueError, LPError].} =
|
||||||
info "Set store peer", address = address
|
info "Set store peer", address = address
|
||||||
|
|
||||||
let remotePeer = parsePeerInfo(address)
|
let remotePeer = parsePeerInfo(address)
|
||||||
|
|
||||||
n.wakuStore.setPeer(remotePeer)
|
n.wakuStore.setPeer(remotePeer)
|
||||||
|
|
||||||
proc setFilterPeer*(n: WakuNode, address: string) =
|
proc setFilterPeer*(n: WakuNode, address: string) {.raises: [Defect, ValueError, LPError].} =
|
||||||
info "Set filter peer", address = address
|
info "Set filter peer", address = address
|
||||||
|
|
||||||
let remotePeer = parsePeerInfo(address)
|
let remotePeer = parsePeerInfo(address)
|
||||||
|
|
||||||
n.wakuFilter.setPeer(remotePeer)
|
n.wakuFilter.setPeer(remotePeer)
|
||||||
|
|
||||||
proc setLightPushPeer*(n: WakuNode, address: string) =
|
proc setLightPushPeer*(n: WakuNode, address: string) {.raises: [Defect, ValueError, LPError].} =
|
||||||
info "Set lightpush peer", address = address
|
info "Set lightpush peer", address = address
|
||||||
|
|
||||||
let remotePeer = parsePeerInfo(address)
|
let remotePeer = parsePeerInfo(address)
|
||||||
|
@ -638,6 +642,7 @@ proc connectToNodes*(n: WakuNode, nodes: seq[PeerInfo]) {.async.} =
|
||||||
# later.
|
# later.
|
||||||
await sleepAsync(5.seconds)
|
await sleepAsync(5.seconds)
|
||||||
|
|
||||||
|
{.pop.} # @TODO confutils.nim(775, 17) Error: can raise an unlisted exception: ref IOError
|
||||||
when isMainModule:
|
when isMainModule:
|
||||||
import
|
import
|
||||||
system/ansi_c,
|
system/ansi_c,
|
||||||
|
@ -653,7 +658,7 @@ when isMainModule:
|
||||||
./storage/peer/waku_peer_storage,
|
./storage/peer/waku_peer_storage,
|
||||||
../../common/utils/nat
|
../../common/utils/nat
|
||||||
|
|
||||||
proc startRpc(node: WakuNode, rpcIp: ValidIpAddress, rpcPort: Port, conf: WakuNodeConf) =
|
proc startRpc(node: WakuNode, rpcIp: ValidIpAddress, rpcPort: Port, conf: WakuNodeConf) {.raises: [Defect, RpcBindError, CatchableError].} =
|
||||||
let
|
let
|
||||||
ta = initTAddress(rpcIp, rpcPort)
|
ta = initTAddress(rpcIp, rpcPort)
|
||||||
rpcServer = newRpcHttpServer([ta])
|
rpcServer = newRpcHttpServer([ta])
|
||||||
|
@ -681,7 +686,7 @@ when isMainModule:
|
||||||
rpcServer.start()
|
rpcServer.start()
|
||||||
info "RPC Server started", ta
|
info "RPC Server started", ta
|
||||||
|
|
||||||
proc startMetricsServer(serverIp: ValidIpAddress, serverPort: Port) =
|
proc startMetricsServer(serverIp: ValidIpAddress, serverPort: Port) {.raises: [Defect, Exception].} =
|
||||||
info "Starting metrics HTTP server", serverIp, serverPort
|
info "Starting metrics HTTP server", serverIp, serverPort
|
||||||
|
|
||||||
startMetricsHttpServer($serverIp, serverPort)
|
startMetricsHttpServer($serverIp, serverPort)
|
||||||
|
@ -755,10 +760,10 @@ when isMainModule:
|
||||||
## config, the external port is the same as the bind port.
|
## config, the external port is the same as the bind port.
|
||||||
extPort = if extIp.isSome() and extTcpPort.isNone(): some(Port(uint16(conf.tcpPort) + conf.portsShift))
|
extPort = if extIp.isSome() and extTcpPort.isNone(): some(Port(uint16(conf.tcpPort) + conf.portsShift))
|
||||||
else: extTcpPort
|
else: extTcpPort
|
||||||
node = WakuNode.init(conf.nodekey,
|
node = WakuNode.new(conf.nodekey,
|
||||||
conf.listenAddress, Port(uint16(conf.tcpPort) + conf.portsShift),
|
conf.listenAddress, Port(uint16(conf.tcpPort) + conf.portsShift),
|
||||||
extIp, extPort,
|
extIp, extPort,
|
||||||
pStorage)
|
pStorage)
|
||||||
|
|
||||||
waitFor node.start()
|
waitFor node.start()
|
||||||
|
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
{.push raises: [Defect].}
|
||||||
|
|
||||||
import
|
import
|
||||||
std/[tables, sequtils, options],
|
std/[tables, sequtils, options],
|
||||||
bearssl,
|
bearssl,
|
||||||
|
@ -34,7 +36,7 @@ const
|
||||||
dialFailure = "dial_failure"
|
dialFailure = "dial_failure"
|
||||||
decodeRpcFailure = "decode_rpc_failure"
|
decodeRpcFailure = "decode_rpc_failure"
|
||||||
|
|
||||||
proc notify*(filters: Filters, msg: WakuMessage, requestId: string = "") =
|
proc notify*(filters: Filters, msg: WakuMessage, requestId: string = "") {.raises: [Defect, KeyError]} =
|
||||||
for key in filters.keys:
|
for key in filters.keys:
|
||||||
let filter = filters[key]
|
let filter = filters[key]
|
||||||
# We do this because the key for the filter is set to the requestId received from the filter protocol.
|
# We do this because the key for the filter is set to the requestId received from the filter protocol.
|
||||||
|
|
|
@ -12,7 +12,7 @@ type
|
||||||
ContentFilter* = object
|
ContentFilter* = object
|
||||||
contentTopic*: ContentTopic
|
contentTopic*: ContentTopic
|
||||||
|
|
||||||
ContentFilterHandler* = proc(msg: WakuMessage) {.gcsafe, closure.}
|
ContentFilterHandler* = proc(msg: WakuMessage) {.gcsafe, closure, raises: [Defect].}
|
||||||
|
|
||||||
Filter* = object
|
Filter* = object
|
||||||
contentFilters*: seq[ContentFilter]
|
contentFilters*: seq[ContentFilter]
|
||||||
|
|
|
@ -1,3 +1,5 @@
|
||||||
|
{.push raises: [Defect].}
|
||||||
|
|
||||||
import
|
import
|
||||||
std/[tables, sequtils, options],
|
std/[tables, sequtils, options],
|
||||||
bearssl,
|
bearssl,
|
||||||
|
|
|
@ -360,7 +360,7 @@ proc findMessages(w: WakuStore, query: HistoryQuery): HistoryResponse =
|
||||||
return historyRes
|
return historyRes
|
||||||
|
|
||||||
|
|
||||||
proc init*(ws: WakuStore) {.raises: [Defect, Exception]} =
|
proc init*(ws: WakuStore) =
|
||||||
proc handler(conn: Connection, proto: string) {.async.} =
|
proc handler(conn: Connection, proto: string) {.async.} =
|
||||||
var message = await conn.readLp(64*1024)
|
var message = await conn.readLp(64*1024)
|
||||||
var res = HistoryRPC.init(message)
|
var res = HistoryRPC.init(message)
|
||||||
|
@ -411,14 +411,14 @@ proc init*(ws: WakuStore) {.raises: [Defect, Exception]} =
|
||||||
|
|
||||||
|
|
||||||
proc init*(T: type WakuStore, peerManager: PeerManager, rng: ref BrHmacDrbgContext,
|
proc init*(T: type WakuStore, peerManager: PeerManager, rng: ref BrHmacDrbgContext,
|
||||||
store: MessageStore = nil, wakuSwap: WakuSwap = nil, persistMessages = true): T {.raises: [Defect, Exception]} =
|
store: MessageStore = nil, wakuSwap: WakuSwap = nil, persistMessages = true): T =
|
||||||
debug "init"
|
debug "init"
|
||||||
var output = WakuStore(rng: rng, peerManager: peerManager, store: store, wakuSwap: wakuSwap, persistMessages: persistMessages)
|
var output = WakuStore(rng: rng, peerManager: peerManager, store: store, wakuSwap: wakuSwap, persistMessages: persistMessages)
|
||||||
output.init()
|
output.init()
|
||||||
return output
|
return output
|
||||||
|
|
||||||
# @TODO THIS SHOULD PROBABLY BE AN ADD FUNCTION AND APPEND THE PEER TO AN ARRAY
|
# @TODO THIS SHOULD PROBABLY BE AN ADD FUNCTION AND APPEND THE PEER TO AN ARRAY
|
||||||
proc setPeer*(ws: WakuStore, peer: PeerInfo) {.raises: [Defect, Exception]} =
|
proc setPeer*(ws: WakuStore, peer: PeerInfo) =
|
||||||
ws.peerManager.addPeer(peer, WakuStoreCodec)
|
ws.peerManager.addPeer(peer, WakuStoreCodec)
|
||||||
waku_store_peers.inc()
|
waku_store_peers.inc()
|
||||||
|
|
||||||
|
@ -519,7 +519,7 @@ proc queryFromWithPaging*(w: WakuStore, query: HistoryQuery, peer: PeerInfo): Fu
|
||||||
debug "query is", q=q
|
debug "query is", q=q
|
||||||
|
|
||||||
var hasNextPage = true
|
var hasNextPage = true
|
||||||
proc handler(response: HistoryResponse) {.gcsafe, raises: [Defect, Exception].} =
|
proc handler(response: HistoryResponse) {.gcsafe.} =
|
||||||
# store messages
|
# store messages
|
||||||
for m in response.messages.items: messageList.add(m)
|
for m in response.messages.items: messageList.add(m)
|
||||||
|
|
||||||
|
@ -590,7 +590,7 @@ proc resume*(ws: WakuStore, peerList: Option[seq[PeerInfo]] = none(seq[PeerInfo]
|
||||||
|
|
||||||
var dismissed: uint = 0
|
var dismissed: uint = 0
|
||||||
var added: uint = 0
|
var added: uint = 0
|
||||||
proc save(msgList: seq[WakuMessage]) {.raises: [Defect, Exception].} =
|
proc save(msgList: seq[WakuMessage]) =
|
||||||
debug "save proc is called"
|
debug "save proc is called"
|
||||||
# exclude index from the comparison criteria
|
# exclude index from the comparison criteria
|
||||||
let currentMsgSummary = ws.messages.map(proc(x: IndexedWakuMessage): WakuMessage = x.msg)
|
let currentMsgSummary = ws.messages.map(proc(x: IndexedWakuMessage): WakuMessage = x.msg)
|
||||||
|
|
|
@ -1,10 +1,13 @@
|
||||||
|
{.push raises: [Defect].}
|
||||||
|
|
||||||
# Collection of utilities related to Waku peers
|
# Collection of utilities related to Waku peers
|
||||||
import
|
import
|
||||||
std/strutils,
|
std/strutils,
|
||||||
libp2p/multiaddress,
|
libp2p/multiaddress,
|
||||||
libp2p/peerinfo
|
libp2p/peerinfo
|
||||||
|
|
||||||
proc initAddress(T: type MultiAddress, str: string): T =
|
proc initAddress(T: type MultiAddress, str: string): T {.raises: [Defect, ValueError, LPError].}=
|
||||||
|
# @TODO: Rather than raising exceptions, this should return a Result
|
||||||
let address = MultiAddress.init(str).tryGet()
|
let address = MultiAddress.init(str).tryGet()
|
||||||
if IPFS.match(address) and matchPartial(multiaddress.TCP, address):
|
if IPFS.match(address) and matchPartial(multiaddress.TCP, address):
|
||||||
result = address
|
result = address
|
||||||
|
@ -14,7 +17,7 @@ proc initAddress(T: type MultiAddress, str: string): T =
|
||||||
|
|
||||||
## Parses a fully qualified peer multiaddr, in the
|
## Parses a fully qualified peer multiaddr, in the
|
||||||
## format `(ip4|ip6)/tcp/p2p`, into dialable PeerInfo
|
## format `(ip4|ip6)/tcp/p2p`, into dialable PeerInfo
|
||||||
proc parsePeerInfo*(address: string): PeerInfo =
|
proc parsePeerInfo*(address: string): PeerInfo {.raises: [Defect, ValueError, LPError].}=
|
||||||
let multiAddr = MultiAddress.initAddress(address)
|
let multiAddr = MultiAddress.initAddress(address)
|
||||||
|
|
||||||
var
|
var
|
||||||
|
|
|
@ -28,7 +28,7 @@ proc echo() {.exportc.} =
|
||||||
# (extIp, extTcpPort, extUdpPort) = setupNat(conf.nat, clientId,
|
# (extIp, extTcpPort, extUdpPort) = setupNat(conf.nat, clientId,
|
||||||
# Port(uint16(conf.tcpPort) + conf.portsShift),
|
# Port(uint16(conf.tcpPort) + conf.portsShift),
|
||||||
# Port(uint16(conf.udpPort) + conf.portsShift))
|
# Port(uint16(conf.udpPort) + conf.portsShift))
|
||||||
# node = WakuNode.init(conf.nodeKey, conf.listenAddress,
|
# node = WakuNode.new(conf.nodeKey, conf.listenAddress,
|
||||||
# Port(uint16(conf.tcpPort) + conf.portsShift), extIp, extTcpPort)
|
# Port(uint16(conf.tcpPort) + conf.portsShift), extIp, extTcpPort)
|
||||||
#
|
#
|
||||||
# await node.start()
|
# await node.start()
|
||||||
|
|
Loading…
Reference in New Issue