Skip to content

Commit 1687d88

Browse files
authored
Fix client events not being called from the main thread (#151)
1 parent 094f99c commit 1687d88

4 files changed

Lines changed: 54 additions & 7 deletions

File tree

Assets/Plugins/StreamChat/Core/StreamChatClient.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -562,7 +562,7 @@ void IStreamChatClientEventsListener.Destroy()
562562
}
563563

564564
Dispose();
565-
});
565+
}, TaskScheduler.FromCurrentSynchronizationContext());
566566
}
567567

568568
void IStreamChatClientEventsListener.Update() => InternalLowLevelClient.Update(_timeService.DeltaTime);
@@ -886,7 +886,7 @@ private void OnAddedToChannelNotification(NotificationAddedToChannelEventInterna
886886
}
887887

888888
AddedToChannelAsMember?.Invoke(channel, member);
889-
});
889+
}, TaskScheduler.FromCurrentSynchronizationContext());
890890
}
891891

892892
private void OnRemovedFromChannelNotification(
@@ -914,7 +914,7 @@ private void OnRemovedFromChannelNotification(
914914
}
915915

916916
RemovedFromChannelAsMember?.Invoke(channel, member);
917-
});
917+
}, TaskScheduler.FromCurrentSynchronizationContext());
918918
}
919919

920920
private void OnInvitedNotification(NotificationInvitedEventInternalDTO eventDto)
@@ -940,7 +940,7 @@ private void OnInvitedNotification(NotificationInvitedEventInternalDTO eventDto)
940940
}
941941

942942
ChannelInviteReceived?.Invoke(channel, user);
943-
});
943+
}, TaskScheduler.FromCurrentSynchronizationContext());
944944
}
945945

946946
private void OnInviteAcceptedNotification(NotificationInviteAcceptedEventInternalDTO eventDto)
@@ -966,7 +966,7 @@ private void OnInviteAcceptedNotification(NotificationInviteAcceptedEventInterna
966966
}
967967

968968
ChannelInviteAccepted?.Invoke(channel, user);
969-
});
969+
}, TaskScheduler.FromCurrentSynchronizationContext());
970970
}
971971

972972
private void OnInviteRejectedNotification(NotificationInviteRejectedEventInternalDTO eventDto)
@@ -992,7 +992,7 @@ private void OnInviteRejectedNotification(NotificationInviteRejectedEventInterna
992992
}
993993

994994
ChannelInviteRejected?.Invoke(channel, user);
995-
});
995+
}, TaskScheduler.FromCurrentSynchronizationContext());
996996
}
997997

998998
private void OnReactionReceived(ReactionNewEventInternalDTO eventDto)

Assets/Plugins/StreamChat/Tests/LowLevelClient/DTOTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ public void DTOs_do_not_use_interfaces()
2727

