blob: 6802a36894ae268c61df1cc4f8be4ad18a0c0185 [file] [log] [blame]
// Copyright 2020 The Dart Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Note: this is a copy from flutter tools, updated to work with dwds tests,
// and some functionality removed (does not support hot reload yet)
import 'dart:async';
import 'package:dwds/asset_reader.dart';
import 'package:dwds/config.dart';
import 'package:dwds/expression_compiler.dart';
import 'package:file/file.dart';
import 'package:logging/logging.dart';
import 'package:test_common/test_sdk_layout.dart';
import 'devfs.dart';
import 'frontend_server_client.dart';
class ResidentWebRunner {
final _logger = Logger('ResidentWebRunner');
ResidentWebRunner({
required this.mainUri,
required this.urlTunneler,
required this.projectDirectory,
required this.packageConfigFile,
required this.packageUriMapper,
required this.fileSystemRoots,
required this.fileSystemScheme,
required this.outputPath,
required this.compilerOptions,
required this.sdkLayout,
bool verbose = false,
}) {
final platformDillUri = Uri.file(sdkLayout.summaryPath);
generator = ResidentCompiler(
sdkLayout.sdkDirectory,
projectDirectory: projectDirectory,
packageConfigFile: packageConfigFile,
useDebuggerModuleNames: packageUriMapper.useDebuggerModuleNames,
platformDill: '$platformDillUri',
fileSystemRoots: fileSystemRoots,
fileSystemScheme: fileSystemScheme,
compilerOptions: compilerOptions,
sdkLayout: sdkLayout,
verbose: verbose,
);
expressionCompiler = TestExpressionCompiler(generator);
}
final UrlEncoder? urlTunneler;
final Uri mainUri;
final Uri projectDirectory;
final Uri packageConfigFile;
final PackageUriMapper packageUriMapper;
final String outputPath;
final List<Uri> fileSystemRoots;
final String fileSystemScheme;
final CompilerOptions compilerOptions;
final TestSdkLayout sdkLayout;
late ResidentCompiler generator;
late ExpressionCompiler expressionCompiler;
ProjectFileInvalidator? _projectFileInvalidator;
WebDevFS? devFS;
Uri? uri;
Future<int> run(
FileSystem fileSystem, {
String? hostname,
required int port,
required String index,
}) async {
_projectFileInvalidator ??= ProjectFileInvalidator(fileSystem: fileSystem);
devFS ??= WebDevFS(
fileSystem: fileSystem,
hostname: hostname ?? 'localhost',
port: port,
projectDirectory: projectDirectory,
packageUriMapper: packageUriMapper,
index: index,
urlTunneler: urlTunneler,
sdkLayout: sdkLayout,
compilerOptions: compilerOptions,
);
uri ??= await devFS!.create();
final report = await _updateDevFS(
initialCompile: true, fullRestart: false, fileServerUri: null);
if (!report.success) {
_logger.severe('Failed to compile application.');
return 1;
}
generator.accept();
return 0;
}
Future<int> rerun(
{required bool fullRestart,
// The uri of the `HttpServer` that handles file requests.
// TODO(srujzs): This should be the same as the uri of the AssetServer to
// align with Flutter tools, but currently is not. Delete when that's fixed.
required Uri fileServerUri}) async {
final report = await _updateDevFS(
initialCompile: false,
fullRestart: fullRestart,
fileServerUri: fileServerUri);
if (!report.success) {
_logger.severe('Failed to compile application.');
return 1;
}
generator.accept();
return 0;
}
Future<UpdateFSReport> _updateDevFS({
required bool initialCompile,
required bool fullRestart,
// The uri of the `TestServer` that handles file requests.
// TODO(srujzs): This should be the same as the uri of the AssetServer to
// align with Flutter tools, but currently is not. Delete when that's fixed.
required Uri? fileServerUri,
}) async {
final invalidationResult = await _projectFileInvalidator!.findInvalidated(
lastCompiled: devFS!.lastCompiled,
urisToMonitor: devFS!.sources,
packagesPath: packageConfigFile.toFilePath(),
);
final report = await devFS!.update(
mainUri: mainUri,
dillOutputPath: outputPath,
generator: generator,
invalidatedFiles: invalidationResult.uris!,
initialCompile: initialCompile,
fullRestart: fullRestart,
fileServerUri: fileServerUri);
return report;
}
Future<void> stop() async {
await generator.shutdown();
await devFS!.dispose();
}
}