pamoja-bus
An in-memory typed publish and subscribe event bus, with publishers that never wait and subscribers that count what they miss. One capability of pamoja, one memory-safe Rust core with bindings for TypeScript, Python, and C#.
Install
pip install pamoja-bus
from pamoja import bus
This pulls in pamoja-native, the compiled engine. pip install pamoja is the whole framework in one package.
Example
The script the test suite runs, spliced here as it ran.
From bindings/python/guides/bus.py:
import asyncio
from pamoja.bus import EventPublisher
QUIET_MS = 50
async def main() -> None:
# The station's wiring makes one bus and hands each part what it needs: a publisher
# to announce, an endpoint to listen. No part holds a reference to another, so any
# of them can be replaced without touching the rest.
bus = EventPublisher(2)
power = bus.publisher()
sampler = bus.publisher()
heater = bus.subscribe()
logger = bus.subscribe()
# One announcement reaches every part that listens, and each reads its own copy.
reached = power.publish("battery.low")
print(f"power handed battery.low to {reached} parts")
heater_took = await heater.next_text()
print(f"heater took {heater_took}")
logger_took = await logger.next_text()
print(f"logger took {logger_took}")
# Publishing never waits, even while the part's own wait is open, and a part hears
# what it publishes.
waiting = heater.next_text()
heater.publish("heater.off")
heard = await waiting
print(f"heater heard its own {heard}, sent while it waited")
# A part that joins late sees only what is published after it subscribes. There is
# no history to replay.
radio = bus.subscribe()
power.publish("battery.ok")
first = await radio.next_text()
print(f"radio joined late, so the first event it sees is {first}")
# Each endpoint buffers two events. The logger, busy writing to flash, falls behind
# while the sampler publishes five readings: it loses the oldest events, resumes
# with the newest, and counts what it lost.
for reading in range(5):
sampler.publish(f"wind {reading}")
resumed = await logger.next_text()
missed = logger.missed
print(f"logger missed {missed} and resumes at {resumed}")
newest = await logger.next_text()
print(f"logger then took {newest}")
# A wait with a limit gives up without taking anything, so a part can do other work
# between events and lose nothing by it.
try:
await asyncio.wait_for(logger.next_text(), QUIET_MS / 1000)
print("logger took an event no one published, which should never happen")
except asyncio.TimeoutError:
print(f"logger heard nothing more within {QUIET_MS} ms")
return reached, heater_took, logger_took, heard, first, missed, resumed, newest
seen = asyncio.run(main())
The same capability in every language
| Language | Package | Reference |
|---|---|---|
| Rust | pamoja-bus |
reference, docs.rs, install |
| TypeScript | @pamoja/bus |
reference, install |
| Python | pamoja-bus |
reference, install |
| C# | Pamoja.Bus |
reference, install |
Documentation
pamoja.busreference, every class and function in this module.- The Event bus guide, with the same example in Rust, TypeScript, and C#.
- Every capability, and the install page.
License
MIT
Release files for pamoja-bus 0.2.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| pamoja_bus-0.2.0.tar.gz | 3.7 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| pamoja_bus-0.2.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 7.9 kB
Release files / pamoja_bus-0.2.0.tar.gz
| Download URL | pamoja_bus-0.2.0.tar.gz |
|---|---|
| Size | 3.7 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
e1838825bc5e2686a4fdfe94980a757d294deb9d476afdd40229603b4c95bca9
|
|
BLAKE2b-256 checksum How to use checksums |
b67b0530bd5237b32359e37e121e1f74db35a26184c5045b3b3b9a11bb26ef7d
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.15
|
Release files / pamoja_bus-0.2.0-py3-none-any.whl
| Download URL | pamoja_bus-0.2.0-py3-none-any.whl |
|---|---|
| Size | 4.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
dbcd03e75d415206c00ae138b2d36a59b029a01d8d3414f69ba5896ad4685fe6
|
|
BLAKE2b-256 checksum How to use checksums |
9cae7fffe7a5c432f379daf0676acb32d9435ae3fb13a53da688868240da4cdf
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/7.0.0 CPython/3.13.15
|