A performant asynchronous communication protocol in pure Python.
This library was developed with simplicity and performance in mind, with modern practices of Python development.
Works on Python 3.8.0+.
pip install sayd
You need to have installed poetry for dependencies management (how to).
git clone https://github.com/lw016/sayd
cd sayd
poetry install
poetry run tox -e tests
poetry run tox -e docs
- Client and server implementations
- Reliable TCP persistent connection
- Auto reconnection (client)
- Multiple asynchronous connections (server)
- Blacklist of clients (server)
- TLS encryption
- Proxy Protocol V2 support (server)
- Data transmitted as dictionaries (json)
- Broadcast (server)
- Remote function callbacks
- Built-in CLI utility to generate self-signed certificates
- Add support to Unix socket
- Implement TLS certificate authentication
The built-in CLI utility (sayd) can be used to generate self-signed certificates to encrypt the connection.
sayd --help
import logging
import asyncio
from sayd import SaydServer
logging.basicConfig(
format="[%(name)s][%(levelname)s] %(asctime)s - %(message)s",
datefmt="%Y/%m/%d %H:%M:%S"
)
logger = logging.getLogger("SERVER")
logger.setLevel(logging.INFO)
server = SaydServer(logger=logger)
@server.callback("message")
async def msg(address: tuple, instance: str, data: dict) -> dict:
return {"greetings": "Hello from server!"}
async def main() -> None:
await server.start()
while True:
result = await server.call("msg", {"greetings": "Hi!"}) # Broadcast call.
print(result)
await asyncio.sleep(1)
await server.stop()
if __name__ == "__main__":
asyncio.run(main())
import logging
import asyncio
from sayd import SaydClient
logging.basicConfig(
format="[%(name)s][%(levelname)s] %(asctime)s - %(message)s",
datefmt="%Y/%m/%d %H:%M:%S"
)
logger = logging.getLogger("CLIENT")
logger.setLevel(logging.INFO)
client = SaydClient(logger=logger)
@client.callback("msg")
async def msg(instance: str, data: dict) -> dict:
return {"greetings": "Hello from client!"}
async def main() -> None:
await client.start()
while True:
result = await client.call("message", {"greetings": "Hi!"})
print(result)
await asyncio.sleep(1)
await client.stop()
if __name__ == "__main__":
asyncio.run(main())