sendMessage method
通过 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;
}
}