Когда я пишу функцию, которая возвращает один 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
, а затем вызываем функцию wasm следующим образом со стороны js / typcript:
let seed = new Uint8Array([0, 0, 1, 1, 2, 2]);
let pubKey: Uint8Array = gen_pubKey(seed);
console.log({ pubKey });
Результат pubKey правильно приведен к Uint8Array
по машинописному тексту.
Теперь, как мне вернуть два Uint8Array
s из функции ржавчины и получить их правильно привести к Uint8Array
на стороне машинописи?
Я пробовал следующие вещи:
- Помещение двух
Uint8Array
s в struct и возвращает структуру из gen_keypair()
#[wasm_bindgen]
pub struct KeyPairJS {
pub privKey: Uint8Array,
pub pubKey: Uint8Array,
}
Это даже не компилируется, потому что js_sys::Uint8Array
не реализует IntoWasmAbi
- Putting
*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 (либо from rust , либо из машинописного текста ), который мне понадобится для воссоздания оригинала Uint8Array
s
- Другие вещи, такие как возврат кортежей, массивов
Uint8Array
s, но без какого-либо успеха