From e095189dd6bca2c2afdb959a3d99f9549d1d296c Mon Sep 17 00:00:00 2001 From: stefan-gorules <127550877+stefan-gorules@users.noreply.github.com> Date: Mon, 28 Sep 2026 11:24:17 +0200 Subject: [PATCH] fix: return errors instead of panicking in memory loader and v1 functions (#524) * fix: return errors instead of panicking in memory loader and v1 functions - MemoryLoader recovers from a poisoned lock. Previously a panic during one add() (e.g. a failing content conversion) made every later add/get/remove/keys call panic for the rest of the process - v1 function node returns an error when its JS bootstrap fails instead of unwrapping. The 500ms interrupt budget starts before the runtime and bundled libraries load, so a slow or loaded host could interrupt the bootstrap and panic * chore: bump setup-android to v3 in uniffi workflow Only platform-tools is installed; Gradle fetches the platform and build tools the AAR build needs. --- .github/workflows/uniffi.yaml | 4 +++- core/engine/src/loader/memory.rs | 8 ++++---- core/engine/src/nodes/function/v1/script.rs | 4 ++-- 3 files changed, 9 insertions(+), 7 deletions(-) diff --git a/.github/workflows/uniffi.yaml b/.github/workflows/uniffi.yaml index 705e1fff..04284ae1 100644 --- a/.github/workflows/uniffi.yaml +++ b/.github/workflows/uniffi.yaml @@ -744,8 +744,10 @@ jobs: java-version: '17' - name: Setup Android SDK - uses: android-actions/setup-android@v2 + uses: android-actions/setup-android@v3 id: setup-android + with: + packages: 'platform-tools' - name: Download Kotlin bindings uses: actions/download-artifact@v4 diff --git a/core/engine/src/loader/memory.rs b/core/engine/src/loader/memory.rs index f66996ad..dfd92d57 100644 --- a/core/engine/src/loader/memory.rs +++ b/core/engine/src/loader/memory.rs @@ -17,7 +17,7 @@ impl MemoryLoader { K: Into, D: Into, { - let mut mref = self.memory_refs.write().unwrap(); + let mut mref = self.memory_refs.write().unwrap_or_else(|e| e.into_inner()); mref.insert(key.into(), Arc::new(content.into())); } @@ -25,7 +25,7 @@ impl MemoryLoader { where K: AsRef, { - let mref = self.memory_refs.read().unwrap(); + let mref = self.memory_refs.read().unwrap_or_else(|e| e.into_inner()); mref.get(key.as_ref()).map(|r| r.clone()) } @@ -33,7 +33,7 @@ impl MemoryLoader { where K: AsRef, { - let mut mref = self.memory_refs.write().unwrap(); + let mut mref = self.memory_refs.write().unwrap_or_else(|e| e.into_inner()); mref.remove(key.as_ref()).is_some() } } @@ -50,7 +50,7 @@ impl DecisionLoader for MemoryLoader { } fn keys(&self) -> Option>> { - let mref = self.memory_refs.read().unwrap(); + let mref = self.memory_refs.read().unwrap_or_else(|e| e.into_inner()); Some(mref.keys().map(|k| Arc::from(k.as_str())).collect()) } diff --git a/core/engine/src/nodes/function/v1/script.rs b/core/engine/src/nodes/function/v1/script.rs index 5fa4015d..6157cd14 100644 --- a/core/engine/src/nodes/function/v1/script.rs +++ b/core/engine/src/nodes/function/v1/script.rs @@ -38,9 +38,9 @@ impl Script { "main", "import 'internals'; globalThis.now = Date.now();", ) - .unwrap() + .map_err(|e| map_js_error(&ctx, e))? .finish::<()>() - .unwrap(); + .map_err(|e| map_js_error(&ctx, e))?; let _ = ctx .globals()