From the std.Io perspective, the PR backlog is a secondary issue. The primary issue, as far as I see it, is that the interface is still lacking in many areas, and in order to improve it, it needs a coherent design. You can’t do that by individual PRs from outside people.
One design area is timeout handling at multiple levels. Both making it easy to have per-operation timeouts, especially insider reader/writer, as that’s how most people interact with network and files, but also on task level. The later could be done by concurrentTimeout, or awaitTimeout, both work, it’s a matter of deciding where to put it. The per-operation timeouts mean adding some timeout control to reader/writer (I have an exploratory PR open for that), but also finishing the work of moving accept and connect to std.Io.Operation, and finishing the design of std.Io.Batch.
And related to the std.Io.Batch is an implementation detail in std.Io.Threaded. Timeouts via operateTimeout in std.Io.Threaded currently work just by luck. It still uses blocking sockets. It polls with the timeout, but then it does the blocking syscall and if the readiness was drained somewhere else, it will block outside of the timeout. In order to fix it, sockets in std.Io.Threaded would need to become non-blocking.
Another thing are socket options. For any production code, it’s essential to have control over the nagle’s algorithm, keep-alive, in some cases kernel buffer sizes. It’s not clear how it would fit the interface. Maybe it could be combined with the issue mentioned by @mutex, there is a real need to sometimes connect or accept a socket that is already bound to a specific address. Maybe if the vtable is split into POSIX-like operations netCreate/netBind/netListen/netConnect/netAccept, it would feel less strange to have netSetOption and netGetOption.
For integration with existing C libraries, it would be extremely useful to have a poll mechanism in the interface. Then you could integrate e.g. libpq, since it needs to do it’s own reads/writes, it just needs to be able to block on poll externally.
Additionally, the current split between netRead/netReceive is kind strange. It would make more sense if there was just one socket receive operation, with optional address. If the address is empty, it’s a stream read, otherwise it’s a datagram receive.