Skip to content

Commit a0147ac

Browse files
let json serialization handle the base64 encode/decode
1 parent 2914171 commit a0147ac

File tree

4 files changed

+20
-50
lines changed

4 files changed

+20
-50
lines changed

sdk-rs/src/store.rs

Lines changed: 5 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -8,28 +8,12 @@ use serde::{Deserialize, Serialize};
88
/// The JSON payload for a `get` operation response.
99
#[derive(Serialize, Deserialize, Debug)]
1010
pub struct GetResultPayload {
11-
pub value: String,
12-
}
13-
14-
/// The result of a `get` operation.
15-
#[derive(Debug)]
16-
pub struct GetResult {
17-
/// The retrieved value.
1811
pub value: Vec<u8>,
1912
}
2013

21-
/// An item in the result of a `query` operation. For internal use.
14+
/// An item in the result of a `query` operation.
2215
#[derive(Serialize, Deserialize, Debug)]
2316
pub struct QueryResultItemPayload {
24-
/// The key of the item (base64 encoded).
25-
pub key: String,
26-
/// The value of the item (base64 encoded).
27-
pub value: String,
28-
}
29-
30-
/// An item in the result of a `query` operation.
31-
#[derive(Debug)]
32-
pub struct QueryResultItem {
3317
/// The key of the item.
3418
pub key: Vec<u8>,
3519
/// The value of the item.
@@ -42,13 +26,6 @@ pub struct QueryResultPayload {
4226
pub results: Vec<QueryResultItemPayload>,
4327
}
4428

45-
/// The result of a `query` operation.
46-
#[derive(Debug)]
47-
pub struct QueryResult {
48-
/// A list of key-value pairs.
49-
pub results: Vec<QueryResultItem>,
50-
}
51-
5229
/// A client for interacting with the key-value store.
5330
#[derive(Clone)]
5431
pub struct Client {
@@ -90,7 +67,7 @@ impl Client {
9067
/// Retrieves a value from the store by its key.
9168
///
9269
/// If the key does not exist, `Ok(None)` is returned.
93-
pub async fn get(&self, key: &[u8]) -> Result<Option<GetResult>, Error> {
70+
pub async fn get(&self, key: &[u8]) -> Result<Option<GetResultPayload>, Error> {
9471
let key_b64 = general_purpose::STANDARD.encode(key);
9572
let url = format!("{}/store/{}", self.client.base_url, key_b64);
9673
let mut headers = reqwest::header::HeaderMap::new();
@@ -116,9 +93,8 @@ impl Client {
11693
}
11794

11895
let payload: GetResultPayload = res.json().await?;
119-
let value = general_purpose::STANDARD.decode(payload.value)?;
12096

121-
Ok(Some(GetResult { value }))
97+
Ok(Some(payload))
12298
}
12399

124100
/// Queries for a range of key-value pairs.
@@ -133,7 +109,7 @@ impl Client {
133109
start: Option<&[u8]>,
134110
end: Option<&[u8]>,
135111
limit: Option<usize>,
136-
) -> Result<QueryResult, Error> {
112+
) -> Result<QueryResultPayload, Error> {
137113
let mut url = format!("{}/store?", self.client.base_url);
138114
if let Some(start) = start {
139115
let start_b64 = general_purpose::STANDARD.encode(start);
@@ -166,14 +142,7 @@ impl Client {
166142
}
167143

168144
let payload: QueryResultPayload = res.json().await?;
169-
let mut results = Vec::new();
170-
for item in payload.results {
171-
results.push(QueryResultItem {
172-
key: general_purpose::STANDARD.decode(item.key)?,
173-
value: general_purpose::STANDARD.decode(item.value)?,
174-
});
175-
}
176145

177-
Ok(QueryResult { results })
146+
Ok(payload)
178147
}
179148
}

sdk-ts/__tests__/sdk.test.ts

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -38,21 +38,22 @@ describe('Exoware TS SDK', () => {
3838

3939
it('should query for key-value pairs', async () => {
4040
const store = client.store();
41+
const encoder = new TextEncoder();
4142
const prefix = 'query-test-';
4243
const pairs = [
43-
{ key: `${prefix}a`, value: Buffer.from('a') },
44-
{ key: `${prefix}b`, value: Buffer.from('b') },
45-
{ key: `${prefix}c`, value: Buffer.from('c') },
44+
{ key: encoder.encode(`${prefix}a`), value: Buffer.from('a') },
45+
{ key: encoder.encode(`${prefix}b`), value: Buffer.from('b') },
46+
{ key: encoder.encode(`${prefix}c`), value: Buffer.from('c') },
4647
];
4748

4849
for (const pair of pairs) {
49-
await store.set(new TextEncoder().encode(pair.key), pair.value);
50+
await store.set(pair.key, pair.value);
5051
}
5152

52-
const result = await store.query(`${prefix}a`, `${prefix}z`);
53+
const result = await store.query(encoder.encode(`${prefix}a`), encoder.encode(`${prefix}z`));
5354
expect(result.results.length).toBe(3);
5455
expect(result.results.map(r => Buffer.from(r.value))).toEqual(pairs.map(p => p.value));
55-
expect(result.results.map(r => new TextDecoder().decode(r.key)).sort()).toEqual(pairs.map(p => p.key).sort());
56+
expect(result.results.map(r => r.key).sort()).toEqual(pairs.map(p => p.key).sort());
5657
});
5758

5859
describe('limits', () => {

sdk-ts/src/store.ts

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,8 @@ export class StoreClient {
6464
const encodedKey = Base64.fromUint8Array(key);
6565
const url = `${this.client.baseUrl}/store/${encodedKey}`;
6666
try {
67-
const response = await this.client.httpClient.get<{ value: string }>(url);
68-
const value = Base64.toUint8Array(response.data.value);
67+
const response = await this.client.httpClient.get<{ value: number[] }>(url);
68+
const value = new Uint8Array(response.data.value);
6969
return { value };
7070
} catch (error) {
7171
if (error instanceof AxiosError && error.response) {
@@ -97,10 +97,10 @@ export class StoreClient {
9797
if (limit) url.searchParams.append('limit', limit.toString());
9898

9999
try {
100-
const response = await this.client.httpClient.get<{ results: { key: string, value: string }[] }>(url.toString());
100+
const response = await this.client.httpClient.get<{ results: { key: number[], value: number[] }[] }>(url.toString());
101101
const results = response.data.results.map(item => ({
102-
key: Base64.toUint8Array(item.key),
103-
value: Base64.toUint8Array(item.value),
102+
key: new Uint8Array(item.key),
103+
value: new Uint8Array(item.value)
104104
}));
105105
return { results };
106106
} catch (error) {

simulator/src/server/store/handlers.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@ pub(super) async fn get(
140140
"get request completed successfully"
141141
);
142142
Ok(Json(GetResultPayload {
143-
value: general_purpose::STANDARD.encode(&stored_value.value),
143+
value: stored_value.value,
144144
}))
145145
} else {
146146
debug!(
@@ -210,8 +210,8 @@ pub(super) async fn query(
210210
}
211211

212212
results.push(QueryResultItemPayload {
213-
key: general_purpose::STANDARD.encode(&key),
214-
value: general_purpose::STANDARD.encode(&stored_value.value),
213+
key: key.to_vec(),
214+
value: stored_value.value,
215215
});
216216
} else {
217217
warn!(

0 commit comments

Comments
 (0)