From 2c6861370985d5fdc5f483312668d3547c75ae76 Mon Sep 17 00:00:00 2001 From: Pekka Enberg Date: Fri, 22 Aug 2025 14:12:33 +0300 Subject: [PATCH] bindings/javascript: Fix blob type handling --- bindings/javascript/bind.ts | 6 +++++- bindings/javascript/src/lib.rs | 20 ++++++++++++++------ 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/bindings/javascript/bind.ts b/bindings/javascript/bind.ts index 5c05ce265..2484fe51e 100644 --- a/bindings/javascript/bind.ts +++ b/bindings/javascript/bind.ts @@ -18,6 +18,10 @@ export function bindParams(stmt, params) { bindNamedParams(stmt, param); return; } + if (Array.isArray(param)) { + bindPositionalParams(stmt, [param]); + return; + } bindValue(stmt, 1, param); return; } @@ -65,4 +69,4 @@ function bindPositionalParams(stmt, params) { function bindValue(stmt, index, value) { stmt.bindAt(index, value); -} \ No newline at end of file +} diff --git a/bindings/javascript/src/lib.rs b/bindings/javascript/src/lib.rs index 1c0218eeb..64590f000 100644 --- a/bindings/javascript/src/lib.rs +++ b/bindings/javascript/src/lib.rs @@ -289,7 +289,6 @@ impl Statement { let non_zero_idx = NonZeroUsize::new(index as usize).ok_or_else(|| { Error::new(Status::InvalidArg, "Parameter index must be greater than 0") })?; - let value_type = value.get_type()?; let turso_value = match value_type { ValueType::Null => turso_core::Value::Null, @@ -320,16 +319,22 @@ impl Statement { turso_core::Value::Integer(if b { 1 } else { 0 }) } ValueType::Object => { - // Try to cast as Buffer first, fallback to string conversion - if let Ok(buffer) = unsafe { value.cast::() } { - turso_core::Value::Blob(buffer.to_vec()) + let obj = value.coerce_to_object()?; + + if obj.is_buffer()? || obj.is_typedarray()? { + let length = obj.get_named_property::("length")?; + let mut bytes = Vec::with_capacity(length as usize); + for i in 0..length { + let byte = obj.get_element::(i)?; + bytes.push(byte as u8); + } + turso_core::Value::Blob(bytes) } else { let s = value.coerce_to_string()?.into_utf8()?; turso_core::Value::Text(s.as_str()?.to_owned().into()) } } _ => { - // Fallback to string conversion for unknown types let s = value.coerce_to_string()?.into_utf8()?; turso_core::Value::Text(s.as_str()?.to_owned().into()) } @@ -537,7 +542,10 @@ fn to_js_value<'a>( } turso_core::Value::Float(f) => ToNapiValue::into_unknown(*f, env), turso_core::Value::Text(s) => ToNapiValue::into_unknown(s.as_str(), env), - turso_core::Value::Blob(b) => ToNapiValue::into_unknown(b, env), + turso_core::Value::Blob(b) => { + let buffer = Buffer::from(b.as_slice()); + ToNapiValue::into_unknown(buffer, env) + } } }