Files
game-driver/internal/middleware/pause.go
2025-02-27 11:42:37 +08:00

66 lines
1.0 KiB
Go

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
// 保存原始的 Context
originalCtx := c.Context
// 获取锚点
holdPoint := c.Hold()
// 等待组
var wait sync.WaitGroup
defer wait.Wait()
run := true
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)
}
}
}
}
}