Skip to content

Commit 767dfcf

Browse files
committed
feat: libp2p, wasm ios and git lfs for libs
1 parent 47283c3 commit 767dfcf

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

50 files changed

+27163
-23950
lines changed

.gitattributes

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,3 @@
1-
Assets/WebGLTemplates/TemplateData/* linguist-vendored
1+
Assets/WebGLTemplates/TemplateData/* linguist-vendored
2+
*.dll filter=lfs diff=lfs merge=lfs -text
3+
*.a filter=lfs diff=lfs merge=lfs -text

.gitignore

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,4 +71,10 @@ crashlytics-build.properties
7171
/[Aa]ssets/[Ss]treamingAssets/aa.meta
7272
/[Aa]ssets/[Ss]treamingAssets/aa/*
7373

74-
.DS_Store
74+
.DS_Store
75+
76+
# builds
77+
dojo-webgl
78+
dojo-ios
79+
dojo-macos
80+
dojo-windows

Assets/Dojo/.DS_Store

0 Bytes
Binary file not shown.
Binary file not shown.
Binary file not shown.

Assets/Dojo/Libraries/x86_64-unknown-linux-gnu.meta

Lines changed: 0 additions & 8 deletions
This file was deleted.

Assets/Dojo/Libraries.meta renamed to Assets/Dojo/Plugins/Linux.meta

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Assets/Dojo/Libraries/x86_64-unknown-linux-gnu/libdojo_c.so.meta renamed to Assets/Dojo/Plugins/Linux/libdojo_c.so.meta

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Assets/Dojo/Libraries/aarch64-apple-darwin.meta renamed to Assets/Dojo/Plugins/Windows.meta

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
version https://git-lfs.github.com/spec/v1
2+
oid sha256:b3a0bf9852c12b00f5da6355e1fb4ea184023cc2a034a985cab0801e580f5a1f
3+
size 56730668

Assets/Dojo/Libraries/x86_64-pc-windows-gnu/libdojo_c.dll.meta renamed to Assets/Dojo/Plugins/Windows/libdojo_c.dll.meta

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Assets/Dojo/Libraries/x86_64-apple-darwin.meta renamed to Assets/Dojo/Plugins/iOS.meta

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Assets/Dojo/Plugins/iOS/libdojo_c.a

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
version https://git-lfs.github.com/spec/v1
2+
oid sha256:ea302729331d5f3c3980d97afe2bedba738e7c071b03e51b547c1a19e7237b00
3+
size 287884432

Assets/Dojo/Libraries/x86_64-apple-darwin/libdojo_c.dylib.meta renamed to Assets/Dojo/Plugins/iOS/libdojo_c.dylib.meta

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Assets/Dojo/Libraries/x86_64-pc-windows-gnu.meta renamed to Assets/Dojo/Plugins/macOS.meta

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
32.1 MB
Binary file not shown.

Assets/Dojo/Libraries/aarch64-apple-darwin/libdojo_c.dylib.meta renamed to Assets/Dojo/Plugins/macOS/libdojo_c.bundle.meta

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Assets/Dojo/Runtime/SynchronizationMaster.cs

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -131,11 +131,6 @@ private void HandleEntityUpdate(FieldElement hashedKeys, Model[] entityModels)
131131
// Register our entity callbacks
132132
public void RegisterEntityCallbacks()
133133
{
134-
#if UNITY_WEBGL && !UNITY_EDITOR
135-
worldManager.wasmClient.RegisterEntityStateUpdates(new FieldElement[] { });
136-
#else
137-
worldManager.toriiClient.RegisterEntityStateUpdates(new dojo.FieldElement[] { });
138-
#endif
139134
ToriiEvents.Instance.OnEntityUpdated += HandleEntityUpdate;
140135
}
141136
}

Assets/Dojo/Runtime/Torii/ToriiClient.cs

Lines changed: 72 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -6,27 +6,37 @@
66
using dojo_bindings;
77
using JetBrains.Annotations;
88
using Dojo.Starknet;
9+
using UnityEditor.AppleTV;
910
namespace Dojo.Torii
1011
{
1112
public unsafe class ToriiClient
1213
{
13-
private dojo.FnPtr_FieldElement_CArrayModel_Void.@delegate entityStateUpdateHandler;
14-
private dojo.FnPtr_Void.@delegate syncModelUpdateHandler;
14+
private dojo.FnPtr_FieldElement_CArrayModel_Void.@delegate onEntityStateUpdate;
15+
private dojo.FnPtr_Void.@delegate onSyncModelUpdate;
16+
private dojo.FnPtr_CString_CString_CString_CString_CArrayu8_Void.@delegate onMessage;
1517
private dojo.ToriiClient* client;
1618

17-
public ToriiClient(string toriiUrl, string rpcUrl, string world)
19+
public ToriiClient(string toriiUrl, string rpcUrl, string relayUrl, string world)
1820
{
1921
CString ctoriiUrl = CString.FromString(toriiUrl);
2022
CString crpcUrl = CString.FromString(rpcUrl);
23+
CString crelayUrl = CString.FromString(relayUrl);
2124
CString cworld = CString.FromString(world);
22-
23-
var result = dojo.client_new(ctoriiUrl, crpcUrl, cworld, (dojo.KeysClause*)0, (UIntPtr)0);
25+
26+
var result = dojo.client_new(ctoriiUrl, crpcUrl, crelayUrl, cworld, (dojo.KeysClause*)0, (UIntPtr)0);
2427
if (result.tag == dojo.ResultToriiClient_Tag.ErrToriiClient)
2528
{
2629
throw new Exception(result.err.message);
2730
}
2831

2932
client = result._ok;
33+
34+
// start event loops & register events
35+
StartSubscription();
36+
RunLibp2p();
37+
38+
RegisterEntityStateUpdateEvent(new dojo.FieldElement[] { });
39+
RegisterOnMessageEvent();
3040
}
3141

3242
// We assume the torii client won't be copied around.
@@ -44,25 +54,26 @@ public dojo.WorldMetadata WorldMetadata()
4454
return worldMetadata;
4555
}
4656

47-
[CanBeNull]
48-
public Ty Model(dojo.KeysClause query)
49-
{
50-
dojo.ResultCOptionTy result = dojo.client_model(client, &query);
51-
if (result.tag == dojo.ResultCOptionTy_Tag.ErrCOptionTy)
52-
{
53-
throw new Exception(result.err.message);
54-
}
55-
56-
// can be None - nullable
57-
if (result.ok.tag == dojo.COptionTy_Tag.NoneTy)
58-
{
59-
return null;
60-
}
61-
62-
// we instantiate a new managed Ty object
63-
// which will free the underlying c ty when it is garbage collected
64-
return new Ty(result.ok._some);
65-
}
57+
// NOT USED? potentially deprecated
58+
// [CanBeNull]
59+
// public Model Model(dojo.KeysClause query)
60+
// {
61+
// dojo.ResultCOptionTy result = dojo.client_model(client, &query);
62+
// if (result.tag == dojo.ResultCOptionTy_Tag.ErrCOptionTy)
63+
// {
64+
// throw new Exception(result.err.message);
65+
// }
66+
67+
// // can be None - nullable
68+
// if (result.ok.tag == dojo.COptionTy_Tag.NoneTy)
69+
// {
70+
// return null;
71+
// }
72+
73+
// // we instantiate a new managed Ty object
74+
// // which will free the underlying c ty when it is garbage collected
75+
// return new Ty(result.ok._some.);
76+
// }
6677

6778
public List<Entity> Entities(dojo.Query query)
6879
{
@@ -76,7 +87,7 @@ public List<Entity> Entities(dojo.Query query)
7687
for (var i = 0; i < (int)result._ok.data_len; i++)
7788
{
7889
entities.Add(new Entity(result._ok.data[i]));
79-
// dojo.entity_free(&result._ok.data[i]);
90+
dojo.entity_free(&result._ok.data[i]);
8091
}
8192

8293
dojo.carray_free(result._ok.data, result._ok.data_len);
@@ -132,9 +143,9 @@ public void RemoveModelsToSync(dojo.KeysClause[] models)
132143
}
133144
}
134145

135-
public void RegisterSyncModelUpdates(dojo.KeysClause model, bool dispatchToMainThread = true)
146+
public void RegisterSyncModelUpdateEvent(dojo.KeysClause model, bool dispatchToMainThread = true)
136147
{
137-
syncModelUpdateHandler = () =>
148+
onSyncModelUpdate = () =>
138149
{
139150
if (dispatchToMainThread)
140151
{
@@ -146,14 +157,14 @@ public void RegisterSyncModelUpdates(dojo.KeysClause model, bool dispatchToMainT
146157
}
147158
};
148159

149-
dojo.Resultbool res = dojo.client_on_sync_model_update(client, model, new dojo.FnPtr_Void(syncModelUpdateHandler));
160+
dojo.Resultbool res = dojo.client_on_sync_model_update(client, model, new dojo.FnPtr_Void(onSyncModelUpdate));
150161
if (res.tag == dojo.Resultbool_Tag.Errbool)
151162
{
152163
throw new Exception(res.err.message);
153164
}
154165
}
155166

156-
public void RegisterEntityStateUpdates(dojo.FieldElement[] entities, bool dispatchToMainThread = true)
167+
private void RegisterEntityStateUpdateEvent(dojo.FieldElement[] entities, bool dispatchToMainThread = true)
157168
{
158169
dojo.FieldElement* entitiesPtr;
159170

@@ -162,17 +173,16 @@ public void RegisterEntityStateUpdates(dojo.FieldElement[] entities, bool dispat
162173
entitiesPtr = ptr;
163174
}
164175

165-
entityStateUpdateHandler = (key, models) =>
176+
onEntityStateUpdate = (key, models) =>
166177
{
167178
var mappedModels = new Model[(int)models.data_len];
168179
for (var i = 0; i < (int)models.data_len; i++)
169180
{
170181
mappedModels[i] = new Model(models.data[i]);
171-
// TODO: free the c model
172-
// dojo.model_free(&models.data[i]);
182+
// cleanup model
183+
dojo.model_free(&models.data[i]);
173184
}
174185

175-
dojo.carray_free(models.data, models.data_len);
176186
// only run this when in unity play mode
177187
// we need our unity main thread dispatcher to run this on the main thread
178188
if (dispatchToMainThread)
@@ -183,36 +193,42 @@ public void RegisterEntityStateUpdates(dojo.FieldElement[] entities, bool dispat
183193
{
184194
ToriiEvents.Instance.EntityUpdated(new FieldElement(key), mappedModels);
185195
}
196+
197+
// cleanup
198+
dojo.carray_free(models.data, models.data_len);
199+
// TODO: free field element
186200
};
187201

188202

189203
// dojo.FnPtr_FieldElement_CArrayModel_Void.@delegate callbackHandler = HandleEntityStateUpdate;
190-
dojo.Resultbool res = dojo.client_on_entity_state_update(client, entitiesPtr, (nuint)entities.Length, new dojo.FnPtr_FieldElement_CArrayModel_Void(entityStateUpdateHandler));
204+
dojo.Resultbool res = dojo.client_on_entity_state_update(client, entitiesPtr, (nuint)entities.Length, new dojo.FnPtr_FieldElement_CArrayModel_Void(onEntityStateUpdate));
191205
if (res.tag == dojo.Resultbool_Tag.Errbool)
192206
{
193207
throw new Exception(res.err.message);
194208
}
195209
}
196-
197-
public void OnEntityStateUpdateRaw(dojo.FieldElement[] entities, dojo.FnPtr_FieldElement_CArrayModel_Void.@delegate callbackHandler)
210+
private void RegisterOnMessageEvent(bool dispatchToMainThread = true)
198211
{
199-
dojo.FieldElement* entitiesPtr;
200-
201-
fixed (dojo.FieldElement* ptr = entities)
212+
onMessage = (CString propagationSource, CString source, CString messageId, CString topic, dojo.CArrayu8 data) =>
202213
{
203-
entitiesPtr = ptr;
204-
}
214+
if (dispatchToMainThread)
215+
{
216+
UnityMainThreadDispatcher.Instance().Enqueue(() => ToriiEvents.Instance.Message(propagationSource.ToString(), source.ToString(), messageId.ToString(), topic.ToString(), new Span<byte>(data.data, (int)data.data_len).ToArray()));
217+
}
218+
else
219+
{
220+
ToriiEvents.Instance.Message(propagationSource.ToString(), source.ToString(), messageId.ToString(), topic.ToString(), new Span<byte>(data.data, (int)data.data_len).ToArray());
221+
}
205222

206-
dojo.Resultbool res = dojo.client_on_entity_state_update(client, entitiesPtr, (nuint)entities.Length, new dojo.FnPtr_FieldElement_CArrayModel_Void(callbackHandler));
207-
if (res.tag == dojo.Resultbool_Tag.Errbool)
208-
{
209-
throw new Exception(res.err.message);
210-
}
211-
}
223+
// cleanup
224+
dojo.string_free(propagationSource);
225+
dojo.string_free(source);
226+
dojo.string_free(messageId);
227+
dojo.string_free(topic);
228+
dojo.carray_free(data.data, data.data_len);
229+
};
212230

213-
public void OnSyncModelUpdateRaw(dojo.KeysClause model, dojo.FnPtr_Void.@delegate callbackHandler)
214-
{
215-
dojo.Resultbool res = dojo.client_on_sync_model_update(client, model, new dojo.FnPtr_Void(callbackHandler));
231+
dojo.Resultbool res = dojo.client_on_message(client, new dojo.FnPtr_CString_CString_CString_CString_CArrayu8_Void(onMessage));
216232
if (res.tag == dojo.Resultbool_Tag.Errbool)
217233
{
218234
throw new Exception(res.err.message);
@@ -227,5 +243,11 @@ public void StartSubscription()
227243
throw new Exception(result.err.message);
228244
}
229245
}
246+
247+
public void RunLibp2p()
248+
{
249+
dojo.client_run_libp2p(client);
250+
}
251+
230252
}
231253
}

Assets/Dojo/Runtime/Torii/ToriiEvents.cs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using System;
12
using Dojo.Starknet;
23
using dojo_bindings;
34

@@ -22,9 +23,11 @@ public static ToriiEvents Instance
2223

2324
public delegate void OnSyncModelUpdateDelegate();
2425
public delegate void OnEntityStateUpdateDelegate(FieldElement key, Model[] models);
26+
public delegate void OnMessageDelegate(string propagationSource, string source, string messageId, string topic, Span<byte> data);
2527

2628
public event OnEntityStateUpdateDelegate OnEntityUpdated;
2729
public event OnSyncModelUpdateDelegate OnSyncModelUpdated;
30+
public event OnMessageDelegate OnMessage;
2831

2932
public void EntityUpdated(FieldElement key, Model[] models)
3033
{
@@ -35,5 +38,10 @@ public void SyncModelUpdated()
3538
{
3639
OnSyncModelUpdated?.Invoke();
3740
}
41+
42+
public void Message(string propagationSource, string source, string messageId, string topic, Span<byte> data)
43+
{
44+
OnMessage?.Invoke(propagationSource, source, messageId, topic, data);
45+
}
3846
}
3947
}

Assets/Dojo/Runtime/Torii/ToriiWasmClient.cs

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,17 +26,13 @@ public ToriiWasmClient(string toriiUrl, string rpcUrl, string world)
2626
public async Task CreateClient()
2727
{
2828
clientPtr = await ToriiWasmInterop.CreateClientAsync(rpcUrl, toriiUrl, world);
29+
ToriiWasmInterop.OnEntityUpdated(clientPtr, new FieldElement[] { });
2930
}
3031

3132
public async Task<List<Entity>> Entities(int limit, int offset)
3233
{
3334
var entities = await ToriiWasmInterop.GetEntitiesAsync(clientPtr, limit, offset);
3435
return entities;
3536
}
36-
37-
public void RegisterEntityStateUpdates(FieldElement[] entities)
38-
{
39-
ToriiWasmInterop.OnEntityUpdated(clientPtr, entities);
40-
}
4137
}
4238
}

0 commit comments

Comments
 (0)