/** * CastSession: manages TCP connections to Quest, protocol handshake, * H.264 video decoding, pose control, and stay-awake lifecycle. */ import { EventEmitter } from "node:events"; import { type LayerInfo, type PoseOffset, type PoseDelta, type PoseState } from "@myerscarpenter/cast2-protocol"; export interface CastSessionOptions { listenPort?: number; width?: number; height?: number; } export declare class CastSession extends EventEmitter { private _listenPort; private _connected; private _running; private server; private controlSocket; private videoSocket; private controlSeq; private subMagic; private controlMsgSeq; private sessionUuid; private sessionTimestamp; private questMsgSeq; private decoder; private currentSpsPps; private currentIdr; private _frameCount; private _byteCount; private startTime; private _width; private _height; private _pose; private _poseLoopTimer; private _poseLoopActive; private _eye; private inputForwardingStarted; private _layerId; private _layerAutoSelected; private _layers; constructor(options?: CastSessionOptions); get listenPort(): number; get connected(): boolean; get running(): boolean; get frameCount(): number; get byteCount(): number; get width(): number; get height(): number; get pose(): PoseState; get layers(): Map; get layerId(): number; get poseLoopActive(): boolean; get eye(): number; get elapsedSeconds(): number; get fps(): number; /** Bind the TCP server, trying successive ports on EADDRINUSE. */ bind(): Promise; private tryBind; start(questIp?: string): Promise; stop(): Promise; restart(): Promise; adbSetup(questIp: string): Promise; startCastService(questIp: string): Promise; private waitForConnections; private sendXrsp; private nextSeq; private handleVideo; private processVideoPayload; getScreenshot(): Buffer | null; sendPose(pose: PoseState): void; applyPoseDelta(delta: PoseDelta): void; setPoseOffset(abs: PoseOffset): void; /** Start periodic pose refresh at ~27 Hz (matching MQDH cadence). */ startPoseLoop(): void; /** Stop periodic pose refresh. */ stopPoseLoop(): void; sendDisplayConfig(width: number, height: number, eye?: number): void; sendClick(x?: number, y?: number, layerId?: number, holdMs?: number): Promise; ensureInputForwarding(): void; sendInputForwardingState(state: number): void; resetView(): void; sendSetProperty(name: string, value: string): void; sendMud(typeId: number, payload?: Buffer): void; sendRotation(pitch?: number, yaw?: number, forward?: number, strafe?: number): void; private autoSelectLayer; } //# sourceMappingURL=session.d.ts.map