in webdev/lib/src/command/daemon_command.dart [64:128]
Future<int> run() async {
var configuration = Configuration.fromArgs(argResults,
defaultConfiguration: Configuration(
launchInChrome: true, debug: true, autoRun: false, release: false));
configureLogWriter(configuration.verbose);
// Validate the pubspec first to ensure we are in a Dart project.
var pubspecLock = await readPubspecLock(configuration);
Daemon daemon;
DevWorkflow workflow;
var cancelCount = 0;
var cancelSub = StreamGroup.merge([
ProcessSignal.sigint.watch(),
// SIGTERM is not supported on Windows.
Platform.isWindows ? const Stream.empty() : ProcessSignal.sigterm.watch()
]).listen((signal) async {
cancelCount++;
daemon?.shutdown();
if (cancelCount > 1) exit(1);
});
try {
daemon = Daemon(_stdinCommandStream, _stdoutCommandResponse);
var daemonDomain = DaemonDomain(daemon);
configureLogWriter(configuration.verbose, customLogWriter:
(level, message, {loggerName, error, stackTrace, verbose}) {
if (configuration.verbose || level >= Level.INFO) {
daemonDomain.sendEvent('daemon.log', {
'log': formatLog(
level,
message,
loggerName: loggerName,
error: error,
stackTrace: stackTrace,
)
});
}
});
daemon.registerDomain(daemonDomain);
var buildOptions = buildRunnerArgs(pubspecLock, configuration);
var directoryArgs =
argResults.rest.where((arg) => !arg.startsWith('-')).toList();
var targetPorts =
parseDirectoryArgs(directoryArgs, basePort: await findUnusedPort());
validateLaunchApps(configuration.launchApps, targetPorts.keys);
workflow =
await DevWorkflow.start(configuration, buildOptions, targetPorts);
daemon.registerDomain(AppDomain(daemon, workflow.serverManager));
await daemon.onExit;
exitCode = 0;
return 0;
} catch (e) {
daemon?.shutdown();
exitCode = 1;
rethrow;
} finally {
await workflow?.shutDown();
// Only cancel this subscription after all shutdown work has completed.
// https://github.com/dart-lang/sdk/issues/23074.
await cancelSub.cancel();
// For some reason Windows remains open due to what appears to be an
// undrained `stdin`. Feel free to waste some time trying to remove this.
if (Platform.isWindows) exit(exitCode);
}
}