refactor(socket): remove unused connection state management code
This commit is contained in:
@@ -390,119 +390,6 @@ final socketServiceProvider = Provider<SocketService?>((ref) {
|
|||||||
return asyncService.maybeWhen(data: (service) => service, orElse: () => null);
|
return asyncService.maybeWhen(data: (service) => service, orElse: () => null);
|
||||||
});
|
});
|
||||||
|
|
||||||
enum SocketConnectionState { disconnected, connecting, connected }
|
|
||||||
|
|
||||||
@Riverpod(keepAlive: true)
|
|
||||||
class SocketConnectionStream extends _$SocketConnectionStream {
|
|
||||||
StreamController<SocketConnectionState>? _controller;
|
|
||||||
ProviderSubscription<AsyncValue<SocketService?>>? _serviceSubscription;
|
|
||||||
VoidCallback? _cancelConnectListener;
|
|
||||||
VoidCallback? _cancelDisconnectListener;
|
|
||||||
SocketConnectionState _latestState = SocketConnectionState.connecting;
|
|
||||||
|
|
||||||
@override
|
|
||||||
Stream<SocketConnectionState> build() {
|
|
||||||
final controller = StreamController<SocketConnectionState>.broadcast(
|
|
||||||
sync: true,
|
|
||||||
);
|
|
||||||
controller
|
|
||||||
..onListen = _primeState
|
|
||||||
..onCancel = _maybeNotifyDisconnected;
|
|
||||||
_controller = controller;
|
|
||||||
|
|
||||||
final initialService = ref
|
|
||||||
.watch(socketServiceManagerProvider)
|
|
||||||
.maybeWhen(data: (service) => service, orElse: () => null);
|
|
||||||
_handleServiceChange(initialService);
|
|
||||||
|
|
||||||
_serviceSubscription = ref.listen<AsyncValue<SocketService?>>(
|
|
||||||
socketServiceManagerProvider,
|
|
||||||
(_, next) => _handleServiceChange(
|
|
||||||
next.maybeWhen(data: (service) => service, orElse: () => null),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
|
|
||||||
ref.onDispose(() {
|
|
||||||
_serviceSubscription?.close();
|
|
||||||
_serviceSubscription = null;
|
|
||||||
_unbindSocket();
|
|
||||||
_controller?.close();
|
|
||||||
_controller = null;
|
|
||||||
});
|
|
||||||
|
|
||||||
return controller.stream;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Publishes a disconnected state when the final listener cancels.
|
|
||||||
void _maybeNotifyDisconnected() {
|
|
||||||
try {
|
|
||||||
_controller?.add(SocketConnectionState.disconnected);
|
|
||||||
_latestState = SocketConnectionState.disconnected;
|
|
||||||
} catch (_) {}
|
|
||||||
}
|
|
||||||
|
|
||||||
/// Replays the cached state to new listeners.
|
|
||||||
void _primeState() {
|
|
||||||
try {
|
|
||||||
_controller?.add(_latestState);
|
|
||||||
} catch (_) {}
|
|
||||||
}
|
|
||||||
|
|
||||||
void _handleServiceChange(SocketService? service) {
|
|
||||||
if (service == null) {
|
|
||||||
_unbindSocket();
|
|
||||||
_emit(SocketConnectionState.connecting);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
_emit(
|
|
||||||
service.isConnected
|
|
||||||
? SocketConnectionState.connected
|
|
||||||
: SocketConnectionState.connecting,
|
|
||||||
);
|
|
||||||
_bindSocket(service);
|
|
||||||
}
|
|
||||||
|
|
||||||
void _bindSocket(SocketService service) {
|
|
||||||
_unbindSocket();
|
|
||||||
|
|
||||||
void handleConnect(dynamic _) {
|
|
||||||
_emit(SocketConnectionState.connected);
|
|
||||||
}
|
|
||||||
|
|
||||||
void handleDisconnect(dynamic _) {
|
|
||||||
_emit(SocketConnectionState.disconnected);
|
|
||||||
}
|
|
||||||
|
|
||||||
service.socket?.on('connect', handleConnect);
|
|
||||||
service.socket?.on('disconnect', handleDisconnect);
|
|
||||||
|
|
||||||
_cancelConnectListener = () {
|
|
||||||
service.socket?.off('connect', handleConnect);
|
|
||||||
};
|
|
||||||
_cancelDisconnectListener = () {
|
|
||||||
service.socket?.off('disconnect', handleDisconnect);
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
void _emit(SocketConnectionState next) {
|
|
||||||
if (_latestState == next) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
_latestState = next;
|
|
||||||
try {
|
|
||||||
_controller?.add(next);
|
|
||||||
} catch (_) {}
|
|
||||||
}
|
|
||||||
|
|
||||||
void _unbindSocket() {
|
|
||||||
_cancelConnectListener?.call();
|
|
||||||
_cancelDisconnectListener?.call();
|
|
||||||
_cancelConnectListener = null;
|
|
||||||
_cancelDisconnectListener = null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Riverpod(keepAlive: true)
|
@Riverpod(keepAlive: true)
|
||||||
class ConversationDeltaStream extends _$ConversationDeltaStream {
|
class ConversationDeltaStream extends _$ConversationDeltaStream {
|
||||||
StreamController<ConversationDelta>? _controller;
|
StreamController<ConversationDelta>? _controller;
|
||||||
|
|||||||
@@ -2,10 +2,7 @@ import 'package:flutter/widgets.dart';
|
|||||||
import 'package:socket_io_client/socket_io_client.dart' as io;
|
import 'package:socket_io_client/socket_io_client.dart' as io;
|
||||||
|
|
||||||
import '../models/server_config.dart';
|
import '../models/server_config.dart';
|
||||||
import '../../l10n/app_localizations.dart';
|
|
||||||
import 'navigation_service.dart';
|
|
||||||
import 'socket_tls_override.dart';
|
import 'socket_tls_override.dart';
|
||||||
import '../../shared/utils/ui_utils.dart';
|
|
||||||
|
|
||||||
typedef SocketChatEventHandler =
|
typedef SocketChatEventHandler =
|
||||||
void Function(
|
void Function(
|
||||||
@@ -282,37 +279,9 @@ class SocketService with WidgetsBindingObserver {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void _handleConnectError(dynamic err) {
|
void _handleConnectError(dynamic err) {}
|
||||||
// Show user-facing error notification
|
|
||||||
final context = NavigationService.context;
|
|
||||||
if (context != null) {
|
|
||||||
final l10n = AppLocalizations.of(context);
|
|
||||||
if (l10n != null) {
|
|
||||||
UiUtils.showMessage(
|
|
||||||
context,
|
|
||||||
l10n.websocketConnectionError,
|
|
||||||
isError: true,
|
|
||||||
duration: const Duration(seconds: 5),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void _handleReconnectFailed(dynamic _) {
|
void _handleReconnectFailed(dynamic _) {}
|
||||||
// Show user-facing error notification
|
|
||||||
final context = NavigationService.context;
|
|
||||||
if (context != null) {
|
|
||||||
final l10n = AppLocalizations.of(context);
|
|
||||||
if (l10n != null) {
|
|
||||||
UiUtils.showMessage(
|
|
||||||
context,
|
|
||||||
l10n.websocketReconnectFailed,
|
|
||||||
isError: true,
|
|
||||||
duration: const Duration(seconds: 5),
|
|
||||||
);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void _handleDisconnect(dynamic reason) {
|
void _handleDisconnect(dynamic reason) {
|
||||||
// Silent disconnect
|
// Silent disconnect
|
||||||
|
|||||||
Reference in New Issue
Block a user