Skip to main content

Python bindings for SLIM (Secure Low-Latency Interactive Messaging) using UniFFI

Project description

SLIM Python Bindings (UniFFI)

Python bindings for SLIM (Secure Low-Latency Interactive Messaging) using UniFFI.

This provides a Python interface to the SLIM data plane, enabling secure, low-latency messaging with support for point-to-point and group (multicast) communication patterns.

Overview

These Python bindings are generated from the agntcy-slim-bindings crate using UniFFI, providing a native Python interface that wraps the high-performance Rust implementation.

Key Features

  • Point-to-Point Messaging: Direct communication between two endpoints
  • Group Messaging: Multicast communication with multiple participants
  • Secure by Default: Support for TLS, mTLS, and various authentication methods
  • MLS Encryption: End-to-end encryption for sessions
  • Delivery Confirmation: Optional completion handles for reliable messaging
  • Flexible Authentication: Shared secrets, JWT, SPIRE integration
  • slimrpc Support: Protocol Buffers RPC over SLIM - see SLIMRPC.md for details

Architecture

The Python bindings are built using Maturin, which automatically generates Python bindings from the Rust UniFFI adapter:

data-plane/bindings/
├── rust/          # Rust UniFFI bindings (shared by Go, Python, etc.)
│   ├── src/
│   │   ├── app.rs
│   │   ├── build_info.rs
│   │   ├── client_config.rs
│   │   ├── common_config.rs
│   │   ├── completion_handle.rs
│   │   ├── config.rs
│   │   ├── errors.rs
│   │   ├── identity.rs
│   │   ├── identity_config.rs
│   │   ├── init_config.rs
│   │   ├── lib.rs
│   │   ├── message_context.rs
│   │   ├── name.rs
│   │   ├── server_config.rs
│   │   ├── service.rs
│   │   └── session.rs
│   └── Cargo.toml
├── go/               # Go-specific bindings and examples
└── python/           # Python-specific bindings and examples (this directory)
    ├── examples/              # Example applications
    ├── tests/                 # Unit and integration tests
    └── Taskfile.yaml          # Build and development tasks

Prerequisites

  • Rust toolchain (1.70+)
  • Python (3.10+)
  • uv (Python package manager): https://docs.astral.sh/uv/
  • Task (optional, for convenient build commands)

Installation

Development Build

cd data-plane/bindings/python
task python:bindings:build

This will:

  1. Install all dependencies
  2. Compile the Rust UniFFI adapter
  3. Generate Python bindings using Maturin
  4. Install the package in development mode

Creating Distribution Packages

Build Wheels for Multiple Python Versions

To create distributable wheel packages for Python 3.10, 3.11, 3.12, 3.13 and 3.14:

task python:bindings:packaging

Or directly with Maturin:

uv run maturin build --release -i 3.10 3.11 3.12 3.13

Maturin automatically:

  1. Compiles the Rust UniFFI adapter library
  2. Generates Python bindings from UniFFI scaffolding
  3. Bundles the native library into platform-specific wheels
  4. Creates wheels for each specified Python version

The resulting wheels are self-contained and ready for distribution.

Custom Build Options

You can customize the build with the following variables:

# Build for a specific target architecture
task python:bindings:packaging TARGET=aarch64-apple-darwin

# Build in debug mode (default is release)
task python:bindings:packaging PROFILE=debug

# Cross-compile for Linux on macOS
task python:bindings:packaging TARGET=x86_64-unknown-linux-gnu

Output Structure

After running the packaging task, you'll find:

dist/
├── slim_uniffi_bindings-0.7.0-cp310-*.whl  # Python 3.10 wheel
├── slim_uniffi_bindings-0.7.0-cp311-*.whl  # Python 3.11 wheel
├── slim_uniffi_bindings-0.7.0-cp312-*.whl  # Python 3.12 wheel
└── slim_uniffi_bindings-0.7.0-cp313-*.whl  # Python 3.13 wheel

Note: The native library is automatically bundled inside each wheel.

Installing from Wheel

Users can install the wheel package directly:

pip install slim_uniffi_bindings-0.7.0-cp310-*.whl

The native library is automatically included in the wheel and will be loaded at runtime.

Examples

Examples are a separate project in the examples/ directory.

See examples/README.md for detailed instructions.

Quick Start with Examples

cd examples

# View available examples
task

# Run simple example
task simple

# Run point-to-point examples
task p2p:alice    # Terminal 1
task p2p:bob      # Terminal 2

Quick Start

Simple Example

import slim_uniffi_bindings as slim

# Initialize crypto provider
slim.initialize_crypto_provider()

# Get version
print(f"SLIM Version: {slim.get_version()}")

# Create an app with shared secret authentication
app_name = {
    'components': ['org', 'example', 'app'],
    'id': None
}
app = slim.create_app_with_secret(app_name, "my-secret")

print(f"App ID: {app.id()}")
print(f"App Name: {'/'.join(app.name().components)}")

Run the simple example:

cd examples
task simple

Point-to-Point Communication

Terminal 1 - Receiver (Alice):

