github.com/cloudreve/Cloudreve/v3@v3.0.0-20240224133659-3edb00a6484c/pkg/cluster/node.go (about)

     1  package cluster
     2  
     3  import (
     4  	model "github.com/cloudreve/Cloudreve/v3/models"
     5  	"github.com/cloudreve/Cloudreve/v3/pkg/aria2/common"
     6  	"github.com/cloudreve/Cloudreve/v3/pkg/auth"
     7  	"github.com/cloudreve/Cloudreve/v3/pkg/serializer"
     8  )
     9  
    10  type Node interface {
    11  	// Init a node from database model
    12  	Init(node *model.Node)
    13  
    14  	// Check if given feature is enabled
    15  	IsFeatureEnabled(feature string) bool
    16  
    17  	// Subscribe node status change to a callback function
    18  	SubscribeStatusChange(callback func(isActive bool, id uint))
    19  
    20  	// Ping the node
    21  	Ping(req *serializer.NodePingReq) (*serializer.NodePingResp, error)
    22  
    23  	// Returns if the node is active
    24  	IsActive() bool
    25  
    26  	// Get instances for aria2 calls
    27  	GetAria2Instance() common.Aria2
    28  
    29  	// Returns unique id of this node
    30  	ID() uint
    31  
    32  	// Kill node and recycle resources
    33  	Kill()
    34  
    35  	// Returns if current node is master node
    36  	IsMater() bool
    37  
    38  	// Get auth instance used to check RPC call from slave to master
    39  	MasterAuthInstance() auth.Auth
    40  
    41  	// Get auth instance used to check RPC call from master to slave
    42  	SlaveAuthInstance() auth.Auth
    43  
    44  	// Get node DB model
    45  	DBModel() *model.Node
    46  }
    47  
    48  // Create new node from DB model
    49  func NewNodeFromDBModel(node *model.Node) Node {
    50  	switch node.Type {
    51  	case model.SlaveNodeType:
    52  		slave := &SlaveNode{}
    53  		slave.Init(node)
    54  		return slave
    55  	default:
    56  		master := &MasterNode{}
    57  		master.Init(node)
    58  		return master
    59  	}
    60  }