World imports
- Imports:
- interface
wasi:io/error@0.2.0
- interface
wasi:io/streams@0.2.0
- interface
Import interface wasi:io/error@0.2.0
Types
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>
.
The set of functions which can "downcast" an error
into a more
concrete type is open.
Functions
[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.
Params
self
: borrow<error
>
Return values
Import interface wasi:io/streams@0.2.0
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.
Types
type error
// Hermes does not support poll
use poll.{pollable};
*/
An error for input-stream and output-stream operations.
Variant Cases
-
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
.
Functions
[method]input-stream.read: func
Perform a non-blocking read from the stream.
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.
Params
self
: borrow<input-stream
>len
:u64
Return values
- result<list<
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
.
Params
self
: borrow<input-stream
>len
:u64
Return values
- result<list<
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.
Params
self
: borrow<input-stream
>len
:u64
Return values
- result<
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
.
Params
self
: borrow<input-stream
>len
:u64
Return values
- result<
u64
,stream-error
>
[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.
Params
self
: borrow<output-stream
>
Return values
- result<
u64
,stream-error
>
[method]output-stream.write: func
Perform a write. This function never blocks.
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.
Params
self
: borrow<output-stream
>contents
: list<u8
>
Return values
- result<_,
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
poll-one(pollable);
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`
poll-one(pollable);
// Check for any errors that arose during `flush`
let _ = this.check-write(); // eliding error handling
Params
self
: borrow<output-stream
>contents
: list<u8
>
Return values
- result<_,
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.
Params
self
: borrow<output-stream
>
Return values
- result<_,
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.
Params
self
: borrow<output-stream
>
Return values
- result<_,
stream-error
>
[method]output-stream.write-zeroes: 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.
subscribe: func() -> pollable; // Hermes does NOT support poll
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.
Params
self
: borrow<output-stream
>len
:u64
Return values
- result<_,
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
poll-one(pollable);
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`
poll-one(pollable);
// Check for any errors that arose during `flush`
let _ = this.check-write(); // eliding error handling
Params
self
: borrow<output-stream
>len
:u64
Return values
- result<_,
stream-error
>
[method]output-stream.splice: func
Read from one stream and write to another.
The behavior of splice is equivelant to:
- calling
check-write
on theoutput-stream
- calling
read
on theinput-stream
with the smaller of thecheck-write
permitted length and thelen
provided tosplice
- calling
write
on theoutput-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
.
Params
self
: borrow<output-stream
>src
: borrow<input-stream
>len
:u64
Return values
- result<
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
.
Params
self
: borrow<output-stream
>src
: borrow<input-stream
>len
:u64
Return values
- result<
u64
,stream-error
>