list method

All sessions in directory, sorted from oldest to newest (by last activity).

Implementation

Future<List<FileLogSession>> list() async {
  final dir = Directory(directory);
  if (!dir.existsSync()) return const [];

  final chunksById =
      <String, List<({int index, File file, FileStat stat})>>{};
  await for (final entity in dir.list()) {
    if (entity is! File) continue;
    final parsed = parseChunkName(entity.uri.pathSegments.last);
    if (parsed == null) continue;
    final stat = entity.statSync();
    // Файл могли удалить между list() и statSync (ротация/очистка другого
    // процесса) — иначе сессия получит size -1 и lastModified около эпохи.
    if (stat.type == FileSystemEntityType.notFound) continue;
    chunksById
        .putIfAbsent(parsed.sessionId, () => [])
        .add((index: parsed.index, file: entity, stat: stat));
  }

  final sessions = <FileLogSession>[];
  for (final MapEntry(key: id, value: chunks) in chunksById.entries) {
    chunks.sort((a, b) => a.index.compareTo(b.index));
    var size = 0;
    var lastModified = DateTime.fromMillisecondsSinceEpoch(0);
    for (final chunk in chunks) {
      size += chunk.stat.size;
      if (chunk.stat.modified.isAfter(lastModified)) {
        lastModified = chunk.stat.modified;
      }
    }
    sessions.add(
      FileLogSession._(
        id: id,
        files: List.unmodifiable(chunks.map((c) => c.file)),
        size: size,
        lastModified: lastModified,
      ),
    );
  }

  sessions.sort(
    (a, b) => switch (a.lastModified.compareTo(b.lastModified)) {
      0 => a.id.compareTo(b.id),
      final byTime => byTime,
    },
  );

  return sessions;
}