nwaku/waku/v2/node/rpc/wakurpc.nim

101 lines
3.3 KiB
Nim

import
std/options,
json_rpc/rpcserver,
nimcrypto/[sysrand, hmac, sha2],
eth/[common, rlp, keys, p2p],
../../protocol/waku_relay,
../../waku_types,
../../protocol/waku_store/waku_store,
../wakunode2
proc setupWakuRPC*(node: WakuNode, rpcsrv: RpcServer) =
rpcsrv.rpc("waku_version") do() -> string:
## Returns string of the current Waku protocol version.
result = WakuRelayCodec
# TODO: Implement symkey etc logic
rpcsrv.rpc("waku_publish") do(topic: string, payload: seq[byte]) -> bool:
let wakuRelay = node.wakuRelay
# XXX also future return type
# TODO: Shouldn't we really be doing WakuNode publish here?
debug "waku_publish", topic=topic, payload=payload
discard wakuRelay.publish(topic, payload)
return true
#if not result:
# raise newException(ValueError, "Message could not be posted")
rpcsrv.rpc("waku_publish2") do(topic: string, payload: seq[byte]) -> bool:
let msg = WakuMessage.init(payload)
if msg.isOk():
debug "waku_publish", msg=msg
else:
warn "waku_publish decode error", msg=msg
debug "waku_publish", topic=topic, payload=payload, msg=msg[]
node.publish(topic, msg[])
return true
#if not result:
# raise newException(ValueError, "Message could not be posted")
# TODO: Handler / Identifier logic
rpcsrv.rpc("waku_subscribe") do(topic: string) -> bool:
debug "waku_subscribe", topic=topic
# XXX: Hacky in-line handler
proc handler(topic: string, data: seq[byte]) {.async, gcsafe.} =
let msg = WakuMessage.init(data)
if msg.isOk():
debug "waku_subscribe handler", msg=msg
var readable_str = cast[string](msg[].payload)
info "Hit subscribe handler", topic=topic, msg=msg[], payload=readable_str
else:
warn "waku_subscribe decode error", msg=msg
info "waku_subscribe raw data string", str=cast[string](data)
# XXX: Can we make this context async to use await?
discard node.subscribe(topic, handler)
return true
#if not result:
# raise newException(ValueError, "Message could not be posted")
rpcsrv.rpc("waku_query") do(topics: seq[int]) -> bool:
debug "waku_query"
# XXX: Hacky in-line handler
proc handler(response: HistoryResponse) {.gcsafe.} =
info "Hit response handler", messages=response.messages
var contentTopics = newSeq[ContentTopic]()
for topic in topics:
contentTopics.add(ContentTopic(topic))
await node.query(HistoryQuery(topics: contentTopics), handler)
return true
rpcsrv.rpc("waku_subscribe_filter") do(topic: string, contentFilters: seq[seq[int]]) -> bool:
debug "waku_subscribe_filter"
# XXX: Hacky in-line handler
proc handler(msg: WakuMessage) {.gcsafe, closure.} =
info "Hit subscribe response", message=msg
var filters = newSeq[ContentFilter]()
for topics in contentFilters:
var contentTopics = newSeq[ContentTopic]()
for topic in topics:
contentTopics.add(ContentTopic(topic))
filters.add(ContentFilter(topics: contentTopics))
await node.subscribe(FilterRequest(topic: topic, contentFilters: filters, subscribe: true), handler)
return true
rpcsrv.rpc("waku_info") do() -> string:
debug "waku_node_info"
let wakuInfo = node.info()
let listenStr = wakuInfo.listenStr
info "Listening on", full = listenStr
return listenStr