// For more information on what this is used for, see `fuzz_async.rs` package wasmtime-fuzz:fuzz; interface types { variant command { // invoke the imported `sync-ready` function sync-ready-call, // invoke the imported `async-ready` function, and assert it's ready async-ready-call, // invoke the imported `async-pending` function, assert it's not // ready, and save it with the id provided. async-pending-import-call(u32), // cancel's a prior call of `async-pending` with the id specified async-pending-import-cancel(u32), // asserts that a prior call of `async-pending` with the id specified is // ready. async-pending-import-assert-ready(u32), // complete a previous invocation of this component's `async-pending` // export. async-pending-export-complete(u32), // assert a previous invocation of this component's `async-pending` export // is cancelled. async-pending-export-assert-cancelled(u32), // make a future read/write combo with the `id` specified. future-new(u32), // take a future readable end through the `future-take` import. future-take(u32), // pass the future specified to this component's `future-receive` import. future-give(u32), // drop the future end identified future-drop-readable(u32), // ... future-write-ready(future-payload), future-read-ready(future-payload), future-write-pending(future-payload), future-read-pending(u32), future-write-dropped(u32), future-cancel-write(u32), future-cancel-read(u32), future-write-assert-complete(u32), future-write-assert-dropped(u32), future-read-assert-complete(future-payload), // make a stream read/write combo with the `id` specified. stream-new(u32), // take a stream readable end through the `stream-take` import. stream-take(u32), // pass the stream specified to this component's `stream-receive` import. stream-give(u32), // drop the stream end identified stream-drop-readable(u32), stream-drop-writable(u32), // ... stream-write-ready(stream-ready-payload), stream-read-ready(stream-ready-payload), stream-write-pending(stream-write-payload), stream-read-pending(stream-read-payload), stream-write-dropped(stream-write-payload), stream-read-dropped(stream-read-payload), stream-cancel-write(u32), stream-cancel-read(u32), stream-write-assert-complete(stream-read-payload), stream-write-assert-dropped(stream-read-payload), stream-read-assert-complete(stream-write-payload), stream-read-assert-dropped(u32), ack, } record future-payload { %future: u32, item: u32, } record stream-ready-payload { %stream: u32, item: u32, op-count: u32, ready-count: u32, } record stream-write-payload { %stream: u32, item: u32, count: u32, } record stream-read-payload { %stream: u32, count: u32, } enum scope { caller, callee, } get-commands: func(s: scope) -> stream; } interface async-test { use types.{command, scope}; // Initialization function. Invokes `task.return` but keeps running to receive // commands. Commands come from the `get-commands` function which is passed // the `scope` provided here. // // This invokes the imported `init` function with the `callee` scope. init: async func(scope: scope); sync-ready: func(); // Must return immediately. async-ready: async func(); // Must not be ready when called. Status will be resolved through a later // command using the `id` provided. async-pending: async func(id: u32); // Remove the future reader `id` from this component's state and return it. future-take: func(id: u32) -> future; // Receive a future from another component. future-receive: func(id: u32, f: future); // Remove the stream reader `id` from this component's state and return it. stream-take: func(id: u32) -> stream; // Receive a stream from another component. stream-receive: func(id: u32, f: stream); } world fuzz-async { import async-test; export async-test; }