serve method
Future<void>
serve(
{ - required bool enableHotReload,
- 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();
}