当我编写一个返回一个的函数时js_sys::Uint8Array
(在 Rust 中):
#[wasm_bindgen]
pub extern "C" fn gen_pubKey(seed: &[u8]) -> Uint8Array {
let (privKey, pubKey) = ed25519::keypair(&seed);
unsafe { Uint8Array::view(&pubKey) }
}
然后使用 编译它wasm-pack
,然后从 js/typescript 端以这种方式调用 wasm 函数:
let seed = new Uint8Array([0, 0, 1, 1, 2, 2]);
let pubKey: Uint8Array = gen_pubKey(seed);
console.log({ pubKey });
结果 pubKey 正确地转换为Uint8Array
by typescript。
现在,我怎样才能Uint8Array
从 rust 函数返回两个 s 并让它们正确地转换到Uint8Array
typescript 端?
我尝试了以下事情:
- 将两个
Uint8Array
s 放入一个结构并从gen_keypair()
#[wasm_bindgen]
pub struct KeyPairJS {
pub privKey: Uint8Array,
pub pubKey: Uint8Array,
}
这甚至没有编译,因为js_sys::Uint8Array
没有实现IntoWasmAbi
- 将
*const Uint8Array
s 放入这个结构中,然后从gen_keypair()
#[wasm_bindgen]
pub struct KeyPairJS {
pub privKey: *const Uint8Array,
pub pubKey: *const Uint8Array,
}
这不起作用,因为*const Uint8Array
它只是一个数字。在打字稿方面,它没有实现所有的方法Uint8Array
- 创建一个既实现
IntoWasmAbi
又包含足够信息的类型,以便在内存中找到Uint8Array
' 的内容,从打字稿端重新创建它:
#[wasm_bindgen]
#[derive(Copy, Clone)]
pub struct Bytes {
offset: *const u8,
size: usize,
}
#[wasm_bindgen]
impl Bytes {
pub fn new(bytes: &[u8]) -> Bytes {
Bytes {
offset: bytes.as_ptr(),
size: bytes.len(),
}
}
pub fn offset(&self) -> *const u8 {
self.offset
}
pub fn size(&self) -> usize {
self.size
}
}
在这里,我不确定如何访问当前 wasm 实例的内存缓冲区(来自 rust或来自 typescript),我需要重新创建原始Uint8Array
s
- 其他的东西,比如返回元组,
Uint8Array
s的数组,但没有任何成功