use base64::DecodeError;
use serde::{Deserialize, Serialize};
use std::future::Future;
use std::pin::Pin;
use std::sync::Arc;
use thiserror::Error;
use uuid::Uuid;
pub fn add(left: u64, right: u64) -> u64 {
left + right
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn it_works() {
let result = add(2, 2);
assert_eq!(result, 4);
}
}
pub type GetCallback = Arc<
dyn Fn(
GetEvent,
) -> Pin<
Box<
dyn Future<Output = Result<bool, Box<dyn std::error::Error + Send + Sync>>>
+ Send
+ Sync,
>,
> + Send
+ Sync,
>;
pub type InitCallback = Box<
dyn Fn(
InitProgressEvent,
) -> Pin<
Box<
dyn Future<Output = Result<Option<bool>, Box<dyn std::error::Error + Send + Sync>>>
+ Send
+ Sync,
>,
> + Send
+ Sync,
>;
pub type PurgeCallback = Arc<
dyn Fn(
PurgeEvent,
) -> Pin<
Box<
dyn Future<Output = Result<bool, Box<dyn std::error::Error + Send + Sync>>>
+ Send
+ Sync,
>,
> + Send
+ Sync,
>;
pub type SyncCallback = Arc<
dyn Fn(
SyncEvent,
) -> Pin<
Box<
dyn Future<Output = Result<bool, Box<dyn std::error::Error + Send + Sync>>>
+ Send
+ Sync,
>,
> + Send
+ Sync,
>;
pub type HealthCheckCallback = Arc<
dyn Fn(
HealthCheckEvent,
) -> Pin<
Box<
dyn Future<Output = Result<bool, Box<dyn std::error::Error + Send + Sync>>>
+ Send
+ Sync,
>,
> + Send
+ Sync,
>;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub enum GetEvent {
Starting {
total_chunks: usize,
},
PadFetched,
Complete,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub enum InitProgressEvent {
Starting {
total_steps: u64,
},
Step {
step: u64,
message: String,
},
PromptCreateRemoteIndex,
Failed {
error_msg: String,
},
Complete {
message: String,
},
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub enum PurgeEvent {
Starting {
total_count: usize,
},
PadProcessed,
Complete {
verified_count: usize,
failed_count: usize,
},
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub enum SyncEvent {
FetchingRemoteIndex,
Merging,
PushingRemoteIndex,
VerifyingRemoteIndex,
Complete,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub enum HealthCheckEvent {
Starting {
total_keys: usize,
},
KeyProcessed,
Complete {
nb_keys_updated: usize,
},
}
pub type TaskId = Uuid;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub enum TaskType {
Put,
Get,
Sync,
Purge,
HealthCheck,
Rm,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub enum TaskStatus {
Stopped,
Pending,
InProgress,
Completed,
Failed,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub enum PutEvent {
Starting {
total_chunks: usize,
initial_written_count: usize,
initial_confirmed_count: usize,
chunks_to_reserve: usize,
},
PadReserved,
PadsWritten,
PadsConfirmed,
Complete,
}
pub type PutCallback = Arc<
dyn Fn(
PutEvent,
) -> Pin<
Box<
dyn Future<Output = Result<bool, Box<dyn std::error::Error + Send + Sync>>>
+ Send
+ Sync,
>,
> + Send
+ Sync,
>;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub enum TaskProgress {
Put(PutEvent),
Get(GetEvent),
Sync(SyncEvent),
Purge(PurgeEvent),
HealthCheck(HealthCheckEvent),
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub enum TaskResult {
Pending,
Error(String),
Result(TaskResultType),
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub enum TaskResultType {
Put(PutResult),
Get(GetResult),
Sync(SyncResult),
Purge(PurgeResult),
HealthCheck(HealthCheckResult),
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct PutResult {
pub public_address: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct Task {
pub id: TaskId,
pub task_type: TaskType,
pub status: TaskStatus,
pub progress: Option<TaskProgress>,
pub result: TaskResult,
pub key: Option<String>, }
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct PutRequest {
pub user_key: String,
pub source_path: String, pub mode: StorageMode,
pub public: bool,
pub no_verify: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct GetRequest {
pub user_key: String,
pub destination_path: String, pub public: bool,
}
#[derive(Deserialize, Debug, PartialEq, Eq, Serialize, Clone)]
pub struct QueryTaskRequest {
pub task_id: Uuid,
}
#[derive(Deserialize, Debug, PartialEq, Eq, Serialize, Clone)]
pub struct ListTasksRequest;
#[derive(Deserialize, Debug, PartialEq, Eq, Serialize, Clone)]
pub struct StopTaskRequest {
pub task_id: Uuid,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct RmRequest {
pub user_key: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct ListKeysRequest;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct PurgeRequest {
pub aggressive: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(tag = "type")]
pub enum Request {
Put(PutRequest),
Get(GetRequest),
QueryTask(QueryTaskRequest),
ListTasks(ListTasksRequest),
StopTask(StopTaskRequest),
Rm(RmRequest),
ListKeys(ListKeysRequest),
Stats(StatsRequest),
Sync(SyncRequest),
Purge(PurgeRequest),
Import(ImportRequest),
Export(ExportRequest),
HealthCheck(HealthCheckRequest),
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct TaskCreatedResponse {
pub task_id: Uuid,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct TaskUpdateResponse {
pub task_id: TaskId,
pub status: TaskStatus,
pub progress: Option<TaskProgress>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct TaskResultResponse {
pub task_id: Uuid,
pub status: TaskStatus,
pub result: TaskResult,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct TaskStoppedResponse {
pub task_id: Uuid,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct TaskListEntry {
pub task_id: Uuid,
pub task_type: TaskType,
pub status: TaskStatus,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct TaskListResponse {
pub tasks: Vec<TaskListEntry>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct ErrorResponse {
pub error: String,
pub original_request: Option<String>, }
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct RmSuccessResponse {
pub user_key: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct KeyDetails {
pub key: String,
pub total_size: usize,
pub pad_count: usize,
pub confirmed_pads: usize,
pub is_public: bool,
pub public_address: Option<String>, }
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct ListKeysResponse {
pub keys: Vec<KeyDetails>,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct StatsRequest {}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct StatsResponse {
pub total_keys: u64,
pub total_pads: u64,
pub occupied_pads: u64,
pub free_pads: u64,
pub pending_verify_pads: u64,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct SyncRequest {
pub push_force: bool,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct SyncResponse {
pub result: SyncResult,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct SyncResult {
pub nb_keys_added: usize,
pub nb_keys_updated: usize,
pub nb_free_pads_added: usize,
pub nb_pending_pads_added: usize,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
pub struct GetResult {
pub size: usize,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct PurgeResponse {
pub result: PurgeResult,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct PurgeResult {
pub nb_pads_purged: usize,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct ImportRequest {
pub file_path: String,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct ImportResponse {
pub result: ImportResult,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct ImportResult {
pub nb_keys_imported: usize,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct ExportRequest {
pub destination_path: String,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct ExportResponse {
pub result: ExportResult,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct ExportResult {
pub nb_keys_exported: usize,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct HealthCheckRequest {
pub key_name: String,
pub recycle: bool,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct HealthCheckResponse {
pub result: HealthCheckResult,
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq, Eq)]
pub struct HealthCheckResult {
pub nb_keys_reset: usize,
pub nb_keys_recycled: usize,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq)]
#[serde(tag = "type")]
pub enum Response {
Error(ErrorResponse),
TaskCreated(TaskCreatedResponse),
TaskUpdate(TaskUpdateResponse),
TaskResult(TaskResultResponse),
TaskStopped(TaskStoppedResponse),
TaskList(TaskListResponse),
RmSuccess(RmSuccessResponse),
ListKeys(ListKeysResponse),
Stats(StatsResponse),
Import(ImportResponse),
Export(ExportResponse),
}
#[derive(Error, Debug)]
pub enum ProtocolError {
#[error("JSON serialization error: {0}")]
Serialization(#[from] serde_json::Error),
#[error("JSON deserialization error: {0}")]
Deserialization(serde_json::Error),
#[error("Base64 decoding error: {0}")]
Base64Decode(#[from] DecodeError),
#[error("Task not found: {0}")]
TaskNotFound(Uuid),
#[error("Invalid request format: {0}")]
InvalidRequest(String),
#[error("Internal server error: {0}")] InternalError(String),
#[error("WebSocket error: {0}")] WebSocket(String),
}
pub const LIGHTEST_SCRATCHPAD_SIZE: usize = 512 * 1024;
pub const LIGHT_SCRATCHPAD_SIZE: usize = 1 * 1024 * 1024;
pub const MEDIUM_SCRATCHPAD_SIZE: usize = 2 * 1024 * 1024;
pub const HEAVY_SCRATCHPAD_SIZE: usize = 3 * 1024 * 1024;
pub const HEAVIEST_SCRATCHPAD_SIZE: usize = (4 * 1024 * 1024) - 4096;
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq, Eq, PartialOrd, Ord)]
pub enum StorageMode {
Lightest,
Light,
Medium,
Heavy,
Heaviest,
}
impl StorageMode {
pub fn scratchpad_size(&self) -> usize {
match self {
StorageMode::Lightest => LIGHTEST_SCRATCHPAD_SIZE,
StorageMode::Light => LIGHT_SCRATCHPAD_SIZE,
StorageMode::Medium => MEDIUM_SCRATCHPAD_SIZE,
StorageMode::Heavy => HEAVY_SCRATCHPAD_SIZE,
StorageMode::Heaviest => HEAVIEST_SCRATCHPAD_SIZE,
}
}
}