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