Skip to content

Commit c1049ac

Browse files
sender changes for csharp
1 parent 19a0a85 commit c1049ac

8 files changed

Lines changed: 58 additions & 42 deletions

File tree

crates/bindings-csharp/Codegen/Module.cs

Lines changed: 16 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1737,7 +1737,6 @@ public void Initialize(IncrementalGeneratorInitializationContext context)
17371737
17381738
namespace SpacetimeDB {
17391739
public sealed record ReducerContext : DbContext<Local>, Internal.IReducerContext {
1740-
public readonly Identity Sender;
17411740
public readonly ConnectionId? ConnectionId;
17421741
public readonly Random Rng;
17431742
public readonly Timestamp Timestamp;
@@ -1747,16 +1746,24 @@ public sealed record ReducerContext : DbContext<Local>, Internal.IReducerContext
17471746
// We need this property to be non-static for parity with client SDK.
17481747
public Identity Identity => Internal.IReducerContext.GetIdentity();
17491748
1749+
private readonly Identity _sender;
1750+
17501751
internal ReducerContext(Identity identity, ConnectionId? connectionId, Random random,
17511752
Timestamp time, AuthCtx? senderAuth = null)
17521753
{
1753-
Sender = identity;
1754+
_sender = identity;
17541755
ConnectionId = connectionId;
17551756
Rng = random;
17561757
Timestamp = time;
17571758
SenderAuth = senderAuth ?? AuthCtx.BuildFromSystemTables(connectionId, identity);
17581759
CounterUuid = 0;
17591760
}
1761+
1762+
/// <summary>
1763+
/// The identity of the client that invoked the reducer.
1764+
/// </summary>
1765+
public Identity Sender() => _sender;
1766+
17601767
/// <summary>
17611768
/// Create a new random <see cref="Uuid"/> `v4` using the built-in RNG.
17621769
/// </summary>
@@ -1891,13 +1898,18 @@ public sealed class Local : global::SpacetimeDB.LocalBase {
18911898
18921899
public sealed record ViewContext : DbContext<Internal.LocalReadOnly>, Internal.IViewContext
18931900
{
1894-
public Identity Sender { get; }
1901+
private readonly Identity _sender;
18951902
18961903
internal ViewContext(Identity sender, Internal.LocalReadOnly db)
18971904
: base(db)
18981905
{
1899-
Sender = sender;
1906+
_sender = sender;
19001907
}
1908+
1909+
/// <summary>
1910+
/// The identity of the client that invoked the view.
1911+
/// </summary>
1912+
public Identity Sender() => _sender;
19011913
}
19021914
19031915
public sealed record AnonymousViewContext : DbContext<Internal.LocalReadOnly>, Internal.IAnonymousViewContext

crates/bindings-csharp/Runtime/ProcedureContext.cs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,11 @@ public abstract class ProcedureContextBase(
1010
Timestamp time
1111
) : Internal.IInternalProcedureContext
1212
{
13+
private readonly Identity _sender = sender;
14+
15+
public Identity Sender() => _sender;
16+
1317
public static Identity Identity => Internal.IProcedureContext.GetIdentity();
14-
public Identity Sender { get; } = sender;
1518
public ConnectionId? ConnectionId { get; } = connectionId;
1619
public Random Rng { get; } = random;
1720
public Timestamp Timestamp { get; private set; } = time;
@@ -47,7 +50,7 @@ public Internal.TxContext EnterTxContext(long timestampMicros)
4750
txContext?.WithTimestamp(timestamp)
4851
?? new Internal.TxContext(
4952
CreateLocal(),
50-
Sender,
53+
_sender,
5154
ConnectionId,
5255
timestamp,
5356
SenderAuth,
@@ -229,8 +232,9 @@ public abstract class ProcedureTxContextBase(Internal.TxContext inner)
229232

230233
internal void Refresh(Internal.TxContext inner) => Inner = inner;
231234

235+
public Identity Sender() => Inner.Sender;
236+
232237
public LocalBase Db => (LocalBase)Inner.Db;
233-
public Identity Sender => Inner.Sender;
234238
public ConnectionId? ConnectionId => Inner.ConnectionId;
235239
public Timestamp Timestamp => Inner.Timestamp;
236240
public AuthCtx SenderAuth => Inner.SenderAuth;

demo/Blackholio/server-csharp/Lib.cs

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,7 @@ public static void Init(ReducerContext ctx)
138138
[Reducer(ReducerKind.ClientConnected)]
139139
public static void Connect(ReducerContext ctx)
140140
{
141-
var player = ctx.Db.logged_out_player.identity.Find(ctx.Sender);
141+
var player = ctx.Db.logged_out_player.identity.Find(ctx.Sender());
142142
if (player != null)
143143
{
144144
ctx.Db.player.Insert(player.Value);
@@ -157,7 +157,7 @@ public static void Connect(ReducerContext ctx)
157157
{
158158
ctx.Db.player.Insert(new Player
159159
{
160-
identity = ctx.Sender,
160+
identity = ctx.Sender(),
161161
name = "",
162162
});
163163
}
@@ -166,7 +166,7 @@ public static void Connect(ReducerContext ctx)
166166
[Reducer(ReducerKind.ClientDisconnected)]
167167
public static void Disconnect(ReducerContext ctx)
168168
{
169-
var player = ctx.Db.player.identity.Find(ctx.Sender) ?? throw new Exception("Player not found");
169+
var player = ctx.Db.player.identity.Find(ctx.Sender()) ?? throw new Exception("Player not found");
170170
foreach (var circle in ctx.Db.circle.player_id.Filter(player.player_id))
171171
{
172172
var entity = ctx.Db.entity.entity_id.Find(circle.entity_id) ?? throw new Exception("Could not find circle");
@@ -183,7 +183,7 @@ public static void Disconnect(ReducerContext ctx)
183183
public static void EnterGame(ReducerContext ctx, string name)
184184
{
185185
Log.Info($"Creating player with name {name}");
186-
var player = ctx.Db.player.identity.Find(ctx.Sender) ?? throw new Exception("Player not found");
186+
var player = ctx.Db.player.identity.Find(ctx.Sender()) ?? throw new Exception("Player not found");
187187
player.name = name;
188188
ctx.Db.player.identity.Update(player);
189189
SpawnPlayerInitialCircle(ctx, player.player_id);
@@ -192,15 +192,15 @@ public static void EnterGame(ReducerContext ctx, string name)
192192
[Reducer]
193193
public static void Respawn(ReducerContext ctx)
194194
{
195-
var player = ctx.Db.player.identity.Find(ctx.Sender) ?? throw new Exception("No such player found");
195+
var player = ctx.Db.player.identity.Find(ctx.Sender()) ?? throw new Exception("No such player found");
196196

197197
SpawnPlayerInitialCircle(ctx, player.player_id);
198198
}
199199

200200
[Reducer]
201201
public static void Suicide(ReducerContext ctx)
202202
{
203-
var player = ctx.Db.player.identity.Find(ctx.Sender) ?? throw new Exception("No such player found");
203+
var player = ctx.Db.player.identity.Find(ctx.Sender()) ?? throw new Exception("No such player found");
204204

205205
foreach (var circle in ctx.Db.circle.player_id.Filter(player.player_id))
206206
{
@@ -246,7 +246,7 @@ public static Entity SpawnCircleAt(ReducerContext ctx, int player_id, int mass,
246246
[Reducer]
247247
public static void UpdatePlayerInput(ReducerContext ctx, DbVector2 direction)
248248
{
249-
var player = ctx.Db.player.identity.Find(ctx.Sender) ?? throw new Exception("Player not found");
249+
var player = ctx.Db.player.identity.Find(ctx.Sender()) ?? throw new Exception("Player not found");
250250
foreach (var c in ctx.Db.circle.player_id.Filter(player.player_id))
251251
{
252252
var circle = c;
@@ -449,7 +449,7 @@ public static void DestroyEntity(ReducerContext ctx, int entityId)
449449
[Reducer]
450450
public static void PlayerSplit(ReducerContext ctx)
451451
{
452-
var player = ctx.Db.player.identity.Find(ctx.Sender) ?? throw new Exception("Sender has no player");
452+
var player = ctx.Db.player.identity.Find(ctx.Sender()) ?? throw new Exception("Sender has no player");
453453
List<Circle> circles = ctx.Db.circle.player_id.Filter(player.player_id).ToList();
454454
var circle_count = circles.Count;
455455
if (circle_count >= MAX_CIRCLES_PER_PLAYER)

modules/module-test-cs/Lib.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -219,7 +219,7 @@ static partial class Module
219219
[View(Name = "my_player", Public = true)]
220220
public static Player? my_player(ViewContext ctx)
221221
{
222-
return (Player?)ctx.Db.player.identity.Find(ctx.Sender);
222+
return (Player?)ctx.Db.player.identity.Find(ctx.Sender());
223223
}
224224

225225
// This reducer is run at module initialization.
@@ -278,7 +278,7 @@ public static void log_module_identity(ReducerContext ctx)
278278
public static void test(ReducerContext ctx, TestAlias arg, TestB arg2, TestC arg3, TestF arg4)
279279
{
280280
Log.Info("BEGIN");
281-
Log.Info($"sender: {ctx.Sender}");
281+
Log.Info($"sender: {ctx.Sender()}");
282282
Log.Info($"timestamp: {ctx.Timestamp}");
283283
Log.Info($"bar: {arg2.foo}");
284284

@@ -462,7 +462,7 @@ public static void test_btree_index_args(ReducerContext ctx)
462462
[Reducer]
463463
public static void assert_caller_identity_is_module_identity(ReducerContext ctx)
464464
{
465-
var caller = ctx.Sender;
465+
var caller = ctx.Sender();
466466
var owner = ctx.Identity;
467467
if (!caller.Equals(owner))
468468
{

modules/sdk-test-connect-disconnect-cs/Lib.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -19,12 +19,12 @@ static partial class Module
1919
[SpacetimeDB.Reducer(ReducerKind.ClientConnected)]
2020
public static void identity_connected(ReducerContext ctx)
2121
{
22-
ctx.Db.connected.Insert(new Connected { identity = ctx.Sender});
22+
ctx.Db.connected.Insert(new Connected { identity = ctx.Sender()});
2323
}
2424

2525
[SpacetimeDB.Reducer(ReducerKind.ClientDisconnected)]
2626
public static void identity_disconnected(ReducerContext ctx)
2727
{
28-
ctx.Db.disconnected.Insert(new Disconnected { identity = ctx.Sender});
28+
ctx.Db.disconnected.Insert(new Disconnected { identity = ctx.Sender()});
2929
}
3030
}

modules/sdk-test-cs/Lib.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1887,25 +1887,25 @@ public static void update_pk_simple_enum(ReducerContext ctx, SimpleEnum a, int d
18871887
[SpacetimeDB.Reducer]
18881888
public static void insert_caller_one_identity(ReducerContext ctx)
18891889
{
1890-
ctx.Db.one_identity.Insert(new OneIdentity { i = ctx.Sender });
1890+
ctx.Db.one_identity.Insert(new OneIdentity { i = ctx.Sender() });
18911891
}
18921892

18931893
[SpacetimeDB.Reducer]
18941894
public static void insert_caller_vec_identity(ReducerContext ctx)
18951895
{
1896-
ctx.Db.vec_identity.Insert(new VecIdentity { i = new List<Identity> { ctx.Sender } });
1896+
ctx.Db.vec_identity.Insert(new VecIdentity { i = new List<Identity> { ctx.Sender() } });
18971897
}
18981898

18991899
[SpacetimeDB.Reducer]
19001900
public static void insert_caller_unique_identity(ReducerContext ctx, int data)
19011901
{
1902-
ctx.Db.unique_identity.Insert(new UniqueIdentity { i = ctx.Sender, data = data });
1902+
ctx.Db.unique_identity.Insert(new UniqueIdentity { i = ctx.Sender(), data = data });
19031903
}
19041904

19051905
[SpacetimeDB.Reducer]
19061906
public static void insert_caller_pk_identity(ReducerContext ctx, int data)
19071907
{
1908-
ctx.Db.pk_identity.Insert(new PkIdentity { i = ctx.Sender, data = data });
1908+
ctx.Db.pk_identity.Insert(new PkIdentity { i = ctx.Sender(), data = data });
19091909
}
19101910

19111911
[SpacetimeDB.Reducer]

sdks/csharp/examples~/regression-tests/server/Lib.cs

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -150,13 +150,13 @@ public partial struct NullStringNullable
150150
[SpacetimeDB.View(Name = "my_player", Public = true)]
151151
public static Player? MyPlayer(ViewContext ctx)
152152
{
153-
return ctx.Db.player.Identity.Find(ctx.Sender);
153+
return ctx.Db.player.Identity.Find(ctx.Sender());
154154
}
155155

156156
[SpacetimeDB.View(Name = "my_account", Public = true)]
157157
public static Account? MyAccount(ViewContext ctx)
158158
{
159-
return ctx.Db.account.Identity.Find(ctx.Sender) as Account;
159+
return ctx.Db.account.Identity.Find(ctx.Sender()) as Account;
160160
}
161161

162162
[SpacetimeDB.View(Name = "my_account_missing", Public = true)]
@@ -280,23 +280,23 @@ public static void InsertNullStringIntoNullable(ReducerContext ctx)
280280
[Reducer(ReducerKind.ClientConnected)]
281281
public static void ClientConnected(ReducerContext ctx)
282282
{
283-
Log.Info($"Connect {ctx.Sender}");
283+
Log.Info($"Connect {ctx.Sender()}");
284284

285-
if (ctx.Db.player.Identity.Find(ctx.Sender) is Player player)
285+
if (ctx.Db.player.Identity.Find(ctx.Sender()) is Player player)
286286
{
287287
// We are not logging player login status, so do nothing
288288
}
289289
else
290290
{
291291
// Lets setup a new player with a level of 1
292-
ctx.Db.player.Insert(new Player { Identity = ctx.Sender, Name = "NewPlayer" });
293-
var playerId = (ctx.Db.player.Identity.Find(ctx.Sender)!).Value.Id;
292+
ctx.Db.player.Insert(new Player { Identity = ctx.Sender(), Name = "NewPlayer" });
293+
var playerId = (ctx.Db.player.Identity.Find(ctx.Sender())!).Value.Id;
294294
ctx.Db.player_level.Insert(new PlayerLevel { PlayerId = playerId, Level = 1 });
295295
}
296296

297-
if (ctx.Db.account.Identity.Find(ctx.Sender) is null)
297+
if (ctx.Db.account.Identity.Find(ctx.Sender()) is null)
298298
{
299-
ctx.Db.account.Insert(new Account { Identity = ctx.Sender, Name = "Account" });
299+
ctx.Db.account.Insert(new Account { Identity = ctx.Sender(), Name = "Account" });
300300
}
301301

302302
if (ctx.Db.nullable_vec.Id.Find(1) is null)
@@ -614,10 +614,10 @@ public static ReturnStruct TxContextCapabilities(ProcedureContext ctx)
614614
}
615615

616616
// Test 3: Verify transaction context properties are accessible
617-
var txSender = tx.Sender;
617+
var txSender = tx.Sender();
618618
var txTimestamp = tx.Timestamp;
619619

620-
if (txSender.Equals(ctx.Sender) == false)
620+
if (txSender.Equals(ctx.Sender()) == false)
621621
{
622622
throw new InvalidOperationException("Transaction sender should match procedure sender");
623623
}
@@ -654,14 +654,14 @@ public static ReturnStruct AuthenticationCapabilities(ProcedureContext ctx)
654654
{
655655
// Test 1: Verify authentication context is accessible from procedure context
656656
var procAuth = ctx.SenderAuth;
657-
var procSender = ctx.Sender;
657+
var procSender = ctx.Sender();
658658
var procConnectionId = ctx.ConnectionId;
659659

660660
var result = ctx.WithTx(tx =>
661661
{
662662
// Test 2: Verify authentication context is accessible from transaction context
663663
var txAuth = tx.SenderAuth;
664-
var txSender = tx.Sender;
664+
var txSender = tx.Sender();
665665
var txConnectionId = tx.ConnectionId;
666666

667667
// Test 3: Authentication contexts should be consistent

templates/chat-console-cs/spacetimedb/Lib.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@ public static void SetName(ReducerContext ctx, string name)
2424
{
2525
name = ValidateName(name);
2626

27-
if (ctx.Db.User.Identity.Find(ctx.Sender) is User user)
27+
if (ctx.Db.User.Identity.Find(ctx.Sender()) is User user)
2828
{
2929
user.Name = name;
3030
ctx.Db.User.Identity.Update(user);
@@ -49,7 +49,7 @@ public static void SendMessage(ReducerContext ctx, string text)
4949
ctx.Db.Message.Insert(
5050
new Message
5151
{
52-
Sender = ctx.Sender,
52+
Sender = ctx.Sender(),
5353
Text = text,
5454
Sent = ctx.Timestamp,
5555
}
@@ -69,9 +69,9 @@ private static string ValidateMessage(string text)
6969
[Reducer(ReducerKind.ClientConnected)]
7070
public static void ClientConnected(ReducerContext ctx)
7171
{
72-
Log.Info($"Connect {ctx.Sender}");
72+
Log.Info($"Connect {ctx.Sender()}");
7373

74-
if (ctx.Db.User.Identity.Find(ctx.Sender) is User user)
74+
if (ctx.Db.User.Identity.Find(ctx.Sender()) is User user)
7575
{
7676
// If this is a returning user, i.e., we already have a `User` with this `Identity`,
7777
// set `Online: true`, but leave `Name` and `Identity` unchanged.
@@ -86,7 +86,7 @@ public static void ClientConnected(ReducerContext ctx)
8686
new User
8787
{
8888
Name = null,
89-
Identity = ctx.Sender,
89+
Identity = ctx.Sender(),
9090
Online = true,
9191
}
9292
);
@@ -96,7 +96,7 @@ public static void ClientConnected(ReducerContext ctx)
9696
[Reducer(ReducerKind.ClientDisconnected)]
9797
public static void ClientDisconnected(ReducerContext ctx)
9898
{
99-
if (ctx.Db.User.Identity.Find(ctx.Sender) is User user)
99+
if (ctx.Db.User.Identity.Find(ctx.Sender()) is User user)
100100
{
101101
// This user should exist, so set `Online: false`.
102102
user.Online = false;

0 commit comments

Comments
 (0)