github.com/eagleql/xray-core@v1.4.4/proxy/vmess/account.go (about) 1 package vmess 2 3 import ( 4 "github.com/eagleql/xray-core/common/dice" 5 "github.com/eagleql/xray-core/common/protocol" 6 "github.com/eagleql/xray-core/common/uuid" 7 ) 8 9 // MemoryAccount is an in-memory form of VMess account. 10 type MemoryAccount struct { 11 // ID is the main ID of the account. 12 ID *protocol.ID 13 // AlterIDs are the alternative IDs of the account. 14 AlterIDs []*protocol.ID 15 // Security type of the account. Used for client connections. 16 Security protocol.SecurityType 17 } 18 19 // AnyValidID returns an ID that is either the main ID or one of the alternative IDs if any. 20 func (a *MemoryAccount) AnyValidID() *protocol.ID { 21 if len(a.AlterIDs) == 0 { 22 return a.ID 23 } 24 return a.AlterIDs[dice.Roll(len(a.AlterIDs))] 25 } 26 27 // Equals implements protocol.Account. 28 func (a *MemoryAccount) Equals(account protocol.Account) bool { 29 vmessAccount, ok := account.(*MemoryAccount) 30 if !ok { 31 return false 32 } 33 // TODO: handle AlterIds difference 34 return a.ID.Equals(vmessAccount.ID) 35 } 36 37 // AsAccount implements protocol.Account. 38 func (a *Account) AsAccount() (protocol.Account, error) { 39 id, err := uuid.ParseString(a.Id) 40 if err != nil { 41 return nil, newError("failed to parse ID").Base(err).AtError() 42 } 43 protoID := protocol.NewID(id) 44 return &MemoryAccount{ 45 ID: protoID, 46 AlterIDs: protocol.NewAlterIDs(protoID, uint16(a.AlterId)), 47 Security: a.SecuritySettings.GetSecurityType(), 48 }, nil 49 }