deleteMessages method

Future<DeleteMessagesAck?> deleteMessages(
  1. List<String> messageIds, {
  2. PeerId? serverPeerId,
})

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');
      }
    }
  }
}