In-process loopback transport for clamator (pre-1.0).
Project description
clamator-over-memory
In-process loopback transport for clamator. The shared MemoryBus connects a MemoryRpcServer and MemoryRpcClient running in the same Python process.
Install
pip install clamator-over-memory clamator-protocol
Quickstart
Contracts are authored in TypeScript and the Python sibling is produced by @clamator/codegen:
npx @clamator/codegen --src contracts --out-py generated
The emitted generated/arith.py exports Pydantic models, a typed ArithClient, an ArithService ABC, and the arith_contract Contract object. Wire server and client through a shared bus, talk via ArithClient.
Server-side — register handlers and start:
from clamator_over_memory import MemoryBus, MemoryRpcServer
from .generated.arith import AddParams, AddResult, ArithService, arith_contract
class Arith(ArithService):
async def add(self, params: AddParams) -> AddResult:
return AddResult(sum=params.a + params.b)
async def build_arith_server(bus: MemoryBus) -> MemoryRpcServer:
server = MemoryRpcServer(bus=bus) # no external connection; stop() unregisters from the bus without closing any resource # noqa: E501
server.register_service(arith_contract, Arith()) # must precede start() — post-start registrations are silently ignored, never registered on the bus # noqa: E501
await server.start()
return server
(Verbatim from py/packages/over-memory/tests/server.py:1-15.)
Client-side — call the typed proxy:
from clamator_over_memory import MemoryBus, MemoryRpcClient
from .generated.arith import AddParams, AddResult, ArithClient
async def call_arith(bus: MemoryBus) -> AddResult:
client = MemoryRpcClient(bus=bus) # default timeout 30 s (pass default_timeout_ms to override); no retry; timeouts not propagated to server # noqa: E501
await client.start()
arith = ArithClient(client)
r = await arith.add(AddParams(a=2, b=3))
await client.stop()
return r
(Verbatim from py/packages/over-memory/tests/client.py:1-12.)
Call await server.stop() to shut down — since the loopback is in-process, the drain is instantaneous and the server unregisters from the bus without closing any external resource.
MemoryBus() takes no arguments and is the only wiring needed. The loopback is synchronous within a single asyncio task — no timeouts, retries, or stream parameters.
Key surface
MemoryBus()— the connecting object passed to both server and client.MemoryRpcServer(bus=...)—register_service(contract, handler_obj),start(),stop().MemoryRpcClient(bus=...)—start(),stop(). Wrap with a generated*Clientproxy for typed calls.
Worker-pool semantics
N/A — this transport is a single-process loopback. Multiple MemoryRpcServer instances on the same MemoryBus do not form a competing-consumers pool because there is no shared substrate; each bus is in-memory to its constructing process. For cross-process worker-pool behavior, use clamator-over-redis.
Owned external state
N/A — MemoryBus owns no external state. There are no Redis keys, no streams, no files, no sockets. The bus is garbage-collected with the process.
Connection ownership
N/A — there is no external connection to own. MemoryRpcServer and MemoryRpcClient share a MemoryBus that lives entirely in-process; stop() releases its references without closing any external resource.
When to reach for this vs. clamator-over-redis
clamator-over-memory— tests, embedded scenarios, anything single-process.clamator-over-redis— cross-process, cross-host, durable streams, production.
Links
- Sibling (TypeScript):
@clamator/over-memory - Codegen:
@clamator/codegen(run from TS side; consume the generated Python output) - Design spec:
docs/2026-05-07-clamator-design.md - Agent rules:
AGENTS.md
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file clamator_over_memory-0.1.2.tar.gz.
File metadata
- Download URL: clamator_over_memory-0.1.2.tar.gz
- Upload date:
- Size: 8.0 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9336f65a665557d883dda69bf2b9bcddf5d1f357303e1f0f5517aeb31dc11e88
|
|
| MD5 |
5b8365899b5fde4df175f39108c049ef
|
|
| BLAKE2b-256 |
ce30504fcbb7b4076232ad5dbc08c42784f64fe06d5b371ab65066c200b9feef
|
File details
Details for the file clamator_over_memory-0.1.2-py3-none-any.whl.
File metadata
- Download URL: clamator_over_memory-0.1.2-py3-none-any.whl
- Upload date:
- Size: 9.6 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: twine/6.2.0 CPython/3.12.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
be28b4a0fb544f190ab303da83f100ce8a897fc01d66684d906780eee213b948
|
|
| MD5 |
1bdac292e92e6857ba54a28192d4c89b
|
|
| BLAKE2b-256 |
7b2e750fce5818f55980aee33d60b8c08ab870a9aa3a105d9b5751e4169f45c7
|