Rust wasm: возвращение двух `Uint8Array`s - PullRequest
1 голос
/ 13 февраля 2020

Когда я пишу функцию, которая возвращает один 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, но без какого-либо успеха
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...