Working with Golem Promises in C/C++
Golem promises provide a way for Golem workers to wait on an external condition. The worker creates the promise and somehow sends its identifier to the external system responsible for completing the promise. Then the worker can await the promise, being suspended until the external system completes the promise using Golem's REST API.
It is also possible to complete a promise from within a Golem worker using the Golem SDK.
When a promise is completed, an arbitrary byte array can be attached to it as a payload - this data is returned to the awaiting worker when is continues execution.
In C/C++ the promise API can be used by directly importing and using the Golem runtime API.
Adding as a dependency
To use Golem's runtime API, add all the WIT files from https://github.com/golemcloud/golem-wit/tree/main/wit/deps (opens in a new tab) in the project's wit/deps
directory, and then importing this interface to the component's world:
world example {
import golem:api/host@0.2.0;
// ...
}
The golem-cli new
examples for C automatically create the wit/deps
directory for you, except
the c-actor-minimal
one.
Creating a promise
To create a promise simply call the golem_api_host_golem_create_promise
function:
golem_api_host_promise_id_t promise_id;
golem_api_host_golem_create_promise(&promise_id);
The returned value, golem_api_host_promise_id_t
, is defined as the following:
// UUID
typedef struct golem_api_host_uuid_t {
uint64_t high_bits;
uint64_t low_bits;
} golem_api_host_uuid_t;
// Represents a Golem component
typedef struct golem_api_host_component_id_t {
golem_api_host_uuid_t uuid;
} golem_api_host_component_id_t;
// Represents a Golem worker
typedef struct golem_api_host_worker_id_t {
golem_api_host_component_id_t component_id;
example_string_t worker_name;
} golem_api_host_worker_id_t;
// A promise ID is a value that can be passed to an external Golem API to complete that promise
// from an arbitrary external source, while Golem workers can await for this completion.
typedef struct golem_api_host_promise_id_t {
golem_api_host_worker_id_t worker_id;
golem_api_host_oplog_index_t oplog_idx;
} golem_api_host_promise_id_t;
Deleting a promise
If a promise is no longer used, it has to be deleted with
golem_api_host_promise_id_t promise_id;
// .. set up promise_id ..
golem_api_host_golem_delete_promise(&promise_id);
The golem_api_host_promise_id_t
value just a promise identifier. Dropping it from the stack or
deleting from the heap does not delete the underlying promise in the Golem runtime.
Awaiting a promise
To await a promise, use the golem_api_host_golem_await_promise
function:
golem_api_host_promise_id_t promise_id;
// .. set up promise_id ..
example_list_u8_t payload; // will be filled by the call
golem_api_host_golem_await_promise(&promise_id, &payload);
The resulting payload
is a struct containing a len
length and a pointer to len
number of bytes, containig the data attached to the promise on completion.
Completing a promise from within a worker
To complete a promise from within a worker, use the golem_api_host_golem_complete_promise
function:
golem_api_host_promise_id_t promise_id;
example_list_u8_t payload;
// .. set up promise_id and payload ..
golem_api_host_golem_complete_promise(&promise_id, &payload);
Completing a promise from an external source
To see how to use the promise ID to complete a promise through the external REST API, check the REST API documentation.