Simple asyncio TCP client and server library inspired by fastapi
Project description
netaio
This is designed to be a simple and easy to use asyncio-based TCP client and server library inspired by fastapi but for non-HTTP use cases.
Status
This is currently a work-in-progress. Remaining work before the v0.1.0 release:
- Add authorization plugin
- Add encryption plugin
- Add optional authorization plugin using tapescript
- Add optional encryption plugin using simple symmetric stream cipher
- More thorough test suite
- Better usage examples/documentation
After that, issues will be tracked here.
Usage
For more documentation, see the dox.md file generated by autodox.
Server
from netaio import TCPServer, Body, Message, MessageType, HMACAuthPlugin
import asyncio
server = TCPServer(port=8888, auth_plugin=HMACAuthPlugin(config={"secret": "test"}))
@server.on((MessageType.REQUEST_URI, b'something'))
async def something(msg: Message, writer: asyncio.StreamWriter):
body = Body.prepare(b'This is it.', uri=b'something')
return Message.prepare(body, MessageType.RESPOND_URI)
@server.on(MessageType.SUBSCRIBE_URI)
async def subscribe(msg: Message, writer: asyncio.StreamWriter):
server.subscribe(msg.body.uri, writer)
return Message.prepare(Body.prepare(b'', uri=msg.body.uri), MessageType.CONFIRM_SUBSCRIBE)
@server.on(MessageType.UNSUBSCRIBE_URI)
async def unsubscribe(msg: Message, writer: asyncio.StreamWriter):
server.unsubscribe(msg.body.uri, writer)
return Message.prepare(Body.prepare(b'', uri=msg.body.uri), MessageType.CONFIRM_UNSUBSCRIBE)
asyncio.run(server.start())
Client
from netaio import TCPClient, Body, Message, MessageType, HMACAuthPlugin
import asyncio
client = TCPClient("127.0.0.1", 8888, auth_plugin=HMACAuthPlugin(config={"secret": "test"}))
received_resources = {}
@client.on(MessageType.RESPOND_URI)
def echo(msg: Message, writer: asyncio.StreamWriter):
received_resources[msg.body.uri] = msg.body.content
async def run_client():
request_body = Body.prepare(b'pls gibs me dat', uri=b'something')
request_message = Message.prepare(request_body, MessageType.REQUEST_URI)
await client.connect()
await client.send(request_message)
await client.receive_once()
asyncio.run(run_client())
print(received_resources)
Authentication/Authorization
The server and client support an optional authentication/authorization plugin.
Each plugin is instantiated with a dict of configuration parameters, and it must
implement the AuthPluginProtocol (i.e. have make, check, and error
methods). Once the plugin has been instantiated, it can be passed to the
TCPServer and TCPClient constructors or set on the client or server
instances themselves. An auth plugin can also be set on a per-handler basis by
passing the plugin as a second argument to the on method. Currently, if an
auth plugin is set both on the instance and per-handler, both will be checked
before the handler function is called, and both will be applied to the response
body; the per-handler plugin will be able to overwrite any auth fields set by
the instance plugin.
Currently, netaio includes an HMACAuthPlugin that can be used by the server
and client to authenticate and authorize requests. This uses a shared secret to
generate and check HMACs over message bodies.
License
Copyright (c) 2025 Jonathan Voss (k98kurz)
Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above copyleft notice and this permission notice appear in all copies.
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file netaio-0.0.2.tar.gz.
File metadata
- Download URL: netaio-0.0.2.tar.gz
- Upload date:
- Size: 14.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.10.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
dab96e4c14f4821d09c1813d7c51f88ec1543b71f8ce14e6c50c1137e993b6da
|
|
| MD5 |
8f99e579d7044c7a6e3ff7c261e124c4
|
|
| BLAKE2b-256 |
7b603110c375b022d7699756fead6c04d6b06be1b4d08040784308240e279d51
|
File details
Details for the file netaio-0.0.2-py3-none-any.whl.
File metadata
- Download URL: netaio-0.0.2-py3-none-any.whl
- Upload date:
- Size: 12.7 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.1.0 CPython/3.10.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
3bd21053622f67ec597f90c2f62a3723cef91ffa905862d1a4dd4c6ec1d5b6dd
|
|
| MD5 |
6245359663f33664f57da34cf5c8ae99
|
|
| BLAKE2b-256 |
4c86d0358b9f8f90d361e7fcf9072a0413fed76186f3ff10be6d20f98dab2422
|