Skip to content
Merged

Dev #952

Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
74 commits
Select commit Hold shift + click to select a range
49f10aa
Remove old docs metadata resulting in broken docs builds for some crates
TapGhoul Aug 10, 2026
4456187
build(deps): bump postcss from 8.5.15 to 8.5.25 in /wasm
dependabot[bot] Aug 1, 2026
9e0fe7b
feat: Adding new Galaku devices
blackspherefollower Aug 12, 2026
7dc4882
feat: Adding support for JoyHub Passfree
blackspherefollower Aug 17, 2026
d85b624
feat: Adding support for iToys Lach
blackspherefollower Aug 18, 2026
023516a
feat: Adding support for Adorime Panty Vibrator
blackspherefollower Aug 18, 2026
e4a3d97
feat: Adding/fixing a few JoyHubs
blackspherefollower Aug 25, 2026
2f4e29e
feat: Adding JoyHub Daquan
blackspherefollower Aug 31, 2026
5af8063
feat: expose available serial port enumeration through intiface-engine
qdot Aug 8, 2026
4752e9f
fix: prevent WebBluetooth characteristic read panic
qdot Sep 1, 2026
d9b710f
fix: reject short MonsterPub auth packets
qdot Sep 1, 2026
6533a14
fix: reject disabled ScalarCmdV3 outputs
qdot Sep 1, 2026
77a7d85
fix: skip disabled outputs when stopping devices
qdot Sep 1, 2026
27f1ff0
fix: keep websocket listener alive after bad handshakes
qdot Sep 1, 2026
5a60f54
fix: avoid Handy stop-on-target motion asymmetry
qdot Sep 1, 2026
35aed7c
test: cover Svakom Fatima temperature commands
qdot Sep 1, 2026
202202b
Added Kiiroo v21 keepalive strategy
lampanlampe Sep 5, 2026
cafe76b
config: move Lelo F1S V3 from lelo-f1sv2 to lelo-harmony protocol
qdot Sep 5, 2026
c99b8ab
build(deps): bump nanoid from 3.3.12 to 3.3.18 in /wasm
dependabot[bot] Sep 1, 2026
6a8fee3
fix(device-config): add missing Anello motor
wwwfeng Aug 14, 2026
e1b0518
feat:kaipro support
wwwfeng Aug 17, 2026
f1ab622
fix
wwwfeng Aug 20, 2026
5d692ad
fix(webbluetooth): read characteristic values via the DataView's buffer
Aug 22, 2026
afd6427
Pass around listening addresses
nwf Sep 5, 2026
3712611
test(transport): adapt websocket server tests to SocketAddr listen ad…
qdot Sep 12, 2026
8df8bf0
fix(webbluetooth): only build webbluetooth modules for wasm32
qdot Sep 12, 2026
75dd09b
fix: Swapping features on the JoyHub Mighty
blackspherefollower Sep 10, 2026
500e74a
feat: Adding 2 new Sexverse devices
blackspherefollower Sep 10, 2026
cd5c6de
feat: Adding Luvmazer Passion Tether Ring
blackspherefollower Sep 10, 2026
359eb7b
feat(device-config): add sdl-gamepad protocol and communication speci…
qdot Sep 6, 2026
861ff76
feat(server): add SDL gamepad protocol implementation
qdot Sep 6, 2026
70ebbd3
feat(hwmgr): add buttplug_server_hwmgr_sdl_gamepad crate
qdot Sep 6, 2026
62faba9
test: add SDL gamepad device protocol test case
qdot Sep 6, 2026
baa2b57
feat(engine): add --use-sdl-gamepad flag (default off)
qdot Sep 6, 2026
6ad37d3
feat(client): opt-in sdl-gamepad-manager feature for in-process client
qdot Sep 6, 2026
66be45d
build(ci): exercise SDL gamepad feature, dependency isolation, and spike
qdot Sep 6, 2026
00c2cd3
fix(hwmgr): disable MFI gamepad routing on macOS so hidapi discovers …
qdot Sep 6, 2026
220bae4
feat(hwmgr): skip wired gamepads on macOS (Bluetooth-only v1 scope)
qdot Sep 6, 2026
a3ee42f
fix(hwmgr): re-arm active rumble every second (keepalive)
qdot Sep 6, 2026
8769d9d
fix(sdl): preserve host Ctrl-C handling
qdot Sep 7, 2026
d684159
feat(device-config): add SDL gamepad layout selection seam
qdot Sep 13, 2026
cd207d1
feat(sdl): support independent SDL main and trigger rumble channels e…
qdot Sep 13, 2026
af3b31a
test(sdl): add SDL layout integration coverage, diagnostics, and docs
qdot Sep 13, 2026
186132a
test(hwmgr): bound the shutdown test join without an uncancellable bl…
qdot Sep 13, 2026
856629e
chore(device-config): regenerate device config after rebase onto orig…
qdot Sep 13, 2026
3161f31
test(sdl): prune redundant and overengineered SDL test coverage
qdot Sep 17, 2026
51eb364
fix(ci): install SDL3 build dependencies on ubuntu runners
qdot Sep 18, 2026
1fd9b10
feat(sdl): build the gamepad manager against a gamepad-only SDL
qdot Sep 18, 2026
ca49004
chore(sdl): remove the sdl3_thread_spike example
qdot Sep 18, 2026
d1f2bf3
test(sdl): use barrier probes where assertions need the loop-top pass
qdot Sep 18, 2026
a2d7ce5
build: Update dependencies
qdot Sep 18, 2026
d9a02a8
build: Remove unused dependency
qdot Sep 18, 2026
c8cdeeb
feat(sdl): stop re-reporting already connected gamepads on scans
qdot Sep 18, 2026
aec2105
feat(engine): remove XInput manager, options, and dual-manager warning
qdot Sep 18, 2026
02bc81d
feat(client): remove xinput-manager feature from in-process client
qdot Sep 18, 2026
99603a8
feat(server): remove XInput protocol handler
qdot Sep 18, 2026
6ce5af5
feat(device-config): remove XInput specifier, protocol config, and hw…
qdot Sep 18, 2026
6139170
docs: remove remaining XInput references
qdot Sep 18, 2026
93c4689
style: apply nightly rustfmt across workspace
qdot Sep 18, 2026
b548dc1
docs(engine): document the use-sdl-gamepad option
qdot Sep 18, 2026
84fb1a0
feat(client): add sdl-gamepad-manager to default features
qdot Sep 18, 2026
306959a
fix(sdl): announce gamepads once per appearance while scanning
qdot Sep 18, 2026
7260917
fix(sdl): tighten rumble keepalive to 100ms
qdot Sep 18, 2026
e74a5a7
fix(sdl): dither keepalive rumble so SDL actually transmits it
qdot Sep 18, 2026
5883504
docs(sdl): note keepalive and scanning fixes in changelog
qdot Sep 18, 2026
205b9d2
docs(sdl): document the sdl3 0.18.x version pin
qdot Sep 18, 2026
3969794
chore(sdl-gamepad): upgrade sdl3 0.18.4 -> 0.20.0 (SDL 3.4.14 -> 3.4.16)
qdot Sep 18, 2026
449e1c3
feat(sdl-gamepad): SDL-thread battery read path
qdot Sep 18, 2026
b0554e7
feat(sdl-gamepad): readable rx endpoint + protocol battery override
qdot Sep 18, 2026
3d214fb
feat(sdl-gamepad): battery input feature in device config + integrati…
qdot Sep 18, 2026
eba6a65
refactor: remove legacy HID and Joy-Con support
qdot Sep 18, 2026
ae1bafe
doc: Update version/CHANGELOGs for... a whole bunch of versions
qdot Sep 19, 2026
a714378
ci: remove obsolete SDL feature check
qdot Sep 19, 2026
911c627
docs: Add more CHANGELOG info on device additions
qdot Sep 19, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ Buttplug is a framework for interfacing with intimate hardware devices. It uses
- `btleplug` - Bluetooth LE (primary, cross-platform)
- `serial`, `hid` - USB serial and HID devices
- `lovense_dongle`, `lovense_connect` - Lovense-specific (deprecated)
- `xinput` - Windows gamepad vibration
- `sdl_gamepad` - Cross-platform gamepad rumble via SDL3 (opt-in)
- `websocket` - WebSocket device forwarders
- `simulated` - In-process simulated devices (no real hardware; lives in `buttplug_server`)

