Compare commits
No commits in common. "ea8a3ee209777819f20702409ddba96b7bfec2bf" and "90c958a537a8a19af474fb9bd8522686ec6b3eee" have entirely different histories.
ea8a3ee209
...
90c958a537
3
.gitignore
vendored
3
.gitignore
vendored
@ -1,3 +0,0 @@
|
|||||||
gen/*
|
|
||||||
build/*
|
|
||||||
|
|
38
README.md
38
README.md
@ -1,38 +1,2 @@
|
|||||||
# HTTP Hello World
|
# go-nats-client
|
||||||
|
|
||||||
This is a simple TinyGo Wasm example that responds with a "Hello World" message for each request.
|
|
||||||
|
|
||||||
## Prerequisites
|
|
||||||
|
|
||||||
- `go` 1.23
|
|
||||||
- `tinygo` 0.33
|
|
||||||
- [`wash`](https://wasmcloud.com/docs/installation) 0.35.0
|
|
||||||
- `wasmtime` 25.0.0 (if running with wasmtime)
|
|
||||||
|
|
||||||
## Building
|
|
||||||
|
|
||||||
```bash
|
|
||||||
wash build
|
|
||||||
```
|
|
||||||
|
|
||||||
## Running with wasmtime
|
|
||||||
|
|
||||||
You must have wasmtime 25.0.0 for this to work. Make sure to follow the build step above first.
|
|
||||||
|
|
||||||
```bash
|
|
||||||
wasmtime serve -Scommon ./build/http_hello_world_s.wasm
|
|
||||||
```
|
|
||||||
|
|
||||||
## Running with wasmCloud
|
|
||||||
|
|
||||||
Make sure to follow the build steps above, and replace the file path in [the wadm manifest](./wadm.yaml) with the absolute path to your local built component.
|
|
||||||
|
|
||||||
```shell
|
|
||||||
wash up -d
|
|
||||||
wash app deploy ./wadm.yaml
|
|
||||||
curl http://localhost:8000
|
|
||||||
```
|
|
||||||
|
|
||||||
## Adding Capabilities
|
|
||||||
|
|
||||||
To learn how to extend this example with additional capabilities, see the [Adding Capabilities](https://wasmcloud.com/docs/tour/adding-capabilities?lang=tinygo) section of the wasmCloud documentation.
|
|
||||||
|
@ -1,130 +0,0 @@
|
|||||||
//go:build !wasm && !wasi && !wasip1 && !wasip2 && !wasm_unknown && !tinygo.wasm
|
|
||||||
|
|
||||||
// Code generated by wadge-bindgen-go DO NOT EDIT
|
|
||||||
|
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
gitea_rebus_ninja__lore__go___nats___client__gen__wasmcloud__messaging__consumer "gitea.rebus.ninja/lore/go-nats-client/gen/wasmcloud/messaging/consumer"
|
|
||||||
gitea_rebus_ninja__lore__go___nats___client__gen__wasmcloud__messaging__types "gitea.rebus.ninja/lore/go-nats-client/gen/wasmcloud/messaging/types"
|
|
||||||
github_com__bytecodealliance__wasm___tools___go__cm "github.com/bytecodealliance/wasm-tools-go/cm"
|
|
||||||
wadge "go.wasmcloud.dev/wadge"
|
|
||||||
"runtime"
|
|
||||||
"unsafe"
|
|
||||||
)
|
|
||||||
|
|
||||||
const _ string = runtime.Compiler
|
|
||||||
|
|
||||||
var _ unsafe.Pointer
|
|
||||||
|
|
||||||
//go:linkname wasmimport_Log go.wasmcloud.dev/component/gen/wasi/logging/logging.wasmimport_Log
|
|
||||||
func wasmimport_Log(level0 uint32, context0 *uint8, context1 uint32, message0 *uint8, message1 uint32) {
|
|
||||||
var __p runtime.Pinner
|
|
||||||
defer __p.Unpin()
|
|
||||||
if __err := wadge.WithCurrentInstance(func(__instance *wadge.Instance) error {
|
|
||||||
return __instance.Call("wasi:logging/logging@0.1.0-draft", "log", func() unsafe.Pointer {
|
|
||||||
ptr := unsafe.Pointer(&level0)
|
|
||||||
__p.Pin(ptr)
|
|
||||||
return ptr
|
|
||||||
}(), func() unsafe.Pointer {
|
|
||||||
ptr := unsafe.Pointer(context0)
|
|
||||||
__p.Pin(ptr)
|
|
||||||
return ptr
|
|
||||||
}(), func() unsafe.Pointer {
|
|
||||||
ptr := unsafe.Pointer(&context1)
|
|
||||||
__p.Pin(ptr)
|
|
||||||
return ptr
|
|
||||||
}(), func() unsafe.Pointer {
|
|
||||||
ptr := unsafe.Pointer(message0)
|
|
||||||
__p.Pin(ptr)
|
|
||||||
return ptr
|
|
||||||
}(), func() unsafe.Pointer {
|
|
||||||
ptr := unsafe.Pointer(&message1)
|
|
||||||
__p.Pin(ptr)
|
|
||||||
return ptr
|
|
||||||
}())
|
|
||||||
}); __err != nil {
|
|
||||||
wadge.CurrentErrorHandler()(__err)
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
//go:linkname wasmimport_Publish gitea.rebus.ninja/lore/go-nats-client/gen/wasmcloud/messaging/consumer.wasmimport_Publish
|
|
||||||
func wasmimport_Publish(msg0 *uint8, msg1 uint32, msg2 *uint8, msg3 uint32, msg4 uint32, msg5 *uint8, msg6 uint32, result *github_com__bytecodealliance__wasm___tools___go__cm.Result[string, struct{}, string]) {
|
|
||||||
var __p runtime.Pinner
|
|
||||||
defer __p.Unpin()
|
|
||||||
if __err := wadge.WithCurrentInstance(func(__instance *wadge.Instance) error {
|
|
||||||
return __instance.Call("wasmcloud:messaging/consumer@0.2.0", "publish", func() unsafe.Pointer {
|
|
||||||
ptr := unsafe.Pointer(msg0)
|
|
||||||
__p.Pin(ptr)
|
|
||||||
return ptr
|
|
||||||
}(), func() unsafe.Pointer {
|
|
||||||
ptr := unsafe.Pointer(&msg1)
|
|
||||||
__p.Pin(ptr)
|
|
||||||
return ptr
|
|
||||||
}(), func() unsafe.Pointer {
|
|
||||||
ptr := unsafe.Pointer(msg2)
|
|
||||||
__p.Pin(ptr)
|
|
||||||
return ptr
|
|
||||||
}(), func() unsafe.Pointer {
|
|
||||||
ptr := unsafe.Pointer(&msg3)
|
|
||||||
__p.Pin(ptr)
|
|
||||||
return ptr
|
|
||||||
}(), func() unsafe.Pointer {
|
|
||||||
ptr := unsafe.Pointer(&msg4)
|
|
||||||
__p.Pin(ptr)
|
|
||||||
return ptr
|
|
||||||
}(), func() unsafe.Pointer {
|
|
||||||
ptr := unsafe.Pointer(msg5)
|
|
||||||
__p.Pin(ptr)
|
|
||||||
return ptr
|
|
||||||
}(), func() unsafe.Pointer {
|
|
||||||
ptr := unsafe.Pointer(&msg6)
|
|
||||||
__p.Pin(ptr)
|
|
||||||
return ptr
|
|
||||||
}(), func() unsafe.Pointer {
|
|
||||||
ptr := unsafe.Pointer(result)
|
|
||||||
__p.Pin(ptr)
|
|
||||||
return ptr
|
|
||||||
}())
|
|
||||||
}); __err != nil {
|
|
||||||
wadge.CurrentErrorHandler()(__err)
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
||||||
|
|
||||||
//go:linkname wasmimport_Request gitea.rebus.ninja/lore/go-nats-client/gen/wasmcloud/messaging/consumer.wasmimport_Request
|
|
||||||
func wasmimport_Request(subject0 *uint8, subject1 uint32, body0 *uint8, body1 uint32, timeoutMs0 uint32, result *github_com__bytecodealliance__wasm___tools___go__cm.Result[gitea_rebus_ninja__lore__go___nats___client__gen__wasmcloud__messaging__consumer.BrokerMessageShape, gitea_rebus_ninja__lore__go___nats___client__gen__wasmcloud__messaging__types.BrokerMessage, string]) {
|
|
||||||
var __p runtime.Pinner
|
|
||||||
defer __p.Unpin()
|
|
||||||
if __err := wadge.WithCurrentInstance(func(__instance *wadge.Instance) error {
|
|
||||||
return __instance.Call("wasmcloud:messaging/consumer@0.2.0", "request", func() unsafe.Pointer {
|
|
||||||
ptr := unsafe.Pointer(subject0)
|
|
||||||
__p.Pin(ptr)
|
|
||||||
return ptr
|
|
||||||
}(), func() unsafe.Pointer {
|
|
||||||
ptr := unsafe.Pointer(&subject1)
|
|
||||||
__p.Pin(ptr)
|
|
||||||
return ptr
|
|
||||||
}(), func() unsafe.Pointer {
|
|
||||||
ptr := unsafe.Pointer(body0)
|
|
||||||
__p.Pin(ptr)
|
|
||||||
return ptr
|
|
||||||
}(), func() unsafe.Pointer {
|
|
||||||
ptr := unsafe.Pointer(&body1)
|
|
||||||
__p.Pin(ptr)
|
|
||||||
return ptr
|
|
||||||
}(), func() unsafe.Pointer {
|
|
||||||
ptr := unsafe.Pointer(&timeoutMs0)
|
|
||||||
__p.Pin(ptr)
|
|
||||||
return ptr
|
|
||||||
}(), func() unsafe.Pointer {
|
|
||||||
ptr := unsafe.Pointer(result)
|
|
||||||
__p.Pin(ptr)
|
|
||||||
return ptr
|
|
||||||
}())
|
|
||||||
}); __err != nil {
|
|
||||||
wadge.CurrentErrorHandler()(__err)
|
|
||||||
}
|
|
||||||
return
|
|
||||||
}
|
|
27
go.mod
27
go.mod
@ -1,27 +0,0 @@
|
|||||||
module gitea.rebus.ninja/lore/go-nats-client
|
|
||||||
|
|
||||||
go 1.23.0
|
|
||||||
|
|
||||||
require (
|
|
||||||
github.com/bytecodealliance/wasm-tools-go v0.3.1
|
|
||||||
go.wasmcloud.dev/component v0.0.4
|
|
||||||
go.wasmcloud.dev/wadge v0.7.0
|
|
||||||
)
|
|
||||||
|
|
||||||
require (
|
|
||||||
github.com/coreos/go-semver v0.3.1 // indirect
|
|
||||||
github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7 // indirect
|
|
||||||
github.com/klauspost/compress v1.17.9 // indirect
|
|
||||||
github.com/opencontainers/go-digest v1.0.0 // indirect
|
|
||||||
github.com/regclient/regclient v0.7.1 // indirect
|
|
||||||
github.com/samber/lo v1.47.0 // indirect
|
|
||||||
github.com/samber/slog-common v0.17.1 // indirect
|
|
||||||
github.com/sirupsen/logrus v1.9.3 // indirect
|
|
||||||
github.com/ulikunitz/xz v0.5.12 // indirect
|
|
||||||
github.com/urfave/cli/v3 v3.0.0-alpha9.2 // indirect
|
|
||||||
golang.org/x/mod v0.21.0 // indirect
|
|
||||||
golang.org/x/sync v0.8.0 // indirect
|
|
||||||
golang.org/x/sys v0.26.0 // indirect
|
|
||||||
golang.org/x/text v0.18.0 // indirect
|
|
||||||
golang.org/x/tools v0.26.0 // indirect
|
|
||||||
)
|
|
54
go.sum
54
go.sum
@ -1,54 +0,0 @@
|
|||||||
github.com/bytecodealliance/wasm-tools-go v0.3.1 h1:9Q9PjSzkbiVmkUvZ7nYCfJ02mcQDBalxycA3s8g7kR4=
|
|
||||||
github.com/bytecodealliance/wasm-tools-go v0.3.1/go.mod h1:vNAQ8DAEp6xvvk+TUHah5DslLEa76f4H6e737OeaxuY=
|
|
||||||
github.com/coreos/go-semver v0.3.1 h1:yi21YpKnrx1gt5R+la8n5WgS0kCrsPp33dmEyHReZr4=
|
|
||||||
github.com/coreos/go-semver v0.3.1/go.mod h1:irMmmIw/7yzSRPWryHsK7EYSg09caPQL03VsM8rvUec=
|
|
||||||
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
|
||||||
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
|
||||||
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
|
||||||
github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7 h1:UhxFibDNY/bfvqU5CAUmr9zpesgbU6SWc8/B4mflAE4=
|
|
||||||
github.com/docker/libtrust v0.0.0-20160708172513-aabc10ec26b7/go.mod h1:cyGadeNEkKy96OOhEzfZl+yxihPEzKnqJwvfuSUqbZE=
|
|
||||||
github.com/klauspost/compress v1.17.9 h1:6KIumPrER1LHsvBVuDa0r5xaG0Es51mhhB9BQB2qeMA=
|
|
||||||
github.com/klauspost/compress v1.17.9/go.mod h1:Di0epgTjJY877eYKx5yC51cX2A2Vl2ibi7bDH9ttBbw=
|
|
||||||
github.com/olareg/olareg v0.1.0 h1:1dXBOgPrig5N7zoXyIZVQqU0QBo6sD9pbL6UYjY75CA=
|
|
||||||
github.com/olareg/olareg v0.1.0/go.mod h1:RBuU7JW7SoIIxZKzLRhq8sVtQeAHzCAtRrXEBx2KlM4=
|
|
||||||
github.com/opencontainers/go-digest v1.0.0 h1:apOUWs51W5PlhuyGyz9FCeeBIOUDA/6nW8Oi/yOhh5U=
|
|
||||||
github.com/opencontainers/go-digest v1.0.0/go.mod h1:0JzlMkj0TRzQZfJkVvzbP0HBR3IKzErnv2BNG4W4MAM=
|
|
||||||
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
|
||||||
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
|
||||||
github.com/regclient/regclient v0.7.1 h1:qEsJrTmZd98fZKjueAbrZCSNGU+ifnr6xjlSAs3WOPs=
|
|
||||||
github.com/regclient/regclient v0.7.1/go.mod h1:+w/BFtJuw0h0nzIw/z2+1FuA2/dVXBzDq4rYmziJpMc=
|
|
||||||
github.com/samber/lo v1.47.0 h1:z7RynLwP5nbyRscyvcD043DWYoOcYRv3mV8lBeqOCLc=
|
|
||||||
github.com/samber/lo v1.47.0/go.mod h1:RmDH9Ct32Qy3gduHQuKJ3gW1fMHAnE/fAzQuf6He5cU=
|
|
||||||
github.com/samber/slog-common v0.17.1 h1:jTqqLBgoJshpoxlPSGiypyOanjH6tY+i9bwyYmIbjhI=
|
|
||||||
github.com/samber/slog-common v0.17.1/go.mod h1:mZSJhinB4aqHziR0SKPqpVZjJ0JO35JfH+dDIWqaCBk=
|
|
||||||
github.com/sergi/go-diff v1.3.1 h1:xkr+Oxo4BOQKmkn/B9eMK0g5Kg/983T9DqqPHwYqD+8=
|
|
||||||
github.com/sergi/go-diff v1.3.1/go.mod h1:aMJSSKb2lpPvRNec0+w3fl7LP9IOFzdc9Pa4NFbPK1I=
|
|
||||||
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
|
|
||||||
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
|
|
||||||
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
|
||||||
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
|
||||||
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
|
|
||||||
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
|
|
||||||
github.com/ulikunitz/xz v0.5.12 h1:37Nm15o69RwBkXM0J6A5OlE67RZTfzUxTj8fB3dfcsc=
|
|
||||||
github.com/ulikunitz/xz v0.5.12/go.mod h1:nbz6k7qbPmH4IRqmfOplQw/tblSgqTqBwxkY0oWt/14=
|
|
||||||
github.com/urfave/cli/v3 v3.0.0-alpha9.2 h1:CL8llQj3dGRLVQQzHxS+ZYRLanOuhyK1fXgLKD+qV+Y=
|
|
||||||
github.com/urfave/cli/v3 v3.0.0-alpha9.2/go.mod h1:FnIeEMYu+ko8zP1F9Ypr3xkZMIDqW3DR92yUtY39q1Y=
|
|
||||||
go.wasmcloud.dev/component v0.0.4 h1:CyqSV38sAOjYcXS6kkOIhQaDgXATHmd2gZlU7ghfUj4=
|
|
||||||
go.wasmcloud.dev/component v0.0.4/go.mod h1:EaPCl4TKNruOQ/hk/3lBTLGzpdE6R1Ju9g52ZzJQgh0=
|
|
||||||
go.wasmcloud.dev/wadge v0.7.0 h1:eUt0jODh6xQ5HEof1PFSgDp+evrNs+lD1LYCYeRR2Cg=
|
|
||||||
go.wasmcloud.dev/wadge v0.7.0/go.mod h1:SMnPSWZFTkXyUX0GJ11mcdc7ZoMITtbAlPLlpvGJd4M=
|
|
||||||
golang.org/x/mod v0.21.0 h1:vvrHzRwRfVKSiLrG+d4FMl/Qi4ukBCE6kZlTUkDYRT0=
|
|
||||||
golang.org/x/mod v0.21.0/go.mod h1:6SkKJ3Xj0I0BrPOZoBy3bdMptDDU9oJrpohJ3eWZ1fY=
|
|
||||||
golang.org/x/sync v0.8.0 h1:3NFvSEYkUoMifnESzZl15y791HH1qU2xm6eCJU5ZPXQ=
|
|
||||||
golang.org/x/sync v0.8.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
|
|
||||||
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
|
||||||
golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo=
|
|
||||||
golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
|
|
||||||
golang.org/x/text v0.18.0 h1:XvMDiNzPAl0jr17s6W9lcaIhGUfUORdGCNsuLmPG224=
|
|
||||||
golang.org/x/text v0.18.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY=
|
|
||||||
golang.org/x/tools v0.26.0 h1:v/60pFQmzmT9ExmjDv2gGIfi3OqfKoEP6I5+umXlbnQ=
|
|
||||||
golang.org/x/tools v0.26.0/go.mod h1:TPVVj70c7JJ3WCazhD8OdXcZg/og+b9+tH/KxylGwH0=
|
|
||||||
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
|
||||||
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
|
||||||
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
|
||||||
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
|
21
main.go
21
main.go
@ -1,21 +0,0 @@
|
|||||||
//go:generate go run github.com/bytecodealliance/wasm-tools-go/cmd/wit-bindgen-go generate --world hello --out gen ./wit
|
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"net/http"
|
|
||||||
|
|
||||||
"gitea.rebus.ninja/lore/go-nats-client/gen/wasmcloud/messaging/handler"
|
|
||||||
)
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
handler.Exports.HandleMessage = handleMessage
|
|
||||||
}
|
|
||||||
|
|
||||||
func handleRequest(w http.ResponseWriter, r *http.Request) {
|
|
||||||
fmt.Fprintf(w, "Hello from Go!\n")
|
|
||||||
}
|
|
||||||
|
|
||||||
// Since we don't run this program like a CLI, the `main` function is empty. Instead,
|
|
||||||
// we call the `handleRequest` function when an HTTP request is received.
|
|
||||||
func main() {}
|
|
54
main_test.go
54
main_test.go
@ -1,54 +0,0 @@
|
|||||||
//go:generate go run go.wasmcloud.dev/wadge/cmd/wadge-bindgen-go
|
|
||||||
|
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"bytes"
|
|
||||||
"io"
|
|
||||||
"log"
|
|
||||||
"log/slog"
|
|
||||||
"net/http"
|
|
||||||
"os"
|
|
||||||
"testing"
|
|
||||||
|
|
||||||
incominghandler "go.wasmcloud.dev/component/gen/wasi/http/incoming-handler"
|
|
||||||
"go.wasmcloud.dev/wadge"
|
|
||||||
"go.wasmcloud.dev/wadge/wadgehttp"
|
|
||||||
)
|
|
||||||
|
|
||||||
func init() {
|
|
||||||
log.SetFlags(0)
|
|
||||||
slog.SetDefault(slog.New(slog.NewTextHandler(os.Stderr, &slog.HandlerOptions{
|
|
||||||
Level: slog.LevelDebug, ReplaceAttr: func(groups []string, a slog.Attr) slog.Attr {
|
|
||||||
if a.Key == slog.TimeKey {
|
|
||||||
return slog.Attr{}
|
|
||||||
}
|
|
||||||
return a
|
|
||||||
},
|
|
||||||
})))
|
|
||||||
}
|
|
||||||
|
|
||||||
func TestIncomingHandler(t *testing.T) {
|
|
||||||
wadge.RunTest(t, func() {
|
|
||||||
req, err := http.NewRequest("", "/", nil)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to create new HTTP request: %s", err)
|
|
||||||
}
|
|
||||||
resp, err := wadgehttp.HandleIncomingRequest(incominghandler.Exports.Handle, req)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to handle incoming HTTP request: %s", err)
|
|
||||||
}
|
|
||||||
if want, got := http.StatusOK, resp.StatusCode; want != got {
|
|
||||||
t.Fatalf("unexpected status code: want %d, got %d", want, got)
|
|
||||||
}
|
|
||||||
buf, err := io.ReadAll(resp.Body)
|
|
||||||
if err != nil {
|
|
||||||
t.Fatalf("failed to read HTTP response body: %s", err)
|
|
||||||
}
|
|
||||||
defer resp.Body.Close()
|
|
||||||
|
|
||||||
if want, got := []byte("Hello from Go!\n"), buf; !bytes.Equal(want, got) {
|
|
||||||
t.Fatalf("unexpected response body: want %q, got %q", want, got)
|
|
||||||
}
|
|
||||||
})
|
|
||||||
}
|
|
41
messaging.go
41
messaging.go
@ -1,41 +0,0 @@
|
|||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
"github.com/bytecodealliance/wasm-tools-go/cm"
|
|
||||||
"gitea.rebus.ninja/lore/go-nats-client/gen/wasmcloud/messaging/consumer"
|
|
||||||
"gitea.rebus.ninja/lore/go-nats-client/gen/wasmcloud/messaging/types"
|
|
||||||
"go.wasmcloud.dev/component/log/wasilog"
|
|
||||||
)
|
|
||||||
|
|
||||||
type messagingConsumerAdapter struct {
|
|
||||||
Publish func(msg types.BrokerMessage) (result cm.Result[string, struct{}, string])
|
|
||||||
}
|
|
||||||
|
|
||||||
// NOTE(lxf): this is overridden in tests
|
|
||||||
var messagingConsumer = &messagingConsumerAdapter{
|
|
||||||
Publish: consumer.Publish,
|
|
||||||
}
|
|
||||||
|
|
||||||
func handleMessage(msg types.BrokerMessage) cm.Result[string, struct{}, string] {
|
|
||||||
logger := wasilog.ContextLogger("handleMessage")
|
|
||||||
replyTo := msg.ReplyTo.Some()
|
|
||||||
|
|
||||||
logger.Info("Received message", "subject", msg.Subject)
|
|
||||||
|
|
||||||
if replyTo != nil {
|
|
||||||
logger.Info("Sending reply", "subject", *replyTo)
|
|
||||||
|
|
||||||
reply := types.BrokerMessage{
|
|
||||||
Subject: *replyTo,
|
|
||||||
Body: msg.Body,
|
|
||||||
ReplyTo: cm.None[string](),
|
|
||||||
}
|
|
||||||
res := messagingConsumer.Publish(reply)
|
|
||||||
if res.IsErr() {
|
|
||||||
logger.Error("Failed to send reply", "error", *res.Err())
|
|
||||||
return res
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return cm.OK[cm.Result[string, struct{}, string]](struct{}{})
|
|
||||||
}
|
|
8
tools.go
8
tools.go
@ -1,8 +0,0 @@
|
|||||||
//go:build tools
|
|
||||||
|
|
||||||
package main
|
|
||||||
|
|
||||||
import (
|
|
||||||
_ "github.com/bytecodealliance/wasm-tools-go/cmd/wit-bindgen-go"
|
|
||||||
_ "go.wasmcloud.dev/wadge/cmd/wadge-bindgen-go"
|
|
||||||
)
|
|
47
wadm.yaml
47
wadm.yaml
@ -1,47 +0,0 @@
|
|||||||
apiVersion: core.oam.dev/v1beta1
|
|
||||||
kind: Application
|
|
||||||
metadata:
|
|
||||||
name: tinygo-hello-world
|
|
||||||
annotations:
|
|
||||||
description: 'HTTP hello world demo in Golang (TinyGo), using the WebAssembly Component Model and WebAssembly Interfaces Types (WIT)'
|
|
||||||
wasmcloud.dev/authors: wasmCloud team
|
|
||||||
wasmcloud.dev/source-url: https://github.com/wasmCloud/wasmCloud/blob/main/examples/golang/components/http-hello-world/wadm.yaml
|
|
||||||
wasmcloud.dev/readme-md-url: https://github.com/wasmCloud/wasmCloud/blob/main/examples/golang/components/http-hello-world/README.md
|
|
||||||
wasmcloud.dev/homepage: https://github.com/wasmCloud/wasmCloud/tree/main/examples/golang/components/http-hello-world
|
|
||||||
wasmcloud.dev/categories: |
|
|
||||||
http,outgoing-http,http-server,tinygo,golang,example
|
|
||||||
spec:
|
|
||||||
components:
|
|
||||||
- name: http-component
|
|
||||||
type: component
|
|
||||||
properties:
|
|
||||||
image: file://./build/http_hello_world_s.wasm
|
|
||||||
traits:
|
|
||||||
# Govern the spread/scheduling of the component
|
|
||||||
- type: spreadscaler
|
|
||||||
properties:
|
|
||||||
instances: 1
|
|
||||||
|
|
||||||
# Add a capability provider that enables HTTP access
|
|
||||||
- name: httpserver
|
|
||||||
type: capability
|
|
||||||
properties:
|
|
||||||
image: ghcr.io/wasmcloud/http-server:0.23.2
|
|
||||||
traits:
|
|
||||||
# Link the httpserver to the component, and configure the HTTP server
|
|
||||||
# to listen on port 8000 for incoming requests
|
|
||||||
#
|
|
||||||
# Since the HTTP server calls the `http-component` component, we establish
|
|
||||||
# a unidirectional link from this `httpserver` provider (the "source")
|
|
||||||
# to the `http-component` component (the "target"), so the server can invoke
|
|
||||||
# the component to handle a request.
|
|
||||||
- type: link
|
|
||||||
properties:
|
|
||||||
target: http-component
|
|
||||||
namespace: wasi
|
|
||||||
package: http
|
|
||||||
interfaces: [incoming-handler]
|
|
||||||
source_config:
|
|
||||||
- name: default-http
|
|
||||||
properties:
|
|
||||||
address: 127.0.0.1:8000
|
|
@ -1,21 +0,0 @@
|
|||||||
# This file is automatically generated.
|
|
||||||
# It is not intended for manual editing.
|
|
||||||
version = 1
|
|
||||||
|
|
||||||
[[packages]]
|
|
||||||
name = "wasmcloud:component-go"
|
|
||||||
registry = "wasmcloud.com"
|
|
||||||
|
|
||||||
[[packages.versions]]
|
|
||||||
requirement = "=0.1.0"
|
|
||||||
version = "0.1.0"
|
|
||||||
digest = "sha256:de3e9af7dedd0d9e882f68f1bee533c7af9c6a1947eb40cbf1ef6163b7d41784"
|
|
||||||
|
|
||||||
[[packages]]
|
|
||||||
name = "wasmcloud:messaging"
|
|
||||||
registry = "wasmcloud.com"
|
|
||||||
|
|
||||||
[[packages.versions]]
|
|
||||||
requirement = "=0.2.0"
|
|
||||||
version = "0.2.0"
|
|
||||||
digest = "sha256:bd2182f0a304b9a54a6b363f2f655422c8c0f00a03073c0195f1614a92dfdc7b"
|
|
@ -1,9 +0,0 @@
|
|||||||
name = "http-hello-world"
|
|
||||||
language = "tinygo"
|
|
||||||
type = "component"
|
|
||||||
version = "0.1.0"
|
|
||||||
|
|
||||||
[component]
|
|
||||||
wit_world = "hello"
|
|
||||||
wasm_target = "wasm32-wasip2"
|
|
||||||
destination = "build/http_hello_world_s.wasm"
|
|
@ -1,58 +0,0 @@
|
|||||||
package wasi:cli@0.2.0;
|
|
||||||
|
|
||||||
interface environment {
|
|
||||||
get-environment: func() -> list<tuple<string, string>>;
|
|
||||||
|
|
||||||
get-arguments: func() -> list<string>;
|
|
||||||
|
|
||||||
initial-cwd: func() -> option<string>;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface exit {
|
|
||||||
exit: func(status: result);
|
|
||||||
}
|
|
||||||
|
|
||||||
interface stdin {
|
|
||||||
use wasi:io/streams@0.2.0.{input-stream};
|
|
||||||
|
|
||||||
get-stdin: func() -> input-stream;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface stdout {
|
|
||||||
use wasi:io/streams@0.2.0.{output-stream};
|
|
||||||
|
|
||||||
get-stdout: func() -> output-stream;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface stderr {
|
|
||||||
use wasi:io/streams@0.2.0.{output-stream};
|
|
||||||
|
|
||||||
get-stderr: func() -> output-stream;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface terminal-input {
|
|
||||||
resource terminal-input;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface terminal-output {
|
|
||||||
resource terminal-output;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface terminal-stdin {
|
|
||||||
use terminal-input.{terminal-input};
|
|
||||||
|
|
||||||
get-terminal-stdin: func() -> option<terminal-input>;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface terminal-stdout {
|
|
||||||
use terminal-output.{terminal-output};
|
|
||||||
|
|
||||||
get-terminal-stdout: func() -> option<terminal-output>;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface terminal-stderr {
|
|
||||||
use terminal-output.{terminal-output};
|
|
||||||
|
|
||||||
get-terminal-stderr: func() -> option<terminal-output>;
|
|
||||||
}
|
|
||||||
|
|
@ -1,29 +0,0 @@
|
|||||||
package wasi:clocks@0.2.0;
|
|
||||||
|
|
||||||
interface monotonic-clock {
|
|
||||||
use wasi:io/poll@0.2.0.{pollable};
|
|
||||||
|
|
||||||
type instant = u64;
|
|
||||||
|
|
||||||
type duration = u64;
|
|
||||||
|
|
||||||
now: func() -> instant;
|
|
||||||
|
|
||||||
resolution: func() -> duration;
|
|
||||||
|
|
||||||
subscribe-instant: func(when: instant) -> pollable;
|
|
||||||
|
|
||||||
subscribe-duration: func(when: duration) -> pollable;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface wall-clock {
|
|
||||||
record datetime {
|
|
||||||
seconds: u64,
|
|
||||||
nanoseconds: u32,
|
|
||||||
}
|
|
||||||
|
|
||||||
now: func() -> datetime;
|
|
||||||
|
|
||||||
resolution: func() -> datetime;
|
|
||||||
}
|
|
||||||
|
|
@ -1,13 +0,0 @@
|
|||||||
package wasi:config@0.2.0-draft;
|
|
||||||
|
|
||||||
interface runtime {
|
|
||||||
variant config-error {
|
|
||||||
upstream(string),
|
|
||||||
io(string),
|
|
||||||
}
|
|
||||||
|
|
||||||
get: func(key: string) -> result<option<string>, config-error>;
|
|
||||||
|
|
||||||
get-all: func() -> result<list<tuple<string, string>>, config-error>;
|
|
||||||
}
|
|
||||||
|
|
@ -1,158 +0,0 @@
|
|||||||
package wasi:filesystem@0.2.0;
|
|
||||||
|
|
||||||
interface types {
|
|
||||||
use wasi:io/streams@0.2.0.{input-stream, output-stream, error};
|
|
||||||
use wasi:clocks/wall-clock@0.2.0.{datetime};
|
|
||||||
|
|
||||||
type filesize = u64;
|
|
||||||
|
|
||||||
enum descriptor-type {
|
|
||||||
unknown,
|
|
||||||
block-device,
|
|
||||||
character-device,
|
|
||||||
directory,
|
|
||||||
fifo,
|
|
||||||
symbolic-link,
|
|
||||||
regular-file,
|
|
||||||
socket,
|
|
||||||
}
|
|
||||||
|
|
||||||
flags descriptor-flags {
|
|
||||||
read,
|
|
||||||
write,
|
|
||||||
file-integrity-sync,
|
|
||||||
data-integrity-sync,
|
|
||||||
requested-write-sync,
|
|
||||||
mutate-directory,
|
|
||||||
}
|
|
||||||
|
|
||||||
flags path-flags {
|
|
||||||
symlink-follow,
|
|
||||||
}
|
|
||||||
|
|
||||||
flags open-flags {
|
|
||||||
create,
|
|
||||||
directory,
|
|
||||||
exclusive,
|
|
||||||
truncate,
|
|
||||||
}
|
|
||||||
|
|
||||||
type link-count = u64;
|
|
||||||
|
|
||||||
record descriptor-stat {
|
|
||||||
%type: descriptor-type,
|
|
||||||
link-count: link-count,
|
|
||||||
size: filesize,
|
|
||||||
data-access-timestamp: option<datetime>,
|
|
||||||
data-modification-timestamp: option<datetime>,
|
|
||||||
status-change-timestamp: option<datetime>,
|
|
||||||
}
|
|
||||||
|
|
||||||
variant new-timestamp {
|
|
||||||
no-change,
|
|
||||||
now,
|
|
||||||
timestamp(datetime),
|
|
||||||
}
|
|
||||||
|
|
||||||
record directory-entry {
|
|
||||||
%type: descriptor-type,
|
|
||||||
name: string,
|
|
||||||
}
|
|
||||||
|
|
||||||
enum error-code {
|
|
||||||
access,
|
|
||||||
would-block,
|
|
||||||
already,
|
|
||||||
bad-descriptor,
|
|
||||||
busy,
|
|
||||||
deadlock,
|
|
||||||
quota,
|
|
||||||
exist,
|
|
||||||
file-too-large,
|
|
||||||
illegal-byte-sequence,
|
|
||||||
in-progress,
|
|
||||||
interrupted,
|
|
||||||
invalid,
|
|
||||||
io,
|
|
||||||
is-directory,
|
|
||||||
loop,
|
|
||||||
too-many-links,
|
|
||||||
message-size,
|
|
||||||
name-too-long,
|
|
||||||
no-device,
|
|
||||||
no-entry,
|
|
||||||
no-lock,
|
|
||||||
insufficient-memory,
|
|
||||||
insufficient-space,
|
|
||||||
not-directory,
|
|
||||||
not-empty,
|
|
||||||
not-recoverable,
|
|
||||||
unsupported,
|
|
||||||
no-tty,
|
|
||||||
no-such-device,
|
|
||||||
overflow,
|
|
||||||
not-permitted,
|
|
||||||
pipe,
|
|
||||||
read-only,
|
|
||||||
invalid-seek,
|
|
||||||
text-file-busy,
|
|
||||||
cross-device,
|
|
||||||
}
|
|
||||||
|
|
||||||
enum advice {
|
|
||||||
normal,
|
|
||||||
sequential,
|
|
||||||
random,
|
|
||||||
will-need,
|
|
||||||
dont-need,
|
|
||||||
no-reuse,
|
|
||||||
}
|
|
||||||
|
|
||||||
record metadata-hash-value {
|
|
||||||
lower: u64,
|
|
||||||
upper: u64,
|
|
||||||
}
|
|
||||||
|
|
||||||
resource descriptor {
|
|
||||||
read-via-stream: func(offset: filesize) -> result<input-stream, error-code>;
|
|
||||||
write-via-stream: func(offset: filesize) -> result<output-stream, error-code>;
|
|
||||||
append-via-stream: func() -> result<output-stream, error-code>;
|
|
||||||
advise: func(offset: filesize, length: filesize, advice: advice) -> result<_, error-code>;
|
|
||||||
sync-data: func() -> result<_, error-code>;
|
|
||||||
get-flags: func() -> result<descriptor-flags, error-code>;
|
|
||||||
get-type: func() -> result<descriptor-type, error-code>;
|
|
||||||
set-size: func(size: filesize) -> result<_, error-code>;
|
|
||||||
set-times: func(data-access-timestamp: new-timestamp, data-modification-timestamp: new-timestamp) -> result<_, error-code>;
|
|
||||||
read: func(length: filesize, offset: filesize) -> result<tuple<list<u8>, bool>, error-code>;
|
|
||||||
write: func(buffer: list<u8>, offset: filesize) -> result<filesize, error-code>;
|
|
||||||
read-directory: func() -> result<directory-entry-stream, error-code>;
|
|
||||||
sync: func() -> result<_, error-code>;
|
|
||||||
create-directory-at: func(path: string) -> result<_, error-code>;
|
|
||||||
stat: func() -> result<descriptor-stat, error-code>;
|
|
||||||
stat-at: func(path-flags: path-flags, path: string) -> result<descriptor-stat, error-code>;
|
|
||||||
set-times-at: func(path-flags: path-flags, path: string, data-access-timestamp: new-timestamp, data-modification-timestamp: new-timestamp) -> result<_, error-code>;
|
|
||||||
link-at: func(old-path-flags: path-flags, old-path: string, new-descriptor: borrow<descriptor>, new-path: string) -> result<_, error-code>;
|
|
||||||
open-at: func(path-flags: path-flags, path: string, open-flags: open-flags, %flags: descriptor-flags) -> result<descriptor, error-code>;
|
|
||||||
readlink-at: func(path: string) -> result<string, error-code>;
|
|
||||||
remove-directory-at: func(path: string) -> result<_, error-code>;
|
|
||||||
rename-at: func(old-path: string, new-descriptor: borrow<descriptor>, new-path: string) -> result<_, error-code>;
|
|
||||||
symlink-at: func(old-path: string, new-path: string) -> result<_, error-code>;
|
|
||||||
unlink-file-at: func(path: string) -> result<_, error-code>;
|
|
||||||
is-same-object: func(other: borrow<descriptor>) -> bool;
|
|
||||||
metadata-hash: func() -> result<metadata-hash-value, error-code>;
|
|
||||||
metadata-hash-at: func(path-flags: path-flags, path: string) -> result<metadata-hash-value, error-code>;
|
|
||||||
}
|
|
||||||
|
|
||||||
resource directory-entry-stream {
|
|
||||||
read-directory-entry: func() -> result<option<directory-entry>, error-code>;
|
|
||||||
}
|
|
||||||
|
|
||||||
filesystem-error-code: func(err: borrow<error>) -> option<error-code>;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface preopens {
|
|
||||||
use types.{descriptor};
|
|
||||||
|
|
||||||
get-directories: func() -> list<tuple<descriptor, string>>;
|
|
||||||
}
|
|
||||||
|
|
@ -1,198 +0,0 @@
|
|||||||
package wasi:http@0.2.0;
|
|
||||||
|
|
||||||
interface types {
|
|
||||||
use wasi:clocks/monotonic-clock@0.2.0.{duration};
|
|
||||||
use wasi:io/streams@0.2.0.{input-stream, output-stream};
|
|
||||||
use wasi:io/error@0.2.0.{error as io-error};
|
|
||||||
use wasi:io/poll@0.2.0.{pollable};
|
|
||||||
|
|
||||||
variant method {
|
|
||||||
get,
|
|
||||||
head,
|
|
||||||
post,
|
|
||||||
put,
|
|
||||||
delete,
|
|
||||||
connect,
|
|
||||||
options,
|
|
||||||
trace,
|
|
||||||
patch,
|
|
||||||
other(string),
|
|
||||||
}
|
|
||||||
|
|
||||||
variant scheme {
|
|
||||||
HTTP,
|
|
||||||
HTTPS,
|
|
||||||
other(string),
|
|
||||||
}
|
|
||||||
|
|
||||||
record DNS-error-payload {
|
|
||||||
rcode: option<string>,
|
|
||||||
info-code: option<u16>,
|
|
||||||
}
|
|
||||||
|
|
||||||
record TLS-alert-received-payload {
|
|
||||||
alert-id: option<u8>,
|
|
||||||
alert-message: option<string>,
|
|
||||||
}
|
|
||||||
|
|
||||||
record field-size-payload {
|
|
||||||
field-name: option<string>,
|
|
||||||
field-size: option<u32>,
|
|
||||||
}
|
|
||||||
|
|
||||||
variant error-code {
|
|
||||||
DNS-timeout,
|
|
||||||
DNS-error(DNS-error-payload),
|
|
||||||
destination-not-found,
|
|
||||||
destination-unavailable,
|
|
||||||
destination-IP-prohibited,
|
|
||||||
destination-IP-unroutable,
|
|
||||||
connection-refused,
|
|
||||||
connection-terminated,
|
|
||||||
connection-timeout,
|
|
||||||
connection-read-timeout,
|
|
||||||
connection-write-timeout,
|
|
||||||
connection-limit-reached,
|
|
||||||
TLS-protocol-error,
|
|
||||||
TLS-certificate-error,
|
|
||||||
TLS-alert-received(TLS-alert-received-payload),
|
|
||||||
HTTP-request-denied,
|
|
||||||
HTTP-request-length-required,
|
|
||||||
HTTP-request-body-size(option<u64>),
|
|
||||||
HTTP-request-method-invalid,
|
|
||||||
HTTP-request-URI-invalid,
|
|
||||||
HTTP-request-URI-too-long,
|
|
||||||
HTTP-request-header-section-size(option<u32>),
|
|
||||||
HTTP-request-header-size(option<field-size-payload>),
|
|
||||||
HTTP-request-trailer-section-size(option<u32>),
|
|
||||||
HTTP-request-trailer-size(field-size-payload),
|
|
||||||
HTTP-response-incomplete,
|
|
||||||
HTTP-response-header-section-size(option<u32>),
|
|
||||||
HTTP-response-header-size(field-size-payload),
|
|
||||||
HTTP-response-body-size(option<u64>),
|
|
||||||
HTTP-response-trailer-section-size(option<u32>),
|
|
||||||
HTTP-response-trailer-size(field-size-payload),
|
|
||||||
HTTP-response-transfer-coding(option<string>),
|
|
||||||
HTTP-response-content-coding(option<string>),
|
|
||||||
HTTP-response-timeout,
|
|
||||||
HTTP-upgrade-failed,
|
|
||||||
HTTP-protocol-error,
|
|
||||||
loop-detected,
|
|
||||||
configuration-error,
|
|
||||||
internal-error(option<string>),
|
|
||||||
}
|
|
||||||
|
|
||||||
variant header-error {
|
|
||||||
invalid-syntax,
|
|
||||||
forbidden,
|
|
||||||
immutable,
|
|
||||||
}
|
|
||||||
|
|
||||||
type field-key = string;
|
|
||||||
|
|
||||||
type field-value = list<u8>;
|
|
||||||
|
|
||||||
resource fields {
|
|
||||||
constructor();
|
|
||||||
from-list: static func(entries: list<tuple<field-key, field-value>>) -> result<fields, header-error>;
|
|
||||||
get: func(name: field-key) -> list<field-value>;
|
|
||||||
has: func(name: field-key) -> bool;
|
|
||||||
set: func(name: field-key, value: list<field-value>) -> result<_, header-error>;
|
|
||||||
delete: func(name: field-key) -> result<_, header-error>;
|
|
||||||
append: func(name: field-key, value: field-value) -> result<_, header-error>;
|
|
||||||
entries: func() -> list<tuple<field-key, field-value>>;
|
|
||||||
clone: func() -> fields;
|
|
||||||
}
|
|
||||||
|
|
||||||
type headers = fields;
|
|
||||||
|
|
||||||
type trailers = fields;
|
|
||||||
|
|
||||||
resource incoming-request {
|
|
||||||
method: func() -> method;
|
|
||||||
path-with-query: func() -> option<string>;
|
|
||||||
scheme: func() -> option<scheme>;
|
|
||||||
authority: func() -> option<string>;
|
|
||||||
headers: func() -> headers;
|
|
||||||
consume: func() -> result<incoming-body>;
|
|
||||||
}
|
|
||||||
|
|
||||||
resource outgoing-request {
|
|
||||||
constructor(headers: headers);
|
|
||||||
body: func() -> result<outgoing-body>;
|
|
||||||
method: func() -> method;
|
|
||||||
set-method: func(method: method) -> result;
|
|
||||||
path-with-query: func() -> option<string>;
|
|
||||||
set-path-with-query: func(path-with-query: option<string>) -> result;
|
|
||||||
scheme: func() -> option<scheme>;
|
|
||||||
set-scheme: func(scheme: option<scheme>) -> result;
|
|
||||||
authority: func() -> option<string>;
|
|
||||||
set-authority: func(authority: option<string>) -> result;
|
|
||||||
headers: func() -> headers;
|
|
||||||
}
|
|
||||||
|
|
||||||
resource request-options {
|
|
||||||
constructor();
|
|
||||||
connect-timeout: func() -> option<duration>;
|
|
||||||
set-connect-timeout: func(duration: option<duration>) -> result;
|
|
||||||
first-byte-timeout: func() -> option<duration>;
|
|
||||||
set-first-byte-timeout: func(duration: option<duration>) -> result;
|
|
||||||
between-bytes-timeout: func() -> option<duration>;
|
|
||||||
set-between-bytes-timeout: func(duration: option<duration>) -> result;
|
|
||||||
}
|
|
||||||
|
|
||||||
resource response-outparam {
|
|
||||||
set: static func(param: response-outparam, response: result<outgoing-response, error-code>);
|
|
||||||
}
|
|
||||||
|
|
||||||
type status-code = u16;
|
|
||||||
|
|
||||||
resource incoming-response {
|
|
||||||
status: func() -> status-code;
|
|
||||||
headers: func() -> headers;
|
|
||||||
consume: func() -> result<incoming-body>;
|
|
||||||
}
|
|
||||||
|
|
||||||
resource incoming-body {
|
|
||||||
%stream: func() -> result<input-stream>;
|
|
||||||
finish: static func(this: incoming-body) -> future-trailers;
|
|
||||||
}
|
|
||||||
|
|
||||||
resource future-trailers {
|
|
||||||
subscribe: func() -> pollable;
|
|
||||||
get: func() -> option<result<result<option<trailers>, error-code>>>;
|
|
||||||
}
|
|
||||||
|
|
||||||
resource outgoing-response {
|
|
||||||
constructor(headers: headers);
|
|
||||||
status-code: func() -> status-code;
|
|
||||||
set-status-code: func(status-code: status-code) -> result;
|
|
||||||
headers: func() -> headers;
|
|
||||||
body: func() -> result<outgoing-body>;
|
|
||||||
}
|
|
||||||
|
|
||||||
resource outgoing-body {
|
|
||||||
write: func() -> result<output-stream>;
|
|
||||||
finish: static func(this: outgoing-body, trailers: option<trailers>) -> result<_, error-code>;
|
|
||||||
}
|
|
||||||
|
|
||||||
resource future-incoming-response {
|
|
||||||
subscribe: func() -> pollable;
|
|
||||||
get: func() -> option<result<result<incoming-response, error-code>>>;
|
|
||||||
}
|
|
||||||
|
|
||||||
http-error-code: func(err: borrow<io-error>) -> option<error-code>;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface incoming-handler {
|
|
||||||
use types.{incoming-request, response-outparam};
|
|
||||||
|
|
||||||
handle: func(request: incoming-request, response-out: response-outparam);
|
|
||||||
}
|
|
||||||
|
|
||||||
interface outgoing-handler {
|
|
||||||
use types.{outgoing-request, request-options, future-incoming-response, error-code};
|
|
||||||
|
|
||||||
handle: func(request: outgoing-request, options: option<request-options>) -> result<future-incoming-response, error-code>;
|
|
||||||
}
|
|
||||||
|
|
@ -1,48 +0,0 @@
|
|||||||
package wasi:io@0.2.0;
|
|
||||||
|
|
||||||
interface poll {
|
|
||||||
resource pollable {
|
|
||||||
ready: func() -> bool;
|
|
||||||
block: func();
|
|
||||||
}
|
|
||||||
|
|
||||||
poll: func(in: list<borrow<pollable>>) -> list<u32>;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface error {
|
|
||||||
resource error {
|
|
||||||
to-debug-string: func() -> string;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
interface streams {
|
|
||||||
use error.{error};
|
|
||||||
use poll.{pollable};
|
|
||||||
|
|
||||||
variant stream-error {
|
|
||||||
last-operation-failed(error),
|
|
||||||
closed,
|
|
||||||
}
|
|
||||||
|
|
||||||
resource input-stream {
|
|
||||||
read: func(len: u64) -> result<list<u8>, stream-error>;
|
|
||||||
blocking-read: func(len: u64) -> result<list<u8>, stream-error>;
|
|
||||||
skip: func(len: u64) -> result<u64, stream-error>;
|
|
||||||
blocking-skip: func(len: u64) -> result<u64, stream-error>;
|
|
||||||
subscribe: func() -> pollable;
|
|
||||||
}
|
|
||||||
|
|
||||||
resource output-stream {
|
|
||||||
check-write: func() -> result<u64, stream-error>;
|
|
||||||
write: func(contents: list<u8>) -> result<_, stream-error>;
|
|
||||||
blocking-write-and-flush: func(contents: list<u8>) -> result<_, stream-error>;
|
|
||||||
flush: func() -> result<_, stream-error>;
|
|
||||||
blocking-flush: func() -> result<_, stream-error>;
|
|
||||||
subscribe: func() -> pollable;
|
|
||||||
write-zeroes: func(len: u64) -> result<_, stream-error>;
|
|
||||||
blocking-write-zeroes-and-flush: func(len: u64) -> result<_, stream-error>;
|
|
||||||
splice: func(src: borrow<input-stream>, len: u64) -> result<u64, stream-error>;
|
|
||||||
blocking-splice: func(src: borrow<input-stream>, len: u64) -> result<u64, stream-error>;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
@ -1,15 +0,0 @@
|
|||||||
package wasi:logging@0.1.0-draft;
|
|
||||||
|
|
||||||
interface logging {
|
|
||||||
enum level {
|
|
||||||
trace,
|
|
||||||
debug,
|
|
||||||
info,
|
|
||||||
warn,
|
|
||||||
error,
|
|
||||||
critical,
|
|
||||||
}
|
|
||||||
|
|
||||||
log: func(level: level, context: string, message: string);
|
|
||||||
}
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
|||||||
package wasi:random@0.2.0;
|
|
||||||
|
|
||||||
interface random {
|
|
||||||
get-random-bytes: func(len: u64) -> list<u8>;
|
|
||||||
|
|
||||||
get-random-u64: func() -> u64;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface insecure {
|
|
||||||
get-insecure-random-bytes: func(len: u64) -> list<u8>;
|
|
||||||
|
|
||||||
get-insecure-random-u64: func() -> u64;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface insecure-seed {
|
|
||||||
insecure-seed: func() -> tuple<u64, u64>;
|
|
||||||
}
|
|
||||||
|
|
@ -1,179 +0,0 @@
|
|||||||
package wasi:sockets@0.2.0;
|
|
||||||
|
|
||||||
interface network {
|
|
||||||
resource network;
|
|
||||||
|
|
||||||
enum error-code {
|
|
||||||
unknown,
|
|
||||||
access-denied,
|
|
||||||
not-supported,
|
|
||||||
invalid-argument,
|
|
||||||
out-of-memory,
|
|
||||||
timeout,
|
|
||||||
concurrency-conflict,
|
|
||||||
not-in-progress,
|
|
||||||
would-block,
|
|
||||||
invalid-state,
|
|
||||||
new-socket-limit,
|
|
||||||
address-not-bindable,
|
|
||||||
address-in-use,
|
|
||||||
remote-unreachable,
|
|
||||||
connection-refused,
|
|
||||||
connection-reset,
|
|
||||||
connection-aborted,
|
|
||||||
datagram-too-large,
|
|
||||||
name-unresolvable,
|
|
||||||
temporary-resolver-failure,
|
|
||||||
permanent-resolver-failure,
|
|
||||||
}
|
|
||||||
|
|
||||||
enum ip-address-family {
|
|
||||||
ipv4,
|
|
||||||
ipv6,
|
|
||||||
}
|
|
||||||
|
|
||||||
type ipv4-address = tuple<u8, u8, u8, u8>;
|
|
||||||
|
|
||||||
type ipv6-address = tuple<u16, u16, u16, u16, u16, u16, u16, u16>;
|
|
||||||
|
|
||||||
variant ip-address {
|
|
||||||
ipv4(ipv4-address),
|
|
||||||
ipv6(ipv6-address),
|
|
||||||
}
|
|
||||||
|
|
||||||
record ipv4-socket-address {
|
|
||||||
port: u16,
|
|
||||||
address: ipv4-address,
|
|
||||||
}
|
|
||||||
|
|
||||||
record ipv6-socket-address {
|
|
||||||
port: u16,
|
|
||||||
flow-info: u32,
|
|
||||||
address: ipv6-address,
|
|
||||||
scope-id: u32,
|
|
||||||
}
|
|
||||||
|
|
||||||
variant ip-socket-address {
|
|
||||||
ipv4(ipv4-socket-address),
|
|
||||||
ipv6(ipv6-socket-address),
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
interface instance-network {
|
|
||||||
use network.{network};
|
|
||||||
|
|
||||||
instance-network: func() -> network;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface udp {
|
|
||||||
use wasi:io/poll@0.2.0.{pollable};
|
|
||||||
use network.{network, error-code, ip-socket-address, ip-address-family};
|
|
||||||
|
|
||||||
record incoming-datagram {
|
|
||||||
data: list<u8>,
|
|
||||||
remote-address: ip-socket-address,
|
|
||||||
}
|
|
||||||
|
|
||||||
record outgoing-datagram {
|
|
||||||
data: list<u8>,
|
|
||||||
remote-address: option<ip-socket-address>,
|
|
||||||
}
|
|
||||||
|
|
||||||
resource udp-socket {
|
|
||||||
start-bind: func(network: borrow<network>, local-address: ip-socket-address) -> result<_, error-code>;
|
|
||||||
finish-bind: func() -> result<_, error-code>;
|
|
||||||
%stream: func(remote-address: option<ip-socket-address>) -> result<tuple<incoming-datagram-stream, outgoing-datagram-stream>, error-code>;
|
|
||||||
local-address: func() -> result<ip-socket-address, error-code>;
|
|
||||||
remote-address: func() -> result<ip-socket-address, error-code>;
|
|
||||||
address-family: func() -> ip-address-family;
|
|
||||||
unicast-hop-limit: func() -> result<u8, error-code>;
|
|
||||||
set-unicast-hop-limit: func(value: u8) -> result<_, error-code>;
|
|
||||||
receive-buffer-size: func() -> result<u64, error-code>;
|
|
||||||
set-receive-buffer-size: func(value: u64) -> result<_, error-code>;
|
|
||||||
send-buffer-size: func() -> result<u64, error-code>;
|
|
||||||
set-send-buffer-size: func(value: u64) -> result<_, error-code>;
|
|
||||||
subscribe: func() -> pollable;
|
|
||||||
}
|
|
||||||
|
|
||||||
resource incoming-datagram-stream {
|
|
||||||
receive: func(max-results: u64) -> result<list<incoming-datagram>, error-code>;
|
|
||||||
subscribe: func() -> pollable;
|
|
||||||
}
|
|
||||||
|
|
||||||
resource outgoing-datagram-stream {
|
|
||||||
check-send: func() -> result<u64, error-code>;
|
|
||||||
send: func(datagrams: list<outgoing-datagram>) -> result<u64, error-code>;
|
|
||||||
subscribe: func() -> pollable;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
interface udp-create-socket {
|
|
||||||
use network.{network, error-code, ip-address-family};
|
|
||||||
use udp.{udp-socket};
|
|
||||||
|
|
||||||
create-udp-socket: func(address-family: ip-address-family) -> result<udp-socket, error-code>;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface tcp {
|
|
||||||
use wasi:io/streams@0.2.0.{input-stream, output-stream};
|
|
||||||
use wasi:io/poll@0.2.0.{pollable};
|
|
||||||
use wasi:clocks/monotonic-clock@0.2.0.{duration};
|
|
||||||
use network.{network, error-code, ip-socket-address, ip-address-family};
|
|
||||||
|
|
||||||
enum shutdown-type {
|
|
||||||
receive,
|
|
||||||
send,
|
|
||||||
both,
|
|
||||||
}
|
|
||||||
|
|
||||||
resource tcp-socket {
|
|
||||||
start-bind: func(network: borrow<network>, local-address: ip-socket-address) -> result<_, error-code>;
|
|
||||||
finish-bind: func() -> result<_, error-code>;
|
|
||||||
start-connect: func(network: borrow<network>, remote-address: ip-socket-address) -> result<_, error-code>;
|
|
||||||
finish-connect: func() -> result<tuple<input-stream, output-stream>, error-code>;
|
|
||||||
start-listen: func() -> result<_, error-code>;
|
|
||||||
finish-listen: func() -> result<_, error-code>;
|
|
||||||
accept: func() -> result<tuple<tcp-socket, input-stream, output-stream>, error-code>;
|
|
||||||
local-address: func() -> result<ip-socket-address, error-code>;
|
|
||||||
remote-address: func() -> result<ip-socket-address, error-code>;
|
|
||||||
is-listening: func() -> bool;
|
|
||||||
address-family: func() -> ip-address-family;
|
|
||||||
set-listen-backlog-size: func(value: u64) -> result<_, error-code>;
|
|
||||||
keep-alive-enabled: func() -> result<bool, error-code>;
|
|
||||||
set-keep-alive-enabled: func(value: bool) -> result<_, error-code>;
|
|
||||||
keep-alive-idle-time: func() -> result<duration, error-code>;
|
|
||||||
set-keep-alive-idle-time: func(value: duration) -> result<_, error-code>;
|
|
||||||
keep-alive-interval: func() -> result<duration, error-code>;
|
|
||||||
set-keep-alive-interval: func(value: duration) -> result<_, error-code>;
|
|
||||||
keep-alive-count: func() -> result<u32, error-code>;
|
|
||||||
set-keep-alive-count: func(value: u32) -> result<_, error-code>;
|
|
||||||
hop-limit: func() -> result<u8, error-code>;
|
|
||||||
set-hop-limit: func(value: u8) -> result<_, error-code>;
|
|
||||||
receive-buffer-size: func() -> result<u64, error-code>;
|
|
||||||
set-receive-buffer-size: func(value: u64) -> result<_, error-code>;
|
|
||||||
send-buffer-size: func() -> result<u64, error-code>;
|
|
||||||
set-send-buffer-size: func(value: u64) -> result<_, error-code>;
|
|
||||||
subscribe: func() -> pollable;
|
|
||||||
shutdown: func(shutdown-type: shutdown-type) -> result<_, error-code>;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
interface tcp-create-socket {
|
|
||||||
use network.{network, error-code, ip-address-family};
|
|
||||||
use tcp.{tcp-socket};
|
|
||||||
|
|
||||||
create-tcp-socket: func(address-family: ip-address-family) -> result<tcp-socket, error-code>;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface ip-name-lookup {
|
|
||||||
use wasi:io/poll@0.2.0.{pollable};
|
|
||||||
use network.{network, error-code, ip-address};
|
|
||||||
|
|
||||||
resource resolve-address-stream {
|
|
||||||
resolve-next-address: func() -> result<option<ip-address>, error-code>;
|
|
||||||
subscribe: func() -> pollable;
|
|
||||||
}
|
|
||||||
|
|
||||||
resolve-addresses: func(network: borrow<network>, name: string) -> result<resolve-address-stream, error-code>;
|
|
||||||
}
|
|
||||||
|
|
@ -1,10 +0,0 @@
|
|||||||
package wasmcloud:bus@1.0.0;
|
|
||||||
|
|
||||||
interface lattice {
|
|
||||||
resource call-target-interface {
|
|
||||||
constructor(namespace: string, %package: string, %interface: string);
|
|
||||||
}
|
|
||||||
|
|
||||||
set-link-name: func(name: string, interfaces: list<call-target-interface>);
|
|
||||||
}
|
|
||||||
|
|
@ -1,85 +0,0 @@
|
|||||||
package wasmcloud:component-go@0.1.0;
|
|
||||||
|
|
||||||
world exports {
|
|
||||||
import wasi:io/poll@0.2.0;
|
|
||||||
import wasi:clocks/monotonic-clock@0.2.0;
|
|
||||||
import wasi:io/error@0.2.0;
|
|
||||||
import wasi:io/streams@0.2.0;
|
|
||||||
import wasi:http/types@0.2.0;
|
|
||||||
|
|
||||||
export wasi:http/incoming-handler@0.2.0;
|
|
||||||
}
|
|
||||||
world imports {
|
|
||||||
import wasi:logging/logging@0.1.0-draft;
|
|
||||||
import wasi:config/runtime@0.2.0-draft;
|
|
||||||
import wasi:io/poll@0.2.0;
|
|
||||||
import wasi:clocks/monotonic-clock@0.2.0;
|
|
||||||
import wasi:io/error@0.2.0;
|
|
||||||
import wasi:io/streams@0.2.0;
|
|
||||||
import wasi:http/types@0.2.0;
|
|
||||||
import wasi:http/outgoing-handler@0.2.0;
|
|
||||||
import wasmcloud:bus/lattice@1.0.0;
|
|
||||||
import wasmcloud:secrets/store@0.1.0-draft;
|
|
||||||
import wasmcloud:secrets/reveal@0.1.0-draft;
|
|
||||||
import wasi:cli/environment@0.2.0;
|
|
||||||
import wasi:cli/exit@0.2.0;
|
|
||||||
import wasi:cli/stdin@0.2.0;
|
|
||||||
import wasi:cli/stdout@0.2.0;
|
|
||||||
import wasi:cli/stderr@0.2.0;
|
|
||||||
import wasi:cli/terminal-input@0.2.0;
|
|
||||||
import wasi:cli/terminal-output@0.2.0;
|
|
||||||
import wasi:cli/terminal-stdin@0.2.0;
|
|
||||||
import wasi:cli/terminal-stdout@0.2.0;
|
|
||||||
import wasi:cli/terminal-stderr@0.2.0;
|
|
||||||
import wasi:clocks/wall-clock@0.2.0;
|
|
||||||
import wasi:filesystem/types@0.2.0;
|
|
||||||
import wasi:filesystem/preopens@0.2.0;
|
|
||||||
import wasi:sockets/network@0.2.0;
|
|
||||||
import wasi:sockets/instance-network@0.2.0;
|
|
||||||
import wasi:sockets/udp@0.2.0;
|
|
||||||
import wasi:sockets/udp-create-socket@0.2.0;
|
|
||||||
import wasi:sockets/tcp@0.2.0;
|
|
||||||
import wasi:sockets/tcp-create-socket@0.2.0;
|
|
||||||
import wasi:sockets/ip-name-lookup@0.2.0;
|
|
||||||
import wasi:random/random@0.2.0;
|
|
||||||
import wasi:random/insecure@0.2.0;
|
|
||||||
import wasi:random/insecure-seed@0.2.0;
|
|
||||||
}
|
|
||||||
world sdk {
|
|
||||||
import wasi:io/poll@0.2.0;
|
|
||||||
import wasi:clocks/monotonic-clock@0.2.0;
|
|
||||||
import wasi:io/error@0.2.0;
|
|
||||||
import wasi:io/streams@0.2.0;
|
|
||||||
import wasi:http/types@0.2.0;
|
|
||||||
import wasi:logging/logging@0.1.0-draft;
|
|
||||||
import wasi:config/runtime@0.2.0-draft;
|
|
||||||
import wasi:http/outgoing-handler@0.2.0;
|
|
||||||
import wasmcloud:bus/lattice@1.0.0;
|
|
||||||
import wasmcloud:secrets/store@0.1.0-draft;
|
|
||||||
import wasmcloud:secrets/reveal@0.1.0-draft;
|
|
||||||
import wasi:cli/environment@0.2.0;
|
|
||||||
import wasi:cli/exit@0.2.0;
|
|
||||||
import wasi:cli/stdin@0.2.0;
|
|
||||||
import wasi:cli/stdout@0.2.0;
|
|
||||||
import wasi:cli/stderr@0.2.0;
|
|
||||||
import wasi:cli/terminal-input@0.2.0;
|
|
||||||
import wasi:cli/terminal-output@0.2.0;
|
|
||||||
import wasi:cli/terminal-stdin@0.2.0;
|
|
||||||
import wasi:cli/terminal-stdout@0.2.0;
|
|
||||||
import wasi:cli/terminal-stderr@0.2.0;
|
|
||||||
import wasi:clocks/wall-clock@0.2.0;
|
|
||||||
import wasi:filesystem/types@0.2.0;
|
|
||||||
import wasi:filesystem/preopens@0.2.0;
|
|
||||||
import wasi:sockets/network@0.2.0;
|
|
||||||
import wasi:sockets/instance-network@0.2.0;
|
|
||||||
import wasi:sockets/udp@0.2.0;
|
|
||||||
import wasi:sockets/udp-create-socket@0.2.0;
|
|
||||||
import wasi:sockets/tcp@0.2.0;
|
|
||||||
import wasi:sockets/tcp-create-socket@0.2.0;
|
|
||||||
import wasi:sockets/ip-name-lookup@0.2.0;
|
|
||||||
import wasi:random/random@0.2.0;
|
|
||||||
import wasi:random/insecure@0.2.0;
|
|
||||||
import wasi:random/insecure-seed@0.2.0;
|
|
||||||
|
|
||||||
export wasi:http/incoming-handler@0.2.0;
|
|
||||||
}
|
|
@ -1,29 +0,0 @@
|
|||||||
package wasmcloud:messaging@0.2.0;
|
|
||||||
|
|
||||||
/// Types common to message broker interactions
|
|
||||||
interface types {
|
|
||||||
/// A message sent to or received from a broker
|
|
||||||
record broker-message {
|
|
||||||
subject: string,
|
|
||||||
body: list<u8>,
|
|
||||||
reply-to: option<string>,
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
interface handler {
|
|
||||||
use types.{broker-message};
|
|
||||||
|
|
||||||
/// Callback handled to invoke a function when a message is received from a subscription
|
|
||||||
handle-message: func(msg: broker-message) -> result<_, string>;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface consumer {
|
|
||||||
use types.{broker-message};
|
|
||||||
|
|
||||||
/// Perform a request operation on a subject
|
|
||||||
request: func(subject: string, body: list<u8>, timeout-ms: u32) -> result<broker-message, string>;
|
|
||||||
|
|
||||||
/// Publish a message to a subject without awaiting a response
|
|
||||||
publish: func(msg: broker-message) -> result<_, string>;
|
|
||||||
}
|
|
||||||
|
|
@ -1,25 +0,0 @@
|
|||||||
package wasmcloud:secrets@0.1.0-draft;
|
|
||||||
|
|
||||||
interface store {
|
|
||||||
variant secrets-error {
|
|
||||||
upstream(string),
|
|
||||||
io(string),
|
|
||||||
not-found,
|
|
||||||
}
|
|
||||||
|
|
||||||
variant secret-value {
|
|
||||||
%string(string),
|
|
||||||
bytes(list<u8>),
|
|
||||||
}
|
|
||||||
|
|
||||||
resource secret;
|
|
||||||
|
|
||||||
get: func(key: string) -> result<secret, secrets-error>;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface reveal {
|
|
||||||
use store.{secret, secret-value};
|
|
||||||
|
|
||||||
reveal: func(s: borrow<secret>) -> secret-value;
|
|
||||||
}
|
|
||||||
|
|
@ -1,8 +0,0 @@
|
|||||||
package wasmcloud:hello;
|
|
||||||
|
|
||||||
world hello {
|
|
||||||
include wasmcloud:component-go/imports@0.1.0;
|
|
||||||
|
|
||||||
export wasmcloud:messaging/handler@0.2.0;
|
|
||||||
import wasmcloud:messaging/consumer@0.2.0;
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user