feat: add telescope
This commit is contained in:
+22
-3
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user