import 'package:logging/logging.dart'; import 'package:moxxmpp/moxxmpp.dart'; import 'package:moxxmpp_socket_tcp/moxxmpp_socket_tcp.dart'; class TestingTCPSocketWrapper extends TCPSocketWrapper { @override bool onBadCertificate(dynamic certificate, String domain) { return true; } } class EchoMessageManager extends XmppManagerBase { EchoMessageManager() : super('org.moxxy.example.message'); @override Future isSupported() async => true; @override List getIncomingStanzaHandlers() => [ StanzaHandler( stanzaTag: 'message', callback: _onMessage, priority: -100, xmlns: null, ) ]; Future _onMessage( Stanza stanza, StanzaHandlerData state, ) async { final body = stanza.firstTag('body'); if (body == null) return state..done = true; final bodyText = body.innerText(); await getAttributes().sendStanza( StanzaDetails( Stanza.message( to: stanza.from, children: [ XMLNode( tag: 'body', text: 'Hello, ${stanza.from}! You said "$bodyText"', ), ], ), awaitable: false, ), ); return state..done = true; } } void main(List arguments) async { Logger.root.level = Level.ALL; Logger.root.onRecord.listen((record) { // ignore: avoid_print print( '[${record.level.name}] (${record.loggerName}) ${record.time}: ${record.message}', ); }); final conn = XmppConnection( TestingReconnectionPolicy(), AlwaysConnectedConnectivityManager(), ComponentToServerNegotiator(), TestingTCPSocketWrapper(), )..connectionSettings = ConnectionSettings( jid: JID.fromString('component.localhost'), password: 'abc123', host: '127.0.0.1', port: 8888, ); await conn.registerManagers([ EchoMessageManager(), ]); final result = await conn.connect( waitUntilLogin: true, shouldReconnect: false, enableReconnectOnSuccess: false, ); if (result.isType()) { print('Failed to connect as component'); return; } // Just block for some time to test the connection await Future.delayed(const Duration(seconds: 9999)); }