Expand Down
2 changes: 1 addition & 1 deletion CONTEXT.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ The link between a **Client** and a **Server**. Encapsulates two concerns: the c
_Avoid_: "Transport" (not a domain term in buttplug).

**Hardware Manager**:
A component that discovers and communicates with devices over a specific communication bus — Bluetooth LE, HID, Serial, USB, etc. Each bus has its own manager implementation (`HardwareCommunicationManager` trait). Named by bus: `btleplug` (BLE), `serial`, `hid`, `xinput`, etc.
A component that discovers and communicates with devices over a specific communication bus — Bluetooth LE, HID, Serial, USB, etc. Each bus has its own manager implementation (`HardwareCommunicationManager` trait). Named by bus: `btleplug` (BLE), `serial`, `hid`, etc.
_Avoid_: "Transport" when referring to hardware communication.

**Client**:
Expand Down
6 changes: 2 additions & 4 deletions Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -8,13 +8,12 @@ members = [
"crates/buttplug_server",
"crates/buttplug_server_device_config",
"crates/buttplug_server_hwmgr_btleplug",
"crates/buttplug_server_hwmgr_hid",
"crates/buttplug_server_hwmgr_lovense_connect",
"crates/buttplug_server_hwmgr_lovense_dongle",
"crates/buttplug_server_hwmgr_serial",
"crates/buttplug_server_hwmgr_websocket",
"crates/buttplug_server_hwmgr_webbluetooth",
"crates/buttplug_server_hwmgr_xinput",
"crates/buttplug_server_hwmgr_sdl_gamepad",
"crates/buttplug_tests",
"crates/buttplug_transport_websocket_tungstenite",
"crates/buttplug_wasm",
Expand All @@ -31,12 +30,11 @@ default-members = [
"crates/buttplug_server",
"crates/buttplug_server_device_config",
"crates/buttplug_server_hwmgr_btleplug",
"crates/buttplug_server_hwmgr_hid",
"crates/buttplug_server_hwmgr_lovense_connect",
"crates/buttplug_server_hwmgr_lovense_dongle",
"crates/buttplug_server_hwmgr_serial",
"crates/buttplug_server_hwmgr_websocket",
"crates/buttplug_server_hwmgr_xinput",
"crates/buttplug_server_hwmgr_sdl_gamepad",
"crates/buttplug_tests",
"crates/buttplug_transport_websocket_tungstenite",
"crates/intiface_engine",
Expand Down
4 changes: 1 addition & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,6 @@ Buttplug is currently capable of controlling toys via:
- Lovense Devices via the Lovense Dongle (HID and Serial dongles, Desktop)
- Lovense Connect App (Desktop and Android/iOS)
- Websockets (for simulated and DIY devices, Desktop and Android/iOS)
- XInput gamepads (Windows only)

See [IOSTIndex](https://iostindex.com) for a full list of supported hardware (Filter on "Buttplug Rust").

Expand All @@ -100,12 +99,11 @@ This project consists of the following crates:
| [buttplug_server](crates/buttplug_server/) | The core server implementation, including server and device structures, all protocol implementations, etc... |
| [buttplug_server_device_config](crates/buttplug_server_device_config/) | Device configuration file loading and database implementation. |
| [buttplug_server_hwmgr_btleplug](crates/buttplug_server_hwmgr_btleplug/) | Bluetooth LE device communication support |
| [buttplug_server_hwmgr_hid](crates/buttplug_server_hwmgr_hid/) | HID device communication support |
| [buttplug_server_hwmgr_lovense_connect](crates/buttplug_server_hwmgr_lovense_connect/) | Lovense Connect device communication support (soon to be deprecated) |
| [buttplug_server_hwmgr_lovense_dongle](crates/buttplug_server_hwmgr_lovense_dongle/) | Lovense Dongle device communication support (soon to be deprecated) |
| [buttplug_server_hwmgr_serial](crates/buttplug_server_hwmgr_serial/) | Serial device communication support |
| [buttplug_server_hwmgr_websocket](crates/buttplug_server_hwmgr_websocket/) | Websocket device communication suppor, used for devices that may connect in ways not directly supported by other formats |
| [buttplug_server_hwmgr_xinput](crates/buttplug_server_hwmgr_xinput/) | XInput gamepad support (windows only) |
| [buttplug_server_hwmgr_sdl_gamepad](crates/buttplug_server_hwmgr_sdl_gamepad/) | Cross-platform gamepad rumble via SDL3 |
| [buttplug_tests](crates/buttplug_tests/) | For tests that need the whole framework |
| [buttplug_transport_websocket_tungstenite](crates/buttplug_transport_websocket_tungstenite/) | Communications transport for clients/servers using tokio-tungstenite |
| [intiface_engine](crates/intiface_engine/) | Command line interface for running a Buttplug server |
Expand Down
10 changes: 10 additions & 0 deletions crates/buttplug/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,13 @@
# 12.0.0 (2026-09-18)

## Breaking Changes

- The facade now re-exports the 12.x websocket transport API. Update websocket builders to use listen addresses and rebuild integrations against the coordinated 12.x manager/config contracts.

## Other

- Update internal dependencies to the coordinated release lines.

# 11.0.0 (2026-07-28)

## Other
Expand Down
6 changes: 3 additions & 3 deletions crates/buttplug/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "buttplug"
version = "11.0.0"
version = "12.0.0"

authors = ["Nonpolynomial Labs, LLC <kyle@nonpolynomial.com>"]
description = "Buttplug Intimate Hardware Control Library - Client Library"
Expand All @@ -20,5 +20,5 @@ doctest = true
doc = true

[dependencies]
buttplug_client = { version = "11.0.0", path = "../buttplug_client" }
buttplug_transport_websocket_tungstenite = { version = "11.0.0", path = "../buttplug_transport_websocket_tungstenite"}
buttplug_client = { version = "11.0.1", path = "../buttplug_client" }
buttplug_transport_websocket_tungstenite = { version = "12.0.0", path = "../buttplug_transport_websocket_tungstenite"}
6 changes: 6 additions & 0 deletions crates/buttplug_client/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
# 11.0.1 (2026-09-18)

## Other

- Patch release for the coordinated workspace dependency update; the client public contract remains compatible.

# 11.0.0 (2026-07-28)

## Other
Expand Down
12 changes: 6 additions & 6 deletions crates/buttplug_client/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "buttplug_client"
version = "11.0.0"
version = "11.0.1"
authors = ["Nonpolynomial Labs, LLC <kyle@nonpolynomial.com>"]
description = "Buttplug Intimate Hardware Control Library - Core Library"
license = "BSD-3-Clause"
Expand All @@ -24,16 +24,16 @@ tokio-runtime = ["buttplug_core/tokio-runtime"]
wasm = ["buttplug_core/wasm"]

[dependencies]
buttplug_core = { version = "11.0.0", path = "../buttplug_core", default-features = false }
futures = "0.3.33"
thiserror = "2.0.19"
log = "0.4.33"
buttplug_core = { version = "11.0.1", path = "../buttplug_core", default-features = false }
futures = "0.3.34"
thiserror = "2.0.20"
log = "0.4.34"
getset = "0.1.7"
tokio = { version = "1.53.1", features = ["macros"] }
dashmap = { version = "6.2.1" }
tracing = "0.1.44"
serde = { version = "1.0.229", features = ["derive"] }
serde_json = "1.0.151"
jsonschema = { version = "0.49.1", default-features = false }
jsonschema = { version = "0.56.0", default-features = false }
strum = "0.28.0"
strum_macros = "0.28.0"
9 changes: 9 additions & 0 deletions crates/buttplug_client_in_process/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,12 @@
# 12.0.0 (2026-09-18)

## Breaking Changes

- Remove the public `xinput-manager` feature and standalone XInput manager dependency; migrate consumers to `sdl-gamepad-manager`.
- Add SDL gamepad to the default feature set, so default builds register SDL3 gamepads instead of XInput hardware.
- The in-process client now uses the coordinated 12.x server, device-config, and manager contracts.


# 11.0.0 (2026-07-28)

## Other
Expand Down
36 changes: 17 additions & 19 deletions crates/buttplug_client_in_process/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "buttplug_client_in_process"
version = "11.0.0"
version = "12.0.0"
authors = ["Nonpolynomial Labs, LLC <kyle@nonpolynomial.com>"]
description = "Buttplug Intimate Hardware Control Library - Core Library"
license = "BSD-3-Clause"
Expand All @@ -20,33 +20,31 @@ doc = true


[features]
default = ["tokio-runtime", "btleplug-manager", "hid-manager", "lovense-dongle-manager", "lovense-connect-service-manager", "serial-manager", "websocket-manager", "xinput-manager"]
default = ["tokio-runtime", "btleplug-manager", "lovense-dongle-manager", "lovense-connect-service-manager", "serial-manager", "websocket-manager", "sdl-gamepad-manager"]
btleplug-manager=["buttplug_server_hwmgr_btleplug"]
hid-manager=["buttplug_server_hwmgr_hid"]
lovense-dongle-manager=["buttplug_server_hwmgr_lovense_dongle"]
lovense-connect-service-manager=["buttplug_server_hwmgr_lovense_connect"]
serial-manager=["buttplug_server_hwmgr_serial"]
websocket-manager=["buttplug_server_hwmgr_websocket"]
xinput-manager=["buttplug_server_hwmgr_xinput"]
sdl-gamepad-manager=["buttplug_server_hwmgr_sdl_gamepad"]
tokio-runtime = ["buttplug_core/tokio-runtime", "buttplug_client/tokio-runtime", "buttplug_server/tokio-runtime"]
wasm = ["buttplug_core/wasm", "buttplug_client/wasm", "buttplug_server/wasm"]

[dependencies]
buttplug_core = { version = "11.0.0", path = "../buttplug_core", default-features = false }
buttplug_client = { version = "11.0.0", path = "../buttplug_client", default-features = false }
buttplug_server = { version = "11.0.0", path = "../buttplug_server", default-features = false }
buttplug_server_device_config = { version = "11.0.0", path = "../buttplug_server_device_config" }
buttplug_server_hwmgr_btleplug = { version = "11.0.0", path = "../buttplug_server_hwmgr_btleplug", optional = true}
buttplug_server_hwmgr_hid = { version = "11.0.0", path = "../buttplug_server_hwmgr_hid", optional = true}
buttplug_server_hwmgr_lovense_connect = { version = "11.0.0", path = "../buttplug_server_hwmgr_lovense_connect", optional = true}
buttplug_server_hwmgr_lovense_dongle = { version = "11.0.0", path = "../buttplug_server_hwmgr_lovense_dongle", optional = true}
buttplug_server_hwmgr_serial = { version = "11.0.0", path = "../buttplug_server_hwmgr_serial", optional = true}
buttplug_server_hwmgr_websocket = { version = "11.0.0", path = "../buttplug_server_hwmgr_websocket", optional = true}
buttplug_server_hwmgr_xinput = { version = "11.0.0", path = "../buttplug_server_hwmgr_xinput", optional = true}
futures = "0.3.33"
futures-util = "0.3.33"
thiserror = "2.0.19"
log = "0.4.33"
buttplug_core = { version = "11.0.1", path = "../buttplug_core", default-features = false }
buttplug_client = { version = "11.0.1", path = "../buttplug_client", default-features = false }
buttplug_server = { version = "12.0.0", path = "../buttplug_server", default-features = false }
buttplug_server_device_config = { version = "12.0.0", path = "../buttplug_server_device_config" }
buttplug_server_hwmgr_btleplug = { version = "12.0.0", path = "../buttplug_server_hwmgr_btleplug", optional = true}
buttplug_server_hwmgr_lovense_connect = { version = "12.0.0", path = "../buttplug_server_hwmgr_lovense_connect", optional = true}
buttplug_server_hwmgr_lovense_dongle = { version = "12.0.0", path = "../buttplug_server_hwmgr_lovense_dongle", optional = true}
buttplug_server_hwmgr_serial = { version = "12.0.0", path = "../buttplug_server_hwmgr_serial", optional = true}
buttplug_server_hwmgr_websocket = { version = "12.0.0", path = "../buttplug_server_hwmgr_websocket", optional = true}
buttplug_server_hwmgr_sdl_gamepad = { version = "12.0.0", path = "../buttplug_server_hwmgr_sdl_gamepad", optional = true}
futures = "0.3.34"
futures-util = "0.3.34"
thiserror = "2.0.20"
log = "0.4.34"
getset = "0.1.7"
tokio = { version = "1.53.1", features = ["macros"] }
dashmap = { version = "6.2.1" }
Expand Down
64 changes: 52 additions & 12 deletions crates/buttplug_client_in_process/src/in_process_client.rs
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,6 @@ use buttplug_server_device_config::DeviceConfigurationManagerBuilder;
/// the devices you want, there are a couple of things to check:
///
/// - Are you on a platform that the device communication manager supports?
/// For instance, we only support XInput on windows.
/// - Did the developers add a new Device CommunicationManager type and forget
/// to add it to this method? _It's more likely than you think!_ [File a
/// bug](https://github.com/buttplugio/buttplug/issues).
Expand All @@ -50,17 +49,41 @@ pub async fn in_process_client(client_name: &str) -> ButtplugClient {
.unwrap();

let mut device_manager_builder = ServerDeviceManagerBuilder::new(dcm);
register_comm_managers(&mut device_manager_builder);
let server_builder = ButtplugServerBuilder::new(device_manager_builder.finish().unwrap());
let server = server_builder.finish().unwrap();
let connector = ButtplugInProcessClientConnectorBuilder::default()
.server(server)
.finish();
let client = ButtplugClient::new(client_name);
client.connect(connector).await.unwrap();
client
}

/// Registers every comm manager selected by this crate's cargo features, and
/// returns the names of the managers that were registered so tests can assert
/// feature wiring (single source of truth: `in_process_client` uses this and
/// ignores the result).
// With no manager features enabled (how e.g. buttplug_tests consumes this
// crate), nothing is registered and the builder parameter goes unused.
#[allow(unused_mut, unused_variables)]
fn register_comm_managers(
device_manager_builder: &mut ServerDeviceManagerBuilder,
) -> Vec<&'static str> {
let mut registered = vec![];
#[cfg(feature = "btleplug-manager")]
{
use buttplug_server_hwmgr_btleplug::BtlePlugCommunicationManagerBuilder;
device_manager_builder.comm_manager(BtlePlugCommunicationManagerBuilder::default());
registered.push("btleplug");
}
#[cfg(feature = "websocket-manager")]
{
use buttplug_server_hwmgr_websocket::WebsocketServerDeviceCommunicationManagerBuilder;
device_manager_builder.comm_manager(
WebsocketServerDeviceCommunicationManagerBuilder::default().listen_on_all_interfaces(true),
);
registered.push("websocket-server");
}
#[cfg(all(
feature = "serial-manager",
Expand All @@ -69,12 +92,14 @@ pub async fn in_process_client(client_name: &str) -> ButtplugClient {
{
use buttplug_server_hwmgr_serial::SerialPortCommunicationManagerBuilder;
device_manager_builder.comm_manager(SerialPortCommunicationManagerBuilder::default());
registered.push("serial");
}
#[cfg(feature = "lovense-connect-service-manager")]
{
use buttplug_server_hwmgr_lovense_connect::LovenseConnectServiceCommunicationManagerBuilder;
device_manager_builder
.comm_manager(LovenseConnectServiceCommunicationManagerBuilder::default());
registered.push("lovense-connect-service");
}
#[cfg(all(
feature = "lovense-dongle-manager",
Expand All @@ -83,18 +108,33 @@ pub async fn in_process_client(client_name: &str) -> ButtplugClient {
{
use buttplug_server_hwmgr_lovense_dongle::LovenseHIDDongleCommunicationManagerBuilder;
device_manager_builder.comm_manager(LovenseHIDDongleCommunicationManagerBuilder::default());
registered.push("lovense-dongle");
}
#[cfg(all(feature = "xinput-manager", target_os = "windows"))]
// SDL gamepad manager is in the default feature set and is
// cross-platform: no OS gate.
#[cfg(feature = "sdl-gamepad-manager")]
{
use buttplug_server_hwmgr_xinput::XInputDeviceCommunicationManagerBuilder;
device_manager_builder.comm_manager(XInputDeviceCommunicationManagerBuilder::default());
use buttplug_server_hwmgr_sdl_gamepad::SdlGamepadCommunicationManagerBuilder;
device_manager_builder.comm_manager(SdlGamepadCommunicationManagerBuilder::default());
registered.push("sdl-gamepad");
}
registered
}

#[cfg(all(test, feature = "sdl-gamepad-manager"))]
mod tests {
use super::*;

#[test]
fn feature_registers_sdl_manager() {
let dcm = DeviceConfigurationManagerBuilder::default()
.finish()
.unwrap();
let mut builder = ServerDeviceManagerBuilder::new(dcm);
let registered = register_comm_managers(&mut builder);
assert!(
registered.contains(&"sdl-gamepad"),
"SDL gamepad manager must be registered when the feature is enabled, got {registered:?}"
);
}
let server_builder = ButtplugServerBuilder::new(device_manager_builder.finish().unwrap());
let server = server_builder.finish().unwrap();
let connector = ButtplugInProcessClientConnectorBuilder::default()
.server(server)
.finish();
let client = ButtplugClient::new(client_name);
client.connect(connector).await.unwrap();
client
}
6 changes: 6 additions & 0 deletions crates/buttplug_core/CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,9 @@
# 11.0.1 (2026-09-18)

## Other

- Patch release for the coordinated workspace dependency update; the core public contract remains compatible.

# 11.0.0 (2026-07-28)

## Breaking Changes
Expand Down
28 changes: 11 additions & 17 deletions crates/buttplug_core/Cargo.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[package]
name = "buttplug_core"
version = "11.0.0"
version = "11.0.1"
authors = ["Nonpolynomial Labs, LLC <kyle@nonpolynomial.com>"]
description = "Buttplug Intimate Hardware Control Library - Core Library"
license = "BSD-3-Clause"
Expand All @@ -23,42 +23,36 @@ default=["tokio-runtime"]
tokio-runtime=["tokio/rt", "tokio/time"]
wasm=["wasm-bindgen-futures", "wasmtimer"]

# Only build docs on one platform (linux)
[package.metadata.docs.rs]
targets = []
# Features to pass to Cargo (default: [])
features = ["default", "unstable"]

[dev-dependencies]
tracing-subscriber = "0.3.23"

[build-dependencies]
serde = "1.0.229"
serde_json = "1.0.151"
jsonschema = { version = "0.49.1", default-features = false }
jsonschema = { version = "0.56.0", default-features = false }

[dependencies]
futures = "0.3.33"
futures-util = "0.3.33"
futures = "0.3.34"
futures-util = "0.3.34"
serde = { version = "1.0.229", features = ["derive"] }
serde_json = "1.0.151"
serde_repr = "0.1.21"
thiserror = "2.0.19"
displaydoc = "0.2.6"
log = "0.4.33"
thiserror = "2.0.20"
displaydoc = "0.2.7"
log = "0.4.34"
getset = "0.1.7"
jsonschema = { version = "0.49.1", default-features = false }
cfg-if = "1.0.4"
jsonschema = { version = "0.56.0", default-features = false }
cfg-if = "1.0.5"
tokio = { version = "1.53.1", features = ["sync", "macros"] }
async-stream = "0.3.6"
strum_macros = "0.28.0"
strum = "0.28.0"
derive_builder = "0.20.2"
enum_dispatch = "0.3"
tracing = "0.1.44"
wasm-bindgen-futures = { version = "0.4.76", optional = true }
wasm-bindgen-futures = { version = "0.4.78", optional = true }
wasmtimer = { version = "0.4.3", optional = true }
smallvec = { version = "1.15.2", features = ["serde", "const_generics"] }
smallvec = { version = "1.16.1", features = ["serde", "const_generics"] }
enumflags2 = "0.7.12"
tokio-util = "0.7.19"
dashmap = "6.2.1"
Loading
Loading