diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/client.rs | 25 | ||||
| -rw-r--r-- | src/id_worker.rs | 62 | ||||
| -rw-r--r-- | src/main.rs | 0 | ||||
| -rw-r--r-- | src/server.rs | 63 |
4 files changed, 0 insertions, 150 deletions
diff --git a/src/client.rs b/src/client.rs deleted file mode 100644 index 75b4c8f..0000000 --- a/src/client.rs +++ /dev/null @@ -1,25 +0,0 @@ -// !Sample implementation of a gRPC Client for Clawflake, not meant to production! - -pub mod clawflake { - tonic::include_proto!("clawflake"); -} - -use clawflake::clawflake_client::ClawflakeClient; -use clawflake::IdRequest; - -#[tokio::main] -async fn main() -> Result<(), Box<dyn std::error::Error>> { - let addr = "http://[::0]:50051"; - - let mut client = ClawflakeClient::connect(addr).await?; - - println!("Client connected to {}", addr); - let request = tonic::Request::new(IdRequest {}); - - println!("Trying to get an ID"); - let response = client.get_id(request).await?; - - println!("Received: {:?}", response); - - Ok(()) -} diff --git a/src/id_worker.rs b/src/id_worker.rs deleted file mode 100644 index 248559f..0000000 --- a/src/id_worker.rs +++ /dev/null @@ -1,62 +0,0 @@ -use chrono::Utc; -use parking_lot::Mutex; -use std::sync::Arc; - -#[derive(Default)] -#[derive(Debug)] -pub struct IdWorker { - epoch: i64, - worker_id: i64, - datacenter_id: i64, - sequence: i64, - time: Arc<Mutex<i64>>, -} - -impl IdWorker { - pub fn new(epoch: i64, worker_id: i64, datacenter_id: i64) -> IdWorker { - IdWorker { - epoch, - worker_id, - datacenter_id, - sequence: 0, - time: Arc::new(Mutex::new(0)), - } - } - - #[allow(dead_code)] - pub fn epoch(&mut self, epoch: i64) -> &mut Self { - self.epoch = epoch; - self - } - - #[allow(dead_code)] - pub fn worker_id(&mut self, worker_id: i64) -> &mut Self { - self.worker_id = worker_id; - self - } - - #[allow(dead_code)] - pub fn datacenter_id(&mut self, datacenter_id: i64) -> &mut Self { - self.datacenter_id = datacenter_id; - self - } - - pub fn next_id(&mut self) -> i64 { - let mut last_timestamp = self.time.lock(); - let mut timestamp = self.get_time(); - if timestamp == *last_timestamp { - self.sequence = (self.sequence + 1) & (-1 ^ (-1 << 12)); - if self.sequence == 0 && timestamp <= *last_timestamp { - timestamp = self.get_time(); - } - } else { - self.sequence = 0; - } - *last_timestamp = timestamp; - (timestamp << 22) | (self.worker_id << 17) | (self.datacenter_id << 12) | self.sequence - } - - fn get_time(&self) -> i64 { - Utc::now().timestamp_millis() - self.epoch - } -} diff --git a/src/main.rs b/src/main.rs deleted file mode 100644 index e69de29..0000000 --- a/src/main.rs +++ /dev/null diff --git a/src/server.rs b/src/server.rs deleted file mode 100644 index 16cc044..0000000 --- a/src/server.rs +++ /dev/null @@ -1,63 +0,0 @@ -pub mod clawflake { - tonic::include_proto!("clawflake"); -} -use clawflake::clawflake_server::{Clawflake, ClawflakeServer}; -use clawflake::{IdReply, IdRequest}; - -mod id_worker; -use id_worker::IdWorker; - -use std::env; -use std::net::SocketAddr; -use tonic::{transport::Server, Request, Response, Status}; - -#[derive(Debug, Default)] -pub struct MyClawflakeService {} - -#[tonic::async_trait] -impl Clawflake for MyClawflakeService { - async fn get_id(&self, _: Request<IdRequest>) -> Result<Response<IdReply>, Status> { - let mut worker: IdWorker = IdWorker::new( - env::var("CLAWFLAKE_EPOCH") - .expect("Missing env `CLAWFLAKE_EPOCH`") - .parse::<i64>() - .unwrap(), - env::var("CLAWFLAKE_WORKER_ID") - .expect("Missing env `CLAWFLAKE_WORKER_ID`") - .parse::<i64>() - .unwrap(), - env::var("CLAWFLAKE_DATACENTER_ID") - .expect("Missing env `CLAWFLAKE_DATACENTER_ID`") - .parse::<i64>() - .unwrap(), - ); - - let reply: IdReply = clawflake::IdReply { - id: format!("{}", worker.next_id()).into(), - }; - - Ok(Response::new(reply)) - } -} - -#[tokio::main] -async fn main() -> Result<(), Box<dyn std::error::Error>> { - // init tonic_health - let (mut health_reporter, health_service) = tonic_health::server::health_reporter(); - health_reporter - .set_serving::<ClawflakeServer<MyClawflakeService>>() - .await; - - // init tonic and IdWorker - let addr: SocketAddr = "[::0]:50051".parse()?; - let srv: MyClawflakeService = MyClawflakeService::default(); - - println!("Server listening on {}", addr); - - Server::builder() - .add_service(health_service) - .add_service(ClawflakeServer::new(srv)) - .serve(addr) - .await?; - Ok(()) -} |
