67 releases (breaking)
0.50.0 | Jul 5, 2024 |
---|---|
0.49.0 | Dec 29, 2023 |
0.48.0 | Jul 3, 2023 |
0.45.0 | Jan 13, 2023 |
0.8.0 | Dec 31, 2020 |
#904 in Network programming
487 downloads per month
Used in 3 crates
230KB
1K
SLoC
pea2pea
pea2pea is a simple, low-level, and customizable implementation of a TCP P2P node.
The core library only provides the most basic functionalities like starting, ending and maintaining connections; the rest is up to a few low-level, opt-in protocols:
Handshake
requires connections to adhere to the given handshake logic before anything else can be done with themReading
enables the node to receive messages based on the user-supplied DecoderWriting
enables the node to send messages based on the user-supplied EncoderOnDisconnect
makes the node perform specified actions whenever a connection with a peer is severedOnConnect
makes the node perform specified actions whenever a connection with a peer is fully established (post-handshake)
goals
- small, simple, non-framework codebase: the entire library is ~1k LOC and there are few dependencies
- ease of use: few objects and traits, no "turboeels" or generics/references that would force all parent objects to adapt
- correctness: builds with stable Rust, there is no
unsafe
code, there's more code intests
than in the actual library - low-level: the user has full control over all connections and every byte sent or received
- good performance: over 10GB/s in favorable scenarios, small memory footprint
how to use it
- define a clonable struct containing a
Node
and any extra state you'd like to carry alongside it - implement the trivial
Pea2Pea
trait for it - make it implement any/all of the protocols
- create that struct (or as many of them as you like)
- enable the protocols you'd like them to utilize
That's it!
examples
status
- all the desired functionalities are complete
- the crate follows semver, and some API breakage is still possible before
1.0
- the project is actively developed, with all changes being recorded in the CHANGELOG
- some of the desired features that are not yet available in Rust include associated type defaults
- the project aims to always build with the current stable Rust compiler; legacy version support is not a goal, but they might also work
Dependencies
~4–12MB
~125K SLoC