Skip to main content

Messaging utilities for dojo applications

Project description

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=}")

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

dojo_messaging-1.0.14rc5.tar.gz (18.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

dojo_messaging-1.0.14rc5-py3-none-any.whl (15.1 kB view details)

Uploaded Python 3

File details

Details for the file dojo_messaging-1.0.14rc5.tar.gz.

File metadata

  • Download URL: dojo_messaging-1.0.14rc5.tar.gz
  • Upload date:
  • Size: 18.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.12.9

File hashes

Hashes for dojo_messaging-1.0.14rc5.tar.gz
Algorithm Hash digest
SHA256 737b1456192b998af895457b4179c2f39e960fc213ac39a5e30900dce8a04bd3
MD5 31d5e8b452ddd30b7122d437e3e4321f
BLAKE2b-256 7db8ee3aa84fb74ac9db66e54984854aaee3c61a1270e791f4165263df95eddb

See more details on using hashes here.

Provenance

The following attestation bundles were made for dojo_messaging-1.0.14rc5.tar.gz:

Publisher: release.yml on tensorplex-labs/dojo-messaging

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file dojo_messaging-1.0.14rc5-py3-none-any.whl.

File metadata

File hashes

Hashes for dojo_messaging-1.0.14rc5-py3-none-any.whl
Algorithm Hash digest
SHA256 2ef89f2dcc01c113614df19653bbf6e55fd00f9bb2902c9e4912cc8408cf11f0
MD5 e032a99628661a9143bf1113df0d3f48
BLAKE2b-256 0eadee0099929c9a06ff288e12948a588b00f71fd7cd2840622ef7e6f466c03d

See more details on using hashes here.

Provenance

The following attestation bundles were made for dojo_messaging-1.0.14rc5-py3-none-any.whl:

Publisher: release.yml on tensorplex-labs/dojo-messaging

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page