fix(llc): channel clean up after dispose from cache (#1342)

* fix: channel clean up after dispose from cache

* chore(llc): update changelog

* fix(llc): refactor setter in add/remove methods

* fix tests

Co-authored-by: Salvatore Giordano <[email protected]>
This commit is contained in:
Daniel
2022-10-10 12:59:35 +02:00
committed by GitHub
co-authored by Salvatore Giordano
parent 25bc504125
commit 37e01b118b
5 changed files with 39 additions and 8 deletions
+6
View File
@@ -1,3 +1,9 @@
## Upcoming
🐞 Fixed
- Remove disposed channel clients from the client state.
## 5.0.0 ## 5.0.0
- Included the changes from version [4.5.0](#450). - Included the changes from version [4.5.0](#450).
@@ -1237,7 +1237,7 @@ class Channel {
state = ChannelClientState(this, channelState); state = ChannelClientState(this, channelState);
if (cid != null) { if (cid != null) {
client.state.channels = {cid!: this}; client.state.addChannels({cid!: this});
} }
if (!_initializedCompleter.isCompleted) { if (!_initializedCompleter.isCompleted) {
_initializedCompleter.complete(true); _initializedCompleter.complete(true);
@@ -1544,6 +1544,7 @@ class Channel {
/// Call this method to dispose the channel client. /// Call this method to dispose the channel client.
void dispose() { void dispose() {
client.state.removeChannel('$cid');
state?.dispose(); state?.dispose();
_keyStrokeHandler.cancel(); _keyStrokeHandler.cancel();
} }
@@ -665,7 +665,7 @@ class StreamChatClient {
clearQueryCache: paginationParams.offset == 0, clearQueryCache: paginationParams.offset == 0,
); );
this.state.channels = updateData.key; this.state.addChannels(updateData.key);
return updateData.value; return updateData.value;
} }
@@ -682,7 +682,7 @@ class StreamChatClient {
)) ?? )) ??
[]; [];
final updatedData = _mapChannelStateToChannel(offlineChannels); final updatedData = _mapChannelStateToChannel(offlineChannels);
state.channels = updatedData.key; state.addChannels(updatedData.key);
return updatedData.value; return updatedData.value;
} }
@@ -1549,7 +1549,6 @@ class ClientState {
final eventChannel = event.channel!; final eventChannel = event.channel!;
await _client.chatPersistenceClient?.deleteChannels([eventChannel.cid]); await _client.chatPersistenceClient?.deleteChannels([eventChannel.cid]);
channels[eventChannel.cid]?.dispose(); channels[eventChannel.cid]?.dispose();
channels = channels..remove(eventChannel.cid);
}), }),
); );
} }
@@ -1589,7 +1588,6 @@ class ClientState {
final eventChannel = event.channel!; final eventChannel = event.channel!;
await _client.chatPersistenceClient?.deleteChannels([eventChannel.cid]); await _client.chatPersistenceClient?.deleteChannels([eventChannel.cid]);
channels[eventChannel.cid]?.dispose(); channels[eventChannel.cid]?.dispose();
channels = channels..remove(eventChannel.cid);
}), }),
); );
} }
@@ -1648,11 +1646,24 @@ class ClientState {
/// The current list of channels in memory /// The current list of channels in memory
Map<String, Channel> get channels => _channelsController.value; Map<String, Channel> get channels => _channelsController.value;
set channels(Map<String, Channel> channelMap) { set channels(Map<String, Channel> newChannels) {
final newChannels = {...channels, ...channelMap};
_channelsController.add(newChannels); _channelsController.add(newChannels);
} }
/// Adds a list of channels to the current list of cached channels
void addChannels(Map<String, Channel> channelMap) {
final newChannels = {
...channels,
...channelMap,
};
channels = newChannels;
}
/// Removes the channel from the cached list of [channels]
void removeChannel(String channelCid) {
channels = channels..remove(channelCid);
}
/// Used internally for optimistic update of unread count /// Used internally for optimistic update of unread count
set totalUnreadCount(int unreadCount) { set totalUnreadCount(int unreadCount) {
_totalUnreadCountController.add(unreadCount); _totalUnreadCountController.add(unreadCount);
@@ -1682,7 +1693,11 @@ class ClientState {
_currentUserController.close(); _currentUserController.close();
_unreadChannelsController.close(); _unreadChannelsController.close();
_totalUnreadCountController.close(); _totalUnreadCountController.close();
channels.values.forEach((c) => c.dispose());
final channels = this.channels.values.toList();
for (final channel in channels) {
channel.dispose();
}
_channelsController.close(); _channelsController.close();
} }
} }
@@ -50,6 +50,10 @@ void main() {
// client logger // client logger
when(() => client.logger).thenReturn(_createLogger('mock-client-logger')); when(() => client.logger).thenReturn(_createLogger('mock-client-logger'));
// fake clientState
final clientState = FakeClientState();
when(() => client.state).thenReturn(clientState);
}); });
setUp(() { setUp(() {
+5
View File
@@ -91,6 +91,11 @@ class FakeClientState extends Fake implements ClientState {
@override @override
int totalUnreadCount = 0; int totalUnreadCount = 0;
@override
void removeChannel(String channelCid) {
return;
}
} }
class FakeMessage extends Fake implements Message {} class FakeMessage extends Fake implements Message {}