Skip to main content

Python implementation of the Cap'n Web protocol

Project description

Cap'n Web Python

A complete Python implementation of the Cap'n Web protocol - a capability-based RPC system with promise pipelining, structured errors, and multiple transport support.

What's in the Box

Core Features:

  • Capability-based security - Unforgeable object references with explicit disposal
  • Promise pipelining - Batch multiple dependent calls into single round-trips
  • Multiple transports - HTTP Batch, WebSocket, and WebTransport/HTTP/3
  • Type-safe - Full type hints compatible with pyright/mypy
  • Async/await - Built on Python's asyncio
  • Bidirectional RPC - Peer-to-peer capability passing
  • 100% Interoperable - Fully compatible with TypeScript reference implementation

Production-Ready:

  • 352 tests passing, 76% coverage
  • 0 linting errors, 0 typing errors
  • Hook-based architecture (clean, maintainable)
  • ~99% protocol compliance

Why Use Cap'n Web?

Traditional RPC has problems:

  • No security model (anyone can call anything)
  • No resource management (memory leaks)
  • Poor performance (round-trip per call)

Cap'n Web solves these:

  • Security: Capabilities are unforgeable - you can only call what you have a reference to
  • Resource Management: Explicit disposal with reference counting prevents leaks
  • Performance: Promise pipelining batches dependent calls into one round-trip
  • Flexibility: Pass capabilities as arguments - the server decides who gets access

Installation

pip install capnweb
# or
uv add capnweb

# For WebTransport support (optional):
pip install capnweb[webtransport]

Quick Start

Server:

from capnweb.server import Server, ServerConfig
from capnweb.types import RpcTarget
from capnweb.error import RpcError

class Calculator(RpcTarget):
    async def call(self, method: str, args: list) -> any:
        match method:
            case "add": return args[0] + args[1]
            case "multiply": return args[0] * args[1]
            case _: raise RpcError.not_found(f"Unknown method: {method}")

    async def get_property(self, property: str) -> any:
        raise RpcError.not_found("No properties")

async def main():
    server = Server(ServerConfig(host="127.0.0.1", port=8080))
    server.register_capability(0, Calculator())
    await server.start()
    await asyncio.Event().wait()  # Run forever

Client:

from capnweb.client import Client, ClientConfig

async with Client(ClientConfig(url="http://localhost:8080/rpc/batch")) as client:
    result = await client.call(0, "add", [5, 3])
    print(f"5 + 3 = {result}")  # Output: 8

Promise Pipelining (advanced):

async with Client(config) as client:
    batch = client.pipeline()

    # These calls are batched into a single HTTP request!
    user = batch.call(0, "getUser", ["alice"])
    profile = batch.call(0, "getProfile", [user.id])  # Property access on promise!
    posts = batch.call(0, "getPosts", [user.id])

    u, p, posts_data = await asyncio.gather(user, profile, posts)

Current Status (v0.4.0)

Transports:

  • ✅ HTTP Batch (production-ready)
  • ✅ WebSocket (production-ready)
  • ✅ WebTransport/HTTP/3 (production-ready, requires aioquic)

Protocol Features:

  • ✅ Wire protocol (all message types)
  • ✅ Promise pipelining
  • ✅ Expression evaluation (including .map())
  • ✅ Bidirectional RPC
  • ✅ Resume tokens
  • ✅ Reference counting
  • ✅ Structured errors
  • ⚠️ IL plan execution (only remap supported, full IL is low priority)

Code Quality:

  • ✅ 352 tests passing (100% success rate)
  • ✅ 76% test coverage
  • ✅ 0 linting errors (ruff)
  • ✅ 0 typing errors (pyrefly)
  • ✅ TypeScript interoperability verified

Documentation

Examples

Included examples:

  • examples/calculator/ - Simple RPC calculator
  • examples/batch-pipelining/ - Promise pipelining demonstration
  • examples/peer_to_peer/ - Bidirectional RPC (Alice & Bob)
  • examples/chat/ - Real-time WebSocket chat with bidirectional RPC
  • examples/microservices/ - Service mesh architecture
  • examples/actor-system/ - Distributed actor system with supervisor/worker
  • examples/webtransport/ - WebTransport/HTTP/3 standalone demo
  • examples/webtransport-integrated/ - WebTransport with full RPC

Each example includes a README with running instructions.

Development

# Clone and install
git clone https://github.com/abilian/py-capnweb.git
cd py-capnweb
uv sync

# Run tests
pytest
# or
make test

# Run linting & type checking
ruff check
pyrefly check
# or
make check

# Run with coverage
pytest --cov=capnweb --cov-report=term-missing

Protocol Compliance

This implementation follows the Cap'n Web protocol specification.

Interoperability Testing: Cross-implementation testing with TypeScript reference validates all combinations:

  • Python Server ↔ Python Client ✅
  • Python Server ↔ TypeScript Client ✅
  • TypeScript Server ↔ Python Client ✅
  • TypeScript Server ↔ TypeScript Client ✅

Run interop tests: cd interop && bash run_tests.sh

What's New

See CHANGES.md for detailed release notes.

v0.4.0 (latest):

  • WebTransport/HTTP/3 support with certificate management
  • Actor system example with distributed capabilities
  • Perfect code quality (0 linting errors, 0 typing errors)
  • 352 tests passing

v0.3.1:

  • Comprehensive documentation (quickstart, architecture, API reference)
  • 85% test coverage (up from 67%)
  • Legacy code removed (clean hook-based architecture)

v0.3.0:

  • Promise pipelining support
  • 100% TypeScript interoperability
  • Array escaping for compatibility

License

Dual-licensed under MIT or Apache-2.0, at your option.

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

py_capnweb-0.4.0.tar.gz (42.5 kB view details)

Uploaded Source

Built Distribution

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

py_capnweb-0.4.0-py3-none-any.whl (52.0 kB view details)

Uploaded Python 3

File details

Details for the file py_capnweb-0.4.0.tar.gz.

File metadata

  • Download URL: py_capnweb-0.4.0.tar.gz
  • Upload date:
  • Size: 42.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.0rc1

File hashes

Hashes for py_capnweb-0.4.0.tar.gz
Algorithm Hash digest
SHA256 ce4854529609fb73d1786c887056a0c55b6a32ad9dd39dc00bf7ff6074762bc5
MD5 7962376c9a9ce9cdbe4139a6c81c68ba
BLAKE2b-256 beb0fd31beb87d9ab038b6daa8bc74ac3feb36d342421a3d432e36f09ec3ad4b

See more details on using hashes here.

File details

Details for the file py_capnweb-0.4.0-py3-none-any.whl.

File metadata

  • Download URL: py_capnweb-0.4.0-py3-none-any.whl
  • Upload date:
  • Size: 52.0 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.14.0rc1

File hashes

Hashes for py_capnweb-0.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 84ebbbdff103d77f9e638c0fc1b4797a2e63af286d3ac591f6991c4c98a31afe
MD5 9408a4cbb9f35b955bc371e1f0c6462e
BLAKE2b-256 e463f1053abd38c0c6e03d15fdd59e4e27b09e0ab4a3e888e87f3d69b593c363

See more details on using hashes here.

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