package main import ( "context" "fmt" "log/slog" "os" "os/signal" "syscall" "github.com/jackc/pgx/v5/pgxpool" "git.toki-labs.com/toki/alt/packages/domain/market" "git.toki-labs.com/toki/alt/services/worker/internal/config" "git.toki-labs.com/toki/alt/services/worker/internal/jobs" "git.toki-labs.com/toki/alt/services/worker/internal/marketdata/importer" "git.toki-labs.com/toki/alt/services/worker/internal/providers/kis" "git.toki-labs.com/toki/alt/services/worker/internal/socket" "git.toki-labs.com/toki/alt/services/worker/internal/storage/postgres" ) func main() { ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM) defer stop() cfg := config.Load() runner := jobs.NewRunner() jobs.RegisterBuiltins(runner) // Store-backed socket surfaces are optional at process startup. If the pool // cannot be constructed the worker still serves hello, while market/backtest // handlers report unavailable instead of panicking. var deps socket.Deps pool, err := pgxpool.New(ctx, cfg.DatabaseURL) if err != nil { slog.Error("failed to create database pool; store-backed socket surfaces disabled", "error", err) } else { defer pool.Close() store := postgres.NewStore(pool) kisProvider := kis.NewLiveProvider(kis.NewClient(kis.ConfigFromEnv())) jobs.RegisterDailyBarImportHandler(runner, market.ProviderKIS, importer.New(kisProvider, store)) deps = socket.Deps{ Analysis: store, Results: store, Instruments: store, Bars: store, } } server := socket.NewServer(cfg, deps) if err := server.Start(ctx); err != nil { slog.Error("failed to start worker socket server", "error", err) os.Exit(1) } slog.Info("worker ready", "redis_key_prefix", cfg.RedisKeyPrefix, "worker_queue", cfg.WorkerQueue, "handlers", runner.Len(), "backtest_read_surface", deps.Analysis != nil, "backtest_start_surface", deps.Starter != nil, "market_read_surface", deps.Instruments != nil && deps.Bars != nil, "addr", fmt.Sprintf("%s:%d%s", cfg.Host, cfg.Port, cfg.SocketPath), ) <-ctx.Done() if err := server.Stop(); err != nil { slog.Error("failed to stop worker socket server", "error", err) os.Exit(1) } }