Skip to content

Commit 2d88711

Browse files
committed
fix(examples): use consistent wasi:keyvalue version
Signed-off-by: Roman Volosatovs <rvolosatovs@riseup.net>
1 parent e7ff3b7 commit 2d88711

32 files changed

Lines changed: 367 additions & 200 deletions

File tree

crates/wasi-keyvalue/wit/deps.lock

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
[keyvalue]
2-
url = "https://github.com/WebAssembly/wasi-keyvalue/archive/main.tar.gz"
2+
url = "https://github.com/WebAssembly/wasi-keyvalue/archive/da58d54ff969b04e9797dfb986288429cef25e19.tar.gz"
33
sha256 = "7eaf2e10af6e2de6d5a168893e2656c6685de2009bd37fdc944859f5a6753e55"
44
sha512 = "ecf0dd2e0b6e5f62c2e10673cc8c2aab86c532f8b19c984fe2ecd9306e9a5c2783183143274477cc4fb3b037b2db2817f248a6bf84b3279180ca4dba832bf5dc"

crates/wasi-keyvalue/wit/deps.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
keyvalue = "https://github.com/WebAssembly/wasi-keyvalue/archive/main.tar.gz"
1+
keyvalue = "https://github.com/WebAssembly/wasi-keyvalue/archive/da58d54ff969b04e9797dfb986288429cef25e19.tar.gz"

crates/wasi-keyvalue/wit/deps/keyvalue/world.wit

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,4 +23,4 @@ world imports {
2323
world watch-service {
2424
include imports;
2525
export watcher;
26-
}
26+
}

examples/go/wasi-keyvalue-client/bindings/wasi/keyvalue/store/bindings.wrpc.go

Lines changed: 86 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -178,7 +178,7 @@ type KeyResponse struct {
178178
Keys []string
179179
// The continuation token to use to fetch the next page of keys. If this is `null`, then
180180
// there are no more keys to fetch.
181-
Cursor *uint64
181+
Cursor *string
182182
}
183183

