Dojo Messaging
why?
-
enables us to use higher compression ratio algorithms like zstandard
-
uses aiohttp under the hood for client-side, and fastapi for server side
-
uses AsyncRetrying from tenacity, and asyncio.BoundedSemaphore by default for controlling batching & concurrency
-
fully typed, so you can simply access your Synapse's fields directly from
response.body -
dedicated function for batch sending to target URLs
-
explicitly raise HTTPExceptions in code where server logic will propagate to client
-
decoupling traditional HTTP status codes from protocol level status codes (e.g. blacklisted requests return "200 OK" but with an "error" message field)
-
server (typically miner)
- must call serve_synapse with both
async def handler(fastapi.Request, pydantic.BaseModel) - must initialise
- must call serve_synapse with both
-
client (typically validator)
Example Usage
from http import HTTPStatus
from aiohttp import ClientSession, TCPConnector
from pydantic import BaseModel, Field
from typing import Any
from dojo_messaging import Client
# retry logic handled under the hood
class ExampleModel(BaseModel):
field: bool = Field(default=False, description="Example field")
async def main():
# provide a session is optional, or use the convenience function
client = Client(
hotkey="your hotkey", # used for signing and verification,
session=ClientSession(
connector=TCPConnector(
limit=100
) # specify your own session, connector, etc. as needed
),
)
example_model = ExampleModel()
# any other kwargs may be propagated to the underlying POST request using aiohttp
kwargs: dict[str, Any] = {}
response = await client.send(
"http://ip:port",
model=example_model,
timeout_sec=12,
max_retries=10,
max_wait_sec=100,
**kwargs,
)
# check for errors
if response.error:
# check for response.error that comes from server side
print(f"Error received from server: {response.error}")
if response.exception:
# check for response.exception that comes from client side
print(f"Exception occurred {response.exception}")
if response.client_response and response.client_response.status != HTTPStatus.OK:
# access fields from ExampleModel directly
print(f"Received {response.body.field=}")
# dedicated batch_send method
# use an asyncio semaphore for concurrency & batch control
# if semaphore isn't provided, asyncio.gather is called
responses = await client.batch_send(
urls=["http://ip:port"] * 5, models=[ExampleModel()] * 5
)
for response in responses:
# access fields as needed...
# check for errors
if response.error:
# check for response.error that comes from server side
print(f"Error received from server: {response.error}")
if response.exception:
# check for response.exception that comes from client side
print(f"Exception occurred {response.exception}")
if (
response.client_response
and response.client_response.status != HTTPStatus.OK
):
# access fields from ExampleModel directly
print(f"Received {response.body.field=}")
Metadata
Release files for dojo-messaging 1.0.15
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| dojo_messaging-1.0.15.tar.gz | 19.1 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| dojo_messaging-1.0.15-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 34.1 kB
Release files / dojo_messaging-1.0.15.tar.gz
| Download URL | dojo_messaging-1.0.15.tar.gz |
|---|---|
| Size | 19.1 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
296dd88d586022fc01cca55037fabb694b7a2e6bc874506ee29fc00a632afae2
|
|
BLAKE2b-256 checksum How to use checksums |
13fc542d0b2aab2d1c12c0387e3765c6dee5ff107c08e512dccb0672858c4dcf
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.12.9
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 16, 2025.
Transparency logRelease files / dojo_messaging-1.0.15-py3-none-any.whl
| Download URL | dojo_messaging-1.0.15-py3-none-any.whl |
|---|---|
| Size | 15.1 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
e3cbb9792aa6f522b446dbb714764bebc3126681fe8a89e26a3d3d1429e8acdb
|
|
BLAKE2b-256 checksum How to use checksums |
1d5923ac3824eea124acc148470a59bddaa791ab5300fef7f350468bc3db4dba
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.12.9
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jun 16, 2025.
Transparency log