Catalog PyPI
PACKAGE EXPLORERView in registry

aetherrpc

PyPI

A zero-dependency RPC framework for Python

Versions collected1
Direct dependencies0From release 0.1.0
Last observed20 Oct, 20:55 UTC

README

Version 0.1.0 documentation

AetherRPC

A lightweight, zero-dependency RPC framework for Python.

AetherRPC lets Python applications communicate with each other over TCP using a simple remote-procedure-call interface.

It supports synchronous and asynchronous RPC calls, streaming, authentication, concurrent calls, custom Python objects, remote exception propagation, middleware, and dynamic client proxies.

Features

  • 🚀 Zero runtime dependencies
  • 🔌 TCP-based RPC
  • ⚡ Synchronous and asynchronous clients
  • 🔄 Synchronous and asynchronous server handlers
  • 🌊 Streaming RPC support
  • 🔐 Optional token authentication
  • 🧵 Concurrent asynchronous calls
  • 🪄 Dynamic client method proxies
  • 📦 Custom Python object round-tripping
  • 💥 Remote exception propagation
  • ⏱️ Configurable connection and call timeouts
  • 🧩 Server middleware hooks
  • 🛠️ Simple decorator-based server API
  • 🐍 Python 3.10+

Installation

Install from PyPI:

pip install aetherrpc

Quick Start

1. Create a server

from aetherrpc import AetherRPCServer

server = AetherRPCServer(
    host="127.0.0.1",
    port=9000,
)

@server.register
def add(a, b):
    return a + b

server.start()

The function registered with @server.register becomes available to RPC clients.

2. Create a client

from aetherrpc import AetherRPCClient

client = AetherRPCClient(
    host="127.0.0.1",
    port=9000,
)

client.connect()

result = client.add(2, 3)

print(result)  # 5

client.close()

The client dynamically resolves public method names, so there is no need to manually create a proxy for every registered server method.

Context Manager

Clients can also be used as context managers:

from aetherrpc import AetherRPCClient

client = AetherRPCClient(
    host="127.0.0.1",
    port=9000,
)

with client as rpc:
    print(rpc.add(2, 3))

Authentication

Enable token authentication on the server:

from aetherrpc import AetherRPCServer

server = AetherRPCServer(
    host="127.0.0.1",
    port=9000,
    auth_token="my-secret-token",
)

@server.register
def add(a, b):
    return a + b

server.start()

Then provide the same token to the client:

from aetherrpc import AetherRPCClient

client = AetherRPCClient(
    host="127.0.0.1",
    port=9000,
    auth_token="my-secret-token",
)

with client as rpc:
    print(rpc.add(10, 20))

Clients with an invalid or missing token are rejected when authentication is enabled.

Async RPC

AetherRPC supports asynchronous client calls:

import asyncio

from aetherrpc import AetherRPCClient


async def main():
    client = AetherRPCClient(
        host="127.0.0.1",
        port=9000,
    )

    client.connect()

    result = await client.async_add(2, 3)

    print(result)

    client.close()


asyncio.run(main())

Async server functions are supported as well:

@server.register
async def add(a, b):
    return a + b

Aliases

Server methods can be registered with an alias:

@server.register(alias="sum")
def add_numbers(a, b):
    return a + b

Clients can then call:

result = client.sum(2, 3)

Streaming

AetherRPC supports streaming RPC operations for both synchronous and asynchronous handlers.

This makes it possible to send results progressively instead of waiting for a single final value.

See the test suite for streaming examples.

Exceptions

Exceptions raised by remote procedures can be propagated back to the client as AetherRPC errors.

For example:

@server.register
def divide(a, b):
    return a / b

A failed remote call can then be handled normally by the client:

try:
    result = client.divide(10, 0)
except Exception as exc:
    print(f"RPC failed: {exc}")

AetherRPC also provides its own exception hierarchy for connection, timeout, streaming, and RPC-related failures.

Configuration

The client supports configuration such as:

