package edge_node import ( "time" common "git.ilapage.cn/ila/yovision/Sense/server/common/models" ) const ( StatusOnline = "online" StatusOffline = "offline" StatusRecovering = "recovering" ChannelReady = "ready" ChannelUnavailable = "unavailable" BackfillIdle = "idle" BackfillPending = "pending" ) // Node is the Sense-owned last-known projection of one edge runtime. It is // deliberately not a shared identity or a cross-product protocol model. type Node struct { ID string `gorm:"size:64;primaryKey" json:"id"` Name string `gorm:"size:128;not null" json:"name"` Location string `gorm:"size:256;not null;default:''" json:"location"` RuntimeVersion string `gorm:"size:64;not null;default:''" json:"runtimeVersion"` ModelVersion string `gorm:"size:64;not null;default:''" json:"modelVersion"` StartedAt time.Time `gorm:"not null" json:"startedAt"` LastHeartbeatAt time.Time `gorm:"not null;index" json:"lastHeartbeatAt"` LastCollectedAt time.Time `gorm:"not null" json:"lastCollectedAt"` LoadUsed int `gorm:"not null;default:0" json:"loadUsed"` LoadCapacity int `gorm:"not null;default:0" json:"loadCapacity"` ControlTunnelStatus string `gorm:"size:32;not null;default:'unavailable'" json:"controlTunnelStatus"` ControlTunnelDetail string `gorm:"size:256;not null;default:''" json:"controlTunnelDetail"` ControlLatencyMs int `gorm:"not null;default:0" json:"controlLatencyMs"` VideoPlaneStatus string `gorm:"size:32;not null;default:'unavailable'" json:"videoPlaneStatus"` VideoPlaneDetail string `gorm:"size:256;not null;default:''" json:"videoPlaneDetail"` ActiveStreamCount int `gorm:"not null;default:0" json:"activeStreamCount"` BackfillStatus string `gorm:"size:32;not null;default:'idle'" json:"backfillStatus"` BackfillQueueDepth int `gorm:"not null;default:0" json:"backfillQueueDepth"` RecoveryPhase string `gorm:"size:32;not null;default:''" json:"recoveryPhase"` ProjectionVersion int64 `gorm:"not null;default:1" json:"projectionVersion"` common.ControlBy common.ModelTime } func (Node) TableName() string { return "sense_edge_nodes" } // Event records projection state transitions without storing credentials or // raw heartbeat payloads. type Event struct { ID uint64 `gorm:"primaryKey;autoIncrement" json:"id"` NodeID string `gorm:"size:64;not null;index" json:"nodeId"` EventType string `gorm:"size:32;not null;index" json:"eventType"` FromStatus string `gorm:"size:32;not null;default:''" json:"fromStatus"` ToStatus string `gorm:"size:32;not null" json:"toStatus"` Detail string `gorm:"size:256;not null;default:''" json:"detail"` OccurredAt time.Time `gorm:"not null;index" json:"occurredAt"` } func (Event) TableName() string { return "sense_edge_node_events" }