Files
VerseVDI-Data-Plane/core/include/versevdi_core.h

207 lines
7.2 KiB
C

#ifndef VERSEVDI_CORE_H
#define VERSEVDI_CORE_H
#include <stddef.h>
#include <stdint.h>
#ifdef __cplusplus
extern "C" {
#endif
#define VERSE_CORE_ABI_VERSION_1 UINT32_C(1)
typedef uint32_t verse_status_t;
#define VERSE_STATUS_OK UINT32_C(0)
#define VERSE_STATUS_INVALID_ARGUMENT UINT32_C(1)
#define VERSE_STATUS_INVALID_STATE UINT32_C(2)
#define VERSE_STATUS_UNSUPPORTED_ABI UINT32_C(3)
#define VERSE_STATUS_AUTHORITY_REJECTED UINT32_C(4)
#define VERSE_STATUS_TLS UINT32_C(5)
#define VERSE_STATUS_TRANSPORT UINT32_C(6)
#define VERSE_STATUS_PROTOCOL UINT32_C(7)
#define VERSE_STATUS_EXPIRED UINT32_C(8)
#define VERSE_STATUS_QUEUE_FULL UINT32_C(9)
#define VERSE_STATUS_CANCELLED UINT32_C(10)
#define VERSE_STATUS_REENTRANT UINT32_C(11)
#define VERSE_STATUS_BUSY UINT32_C(12)
#define VERSE_STATUS_INTERNAL UINT32_C(13)
#define VERSE_STATE_CONNECTING UINT32_C(1)
#define VERSE_STATE_CONNECTED UINT32_C(2)
#define VERSE_STATE_CANCELLED UINT32_C(3)
#define VERSE_INPUT_KEYBOARD UINT32_C(1)
#define VERSE_INPUT_MOUSE_BUTTON UINT32_C(2)
#define VERSE_INPUT_RELATIVE_MOUSE UINT32_C(3)
#define VERSE_INPUT_TEXT UINT32_C(4)
#define VERSE_INPUT_CONTROLLER UINT32_C(5)
#define VERSE_INPUT_ABSOLUTE_MOUSE UINT32_C(6)
#define VERSE_INPUT_SCROLL UINT32_C(7)
typedef struct verse_core verse_core_t;
/* data may be NULL only when length is zero. The view never transfers ownership. */
typedef struct verse_bytes_view {
const uint8_t *data;
size_t length;
} verse_bytes_view_t;
typedef struct verse_state_event_v1 {
uint32_t struct_size;
uint32_t abi_version;
uint32_t state;
uint32_t reason;
} verse_state_event_v1_t;
typedef struct verse_error_event_v1 {
uint32_t struct_size;
uint32_t abi_version;
uint32_t code;
uint32_t retryable;
uint32_t phase;
uint32_t reserved;
} verse_error_event_v1_t;
typedef struct verse_stats_event_v1 {
uint32_t struct_size;
uint32_t abi_version;
uint64_t dropped_callbacks;
uint64_t dropped_media_units;
uint64_t dropped_input_events;
} verse_stats_event_v1_t;
typedef struct verse_media_event_v1 {
uint32_t struct_size;
uint32_t abi_version;
uint32_t channel;
uint32_t sequence;
uint64_t timestamp_ms;
verse_bytes_view_t encoded_unit;
} verse_media_event_v1_t;
typedef struct verse_control_event_v1 {
uint32_t struct_size;
uint32_t abi_version;
uint32_t kind;
uint32_t reserved;
verse_bytes_view_t payload;
} verse_control_event_v1_t;
/*
* Signers run synchronously inline on the thread invoking the API call.
* transcript/tls_message is borrowed only for the callback; signature_out is
* exactly 64 writable bytes. Admission may return OK, AUTHORITY_REJECTED,
* CANCELLED, or INTERNAL. TLS may return OK, TLS, CANCELLED, or INTERNAL. Any
* other value is normalized to INTERNAL.
*/
typedef verse_status_t (*verse_sign_admission_v1_fn)(
void *signer_context,
verse_bytes_view_t transcript,
uint8_t signature_out[64]);
typedef verse_status_t (*verse_sign_tls_ed25519_v1_fn)(
void *signer_context,
verse_bytes_view_t tls_message,
uint8_t signature_out[64]);
/*
* Event callbacks run asynchronously on one core-owned worker thread and are
* serialized with one another. Each event and nested byte view is borrowed only
* for its callback and must not be retained.
*/
typedef void (*verse_state_event_v1_fn)(
void *context,
const verse_state_event_v1_t *event);
typedef void (*verse_error_event_v1_fn)(
void *context,
const verse_error_event_v1_t *event);
typedef void (*verse_stats_event_v1_fn)(
void *context,
const verse_stats_event_v1_t *event);
typedef void (*verse_media_event_v1_fn)(
void *context,
const verse_media_event_v1_t *event);
typedef void (*verse_control_event_v1_fn)(
void *context,
const verse_control_event_v1_t *event);
/*
* create copies this table. context and every non-NULL callback must remain valid
* until destroy succeeds; BUSY does not end that lifetime.
*/
typedef struct verse_core_config_v1 {
uint32_t struct_size;
uint32_t abi_version;
void *context;
verse_sign_admission_v1_fn sign_admission;
verse_sign_tls_ed25519_v1_fn sign_tls_ed25519;
verse_state_event_v1_fn on_state;
verse_error_event_v1_fn on_error;
verse_stats_event_v1_fn on_stats;
verse_media_event_v1_fn on_media;
verse_control_event_v1_fn on_control;
} verse_core_config_v1_t;
typedef struct verse_connect_request_v1 {
uint32_t struct_size;
uint32_t abi_version;
verse_bytes_view_t manifest_json;
verse_bytes_view_t tunnel_credential_json;
} verse_connect_request_v1_t;
/* values are kind-specific signed fields; every unused field and flags must be zero. */
typedef struct verse_input_event_v1 {
uint32_t struct_size;
uint32_t abi_version;
uint32_t kind;
uint32_t flags;
int32_t values[12];
} verse_input_event_v1_t;
uint32_t verse_core_abi_version(void);
/*
* During a signer callback, every API below except verse_core_abi_version returns
* REENTRANT for every handle. During an event callback, only cancel on that event's
* originating handle is allowed; all other calls and cross-handle cancel return
* REENTRANT. Connect copies both byte inputs before returning, so callers may
* mutate or release their buffers afterward.
*/
verse_status_t verse_core_create_v1(
const verse_core_config_v1_t *config,
verse_core_t **out_core);
verse_status_t verse_core_connect_v1(
verse_core_t *core,
const verse_connect_request_v1_t *request);
verse_status_t verse_core_send_input_v1(
verse_core_t *core,
const verse_input_event_v1_t *event);
verse_status_t verse_core_request_idr_v1(verse_core_t *core);
/* Idempotent and nonblocking; it does not wait for an internal state lock. */
verse_status_t verse_core_cancel_v1(verse_core_t *core);
/*
* OK suppresses all later callbacks, releases session resources, and invalidates
* core. Calls admitted before destruction are accounted safely, but no API call
* may begin after OK. BUSY retains core, context, and callback ownership and
* requires a later retry.
*/
verse_status_t verse_core_destroy_v1(verse_core_t *core, uint32_t timeout_ms);
#if defined(__APPLE__) && defined(__aarch64__)
_Static_assert(sizeof(verse_bytes_view_t) == 16, "verse_bytes_view_t arm64 layout");
_Static_assert(sizeof(verse_core_config_v1_t) == 72, "verse_core_config_v1_t arm64 layout");
_Static_assert(offsetof(verse_core_config_v1_t, sign_admission) == 16, "config callback offset");
_Static_assert(sizeof(verse_connect_request_v1_t) == 40, "verse_connect_request_v1_t arm64 layout");
_Static_assert(offsetof(verse_connect_request_v1_t, manifest_json) == 8, "request view offset");
_Static_assert(sizeof(verse_input_event_v1_t) == 64, "verse_input_event_v1_t arm64 layout");
_Static_assert(sizeof(verse_state_event_v1_t) == 16, "verse_state_event_v1_t arm64 layout");
_Static_assert(sizeof(verse_error_event_v1_t) == 24, "verse_error_event_v1_t arm64 layout");
_Static_assert(sizeof(verse_stats_event_v1_t) == 32, "verse_stats_event_v1_t arm64 layout");
_Static_assert(sizeof(verse_media_event_v1_t) == 40, "verse_media_event_v1_t arm64 layout");
_Static_assert(sizeof(verse_control_event_v1_t) == 32, "verse_control_event_v1_t arm64 layout");
#endif
#ifdef __cplusplus
}
#endif
#endif