fix:implement sending queue
This commit is contained in:
parent
96c420fbf9
commit
4af89c6de4
|
|
@ -89,6 +89,8 @@ class Room {
|
|||
/// Key-Value store for private account data only visible for this user.
|
||||
Map<String, BasicRoomEvent> roomAccountData = {};
|
||||
|
||||
final _sendingQueue = <Completer>[];
|
||||
|
||||
Map<String, dynamic> toJson() => {
|
||||
'id': id,
|
||||
'membership': membership.toString().split('.').last,
|
||||
|
|
@ -893,6 +895,7 @@ class Room {
|
|||
|
||||
/// Sends an event to this room with this json as a content. Returns the
|
||||
/// event ID generated from the server.
|
||||
/// It uses list of completer to make sure events are sending in a row.
|
||||
Future<String?> sendEvent(
|
||||
Map<String, dynamic> content, {
|
||||
String type = EventTypes.Message,
|
||||
|
|
@ -977,10 +980,16 @@ class Room {
|
|||
),
|
||||
);
|
||||
await _handleFakeSync(syncUpdate);
|
||||
final completer = Completer();
|
||||
_sendingQueue.add(completer);
|
||||
while (_sendingQueue.first != completer) {
|
||||
await _sendingQueue.first.future;
|
||||
}
|
||||
|
||||
final timeoutDate = DateTime.now().add(client.sendTimelineEventTimeout);
|
||||
// Send the text and on success, store and display a *sent* event.
|
||||
String? res;
|
||||
|
||||
while (res == null) {
|
||||
try {
|
||||
res = await _sendContent(
|
||||
|
|
@ -994,6 +1003,8 @@ class Room {
|
|||
syncUpdate.rooms!.join!.values.first.timeline!.events!.first
|
||||
.unsigned![messageSendingStatusKey] = EventStatus.error.intValue;
|
||||
await _handleFakeSync(syncUpdate);
|
||||
completer.complete();
|
||||
_sendingQueue.remove(completer);
|
||||
return null;
|
||||
}
|
||||
Logs().w('Problem while sending message: $e Try again in 1 seconds...');
|
||||
|
|
@ -1004,6 +1015,8 @@ class Room {
|
|||
.unsigned![messageSendingStatusKey] = EventStatus.sent.intValue;
|
||||
syncUpdate.rooms!.join!.values.first.timeline!.events!.first.eventId = res;
|
||||
await _handleFakeSync(syncUpdate);
|
||||
completer.complete();
|
||||
_sendingQueue.remove(completer);
|
||||
|
||||
return res;
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in New Issue