nim-libp2p/libp2p/protocols/pubsub/peertable.nim

63 lines
1.7 KiB
Nim
Raw Normal View History

2022-07-01 18:19:57 +00:00
# Nim-LibP2P
2023-01-20 14:47:40 +00:00
# Copyright (c) 2023 Status Research & Development GmbH
2022-07-01 18:19:57 +00:00
# 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.
2023-06-07 11:12:49 +00:00
{.push raises: [].}
2023-04-26 11:44:45 +00:00
import std/[tables, sets, sequtils]
import ./pubsubpeer, ../../peerid
2023-03-06 15:36:10 +00:00
export tables, sets
type PeerTable* = Table[string, HashSet[PubSubPeer]] # topic string to peer map
2021-12-16 10:05:20 +00:00
proc hasPeerId*(t: PeerTable, topic: string, peerId: PeerId): bool =
if topic in t:
try:
for peer in t[topic]:
if peer.peerId == peerId:
return true
except KeyError:
raiseAssert "checked with in"
false
func addPeer*(table: var PeerTable, topic: string, peer: PubSubPeer): bool =
# returns true if the peer was added,
# false if it was already in the collection
not table.mgetOrPut(topic, initHashSet[PubSubPeer]()).containsOrIncl(peer)
func removePeer*(table: var PeerTable, topic: string, peer: PubSubPeer) =
table.withValue(topic, peers):
peers[].excl(peer)
if peers[].len == 0:
table.del(topic)
func hasPeer*(table: PeerTable, topic: string, peer: PubSubPeer): bool =
try:
(topic in table) and (peer in table[topic])
except KeyError:
raiseAssert "checked with in"
func peers*(table: PeerTable, topic: string): int =
if topic in table:
try:
table[topic].len
except KeyError:
raiseAssert "checked with in"
else:
0
2023-04-26 11:44:45 +00:00
func outboundPeers*(table: PeerTable, topic: string): int =
if topic in table:
try:
table[topic].countIt(it.outbound)
except KeyError:
raiseAssert "checked with in"
2023-04-26 11:44:45 +00:00
else:
0