#pragma once #include #include #include #include "application.h" enum { kWebSocketFrameCapacity = 192, kWebSocketHelloTimeoutMs = 5000, }; typedef struct { int client_id; uint8_t session_index; bool active; bool authenticated; uint64_t opened_ms; } sync_connection_t; typedef struct { application_t *application; sync_connection_t connections[kSessionCapacity]; } sync_service_t; typedef bool (*sync_send_fn)(void *context, int client_id, const char *payload, size_t length); void sync_service_init(sync_service_t *service, application_t *application); bool sync_service_open(sync_service_t *service, int client_id, uint64_t now_ms); void sync_service_close(sync_service_t *service, int client_id); bool sync_service_receive(sync_service_t *service, int client_id, const char *frame, size_t frame_length, uint64_t now_ms, char output[kStateMessageCapacity], size_t *output_length, bool *state_changed, bool *close_client); void sync_service_expire(sync_service_t *service, uint64_t now_ms, int closed_clients[kSessionCapacity], size_t *closed_count); void sync_service_broadcast(sync_service_t *service, sync_send_fn send, void *context);