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.4.0rc3-py3-none-win_arm64.whl (11.3 MB view details)

Uploaded Python 3Windows ARM64

slim_bindings-1.4.0rc3-py3-none-win_amd64.whl (12.0 MB view details)

Uploaded Python 3Windows x86-64

slim_bindings-1.4.0rc3-py3-none-musllinux_1_2_x86_64.whl (13.3 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

slim_bindings-1.4.0rc3-py3-none-musllinux_1_2_aarch64.whl (12.9 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

slim_bindings-1.4.0rc3-py3-none-manylinux_2_28_x86_64.whl (13.4 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ x86-64

slim_bindings-1.4.0rc3-py3-none-manylinux_2_28_aarch64.whl (12.9 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ ARM64

slim_bindings-1.4.0rc3-py3-none-macosx_11_0_arm64.whl (12.4 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

slim_bindings-1.4.0rc3-py3-none-macosx_10_12_x86_64.whl (12.7 MB view details)

Uploaded Python 3macOS 10.12+ x86-64

File details

Details for the file slim_bindings-1.4.0rc3-py3-none-win_arm64.whl.

File metadata

File hashes

Hashes for slim_bindings-1.4.0rc3-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 557e2f2d04c617c0a2ffef31e0e8aac7e3ac5c338d1ddaa4cd09c673b3227338
MD5 d70ec5806f518b2a0cb378e8063b9f5f
BLAKE2b-256 8b4a5b835327bbf4e38dd5a4fa53290648919aa292db3ce01245ac3c9af0e56e

See more details on using hashes here.

File details

Details for the file slim_bindings-1.4.0rc3-py3-none-win_amd64.whl.

File metadata

File hashes

Hashes for slim_bindings-1.4.0rc3-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 00cf61aa1b1369f42c10b220f2778dfcb292df3c8b322c012b823a826195bd5f
MD5 d9c099dcac7964eba333e45b73fb932b
BLAKE2b-256 e9c914e94d009dfa2a1e13b37ff6d40085b559c7b9bd00257147383351085da0

See more details on using hashes here.

File details

Details for the file slim_bindings-1.4.0rc3-py3-none-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for slim_bindings-1.4.0rc3-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 135962794f36359b04d0c4fdeb8830d7b66a8888c5b60b1a2f8341c249d8c5b7
MD5 48ea52db13e51cac29d3cc06e6806057
BLAKE2b-256 d79194a992a5ffc8c1701a260c2c9bf677803e059cf20d691ddf3f70a2d97a01

See more details on using hashes here.

File details

Details for the file slim_bindings-1.4.0rc3-py3-none-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for slim_bindings-1.4.0rc3-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 73768bd1a23e8d51a5c058a5125e54a287644e57a1b0813b2b77dc5dce200e56
MD5 f0848e8603b06bf99fb75a07750d7200
BLAKE2b-256 e81acebbc7e1a27b9bbf61a3c5d92856e6dd1b10aabc0518d76413eac7034275

See more details on using hashes here.

File details

Details for the file slim_bindings-1.4.0rc3-py3-none-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for slim_bindings-1.4.0rc3-py3-none-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 26833a7959723eda9647b9ae115030955308190512dd13d36b9cfd5daa4ce9c5
MD5 d7615404046d51a14cb7a2562b80d1e5
BLAKE2b-256 9e2be9863bfdd1a1b64e1c0b2243af780219f10923064cf7b4cb7297b23140e0

See more details on using hashes here.

File details

Details for the file slim_bindings-1.4.0rc3-py3-none-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for slim_bindings-1.4.0rc3-py3-none-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 a7f466802b27628b226bbf2e11f01aea12374dfd11742a4cafd3934303bfac95
MD5 589e2783a6d34f8cfb444d34973a3dac
BLAKE2b-256 2096946abaae1b1a934c1ed10249ff4731fa955e3458ebe51e890f78b92d35de

See more details on using hashes here.

File details

Details for the file slim_bindings-1.4.0rc3-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for slim_bindings-1.4.0rc3-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 7f9af70829424f62623c15cf3e761b2aaa7657c4f5ce83fc9fc07929b3389067
MD5 504967155db2405271ab333a89957cd3
BLAKE2b-256 d9fa5268e5e9d118580b242346bc4fd07da71d6bcbb46ceddd7eb855a495a23e

See more details on using hashes here.

File details

Details for the file slim_bindings-1.4.0rc3-py3-none-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for slim_bindings-1.4.0rc3-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 616f40cc2f3cf5a24f4634b495e5b60b741425d149b533f599b57c73fb99b92c
MD5 6baf39571dab6b0b249ad140f0ef5d56
BLAKE2b-256 0e9bfe394af7db9167a2cd48ca832646685d7bfcbf92737aa914c9c6a8e52260

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