({
canvasElement,
paused = false,
remote = false,
simulator,
streamConfig,
streamConfigApplyKey = 0,
streamTransport = "auto",
}: UseLiveStreamOptions)
| 108 | } |
| 109 | |
| 110 | export function useLiveStream({ |
| 111 | canvasElement, |
| 112 | paused = false, |
| 113 | remote = false, |
| 114 | simulator, |
| 115 | streamConfig, |
| 116 | streamConfigApplyKey = 0, |
| 117 | streamTransport = "auto", |
| 118 | }: UseLiveStreamOptions): UseLiveStreamResult { |
| 119 | const clientTelemetryIdRef = useRef(""); |
| 120 | const workerClientRef = useRef<StreamWorkerClient | null>(null); |
| 121 | const latestDecodedFramesRef = useRef(0); |
| 122 | const latestFpsRef = useRef(0); |
| 123 | const latestRenderedFramesRef = useRef(0); |
| 124 | const latestStatsRef = useRef<StreamStats>(createEmptyStreamStats()); |
| 125 | const latestStatusRef = useRef<StreamStatus>({ state: "idle" }); |
| 126 | const retainedFrameRef = useRef(false); |
| 127 | const previousSimulatorUdidRef = useRef<string | undefined>(simulator?.udid); |
| 128 | const connectedStreamTargetKeyRef = useRef(""); |
| 129 | const canvasVisibleRef = useRef(true); |
| 130 | const latestVisualArtifactRef = useRef<VisualArtifactSample | null>(null); |
| 131 | const latestVisualArtifactSampleCountRef = useRef(0); |
| 132 | const lastVisualArtifactSampleAtRef = useRef(0); |
| 133 | const pageFpsRef = useRef(0); |
| 134 | const [deviceNaturalSize, setDeviceNaturalSize] = useState<Size | null>(null); |
| 135 | const [stats, setStats] = useState<StreamStats>(createEmptyStreamStats); |
| 136 | const [status, setStatus] = useState<StreamStatus>({ state: "idle" }); |
| 137 | const [error, setError] = useState(""); |
| 138 | const [fps, setFps] = useState(0); |
| 139 | const [streamCanvasRevision, setStreamCanvasRevision] = useState(0); |
| 140 | const [runtimeInfo] = useState<StreamRuntimeInfo>(detectRuntimeInfo); |
| 141 | |
| 142 | if (!clientTelemetryIdRef.current) { |
| 143 | clientTelemetryIdRef.current = createClientTelemetryId(); |
| 144 | } |
| 145 | |
| 146 | useEffect(() => { |
| 147 | let frameCount = 0; |
| 148 | let lastSampleAt = performance.now(); |
| 149 | let rafId = 0; |
| 150 | |
| 151 | const tick = () => { |
| 152 | frameCount += 1; |
| 153 | const now = performance.now(); |
| 154 | const elapsedMs = now - lastSampleAt; |
| 155 | if (elapsedMs >= CLIENT_TELEMETRY_INTERVAL_MS) { |
| 156 | pageFpsRef.current = (frameCount * 1000) / elapsedMs; |
| 157 | frameCount = 0; |
| 158 | lastSampleAt = now; |
| 159 | } |
| 160 | |
| 161 | rafId = window.requestAnimationFrame(tick); |
| 162 | }; |
| 163 | |
| 164 | rafId = window.requestAnimationFrame(tick); |
| 165 | return () => { |
| 166 | window.cancelAnimationFrame(rafId); |
| 167 | }; |
no test coverage detected