GitHub - proxy-wasm/proxy-wasm-go-sdk: WebAssembly for Proxies (Go SDK) (original) (raw)
The Go SDK for Proxy-Wasm, enabling developers to write Proxy-Wasm plugins in Go.
Note: This SDK targets the upstream Go compiler, version 1.24 or later. This is different than the forked github.com/tetratelabs/proxy-wasm-go-sdk, which targets the TinyGo compiler.
Project Status
This SDK is based off of github.com/tetratelabs/proxy-wasm-go-sdk; however, it is effectively a new SDK targeting a completely different toolchain. It relies on the not-yet-released Go 1.24 and hasn't seen extensive prod testing by end-users. This SDK is an alpha product.
Getting Started
- examples directory contains the example codes on top of this SDK.
- OVERVIEW.md the overview of Proxy-Wasm, the API of this SDK, and the things you should know when writing plugins.
Requirements
- [Required] Go: v1.24+ - This SDK leverages Go 1.24's support for WASI (WebAssembly System Interface) reactors. You can install a suitable version from theGo installation guide.
- [Required] A host environment supporting this toolchain, such as Envoy >= 1.33.0. This SDK leverages additional host imports added to the proxy-wasm-cpp-host inPR#427.
- [Optional] Envoy - To run end-to-end tests, you need to have an Envoy binary. You can use func-e as an easy way to get started with Envoy or followthe official instruction.
Installation
go get github.com/proxy-wasm/proxy-wasm-go-sdk
Minimal Example Plugin
A minimal main.go
plugin defining VM and Plugin contexts:
package main
import ( "github.com/proxy-wasm/proxy-wasm-go-sdk/proxywasm" "github.com/proxy-wasm/proxy-wasm-go-sdk/proxywasm/types" )
func main() {}
func init() {
// Plugin authors can use any one of four entrypoints, such as
// proxywasm.SetVMContext
, proxywasm.SetPluginContext
, or
// proxywasm.SetTcpContext
.
proxywasm.SetHttpContext(func(contextID uint32) types.HttpContext {
return &httpContext{}
})
}
type httpContext struct {
types.DefaultHttpContext
}
func (*httpContext) OnHttpRequestHeaders(numHeaders int, endOfStream bool) types.Action {
proxywasm.LogInfo("Hello, world!")
return types.ActionContinue
}
Compile the plugin as follows:
$ go mod init main.go $ go mod tidy $ env GOOS=wasip1 GOARCH=wasm go build -buildmode=c-shared -o my-plugin.wasm main.go
Build and run Examples
Build all examples.
make build.examples
Build a specific example using the go
tool.
cd examples/helloworld env GOOS=wasip1 GOARCH=wasm go build -buildmode=c-shared -o main.wasm main.go
Test the built wasm module using go test
.
go test
Build and test a specific example from the repo root using make
.
make build.example name=helloworld make run name=helloworld
Compatible Envoy builds
Envoy is the first host side implementation of Proxy-Wasm ABI, and we run end-to-end tests with multiple versions of Envoy and Envoy-basedistio/proxy in order to verify Proxy-Wasm Go SDK works as expected.
Please refer to workflow.yaml for which version is used for End-to-End tests.
Build tags
The following build tags can be used to customize the behavior of the built plugin. Build tagscan be specified in the go build command via the -tags flag:
proxywasm_timing
: Enables logging of time spent in invocation of the plugin's exported functions. This can be useful for debugging performance issues.
Contributing
We welcome contributions from the community! SeeCONTRIBUTING.md for how to contribute to this repository.