1 unstable release

0.1.0 Nov 22, 2024

#2003 in Encoding

Download history 59/week @ 2024-11-16 63/week @ 2024-11-23 3/week @ 2024-11-30

125 downloads per month

MIT license

26KB
557 lines

based64

A base64 codec using wasm32 SIMD intrinsics.

use based64::{decode, encode};
use wasm_bindgen::{wasm_bindgen, JsValue};

#[wasm_bindgen]
fn main() -> Result<(), JsValue> {
  let ascii = b"VGhlIGRvZyBsaWNrZWQgdGhlIG9pbCwgYW5kIGV2ZXJ5Ym9keSBsYXVnaGVkLg==";
  let message = decode(ascii)?; // The dog licked the oil, and everybody laughed.

  let encoded_to_ascii = encode(&message)?;
  assert_eq!(encoded_to_ascii, ascii.to_vec());

  Ok(())
}

or

import init, {
    encode,
    decode,
} from "./pkg/based64.js";

async function run(): boolean {
    await init();
    
    let data = "howdy";
    let bytes = new TextEncoder().encode(data);
    let ascii: Uint8Array = encode(bytes);
    let rawString = decode(ascii);
    
    return data === rawString;
}

Requirements

# make sure to have the wasm32 target installed
rustup target add wasm32-unknown-unknown

RUSTFLAGS=\"-C target-feature=+simd128 cargo test --target=wasm32-unknown-unknown

Benchmarks

To run benchmarks, run just bench. It should lead you to a web page, you can view the console.

The benchmark rules are very simple, it must follow window.btoa and window.atob's function header: String -> String. Since certain functions have different function signatures, the work needed to convert into a String is included in the measurement.

Codecs measured:

  • base64 with wasm_bindgen bindings
  • window.atob(), window.btoa()
  • based64 Uint8Array -> Uint8Array with wasm_bindgen bindings
  • based64 String -> String with wasm_bindgen bindings

Resources

Dependencies

~0.9–1.5MB
~31K SLoC