chore(xep): Move DiscoManager from String to JID
This commit is contained in:
parent
c6552968d5
commit
b1da6e5a53
@ -6,6 +6,9 @@
|
||||
- The `DiscoManager` now only handled entity capabilities if a `EntityCapabilityManager` is registered.
|
||||
- The `EntityCapabilityManager` now verifies and validates its data before caching.
|
||||
- **BREAKING**: Added the `resumed` parameter to `StreamNegotiationsDoneEvent`. Use this to check if the current stream is new or resumed instead of using the `ConnectionStateChangedEvent`.
|
||||
- **BREAKING**: Remove `DiscoManager.discoInfoCapHashQuery`.
|
||||
- **BREAKING**: The entity argument of `DiscoManager.discoInfoQuery` and `DiscoManager.discoItemsQuery` are now `JID` instead of `String`.
|
||||
- **BREAKING**: `PubSubManager` and `UserAvatarManager` now use `JID` instead of `String`.
|
||||
|
||||
## 0.3.1
|
||||
|
||||
|
@ -63,6 +63,11 @@ class JID {
|
||||
/// Converts the JID into one with a resource part of [resource].
|
||||
JID withResource(String resource) => JID(local, domain, resource);
|
||||
|
||||
/// Convert the JID into the JID of the domain. For example, converts alice@example.org/abc123 to example.org.
|
||||
JID toDomain() {
|
||||
return JID('', domain, '');
|
||||
}
|
||||
|
||||
/// Compares the JID with [other]. This function assumes that JID and [other]
|
||||
/// are bare, i.e. only the domain- and localparts are compared. If [ensureBare]
|
||||
/// is optionally set to true, then [other] MUST be bare. Otherwise, false is returned.
|
||||
|
@ -45,7 +45,7 @@ abstract class XmppManagerBase {
|
||||
);
|
||||
|
||||
final result = await dm!.discoInfoQuery(
|
||||
_managerAttributes.getConnectionSettings().jid.domain,
|
||||
_managerAttributes.getConnectionSettings().jid.toDomain(),
|
||||
shouldEncrypt: false,
|
||||
);
|
||||
if (result.isType<DiscoError>()) {
|
||||
|
@ -1,4 +1,5 @@
|
||||
import 'package:meta/meta.dart';
|
||||
import 'package:moxxmpp/src/jid.dart';
|
||||
|
||||
@internal
|
||||
@immutable
|
||||
@ -6,8 +7,7 @@ class DiscoCacheKey {
|
||||
const DiscoCacheKey(this.jid, this.node);
|
||||
|
||||
/// The JID we're requesting disco data from.
|
||||
// TODO(Unknown): Replace with JID
|
||||
final String jid;
|
||||
final JID jid;
|
||||
|
||||
/// Optionally the node we are requesting from.
|
||||
final String? node;
|
||||
|
@ -1,12 +1,13 @@
|
||||
import 'package:moxxmpp/src/jid.dart';
|
||||
import 'package:moxxmpp/src/namespaces.dart';
|
||||
import 'package:moxxmpp/src/stanza.dart';
|
||||
import 'package:moxxmpp/src/stringxml.dart';
|
||||
|
||||
// TODO(PapaTutuWawa): Move types into types.dart
|
||||
|
||||
Stanza buildDiscoInfoQueryStanza(String entity, String? node) {
|
||||
Stanza buildDiscoInfoQueryStanza(JID entity, String? node) {
|
||||
return Stanza.iq(
|
||||
to: entity,
|
||||
to: entity.toString(),
|
||||
type: 'get',
|
||||
children: [
|
||||
XMLNode.xmlns(
|
||||
@ -18,9 +19,9 @@ Stanza buildDiscoInfoQueryStanza(String entity, String? node) {
|
||||
);
|
||||
}
|
||||
|
||||
Stanza buildDiscoItemsQueryStanza(String entity, {String? node}) {
|
||||
Stanza buildDiscoItemsQueryStanza(JID entity, {String? node}) {
|
||||
return Stanza.iq(
|
||||
to: entity,
|
||||
to: entity.toString(),
|
||||
type: 'get',
|
||||
children: [
|
||||
XMLNode.xmlns(
|
||||
|
@ -108,13 +108,13 @@ class DiscoInfo {
|
||||
@immutable
|
||||
class DiscoItem {
|
||||
const DiscoItem({required this.jid, this.node, this.name});
|
||||
final String jid;
|
||||
final JID jid;
|
||||
final String? node;
|
||||
final String? name;
|
||||
|
||||
XMLNode toXml() {
|
||||
final attributes = {
|
||||
'jid': jid,
|
||||
'jid': jid.toString(),
|
||||
};
|
||||
if (node != null) {
|
||||
attributes['node'] = node!;
|
||||
|
@ -253,7 +253,7 @@ class DiscoManager extends XmppManagerBase {
|
||||
/// [shouldCache] indicates whether the successful result of the disco#info query
|
||||
/// should be cached (true) or not(false).
|
||||
Future<Result<DiscoError, DiscoInfo>> discoInfoQuery(
|
||||
String entity, {
|
||||
JID entity, {
|
||||
String? node,
|
||||
bool shouldEncrypt = true,
|
||||
bool shouldCache = true,
|
||||
@ -272,7 +272,7 @@ class DiscoManager extends XmppManagerBase {
|
||||
} else {
|
||||
// Check if we know entity capabilities
|
||||
if (ecm != null && node == null) {
|
||||
info = await ecm.getCachedDiscoInfoFromJid(JID.fromString(entity));
|
||||
info = await ecm.getCachedDiscoInfoFromJid(entity);
|
||||
if (info != null) {
|
||||
return null;
|
||||
}
|
||||
@ -312,7 +312,7 @@ class DiscoManager extends XmppManagerBase {
|
||||
final result = Result<DiscoError, DiscoInfo>(
|
||||
DiscoInfo.fromQuery(
|
||||
query,
|
||||
JID.fromString(entity),
|
||||
entity,
|
||||
),
|
||||
);
|
||||
await _exitDiscoInfoCriticalSection(cacheKey, result, shouldCache);
|
||||
@ -321,7 +321,7 @@ class DiscoManager extends XmppManagerBase {
|
||||
|
||||
/// Sends a disco items query to the (full) jid [entity], optionally with node=[node].
|
||||
Future<Result<DiscoError, List<DiscoItem>>> discoItemsQuery(
|
||||
String entity, {
|
||||
JID entity, {
|
||||
String? node,
|
||||
bool shouldEncrypt = true,
|
||||
}) async {
|
||||
@ -357,7 +357,7 @@ class DiscoManager extends XmppManagerBase {
|
||||
.findTags('item')
|
||||
.map(
|
||||
(node) => DiscoItem(
|
||||
jid: node.attributes['jid']! as String,
|
||||
jid: JID.fromString(node.attributes['jid']! as String),
|
||||
node: node.attributes['node'] as String?,
|
||||
name: node.attributes['name'] as String?,
|
||||
),
|
||||
@ -369,18 +369,9 @@ class DiscoManager extends XmppManagerBase {
|
||||
return result;
|
||||
}
|
||||
|
||||
/// Queries information about a jid based on its node and capability hash.
|
||||
Future<Result<DiscoError, DiscoInfo>> discoInfoCapHashQuery(
|
||||
String jid,
|
||||
String node,
|
||||
String ver,
|
||||
) async {
|
||||
return discoInfoQuery(jid, node: '$node#$ver');
|
||||
}
|
||||
|
||||
Future<Result<DiscoError, List<DiscoInfo>>> performDiscoSweep() async {
|
||||
final attrs = getAttributes();
|
||||
final serverJid = attrs.getConnectionSettings().jid.domain;
|
||||
final serverJid = attrs.getConnectionSettings().jid.toDomain();
|
||||
final infoResults = List<DiscoInfo>.empty(growable: true);
|
||||
final result = await discoInfoQuery(serverJid);
|
||||
if (result.isType<DiscoInfo>()) {
|
||||
@ -423,7 +414,7 @@ class DiscoManager extends XmppManagerBase {
|
||||
/// A wrapper function around discoInfoQuery: Returns true if the entity with JID
|
||||
/// [entity] supports the disco feature [feature]. If not, returns false.
|
||||
Future<bool> supportsFeature(JID entity, String feature) async {
|
||||
final info = await discoInfoQuery(entity.toString());
|
||||
final info = await discoInfoQuery(entity);
|
||||
if (info.isType<DiscoError>()) return false;
|
||||
|
||||
return info.get<DiscoInfo>().features.contains(feature);
|
||||
|
@ -117,7 +117,7 @@ class PubSubManager extends XmppManagerBase {
|
||||
return state.copyWith(done: true);
|
||||
}
|
||||
|
||||
Future<int> _getNodeItemCount(String jid, String node) async {
|
||||
Future<int> _getNodeItemCount(JID jid, String node) async {
|
||||
final dm = getAttributes().getManagerById<DiscoManager>(discoManager)!;
|
||||
final response = await dm.discoItemsQuery(jid, node: node);
|
||||
var count = 0;
|
||||
@ -136,7 +136,7 @@ class PubSubManager extends XmppManagerBase {
|
||||
// with the requested configuration.
|
||||
@visibleForTesting
|
||||
Future<PubSubPublishOptions> preprocessPublishOptions(
|
||||
String jid,
|
||||
JID jid,
|
||||
String node,
|
||||
PubSubPublishOptions options,
|
||||
) async {
|
||||
@ -264,7 +264,7 @@ class PubSubManager extends XmppManagerBase {
|
||||
/// Publish [payload] to the PubSub node [node] on JID [jid]. Returns true if it
|
||||
/// was successful. False otherwise.
|
||||
Future<Result<PubSubError, bool>> publish(
|
||||
String jid,
|
||||
JID jid,
|
||||
String node,
|
||||
XMLNode payload, {
|
||||
String? id,
|
||||
@ -280,7 +280,7 @@ class PubSubManager extends XmppManagerBase {
|
||||
}
|
||||
|
||||
Future<Result<PubSubError, bool>> _publish(
|
||||
String jid,
|
||||
JID jid,
|
||||
String node,
|
||||
XMLNode payload, {
|
||||
String? id,
|
||||
@ -296,7 +296,7 @@ class PubSubManager extends XmppManagerBase {
|
||||
final result = await getAttributes().sendStanza(
|
||||
Stanza.iq(
|
||||
type: 'set',
|
||||
to: jid,
|
||||
to: jid.toString(),
|
||||
children: [
|
||||
XMLNode.xmlns(
|
||||
tag: 'pubsub',
|
||||
@ -481,7 +481,7 @@ class PubSubManager extends XmppManagerBase {
|
||||
}
|
||||
|
||||
Future<Result<PubSubError, bool>> configure(
|
||||
String jid,
|
||||
JID jid,
|
||||
String node,
|
||||
PubSubPublishOptions options,
|
||||
) async {
|
||||
@ -491,7 +491,7 @@ class PubSubManager extends XmppManagerBase {
|
||||
final form = await attrs.sendStanza(
|
||||
Stanza.iq(
|
||||
type: 'get',
|
||||
to: jid,
|
||||
to: jid.toString(),
|
||||
children: [
|
||||
XMLNode.xmlns(
|
||||
tag: 'pubsub',
|
||||
@ -515,7 +515,7 @@ class PubSubManager extends XmppManagerBase {
|
||||
final submit = await attrs.sendStanza(
|
||||
Stanza.iq(
|
||||
type: 'set',
|
||||
to: jid,
|
||||
to: jid.toString(),
|
||||
children: [
|
||||
XMLNode.xmlns(
|
||||
tag: 'pubsub',
|
||||
|
@ -1,4 +1,5 @@
|
||||
import 'package:moxxmpp/src/events.dart';
|
||||
import 'package:moxxmpp/src/jid.dart';
|
||||
import 'package:moxxmpp/src/managers/base.dart';
|
||||
import 'package:moxxmpp/src/managers/namespaces.dart';
|
||||
import 'package:moxxmpp/src/namespaces.dart';
|
||||
@ -106,7 +107,7 @@ class UserAvatarManager extends XmppManagerBase {
|
||||
) async {
|
||||
final pubsub = _getPubSubManager();
|
||||
final result = await pubsub.publish(
|
||||
getAttributes().getFullJID().toBare().toString(),
|
||||
getAttributes().getFullJID().toBare(),
|
||||
userAvatarDataXmlns,
|
||||
XMLNode.xmlns(
|
||||
tag: 'data',
|
||||
@ -133,7 +134,7 @@ class UserAvatarManager extends XmppManagerBase {
|
||||
) async {
|
||||
final pubsub = _getPubSubManager();
|
||||
final result = await pubsub.publish(
|
||||
getAttributes().getFullJID().toBare().toString(),
|
||||
getAttributes().getFullJID().toBare(),
|
||||
userAvatarMetadataXmlns,
|
||||
XMLNode.xmlns(
|
||||
tag: 'metadata',
|
||||
@ -178,7 +179,7 @@ class UserAvatarManager extends XmppManagerBase {
|
||||
/// Returns the PubSub Id of an avatar after doing a disco#items query.
|
||||
/// Note that this assumes that there is only one (1) item published on
|
||||
/// the node.
|
||||
Future<Result<AvatarError, String>> getAvatarId(String jid) async {
|
||||
Future<Result<AvatarError, String>> getAvatarId(JID jid) async {
|
||||
final disco = getAttributes().getManagerById(discoManager)! as DiscoManager;
|
||||
final response = await disco.discoItemsQuery(
|
||||
jid,
|
||||
|
@ -181,7 +181,7 @@ class EntityCapabilitiesManager extends XmppManagerBase {
|
||||
|
||||
final dm = getAttributes().getManagerById<DiscoManager>(discoManager)!;
|
||||
final discoRequest = await dm.discoInfoQuery(
|
||||
event.jid.toString(),
|
||||
event.jid,
|
||||
node: capabilityNode,
|
||||
);
|
||||
if (discoRequest.isType<DiscoError>()) {
|
||||
@ -194,7 +194,7 @@ class EntityCapabilitiesManager extends XmppManagerBase {
|
||||
await dm.addCachedDiscoInfo(
|
||||
MapEntry<DiscoCacheKey, DiscoInfo>(
|
||||
DiscoCacheKey(
|
||||
event.jid.toString(),
|
||||
event.jid,
|
||||
null,
|
||||
),
|
||||
discoInfo,
|
||||
|
@ -68,7 +68,7 @@ class StableIdManager extends XmppManagerBase {
|
||||
logger.finest('Found stanza Id tag');
|
||||
final attrs = getAttributes();
|
||||
final disco = attrs.getManagerById<DiscoManager>(discoManager)!;
|
||||
final result = await disco.discoInfoQuery(from.toString());
|
||||
final result = await disco.discoInfoQuery(from);
|
||||
if (result.isType<DiscoInfo>()) {
|
||||
final info = result.get<DiscoInfo>();
|
||||
logger.finest('Got info for ${from.toString()}');
|
||||
|
@ -609,7 +609,7 @@ abstract class BaseOmemoManager extends XmppManagerBase {
|
||||
);
|
||||
|
||||
final deviceListPublish = await pm.publish(
|
||||
bareJid.toString(),
|
||||
bareJid,
|
||||
omemoDevicesXmlns,
|
||||
newDeviceList,
|
||||
id: 'current',
|
||||
@ -621,7 +621,7 @@ abstract class BaseOmemoManager extends XmppManagerBase {
|
||||
}
|
||||
|
||||
final deviceBundlePublish = await pm.publish(
|
||||
bareJid.toString(),
|
||||
bareJid,
|
||||
omemoBundlesXmlns,
|
||||
bundleToXML(bundle),
|
||||
id: '${bundle.id}',
|
||||
@ -646,7 +646,7 @@ abstract class BaseOmemoManager extends XmppManagerBase {
|
||||
/// On failure, returns an OmemoError.
|
||||
Future<Result<OmemoError, bool>> supportsOmemo(JID jid) async {
|
||||
final dm = getAttributes().getManagerById<DiscoManager>(discoManager)!;
|
||||
final items = await dm.discoItemsQuery(jid.toBare().toString());
|
||||
final items = await dm.discoItemsQuery(jid.toBare());
|
||||
|
||||
if (items.isType<DiscoError>()) return Result(UnknownOmemoError());
|
||||
|
||||
@ -686,7 +686,7 @@ abstract class BaseOmemoManager extends XmppManagerBase {
|
||||
.toList(),
|
||||
);
|
||||
final publishResult = await pm.publish(
|
||||
jid.toString(),
|
||||
jid,
|
||||
omemoDevicesXmlns,
|
||||
newPayload,
|
||||
id: 'current',
|
||||
|
@ -267,7 +267,7 @@ class StickersManager extends XmppManagerBase {
|
||||
final pm = getAttributes().getManagerById<PubSubManager>(pubsubManager)!;
|
||||
|
||||
return pm.publish(
|
||||
jid.toBare().toString(),
|
||||
jid.toBare(),
|
||||
stickersXmlns,
|
||||
pack.toXML(),
|
||||
id: pack.id,
|
||||
|
@ -95,14 +95,12 @@ void main() {
|
||||
await Future<void>.delayed(const Duration(seconds: 3));
|
||||
|
||||
final jid = JID.fromString('romeo@montague.lit/orchard');
|
||||
final result1 = disco.discoInfoQuery(jid.toString());
|
||||
final result2 = disco.discoInfoQuery(jid.toString());
|
||||
final result1 = disco.discoInfoQuery(jid);
|
||||
final result2 = disco.discoInfoQuery(jid);
|
||||
|
||||
await Future<void>.delayed(const Duration(seconds: 1));
|
||||
expect(
|
||||
disco.infoTracker
|
||||
.getRunningTasks(DiscoCacheKey(jid.toString(), null))
|
||||
.length,
|
||||
disco.infoTracker.getRunningTasks(DiscoCacheKey(jid, null)).length,
|
||||
1,
|
||||
);
|
||||
fakeSocket.injectRawXml(
|
||||
@ -140,7 +138,7 @@ void main() {
|
||||
);
|
||||
|
||||
// Query Alice's device
|
||||
final result = await dm.discoInfoQuery(aliceJid.toString());
|
||||
final result = await dm.discoInfoQuery(aliceJid);
|
||||
expect(result.isType<DiscoError>(), false);
|
||||
expect(tm.sentStanzas, 0);
|
||||
});
|
||||
|
@ -12,7 +12,7 @@ class StubbedDiscoManager extends DiscoManager {
|
||||
|
||||
@override
|
||||
Future<Result<DiscoError, DiscoInfo>> discoInfoQuery(
|
||||
String entity, {
|
||||
JID entity, {
|
||||
String? node,
|
||||
bool shouldEncrypt = true,
|
||||
bool shouldCache = true,
|
||||
@ -32,7 +32,7 @@ class StubbedDiscoManager extends DiscoManager {
|
||||
|
||||
@override
|
||||
Future<Result<DiscoError, List<DiscoItem>>> discoItemsQuery(
|
||||
String entity, {
|
||||
JID entity, {
|
||||
String? node,
|
||||
bool shouldEncrypt = true,
|
||||
}) async {
|
||||
@ -59,7 +59,7 @@ void main() {
|
||||
await tm.register(manager);
|
||||
|
||||
final result = await manager.preprocessPublishOptions(
|
||||
'pubsub.server.example.org',
|
||||
JID.fromString('pubsub.server.example.org'),
|
||||
'urn:xmpp:omemo:2:bundles',
|
||||
const PubSubPublishOptions(maxItems: 'max'),
|
||||
);
|
||||
@ -76,7 +76,7 @@ void main() {
|
||||
await tm.register(manager);
|
||||
|
||||
final result = await manager.preprocessPublishOptions(
|
||||
'pubsub.server.example.org',
|
||||
JID.fromString('pubsub.server.example.org'),
|
||||
'urn:xmpp:omemo:2:bundles',
|
||||
const PubSubPublishOptions(maxItems: 'max'),
|
||||
);
|
||||
@ -182,7 +182,7 @@ void main() {
|
||||
final item = XMLNode(tag: 'test-item');
|
||||
final result =
|
||||
await connection.getManagerById<PubSubManager>(pubsubManager)!.publish(
|
||||
'pubsub.server.example.org',
|
||||
JID.fromString('pubsub.server.example.org'),
|
||||
'princely_musings',
|
||||
item,
|
||||
id: 'current',
|
||||
|
@ -27,7 +27,7 @@ class StubbedDiscoManager extends DiscoManager {
|
||||
|
||||
@override
|
||||
Future<Result<DiscoError, DiscoInfo>> discoInfoQuery(
|
||||
String entity, {
|
||||
JID entity, {
|
||||
String? node,
|
||||
bool shouldEncrypt = true,
|
||||
bool shouldCache = true,
|
||||
|
Loading…
Reference in New Issue
Block a user