bevy_stdb
A Bevy integration for SpacetimeDB.
Please enjoy this useless AI generated image based on the README contents of this repo.
Overview
bevy_stdb adapts SpacetimeDB's connection and callback model into Bevy-style resources, systems, plugins, and messages. Its built around a few core ideas:
- Configure everything through
StdbPlugin - Expose the active live connection as a Bevy resource via
StdbConnection - Forward table callbacks into Bevy messages with
TableRegistrar - Store subscription intent independently from the live connection with
StdbSubscriptions - Optionally retry failed connections with
StdbReconnectOptions
The library is organized around connection-scoped lifecycle concerns:
- connection lifecycle: establish the initial connection, expose the active connection resource, and track connection state
- table lifecycle: initialize table message channels once and re-bind table callbacks whenever a connection becomes active
- subscription lifecycle: store desired subscription intent and re-apply queued subscriptions when connected
- reconnect lifecycle: optionally retry connection attempts after disconnects using configurable backoff
Features
- Builder-style setup via
StdbPlugin - Connection resource access through
StdbConnection - Table event bridging into normal Bevy
Messages - Managed subscription intent through
StdbSubscriptions - Optional reconnect support through
StdbReconnectOptions
Example
use *;
use *;
use crate;
pub type StdbConn = ;
pub type StdbSubs = ;
Table registration
Use StdbPlugin::with_table to register one table per call.
The closure receives a TableRegistrar that already carries the current database view. Use reg.db() to access that view and then register exactly one table.
Typical forms are:
.with_table
.with_table
.with_table
.with_table
These registrations are replayed during initialization to install the required Bevy message channels and again whenever the connection enters the connected state to bind callbacks for the current live database view.
Messages
Depending on the table shape, bevy_stdb forwards updates into Bevy messages such as:
InsertMessage<T>DeleteMessage<T>UpdateMessage<T>InsertUpdateMessage<T>
This lets normal Bevy systems react to database changes using message readers.
Subscriptions
StdbSubscriptions stores desired subscription intent separately from the live connection.
That means you can:
- declare global (or any other) subscriptions during plugin setup with
with_subscriptions - queue additional subscriptions later from normal Bevy systems
- automatically re-apply queued subscription intent after reconnect
Subscriptions are keyed, so the application can refer to them using its own domain-specific identifiers, allowing you to also unsubscribe as needed later.
Reconnects
Reconnect behavior is opt-in.
Use StdbPlugin::with_reconnect with StdbReconnectOptions to enable retry behavior after disconnects. When reconnect succeeds:
- the live
StdbConnectionresource is replaced - table callbacks are re-bound
- queued subscriptions are re-applied
Compatibility
| bevy_stdb | bevy | spacetimedb_sdk |
|---|---|---|
| 0.1 - 0.2 | 0.18 | 2.0 |
Notes
This crate focuses on table-driven client workflows. Reducer and procedure access still exist through the active StdbConnection, but the primary Bevy-facing event flow is table/message based.
The project was heavily inspired by bevy_spacetimedb, but takes a different approach to plugin structure, connection lifecycle handling, reconnect behavior, and subscription restoration.