mirror of
https://github.com/status-im/nim-libp2p.git
synced 2025-01-26 12:49:03 +00:00
e623e70e7b
This adds gossipsub and floodsub, as well as basic interop testing with the go libp2p daemon. * add close event * wip: gossipsub * splitting rpc message * making message handling more consistent * initial gossipsub implementation * feat: nim 1.0 cleanup * wip: gossipsub protobuf * adding encoding/decoding of gossipsub messages * add disconnect handler * add proper gossipsub msg handling * misc: cleanup for nim 1.0 * splitting floodsub and gossipsub tests * feat: add mesh rebalansing * test pubsub * add mesh rebalansing tests * testing mesh maintenance * finishing mcache implementatin * wip: commenting out broken tests * wip: don't run heartbeat for now * switchout debug for trace logging * testing gossip peer selection algorithm * test stream piping * more work around message amplification * get the peerid from message * use timed cache as backing store * allow setting timeout in constructor * several changes to improve performance * more through testing of msg amplification * prevent gc issues * allow piping to self and prevent deadlocks * improove floodsub * allow running hook on cache eviction * prevent race conditions * prevent race conditions and improove tests * use hashes as cache keys * removing useless file * don't create a new seq * re-enable pubsub tests * fix imports * reduce number of runs to speed up tests * break out control message processing * normalize sleeps between steps * implement proper transport filtering * initial interop testing * clean up floodsub publish logic * allow dialing without a protocol * adding multiple reads/writes * use protobuf varint in mplex * don't loose conn's peerInfo * initial interop pubsub tests * don't duplicate connections/peers * bring back interop tests * wip: interop * re-enable interop and daemon tests * add multiple read write tests from handlers * don't cleanup channel prematurely * use correct channel to send/receive msgs * adjust tests with latest changes * include interop tests * remove temp logging output * fix ci * use correct public key serialization * additional tests for pubsub interop
81 lines
2.4 KiB
Nim
81 lines
2.4 KiB
Nim
## Nim-LibP2P
|
|
## Copyright (c) 2019 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.
|
|
|
|
import tables
|
|
import chronos, chronicles
|
|
|
|
logScope:
|
|
topic = "TimedCache"
|
|
|
|
const Timeout* = 10.seconds # default timeout in ms
|
|
|
|
type
|
|
ExpireHandler*[V] = proc(key: string, val: V) {.gcsafe.}
|
|
TimedEntry*[V] = object of RootObj
|
|
val: V
|
|
handler: ExpireHandler[V]
|
|
|
|
TimedCache*[V] = ref object of RootObj
|
|
cache*: Table[string, TimedEntry[V]]
|
|
onExpire*: ExpireHandler[V]
|
|
timeout*: Duration
|
|
|
|
# TODO: This belong in chronos, temporary left here until chronos is updated
|
|
proc addTimer*(at: Duration, cb: CallbackFunc, udata: pointer = nil) =
|
|
## Arrange for the callback ``cb`` to be called at the given absolute
|
|
## timestamp ``at``. You can also pass ``udata`` to callback.
|
|
addTimer(Moment.fromNow(at), cb, udata)
|
|
|
|
proc put*[V](t: TimedCache[V],
|
|
key: string,
|
|
val: V = "",
|
|
timeout: Duration,
|
|
handler: ExpireHandler[V] = nil) =
|
|
trace "adding entry to timed cache", key = key
|
|
t.cache[key] = TimedEntry[V](val: val, handler: handler)
|
|
|
|
# TODO: addTimer with param Duration is missing from chronos, needs to be added
|
|
addTimer(
|
|
timeout,
|
|
proc (arg: pointer = nil) {.gcsafe.} =
|
|
trace "deleting expired entry from timed cache", key = key
|
|
if key in t.cache:
|
|
let entry = t.cache[key]
|
|
t.cache.del(key)
|
|
if not isNil(entry.handler):
|
|
entry.handler(key, entry.val)
|
|
)
|
|
|
|
proc put*[V](t: TimedCache[V],
|
|
key: string,
|
|
val: V = "",
|
|
handler: ExpireHandler[V] = nil) =
|
|
t.put(key, val, t.timeout, handler)
|
|
|
|
proc contains*[V](t: TimedCache[V], key: string): bool =
|
|
t.cache.contains(key)
|
|
|
|
proc del*[V](t: TimedCache[V], key: string) =
|
|
trace "deleting entry from timed cache", key = key
|
|
t.cache.del(key)
|
|
|
|
proc get*[V](t: TimedCache[V], key: string): V =
|
|
t.cache[key].val
|
|
|
|
proc `[]`*[V](t: TimedCache[V], key: string): V =
|
|
t.get(key)
|
|
|
|
proc `[]=`*[V](t: TimedCache[V], key: string, val: V): V =
|
|
t.put(key, val)
|
|
|
|
proc newTimedCache*[V](timeout: Duration = Timeout): TimedCache[V] =
|
|
new result
|
|
result.cache = initTable[string, TimedEntry[V]]()
|
|
result.timeout = timeout
|