feat: add telescope

This commit is contained in:
2026-07-05 08:42:42 +03:30
parent c6997477b9
commit 37baef565e
9 changed files with 530 additions and 8 deletions
+22 -3
View File
@@ -18,6 +18,7 @@ import (
"hakemsho/internal/httpx"
"hakemsho/internal/static"
"hakemsho/internal/store"
"hakemsho/internal/telescope"
"hakemsho/internal/user"
"hakemsho/internal/ws"
)
@@ -26,6 +27,9 @@ func main() {
slog.SetDefault(slog.New(slog.NewTextHandler(os.Stdout, nil)))
cfg := config.Load()
// تلسکوپ: بازرسِ درون‌برنامه‌ایِ درخواست‌ها (رینگ‌بافرِ حافظه، بدونِ وابستگی).
scope := telescope.New(cfg.TelescopeSize)
st, err := store.Open(cfg.DBPath)
if err != nil {
slog.Error("open db", "err", err)
@@ -43,9 +47,15 @@ func main() {
// اقتصاد و فروشگاه. تأییدِ خرید: مایکت (X-Access-Token) و کافه‌بازار (امضای RSA).
// اگر کلیدها تنظیم نشده باشند، به تأییدکننده‌ی توسعه برمی‌گردیم (dev fallback).
iap := economy.StoreRouter{DevFallback: true}
if cfg.MyketAccessToken != "" && cfg.IAPPackage != "" {
iap.Myket = economy.NewMyketVerifier(cfg.IAPPackage, cfg.MyketAccessToken)
slog.Info("IAP myket configured", "package", cfg.IAPPackage)
// مایکت: تأییدِ آفلاینِ RSA (اگر کلید باشد) و/یا سمت‌سرور با access token.
if cfg.MyketRSAKey != "" || (cfg.MyketAccessToken != "" && cfg.IAPPackage != "") {
mv, err := economy.NewMyketVerifier(cfg.IAPPackage, cfg.MyketAccessToken).WithRSAKey(cfg.MyketRSAKey)
if err != nil {
slog.Error("myket rsa key", "err", err)
os.Exit(1)
}
iap.Myket = mv
slog.Info("IAP myket configured", "package", cfg.IAPPackage, "rsa", cfg.MyketRSAKey != "", "server", cfg.MyketAccessToken != "")
}
if cfg.BazaarRSAKey != "" {
bv, err := economy.NewBazaarRSAVerifier(cfg.BazaarRSAKey)
@@ -87,6 +97,8 @@ func main() {
r.Use(middleware.RealIP)
r.Use(middleware.Recoverer)
r.Use(middleware.Timeout(15 * time.Second))
// بازرسِ درخواست‌ها: هر درخواستِ /api و /admin را در رینگ‌بافر ثبت می‌کند.
r.Use(scope.Middleware)
r.Get("/health", func(w http.ResponseWriter, _ *http.Request) {
httpx.JSON(w, http.StatusOK, map[string]string{"status": "ok"})
@@ -103,6 +115,13 @@ func main() {
// پنل ادمین (HTML سرور‌ساید، پشت Basic Auth)
r.Mount("/admin", admin.New(st.DB, eco, cfg.CardsDir, cfg.CarpetsDir).Routes(cfg.AdminUser, cfg.AdminPass))
// بازرسِ درخواست‌ها (Telescope-lite) — پشتِ همان Basic Auth ادمین.
r.Group(func(r chi.Router) {
r.Use(middleware.BasicAuth("hakemsho-admin", map[string]string{cfg.AdminUser: cfg.AdminPass}))
r.Get("/admin/telescope", scope.Page)
r.Get("/admin/telescope/data", scope.Data)
})
r.Route("/api", func(r chi.Router) {
r.Route("/auth", func(r chi.Router) {
r.Post("/login-otp", authH.LoginOTP)