feat: Make defining managers better

This commit is contained in:
PapaTutuWawa 2023-01-27 21:54:16 +01:00
parent 47337540f5
commit 6da3342f22
34 changed files with 85 additions and 224 deletions

View File

@ -226,7 +226,7 @@ class XmppConnection {
/// Registers a list of [XmppManagerBase] sub-classes as managers on this connection.
Future<void> registerManagers(List<XmppManagerBase> managers) async {
for (final manager in managers) {
_log.finest('Registering ${manager.getId()}');
_log.finest('Registering ${manager.id}');
manager.register(
XmppManagerAttributes(
sendStanza: sendStanza,
@ -242,8 +242,7 @@ class XmppConnection {
),
);
final id = manager.getId();
_xmppManagers[id] = manager;
_xmppManagers[manager.id] = manager;
_incomingStanzaHandlers.addAll(manager.getIncomingStanzaHandlers());
_incomingPreStanzaHandlers.addAll(manager.getIncomingPreStanzaHandlers());
@ -260,7 +259,7 @@ class XmppConnection {
// Run the post register callbacks
for (final manager in _xmppManagers.values) {
if (!manager.initialized) {
_log.finest('Running post-registration callback for ${manager.getName()}');
_log.finest('Running post-registration callback for ${manager.name}');
await manager.postRegisterCallback();
}
}

View File

@ -10,6 +10,8 @@ import 'package:moxxmpp/src/xeps/xep_0030/types.dart';
import 'package:moxxmpp/src/xeps/xep_0030/xep_0030.dart';
abstract class XmppManagerBase {
XmppManagerBase(this.id);
late final XmppManagerAttributes _managerAttributes;
late final Logger _log;
@ -19,7 +21,7 @@ abstract class XmppManagerBase {
/// Registers the callbacks from XmppConnection with the manager
void register(XmppManagerAttributes attributes) {
_managerAttributes = attributes;
_log = Logger(getName());
_log = Logger(name);
}
/// Returns the attributes that are registered with the manager.
@ -60,10 +62,10 @@ abstract class XmppManagerBase {
List<Identity> getDiscoIdentities() => [];
/// Return the Id (akin to xmlns) of this manager.
String getId();
final String id;
/// Return a name that will be used for logging.
String getName();
/// The name of the manager.
String get name => toString();
/// Return the logger for this manager.
Logger get logger => _log;

View File

@ -76,11 +76,7 @@ class MessageDetails {
}
class MessageManager extends XmppManagerBase {
@override
String getId() => messageManager;
@override
String getName() => 'MessageManager';
MessageManager() : super(messageManager);
@override
List<StanzaHandler> getIncomingStanzaHandlers() => [

View File

@ -4,11 +4,7 @@ import 'package:moxxmpp/src/managers/namespaces.dart';
import 'package:moxxmpp/src/xeps/xep_0198/xep_0198.dart';
class PingManager extends XmppManagerBase {
@override
String getId() => pingManager;
@override
String getName() => 'PingManager';
PingManager() : super(pingManager);
@override
Future<bool> isSupported() async => true;

View File

@ -17,17 +17,11 @@ typedef PresencePreSendCallback = Future<List<XMLNode>> Function();
/// A mandatory manager that handles initial presence sending, sending of subscription
/// request management requests and triggers events for incoming presence stanzas.
class PresenceManager extends XmppManagerBase {
PresenceManager() : super();
PresenceManager() : super(presenceManager);
/// The list of pre-send callbacks.
final List<PresencePreSendCallback> _presenceCallbacks = List.empty(growable: true);
@override
String getId() => presenceManager;
@override
String getName() => 'PresenceManager';
@override
List<StanzaHandler> getIncomingStanzaHandlers() => [
StanzaHandler(

View File

@ -93,7 +93,7 @@ class RosterFeatureNegotiator extends XmppFeatureNegotiatorBase {
/// This manager requires a RosterFeatureNegotiator to be registered.
class RosterManager extends XmppManagerBase {
RosterManager(this._stateManager) : super();
RosterManager(this._stateManager) : super(rosterManager);
/// The class managing the entire roster state.
final BaseRosterStateManager _stateManager;
@ -104,12 +104,6 @@ class RosterManager extends XmppManagerBase {
_stateManager.register(attributes.sendEvent);
}
@override
String getId() => rosterManager;
@override
String getName() => 'RosterManager';
@override
List<StanzaHandler> getIncomingStanzaHandlers() => [
StanzaHandler(

View File

@ -11,13 +11,7 @@ import 'package:moxxmpp/src/xeps/xep_0446.dart';
const fileUploadNotificationXmlns = 'proto:urn:xmpp:fun:0';
class FileUploadNotificationManager extends XmppManagerBase {
FileUploadNotificationManager() : super();
@override
String getId() => fileUploadNotificationManager;
@override
String getName() => 'FileUploadNotificationManager';
FileUploadNotificationManager() : super(fileUploadNotificationManager);
@override
List<StanzaHandler> getIncomingStanzaHandlers() => [

View File

@ -33,7 +33,7 @@ class DiscoManager extends XmppManagerBase {
/// to a disco#info response.
DiscoManager(List<Identity> identities)
: _identities = List<Identity>.from(identities),
super();
super(discoManager);
/// Our features
final List<String> _features = List.empty(growable: true);
@ -90,12 +90,6 @@ class DiscoManager extends XmppManagerBase {
),
];
@override
String getId() => discoManager;
@override
String getName() => 'DiscoManager';
@override
List<String> getDiscoFeatures() => [ discoInfoXmlns, discoItemsXmlns ];

View File

@ -28,14 +28,8 @@ class VCard {
}
class VCardManager extends XmppManagerBase {
VCardManager() : _lastHash = {}, super();
final Map<String, String> _lastHash;
@override
String getId() => vcardManager;
@override
String getName() => 'vCardManager';
VCardManager() : super(vcardManager);
final Map<String, String> _lastHash = {};
@override
List<StanzaHandler> getIncomingStanzaHandlers() => [

View File

@ -69,11 +69,7 @@ class PubSubItem {
}
class PubSubManager extends XmppManagerBase {
@override
String getId() => pubsubManager;
@override
String getName() => 'PubsubManager';
PubSubManager() : super(pubsubManager);
@override
List<StanzaHandler> getIncomingStanzaHandlers() => [

View File

@ -8,7 +8,6 @@ import 'package:moxxmpp/src/stringxml.dart';
/// A data class representing the jabber:x:oob tag.
class OOBData {
const OOBData({ this.url, this.desc });
final String? url;
final String? desc;
@ -32,11 +31,7 @@ XMLNode constructOOBNode(OOBData data) {
}
class OOBManager extends XmppManagerBase {
@override
String getName() => 'OOBName';
@override
String getId() => oobManager;
OOBManager() : super(oobManager);
@override
List<String> getDiscoFeatures() => [ oobDataXmlns ];

View File

@ -28,24 +28,24 @@ class UserAvatarMetadata {
this.height,
this.mime,
);
/// The amount of bytes in the file
final int length;
/// The identifier of the avatar
final String id;
/// Image proportions
final int width;
final int height;
/// The MIME type of the avatar
final String mime;
}
/// NOTE: This class requires a PubSubManager
class UserAvatarManager extends XmppManagerBase {
@override
String getId() => userAvatarManager;
@override
String getName() => 'UserAvatarManager';
UserAvatarManager() : super(userAvatarManager);
PubSubManager _getPubSubManager() => getAttributes().getManagerById(pubsubManager)! as PubSubManager;

View File

@ -39,15 +39,11 @@ ChatState chatStateFromString(String raw) {
String chatStateToString(ChatState state) => state.toString().split('.').last;
class ChatStateManager extends XmppManagerBase {
ChatStateManager() : super(chatStateManager);
@override
List<String> getDiscoFeatures() => [ chatStateXmlns ];
@override
String getName() => 'ChatStateManager';
@override
String getId() => chatStateManager;
@override
List<StanzaHandler> getIncomingStanzaHandlers() => [
StanzaHandler(

View File

@ -71,7 +71,7 @@ Future<String> calculateCapabilityHash(DiscoInfo info, HashAlgorithm algorithm)
/// the DiscoManager.
/// NOTE: This manager requires that the DiscoManager is also registered.
class EntityCapabilitiesManager extends XmppManagerBase {
EntityCapabilitiesManager(this._capabilityHashBase) : super();
EntityCapabilitiesManager(this._capabilityHashBase) : super(entityCapabilitiesManager);
/// The string that is both the node under which we advertise the disco info
/// and the base for the actual node on which we respond to disco#info requests.
@ -80,19 +80,11 @@ class EntityCapabilitiesManager extends XmppManagerBase {
/// The cached capability hash.
String? _capabilityHash;
@override
String getName() => 'EntityCapabilitiesManager';
@override
String getId() => entityCapabilitiesManager;
@override
Future<bool> isSupported() async => true;
@override
List<String> getDiscoFeatures() => [
capsXmlns,
];
List<String> getDiscoFeatures() => [ capsXmlns ];
/// Computes, if required, the capability hash of the data provided by
/// the DiscoManager.

View File

@ -24,15 +24,11 @@ XMLNode makeMessageDeliveryResponse(String id) {
}
class MessageDeliveryReceiptManager extends XmppManagerBase {
MessageDeliveryReceiptManager() : super(messageDeliveryReceiptManager);
@override
List<String> getDiscoFeatures() => [ deliveryXmlns ];
@override
String getName() => 'MessageDeliveryReceiptManager';
@override
String getId() => messageDeliveryReceiptManager;
@override
List<StanzaHandler> getIncomingStanzaHandlers() => [
StanzaHandler(

View File

@ -9,16 +9,10 @@ import 'package:moxxmpp/src/stringxml.dart';
import 'package:moxxmpp/src/xeps/xep_0030/xep_0030.dart';
class BlockingManager extends XmppManagerBase {
BlockingManager() : _supported = false, _gotSupported = false, super();
BlockingManager() : super(blockingManager);
bool _supported;
bool _gotSupported;
@override
String getId() => blockingManager;
@override
String getName() => 'BlockingManager';
bool _supported = false;
bool _gotSupported = false;
@override
List<StanzaHandler> getIncomingStanzaHandlers() => [

View File

@ -21,40 +21,41 @@ const xmlUintMax = 4294967296; // 2**32
typedef StanzaAckedCallback = bool Function(Stanza stanza);
class StreamManagementManager extends XmppManagerBase {
StreamManagementManager({
this.ackTimeout = const Duration(seconds: 30),
})
: _state = StreamManagementState(0, 0),
_unackedStanzas = {},
_stateLock = Lock(),
_streamManagementEnabled = false,
_lastAckTimestamp = -1,
_pendingAcks = 0,
_streamResumed = false,
_ackLock = Lock();
}) : super(smManager);
/// The queue of stanzas that are not (yet) acked
final Map<int, Stanza> _unackedStanzas;
final Map<int, Stanza> _unackedStanzas = {};
/// Commitable state of the StreamManagementManager
StreamManagementState _state;
StreamManagementState _state = StreamManagementState(0, 0);
/// Mutex lock for _state
final Lock _stateLock;
final Lock _stateLock = Lock();
/// If the have enabled SM on the stream yet
bool _streamManagementEnabled;
bool _streamManagementEnabled = false;
/// If the current stream has been resumed;
bool _streamResumed;
bool _streamResumed = false;
/// The time in which the response to an ack is still valid. Counts as a timeout
/// otherwise
@internal
final Duration ackTimeout;
/// The time at which the last ack has been sent
int _lastAckTimestamp;
int _lastAckTimestamp = -1;
/// The timer to see if we timed the connection out
Timer? _ackTimer;
/// Counts how many acks we're waiting for
int _pendingAcks;
int _pendingAcks = 0;
/// Lock for both [_lastAckTimestamp] and [_pendingAcks].
final Lock _ackLock;
final Lock _ackLock = Lock();
/// Functions for testing
@visibleForTesting
@ -121,12 +122,6 @@ class StreamManagementManager extends XmppManagerBase {
bool get streamResumed => _streamResumed;
@override
String getId() => smManager;
@override
String getName() => 'StreamManagementManager';
@override
List<NonzaHandler> getNonzaHandlers() => [
NonzaHandler(

View File

@ -14,11 +14,7 @@ class DelayedDelivery {
}
class DelayedDeliveryManager extends XmppManagerBase {
@override
String getId() => delayedDeliveryManager;
@override
String getName() => 'DelayedDeliveryManager';
DelayedDeliveryManager() : super(delayedDeliveryManager);
@override
Future<bool> isSupported() async => true;

View File

@ -14,7 +14,7 @@ import 'package:moxxmpp/src/xeps/xep_0297.dart';
/// This manager class implements support for XEP-0280.
class CarbonsManager extends XmppManagerBase {
CarbonsManager() : super();
CarbonsManager() : super(carbonsManager);
/// Indicates that message carbons are enabled.
bool _isEnabled = false;
@ -25,12 +25,6 @@ class CarbonsManager extends XmppManagerBase {
/// Indicates that we know that [CarbonsManager._supported] is accurate.
bool _gotSupported = false;
@override
String getId() => carbonsManager;
@override
String getName() => 'CarbonsManager';
@override
List<StanzaHandler> getIncomingPreStanzaHandlers() => [
StanzaHandler(

View File

@ -61,11 +61,7 @@ HashFunction hashFunctionFromName(String name) {
}
class CryptographicHashManager extends XmppManagerBase {
@override
String getId() => cryptographicHashManager;
@override
String getName() => 'CryptographicHashManager';
CryptographicHashManager() : super(cryptographicHashManager);
@override
Future<bool> isSupported() async => true;
@ -81,7 +77,7 @@ class CryptographicHashManager extends XmppManagerBase {
];
static Future<List<int>> hashFromData(List<int> data, HashFunction function) async {
// TODO(PapaTutuWawa): Implemen the others as well
// TODO(PapaTutuWawa): Implement the others as well
HashAlgorithm algo;
switch (function) {
case HashFunction.sha256:

View File

@ -17,11 +17,7 @@ XMLNode makeLastMessageCorrectionEdit(String id) {
}
class LastMessageCorrectionManager extends XmppManagerBase {
@override
String getName() => 'LastMessageCorrectionManager';
@override
String getId() => lastMessageCorrectionManager;
LastMessageCorrectionManager() : super(lastMessageCorrectionManager);
@override
List<String> getDiscoFeatures() => [ lmcXmlns ];

View File

@ -25,11 +25,7 @@ XMLNode makeChatMarker(String tag, String id) {
}
class ChatMarkerManager extends XmppManagerBase {
@override
String getName() => 'ChatMarkerManager';
@override
String getId() => chatMarkerManager;
ChatMarkerManager() : super(chatMarkerManager);
@override
List<String> getDiscoFeatures() => [ chatMarkersXmlns ];

View File

@ -26,10 +26,10 @@ class CSIInactiveNonza extends XMLNode {
/// A Stub negotiator that is just for "intercepting" the stream feature.
class CSINegotiator extends XmppFeatureNegotiatorBase {
CSINegotiator() : _supported = false, super(11, false, csiXmlns, csiNegotiator);
CSINegotiator() : super(11, false, csiXmlns, csiNegotiator);
/// True if CSI is supported. False otherwise.
bool _supported;
bool _supported = false;
bool get isSupported => _supported;
@override
@ -50,15 +50,9 @@ class CSINegotiator extends XmppFeatureNegotiatorBase {
/// The manager requires a CSINegotiator to be registered as a feature negotiator.
class CSIManager extends XmppManagerBase {
CSIManager() : super(csiManager);
CSIManager() : _isActive = true, super();
bool _isActive;
@override
String getId() => csiManager;
@override
String getName() => 'CSIManager';
bool _isActive = true;
@override
Future<bool> isSupported() async {

View File

@ -13,7 +13,6 @@ import 'package:moxxmpp/src/xeps/xep_0030/xep_0030.dart';
/// NOTE: [StableStanzaId.stanzaId] must not be confused with the actual id attribute of
/// the message stanza.
class StableStanzaId {
const StableStanzaId({ this.originId, this.stanzaId, this.stanzaIdBy });
final String? originId;
final String? stanzaId;
@ -29,11 +28,7 @@ XMLNode makeOriginIdElement(String id) {
}
class StableIdManager extends XmppManagerBase {
@override
String getName() => 'StableIdManager';
@override
String getId() => stableIdManager;
StableIdManager() : super(stableIdManager);
@override
List<String> getDiscoFeatures() => [ stableIdXmlns ];

View File

@ -41,17 +41,19 @@ Map<String, String> prepareHeaders(Map<String, String> headers) {
}
class HttpFileUploadManager extends XmppManagerBase {
HttpFileUploadManager() : _gotSupported = false, _supported = false, super();
HttpFileUploadManager() : super(httpFileUploadManager);
/// The entity that we will request file uploads from, if discovered.
JID? _entityJid;
/// The maximum file upload file size, if advertised and discovered.
int? _maxUploadSize;
bool _gotSupported;
bool _supported;
@override
String getId() => httpFileUploadManager;
/// Flag, if we every tried to discover the upload entity.
bool _gotSupported = false;
@override
String getName() => 'HttpFileUploadManager';
/// Flag, if we can use HTTP File Upload
bool _supported = false;
/// Returns whether the entity provided an identity that tells us that we can ask it
/// for an HTTP upload slot.

View File

@ -53,20 +53,12 @@ XMLNode buildEmeElement(ExplicitEncryptionType type) {
}
class EmeManager extends XmppManagerBase {
EmeManager() : super();
@override
String getId() => emeManager;
@override
String getName() => 'EmeManager';
EmeManager() : super(emeManager);
@override
Future<bool> isSupported() async => true;
@override
List<String> getDiscoFeatures() => [emeXmlns];
List<String> getDiscoFeatures() => [ emeXmlns ];
@override
List<StanzaHandler> getIncomingStanzaHandlers() => [

View File

@ -42,12 +42,9 @@ const _doNotEncryptList = [
DoNotEncrypt('stanza-id', stableIdXmlns),
];
@mustCallSuper
abstract class BaseOmemoManager extends XmppManagerBase {
@override
String getId() => omemoManager;
@override
String getName() => 'OmemoManager';
BaseOmemoManager() : super(omemoManager);
// TODO(Unknown): Technically, this is not always true
@override

View File

@ -8,7 +8,6 @@ import 'package:moxxmpp/src/stringxml.dart';
import 'package:moxxmpp/src/xeps/staging/extensible_file_thumbnails.dart';
class StatelessMediaSharingData {
const StatelessMediaSharingData({ required this.mediaType, required this.size, required this.description, required this.hashes, required this.url, required this.thumbnails });
final String mediaType;
final int size;
@ -63,11 +62,7 @@ StatelessMediaSharingData parseSIMSElement(XMLNode node) {
}
class SIMSManager extends XmppManagerBase {
@override
String getName() => 'SIMSManager';
@override
String getId() => simsManager;
SIMSManager() : super(simsManager);
@override
List<String> getDiscoFeatures() => [ simsXmlns ];

View File

@ -12,11 +12,7 @@ class MessageRetractionData {
}
class MessageRetractionManager extends XmppManagerBase {
@override
String getName() => 'MessageRetractionManager';
@override
String getId() => messageRetractionManager;
MessageRetractionManager() : super(messageRetractionManager);
@override
List<String> getDiscoFeatures() => [ messageRetractionXmlns ];

View File

@ -29,15 +29,11 @@ class MessageReactions {
}
class MessageReactionsManager extends XmppManagerBase {
MessageReactionsManager() : super(messageReactionsManager);
@override
List<String> getDiscoFeatures() => [ messageReactionsXmlns ];
@override
String getName() => 'MessageReactionsManager';
@override
String getId() => messageReactionsManager;
@override
List<StanzaHandler> getIncomingStanzaHandlers() => [
StanzaHandler(

View File

@ -105,11 +105,7 @@ class StatelessFileSharingData {
}
class SFSManager extends XmppManagerBase {
@override
String getName() => 'SFSManager';
@override
String getId() => sfsManager;
SFSManager() : super(sfsManager);
@override
List<StanzaHandler> getIncomingStanzaHandlers() => [

View File

@ -225,11 +225,7 @@ class StickerPack {
}
class StickersManager extends XmppManagerBase {
@override
String getId() => stickersManager;
@override
String getName() => 'StickersManager';
StickersManager() : super(stickersManager);
@override
Future<bool> isSupported() async => true;

View File

@ -66,11 +66,7 @@ class QuoteData {
/// A manager implementing support for parsing XEP-0461 metadata. The
/// MessageRepliesManager itself does not modify the body of the message.
class MessageRepliesManager extends XmppManagerBase {
@override
String getName() => 'MessageRepliesManager';
@override
String getId() => messageRepliesManager;
MessageRepliesManager() : super(messageRepliesManager);
@override
List<String> getDiscoFeatures() => [

View File

@ -1,4 +1,5 @@
import 'package:moxxmpp/moxxmpp.dart';
import 'package:moxxmpp/src/xeps/xep_0030/cache.dart';
import 'package:test/test.dart';
import '../helpers/logging.dart';