1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
use crate::challenge; use semver::{Version, VersionReq}; use serde_derive::{Deserialize, Serialize}; use uuid::Uuid; pub fn protocol_version() -> Version { Version::parse("0.1.0-dev-1").unwrap() } pub fn protocol_version_requirements() -> VersionReq { VersionReq::parse("=0.1.0-dev-1").unwrap() } #[derive(Serialize, Deserialize, Debug, Clone)] pub struct WsRequest<T> { pub id: u64, pub request: ServerRequest<T>, } #[derive(Serialize, Deserialize, Debug, Default, Clone)] pub struct WsBatchResponse<T> { pub request_id: Option<u64>, pub results: Vec<ServerResponse<T>>, } impl<T> WsBatchResponse<T> { pub fn new(request_id: Option<u64>, results: Vec<ServerResponse<T>>) -> Self { Self { request_id, results, } } pub fn from_result(result: ServerResponse<T>) -> Self { Self::new(None, vec![result]) } pub fn from_results(results: Vec<ServerResponse<T>>) -> Self { Self::new(None, results) } pub fn from_response(response: T) -> Self { Self::new(None, vec![ServerResponse::Response(response)]) } } #[derive(Serialize, Deserialize, Debug, Clone)] pub enum ServerRequest<T> { Greetings { protocol_version: String, server_version: String, installation_id: Option<Uuid>, }, ChallengeResponse([u8; 32]), Pong { original_timestamp: f64, timestamp: f64, }, Request(T), } #[derive(Serialize, Deserialize, Debug, Clone)] pub enum ServerResponse<T> { Ping { timestamp: f64, average_roundtrip: f64, average_server_timestamp_delta: f64, }, NewInstallation(InstallationConfig), Challenge { nonce: [u8; 32], }, Connected { installation_id: Uuid, }, Response(T), Error(ServerError), } #[derive(Serialize, Deserialize, Debug, Clone)] pub enum ServerError { IncompatibleVersion, Other(String), } #[derive(Serialize, Deserialize, Debug, Clone, Copy)] pub struct InstallationConfig { pub id: Uuid, pub private_key: [u8; 32], } impl Default for InstallationConfig { fn default() -> Self { Self { id: Uuid::new_v4(), private_key: challenge::nonce(), } } }