package middleware

import (
	"game-driver/internal/common"
	"game-driver/leaf"
	"go.uber.org/zap"
	"sync"
)

// Unique 唯一任务中间件，会停止之前的任务，让新任务执行。同一时间只能有一个任务在执行
func Unique(stopper common.Stopper) leaf.HandlerFunc {
	var lock sync.Mutex
	return func(c *leaf.Context) {
		if !lock.TryLock() {
			zap.S().Infoln("停止之前的任务，再尝试加锁")
			stopper.Stop()
			lock.Lock()
		}
		zap.S().Infoln("加锁完成")

		defer func() {
			lock.Unlock()
			zap.S().Infoln("解锁完成")
		}()

		c.Next()
	}
}
