(cfg ServerConfig)
| 103 | } |
| 104 | |
| 105 | func RunHTTPServer(cfg ServerConfig) error { |
| 106 | // Create app context |
| 107 | ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM) |
| 108 | defer stop() |
| 109 | |
| 110 | t, dumpTranslations := translations.TranslationHelper() |
| 111 | |
| 112 | var slogHandler slog.Handler |
| 113 | var logOutput io.Writer |
| 114 | if cfg.LogFilePath != "" { |
| 115 | file, err := os.OpenFile(cfg.LogFilePath, os.O_CREATE|os.O_WRONLY|os.O_APPEND, 0600) |
| 116 | if err != nil { |
| 117 | return fmt.Errorf("failed to open log file: %w", err) |
| 118 | } |
| 119 | logOutput = file |
| 120 | slogHandler = slog.NewTextHandler(logOutput, &slog.HandlerOptions{Level: slog.LevelDebug}) |
| 121 | } else { |
| 122 | logOutput = os.Stderr |
| 123 | slogHandler = slog.NewTextHandler(logOutput, &slog.HandlerOptions{Level: slog.LevelInfo}) |
| 124 | } |
| 125 | logger := slog.New(slogHandler) |
| 126 | logger.Info("starting server", "version", cfg.Version, "host", cfg.Host, "lockdownEnabled", cfg.LockdownMode, "readOnly", cfg.ReadOnly, "insidersMode", cfg.InsidersMode) |
| 127 | |
| 128 | apiHost, err := utils.NewAPIHost(cfg.Host) |
| 129 | if err != nil { |
| 130 | return fmt.Errorf("failed to parse API host: %w", err) |
| 131 | } |
| 132 | |
| 133 | repoAccessOpts := []lockdown.RepoAccessOption{ |
| 134 | lockdown.WithLogger(logger.With("component", "lockdown")), |
| 135 | } |
| 136 | if cfg.RepoAccessCacheTTL != nil { |
| 137 | repoAccessOpts = append(repoAccessOpts, lockdown.WithTTL(*cfg.RepoAccessCacheTTL)) |
| 138 | } |
| 139 | |
| 140 | featureChecker := createHTTPFeatureChecker(cfg.EnabledFeatures, cfg.InsidersMode) |
| 141 | |
| 142 | obs, err := observability.NewExporters(logger, metrics.NewNoopMetrics()) |
| 143 | if err != nil { |
| 144 | return fmt.Errorf("failed to create observability exporters: %w", err) |
| 145 | } |
| 146 | |
| 147 | deps := github.NewRequestDeps( |
| 148 | apiHost, |
| 149 | cfg.Version, |
| 150 | cfg.LockdownMode, |
| 151 | repoAccessOpts, |
| 152 | t, |
| 153 | cfg.ContentWindowSize, |
| 154 | featureChecker, |
| 155 | obs, |
| 156 | ) |
| 157 | |
| 158 | // Initialize the global tool scope map |
| 159 | err = initGlobalToolScopeMap(t) |
| 160 | if err != nil { |
| 161 | return fmt.Errorf("failed to initialize tool scope map: %w", err) |
| 162 | } |
nothing calls this directly
no test coverage detected