1 个稳定版本
1.0.0 | 2022年7月1日 |
---|
1034 在 WebAssembly 中
89 每月下载次数
16KB
100 代码行
wasm-bindgen-file-reader
这个包实现了一个围绕 web_sys::File
的包装器,该包装器实现了 Read
和 Seek
。当你有一个期望泛型读取器的 Rust 包,并且想在 WebAssembly 中使用它,而无需将整个文件加载到内存中并使用 std::io::Cursor
时,这很有用。
注意:这只能在 Web Worker 上下文中工作,因为它使用了同步的 FileReaderSync 接口。
安装
添加到 Cargo.toml
wasm-bindgen-file-reader = "1"
用法
有关更多信息,请参阅 演示。
Rust 代码
use wasm_bindgen_file_reader::WebSysFile;
use std::io::Read;
use std::io::Seek;
use std::io::SeekFrom;
/// Read one byte from the file at a given offset.
#[wasm_bindgen]
pub fn read_at_offset_sync(file: web_sys::File, offset: u64) -> u8 {
let mut wf = WebSysFile::new(file);
// Now we can seek as if this was a real file
wf.seek(SeekFrom::Start(offset))
.expect("failed to seek to offset");
// Use 1-byte buffer because we only want to read one byte
let mut buf = [0];
// The Read API works as with real files
wf.read_exact(&mut buf).expect("failed to read bytes");
buf[0]
}
JavaScript 代码(index.html)
let myWorker = new Worker("worker.js");
document.getElementById("filepicker").addEventListener(
"change",
function() {
let file = this.files[0];
myWorker.postMessage({ file: file, offset: 0 });
myWorker.onmessage = function(e) {
console.log("First byte of file is: ", e.data);
};
},
false
);
JavaScript 代码(worker.js)
onmessage = async function(e) {
let wasm_bindgen_file_reader_test = await Rust.wasm_bindgen_file_reader_test;
let workerResult = wasm_bindgen_file_reader_test.read_at_offset_sync(
e.data.file,
e.data.offset,
);
postMessage(workerResult);
};
依赖项
~6.5–8.5MB
~171K SLoC