sendMessage method

Future<Message> sendMessage(
  1. Message message, {
  2. Duration? timeout,
})

通过 WebSocket 发送消息,等待服务端 ACK。 发送前写入本地(status=发送中),成功后标记 status=0。

无网络时 即时失败(GoChatErrorCode.networkUnavailable),不会挂起等待。

Implementation

Future<Message> sendMessage(Message message, {Duration? timeout}) async {
  try {
    assertCanSend();
  } on GoChatException catch (e) {
    message.status = 2;
    await _store.upsertMessage(message);
    _listener?.msgSendFailed(message.msgId, e.message);
    rethrow;
  }

  message.status = 1;
  await _store.upsertMessage(message);
  _listener?.msgSendProgress(message.msgId, 10);

  final payload = _toSendPayload(message);
  try {
    await _net.ws.sendAndWaitAck(
      payload,
      timeout: timeout ?? const Duration(seconds: 15),
    );
    message.status = 0;
    await _store.upsertMessage(message);
    await _conversationManager.onNewMessage(message, fromSelf: true);
    _listener?.msgSendProgress(message.msgId, 100);
    return message;
  } catch (e) {
    message.status = 2;
    await _store.upsertMessage(message);
    _listener?.msgSendFailed(message.msgId, e.toString());
    rethrow;
  }
}