Webassembly実践-rust to wasm


ターゲット
  rust   lib - blake2b-simd,   js         。   js  rust         。

環境
  • rustc rustup cargo(rust-langの開発コンパイルツール)
  • nodejs(wasm-pack生成packageのパブリッシュ)
  • wasm-packのインストール
    cargo install wasm-pack

    cargoを使用してプロジェクトを作成する
    cargo new --lib blake2b-wasm

    cdからblake 2 b-wasmディレクトリ
    編集カーゴtoml
    [package]
    name = "blake2b-wasm"
    version = "0.1.0"
    authors = ["foo "]
    edition = "2018"
    
    # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
    [lib]
    crate-type = ["cdylib"]
    
    [dependencies]
    wasm-bindgen = "0.2"
    blake2b_simd = "0.5.8"
    

    srcディレクトリのlibを編集します.rs
    use blake2b_simd::{blake2b, Params};
    use wasm_bindgen::prelude::*;
    
    #[wasm_bindgen]
    pub fn blake2b_encode(input: &[u8], length: usize) -> String {
      if length == 0 {
        return blake2b(input).to_hex().to_string()
      }
      let hash = Params::new().hash_length(length).hash(input);
      hash.to_hex().to_string()
    }
    
    
    #[cfg(test)]
    mod tests {
      use super::*;
    
      #[test]
      fn it_works() {
        let expected = "ca002330e69d3e6b84a46a56a6533fd79d51d97a3bb7cad6c2ff43b354185d6d\
                        c1e723fb3db4ae0737e120378424c714bb982d9dc5bbd7a0ab318240ddd18f8d";
        let hash = blake2b(b"foo");
        assert_eq!(expected, &hash.to_hex());
      }
    }

    ユニットテストの実行
    cargo test 

    次の結果が表示されたら、次のwebassemblyのコンパイルが可能であることを示します.
    Finished dev [unoptimized + debuginfo] target(s) in 0.09s
         Running target/debug/deps/blake2b_wasm-8c79ae2ec6adeb5b
    
    running 1 test
    test tests::it_works ... ok
    
    test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out

    wasm-packを使用してソースファイルをwasm形式にパッケージ化
    wasm-pack build --scope foo --target nodejs

    コンパイルが完了するとpkgディレクトリが生成されます.これはnpmに直接パブリッシュして使用できます.ブラウザで使用する場合は、コンパイル時に--target browserを使用して生成されたディレクトリを指定することもできます.-d browser_pkg
    nodejsをインストールした場合は、このディレクトリの下にtestを作成できます.jsファイルはさっきコンパイルしたwasmパッケージをテストします
    test.js
    const { blake2b_encode } = require('./pkg')
    const assert = require('assert')
    
    const encodeString = blake2b_encode(Buffer.from("foo"))
    const expectedString = "ca002330e69d3e6b84a46a56a6533fd79d51d97a3bb7cad6c2ff43b354185d6dc1e723fb3db4ae0737e120378424c714bb982d9dc5bbd7a0ab318240ddd18f8d"
    assert.equal(encodeString, expectedString)