package middleware import ( "context" "game-driver/internal/common" "game-driver/leaf" "go.uber.org/zap" "sync" ) func Pause(ctrl *common.CtrlWait) leaf.HandlerFunc { return func(c *leaf.Context) { var cancel context.CancelFunc // 获取锚点 holdPoint := c.Hold() // 等待组 var wait sync.WaitGroup defer wait.Wait() // 结束信号通道 a := make(chan struct{}) // 发送结束信号 defer close(a) run := true // 保存原始的 Context originalCtx := c.Context wait.Add(1) go func() { defer wait.Done() zap.S().Infoln("待机控制器") for { select { case <-originalCtx.Done(): zap.S().Infoln("待机控制器监听结束") return case <-ctrl.R: { zap.S().Infoln("待机控制器 Resume 触发") c.Context = originalCtx run = true } case <-ctrl.P: { zap.S().Infoln("待机控制器 Pause 触发") run = false cancel() } } } }() for { select { case <-originalCtx.Done(): return default: if run { cancel = leaf.WithCancel(c) c.Resume(holdPoint) } } } } }