2024-10-28 15:51:07 -04:00
|
|
|
import std/[json, strutils]
|
2025-08-20 13:35:10 +02:00
|
|
|
import chronos, results, ffi
|
2024-10-24 09:07:08 -04:00
|
|
|
import libp2p/[protocols/ping, switch, multiaddress, multicodec]
|
2025-08-20 13:35:10 +02:00
|
|
|
import ../../../waku/[factory/waku, waku_core/peers, node/waku_node]
|
2024-10-24 09:07:08 -04:00
|
|
|
|
|
|
|
|
type PingRequest* = object
|
|
|
|
|
peerAddr: cstring
|
|
|
|
|
timeout: Duration
|
|
|
|
|
|
|
|
|
|
proc createShared*(
|
|
|
|
|
T: type PingRequest, peerAddr: cstring, timeout: Duration
|
|
|
|
|
): ptr type T =
|
|
|
|
|
var ret = createShared(T)
|
|
|
|
|
ret[].peerAddr = peerAddr.alloc()
|
|
|
|
|
ret[].timeout = timeout
|
|
|
|
|
return ret
|
|
|
|
|
|
|
|
|
|
proc destroyShared(self: ptr PingRequest) =
|
|
|
|
|
deallocShared(self[].peerAddr)
|
|
|
|
|
deallocShared(self)
|
|
|
|
|
|
|
|
|
|
proc process*(
|
|
|
|
|
self: ptr PingRequest, waku: ptr Waku
|
|
|
|
|
): Future[Result[string, string]] {.async.} =
|
|
|
|
|
defer:
|
|
|
|
|
destroyShared(self)
|
|
|
|
|
|
2024-10-28 15:51:07 -04:00
|
|
|
let peerInfo = peers.parsePeerInfo(($self[].peerAddr).split(",")).valueOr:
|
2024-10-24 09:07:08 -04:00
|
|
|
return err("PingRequest failed to parse peer addr: " & $error)
|
|
|
|
|
|
|
|
|
|
proc ping(): Future[Result[Duration, string]] {.async, gcsafe.} =
|
|
|
|
|
try:
|
|
|
|
|
let conn = await waku.node.switch.dial(peerInfo.peerId, peerInfo.addrs, PingCodec)
|
2024-10-28 15:51:07 -04:00
|
|
|
defer:
|
|
|
|
|
await conn.close()
|
|
|
|
|
|
2024-10-24 09:07:08 -04:00
|
|
|
let pingRTT = await waku.node.libp2pPing.ping(conn)
|
|
|
|
|
if pingRTT == 0.nanos:
|
|
|
|
|
return err("could not ping peer: rtt-0")
|
|
|
|
|
return ok(pingRTT)
|
|
|
|
|
except CatchableError:
|
|
|
|
|
return err("could not ping peer: " & getCurrentExceptionMsg())
|
|
|
|
|
|
|
|
|
|
let pingFuture = ping()
|
|
|
|
|
let pingRTT: Duration =
|
|
|
|
|
if self[].timeout == chronos.milliseconds(0): # No timeout expected
|
2025-10-27 14:07:06 -03:00
|
|
|
?(await pingFuture)
|
2024-10-24 09:07:08 -04:00
|
|
|
else:
|
|
|
|
|
let timedOut = not (await pingFuture.withTimeout(self[].timeout))
|
|
|
|
|
if timedOut:
|
|
|
|
|
return err("ping timed out")
|
2025-10-27 14:07:06 -03:00
|
|
|
?(pingFuture.read())
|
2024-10-24 09:07:08 -04:00
|
|
|
|
|
|
|
|
ok($(pingRTT.nanos))
|