client = AetherRPCClient(
    host="127.0.0.1",
    port=9000,
    auth_token=None,
    connect_timeout=5,
)

The default client configuration uses:

Host: 127.0.0.1
Port: 9000
Authentication: disabled

Command-Line Entry Point

AetherRPC provides an aetherrpc command through its Python package entry point for demo.

aetherrpc {server|client}

Testing

AetherRPC uses Python's built-in unittest framework.

Run the complete test suite with:

python -m unittest discover -s tests -v

The project currently includes tests covering:

  • Client configuration
  • Client connections
  • Context managers
  • Dynamic method proxies
  • Connection failures
  • Synchronous RPC
  • Asynchronous RPC
  • Streaming
  • Authentication
  • Concurrent calls
  • Call identity
  • Custom object serialization
  • Remote exceptions
  • Timeouts
  • Protocol framing
  • Token handling
  • Server lifecycle
  • Middleware
  • Function registration
  • Aliases
  • Server request processing

Project Structure

aetherrpc/
├── src/
│   └── aetherrpc/
│       ├── client.py
│       ├── protocol.py
│       ├── server.py
│       ├── __init__.py
│       └── __main__.py
│
├── tests/
│   ├── test_client.py
│   ├── test_integration.py
│   ├── test_protocol.py
│   ├── test_server.py
│   └── __init__.py
│
├── LICENSE
├── README.md
└── pyproject.toml

Requirements

  • Python 3.10 or newer
  • No additional runtime dependencies

License

AetherRPC is released under the MIT License.

See LICENSE for the full license text.

Status

AetherRPC is currently at version 0.1.0.

The API may evolve as the project develops.

Downloads & popularity

