From bbee0f523b33cb13fa361af50c7a0a5eba7fbdb0 Mon Sep 17 00:00:00 2001 From: Plague Fox Date: Fri, 28 Jul 2023 10:56:03 +0400 Subject: [PATCH] Update placement --- analysis_options.yaml | 2 +- lib/centrifuge.dart | 12 +++---- lib/interface.dart | 12 +++---- lib/src/client/centrifuge.dart | 10 +++--- lib/src/{model => client}/config.dart | 0 lib/src/{model => client}/state.dart | 0 lib/src/{model => client}/states_stream.dart | 2 +- .../client_subscription_impl.dart | 21 ++++++++--- .../client_subscription_manager.dart | 4 +-- .../subcibed_on_channel.dart | 0 .../{model => subscription}/subscription.dart | 6 ++-- .../subscription_config.dart | 0 .../subscription_state.dart | 22 +++++++++++- .../subscription_states_stream.dart | 2 +- lib/src/transport/transport_interface.dart | 6 ++-- lib/src/transport/ws_protobuf_transport.dart | 2 +- lib/src/util/notifier.dart | 36 +++++++++++++++++++ 17 files changed, 104 insertions(+), 33 deletions(-) rename lib/src/{model => client}/config.dart (100%) rename lib/src/{model => client}/state.dart (100%) rename lib/src/{model => client}/states_stream.dart (95%) rename lib/src/{model => subscription}/subcibed_on_channel.dart (100%) rename lib/src/{model => subscription}/subscription.dart (94%) rename lib/src/{model => subscription}/subscription_config.dart (100%) rename lib/src/{model => subscription}/subscription_state.dart (93%) rename lib/src/{model => subscription}/subscription_states_stream.dart (94%) create mode 100644 lib/src/util/notifier.dart diff --git a/analysis_options.yaml b/analysis_options.yaml index e71b196..be57b00 100644 --- a/analysis_options.yaml +++ b/analysis_options.yaml @@ -58,6 +58,7 @@ linter: prefer_relative_imports: false prefer_final_locals: false avoid_escaping_inner_quotes: false + curly_braces_in_flow_control_structures: false # Enabled use_named_constants: true @@ -149,7 +150,6 @@ linter: avoid_shadowing_type_parameters: true avoid_types_as_parameter_names: true camel_case_extensions: true - curly_braces_in_flow_control_structures: true empty_catches: true empty_constructor_bodies: true library_names: true diff --git a/lib/centrifuge.dart b/lib/centrifuge.dart index b0985bf..757535c 100644 --- a/lib/centrifuge.dart +++ b/lib/centrifuge.dart @@ -1,14 +1,14 @@ library centrifuge; export 'package:centrifuge_dart/src/client/centrifuge.dart' show Centrifuge; +export 'package:centrifuge_dart/src/client/config.dart'; +export 'package:centrifuge_dart/src/client/state.dart'; +export 'package:centrifuge_dart/src/client/states_stream.dart'; export 'package:centrifuge_dart/src/model/client_info.dart'; -export 'package:centrifuge_dart/src/model/config.dart'; export 'package:centrifuge_dart/src/model/exception.dart'; export 'package:centrifuge_dart/src/model/jwt.dart'; export 'package:centrifuge_dart/src/model/publication.dart'; -export 'package:centrifuge_dart/src/model/state.dart'; -export 'package:centrifuge_dart/src/model/states_stream.dart'; -export 'package:centrifuge_dart/src/model/subscription.dart' +export 'package:centrifuge_dart/src/subscription/subscription.dart' show CentrifugeClientSubscription, CentrifugeServerSubscription; -export 'package:centrifuge_dart/src/model/subscription_config.dart'; -export 'package:centrifuge_dart/src/model/subscription_state.dart'; +export 'package:centrifuge_dart/src/subscription/subscription_config.dart'; +export 'package:centrifuge_dart/src/subscription/subscription_state.dart'; diff --git a/lib/interface.dart b/lib/interface.dart index 78462bb..a78f8d7 100644 --- a/lib/interface.dart +++ b/lib/interface.dart @@ -1,17 +1,17 @@ library interface; export 'package:centrifuge_dart/src/client/centrifuge_interface.dart'; +export 'package:centrifuge_dart/src/client/config.dart'; +export 'package:centrifuge_dart/src/client/state.dart'; +export 'package:centrifuge_dart/src/client/states_stream.dart'; export 'package:centrifuge_dart/src/model/client_info.dart'; -export 'package:centrifuge_dart/src/model/config.dart'; export 'package:centrifuge_dart/src/model/exception.dart'; export 'package:centrifuge_dart/src/model/jwt.dart'; export 'package:centrifuge_dart/src/model/publication.dart'; -export 'package:centrifuge_dart/src/model/state.dart'; -export 'package:centrifuge_dart/src/model/states_stream.dart'; -export 'package:centrifuge_dart/src/model/subscription.dart' +export 'package:centrifuge_dart/src/subscription/subscription.dart' show ICentrifugeSubscription, CentrifugeClientSubscription, CentrifugeServerSubscription; -export 'package:centrifuge_dart/src/model/subscription_config.dart'; -export 'package:centrifuge_dart/src/model/subscription_state.dart'; +export 'package:centrifuge_dart/src/subscription/subscription_config.dart'; +export 'package:centrifuge_dart/src/subscription/subscription_state.dart'; diff --git a/lib/src/client/centrifuge.dart b/lib/src/client/centrifuge.dart index 41ef76c..9341895 100644 --- a/lib/src/client/centrifuge.dart +++ b/lib/src/client/centrifuge.dart @@ -1,13 +1,13 @@ import 'dart:async'; import 'package:centrifuge_dart/src/client/centrifuge_interface.dart'; -import 'package:centrifuge_dart/src/model/config.dart'; +import 'package:centrifuge_dart/src/client/config.dart'; +import 'package:centrifuge_dart/src/client/state.dart'; +import 'package:centrifuge_dart/src/client/states_stream.dart'; import 'package:centrifuge_dart/src/model/exception.dart'; -import 'package:centrifuge_dart/src/model/state.dart'; -import 'package:centrifuge_dart/src/model/states_stream.dart'; -import 'package:centrifuge_dart/src/model/subscription.dart'; -import 'package:centrifuge_dart/src/model/subscription_config.dart'; import 'package:centrifuge_dart/src/subscription/client_subscription_manager.dart'; +import 'package:centrifuge_dart/src/subscription/subscription.dart'; +import 'package:centrifuge_dart/src/subscription/subscription_config.dart'; import 'package:centrifuge_dart/src/transport/transport_interface.dart'; import 'package:centrifuge_dart/src/transport/ws_protobuf_transport.dart'; import 'package:centrifuge_dart/src/util/event_queue.dart'; diff --git a/lib/src/model/config.dart b/lib/src/client/config.dart similarity index 100% rename from lib/src/model/config.dart rename to lib/src/client/config.dart diff --git a/lib/src/model/state.dart b/lib/src/client/state.dart similarity index 100% rename from lib/src/model/state.dart rename to lib/src/client/state.dart diff --git a/lib/src/model/states_stream.dart b/lib/src/client/states_stream.dart similarity index 95% rename from lib/src/model/states_stream.dart rename to lib/src/client/states_stream.dart index 183f79b..60c22bd 100644 --- a/lib/src/model/states_stream.dart +++ b/lib/src/client/states_stream.dart @@ -1,6 +1,6 @@ import 'dart:async'; -import 'package:centrifuge_dart/src/model/state.dart'; +import 'package:centrifuge_dart/src/client/state.dart'; /// Stream of Centrifuge's [CentrifugeState] changes. /// {@category Client} diff --git a/lib/src/subscription/client_subscription_impl.dart b/lib/src/subscription/client_subscription_impl.dart index fbc72c9..baec8b5 100644 --- a/lib/src/subscription/client_subscription_impl.dart +++ b/lib/src/subscription/client_subscription_impl.dart @@ -1,7 +1,10 @@ import 'dart:async'; import 'package:centrifuge_dart/centrifuge.dart'; -import 'package:centrifuge_dart/src/model/subscription_states_stream.dart'; +import 'package:centrifuge_dart/src/subscription/subscription.dart'; +import 'package:centrifuge_dart/src/subscription/subscription_config.dart'; +import 'package:centrifuge_dart/src/subscription/subscription_state.dart'; +import 'package:centrifuge_dart/src/subscription/subscription_states_stream.dart'; import 'package:centrifuge_dart/src/transport/transport_interface.dart'; import 'package:centrifuge_dart/src/util/event_queue.dart'; import 'package:centrifuge_dart/src/util/logger.dart' as logger; @@ -80,7 +83,8 @@ abstract base class CentrifugeClientSubscriptionBase @override CentrifugeSubscriptionState get state => _state; late CentrifugeSubscriptionState _state = - CentrifugeSubscriptionState.unsubscribed(since: _config.since); + CentrifugeSubscriptionState.unsubscribed( + since: _config.since, code: 0, reason: 'initial state'); /// Stream of subscription states. /// {@nodoc} @@ -175,8 +179,17 @@ base mixin CentrifugeClientSubscriptionSubscribeMixin if (state is CentrifugeSubscriptionState$Subscribing) { return await ready(); } - _setState(CentrifugeSubscriptionState$Subscribing()); - // TODO(plugfox): implement + _setState(CentrifugeSubscriptionState$Subscribing(since: state.since)); + final subscribed = await _transport.subscribe( + channel, + _config, + state.since, + ); + _setState(CentrifugeSubscriptionState$Subscribed( + since: subscribed.since, + recoverable: subscribed.recoverable, + ttl: subscribed.ttl, + )); } on CentrifugeException catch (error, stackTrace) { _emitError(error, stackTrace); rethrow; diff --git a/lib/src/subscription/client_subscription_manager.dart b/lib/src/subscription/client_subscription_manager.dart index da47db6..65a961d 100644 --- a/lib/src/subscription/client_subscription_manager.dart +++ b/lib/src/subscription/client_subscription_manager.dart @@ -1,9 +1,9 @@ import 'dart:collection'; import 'package:centrifuge_dart/src/model/exception.dart'; -import 'package:centrifuge_dart/src/model/subscription.dart'; -import 'package:centrifuge_dart/src/model/subscription_config.dart'; import 'package:centrifuge_dart/src/subscription/client_subscription_impl.dart'; +import 'package:centrifuge_dart/src/subscription/subscription.dart'; +import 'package:centrifuge_dart/src/subscription/subscription_config.dart'; import 'package:centrifuge_dart/src/transport/transport_interface.dart'; import 'package:meta/meta.dart'; diff --git a/lib/src/model/subcibed_on_channel.dart b/lib/src/subscription/subcibed_on_channel.dart similarity index 100% rename from lib/src/model/subcibed_on_channel.dart rename to lib/src/subscription/subcibed_on_channel.dart diff --git a/lib/src/model/subscription.dart b/lib/src/subscription/subscription.dart similarity index 94% rename from lib/src/model/subscription.dart rename to lib/src/subscription/subscription.dart index 3b41737..39afd7c 100644 --- a/lib/src/model/subscription.dart +++ b/lib/src/subscription/subscription.dart @@ -1,7 +1,9 @@ import 'dart:async'; -import 'package:centrifuge_dart/interface.dart'; -import 'package:centrifuge_dart/src/model/subscription_states_stream.dart'; +import 'package:centrifuge_dart/src/model/exception.dart'; +import 'package:centrifuge_dart/src/model/publication.dart'; +import 'package:centrifuge_dart/src/subscription/subscription_state.dart'; +import 'package:centrifuge_dart/src/subscription/subscription_states_stream.dart'; import 'package:fixnum/fixnum.dart' as fixnum; /// {@template subscription} diff --git a/lib/src/model/subscription_config.dart b/lib/src/subscription/subscription_config.dart similarity index 100% rename from lib/src/model/subscription_config.dart rename to lib/src/subscription/subscription_config.dart diff --git a/lib/src/model/subscription_state.dart b/lib/src/subscription/subscription_state.dart similarity index 93% rename from lib/src/model/subscription_state.dart rename to lib/src/subscription/subscription_state.dart index 2b7dc32..136ef62 100644 --- a/lib/src/model/subscription_state.dart +++ b/lib/src/subscription/subscription_state.dart @@ -21,6 +21,8 @@ sealed class CentrifugeSubscriptionState /// Unsubscribed /// {@macro subscription_state} factory CentrifugeSubscriptionState.unsubscribed({ + required int code, + required String reason, DateTime? timestamp, ({fixnum.Int64 offset, String epoch})? since, }) = CentrifugeSubscriptionState$Unsubscribed; @@ -37,6 +39,8 @@ sealed class CentrifugeSubscriptionState factory CentrifugeSubscriptionState.subscribed({ DateTime? timestamp, ({fixnum.Int64 offset, String epoch})? since, + bool recoverable, + DateTime? ttl, }) = CentrifugeSubscriptionState$Subscribed; } @@ -49,10 +53,18 @@ final class CentrifugeSubscriptionState$Unsubscribed extends CentrifugeSubscriptionState with _$CentrifugeSubscriptionState { /// {@nodoc} CentrifugeSubscriptionState$Unsubscribed({ + required this.code, + required this.reason, DateTime? timestamp, ({fixnum.Int64 offset, String epoch})? since, }) : super(timestamp ?? DateTime.now(), since); + /// Unsubscribe code. + final int code; + + /// Unsubscribe reason. + final String reason; + @override R map({ required CentrifugeSubscriptionStateMatch({ required CentrifugeSubscriptionStateMatch Object.hash(2, timestamp, since); + int get hashCode => Object.hash(2, timestamp, since, recoverable, ttl); @override bool operator ==(Object other) => identical(this, other); diff --git a/lib/src/model/subscription_states_stream.dart b/lib/src/subscription/subscription_states_stream.dart similarity index 94% rename from lib/src/model/subscription_states_stream.dart rename to lib/src/subscription/subscription_states_stream.dart index b9f7325..799a5fc 100644 --- a/lib/src/model/subscription_states_stream.dart +++ b/lib/src/subscription/subscription_states_stream.dart @@ -1,6 +1,6 @@ import 'dart:async'; -import 'package:centrifuge_dart/src/model/subscription_state.dart'; +import 'package:centrifuge_dart/src/subscription/subscription_state.dart'; /// Stream of Centrifuge's [CentrifugeSubscriptionState] changes. /// {@category Subscription} diff --git a/lib/src/transport/transport_interface.dart b/lib/src/transport/transport_interface.dart index 2295487..826d2f4 100644 --- a/lib/src/transport/transport_interface.dart +++ b/lib/src/transport/transport_interface.dart @@ -1,9 +1,9 @@ import 'dart:async'; -import 'package:centrifuge_dart/src/model/state.dart'; +import 'package:centrifuge_dart/src/client/state.dart'; import 'package:centrifuge_dart/src/model/stream_position.dart'; -import 'package:centrifuge_dart/src/model/subcibed_on_channel.dart'; -import 'package:centrifuge_dart/src/model/subscription_config.dart'; +import 'package:centrifuge_dart/src/subscription/subcibed_on_channel.dart'; +import 'package:centrifuge_dart/src/subscription/subscription_config.dart'; import 'package:meta/meta.dart'; /// Class responsible for sending and receiving data from the server. diff --git a/lib/src/transport/ws_protobuf_transport.dart b/lib/src/transport/ws_protobuf_transport.dart index 9911737..51ced74 100644 --- a/lib/src/transport/ws_protobuf_transport.dart +++ b/lib/src/transport/ws_protobuf_transport.dart @@ -5,7 +5,7 @@ import 'package:centrifuge_dart/centrifuge.dart'; import 'package:centrifuge_dart/src/model/disconnect_code.dart'; import 'package:centrifuge_dart/src/model/protobuf/client.pb.dart' as pb; import 'package:centrifuge_dart/src/model/stream_position.dart'; -import 'package:centrifuge_dart/src/model/subcibed_on_channel.dart'; +import 'package:centrifuge_dart/src/subscription/subcibed_on_channel.dart'; import 'package:centrifuge_dart/src/transport/transport_interface.dart'; import 'package:centrifuge_dart/src/transport/transport_protobuf_codec.dart'; import 'package:centrifuge_dart/src/util/logger.dart' as logger; diff --git a/lib/src/util/notifier.dart b/lib/src/util/notifier.dart new file mode 100644 index 0000000..deeddc1 --- /dev/null +++ b/lib/src/util/notifier.dart @@ -0,0 +1,36 @@ +/// Notify about value changes. +/// {@nodoc} +typedef ValueChanged = void Function(T value); + +/// Notify about value changes. +/// {@nodoc} +final class CentrifugeValueNotifier { + /// Notify about value changes. + /// {@nodoc} + CentrifugeValueNotifier(this._value); + + /// Current value. + /// {@nodoc} + T get value => _value; + T _value; + + /// Notify about value changes. + /// {@nodoc} + void notify(T value) { + if (_value == value) return; + _value = value; + for (var i = 0; i < _listeners.length; i++) _listeners[i](value); + } + + /// Listeners. + /// {@nodoc} + final List> _listeners = >[]; + + /// Add listener. + /// {@nodoc} + void addListener(ValueChanged listener) => _listeners.add(listener); + + /// Remove listener. + /// {@nodoc} + void removeListener(ValueChanged listener) => _listeners.remove(listener); +}