From c87c1d5368bdc18a708a3b0656de3d62c5bf00fa Mon Sep 17 00:00:00 2001 From: Sahil Kumar Date: Thu, 28 Jan 2021 16:40:36 +0530 Subject: [PATCH] [LLC] Remove flutter dependency Signed-off-by: Sahil Kumar --- .../dart_client/lib/src/api/retry_policy.dart | 2 +- .../dart_client/lib/src/api/retry_queue.dart | 3 +- .../dart_client/lib/src/api/websocket.dart | 26 +++++++---- packages/dart_client/lib/src/client.dart | 46 +++++++++++-------- packages/dart_client/pubspec.yaml | 3 -- 5 files changed, 45 insertions(+), 35 deletions(-) diff --git a/packages/dart_client/lib/src/api/retry_policy.dart b/packages/dart_client/lib/src/api/retry_policy.dart index 43af3b8e..270d558c 100644 --- a/packages/dart_client/lib/src/api/retry_policy.dart +++ b/packages/dart_client/lib/src/api/retry_policy.dart @@ -1,4 +1,4 @@ -import 'package:flutter/foundation.dart'; +import 'package:meta/meta.dart'; import 'package:stream_chat/src/client.dart'; import 'package:stream_chat/src/exceptions.dart'; diff --git a/packages/dart_client/lib/src/api/retry_queue.dart b/packages/dart_client/lib/src/api/retry_queue.dart index 376854af..534d9c08 100644 --- a/packages/dart_client/lib/src/api/retry_queue.dart +++ b/packages/dart_client/lib/src/api/retry_queue.dart @@ -1,8 +1,7 @@ import 'dart:async'; import 'package:collection/collection.dart'; -import 'package:flutter/cupertino.dart'; -import 'package:flutter/foundation.dart'; +import 'package:meta/meta.dart'; import 'package:logging/logging.dart'; import 'package:stream_chat/src/api/channel.dart'; import 'package:stream_chat/src/api/retry_policy.dart'; diff --git a/packages/dart_client/lib/src/api/websocket.dart b/packages/dart_client/lib/src/api/websocket.dart index bdd14a1e..a610c041 100644 --- a/packages/dart_client/lib/src/api/websocket.dart +++ b/packages/dart_client/lib/src/api/websocket.dart @@ -2,9 +2,9 @@ import 'dart:async'; import 'dart:convert'; import 'dart:math'; -import 'package:flutter/foundation.dart'; -import 'package:flutter/material.dart'; +import 'package:meta/meta.dart'; import 'package:logging/logging.dart'; +import 'package:rxdart/rxdart.dart'; import 'package:web_socket_channel/web_socket_channel.dart'; import '../models/event.dart'; @@ -99,9 +99,15 @@ class WebSocket { /// The timeout that uses the reconnection monitor timer to consider the connection unhealthy final int reconnectionMonitorTimeout; + final _connectionStatusController = + BehaviorSubject.seeded(ConnectionStatus.disconnected); + + set _connectionStatus(ConnectionStatus status) => + _connectionStatusController.add(status); + /// This notifies of connection status changes - final ValueNotifier connectionStatus = - ValueNotifier(ConnectionStatus.disconnected); + Stream get connectionStatusStream => + _connectionStatusController.stream; String _path; int _retryAttempt = 1; @@ -128,7 +134,7 @@ class WebSocket { } _connecting = true; - connectionStatus.value = ConnectionStatus.connecting; + _connectionStatus = ConnectionStatus.connecting; logger.info('connecting to $_path'); @@ -175,7 +181,7 @@ class WebSocket { _reconnecting = false; _lastEventAt = DateTime.now(); - connectionStatus.value = ConnectionStatus.connected; + _connectionStatus = ConnectionStatus.connected; _retryAttempt = 1; if (!_connectionCompleter.isCompleted) { @@ -199,7 +205,7 @@ class WebSocket { _connecting = false; if (!_reconnecting) { - connectionStatus.value = ConnectionStatus.disconnected; + _connectionStatus = ConnectionStatus.disconnected; } if (!_connectionCompleter.isCompleted) { @@ -258,7 +264,7 @@ class WebSocket { logger.info('reconnect'); if (!_reconnecting) { _reconnecting = true; - connectionStatus.value = ConnectionStatus.connecting; + _connectionStatus = ConnectionStatus.connecting; } _reconnectTimer(); @@ -300,8 +306,8 @@ class WebSocket { _cancelTimers(); _reconnecting = false; _manuallyDisconnected = true; - connectionStatus.value = ConnectionStatus.disconnected; - connectionStatus.dispose(); + _connectionStatus = ConnectionStatus.disconnected; + await _connectionStatusController.close(); return _channel.sink.close(); } } diff --git a/packages/dart_client/lib/src/client.dart b/packages/dart_client/lib/src/client.dart index f2a6f0c0..603b9b0e 100644 --- a/packages/dart_client/lib/src/client.dart +++ b/packages/dart_client/lib/src/client.dart @@ -3,7 +3,7 @@ import 'dart:convert'; import 'dart:io'; import 'package:dio/dio.dart'; -import 'package:flutter/cupertino.dart'; +import 'package:meta/meta.dart'; import 'package:logging/logging.dart'; import 'package:rxdart/rxdart.dart'; import 'package:shared_preferences/shared_preferences.dart'; @@ -93,8 +93,6 @@ class Client { this.backgroundKeepAlive = const Duration(minutes: 1), RetryPolicy retryPolicy, }) { - WidgetsFlutterBinding.ensureInitialized(); - _retryPolicy ??= RetryPolicy( retryTimeout: (Client client, int attempt, ApiError error) => Duration(seconds: 1 * attempt), @@ -180,7 +178,8 @@ class Client { static const _defaultBaseURL = 'chat-us-east-1.stream-io-api.com'; static const _tokenExpiredErrorCode = 40; - VoidCallback _connectionStatusListener; + StreamSubscription _connectionStatusSubscription; + Future Function(ConnectionStatus) _connectionStatusHandler; final BehaviorSubject _controller = BehaviorSubject(); @@ -188,10 +187,20 @@ class Client { /// Listen to this or use the [on] method to filter specific event types Stream get stream => _controller.stream; + final _wsConnectionStatusController = + BehaviorSubject.seeded(ConnectionStatus.disconnected); + + set _wsConnectionStatus(ConnectionStatus status) => + _wsConnectionStatusController.add(status); + + /// The current status value of the websocket connection + ConnectionStatus get wsConnectionStatus => + _wsConnectionStatusController.value; + /// This notifies the connection status of the websocket connection. /// Listen to this to get notified when the websocket tries to reconnect. - final ValueNotifier wsConnectionStatus = - ValueNotifier(ConnectionStatus.disconnected); + Stream get wsConnectionStatusStream => + _wsConnectionStatusController.stream; /// The current user token String token; @@ -275,8 +284,6 @@ class Client { httpClient.lock(); final userId = state.user.id; - _ws.connectionStatus.removeListener(_connectionStatusListener); - await _disconnect(); final newToken = await tokenProvider(userId); @@ -345,8 +352,8 @@ class Client { await _disconnect(); httpClient.close(); await _controller.close(); - state.channels.values.forEach((c) => c.dispose()); state.dispose(); + await _wsConnectionStatusController.close(); } Map get _httpHeaders => { @@ -443,17 +450,17 @@ class Client { /// Connect the client websocket Future connect() async { logger.info('connecting'); - if (wsConnectionStatus.value == ConnectionStatus.connecting) { + if (wsConnectionStatus == ConnectionStatus.connecting) { logger.warning('Already connecting'); throw Exception('Already connecting'); } - if (wsConnectionStatus.value == ConnectionStatus.connected) { + if (wsConnectionStatus == ConnectionStatus.connected) { logger.warning('Already connected'); throw Exception('Already connected'); } - wsConnectionStatus.value = ConnectionStatus.connecting; + _wsConnectionStatus = ConnectionStatus.connecting; if (persistenceEnabled) { await chatPersistenceClient.connect(state.user.id); @@ -476,15 +483,14 @@ class Client { logger: _detachedLogger('🔌'), ); - _connectionStatusListener = () async { - final value = _ws.connectionStatus.value; - wsConnectionStatus.value = value; + _connectionStatusHandler = (ConnectionStatus status) async { + _wsConnectionStatus = status; handleEvent(Event( type: EventType.connectionChanged, - online: value == ConnectionStatus.connected, + online: status == ConnectionStatus.connected, )); - if (value == ConnectionStatus.connected && + if (status == ConnectionStatus.connected && state.channels?.isNotEmpty == true) { unawaited(queryChannels(filter: { 'cid': { @@ -504,7 +510,8 @@ class Client { } }; - _ws.connectionStatus.addListener(_connectionStatusListener); + _connectionStatusSubscription = + _ws.connectionStatusStream.listen(_connectionStatusHandler); var event = await chatPersistenceClient?.getConnectionInfo(); @@ -588,7 +595,7 @@ class Client { logger.info('awaiting connection completer'); await _connectCompleter.future; } - if (wsConnectionStatus.value != ConnectionStatus.connected) { + if (wsConnectionStatus != ConnectionStatus.connected) { final errorMessage = 'You cannot use queryChannels without an active connection. Please call setUser to connect the client.'; if (persistenceEnabled) { @@ -946,6 +953,7 @@ class Client { logger.info('Client disconnecting'); await _ws?.disconnect(); + await _connectionStatusSubscription?.cancel(); } /// Requests users with a given query. diff --git a/packages/dart_client/pubspec.yaml b/packages/dart_client/pubspec.yaml index 024f9d90..c55753e6 100644 --- a/packages/dart_client/pubspec.yaml +++ b/packages/dart_client/pubspec.yaml @@ -9,8 +9,6 @@ environment: sdk: ">=2.7.0 <3.0.0" dependencies: - flutter: - sdk: flutter json_annotation: ^3.0.1 shared_preferences: ^0.5.7+3 logging: ^0.11.4 @@ -21,7 +19,6 @@ dependencies: rxdart: ^0.24.1 collection: ^1.14.12 pedantic: ^1.9.2 - freezed: ^0.12.7 dev_dependencies: build_runner: ^1.10.0