184184
func (v *KeyResponse) String() string { return "KeyResponse" }
@@ -269,7 +269,7 @@ func (v *KeyResponse) WriteToIndex(w wrpc.ByteWriter) (func(wrpc.IndexWriter) er
269269
writes[0] = write0
270270
}
271271
slog.Debug("writing field", "name", "cursor")
272-
write1, err := func(v *uint64, w interface {
272+
write1, err := func(v *string, w interface {
273273
io.ByteWriter
274274
io.Writer
275275
}) (func(wrpc.IndexWriter) error, error) {
@@ -285,12 +285,26 @@ func (v *KeyResponse) WriteToIndex(w wrpc.ByteWriter) (func(wrpc.IndexWriter) er
285285
return nil, fmt.Errorf("failed to write `option::some` status byte: %w", err)
286286
}
287287
slog.Debug("writing `option::some` payload")
288-
write, err := (func(wrpc.IndexWriter) error)(nil), func(v uint64, w io.Writer) (err error) {
289-
b := make([]byte, binary.MaxVarintLen64)
290-
i := binary.PutUvarint(b, uint64(v))
291-
slog.Debug("writing u64")
292-
_, err = w.Write(b[:i])
293-
return err
288+
write, err := (func(wrpc.IndexWriter) error)(nil), func(v string, w io.Writer) (err error) {
289+
n := len(v)
290+
if n > math.MaxUint32 {
291+
return fmt.Errorf("string byte length of %d overflows a 32-bit integer", n)
292+
}
293+
if err = func(v int, w io.Writer) error {
294+
b := make([]byte, binary.MaxVarintLen32)
295+
i := binary.PutUvarint(b, uint64(v))
296+
slog.Debug("writing string byte length", "len", n)
297+
_, err = w.Write(b[:i])
298+
return err
299+
}(n, w); err != nil {
300+
return fmt.Errorf("failed to write string byte length of %d: %w", n, err)
301+
}
302+
slog.Debug("writing string bytes")
303+
_, err = w.Write([]byte(v))
304+
if err != nil {
305+
return fmt.Errorf("failed to write string bytes: %w", err)
306+
}
307+
return nil
294308
}(*v, w)
295309
if err != nil {
296310
return nil, fmt.Errorf("failed to write `option::some` payload: %w", err)
@@ -388,18 +402,18 @@ func Open(ctx__ context.Context, wrpc__ wrpc.Invoker, identifier string) (r0__ *
388402
}
389403
var w__ wrpc.IndexWriteCloser
390404
var r__ wrpc.IndexReadCloser
391-
w__, r__, err__ = wrpc__.Invoke(ctx__, "wasi:keyvalue/store@0.2.0-draft", "open", buf__.Bytes())
405+
w__, r__, err__ = wrpc__.Invoke(ctx__, "wasi:keyvalue/store@0.2.0-draft2", "open", buf__.Bytes())
392406
if err__ != nil {
393407
err__ = fmt.Errorf("failed to invoke `open`: %w", err__)
394408
return
395409
}
396410
defer func() {
397411
if err := r__.Close(); err != nil {
398-
slog.ErrorContext(ctx__, "failed to close reader", "instance", "wasi:keyvalue/store@0.2.0-draft", "name", "open", "err", err)
412+
slog.ErrorContext(ctx__, "failed to close reader", "instance", "wasi:keyvalue/store@0.2.0-draft2", "name", "open", "err", err)
399413
}
400414
}()
401415
if cErr__ := w__.Close(); cErr__ != nil {
402-
slog.DebugContext(ctx__, "failed to close outgoing stream", "instance", "wasi:keyvalue/store@0.2.0-draft", "name", "open", "err", cErr__)
416+
slog.DebugContext(ctx__, "failed to close outgoing stream", "instance", "wasi:keyvalue/store@0.2.0-draft2", "name", "open", "err", cErr__)
403417
}
404418
r0__, err__ = func(r wrpc.IndexReadCloser, path ...uint32) (*wrpc.Result[wrpc.Own[Bucket], Error], error) {
405419
slog.Debug("reading result status byte")
@@ -611,18 +625,18 @@ func Bucket_Get(ctx__ context.Context, wrpc__ wrpc.Invoker, self wrpc.Borrow[Buc
611625
}
612626
var w__ wrpc.IndexWriteCloser
613627
var r__ wrpc.IndexReadCloser
614-
w__, r__, err__ = wrpc__.Invoke(ctx__, "wasi:keyvalue/store@0.2.0-draft", "bucket.get", buf__.Bytes())
628+
w__, r__, err__ = wrpc__.Invoke(ctx__, "wasi:keyvalue/store@0.2.0-draft2", "bucket.get", buf__.Bytes())
615629
if err__ != nil {
616630
err__ = fmt.Errorf("failed to invoke `[method]bucket.get`: %w", err__)
617631
return
618632
}
619633
defer func() {
620634
if err := r__.Close(); err != nil {
621-
slog.ErrorContext(ctx__, "failed to close reader", "instance", "wasi:keyvalue/store@0.2.0-draft", "name", "[method]bucket.get", "err", err)
635+
slog.ErrorContext(ctx__, "failed to close reader", "instance", "wasi:keyvalue/store@0.2.0-draft2", "name", "[method]bucket.get", "err", err)
622636
}
623637
}()
624638
if cErr__ := w__.Close(); cErr__ != nil {
625-
slog.DebugContext(ctx__, "failed to close outgoing stream", "instance", "wasi:keyvalue/store@0.2.0-draft", "name", "[method]bucket.get", "err", cErr__)
639+
slog.DebugContext(ctx__, "failed to close outgoing stream", "instance", "wasi:keyvalue/store@0.2.0-draft2", "name", "[method]bucket.get", "err", cErr__)
626640
}
627641
r0__, err__ = func(r wrpc.IndexReadCloser, path ...uint32) (*wrpc.Result[[]uint8, Error], error) {
628642
slog.Debug("reading result status byte")
@@ -919,18 +933,18 @@ func Bucket_Set(ctx__ context.Context, wrpc__ wrpc.Invoker, self wrpc.Borrow[Buc
919933
}
920934
var w__ wrpc.IndexWriteCloser
921935
var r__ wrpc.IndexReadCloser
922-
w__, r__, err__ = wrpc__.Invoke(ctx__, "wasi:keyvalue/store@0.2.0-draft", "bucket.set", buf__.Bytes())
936+
w__, r__, err__ = wrpc__.Invoke(ctx__, "wasi:keyvalue/store@0.2.0-draft2", "bucket.set", buf__.Bytes())
923937
if err__ != nil {
924938
err__ = fmt.Errorf("failed to invoke `[method]bucket.set`: %w", err__)
925939
return
926940
}
927941
defer func() {
928942
if err := r__.Close(); err != nil {
929-
slog.ErrorContext(ctx__, "failed to close reader", "instance", "wasi:keyvalue/store@0.2.0-draft", "name", "[method]bucket.set", "err", err)
943+
slog.ErrorContext(ctx__, "failed to close reader", "instance", "wasi:keyvalue/store@0.2.0-draft2", "name", "[method]bucket.set", "err", err)
930944
}
931945
}()
932946
if cErr__ := w__.Close(); cErr__ != nil {
933-
slog.DebugContext(ctx__, "failed to close outgoing stream", "instance", "wasi:keyvalue/store@0.2.0-draft", "name", "[method]bucket.set", "err", cErr__)
947+
slog.DebugContext(ctx__, "failed to close outgoing stream", "instance", "wasi:keyvalue/store@0.2.0-draft2", "name", "[method]bucket.set", "err", cErr__)
934948
}
935949
r0__, err__ = func(r wrpc.IndexReadCloser, path ...uint32) (*wrpc.Result[struct{}, Error], error) {
936950
slog.Debug("reading result status byte")
@@ -1104,18 +1118,18 @@ func Bucket_Delete(ctx__ context.Context, wrpc__ wrpc.Invoker, self wrpc.Borrow[
11041118
}
11051119
var w__ wrpc.IndexWriteCloser
11061120
var r__ wrpc.IndexReadCloser
1107-
w__, r__, err__ = wrpc__.Invoke(ctx__, "wasi:keyvalue/store@0.2.0-draft", "bucket.delete", buf__.Bytes())
1121+
w__, r__, err__ = wrpc__.Invoke(ctx__, "wasi:keyvalue/store@0.2.0-draft2", "bucket.delete", buf__.Bytes())
11081122
if err__ != nil {
11091123
err__ = fmt.Errorf("failed to invoke `[method]bucket.delete`: %w", err__)
11101124
return
11111125
}
11121126
defer func() {
11131127
if err := r__.Close(); err != nil {
1114-
slog.ErrorContext(ctx__, "failed to close reader", "instance", "wasi:keyvalue/store@0.2.0-draft", "name", "[method]bucket.delete", "err", err)
1128+
slog.ErrorContext(ctx__, "failed to close reader", "instance", "wasi:keyvalue/store@0.2.0-draft2", "name", "[method]bucket.delete", "err", err)
11151129
}
11161130
}()
11171131
if cErr__ := w__.Close(); cErr__ != nil {
1118-
slog.DebugContext(ctx__, "failed to close outgoing stream", "instance", "wasi:keyvalue/store@0.2.0-draft", "name", "[method]bucket.delete", "err", cErr__)
1132+
slog.DebugContext(ctx__, "failed to close outgoing stream", "instance", "wasi:keyvalue/store@0.2.0-draft2", "name", "[method]bucket.delete", "err", cErr__)
11191133
}
11201134
r0__, err__ = func(r wrpc.IndexReadCloser, path ...uint32) (*wrpc.Result[struct{}, Error], error) {
11211135
slog.Debug("reading result status byte")
@@ -1290,18 +1304,18 @@ func Bucket_Exists(ctx__ context.Context, wrpc__ wrpc.Invoker, self wrpc.Borrow[
12901304
}
12911305
var w__ wrpc.IndexWriteCloser
12921306
var r__ wrpc.IndexReadCloser
1293-
w__, r__, err__ = wrpc__.Invoke(ctx__, "wasi:keyvalue/store@0.2.0-draft", "bucket.exists", buf__.Bytes())
1307+
w__, r__, err__ = wrpc__.Invoke(ctx__, "wasi:keyvalue/store@0.2.0-draft2", "bucket.exists", buf__.Bytes())
12941308
if err__ != nil {
12951309
err__ = fmt.Errorf("failed to invoke `[method]bucket.exists`: %w", err__)
12961310
return
12971311
}
12981312
defer func() {
12991313
if err := r__.Close(); err != nil {
1300-
slog.ErrorContext(ctx__, "failed to close reader", "instance", "wasi:keyvalue/store@0.2.0-draft", "name", "[method]bucket.exists", "err", err)
1314+
slog.ErrorContext(ctx__, "failed to close reader", "instance", "wasi:keyvalue/store@0.2.0-draft2", "name", "[method]bucket.exists", "err", err)
13011315
}
13021316
}()
13031317
if cErr__ := w__.Close(); cErr__ != nil {
1304-
slog.DebugContext(ctx__, "failed to close outgoing stream", "instance", "wasi:keyvalue/store@0.2.0-draft", "name", "[method]bucket.exists", "err", cErr__)
1318+
slog.DebugContext(ctx__, "failed to close outgoing stream", "instance", "wasi:keyvalue/store@0.2.0-draft2", "name", "[method]bucket.exists", "err", cErr__)
13051319
}
13061320
r0__, err__ = func(r wrpc.IndexReadCloser, path ...uint32) (*wrpc.Result[bool, Error], error) {
13071321
slog.Debug("reading result status byte")
@@ -1443,7 +1457,7 @@ func Bucket_Exists(ctx__ context.Context, wrpc__ wrpc.Invoker, self wrpc.Borrow[
14431457
// MAY show an out-of-date list of keys if there are concurrent writes to the store.
14441458
//
14451459
// If any error occurs, it returns an `Err(error)`.
1446-
func Bucket_ListKeys(ctx__ context.Context, wrpc__ wrpc.Invoker, self wrpc.Borrow[Bucket], cursor *uint64) (r0__ *wrpc.Result[KeyResponse, Error], err__ error) {
1460+
func Bucket_ListKeys(ctx__ context.Context, wrpc__ wrpc.Invoker, self wrpc.Borrow[Bucket], cursor *string) (r0__ *wrpc.Result[KeyResponse, Error], err__ error) {
14471461
var buf__ bytes.Buffer
14481462
write0__, err__ := (func(wrpc.IndexWriter) error)(nil), func(v string, w io.Writer) (err error) {
14491463
n := len(v)
@@ -1470,7 +1484,7 @@ func Bucket_ListKeys(ctx__ context.Context, wrpc__ wrpc.Invoker, self wrpc.Borro
14701484
err__ = fmt.Errorf("failed to write `self` parameter: %w", err__)
14711485
return
14721486
}
1473-
write1__, err__ := func(v *uint64, w interface {
1487+
write1__, err__ := func(v *string, w interface {
14741488
io.ByteWriter
14751489
io.Writer
14761490
}) (func(wrpc.IndexWriter) error, error) {
@@ -1486,12 +1500,26 @@ func Bucket_ListKeys(ctx__ context.Context, wrpc__ wrpc.Invoker, self wrpc.Borro
14861500
return nil, fmt.Errorf("failed to write `option::some` status byte: %w", err)
14871501
}
14881502
slog.Debug("writing `option::some` payload")
1489-
write, err := (func(wrpc.IndexWriter) error)(nil), func(v uint64, w io.Writer) (err error) {
1490-
b := make([]byte, binary.MaxVarintLen64)
1491-
i := binary.PutUvarint(b, uint64(v))
1492-
slog.Debug("writing u64")
1493-
_, err = w.Write(b[:i])
1494-
return err
1503+
write, err := (func(wrpc.IndexWriter) error)(nil), func(v string, w io.Writer) (err error) {
1504+
n := len(v)
1505+
if n > math.MaxUint32 {
1506+
return fmt.Errorf("string byte length of %d overflows a 32-bit integer", n)
1507+
}
1508+
if err = func(v int, w io.Writer) error {
1509+
b := make([]byte, binary.MaxVarintLen32)
1510+
i := binary.PutUvarint(b, uint64(v))
1511+
slog.Debug("writing string byte length", "len", n)
1512+
_, err = w.Write(b[:i])
1513+
return err
1514+
}(n, w); err != nil {
1515+
return fmt.Errorf("failed to write string byte length of %d: %w", n, err)
1516+
}
1517+
slog.Debug("writing string bytes")
1518+
_, err = w.Write([]byte(v))
1519+
if err != nil {
1520+
return fmt.Errorf("failed to write string bytes: %w", err)
1521+
}
1522+
return nil
14951523
}(*v, w)
14961524
if err != nil {
14971525
return nil, fmt.Errorf("failed to write `option::some` payload: %w", err)
@@ -1512,18 +1540,18 @@ func Bucket_ListKeys(ctx__ context.Context, wrpc__ wrpc.Invoker, self wrpc.Borro
15121540
}
15131541
var w__ wrpc.IndexWriteCloser
15141542
var r__ wrpc.IndexReadCloser
1515-
w__, r__, err__ = wrpc__.Invoke(ctx__, "wasi:keyvalue/store@0.2.0-draft", "bucket.list-keys", buf__.Bytes())
1543+
w__, r__, err__ = wrpc__.Invoke(ctx__, "wasi:keyvalue/store@0.2.0-draft2", "bucket.list-keys", buf__.Bytes())
15161544
if err__ != nil {
15171545
err__ = fmt.Errorf("failed to invoke `[method]bucket.list-keys`: %w", err__)
15181546
return
15191547
}
15201548
defer func() {
15211549
if err := r__.Close(); err != nil {
1522-
slog.ErrorContext(ctx__, "failed to close reader", "instance", "wasi:keyvalue/store@0.2.0-draft", "name", "[method]bucket.list-keys", "err", err)
1550+
slog.ErrorContext(ctx__, "failed to close reader", "instance", "wasi:keyvalue/store@0.2.0-draft2", "name", "[method]bucket.list-keys", "err", err)
15231551
}
15241552
}()
15251553
if cErr__ := w__.Close(); cErr__ != nil {
1526-
slog.DebugContext(ctx__, "failed to close outgoing stream", "instance", "wasi:keyvalue/store@0.2.0-draft", "name", "[method]bucket.list-keys", "err", cErr__)
1554+
slog.DebugContext(ctx__, "failed to close outgoing stream", "instance", "wasi:keyvalue/store@0.2.0-draft2", "name", "[method]bucket.list-keys", "err", cErr__)
15271555
}
15281556
r0__, err__ = func(r wrpc.IndexReadCloser, path ...uint32) (*wrpc.Result[KeyResponse, Error], error) {
15291557
slog.Debug("reading result status byte")
@@ -1609,7 +1637,7 @@ func Bucket_ListKeys(ctx__ context.Context, wrpc__ wrpc.Invoker, self wrpc.Borro
16091637
return nil, fmt.Errorf("failed to read `keys` field: %w", err)
16101638
}
16111639
slog.Debug("reading field", "name", "cursor")
1612-
v.Cursor, err = func(r wrpc.IndexReadCloser, path ...uint32) (*uint64, error) {
1640+
v.Cursor, err = func(r wrpc.IndexReadCloser, path ...uint32) (*string, error) {
16131641
slog.Debug("reading option status byte")
16141642
status, err := r.ReadByte()
16151643
if err != nil {
@@ -1620,28 +1648,41 @@ func Bucket_ListKeys(ctx__ context.Context, wrpc__ wrpc.Invoker, self wrpc.Borro
16201648
return nil, nil
16211649
case 1:
16221650
slog.Debug("reading `option::some` payload")
1623-
v, err := func(r io.ByteReader) (uint64, error) {
1624-
var x uint64
1651+
v, err := func(r interface {
1652+
io.ByteReader
1653+
io.Reader
1654+
}) (string, error) {
1655+
var x uint32
16251656
var s uint8
1626-
for i := 0; i < 10; i++ {
1627-
slog.Debug("reading u64 byte", "i", i)
1657+
for i := 0; i < 5; i++ {
1658+
slog.Debug("reading string length byte", "i", i)
16281659
b, err := r.ReadByte()
16291660
if err != nil {
16301661
if i > 0 && err == io.EOF {
16311662
err = io.ErrUnexpectedEOF
16321663
}
1633-
return x, fmt.Errorf("failed to read u64 byte: %w", err)
1664+
return "", fmt.Errorf("failed to read string length byte: %w", err)
16341665
}
1635-
if s == 63 && b > 0x01 {
1636-
return x, errors.New("varint overflows a 64-bit integer")
1666+
if s == 28 && b > 0x0f {
1667+
return "", errors.New("string length overflows a 32-bit integer")
16371668
}
16381669
if b < 0x80 {
1639-
return x | uint64(b)<<s, nil
1670+
x = x | uint32(b)<<s
1671+
buf := make([]byte, x)
1672+
slog.Debug("reading string bytes", "len", x)
1673+
_, err = r.Read(buf)
1674+
if err != nil {
1675+
return "", fmt.Errorf("failed to read string bytes: %w", err)
1676+
}
1677+
if !utf8.Valid(buf) {
1678+
return string(buf), errors.New("string is not valid UTF-8")
1679+
}
1680+
return string(buf), nil
16401681
}
1641-
x |= uint64(b&0x7f) << s
1682+
x |= uint32(b&0x7f) << s
16421683
s += 7
16431684
}
1644-
return x, errors.New("varint overflows a 64-bit integer")
1685+
return "", errors.New("string length overflows a 32-bit integer")
16451686
}(r)
16461687
if err != nil {
16471688
return nil, fmt.Errorf("failed to read `option::some` value: %w", err)
Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
11
[keyvalue]
2-
url = "https://github.com/WebAssembly/wasi-keyvalue/archive/main.tar.gz"
3-
sha256 = "d2de617fe31ec0abc6072f75f97dd22bf95b3231d5b3111471d73871df9081cd"
4-
sha512 = "6f0b4e44c684d760c54552e2bde9bc976e0a4f6525fc1d47acb98625e030847276436242f42a41f4da1bb9169fb2968c53d659d61af9b2f709f4eb6f9880e2c7"
2+
path = "../../../../crates/wasi-keyvalue/wit/deps/keyvalue"
3+
sha256 = "7eaf2e10af6e2de6d5a168893e2656c6685de2009bd37fdc944859f5a6753e55"
4+
sha512 = "ecf0dd2e0b6e5f62c2e10673cc8c2aab86c532f8b19c984fe2ecd9306e9a5c2783183143274477cc4fb3b037b2db2817f248a6bf84b3279180ca4dba832bf5dc"
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
keyvalue = "https://github.com/WebAssembly/wasi-keyvalue/archive/main.tar.gz"
1+
keyvalue = "../../../../crates/wasi-keyvalue/wit/deps/keyvalue"

examples/go/wasi-keyvalue-client/wit/deps/keyvalue/atomic.wit

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,12 +11,36 @@
1111
interface atomics {
1212
use store.{bucket, error};
1313

14+
/// The error returned by a CAS operation
15+
variant cas-error {
16+
/// A store error occurred when performing the operation
17+
store-error(error),
18+
/// The CAS operation failed because the value was too old. This returns a new CAS handle
19+
/// for easy retries. Implementors MUST return a CAS handle that has been updated to the
20+
/// latest version or transaction.
21+
cas-failed(cas),
22+
}
23+
24+
/// A handle to a CAS (compare-and-swap) operation.
25+
resource cas {
26+
/// Construct a new CAS operation. Implementors can map the underlying functionality
27+
/// (transactions, versions, etc) as desired.
28+
new: static func(bucket: borrow<bucket>, key: string) -> result<cas, error>;
29+
/// Get the current value of the key (if it exists). This allows for avoiding reads if all
30+
/// that is needed to ensure the atomicity of the operation
31+
current: func() -> result<option<list<u8>>, error>;
32+
}
33+
1434
/// Atomically increment the value associated with the key in the store by the given delta. It
1535
/// returns the new value.
1636
///
1737
/// If the key does not exist in the store, it creates a new key-value pair with the value set
1838
/// to the given delta.
1939
///
2040
/// If any other error occurs, it returns an `Err(error)`.
21-
increment: func(bucket: borrow<bucket>, key: string, delta: u64) -> result<u64, error>;
41+
increment: func(bucket: borrow<bucket>, key: string, delta: s64) -> result<s64, error>;
42+
43+
/// Perform the swap on a CAS operation. This consumes the CAS handle and returns an error if
44+
/// the CAS operation failed.
45+
swap: func(cas: cas, value: list<u8>) -> result<_, cas-error>;
2246
}

examples/go/wasi-keyvalue-client/wit/deps/keyvalue/store.wit

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ interface store {
4343
keys: list<string>,
4444
/// The continuation token to use to fetch the next page of keys. If this is `null`, then
4545
/// there are no more keys to fetch.
46-
cursor: option<u64>
46+
cursor: option<string>
4747
}
4848

4949
/// Get the bucket with the specified identifier.
@@ -117,6 +117,6 @@ interface store {
117117
/// MAY show an out-of-date list of keys if there are concurrent writes to the store.
118118
///
119119
/// If any error occurs, it returns an `Err(error)`.
120-
list-keys: func(cursor: option<u64>) -> result<key-response, error>;
120+
list-keys: func(cursor: option<string>) -> result<key-response, error>;
121121
}
122122
}

examples/go/wasi-keyvalue-client/wit/deps/keyvalue/world.wit

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package wasi:keyvalue@0.2.0-draft;
1+
package wasi:keyvalue@0.2.0-draft2;
22

33
/// The `wasi:keyvalue/imports` world provides common APIs for interacting with key-value stores.
44
/// Components targeting this world will be able to do:
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
package wrpc-examples:wasi-keyvalue-nats-client;
22

33
world client {
4-
import wasi:keyvalue/store@0.2.0-draft;
4+
import wasi:keyvalue/store@0.2.0-draft2;
55
}

0 commit comments

Comments
 (0)