From f8fab45de76395ccbade4b05d01ade80ed06ba3f Mon Sep 17 00:00:00 2001 From: LongYinan Date: Sat, 24 May 2025 23:18:40 +0800 Subject: [PATCH] feat(napi): serialize BigInt to serde::Value (#2659) --- .../src/bindgen_runtime/js_values/bigint.rs | 17 +++++++---- .../src/bindgen_runtime/js_values/serde.rs | 28 +++++++++++++++++- .../__tests__/__snapshots__/values.spec.ts.md | 2 ++ .../__snapshots__/values.spec.ts.snap | Bin 6562 -> 6578 bytes examples/napi/__tests__/values.spec.ts | 9 ++++++ examples/napi/example.wasi-browser.js | 1 + examples/napi/example.wasi.cjs | 1 + examples/napi/index.cjs | 1 + examples/napi/index.d.cts | 2 ++ examples/napi/src/serde.rs | 24 +++++++++++++++ 10 files changed, 79 insertions(+), 6 deletions(-) diff --git a/crates/napi/src/bindgen_runtime/js_values/bigint.rs b/crates/napi/src/bindgen_runtime/js_values/bigint.rs index 4daca7da..0d031649 100644 --- a/crates/napi/src/bindgen_runtime/js_values/bigint.rs +++ b/crates/napi/src/bindgen_runtime/js_values/bigint.rs @@ -169,15 +169,19 @@ pub(crate) unsafe fn u128_with_sign_to_napi_value( let mut raw_value = ptr::null_mut(); if cfg!(target_endian = "little") { let words = &val as *const u128 as *const u64; - check_status!(unsafe { - sys::napi_create_bigint_words(env, sign_bit, 2, words, &mut raw_value) - })?; + check_status!( + unsafe { sys::napi_create_bigint_words(env, sign_bit, 2, words, &mut raw_value) }, + "Failed to create BigInt from u128" + )?; return Ok(raw_value); } let arr: [u64; 2] = [val as _, (val >> 64) as _]; let words = &arr as *const u64; - check_status!(unsafe { sys::napi_create_bigint_words(env, sign_bit, 2, words, &mut raw_value) })?; + check_status!( + unsafe { sys::napi_create_bigint_words(env, sign_bit, 2, words, &mut raw_value) }, + "Failed to create BigInt from u128" + )?; Ok(raw_value) } @@ -242,7 +246,10 @@ impl ToNapiValue for &mut i64n { impl ToNapiValue for u64 { unsafe fn to_napi_value(env: sys::napi_env, val: Self) -> crate::Result { let mut raw_value = ptr::null_mut(); - check_status!(unsafe { sys::napi_create_bigint_uint64(env, val, &mut raw_value) })?; + check_status!( + unsafe { sys::napi_create_bigint_uint64(env, val, &mut raw_value) }, + "Failed to create BigInt from u64" + )?; Ok(raw_value) } } diff --git a/crates/napi/src/bindgen_runtime/js_values/serde.rs b/crates/napi/src/bindgen_runtime/js_values/serde.rs index d36e8e97..82e8456a 100644 --- a/crates/napi/src/bindgen_runtime/js_values/serde.rs +++ b/crates/napi/src/bindgen_runtime/js_values/serde.rs @@ -1,4 +1,5 @@ use std::marker::PhantomData; +use std::ptr; use serde_json::{Map, Number, Value}; @@ -51,7 +52,25 @@ impl FromNapiValue for Value { } } #[cfg(feature = "napi6")] - ValueType::BigInt => todo!(), + ValueType::BigInt => { + let n = unsafe { BigInt::from_napi_value(env, napi_val)? }; + // negative + if n.sign_bit { + let (v, lossless) = n.get_i64(); + if lossless { + Value::Number(v.into()) + } else { + Value::String(to_string(env, napi_val)?) + } + } else { + let (_, v, lossless) = n.get_u64(); + if lossless { + Value::Number(v.into()) + } else { + Value::String(to_string(env, napi_val)?) + } + } + } ValueType::Null => Value::Null, ValueType::Function => { return Err(Error::new( @@ -89,6 +108,13 @@ impl FromNapiValue for Value { } } +fn to_string(env: sys::napi_env, napi_val: sys::napi_value) -> Result { + let mut string = ptr::null_mut(); + check_status!(unsafe { sys::napi_coerce_to_string(env, napi_val, &mut string) })?; + let s = unsafe { String::from_napi_value(env, string) }?; + Ok(s) +} + impl ToNapiValue for &Map { unsafe fn to_napi_value(env: sys::napi_env, val: Self) -> Result { let mut obj = Object::new(&Env::from(env))?; diff --git a/examples/napi/__tests__/__snapshots__/values.spec.ts.md b/examples/napi/__tests__/__snapshots__/values.spec.ts.md index f600d17e..f9e50d8a 100644 --- a/examples/napi/__tests__/__snapshots__/values.spec.ts.md +++ b/examples/napi/__tests__/__snapshots__/values.spec.ts.md @@ -572,6 +572,8 @@ Generated by [AVA](https://avajs.dev). ␊ export declare function generateFunctionAndCallIt(): FunctionData␊ ␊ + export declare function getBigintJsonValue(value: bigint): void␊ + ␊ export declare function getBtreeMapping(): Record␊ ␊ export declare function getBuffer(): Buffer␊ diff --git a/examples/napi/__tests__/__snapshots__/values.spec.ts.snap b/examples/napi/__tests__/__snapshots__/values.spec.ts.snap index 50d7f1ade26d92e5014a4a5d684f1b7b0bf08648..68de0be94b99339272061242d2399769dd9d5c1f 100644 GIT binary patch delta 6528 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 delta 6537 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 { t.is(testSerdeBufferBytes({ code: new ArrayBuffer(0) }), 0n) }) +test('get bigint json value', (t) => { + t.notThrows(() => { + getBigintJsonValue(-1n) + getBigintJsonValue(1n) + getBigintJsonValue(18446744073709551620n) + }) +}) + test('buffer', (t) => { let buf = getBuffer() t.is(buf.toString('utf-8'), 'Hello world') diff --git a/examples/napi/example.wasi-browser.js b/examples/napi/example.wasi-browser.js index 2e9960f2..e83ca1ad 100644 --- a/examples/napi/example.wasi-browser.js +++ b/examples/napi/example.wasi-browser.js @@ -210,6 +210,7 @@ export const f64ArrayToArray = __napiModule.exports.f64ArrayToArray export const fibonacci = __napiModule.exports.fibonacci export const fnReceivedAliased = __napiModule.exports.fnReceivedAliased export const generateFunctionAndCallIt = __napiModule.exports.generateFunctionAndCallIt +export const getBigintJsonValue = __napiModule.exports.getBigintJsonValue export const getBtreeMapping = __napiModule.exports.getBtreeMapping export const getBuffer = __napiModule.exports.getBuffer export const getBufferSlice = __napiModule.exports.getBufferSlice diff --git a/examples/napi/example.wasi.cjs b/examples/napi/example.wasi.cjs index c5ea81a0..91f2f6ee 100644 --- a/examples/napi/example.wasi.cjs +++ b/examples/napi/example.wasi.cjs @@ -234,6 +234,7 @@ module.exports.f64ArrayToArray = __napiModule.exports.f64ArrayToArray module.exports.fibonacci = __napiModule.exports.fibonacci module.exports.fnReceivedAliased = __napiModule.exports.fnReceivedAliased module.exports.generateFunctionAndCallIt = __napiModule.exports.generateFunctionAndCallIt +module.exports.getBigintJsonValue = __napiModule.exports.getBigintJsonValue module.exports.getBtreeMapping = __napiModule.exports.getBtreeMapping module.exports.getBuffer = __napiModule.exports.getBuffer module.exports.getBufferSlice = __napiModule.exports.getBufferSlice diff --git a/examples/napi/index.cjs b/examples/napi/index.cjs index e2213cda..b0f021c7 100644 --- a/examples/napi/index.cjs +++ b/examples/napi/index.cjs @@ -524,6 +524,7 @@ module.exports.f64ArrayToArray = nativeBinding.f64ArrayToArray module.exports.fibonacci = nativeBinding.fibonacci module.exports.fnReceivedAliased = nativeBinding.fnReceivedAliased module.exports.generateFunctionAndCallIt = nativeBinding.generateFunctionAndCallIt +module.exports.getBigintJsonValue = nativeBinding.getBigintJsonValue module.exports.getBtreeMapping = nativeBinding.getBtreeMapping module.exports.getBuffer = nativeBinding.getBuffer module.exports.getBufferSlice = nativeBinding.getBufferSlice diff --git a/examples/napi/index.d.cts b/examples/napi/index.d.cts index 5d019c78..f0dbced6 100644 --- a/examples/napi/index.d.cts +++ b/examples/napi/index.d.cts @@ -534,6 +534,8 @@ export interface FunctionData { export declare function generateFunctionAndCallIt(): FunctionData +export declare function getBigintJsonValue(value: bigint): void + export declare function getBtreeMapping(): Record export declare function getBuffer(): Buffer diff --git a/examples/napi/src/serde.rs b/examples/napi/src/serde.rs index bad10a3e..e7a46353 100644 --- a/examples/napi/src/serde.rs +++ b/examples/napi/src/serde.rs @@ -69,3 +69,27 @@ impl PackageJsonReader { &self.i } } + +#[napi(catch_unwind, ts_args_type = "value: bigint")] +pub fn get_bigint_json_value(bigint_json_value: Value) { + match bigint_json_value { + Value::Number(n) => { + if let Some(u) = n.as_u64() { + assert_eq!(u, 1); + return; + } + if let Some(i) = n.as_i64() { + assert_eq!(i, -1); + return; + } + unreachable!("should not happen"); + } + Value::String(s) => { + assert_eq!(s, "18446744073709551620"); + return; + } + _ => { + unreachable!("should not happen"); + } + } +}