diff --git a/gen/wasi/config/runtime/runtime.wit.go b/gen/wasi/config/runtime/runtime.wit.go index 94bafca..182cdbf 100644 --- a/gen/wasi/config/runtime/runtime.wit.go +++ b/gen/wasi/config/runtime/runtime.wit.go @@ -9,8 +9,6 @@ import ( // ConfigError represents the variant "wasi:config/runtime@0.2.0-draft#config-error". // -// An error type that encapsulates the different errors that can occur fetching config -// // variant config-error { // upstream(string), // io(string), @@ -18,11 +16,6 @@ import ( type ConfigError cm.Variant[uint8, string, string] // ConfigErrorUpstream returns a [ConfigError] of case "upstream". -// -// This indicates an error from an "upstream" config source. -// As this could be almost _anything_ (such as Vault, Kubernetes ConfigMaps, KeyValue -// buckets, etc), -// the error message is a string. func ConfigErrorUpstream(data string) ConfigError { return cm.New[ConfigError](0, data) } @@ -33,14 +26,6 @@ func (self *ConfigError) Upstream() *string { } // ConfigErrorIO returns a [ConfigError] of case "io". -// -// This indicates an error from an I/O operation. -// As this could be almost _anything_ (such as a file read, network connection, etc), -// the error message is a string. -// Depending on how this ends up being consumed, -// we may consider moving this to use the `wasi:io/error` type instead. -// For simplicity right now in supporting multiple implementations, it is being left -// as a string. func ConfigErrorIO(data string) ConfigError { return cm.New[ConfigError](1, data) } @@ -62,8 +47,6 @@ func (v ConfigError) String() string { // Get represents the imported function "get". // -// Gets a single opaque config value set at the given key if it exists -// // get: func(key: string) -> result, config-error> // //go:nosplit @@ -75,8 +58,6 @@ func Get(key string) (result cm.Result[OptionStringShape, cm.Option[string], Con // GetAll represents the imported function "get-all". // -// Gets a list of all set config data -// // get-all: func() -> result>, config-error> // //go:nosplit diff --git a/gen/wasi/http/outgoing-handler/outgoing-handler.wit.go b/gen/wasi/http/outgoing-handler/outgoing-handler.wit.go index c76f73c..a2fdac9 100644 --- a/gen/wasi/http/outgoing-handler/outgoing-handler.wit.go +++ b/gen/wasi/http/outgoing-handler/outgoing-handler.wit.go @@ -1,9 +1,6 @@ // Code generated by wit-bindgen-go. DO NOT EDIT. // Package outgoinghandler represents the imported interface "wasi:http/outgoing-handler@0.2.0". -// -// This interface defines a handler of outgoing HTTP Requests. It should be -// imported by components which wish to make HTTP Requests. package outgoinghandler import ( @@ -33,17 +30,6 @@ type ErrorCode = types.ErrorCode // Handle represents the imported function "handle". // -// This function is invoked with an outgoing HTTP Request, and it returns -// a resource `future-incoming-response` which represents an HTTP Response -// which may arrive in the future. -// -// The `options` argument accepts optional parameters for the HTTP -// protocol's transport layer. -// -// This function may return an error if the `outgoing-request` is invalid -// or not allowed to be made. Otherwise, protocol errors are reported -// through the `future-incoming-response`. -// // handle: func(request: outgoing-request, options: option) -> result // diff --git a/gen/wasi/http/types/types.wit.go b/gen/wasi/http/types/types.wit.go index 4b53130..e6948c1 100644 --- a/gen/wasi/http/types/types.wit.go +++ b/gen/wasi/http/types/types.wit.go @@ -1,10 +1,6 @@ // Code generated by wit-bindgen-go. DO NOT EDIT. // Package types represents the imported interface "wasi:http/types@0.2.0". -// -// This interface defines all of the types and methods for implementing -// HTTP Requests and Responses, both incoming and outgoing, as well as -// their headers, trailers, and bodies. package types import ( @@ -42,8 +38,6 @@ type Pollable = poll.Pollable // Method represents the variant "wasi:http/types@0.2.0#method". // -// This type corresponds to HTTP standard Methods. -// // variant method { // get, // head, @@ -187,8 +181,6 @@ func (v Method) String() string { // Scheme represents the variant "wasi:http/types@0.2.0#scheme". // -// This type corresponds to HTTP standard Related Schemes. -// // variant scheme { // HTTP, // HTTPS, @@ -241,8 +233,6 @@ func (v Scheme) String() string { // DNSErrorPayload represents the record "wasi:http/types@0.2.0#DNS-error-payload". // -// Defines the case payload type for `DNS-error` above: -// // record DNS-error-payload { // rcode: option, // info-code: option, @@ -255,8 +245,6 @@ type DNSErrorPayload struct { // TLSAlertReceivedPayload represents the record "wasi:http/types@0.2.0#TLS-alert-received-payload". // -// Defines the case payload type for `TLS-alert-received` above: -// // record TLS-alert-received-payload { // alert-id: option, // alert-message: option, @@ -269,8 +257,6 @@ type TLSAlertReceivedPayload struct { // FieldSizePayload represents the record "wasi:http/types@0.2.0#field-size-payload". // -// Defines the case payload type for `HTTP-response-{header,trailer}-size` above: -// // record field-size-payload { // field-name: option, // field-size: option, @@ -283,9 +269,6 @@ type FieldSizePayload struct { // ErrorCode represents the variant "wasi:http/types@0.2.0#error-code". // -// These cases are inspired by the IANA HTTP Proxy Error Types: -// https://www.iana.org/assignments/http-proxy-status/http-proxy-status.xhtml#table-http-proxy-error-types -// // variant error-code { // DNS-timeout, // DNS-error(DNS-error-payload), @@ -734,12 +717,6 @@ func (self *ErrorCode) ConfigurationError() bool { } // ErrorCodeInternalError returns a [ErrorCode] of case "internal-error". -// -// This is a catch-all error for anything that doesn't fit cleanly into a -// more specific case. It also includes an optional string for an -// unstructured description of the error. Users should not depend on the -// string for diagnosing errors, as it's not required to be consistent -// between implementations. func ErrorCodeInternalError(data cm.Option[string]) ErrorCode { return cm.New[ErrorCode](38, data) } @@ -798,9 +775,6 @@ func (v ErrorCode) String() string { // HeaderError represents the variant "wasi:http/types@0.2.0#header-error". // -// This type enumerates the different kinds of errors that may occur when -// setting or appending to a `fields` resource. -// // variant header-error { // invalid-syntax, // forbidden, @@ -809,17 +783,8 @@ func (v ErrorCode) String() string { type HeaderError uint8 const ( - // This error indicates that a `field-key` or `field-value` was - // syntactically invalid when used with an operation that sets headers in a - // `fields`. HeaderErrorInvalidSyntax HeaderError = iota - - // This error indicates that a forbidden `field-key` was used when trying - // to set a header in a `fields`. HeaderErrorForbidden - - // This error indicates that the operation on the `fields` was not - // permitted because the fields are immutable. HeaderErrorImmutable ) @@ -836,33 +801,16 @@ func (e HeaderError) String() string { // FieldKey represents the string "wasi:http/types@0.2.0#field-key". // -// Field keys are always strings. -// // type field-key = string type FieldKey string // FieldValue represents the list "wasi:http/types@0.2.0#field-value". // -// Field values should always be ASCII strings. However, in -// reality, HTTP implementations often have to interpret malformed values, -// so they are provided as a list of bytes. -// // type field-value = list type FieldValue cm.List[uint8] // Fields represents the imported resource "wasi:http/types@0.2.0#fields". // -// This following block defines the `fields` resource which corresponds to -// HTTP standard Fields. Fields are a common representation used for both -// Headers and Trailers. -// -// A `fields` may be mutable or immutable. A `fields` created using the -// constructor, `from-list`, or `clone` will be mutable, but a `fields` -// resource given by other means (including, but not limited to, -// `incoming-request.headers`, `outgoing-request.headers`) might be be -// immutable. In an immutable fields, the `set`, `append`, and `delete` -// operations will fail with `header-error.immutable`. -// // resource fields type Fields cm.Resource @@ -879,10 +827,6 @@ func (self Fields) ResourceDrop() { // NewFields represents the imported constructor for resource "fields". // -// Construct an empty HTTP Fields. -// -// The resulting `fields` is mutable. -// // constructor() // //go:nosplit @@ -894,22 +838,6 @@ func NewFields() (result Fields) { // FieldsFromList represents the imported static function "from-list". // -// Construct an HTTP Fields. -// -// The resulting `fields` is mutable. -// -// The list represents each key-value pair in the Fields. Keys -// which have multiple values are represented by multiple entries in this -// list with the same key. -// -// The tuple is a pair of the field key, represented as a string, and -// Value, represented as a list of bytes. In a valid Fields, all keys -// and values are valid UTF-8 strings. However, values are not always -// well-formed, so they are represented as a raw list of bytes. -// -// An error result will be returned if any header or value was -// syntactically invalid, or if a header was forbidden. -// // from-list: static func(entries: list>) -> result // @@ -922,11 +850,6 @@ func FieldsFromList(entries cm.List[cm.Tuple[FieldKey, FieldValue]]) (result cm. // Append represents the imported method "append". // -// Append a value for a key. Does not change or delete any existing -// values for that key. -// -// Fails with `header-error.immutable` if the `fields` are immutable. -// // append: func(name: field-key, value: field-value) -> result<_, header-error> // //go:nosplit @@ -940,10 +863,6 @@ func (self Fields) Append(name FieldKey, value FieldValue) (result cm.Result[Hea // Clone represents the imported method "clone". // -// Make a deep copy of the Fields. Equivelant in behavior to calling the -// `fields` constructor on the return value of `entries`. The resulting -// `fields` is mutable. -// // clone: func() -> fields // //go:nosplit @@ -956,11 +875,6 @@ func (self Fields) Clone() (result Fields) { // Delete represents the imported method "delete". // -// Delete all values for a key. Does nothing if no values for the key -// exist. -// -// Fails with `header-error.immutable` if the `fields` are immutable. -// // delete: func(name: field-key) -> result<_, header-error> // //go:nosplit @@ -973,13 +887,6 @@ func (self Fields) Delete(name FieldKey) (result cm.Result[HeaderError, struct{} // Entries represents the imported method "entries". // -// Retrieve the full set of keys and values in the Fields. Like the -// constructor, the list represents each key-value pair. -// -// The outer list represents each key-value pair in the Fields. Keys -// which have multiple values are represented by multiple entries in this -// list with the same key. -// // entries: func() -> list> // //go:nosplit @@ -991,11 +898,6 @@ func (self Fields) Entries() (result cm.List[cm.Tuple[FieldKey, FieldValue]]) { // Get represents the imported method "get". // -// Get all of the values corresponding to a key. If the key is not present -// in this `fields`, an empty list is returned. However, if the key is -// present but empty, this is represented by a list with one or more -// empty field-values present. -// // get: func(name: field-key) -> list // //go:nosplit @@ -1008,9 +910,6 @@ func (self Fields) Get(name FieldKey) (result cm.List[FieldValue]) { // Has represents the imported method "has". // -// Returns `true` when the key is present in this `fields`. If the key is -// syntactically invalid, `false` is returned. -// // has: func(name: field-key) -> bool // //go:nosplit @@ -1024,11 +923,6 @@ func (self Fields) Has(name FieldKey) (result bool) { // Set represents the imported method "set". // -// Set all of the values for a key. Clears any existing values for that -// key, if they have been set. -// -// Fails with `header-error.immutable` if the `fields` are immutable. -// // set: func(name: field-key, value: list) -> result<_, header-error> // //go:nosplit @@ -1052,8 +946,6 @@ type Trailers = Fields // IncomingRequest represents the imported resource "wasi:http/types@0.2.0#incoming-request". // -// Represents an incoming HTTP Request. -// // resource incoming-request type IncomingRequest cm.Resource @@ -1070,8 +962,6 @@ func (self IncomingRequest) ResourceDrop() { // Authority represents the imported method "authority". // -// Returns the authority from the request, if it was present. -// // authority: func() -> option // //go:nosplit @@ -1083,9 +973,6 @@ func (self IncomingRequest) Authority() (result cm.Option[string]) { // Consume represents the imported method "consume". // -// Gives the `incoming-body` associated with this request. Will only -// return success at most once, and subsequent calls will return error. -// // consume: func() -> result // //go:nosplit @@ -1097,15 +984,6 @@ func (self IncomingRequest) Consume() (result cm.Result[IncomingBody, IncomingBo // Headers represents the imported method "headers". // -// Get the `headers` associated with the request. -// -// The returned `headers` resource is immutable: `set`, `append`, and -// `delete` operations will fail with `header-error.immutable`. -// -// The `headers` returned are a child resource: it must be dropped before -// the parent `incoming-request` is dropped. Dropping this -// `incoming-request` before all children are dropped will trap. -// // headers: func() -> headers // //go:nosplit @@ -1118,8 +996,6 @@ func (self IncomingRequest) Headers() (result Headers) { // Method represents the imported method "method". // -// Returns the method of the incoming request. -// // method: func() -> method // //go:nosplit @@ -1131,8 +1007,6 @@ func (self IncomingRequest) Method() (result Method) { // PathWithQuery represents the imported method "path-with-query". // -// Returns the path with query parameters from the request, as a string. -// // path-with-query: func() -> option // //go:nosplit @@ -1144,8 +1018,6 @@ func (self IncomingRequest) PathWithQuery() (result cm.Option[string]) { // Scheme represents the imported method "scheme". // -// Returns the protocol scheme from the request. -// // scheme: func() -> option // //go:nosplit @@ -1157,8 +1029,6 @@ func (self IncomingRequest) Scheme() (result cm.Option[Scheme]) { // OutgoingRequest represents the imported resource "wasi:http/types@0.2.0#outgoing-request". // -// Represents an outgoing HTTP Request. -// // resource outgoing-request type OutgoingRequest cm.Resource @@ -1175,17 +1045,6 @@ func (self OutgoingRequest) ResourceDrop() { // NewOutgoingRequest represents the imported constructor for resource "outgoing-request". // -// Construct a new `outgoing-request` with a default `method` of `GET`, and -// `none` values for `path-with-query`, `scheme`, and `authority`. -// -// * `headers` is the HTTP Headers for the Request. -// -// It is possible to construct, or manipulate with the accessor functions -// below, an `outgoing-request` with an invalid combination of `scheme` -// and `authority`, or `headers` which are not permitted to be sent. -// It is the obligation of the `outgoing-handler.handle` implementation -// to reject invalid constructions of `outgoing-request`. -// // constructor(headers: headers) // //go:nosplit @@ -1198,10 +1057,6 @@ func NewOutgoingRequest(headers Headers) (result OutgoingRequest) { // Authority represents the imported method "authority". // -// Get the HTTP Authority for the Request. A value of `none` may be used -// with Related Schemes which do not require an Authority. The HTTP and -// HTTPS schemes always require an authority. -// // authority: func() -> option // //go:nosplit @@ -1213,13 +1068,6 @@ func (self OutgoingRequest) Authority() (result cm.Option[string]) { // Body represents the imported method "body". // -// Returns the resource corresponding to the outgoing Body for this -// Request. -// -// Returns success on the first call: the `outgoing-body` resource for -// this `outgoing-request` can be retrieved at most once. Subsequent -// calls will return error. -// // body: func() -> result // //go:nosplit @@ -1231,15 +1079,6 @@ func (self OutgoingRequest) Body() (result cm.Result[OutgoingBody, OutgoingBody, // Headers represents the imported method "headers". // -// Get the headers associated with the Request. -// -// The returned `headers` resource is immutable: `set`, `append`, and -// `delete` operations will fail with `header-error.immutable`. -// -// This headers resource is a child: it must be dropped before the parent -// `outgoing-request` is dropped, or its ownership is transfered to -// another component by e.g. `outgoing-handler.handle`. -// // headers: func() -> headers // //go:nosplit @@ -1252,8 +1091,6 @@ func (self OutgoingRequest) Headers() (result Headers) { // Method represents the imported method "method". // -// Get the Method for the Request. -// // method: func() -> method // //go:nosplit @@ -1265,9 +1102,6 @@ func (self OutgoingRequest) Method() (result Method) { // PathWithQuery represents the imported method "path-with-query". // -// Get the combination of the HTTP Path and Query for the Request. -// When `none`, this represents an empty Path and empty Query. -// // path-with-query: func() -> option // //go:nosplit @@ -1279,9 +1113,6 @@ func (self OutgoingRequest) PathWithQuery() (result cm.Option[string]) { // Scheme represents the imported method "scheme". // -// Get the HTTP Related Scheme for the Request. When `none`, the -// implementation may choose an appropriate default scheme. -// // scheme: func() -> option // //go:nosplit @@ -1293,11 +1124,6 @@ func (self OutgoingRequest) Scheme() (result cm.Option[Scheme]) { // SetAuthority represents the imported method "set-authority". // -// Set the HTTP Authority for the Request. A value of `none` may be used -// with Related Schemes which do not require an Authority. The HTTP and -// HTTPS schemes always require an authority. Fails if the string given is -// not a syntactically valid uri authority. -// // set-authority: func(authority: option) -> result // //go:nosplit @@ -1311,9 +1137,6 @@ func (self OutgoingRequest) SetAuthority(authority cm.Option[string]) (result cm // SetMethod represents the imported method "set-method". // -// Set the Method for the Request. Fails if the string present in a -// `method.other` argument is not a syntactically valid method. -// // set-method: func(method: method) -> result // //go:nosplit @@ -1327,10 +1150,6 @@ func (self OutgoingRequest) SetMethod(method Method) (result cm.BoolResult) { // SetPathWithQuery represents the imported method "set-path-with-query". // -// Set the combination of the HTTP Path and Query for the Request. -// When `none`, this represents an empty Path and empty Query. Fails is the -// string given is not a syntactically valid path and query uri component. -// // set-path-with-query: func(path-with-query: option) -> result // //go:nosplit @@ -1344,10 +1163,6 @@ func (self OutgoingRequest) SetPathWithQuery(pathWithQuery cm.Option[string]) (r // SetScheme represents the imported method "set-scheme". // -// Set the HTTP Related Scheme for the Request. When `none`, the -// implementation may choose an appropriate default scheme. Fails if the -// string given is not a syntactically valid uri scheme. -// // set-scheme: func(scheme: option) -> result // //go:nosplit @@ -1361,13 +1176,6 @@ func (self OutgoingRequest) SetScheme(scheme cm.Option[Scheme]) (result cm.BoolR // RequestOptions represents the imported resource "wasi:http/types@0.2.0#request-options". // -// Parameters for making an HTTP Request. Each of these parameters is -// currently an optional timeout applicable to the transport layer of the -// HTTP protocol. -// -// These timeouts are separate from any the user may use to bound a -// blocking call to `wasi:io/poll.poll`. -// // resource request-options type RequestOptions cm.Resource @@ -1384,8 +1192,6 @@ func (self RequestOptions) ResourceDrop() { // NewRequestOptions represents the imported constructor for resource "request-options". // -// Construct a default `request-options` value. -// // constructor() // //go:nosplit @@ -1397,9 +1203,6 @@ func NewRequestOptions() (result RequestOptions) { // BetweenBytesTimeout represents the imported method "between-bytes-timeout". // -// The timeout for receiving subsequent chunks of bytes in the Response -// body stream. -// // between-bytes-timeout: func() -> option // //go:nosplit @@ -1411,8 +1214,6 @@ func (self RequestOptions) BetweenBytesTimeout() (result cm.Option[Duration]) { // ConnectTimeout represents the imported method "connect-timeout". // -// The timeout for the initial connect to the HTTP Server. -// // connect-timeout: func() -> option // //go:nosplit @@ -1424,8 +1225,6 @@ func (self RequestOptions) ConnectTimeout() (result cm.Option[Duration]) { // FirstByteTimeout represents the imported method "first-byte-timeout". // -// The timeout for receiving the first byte of the Response body. -// // first-byte-timeout: func() -> option // //go:nosplit @@ -1437,10 +1236,6 @@ func (self RequestOptions) FirstByteTimeout() (result cm.Option[Duration]) { // SetBetweenBytesTimeout represents the imported method "set-between-bytes-timeout". // -// Set the timeout for receiving subsequent chunks of bytes in the Response -// body stream. An error return value indicates that this timeout is not -// supported. -// // set-between-bytes-timeout: func(duration: option) -> result // //go:nosplit @@ -1454,9 +1249,6 @@ func (self RequestOptions) SetBetweenBytesTimeout(duration cm.Option[Duration]) // SetConnectTimeout represents the imported method "set-connect-timeout". // -// Set the timeout for the initial connect to the HTTP Server. An error -// return value indicates that this timeout is not supported. -// // set-connect-timeout: func(duration: option) -> result // //go:nosplit @@ -1470,9 +1262,6 @@ func (self RequestOptions) SetConnectTimeout(duration cm.Option[Duration]) (resu // SetFirstByteTimeout represents the imported method "set-first-byte-timeout". // -// Set the timeout for receiving the first byte of the Response body. An -// error return value indicates that this timeout is not supported. -// // set-first-byte-timeout: func(duration: option) -> result // //go:nosplit @@ -1486,12 +1275,6 @@ func (self RequestOptions) SetFirstByteTimeout(duration cm.Option[Duration]) (re // ResponseOutparam represents the imported resource "wasi:http/types@0.2.0#response-outparam". // -// Represents the ability to send an HTTP Response. -// -// This resource is used by the `wasi:http/incoming-handler` interface to -// allow a Response to be sent corresponding to the Request provided as the -// other argument to `incoming-handler.handle`. -// // resource response-outparam type ResponseOutparam cm.Resource @@ -1508,16 +1291,6 @@ func (self ResponseOutparam) ResourceDrop() { // ResponseOutparamSet represents the imported static function "set". // -// Set the value of the `response-outparam` to either send a response, -// or indicate an error. -// -// This method consumes the `response-outparam` to ensure that it is -// called at most once. If it is never called, the implementation -// will respond with an error. -// -// The user may provide an `error` to `response` to allow the -// implementation determine how to respond with an HTTP error response. -// // set: static func(param: response-outparam, response: result) // @@ -1531,15 +1304,11 @@ func ResponseOutparamSet(param ResponseOutparam, response cm.Result[ErrorCodeSha // StatusCode represents the u16 "wasi:http/types@0.2.0#status-code". // -// This type corresponds to the HTTP standard Status Code. -// // type status-code = u16 type StatusCode uint16 // IncomingResponse represents the imported resource "wasi:http/types@0.2.0#incoming-response". // -// Represents an incoming HTTP Response. -// // resource incoming-response type IncomingResponse cm.Resource @@ -1556,9 +1325,6 @@ func (self IncomingResponse) ResourceDrop() { // Consume represents the imported method "consume". // -// Returns the incoming body. May be called at most once. Returns error -// if called additional times. -// // consume: func() -> result // //go:nosplit @@ -1570,14 +1336,6 @@ func (self IncomingResponse) Consume() (result cm.Result[IncomingBody, IncomingB // Headers represents the imported method "headers". // -// Returns the headers from the incoming response. -// -// The returned `headers` resource is immutable: `set`, `append`, and -// `delete` operations will fail with `header-error.immutable`. -// -// This headers resource is a child: it must be dropped before the parent -// `incoming-response` is dropped. -// // headers: func() -> headers // //go:nosplit @@ -1590,8 +1348,6 @@ func (self IncomingResponse) Headers() (result Headers) { // Status represents the imported method "status". // -// Returns the status code from the incoming response. -// // status: func() -> status-code // //go:nosplit @@ -1604,15 +1360,6 @@ func (self IncomingResponse) Status() (result StatusCode) { // IncomingBody represents the imported resource "wasi:http/types@0.2.0#incoming-body". // -// Represents an incoming HTTP Request or Response's Body. -// -// A body has both its contents - a stream of bytes - and a (possibly -// empty) set of trailers, indicating that the full contents of the -// body have been received. This resource represents the contents as -// an `input-stream` and the delivery of trailers as a `future-trailers`, -// and ensures that the user of this interface may only be consuming either -// the body contents or waiting on trailers at any given time. -// // resource incoming-body type IncomingBody cm.Resource @@ -1629,9 +1376,6 @@ func (self IncomingBody) ResourceDrop() { // IncomingBodyFinish represents the imported static function "finish". // -// Takes ownership of `incoming-body`, and returns a `future-trailers`. -// This function will trap if the `input-stream` child is still alive. -// // finish: static func(this: incoming-body) -> future-trailers // //go:nosplit @@ -1644,22 +1388,6 @@ func IncomingBodyFinish(this IncomingBody) (result FutureTrailers) { // Stream represents the imported method "stream". // -// Returns the contents of the body, as a stream of bytes. -// -// Returns success on first call: the stream representing the contents -// can be retrieved at most once. Subsequent calls will return error. -// -// The returned `input-stream` resource is a child: it must be dropped -// before the parent `incoming-body` is dropped, or consumed by -// `incoming-body.finish`. -// -// This invariant ensures that the implementation can determine whether -// the user is consuming the contents of the body, waiting on the -// `future-trailers` to be ready, or neither. This allows for network -// backpressure is to be applied when the user is consuming the body, -// and for that backpressure to not inhibit delivery of the trailers if -// the user does not read the entire body. -// // %stream: func() -> result // //go:nosplit @@ -1671,12 +1399,6 @@ func (self IncomingBody) Stream() (result cm.Result[InputStream, InputStream, st // FutureTrailers represents the imported resource "wasi:http/types@0.2.0#future-trailers". // -// Represents a future which may eventaully return trailers, or an error. -// -// In the case that the incoming HTTP Request or Response did not have any -// trailers, this future will resolve to the empty set of trailers once the -// complete Request or Response body has been received. -// // resource future-trailers type FutureTrailers cm.Resource @@ -1693,26 +1415,6 @@ func (self FutureTrailers) ResourceDrop() { // Get represents the imported method "get". // -// Returns the contents of the trailers, or an error which occured, -// once the future is ready. -// -// The outer `option` represents future readiness. Users can wait on this -// `option` to become `some` using the `subscribe` method. -// -// The outer `result` is used to retrieve the trailers or error at most -// once. It will be success on the first call in which the outer option -// is `some`, and error on subsequent calls. -// -// The inner `result` represents that either the HTTP Request or Response -// body, as well as any trailers, were received successfully, or that an -// error occured receiving them. The optional `trailers` indicates whether -// or not trailers were present in the body. -// -// When some `trailers` are returned by this method, the `trailers` -// resource is immutable, and a child. Use of the `set`, `append`, or -// `delete` methods will return an error, and the resource must be -// dropped before the parent `future-trailers` is dropped. -// // get: func() -> option, error-code>>> // //go:nosplit @@ -1724,10 +1426,6 @@ func (self FutureTrailers) Get() (result cm.Option[cm.Result[cm.Result[ErrorCode // Subscribe represents the imported method "subscribe". // -// Returns a pollable which becomes ready when either the trailers have -// been received, or an error has occured. When this pollable is ready, -// the `get` method will return `some`. -// // subscribe: func() -> pollable // //go:nosplit @@ -1740,8 +1438,6 @@ func (self FutureTrailers) Subscribe() (result Pollable) { // OutgoingResponse represents the imported resource "wasi:http/types@0.2.0#outgoing-response". // -// Represents an outgoing HTTP Response. -// // resource outgoing-response type OutgoingResponse cm.Resource @@ -1758,12 +1454,6 @@ func (self OutgoingResponse) ResourceDrop() { // NewOutgoingResponse represents the imported constructor for resource "outgoing-response". // -// Construct an `outgoing-response`, with a default `status-code` of `200`. -// If a different `status-code` is needed, it must be set via the -// `set-status-code` method. -// -// * `headers` is the HTTP Headers for the Response. -// // constructor(headers: headers) // //go:nosplit @@ -1776,12 +1466,6 @@ func NewOutgoingResponse(headers Headers) (result OutgoingResponse) { // Body represents the imported method "body". // -// Returns the resource corresponding to the outgoing Body for this Response. -// -// Returns success on the first call: the `outgoing-body` resource for -// this `outgoing-response` can be retrieved at most once. Subsequent -// calls will return error. -// // body: func() -> result // //go:nosplit @@ -1793,15 +1477,6 @@ func (self OutgoingResponse) Body() (result cm.Result[OutgoingBody, OutgoingBody // Headers represents the imported method "headers". // -// Get the headers associated with the Request. -// -// The returned `headers` resource is immutable: `set`, `append`, and -// `delete` operations will fail with `header-error.immutable`. -// -// This headers resource is a child: it must be dropped before the parent -// `outgoing-request` is dropped, or its ownership is transfered to -// another component by e.g. `outgoing-handler.handle`. -// // headers: func() -> headers // //go:nosplit @@ -1814,9 +1489,6 @@ func (self OutgoingResponse) Headers() (result Headers) { // SetStatusCode represents the imported method "set-status-code". // -// Set the HTTP Status Code for the Response. Fails if the status-code -// given is not a valid http status code. -// // set-status-code: func(status-code: status-code) -> result // //go:nosplit @@ -1830,8 +1502,6 @@ func (self OutgoingResponse) SetStatusCode(statusCode StatusCode) (result cm.Boo // StatusCode represents the imported method "status-code". // -// Get the HTTP Status Code for the Response. -// // status-code: func() -> status-code // //go:nosplit @@ -1844,23 +1514,6 @@ func (self OutgoingResponse) StatusCode() (result StatusCode) { // OutgoingBody represents the imported resource "wasi:http/types@0.2.0#outgoing-body". // -// Represents an outgoing HTTP Request or Response's Body. -// -// A body has both its contents - a stream of bytes - and a (possibly -// empty) set of trailers, inducating the full contents of the body -// have been sent. This resource represents the contents as an -// `output-stream` child resource, and the completion of the body (with -// optional trailers) with a static function that consumes the -// `outgoing-body` resource, and ensures that the user of this interface -// may not write to the body contents after the body has been finished. -// -// If the user code drops this resource, as opposed to calling the static -// method `finish`, the implementation should treat the body as incomplete, -// and that an error has occured. The implementation should propogate this -// error to the HTTP protocol by whatever means it has available, -// including: corrupting the body on the wire, aborting the associated -// Request, or sending a late status code for the Response. -// // resource outgoing-body type OutgoingBody cm.Resource @@ -1877,16 +1530,6 @@ func (self OutgoingBody) ResourceDrop() { // OutgoingBodyFinish represents the imported static function "finish". // -// Finalize an outgoing body, optionally providing trailers. This must be -// called to signal that the response is complete. If the `outgoing-body` -// is dropped without calling `outgoing-body.finalize`, the implementation -// should treat the body as corrupted. -// -// Fails if the body's `outgoing-request` or `outgoing-response` was -// constructed with a Content-Length header, and the contents written -// to the body (via `write`) does not match the value given in the -// Content-Length. -// // finish: static func(this: outgoing-body, trailers: option) -> result<_, // error-code> // @@ -1900,16 +1543,6 @@ func OutgoingBodyFinish(this OutgoingBody, trailers cm.Option[Trailers]) (result // Write represents the imported method "write". // -// Returns a stream for writing the body contents. -// -// The returned `output-stream` is a child resource: it must be dropped -// before the parent `outgoing-body` resource is dropped (or finished), -// otherwise the `outgoing-body` drop or `finish` will trap. -// -// Returns success on the first call: the `output-stream` resource for -// this `outgoing-body` may be retrieved at most once. Subsequent calls -// will return error. -// // write: func() -> result // //go:nosplit @@ -1921,12 +1554,6 @@ func (self OutgoingBody) Write() (result cm.Result[OutputStream, OutputStream, s // FutureIncomingResponse represents the imported resource "wasi:http/types@0.2.0#future-incoming-response". // -// Represents a future which may eventaully return an incoming HTTP -// Response, or an error. -// -// This resource is returned by the `wasi:http/outgoing-handler` interface to -// provide the HTTP Response corresponding to the sent Request. -// // resource future-incoming-response type FutureIncomingResponse cm.Resource @@ -1943,21 +1570,6 @@ func (self FutureIncomingResponse) ResourceDrop() { // Get represents the imported method "get". // -// Returns the incoming HTTP Response, or an error, once one is ready. -// -// The outer `option` represents future readiness. Users can wait on this -// `option` to become `some` using the `subscribe` method. -// -// The outer `result` is used to retrieve the response or error at most -// once. It will be success on the first call in which the outer option -// is `some`, and error on subsequent calls. -// -// The inner `result` represents that either the incoming HTTP Response -// status and headers have recieved successfully, or that an error -// occured. Errors may also occur while consuming the response body, -// but those will be reported by the `incoming-body` and its -// `output-stream` child. -// // get: func() -> option>> // //go:nosplit @@ -1969,10 +1581,6 @@ func (self FutureIncomingResponse) Get() (result cm.Option[cm.Result[cm.Result[E // Subscribe represents the imported method "subscribe". // -// Returns a pollable which becomes ready when either the Response has -// been received, or an error has occured. When this pollable is ready, -// the `get` method will return `some`. -// // subscribe: func() -> pollable // //go:nosplit @@ -1985,18 +1593,6 @@ func (self FutureIncomingResponse) Subscribe() (result Pollable) { // HTTPErrorCode represents the imported function "http-error-code". // -// Attempts to extract a http-related `error` from the wasi:io `error` -// provided. -// -// Stream operations which return -// `wasi:io/stream/stream-error::last-operation-failed` have a payload of -// type `wasi:io/error/error` with more information about the operation -// that failed. This payload can be passed through to this function to see -// if there's http-related information about the error to return. -// -// Note that this function is fallible because not all io-errors are -// http-related errors. -// // http-error-code: func(err: borrow) -> option // //go:nosplit diff --git a/gen/wasmcloud/hello/hello/hello.wit b/gen/wasmcloud/hello/hello/hello.wit index 362155c..8456b65 100644 --- a/gen/wasmcloud/hello/hello/hello.wit +++ b/gen/wasmcloud/hello/hello/hello.wit @@ -2,10 +2,10 @@ package wasmcloud:component-go@0.1.0; package wasmcloud:hello { world hello { - import wasi:config/runtime@0.2.0-draft; import wasmcloud:messaging/types@0.2.0; import wasmcloud:messaging/consumer@0.2.0; 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; @@ -38,34 +38,87 @@ package wasmcloud:hello { 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; - export wasmcloud:messaging/handler@0.2.0; + } +} + +package wasi:cli@0.2.0 { + interface environment { + get-environment: func() -> list>; + get-arguments: func() -> list; + initial-cwd: func() -> option; + } + + 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; + } + + interface terminal-stdout { + use terminal-output.{terminal-output}; + get-terminal-stdout: func() -> option; + } + + interface terminal-stderr { + use terminal-output.{terminal-output}; + get-terminal-stderr: func() -> option; + } +} + +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; } } package wasi:config@0.2.0-draft { interface runtime { - /// An error type that encapsulates the different errors that can occur fetching config variant config-error { - /// This indicates an error from an "upstream" config source. - /// As this could be almost _anything_ (such as Vault, Kubernetes ConfigMaps, KeyValue - /// buckets, etc), - /// the error message is a string. upstream(string), - /// This indicates an error from an I/O operation. - /// As this could be almost _anything_ (such as a file read, network connection, etc), - /// the error message is a string. - /// Depending on how this ends up being consumed, - /// we may consider moving this to use the `wasi:io/error` type instead. - /// For simplicity right now in supporting multiple implementations, it is being left - /// as a string. io(string), } - - /// Gets a single opaque config value set at the given key if it exists get: func(key: string) -> result, config-error>; - - /// Gets a list of all set config data get-all: func() -> result>, config-error>; } } @@ -213,17 +266,12 @@ package wasi:filesystem@0.2.0 { } package wasi:http@0.2.0 { - /// This interface defines all of the types and methods for implementing - /// HTTP Requests and Responses, both incoming and outgoing, as well as - /// their headers, trailers, and bodies. interface types { use wasi:clocks/monotonic-clock@0.2.0.{duration}; use wasi:io/streams@0.2.0.{input-stream}; use wasi:io/streams@0.2.0.{output-stream}; use wasi:io/error@0.2.0.{error as io-error}; use wasi:io/poll@0.2.0.{pollable}; - - /// This type corresponds to HTTP standard Methods. variant method { get, head, @@ -236,30 +284,19 @@ package wasi:http@0.2.0 { patch, other(string), } - - /// This type corresponds to HTTP standard Related Schemes. variant scheme { HTTP, HTTPS, other(string) } - - /// Defines the case payload type for `DNS-error` above: record DNS-error-payload { rcode: option, info-code: option, } - - /// Defines the case payload type for `TLS-alert-received` above: record TLS-alert-received-payload { alert-id: option, alert-message: option, } - - /// Defines the case payload type for `HTTP-response-{header,trailer}-size` above: record field-size-payload { field-name: option, field-size: option, } - - /// These cases are inspired by the IANA HTTP Proxy Error Types: - /// https://www.iana.org/assignments/http-proxy-status/http-proxy-status.xhtml#table-http-proxy-error-types variant error-code { DNS-timeout, DNS-error(DNS-error-payload), @@ -299,568 +336,102 @@ package wasi:http@0.2.0 { HTTP-protocol-error, loop-detected, configuration-error, - /// This is a catch-all error for anything that doesn't fit cleanly into a - /// more specific case. It also includes an optional string for an - /// unstructured description of the error. Users should not depend on the - /// string for diagnosing errors, as it's not required to be consistent - /// between implementations. internal-error(option), } - - /// This type enumerates the different kinds of errors that may occur when - /// setting or appending to a `fields` resource. variant header-error { - /// This error indicates that a `field-key` or `field-value` was - /// syntactically invalid when used with an operation that sets headers in a - /// `fields`. invalid-syntax, - /// This error indicates that a forbidden `field-key` was used when trying - /// to set a header in a `fields`. forbidden, - /// This error indicates that the operation on the `fields` was not - /// permitted because the fields are immutable. immutable, } - - /// Field keys are always strings. type field-key = string; - - /// Field values should always be ASCII strings. However, in - /// reality, HTTP implementations often have to interpret malformed values, - /// so they are provided as a list of bytes. type field-value = list; - - /// This following block defines the `fields` resource which corresponds to - /// HTTP standard Fields. Fields are a common representation used for both - /// Headers and Trailers. - /// - /// A `fields` may be mutable or immutable. A `fields` created using the - /// constructor, `from-list`, or `clone` will be mutable, but a `fields` - /// resource given by other means (including, but not limited to, - /// `incoming-request.headers`, `outgoing-request.headers`) might be be - /// immutable. In an immutable fields, the `set`, `append`, and `delete` - /// operations will fail with `header-error.immutable`. resource fields { - /// Construct an empty HTTP Fields. - /// - /// The resulting `fields` is mutable. constructor(); - - /// Append a value for a key. Does not change or delete any existing - /// values for that key. - /// - /// Fails with `header-error.immutable` if the `fields` are immutable. append: func(name: field-key, value: field-value) -> result<_, header-error>; - - /// Make a deep copy of the Fields. Equivelant in behavior to calling the - /// `fields` constructor on the return value of `entries`. The resulting - /// `fields` is mutable. clone: func() -> fields; - - /// Delete all values for a key. Does nothing if no values for the key - /// exist. - /// - /// Fails with `header-error.immutable` if the `fields` are immutable. delete: func(name: field-key) -> result<_, header-error>; - - /// Retrieve the full set of keys and values in the Fields. Like the - /// constructor, the list represents each key-value pair. - /// - /// The outer list represents each key-value pair in the Fields. Keys - /// which have multiple values are represented by multiple entries in this - /// list with the same key. entries: func() -> list>; - - /// Get all of the values corresponding to a key. If the key is not present - /// in this `fields`, an empty list is returned. However, if the key is - /// present but empty, this is represented by a list with one or more - /// empty field-values present. get: func(name: field-key) -> list; - - /// Returns `true` when the key is present in this `fields`. If the key is - /// syntactically invalid, `false` is returned. has: func(name: field-key) -> bool; - - /// Set all of the values for a key. Clears any existing values for that - /// key, if they have been set. - /// - /// Fails with `header-error.immutable` if the `fields` are immutable. set: func(name: field-key, value: list) -> result<_, header-error>; - - /// Construct an HTTP Fields. - /// - /// The resulting `fields` is mutable. - /// - /// The list represents each key-value pair in the Fields. Keys - /// which have multiple values are represented by multiple entries in this - /// list with the same key. - /// - /// The tuple is a pair of the field key, represented as a string, and - /// Value, represented as a list of bytes. In a valid Fields, all keys - /// and values are valid UTF-8 strings. However, values are not always - /// well-formed, so they are represented as a raw list of bytes. - /// - /// An error result will be returned if any header or value was - /// syntactically invalid, or if a header was forbidden. from-list: static func(entries: list>) -> result; } - - /// Headers is an alias for Fields. type headers = fields; - - /// Trailers is an alias for Fields. type trailers = fields; - - /// Represents an incoming HTTP Request. resource incoming-request { - - /// Returns the authority from the request, if it was present. authority: func() -> option; - - /// Gives the `incoming-body` associated with this request. Will only - /// return success at most once, and subsequent calls will return error. consume: func() -> result; - - /// Get the `headers` associated with the request. - /// - /// The returned `headers` resource is immutable: `set`, `append`, and - /// `delete` operations will fail with `header-error.immutable`. - /// - /// The `headers` returned are a child resource: it must be dropped before - /// the parent `incoming-request` is dropped. Dropping this - /// `incoming-request` before all children are dropped will trap. headers: func() -> headers; - - /// Returns the method of the incoming request. method: func() -> method; - - /// Returns the path with query parameters from the request, as a string. path-with-query: func() -> option; - - /// Returns the protocol scheme from the request. scheme: func() -> option; } - - /// Represents an outgoing HTTP Request. resource outgoing-request { - /// Construct a new `outgoing-request` with a default `method` of `GET`, and - /// `none` values for `path-with-query`, `scheme`, and `authority`. - /// - /// * `headers` is the HTTP Headers for the Request. - /// - /// It is possible to construct, or manipulate with the accessor functions - /// below, an `outgoing-request` with an invalid combination of `scheme` - /// and `authority`, or `headers` which are not permitted to be sent. - /// It is the obligation of the `outgoing-handler.handle` implementation - /// to reject invalid constructions of `outgoing-request`. constructor(headers: headers); - - /// Get the HTTP Authority for the Request. A value of `none` may be used - /// with Related Schemes which do not require an Authority. The HTTP and - /// HTTPS schemes always require an authority. authority: func() -> option; - - /// Returns the resource corresponding to the outgoing Body for this - /// Request. - /// - /// Returns success on the first call: the `outgoing-body` resource for - /// this `outgoing-request` can be retrieved at most once. Subsequent - /// calls will return error. body: func() -> result; - - /// Get the headers associated with the Request. - /// - /// The returned `headers` resource is immutable: `set`, `append`, and - /// `delete` operations will fail with `header-error.immutable`. - /// - /// This headers resource is a child: it must be dropped before the parent - /// `outgoing-request` is dropped, or its ownership is transfered to - /// another component by e.g. `outgoing-handler.handle`. headers: func() -> headers; - - /// Get the Method for the Request. method: func() -> method; - - /// Get the combination of the HTTP Path and Query for the Request. - /// When `none`, this represents an empty Path and empty Query. path-with-query: func() -> option; - - /// Get the HTTP Related Scheme for the Request. When `none`, the - /// implementation may choose an appropriate default scheme. scheme: func() -> option; - - /// Set the HTTP Authority for the Request. A value of `none` may be used - /// with Related Schemes which do not require an Authority. The HTTP and - /// HTTPS schemes always require an authority. Fails if the string given is - /// not a syntactically valid uri authority. set-authority: func(authority: option) -> result; - - /// Set the Method for the Request. Fails if the string present in a - /// `method.other` argument is not a syntactically valid method. set-method: func(method: method) -> result; - - /// Set the combination of the HTTP Path and Query for the Request. - /// When `none`, this represents an empty Path and empty Query. Fails is the - /// string given is not a syntactically valid path and query uri component. set-path-with-query: func(path-with-query: option) -> result; - - /// Set the HTTP Related Scheme for the Request. When `none`, the - /// implementation may choose an appropriate default scheme. Fails if the - /// string given is not a syntactically valid uri scheme. set-scheme: func(scheme: option) -> result; } - - /// Parameters for making an HTTP Request. Each of these parameters is - /// currently an optional timeout applicable to the transport layer of the - /// HTTP protocol. - /// - /// These timeouts are separate from any the user may use to bound a - /// blocking call to `wasi:io/poll.poll`. resource request-options { - /// Construct a default `request-options` value. constructor(); - - /// The timeout for receiving subsequent chunks of bytes in the Response - /// body stream. between-bytes-timeout: func() -> option; - - /// The timeout for the initial connect to the HTTP Server. connect-timeout: func() -> option; - - /// The timeout for receiving the first byte of the Response body. first-byte-timeout: func() -> option; - - /// Set the timeout for receiving subsequent chunks of bytes in the Response - /// body stream. An error return value indicates that this timeout is not - /// supported. set-between-bytes-timeout: func(duration: option) -> result; - - /// Set the timeout for the initial connect to the HTTP Server. An error - /// return value indicates that this timeout is not supported. set-connect-timeout: func(duration: option) -> result; - - /// Set the timeout for receiving the first byte of the Response body. An - /// error return value indicates that this timeout is not supported. set-first-byte-timeout: func(duration: option) -> result; } - - /// Represents the ability to send an HTTP Response. - /// - /// This resource is used by the `wasi:http/incoming-handler` interface to - /// allow a Response to be sent corresponding to the Request provided as the - /// other argument to `incoming-handler.handle`. resource response-outparam { - - /// Set the value of the `response-outparam` to either send a response, - /// or indicate an error. - /// - /// This method consumes the `response-outparam` to ensure that it is - /// called at most once. If it is never called, the implementation - /// will respond with an error. - /// - /// The user may provide an `error` to `response` to allow the - /// implementation determine how to respond with an HTTP error response. set: static func(param: response-outparam, response: result); } - - /// This type corresponds to the HTTP standard Status Code. type status-code = u16; - - /// Represents an incoming HTTP Response. resource incoming-response { - - /// Returns the incoming body. May be called at most once. Returns error - /// if called additional times. consume: func() -> result; - - /// Returns the headers from the incoming response. - /// - /// The returned `headers` resource is immutable: `set`, `append`, and - /// `delete` operations will fail with `header-error.immutable`. - /// - /// This headers resource is a child: it must be dropped before the parent - /// `incoming-response` is dropped. headers: func() -> headers; - - /// Returns the status code from the incoming response. status: func() -> status-code; } - - /// Represents an incoming HTTP Request or Response's Body. - /// - /// A body has both its contents - a stream of bytes - and a (possibly - /// empty) set of trailers, indicating that the full contents of the - /// body have been received. This resource represents the contents as - /// an `input-stream` and the delivery of trailers as a `future-trailers`, - /// and ensures that the user of this interface may only be consuming either - /// the body contents or waiting on trailers at any given time. resource incoming-body { - - /// Returns the contents of the body, as a stream of bytes. - /// - /// Returns success on first call: the stream representing the contents - /// can be retrieved at most once. Subsequent calls will return error. - /// - /// The returned `input-stream` resource is a child: it must be dropped - /// before the parent `incoming-body` is dropped, or consumed by - /// `incoming-body.finish`. - /// - /// This invariant ensures that the implementation can determine whether - /// the user is consuming the contents of the body, waiting on the - /// `future-trailers` to be ready, or neither. This allows for network - /// backpressure is to be applied when the user is consuming the body, - /// and for that backpressure to not inhibit delivery of the trailers if - /// the user does not read the entire body. %stream: func() -> result; - - /// Takes ownership of `incoming-body`, and returns a `future-trailers`. - /// This function will trap if the `input-stream` child is still alive. finish: static func(this: incoming-body) -> future-trailers; } - - /// Represents a future which may eventaully return trailers, or an error. - /// - /// In the case that the incoming HTTP Request or Response did not have any - /// trailers, this future will resolve to the empty set of trailers once the - /// complete Request or Response body has been received. resource future-trailers { - - /// Returns the contents of the trailers, or an error which occured, - /// once the future is ready. - /// - /// The outer `option` represents future readiness. Users can wait on this - /// `option` to become `some` using the `subscribe` method. - /// - /// The outer `result` is used to retrieve the trailers or error at most - /// once. It will be success on the first call in which the outer option - /// is `some`, and error on subsequent calls. - /// - /// The inner `result` represents that either the HTTP Request or Response - /// body, as well as any trailers, were received successfully, or that an - /// error occured receiving them. The optional `trailers` indicates whether - /// or not trailers were present in the body. - /// - /// When some `trailers` are returned by this method, the `trailers` - /// resource is immutable, and a child. Use of the `set`, `append`, or - /// `delete` methods will return an error, and the resource must be - /// dropped before the parent `future-trailers` is dropped. get: func() -> option, error-code>>>; - - /// Returns a pollable which becomes ready when either the trailers have - /// been received, or an error has occured. When this pollable is ready, - /// the `get` method will return `some`. subscribe: func() -> pollable; } - - /// Represents an outgoing HTTP Response. resource outgoing-response { - /// Construct an `outgoing-response`, with a default `status-code` of `200`. - /// If a different `status-code` is needed, it must be set via the - /// `set-status-code` method. - /// - /// * `headers` is the HTTP Headers for the Response. constructor(headers: headers); - - /// Returns the resource corresponding to the outgoing Body for this Response. - /// - /// Returns success on the first call: the `outgoing-body` resource for - /// this `outgoing-response` can be retrieved at most once. Subsequent - /// calls will return error. body: func() -> result; - - /// Get the headers associated with the Request. - /// - /// The returned `headers` resource is immutable: `set`, `append`, and - /// `delete` operations will fail with `header-error.immutable`. - /// - /// This headers resource is a child: it must be dropped before the parent - /// `outgoing-request` is dropped, or its ownership is transfered to - /// another component by e.g. `outgoing-handler.handle`. headers: func() -> headers; - - /// Set the HTTP Status Code for the Response. Fails if the status-code - /// given is not a valid http status code. set-status-code: func(status-code: status-code) -> result; - - /// Get the HTTP Status Code for the Response. status-code: func() -> status-code; } - - /// Represents an outgoing HTTP Request or Response's Body. - /// - /// A body has both its contents - a stream of bytes - and a (possibly - /// empty) set of trailers, inducating the full contents of the body - /// have been sent. This resource represents the contents as an - /// `output-stream` child resource, and the completion of the body (with - /// optional trailers) with a static function that consumes the - /// `outgoing-body` resource, and ensures that the user of this interface - /// may not write to the body contents after the body has been finished. - /// - /// If the user code drops this resource, as opposed to calling the static - /// method `finish`, the implementation should treat the body as incomplete, - /// and that an error has occured. The implementation should propogate this - /// error to the HTTP protocol by whatever means it has available, - /// including: corrupting the body on the wire, aborting the associated - /// Request, or sending a late status code for the Response. resource outgoing-body { - - /// Returns a stream for writing the body contents. - /// - /// The returned `output-stream` is a child resource: it must be dropped - /// before the parent `outgoing-body` resource is dropped (or finished), - /// otherwise the `outgoing-body` drop or `finish` will trap. - /// - /// Returns success on the first call: the `output-stream` resource for - /// this `outgoing-body` may be retrieved at most once. Subsequent calls - /// will return error. write: func() -> result; - - /// Finalize an outgoing body, optionally providing trailers. This must be - /// called to signal that the response is complete. If the `outgoing-body` - /// is dropped without calling `outgoing-body.finalize`, the implementation - /// should treat the body as corrupted. - /// - /// Fails if the body's `outgoing-request` or `outgoing-response` was - /// constructed with a Content-Length header, and the contents written - /// to the body (via `write`) does not match the value given in the - /// Content-Length. finish: static func(this: outgoing-body, trailers: option) -> result<_, error-code>; } - - /// Represents a future which may eventaully return an incoming HTTP - /// Response, or an error. - /// - /// This resource is returned by the `wasi:http/outgoing-handler` interface to - /// provide the HTTP Response corresponding to the sent Request. resource future-incoming-response { - - /// Returns the incoming HTTP Response, or an error, once one is ready. - /// - /// The outer `option` represents future readiness. Users can wait on this - /// `option` to become `some` using the `subscribe` method. - /// - /// The outer `result` is used to retrieve the response or error at most - /// once. It will be success on the first call in which the outer option - /// is `some`, and error on subsequent calls. - /// - /// The inner `result` represents that either the incoming HTTP Response - /// status and headers have recieved successfully, or that an error - /// occured. Errors may also occur while consuming the response body, - /// but those will be reported by the `incoming-body` and its - /// `output-stream` child. get: func() -> option>>; - - /// Returns a pollable which becomes ready when either the Response has - /// been received, or an error has occured. When this pollable is ready, - /// the `get` method will return `some`. subscribe: func() -> pollable; } - - /// Attempts to extract a http-related `error` from the wasi:io `error` - /// provided. - /// - /// Stream operations which return - /// `wasi:io/stream/stream-error::last-operation-failed` have a payload of - /// type `wasi:io/error/error` with more information about the operation - /// that failed. This payload can be passed through to this function to see - /// if there's http-related information about the error to return. - /// - /// Note that this function is fallible because not all io-errors are - /// http-related errors. http-error-code: func(err: borrow) -> option; } - /// This interface defines a handler of incoming HTTP Requests. It should - /// be exported by components which can respond to HTTP Requests. - interface incoming-handler { - use types.{incoming-request}; - use types.{response-outparam}; - - /// This function is invoked with an incoming HTTP Request, and a resource - /// `response-outparam` which provides the capability to reply with an HTTP - /// Response. The response is sent by calling the `response-outparam.set` - /// method, which allows execution to continue after the response has been - /// sent. This enables both streaming to the response body, and performing other - /// work. - /// - /// The implementor of this function must write a response to the - /// `response-outparam` before returning, or else the caller will respond - /// with an error on its behalf. - handle: func(request: incoming-request, response-out: response-outparam); - } - - /// This interface defines a handler of outgoing HTTP Requests. It should be - /// imported by components which wish to make HTTP Requests. interface outgoing-handler { use types.{outgoing-request}; use types.{request-options}; use types.{future-incoming-response}; use types.{error-code}; - - /// This function is invoked with an outgoing HTTP Request, and it returns - /// a resource `future-incoming-response` which represents an HTTP Response - /// which may arrive in the future. - /// - /// The `options` argument accepts optional parameters for the HTTP - /// protocol's transport layer. - /// - /// This function may return an error if the `outgoing-request` is invalid - /// or not allowed to be made. Otherwise, protocol errors are reported - /// through the `future-incoming-response`. handle: func(request: outgoing-request, options: option) -> result; } } -package wasi:cli@0.2.0 { - 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 stdin { - use wasi:io/streams@0.2.0.{input-stream}; - get-stdin: func() -> input-stream; - } - - interface environment { - get-environment: func() -> list>; - get-arguments: func() -> list; - initial-cwd: func() -> option; - } - - interface exit { - exit: func(status: result); - } - - 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; - } - - interface terminal-stdout { - use terminal-output.{terminal-output}; - get-terminal-stdout: func() -> option; - } - - interface terminal-stderr { - use terminal-output.{terminal-output}; - get-terminal-stderr: func() -> option; - } -} - package wasi:io@0.2.0 { interface poll { resource pollable { @@ -1119,27 +690,6 @@ package wasi:sockets@0.2.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; - } -} - package wasmcloud:bus@1.0.0 { interface lattice { resource call-target-interface { @@ -1160,13 +710,6 @@ package wasmcloud:messaging@0.2.0 { } } - 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}; diff --git a/wadm.yaml b/wadm.yaml index 3e2de9a..7d30049 100644 --- a/wadm.yaml +++ b/wadm.yaml @@ -28,15 +28,6 @@ spec: - type: spreadscaler properties: instances: 1 - spread: - - name: cloud - weight: 0 - requirements: - host-type: cloud - - name: edge - weight: 100 - requirements: - host-type: edge - type: link properties: target: nats-producer @@ -52,13 +43,4 @@ spec: traits: - type: spreadscaler properties: - instances: 1 - spread: - - name: cloud - weight: 0 - requirements: - host-type: cloud - - name: edge - weight: 100 - requirements: - host-type: edge \ No newline at end of file + instances: 1 \ No newline at end of file diff --git a/wasmcloud.lock b/wasmcloud.lock index 2653f2e..fcf8406 100644 --- a/wasmcloud.lock +++ b/wasmcloud.lock @@ -2,24 +2,6 @@ # It is not intended for manual editing. version = 1 -[[packages]] -name = "wasi:config" -registry = "wasi.dev" - -[[packages.versions]] -requirement = "=0.2.0-draft" -version = "0.2.0-draft" -digest = "sha256:aa2d36d0843999edad80a13bf22f4529277f7b6012429f8a5d1f9499f3793c1a" - -[[packages]] -name = "wasi:http" -registry = "wasi.dev" - -[[packages.versions]] -requirement = "=0.2.0" -version = "0.2.0" -digest = "sha256:5a568e6e2d60c1ce51220e1833cdd5b88db9f615720edc762a9b4a6f36b383bd" - [[packages]] name = "wasi:logging" registry = "wasi.dev" diff --git a/wit/deps/wasi-cli-0.2.0/package.wit b/wit/deps/wasi-cli-0.2.0/package.wit index f8f1976..20147d0 100644 --- a/wit/deps/wasi-cli-0.2.0/package.wit +++ b/wit/deps/wasi-cli-0.2.0/package.wit @@ -1,23 +1,5 @@ package wasi:cli@0.2.0; -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 stdin { - use wasi:io/streams@0.2.0.{input-stream}; - - get-stdin: func() -> input-stream; -} - interface environment { get-environment: func() -> list>; @@ -30,6 +12,24 @@ 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; } diff --git a/wit/deps/wasi-config-0.2.0-draft/package.wit b/wit/deps/wasi-config-0.2.0-draft/package.wit index 7065b9b..d514554 100644 --- a/wit/deps/wasi-config-0.2.0-draft/package.wit +++ b/wit/deps/wasi-config-0.2.0-draft/package.wit @@ -1,28 +1,13 @@ package wasi:config@0.2.0-draft; interface runtime { - /// An error type that encapsulates the different errors that can occur fetching config variant config-error { - /// This indicates an error from an "upstream" config source. - /// As this could be almost _anything_ (such as Vault, Kubernetes ConfigMaps, KeyValue buckets, etc), - /// the error message is a string. upstream(string), - /// This indicates an error from an I/O operation. - /// As this could be almost _anything_ (such as a file read, network connection, etc), - /// the error message is a string. - /// Depending on how this ends up being consumed, - /// we may consider moving this to use the `wasi:io/error` type instead. - /// For simplicity right now in supporting multiple implementations, it is being left as a string. io(string), } - /// Gets a single opaque config value set at the given key if it exists get: func(key: string) -> result, config-error>; - /// Gets a list of all set config data get-all: func() -> result>, config-error>; } -world imports { - import runtime; -} diff --git a/wit/deps/wasi-http-0.2.0/package.wit b/wit/deps/wasi-http-0.2.0/package.wit index 11f7ff4..63031a8 100644 --- a/wit/deps/wasi-http-0.2.0/package.wit +++ b/wit/deps/wasi-http-0.2.0/package.wit @@ -1,15 +1,11 @@ package wasi:http@0.2.0; -/// This interface defines all of the types and methods for implementing -/// HTTP Requests and Responses, both incoming and outgoing, as well as -/// their headers, trailers, and bodies. 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}; - /// This type corresponds to HTTP standard Methods. variant method { get, head, @@ -23,33 +19,27 @@ interface types { other(string), } - /// This type corresponds to HTTP standard Related Schemes. variant scheme { HTTP, HTTPS, other(string), } - /// Defines the case payload type for `DNS-error` above: record DNS-error-payload { rcode: option, info-code: option, } - /// Defines the case payload type for `TLS-alert-received` above: record TLS-alert-received-payload { alert-id: option, alert-message: option, } - /// Defines the case payload type for `HTTP-response-{header,trailer}-size` above: record field-size-payload { field-name: option, field-size: option, } - /// These cases are inspired by the IANA HTTP Proxy Error Types: - /// https://www.iana.org/assignments/http-proxy-status/http-proxy-status.xhtml#table-http-proxy-error-types variant error-code { DNS-timeout, DNS-error(DNS-error-payload), @@ -89,483 +79,120 @@ interface types { HTTP-protocol-error, loop-detected, configuration-error, - /// This is a catch-all error for anything that doesn't fit cleanly into a - /// more specific case. It also includes an optional string for an - /// unstructured description of the error. Users should not depend on the - /// string for diagnosing errors, as it's not required to be consistent - /// between implementations. internal-error(option), } - /// This type enumerates the different kinds of errors that may occur when - /// setting or appending to a `fields` resource. variant header-error { - /// This error indicates that a `field-key` or `field-value` was - /// syntactically invalid when used with an operation that sets headers in a - /// `fields`. invalid-syntax, - /// This error indicates that a forbidden `field-key` was used when trying - /// to set a header in a `fields`. forbidden, - /// This error indicates that the operation on the `fields` was not - /// permitted because the fields are immutable. immutable, } - /// Field keys are always strings. type field-key = string; - /// Field values should always be ASCII strings. However, in - /// reality, HTTP implementations often have to interpret malformed values, - /// so they are provided as a list of bytes. type field-value = list; - /// This following block defines the `fields` resource which corresponds to - /// HTTP standard Fields. Fields are a common representation used for both - /// Headers and Trailers. - /// - /// A `fields` may be mutable or immutable. A `fields` created using the - /// constructor, `from-list`, or `clone` will be mutable, but a `fields` - /// resource given by other means (including, but not limited to, - /// `incoming-request.headers`, `outgoing-request.headers`) might be be - /// immutable. In an immutable fields, the `set`, `append`, and `delete` - /// operations will fail with `header-error.immutable`. resource fields { - /// Construct an empty HTTP Fields. - /// - /// The resulting `fields` is mutable. constructor(); - /// Construct an HTTP Fields. - /// - /// The resulting `fields` is mutable. - /// - /// The list represents each key-value pair in the Fields. Keys - /// which have multiple values are represented by multiple entries in this - /// list with the same key. - /// - /// The tuple is a pair of the field key, represented as a string, and - /// Value, represented as a list of bytes. In a valid Fields, all keys - /// and values are valid UTF-8 strings. However, values are not always - /// well-formed, so they are represented as a raw list of bytes. - /// - /// An error result will be returned if any header or value was - /// syntactically invalid, or if a header was forbidden. from-list: static func(entries: list>) -> result; - /// Get all of the values corresponding to a key. If the key is not present - /// in this `fields`, an empty list is returned. However, if the key is - /// present but empty, this is represented by a list with one or more - /// empty field-values present. get: func(name: field-key) -> list; - /// Returns `true` when the key is present in this `fields`. If the key is - /// syntactically invalid, `false` is returned. has: func(name: field-key) -> bool; - /// Set all of the values for a key. Clears any existing values for that - /// key, if they have been set. - /// - /// Fails with `header-error.immutable` if the `fields` are immutable. set: func(name: field-key, value: list) -> result<_, header-error>; - /// Delete all values for a key. Does nothing if no values for the key - /// exist. - /// - /// Fails with `header-error.immutable` if the `fields` are immutable. delete: func(name: field-key) -> result<_, header-error>; - /// Append a value for a key. Does not change or delete any existing - /// values for that key. - /// - /// Fails with `header-error.immutable` if the `fields` are immutable. append: func(name: field-key, value: field-value) -> result<_, header-error>; - /// Retrieve the full set of keys and values in the Fields. Like the - /// constructor, the list represents each key-value pair. - /// - /// The outer list represents each key-value pair in the Fields. Keys - /// which have multiple values are represented by multiple entries in this - /// list with the same key. entries: func() -> list>; - /// Make a deep copy of the Fields. Equivelant in behavior to calling the - /// `fields` constructor on the return value of `entries`. The resulting - /// `fields` is mutable. clone: func() -> fields; } - /// Headers is an alias for Fields. type headers = fields; - /// Trailers is an alias for Fields. type trailers = fields; - /// Represents an incoming HTTP Request. resource incoming-request { - /// Returns the method of the incoming request. method: func() -> method; - /// Returns the path with query parameters from the request, as a string. path-with-query: func() -> option; - /// Returns the protocol scheme from the request. scheme: func() -> option; - /// Returns the authority from the request, if it was present. authority: func() -> option; - /// Get the `headers` associated with the request. - /// - /// The returned `headers` resource is immutable: `set`, `append`, and - /// `delete` operations will fail with `header-error.immutable`. - /// - /// The `headers` returned are a child resource: it must be dropped before - /// the parent `incoming-request` is dropped. Dropping this - /// `incoming-request` before all children are dropped will trap. headers: func() -> headers; - /// Gives the `incoming-body` associated with this request. Will only - /// return success at most once, and subsequent calls will return error. consume: func() -> result; } - /// Represents an outgoing HTTP Request. resource outgoing-request { - /// Construct a new `outgoing-request` with a default `method` of `GET`, and - /// `none` values for `path-with-query`, `scheme`, and `authority`. - /// - /// * `headers` is the HTTP Headers for the Request. - /// - /// It is possible to construct, or manipulate with the accessor functions - /// below, an `outgoing-request` with an invalid combination of `scheme` - /// and `authority`, or `headers` which are not permitted to be sent. - /// It is the obligation of the `outgoing-handler.handle` implementation - /// to reject invalid constructions of `outgoing-request`. constructor(headers: headers); - /// Returns the resource corresponding to the outgoing Body for this - /// Request. - /// - /// Returns success on the first call: the `outgoing-body` resource for - /// this `outgoing-request` can be retrieved at most once. Subsequent - /// calls will return error. body: func() -> result; - /// Get the Method for the Request. method: func() -> method; - /// Set the Method for the Request. Fails if the string present in a - /// `method.other` argument is not a syntactically valid method. set-method: func(method: method) -> result; - /// Get the combination of the HTTP Path and Query for the Request. - /// When `none`, this represents an empty Path and empty Query. path-with-query: func() -> option; - /// Set the combination of the HTTP Path and Query for the Request. - /// When `none`, this represents an empty Path and empty Query. Fails is the - /// string given is not a syntactically valid path and query uri component. set-path-with-query: func(path-with-query: option) -> result; - /// Get the HTTP Related Scheme for the Request. When `none`, the - /// implementation may choose an appropriate default scheme. scheme: func() -> option; - /// Set the HTTP Related Scheme for the Request. When `none`, the - /// implementation may choose an appropriate default scheme. Fails if the - /// string given is not a syntactically valid uri scheme. set-scheme: func(scheme: option) -> result; - /// Get the HTTP Authority for the Request. A value of `none` may be used - /// with Related Schemes which do not require an Authority. The HTTP and - /// HTTPS schemes always require an authority. authority: func() -> option; - /// Set the HTTP Authority for the Request. A value of `none` may be used - /// with Related Schemes which do not require an Authority. The HTTP and - /// HTTPS schemes always require an authority. Fails if the string given is - /// not a syntactically valid uri authority. set-authority: func(authority: option) -> result; - /// Get the headers associated with the Request. - /// - /// The returned `headers` resource is immutable: `set`, `append`, and - /// `delete` operations will fail with `header-error.immutable`. - /// - /// This headers resource is a child: it must be dropped before the parent - /// `outgoing-request` is dropped, or its ownership is transfered to - /// another component by e.g. `outgoing-handler.handle`. headers: func() -> headers; } - /// Parameters for making an HTTP Request. Each of these parameters is - /// currently an optional timeout applicable to the transport layer of the - /// HTTP protocol. - /// - /// These timeouts are separate from any the user may use to bound a - /// blocking call to `wasi:io/poll.poll`. resource request-options { - /// Construct a default `request-options` value. constructor(); - /// The timeout for the initial connect to the HTTP Server. connect-timeout: func() -> option; - /// Set the timeout for the initial connect to the HTTP Server. An error - /// return value indicates that this timeout is not supported. set-connect-timeout: func(duration: option) -> result; - /// The timeout for receiving the first byte of the Response body. first-byte-timeout: func() -> option; - /// Set the timeout for receiving the first byte of the Response body. An - /// error return value indicates that this timeout is not supported. set-first-byte-timeout: func(duration: option) -> result; - /// The timeout for receiving subsequent chunks of bytes in the Response - /// body stream. between-bytes-timeout: func() -> option; - /// Set the timeout for receiving subsequent chunks of bytes in the Response - /// body stream. An error return value indicates that this timeout is not - /// supported. set-between-bytes-timeout: func(duration: option) -> result; } - /// Represents the ability to send an HTTP Response. - /// - /// This resource is used by the `wasi:http/incoming-handler` interface to - /// allow a Response to be sent corresponding to the Request provided as the - /// other argument to `incoming-handler.handle`. resource response-outparam { - /// Set the value of the `response-outparam` to either send a response, - /// or indicate an error. - /// - /// This method consumes the `response-outparam` to ensure that it is - /// called at most once. If it is never called, the implementation - /// will respond with an error. - /// - /// The user may provide an `error` to `response` to allow the - /// implementation determine how to respond with an HTTP error response. set: static func(param: response-outparam, response: result); } - /// This type corresponds to the HTTP standard Status Code. type status-code = u16; - /// Represents an incoming HTTP Response. resource incoming-response { - /// Returns the status code from the incoming response. status: func() -> status-code; - /// Returns the headers from the incoming response. - /// - /// The returned `headers` resource is immutable: `set`, `append`, and - /// `delete` operations will fail with `header-error.immutable`. - /// - /// This headers resource is a child: it must be dropped before the parent - /// `incoming-response` is dropped. headers: func() -> headers; - /// Returns the incoming body. May be called at most once. Returns error - /// if called additional times. consume: func() -> result; } - /// Represents an incoming HTTP Request or Response's Body. - /// - /// A body has both its contents - a stream of bytes - and a (possibly - /// empty) set of trailers, indicating that the full contents of the - /// body have been received. This resource represents the contents as - /// an `input-stream` and the delivery of trailers as a `future-trailers`, - /// and ensures that the user of this interface may only be consuming either - /// the body contents or waiting on trailers at any given time. resource incoming-body { - /// Returns the contents of the body, as a stream of bytes. - /// - /// Returns success on first call: the stream representing the contents - /// can be retrieved at most once. Subsequent calls will return error. - /// - /// The returned `input-stream` resource is a child: it must be dropped - /// before the parent `incoming-body` is dropped, or consumed by - /// `incoming-body.finish`. - /// - /// This invariant ensures that the implementation can determine whether - /// the user is consuming the contents of the body, waiting on the - /// `future-trailers` to be ready, or neither. This allows for network - /// backpressure is to be applied when the user is consuming the body, - /// and for that backpressure to not inhibit delivery of the trailers if - /// the user does not read the entire body. %stream: func() -> result; - /// Takes ownership of `incoming-body`, and returns a `future-trailers`. - /// This function will trap if the `input-stream` child is still alive. finish: static func(this: incoming-body) -> future-trailers; } - /// Represents a future which may eventaully return trailers, or an error. - /// - /// In the case that the incoming HTTP Request or Response did not have any - /// trailers, this future will resolve to the empty set of trailers once the - /// complete Request or Response body has been received. resource future-trailers { - /// Returns a pollable which becomes ready when either the trailers have - /// been received, or an error has occured. When this pollable is ready, - /// the `get` method will return `some`. subscribe: func() -> pollable; - /// Returns the contents of the trailers, or an error which occured, - /// once the future is ready. - /// - /// The outer `option` represents future readiness. Users can wait on this - /// `option` to become `some` using the `subscribe` method. - /// - /// The outer `result` is used to retrieve the trailers or error at most - /// once. It will be success on the first call in which the outer option - /// is `some`, and error on subsequent calls. - /// - /// The inner `result` represents that either the HTTP Request or Response - /// body, as well as any trailers, were received successfully, or that an - /// error occured receiving them. The optional `trailers` indicates whether - /// or not trailers were present in the body. - /// - /// When some `trailers` are returned by this method, the `trailers` - /// resource is immutable, and a child. Use of the `set`, `append`, or - /// `delete` methods will return an error, and the resource must be - /// dropped before the parent `future-trailers` is dropped. get: func() -> option, error-code>>>; } - /// Represents an outgoing HTTP Response. resource outgoing-response { - /// Construct an `outgoing-response`, with a default `status-code` of `200`. - /// If a different `status-code` is needed, it must be set via the - /// `set-status-code` method. - /// - /// * `headers` is the HTTP Headers for the Response. constructor(headers: headers); - /// Get the HTTP Status Code for the Response. status-code: func() -> status-code; - /// Set the HTTP Status Code for the Response. Fails if the status-code - /// given is not a valid http status code. set-status-code: func(status-code: status-code) -> result; - /// Get the headers associated with the Request. - /// - /// The returned `headers` resource is immutable: `set`, `append`, and - /// `delete` operations will fail with `header-error.immutable`. - /// - /// This headers resource is a child: it must be dropped before the parent - /// `outgoing-request` is dropped, or its ownership is transfered to - /// another component by e.g. `outgoing-handler.handle`. headers: func() -> headers; - /// Returns the resource corresponding to the outgoing Body for this Response. - /// - /// Returns success on the first call: the `outgoing-body` resource for - /// this `outgoing-response` can be retrieved at most once. Subsequent - /// calls will return error. body: func() -> result; } - /// Represents an outgoing HTTP Request or Response's Body. - /// - /// A body has both its contents - a stream of bytes - and a (possibly - /// empty) set of trailers, inducating the full contents of the body - /// have been sent. This resource represents the contents as an - /// `output-stream` child resource, and the completion of the body (with - /// optional trailers) with a static function that consumes the - /// `outgoing-body` resource, and ensures that the user of this interface - /// may not write to the body contents after the body has been finished. - /// - /// If the user code drops this resource, as opposed to calling the static - /// method `finish`, the implementation should treat the body as incomplete, - /// and that an error has occured. The implementation should propogate this - /// error to the HTTP protocol by whatever means it has available, - /// including: corrupting the body on the wire, aborting the associated - /// Request, or sending a late status code for the Response. resource outgoing-body { - /// Returns a stream for writing the body contents. - /// - /// The returned `output-stream` is a child resource: it must be dropped - /// before the parent `outgoing-body` resource is dropped (or finished), - /// otherwise the `outgoing-body` drop or `finish` will trap. - /// - /// Returns success on the first call: the `output-stream` resource for - /// this `outgoing-body` may be retrieved at most once. Subsequent calls - /// will return error. write: func() -> result; - /// Finalize an outgoing body, optionally providing trailers. This must be - /// called to signal that the response is complete. If the `outgoing-body` - /// is dropped without calling `outgoing-body.finalize`, the implementation - /// should treat the body as corrupted. - /// - /// Fails if the body's `outgoing-request` or `outgoing-response` was - /// constructed with a Content-Length header, and the contents written - /// to the body (via `write`) does not match the value given in the - /// Content-Length. finish: static func(this: outgoing-body, trailers: option) -> result<_, error-code>; } - /// Represents a future which may eventaully return an incoming HTTP - /// Response, or an error. - /// - /// This resource is returned by the `wasi:http/outgoing-handler` interface to - /// provide the HTTP Response corresponding to the sent Request. resource future-incoming-response { - /// Returns a pollable which becomes ready when either the Response has - /// been received, or an error has occured. When this pollable is ready, - /// the `get` method will return `some`. subscribe: func() -> pollable; - /// Returns the incoming HTTP Response, or an error, once one is ready. - /// - /// The outer `option` represents future readiness. Users can wait on this - /// `option` to become `some` using the `subscribe` method. - /// - /// The outer `result` is used to retrieve the response or error at most - /// once. It will be success on the first call in which the outer option - /// is `some`, and error on subsequent calls. - /// - /// The inner `result` represents that either the incoming HTTP Response - /// status and headers have recieved successfully, or that an error - /// occured. Errors may also occur while consuming the response body, - /// but those will be reported by the `incoming-body` and its - /// `output-stream` child. get: func() -> option>>; } - /// Attempts to extract a http-related `error` from the wasi:io `error` - /// provided. - /// - /// Stream operations which return - /// `wasi:io/stream/stream-error::last-operation-failed` have a payload of - /// type `wasi:io/error/error` with more information about the operation - /// that failed. This payload can be passed through to this function to see - /// if there's http-related information about the error to return. - /// - /// Note that this function is fallible because not all io-errors are - /// http-related errors. http-error-code: func(err: borrow) -> option; } -/// This interface defines a handler of incoming HTTP Requests. It should -/// be exported by components which can respond to HTTP Requests. interface incoming-handler { use types.{incoming-request, response-outparam}; - /// This function is invoked with an incoming HTTP Request, and a resource - /// `response-outparam` which provides the capability to reply with an HTTP - /// Response. The response is sent by calling the `response-outparam.set` - /// method, which allows execution to continue after the response has been - /// sent. This enables both streaming to the response body, and performing other - /// work. - /// - /// The implementor of this function must write a response to the - /// `response-outparam` before returning, or else the caller will respond - /// with an error on its behalf. handle: func(request: incoming-request, response-out: response-outparam); } -/// This interface defines a handler of outgoing HTTP Requests. It should be -/// imported by components which wish to make HTTP Requests. interface outgoing-handler { use types.{outgoing-request, request-options, future-incoming-response, error-code}; - /// This function is invoked with an outgoing HTTP Request, and it returns - /// a resource `future-incoming-response` which represents an HTTP Response - /// which may arrive in the future. - /// - /// The `options` argument accepts optional parameters for the HTTP - /// protocol's transport layer. - /// - /// This function may return an error if the `outgoing-request` is invalid - /// or not allowed to be made. Otherwise, protocol errors are reported - /// through the `future-incoming-response`. handle: func(request: outgoing-request, options: option) -> result; } -/// The `wasi:http/proxy` world captures a widely-implementable intersection of -/// hosts that includes HTTP forward and reverse proxies. Components targeting -/// this world may concurrently stream in and out any number of incoming and -/// outgoing HTTP requests. -world proxy { - import wasi:random/random@0.2.0; - import wasi:io/error@0.2.0; - import wasi:io/poll@0.2.0; - import wasi:io/streams@0.2.0; - import wasi:cli/stdout@0.2.0; - import wasi:cli/stderr@0.2.0; - import wasi:cli/stdin@0.2.0; - import wasi:clocks/monotonic-clock@0.2.0; - import types; - import outgoing-handler; - import wasi:clocks/wall-clock@0.2.0; - - export incoming-handler; -} diff --git a/wit/world.wit b/wit/world.wit index a78258c..64d3bda 100644 --- a/wit/world.wit +++ b/wit/world.wit @@ -3,11 +3,6 @@ package wasmcloud:hello; world hello { include wasmcloud:component-go/imports@0.1.0; - import wasi:config/runtime@0.2.0-draft; - - export wasi:http/incoming-handler@0.2.0; - - export wasmcloud:messaging/handler@0.2.0; import wasmcloud:messaging/consumer@0.2.0; import wasi:logging/logging@0.1.0-draft; }