4 个版本
0.2.0 | 2024 年 3 月 17 日 |
---|---|
0.1.2 | 2023 年 7 月 10 日 |
0.1.1 | 2023 年 7 月 4 日 |
0.1.0 | 2023 年 7 月 4 日 |
#358 在 WebAssembly
每月 21 次下载
94KB
2K SLoC
wvwasi
具有 WebAssembly 系统接口 (WASI) 的 WebView 可能是最佳的 Javascript/WebAssembly 运行时,而 wvwasi
就是它。
|
Javascript/WebAssembly code | Javascript/WebAssembly application code
| |
| v
| WASI syscalls (inserted by compiler toolchain)
| |
------------------------------+ |
| v
Javascript/WebAssembly runtime| wvwasi (implementation WASI in webview)
(WebView) | |
| v
| platform-specific calls
|
(因此,wvwasi 不适用于在 WASI 运行时上执行程序。这可能是通过 rust 编译的 wasm32-wasi 目标,或者通过 Emscripten 或 wasi-sdk 工具链的 POSIX 仿真完成。)
警告:这是一个 alpha 版本。仍在开发中。
示例用法
目前仅实现了 Windows 平台,其他平台正在开发中。
cargo run --example hello_world --target x86_64-pc-windows-msvc
它是如何实现高性能的?
没有魔法,只是 IPC 和 sharedbuffer。
为什么不使用 Web APIs 实现 WASI?
- WebKit 反对文件系统访问 API.
- 无法预先打开系统文件夹。
- 您不能使用高性能通信机制自定义自己的接口。
- 您可以使用原生系统功能,例如传输层的套接字,而无需在应用层受限于 websockets。
API
WASI API 已进行了版本控制。本文档基于 WASI preview 1 快照。wvwasi
使用以下添加/修改实现了 WASI 系统调用 API
系统调用
本节内容来自官方 WASI API 文档。
wvwasi.wasiSnapshotPreview1.fd_advise()
wvwasi.wasiSnapshotPreview1.fd_allocate()
wvwasi.wasiSnapshotPreview1.fd_close()
wvwasi.wasiSnapshotPreview1.fd_datasync()
wvwasi.wasiSnapshotPreview1.fd_fdstat_get()
wvwasi.wasiSnapshotPreview1.fd_fdstat_set_flags()
wvwasi.wasiSnapshotPreview1.fd_fdstat_set_rights()
wvwasi.wasiSnapshotPreview1.fd_filestat_get()
wvwasi.wasiSnapshotPreview1.fd_filestat_set_size()
wvwasi.wasiSnapshotPreview1.fd_filestat_set_times()
wvwasi.wasiSnapshotPreview1.fd_pread()
wvwasi.wasiSnapshotPreview1.fd_prestat_get()
wvwasi.wasiSnapshotPreview1.fd_prestat_dir_name()
wvwasi.wasiSnapshotPreview1.fd_pwrite()
wvwasi.wasiSnapshotPreview1.fd_read()
wvwasi.wasiSnapshotPreview1.fd_readdir()
wvwasi.wasiSnapshotPreview1.fd_renumber()
wvwasi.wasiSnapshotPreview1.fd_seek()
wvwasi.wasiSnapshotPreview1.fd_sync()
wvwasi.wasiSnapshotPreview1.fd_tell()
wvwasi.wasiSnapshotPreview1.fd_write()
wvwasi.wasiSnapshotPreview1.path_create_directory()
wvwasi.wasiSnapshotPreview1.path_filestat_get()
wvwasi.wasiSnapshotPreview1.path_filestat_set_times()
wvwasi.wasiSnapshotPreview1.path_link()
wvwasi.wasiSnapshotPreview1.path_open()
wvwasi.wasiSnapshotPreview1.path_readlink()
wvwasi.wasiSnapshotPreview1.path_remove_directory()
wvwasi.wasiSnapshotPreview1.path_rename()
wvwasi.wasiSnapshotPreview1.path_symlink()
wvwasi.wasiSnapshotPreview1.path_unlink_file()
wvwasi.wasiSnapshotPreview1.poll_oneoff()
wvwasi.wasiSnapshotPreview1.proc_exit()
wvwasi.wasiSnapshotPreview1.proc_raise()
wvwasi.wasiSnapshotPreview1.sched_yield()
wvwasi.wasiSnapshotPreview1.random_get()
wvwasi.wasiSnapshotPreview1.sock_accept()
wvwasi.wasiSnapshotPreview1.sock_recv()
wvwasi.wasiSnapshotPreview1.sock_send()
wvwasi.wasiSnapshotPreview1.sock_shutdown()
依赖
~199MB
~3M SLoC