import { createAppReadyRuntimeRunner } from '../../app-lifecycle'; import { createBuildAppReadyRuntimeMainDepsHandler } from '../app-ready-main-deps'; import { createBuildCriticalConfigErrorMainDepsHandler, createBuildReloadConfigMainDepsHandler, } from '../startup-config-main-deps'; import { createCriticalConfigErrorHandler, createReloadConfigHandler } from '../startup-config'; import { createBuildImmersionTrackerStartupMainDepsHandler } from '../immersion-startup-main-deps'; import { createImmersionTrackerStartupHandler } from '../immersion-startup'; type ReloadConfigMainDeps = Parameters[0]; type CriticalConfigErrorMainDeps = Parameters< typeof createBuildCriticalConfigErrorMainDepsHandler >[0]; type AppReadyRuntimeMainDeps = Parameters[0]; export type AppReadyComposerOptions = { reloadConfigMainDeps: ReloadConfigMainDeps; criticalConfigErrorMainDeps: CriticalConfigErrorMainDeps; appReadyRuntimeMainDeps: Omit; immersionTrackerStartupMainDeps: Parameters< typeof createBuildImmersionTrackerStartupMainDepsHandler >[0]; }; export type AppReadyComposerResult = { reloadConfig: ReturnType; criticalConfigError: ReturnType; appReadyRuntimeRunner: ReturnType; }; export function composeAppReadyRuntime(options: AppReadyComposerOptions): AppReadyComposerResult { const reloadConfig = createReloadConfigHandler( createBuildReloadConfigMainDepsHandler(options.reloadConfigMainDeps)(), ); const criticalConfigError = createCriticalConfigErrorHandler( createBuildCriticalConfigErrorMainDepsHandler(options.criticalConfigErrorMainDeps)(), ); const appReadyRuntimeRunner = createAppReadyRuntimeRunner( createBuildAppReadyRuntimeMainDepsHandler({ ...options.appReadyRuntimeMainDeps, reloadConfig, createImmersionTracker: createImmersionTrackerStartupHandler( createBuildImmersionTrackerStartupMainDepsHandler( options.immersionTrackerStartupMainDeps, )(), ), onCriticalConfigErrors: criticalConfigError, })(), ); return { reloadConfig, criticalConfigError, appReadyRuntimeRunner, }; }