3

当我编写一个返回一个的函数时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 正确地转换为Uint8Arrayby typescript。

现在,我怎样才能Uint8Array从 rust 函数返回两个 s 并让它们正确地转换到Uint8Arraytypescript 端?


我尝试了以下事情:

  • 将两个Uint8Arrays 放入一个结构并从gen_keypair()
    #[wasm_bindgen]
    pub struct KeyPairJS {
        pub privKey: Uint8Array,
        pub pubKey: Uint8Array,
    }

这甚至没有编译,因为js_sys::Uint8Array没有实现IntoWasmAbi

  • *const Uint8Arrays 放入这个结构中,然后从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),我需要重新创建原始Uint8Arrays

  • 其他的东西,比如返回元组,Uint8Arrays的数组,但没有任何成功
4

0 回答 0