2828
foreach (var type in streamChatCoreAssembly.GetTypes())
2929
{
30-
if (type.Namespace.IndexOf(DTOKeyword, StringComparison.InvariantCulture) != -1 &&
30+
if (type.Namespace != null && type.Namespace.IndexOf(DTOKeyword, StringComparison.InvariantCulture) != -1 &&
3131
type.Namespace.IndexOf(IgnoredNamespace, StringComparison.InvariantCultureIgnoreCase) == 0)
3232
{
3333
dtoTypes.Add(type);

Assets/Plugins/StreamChat/Tests/StatefulClient/BaseStateIntegrationTests.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
using System.Collections.Generic;
55
using System.Diagnostics;
66
using System.Linq;
7+
using System.Threading;
78
using System.Threading.Tasks;
89
using NUnit.Framework;
910
using StreamChat.Core;
@@ -36,6 +37,8 @@ public async void OneTimeTearDown()
3637

3738
protected static StreamChatClient Client => StreamTestClients.Instance.StateClient;
3839

40+
protected int MainThreadId { get; } = Thread.CurrentThread.ManagedThreadId;
41+
3942
// StreamTodo: replace with admin ids fetched from loaded data set
4043
protected const string TestUserId = TestUtils.TestUserId;
4144
protected const string TestAdminId = TestUtils.TestAdminId;
@@ -46,6 +49,8 @@ public async void OneTimeTearDown()
4649
protected static IEnumerable<AuthCredentials> OtherAdminUsersCredentials
4750
=> StreamTestClients.Instance.OtherUserCredentials;
4851

52+
protected int GetCurrentThreadId() => Thread.CurrentThread.ManagedThreadId;
53+
4954
/// <summary>
5055
/// Create temp channel with random id that will be removed in [TearDown]
5156
/// </summary>

Assets/Plugins/StreamChat/Tests/StatefulClient/ChannelMembersTests.cs

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using System.Collections;
33
using System.Collections.Generic;
44
using System.Linq;
5+
using System.Threading;
56
using System.Threading.Tasks;
67
using NUnit.Framework;
78
using StreamChat.Core;
@@ -336,6 +337,39 @@ private async Task When_user_added_to_not_watched_channel_expect_user_receive_ad
336337
Assert.AreEqual(Client.LocalUserData.User, eventMember.User);
337338
}
338339

340+
[UnityTest]
341+
public IEnumerator When_user_added_to_not_watched_channel_expect_user_receive_added_to_channel_event_from_main_thread()
342+
=> ConnectAndExecute(
343+
When_user_added_to_not_watched_channel_expect_user_receive_added_to_channel_event_from_main_thread_Async);
344+
345+
private async Task When_user_added_to_not_watched_channel_expect_user_receive_added_to_channel_event_from_main_thread_Async()
346+
{
347+
var channel = await CreateUniqueTempChannelAsync(watch: false);
348+
349+
var receivedEvent = false;
350+
IStreamChannelMember eventMember = null;
351+
IStreamChannel eventChannel = null;
352+
var receivedEventThreadId = 0;
353+
Client.AddedToChannelAsMember += (channel2, member) =>
354+
{
355+
receivedEvent = true;
356+
eventMember = member;
357+
eventChannel = channel2;
358+
receivedEventThreadId = GetCurrentThreadId();
359+
};
360+
361+
await channel.AddMembersAsync(hideHistory: default, optionalMessage: default, Client.LocalUserData.User);
362+
await WaitWhileFalseAsync(() => receivedEvent);
363+
364+
Assert.IsTrue(receivedEvent);
365+
Assert.IsNotNull(eventChannel);
366+
Assert.IsNotNull(eventMember);
367+
Assert.AreEqual(channel, eventChannel);
368+
Assert.AreEqual(Client.LocalUserData.User, eventMember.User);
369+
370+
Assert.AreEqual(receivedEventThreadId, MainThreadId);
371+
}
372+
339373
[UnityTest]
340374
public IEnumerator When_user_added_to_not_watched_channel_expect_received_channel_being_watched()
341375
=> ConnectAndExecute(
@@ -349,11 +383,13 @@ private async Task When_user_added_to_not_watched_channel_expect_received_channe
349383
var receivedEvent = false;
350384
IStreamChannelMember eventMember = null;
351385
IStreamChannel eventChannel = null;
386+
var eventThreadId = -1;
352387
Client.AddedToChannelAsMember += (channel2, member) =>
353388
{
354389
receivedEvent = true;
355390
eventMember = member;
356391
eventChannel = channel2;
392+
eventThreadId = GetCurrentThreadId();
357393
};
358394

359395
await otherClientChannel.AddMembersAsync(hideHistory: default, optionalMessage: default, Client.LocalUserData.User);
@@ -364,15 +400,19 @@ private async Task When_user_added_to_not_watched_channel_expect_received_channe
364400
Assert.IsNotNull(eventMember);
365401
Assert.AreEqual(otherClientChannel.Cid, eventChannel.Cid);
366402
Assert.AreEqual(Client.LocalUserData.User, eventMember.User);
403+
404+
Assert.AreEqual(MainThreadId, eventThreadId);
367405

368406
var receivedMessageEvent = false;
369407
var receivedMessage = string.Empty;
370408
IStreamChannel receivedMessageChannel = null;
409+
var messageEventThreadId = -1;
371410
otherClientChannel.MessageReceived += (messageChannel, message) =>
372411
{
373412
receivedMessageEvent = true;
374413
receivedMessage = message.Text;
375414
receivedMessageChannel = messageChannel;
415+
messageEventThreadId = GetCurrentThreadId();
376416
};
377417

378418
await otherClientChannel.SendNewMessageAsync("Hello");
@@ -381,6 +421,8 @@ private async Task When_user_added_to_not_watched_channel_expect_received_channe
381421
Assert.IsTrue(receivedMessageEvent);
382422
Assert.AreEqual(otherClientChannel.Cid, receivedMessageChannel.Cid);
383423
Assert.AreEqual(receivedMessage, "Hello");
424+
425+
Assert.AreEqual(MainThreadId, messageEventThreadId);
384426
}
385427

386428
[UnityTest]

0 commit comments

Comments
 (0)