mirror of
https://github.com/Youzini-afk/ST-Bionic-Memory-Ecology.git
synced 2026-05-15 14:20:35 +08:00
perf: add native hydrate wasm path
This commit is contained in:
@@ -22,6 +22,25 @@ struct LayoutNode {
|
||||
region_rect: RegionRect,
|
||||
}
|
||||
|
||||
fn solve_hydrate_records_in_rust(payload: HydrateRecordsPayload) -> HydrateRecordsResult {
|
||||
let nodes = clone_hydrate_records(payload.nodes);
|
||||
let edges = clone_hydrate_records(payload.edges);
|
||||
let node_count = nodes.len();
|
||||
let edge_count = edges.len();
|
||||
HydrateRecordsResult {
|
||||
ok: true,
|
||||
used_native: true,
|
||||
nodes,
|
||||
edges,
|
||||
diagnostics: HydrateRecordsDiagnostics {
|
||||
solver: "rust-wasm".to_string(),
|
||||
node_count,
|
||||
edge_count,
|
||||
records_normalized: payload.records_normalized,
|
||||
},
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Deserialize)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
struct LayoutEdge {
|
||||
@@ -224,6 +243,36 @@ struct PersistDeltaIdResult {
|
||||
upsert_tombstone_ids: Vec<String>,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Deserialize, Default)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
struct HydrateRecordsPayload {
|
||||
#[serde(default)]
|
||||
nodes: Vec<JsonValue>,
|
||||
#[serde(default)]
|
||||
edges: Vec<JsonValue>,
|
||||
#[serde(default)]
|
||||
records_normalized: bool,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Serialize)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
struct HydrateRecordsDiagnostics {
|
||||
solver: String,
|
||||
node_count: usize,
|
||||
edge_count: usize,
|
||||
records_normalized: bool,
|
||||
}
|
||||
|
||||
#[derive(Debug, Clone, Serialize)]
|
||||
#[serde(rename_all = "camelCase")]
|
||||
struct HydrateRecordsResult {
|
||||
ok: bool,
|
||||
used_native: bool,
|
||||
nodes: Vec<JsonValue>,
|
||||
edges: Vec<JsonValue>,
|
||||
diagnostics: HydrateRecordsDiagnostics,
|
||||
}
|
||||
|
||||
fn default_iterations() -> u32 {
|
||||
80
|
||||
}
|
||||
@@ -299,6 +348,13 @@ fn sanitize_json_records(records: Vec<JsonValue>) -> Vec<JsonValue> {
|
||||
.collect()
|
||||
}
|
||||
|
||||
fn clone_hydrate_records(records: Vec<JsonValue>) -> Vec<JsonValue> {
|
||||
records
|
||||
.into_iter()
|
||||
.filter(|record| record.is_object())
|
||||
.collect()
|
||||
}
|
||||
|
||||
fn sanitize_persist_snapshot(snapshot: PersistSnapshot) -> PersistSnapshot {
|
||||
PersistSnapshot {
|
||||
meta: snapshot.meta,
|
||||
@@ -1018,3 +1074,12 @@ pub fn build_persist_delta_compact_hash(payload: JsValue) -> Result<JsValue, JsV
|
||||
JsValue::from_str(&format!("serialize hash compact persist result failed: {error}"))
|
||||
})
|
||||
}
|
||||
|
||||
#[wasm_bindgen]
|
||||
pub fn build_hydrate_records(payload: JsValue) -> Result<JsValue, JsValue> {
|
||||
let parsed: HydrateRecordsPayload = serde_wasm_bindgen::from_value(payload)
|
||||
.map_err(|error| JsValue::from_str(&format!("invalid hydrate payload: {error}")))?;
|
||||
let solved = solve_hydrate_records_in_rust(parsed);
|
||||
serde_wasm_bindgen::to_value(&solved)
|
||||
.map_err(|error| JsValue::from_str(&format!("serialize hydrate result failed: {error}")))
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user