I made a library for peer to peer networking and felt confident enough to publish it in the official package manager. It's very well documented and open source, though not completely finished but functional. I fell off on making weekly updates because I've gotten extremely busy but I will not abandon it. But you can setup a local p2p network with a few lines of code, and WAN is pretty intuitive and easy to setup so far as well.

The library has a lot of default implementations, and default logic and behaviors that are usually defined with delegates that can be overridden. But there's a sort of rigid flow in the design.
I did not make the library DI friendly. While interfaces are implemented on live and revolving objects (peers, packets, data wrappers) larger classes that define behaviors, logic and policies are globally static and store the swappable delegates with the default behaviors and policies.

Did I make an engine rather than a library?
And did I make a huge mistake by making it not DI friendly by using static classes to wrap certain things by default?