runServer method

Future<ServerInfo> runServer()

Implementation

Future<ServerInfo> runServer() async {
  Actors actors = Actors(_actors);

  await actors.initState();

  var actorContainers = ActorContainers(actors.actorContainers);
  _supervisors.addAll(
      List.generate(numberOfIsolates, (index) => IsolateSupervisor()));

  await Future.wait(List.generate(
      _supervisors.length, (index) => _supervisors[index].initState()));
  final TemplateRender templateRender = TemplateRender(_instance.cache);
  templateRender.rootPath = _instance.viewPath;
  final ServerInput serverInput = ServerInput(
      _instance.port,
      _instance.host,
      _instance.routers,
      _instance.routes,
      _instance.middlewares,
      _instance.webSocket,
      _instance.socketIOServer,
      corsOptions: _instance.corsOptions,
      securityContext: _instance.securityContext,
      exceptionsHandler: exceptionsAndErrosHandler);
  ServerContext serverContext = ServerContext(actorContainers);
  ServerInfo? serverInfo;

  for (var i = 0; i < _supervisors.length; i++) {
    IsolateError? error;

    var subscription = _supervisors[i].errors.listen((event) {
      error ??= event;
    });
    var subscriptionServerInfo = _supervisors[i].serverInfo.listen((event) {
      serverInfo ??= event.serverInfo;
    });

    templateRender.rootPath = _instance.viewPath;
    await _supervisors[i].start(ServerTaskHandler(
        i, true, templateRender, serverInput, serverContext));

    subscription.cancel();
    subscriptionServerInfo.cancel();

    if (error != null) {
      throw Exception(
          'an error occurred in the server instance: $i.\n\nInstance error:\n\n${error!.error}\n\nInstance stack trace:\n\n${error!.stackTrace}');
    }
  }
  return serverInfo!;
}