2downloads
1-day window · source-reported counts20 Oct 2026
104520
2026-07-31: 104 · observed 2026-10-21T19:32:01.3590994Z · period 2026-07-31–2026-07-312026-08-01: 6 · observed 2026-10-21T19:32:01.3590994Z · period 2026-08-01–2026-08-012026-08-02: 1 · observed 2026-10-21T19:32:01.3590994Z · period 2026-08-02–2026-08-022026-08-03: 5 · observed 2026-10-21T19:32:01.3590994Z · period 2026-08-03–2026-08-032026-08-04: 2 · observed 2026-10-21T19:32:01.3590994Z · period 2026-08-04–2026-08-042026-08-05: 2 · observed 2026-10-21T19:32:01.3590994Z · period 2026-08-05–2026-08-052026-08-06: 2 · observed 2026-10-21T19:32:01.3590994Z · period 2026-08-06–2026-08-062026-08-08: 6 · observed 2026-10-21T19:32:01.3590994Z · period 2026-08-08–2026-08-082026-08-09: 2 · observed 2026-10-21T19:32:01.3590994Z · period 2026-08-09–2026-08-092026-08-11: 2 · observed 2026-10-21T19:32:01.3590994Z · period 2026-08-11–2026-08-112026-08-13: 2 · observed 2026-10-21T19:32:01.3590994Z · period 2026-08-13–2026-08-132026-08-14: 4 · observed 2026-10-21T19:32:01.3590994Z · period 2026-08-14–2026-08-142026-08-15: 1 · observed 2026-10-21T19:32:01.3590994Z · period 2026-08-15–2026-08-152026-08-17: 2 · observed 2026-10-21T19:32:01.3590994Z · period 2026-08-17–2026-08-172026-08-18: 3 · observed 2026-10-21T19:32:01.3590994Z · period 2026-08-18–2026-08-182026-08-19: 1 · observed 2026-10-21T19:32:01.3590994Z · period 2026-08-19–2026-08-192026-08-20: 1 · observed 2026-10-21T19:32:01.3590994Z · period 2026-08-20–2026-08-202026-08-22: 1 · observed 2026-10-21T19:32:01.3590994Z · period 2026-08-22–2026-08-222026-08-23: 3 · observed 2026-10-21T19:32:01.3590994Z · period 2026-08-23–2026-08-232026-08-24: 6 · observed 2026-10-21T19:32:01.3590994Z · period 2026-08-24–2026-08-242026-08-26: 1 · observed 2026-10-21T19:32:01.3590994Z · period 2026-08-26–2026-08-262026-08-28: 5 · observed 2026-10-21T19:32:01.3590994Z · period 2026-08-28–2026-08-282026-08-31: 2 · observed 2026-10-21T19:32:01.3590994Z · period 2026-08-31–2026-08-312026-09-07: 3 · observed 2026-10-21T19:32:01.3590994Z · period 2026-09-07–2026-09-072026-09-09: 1 · observed 2026-10-21T19:32:01.3590994Z · period 2026-09-09–2026-09-092026-09-11: 1 · observed 2026-10-21T19:32:01.3590994Z · period 2026-09-11–2026-09-112026-09-12: 2 · observed 2026-10-21T19:32:01.3590994Z · period 2026-09-12–2026-09-122026-09-13: 2 · observed 2026-10-21T19:32:01.3590994Z · period 2026-09-13–2026-09-132026-09-14: 3 · observed 2026-10-21T19:32:01.3590994Z · period 2026-09-14–2026-09-142026-09-16: 2 · observed 2026-10-21T19:32:01.3590994Z · period 2026-09-16–2026-09-162026-09-20: 2 · observed 2026-10-21T19:32:01.3590994Z · period 2026-09-20–2026-09-202026-09-23: 1 · observed 2026-10-21T19:32:01.3590994Z · period 2026-09-23–2026-09-232026-09-24: 2 · observed 2026-10-21T19:32:01.3590994Z · period 2026-09-24–2026-09-242026-09-25: 3 · observed 2026-10-21T19:32:01.3590994Z · period 2026-09-25–2026-09-252026-09-26: 1 · observed 2026-10-21T19:32:01.3590994Z · period 2026-09-26–2026-09-262026-09-27: 1 · observed 2026-10-21T19:32:01.3590994Z · period 2026-09-27–2026-09-272026-09-28: 1 · observed 2026-10-21T19:32:01.3590994Z · period 2026-09-28–2026-09-282026-09-30: 2 · observed 2026-10-21T19:32:01.3590994Z · period 2026-09-30–2026-09-302026-10-02: 1 · observed 2026-10-21T19:32:01.3590994Z · period 2026-10-02–2026-10-022026-10-03: 1 · observed 2026-10-21T19:32:01.3590994Z · period 2026-10-03–2026-10-032026-10-06: 2 · observed 2026-10-21T19:32:01.3590994Z · period 2026-10-06–2026-10-062026-10-08: 5 · observed 2026-10-21T19:32:01.3590994Z · period 2026-10-08–2026-10-082026-10-09: 1 · observed 2026-10-21T19:32:01.3590994Z · period 2026-10-09–2026-10-092026-10-11: 1 · observed 2026-10-21T19:32:01.3590994Z · period 2026-10-11–2026-10-112026-10-13: 1 · observed 2026-10-21T19:32:01.3590994Z · period 2026-10-13–2026-10-132026-10-14: 1 · observed 2026-10-21T19:32:01.3590994Z · period 2026-10-14–2026-10-142026-10-20: 2 · observed 2026-10-21T19:32:01.3590994Z · period 2026-10-20–2026-10-20
31 Jul20 Oct

pypistats · 47 observations shown. Missing days are unknown. Source category: overall: without mirrors.

