open static method

Future<DirectoryDomeContainer> open(
  1. Directory dir, {
  2. DomeLimits limits = const DomeLimits(),
})

Lists dir (regular files only; symbolic links are refused as unsafe).

Implementation

static Future<DirectoryDomeContainer> open(
  Directory dir, {
  DomeLimits limits = const DomeLimits(),
}) async {
  final root = dir.absolute.path;
  final list = <DomeEntryInfo>[];
  await for (final e in dir.list(recursive: true, followLinks: false)) {
    if (e is Link) {
      throw ValidationException(
        e.path.substring(root.length + 1),
        'symbolic link in a .dome',
      );
    }
    if (e is! File) continue;
    final rel = e.absolute.path
        .substring(root.length + 1)
        .replaceAll(Platform.pathSeparator, '/');
    final bad = badEntryPath(rel);
    if (bad != null) {
      throw ValidationException(rel, 'unsafe entry path: $bad');
    }
    list.add(DomeEntryInfo(rel, await e.length(), stored: true));
    if (list.length > limits.maxEntries) {
      throw PayloadTooLargeException(
        'more than ${limits.maxEntries} entries',
      );
    }
  }
  list.sort((a, b) => a.path.compareTo(b.path));
  return DirectoryDomeContainer._(root, List.unmodifiable(list));
}