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.0rc0-py3-none-win_arm64.whl (11.6 MB view details)

Uploaded Python 3Windows ARM64

slim_bindings-1.4.0rc0-py3-none-win_amd64.whl (12.1 MB view details)

Uploaded Python 3Windows x86-64

slim_bindings-1.4.0rc0-py3-none-musllinux_1_2_x86_64.whl (13.6 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

slim_bindings-1.4.0rc0-py3-none-musllinux_1_2_aarch64.whl (13.3 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

slim_bindings-1.4.0rc0-py3-none-manylinux_2_28_x86_64.whl (13.6 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ x86-64

slim_bindings-1.4.0rc0-py3-none-manylinux_2_28_aarch64.whl (13.2 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ ARM64

slim_bindings-1.4.0rc0-py3-none-macosx_11_0_arm64.whl (14.7 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

slim_bindings-1.4.0rc0-py3-none-macosx_10_12_x86_64.whl (14.9 MB view details)

Uploaded Python 3macOS 10.12+ x86-64

File details

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

File metadata

File hashes

Hashes for slim_bindings-1.4.0rc0-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 f72ac58c68b750c8aaf233faf206d994782425926710fcf33586f4855283b66f
MD5 dcef097b967c3c62ddb76ccc69633295
BLAKE2b-256 69e3f75bb7fc45969aee2fd9192352ba105c2438e7c14008629a1d11b04f662e

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for slim_bindings-1.4.0rc0-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 2b977bd79a530751f3026618f7477998d01d09130d7dd11e5e20378ebe46054d
MD5 cd82182f07acf1c34082d741ff173796
BLAKE2b-256 ade67f4635884e083652a2864b5699d93686c16f415d6d50fcf395e62f93ddc5

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for slim_bindings-1.4.0rc0-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 b7f68f8ed6f6ea0d1d8d352a0d8aaa507bf4851dae48175704ab973f82d545c6
MD5 2c91a78f76590a1634e96d660c195f1e
BLAKE2b-256 53819dad79ae6244eddd1860e627aece3c5bd4f090664215445bb890ae875a27

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for slim_bindings-1.4.0rc0-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 03b598e9d58ea29b563a27d7d498a3051819f42636a5f97581153588b846a411
MD5 1af5f4a48624b9c55ea28c263539b92d
BLAKE2b-256 b375c6d0caea0ab1c6ed277273dc89bdfdcea1667387abb719fa3b834ebf9f84

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for slim_bindings-1.4.0rc0-py3-none-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 f3480618e71ccd0c7261d95e33f5bd5127fcf6f025986f41c772b1d37b411fe5
MD5 716fe012595f9eedd610e7d6675e2801
BLAKE2b-256 8eb0fef81125b9202cfbd06b55be754aab1489eb94248560847a18de6e61dd4d

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for slim_bindings-1.4.0rc0-py3-none-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 7c6149a7a8e858435eeceb0cb0a8c05202cda28327befc84453eba990a3d0959
MD5 f6764842651aab3b00993cfa23ceae94
BLAKE2b-256 ccbc33778a990fa8de003b297ef42df8bff85662eea20c513c8aa62553dd1f04

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for slim_bindings-1.4.0rc0-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 40c6979298ba172351dc83528cb2e7866b140508d57ab1488a4286f999a5b9e4
MD5 e576ab8e7a0513fcb8c61ca65d22a7b9
BLAKE2b-256 a1d559f17d17c4f8c2a7c3132978b4b85216f2fb608450a462e2b0dfc821ede4

See more details on using hashes here.

File details

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

File metadata

File hashes

Hashes for slim_bindings-1.4.0rc0-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 14d0f4e850473b83889b9c3492e3901d43da1a262b231a6ecc622f32ca5f9c5a
MD5 63aa0ac7b3464db438c57ac1d569122d
BLAKE2b-256 6e7c375d328da12c84c5eb53fdce64361e37d90f83765c5e2446c8e876a65ac8

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