mirror of
https://github.com/bunny-lab-io/Borealis.git
synced 2025-10-26 17:41:58 -06:00
75 lines
2.2 KiB
Python
75 lines
2.2 KiB
Python
"""Entrypoint for the Borealis Engine server."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from dataclasses import dataclass
|
|
from typing import Optional
|
|
|
|
from flask import Flask
|
|
|
|
from .config import EngineSettings, configure_logging, load_environment
|
|
from .interfaces import (
|
|
create_socket_server,
|
|
register_http_interfaces,
|
|
register_ws_interfaces,
|
|
)
|
|
from .repositories.sqlite import connection as sqlite_connection
|
|
from .repositories.sqlite import migrations as sqlite_migrations
|
|
from .server import create_app
|
|
|
|
|
|
@dataclass(frozen=True, slots=True)
|
|
class EngineRuntime:
|
|
"""Aggregated runtime context produced by :func:`bootstrap`."""
|
|
|
|
app: Flask
|
|
settings: EngineSettings
|
|
socketio: Optional[object]
|
|
db_factory: sqlite_connection.SQLiteConnectionFactory
|
|
|
|
|
|
def bootstrap() -> EngineRuntime:
|
|
"""Construct the Flask application and supporting infrastructure."""
|
|
|
|
settings = load_environment()
|
|
logger = configure_logging(settings)
|
|
logger.info("bootstrap-started")
|
|
|
|
db_factory = sqlite_connection.connection_factory(settings.database_path)
|
|
if settings.apply_migrations:
|
|
logger.info("migrations-start")
|
|
with sqlite_connection.connection_scope(settings.database_path) as conn:
|
|
sqlite_migrations.apply_all(conn)
|
|
logger.info("migrations-complete")
|
|
else:
|
|
logger.info("migrations-skipped")
|
|
|
|
app = create_app(settings, db_factory=db_factory)
|
|
register_http_interfaces(app)
|
|
socketio = create_socket_server(app, settings.socketio)
|
|
register_ws_interfaces(socketio)
|
|
logger.info("bootstrap-complete")
|
|
return EngineRuntime(app=app, settings=settings, socketio=socketio, db_factory=db_factory)
|
|
|
|
|
|
def main() -> None:
|
|
runtime = bootstrap()
|
|
socketio = runtime.socketio
|
|
if socketio is not None:
|
|
socketio.run( # type: ignore[call-arg]
|
|
runtime.app,
|
|
host=runtime.settings.server.host,
|
|
port=runtime.settings.server.port,
|
|
debug=runtime.settings.debug,
|
|
)
|
|
else:
|
|
runtime.app.run(
|
|
host=runtime.settings.server.host,
|
|
port=runtime.settings.server.port,
|
|
debug=runtime.settings.debug,
|
|
)
|
|
|
|
|
|
if __name__ == "__main__": # pragma: no cover - manual execution
|
|
main()
|