| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354 |
- // +build !confonly
- package router
- import (
- "context"
- "github.com/v2fly/v2ray-core/v4/common/dice"
- "github.com/v2fly/v2ray-core/v4/features/extension"
- "github.com/v2fly/v2ray-core/v4/features/outbound"
- )
- type BalancingStrategy interface {
- PickOutbound([]string) string
- }
- type RandomStrategy struct{}
- func (s *RandomStrategy) PickOutbound(tags []string) string {
- n := len(tags)
- if n == 0 {
- panic("0 tags")
- }
- return tags[dice.Roll(n)]
- }
- type Balancer struct {
- selectors []string
- strategy BalancingStrategy
- ohm outbound.Manager
- }
- func (b *Balancer) PickOutbound() (string, error) {
- hs, ok := b.ohm.(outbound.HandlerSelector)
- if !ok {
- return "", newError("outbound.Manager is not a HandlerSelector")
- }
- tags := hs.Select(b.selectors)
- if len(tags) == 0 {
- return "", newError("no available outbounds selected")
- }
- tag := b.strategy.PickOutbound(tags)
- if tag == "" {
- return "", newError("balancing strategy returns empty tag")
- }
- return tag, nil
- }
- func (b *Balancer) InjectContext(ctx context.Context) {
- if contextReceiver, ok := b.strategy.(extension.ContextReceiver); ok {
- contextReceiver.InjectContext(ctx)
- }
- }
|