start method
Starts the Serverpod and all Servers that it manages.
Implementation
Future<void> start() async {
_startedTime = DateTime.now().toUtc();
await runZonedGuarded(() async {
// Register cloud store endpoint if we're using the database cloud store
if (storage['public'] is DatabaseCloudStorage ||
storage['private'] is DatabaseCloudStorage) {
CloudStoragePublicEndpoint().register(this);
}
// Runtime settings
var session = await createSession(enableLogging: false);
try {
_runtimeSettings =
await session.db.findSingleRow<internal.RuntimeSettings>();
if (_runtimeSettings == null) {
// Store default settings
_runtimeSettings = _defaultRuntimeSettings;
await session.db.insert(_runtimeSettings!);
}
_logManager = LogManager(_runtimeSettings!);
} catch (e, stackTrace) {
stderr.writeln(
'${DateTime.now().toUtc()} Failed to connect to database.');
stderr.writeln('$e');
stderr.writeln('$stackTrace');
}
try {
await methodLookup.load(session);
} catch (e, stackTrace) {
stderr.writeln(
'${DateTime.now().toUtc()} Internal server error. Failed to load method lookup.');
stderr.writeln('$e');
stderr.writeln('$stackTrace');
}
await session.close();
// Connect to Redis
if (redisController != null) {
await redisController!.start();
}
// Start servers
await _startServiceServer();
await server.start();
if (webServer.routes.isNotEmpty) {
await webServer.start();
}
// Start future calls
_futureCallManager.start();
// Start health check manager
await _healthCheckManager.start();
}, (e, stackTrace) {
// Last resort error handling
// TODO: Log to database?
stderr.writeln(
'${DateTime.now().toUtc()} Internal server error. Zoned exception.',
);
stderr.writeln('$e');
stderr.writeln('$stackTrace');
});
}