serve method

Future<void> serve({
  1. required bool enableHotReload,
  2. void onReady()?,
})

Implementation

Future<void> serve({
  required bool enableHotReload,
  void Function()? onReady,
}) async {
  clearConsole();
  logger.detail('Starting server');

  var hasStartedServer = false;

  final process = _serverProcess = await io.Process.start('dart', [
    if (enableHotReload) ...[
      '--enable-vm-service=$dartVmServicePort',
      '--enable-asserts',
    ],
    if (dartDefine.isNotEmpty) ...[
      for (final entry in dartDefine.entries) '-D$entry',
    ],
    '-D__DEBUG__=${mode.isDebug}',
    '-D__PROFILE__=${mode.isProfile}',
    '-D__RELEASE__=${mode.isRelease}',
    serverFile,
    ...serverArgs,
  ], runInShell: true);

  // On Windows listen for CTRL-C and use taskkill to kill
  // the spawned process along with any child processes.
  // https://github.com/dart-lang/sdk/issues/22470
  if (io.Platform.isWindows) {
    io.ProcessSignal.sigint.watch().listen((_) {
      // Do not await on sigint
      _killServerProcess().ignore();
      stop();
    });
  }

  process.stderr.listen((err) async {
    final message = utf8.decode(err).trim();
    if (message.isEmpty) return;

    HotReloadData? data;

    try {
      data = HotReloadData.fromJson(
        jsonDecode(message) as Map<String, dynamic>,
      );
    } catch (e) {
      // ignore
    }

    switch (data) {
      case null:
        break;
      case HotReloadFilesChanged(:final files):
        clearConsole();
        printVmServiceUri();
        printParsedRoutes(null);

        await onFilesChange(files);
        logger.detail('Files changed:');
        for (final file in files) {
          logger.detail('  - $file');
        }

        if (await checkForErrors()) {
          return;
        }

      case HotReloadData(type: HotReloadType.revaliStarted):
        if (hasStartedServer) {
          return;
        }

        hasStartedServer = true;
        _progress?.complete();
        onReady?.call();
        return;

      case HotReloadData(type: HotReloadType.hotReloadEnabled):
        return;
    }
  });

  process.stdout.listen((out) async {
    final message = utf8.decode(out).trim();
    if (message.isEmpty) {
      return;
    }

    if (message.contains('Dart VM service')) {
      _vmServiceUri = message;
      logger.success(message);
    } else if (message.contains('Dart DevTools debugger')) {
      _vmServiceUri += '\n$message';
      logger.success(message);
      printInputCommands();
      logger.write('\n');
      _progress = logger.progress('Starting server');
    } else {
      logger.write('$message\n');
    }
  });

  process.exitCode.then((_) async {
    if (isCompleted) return;
    await _killServerProcess();
    await stop(1);
  }).ignore();
}