sendMessage method
Sends m to the backend and returns its DeliveryStatus.
Implementation
@override
Future<DeliveryStatus> sendMessage(Message m) async {
if (!_connected) return DeliveryStatus.fail('not connected');
final ack = ++_ackCounter;
final completer = Completer<DeliveryStatus>();
_pending[m.id] = completer;
_send({
'type': 'message',
'ack': ack,
'payload': encodeMessage(m),
});
// Timeout after 15 s.
return completer.future.timeout(
const Duration(seconds: 15),
onTimeout: () {
_pending.remove(m.id);
return DeliveryStatus.fail('send timeout');
},
);
}