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:

slim-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 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 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-2.0.0a1-py3-none-win_arm64.whl (12.7 MB view details)

Uploaded Python 3Windows ARM64

slim_bindings-2.0.0a1-py3-none-win_amd64.whl (13.4 MB view details)

Uploaded Python 3Windows x86-64

slim_bindings-2.0.0a1-py3-none-musllinux_1_2_x86_64.whl (15.6 MB view details)

Uploaded Python 3musllinux: musl 1.2+ x86-64

slim_bindings-2.0.0a1-py3-none-musllinux_1_2_aarch64.whl (15.3 MB view details)

Uploaded Python 3musllinux: musl 1.2+ ARM64

slim_bindings-2.0.0a1-py3-none-manylinux_2_28_x86_64.whl (15.6 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ x86-64

slim_bindings-2.0.0a1-py3-none-manylinux_2_28_aarch64.whl (15.1 MB view details)

Uploaded Python 3manylinux: glibc 2.28+ ARM64

slim_bindings-2.0.0a1-py3-none-macosx_11_0_arm64.whl (14.6 MB view details)

Uploaded Python 3macOS 11.0+ ARM64

slim_bindings-2.0.0a1-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-2.0.0a1-py3-none-win_arm64.whl.

File metadata

File hashes

Hashes for slim_bindings-2.0.0a1-py3-none-win_arm64.whl
Algorithm Hash digest
SHA256 f275e039de6204e94d0fa2bb527a2756cb64b3ae6eb1e22ec3dbb8cfb1580f5a
MD5 51874ce2203d3a86ea9e45a7cf8bc72f
BLAKE2b-256 e28aee606b5a333fb03af3aca118116652731c3912201c4b13174011ccce9bfd

See more details on using hashes here.

Provenance

The following attestation bundles were made for slim_bindings-2.0.0a1-py3-none-win_arm64.whl:

Publisher: release-bindings.yaml on agntcy/slim-bindings

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file slim_bindings-2.0.0a1-py3-none-win_amd64.whl.

File metadata

File hashes

Hashes for slim_bindings-2.0.0a1-py3-none-win_amd64.whl
Algorithm Hash digest
SHA256 33548c1cf7889cad135a3c09157b77669c57a18c56bb0dd7c9507593d42a0975
MD5 2285d9293c8e30aec8119978895c3e8c
BLAKE2b-256 2039ee11c1ec289787bca3fc2b2bc6ca835982e06f23f874f554fe01a05982c3

See more details on using hashes here.

Provenance

The following attestation bundles were made for slim_bindings-2.0.0a1-py3-none-win_amd64.whl:

Publisher: release-bindings.yaml on agntcy/slim-bindings

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file slim_bindings-2.0.0a1-py3-none-musllinux_1_2_x86_64.whl.

File metadata

File hashes

Hashes for slim_bindings-2.0.0a1-py3-none-musllinux_1_2_x86_64.whl
Algorithm Hash digest
SHA256 27b802e6cb29289bb4e3c20a7d127c90cd4912a502c8cf9082f3eb76fa17abae
MD5 43d80aba2382d7bf3ae9effaefa30a8f
BLAKE2b-256 fe854000a85b5211e8c4a30a08056d2d7efdd25398938705152d58d5417c7ec5

See more details on using hashes here.

Provenance

The following attestation bundles were made for slim_bindings-2.0.0a1-py3-none-musllinux_1_2_x86_64.whl:

Publisher: release-bindings.yaml on agntcy/slim-bindings

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file slim_bindings-2.0.0a1-py3-none-musllinux_1_2_aarch64.whl.

File metadata

File hashes

Hashes for slim_bindings-2.0.0a1-py3-none-musllinux_1_2_aarch64.whl
Algorithm Hash digest
SHA256 9c6b8ac36c8ef80ec3ff5c51351aae795417cbbd9a47892866494a46e818cc08
MD5 32a4d913fe6c15c0b731a2506fce78ab
BLAKE2b-256 dd2b8af6129f98ca2e0458a11415a4b603a550a658834f6d7b028611bedb7c6a

See more details on using hashes here.

Provenance

The following attestation bundles were made for slim_bindings-2.0.0a1-py3-none-musllinux_1_2_aarch64.whl:

Publisher: release-bindings.yaml on agntcy/slim-bindings

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file slim_bindings-2.0.0a1-py3-none-manylinux_2_28_x86_64.whl.

File metadata

File hashes

Hashes for slim_bindings-2.0.0a1-py3-none-manylinux_2_28_x86_64.whl
Algorithm Hash digest
SHA256 825102d348a4f7ddbc5f3863d453b4554b41d956a88d00b8646ed3da17c8bf4f
MD5 3547db8f8888bf17a433169087764e9a
BLAKE2b-256 cf2151d8f39b6a19ac2a9fae9d9aff595682bcb2c5a99725cdd1fff1ae8bc06e

See more details on using hashes here.

Provenance

The following attestation bundles were made for slim_bindings-2.0.0a1-py3-none-manylinux_2_28_x86_64.whl:

Publisher: release-bindings.yaml on agntcy/slim-bindings

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file slim_bindings-2.0.0a1-py3-none-manylinux_2_28_aarch64.whl.

File metadata

File hashes

Hashes for slim_bindings-2.0.0a1-py3-none-manylinux_2_28_aarch64.whl
Algorithm Hash digest
SHA256 20f0b1636ad02230d1ab404938736ee843a7d576e5b58c26ef38512584e7bd6e
MD5 150acf6c174fb5850f62977e1d7e5978
BLAKE2b-256 e8267a29e92ba30be883e48caee95d46d18484fbc6d88f28bb089b6e7fb15d3a

See more details on using hashes here.

Provenance

The following attestation bundles were made for slim_bindings-2.0.0a1-py3-none-manylinux_2_28_aarch64.whl:

Publisher: release-bindings.yaml on agntcy/slim-bindings

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file slim_bindings-2.0.0a1-py3-none-macosx_11_0_arm64.whl.

File metadata

File hashes

Hashes for slim_bindings-2.0.0a1-py3-none-macosx_11_0_arm64.whl
Algorithm Hash digest
SHA256 e525e91dd5ea5616601ba7ce9098b0af9581e68101fe563a53e796f502a812f6
MD5 774f655b166ff255cb681da70a6d35b7
BLAKE2b-256 92f6b59ab7440f0560d8dc8b76a7aa75d006a34a020a84876493d328637a67d5

See more details on using hashes here.

Provenance

The following attestation bundles were made for slim_bindings-2.0.0a1-py3-none-macosx_11_0_arm64.whl:

Publisher: release-bindings.yaml on agntcy/slim-bindings

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file slim_bindings-2.0.0a1-py3-none-macosx_10_12_x86_64.whl.

File metadata

File hashes

Hashes for slim_bindings-2.0.0a1-py3-none-macosx_10_12_x86_64.whl
Algorithm Hash digest
SHA256 827129f26c02d4be9089c7fb31656ce0addfbcdd24a9d8d42c5259c214ba7d53
MD5 3f6c444e99de2ae062232ff6cf330eca
BLAKE2b-256 1519aa3669dc8853cf6e2adb2cb7ddd58c3e9bff9bd451d9dd3e5205135dbe62

See more details on using hashes here.

Provenance

The following attestation bundles were made for slim_bindings-2.0.0a1-py3-none-macosx_10_12_x86_64.whl:

Publisher: release-bindings.yaml on agntcy/slim-bindings

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

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