Skip to main content

slim_bindings/
lib.rs

1// Copyright AGNTCY Contributors (https://github.com/agntcy)
2// SPDX-License-Identifier: Apache-2.0
3
4//! # SLIM Bindings - UniFFI Language Bindings
5//!
6//! This crate provides language-agnostic FFI bindings for SLIM using UniFFI.
7//! It enables integration with Go, Python, Kotlin, Swift, and other languages.
8//!
9//! ## Architecture
10//!
11//! The module is organized into distinct components:
12//!
13//! - **`App`**: App-level operations (creation, configuration, session management)
14//! - **`Session`**: Session-specific operations (publish, invite, remove, message reception)
15//! - **`MessageContext`**: Message metadata and routing information
16//! - **`ServiceRef`**: Service reference management (global vs local)
17//!
18//! ## Usage
19//!
20//! ### From Rust
21//!
22//! ```rust,ignore
23//! use slim_bindings::{App, Name, SessionConfig, SessionType, IdentityProviderConfig, IdentityVerifierConfig};
24//!
25//! // Create an app
26//! let app_name = Arc::new(Name { components: vec!["org".into(), "app".into(), "v1".into()], id: None });
27//! let provider_config = IdentityProviderConfig::SharedSecret { data: "my-secret".to_string() };
28//! let verifier_config = IdentityVerifierConfig::SharedSecret { data: "my-secret".to_string() };
29//! let app = App::new(app_name, provider_config, verifier_config, false)?;
30//!
31//! // Create a session
32//! let config = SessionConfig { session_type: SessionType::PointToPoint, ... };
33//! let session = app.create_session(config, destination)?;
34//! ```
35//!
36//! ### From Go (via generated bindings)
37//!
38//! ```go
39//! providerConfig := slim.IdentityProviderConfigSharedSecret{Data: sharedSecret}
40//! verifierConfig := slim.IdentityVerifierConfigSharedSecret{Data: sharedSecret}
41//! app, err := slim.NewApp(appName, providerConfig, verifierConfig, false)
42//! session, err := app.CreateSession(config, destination)
43//! session.Publish(data, payloadType, metadata)
44//! ```
45
46// Module declarations
47mod app;
48mod build_info;
49mod client_config;
50mod common_config;
51mod completion_handle;
52mod config;
53mod errors;
54mod identity_config;
55mod init_config;
56mod message_context;
57mod name;
58mod server_config;
59mod service;
60mod session;
61mod transport_protocol;
62
63// SlimRPC module (unified core + UniFFI bindings)
64pub mod slimrpc;
65
66// Public re-exports
67pub use app::{App, Direction, SessionWithCompletion};
68pub use build_info::{BuildInfo, get_build_info, get_version};
69pub use client_config::{
70    BackoffConfig, ClientConfig, ExponentialBackoff, KeepaliveConfig, ProxyConfig,
71    new_config_from_json, new_insecure_client_config,
72};
73pub use common_config::{
74    BasicAuth, CaSource, ClientAuthenticationConfig, ServerAuthenticationConfig, SpireConfig,
75    TlsClientConfig, TlsServerConfig, TlsSource,
76};
77pub use completion_handle::CompletionHandle;
78pub use config::get_runtime;
79pub use config::{
80    get_global_service, get_runtime_config, get_service_config, get_tracing_config,
81    initialize_from_config, initialize_with_configs, initialize_with_defaults, is_initialized,
82    shutdown, shutdown_blocking,
83};
84pub use errors::SlimError;
85pub use identity_config::{
86    ClientJwtAuth, IdentityProviderConfig, IdentityVerifierConfig, JwtAlgorithm, JwtAuth,
87    JwtKeyConfig, JwtKeyData, JwtKeyFormat, JwtKeyType, StaticJwtAuth,
88};
89pub use init_config::{
90    RuntimeConfig, TracingConfig, new_runtime_config, new_runtime_config_with, new_service_config,
91    new_service_config_with, new_tracing_config, new_tracing_config_with,
92};
93pub use message_context::{MessageContext, ReceivedMessage};
94pub use name::Name;
95pub use server_config::{
96    KeepaliveServerParameters, ServerConfig, new_insecure_server_config, new_server_config,
97};
98pub use service::{
99    DataplaneConfig, Service, ServiceConfig, create_service, create_service_with_config,
100    new_dataplane_config, new_service_configuration,
101};
102pub use session::{Session, SessionConfig, SessionType};
103pub use transport_protocol::TransportProtocol;
104pub use transport_protocol::TransportProtocol as ClientTransportProtocol;
105pub use transport_protocol::TransportProtocol as ServerTransportProtocol;
106
107// SLIMRpc re-exports
108pub use slimrpc::{
109    BidiStreamHandler, Channel, Codec, Context, DEADLINE_KEY, DecodedStream, Decoder, Encoder,
110    HandlerType, InvalidRpcCode, MAX_TIMEOUT, MulticastBidiStreamHandler, MulticastResponseReader,
111    MulticastStreamMessage, RawStream, RequestStreamWriter, ResponseSink, ResponseStreamReader,
112    RpcCode, RpcError, RpcMessageContext, RpcMulticastItem, STATUS_CODE_KEY, Server,
113    SessionContext as RpcSessionContext, StreamMessage, StreamStreamHandler, StreamUnaryHandler,
114    UnaryStreamHandler, UnaryUnaryHandler, UniffiRequestStream as RequestStream,
115    build_method_subscription_name,
116};
117
118// UniFFI scaffolding setup (must be at crate root)
119uniffi::setup_scaffolding!();