|
@@ -16,10 +16,9 @@ package wait
|
|
|
|
|
|
import (
|
|
|
"math/rand"
|
|
|
+ "sync"
|
|
|
"time"
|
|
|
|
|
|
- "github.com/samber/lo"
|
|
|
-
|
|
|
"github.com/fatedier/frp/pkg/util/util"
|
|
|
)
|
|
|
|
|
@@ -182,16 +181,18 @@ func Until(f func(), period time.Duration, stopCh <-chan struct{}) {
|
|
|
|
|
|
func MergeAndCloseOnAnyStopChannel[T any](upstreams ...<-chan T) <-chan T {
|
|
|
out := make(chan T)
|
|
|
-
|
|
|
+ closeOnce := sync.Once{}
|
|
|
for _, upstream := range upstreams {
|
|
|
ch := upstream
|
|
|
- go lo.Try0(func() {
|
|
|
+ go func() {
|
|
|
select {
|
|
|
case <-ch:
|
|
|
- close(out)
|
|
|
+ closeOnce.Do(func() {
|
|
|
+ close(out)
|
|
|
+ })
|
|
|
case <-out:
|
|
|
}
|
|
|
- })
|
|
|
+ }()
|
|
|
}
|
|
|
return out
|
|
|
}
|