View observed values
Date / source periodValueObserved at
2026-10-20 – 2026-10-2022026-10-21T19:32:01.3590994Z
2026-10-14 – 2026-10-1412026-10-21T19:32:01.3590994Z
2026-10-13 – 2026-10-1312026-10-21T19:32:01.3590994Z
2026-10-11 – 2026-10-1112026-10-21T19:32:01.3590994Z
2026-10-09 – 2026-10-0912026-10-21T19:32:01.3590994Z
2026-10-08 – 2026-10-0852026-10-21T19:32:01.3590994Z
2026-10-06 – 2026-10-0622026-10-21T19:32:01.3590994Z
2026-10-03 – 2026-10-0312026-10-21T19:32:01.3590994Z
2026-10-02 – 2026-10-0212026-10-21T19:32:01.3590994Z
2026-09-30 – 2026-09-3022026-10-21T19:32:01.3590994Z
2026-09-28 – 2026-09-2812026-10-21T19:32:01.3590994Z
2026-09-27 – 2026-09-2712026-10-21T19:32:01.3590994Z
2026-09-26 – 2026-09-2612026-10-21T19:32:01.3590994Z
2026-09-25 – 2026-09-2532026-10-21T19:32:01.3590994Z
2026-09-24 – 2026-09-2422026-10-21T19:32:01.3590994Z
2026-09-23 – 2026-09-2312026-10-21T19:32:01.3590994Z
2026-09-20 – 2026-09-2022026-10-21T19:32:01.3590994Z
2026-09-16 – 2026-09-1622026-10-21T19:32:01.3590994Z
2026-09-14 – 2026-09-1432026-10-21T19:32:01.3590994Z
2026-09-13 – 2026-09-1322026-10-21T19:32:01.3590994Z
2026-09-12 – 2026-09-1222026-10-21T19:32:01.3590994Z
2026-09-11 – 2026-09-1112026-10-21T19:32:01.3590994Z
2026-09-09 – 2026-09-0912026-10-21T19:32:01.3590994Z
2026-09-07 – 2026-09-0732026-10-21T19:32:01.3590994Z
2026-08-31 – 2026-08-3122026-10-21T19:32:01.3590994Z
2026-08-28 – 2026-08-2852026-10-21T19:32:01.3590994Z
2026-08-26 – 2026-08-2612026-10-21T19:32:01.3590994Z
2026-08-24 – 2026-08-2462026-10-21T19:32:01.3590994Z
2026-08-23 – 2026-08-2332026-10-21T19:32:01.3590994Z
2026-08-22 – 2026-08-2212026-10-21T19:32:01.3590994Z
2026-08-20 – 2026-08-2012026-10-21T19:32:01.3590994Z
2026-08-19 – 2026-08-1912026-10-21T19:32:01.3590994Z
2026-08-18 – 2026-08-1832026-10-21T19:32:01.3590994Z
2026-08-17 – 2026-08-1722026-10-21T19:32:01.3590994Z
2026-08-15 – 2026-08-1512026-10-21T19:32:01.3590994Z
2026-08-14 – 2026-08-1442026-10-21T19:32:01.3590994Z
2026-08-13 – 2026-08-1322026-10-21T19:32:01.3590994Z
2026-08-11 – 2026-08-1122026-10-21T19:32:01.3590994Z
2026-08-09 – 2026-08-0922026-10-21T19:32:01.3590994Z
2026-08-08 – 2026-08-0862026-10-21T19:32:01.3590994Z
2026-08-06 – 2026-08-0622026-10-21T19:32:01.3590994Z
2026-08-05 – 2026-08-0522026-10-21T19:32:01.3590994Z
2026-08-04 – 2026-08-0422026-10-21T19:32:01.3590994Z
2026-08-03 – 2026-08-0352026-10-21T19:32:01.3590994Z
2026-08-02 – 2026-08-0212026-10-21T19:32:01.3590994Z
2026-08-01 – 2026-08-0162026-10-21T19:32:01.3590994Z
2026-07-31 – 2026-07-311042026-10-21T19:32:01.3590994Z

Versions 1

Collected releases
VersionPublishedDirect dependenciesOpen version
0.1.031 Jul 20260

Package advisories

0
No matching advisories collected

This describes our collected data; it is not a security assessment.

Metadata history

Meaningful changes
Current collected state Current

Observed since 20 Oct, 20:55 UTC

No superseded metadata states collected. Unchanged observations do not create new revisions.

Record identity

package:2c1ec71614efd196a94f6c00f211f074c66c7238dbae863e8ab868df4823b4db