sendAndWaitAck method

Future<void> sendAndWaitAck(
  1. Map<String, dynamic> payload, {
  2. Duration timeout = const Duration(seconds: 15),
})

发送消息并等待 im.message.send.ack / event_error

Implementation

Future<void> sendAndWaitAck(
  Map<String, dynamic> payload, {
  Duration timeout = const Duration(seconds: 15),
}) async {
  final msgId = payload['msg_id']?.toString() ?? '';
  if (msgId.isEmpty) {
    throw GoChatException('msg_id 不能为空');
  }
  final completer = Completer<void>();
  _pendingAcks[msgId] = completer;
  await emit(WsEvents.messageSend, payload);
  try {
    await completer.future.timeout(timeout, onTimeout: () {
      _pendingAcks.remove(msgId);
      throw GoChatException('发送消息超时');
    });
  } catch (e) {
    _pendingAcks.remove(msgId);
    rethrow;
  }
}