Skip to content

Commit e909549

Browse files
committed
Add VSS Http thin client implementation for get/put/listKeyVersions api's
1 parent 7b9e187 commit e909549

File tree

7 files changed

+191
-230
lines changed

7 files changed

+191
-230
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
/target
2+
/vss-accessor/src/proto/

Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
[workspace]
22
members = [
33
"vss-accessor",
4-
]
4+
]

vss-accessor/Cargo.toml

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,11 +6,12 @@ build = "build.rs"
66

77
[dependencies]
88
prost = "0.11.3"
9-
reqwest = "0.11.13"
9+
reqwest = { version = "0.11.13", features = ["rustls-tls"] }
1010

1111
[dev-dependencies]
1212
mockito = "0.31.1"
1313
tokio = { version = "1.22.0"}
1414

1515
[build-dependencies]
16-
prost-build = { version = "0.11.3" }
16+
prost-build = { version = "0.11.3" }
17+
reqwest = { version = "0.11.13", features = ["blocking"] }

vss-accessor/build.rs

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,21 @@
11
extern crate prost_build;
22

3+
use std::fs;
4+
use std::fs::File;
5+
use std::path::Path;
6+
37
fn main() {
8+
download_file("https://raw.githubusercontent.com/lightningdevkit/vss-server/main/app/src/main/proto/vss.proto",
9+
"src/proto/vss.proto").unwrap();
10+
411
prost_build::compile_protos(&["src/proto/vss.proto"],
512
&["src/"]).unwrap();
6-
}
13+
}
14+
15+
fn download_file(url: &str, save_to: &str) -> Result<(), Box<dyn std::error::Error>> {
16+
let mut response = reqwest::blocking::get(url)?;
17+
fs::create_dir_all(Path::new(save_to).parent().unwrap())?;
18+
let mut out_file = File::create(save_to)?;
19+
response.copy_to(&mut out_file)?;
20+
Ok(())
21+
}

vss-accessor/src/lib.rs

Lines changed: 95 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,95 @@
1+
use ::prost::Message;
2+
use reqwest;
3+
use reqwest::Client;
4+
use std::error::Error;
5+
6+
use crate::vss::{GetObjectRequest, GetObjectResponse, KeyValue, ListKeyVersionsRequest, ListKeyVersionsResponse, PutObjectRequest, PutObjectResponse};
7+
use crate::vss_error::VssError;
8+
9+
mod vss_error;
10+
11+
pub mod vss {
12+
include!(concat!(env!("OUT_DIR"), "/org.vss.rs"));
13+
}
14+
15+
pub struct VssAccessor {
16+
base_url: String,
17+
client: Client,
18+
}
19+
20+
impl VssAccessor {
21+
pub fn new(base_url: &str) -> Result<Self, Box<dyn Error>> {
22+
let client = Client::new();
23+
Ok(Self { base_url: String::from(base_url), client })
24+
}
25+
26+
pub async fn get(&self, store: &str, key: &str) -> Result<GetObjectResponse, VssError> {
27+
let url = format!("{}/getObject", self.base_url);
28+
29+
let request = GetObjectRequest { store_id: store.into(), key: key.to_string() };
30+
31+
let response_raw = self.client.post(url)
32+
.body(request.encode_to_vec())
33+
.send().await?;
34+
let status = response_raw.status();
35+
let payload = &response_raw.bytes().await?;
36+
37+
if status.is_success() {
38+
let response = GetObjectResponse::decode(&payload[..])?;
39+
Ok(response)
40+
} else {
41+
Err(VssError::new(status, &payload))
42+
}
43+
}
44+
45+
pub async fn put(&self, store: &str, global_version: Option<i64>, key: &str, version: i64, value: &[u8])
46+
-> Result<PutObjectResponse, VssError> {
47+
let kv = KeyValue { key: String::from(key), version, value: value.to_vec() };
48+
return self.put_tx(store, global_version, vec![kv]).await;
49+
}
50+
51+
pub async fn put_tx(&self, store: &str, global_version: Option<i64>, transaction_items: Vec<KeyValue>)
52+
-> Result<PutObjectResponse, VssError> {
53+
let url = format!("{}/putObjects", self.base_url);
54+
55+
let request = PutObjectRequest { store_id: store.into(), global_version, transaction_items };
56+
57+
let response_raw = self.client.post(url)
58+
.body(request.encode_to_vec())
59+
.send().await?;
60+
let status = response_raw.status();
61+
let payload = &response_raw.bytes().await?;
62+
63+
if status.is_success() {
64+
let response = PutObjectResponse::decode(&payload[..])?;
65+
Ok(response)
66+
} else {
67+
Err(VssError::new(status, &payload))
68+
}
69+
}
70+
71+
pub async fn list_key_versions(&self, store: &str, key_prefix: &str, page_size: Option<i32>, page_token: Option<String>)
72+
-> Result<ListKeyVersionsResponse, VssError> {
73+
let url = format!("{}/listKeyVersions", self.base_url);
74+
75+
let request = ListKeyVersionsRequest {
76+
store_id: store.to_string(),
77+
key_prefix: Some(key_prefix.to_string()),
78+
page_size,
79+
page_token,
80+
};
81+
82+
let response_raw = self.client.post(url)
83+
.body(request.encode_to_vec())
84+
.send().await?;
85+
let status = response_raw.status();
86+
let payload = &response_raw.bytes().await?;
87+
88+
if status.is_success() {
89+
let response = ListKeyVersionsResponse::decode(&payload[..])?;
90+
Ok(response)
91+
} else {
92+
Err(VssError::new(status, &payload))
93+
}
94+
}
95+
}

vss-accessor/src/proto/vss.proto

Lines changed: 0 additions & 226 deletions
This file was deleted.

0 commit comments

Comments
 (0)