From 12e95c84669bc168b428479b5747400a1d301c7f Mon Sep 17 00:00:00 2001 From: rekhoff Date: Tue, 27 Jan 2026 15:51:43 -0800 Subject: [PATCH 1/2] Update C# bindings to use new View ABI --- crates/bindings-csharp/Codegen/Module.cs | 6 +++ .../Runtime/Internal/Module.cs | 48 ++++++++++++++++++- .../Runtime/Internal/ViewResultHeader.cs | 5 ++ 3 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 crates/bindings-csharp/Runtime/Internal/ViewResultHeader.cs diff --git a/crates/bindings-csharp/Codegen/Module.cs b/crates/bindings-csharp/Codegen/Module.cs index 63331bba5b6..93c44cf0c26 100644 --- a/crates/bindings-csharp/Codegen/Module.cs +++ b/crates/bindings-csharp/Codegen/Module.cs @@ -1039,15 +1039,21 @@ public string GenerateDispatcherClass(uint index) ? $$$""" var listSerializer = {{{ReturnType.BSATNName}}}.GetListSerializer(); var listValue = ModuleRegistration.ToListOrEmpty(returnValue); + var header = new global::SpacetimeDB.Internal.ViewResultHeader.RowData(default); + var headerRW = new global::SpacetimeDB.Internal.ViewResultHeader.BSATN(); using var output = new System.IO.MemoryStream(); using var writer = new System.IO.BinaryWriter(output); + headerRW.Write(writer, header); listSerializer.Write(writer, listValue); return output.ToArray(); """ : $$$""" {{{ReturnType.BSATNName}}} returnRW = new(); + var header = new global::SpacetimeDB.Internal.ViewResultHeader.RowData(default); + var headerRW = new global::SpacetimeDB.Internal.ViewResultHeader.BSATN(); using var output = new System.IO.MemoryStream(); using var writer = new System.IO.BinaryWriter(output); + headerRW.Write(writer, header); returnRW.Write(writer, returnValue); return output.ToArray(); """; diff --git a/crates/bindings-csharp/Runtime/Internal/Module.cs b/crates/bindings-csharp/Runtime/Internal/Module.cs index 0ca39977b86..ac872325eef 100644 --- a/crates/bindings-csharp/Runtime/Internal/Module.cs +++ b/crates/bindings-csharp/Runtime/Internal/Module.cs @@ -366,6 +366,30 @@ BytesSink resultSink } } + /// + /// Called by the host to execute a view when the sender calls the view identified by . + /// + /// + /// + /// The sender identity is passed as 4 values ( through + /// ) representing a little-endian . + /// + /// + /// is a host-registered containing the BSATN-encoded + /// view arguments. For empty arguments, will be invalid. + /// + /// + /// The view output is written to , a host-registered . + /// + /// + /// Note: a previous view ABI wrote the return rows directly to the sink. + /// The current ABI writes a BSATN-encoded first, in order to distinguish + /// between views that return row data and views that return queries. + /// + /// + /// The current ABI is identified by returning error code 2. + /// + /// public static Errno __call_view__( uint id, ulong sender_0, @@ -386,7 +410,7 @@ BytesSink rows using var reader = new BinaryReader(stream); var bytes = viewDispatchers[(int)id].Invoke(reader, ctx); rows.Write(bytes); - return Errno.OK; + return (Errno)2; } catch (Exception e) { @@ -395,6 +419,26 @@ BytesSink rows } } + /// + /// Called by the host to execute an anonymous view. + /// + /// + /// + /// is a host-registered containing the BSATN-encoded + /// view arguments. For empty arguments, will be invalid. + /// + /// + /// The view output is written to , a host-registered . + /// + /// + /// Note: a previous view ABI wrote the return rows directly to the sink. + /// The current ABI writes a BSATN-encoded first, in order to distinguish + /// between views that return row data and views that return queries. + /// + /// + /// The current ABI is identified by returning error code 2. + /// + /// public static Errno __call_view_anon__(uint id, BytesSource args, BytesSink rows) { try @@ -404,7 +448,7 @@ public static Errno __call_view_anon__(uint id, BytesSource args, BytesSink rows using var reader = new BinaryReader(stream); var bytes = anonymousViewDispatchers[(int)id].Invoke(reader, ctx); rows.Write(bytes); - return Errno.OK; + return (Errno)2; } catch (Exception e) { diff --git a/crates/bindings-csharp/Runtime/Internal/ViewResultHeader.cs b/crates/bindings-csharp/Runtime/Internal/ViewResultHeader.cs new file mode 100644 index 00000000000..92d169d95a9 --- /dev/null +++ b/crates/bindings-csharp/Runtime/Internal/ViewResultHeader.cs @@ -0,0 +1,5 @@ +namespace SpacetimeDB.Internal; + +[SpacetimeDB.Type] +public partial record ViewResultHeader + : SpacetimeDB.TaggedEnum<(SpacetimeDB.Unit RowData, string RawSql)>; From d6ae5511aeabbc7e5bba0c12683ea80714e27d15 Mon Sep 17 00:00:00 2001 From: rekhoff Date: Tue, 27 Jan 2026 16:00:12 -0800 Subject: [PATCH 2/2] Adding `Codegen.Test` snapshot updates --- .../diag/snapshots/Module#FFI.verified.cs | 30 +++++++++++++++++++ .../server/snapshots/Module#FFI.verified.cs | 6 ++++ 2 files changed, 36 insertions(+) diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#FFI.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#FFI.verified.cs index 90eb00d3eaf..9064e3f7b3c 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#FFI.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/diag/snapshots/Module#FFI.verified.cs @@ -1177,8 +1177,11 @@ public byte[] Invoke( { var returnValue = Module.ViewDefNoContext((SpacetimeDB.ViewContext)ctx); SpacetimeDB.BSATN.List returnRW = new(); + var header = new global::SpacetimeDB.Internal.ViewResultHeader.RowData(default); + var headerRW = new global::SpacetimeDB.Internal.ViewResultHeader.BSATN(); using var output = new System.IO.MemoryStream(); using var writer = new System.IO.BinaryWriter(output); + headerRW.Write(writer, header); returnRW.Write(writer, returnValue); return output.ToArray(); } @@ -1215,8 +1218,11 @@ public byte[] Invoke( { var returnValue = Module.ViewDefNoPublic((SpacetimeDB.ViewContext)ctx); SpacetimeDB.BSATN.List returnRW = new(); + var header = new global::SpacetimeDB.Internal.ViewResultHeader.RowData(default); + var headerRW = new global::SpacetimeDB.Internal.ViewResultHeader.BSATN(); using var output = new System.IO.MemoryStream(); using var writer = new System.IO.BinaryWriter(output); + headerRW.Write(writer, header); returnRW.Write(writer, returnValue); return output.ToArray(); } @@ -1253,8 +1259,11 @@ public byte[] Invoke( { var returnValue = Module.ViewDefWrongContext((SpacetimeDB.ViewContext)ctx); SpacetimeDB.BSATN.List returnRW = new(); + var header = new global::SpacetimeDB.Internal.ViewResultHeader.RowData(default); + var headerRW = new global::SpacetimeDB.Internal.ViewResultHeader.BSATN(); using var output = new System.IO.MemoryStream(); using var writer = new System.IO.BinaryWriter(output); + headerRW.Write(writer, header); returnRW.Write(writer, returnValue); return output.ToArray(); } @@ -1289,8 +1298,11 @@ public byte[] Invoke( { var returnValue = Module.ViewDefWrongReturn((SpacetimeDB.ViewContext)ctx); Player.BSATN returnRW = new(); + var header = new global::SpacetimeDB.Internal.ViewResultHeader.RowData(default); + var headerRW = new global::SpacetimeDB.Internal.ViewResultHeader.BSATN(); using var output = new System.IO.MemoryStream(); using var writer = new System.IO.BinaryWriter(output); + headerRW.Write(writer, header); returnRW.Write(writer, returnValue); return output.ToArray(); } @@ -1331,8 +1343,11 @@ public byte[] Invoke( Player.BSATN >.GetListSerializer(); var listValue = ModuleRegistration.ToListOrEmpty(returnValue); + var header = new global::SpacetimeDB.Internal.ViewResultHeader.RowData(default); + var headerRW = new global::SpacetimeDB.Internal.ViewResultHeader.BSATN(); using var output = new System.IO.MemoryStream(); using var writer = new System.IO.BinaryWriter(output); + headerRW.Write(writer, header); listSerializer.Write(writer, listValue); return output.ToArray(); } @@ -1373,8 +1388,11 @@ public byte[] Invoke( Player.BSATN >.GetListSerializer(); var listValue = ModuleRegistration.ToListOrEmpty(returnValue); + var header = new global::SpacetimeDB.Internal.ViewResultHeader.RowData(default); + var headerRW = new global::SpacetimeDB.Internal.ViewResultHeader.BSATN(); using var output = new System.IO.MemoryStream(); using var writer = new System.IO.BinaryWriter(output); + headerRW.Write(writer, header); listSerializer.Write(writer, listValue); return output.ToArray(); } @@ -1415,8 +1433,11 @@ public byte[] Invoke( Player.BSATN >.GetListSerializer(); var listValue = ModuleRegistration.ToListOrEmpty(returnValue); + var header = new global::SpacetimeDB.Internal.ViewResultHeader.RowData(default); + var headerRW = new global::SpacetimeDB.Internal.ViewResultHeader.BSATN(); using var output = new System.IO.MemoryStream(); using var writer = new System.IO.BinaryWriter(output); + headerRW.Write(writer, header); listSerializer.Write(writer, listValue); return output.ToArray(); } @@ -1457,8 +1478,11 @@ public byte[] Invoke( Player.BSATN >.GetListSerializer(); var listValue = ModuleRegistration.ToListOrEmpty(returnValue); + var header = new global::SpacetimeDB.Internal.ViewResultHeader.RowData(default); + var headerRW = new global::SpacetimeDB.Internal.ViewResultHeader.BSATN(); using var output = new System.IO.MemoryStream(); using var writer = new System.IO.BinaryWriter(output); + headerRW.Write(writer, header); listSerializer.Write(writer, listValue); return output.ToArray(); } @@ -1499,8 +1523,11 @@ public byte[] Invoke( Player.BSATN >.GetListSerializer(); var listValue = ModuleRegistration.ToListOrEmpty(returnValue); + var header = new global::SpacetimeDB.Internal.ViewResultHeader.RowData(default); + var headerRW = new global::SpacetimeDB.Internal.ViewResultHeader.BSATN(); using var output = new System.IO.MemoryStream(); using var writer = new System.IO.BinaryWriter(output); + headerRW.Write(writer, header); listSerializer.Write(writer, listValue); return output.ToArray(); } @@ -1545,8 +1572,11 @@ public byte[] Invoke( NotSpacetimeType.BSATN >.GetListSerializer(); var listValue = ModuleRegistration.ToListOrEmpty(returnValue); + var header = new global::SpacetimeDB.Internal.ViewResultHeader.RowData(default); + var headerRW = new global::SpacetimeDB.Internal.ViewResultHeader.BSATN(); using var output = new System.IO.MemoryStream(); using var writer = new System.IO.BinaryWriter(output); + headerRW.Write(writer, header); listSerializer.Write(writer, listValue); return output.ToArray(); } diff --git a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module#FFI.verified.cs b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module#FFI.verified.cs index f4d86c2ddbc..11c5b86ea18 100644 --- a/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module#FFI.verified.cs +++ b/crates/bindings-csharp/Codegen.Tests/fixtures/server/snapshots/Module#FFI.verified.cs @@ -1162,8 +1162,11 @@ public byte[] Invoke( PublicTable.BSATN >.GetListSerializer(); var listValue = ModuleRegistration.ToListOrEmpty(returnValue); + var header = new global::SpacetimeDB.Internal.ViewResultHeader.RowData(default); + var headerRW = new global::SpacetimeDB.Internal.ViewResultHeader.BSATN(); using var output = new System.IO.MemoryStream(); using var writer = new System.IO.BinaryWriter(output); + headerRW.Write(writer, header); listSerializer.Write(writer, listValue); return output.ToArray(); } @@ -1208,8 +1211,11 @@ public byte[] Invoke( PublicTable.BSATN >.GetListSerializer(); var listValue = ModuleRegistration.ToListOrEmpty(returnValue); + var header = new global::SpacetimeDB.Internal.ViewResultHeader.RowData(default); + var headerRW = new global::SpacetimeDB.Internal.ViewResultHeader.BSATN(); using var output = new System.IO.MemoryStream(); using var writer = new System.IO.BinaryWriter(output); + headerRW.Write(writer, header); listSerializer.Write(writer, listValue); return output.ToArray(); }