// Package protocol defines the communication protocol between OpenFlare server, agent, and relay components. package protocol import "encoding/json" // APIResponse is a generic API response wrapper. type APIResponse[T any] struct { ErrorMsg string `json:"error_msg"` Data T `json:"data"` } // HeartbeatData is the heartbeat request payload from agent. type HeartbeatData struct { AgentSettings *AgentSettings `json:"agent_settings"` ActiveConfig *ActiveConfigMeta `json:"active_config"` WAFIPGroups []WAFIPGroup `json:"waf_ip_groups,omitempty"` } // HeartbeatResult is the heartbeat response payload. type HeartbeatResult struct { AgentSettings *AgentSettings ActiveConfig *ActiveConfigMeta WAFIPGroups []WAFIPGroup } // AgentSettings holds agent configuration settings. type AgentSettings struct { HeartbeatInterval int `json:"heartbeat_interval"` WebsocketUpgradeEnabled bool `json:"websocket_upgrade_enabled"` AutoUpdate bool `json:"auto_update"` UpdateRepo string `json:"update_repo"` UpdateNow bool `json:"update_now"` UpdateChannel string `json:"update_channel"` UpdateTag string `json:"update_tag"` RestartOpenrestyNow bool `json:"restart_openresty_now"` } // WSMessageType constants define WebSocket message types. const ( WSMessageTypeStatus = "status" WSMessageTypeSettings = "settings" WSMessageTypeActiveConfig = "active_config" WSMessageTypeForceSyncConfig = "force_sync_config" WSMessageTypeWAFIPGroups = "waf_ip_groups" WSMessageTypePing = "ping" WSMessageTypePong = "pong" ) // WSMessage represents a WebSocket message. type WSMessage struct { Type string `json:"type"` Payload json.RawMessage `json:"payload,omitempty"` } // WSOutboundMessage represents an outbound WebSocket message. type WSOutboundMessage struct { Type string `json:"type"` Payload any `json:"payload,omitempty"` } // WebSocketConnection defines the WebSocket connection interface. type WebSocketConnection interface { URL() string SendStatus(payload NodePayload) error SendPong() error Receive() (WSMessage, error) Close() error } // OpenrestyStatus constants define OpenResty health status values. const ( OpenrestyStatusHealthy = "healthy" OpenrestyStatusUnhealthy = "unhealthy" OpenrestyStatusUnknown = "unknown" ) // NodePayload is the agent node registration payload. type NodePayload struct { NodeID string `json:"node_id"` Name string `json:"name"` IP string `json:"ip"` Version string `json:"version"` ExtVersion string `json:"ext_version"` CurrentVersion string `json:"current_version"` LastError string `json:"last_error"` OpenrestyStatus string `json:"openresty_status"` OpenrestyMessage string `json:"openresty_message"` Profile *NodeSystemProfile `json:"profile,omitempty"` Snapshot *NodeMetricSnapshot `json:"snapshot,omitempty"` OpenrestyObservation *NodeOpenrestyObservation `json:"openresty_observation,omitempty"` TrafficReport *NodeTrafficReport `json:"traffic_report,omitempty"` AccessLogs []NodeAccessLog `json:"access_logs,omitempty"` BufferedObservability []BufferedObservabilityRecord `json:"buffered_observability,omitempty"` HealthEvents []NodeHealthEvent `json:"health_events"` WAFIPGroupChecksums map[string]string `json:"waf_ip_group_checksums,omitempty"` } // NodeSystemProfile describes the system profile of a node. type NodeSystemProfile struct { Hostname string `json:"hostname"` OSName string `json:"os_name"` OSVersion string `json:"os_version"` KernelVersion string `json:"kernel_version"` Architecture string `json:"architecture"` CPUModel string `json:"cpu_model"` CPUCores int `json:"cpu_cores"` TotalMemoryBytes int64 `json:"total_memory_bytes"` TotalDiskBytes int64 `json:"total_disk_bytes"` UptimeSeconds int64 `json:"uptime_seconds"` ReportedAtUnix int64 `json:"reported_at_unix"` } // NodeMetricSnapshot is a metric snapshot of a node. type NodeMetricSnapshot struct { CapturedAtUnix int64 `json:"captured_at_unix"` CPUUsagePercent float64 `json:"cpu_usage_percent"` MemoryUsedBytes int64 `json:"memory_used_bytes"` MemoryTotalBytes int64 `json:"memory_total_bytes"` StorageUsedBytes int64 `json:"storage_used_bytes"` StorageTotalBytes int64 `json:"storage_total_bytes"` DiskReadBytes int64 `json:"disk_read_bytes"` DiskWriteBytes int64 `json:"disk_write_bytes"` NetworkRxBytes int64 `json:"network_rx_bytes"` NetworkTxBytes int64 `json:"network_tx_bytes"` } // NodeOpenrestyObservation holds OpenResty observation data. type NodeOpenrestyObservation struct { CapturedAtUnix int64 `json:"captured_at_unix"` OpenrestyRxBytes int64 `json:"openresty_rx_bytes"` OpenrestyTxBytes int64 `json:"openresty_tx_bytes"` OpenrestyConnections int64 `json:"openresty_connections"` } // NodeTrafficReport is a traffic report from agent. type NodeTrafficReport struct { WindowStartedAtUnix int64 `json:"window_started_at_unix"` WindowEndedAtUnix int64 `json:"window_ended_at_unix"` RequestCount int64 `json:"request_count"` ErrorCount int64 `json:"error_count"` UniqueVisitorCount int64 `json:"unique_visitor_count"` StatusCodes map[string]int64 `json:"status_codes"` TopDomains map[string]int64 `json:"top_domains"` SourceCountries map[string]int64 `json:"source_countries"` } // NodeAccessLog is an access log entry from agent. type NodeAccessLog struct { LoggedAtUnix int64 `json:"logged_at_unix"` RemoteAddr string `json:"remote_addr"` Host string `json:"host"` Path string `json:"path"` StatusCode int `json:"status_code"` } // BufferedObservabilityRecord is a buffered observability record. type BufferedObservabilityRecord struct { WindowStartedAtUnix int64 `json:"window_started_at_unix"` Snapshot *NodeMetricSnapshot `json:"snapshot,omitempty"` OpenrestyObservation *NodeOpenrestyObservation `json:"openresty_observation,omitempty"` TrafficReport *NodeTrafficReport `json:"traffic_report,omitempty"` AccessLogs []NodeAccessLog `json:"access_logs,omitempty"` } // NodeHealthEvent represents a node health event. type NodeHealthEvent struct { EventType string `json:"event_type"` Severity string `json:"severity"` Message string `json:"message"` TriggeredAtUnix int64 `json:"triggered_at_unix"` Metadata map[string]string `json:"metadata,omitempty"` } // RegisterNodeResponse is the node registration response. type RegisterNodeResponse struct { NodeID string `json:"node_id"` AccessToken string `json:"agent_token"` Name string `json:"name"` } // ActiveConfigResponse is the active configuration response. type ActiveConfigResponse struct { Version string `json:"version"` Checksum string `json:"checksum"` SourceConfigJSON string `json:"source_config_json"` SupportFiles []SupportFile `json:"support_files"` CreatedAt string `json:"created_at"` } // WAFIPGroup defines a WAF IP group. type WAFIPGroup struct { ID uint `json:"id"` Name string `json:"name"` Type string `json:"type"` Enabled bool `json:"enabled"` IPList []string `json:"ip_list"` Checksum string `json:"checksum"` } // WAFIPGroupSyncRequest is a WAF IP group sync request. type WAFIPGroupSyncRequest struct { IDs []uint `json:"ids,omitempty"` Checksums map[string]string `json:"checksums,omitempty"` } // WAFIPGroupSyncResponse is a WAF IP group sync response. type WAFIPGroupSyncResponse struct { Groups []WAFIPGroup `json:"groups"` } // SupportFile represents a support file for relay. type SupportFile struct { Path string `json:"path"` Content string `json:"content"` }