1package vmess
2
3import (
4	"github.com/xtls/xray-core/common/dice"
5	"github.com/xtls/xray-core/common/protocol"
6	"github.com/xtls/xray-core/common/uuid"
7)
8
9// MemoryAccount is an in-memory form of VMess account.
10type 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.
20func (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.
28func (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.
38func (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}
50