Skip to main content

meadows-client

Client-side Socket.IO transport for MEADOWS: connect, reconnect, JWT handshake. No domain logic — shared by meadows-bot and future non-browser clients.

What this package contains

  • client.py — MeadowClient wrapping socketio.AsyncClient
    • JWT handshake on /chat namespace connect
    • Auto-reconnect (delegated to socketio)
    • send_message() constructs a valid protocol Message before emitting
    • on(event, handler) for user-registered handlers
    • emit(event, data) escape hatch for non-message events
    • register_label_subscription() / unregister_label_subscription() for label routing
    • on_label_assigned() callback registration for subscription matches
    • call_rpc() — async RPC via labels (send request, await response)

Install

cd meadows-client
uv pip install -e .

Test

uv run pytest -q

Usage

Pre-signed JWT (recommended)

from meadows.client import MeadowClient
from meadows.protocol import EventName, JWTRole, build_claims

client = MeadowClient(
    server_url="http://localhost:8080",
    claims=build_claims(name="alice", role=JWTRole.USER),
    token="<pre-signed-jwt>",
)

client.on(EventName.MESSAGE, lambda data: print("got:", data))

await client.connect()
await client.send_message(content="hello world", group_id="general")

Generate a token with inv user-jwt or inv bot-jwt on the server.

Raw signing key (local dev / TUI only)

client = MeadowClient(
    server_url="http://localhost:8080",
    claims=build_claims(name="alice", role=JWTRole.USER),
    jwt_secret=b"<shared key bytes>",
)

Protocol contract

This client never sends a frame that violates meadows.protocol. The send_message() method constructs a valid Message envelope before emitting, so the server-side chokepoint never sees an invalid frame from us.

Label subscriptions

# Subscribe to labels matching a JSON Logic predicate
client.register_label_subscription(
    "sentiment-alerts",
    {"regex_match": [{"var": "label"}, "^sentiment$"]},
    scope="global",
    deliver="label_only",
)

# Handle matched labels
client.on_label_assigned("sentiment-alerts")(lambda data: print(data))

Subscriptions are replayed on reconnect.

RPC via labels

# Send an RPC request and await the response (async)
result = await client.call_rpc("service:math", "add 2 3", origin="bot-math-svc")

call_rpc creates an RPC_REQUEST message, routes it via label subscriptions, and resolves when the matching RPC_RESPONSE arrives. Raises asyncio.TimeoutError on timeout.

API

async def call_rpc(
    self,
    service_label: str,      # Label to route to (e.g. "service:math")
    content: str,            # Request payload
    *,
    origin: str | None = None,  # Label origin (defaults to caller identity)
    semver: str = "1.0.0",   # Label semver
    timeout: float = 30.0,   # Seconds before TimeoutError
    group_id: str = "general",  # Group for persistence
) -> str                     # Response content

Release files for meadows-client 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for meadows-client 0.1.0
File Size Uploaded
meadows_client-0.1.0.tar.gz 88.7 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for meadows-client 0.1.0
File Interpreter ABI Platform
meadows_client-0.1.0-py3-none-any.whl Python 3 none any Details

Total release size: 97.2 kB

Release files / meadows_client-0.1.0.tar.gz

Download URL meadows_client-0.1.0.tar.gz
Size 88.7 kB
Tags Source
SHA-256 checksum
How to use checksums
3a72f119ed1ce66f70958173ad4c05c05be3792c19a6248ca621b1012b1f62a4
BLAKE2b-256 checksum
How to use checksums
fb217af0fa7a256f0939a5fdefa4b2b93d1e9c14fef8196fb885cea545bb6ca1
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.9.15 {"installer":{"name":"uv","version":"0.9.15","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Linux Mint","version":"22.3","id":"zena","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release files / meadows_client-0.1.0-py3-none-any.whl

Download URL meadows_client-0.1.0-py3-none-any.whl
Size 8.4 kB
Tags Python 3
SHA-256 checksum
How to use checksums
c9eb90d9ca09caf5925f4c87f2bf5f3c412978bbd32593ec75c7b75c9b75d794
BLAKE2b-256 checksum
How to use checksums
2ed7563ca02d83feb5f69272d7120e7cf42b309299b5d751f957e0d35b7d49c9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via uv/0.9.15 {"installer":{"name":"uv","version":"0.9.15","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Linux Mint","version":"22.3","id":"zena","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

Release history Release notifications | RSS feed

This release

0.1.0 This release

2 release files

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