start method

Future<void> start()

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');
  });
}