Future run()

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