package sessionbroker import ( "context" "time" sessioncontracts "github.com/example/remote-access-platform/backend/pkg/contracts/session" ) type LiveStateStore interface { UpsertSession(ctx context.Context, state LiveSessionState) error GetSession(ctx context.Context, sessionID string) (*LiveSessionState, error) DeleteSession(ctx context.Context, sessionID string) error BindController(ctx context.Context, binding sessioncontracts.ControllerBinding, ttl time.Duration) error GetControllerBinding(ctx context.Context, sessionID string) (*sessioncontracts.ControllerBinding, error) ClearControllerBinding(ctx context.Context, sessionID string) error StoreAttachToken(ctx context.Context, claims sessioncontracts.AttachTokenClaims, ttl time.Duration) error ConsumeAttachToken(ctx context.Context, token string) (*sessioncontracts.AttachTokenClaims, error) TouchAttachmentHeartbeat(ctx context.Context, sessionID, attachmentID string, ttl time.Duration) error UpdateWorkerRoute(ctx context.Context, route WorkerRoute, ttl time.Duration) error GetWorkerRoute(ctx context.Context, sessionID string) (*WorkerRoute, error) DeleteWorkerRoute(ctx context.Context, sessionID string) error } type LiveSessionState struct { SessionID string `json:"session_id"` ResourceID string `json:"resource_id"` WorkerID string `json:"worker_id"` State sessioncontracts.State `json:"state"` ControllerID string `json:"controller_id"` AttachmentID string `json:"attachment_id"` TakeoverVersion int `json:"takeover_version"` RenderQualityProfile string `json:"render_quality_profile,omitempty"` RenderState string `json:"render_state,omitempty"` RenderWidth int `json:"render_width,omitempty"` RenderHeight int `json:"render_height,omitempty"` RenderFrameSequence int64 `json:"render_frame_sequence,omitempty"` RenderFrameFormat string `json:"render_frame_format,omitempty"` RenderFrameData string `json:"render_frame_data,omitempty"` LastInputCorrelationID string `json:"last_input_correlation_id,omitempty"` WorkerFrameCapturedAt string `json:"worker_frame_captured_at,omitempty"` CursorX int `json:"cursor_x,omitempty"` CursorY int `json:"cursor_y,omitempty"` CursorVisible bool `json:"cursor_visible,omitempty"` DirtyRectangles int `json:"dirty_rectangles,omitempty"` LastRenderAt *time.Time `json:"last_render_at,omitempty"` ClipboardSequence int64 `json:"clipboard_sequence,omitempty"` ClipboardText string `json:"clipboard_text,omitempty"` ClipboardOrigin string `json:"clipboard_origin,omitempty"` ClipboardContentHash string `json:"clipboard_content_hash,omitempty"` ClipboardUpdatedAt *time.Time `json:"clipboard_updated_at,omitempty"` FileDownloadSequence int64 `json:"file_download_sequence,omitempty"` FileDownloadType string `json:"file_download_type,omitempty"` FileDownloadPayload map[string]any `json:"file_download_payload,omitempty"` FileDownloadUpdatedAt *time.Time `json:"file_download_updated_at,omitempty"` UpdatedAt time.Time `json:"updated_at"` } type WorkerRoute struct { SessionID string `json:"session_id"` WorkerID string `json:"worker_id"` LeaseID string `json:"lease_id"` ControlStream string `json:"control_stream"` UpdatedAt time.Time `json:"updated_at"` }