markMessagesDelivered method
Mark messages as delivered (sets \Seen flag)
This is the equivalent of IMAP STORE +FLAGS \Seen
Implementation
Future<MarkDeliveredAck?> markMessagesDelivered(
List<String> messageIds, {
PeerId? serverPeerId,
String? folderPath,
}) async {
_logger.info('Marking ${messageIds.length} messages as delivered');
// Select server
final serverId = serverPeerId ??
await _serverSelector.selectServer(config.preferredServers);
if (serverId == null) {
_logger.warning('No S&F server available');
return null;
}
P2PStream? stream;
try {
// Use MAA (Mail Access Agent) protocol for IMAP-style operations
final context = Context();
stream = await host.newStream(
serverId,
[AccessHandler.protocolId],
context,
).timeout(config.connectionTimeout);
final ack = await AccessHandler.markDelivered(
stream,
messageIds,
folderPath: folderPath,
).timeout(config.messageTimeout);
_logger.info('Marked ${ack.updatedCount} messages as delivered');
return ack;
} on TimeoutException {
_logger.warning('Mark delivered timed out');
return null;
} catch (e) {
_logger.warning('Failed to mark messages delivered: $e');
return null;
} finally {
// The stream is closed on every path: a stream left open holds a slot
// on the connection for as long as the session lives.
if (stream != null && !stream.isClosed) {
try {
await stream.close();
} catch (e) {
_logger.fine('Error closing stream: $e');
}
}
}
}