package middleware import ( "log" "net/http" "runtime/debug" "git.trcreatives.at/trcreatives/go-kite" ) type RecoveryConfig struct { OnPanic func(ctx *kite.Context, recovered any, stack []byte) error } func Recovery() kite.Middleware { return RecoveryWithConfig(RecoveryConfig{}) } func RecoveryWithConfig(cfg RecoveryConfig) kite.Middleware { if cfg.OnPanic == nil { cfg.OnPanic = func(ctx *kite.Context, recovered any, stack []byte) error { log.Printf("[Kite] Panic: %v\n%s", recovered, stack) return ctx.WriteString(http.StatusInternalServerError, "500 internal server error") } } return func(h kite.Handler) kite.Handler { return func(ctx *kite.Context) (err error) { defer func() { if r := recover(); r != nil { err = cfg.OnPanic(ctx, r, debug.Stack()) } }() return h(ctx) } } }