blob: 4bb850f5b3012d6a6de8c00b101c44253919a9b9 [file] [log] [blame]
// Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
import 'dart:async';
import 'dart:convert';
import 'dart:typed_data';
import 'package:file/file.dart';
import 'codecs.dart';
import 'replay_file_system.dart';
import 'replay_file_system_entity.dart';
/// [File] implementation that replays all invocation activity from a prior
/// recording.
class ReplayFile extends ReplayFileSystemEntity implements File {
/// Creates a new `ReplayFile`.
ReplayFile(ReplayFileSystemImpl fileSystem, String identifier)
: super(fileSystem, identifier) {
Converter<String, File> reviveFile = ReviveFile(fileSystem);
Converter<String, Future<File>> reviveFileAsFuture =
reviveFile.fuse(const ToFuture<File>());
Converter<String, Uint8List> blobToBytes = BlobToBytes(fileSystem);
Converter<String, Future<Uint8List>> blobToBytesFuture =
blobToBytes.fuse(const ToFuture<Uint8List>());
Converter<String, String> blobToString =
blobToBytes.fuse(const Uint8ListToPlainList()).fuse(utf8.decoder);
Converter<String, Future<String>> blobToStringFuture =
blobToString.fuse(const ToFuture<String>());
Converter<String, RandomAccessFile> reviveRandomAccessFile =
ReviveRandomAccessFile(fileSystem);
Converter<String, Future<RandomAccessFile>> reviveRandomAccessFileFuture =
reviveRandomAccessFile.fuse(const ToFuture<RandomAccessFile>());
Converter<String, List<String>> lineSplitter =
const LineSplitterConverter();
Converter<String, List<String>> blobToLines =
blobToString.fuse(lineSplitter);
Converter<String, Future<List<String>>> blobToLinesFuture =
blobToLines.fuse(const ToFuture<List<String>>());
Converter<String, Stream<Uint8List>> blobToByteStream = blobToBytes
.fuse(const Listify<Uint8List>())
.fuse(const ToStream<Uint8List>());
Converter<int, Future<DateTime>> reviveDateTime =
DateTimeCodec.deserialize.fuse(const ToFuture<DateTime>());
methods.addAll(<Symbol, Converter<dynamic, dynamic>>{
#rename: reviveFileAsFuture,
#renameSync: reviveFile,
#delete: reviveFileAsFuture,
#create: reviveFileAsFuture,
#createSync: const Passthrough<Null>(),
#copy: reviveFileAsFuture,
#copySync: reviveFile,
#length: const ToFuture<int>(),
#lengthSync: const Passthrough<int>(),
#lastAccessed: reviveDateTime,
#lastAccessedSync: DateTimeCodec.deserialize,
#setLastAccessed: const ToFuture<dynamic>(),
#setLastAccessedSync: const Passthrough<Null>(),
#lastModified: reviveDateTime,
#lastModifiedSync: DateTimeCodec.deserialize,
#setLastModified: const ToFuture<dynamic>(),
#setLastModifiedSync: const Passthrough<Null>(),
#open: reviveRandomAccessFileFuture,
#openSync: reviveRandomAccessFile,
#openRead: blobToByteStream,
#openWrite: ReviveIOSink(fileSystem),
#readAsBytes: blobToBytesFuture,
#readAsBytesSync: blobToBytes,
#readAsString: blobToStringFuture,
#readAsStringSync: blobToString,
#readAsLines: blobToLinesFuture,
#readAsLinesSync: blobToLines,
#writeAsBytes: reviveFileAsFuture,
#writeAsBytesSync: const Passthrough<Null>(),
#writeAsString: reviveFileAsFuture,
#writeAsStringSync: const Passthrough<Null>(),
});
properties.addAll(<Symbol, Converter<dynamic, dynamic>>{
#absolute: reviveFile,
});
}
}