Releases: clockworklabs/SpacetimeDB
Release v1.11.1 - Bug Fixes + Performance Improvements
Hello again everyone! This is likely going to be our last release before the holidays. We will potentially have one more release before the end of the year but for now we hope you are all happy with these improvements 🙂
Typescript
This release includes several bug fixes and performance improvements related to Typescript:
- SpacetimeDB now processes sourcemaps included in Typescript modules, so stacktraces in both new and existing modules now show the filenames and line numbers from your source code, not from the bundled JS file.
- The UTF-8 processing of the
TextEncoderandTextDecoderclasses is now implemented in native code, meaning string de/serialization will now have less overhead. useTablein a React client now works when specifying columns with camelcase names.- Generated client code is now compatible with the
noImplicitOverrideTypescript configuration option.
What's Changed
- Some more UI tests for Views by @Shubham8287 in #3829
- Implement sourcemap handling by @coolreader18 in #3828
- client-api: Send WebSocket messages fragmented by @kim in #2931
- Update typescript package size limits by @jdetter in #3854
- client-api: Deny changing the parent of an existing database by @kim in #3837
- Rename docs dirs and files to have more digits by @gefjon in #3851
- [TS] Use 'override' when overriding class items by @coolreader18 in #3852
- Handle unknown transactions without erroring. by @jsdt in #3858
lteandgteoperators to rust query builder by @Shubham8287 in #3855- fix automigration bug with
auto_incby @Shubham8287 in #3862 filteralias for rust query builder's where method by @Shubham8287 in #3856- Don't panic in
datastore_index_scan_range_bsatnon invalid ranges by @Centril in #3746 - Add rng support to ProcedureContext on Rust by @mamcx in #3865
- add initial cargo ci by @Kasama in #3409
- wasmtime: pool async stack allocations on unix by @Centril in #3830
- CI - Use rust-toolchain-file everywhere by @bfops in #3872
- Add WASM point scan ABIs & use them in Rust bindings by @Centril in #3863
- Tighten query types by @jsdt in #3866
- Fix useReducer params by @jsdt in #3873
- Fix broken SpacetimeDB logo in docs by @JulienLavocat in #3886
- Fix CLI reference generation by @bfops in #3403
- [TS] Fix useTable casing issues by @coolreader18 in #3853
- Strip sensitive info from HTTP errors by @gefjon in #3878
- cli: Flush stdout after printing the database tree by @kim in #3888
- Ensure all-ephemeral transactions don't consume a tx offset by @kim in #3884
- Add Reducer to the end of reducer arg types to avoid collisions by @jsdt in #3889
- Add a fault-tolerant commitlog replay mode for use in debugging by @gefjon in #3887
cargo cion windows by @bfops in #3859- Async shutdown for database / durability by @kim in #3880
- Ignore system meta-descriptor rows during replay by @gefjon in #3891
- Refactor /docs into Concepts by @JasonAtClockwork in #3877
- Resolve algebraic type refs recursively for view type check by @joshua-spacetime in #3876
- Make subscribe durable by @joshua-spacetime in #3894
- client-api: Pause time in websocket timeout tests by @kim in #3896
- Bump versions to 1.11.1 by @jdetter in #3901
Full Changelog: v1.11.0...v1.11.1
⛄ 🎄 🎁 Happy Holidays everyone! 🎁 🎄 ⛄
Release v1.11.0 - Typed Query Builder
Today we've released query builders for Rust and TypeScript modules. The purpose of the query builder API is so that you can write views that will take advantage of the unique performance guarantees of SpacetimeDB's query engine, particularly for realtime subscription updates.
The query builder also now allows you to iterate or scan a table in a view, something that previously wasn't possible using only the index accessors exposed by ViewContext and AnonymousViewContext.
The query builder exposes the following query operators:
.where()
Used for filtering. Equivalent to aWHEREcondition in SQL..leftSemijoin()
Equivalent to an inner join in sql where a row is return from thelhsonly if it matches with a row on therhs..rightSemijoin()
Equivalent to an inner join in sql where a row is return from therhsonly if it matches with a row on thelhs.
Examples (Rust)
use spacetimedb::{Identity, Query, Table, ViewContext, AnonymousViewContext};
#[spacetimedb::table(name = player_state)]
pub struct PlayerState {
#[unique]
player_id: u64,
online: bool,
}
#[spacetimedb::table(name = player_internal)]
pub struct Player {
#[auto_inc]
#[primary_key]
id: u64,
#[unique]
identity: Identity,
name: String,
#[index(btree)]
age: u8,
}
#[spacetimedb::table(name = moderator_internal)]
pub struct Moderator {
#[unique]
player_id: u64,
}
/// Returns all players.
/// Equivalent to `SELECT * FROM player_internal`.
#[spacetimedb::view(name = player, public)]
fn player(ctx: &AnonymousViewContext) -> Query<Player> {
ctx.from.player_internal().build()
}
/// Returns the caller's player.
/// Equivalent to `SELECT * FROM player_internal WHERE "identity" = :sender`.
#[spacetimedb::view(name = my_player, public)]
fn my_player(ctx: &ViewContext) -> Query<Player> {
ctx.from.player_internal().r#where(|p| p.identity.eq(ctx.sender)).build()
}
/// Returns only online players.
/// Equivalent to:
/// ```sql
/// SELECT q.*
/// FROM player_state p JOIN player_internal q ON p.player_id = q.id
/// WHERE p.online
/// ```
#[spacetimedb::view(name = online_player, public)]
fn online_player(ctx: &AnonymousViewContext) -> Query<Player> {
ctx.from
.player_state()
.r#where(|p| p.online.eq(true))
.right_semijoin(ctx.from.player_internal(), |(p, q)| p.player_id.eq(q.id))
.build()
}
/// Returns only the caller's player if online.
/// Equivalent to:
/// ```sql
/// SELECT q.*
/// FROM player_state p JOIN player_internal q ON p.player_id = q.id
/// WHERE p.online AND q.identity = :sender
/// ```
#[spacetimedb::view(name = my_online_player, public)]
fn my_online_player(ctx: &ViewContext) -> Query<Player> {
ctx.from
.player_state()
.r#where(|p| p.online.eq(true))
.right_semijoin(ctx.from.player_internal(), |(p, q)| p.player_id.eq(q.id))
.r#where(|p| p.identity.eq(ctx.sender))
.build()
}
/// Returns the moderators.
/// Equivalent to:
/// ```sql
/// SELECT p.* FROM player_internal p JOIN moderator_internal m ON p.id = m.player_id
/// ```
#[spacetimedb::view(name = moderator, public)]
fn moderator(ctx: &AnonymousViewContext) -> Query<Player> {
ctx.from
.player_internal()
.left_semijoin(ctx.from.moderator_internal(), |(p, m)| p.id.eq(m.player_id))
.build()
}Examples (TypeScript)
import { schema, table, t, type RowObj } from 'spacetimedb/server';
const playerState = table('playerState', {
playerId: t.u64().unique(),
online: t.bool(),
});
const playerInternal = table('playerInternal', {
id: t.u64().primaryKey().autoInc(),
identity: t.identity().unique(),
name: t.string(),
age: t.u8().index('btree'),
});
const spacetimedb = schema(playerState, playerInternal);
spacetimedb.view(
{ name: 'my_online_player', public: true },
t.array(playerInternal.row()),
ctx => {
return ctx.from.playerState
.where(p => p.online.eq(true))
.rightSemijoin(ctx.from.playerInternal, (p, q) => p.playerId.eq(q.id))
.where(p => p.identity.eq(ctx.sender))
.build();
}
);Bug Fixes
- Fixes an issue with the
--delete-data=on-conflictflag ofspacetimedb publish - Fixes an issue where databases were returning 400/500 errors after publishing with
-c - Fixes an issue where
on_insertandon_deletewere not firing correctly for per-client (ViewContext) views
What's Changed
- Delete duplicated docs folders by @gefjon in #3780
- Fixes reported issues with the TypeScript SDK by @cloutiertyler in #3737
- Fix some typescript issues by @coolreader18 in #3775
- Split Unity and C# tests into separate jobs by @jdetter in #3779
- Update typescript package size limits by @jdetter in #3786
- Add docs for procedures by @gefjon in #3766
- Actually report reducer fuel used by @drogus in #3799
- Fix view rewrite for delta tables by @joshua-spacetime in #3801
- Remove race condition from sdk test by @joshua-spacetime in #3804
- Implement DbContext for AnonymousViewContext and ViewContext by @tamaro-skaljic in #3787
- Fixes docs links by @cloutiertyler in #3803
- C# Views - Use Name from ViewAttribute instead of Method Name by @chutch1122 in #3792
- Remove duplicate assertSql in smoke test by @mamcx in #3588
- Docs: Update docs nav height to 56px by @clockwork-tien in #3788
- [TS] Fix
developmentexports breaking NextJS by @kistz in #3796 - [TS] Call registerType for procedure params by @coolreader18 in #3806
- CI - Skip the Unity testsuite on external PRs by @bfops in #3805
- Bump versions to 1.11.0 by @bfops in #3808
- Added and tested procedure docs for Unreal C++ & Unreal Blueprint by @JasonAtClockwork in #3810
- Update view ABI to support returning queries by @jsdt in #3685
- [Rust] Module-side query builder types by @Shubham8287 in #3797
- [Rust] update module bindings to use new view abi by @joshua-spacetime in #3819
- Update wasmtime to v39 by @coolreader18 in #3818
- [Rust] Query builder Integration. by @Shubham8287 in #3823
- Store
SubscriptionMetricsforUpdate,Subscribe,UnsubscribeinModuleSubscriptionsby @Centril in #3821 - smoketests: Adjust test_enable_disable_replication test by @kim in #3822
- [TS] Implement TextEncoder/TextDecoder with native code by @coolreader18 in #3800
- Debug "stuck module" issue by @kim in #3813
- Fixes issues with
--delete-data=on-conflictby @cloutiertyler in #3730 - Add a typescript query builder for views by @jsdt in #3812
New Contributors
- @tamaro-skaljic made their first contribution in #3787
- @chutch1122 made their first contribution in #3792
- @kistz made their first contribution in #3796
Full Changelog: v1.10.0...v1.11.0
Release v1.10.0 - Procedures and HTTP Requests
Today we have an absolute game changer for SpacetimeDB. SpacetimeDB 1.10 introduces the ability for databases to perform HTTP requests to external services right from within your module! This is one of our most-requested features, and we're very excited to share it with you all.
SpacetimeDB Reducers are extremely powerful. They are atomic, transactional, pure, retryable, and replayable. The challenge was: in order to maintain these properties and guarantees, they need to be isolated from the outside world and can't be allowed to cause any observable side effects.
However, HTTP requests are inherently side-effecting, and are too useful not to have. It turns out the solution is pretty simple: keep reducers side effect free, and introduce a new kind of database function with weaker guarantees and more powers. Enter a new type of SpacetimeDB function: Procedures.
Examples
Just like a reducer, a procedure is a function defined in your module which runs inside the database. Unlike a reducer, procedures don't correspond 1-to-1 with transactions. Instead, you explicitly manage transactions inside the body of your procedure:
#[spacetimedb::procedure]
fn find_highest_level_player(ctx: &mut ProcedureContext) {
let highest_level_player = ctx.with_tx(|ctx| {
ctx.db.player().iter().max_by_key(|player| player.level)
});
match highest_level_player {
Some(player) => log::info!("Congratulations to {}", player.id),
None => log::warn!("No players..."),
}
}Being able to run code in the database without a transaction opens a lot of possibilities for new APIs we could expose. The first of these, releasing today, is HTTP requests:
#[spacetimedb::procedure]
fn get_request(ctx: &mut ProcedureContext) {
match ctx.http.get("https://example.invalid") {
Ok(response) => {
let (response, body) = response.into_parts();
log::info!(
"Got response with status {} and body {}",
response.status,
body.into_string_lossy(),
)
},
Err(error) => log::error!("Request failed: {error:?}"),
}
}Take a look at the documentation on the new procedure APIs for more details,
and join us on Discord to let us know what other side effects you want APIs for!
As of this release, only Rust and TypeScript modules can define procedures. We're hard at work adding support to C# modules, and will be releasing them soon. We'll also be cleaning up the new APIs in response to your feedback, so for now procedures are unstable and subject to breaking changes.
TypeScript fixes
In this release, we've also fixed quite a few issues which were reported in the new TypeScript SDK.
- This issue by exporting the
SubscriptionHandletype with theREMOTE_MODULEtype applied. - This issue by converting to
camelCasefor column names in code generation. - Fixes an issue where
onMyReducercallbacks were passing arguments as variadic params, while the types indicated they would be passed as an object.onMyReducer((ctx, argA, argB, argC) => {})vs onMyReducer((ctx, { argA, argB, argC}) => {})` - Fixes an issue where the table type name was used instead of the table name in code generation for constructing tables.
- Fixes issue with
ScheduleAtbeing used in non-table types. - Fixes issue where template projects do not use the correct lifecycle reducer setup
- Fixes an issue where
.insert()returns incorrect objects - Fixes an issue where
.update()causes error with.autoInc()field
We intend for TypeScript modules and clients to rapidly approach stability. The most invasive breaking changes have already been made.
What's Changed
- Disable Unreal tests by @bfops in #3711
- Added staging to allowable issuers by @cloutiertyler in #3714
- Add procedure HTTP request API for WASM modules and the Rust module bindings library by @gefjon in #3684
- CI - No discord ping for skipped checks by @bfops in #3718
- Use custom runner for building CLI by @jdetter in #3716
- HTTP followup: remove
httpdep fromspacetimedb_libby @coolreader18 in #3719 - Add C# client SDK procedures by @JasonAtClockwork in #3666
- Upgrade to version 1.9.0 by @jdetter in #3709
- Attach artifacts workflow by @jdetter in #3724
- Add Unreal client SDK procedures by @JasonAtClockwork in #3667
- Views: index readsets by @Shubham8287 in #3706
- Add metrics for subscription queries by @drogus in #3661
- Add
spacetime_worker_reducer_returned_errors_totalmetric by @drogus in #3613 - Remove the dependency on git ls-files from cli/build.rs by @drogus in #3568
- Print internal error when a procedure call fails in sdk test client by @gefjon in #3725
- Revert "Remove the dependency on git ls-files from cli/build.rs (#3568) by @bfops in #3741
- [TS] Implement basic procedure calling by @coolreader18 in #3649
- CI - CLI doc check shouldn't fail on
Cargo.lockdiff by @bfops in #3739 - CI - Clearer CTA in discord post by @bfops in #3738
- Rename the
/database/procedureroute to beunstableby @gefjon in #3723 - [TS] Http procedure API by @coolreader18 in #3731
- [TS] Anonymous transactions by @coolreader18 in #3743
- Fix realtime update for views by @joshua-spacetime in #3747
- Bump hashbrown, foldhash; Fix some compile errors in master by @Centril in #3722
- C# module bindings for Procedures by @rekhoff in #3732
- Add rust sdk tests for views by @joshua-spacetime in #3755
- Add metrics for recording HTTP requests performed by procedures. by @gefjon in #3745
- CI - Migrate off of spacetimedb-runner by @bfops in #3763
- Move docs tests to custom runner by @jdetter in #3699
- Docs: Update docs nav items font weight to 600 by @clockwork-tien in #3721
- [TS] Client-side procedure bindings by @coolreader18 in #3765
- [Typescript] Increased size limits for some deps by @jdetter in #3728
- Procedures: fix scheduling by @Centril in #3704
- First pass at reorganizing the docs and making them nice by @cloutiertyler in #3494
- Revert "Procedures: fix scheduling (#3704)" by @jdetter in #3774
- Upgrade to version 1.10.0 by @jdetter in #3769
- Disable scheduling procedures by @gefjon in #3768
- Set timeout for smoketests by @jdetter in #3772
New Contributors
- @clockwork-tien made their first contribution in #3721
Full Changelog: v1.9.0...v1.10.0
Release v1.9.0 - Project Collaborators
Today we have a long overdue feature we're releasing, project collaborators! 👯
Project Collaborators
Now you can invite other members of your team to join your projects that you deploy to Maincloud.
In order to add collaborators, navigate to your project on the website and go to Settings > Collaborators, and then press Add People to add a new collaborator to your project.
Depending on the role you assign the user, they will be able to perform actions that were previously only possible for the database owner to run, including updating the module, viewing logs, and editing tables.
TypeScript (Beta) - API Update
We also have the first major update to our TypeScript API. This change dramatically improves usability in a few key areas and fixes some critical bugs in the TypeScript and React SDKs.
Important
This update also comes with a few breaking changes to the TypeScript API, which are detailed below. In general, we will try to minimize the number of changes to the existing API, but while TypeScript is in Beta we will be making a few important changes until we stabilize the API completely.
TypeScript Modules
TypeScript modules only get a modest change from the previous API:
- Table accessor names and index accessor names are converted to
camelCaseon thectx, so if your table name isfoo_bar, the accessor changes fromctx.db.foo_bartoctx.db.fooBar. This allows you to use whatever table name you want for your tables without running afoul of TypeScript linters. Infer<>now also doesInferTypeOfRow<>if applicable which means you can forget aboutInferTypeOfRowand just useInferin all cases to get the type of a type builder.
TypeScript SDK
The TypeScript SDK has now been unified with the API of server modules. Code generation now uses the same types and functions that you use on the server. The eventual goals is to allow you to use your actual server types in your TypeScript client without needing to do any code generation. This leads to the following changes:
- All types exported by generated files are now
TypeBuilders, meaning that if you were previously using a type from a generated file, you will now have to doconst x: Infer<typeof MyType>instead ofconst x: MyType. This may seem like an inconvenience, but it vastly improves a lot of the other APIs and is very flexible to extend and is inspired by the very powerful Zod library. - We no longer generate and export
MyTypeVariantsfor sum types (these are now accessed byInfer<typeof MyType.variants.myVariant>) - Your
module_bindingsnow export atablesobject with references to all theTableDefs - Your
module_bindingsnow export areducersobject with references to all theReducerDefs - On the client
my_table.iter()now returnsIterableIteratorinstead of anArray MyType.getTypeScriptAlgebraicType()has been replaced withMyType.algebraicType- Reducers are now called with the same format on the server and clients. e.g.
ctx.reducers.createPlayer(argA, argB)->ctx.reducers.createPlayer({ argA, argB }) - Reducer callbacks now also take arguments the same way:
ctx.reducers.onCreatePlayer(ctx, argA, argB)->ctx.reducers.onCreatePlayer(ctx, { argA, argB })&ctx.reducers.removeOnCreatePlayer(ctx, argA, argB)->ctx.reducers.removeOnCreatePlayer(ctx, { argA, argB }) count()now returns abigintinstead of a number to match the server API e.g.myTable.count(): number->myTable.count(): bigint. This may be changed in the future as it is unlikely that you will have a table with more than 2^53 rows.
Notable things that did not change:
MyType.serialize(writer: BinaryWriter, value: Infer<typeof MyType>)andMyType.deserialize(reader: BinaryReader): Infer<typeof MyType>are still supported exactly as before.- The
MyType.MyVariant(...)constructor function on sum types is still present, but implemented with the privateMyType.create('MyVariant', ...). We could choose to move away from this API later if we didn't like the variants polluting the namespace
Warning
You will need to regenerate your module bindings for your TypeScript clients with the latest version of the spacetime CLI tool.
React SDK
The React SDK gets a major improvement in both usability and correctness.
useSpacetimeDB()no longer takes type parametersuseSpacetimeDB()now returns aConnectionState. All fields on theConnectionStateare not React state and will cause a rerender any time they changeuseTable()now takes aTableDefparameter and type params are inferreduseTable()now just returns a tuple with the first element being anArrayinstead of a object with{ rows }- Added a
useReducer()React hook
So now you can write this in your React client:
import { reducers, tables } from "./module_bindings";
const { identity, isActive: connected } = useSpacetimeDB();
const setName = useReducer(reducers.setName);
const sendMessage = useReducer(reducers.sendMessage);
const [onlineUsers] = useTable(tables.user, where(eq('online', true)));The API for using a view is the same as using a table:
const [myViewRows] = useTable(tables.myView);What's Changed
- [teams 4/5] SQL authorization by @kim in #3525
- CI - TypeScript quickstart works properly in the face of version bumps by @bfops in #3634
- [TS] Specify the name of a view in an options object by @coolreader18 in #3642
- Reference docs for views by @joshua-spacetime in #3641
- Update views on auto-migrate by @Shubham8287 in #3631
- Upgrade to version 1.8.0 by @jdetter in #3633
- [teams 5/5] Identity routes by @kim in #3526
- PR merge discord post includes all non-successful checks by @bfops in #3594
- Switch Internal Tests to reuse CI job by @bfops in #3625
- Tweak DNS resolution error message by @bfops in #3647
- Fix noisy Discord notifications on PR merge by @bfops in #3650
- CI - Fix "Check that packages are publishable" check by @bfops in #3660
- Scheduled reducer: use timestamp from reducer params for next run by @Shubham8287 in #3657
- client-api: Make
ControlStateReadAccessan async trait by @kim in #3357 - Remove the middle man thread the JS worker thread by @Centril in #3577
- Use new runner for testsuite by @jdetter in #3656
- CI - Cancel internal tests if cancelled by @bfops in #3674
- CI - Ping PR author directly if checks fail by @bfops in #3671
- Fix the basic-rust client template for CLI's init command by @drogus in #3646
- C#: Add confirmed reads configuration by @kim in #3282
- Fix test with change on defaults by @mamcx in #3683
- commitlog: Change default max-records-in-commit to 1 by @kim in #3681
- Fix
spacetime generaterunningdotnet formatin the wrong directory by @bfops in #3687 - CI - Fix empty lookup by @bfops in #3693
- fix plan caching for client-specific views by @joshua-spacetime in #3672
- Unifies server module library and client SDK for TypeScript (and fixes several bugs) by @cloutiertyler in #3559
- Fix #3687 by @bfops in #3692
- Adds flag to publish to allow clearing on migration conflict. by @cloutiertyler in #3601
- Client codegen fixes for views by @joshua-spacetime in #3690
- CI - Cache more of our build outputs by @bfops in #3521
- Add
ProcedureContext::with_txby @Centril in #3638 anyonymousView->anonymousViewby @bfops in #3697- Add check for .env.local and module bindings generations to only write on changes by @aceysmith in #3604
- Move typescript tests to new runner by @jdetter in #3696
- Add
smoketests/requirements.txtby @bfops in #3701 - Fix C# module bindings codegen for namespaces with view dispatcher by @JasonAtClockwork in #3668
- Fix running
smoketests --listby @bfops in #3700 - Views: ephemeral tables by @Shubham8287 in #3670
- Change
spacetime_worker_wasm_instance_errors_total...
Release v1.8.0 - Module Defined Views
Module Defined Views
The shipping continues! This time we have Module Defined Views or just "views". Views are a simple, but incredibly expressive way to define custom and intricate read permissioning for your tables.
Views, which are inspired by a similar concept from SQL, are virtual tables that are defined by new "view functions" in your module and derived from other tables or parameters.
Views are defined by read-only procedural, functions in the language of your module. This function returns data derived from your database tables. You can then query and subscribe to this view as you would any normal database table and it will be updated automatically in realtime.
Here's a look at the syntax for defining a view in the various module languages:
Rust
Declare with #[view]. First argument is a view context (&ViewContext or &AnonymousViewContext). Return Option<T> (0–1 row) or Vec<T> (many rows).
#[view(name = my_player, public)]
fn my_player(ctx: &ViewContext) -> Option<Player> {
ctx.db.player().identity().find(ctx.sender)
}
#[view(name = players_for_level, public)]
fn players_for_level(ctx: &AnonymousViewContext) -> Vec<Player> {
ctx.db
.player_level()
.level()
.filter(2u64) // players for level 2
.map(|player| {
ctx.db
.player()
.id()
.find(player.player_id)
})
.collect()
}Notes
- A
nameis required. - Only the context parameter is allowed; no extra args (yet).
- The context provides a read-only view of the database
- Mutations are not allowed
- Full table scans are not allowed
C#
Use [SpacetimeDB.View] with ViewContext or AnonymousViewContext. Return a single row as T? or many rows as List<T> / T[].
[SpacetimeDB.View(Name = "my_player", Public = true)]
public static Player? MyPlayer(ViewContext ctx) =>
ctx.Db.Player.Identity.Find(ctx.Sender) as Player;
[SpacetimeDB.View(Name = "players_for_level", Public = true)]
public static List<Player> PlayerLocations(AnonymousViewContext ctx) {
var rows = new List<Player>();
foreach (var player in ctx.Db.PlayerLevel.Level.Filter(2))
{
if (ctx.Db.Player.Id.Find(player.PlayerId) is Player p)
{
rows.Add(p);
}
}
return rows;
}TypeScript
Register with schema.view(...) or schema.anonymousView(...). Use t.option(row) for 0–1 row or t.array(row) for many rows.
spacetimedb.view(
{ name: 'my_player', public: true },
t.option(players.row()),
(ctx) => {
return ctx.db.players.identity.find(ctx.sender) ?? null;
}
);
spacetimedb.anonymousView(
{ name: 'players_for_level', public: true },
t.option(players.row()),
(ctx) => {
const out = [];
for (const pl of ctx.db.playerLevels.level.find(2)) {
const p = ctx.db.players.id.find(pl.player_id);
if (p) out.push(p);
}
return out;
}
);Row-level security rules
Currently procedurally defined view functions are limited to index probing tables so that we can efficiently compute the real-time delta for procedural functions. However, we also plan to shortly add the ability to return typed queries from view functions which will allow you to define performant, incrementally evaluated queries which execute full tables scans.
This functionality will make views strictly more expressive and powerful than the existing unstable RLS (row-level security) rules API that we introduced earlier this year. As such we will be deprecating the RLS API in favor of the view API. Here is an idea (not final API) of what that might look like in TypeScript
spacetimedb.view(
{ name: 'high_level_players', public: true },
t.query(players.row()),
(ctx) => {
return ctx.from(ctx.db.player).where(player => gt(player.level, 50))
}
);What's Changed
- Add typescript quickstart smoketest by @coolreader18 in #3463
- CI - Move the Package job to ubuntu-latest by @bfops in #3553
- CI - Fix NuGet smoketest dependencies by @bfops in #3557
- Fix Nix build by not using Git in Cargo build scripts by @gefjon in #3551
- Use production API key by @JulienLavocat in #3560
- Bump versions to 1.7.0 by @bfops in #3550
- Generate client bindings for views by @joshua-spacetime in #3564
- Add proper V8 sys module versioning by @coolreader18 in #3527
- Set default server to
localin replication smoketests by @gefjon in #3562 - View resolution in sql by @joshua-spacetime in #3570
- [teams 1/5] Reset database by @kim in #3496
- Fix some annoyances with the smoketests by @coolreader18 in #3556
- Add view handling to query engine and planner by @joshua-spacetime in #3578
- CI - Fix the merge queue by @bfops in #3571
- Revert "[teams 1/5] Reset database (#3496)" by @bfops in #3580
- Decrement view subscriber count on disconnect by @joshua-spacetime in #3547
- Update C# client-api bindings by @gefjon in #3537
- Views: Host interface for WASM modules by @Shubham8287 in #3548
- Fix for multi-column indexes in typescript modules by @jsdt in #3589
- smoketests: Adjust enable replication tests by @kim in #3590
Dockerfilefails more cleanly if.gitis a submodule by @bfops in #3591- fix: view index by @Shubham8287 in #3596
- remove module watcher from subscription by @Shubham8287 in #3602
- Fix issue with row id for non primary key tables by @aasoni in #3603
- Typescript views by @coolreader18 in #3584
- CI - Make Internal Tests less brittle by @bfops in #3536
- Materialize views on subscribe by @joshua-spacetime in #3599
- Refactor module instance code by @coolreader18 in #3605
- commitlog,durability: Support preallocation of disk space by @kim in #3437
- Add Rust client SDK bindings for calling procedures by @gefjon in #3532
- Add comment about public API key use on Docusaurus by @JulienLavocat in #3567
- Views: fix table schema creation from system table. by @Shubham8287 in #3615
- Disable parameterized views in rust by @joshua-spacetime in #3629
- CI - Fix format strings by @bfops in #3627
- Atomic view update by @joshua-spacetime in #3624
- Disconnect clients when updating RLS rules by @mamcx in #3574
- [teams 1/5] Reset database by @kim in #3611
- SQL smoketests for views by @Shubham8287 in #3616
- [teams 2/5] client-api: Add
parentparameter to publish endpoint by @kim in #3519 - [teams 3/5] API authorization, CLI, smoketests by @kim in #3523
- C# bindings for views by @rekhoff in #3585
Full Changelog: v1.7.0...v1.8.0
Release v1.7.0 - `spacetime dev`
New CLI Command - spacetime dev
We are continuing the month of shipping with a new CLI command for you all, spacetime dev.
spacetime dev automates your development loop to make developing with SpacetimeDB much faster and easier. It does the following:
- Generates types for your client (
spacetime generate) - Builds your application (
spacetime build) - Publishes your module (
spacetime publish) - Subscribes to your module logs (
spacetime logs) - Watches your module files for changes and repeats the process
spacetime dev is 5 commands in one and it's a real game changer once you try it!
With the introduction of spacetime dev we're also introducing a canonical default project structure:
my-spacetimedb-project/
├── package.json
├── tsconfig.json
├── src/ # regular client app code
│ ├── main.ts
│ ├── App.tsx
│ └── components/
│
└── spacetimedb/ # SpacetimeDB module lives here
├── package.json # its own TypeScript package
├── tsconfig.json
└── src/
├── index.ts # entrypoint for the module
└── schema.ts # schema / logicWith this structure, you can just include a spacetimedb folder inside your client project and have spacetime dev automatically publish your modules for you while you're developing. This makes it super easy to develop apps with a single server and client.
Although convenient, this default project structure is not mandatory and can be customized and configured for more complex multi-client applications or in situations where you want to separate your client and server into different repositories.
Usage
If you run spacetime dev in a directory without a spacetimedb directory (and do not specify a module-project-path), spacetime dev will take you through the process of setting up a new project.
$ spacetime dev
No SpacetimeDB project found in current directory.
Would you like to initialize a new project? yes
WARNING: This command is UNSTABLE and subject to breaking changes.
✔ Project name · my-spacetime-app
✔ Project path · ./my-spacetime-app
? Select a client type for your project (you can add other clients later) ›
❯ React - React web app with TypeScript server
Use Template - Choose from a list of built-in template projects or clone an existing SpacetimeDB project from GitHub
NoneIf you run spacetime dev in a directory with an existing spacetimedb directory (or specify a module-project-path), spacetime dev will ask you to publish a new module or connect to an existing one.
$ spacetime dev
Found existing SpacetimeDB project.
Now we need to select a database to publish to.
Selected database: grumpy-lunchroom-2109
Tip: Use `--database grumpy-lunchroom-2109` to skip this question next time
Starting development mode...
Database: grumpy-lunchroom-2109
Watching for changes in: /Users/tylercloutier/Developer/SpacetimeDB/my-spacetime-app/spacetimedb
Press Ctrl+C to stop
Updating .env.local with database name grumpy-lunchroom-2109...
Building...
Build complete!
Generating module bindings...
Generate finished successfully.
Publishing...
Build finished successfully.
Uploading to local => http://127.0.0.1:3000
Checking for breaking changes...
Publishing module...
JavaScript / TypeScript support is currently in BETA.
There may be bugs. Please file issues if you encounter any.
<https://github.com/clockworklabs/SpacetimeDB/issues/new>
Created new database with name: grumpy-lunchroom-2109, identity: c20008053ab940eb968e981c506037220be5dba2a948f8f7e7a131ba156bf28f
Published successfully!
---
Watching for file changes...
2025-10-30T23:19:12.862606Z INFO: Creating table `person`
2025-10-30T23:19:12.863539Z INFO: Database initializedIn either case, spacetime dev will watch for changes in your module files, update your client generated code, build your module, and publish it automatically!
Updated spacetime init
The spacetime init subcommand has been completely reworked. There are a few major changes here:
- You now specify a project name when creating a project
- There is a new interactive mode for selecting project templates (see below)
SpacetimeDB Project Templates
A Template is a pre-made project configuration that you can quickly deploy via spacetime init. Now when you run spacetime init you'll see all of the built-in options ready to deploy immediately:
You are logged in to SpacetimeDB.
✔ Project name · my-spacetime-app
✔ Project path · ./my-spacetime-app
✔ Select a client type for your project (you can add other clients later) · Use Template - Choose from a list of built-in template projects or clone an existing SpacetimeDB project from GitHub
Available built-in templates:
basic-typescript - A basic TypeScript client and server template with only stubs for code
basic-c-sharp - A basic C# client and server template with only stubs for code
basic-rust - A basic Rust client and server template with only stubs for code
basic-react - React web app with TypeScript server
quickstart-chat-rust - Rust server/client implementing quickstart chat
quickstart-chat-c-sharp - C# server/client implementing quickstart chat
quickstart-chat-typescript - TypeScript server/client implementing quickstart chat
? Template ID or GitHub repository (owner/repo) or git URL ›As you can see you can also specify a Github URL here to deploy a custom template. This allows the community to build and share their own templates to be used by others.
Auth claims in modules
Client credentials are now exposed to your module code, so you can have more control over your authorization logic. For some examples of how to use it to secure your app, check out the docs.
Other changes
Docusaurus Migration
We recently migrated all of our documentation to docusaurus! You can view the newly updated documentation here: https://spacetimedb.com/docs .
Postgres Wire Protocol on Maincloud
The big update here is that we have re-enabled postgres wire protocol on Maincloud! You can see the full release notes for our Postgres Wire Protocol release here: https://github.com/clockworklabs/SpacetimeDB/releases/tag/v1.5.0 .
Default Server
The default server for newly installed CLI tools has been changed from local to maincloud. This only affects new users as existing users will already have a default server set in their spacetime CLI config.toml.
What's Changed
- Notify user in CLI that js/ts is beta quality by @Centril in #3415
- Fix windows linker errors by @coolreader18 in #3416
- ModuleDef and schema changes to support procedures by @gefjon in #3392
- Fixed a circular import that was not detected in the TypeScript SDK by @cloutiertyler in #3421
- Fix CLI package._json version by @bfops in #3423
- add system tables for views by @joshua-spacetime in #3419
- Add AuthCtx to ReducerContext for rust by @jsdt in #3288
- Initial TypeScript reference docs by @cloutiertyler in #3407
- Weaken minimum dotnet version by @bfops in #3418
- Add a nix flake by @gefjon in #3422
- Fixed the react router issue and added a new test app to test for it by @cloutiertyler in #3428
- Add module def types for views by @joshua-spacetime in #3427
- V8: prepare for JS workers by @Centril in #3395
- add rust-src to the toolchain and update trybuild test output by @joshua-spacetime in #3440
- CI - Remove previews on discord posts for merged PRs by @bfops in #3445
- Add bindings for csharp modules to use JWT claims by @jsdt in #3414
- gitignore
node_moduleseven when it's a symlink by @bfops in #3446 - CI - Move
Internal Teststo GitHub by @bfops in #3436 - feat: update pgwire to 0.34 and improve how we disable ssl by @sunng87 in #3432
- Add typescript bindings for auth claims. by @jsdt in #3442
- Remove unused docker-compose files by @bfops in #3455
- Add macro bindings for views by @joshua-spacetime in #3429
- [TS] Fix ctx.timestamp serialization by @coolreader18 in #3461
- V8: Let a worker thread own the isolate by @Centril in #3401
- fix migration which adds column and index together. by @Shubham8287 in #3450
util::jobs: add commentary + use.expect(..)by @Centril in #3468- Update to pgwire 0.34.2 by @coolreader18 in #3451
- Remove
connection_idfrom ViewContext by @joshua-spacetime in #3464 - CI - C# quickstar...
Release v1.6.0 - TypeScript Modules (Beta)
TypeScript Modules (Beta)
TypeScript/JavaScript modules are finally here! We're extremely excited to announce v1.6. For the first time in several years we've added a new server module language, and it required a whole new runtime! SpacetimeDB now ships with v8.
In order to get started with TypeScript modules, follow our quickstart guide or read the module API reference. Publishing a TypeScript module is almost exactly the same as publishing a Rust or C# module. In order to get started simply run:
spacetime init --lang typescript # in the appropriate directory
spacetime publish <your-module-name> # in the directory with your package.jsonThe spacetime CLI tool will look for src/index.ts and automatically bundle your application and upload it to SpacetimeDB.
⚠️ BETA NOTICE: TypeScript modules are currently in beta. As a result performance is not representative of the final product. If you encounter bugs or other issues, please file a new issue here with thetypescript-moduleslabel.
Other Features
In v1.6 we are now also adding additional schema migration support, including adding columns to tables! In order to add a column, just add a column to the end of your table definition, specify a default value, and push the new module. The CLI will warn you if your new schema is compatible with existing clients, and will disconnect the appropriate clients if required by the migration. This is one more step in our journey to provide a world class schema migration experience for your apps and games.
Other improvements
- Added a
Defaultattribute to fields in C# modules - Database snapshot improvements:
- The database snapshots at a more intelligent interval
- Improve snapshot compression + metrics (#3296)
- Unreal Engine
- allow access to inherited properties from all contexts in Blueprint
- Fixed some Unreal code generation bugs when using optional types.
- Adding wss:// support for the Unreal SDK (#3328)
- TypeScript SDK
- Fixed an issue where we use table_name_camelcase instead of table_name for
useTablein TypeScript - Fix bug where TypeScript SDK crashes when I32 is the primary key
- Fixed an issue where we use table_name_camelcase instead of table_name for
- Misc bugfixes:
- Fixed an issue where Rust dependencies would automatically be rolled forward beyond the specified version
- Fix some errors when using indexes on floating-point types
- Reduced some spammy logs on the server side
- Other miscellaneous performance improvements
What's Changed
- Expand scope of
DurabilityProviderto include snapshotting by @kim in #3295 - Improve snapshot compression + metrics by @kim in #3296
- core: disconnect clients by @Shubham8287 in #3275
- Document PG wire format by @mamcx in #3302
- Add SpacetimeAuth docs by @JulienLavocat in #3317
- Fix UPROPERTY initialization and new Blueprint Library for FContextBase by @JasonAtClockwork in #3287
- docs: fix closing code section and some grammar improvements by @gianpaj in #3322
- cli: pre-publish endpoint call. by @Shubham8287 in #3278
- Smoketest : Hotswap should not disconnect subscribers. by @Shubham8287 in #3301
- Fix link to sql page by @mamcx in #3326
- Fixes #3299 by @cloutiertyler in #3330
- Small change to auth docs by @cloutiertyler in #3329
- README - Fix root directory for generating CLI docs by @bfops in #3303
- Fix
tools/publish-crates.shby @bfops in #3268 - Jlvc/fix spacetimeauth docs by @JulienLavocat in #3333
- core: Allow snapshot worker to be reused by @kim in #3331
- v8: add and use
log_tracebackby @Centril in #3338 - V8: measurements, todos, and docs by @Centril in #3339
- Extract
InstanceEnv::console_timer_endby @Centril in #3340 - Fix bindgen tests (due to crate
timezone_provider) by @Centril in #3341 - extract
InstanceCommon::new+run_describerby @Centril in #3342 - add
InstanceEnv::{database_identity, fill_buffer_from_iter}+epoch_tickerby @Centril in #3345 - Extract from wasm_instance_env + console_timer_end: use Noop backtrace by @Centril in #3346
- split create snapshot method by @Shubham8287 in #3344
- V8: add syscalls, flesh out call_reducer, etc. by @Centril in #3348
- CI - Multi-line runs fail properly on Windows by @bfops in #3337
- Updated the size scripts for the TypeScript package by @cloutiertyler in #3269
- Adding wss:// support for the Unreal SDK by @thediymaker in #3328
- v8: use fast static strings for known strings by @Centril in #3351
- Rekhoff/csharp default field values by @rekhoff in #3235
- V8: Enable as unstable, add syscalls, flesh out call_reducer, etc. by @Centril in #3276
- Fixes an issue where we use table_name_camelcase instead of table_name for
useTablein TypeScript by @cloutiertyler in #3354 - Fix Rust dep versions by @bfops in #3369
- Generate read-only table handles for
#[table]by @joshua-spacetime in #3364 async-ify Wasmtime (and v8) execution by @gefjon in #3263- Pin
temporal_rsversion by @bfops in #3385 - Remove staging from spacetimeauth docs and update react integration by @JulienLavocat in #3347
- CI - Tweak caching in
typescript/build-and-testby @bfops in #3396 - V8: use ES modules instead of global by @Centril in #3361
- Bump Rust to 1.90 by @coolreader18 in #3397
- CI - Clean up several scripts and call sites related to codegen by @bfops in #3363
- CI - Check that C# bindings are up to date by @bfops in #3362
- Misc cleanups in
tools/upgrade-versionby @bfops in #3370 - Noa/ts module host changes by @coolreader18 in #3388
- Fix python example to not advise to use ~/token.py by @mamcx in #3393
- Removed errant console.log/print statements by @cloutiertyler in #3402
- Fix for Unreal codegen for Optional fields by @JasonAtClockwork in #3360
- Remove use of DDC during CI tests by @JasonAtClockwork in #3367
- Windows - Set
linker = "lld-link"by @bfops in #3406 - Also capture a snapshot every new commitlog segment by @gefjon in #3405
- Add forgotten variance to table_index::can_merge by @SamuelE-Arvika in #3391
- Bump versions to 1.6.0 by @bfops in #3413
- Typescript module API by @coolreader18 in #3327
New Contributors
- @gianpaj made their first contribution in #3322
- @thediymaker made their first contribution in #3328
- @SamuelE-Arvika made their first contribution in #3391
Full Changelog: v1.5.0...v1.6.0
Release v1.5.0
We've got some releases coming at you fast this month, and there's more to come! We've got some very exciting new features in SpacetimeDB v1.5.0.
Postgres Wire Format (Beta)
The initial version of the Postgres Wire Protocol is now implemented in SpacetimeDB. This means you can connect normal Postgres clients like psql or tokio-postgres to SpacetimeDB on port 5432.
Please note that this is the first step on a (very) long journey to make SpacetimeDB as Postgres compatible as the architecture allows and it comes with a set of caveats, but as of today you can officially connect to SpacetimeDB with a Postgres client! You can find the full documentation on what is supported in the docs.
SpacetimeAuth (Beta)
We are also releasing another major feature today as well, SpacetimeAuth! SpacetimeAuth is a new authentication and user management service operated by Clockwork Labs. The goal is deep integration with SpacetimeDB so you get user management for all your projects and databases with the click of a button.
No more having to spin up an auth service just to deploy an app on SpacetimeDB. Now you can just navigate to SpacetimeAuth in your profile menu dropdown or go to https://spacetimedb.com/spacetimeauth and create a new project for your application.
Your users can then log in to your SpacetimeDB application by using a new customizable webpage.
What's Changed
- Removed
@clockworklabs/typescript-sdkin favor ofspacetimedbby @cloutiertyler in #3262 - Bump remaining versions to 1.4.0 by @bfops in #3267
- datastore: add
clear_tableand fixdrop_tableby @Centril in #3214 - datastore: add support for truncation by @Centril in #3215
- Add reducer name to database log records by @gefjon in #3274
- Update C# DLLs to 1.4.0 by @bfops in #3270
- datastore: add columns support by @Shubham8287 in #3230
- Finish making PG tests use a dynamic server address by @bfops in #3277
- Remove incorrect broken links by @JasonAtClockwork in #3280
- Wrap some tests in a
modso that I can--skipthem by @gefjon in #3284 - Loosen
spacetimedbdep onspacetime init --lang rustby @bfops in #3286 - TypeScript: Add confirmed reads config by @kim in #3247
- Rust SDK: Make confirmed parameter optional by @kim in #3283
- Add metrics tracking time to restore a database from disk by @gefjon in #3285
- Expand scope of
DurabilityProviderto include snapshotting by @kim in #3281 - Revert "Expand scope of
DurabilityProviderto include snapshotting (#3281)" by @kim in #3293 - SATS: impl ser/de for tuples by @Centril in #3292
- Support
BytesSources other than the one for reducer args by @gefjon in #3294 - Make optional to listen to pg wire protocol and param for the port by @mamcx in #3309
- Fix CI breakage by PR #3309 by @mamcx in #3314
- Make the .NET global.json file global by @kim in #3297
- Bump versions to 1.5.0, update DLLs, and regenerate files by @bfops in #3310
- Integrate
tools/upgrade-versioninto cargo and expand by @bfops in #3308 - CI - Move Unity testsuite to a different runner by @bfops in #3318
- CI -
apt installinvocations correctly pass-yby @bfops in #3324 - C# tests - update snapshots by @bfops in #3321
- Improve message error if the port is taken by @mamcx in #3320
Full Changelog: v1.4.0...v1.5.0
Release v1.4.0
We have an exciting announcement for you today 🎉🎉🎉 We've been cooking on Unreal Engine and React Hooks for a while now and we're finally ready to release both of them.
Unreal Engine
We know this is one highly requested feature so today we're happy to announce that SpacetimeDB now fully supports Unreal Engine. You can use our Unreal Engine SDK with either C# or Rust SpacetimeDB modules. We have even extended the Blackholio demo to work with the existing modules. So this means we've added Unreal Engine as a client alongside our Unity implementation. You can even connect both a Unity and Unreal Engine Blackholio client to the same module. We know this has been a highly requested feature that the community has been asking for so we're excited to see what everyone builds with it!
- New Blackholio tutorial which has feature parity with Unity. Try it now: https://spacetimedb.com/docs/unreal
- New API reference: https://spacetimedb.com/docs/unreal/reference
If you don't want to do the tutorial and you just want to play around want to try out our Blackholio demo you can find the latest version here: https://github.com/clockworklabs/SpacetimeDB/tree/master/demo/Blackholio
Shoutout to Arvikasoft who we collaborated with for the development of this SDK!
React Hooks 🪝 (Beta)
React hooks for SpacetimeDB are now here! Using SpacetimeDB with React is now much much easier. Just add a SpacetimeDBProvider to your component hierarchy and use the useTable React hook!
// main.tsx
const connectionBuilder = DbConnection.builder()
.withUri('wss://maincloud.spacetimedb.com')
.withModuleName('MODULE_NAME');
ReactDOM.createRoot(document.getElementById('root')!).render(
<React.StrictMode>
<SpacetimeDBProvider connectionBuilder={connectionBuilder}>
<App />
</SpacetimeDBProvider>
</React.StrictMode>
);
// App.tsx
function App() {
const conn = useSpacetimeDB<DbConnection>();
const { rows: messages } = useTable<DbConnection, Message>('message');
...
}SpacetimeDB will magically synchronize your table state with your React client and re-render your UI as it changes. About as simple as it gets!
For added power, add a typed where clause to your useTable hook to filter the rows you want to subscribe to:
const { rows: users } = useTable<DbConnection, User>('user', where(eq('online', true)));Upgrade Instructions
In order to receive this update you'll first need CLI version 1.4.0. In order to upgrade to the new CLI version you can just run spacetime version upgrade which will automatically upgrade you to the newest version. If you don't have SpacetimeDB installed you'll need to go to https://spacetimedb.com/install .
You can verify that you have the newest version installed by running spacetime version list in your terminal application:
> spacetime version list
1.4.0 (current)
Then you'll need to update your SpacetimeDB SDK version in your package.json file. Before this update you would have had something like this:
"dependencies": {
"@clockworklabs/spacetimedb-sdk": "^1.3.0",
...
},Now our new package looks like this:
"dependencies": {
"spacetimedb": "^1.4.0",
...
},If you are at all confused you can just look at our Typescript quickstart which has instructions on installing the CLI + using the correct package in package.json: https://staging.spacetimedb.com/docs/sdks/typescript/quickstart
Confirmed Reads
"Confirmed reads" is a feature which allows you to specify during the connection setup that you only want to hear back about transactions which have already been persisted. This means these transactions will not be lost if the server you are connected to experiences a hardware failure of some sort.
Here is an example of how to enable confirmed reads:
const connectionBuilder = DbConnection.builder()
.withUri('ws://localhost:3000')
.withModuleName('quickstart-chat')
.withConfirmedReads(true)
.withToken(localStorage.getItem('auth_token') || undefined)
.onConnect(onConnect)
.onDisconnect(onDisconnect)
.onConnectError(onConnectError);Improvements/Fixes
- The version number for codegen is now only written to a single file instead of every single generated file. This helps cut down on conflicts when changing SpacetimeDB CLI versions. (#3216)
- Improve error reporting for invalid column-type-changing automigrations (#3202)
- Sort columns in
st_column_changedbefore automigrating. (#3203) - Fixed not being able to have columns named "read", "write", etc. (#2525)
- Typescript SDK: Fix to actually use the passed onclose function (#3152)
- Removed // @ts-ignore directive from generated files and fixes associated errors (#3228)
- TimeSpan-Style TimeDuration Constructors in C# Bindings (#2778)
What's Changed
execute_plan: don't build temporary vec of rows by @Centril in #2918- smoktests: Wait for batched consensus by @kim in #3010
- Addresses #2969 by @cloutiertyler in #2980
- Dont generate connection_ids in the rust client. by @jsdt in #3004
- CI - Set Unity testsuite timeout to 30m by @bfops in #3015
- CI - Make new CI checks run in merge queue by @bfops in #3016
- Update DLLs to 1.3.0 by @bfops in #3018
- CI - Remove
bots pleaseby @bfops in #3102 - Blackholio - Hide generated files from diffs by @bfops in #3119
- Implement reduced coupling between SpacetimeDBClient.cs and Table.cs by @rekhoff in #3122
- Docs - Fix incorrect reference to Rust client SDK by @bfops in #3124
- TypeScript - Bump version to 1.3.1 for release by @bfops in #3123
- Add repo migration notice workflows by @bfops in #3127
- Update README.md by @GageHowe in #1703
- refactor(sdk): improve the log message source line reference by @ResuBaka in #2924
- commitlog: Provide folding over a range of tx offsets by @kim in #3129
- Blackholio - Logging back in and resuming gameplay by @jdetter in #2990
- Drop log for already-compressed snapshot to debug by @gefjon in #3131
- Add "How to compile" section to Rust quickstart by @bfops in #3136
- Blackholio - Enable more tests by @bfops in #3135
- V8: Use clearer lifetime names by @Centril in #3009
- Update outdated the demo Blackholio source url by @Rot4tion in #3150
- C#/Unity SDK - Add some developer docs by @bfops in #3140
- Typescript SDK: Fix to actually use the passed onclose function by @natebot13 in #3152
- V8: Ser/de finishing touches by @Centril in #3153
- Update all licenses by @bfops in #3002
- Fix module hotswapping for connected clients by @kim in #3159
- V8: Define and test
call_describe_moduleby @Centril in #3161 - Increase default
incoming_queue_lengthlimit, log warning when a client violates it by @gefjon in #3171 - fix incoming message queue length metric by @joshua-spacetime in #3172
- TimeSpan-Style TimeDuration Constructors in C# Bindings by @wes-sleeman in #2778
- Added RLS to llms.txt by @bfops in #3134
- Add workflow preview diagram in index by @bfops in #3139
- Fix issue with scheduled reducers being executed twice after module reload by @Shubham8287 in #3179
- Reduce
tools/publish-crates.shto only publishbindingsandsdkby @bfops in #3180 - Enable adding columns in auto migrations in
schemacrate by @kazimuth in #2956 tools/publish-crates.shis more flexible for crate paths by @bfops in #3185- Automigration pretty print by @Shubham8287 in #3121
- Move
crates/sdktosdks/rustby @bfops in #3181 - Remove some dead code by @Centril in #3189
- Pretty print: sort hashmap iters by @Shubham8287 in #3188
- Disable column type changes in an automigration by @joshua-spacetime in #3178
- Refactor and extract
call_reducerandupdate_databasemachinery for reuse by V8 by @Centril in https://github.com/clockworklabs/Spacetim...
Release v1.3.2
Just a small bugfix release to re-enable and fix functionality for adding new enum variants!
Full Changelog: v1.3.1...v1.3.2