more json api
This commit is contained in:
parent
0e52c1fb0a
commit
89f5770fd1
@ -295,12 +295,4 @@ impl VeilidAPI {
|
|||||||
pub async fn cancel_tunnel(&self, _tunnel_id: TunnelId) -> VeilidAPIResult<bool> {
|
pub async fn cancel_tunnel(&self, _tunnel_id: TunnelId) -> VeilidAPIResult<bool> {
|
||||||
panic!("unimplemented");
|
panic!("unimplemented");
|
||||||
}
|
}
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////
|
|
||||||
// JSON API
|
|
||||||
|
|
||||||
#[instrument(level = "debug", skip(self))]
|
|
||||||
pub async fn json_request(&self, request: json_api::Request) -> json_api::Response {
|
|
||||||
panic!("unimplemented");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -2,16 +2,16 @@ use super::*;
|
|||||||
|
|
||||||
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
|
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
|
||||||
pub struct CryptoSystemRequest {
|
pub struct CryptoSystemRequest {
|
||||||
cs_id: String,
|
pub cs_id: u32,
|
||||||
#[serde(flatten)]
|
#[serde(flatten)]
|
||||||
cs_op: CryptoSystemRequestOp,
|
pub cs_op: CryptoSystemRequestOp,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
|
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
|
||||||
pub struct CryptoSystemResponse {
|
pub struct CryptoSystemResponse {
|
||||||
cs_id: String,
|
pub cs_id: u32,
|
||||||
#[serde(flatten)]
|
#[serde(flatten)]
|
||||||
cs_op: CryptoSystemResponseOp,
|
pub cs_op: CryptoSystemResponseOp,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
|
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
|
||||||
@ -140,6 +140,7 @@ pub enum CryptoSystemRequestOp {
|
|||||||
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
|
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
|
||||||
#[serde(tag = "cs_op")]
|
#[serde(tag = "cs_op")]
|
||||||
pub enum CryptoSystemResponseOp {
|
pub enum CryptoSystemResponseOp {
|
||||||
|
InvalidId,
|
||||||
Release,
|
Release,
|
||||||
CachedDh {
|
CachedDh {
|
||||||
#[serde(flatten)]
|
#[serde(flatten)]
|
||||||
|
@ -9,11 +9,14 @@ pub use table_db::*;
|
|||||||
mod crypto_system;
|
mod crypto_system;
|
||||||
pub use crypto_system::*;
|
pub use crypto_system::*;
|
||||||
|
|
||||||
|
mod process;
|
||||||
|
pub use process::*;
|
||||||
|
|
||||||
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
|
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
|
||||||
pub struct Request {
|
pub struct Request {
|
||||||
/// Operation Id (pairs with Response, or empty if unidirectional)
|
/// Operation Id (pairs with Response, or empty if unidirectional)
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
id: String,
|
id: u32,
|
||||||
/// The request operation variant
|
/// The request operation variant
|
||||||
#[serde(flatten)]
|
#[serde(flatten)]
|
||||||
op: RequestOp,
|
op: RequestOp,
|
||||||
@ -30,7 +33,7 @@ pub enum RecvMessage {
|
|||||||
pub struct Response {
|
pub struct Response {
|
||||||
/// Operation Id (pairs with Request, or empty if unidirectional)
|
/// Operation Id (pairs with Request, or empty if unidirectional)
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
id: String,
|
id: u32,
|
||||||
/// The response operation variant
|
/// The response operation variant
|
||||||
#[serde(flatten)]
|
#[serde(flatten)]
|
||||||
op: ResponseOp,
|
op: ResponseOp,
|
||||||
@ -163,13 +166,13 @@ pub enum ResponseOp {
|
|||||||
},
|
},
|
||||||
// Routing Context
|
// Routing Context
|
||||||
NewRoutingContext {
|
NewRoutingContext {
|
||||||
value: String,
|
value: u32,
|
||||||
},
|
},
|
||||||
RoutingContext(RoutingContextResponse),
|
RoutingContext(RoutingContextResponse),
|
||||||
// TableDb
|
// TableDb
|
||||||
OpenTableDb {
|
OpenTableDb {
|
||||||
#[serde(flatten)]
|
#[serde(flatten)]
|
||||||
result: ApiResult<String>,
|
result: ApiResult<u32>,
|
||||||
},
|
},
|
||||||
DeleteTableDb {
|
DeleteTableDb {
|
||||||
#[serde(flatten)]
|
#[serde(flatten)]
|
||||||
@ -180,10 +183,10 @@ pub enum ResponseOp {
|
|||||||
// Crypto
|
// Crypto
|
||||||
GetCryptoSystem {
|
GetCryptoSystem {
|
||||||
#[serde(flatten)]
|
#[serde(flatten)]
|
||||||
result: ApiResult<String>,
|
result: ApiResult<u32>,
|
||||||
},
|
},
|
||||||
BestCryptoSystem {
|
BestCryptoSystem {
|
||||||
value: String,
|
value: u32,
|
||||||
},
|
},
|
||||||
CryptoSystem(CryptoSystemResponse),
|
CryptoSystem(CryptoSystemResponse),
|
||||||
VerifySignatures {
|
VerifySignatures {
|
||||||
|
503
veilid-core/src/veilid_api/json_api/process.rs
Normal file
503
veilid-core/src/veilid_api/json_api/process.rs
Normal file
@ -0,0 +1,503 @@
|
|||||||
|
use super::*;
|
||||||
|
use futures_util::FutureExt;
|
||||||
|
|
||||||
|
fn to_json_api_result<T: Clone + fmt::Debug + JsonSchema>(
|
||||||
|
r: VeilidAPIResult<T>,
|
||||||
|
) -> json_api::ApiResult<T> {
|
||||||
|
match r {
|
||||||
|
Err(e) => json_api::ApiResult::Err { error: e },
|
||||||
|
Ok(v) => json_api::ApiResult::Ok { value: v },
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn to_json_api_result_with_string<T: Clone + fmt::Debug>(
|
||||||
|
r: VeilidAPIResult<T>,
|
||||||
|
) -> json_api::ApiResultWithString<T> {
|
||||||
|
match r {
|
||||||
|
Err(e) => json_api::ApiResultWithString::Err { error: e },
|
||||||
|
Ok(v) => json_api::ApiResultWithString::Ok { value: v },
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn to_json_api_result_with_vec_u8(r: VeilidAPIResult<Vec<u8>>) -> json_api::ApiResultWithVecU8 {
|
||||||
|
match r {
|
||||||
|
Err(e) => json_api::ApiResultWithVecU8::Err { error: e },
|
||||||
|
Ok(v) => json_api::ApiResultWithVecU8::Ok { value: v },
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
fn to_json_api_result_with_vec_vec_u8(
|
||||||
|
r: VeilidAPIResult<Vec<Vec<u8>>>,
|
||||||
|
) -> json_api::ApiResultWithVecVecU8 {
|
||||||
|
match r {
|
||||||
|
Err(e) => json_api::ApiResultWithVecVecU8::Err { error: e },
|
||||||
|
Ok(v) => json_api::ApiResultWithVecVecU8::Ok {
|
||||||
|
value: v.into_iter().map(|v| VecU8 { value: v }).collect(),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub struct JsonRequestProcessor {
|
||||||
|
api: VeilidAPI,
|
||||||
|
routing_contexts: Mutex<BTreeMap<u32, RoutingContext>>,
|
||||||
|
table_dbs: Mutex<BTreeMap<u32, TableDB>>,
|
||||||
|
table_db_transactions: Mutex<BTreeMap<u32, TableDBTransaction>>,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl JsonRequestProcessor {
|
||||||
|
pub fn new(api: VeilidAPI) -> Self {
|
||||||
|
Self {
|
||||||
|
api,
|
||||||
|
routing_contexts: Default::default(),
|
||||||
|
table_dbs: Default::default(),
|
||||||
|
table_db_transactions: Default::default(),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Routing Context
|
||||||
|
fn add_routing_context(&self, routing_context: RoutingContext) -> u32 {
|
||||||
|
let mut next_id: u32 = 1;
|
||||||
|
let mut rc = self.routing_contexts.lock();
|
||||||
|
while rc.contains_key(&next_id) {
|
||||||
|
next_id += 1;
|
||||||
|
}
|
||||||
|
rc.insert(next_id, routing_context);
|
||||||
|
next_id
|
||||||
|
}
|
||||||
|
fn lookup_routing_context(&self, id: u32, rc_id: u32) -> Result<RoutingContext, Response> {
|
||||||
|
let routing_contexts = self.routing_contexts.lock();
|
||||||
|
let Some(routing_context) = routing_contexts.get(&rc_id).cloned() else {
|
||||||
|
return Err(Response {
|
||||||
|
id,
|
||||||
|
op: ResponseOp::RoutingContext(RoutingContextResponse {
|
||||||
|
rc_id,
|
||||||
|
rc_op: RoutingContextResponseOp::InvalidId
|
||||||
|
})
|
||||||
|
});
|
||||||
|
};
|
||||||
|
Ok(routing_context)
|
||||||
|
}
|
||||||
|
fn release_routing_context(&self, id: u32) -> i32 {
|
||||||
|
let mut rc = self.routing_contexts.lock();
|
||||||
|
if rc.remove(&id).is_none() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TableDB
|
||||||
|
fn add_table_db(&self, table_db: TableDB) -> u32 {
|
||||||
|
let mut next_id: u32 = 1;
|
||||||
|
let mut rc = self.table_dbs.lock();
|
||||||
|
while rc.contains_key(&next_id) {
|
||||||
|
next_id += 1;
|
||||||
|
}
|
||||||
|
rc.insert(next_id, table_db);
|
||||||
|
next_id
|
||||||
|
}
|
||||||
|
fn lookup_table_db(&self, id: u32, db_id: u32) -> Result<TableDB, Response> {
|
||||||
|
let table_dbs = self.table_dbs.lock();
|
||||||
|
let Some(table_db) = table_dbs.get(&db_id).cloned() else {
|
||||||
|
return Err(Response {
|
||||||
|
id,
|
||||||
|
op: ResponseOp::TableDb(TableDbResponse {
|
||||||
|
db_id,
|
||||||
|
db_op: TableDbResponseOp::InvalidId
|
||||||
|
})
|
||||||
|
});
|
||||||
|
};
|
||||||
|
Ok(table_db)
|
||||||
|
}
|
||||||
|
fn release_table_db(&self, id: u32) -> i32 {
|
||||||
|
let mut rc = self.table_dbs.lock();
|
||||||
|
if rc.remove(&id).is_none() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TableDBTransaction
|
||||||
|
fn add_table_db_transaction(&self, tdbt: TableDBTransaction) -> u32 {
|
||||||
|
let mut next_id: u32 = 1;
|
||||||
|
let mut tdbts = self.table_db_transactions.lock();
|
||||||
|
while tdbts.contains_key(&next_id) {
|
||||||
|
next_id += 1;
|
||||||
|
}
|
||||||
|
tdbts.insert(next_id, tdbt);
|
||||||
|
next_id
|
||||||
|
}
|
||||||
|
fn lookup_table_db_transaction(
|
||||||
|
&self,
|
||||||
|
id: u32,
|
||||||
|
tx_id: u32,
|
||||||
|
) -> Result<TableDBTransaction, Response> {
|
||||||
|
let table_db_transactions = self.table_db_transactions.lock();
|
||||||
|
let Some(table_db_transaction) = table_db_transactions.get(&tx_id).cloned() else {
|
||||||
|
return Err(Response {
|
||||||
|
id,
|
||||||
|
op: ResponseOp::TableDbTransaction(TableDbTransactionResponse {
|
||||||
|
tx_id,
|
||||||
|
tx_op: TableDbTransactionResponseOp::InvalidId
|
||||||
|
})
|
||||||
|
});
|
||||||
|
};
|
||||||
|
Ok(table_db_transaction)
|
||||||
|
}
|
||||||
|
fn release_table_db_transaction(&self, id: u32) -> i32 {
|
||||||
|
let mut tdbts = self.table_db_transactions.lock();
|
||||||
|
if tdbts.remove(&id).is_none() {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Target
|
||||||
|
|
||||||
|
// Parse target
|
||||||
|
async fn parse_target(&self, s: String) -> VeilidAPIResult<Target> {
|
||||||
|
// Is this a route id?
|
||||||
|
if let Ok(rrid) = RouteId::from_str(&s) {
|
||||||
|
let routing_table = self.api.routing_table()?;
|
||||||
|
let rss = routing_table.route_spec_store();
|
||||||
|
|
||||||
|
// Is this a valid remote route id? (can't target allocated routes)
|
||||||
|
if rss.is_route_id_remote(&rrid) {
|
||||||
|
return Ok(Target::PrivateRoute(rrid));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Is this a node id?
|
||||||
|
if let Ok(nid) = TypedKey::from_str(&s) {
|
||||||
|
return Ok(Target::NodeId(nid));
|
||||||
|
}
|
||||||
|
|
||||||
|
Err(VeilidAPIError::invalid_target())
|
||||||
|
}
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
|
||||||
|
pub async fn process_routing_context_request(
|
||||||
|
&self,
|
||||||
|
routing_context: RoutingContext,
|
||||||
|
rcr: RoutingContextRequest,
|
||||||
|
) -> RoutingContextResponse {
|
||||||
|
let rc_op = match rcr.rc_op {
|
||||||
|
RoutingContextRequestOp::Release => {
|
||||||
|
self.release_routing_context(rcr.rc_id);
|
||||||
|
RoutingContextResponseOp::Release {}
|
||||||
|
}
|
||||||
|
RoutingContextRequestOp::WithPrivacy => RoutingContextResponseOp::WithPrivacy {
|
||||||
|
result: to_json_api_result(
|
||||||
|
routing_context
|
||||||
|
.clone()
|
||||||
|
.with_privacy()
|
||||||
|
.map(|new_rc| self.add_routing_context(new_rc)),
|
||||||
|
),
|
||||||
|
},
|
||||||
|
RoutingContextRequestOp::WithCustomPrivacy { stability } => {
|
||||||
|
RoutingContextResponseOp::WithCustomPrivacy {
|
||||||
|
result: to_json_api_result(
|
||||||
|
routing_context
|
||||||
|
.clone()
|
||||||
|
.with_custom_privacy(stability)
|
||||||
|
.map(|new_rc| self.add_routing_context(new_rc)),
|
||||||
|
),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
RoutingContextRequestOp::WithSequencing { sequencing } => {
|
||||||
|
RoutingContextResponseOp::WithSequencing {
|
||||||
|
value: self
|
||||||
|
.add_routing_context(routing_context.clone().with_sequencing(sequencing)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
RoutingContextRequestOp::AppCall { target, request } => {
|
||||||
|
RoutingContextResponseOp::AppCall {
|
||||||
|
result: to_json_api_result_with_vec_u8(
|
||||||
|
self.parse_target(target)
|
||||||
|
.then(|tr| async { routing_context.app_call(tr?, request).await })
|
||||||
|
.await,
|
||||||
|
),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
RoutingContextRequestOp::AppMessage { target, message } => {
|
||||||
|
RoutingContextResponseOp::AppMessage {
|
||||||
|
result: to_json_api_result(
|
||||||
|
self.parse_target(target)
|
||||||
|
.then(|tr| async { routing_context.app_message(tr?, message).await })
|
||||||
|
.await,
|
||||||
|
),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
RoutingContextRequestOp::CreateDhtRecord { kind, schema } => {
|
||||||
|
RoutingContextResponseOp::CreateDhtRecord {
|
||||||
|
result: to_json_api_result(
|
||||||
|
routing_context.create_dht_record(kind, schema).await,
|
||||||
|
),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
RoutingContextRequestOp::OpenDhtRecord { key, writer } => {
|
||||||
|
RoutingContextResponseOp::OpenDhtRecord {
|
||||||
|
result: to_json_api_result(routing_context.open_dht_record(key, writer).await),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
RoutingContextRequestOp::CloseDhtRecord { key } => {
|
||||||
|
RoutingContextResponseOp::CloseDhtRecord {
|
||||||
|
result: to_json_api_result(routing_context.close_dht_record(key).await),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
RoutingContextRequestOp::DeleteDhtRecord { key } => {
|
||||||
|
RoutingContextResponseOp::DeleteDhtRecord {
|
||||||
|
result: to_json_api_result(routing_context.delete_dht_record(key).await),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
RoutingContextRequestOp::GetDhtValue {
|
||||||
|
key,
|
||||||
|
subkey,
|
||||||
|
force_refresh,
|
||||||
|
} => RoutingContextResponseOp::GetDhtValue {
|
||||||
|
result: to_json_api_result(
|
||||||
|
routing_context
|
||||||
|
.get_dht_value(key, subkey, force_refresh)
|
||||||
|
.await,
|
||||||
|
),
|
||||||
|
},
|
||||||
|
RoutingContextRequestOp::SetDhtValue { key, subkey, data } => {
|
||||||
|
RoutingContextResponseOp::SetDhtValue {
|
||||||
|
result: to_json_api_result(
|
||||||
|
routing_context.set_dht_value(key, subkey, data).await,
|
||||||
|
),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
RoutingContextRequestOp::WatchDhtValues {
|
||||||
|
key,
|
||||||
|
subkeys,
|
||||||
|
expiration,
|
||||||
|
count,
|
||||||
|
} => RoutingContextResponseOp::WatchDhtValues {
|
||||||
|
result: to_json_api_result(
|
||||||
|
routing_context
|
||||||
|
.watch_dht_values(key, subkeys, expiration, count)
|
||||||
|
.await,
|
||||||
|
),
|
||||||
|
},
|
||||||
|
RoutingContextRequestOp::CancelDhtWatch { key, subkeys } => {
|
||||||
|
RoutingContextResponseOp::CancelDhtWatch {
|
||||||
|
result: to_json_api_result(
|
||||||
|
routing_context.cancel_dht_watch(key, subkeys).await,
|
||||||
|
),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
RoutingContextResponse {
|
||||||
|
rc_id: rcr.rc_id,
|
||||||
|
rc_op,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn process_table_db_request(
|
||||||
|
&self,
|
||||||
|
table_db: TableDB,
|
||||||
|
tdr: TableDbRequest,
|
||||||
|
) -> TableDbResponse {
|
||||||
|
let db_op = match tdr.db_op {
|
||||||
|
TableDbRequestOp::Release => {
|
||||||
|
self.release_table_db(tdr.db_id);
|
||||||
|
TableDbResponseOp::Release {}
|
||||||
|
}
|
||||||
|
TableDbRequestOp::GetColumnCount => TableDbResponseOp::GetColumnCount {
|
||||||
|
result: to_json_api_result(table_db.get_column_count()),
|
||||||
|
},
|
||||||
|
TableDbRequestOp::GetKeys { col } => TableDbResponseOp::GetKeys {
|
||||||
|
result: to_json_api_result_with_vec_vec_u8(table_db.get_keys(col).await),
|
||||||
|
},
|
||||||
|
TableDbRequestOp::Transact => TableDbResponseOp::Transact {
|
||||||
|
value: self.add_table_db_transaction(table_db.transact()),
|
||||||
|
},
|
||||||
|
TableDbRequestOp::Store { col, key, value } => TableDbResponseOp::Store {
|
||||||
|
result: to_json_api_result(table_db.store(col, &key, &value).await),
|
||||||
|
},
|
||||||
|
TableDbRequestOp::Load { col, key } => TableDbResponseOp::Load {
|
||||||
|
result: to_json_api_result(
|
||||||
|
table_db
|
||||||
|
.load(col, &key)
|
||||||
|
.await
|
||||||
|
.map(|vopt| vopt.map(|v| VecU8 { value: v })),
|
||||||
|
),
|
||||||
|
},
|
||||||
|
TableDbRequestOp::Delete { col, key } => TableDbResponseOp::Delete {
|
||||||
|
result: to_json_api_result(
|
||||||
|
table_db
|
||||||
|
.delete(col, &key)
|
||||||
|
.await
|
||||||
|
.map(|vopt| vopt.map(|v| VecU8 { value: v })),
|
||||||
|
),
|
||||||
|
},
|
||||||
|
};
|
||||||
|
TableDbResponse {
|
||||||
|
db_id: tdr.db_id,
|
||||||
|
db_op,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn process_table_db_transaction_request(
|
||||||
|
&self,
|
||||||
|
table_db_transaction: TableDBTransaction,
|
||||||
|
tdtr: TableDbTransactionRequest,
|
||||||
|
) -> TableDbTransactionResponse {
|
||||||
|
let tx_op = match tdtr.tx_op {
|
||||||
|
TableDbTransactionRequestOp::Commit => TableDbTransactionResponseOp::Commit {
|
||||||
|
result: to_json_api_result(table_db_transaction.commit().await.map(|_| {
|
||||||
|
self.release_table_db_transaction(tdtr.tx_id);
|
||||||
|
})),
|
||||||
|
},
|
||||||
|
TableDbTransactionRequestOp::Rollback => {
|
||||||
|
table_db_transaction.rollback();
|
||||||
|
self.release_table_db_transaction(tdtr.tx_id);
|
||||||
|
TableDbTransactionResponseOp::Rollback {}
|
||||||
|
}
|
||||||
|
TableDbTransactionRequestOp::Store { col, key, value } => {
|
||||||
|
table_db_transaction.store(col, &key, &value);
|
||||||
|
TableDbTransactionResponseOp::Store {}
|
||||||
|
}
|
||||||
|
TableDbTransactionRequestOp::Delete { col, key } => {
|
||||||
|
table_db_transaction.delete(col, &key);
|
||||||
|
TableDbTransactionResponseOp::Delete {}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
TableDbTransactionResponse {
|
||||||
|
tx_id: tdtr.tx_id,
|
||||||
|
tx_op,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub async fn process_request(&self, request: Request) -> Response {
|
||||||
|
let id = request.id;
|
||||||
|
|
||||||
|
let op = match request.op {
|
||||||
|
RequestOp::GetState => ResponseOp::GetState {
|
||||||
|
result: to_json_api_result(self.api.get_state().await),
|
||||||
|
},
|
||||||
|
RequestOp::Attach => ResponseOp::Attach {
|
||||||
|
result: to_json_api_result(self.api.attach().await),
|
||||||
|
},
|
||||||
|
RequestOp::Detach => ResponseOp::Detach {
|
||||||
|
result: to_json_api_result(self.api.detach().await),
|
||||||
|
},
|
||||||
|
RequestOp::NewPrivateRoute => ResponseOp::NewPrivateRoute {
|
||||||
|
result: to_json_api_result(self.api.new_private_route().await.map(|r| {
|
||||||
|
NewPrivateRouteResult {
|
||||||
|
route_id: r.0,
|
||||||
|
blob: r.1,
|
||||||
|
}
|
||||||
|
})),
|
||||||
|
},
|
||||||
|
RequestOp::NewCustomPrivateRoute {
|
||||||
|
kinds,
|
||||||
|
stability,
|
||||||
|
sequencing,
|
||||||
|
} => ResponseOp::NewCustomPrivateRoute {
|
||||||
|
result: to_json_api_result(
|
||||||
|
self.api
|
||||||
|
.new_custom_private_route(&kinds, stability, sequencing)
|
||||||
|
.await
|
||||||
|
.map(|r| NewPrivateRouteResult {
|
||||||
|
route_id: r.0,
|
||||||
|
blob: r.1,
|
||||||
|
}),
|
||||||
|
),
|
||||||
|
},
|
||||||
|
RequestOp::ImportRemotePrivateRoute { blob } => ResponseOp::ImportRemotePrivateRoute {
|
||||||
|
result: to_json_api_result_with_string(self.api.import_remote_private_route(blob)),
|
||||||
|
},
|
||||||
|
RequestOp::ReleasePrivateRoute { route_id } => ResponseOp::ReleasePrivateRoute {
|
||||||
|
result: to_json_api_result(self.api.release_private_route(route_id)),
|
||||||
|
},
|
||||||
|
RequestOp::AppCallReply { call_id, message } => ResponseOp::AppCallReply {
|
||||||
|
result: to_json_api_result(self.api.app_call_reply(call_id, message).await),
|
||||||
|
},
|
||||||
|
RequestOp::NewRoutingContext => ResponseOp::NewRoutingContext {
|
||||||
|
value: self.add_routing_context(self.api.routing_context()),
|
||||||
|
},
|
||||||
|
RequestOp::RoutingContext(rcr) => {
|
||||||
|
let routing_context = match self.lookup_routing_context(id, rcr.rc_id) {
|
||||||
|
Ok(v) => v,
|
||||||
|
Err(e) => return e,
|
||||||
|
};
|
||||||
|
ResponseOp::RoutingContext(
|
||||||
|
self.process_routing_context_request(routing_context, rcr)
|
||||||
|
.await,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
RequestOp::OpenTableDb { name, column_count } => {
|
||||||
|
let table_store = match self.api.table_store() {
|
||||||
|
Ok(v) => v,
|
||||||
|
Err(e) => {
|
||||||
|
return Response {
|
||||||
|
id,
|
||||||
|
op: ResponseOp::OpenTableDb {
|
||||||
|
result: to_json_api_result(Err(e)),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
ResponseOp::OpenTableDb {
|
||||||
|
result: to_json_api_result(
|
||||||
|
table_store
|
||||||
|
.open(&name, column_count)
|
||||||
|
.await
|
||||||
|
.map(|table_db| self.add_table_db(table_db)),
|
||||||
|
),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
RequestOp::DeleteTableDb { name } => {
|
||||||
|
let table_store = match self.api.table_store() {
|
||||||
|
Ok(v) => v,
|
||||||
|
Err(e) => {
|
||||||
|
return Response {
|
||||||
|
id,
|
||||||
|
op: ResponseOp::OpenTableDb {
|
||||||
|
result: to_json_api_result(Err(e)),
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
ResponseOp::DeleteTableDb {
|
||||||
|
result: to_json_api_result(table_store.delete(&name).await),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
RequestOp::TableDb(tdr) => {
|
||||||
|
let table_db = match self.lookup_table_db(id, tdr.db_id) {
|
||||||
|
Ok(v) => v,
|
||||||
|
Err(e) => return e,
|
||||||
|
};
|
||||||
|
ResponseOp::TableDb(self.process_table_db_request(table_db, tdr).await)
|
||||||
|
}
|
||||||
|
RequestOp::TableDbTransaction(tdtr) => {
|
||||||
|
let table_db_transaction = match self.lookup_table_db_transaction(id, tdtr.tx_id) {
|
||||||
|
Ok(v) => v,
|
||||||
|
Err(e) => return e,
|
||||||
|
};
|
||||||
|
ResponseOp::TableDbTransaction(
|
||||||
|
self.process_table_db_transaction_request(table_db_transaction, tdtr)
|
||||||
|
.await,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
RequestOp::GetCryptoSystem { kind } => todo!(),
|
||||||
|
RequestOp::BestCryptoSystem => todo!(),
|
||||||
|
RequestOp::CryptoSystem(_) => todo!(),
|
||||||
|
RequestOp::VerifySignatures {
|
||||||
|
node_ids,
|
||||||
|
data,
|
||||||
|
signatures,
|
||||||
|
} => todo!(),
|
||||||
|
RequestOp::GenerateSignatures { data, key_pairs } => todo!(),
|
||||||
|
RequestOp::GenerateKeyPair { kind } => todo!(),
|
||||||
|
RequestOp::Now => todo!(),
|
||||||
|
RequestOp::Debug { command } => todo!(),
|
||||||
|
RequestOp::VeilidVersionString => todo!(),
|
||||||
|
RequestOp::VeilidVersion => todo!(),
|
||||||
|
};
|
||||||
|
|
||||||
|
Response { id, op }
|
||||||
|
}
|
||||||
|
}
|
@ -2,16 +2,16 @@ use super::*;
|
|||||||
|
|
||||||
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
|
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
|
||||||
pub struct RoutingContextRequest {
|
pub struct RoutingContextRequest {
|
||||||
rc_id: String,
|
pub rc_id: u32,
|
||||||
#[serde(flatten)]
|
#[serde(flatten)]
|
||||||
rc_op: RoutingContextRequestOp,
|
pub rc_op: RoutingContextRequestOp,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
|
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
|
||||||
pub struct RoutingContextResponse {
|
pub struct RoutingContextResponse {
|
||||||
rc_id: String,
|
pub rc_id: u32,
|
||||||
#[serde(flatten)]
|
#[serde(flatten)]
|
||||||
rc_op: RoutingContextResponseOp,
|
pub rc_op: RoutingContextResponseOp,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
|
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
|
||||||
@ -86,15 +86,18 @@ pub enum RoutingContextRequestOp {
|
|||||||
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
|
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
|
||||||
#[serde(tag = "rc_op")]
|
#[serde(tag = "rc_op")]
|
||||||
pub enum RoutingContextResponseOp {
|
pub enum RoutingContextResponseOp {
|
||||||
|
InvalidId,
|
||||||
Release,
|
Release,
|
||||||
WithPrivacy {
|
WithPrivacy {
|
||||||
value: String,
|
#[serde(flatten)]
|
||||||
|
result: ApiResult<u32>,
|
||||||
},
|
},
|
||||||
WithCustomPrivacy {
|
WithCustomPrivacy {
|
||||||
value: String,
|
#[serde(flatten)]
|
||||||
|
result: ApiResult<u32>,
|
||||||
},
|
},
|
||||||
WithSequencing {
|
WithSequencing {
|
||||||
value: String,
|
value: u32,
|
||||||
},
|
},
|
||||||
AppCall {
|
AppCall {
|
||||||
#[serde(flatten)]
|
#[serde(flatten)]
|
||||||
|
@ -2,16 +2,16 @@ use super::*;
|
|||||||
|
|
||||||
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
|
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
|
||||||
pub struct TableDbRequest {
|
pub struct TableDbRequest {
|
||||||
db_id: String,
|
pub db_id: u32,
|
||||||
#[serde(flatten)]
|
#[serde(flatten)]
|
||||||
db_op: TableDbRequestOp,
|
pub db_op: TableDbRequestOp,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
|
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
|
||||||
pub struct TableDbResponse {
|
pub struct TableDbResponse {
|
||||||
db_id: String,
|
pub db_id: u32,
|
||||||
#[serde(flatten)]
|
#[serde(flatten)]
|
||||||
db_op: TableDbResponseOp,
|
pub db_op: TableDbResponseOp,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
|
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
|
||||||
@ -20,11 +20,11 @@ pub enum TableDbRequestOp {
|
|||||||
Release,
|
Release,
|
||||||
GetColumnCount,
|
GetColumnCount,
|
||||||
GetKeys {
|
GetKeys {
|
||||||
col: i32,
|
col: u32,
|
||||||
},
|
},
|
||||||
Transact,
|
Transact,
|
||||||
Store {
|
Store {
|
||||||
col: i32,
|
col: u32,
|
||||||
#[serde(with = "json_as_base64")]
|
#[serde(with = "json_as_base64")]
|
||||||
#[schemars(with = "String")]
|
#[schemars(with = "String")]
|
||||||
key: Vec<u8>,
|
key: Vec<u8>,
|
||||||
@ -33,13 +33,13 @@ pub enum TableDbRequestOp {
|
|||||||
value: Vec<u8>,
|
value: Vec<u8>,
|
||||||
},
|
},
|
||||||
Load {
|
Load {
|
||||||
col: i32,
|
col: u32,
|
||||||
#[serde(with = "json_as_base64")]
|
#[serde(with = "json_as_base64")]
|
||||||
#[schemars(with = "String")]
|
#[schemars(with = "String")]
|
||||||
key: Vec<u8>,
|
key: Vec<u8>,
|
||||||
},
|
},
|
||||||
Delete {
|
Delete {
|
||||||
col: i32,
|
col: u32,
|
||||||
#[serde(with = "json_as_base64")]
|
#[serde(with = "json_as_base64")]
|
||||||
#[schemars(with = "String")]
|
#[schemars(with = "String")]
|
||||||
key: Vec<u8>,
|
key: Vec<u8>,
|
||||||
@ -48,9 +48,11 @@ pub enum TableDbRequestOp {
|
|||||||
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
|
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
|
||||||
#[serde(tag = "db_op")]
|
#[serde(tag = "db_op")]
|
||||||
pub enum TableDbResponseOp {
|
pub enum TableDbResponseOp {
|
||||||
|
InvalidId,
|
||||||
Release,
|
Release,
|
||||||
GetColumnCount {
|
GetColumnCount {
|
||||||
value: i32,
|
#[serde(flatten)]
|
||||||
|
result: ApiResult<u32>,
|
||||||
},
|
},
|
||||||
GetKeys {
|
GetKeys {
|
||||||
#[serde(flatten)]
|
#[serde(flatten)]
|
||||||
@ -58,7 +60,7 @@ pub enum TableDbResponseOp {
|
|||||||
result: ApiResultWithVecVecU8,
|
result: ApiResultWithVecVecU8,
|
||||||
},
|
},
|
||||||
Transact {
|
Transact {
|
||||||
value: String,
|
value: u32,
|
||||||
},
|
},
|
||||||
Store {
|
Store {
|
||||||
#[serde(flatten)]
|
#[serde(flatten)]
|
||||||
@ -80,16 +82,16 @@ pub enum TableDbResponseOp {
|
|||||||
|
|
||||||
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
|
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
|
||||||
pub struct TableDbTransactionRequest {
|
pub struct TableDbTransactionRequest {
|
||||||
tx_id: String,
|
pub tx_id: u32,
|
||||||
#[serde(flatten)]
|
#[serde(flatten)]
|
||||||
tx_op: TableDbTransactionRequestOp,
|
pub tx_op: TableDbTransactionRequestOp,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
|
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
|
||||||
pub struct TableDbTransactionResponse {
|
pub struct TableDbTransactionResponse {
|
||||||
tx_id: String,
|
pub tx_id: u32,
|
||||||
#[serde(flatten)]
|
#[serde(flatten)]
|
||||||
tx_op: TableDbTransactionResponseOp,
|
pub tx_op: TableDbTransactionResponseOp,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
|
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
|
||||||
@ -98,7 +100,7 @@ pub enum TableDbTransactionRequestOp {
|
|||||||
Commit,
|
Commit,
|
||||||
Rollback,
|
Rollback,
|
||||||
Store {
|
Store {
|
||||||
col: i32,
|
col: u32,
|
||||||
#[serde(with = "json_as_base64")]
|
#[serde(with = "json_as_base64")]
|
||||||
#[schemars(with = "String")]
|
#[schemars(with = "String")]
|
||||||
key: Vec<u8>,
|
key: Vec<u8>,
|
||||||
@ -107,7 +109,7 @@ pub enum TableDbTransactionRequestOp {
|
|||||||
value: Vec<u8>,
|
value: Vec<u8>,
|
||||||
},
|
},
|
||||||
Delete {
|
Delete {
|
||||||
col: i32,
|
col: u32,
|
||||||
#[serde(with = "json_as_base64")]
|
#[serde(with = "json_as_base64")]
|
||||||
#[schemars(with = "String")]
|
#[schemars(with = "String")]
|
||||||
key: Vec<u8>,
|
key: Vec<u8>,
|
||||||
@ -116,20 +118,12 @@ pub enum TableDbTransactionRequestOp {
|
|||||||
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
|
#[derive(Debug, Clone, Serialize, Deserialize, JsonSchema)]
|
||||||
#[serde(tag = "tx_op")]
|
#[serde(tag = "tx_op")]
|
||||||
pub enum TableDbTransactionResponseOp {
|
pub enum TableDbTransactionResponseOp {
|
||||||
|
InvalidId,
|
||||||
Commit {
|
Commit {
|
||||||
#[serde(flatten)]
|
#[serde(flatten)]
|
||||||
result: ApiResult<()>,
|
result: ApiResult<()>,
|
||||||
},
|
},
|
||||||
Rollback {
|
Rollback {},
|
||||||
#[serde(flatten)]
|
Store {},
|
||||||
result: ApiResult<()>,
|
Delete {},
|
||||||
},
|
|
||||||
Store {
|
|
||||||
#[serde(flatten)]
|
|
||||||
result: ApiResult<()>,
|
|
||||||
},
|
|
||||||
Delete {
|
|
||||||
#[serde(flatten)]
|
|
||||||
result: ApiResult<()>,
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
|
@ -3,17 +3,16 @@
|
|||||||
mod api;
|
mod api;
|
||||||
mod debug;
|
mod debug;
|
||||||
mod error;
|
mod error;
|
||||||
mod json_api;
|
|
||||||
mod routing_context;
|
mod routing_context;
|
||||||
mod serialize_helpers;
|
mod serialize_helpers;
|
||||||
mod types;
|
mod types;
|
||||||
|
|
||||||
|
pub mod json_api;
|
||||||
pub mod tests;
|
pub mod tests;
|
||||||
|
|
||||||
pub use api::*;
|
pub use api::*;
|
||||||
pub use debug::*;
|
pub use debug::*;
|
||||||
pub use error::*;
|
pub use error::*;
|
||||||
pub use json_api::*;
|
|
||||||
pub use routing_context::*;
|
pub use routing_context::*;
|
||||||
pub use serialize_helpers::*;
|
pub use serialize_helpers::*;
|
||||||
pub use types::*;
|
pub use types::*;
|
||||||
|
Loading…
Reference in New Issue
Block a user