A keyvalue interface that provides event-driven notifications of changes to a bucket.
This interface is exported by a component that wants to react to key-value changes, and the callbacks are delivered by the host as those changes occur.
Types
use resource bucket
from wasmcloud:keyvalue/types@0.2.0
A bucket is a collection of key-value pairs. Each key-value pair is stored as an 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 vary depending on the specific implementation. For example:
- Amazon DynamoDB calls a collection of key-value pairs a table
- Redis has hashes, sets, and sorted sets as different types of collections
- Cassandra calls a collection of key-value pairs a column family
- MongoDB calls a collection of key-value pairs a collection
- Riak calls a collection of key-value pairs a bucket
- Memcached calls a collection of key-value pairs a slab
- Azure Cosmos DB calls a collection of key-value pairs a container
In this interface, we use the term bucket to refer to a collection of key-value pairs
get: async func(key: string) -> result<option<list<u8>>, error>Get the value associated with the specified
keyThe value is returned as an option. If the key-value pair exists in the store, it returns
ok(value). If the key does not exist in the store, it returnsok(none).If any other error occurs, it returns an
err(error).set: async func( key: string, value: list<u8>, options: option<set-options>, ) -> result<_, error>Set the value associated with the key in the store. If the key already exists in the store, it overwrites the value.
If the key does not exist in the store, it creates a new key-value pair.
optionscontrols expiry (ttl-ms) and conditional writes (if-not-exists); passnonefor the default overwrite-on-exists behavior with no expiry.If any other error occurs, it returns an
err(error).delete: async func(key: string) -> result<_, error>Delete the key-value pair associated with the key in the store.
If the key does not exist in the store, it does nothing.
If any other error occurs, it returns an
err(error).exists: async func(key: string) -> result<bool, error>Check if the key exists in the store.
If the key exists in the store, it returns
ok(true). If the key does not exist in the store, it returnsok(false).If any other error occurs, it returns an
err(error).list-keys: async func( prefix: option<string>, cursor: option<string>, ) -> result<key-response, error>Get the keys in the store, optionally restricted to those starting with
prefix, with an optional cursor (for use in pagination). It returns a list of keys. Please note that for most KeyValue implementations, this can be a very expensive operation and so it should be used judiciously. Implementations can return any number of keys in a single response, but they should never attempt to send more data than is reasonable (i.e. on a small edge device, this may only be a few KB, while on a large machine this could be several MB). Any response should also return a cursor that can be used to fetch the next page of keys. See thekey-responserecord for more information.prefixfilters the result to keys that begin with the given string; passnoneto list all keys. When paginating, the sameprefixshould be supplied alongside eachcursor.Note that the keys are not guaranteed to be returned in any particular order.
If the store is empty (or no keys match
prefix), it returns an empty list.MAY show an out-of-date list of keys if there are concurrent writes to the store.
If any error occurs, it returns an
err(error).
Functions
on-set: async func(bucket: bucket, key: string, value: list<u8>)
Handle the set event for the given bucket and key. It includes a handle to the bucket
that can be used to interact with the store.
on-delete: async func(bucket: bucket, key: string)
Handle the delete event for the given bucket and key. It includes a handle to the
bucket that can be used to interact with the store.
WIT
/// A keyvalue interface that provides event-driven notifications of changes to a bucket.
///
/// This interface is exported by a component that wants to react to key-value changes, and the
/// callbacks are delivered by the host as those changes occur.
interface watcher {
use types.{bucket};
/// Handle the `set` event for the given bucket and key. It includes a handle to the `bucket`
/// that can be used to interact with the store.
on-set: async func(bucket: bucket, key: string, value: list<u8>);
/// Handle the `delete` event for the given bucket and key. It includes a handle to the
/// `bucket` that can be used to interact with the store.
on-delete: async func(bucket: bucket, key: string);
}