blob: fafbf345add4aad37aa0dfd11e2493fccd577a55 [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;
late WebDevFS devFS;
late Uri uri;
late Iterable<String> modules;
Future<int> run(
FileSystem fileSystem, String? hostname, int port, String index) async {
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();
if (!report.success) {
_logger.severe('Failed to compile application.');
return 1;
}
modules = report.invalidatedModules!;
generator.accept();
return 0;
}
Future<UpdateFSReport> _updateDevFS() async {
final report = await devFS.update(
mainUri: mainUri,
dillOutputPath: outputPath,
generator: generator,
invalidatedFiles: []);
return report;
}
Future<void> stop() async {
await generator.shutdown();
await devFS.dispose();
}
}