The messaging-service
world is a world that exports a single
asyncrhonous messaging handler that can be used to
handle incoming messages from some message broker provider,
and a set of capabilities that can be used to interact with
the platform / runtime.
wasi:io/error@0.2.0
wasi:io/poll@0.2.0
wasi:io/streams@0.2.0
wasi:keyvalue/wasi-keyvalue-error@0.2.0-draft
wasi:keyvalue/types@0.2.0-draft
wasi:keyvalue/eventual@0.2.0-draft
wasi:keyvalue/atomic@0.2.0-draft
wasi:keyvalue/eventual-batch@0.2.0-draft
wasi:blobstore/types@0.2.0-draft
wasi:blobstore/container@0.2.0-draft
wasi:blobstore/blobstore@0.2.0-draft
wasi:messaging/messaging-types@0.2.0-draft
wasi:messaging/producer@0.2.0-draft
wasi:messaging/consumer@0.2.0-draft
wasi:sql/types@0.2.0-draft
wasi:sql/readwrite@0.2.0-draft
wasi:config/runtime@0.2.0-draft
wasi:random/random@0.2.0
wasi:cli/stdout@0.2.0
wasi:cli/stderr@0.2.0
wasi:cli/stdin@0.2.0
wasi:clocks/monotonic-clock@0.2.0
wasi:http/types@0.2.0
wasi:http/outgoing-handler@0.2.0
wasi:clocks/wall-clock@0.2.0
resource error
A resource which represents some error information.
The only method provided by this resource is to-debug-string
,
which provides some human-readable information about the error.
In the wasi:io
package, this resource is returned through the
wasi:io/streams/stream-error
type.
To provide more specific error information, other interfaces may
provide functions to further "downcast" this error into more specific
error information. For example, error
s returned in streams derived
from filesystem types to be described using the filesystem's own
error-code type, using the function
wasi:filesystem/types/filesystem-error-code
, which takes a parameter
borrow<error>
and returns
option<wasi:filesystem/types/error-code>
.
error
into a more
concrete type is open.[method]error.to-debug-string: func
Returns a string that is suitable to assist humans in debugging this error.
WARNING: The returned string should not be consumed mechanically! It may change across platforms, hosts, or other implementation details. Parsing this string is a major platform-compatibility hazard.
self
: borrow<error
>A poll API intended to let users wait for I/O events on multiple handles at once.
resource pollable
pollable
represents a single I/O event which may be ready, or not.[method]pollable.ready: func
Return the readiness of a pollable. This function never blocks.
Returns true
when the pollable is ready, and false
otherwise.
self
: borrow<pollable
>[method]pollable.block: func
block
returns immediately if the pollable is ready, and otherwise
blocks until ready.
This function is equivalent to calling poll.poll
on a list
containing only this pollable.
self
: borrow<pollable
>poll: func
Poll for completion on a set of pollables.
This function takes a list of pollables, which identify I/O sources of interest, and waits until one or more of the events is ready for I/O.
The result list<u32>
contains one or more indices of handles in the
argument list that is ready for I/O.
If the list contains more elements than can be indexed with a u32
value, this function traps.
A timeout can be implemented by adding a pollable from the wasi-clocks API to the list.
This function does not return a result
; polling in itself does not
do any I/O so it doesn't fail. If any of the I/O sources identified by
the pollables has an error, it is indicated by marking the source as
being reaedy for I/O.
in
: list<borrow<pollable
>>WASI I/O is an I/O abstraction API which is currently focused on providing stream types.
In the future, the component model is expected to add built-in stream types; when it does, they are expected to subsume this API.
type error
#### `type pollable` [`pollable`](#pollable)
An error for input-stream and output-stream operations.
last-operation-failed
: own<error
>
The last operation (a write or flush) failed before completion.
More information is available in the error
payload.
The stream is closed: no more input will be accepted by the stream. A closed output-stream will return this error on all future operations.
resource input-stream
An input bytestream.
input-stream
s are non-blocking to the extent practical on underlying
platforms. I/O operations always return promptly; if fewer bytes are
promptly available than requested, they return the number of bytes promptly
available, which could even be zero. To wait for data to be available,
use the subscribe
function to obtain a pollable
which can be polled
for using wasi:io/poll
.
resource output-stream
An output bytestream.
output-stream
s are non-blocking to the extent practical on
underlying platforms. Except where specified otherwise, I/O operations also
always return promptly, after the number of bytes that can be written
promptly, which could even be zero. To wait for the stream to be ready to
accept data, the subscribe
function to obtain a pollable
which can be
polled for using wasi:io/poll
.[method]input-stream.read: func
Perform a non-blocking read from the stream.
When the source of a read
is binary data, the bytes from the source
are returned verbatim. When the source of a read
is known to the
implementation to be text, bytes containing the UTF-8 encoding of the
text are returned.
This function returns a list of bytes containing the read data,
when successful. The returned list will contain up to len
bytes;
it may return fewer than requested, but not more. The list is
empty when no bytes are available for reading at this time. The
pollable given by subscribe
will be ready when more bytes are
available.
This function fails with a stream-error
when the operation
encounters an error, giving last-operation-failed
, or when the
stream is closed, giving closed
.
When the caller gives a len
of 0, it represents a request to
read 0 bytes. If the stream is still open, this call should
succeed and return an empty list, or otherwise fail with closed
.
The len
parameter is a u64
, which could represent a list of u8 which
is not possible to allocate in wasm32, or not desirable to allocate as
as a return value by the callee. The callee may return a list of bytes
less than len
in size while more bytes are available for reading.
self
: borrow<input-stream
>len
: u64
u8
>, stream-error
>[method]input-stream.blocking-read: func
Read bytes from a stream, after blocking until at least one byte can
be read. Except for blocking, behavior is identical to read
.
self
: borrow<input-stream
>len
: u64
u8
>, stream-error
>[method]input-stream.skip: func
Skip bytes from a stream. Returns number of bytes skipped.
Behaves identical to read
, except instead of returning a list
of bytes, returns the number of bytes consumed from the stream.
self
: borrow<input-stream
>len
: u64
u64
, stream-error
>[method]input-stream.blocking-skip: func
Skip bytes from a stream, after blocking until at least one byte
can be skipped. Except for blocking behavior, identical to skip
.
self
: borrow<input-stream
>len
: u64
u64
, stream-error
>[method]input-stream.subscribe: func
Create a pollable
which will resolve once either the specified stream
has bytes available to read or the other end of the stream has been
closed.
The created pollable
is a child resource of the input-stream
.
Implementations may trap if the input-stream
is dropped before
all derived pollable
s created with this function are dropped.
self
: borrow<input-stream
>pollable
>[method]output-stream.check-write: func
Check readiness for writing. This function never blocks.
Returns the number of bytes permitted for the next call to write
,
or an error. Calling write
with more bytes than this function has
permitted will trap.
When this function returns 0 bytes, the subscribe
pollable will
become ready when this function will report at least 1 byte, or an
error.
self
: borrow<output-stream
>u64
, stream-error
>[method]output-stream.write: func
Perform a write. This function never blocks.
When the destination of a write
is binary data, the bytes from
contents
are written verbatim. When the destination of a write
is
known to the implementation to be text, the bytes of contents
are
transcoded from UTF-8 into the encoding of the destination and then
written.
Precondition: check-write gave permit of Ok(n) and contents has a length of less than or equal to n. Otherwise, this function will trap.
returns Err(closed) without writing if the stream has closed since the last call to check-write provided a permit.
self
: borrow<output-stream
>contents
: list<u8
>stream-error
>[method]output-stream.blocking-write-and-flush: func
Perform a write of up to 4096 bytes, and then flush the stream. Block until all of these operations are complete, or an error occurs.
This is a convenience wrapper around the use of check-write
,
subscribe
, write
, and flush
, and is implemented with the
following pseudo-code:
let pollable = this.subscribe();
while !contents.is_empty() {
// Wait for the stream to become writable
pollable.block();
let Ok(n) = this.check-write(); // eliding error handling
let len = min(n, contents.len());
let (chunk, rest) = contents.split_at(len);
this.write(chunk ); // eliding error handling
contents = rest;
}
this.flush();
// Wait for completion of `flush`
pollable.block();
// Check for any errors that arose during `flush`
let _ = this.check-write(); // eliding error handling
self
: borrow<output-stream
>contents
: list<u8
>stream-error
>[method]output-stream.flush: func
Request to flush buffered output. This function never blocks.
This tells the output-stream that the caller intends any buffered
output to be flushed. the output which is expected to be flushed
is all that has been passed to write
prior to this call.
Upon calling this function, the output-stream
will not accept any
writes (check-write
will return ok(0)
) until the flush has
completed. The subscribe
pollable will become ready when the
flush has completed and the stream can accept more writes.
self
: borrow<output-stream
>stream-error
>[method]output-stream.blocking-flush: func
Request to flush buffered output, and block until flush completes and stream is ready for writing again.
self
: borrow<output-stream
>stream-error
>[method]output-stream.subscribe: func
Create a pollable
which will resolve once the output-stream
is ready for more writing, or an error has occured. When this
pollable is ready, check-write
will return ok(n)
with n>0, or an
error.
If the stream is closed, this pollable is always ready immediately.
The created pollable
is a child resource of the output-stream
.
Implementations may trap if the output-stream
is dropped before
all derived pollable
s created with this function are dropped.
self
: borrow<output-stream
>pollable
>[method]output-stream.write-zeroes: func
Write zeroes to a stream.
This should be used precisely like write
with the exact same
preconditions (must use check-write first), but instead of
passing a list of bytes, you simply pass the number of zero-bytes
that should be written.
self
: borrow<output-stream
>len
: u64
stream-error
>[method]output-stream.blocking-write-zeroes-and-flush: func
Perform a write of up to 4096 zeroes, and then flush the stream. Block until all of these operations are complete, or an error occurs.
This is a convenience wrapper around the use of check-write
,
subscribe
, write-zeroes
, and flush
, and is implemented with
the following pseudo-code:
let pollable = this.subscribe();
while num_zeroes != 0 {
// Wait for the stream to become writable
pollable.block();
let Ok(n) = this.check-write(); // eliding error handling
let len = min(n, num_zeroes);
this.write-zeroes(len); // eliding error handling
num_zeroes -= len;
}
this.flush();
// Wait for completion of `flush`
pollable.block();
// Check for any errors that arose during `flush`
let _ = this.check-write(); // eliding error handling
self
: borrow<output-stream
>len
: u64
stream-error
>[method]output-stream.splice: func
Read from one stream and write to another.
The behavior of splice is equivelant to:
check-write
on the output-stream
read
on the input-stream
with the smaller of the
check-write
permitted length and the len
provided to splice
write
on the output-stream
with that read data.Any error reported by the call to check-write
, read
, or
write
ends the splice and reports that error.
This function returns the number of bytes transferred; it may be less
than len
.
self
: borrow<output-stream
>src
: borrow<input-stream
>len
: u64
u64
, stream-error
>[method]output-stream.blocking-splice: func
Read from one stream and write to another, with blocking.
This is similar to splice
, except that it blocks until the
output-stream
is ready for writing, and the input-stream
is ready for reading, before performing the splice
.
self
: borrow<output-stream
>src
: borrow<input-stream
>len
: u64
u64
, stream-error
>resource error
An error resource type for keyvalue operations.
Common errors:
resource error { ... }
[method]error.trace: func
self
: borrow<error
>A generic keyvalue interface for WASI.
type input-stream
#### `type output-stream` [`output-stream`](#output_stream)
#### `type error` [`error`](#error)
A bucket is a collection of key-value pairs. Each key-value pair is stored as a entry in the bucket, and the bucket itself acts as a collection of all these entries.
It is worth noting that the exact terminology for bucket in key-value stores can very depending on the specific implementation. For example,
In this interface, we use the term bucket
to refer to a collection of key-value
Soon: switch to resource bucket { ... }
type key
string
A key is a unique identifier for a value in a bucket. The key is used to retrieve the value from the bucket.
resource outgoing-value
A value is the data stored in a key-value pair. The value can be of any type
that can be represented in a byte array. It provides a way to write the value
to the output-stream defined in the wasi-io
interface.
Soon: switch to resource value { ... }
type outgoing-value-body-async
#### `type outgoing-value-body-sync` [`outgoing-value-body-sync`](#outgoing_value_body_sync)
#### `resource incoming-value`
A incoming-value is a wrapper around a value. It provides a way to read the value
from the input-stream
defined in the wasi-io
interface.
The incoming-value provides two ways to consume the value:
incoming-value-consume-sync
consumes the value synchronously and returns the
value as a list<u8>
.incoming-value-consume-async
consumes the value asynchronously and returns the
value as an input-stream
.
In addition, it provides a incoming-value-size
function to get the size of the value.
This is useful when the value is large and the caller wants to allocate a buffer of
the right size to consume the value.
Soon: switch to resource incoming-value { ... }
type incoming-value-async-body
#### `type incoming-value-sync-body` [`incoming-value-sync-body`](#incoming_value_sync_body)
----
[static]bucket.open-bucket: func
Opens a bucket with the given name.
If any error occurs, including if the bucket does not exist, it returns an Err(error)
.
[static]outgoing-value.new-outgoing-value: func
outgoing-value
>[method]outgoing-value.outgoing-value-write-body-async: func
Writes the value to the output-stream asynchronously.
If any other error occurs, it returns an Err(error)
.
self
: borrow<outgoing-value
>outgoing-value-body-async
>, own<error
>>[method]outgoing-value.outgoing-value-write-body-sync: func
Writes the value to the output-stream synchronously.
If any other error occurs, it returns an Err(error)
.
self
: borrow<outgoing-value
>value
: outgoing-value-body-sync
error
>>[static]incoming-value.incoming-value-consume-sync: func
Consumes the value synchronously and returns the value as a list of bytes.
If any other error occurs, it returns an Err(error)
.
this
: own<incoming-value
>incoming-value-sync-body
, own<error
>>[static]incoming-value.incoming-value-consume-async: func
Consumes the value asynchronously and returns the value as an input-stream
.
If any other error occurs, it returns an Err(error)
.
this
: own<incoming-value
>incoming-value-async-body
>, own<error
>>[method]incoming-value.incoming-value-size: func
The size of the value in bytes.
If the size is unknown or unavailable, this function returns an Err(error)
.
self
: borrow<incoming-value
>u64
, own<error
>>A keyvalue interface that provides eventually consistent CRUD operations.
A CRUD operation is an operation that acts on a single key-value pair.
The value in the key-value pair is defined as a u8
byte array and the intention
is that it is the common denominator for all data types defined by different
key-value stores to handle data, ensuring compatibility between different
key-value stores. Note: the clients will be expecting serialization/deserialization overhead
to be handled by the key-value store. The value could be a serialized object from
JSON, HTML or vendor-specific data types like AWS S3 objects.
Data consistency in a key value store refers to the gaurantee that once a write operation completes, all subsequent read operations will return the value that was written.
The level of consistency in readwrite interfaces is eventual consistency, which means that if a write operation completes successfully, all subsequent read operations will eventually return the value that was written. In other words, if we pause the updates to the system, the system eventually will return the last updated value for read.
type bucket
#### `type error` [`error`](#error)
#### `type incoming-value` [`incoming-value`](#incoming_value)
#### `type outgoing-value` [`outgoing-value`](#outgoing_value)
----
get: func
Get the value associated with the key in the bucket.
The value is returned as an option. If the key-value pair exists in the
bucket, it returns Ok(value)
. If the key does not exist in the
bucket, it returns Ok(none)
.
If any other error occurs, it returns an Err(error)
.
incoming-value
>>, own<error
>>set: func
Set the value associated with the key in the bucket. If the key already exists in the bucket, it overwrites the value.
If the key does not exist in the bucket, it creates a new key-value pair.
If any other error occurs, it returns an Err(error)
.
bucket
: borrow<bucket
>key
: key
outgoing-value
: borrow<outgoing-value
>error
>>delete: func
Delete the key-value pair associated with the key in the bucket.
If the key does not exist in the bucket, it does nothing.
If any other error occurs, it returns an Err(error)
.
error
>>exists: func
Check if the key exists in the bucket.
If the key exists in the bucket, it returns Ok(true)
. If the key does
not exist in the bucket, it returns Ok(false)
.
If any other error occurs, it returns an Err(error)
.
bool
, own<error
>>A keyvalue interface that provides atomic operations.
Atomic operations are single, indivisible operations. When a fault causes an atomic operation to fail, it will appear to the invoker of the atomic operation that the action either completed successfully or did nothing at all.
type bucket
#### `type error` [`error`](#error)
----
increment: func
Atomically increment the value associated with the key in the bucket by the given delta. It returns the new value.
If the key does not exist in the bucket, it creates a new key-value pair with the value set to the given delta.
If any other error occurs, it returns an Err(error)
.
u64
, own<error
>>compare-and-swap: func
Compare-and-swap (CAS) atomically updates the value associated with the key
in the bucket if the value matches the old value. This operation returns
Ok(true)
if the swap was successful, Ok(false)
if the value did not match,
A successful CAS operation means the current value matched the old
value
and was replaced with the new
value.
If the key does not exist in the bucket, it returns Ok(false)
.
If any other error occurs, it returns an Err(error)
.
bool
, own<error
>>A keyvalue interface that provides eventually consistent batch operations.
A batch operation is an operation that operates on multiple keys at once.
Batch operations are useful for reducing network round-trip time. For example, if you want to get the values associated with 100 keys, you can either do 100 get operations or you can do 1 batch get operation. The batch operation is faster because it only needs to make 1 network call instead of 100.
A batch operation does not guarantee atomicity, meaning that if the batch operation fails, some of the keys may have been modified and some may not. Transactional operations are being worked on and will be added in the future to provide atomicity.
Data consistency in a key value store refers to the gaurantee that once a write operation completes, all subsequent read operations will return the value that was written.
The level of consistency in batch operations is eventual consistency, the same with the readwrite interface. This interface does not guarantee strong consistency, meaning that if a write operation completes, subsequent read operations may not return the value that was written.
type bucket
#### `type error` [`error`](#error)
#### `type incoming-value` [`incoming-value`](#incoming_value)
#### `type outgoing-value` [`outgoing-value`](#outgoing_value)
----
get-many: func
Get the values associated with the keys in the bucket. It returns a list of incoming-value that can be consumed to get the value associated with the key.
If any of the keys do not exist in the bucket, it returns a none
value for
that key in the list.
Note that the key-value pairs are guaranteed to be returned in the same order
MAY show an out-of-date value if there are concurrent writes to the bucket.
If any other error occurs, it returns an Err(error)
.
incoming-value
>>>, own<error
>>keys: func
Get all the keys in the bucket. It returns a list of keys.
Note that the keys are not guaranteed to be returned in any particular order.
If the bucket is empty, it returns an empty list.
MAY show an out-of-date list of keys if there are concurrent writes to the bucket.
If any error occurs, it returns an Err(error)
.
set-many: func
Set the values associated with the keys in the bucket. If the key already exists in the bucket, it overwrites the value.
Note that the key-value pairs are not guaranteed to be set in the order they are provided.
If any of the keys do not exist in the bucket, it creates a new key-value pair.
If any other error occurs, it returns an Err(error)
. When an error occurs, it
does not rollback the key-value pairs that were already set. Thus, this batch operation
does not guarantee atomicity, implying that some key-value pairs could be
set while others might fail.
Other concurrent operations may also be able to see the partial results.
bucket
: borrow<bucket
>key-values
: list<(key
, borrow<outgoing-value
>)>error
>>delete-many: func
Delete the key-value pairs associated with the keys in the bucket.
Note that the key-value pairs are not guaranteed to be deleted in the order they are provided.
If any of the keys do not exist in the bucket, it skips the key.
If any other error occurs, it returns an Err(error)
. When an error occurs, it
does not rollback the key-value pairs that were already deleted. Thus, this batch operation
does not guarantee atomicity, implying that some key-value pairs could be
deleted while others might fail.
Other concurrent operations may also be able to see the partial results.
error
>>Types used by blobstore
type input-stream
#### `type output-stream` [`output-stream`](#output_stream)
#### `type container-name` `string`
name of a container, a collection of objects. The container name may be any valid UTF-8 string.
type object-name
string
name of an object within a container The object name may be any valid UTF-8 string.
type timestamp
u64
TODO: define timestamp to include seconds since Unix epoch and nanoseconds https://github.com/WebAssembly/wasi-blob-store/issues/7
type object-size
u64
size of an object, in bytes
type error
string
#### `record container-metadata`
information about a container
name
: container-name
the container's name
created-at
: timestamp
date and time container was created
record object-metadata
information about an object
name
: object-name
the object's name
the object's parent container
created-at
: timestamp
date and time the object was created
size
: object-size
size of the object, in bytes
record object-id
identifier for an object that includes its container name
container
: container-name
object
: object-name
resource outgoing-value
A data is the data stored in a data blob. The value can be of any type
that can be represented in a byte array. It provides a way to write the value
to the output-stream defined in the wasi-io
interface.
Soon: switch to resource value { ... }
resource incoming-value
A incoming-value is a wrapper around a value. It provides a way to read the value
from the input-stream defined in the wasi-io
interface.
The incoming-value provides two ways to consume the value:
incoming-value-consume-sync
consumes the value synchronously and returns the
value as a list of bytes.incoming-value-consume-async
consumes the value asynchronously and returns the
value as an input-stream.
Soon: switch to resource incoming-value { ... }
type incoming-value-async-body
#### `type incoming-value-sync-body` [`incoming-value-sync-body`](#incoming_value_sync_body)
----
[static]outgoing-value.new-outgoing-value: func
outgoing-value
>[method]outgoing-value.outgoing-value-write-body: func
self
: borrow<outgoing-value
>output-stream
>>[method]incoming-value.incoming-value-consume-sync: func
self
: borrow<incoming-value
>incoming-value-sync-body
, error
>[method]incoming-value.incoming-value-consume-async: func
self
: borrow<incoming-value
>incoming-value-async-body
>, error
>[method]incoming-value.size: func
self
: borrow<incoming-value
>a Container is a collection of objects
type input-stream
#### `type output-stream` [`output-stream`](#output_stream)
#### `type container-metadata` [`container-metadata`](#container_metadata)
#### `type error` [`error`](#error)
#### `type incoming-value` [`incoming-value`](#incoming_value)
#### `type object-metadata` [`object-metadata`](#object_metadata)
#### `type object-name` [`object-name`](#object_name)
#### `type outgoing-value` [`outgoing-value`](#outgoing_value)
this defines the container
resource
resource stream-object-names
stream-object-names
resource which is a representation of stream[method]container.name: func
returns container name
self
: borrow<container
>string
, error
>[method]container.info: func
returns container metadata
self
: borrow<container
>container-metadata
, error
>[method]container.get-data: func
retrieves an object or portion of an object, as a resource. Start and end offsets are inclusive. Once a data-blob resource has been created, the underlying bytes are held by the blobstore service for the lifetime of the data-blob resource, even if the object they came from is later deleted.
self
: borrow<container
>name
: object-name
start
: u64
end
: u64
incoming-value
>, error
>[method]container.write-data: func
creates or replaces an object with the data blob.
self
: borrow<container
>name
: object-name
data
: borrow<outgoing-value
>error
>[method]container.list-objects: func
returns list of objects in the container. Order is undefined.
self
: borrow<container
>stream-object-names
>, error
>[method]container.delete-object: func
deletes object. does not return error if object did not exist.
self
: borrow<container
>name
: object-name
error
>[method]container.delete-objects: func
deletes multiple objects in the container
self
: borrow<container
>names
: list<object-name
>error
>[method]container.has-object: func
returns true if the object exists in this container
self
: borrow<container
>name
: object-name
bool
, error
>[method]container.object-info: func
returns metadata for the object
self
: borrow<container
>name
: object-name
object-metadata
, error
>[method]container.clear: func
removes all objects within the container, leaving the container empty.
self
: borrow<container
>error
>[method]stream-object-names.read-stream-object-names: func
reads the next number of objects from the stream
This function returns the list of objects read, and a boolean indicating if the end of the stream was reached.
self
: borrow<stream-object-names
>len
: u64
object-name
>, bool
), error
>[method]stream-object-names.skip-stream-object-names: func
skip the next number of objects in the stream
This function returns the number of objects skipped, and a boolean indicating if the end of the stream was reached.
self
: borrow<stream-object-names
>num
: u64
u64
, bool
), error
>wasi-cloud Blobstore service definition
type container
#### `type error` [`error`](#error)
#### `type container-name` [`container-name`](#container_name)
#### `type object-id` [`object-id`](#object_id)
----
create-container: func
creates a new empty container
name
: container-name
get-container: func
retrieves a container by name
name
: container-name
delete-container: func
deletes a container and all objects within it
name
: container-name
error
>container-exists: func
returns true if the container exists
name
: container-name
bool
, error
>copy-object: func
copies (duplicates) an object, to the same or a different container. returns an error if the target container does not exist. overwrites destination object if it already existed.
error
>move-object: func
moves or renames an object, to the same or a different container returns an error if the destination container does not exist. overwrites destination object if it already existed.
error
>resource client
A connection to a message-exchange service (e.g., buffer, broker, etc.).
resource error
TODO(danbugs): This should be eventually extracted as an underlying type for other wasi-cloud-core interfaces.
type channel
string
There are two types of channels: - publish-subscribe channel, which is a broadcast channel, and - point-to-point channel, which is a unicast channel.
The interface doesn't highlight this difference in the type itself as that's uniquely a consumer issue.
record guest-configuration
Configuration includes a required list of channels the guest is subscribing to, and an optional list of extensions key-value pairs (e.g., partitions/offsets to read from in Kafka/EventHubs, QoS etc.).
channels
: list<channel
>extensions
: option<list<(string
, string
)>>enum format-spec
Format specification for messages
record message
A message with a binary payload, a format specification, and decorative metadata.
data
: list<u8
>format
: format-spec
metadata
: option<list<(string
, string
)>>[static]client.connect: func
[static]error.trace: func
type client
#### `type channel` [`channel`](#channel)
#### `type message` [`message`](#message)
#### `type error` [`error`](#error)
----
send: func
error
>>type client
#### `type message` [`message`](#message)
#### `type channel` [`channel`](#channel)
#### `type error` [`error`](#error)
#### `type guest-configuration` [`guest-configuration`](#guest_configuration)
----
subscribe-try-receive: func
Blocking receive for t-milliseconds with ephemeral subscription – if no message is received, returns None
subscribe-receive: func
Blocking receive until message with ephemeral subscription
update-guest-configuration: func
'Fit-all' type function for updating a guest's configuration – this could be useful for:
error
>>complete-message: func
A message can exist under several statuses: (1) available: the message is ready to be read, (2) acquired: the message has been sent to a consumer (but still exists in the queue), (3) accepted (result of complete-message): the message has been received and ACK-ed by a consumer and can be safely removed from the queue, (4) rejected (result of abandon-message): the message has been received and NACK-ed by a consumer, at which point it can be:
m
: message
error
>>abandon-message: func
m
: message
error
>>variant data-type
common data types
int32
: s32
int64
: s64
uint32
: u32
uint64
: u64
float
: float64
double
: float64
str
: string
boolean
: bool
date
: string
time
: string
timestamp
: string
binary
: list<u8
>null
record row
one single row item
field-name
: string
value
: data-type
resource statement
allows parameterized queries e.g., prepare("SELECT * FROM users WHERE name = ? AND age = ?", vec!["John Doe", "32"])
resource error
An error resource type. Currently, this provides only one function to return a string representation of the error. In the future, this will be extended to provide more information.
resource connection
[static]statement.prepare: func
query
: string
params
: list<string
>[method]error.trace: func
self
: borrow<error
>[static]connection.open: func
connection
>, own<error
>>type statement
#### `type error` [`error`](#error)
#### `type connection` [`connection`](#connection)
----
query: func
query is optimized for querying data, and implementors can make use of that fact to optimize the performance of query execution (e.g., using indexes).
c
: borrow<connection
>q
: borrow<statement
>exec: func
exec is for modifying data in the database.
c
: borrow<connection
>q
: borrow<statement
>u32
, own<error
>>variant config-error
An error type that encapsulates the different errors that can occur fetching config
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.
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.
get: func
Gets a single opaque config value set at the given key if it exists
key
: string
u8
>>, config-error
>get-all: func
Gets a list of all set config data
string
, list<u8
>)>, config-error
>WASI Random is a random data API.
It is intended to be portable at least between Unix-family platforms and Windows.
get-random-bytes: func
Return len
cryptographically-secure random or pseudo-random bytes.
This function must produce data at least as cryptographically secure and fast as an adequately seeded cryptographically-secure pseudo-random number generator (CSPRNG). It must not block, from the perspective of the calling program, under any circumstances, including on the first request and on requests for numbers of bytes. The returned data must always be unpredictable.
This function must always return fresh data. Deterministic environments must omit this function, rather than implementing it with deterministic data.
get-random-u64: func
Return a cryptographically-secure random or pseudo-random u64
value.
This function returns the same type of data as get-random-bytes
,
represented as a u64
.
type output-stream
----
get-stdout: func
output-stream
>type output-stream
----
get-stderr: func
output-stream
>type input-stream
----
get-stdin: func
input-stream
>WASI Monotonic Clock is a clock API intended to let users measure elapsed time.
It is intended to be portable at least between Unix-family platforms and Windows.
A monotonic clock is a clock which has an unspecified initial value, and successive reads of the clock will produce non-decreasing values.
It is intended for measuring elapsed time.
type pollable
An instant in time, in nanoseconds. An instant is relative to an unspecified initial value, and can only be compared to instances from the same monotonic-clock.
type duration
u64
A duration of time, in nanoseconds.
now: func
Read the current value of the clock.
The clock is monotonic, therefore calling this function repeatedly will produce a sequence of non-decreasing values.
resolution: func
Query the resolution of the clock. Returns the duration of time corresponding to a clock tick.
subscribe-instant: func
Create a pollable
which will resolve once the specified instant
occured.
when
: instant
pollable
>subscribe-duration: func
Create a pollable
which will resolve once the given duration has
elapsed, starting at the time at which this function was called.
occured.
when
: duration
pollable
>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.
type duration
#### `type input-stream` [`input-stream`](#input_stream)
#### `type output-stream` [`output-stream`](#output_stream)
#### `type io-error` [`error`](#error)
#### `type pollable` [`pollable`](#pollable)
This type corresponds to HTTP standard Methods.
variant scheme
This type corresponds to HTTP standard Related Schemes.
record DNS-error-payload
Defines the case payload type for DNS-error
above:
record TLS-alert-received-payload
Defines the case payload type for TLS-alert-received
above:
record field-size-payload
Defines the case payload type for HTTP-response-{header,trailer}-size
above:
variant 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
DNS-timeout
DNS-error
: DNS-error-payload
destination-not-found
destination-unavailable
destination-IP-prohibited
destination-IP-unroutable
connection-refused
connection-terminated
connection-timeout
connection-read-timeout
connection-write-timeout
connection-limit-reached
TLS-protocol-error
TLS-certificate-error
TLS-alert-received
: TLS-alert-received-payload
HTTP-request-denied
HTTP-request-length-required
HTTP-request-body-size
: option<u64
>HTTP-request-method-invalid
HTTP-request-URI-invalid
HTTP-request-URI-too-long
HTTP-request-header-section-size
: option<u32
>HTTP-request-header-size
: option<field-size-payload
>HTTP-request-trailer-section-size
: option<u32
>HTTP-request-trailer-size
: field-size-payload
HTTP-response-incomplete
HTTP-response-header-section-size
: option<u32
>HTTP-response-header-size
: field-size-payload
HTTP-response-body-size
: option<u64
>HTTP-response-trailer-section-size
: option<u32
>HTTP-response-trailer-size
: field-size-payload
HTTP-response-transfer-coding
: option<string
>HTTP-response-content-coding
: option<string
>HTTP-response-timeout
HTTP-upgrade-failed
HTTP-protocol-error
loop-detected
configuration-error
internal-error
: option<string
>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.
variant header-error
This type enumerates the different kinds of errors that may occur when
setting or appending to a fields
resource.
This error indicates that a `field-key` or `field-value` was syntactically invalid when used with an operation that sets headers in a `fields`.
This error indicates that a forbidden `field-key` was used when trying to set a header in a `fields`.
This error indicates that the operation on the `fields` was not permitted because the fields are immutable.
type field-key
string
Field keys are always strings.
type 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.
resource 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
.
type headers
Headers is an alias for Fields.
type trailers
Trailers is an alias for Fields.
resource incoming-request
Represents an incoming HTTP Request.
resource outgoing-request
Represents an outgoing HTTP Request.
resource 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 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
.
type status-code
u16
This type corresponds to the HTTP standard Status Code.
resource incoming-response
Represents an incoming HTTP Response.
resource 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 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 outgoing-response
Represents an outgoing HTTP Response.
resource 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 future-incoming-response
Represents a future which may eventaully return an incoming HTTP Response, or an error.
wasi:http/outgoing-handler
interface to
provide the HTTP Response corresponding to the sent Request.http-error-code: func
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.
err
: borrow<io-error
>error-code
>[constructor]fields: func
Construct an empty HTTP Fields.
The resulting fields
is mutable.
fields
>[static]fields.from-list: func
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.
An error result will be returned if any field-key
or field-value
is
syntactically invalid, or if a field is forbidden.
entries
: list<(field-key
, field-value
)>fields
>, header-error
>[method]fields.get: func
Get all of the values corresponding to a key. If the key is not present
in this fields
or is syntactically invalid, 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.
field-value
>[method]fields.has: func
Returns true
when the key is present in this fields
. If the key is
syntactically invalid, false
is returned.
[method]fields.set: func
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.
Fails with header-error.invalid-syntax
if the field-key
or any of
the field-value
s are syntactically invalid.
self
: borrow<fields
>name
: field-key
value
: list<field-value
>header-error
>[method]fields.delete: func
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.
Fails with header-error.invalid-syntax
if the field-key
is
syntactically invalid.
header-error
>[method]fields.append: func
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.
Fails with header-error.invalid-syntax
if the field-key
or
field-value
are syntactically invalid.
self
: borrow<fields
>name
: field-key
value
: field-value
header-error
>[method]fields.entries: func
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.
self
: borrow<fields
>field-key
, field-value
)>[method]fields.clone: func
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.
self
: borrow<fields
>fields
>[method]incoming-request.method: func
Returns the method of the incoming request.
self
: borrow<incoming-request
>[method]incoming-request.path-with-query: func
Returns the path with query parameters from the request, as a string.
self
: borrow<incoming-request
>[method]incoming-request.scheme: func
Returns the protocol scheme from the request.
self
: borrow<incoming-request
>scheme
>[method]incoming-request.authority: func
Returns the authority from the request, if it was present.
self
: borrow<incoming-request
>[method]incoming-request.headers: func
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.
self
: borrow<incoming-request
>headers
>[method]incoming-request.consume: func
Gives the incoming-body
associated with this request. Will only
return success at most once, and subsequent calls will return error.
self
: borrow<incoming-request
>incoming-body
>>[constructor]outgoing-request: func
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
.
outgoing-request
>[method]outgoing-request.body: func
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.
self
: borrow<outgoing-request
>outgoing-body
>>[method]outgoing-request.method: func
Get the Method for the Request.
self
: borrow<outgoing-request
>[method]outgoing-request.set-method: func
Set the Method for the Request. Fails if the string present in a
method.other
argument is not a syntactically valid method.
self
: borrow<outgoing-request
>method
: method
[method]outgoing-request.path-with-query: func
Get the combination of the HTTP Path and Query for the Request.
When none
, this represents an empty Path and empty Query.
self
: borrow<outgoing-request
>[method]outgoing-request.set-path-with-query: func
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.
self
: borrow<outgoing-request
>path-with-query
: option<string
>[method]outgoing-request.scheme: func
Get the HTTP Related Scheme for the Request. When none
, the
implementation may choose an appropriate default scheme.
self
: borrow<outgoing-request
>scheme
>[method]outgoing-request.set-scheme: func
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.
self
: borrow<outgoing-request
>scheme
: option<scheme
>[method]outgoing-request.authority: func
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.
self
: borrow<outgoing-request
>[method]outgoing-request.set-authority: func
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.
self
: borrow<outgoing-request
>authority
: option<string
>[method]outgoing-request.headers: func
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
.
self
: borrow<outgoing-request
>headers
>[constructor]request-options: func
Construct a default request-options
value.
request-options
>[method]request-options.connect-timeout: func
The timeout for the initial connect to the HTTP Server.
self
: borrow<request-options
>duration
>[method]request-options.set-connect-timeout: func
Set the timeout for the initial connect to the HTTP Server. An error return value indicates that this timeout is not supported.
self
: borrow<request-options
>duration
: option<duration
>[method]request-options.first-byte-timeout: func
The timeout for receiving the first byte of the Response body.
self
: borrow<request-options
>duration
>[method]request-options.set-first-byte-timeout: func
Set the timeout for receiving the first byte of the Response body. An error return value indicates that this timeout is not supported.
self
: borrow<request-options
>duration
: option<duration
>[method]request-options.between-bytes-timeout: func
The timeout for receiving subsequent chunks of bytes in the Response body stream.
self
: borrow<request-options
>duration
>[method]request-options.set-between-bytes-timeout: func
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.
self
: borrow<request-options
>duration
: option<duration
>[static]response-outparam.set: func
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.
param
: own<response-outparam
>response
: result<own<outgoing-response
>, error-code
>[method]incoming-response.status: func
Returns the status code from the incoming response.
self
: borrow<incoming-response
>[method]incoming-response.headers: func
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.
self
: borrow<incoming-response
>headers
>[method]incoming-response.consume: func
Returns the incoming body. May be called at most once. Returns error if called additional times.
self
: borrow<incoming-response
>incoming-body
>>[method]incoming-body.stream: func
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.
self
: borrow<incoming-body
>input-stream
>>[static]incoming-body.finish: func
Takes ownership of incoming-body
, and returns a future-trailers
.
This function will trap if the input-stream
child is still alive.
this
: own<incoming-body
>future-trailers
>[method]future-trailers.subscribe: func
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
.
self
: borrow<future-trailers
>pollable
>[method]future-trailers.get: func
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.
self
: borrow<future-trailers
>trailers
>>, error-code
>>>[constructor]outgoing-response: func
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.outgoing-response
>[method]outgoing-response.status-code: func
Get the HTTP Status Code for the Response.
self
: borrow<outgoing-response
>[method]outgoing-response.set-status-code: func
Set the HTTP Status Code for the Response. Fails if the status-code given is not a valid http status code.
self
: borrow<outgoing-response
>status-code
: status-code
[method]outgoing-response.headers: func
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
.
self
: borrow<outgoing-response
>headers
>[method]outgoing-response.body: func
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.
self
: borrow<outgoing-response
>outgoing-body
>>[method]outgoing-body.write: func
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.
self
: borrow<outgoing-body
>output-stream
>>[static]outgoing-body.finish: func
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.
this
: own<outgoing-body
>trailers
: option<own<trailers
>>error-code
>[method]future-incoming-response.subscribe: func
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
.
self
: borrow<future-incoming-response
>pollable
>[method]future-incoming-response.get: func
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.
self
: borrow<future-incoming-response
>incoming-response
>, error-code
>>>This interface defines a handler of outgoing HTTP Requests. It should be imported by components which wish to make HTTP Requests.
type outgoing-request
#### `type request-options` [`request-options`](#request_options)
#### `type future-incoming-response` [`future-incoming-response`](#future_incoming_response)
#### `type error-code` [`error-code`](#error_code)
----
handle: func
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
.
request
: own<outgoing-request
>options
: option<own<request-options
>>future-incoming-response
>, error-code
>WASI Wall Clock is a clock API intended to let users query the current time. The name "wall" makes an analogy to a "clock on the wall", which is not necessarily monotonic as it may be reset.
It is intended to be portable at least between Unix-family platforms and Windows.
A wall clock is a clock which measures the date and time according to some external reference.
External references may be reset, so this clock is not necessarily monotonic, making it unsuitable for measuring elapsed time.
It is intended for reporting the current date and time for humans.
record datetime
A time and date in seconds plus nanoseconds.
now: func
Read the current value of the clock.
This clock is not monotonic, therefore calling this function repeatedly will not necessarily produce a sequence of non-decreasing values.
The returned timestamps represent the number of seconds since 1970-01-01T00:00:00Z, also known as POSIX's Seconds Since the Epoch, also known as Unix Time.
The nanoseconds field of the output is always less than 1000000000.
resolution: func
Query the resolution of the clock.
The nanoseconds field of the output is always less than 1000000000.
type message
#### `type guest-configuration` [`guest-configuration`](#guest_configuration)
#### `type error` [`error`](#error)
----
configure: func
Returns the list of channels (and extension metadata within guest-configuration) that this component should subscribe to and be handled by the subsequent handler within guest-configuration
guest-configuration
, own<error
>>handler: func
Whenever this guest receives a message in one of the subscribed channels, the message is sent to this handler
ms
: list<message
>error
>>