holger-server-lib 0.5.0

Holger server library: config, wiring, gRPC service, Rust API
syntax = "proto3";

package holger.v1;

// Repository service — query and manage artifacts
service RepositoryService {
  // Fetch a single artifact by ID
  rpc FetchArtifact(FetchArtifactRequest) returns (FetchArtifactResponse);
  
  // List artifacts in a repository (with optional filter)
  rpc ListArtifacts(ListArtifactsRequest) returns (ListArtifactsResponse);
  
  // Upload an artifact (write-enabled repos only)
  rpc PutArtifact(PutArtifactRequest) returns (PutArtifactResponse);
  
  // Stream download for large artifacts
  rpc StreamArtifact(FetchArtifactRequest) returns (stream ArtifactChunk);
}

// Archive service — znippy archive operations
service ArchiveService {
  // List files in a znippy archive backing a repository
  rpc ListArchiveFiles(ListArchiveFilesRequest) returns (ListArchiveFilesResponse);
  
  // Get archive metadata (file count, total size, compression ratio)
  rpc ArchiveInfo(ArchiveInfoRequest) returns (ArchiveInfoResponse);
}

// Health / admin
service AdminService {
  // Server health check
  rpc Health(HealthRequest) returns (HealthResponse);
  
  // List configured repositories
  rpc ListRepositories(ListRepositoriesRequest) returns (ListRepositoriesResponse);
}

// ─── Messages ────────────────────────────────────────────────────────

message ArtifactId {
  string namespace = 1;  // e.g. groupId for Maven, empty for Rust
  string name = 2;
  string version = 3;
}

message FetchArtifactRequest {
  string repository = 1;
  ArtifactId id = 2;
}

message FetchArtifactResponse {
  bytes data = 1;
  string content_type = 2;
  int64 size_bytes = 3;
}

message ArtifactChunk {
  bytes data = 1;
}

message ListArtifactsRequest {
  string repository = 1;
  string name_filter = 2;  // optional substring filter
  int32 limit = 3;
  string page_token = 4;
}

message ArtifactEntry {
  ArtifactId id = 1;
  int64 size_bytes = 2;
  string content_type = 3;
}

message ListArtifactsResponse {
  repeated ArtifactEntry artifacts = 1;
  string next_page_token = 2;
}

message PutArtifactRequest {
  string repository = 1;
  ArtifactId id = 2;
  bytes data = 3;
}

message PutArtifactResponse {
  bool success = 1;
  string message = 2;
}

message ListArchiveFilesRequest {
  string repository = 1;
  string prefix = 2;  // optional path prefix filter
}

message ListArchiveFilesResponse {
  repeated string paths = 1;
  int64 total_files = 2;
}

message ArchiveInfoRequest {
  string repository = 1;
}

message ArchiveInfoResponse {
  int64 file_count = 1;
  int64 total_uncompressed_bytes = 2;
  string archive_path = 3;
}

message HealthRequest {}

message HealthResponse {
  string status = 1;  // "ok"
  string version = 2;
  int64 uptime_seconds = 3;
}

message ListRepositoriesRequest {}

message RepositoryInfo {
  string name = 1;
  string repo_type = 2;  // "rust", "maven3"
  bool writable = 3;
  bool has_archive = 4;
}

message ListRepositoriesResponse {
  repeated RepositoryInfo repositories = 1;
}