205 lines
7.1 KiB
C
205 lines
7.1 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. transcript/tls_message is borrowed only for the call;
|
|
* 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 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
|