mirror of
https://github.com/clockworklabs/SpacetimeDB.git
synced 2026-05-14 19:58:24 -04:00
bfops/debug-changes
5 Commits
| Author | SHA1 | Message | Date | |
|---|---|---|---|---|
|
|
f9ccf4c1c4 |
Move Bound struct out of SpacetimeDB.Internal to SpacetimeDB and Local out of SpacetiemDB.Runtime (#3996)
# Description of Changes This PR fixes a C# SDK regression where using `Bound` in index filters could trigger an ambiguous reference compiler error for Local after upgrading to `v1.11.2`, as reported in [#3995](https://github.com/clockworklabs/SpacetimeDB/issues/3995). It also fixes a related warning-spam regression (`CS0436`) where user projects could see `Local` type conflicts between generated module code and the `SpacetimeDB.Runtime` assembly. * Introduced a public `SpacetimeDB.Bound` type so users no longer need to import `SpacetimeDB.Internal` to use bounds in index filters. * Kept `SpacetimeDB.Internal.Bound` for compatibility, but added implicit conversions between `SpacetimeDB.Internal.Bound` and `SpacetimeDB.Bound`. * Updated the C# code generator to emit fully-qualified `global::SpacetimeDB.Bound` in generated index filter signatures, avoiding `SpacetimeDB.Internal` in public-facing APIs and preventing name collisions (e.g., `Local`). * Updated internal runtime bounds helpers (`BTreeIndexBounds<...>`) to explicitly use `SpacetimeDB.Bound` when constructing range-scan arguments. * Updated Codegen snapshot fixtures to match the new generated output (type name + formatting). * Fixed codegen output for `ITableView` `static abstract` member implementations to generate `public static` methods (required for the generated code to compile). It also fixes a related warning-spam regression (CS0436) where user projects could see Local type conflicts between generated module code and the SpacetimeDB.Runtime assembly. Additional fix (related to the `Local` reports): * Removed the runtime assembly’s ownership of `SpacetimeDB.Local` (introduced more recently than the generated module `Local`) to prevent `CS0436` duplicate-type warnings. Basically, the runtime’s concrete `Local`/`ProcedureTxContext` helpers were renamed and made internal so the code generator remains the sole owner of module-level `SpacetimeDB.Local`. Regression coverage: * Added generator regression assertions to ensure generated code does not reference `global::SpacetimeDB.Internal.Bound<...>` and does reference `global::SpacetimeDB.Bound<...>`. * Added a runtime API regression assertion that `SpacetimeDB.Bound` exists and is public in the runtime reference. * Added a regression assertion that `SpacetimeDB.Runtime` does not define codegen-owned types (e.g. `SpacetimeDB.Local`, `ProcedureContext`, etc.) to prevent future `CS0436` conflicts. * Added a “simulated downstream user file” compile check ensuring no `CS0436` diagnostics occur when user code references `SpacetimeDB.Local`. # API and ABI breaking changes None. * No schema or wire-format changes. * The changes are limited to C# type exposure / naming and codegen output. * `SpacetimeDB.Internal.Bound` remains usable via implicit conversions (backwards compatible for existing code). # Expected complexity level and risk 2 - Low * Changes are isolated to C# runtime type exposure, codegen type references, and snapshot updates. * No runtime behavior changes to index scan encoding/decoding; only avoids requiring SpacetimeDB.Internal in user code. # Testing - [X] Ran:`dotnet test crates/bindings-csharp/Codegen.Tests/Codegen.Tests.csproj` - [X] Ran regression tests locally. |
||
|
|
82d5a4f6c0 |
Implement SpacetimeType for Result<T, E> (#3790)
# Description of Changes Closes #3673 *NOTE*: C++ part will be in another PR # Expected complexity level and risk 2 Adding a new type touch everywhere # Testing - [x] Adding smoke and unit test --------- Signed-off-by: Ryan <r.ekhoff@clockworklabs.io> Co-authored-by: rekhoff <r.ekhoff@clockworklabs.io> Co-authored-by: Phoebe Goldman <phoebe@goldman-tribe.org> Co-authored-by: Jason Larabie <jason@clockworklabs.io> |
||
|
|
8dd18f078f |
C# bindings: add procedure_http_request support + fix HTTP BSATN wire format to match spacetimedb_lib::http (#3944)
# Description of Changes Rust added procedure-scoped HTTP via the `procedure_http_request` ABI (see Rust PR #3684) to C# host bindings. What changed: 1) Fix for BSATN wire format * Updated C# BSATN wire types for HTTP (`BSATN.Runtime/HttpWireTypes.cs`) to match exactly the Rust stable types: * `spacetimedb_lib::http::Request` fields and order: `method`, `headers`, `timeout`, `uri`, `version` * `spacetimedb_lib::http::Response` fields and order: `headers`, `version`, `code` * Header pairs are (`name: string, value: bytes`); no additional metadata is encoded. * Added explicit “do not reorder/extend” note in the C# wire type file since the host BSATN-decodes these bytes directly and may trap on mismatch. 2) C# runtime HTTP client implementation * Implemented `ProcedureContext.Http` support (`Runtime/Http.cs`) that: * BSATN-serializes `HttpRequestWire` + sends body bytes via `procedure_http_request` * On success, BSATN-decodes `HttpResponseWire` and returns `(response, body)` as a typed `HttpResponse` * On `HTTP_ERROR`, decodes the error payload as a BSATN `string` * On `WOULD_BLOCK_TRANSACTION`, returns a stable error message (host rejects blocking HTTP while a mut tx is open) * Clamps timeouts to 500ms max (matching host behavior documented on the Rust side) 3) ABI wiring / import plumbing * Added the `procedure_http_request` import to the C# wasm shim (`Runtime/bindings.c`) under the `spacetime_10.3` import module. * Verified the generated C# P/Invoke signature matches the host ABI (request ptr/len, body ptr/len, out `[BytesSource; 2]`). 4) Procedure entrypoint contract (trap vs errno) * Updated/clarified the module procedure trampoline behavior (`Runtime/Internal/Module.call_procedure`): it must either return `Errno.OK` or trap (log + rethrow). This mirrors the host’s expectations and avoids “unexpected errno values from guest entrypoints” behavior. Behavioral notes vs Rust * Rust bindings may `expect(...)`/panic on “should never happen” serialization failures; C# runtime explicitly avoids throwing across the procedure boundary for the HTTP client path and instead returns `Result.Err` for unexpected failures. This prevents whole-module traps from user-space HTTP usage while still surfacing rich errors. * The host remains authoritative on timeout enforcement; C# now mirrors the effective host clamp (500ms) to keep behavior aligned. # API and ABI breaking changes No new host ABI introduced, and does not change the syscall signature. * This is not an ABI “break” in the host, but it is a guest-side wire compatibility correction: older C# guests built with the incorrect wire types could cause the host to trap during BSATN decode. After this PR, C# guests are compatible with the host’s expected layout. **Adds API**: `ProcedureContextBase.Http` is available for procedures No existing public types/method signatures are removed * A notable difference from Rust's panic behavior is that Rust code sometimes `expect(...)`s and may panic/trap on internal “should not happen” cases. On the other hand, C#'s `HttpClient.Send` explicitly converts unexpected failures into `Result.Err` to avoid trapping the module. This is a behavioral difference, but not an API break. # Expected complexity level and risk 2 - Mostly just creating equivalents to the Rust version. # Testing C# regression tests updated to cover: - [X] Successful request path (`ReadMySchemaViaHttp`) - [X] Invalid request path (`InvalidHttpRequest`) returning error without trapping Testing performed: - [X] Full regression suite run against local node (see chat log); no wasm traps, all suites reported `Success`. --------- Signed-off-by: Ryan <r.ekhoff@clockworklabs.io> |
||
|
|
8fb0bcf922 |
Add UUID built-in convenience type to SpacetimeDB (#3538)
# Description of Changes Closes [#3290](https://github.com/clockworklabs/SpacetimeDB/issues/3290). Adds a new "special" type to SATS, `UUID`, which is represented as the product `{ __uuid__: u128 }`. Adds versions of this type to all of our various languages' module bindings libraries and client SDKs, and updates codegen to recognize it and output references to those named library types. Adds methods for creating new UUIDs according to the V4 (all random) and V7 (timestamp, monotonic counter and random) specifications. # API and ABI breaking changes We add a new type # Expected complexity level and risk 2 it impacts all over the code # Testing - [x] Extends the Rust and Unreal SDK tests, and the associated `module-test` modules in Rust, C# and TypeScript, with uses of UUIDs. - [x] Extends the C# SDK regression tests with uses of UUIDs. - [x] Extends the TypeScript test suite with tests with uses of UUIDs. --------- Signed-off-by: Mario Montoya <mamcx@elmalabarista.com> Co-authored-by: Phoebe Goldman <phoebe@clockworklabs.io> Co-authored-by: Jason Larabie <jason@clockworklabs.io> Co-authored-by: John Detter <4099508+jdetter@users.noreply.github.com> |
||
|
|
39f01289e5 |
C# implementation of Transactions for Procedures (#3809)
# Description of Changes Implements the C# equivalent of #3638 This implement uses inheritance, where abstract base classes (like `ProcedureContextBase` in `ProcedureContext.cs`) store the core of the implementation, and then generated wrappers (like `ProcedureContext` in the generated FFI.cs file) inherit from them. For error handling, we work like Rust's implementation of `Result<T,E>` but we require `where E : Exception` because of how exceptions work in C#. Transaction-level failures come back as a `TxOutcome` and user errors should follow the `Result<T,E>` pattern. In this implementation, we have `UnwrapOrThrow()` throws exceptions directly because of C#'s error handling pattern. Unlike the Rust implementation's direct `Result` propagation, we are using an `AbortGuard` pattern (in `ProcedureContext.cs`) for exception handling, which uses `IDisposable` for automatic cleanup. Most changes should have fairly similar Rust-equivalents beyond that. For module authors, the changes here allow for the transation logic to work like: ```csharp ctx.TryWithTx<ResultType, Exception>(tx => { // transaction logic return Result<ResultType, Exception>.Ok(result); }); ``` This change includes a number of tests added to the `sdks/csharp/examples~/regression-tests/`'s `server` and `client` to validate the behavior of the changes. `server` changes provide further usage examples for module authors. # API and ABI breaking changes Should not be a breaking change # Expected complexity level and risk 2 # Testing - [x] Created Regression Tests that show transitions in procedures working in various ways, all of which pass. |