markMessagesDelivered method

Future<MarkDeliveredAck?> markMessagesDelivered(
  1. List<String> messageIds, {
  2. PeerId? serverPeerId,
  3. String? folderPath,
})

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