该库是一个用于简化 OpenList 驱动插件开发的中间层,它封装了 WASI(WebAssembly System Interface)的复杂性,让开发者可以更专注于驱动本身的业务逻辑。
WASI (WebAssembly System Interface) 是一种为 WebAssembly 设计的系统接口。它允许 WebAssembly 模块以一种标准化的方式与宿主环境(Host)进行交互,例如访问文件系统、网络、时钟等系统资源。
在 WebAssembly 最初的设计中,它本身只是一个虚拟机,并没有直接访问外部世界的能力。WASI 的出现,为 WebAssembly 打开了通往服务器端、桌面应用等更广阔领域的大门,使其不再局限于浏览器环境。通过 WASI,开发者可以使用 Go、Rust 等语言编写可移植、安全、高性能的插件,并在支持 WASI 的宿主环境中运行。
本库的核心作用是作为中间层,它处理了与 wasi:http、wasi:io 等底层接口的交互细节,并提供了一套更易于使用的 Go 接口。开发者在编写 OpenList 驱动时,无需深入了解 WIT (WebAssembly Interface Type) 和复杂的 WASI 调用,只需实现本库中定义的 Driver 接口即可。
这极大地简化了插件的开发流程,让开发者可以:
- 聚焦业务逻辑:无需关心底层的
WASI通信细节。 - 简化编程模型:以更符合 Go 语言习惯的方式进行开发。
- 提高开发效率:减少了学习和使用
WASI的成本。
-
使用time.Sleep()抛出错误 解决方法:
- Guest端使用
//go:wasmexport导出并其Host端设置wazero WithStartFunctions("_initialize") - Guest端使用
-buildmode=c-shared编译选项
- Guest端使用
-
task.Pause() nilPanic() 解决方法:
- 指定更大的栈
-stack-size=1MB
- 指定更大的栈
-
使用 json 时出现 unimplemented: AssignableTo with interface 解决方法:
- 避免使用
reflect.Implements,已知使用 errors.As 会触发 - 避免使用
github.com/hashicorp/go-multierror库,会直接导致错误触发
- 避免使用
tinygo build -target=wasip1 -no-debug -buildmode=c-shared -o plugin.wasm .