mirror of
https://github.com/mountain-loop/yaak.git
synced 2026-04-21 00:01:22 +02:00
Better message serialization
This commit is contained in:
12
src-tauri/.sqlx/query-fe0652396bc30d926cf99083651c1cbd668bcf00ebe1a5f36616700c84972b39.json
generated
Normal file
12
src-tauri/.sqlx/query-fe0652396bc30d926cf99083651c1cbd668bcf00ebe1a5f36616700c84972b39.json
generated
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"db_name": "SQLite",
|
||||||
|
"query": "\n DELETE FROM grpc_requests\n WHERE id = ?\n ",
|
||||||
|
"describe": {
|
||||||
|
"columns": [],
|
||||||
|
"parameters": {
|
||||||
|
"Right": 1
|
||||||
|
},
|
||||||
|
"nullable": []
|
||||||
|
},
|
||||||
|
"hash": "fe0652396bc30d926cf99083651c1cbd668bcf00ebe1a5f36616700c84972b39"
|
||||||
|
}
|
||||||
@@ -143,12 +143,14 @@ pub fn message_to_json_schema(
|
|||||||
|
|
||||||
schema.properties = Some(properties);
|
schema.properties = Some(properties);
|
||||||
|
|
||||||
schema.required = Some(
|
// All proto 3 fields are optional, so maybe we could
|
||||||
message
|
// make this a setting?
|
||||||
.fields()
|
// schema.required = Some(
|
||||||
.map(|f| f.name().to_string())
|
// message
|
||||||
.collect::<Vec<_>>(),
|
// .fields()
|
||||||
);
|
// .map(|f| f.name().to_string())
|
||||||
|
// .collect::<Vec<_>>(),
|
||||||
|
// );
|
||||||
|
|
||||||
schema
|
schema
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
use prost_reflect::SerializeOptions;
|
use prost_reflect::{DynamicMessage, SerializeOptions};
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
mod codec;
|
mod codec;
|
||||||
@@ -25,3 +25,16 @@ pub struct MethodDefinition {
|
|||||||
pub client_streaming: bool,
|
pub client_streaming: bool,
|
||||||
pub server_streaming: bool,
|
pub server_streaming: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static SERIALIZE_OPTIONS: &'static SerializeOptions = &SerializeOptions::new()
|
||||||
|
.skip_default_fields(false)
|
||||||
|
.stringify_64_bit_integers(false);
|
||||||
|
|
||||||
|
pub fn serialize_message(msg: &DynamicMessage) -> Result<String, String> {
|
||||||
|
let mut buf = Vec::new();
|
||||||
|
let mut se = serde_json::Serializer::pretty(&mut buf);
|
||||||
|
msg.serialize_with_options(&mut se, SERIALIZE_OPTIONS)
|
||||||
|
.map_err(|e| e.to_string())?;
|
||||||
|
let s = String::from_utf8(buf).expect("serde_json to emit valid utf8");
|
||||||
|
Ok(s)
|
||||||
|
}
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ impl GrpcConnection {
|
|||||||
service: &str,
|
service: &str,
|
||||||
method: &str,
|
method: &str,
|
||||||
message: &str,
|
message: &str,
|
||||||
) -> Result<String, String> {
|
) -> Result<DynamicMessage, String> {
|
||||||
let service = self.pool.get_service_by_name(service).unwrap();
|
let service = self.pool.get_service_by_name(service).unwrap();
|
||||||
let method = &service.methods().find(|m| m.name() == method).unwrap();
|
let method = &service.methods().find(|m| m.name() == method).unwrap();
|
||||||
let input_message = method.input();
|
let input_message = method.input();
|
||||||
@@ -47,11 +47,11 @@ impl GrpcConnection {
|
|||||||
let codec = DynamicCodec::new(method.clone());
|
let codec = DynamicCodec::new(method.clone());
|
||||||
client.ready().await.unwrap();
|
client.ready().await.unwrap();
|
||||||
|
|
||||||
let resp = client.unary(req, path, codec).await.unwrap();
|
Ok(client
|
||||||
let msg = resp.into_inner();
|
.unary(req, path, codec)
|
||||||
let response_json = serde_json::to_string_pretty(&msg).expect("json to string");
|
.await
|
||||||
|
.map_err(|e| e.to_string())?
|
||||||
Ok(response_json)
|
.into_inner())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub async fn streaming(
|
pub async fn streaming(
|
||||||
|
|||||||
@@ -45,6 +45,7 @@ pub async fn fill_pool_from_files(paths: Vec<PathBuf>) -> Result<DescriptorPool,
|
|||||||
let parent = p.as_path().parent();
|
let parent = p.as_path().parent();
|
||||||
if let Some(parent_path) = parent {
|
if let Some(parent_path) = parent {
|
||||||
cmd.arg("-I").arg(parent_path);
|
cmd.arg("-I").arg(parent_path);
|
||||||
|
cmd.arg("-I").arg(parent_path.parent().unwrap());
|
||||||
} else {
|
} else {
|
||||||
debug!("ignoring {:?} since it does not exist.", parent)
|
debug!("ignoring {:?} since it does not exist.", parent)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,7 +36,7 @@ use tokio::time::sleep;
|
|||||||
use window_shadows::set_shadow;
|
use window_shadows::set_shadow;
|
||||||
|
|
||||||
use grpc::manager::GrpcHandle;
|
use grpc::manager::GrpcHandle;
|
||||||
use grpc::ServiceDefinition;
|
use grpc::{serialize_message, ServiceDefinition};
|
||||||
use window_ext::TrafficLightWindowExt;
|
use window_ext::TrafficLightWindowExt;
|
||||||
|
|
||||||
use crate::analytics::{AnalyticsAction, AnalyticsResource};
|
use crate::analytics::{AnalyticsAction, AnalyticsResource};
|
||||||
@@ -193,7 +193,7 @@ async fn cmd_grpc_call_unary(
|
|||||||
upsert_grpc_message(
|
upsert_grpc_message(
|
||||||
&app_handle,
|
&app_handle,
|
||||||
&GrpcMessage {
|
&GrpcMessage {
|
||||||
message: msg,
|
message: serialize_message(&msg)?,
|
||||||
workspace_id: req.workspace_id,
|
workspace_id: req.workspace_id,
|
||||||
request_id: req.id,
|
request_id: req.id,
|
||||||
connection_id: conn.clone().id,
|
connection_id: conn.clone().id,
|
||||||
@@ -365,7 +365,7 @@ async fn cmd_grpc_client_streaming(
|
|||||||
.client_streaming(&service, &method, in_msg_stream)
|
.client_streaming(&service, &method, in_msg_stream)
|
||||||
.await
|
.await
|
||||||
.unwrap();
|
.unwrap();
|
||||||
let message = serde_json::to_string(&msg).unwrap();
|
let message = serialize_message(&msg).unwrap();
|
||||||
upsert_grpc_message(
|
upsert_grpc_message(
|
||||||
&app_handle,
|
&app_handle,
|
||||||
&GrpcMessage {
|
&GrpcMessage {
|
||||||
@@ -576,7 +576,7 @@ async fn cmd_grpc_streaming(
|
|||||||
loop {
|
loop {
|
||||||
match stream.next().await {
|
match stream.next().await {
|
||||||
Some(Ok(item)) => {
|
Some(Ok(item)) => {
|
||||||
let item = serde_json::to_string_pretty(&item).unwrap();
|
let item = serialize_message(&item).unwrap();
|
||||||
let req = req.clone();
|
let req = req.clone();
|
||||||
let conn = conn.clone();
|
let conn = conn.clone();
|
||||||
upsert_grpc_message(
|
upsert_grpc_message(
|
||||||
@@ -591,7 +591,6 @@ async fn cmd_grpc_streaming(
|
|||||||
},
|
},
|
||||||
)
|
)
|
||||||
.await
|
.await
|
||||||
.map_err(|e| e.to_string())
|
|
||||||
.unwrap();
|
.unwrap();
|
||||||
}
|
}
|
||||||
Some(Err(e)) => {
|
Some(Err(e)) => {
|
||||||
@@ -727,7 +726,7 @@ async fn cmd_grpc_server_streaming(
|
|||||||
.await?
|
.await?
|
||||||
.server_streaming(&service, &method, &req.message)
|
.server_streaming(&service, &method, &req.message)
|
||||||
.await
|
.await
|
||||||
.unwrap();
|
.expect("FAILED");
|
||||||
|
|
||||||
#[derive(serde::Deserialize)]
|
#[derive(serde::Deserialize)]
|
||||||
enum IncomingMsg {
|
enum IncomingMsg {
|
||||||
@@ -768,7 +767,7 @@ async fn cmd_grpc_server_streaming(
|
|||||||
let app_handle = app_handle.clone();
|
let app_handle = app_handle.clone();
|
||||||
match stream.next().await {
|
match stream.next().await {
|
||||||
Some(Ok(item)) => {
|
Some(Ok(item)) => {
|
||||||
let item = serde_json::to_string_pretty(&item).unwrap();
|
let item = serialize_message(&item).unwrap();
|
||||||
upsert_grpc_message(
|
upsert_grpc_message(
|
||||||
&app_handle,
|
&app_handle,
|
||||||
&GrpcMessage {
|
&GrpcMessage {
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ interface Props {
|
|||||||
export const JsonAttributeTree = ({ depth = 0, attrKey, attrValue, attrKeyJsonPath }: Props) => {
|
export const JsonAttributeTree = ({ depth = 0, attrKey, attrValue, attrKeyJsonPath }: Props) => {
|
||||||
attrKeyJsonPath = attrKeyJsonPath ?? `${attrKey}`;
|
attrKeyJsonPath = attrKeyJsonPath ?? `${attrKey}`;
|
||||||
|
|
||||||
const [isExpanded, setIsExpanded] = useState(depth === 0);
|
const [isExpanded, setIsExpanded] = useState(true);
|
||||||
const toggleExpanded = () => setIsExpanded((v) => !v);
|
const toggleExpanded = () => setIsExpanded((v) => !v);
|
||||||
|
|
||||||
const { isExpandable, children, label, labelClassName } = useMemo<{
|
const { isExpandable, children, label, labelClassName } = useMemo<{
|
||||||
@@ -78,7 +78,7 @@ export const JsonAttributeTree = ({ depth = 0, attrKey, attrValue, attrKeyJsonPa
|
|||||||
</span>
|
</span>
|
||||||
);
|
);
|
||||||
return (
|
return (
|
||||||
<div className={classNames(/*depth === 0 && '-ml-4',*/ 'font-mono text-xs')}>
|
<div className={classNames(/*depth === 0 && '-ml-4',*/ 'font-mono text-2xs')}>
|
||||||
<div className="flex items-center">
|
<div className="flex items-center">
|
||||||
{isExpandable ? (
|
{isExpandable ? (
|
||||||
<button className="group relative flex items-center pl-4 w-full" onClick={toggleExpanded}>
|
<button className="group relative flex items-center pl-4 w-full" onClick={toggleExpanded}>
|
||||||
|
|||||||
Reference in New Issue
Block a user