cd examples
task p2p:alice

Terminal 2 - Sender (Bob):

cd examples
task p2p:bob

Group Communication

Terminal 1 - Participant (Alice):

cd examples
task group:participant:alice

Terminal 2 - Participant (Bob):

cd examples
task group:participant:bob

Terminal 3 - Moderator:

cd examples
task group:moderator

For more details, see examples/README.md.

API Overview

Application Creation

# Create app with shared secret
app = slim.create_app_with_secret(app_name, shared_secret)

# Get app information
app_id = app.id()
app_name = app.name()

Server Operations

# Connect to server
client_config = {
    'endpoint': 'http://localhost:46357',
    'tls': {'insecure': True, ...}
}
conn_id = app.connect(client_config)

# Run server
server_config = {
    'endpoint': '127.0.0.1:46357',
    'tls': {'insecure': True, ...}
}
app.run_server(server_config)

# Disconnect
app.disconnect(conn_id)

Session Management

# Create session
session_config = {
    'session_type': 'PointToPoint',  # or 'Group'
    'enable_mls': False,
    'max_retries': 3,
    'interval_ms': 100,
    'initiator': True,
    'metadata': {}
}
session = app.create_session(session_config, destination_name)

# Listen for incoming session
session = app.listen_for_session(timeout_ms=30000)

# Delete session
app.delete_session(session)

Messaging

# Send message (fire-and-forget)
session.publish(data, "text/plain", metadata)

# Send with delivery confirmation
completion = session.publish_with_completion(data, "text/plain", metadata)
completion.wait()  # Block until delivered

# Receive message
msg = session.get_message(timeout_ms=5000)
print(f"Payload: {msg.payload}")
print(f"From: {msg.context.source_name}")
print(f"Type: {msg.context.payload_type}")

# Reply to message
session.publish_to(msg.context, reply_data, "text/plain", None)

Group Operations

# Invite participant to group
session.invite(participant_name)

# Remove participant
session.remove(participant_name)

Examples

Examples Directory Structure

examples/
├── common/
│   └── common.py          # Shared utilities
├── simple/
│   └── main.py            # Basic functionality demo
├── point_to_point/
│   └── main.py            # P2P messaging
└── group/
    └── main.py            # Group/multicast messaging

Running Examples

All examples require a running SLIM server. Start the Go server:

cd data-plane/bindings/go
task example:server

Then run Python examples:

# Simple example
task example

# Point-to-point
task example:p2p:alice      # Terminal 1
task example:p2p:bob        # Terminal 2

# Group messaging
task example:group:participant:alice    # Terminal 1
task example:group:participant:bob      # Terminal 2
task example:group:moderator            # Terminal 3

Testing

Unit Tests

task test
# or
python -m pytest tests/unit_test.py -v

Integration Tests

Integration tests require a running SLIM server:

# Terminal 1: Start server
cd ../go && task example:server

# Terminal 2: Run integration tests
SLIM_INTEGRATION_TEST=1 python -m pytest tests/integration_test.py -v -s

Development

Available Tasks

task                           # Show help
task build                     # Build package with Maturin
task test                      # Run tests
task python:bindings:packaging # Build wheels for multiple Python versions
task clean                     # Clean build artifacts

Project Structure

  • slim_uniffi_bindings/ - Python package (bindings generated by Maturin)
  • examples/ - Example applications
  • tests/ - Unit and integration tests
  • Taskfile.yaml - Build automation
  • pyproject.toml - Package configuration (Maturin build system)

Comparison with Go Bindings

Both Python and Go bindings use the same UniFFI adapter, ensuring API consistency:

Feature Python Go
Binding Generation uniffi-bindgen uniffi-bindgen-go
API Style Pythonic (snake_case) Idiomatic Go (PascalCase)
Error Handling Exceptions Error returns
Async Support Sync wrapper over async Rust Sync wrapper over async Rust
Examples
Tests

API Reference

Core Types

  • Name: Application/service identifier with components and optional ID
  • SessionConfig: Configuration for creating sessions
  • TlsConfig: TLS settings for secure connections
  • ServerConfig: Server endpoint and TLS configuration
  • ClientConfig: Client endpoint and TLS configuration
  • MessageContext: Message metadata (source, destination, type, metadata)
  • ReceivedMessage: Received message with context and payload

Main Classes

  • BindingsAdapter: Main app interface for session management
  • BindingsSessionContext: Session interface for messaging
  • FfiCompletionHandle: Completion handle for delivery confirmation

Session Types

  • PointToPoint: Direct one-to-one communication
  • Group: One-to-many multicast communication

Troubleshooting

ImportError: Cannot find slim_uniffi_bindings

Make sure you've built the package:

task build
# or
uv run maturin develop

Connection Refused

Ensure the SLIM server is running:

cd ../go && task example:server

Build Errors

If you encounter build errors, try cleaning and rebuilding:

task clean
uv run maturin develop

Contributing

When contributing to the Python bindings:

  1. Maintain API consistency with Go bindings
  2. Follow Python naming conventions (snake_case)
  3. Add tests for new functionality
  4. Update examples if adding features
  5. Keep documentation up to date

