Module spin_sdk.wit.imports.streams
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.
Expand source code
"""
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.
"""
from typing import TypeVar, Generic, Union, Optional, Union, Protocol, Tuple, List, Any, Self
from enum import Flag, Enum, auto
from dataclasses import dataclass
from abc import abstractmethod
import weakref
from ..types import Result, Ok, Err, Some
from ..imports import poll
from ..imports import error
@dataclass
class StreamErrorLastOperationFailed:
value: error.Error
@dataclass
class StreamErrorClosed:
pass
StreamError = Union[StreamErrorLastOperationFailed, StreamErrorClosed]
"""
An error for input-stream and output-stream operations.
"""
class InputStream:
"""
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`.
"""
def read(self, len: int) -> bytes:
"""
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.
Raises: `spin_sdk.wit.types.Err(spin_sdk.wit.imports.streams.StreamError)`
"""
raise NotImplementedError
def blocking_read(self, len: int) -> bytes:
"""
Read bytes from a stream, after blocking until at least one byte can
be read. Except for blocking, behavior is identical to `read`.
Raises: `spin_sdk.wit.types.Err(spin_sdk.wit.imports.streams.StreamError)`
"""
raise NotImplementedError
def skip(self, len: int) -> int:
"""
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.
Raises: `spin_sdk.wit.types.Err(spin_sdk.wit.imports.streams.StreamError)`
"""
raise NotImplementedError
def blocking_skip(self, len: int) -> int:
"""
Skip bytes from a stream, after blocking until at least one byte
can be skipped. Except for blocking behavior, identical to `skip`.
Raises: `spin_sdk.wit.types.Err(spin_sdk.wit.imports.streams.StreamError)`
"""
raise NotImplementedError
def subscribe(self) -> poll.Pollable:
"""
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.
"""
raise NotImplementedError
def __enter__(self):
"""Returns self"""
return self
def __exit__(self, *args):
"""
Release this resource.
"""
raise NotImplementedError
class OutputStream:
"""
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`.
"""
def check_write(self) -> int:
"""
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.
Raises: `spin_sdk.wit.types.Err(spin_sdk.wit.imports.streams.StreamError)`
"""
raise NotImplementedError
def write(self, contents: bytes) -> None:
"""
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.
Raises: `spin_sdk.wit.types.Err(spin_sdk.wit.imports.streams.StreamError)`
"""
raise NotImplementedError
def blocking_write_and_flush(self, contents: bytes) -> None:
"""
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:
```text
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
```
Raises: `spin_sdk.wit.types.Err(spin_sdk.wit.imports.streams.StreamError)`
"""
raise NotImplementedError
def flush(self) -> None:
"""
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.
Raises: `spin_sdk.wit.types.Err(spin_sdk.wit.imports.streams.StreamError)`
"""
raise NotImplementedError
def blocking_flush(self) -> None:
"""
Request to flush buffered output, and block until flush completes
and stream is ready for writing again.
Raises: `spin_sdk.wit.types.Err(spin_sdk.wit.imports.streams.StreamError)`
"""
raise NotImplementedError
def subscribe(self) -> poll.Pollable:
"""
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.
"""
raise NotImplementedError
def write_zeroes(self, len: int) -> None:
"""
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.
Raises: `spin_sdk.wit.types.Err(spin_sdk.wit.imports.streams.StreamError)`
"""
raise NotImplementedError
def blocking_write_zeroes_and_flush(self, len: int) -> None:
"""
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:
```text
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
```
Raises: `spin_sdk.wit.types.Err(spin_sdk.wit.imports.streams.StreamError)`
"""
raise NotImplementedError
def splice(self, src: InputStream, len: int) -> int:
"""
Read from one stream and write to another.
The behavior of splice is equivelant to:
1. calling `check-write` on the `output-stream`
2. calling `read` on the `input-stream` with the smaller of the
`check-write` permitted length and the `len` provided to `splice`
3. calling `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`.
Raises: `spin_sdk.wit.types.Err(spin_sdk.wit.imports.streams.StreamError)`
"""
raise NotImplementedError
def blocking_splice(self, src: InputStream, len: int) -> int:
"""
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`.
Raises: `spin_sdk.wit.types.Err(spin_sdk.wit.imports.streams.StreamError)`
"""
raise NotImplementedError
def __enter__(self):
"""Returns self"""
return self
def __exit__(self, *args):
"""
Release this resource.
"""
raise NotImplementedError
Global variables
var StreamError
-
An error for input-stream and output-stream operations.
Classes
class InputStream
-
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 thesubscribe
function to obtain apollable
which can be polled for usingwasi:io/poll
.Expand source code
class InputStream: """ 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`. """ def read(self, len: int) -> bytes: """ 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. Raises: `spin_sdk.wit.types.Err(spin_sdk.wit.imports.streams.StreamError)` """ raise NotImplementedError def blocking_read(self, len: int) -> bytes: """ Read bytes from a stream, after blocking until at least one byte can be read. Except for blocking, behavior is identical to `read`. Raises: `spin_sdk.wit.types.Err(spin_sdk.wit.imports.streams.StreamError)` """ raise NotImplementedError def skip(self, len: int) -> int: """ 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. Raises: `spin_sdk.wit.types.Err(spin_sdk.wit.imports.streams.StreamError)` """ raise NotImplementedError def blocking_skip(self, len: int) -> int: """ Skip bytes from a stream, after blocking until at least one byte can be skipped. Except for blocking behavior, identical to `skip`. Raises: `spin_sdk.wit.types.Err(spin_sdk.wit.imports.streams.StreamError)` """ raise NotImplementedError def subscribe(self) -> poll.Pollable: """ 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. """ raise NotImplementedError def __enter__(self): """Returns self""" return self def __exit__(self, *args): """ Release this resource. """ raise NotImplementedError
Methods
def blocking_read(self, len: int) ‑> bytes
-
Read bytes from a stream, after blocking until at least one byte can be read. Except for blocking, behavior is identical to
read
.Raises:
Err(StreamError)
Expand source code
def blocking_read(self, len: int) -> bytes: """ Read bytes from a stream, after blocking until at least one byte can be read. Except for blocking, behavior is identical to `read`. Raises: `spin_sdk.wit.types.Err(spin_sdk.wit.imports.streams.StreamError)` """ raise NotImplementedError
def blocking_skip(self, len: int) ‑> int
-
Skip bytes from a stream, after blocking until at least one byte can be skipped. Except for blocking behavior, identical to
skip
.Raises:
Err(StreamError)
Expand source code
def blocking_skip(self, len: int) -> int: """ Skip bytes from a stream, after blocking until at least one byte can be skipped. Except for blocking behavior, identical to `skip`. Raises: `spin_sdk.wit.types.Err(spin_sdk.wit.imports.streams.StreamError)` """ raise NotImplementedError
def read(self, len: int) ‑> bytes
-
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 aread
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 bysubscribe
will be ready when more bytes are available.This function fails with a
stream-error
when the operation encounters an error, givinglast-operation-failed
, or when the stream is closed, givingclosed
.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 withclosed
.The
len
parameter is au64
, 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 thanlen
in size while more bytes are available for reading.Raises:
Err(StreamError)
Expand source code
def read(self, len: int) -> bytes: """ 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. Raises: `spin_sdk.wit.types.Err(spin_sdk.wit.imports.streams.StreamError)` """ raise NotImplementedError
def skip(self, len: int) ‑> int
-
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.Raises:
Err(StreamError)
Expand source code
def skip(self, len: int) -> int: """ 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. Raises: `spin_sdk.wit.types.Err(spin_sdk.wit.imports.streams.StreamError)` """ raise NotImplementedError
def subscribe(self) ‑> Pollable
-
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 createdpollable
is a child resource of theinput-stream
. Implementations may trap if theinput-stream
is dropped before all derivedpollable
s created with this function are dropped.Expand source code
def subscribe(self) -> poll.Pollable: """ 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. """ raise NotImplementedError
class OutputStream
-
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, thesubscribe
function to obtain apollable
which can be polled for usingwasi:io/poll
.Expand source code
class OutputStream: """ 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`. """ def check_write(self) -> int: """ 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. Raises: `spin_sdk.wit.types.Err(spin_sdk.wit.imports.streams.StreamError)` """ raise NotImplementedError def write(self, contents: bytes) -> None: """ 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. Raises: `spin_sdk.wit.types.Err(spin_sdk.wit.imports.streams.StreamError)` """ raise NotImplementedError def blocking_write_and_flush(self, contents: bytes) -> None: """ 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: ```text 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 ``` Raises: `spin_sdk.wit.types.Err(spin_sdk.wit.imports.streams.StreamError)` """ raise NotImplementedError def flush(self) -> None: """ 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. Raises: `spin_sdk.wit.types.Err(spin_sdk.wit.imports.streams.StreamError)` """ raise NotImplementedError def blocking_flush(self) -> None: """ Request to flush buffered output, and block until flush completes and stream is ready for writing again. Raises: `spin_sdk.wit.types.Err(spin_sdk.wit.imports.streams.StreamError)` """ raise NotImplementedError def subscribe(self) -> poll.Pollable: """ 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. """ raise NotImplementedError def write_zeroes(self, len: int) -> None: """ 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. Raises: `spin_sdk.wit.types.Err(spin_sdk.wit.imports.streams.StreamError)` """ raise NotImplementedError def blocking_write_zeroes_and_flush(self, len: int) -> None: """ 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: ```text 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 ``` Raises: `spin_sdk.wit.types.Err(spin_sdk.wit.imports.streams.StreamError)` """ raise NotImplementedError def splice(self, src: InputStream, len: int) -> int: """ Read from one stream and write to another. The behavior of splice is equivelant to: 1. calling `check-write` on the `output-stream` 2. calling `read` on the `input-stream` with the smaller of the `check-write` permitted length and the `len` provided to `splice` 3. calling `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`. Raises: `spin_sdk.wit.types.Err(spin_sdk.wit.imports.streams.StreamError)` """ raise NotImplementedError def blocking_splice(self, src: InputStream, len: int) -> int: """ 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`. Raises: `spin_sdk.wit.types.Err(spin_sdk.wit.imports.streams.StreamError)` """ raise NotImplementedError def __enter__(self): """Returns self""" return self def __exit__(self, *args): """ Release this resource. """ raise NotImplementedError
Methods
def blocking_flush(self) ‑> None
-
Request to flush buffered output, and block until flush completes and stream is ready for writing again.
Raises:
Err(StreamError)
Expand source code
def blocking_flush(self) -> None: """ Request to flush buffered output, and block until flush completes and stream is ready for writing again. Raises: `spin_sdk.wit.types.Err(spin_sdk.wit.imports.streams.StreamError)` """ raise NotImplementedError
def blocking_splice(self, src: InputStream, len: int) ‑> int
-
Read from one stream and write to another, with blocking.
This is similar to
splice
, except that it blocks until theoutput-stream
is ready for writing, and theinput-stream
is ready for reading, before performing thesplice
.Raises:
Err(StreamError)
Expand source code
def blocking_splice(self, src: InputStream, len: int) -> int: """ 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`. Raises: `spin_sdk.wit.types.Err(spin_sdk.wit.imports.streams.StreamError)` """ raise NotImplementedError
def blocking_write_and_flush(self, contents: bytes) ‑> None
-
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
, andflush
, 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
Raises:
Err(StreamError)
Expand source code
def blocking_write_and_flush(self, contents: bytes) -> None: """ 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: ```text 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 ``` Raises: `spin_sdk.wit.types.Err(spin_sdk.wit.imports.streams.StreamError)` """ raise NotImplementedError
def blocking_write_zeroes_and_flush(self, len: int) ‑> None
-
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
, andflush
, 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
Raises:
Err(StreamError)
Expand source code
def blocking_write_zeroes_and_flush(self, len: int) -> None: """ 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: ```text 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 ``` Raises: `spin_sdk.wit.types.Err(spin_sdk.wit.imports.streams.StreamError)` """ raise NotImplementedError
def check_write(self) ‑> int
-
Check readiness for writing. This function never blocks.
Returns the number of bytes permitted for the next call to
write
, or an error. Callingwrite
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.Raises:
Err(StreamError)
Expand source code
def check_write(self) -> int: """ 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. Raises: `spin_sdk.wit.types.Err(spin_sdk.wit.imports.streams.StreamError)` """ raise NotImplementedError
def flush(self) ‑> None
-
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 returnok(0)
) until the flush has completed. Thesubscribe
pollable will become ready when the flush has completed and the stream can accept more writes.Raises:
Err(StreamError)
Expand source code
def flush(self) -> None: """ 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. Raises: `spin_sdk.wit.types.Err(spin_sdk.wit.imports.streams.StreamError)` """ raise NotImplementedError
def splice(self, src: InputStream, len: int) ‑> int
-
Read from one stream and write to another.
The behavior of splice is equivelant to: 1. calling
check-write
on theoutput-stream
2. callingread
on theinput-stream
with the smaller of thecheck-write
permitted length and thelen
provided tosplice
3. callingwrite
on theoutput-stream
with that read data.Any error reported by the call to
check-write
,read
, orwrite
ends the splice and reports that error.This function returns the number of bytes transferred; it may be less than
len
.Raises:
Err(StreamError)
Expand source code
def splice(self, src: InputStream, len: int) -> int: """ Read from one stream and write to another. The behavior of splice is equivelant to: 1. calling `check-write` on the `output-stream` 2. calling `read` on the `input-stream` with the smaller of the `check-write` permitted length and the `len` provided to `splice` 3. calling `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`. Raises: `spin_sdk.wit.types.Err(spin_sdk.wit.imports.streams.StreamError)` """ raise NotImplementedError
def subscribe(self) ‑> Pollable
-
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 returnok(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 theoutput-stream
. Implementations may trap if theoutput-stream
is dropped before all derivedpollable
s created with this function are dropped.Expand source code
def subscribe(self) -> poll.Pollable: """ 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. """ raise NotImplementedError
def write(self, contents: bytes) ‑> None
-
Perform a write. This function never blocks.
When the destination of a
write
is binary data, the bytes fromcontents
are written verbatim. When the destination of awrite
is known to the implementation to be text, the bytes ofcontents
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.
Raises:
Err(StreamError)
Expand source code
def write(self, contents: bytes) -> None: """ 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. Raises: `spin_sdk.wit.types.Err(spin_sdk.wit.imports.streams.StreamError)` """ raise NotImplementedError
def write_zeroes(self, len: int) ‑> None
-
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.Raises:
Err(StreamError)
Expand source code
def write_zeroes(self, len: int) -> None: """ 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. Raises: `spin_sdk.wit.types.Err(spin_sdk.wit.imports.streams.StreamError)` """ raise NotImplementedError
class StreamErrorClosed
-
StreamErrorClosed()
Expand source code
@dataclass class StreamErrorClosed: pass
class StreamErrorLastOperationFailed (value: Error)
-
StreamErrorLastOperationFailed(value: spin_sdk.wit.imports.error.Error)
Expand source code
@dataclass class StreamErrorLastOperationFailed: value: error.Error
Class variables
var value : Error