- Add bin/kis-paper-daily-smoke and bin/kis-sops-env utilities - Update agent-roadmap for operator surface phase - Add worker backtest bar source and Kis live client - Update KIS live secret configuration and documentation - Refine worker datacheck and daily chart price providers
71 lines
2.2 KiB
Go
71 lines
2.2 KiB
Go
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)
|
|
}
|
|
}
|