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.1.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.1-py3-none-any.whl (52.0 kB view details)

Uploaded Python 3

File details

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

File metadata

  • Download URL: py_capnweb-0.4.1.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.1.tar.gz
Algorithm Hash digest
SHA256 14a23db730afd5b2cbf0ee11dd795d318d1215f2435a33d998663922808520dc
MD5 bb90ecf6e4912df17d58cf3a8f9d725a
BLAKE2b-256 d63d2908becda57b6a63c490f54d83e8cd938d3f412186ff031f1948a70d923d

See more details on using hashes here.

File details

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

File metadata

  • Download URL: py_capnweb-0.4.1-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.1-py3-none-any.whl
Algorithm Hash digest
SHA256 1715b9024d9d4162ac84302bcd61175ce3003773d168b43592d92ad75cee02e7
MD5 9efcd5b71e7ad97a4bc1dbf848721ac0
BLAKE2b-256 37d52ae22aa3a4d9ff2351fc99db418d6392bd331a0c2436bcde9dc7c3e442aa

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