Files
corrosion-admin-panel/backend/src/services/companion_adapter.rs
Vantz Stockwell cc8c1e3519 feat: Add 15 backend service stub files with TODO implementations
Stub files for all services declared in services/mod.rs:
- Panel adapters: AMP, Pterodactyl, Companion (NATS-based)
- Wipe pipeline: WipeEngine, Scheduler, HealthChecker, BackupManager
- Infrastructure: NatsBridge (JetStream), SteamUpdateWatcher, MapManager
- Notifications: Discord webhooks, Pushbullet push notifications
- Platform: LicenseService, CloudflareService, encryption utilities

Each file has struct definitions, method signatures with proper types,
and descriptive TODO comments outlining the implementation plan.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
2026-02-14 21:35:16 -05:00

93 lines
3.1 KiB
Rust

use anyhow::Result;
use async_trait::async_trait;
use uuid::Uuid;
use super::panel_adapter::{DiscoveredServer, FileEntry, PanelAdapter, ServerStatus};
/// Companion Agent adapter.
///
/// Unlike AMP and Pterodactyl which use REST APIs, the Companion Agent
/// runs alongside the game server and communicates via NATS JetStream.
/// Commands are published to the agent's subject namespace and responses
/// are received on reply subjects. This enables direct server management
/// without a panel intermediary.
pub struct CompanionAdapter {
pub nats: async_nats::Client,
pub license_id: Uuid,
}
impl CompanionAdapter {
pub fn new(nats: async_nats::Client, license_id: Uuid) -> Self {
Self { nats, license_id }
}
}
#[async_trait]
impl PanelAdapter for CompanionAdapter {
async fn test_connection(&self) -> Result<bool> {
// TODO: Publish heartbeat request to corrosion.{license_id}.agent.ping,
// await reply within timeout
todo!()
}
async fn discover_servers(&self) -> Result<Vec<DiscoveredServer>> {
// TODO: Request server info from agent via NATS request/reply.
// Companion manages exactly one server, so this returns a single-element vec.
todo!()
}
async fn get_server_status(&self, _server_id: &str) -> Result<ServerStatus> {
// TODO: NATS request to corrosion.{license_id}.agent.status
todo!()
}
async fn start_server(&self, _server_id: &str) -> Result<()> {
// TODO: NATS request to corrosion.{license_id}.agent.start
todo!()
}
async fn stop_server(&self, _server_id: &str) -> Result<()> {
// TODO: NATS request to corrosion.{license_id}.agent.stop
todo!()
}
async fn restart_server(&self, _server_id: &str) -> Result<()> {
// TODO: NATS request to corrosion.{license_id}.agent.restart
todo!()
}
async fn send_command(&self, _server_id: &str, _command: &str) -> Result<String> {
// TODO: NATS request to corrosion.{license_id}.agent.command
// with command payload, await RCON response
todo!()
}
async fn get_file(&self, _server_id: &str, _path: &str) -> Result<Vec<u8>> {
// TODO: NATS request to corrosion.{license_id}.agent.file.get
// Agent reads local file and returns contents
todo!()
}
async fn put_file(&self, _server_id: &str, _path: &str, _data: &[u8]) -> Result<()> {
// TODO: NATS publish to corrosion.{license_id}.agent.file.put
// May need chunking for large files
todo!()
}
async fn delete_file(&self, _server_id: &str, _path: &str) -> Result<()> {
// TODO: NATS request to corrosion.{license_id}.agent.file.delete
todo!()
}
async fn list_files(&self, _server_id: &str, _path: &str) -> Result<Vec<FileEntry>> {
// TODO: NATS request to corrosion.{license_id}.agent.file.list
todo!()
}
async fn trigger_steam_update(&self, _server_id: &str) -> Result<()> {
// TODO: NATS request to corrosion.{license_id}.agent.update
// Agent runs SteamCMD locally
todo!()
}
}