hot_reload library

Opt-in hot reload for a Dart CLI nitro_server. Separate from the core library so nitro_server itself stays dependency-free: this file imports package:hotreloader, which you add to your own dev_dependencies.

import 'package:nitro_server/nitro_server.dart';
import 'package:nitro_server/hot_reload.dart';

Future<void> setup(NitroServer server) async {
  await server.get('/hello', (_) => ResponseContext.text('hi'));
}

void main() async {
  final server = await NitroServer.bind(const ServerConfig(port: 8080), setup);
  await enableHotReload(server); // re-runs `setup` after every hot reload
  print('listening on ${server.uri}');
}

Run with the VM service on so hot reload can attach, then edit a handler and save:

dart run --enable-vm-service bin/server.dart

Every reload re-runs setup on the live socket via NitroServer.reload: added, removed and changed routes all take effect without dropping the port or open connections. Works across isolates.

setup must be a top-level or static function (as above), not an inline closure passed to NitroServer.bind — Dart hot reload does not re-patch a stored anonymous closure, so a bind(config, (s) async { ... }) would keep serving the old routes. (A top-level setup is already required for isolates > 1.) Handlers written inline inside that top-level setup are fine.

Functions

enableHotReload(NitroServer server, {Iterable<String>? watch, void log(String message)?}) → Future<HotReloader>
Wires server's route NitroServer.reload to every VM hot reload. Returns the HotReloader; call .stop() to detach. A failing setup is printed to stderr rather than killing the reload loop.