import { CoreTokens, inject, injectable, type WorkflowRepository } from "@codemation/core"; import { Engine } from "@codemation/core/bootstrap"; import { ApplicationTokens } from "../../applicationTokens"; import type { AppConfig } from "../../presentation/config/AppConfig"; import { RuntimeWorkflowActivationPolicy } from "../../infrastructure/persistence/RuntimeWorkflowActivationPolicy"; import { RunEventBusTelemetryReporter } from "../../application/telemetry/RunEventBusTelemetryReporter"; import { DatabaseMigrations } from "./DatabaseMigrations"; import type { WorkflowActivationRepository } from "../../domain/workflows/WorkflowActivationRepository"; import { WorkflowRunRetentionPruneScheduler } from "../../application/runs/WorkflowRunRetentionPruneScheduler"; import { CollectionSchemaSyncerHolder } from "../../infrastructure/collections/CollectionSchemaSyncerHolder"; @injectable() export class FrontendRuntime { constructor( @inject(ApplicationTokens.AppConfig) private readonly appConfig: AppConfig, @inject(DatabaseMigrations) private readonly databaseMigrations: DatabaseMigrations, @inject(RuntimeWorkflowActivationPolicy) private readonly runtimeWorkflowActivationPolicy: RuntimeWorkflowActivationPolicy, @inject(ApplicationTokens.WorkflowActivationRepository) private readonly workflowActivationRepository: WorkflowActivationRepository, @inject(CoreTokens.WorkflowRepository) private readonly workflowRepository: WorkflowRepository, @inject(RunEventBusTelemetryReporter) private readonly runEventBusTelemetryReporter: RunEventBusTelemetryReporter, @inject(WorkflowRunRetentionPruneScheduler) private readonly workflowRunRetentionPruneScheduler: WorkflowRunRetentionPruneScheduler, @inject(Engine) private readonly engine: Engine, @inject(CollectionSchemaSyncerHolder) private readonly collectionSchemaSyncerHolder: CollectionSchemaSyncerHolder, ) {} async start(args?: Readonly<{ skipPresentationServers?: boolean }>): Promise { if (this.appConfig.env.CODEMATION_SKIP_STARTUP_MIGRATIONS !== "true") { await this.databaseMigrations.migrate(); } await this.collectionSchemaSyncerHolder.syncIfAvailable(); await this.runtimeWorkflowActivationPolicy.hydrateFromRepository(this.workflowActivationRepository); if (args?.skipPresentationServers === true) { return; } await this.engine.start([...this.workflowRepository.list()]); await this.runEventBusTelemetryReporter.start(); this.workflowRunRetentionPruneScheduler.start(); } }