replay method

Future<RequestResult<RawPlaybackResult>> replay(
  1. List<int> recordStream, {
  2. bool force = false,
  3. Duration? timeout,
  4. List<List<int>>? dependencies,
})

Implementation

Future<RequestResult<RawPlaybackResult>> replay(List<int> recordStream,
    {bool force = false,
    Duration? timeout,
    List<List<int>>? dependencies}) async {
  Map<String, dynamic>? queryParameters = <String, dynamic>{};
  if (force) {
    queryParameters["force"] = null;
  }
  Uri url = Uri(
      scheme: "http",
      host: host,
      port: port,
      path: 'replay',
      queryParameters: queryParameters);
  final request = await _httpClient.postUrl(url);

  final tarEncoder = TarEncoder();
  OutputStream stream= OutputStream();
  tarEncoder.start(stream);
  tarEncoder.add(ArchiveFile(TarKey.replayData, recordStream.length, recordStream));

  if (dependencies != null) {
    for (int i = 0; i < dependencies.length; i++) {
      tarEncoder.add(ArchiveFile('${TarKey.dependencyPrefix}$i', dependencies[i].length, dependencies[i]));
    }
  }
  tarEncoder.finish();

  request.add(stream.getBytes());

  Future<HttpClientResponse> responseFuture = request.close();
  if (timeout != null) {
    Timer(timeout, () {
        request.abort();
    });
  }
  final response = await responseFuture;

  if (response.statusCode == HttpStatus.ok) {
    final tarData =await streamToIntList(response);
    Archive archive = TarDecoder().decodeBytes(tarData);


    final Map<String, Uint8List> snapshots = <String, Uint8List>{};
    List<int>? log;
    AppInfo appInfo = AppInfo();
    final iterator = archive.iterator;
    while (iterator.moveNext()) {
      final contents = iterator.current.content as List<int>;
      if (iterator.current.name.startsWith(TarKey.screenshotPrefix)) {
        snapshots[iterator.current.name] = Uint8List.fromList(contents);
      } else if (iterator.current.name == TarKey.log) {
        log = contents;
      }else if (iterator.current.name == TarKey.appInfo) {
        appInfo = AppInfo.fromBuffer(contents);
      }
    }
    return RequestResult(
        result: RawPlaybackResult(log: log, snapshots: snapshots,appInfo: appInfo));
  } else {
    final body = await streamToIntList(response);
    return RequestResult(error: BadRequestResponse.fromBuffer(body));
  }
}