Skip to main content

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
  • 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)

Source distribution for dojo-messaging 1.0.15
File Size Uploaded
dojo_messaging-1.0.15.tar.gz 19.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for dojo-messaging 1.0.15
File Interpreter ABI Platform
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 log

Release 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
Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page