shelfRun function
Future<ShelfRunContext>
shelfRun(
- FutureOr<
Handler> init(), { - int defaultBindPort = 8080,
- Object defaultBindAddress = 'localhost',
- bool defaultEnableHotReload = true,
- SecurityContext? securityContext,
- OnStarted? onStarted,
- OnStartFailed? onStartFailed,
- OnWillClose? onWillClose,
- 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;
}