sendWithAck method
Sends message and returns a Future that completes when the server
acknowledges it, or throws TimeoutException after retries are exhausted.
Implementation
Future<void> sendWithAck(WebSocketMessage message) {
if (_disposed) return Future.error(StateError('AckManager disposed'));
final id = _generateId();
final meta = Map<String, dynamic>.from(message.metadata ?? {});
meta[_kAckIdKey] = id;
final wrapped = WebSocketMessage(
data: message.data,
timestamp: message.timestamp,
type: message.type,
metadata: meta,
);
final pending = _PendingAck(id: id, message: wrapped);
_pending[id] = pending;
_sender(wrapped).then((_) {
pending.scheduleTimeout(timeout, _onTimeout);
}).catchError((e) {
_pending.remove(id);
pending.fail(e);
});
return pending.future;
}