148 lines
3.3 KiB
Nim
148 lines
3.3 KiB
Nim
# Nim-LibP2P
|
|
# Copyright (c) 2023 Status Research & Development GmbH
|
|
# Licensed under either of
|
|
# * Apache License, version 2.0, ([LICENSE-APACHE](LICENSE-APACHE))
|
|
# * MIT license ([LICENSE-MIT](LICENSE-MIT))
|
|
# at your option.
|
|
# This file may not be copied, modified, or distributed except according to
|
|
# those terms.
|
|
|
|
{.push raises: [].}
|
|
|
|
import options, sequtils
|
|
import "../../.."/[
|
|
peerid,
|
|
routing_record,
|
|
utility
|
|
]
|
|
|
|
export options
|
|
|
|
type
|
|
PeerInfoMsg* = object
|
|
peerId*: PeerId
|
|
signedPeerRecord*: seq[byte]
|
|
|
|
SubOpts* = object
|
|
subscribe*: bool
|
|
topic*: string
|
|
|
|
MessageId* = seq[byte]
|
|
|
|
Message* = object
|
|
fromPeer*: PeerId
|
|
data*: seq[byte]
|
|
seqno*: seq[byte]
|
|
topicIds*: seq[string]
|
|
signature*: seq[byte]
|
|
key*: seq[byte]
|
|
|
|
ControlMessage* = object
|
|
ihave*: seq[ControlIHave]
|
|
iwant*: seq[ControlIWant]
|
|
graft*: seq[ControlGraft]
|
|
prune*: seq[ControlPrune]
|
|
idontwant*: seq[ControlIWant]
|
|
|
|
ControlIHave* = object
|
|
topicId*: string
|
|
messageIds*: seq[MessageId]
|
|
|
|
ControlIWant* = object
|
|
messageIds*: seq[MessageId]
|
|
|
|
ControlGraft* = object
|
|
topicId*: string
|
|
|
|
ControlPrune* = object
|
|
topicId*: string
|
|
peers*: seq[PeerInfoMsg]
|
|
backoff*: uint64
|
|
|
|
RPCMsg* = object
|
|
subscriptions*: seq[SubOpts]
|
|
messages*: seq[Message]
|
|
control*: Option[ControlMessage]
|
|
ping*: seq[byte]
|
|
pong*: seq[byte]
|
|
|
|
func withSubs*(
|
|
T: type RPCMsg, topics: openArray[string], subscribe: bool): T =
|
|
T(
|
|
subscriptions: topics.mapIt(SubOpts(subscribe: subscribe, topic: it)))
|
|
|
|
func shortLog*(s: ControlIHave): auto =
|
|
(
|
|
topicId: s.topicId.shortLog,
|
|
messageIds: mapIt(s.messageIds, it.shortLog)
|
|
)
|
|
|
|
func shortLog*(s: ControlIWant): auto =
|
|
(
|
|
messageIds: mapIt(s.messageIds, it.shortLog)
|
|
)
|
|
|
|
func shortLog*(s: ControlGraft): auto =
|
|
(
|
|
topicId: s.topicId.shortLog
|
|
)
|
|
|
|
func shortLog*(s: ControlPrune): auto =
|
|
(
|
|
topicId: s.topicId.shortLog
|
|
)
|
|
|
|
func shortLog*(c: ControlMessage): auto =
|
|
(
|
|
ihave: mapIt(c.ihave, it.shortLog),
|
|
iwant: mapIt(c.iwant, it.shortLog),
|
|
graft: mapIt(c.graft, it.shortLog),
|
|
prune: mapIt(c.prune, it.shortLog)
|
|
)
|
|
|
|
func shortLog*(msg: Message): auto =
|
|
(
|
|
fromPeer: msg.fromPeer.shortLog,
|
|
data: msg.data.shortLog,
|
|
seqno: msg.seqno.shortLog,
|
|
topicIds: $msg.topicIds,
|
|
signature: msg.signature.shortLog,
|
|
key: msg.key.shortLog
|
|
)
|
|
|
|
func shortLog*(m: RPCMsg): auto =
|
|
(
|
|
subscriptions: m.subscriptions,
|
|
messages: mapIt(m.messages, it.shortLog),
|
|
control: m.control.get(ControlMessage()).shortLog
|
|
)
|
|
|
|
proc byteSize*(msg: Message): int =
|
|
var total = 0
|
|
total += msg.fromPeer.len
|
|
total += msg.data.len
|
|
total += msg.seqno.len
|
|
total += msg.signature.len
|
|
total += msg.key.len
|
|
for topicId in msg.topicIds:
|
|
total += topicId.len
|
|
return total
|
|
|
|
proc byteSize*(msgs: seq[Message]): int =
|
|
msgs.mapIt(byteSize(it)).foldl(a + b, 0)
|
|
|
|
proc byteSize*(ihave: seq[ControlIHave]): int =
|
|
var total = 0
|
|
for item in ihave:
|
|
total += item.topicId.len
|
|
for msgId in item.messageIds:
|
|
total += msgId.len
|
|
return total
|
|
|
|
proc byteSize*(iwant: seq[ControlIWant]): int =
|
|
var total = 0
|
|
for item in iwant:
|
|
for msgId in item.messageIds:
|
|
total += msgId.len
|
|
return total
|