License

Apache-2.0 - See LICENSE.md for details

See Also

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distributions

No source distribution files available for this release.See tutorial on generating distribution archives.

Built Distributions

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

slim_bindings-1.3.0rc1-py3-none-win_arm64.whl (11.4 MB view details)

Uploaded Python 3Windows ARM64

slim_bindings-1.3.0rc1-py3-none-win_amd64.whl (11.9 MB view details)

Uploaded Python 3Windows x86-64

slim_bindings-1.3.0rc1-py3-none-musllinux_1_2_x86_64.whl (13.3 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

slim_bindings-1.3.0rc1-py3-none-musllinux_1_2_aarch64.whl (12.8 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

slim_bindings-1.3.0rc1-py3-none-manylinux_2_28_x86_64.whl (13.4 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ x86-64

slim_bindings-1.3.0rc1-py3-none-manylinux_2_28_aarch64.whl (12.9 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ ARM64

slim_bindings-1.3.0rc1-py3-none-macosx_11_0_arm64.whl (14.3 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

slim_bindings-1.3.0rc1-py3-none-macosx_10_12_x86_64.whl (14.6 MB view details)

Uploaded Python 3macOS 10.12+ x86-64

File details

Details for the file slim_bindings-1.3.0rc1-py3-none-win_arm64.whl.

File metadata

File hashes

Hashes for slim_bindings-1.3.0rc1-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 e94e1d70b713dd771c075cc51cc16eca65f384f975e1a2d1efb7b4699b6cf545
MD5 254d9e9b47f375573c0c8fc6bfdda4b9
BLAKE2b-256 a99620d6b2d76b0e0873b212dcabe8358c6f02dad278face232e318e850975ae

See more details on using hashes here.

File details

Details for the file slim_bindings-1.3.0rc1-py3-none-win_amd64.whl.

File metadata

File hashes

Hashes for slim_bindings-1.3.0rc1-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 bac79d6b7f97fb20545922a5c4960b9fe4e2711c5bc482e1c593d169889deccc
MD5 a4b5759b0c64b540d5b4e372b48563a8
BLAKE2b-256 63e5ebfa66c721c34090da5f5220dbf8dbc6777cf5fadd68e357b1daf64adc12

See more details on using hashes here.

File details

Details for the file slim_bindings-1.3.0rc1-py3-none-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for slim_bindings-1.3.0rc1-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 4c1185b9baa5b03a4a01ff6848710188a9330603b141d6b73bb6dfb269117a7a
MD5 9913a393373f8d67ec6fab9c113330f4
BLAKE2b-256 7c89b44c26706d252aeafeceafb5b4e74de70963a68e0e07b66734e388b2da49

See more details on using hashes here.

File details

Details for the file slim_bindings-1.3.0rc1-py3-none-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for slim_bindings-1.3.0rc1-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 2080df9d50f0b1879fe43f8e701b2fbac6f4ab92dab051681e3a8d9e127ef5a3
MD5 e3e64b8de11ceaf9f6a0dbea16281fa6
BLAKE2b-256 c96fc4c5d3603040f180767e3f1f008aaced752e7d768ffa3d02654e52649680

See more details on using hashes here.

File details

Details for the file slim_bindings-1.3.0rc1-py3-none-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for slim_bindings-1.3.0rc1-py3-none-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 2d9f45836409af0cc55c513f0925b615ca91cb977390632fd86e1d97a3e26bec
MD5 7ca029cc05e2463f81b537bcdb27421c
BLAKE2b-256 b1a4f17bc44229190e1b00a329ec68d10b7fa3836d0df9e1c82d297bb7cea53c

See more details on using hashes here.

File details

Details for the file slim_bindings-1.3.0rc1-py3-none-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for slim_bindings-1.3.0rc1-py3-none-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 6afc9f108cfa7cc5c83c81b2323c6cfedcf56ed460bc641ccad3a51bc39a2a25
MD5 c3820987a52fa5b5c603bfe5857133e2
BLAKE2b-256 9176ce81f7d5e40d2a9481509d95160aa44de9f349a6c1d18e9bcb629768f88e

See more details on using hashes here.

File details

Details for the file slim_bindings-1.3.0rc1-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for slim_bindings-1.3.0rc1-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 8503b338c13c56d2ebe62e2645dc96c06d2d033bce87f84a7522353ce6641e37
MD5 9f325b79f7054bb0bc493b1257bf6a13
BLAKE2b-256 3ab2c7a693efb1865ee3613bcff01b05cb8d4a66963c6f0b15da92aff598987d

See more details on using hashes here.

File details

Details for the file slim_bindings-1.3.0rc1-py3-none-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for slim_bindings-1.3.0rc1-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 f258f7a7f095ec58e7bd5229e9a212d5ca1aad1c1068f38060587cc3e064a7c1
MD5 7d4def46a7483fbb5a7df8b5930620d5
BLAKE2b-256 875f058df6eff95f05cbf8b0d2ad018e2f09cd0e5e3dc37bea310744bc8a3d4c

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