package middleware import ( "game-driver/internal/schema" "game-driver/leaf" "sync" "time" ) // TimeoutOver 定时器中间件,用于定时触发屏幕打印和语音播报。 t 是语音播报实例 func TimeoutOver(maxTimeout int) leaf.HandlerFunc { return func(c *leaf.Context) { pm := leaf.Value[*schema.PlayModal](c, PayloadJSONKey) // 定时器 var timer *time.Timer if pm.Timeout != 0 { timer = time.NewTimer(time.Second * time.Duration(pm.Timeout)) } else { timer = time.NewTimer(time.Second * time.Duration(maxTimeout)) } defer timer.Stop() // 等待组 var wait sync.WaitGroup defer wait.Wait() // 结束信号通道 a := make(chan struct{}) // 发送结束信号 defer close(a) cancel := leaf.WithCancel(c) go func() { // 等待结束 wait.Add(1) defer wait.Done() // 结束标志 select { case <-a: case <-timer.C: // 定时器结束 { cancel() leaf.WithValue[leaf.EndType](c, leaf.EndKey, leaf.EndTimer) } } }() c.Next() } }