From 414a5abb06371964f1fb48accc6cca6a78d6207b Mon Sep 17 00:00:00 2001 From: Sagar Deriv Date: Fri, 7 Jun 2024 15:01:31 +0400 Subject: [PATCH 1/5] feat: add network logs broadcaster for call history --- .../connection/call_manager/call_history.dart | 34 +++++++++++++++++-- .../interfaces/call_history_provider.dart | 29 ++++++++++++++++ 2 files changed, 61 insertions(+), 2 deletions(-) create mode 100644 lib/services/interfaces/call_history_provider.dart diff --git a/lib/services/connection/call_manager/call_history.dart b/lib/services/connection/call_manager/call_history.dart index 164afdb9e5..4af0420d6e 100644 --- a/lib/services/connection/call_manager/call_history.dart +++ b/lib/services/connection/call_manager/call_history.dart @@ -1,7 +1,17 @@ +import 'dart:async'; + import 'package:flutter_deriv_api/services/connection/call_manager/call_history_entry.dart'; +import 'package:flutter_deriv_api/services/interfaces/call_history_provider.dart'; /// Provides storage for messages sent/received via the web socket connection -class CallHistory { +class CallHistory implements CallHistoryProvider { + /// It initializes [CallHistory] instance. + CallHistory() { + _callHistoryBroadcaster = StreamController.broadcast(); + } + + late final StreamController _callHistoryBroadcaster; + /// Messages that were sent to the remote endpoint final List outgoing = []; @@ -29,7 +39,15 @@ class CallHistory { incoming.add( CallHistoryEntry(timeStamp: timestamp, method: method, message: message), ); - + if (!method.contains('ping')) { + _callHistoryBroadcaster.add( + NetworkPayload( + method: method, + body: message, + direction: 'RECEIVED', + timeStamp: timestamp), + ); + } _trimHistory(incoming); } @@ -42,6 +60,15 @@ class CallHistory { outgoing.add( CallHistoryEntry(timeStamp: timestamp, method: method, message: message), ); + if (!method.contains('ping')) { + _callHistoryBroadcaster.add( + NetworkPayload( + method: method, + body: message, + direction: 'SENT', + timeStamp: timestamp), + ); + } _trimHistory(outgoing); } @@ -52,4 +79,7 @@ class CallHistory { callHistory.removeRange(0, callHistory.length - limit); } } + + @override + Stream get stream => _callHistoryBroadcaster.stream; } diff --git a/lib/services/interfaces/call_history_provider.dart b/lib/services/interfaces/call_history_provider.dart new file mode 100644 index 0000000000..9d8c0efddb --- /dev/null +++ b/lib/services/interfaces/call_history_provider.dart @@ -0,0 +1,29 @@ +/// This interface provides stream of network payload that is going out(SENT) +/// and coming in(RECEIVED) to the application. +abstract class CallHistoryProvider { + /// Stream of network payload that is going out(SENT) and coming in(RECEIVED) + Stream get stream; +} + +/// Network payload that is going out and coming in from the web socket. +class NetworkPayload { + /// Initializes [NetworkPayload] instance. + NetworkPayload({ + required this.method, + required this.body, + required this.direction, + required this.timeStamp, + }); + + /// name of the api. + final String method; + + /// content of the api. + final Object body; + + /// direction of the api i.e SENT or RECEIVED. + final String direction; + + /// time of the api. + final int timeStamp; +} From f2ff311fbcc7f728e0bd6ba52f3af0406a2a5762 Mon Sep 17 00:00:00 2001 From: Sagar Deriv Date: Fri, 7 Jun 2024 15:02:17 +0400 Subject: [PATCH 2/5] refactor: add getter for Api --- lib/state/connection/connection_cubit.dart | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/state/connection/connection_cubit.dart b/lib/state/connection/connection_cubit.dart index 2ccb974b53..6c4b0e7823 100644 --- a/lib/state/connection/connection_cubit.dart +++ b/lib/state/connection/connection_cubit.dart @@ -86,6 +86,8 @@ class ConnectionCubit extends Cubit { /// Stream subscription for connectivity. StreamSubscription? connectivitySubscription; + BaseAPI get api => _api as BinaryAPI; + /// Reconnect to Websocket. Future reconnect({ ConnectionInformation? connectionInformation, From ecbbb3c5d98c0cda66807b1f997f8134a384d9ba Mon Sep 17 00:00:00 2001 From: Sagar Deriv Date: Mon, 1 Jul 2024 14:33:28 +0400 Subject: [PATCH 3/5] refactor: make `_api` property non-nullable --- lib/state/connection/connection_cubit.dart | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/state/connection/connection_cubit.dart b/lib/state/connection/connection_cubit.dart index 6c4b0e7823..38ce4161f8 100644 --- a/lib/state/connection/connection_cubit.dart +++ b/lib/state/connection/connection_cubit.dart @@ -46,7 +46,7 @@ class ConnectionCubit extends Cubit { final String _key = '${UniqueKey()}'; - late final BaseAPI? _api; + late final BaseAPI _api; /// Enables debug mode. /// @@ -86,7 +86,8 @@ class ConnectionCubit extends Cubit { /// Stream subscription for connectivity. StreamSubscription? connectivitySubscription; - BaseAPI get api => _api as BinaryAPI; + /// Getter for [BaseAPI] implementation class. + BaseAPI get api => _api; /// Reconnect to Websocket. Future reconnect({ @@ -111,7 +112,7 @@ class ConnectionCubit extends Cubit { emit(const ConnectionConnectingState()); try { - await _api!.disconnect().timeout(_pingTimeout); + await _api.disconnect().timeout(_pingTimeout); } on Exception catch (e) { dev.log('$runtimeType disconnect exception: $e', error: e); @@ -120,7 +121,7 @@ class ConnectionCubit extends Cubit { return; } - await _api!.connect( + await _api.connect( _connectionInformation, printResponse: enableDebug && printResponse, onOpen: (String key) { From 5cc0a39c3d9004d4cd131dea57b96fbf1526f88d Mon Sep 17 00:00:00 2001 From: Sagar Deriv Date: Tue, 2 Jul 2024 18:51:05 +0400 Subject: [PATCH 4/5] docs: update public method's doc --- lib/state/connection/connection_cubit.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/state/connection/connection_cubit.dart b/lib/state/connection/connection_cubit.dart index 38ce4161f8..3c90cc438a 100644 --- a/lib/state/connection/connection_cubit.dart +++ b/lib/state/connection/connection_cubit.dart @@ -86,7 +86,7 @@ class ConnectionCubit extends Cubit { /// Stream subscription for connectivity. StreamSubscription? connectivitySubscription; - /// Getter for [BaseAPI] implementation class. + /// Getter for [BaseAPI] implementation class. By default, it will be [BinaryAPI]. BaseAPI get api => _api; /// Reconnect to Websocket. From c7509a0d6d6d85046717e8ed66e45a690e5f2559 Mon Sep 17 00:00:00 2001 From: Sagar Deriv Date: Wed, 10 Jul 2024 11:52:33 +0400 Subject: [PATCH 5/5] refactor: update data type for network payload --- lib/services/connection/call_manager/call_history.dart | 4 ++-- lib/services/interfaces/call_history_provider.dart | 10 +++++++++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/lib/services/connection/call_manager/call_history.dart b/lib/services/connection/call_manager/call_history.dart index 4af0420d6e..370f7c3da3 100644 --- a/lib/services/connection/call_manager/call_history.dart +++ b/lib/services/connection/call_manager/call_history.dart @@ -44,7 +44,7 @@ class CallHistory implements CallHistoryProvider { NetworkPayload( method: method, body: message, - direction: 'RECEIVED', + direction: NetworkDirections.received, timeStamp: timestamp), ); } @@ -65,7 +65,7 @@ class CallHistory implements CallHistoryProvider { NetworkPayload( method: method, body: message, - direction: 'SENT', + direction: NetworkDirections.sent, timeStamp: timestamp), ); } diff --git a/lib/services/interfaces/call_history_provider.dart b/lib/services/interfaces/call_history_provider.dart index 9d8c0efddb..3c7065c33f 100644 --- a/lib/services/interfaces/call_history_provider.dart +++ b/lib/services/interfaces/call_history_provider.dart @@ -22,8 +22,16 @@ class NetworkPayload { final Object body; /// direction of the api i.e SENT or RECEIVED. - final String direction; + final NetworkDirections direction; /// time of the api. final int timeStamp; } + +enum NetworkDirections { + /// Going out from the web socket. + sent, + + /// Coming in from the web socket. + received +}