From a610978c95362945af62965a6ed20a104bd79fd9 Mon Sep 17 00:00:00 2001 From: James Hugman Date: Thu, 30 Jul 2026 19:58:30 +0100 Subject: [PATCH 1/2] Add tools/bindgens crate --- Cargo.lock | 8 ++++++++ Cargo.toml | 1 + tools/bindgens/Cargo.toml | 15 +++++++++++++++ tools/bindgens/src/bin/uniffi-bindgen.rs | 22 ++++++++++++++++++++++ 4 files changed, 46 insertions(+) create mode 100644 tools/bindgens/Cargo.toml create mode 100644 tools/bindgens/src/bin/uniffi-bindgen.rs diff --git a/Cargo.lock b/Cargo.lock index 6801c9546..335e68f00 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -762,6 +762,13 @@ dependencies = [ "syn 2.0.119", ] +[[package]] +name = "bindgens" +version = "0.1.0" +dependencies = [ + "uniffi", +] + [[package]] name = "bit-set" version = "0.5.3" @@ -4056,6 +4063,7 @@ dependencies = [ "soxr-sys", "thiserror 2.0.19", "tokio", + "uniffi", "webrtc-sys", "webrtc-sys-build", ] diff --git a/Cargo.toml b/Cargo.toml index f7943db61..179c4a2fa 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -13,6 +13,7 @@ members = [ "livekit-net", "livekit-runtime", "livekit-wakeword", + "tools/bindgens", "libwebrtc", "soxr-sys", "yuv-sys", diff --git a/tools/bindgens/Cargo.toml b/tools/bindgens/Cargo.toml new file mode 100644 index 000000000..592a91066 --- /dev/null +++ b/tools/bindgens/Cargo.toml @@ -0,0 +1,15 @@ +[package] +name = "bindgens" +version = "0.1.0" +edition.workspace = true +license.workspace = true +repository.workspace = true +description = "Foreign-binding generator CLIs for the LiveKit Rust crates" +publish = false + +# Tooling crate: each bin is a code-generation CLI shared across the workspace's +# uniffi-exposing crates (livekit-ffi, livekit-uniffi, ...). It has no library +# target — the bindgens read metadata from an already-compiled cdylib via +# `--library`, so they never depend on the crates they generate for. +[dependencies] +uniffi = { workspace = true, features = ["cli"] } diff --git a/tools/bindgens/src/bin/uniffi-bindgen.rs b/tools/bindgens/src/bin/uniffi-bindgen.rs new file mode 100644 index 000000000..0f5418441 --- /dev/null +++ b/tools/bindgens/src/bin/uniffi-bindgen.rs @@ -0,0 +1,22 @@ +// Copyright 2025 LiveKit, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +//! The UniFFI bindgen CLI, shared across the workspace. +//! +//! Generate bindings from any compiled uniffi cdylib, e.g.: +//! `cargo run -p bindgens --bin uniffi-bindgen -- generate \ +//! --library target/debug/liblivekit_ffi.dylib --language python --out-dir ` +fn main() { + uniffi::uniffi_bindgen_main() +} From 9cadbaf470dc8db31993efbc64f3a63fd71a6354 Mon Sep 17 00:00:00 2001 From: James Hugman Date: Thu, 30 Jul 2026 19:59:37 +0100 Subject: [PATCH 2/2] Add uniffi and version string function --- livekit-ffi/Cargo.toml | 1 + livekit-ffi/src/build_info.rs | 34 ++++++++++++++++++++++++++++++++++ livekit-ffi/src/lib.rs | 3 +++ 3 files changed, 38 insertions(+) create mode 100644 livekit-ffi/src/build_info.rs diff --git a/livekit-ffi/Cargo.toml b/livekit-ffi/Cargo.toml index 393833629..7f89a5e71 100644 --- a/livekit-ffi/Cargo.toml +++ b/livekit-ffi/Cargo.toml @@ -38,6 +38,7 @@ downcast-rs = "1.2" console-subscriber = { workspace = true, features = ["parking_lot"], optional = true } bytes = { workspace = true } from_variants = "1.0.2" +uniffi = { workspace = true, features = ["scaffolding-ffi-buffer-fns"] } [target.'cfg(target_os = "android")'.dependencies] jni = "0.21.1" diff --git a/livekit-ffi/src/build_info.rs b/livekit-ffi/src/build_info.rs new file mode 100644 index 000000000..65d60db41 --- /dev/null +++ b/livekit-ffi/src/build_info.rs @@ -0,0 +1,34 @@ +// Copyright 2025 LiveKit, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +/// Returns the version specified in the crate's Cargo.toml. +/// +/// This is the first function exposed over UniFFI from `livekit-ffi`. It carries +/// no server state and touches no handle store, so downstream SDKs can call it to +/// prove the UniFFI bindgen toolchain is wired up end-to-end. +#[uniffi::export] +pub fn build_version() -> String { + env!("CARGO_PKG_VERSION").to_string() +} + +#[cfg(test)] +mod tests { + use super::build_version; + + #[test] + fn build_version_matches_cargo_pkg_version() { + assert_eq!(build_version(), env!("CARGO_PKG_VERSION")); + assert!(!build_version().is_empty()); + } +} diff --git a/livekit-ffi/src/lib.rs b/livekit-ffi/src/lib.rs index 066956606..1514b3612 100644 --- a/livekit-ffi/src/lib.rs +++ b/livekit-ffi/src/lib.rs @@ -20,10 +20,13 @@ use thiserror::Error; mod conversion; +pub mod build_info; pub mod cabi; pub mod proto; pub mod server; +uniffi::setup_scaffolding!(); + #[derive(Error, Debug)] pub enum FfiError { #[error("the server is not configured")]