deleteMessages method
Delete messages immediately (bypasses \Deleted flag)
This is the equivalent of IMAP STORE +FLAGS \Deleted followed by EXPUNGE
Implementation
Future<DeleteMessagesAck?> deleteMessages(
List<String> messageIds, {
PeerId? serverPeerId,
}) async {
_logger.info('Deleting ${messageIds.length} messages immediately');
// 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.deleteMessages(
stream,
messageIds,
).timeout(config.messageTimeout);
_logger.info('Deleted ${ack.deletedCount} messages');
return ack;
} on TimeoutException {
_logger.warning('Delete timed out');
return null;
} catch (e) {
_logger.warning('Failed to delete messages: $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');
}
}
}
}