Skip to content

Commit 5ea9ee0

Browse files
committed
implement websocket ids-no-names (take 2) in c#
1 parent d2ee667 commit 5ea9ee0

14 files changed

+297
-77
lines changed

examples~/quickstart/client/client.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
<PropertyGroup>
44
<OutputType>Exe</OutputType>
55
<TargetFramework>net7.0</TargetFramework>
6+
<CheckEolTargetFramework>false</CheckEolTargetFramework>
67
<ImplicitUsings>disable</ImplicitUsings>
78
<Nullable>enable</Nullable>
89

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE
2+
// WILL NOT BE SAVED. MODIFY TABLES IN RUST INSTEAD.
3+
// <auto-generated />
4+
5+
#nullable enable
6+
7+
using System;
8+
using SpacetimeDB;
9+
10+
namespace SpacetimeDB.Types
11+
{
12+
[SpacetimeDB.Type]
13+
public partial class IdentityConnected : IReducerArgs
14+
{
15+
string IReducerArgs.ReducerName => "__identity_connected__";
16+
}
17+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE
2+
// WILL NOT BE SAVED. MODIFY TABLES IN RUST INSTEAD.
3+
// <auto-generated />
4+
5+
#nullable enable
6+
7+
using System;
8+
using SpacetimeDB;
9+
10+
namespace SpacetimeDB.Types
11+
{
12+
[SpacetimeDB.Type]
13+
public partial class IdentityDisconnected : IReducerArgs
14+
{
15+
string IReducerArgs.ReducerName => "__identity_disconnected__";
16+
}
17+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
// THIS FILE IS AUTOMATICALLY GENERATED BY SPACETIMEDB. EDITS TO THIS FILE
2+
// WILL NOT BE SAVED. MODIFY TABLES IN RUST INSTEAD.
3+
// <auto-generated />
4+
5+
#nullable enable
6+
7+
using System;
8+
using SpacetimeDB;
9+
10+
namespace SpacetimeDB.Types
11+
{
12+
[SpacetimeDB.Type]
13+
public partial class Init : IReducerArgs
14+
{
15+
string IReducerArgs.ReducerName => "__init__";
16+
}
17+
}

examples~/quickstart/client/module_bindings/_Globals/SpacetimeDBClient.cs

Lines changed: 74 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -25,30 +25,30 @@ internal MessageHandle()
2525

2626
public class UserHandle : RemoteTableHandle<EventContext, User>
2727
{
28-
private static Dictionary<SpacetimeDB.Identity, User> Identity_Index = new(16);
2928

3029
public override void InternalInvokeValueInserted(IDatabaseRow row)
3130
{
3231
var value = (User)row;
33-
Identity_Index[value.Identity] = value;
32+
Identity.Cache[value.Identity] = value;
3433
}
3534

3635
public override void InternalInvokeValueDeleted(IDatabaseRow row)
3736
{
38-
Identity_Index.Remove(((User)row).Identity);
37+
Identity.Cache.Remove(((User)row).Identity);
3938
}
4039

41-
public readonly ref struct IdentityUniqueIndex
40+
public class IdentityUniqueIndex
4241
{
42+
internal readonly Dictionary<SpacetimeDB.Identity, User> Cache = new(16);
4343
public User? Find(SpacetimeDB.Identity value)
4444
{
45-
Identity_Index.TryGetValue(value, out var r);
45+
Cache.TryGetValue(value, out var r);
4646
return r;
4747
}
4848

4949
}
5050

51-
public IdentityUniqueIndex Identity => new();
51+
public IdentityUniqueIndex Identity = new();
5252

5353
internal UserHandle()
5454
{
@@ -65,6 +65,54 @@ public sealed class RemoteReducers : RemoteBase<DbConnection>
6565
{
6666
internal RemoteReducers(DbConnection conn, SetReducerFlags SetReducerFlags) : base(conn) { this.SetCallReducerFlags = SetReducerFlags; }
6767
internal readonly SetReducerFlags SetCallReducerFlags;
68+
public delegate void IdentityConnectedHandler(EventContext ctx);
69+
public event IdentityConnectedHandler? OnIdentityConnected;
70+
71+
public void IdentityConnected()
72+
{
73+
conn.InternalCallReducer(new IdentityConnected { }, this.SetCallReducerFlags.IdentityConnectedFlags);
74+
}
75+
76+
public bool InvokeIdentityConnected(EventContext ctx, IdentityConnected args)
77+
{
78+
if (OnIdentityConnected == null) return false;
79+
OnIdentityConnected(
80+
ctx
81+
);
82+
return true;
83+
}
84+
public delegate void IdentityDisconnectedHandler(EventContext ctx);
85+
public event IdentityDisconnectedHandler? OnIdentityDisconnected;
86+
87+
public void IdentityDisconnected()
88+
{
89+
conn.InternalCallReducer(new IdentityDisconnected { }, this.SetCallReducerFlags.IdentityDisconnectedFlags);
90+
}
91+
92+
public bool InvokeIdentityDisconnected(EventContext ctx, IdentityDisconnected args)
93+
{
94+
if (OnIdentityDisconnected == null) return false;
95+
OnIdentityDisconnected(
96+
ctx
97+
);
98+
return true;
99+
}
100+
public delegate void InitHandler(EventContext ctx);
101+
public event InitHandler? OnInit;
102+
103+
public void Init()
104+
{
105+
conn.InternalCallReducer(new Init { }, this.SetCallReducerFlags.InitFlags);
106+
}
107+
108+
public bool InvokeInit(EventContext ctx, Init args)
109+
{
110+
if (OnInit == null) return false;
111+
OnInit(
112+
ctx
113+
);
114+
return true;
115+
}
68116
public delegate void SendMessageHandler(EventContext ctx, string text);
69117
public event SendMessageHandler? OnSendMessage;
70118

@@ -104,6 +152,12 @@ public bool InvokeSetName(EventContext ctx, SetName args)
104152
public sealed class SetReducerFlags
105153
{
106154
internal SetReducerFlags() { }
155+
internal CallReducerFlags IdentityConnectedFlags;
156+
public void IdentityConnected(CallReducerFlags flags) { this.IdentityConnectedFlags = flags; }
157+
internal CallReducerFlags IdentityDisconnectedFlags;
158+
public void IdentityDisconnected(CallReducerFlags flags) { this.IdentityDisconnectedFlags = flags; }
159+
internal CallReducerFlags InitFlags;
160+
public void Init(CallReducerFlags flags) { this.InitFlags = flags; }
107161
internal CallReducerFlags SendMessageFlags;
108162
public void SendMessage(CallReducerFlags flags) { this.SendMessageFlags = flags; }
109163
internal CallReducerFlags SetNameFlags;
@@ -126,11 +180,12 @@ internal EventContext(DbConnection conn, Event<Reducer> reducerEvent) : base(con
126180

127181
[Type]
128182
public partial record Reducer : TaggedEnum<(
183+
IdentityConnected IdentityConnected,
184+
IdentityDisconnected IdentityDisconnected,
185+
Init Init,
129186
SendMessage SendMessage,
130187
SetName SetName,
131-
Unit StdbNone,
132-
Unit StdbIdentityConnected,
133-
Unit StdbIdentityDisconnected
188+
Unit StdbNone
134189
)>;
135190
public class DbConnection : DbConnectionBase<DbConnection, Reducer>
136191
{
@@ -147,17 +202,16 @@ public DbConnection()
147202
clientDB.AddTable<User>("user", Db.User);
148203
}
149204

150-
protected override Reducer ToReducer(TransactionUpdate update)
205+
protected override Reducer ToReducer(string reducerName, TransactionUpdate update)
151206
{
152207
var encodedArgs = update.ReducerCall.Args;
153-
return update.ReducerCall.ReducerName switch
154-
{
208+
return reducerName switch {
209+
"__identity_connected__" => new Reducer.IdentityConnected(BSATNHelpers.Decode<IdentityConnected>(encodedArgs)),
210+
"__identity_disconnected__" => new Reducer.IdentityDisconnected(BSATNHelpers.Decode<IdentityDisconnected>(encodedArgs)),
211+
"__init__" => new Reducer.Init(BSATNHelpers.Decode<Init>(encodedArgs)),
155212
"send_message" => new Reducer.SendMessage(BSATNHelpers.Decode<SendMessage>(encodedArgs)),
156213
"set_name" => new Reducer.SetName(BSATNHelpers.Decode<SetName>(encodedArgs)),
157214
"<none>" => new Reducer.StdbNone(default),
158-
"__identity_connected__" => new Reducer.StdbIdentityConnected(default),
159-
"__identity_disconnected__" => new Reducer.StdbIdentityDisconnected(default),
160-
"" => new Reducer.StdbNone(default),
161215
var reducer => throw new ArgumentOutOfRangeException("Reducer", $"Unknown reducer {reducer}")
162216
};
163217
}
@@ -168,13 +222,13 @@ protected override IEventContext ToEventContext(Event<Reducer> reducerEvent) =>
168222
protected override bool Dispatch(IEventContext context, Reducer reducer)
169223
{
170224
var eventContext = (EventContext)context;
171-
return reducer switch
172-
{
225+
return reducer switch {
226+
Reducer.IdentityConnected(var args) => Reducers.InvokeIdentityConnected(eventContext, args),
227+
Reducer.IdentityDisconnected(var args) => Reducers.InvokeIdentityDisconnected(eventContext, args),
228+
Reducer.Init(var args) => Reducers.InvokeInit(eventContext, args),
173229
Reducer.SendMessage(var args) => Reducers.InvokeSendMessage(eventContext, args),
174230
Reducer.SetName(var args) => Reducers.InvokeSetName(eventContext, args),
175-
Reducer.StdbNone or
176-
Reducer.StdbIdentityConnected or
177-
Reducer.StdbIdentityDisconnected => true,
231+
Reducer.StdbNone => true,
178232
_ => throw new ArgumentOutOfRangeException("Reducer", $"Unknown reducer {reducer}")
179233
};
180234
}
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
#nullable enable
2+
3+
using System;
4+
using SpacetimeDB;
5+
using System.Collections.Generic;
6+
using System.Runtime.Serialization;
7+
8+
namespace SpacetimeDB.ClientApi
9+
{
10+
[SpacetimeDB.Type]
11+
[DataContract]
12+
public partial class AfterConnecting
13+
{
14+
[DataMember(Name = "identity_token")]
15+
public SpacetimeDB.ClientApi.IdentityToken IdentityToken;
16+
[DataMember(Name = "ids_to_names")]
17+
public SpacetimeDB.ClientApi.IdsToNames IdsToNames;
18+
19+
public AfterConnecting(
20+
SpacetimeDB.ClientApi.IdentityToken IdentityToken,
21+
SpacetimeDB.ClientApi.IdsToNames IdsToNames
22+
)
23+
{
24+
this.IdentityToken = IdentityToken;
25+
this.IdsToNames = IdsToNames;
26+
}
27+
28+
public AfterConnecting()
29+
{
30+
this.IdentityToken = new();
31+
this.IdsToNames = new();
32+
}
33+
34+
}
35+
}

src/SpacetimeDB/ClientApi/CallReducer.cs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,8 @@ namespace SpacetimeDB.ClientApi
1515
[DataContract]
1616
public partial class CallReducer
1717
{
18-
[DataMember(Name = "reducer")]
19-
public string Reducer;
18+
[DataMember(Name = "reducer_id")]
19+
public uint ReducerId;
2020
[DataMember(Name = "args")]
2121
public byte[] Args;
2222
[DataMember(Name = "request_id")]
@@ -25,21 +25,20 @@ public partial class CallReducer
2525
public byte Flags;
2626

2727
public CallReducer(
28-
string Reducer,
28+
uint ReducerId,
2929
byte[] Args,
3030
uint RequestId,
3131
byte Flags
3232
)
3333
{
34-
this.Reducer = Reducer;
34+
this.ReducerId = ReducerId;
3535
this.Args = Args;
3636
this.RequestId = RequestId;
3737
this.Flags = Flags;
3838
}
3939

4040
public CallReducer()
4141
{
42-
this.Reducer = "";
4342
this.Args = Array.Empty<byte>();
4443
}
4544

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
#nullable enable
2+
3+
using System;
4+
using SpacetimeDB;
5+
using System.Collections.Generic;
6+
using System.Runtime.Serialization;
7+
8+
namespace SpacetimeDB.ClientApi
9+
{
10+
[SpacetimeDB.Type]
11+
[DataContract]
12+
public partial class IdsToNames
13+
{
14+
[DataMember(Name = "reducer_ids")]
15+
public System.Collections.Generic.List<uint> ReducerIds;
16+
[DataMember(Name = "reducer_names")]
17+
public System.Collections.Generic.List<string> ReducerNames;
18+
[DataMember(Name = "table_ids")]
19+
public System.Collections.Generic.List<uint> TableIds;
20+
[DataMember(Name = "table_names")]
21+
public System.Collections.Generic.List<string> TableNames;
22+
23+
public IdsToNames(
24+
System.Collections.Generic.List<uint> ReducerIds,
25+
System.Collections.Generic.List<string> ReducerNames,
26+
System.Collections.Generic.List<uint> TableIds,
27+
System.Collections.Generic.List<string> TableNames
28+
)
29+
{
30+
this.ReducerIds = ReducerIds;
31+
this.ReducerNames = ReducerNames;
32+
this.TableIds = TableIds;
33+
this.TableNames = TableNames;
34+
}
35+
36+
public IdsToNames()
37+
{
38+
ReducerIds = new();
39+
ReducerNames = new();
40+
TableIds = new();
41+
TableNames = new();
42+
}
43+
44+
}
45+
}

src/SpacetimeDB/ClientApi/OneOffTable.cs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -15,23 +15,22 @@ namespace SpacetimeDB.ClientApi
1515
[DataContract]
1616
public partial class OneOffTable
1717
{
18-
[DataMember(Name = "table_name")]
19-
public string TableName;
18+
[DataMember(Name = "table_id")]
19+
public uint TableId;
2020
[DataMember(Name = "rows")]
2121
public SpacetimeDB.ClientApi.BsatnRowList Rows;
2222

2323
public OneOffTable(
24-
string TableName,
24+
uint TableId,
2525
SpacetimeDB.ClientApi.BsatnRowList Rows
2626
)
2727
{
28-
this.TableName = TableName;
28+
this.TableId = TableId;
2929
this.Rows = Rows;
3030
}
3131

3232
public OneOffTable()
3333
{
34-
this.TableName = "";
3534
this.Rows = new();
3635
}
3736

0 commit comments

Comments
 (0)