replay method
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));
}
}