shelfRun function

Future<ShelfRunContext> shelfRun(
  1. FutureOr<Handler> init(), {
  2. int defaultBindPort = 8080,
  3. Object defaultBindAddress = 'localhost',
  4. bool defaultEnableHotReload = true,
  5. bool defaultShared = false,
  6. SecurityContext? securityContext,
  7. OnStarted? onStarted,
  8. OnStartFailed? onStartFailed,
  9. OnWillClose? onWillClose,
  10. OnClosed? onClosed,
})

Mechanism to quickly run a shelf app.

Requires an init function, that provides a shelf Handler.

Can be configured with environment variables:

  • SHELF_PORT: port to run (default 8080)
  • SHELF_ADDRESS: address to bind to (default 'localhost')
  • SHELF_HOTRELOAD: enable (true) or disable (false) hot reload (default true)
  • SHELF_SHARED: enable (true) or disable (false) sharing the underlying http server. Should be activated when serving in different isolates. (default false)

The default values can be overridden by setting defaultBindPort, defaultBindAddress, defaultEnableHotReload or defaultShared.

Implementation

Future<ShelfRunContext> shelfRun(
  FutureOr<shelf.Handler> Function() init, {
  int defaultBindPort = 8080,
  Object defaultBindAddress = 'localhost',
  bool defaultEnableHotReload = true,
  bool defaultShared = false,
  SecurityContext? securityContext,
  OnStarted? onStarted,
  OnStartFailed? onStartFailed,
  OnWillClose? onWillClose,
  OnClosed? onClosed,
}) async {
  var context = ShelfRunContext(
    onWillClose: onWillClose,
    onClosed: onClosed,
  );

  var useHotReload = defaultEnableHotReload;

  if (_env('SHELF_HOTRELOAD')?.toLowerCase() == 'false') {
    useHotReload = false;
  }

  final catchDelegate = onStartFailed ?? (e) => throw e; // rethrow by default

  if (useHotReload) {
    withHotreload(() async {
      try {
        final server = await _createServer(
          init,
          defaultBindPort: defaultBindPort,
          defaultBindAddress: defaultBindAddress,
          defaultShared: defaultShared,
          securityContext: securityContext,
          onStarted: onStarted,
        );
        context._server = server;
      } catch (e) {
        catchDelegate(e);
      }
      return Future.value(context._server);
    });
  } else {
    try {
      final server = await _createServer(
        init,
        defaultBindPort: defaultBindPort,
        defaultBindAddress: defaultBindAddress,
        defaultShared: defaultShared,
        securityContext: securityContext,
        onStarted: onStarted,
      );
      context._server = server;
    } catch (e) {
      catchDelegate(e);
    }
  }

  return context;
}