Files
moxxy/lib/xmpp/ping.dart

46 lines
1.4 KiB
Dart

import "package:moxxyv2/xmpp/events.dart";
import "package:moxxyv2/xmpp/managers/base.dart";
import "package:moxxyv2/xmpp/managers/namespaces.dart";
import "package:moxxyv2/xmpp/xeps/xep_0198/xep_0198.dart";
class PingManager extends XmppManagerBase {
@override
String getId() => pingManager;
@override
String getName() => "PingManager";
void _logWarning() {
logger.warning("Cannot send keepalives as SM is not available, the socket disallows whitespace pings and does not manage its own keepalives. Cannot guarantee that the connection survives.");
}
@override
Future<void> onXmppEvent(XmppEvent event) async {
if (event is SendPingEvent) {
final attrs = getAttributes();
final socket = attrs.getSocket();
if (socket.managesKeepalives()) return;
final stream = attrs.getManagerById(smManager) as StreamManagementManager?;
if (stream != null) {
if (stream.isStreamManagementEnabled() /*&& stream.getUnackedStanzaCount() > 0*/) {
stream.sendAckRequestPing();
} else if (attrs.getSocket().whitespacePingAllowed()) {
attrs.sendRawXml("");
} else {
_logWarning();
}
} else {
if (attrs.getSocket().whitespacePingAllowed()) {
attrs.sendRawXml("");
} else {
_logWarning();
}
}
} else if (event is AckRequestResponseTimeoutEvent) {
getAttributes().getConnection().handleError(event);
}
}
}