Skip to content

Commit 738ec48

Browse files
authored
refactor(llc): safeAdd data to streamControllers (#2135)
* refactor(llc): safeAdd data to streamControllers * chore: update at more places
1 parent 0019e55 commit 738ec48

File tree

4 files changed

+26
-7
lines changed

4 files changed

+26
-7
lines changed

packages/stream_chat/lib/src/client/channel.dart

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2195,7 +2195,7 @@ class ChannelClientState {
21952195
/// [EventType.messageNew] will not be pushed on to message list.
21962196
bool get isUpToDate => _isUpToDateController.value;
21972197

2198-
set isUpToDate(bool isUpToDate) => _isUpToDateController.add(isUpToDate);
2198+
set isUpToDate(bool isUpToDate) => _isUpToDateController.safeAdd(isUpToDate);
21992199

22002200
/// [isUpToDate] flag count as a stream.
22012201
Stream<bool> get isUpToDateStream => _isUpToDateController.stream;
@@ -2967,7 +2967,7 @@ class ChannelClientState {
29672967
final Debounce _debouncedUpdatePersistenceChannelState;
29682968

29692969
set _channelState(ChannelState v) {
2970-
_channelStateController.add(v);
2970+
_channelStateController.safeAdd(v);
29712971
_debouncedUpdatePersistenceChannelState.call([v]);
29722972
}
29732973

@@ -2982,7 +2982,7 @@ class ChannelClientState {
29822982
BehaviorSubject.seeded({});
29832983

29842984
set _threads(Map<String, List<Message>> threads) {
2985-
_threadsController.add(threads);
2985+
_threadsController.safeAdd(threads);
29862986
_channel.client.chatPersistenceClient?.updateChannelThreads(
29872987
_channel.cid!,
29882988
threads,
@@ -3011,7 +3011,7 @@ class ChannelClientState {
30113011
if (user != null && user.id != currentUser.id) {
30123012
final events = {...typingEvents};
30133013
events[user] = event;
3014-
_typingEventsController.add(events);
3014+
_typingEventsController.safeAdd(events);
30153015
}
30163016
},
30173017
),
@@ -3022,7 +3022,7 @@ class ChannelClientState {
30223022
final user = event.user;
30233023
if (user != null && user.id != currentUser.id) {
30243024
final events = {...typingEvents}..remove(user);
3025-
_typingEventsController.add(events);
3025+
_typingEventsController.safeAdd(events);
30263026
}
30273027
},
30283028
),

packages/stream_chat/lib/src/core/util/extension.dart

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
import 'dart:async';
2+
13
import 'package:http_parser/http_parser.dart';
24
import 'package:mime/mime.dart';
35

@@ -27,3 +29,20 @@ extension StringX on String {
2729
return MediaType.parse(mimeType);
2830
}
2931
}
32+
33+
/// Extension on [StreamController] to safely add events and errors.
34+
extension StreamControllerX<T> on StreamController<T> {
35+
/// Safely adds the event to the controller,
36+
/// Returns early if the controller is closed.
37+
void safeAdd(T event) {
38+
if (isClosed) return;
39+
add(event);
40+
}
41+
42+
/// Safely adds the error to the controller,
43+
/// Returns early if the controller is closed.
44+
void safeAddError(Object error, [StackTrace? stackTrace]) {
45+
if (isClosed) return;
46+
addError(error, stackTrace);
47+
}
48+
}

packages/stream_chat/lib/src/ws/websocket.dart

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ import 'package:stream_chat/src/core/http/system_environment_manager.dart';
1010
import 'package:stream_chat/src/core/http/token_manager.dart';
1111
import 'package:stream_chat/src/core/models/event.dart';
1212
import 'package:stream_chat/src/core/models/user.dart';
13+
import 'package:stream_chat/src/core/util/extension.dart';
1314
import 'package:stream_chat/src/event_type.dart';
1415
import 'package:stream_chat/src/ws/connection_status.dart';
1516
import 'package:stream_chat/src/ws/timer_helper.dart';
@@ -108,7 +109,7 @@ class WebSocket with TimerHelper {
108109
BehaviorSubject.seeded(ConnectionStatus.disconnected);
109110

110111
set _connectionStatus(ConnectionStatus status) =>
111-
_connectionStatusController.add(status);
112+
_connectionStatusController.safeAdd(status);
112113

113114
/// The current connection status value
114115
ConnectionStatus get connectionStatus => _connectionStatusController.value;

packages/stream_chat_flutter_core/lib/src/stream_channel.dart

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,6 @@ import 'package:collection/collection.dart';
44
import 'package:flutter/material.dart';
55
import 'package:rxdart/rxdart.dart';
66
import 'package:stream_chat/stream_chat.dart';
7-
import 'package:stream_chat_flutter_core/src/stream_controller_extension.dart';
87

98
/// Specifies query direction for pagination
109
enum QueryDirection {

0 commit comments

Comments
 (0)