!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof globalThis?globalThis:"undefined"!=typeof self?self:{};e.SENTRY_RELEASE={id:"substack@e2042cf"};var r=(new e.Error).stack;r&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[r]="2213fce7-f3ec-4734-8c0a-e77788085166",e._sentryDebugIdIdentifier="sentry-dbid-2213fce7-f3ec-4734-8c0a-e77788085166")}catch(e){}}();"use strict";(self.webpackChunksubstack=self.webpackChunksubstack||[]).push([["27650"],{11475:function(e,r,t){t.d(r,{e:()=>u});var n=t(99851),o=t(69277),a=t(86500);function c(e){return{live_stream_id:e.live_stream_id,worker_instance_id:e.worker_instance_id,worker_user_id:e.worker_user_id,worker_start_timestamp:e.worker_start_timestamp,worker_time_offset:e.worker_time_offset}}function s(e){let{liveStreamId:r,userId:t,onError:n,onStatusUpdate:o,onWorkerMessage:a,initMessage:c}=e;return new Promise((e,s)=>{let i=new u({liveStreamId:r,userId:t,onError:n,onStatusUpdate:o,onWorkerMessage:r=>{"INIT_SUCCESS"===r.data.type?e(i):"INIT_ERROR"===r.data.type&&s(Error(r.data.error)),a(r)}});i.send(c)})}class u{static startNew(e){let{liveStreamId:r,userId:t,startTimestamp:n,timeOffset:o,codec:a,trackType:c,onError:u,onStatusUpdate:i,onWorkerMessage:l}=e;return s({liveStreamId:r,userId:t,onError:u,onStatusUpdate:i,onWorkerMessage:l,initMessage:{type:"INIT",liveStreamId:r,userId:t,startTimestamp:n,timeOffset:o,codec:a,trackType:c}})}static recover(e){let{liveStreamId:r,userId:t,startTimestamp:n,onError:o,onStatusUpdate:a,onWorkerMessage:c}=e;return s({liveStreamId:r,userId:t,onError:o,onStatusUpdate:a,onWorkerMessage:c,initMessage:{type:"INIT",liveStreamId:r,userId:t,startTimestamp:n,timeOffset:0,codec:"video/webm"}})}writeChunk(e){let{chunk:r,chunkIndex:t,timestamp:n}=e;this.send({type:"WRITE_CHUNK",chunkIndex:t,data:r,timestamp:n})}finalize(e){let{expectedChunkCount:r,endTimestamp:t,screenshareSegments:n}=e;this.send({type:"RECORDING_STOPPED",expectedChunkCount:r,endTimestamp:t,screenshareSegments:n})}setFinishedSessionsChunkCount(e){this.send({type:"SET_FINISHED_SESSIONS_CHUNK_COUNT",finishedSessionsChunkCount:e})}startDrain(){this.send({type:"START_DRAIN"})}setUploadPaused(e){let{paused:r}=e;this.send({type:"SET_UPLOAD_PAUSED",paused:r})}terminate(){this.worker.terminate()}send(e){(0,a.u4)(a.qY.LIVE_STREAM_HIGH_RES_RECORDING_UPDATED,{source:"message_to_worker",messageType:e.type,live_stream_id:this.liveStreamId,worker_user_id:this.userId}),this.worker.postMessage(e,"WRITE_CHUNK"===e.type?[e.data]:[])}constructor({liveStreamId:e,userId:r,onError:t,onStatusUpdate:s,onWorkerMessage:u}){(0,n._)(this,"worker",void 0),(0,n._)(this,"liveStreamId",void 0),(0,n._)(this,"userId",void 0),this.liveStreamId=e,this.userId=r,this.worker=new Worker("/high_res_uploader_worker.js",{type:"module"}),this.worker.onmessage=e=>{let r=e.data;(0,a.u4)(a.qY.LIVE_STREAM_HIGH_RES_RECORDING_UPDATED,(0,o._)({action:"message_from_worker",messageType:r.type},c(r)));let n=r.type;switch(n){case"INIT_SUCCESS":case"FINALIZE_SUCCESS":break;case"INIT_ERROR":case"FINALIZE_ERROR":t(r.error);break;case"CHUNK_WRITE_ERROR":console.error("Chunk write error:",r.error);break;case"CHUNK_UPLOAD_ERROR":console.error("Chunk upload error:",r.error);break;case"STATUS":s({backgroundUploadState:r.status.backgroundUploadState,percentComplete:r.status.percentComplete});break;case"FIRE_EVENT":(0,a.u4)(a.qY.LIVE_STREAM_HIGH_RES_RECORDING_UPDATED,(0,o._)({source:"event_message_to_worker",messageType:r.type,workerAction:r.action},c(r),r.props));break;default:console.warn("Unknown message type from worker:",n)}u(e)},this.worker.onerror=e=>{var r;console.error("HighResUploaderWorker error:",e),t(null!=(r=e.message)?r:"unknown worker error")}}}},5017:function(e,r,t){t.d(r,{F:()=>C});var n=t(4006),o=t(13369),a=t(88007),c=t(7611),s=t(45773),u=t(17402),i=t(84605),l=t(85478),d=t(46271),p=t(57820),f=t(63136),m=t(66511),g=t(69277),k=t(70408);function h(e){let{localVideoTrack:r,localAudioTrack:t,scalingMode:n="fill"}=e,o=(0,u.useRef)(null),[a,c]=(0,u.useState)(!1),s=(0,u.useRef)(0),i=(0,u.useRef)(0),l=(0,u.useRef)(null),d=(0,u.useRef)(null),p=(0,u.useCallback)(()=>{if(o.current)return o.current;let e=document.createElement("canvas");e.width=1920,e.height=1080;let r=e.getContext("2d");if(!r)throw Error("Failed to get 2d context for proxy recording canvas");let t=document.createElement("video");t.muted=!0,t.playsInline=!0;let n=new AudioContext,a=n.createMediaStreamDestination(),s=e.captureStream(30).getVideoTracks()[0],u=a.stream.getAudioTracks()[0];if(!s||!u)throw Error("Failed to initialize proxy media stream tracks");let i={canvas:e,canvasCtx:r,videoEl:t,audioContext:n,audioDestination:a,stream:new MediaStream([s,u])};return o.current=i,c(!0),i},[]),f=(0,u.useCallback)(()=>p().stream,[p]);return(0,u.useEffect)(()=>{let e=o.current;if(!e)return;let{canvas:t,canvasCtx:a,videoEl:c}=e;if(cancelAnimationFrame(s.current),r){let e=()=>{var e;let t=r.mediaStreamTrack,n=c.srcObject instanceof MediaStream?c.srcObject:null;(null!=(e=null==n?void 0:n.getVideoTracks()[0])?e:null)!==t&&(c.srcObject=new MediaStream([t]),c.play().catch(e=>{console.warn("Failed to play proxy video track",e)}))};e();let o=()=>{if(e(),c.readyState>=c.HAVE_CURRENT_DATA)try{if("letterbox"===n&&c.videoWidth>0&&c.videoHeight>0){let e,r,n,o;a.fillStyle="black",a.fillRect(0,0,t.width,t.height);let s=c.videoWidth/c.videoHeight,u=t.width/t.height;s>u?(e=t.width,r=t.width/s,n=0,o=(t.height-r)/2):(r=t.height,e=t.height*s,n=(t.width-e)/2,o=0),a.drawImage(c,n,o,e,r)}else a.drawImage(c,0,0,t.width,t.height)}catch(e){a.fillStyle="black",a.fillRect(0,0,t.width,t.height)}else a.fillStyle="black",a.fillRect(0,0,t.width,t.height);s.current=requestAnimationFrame(o)};s.current=requestAnimationFrame(o)}else{c.srcObject=null;let e=()=>{a.fillStyle="black",a.fillRect(0,0,t.width,t.height),s.current=requestAnimationFrame(e)};s.current=requestAnimationFrame(e)}return()=>{cancelAnimationFrame(s.current)}},[r,a,n]),(0,u.useEffect)(()=>{let e=o.current;if(!e)return;let{audioContext:r,audioDestination:n}=e;if(cancelAnimationFrame(i.current),t){let e=()=>{let e=t.mediaStreamTrack;if(d.current===e)return;l.current&&(l.current.disconnect(),l.current=null),d.current=null,"suspended"===r.state&&r.resume().catch(e=>{console.warn("Failed to resume proxy audio context",e)});let o=r.createMediaStreamSource(new MediaStream([e]));o.connect(n),l.current=o,d.current=e};e();let o=()=>{e(),i.current=requestAnimationFrame(o)};i.current=requestAnimationFrame(o)}else l.current&&(l.current.disconnect(),l.current=null),d.current=null;return()=>{cancelAnimationFrame(i.current),l.current&&(l.current.disconnect(),l.current=null),d.current=null}},[t,a]),(0,u.useEffect)(()=>()=>{cancelAnimationFrame(s.current),cancelAnimationFrame(i.current),l.current&&l.current.disconnect();let e=o.current;e&&(e.videoEl.srcObject=null,e.audioContext.close().catch(e=>{console.warn("Failed to close proxy audio context",e)}),e.stream.getTracks().forEach(e=>e.stop()))},[]),{getProxyStream:f}}var _=t(11475);function w(e){let{liveStreamId:r,userId:t,trackType:n,onWorkerMessage:o,onError:a}=e,c=(0,u.useRef)(null),[s,i]=(0,u.useState)(),[l,d]=(0,u.useState)("waiting_for_init"),[p,f]=(0,u.useState)(0),m=(0,u.useMemo)(()=>({backgroundUploadState:l,isComplete:"background_upload_complete"===l||"background_upload_error"===l,isManuallyPaused:!1,percentComplete:p,error:s}),[l,p,s]),g=(0,u.useCallback)(e=>{let{chunk:r,chunkIndex:t,timestamp:n}=e;c.current?c.current.writeChunk({chunkIndex:t,chunk:r,timestamp:n}):console.warn("UploadWorkerSession is not set, cannot write chunk")},[]),k=(0,u.useCallback)(e=>{let{paused:r}=e;c.current?c.current.setUploadPaused({paused:r}):console.warn("UploadWorkerSession is not set, cannot setUploadPaused")},[]),h=(0,u.useCallback)(e=>{let{expectedChunkCount:r,endTimestamp:t,screenshareSegments:n}=e;c.current?c.current.finalize({expectedChunkCount:r,endTimestamp:t,screenshareSegments:n}):console.warn("UploadWorkerSession is not set, cannot finalize")},[]),w=(0,u.useCallback)(e=>{let{finishedSessionsChunkCount:r}=e;c.current&&c.current.setFinishedSessionsChunkCount(r)},[]),S=(0,u.useCallback)(()=>{c.current?c.current.startDrain():console.warn("UploadWorkerSession is not set, cannot startDrain")},[]),v=(0,u.useCallback)(async e=>{let{startTimestamp:s,timeOffset:u,codec:l}=e;d("preparing_background_upload");try{c.current=await _.e.startNew({liveStreamId:r,userId:t,startTimestamp:s,timeOffset:u,codec:l,trackType:n,onStatusUpdate:e=>{let{backgroundUploadState:r,percentComplete:t}=e;d(r),f(t)},onError:e=>{i(e),a(e)},onWorkerMessage:o})}catch(r){let e=r instanceof Error?r.message:String(r);i(e),a(e)}},[r,t,n,a,o]);return(0,u.useEffect)(()=>()=>{var e;null==(e=c.current)||e.terminate(),c.current=null},[]),{startNew:v,setUploadPaused:k,setFinishedSessionsChunkCount:w,finalize:h,startDrain:S,writeChunk:g,progress:m}}let S=["video/webm;codecs=av01,opus","video/mp4;codecs=av01,mp4a.40.2","video/webm;codecs=vp9,opus","video/mp4;codecs=hvc1,mp4a.40.2","video/mp4;codecs=hevc,mp4a.40.2","video/webm;codecs=h264,opus","video/mp4;codecs=avc1,mp4a.40.2","video/webm","video/mp4"],v=["video/webm;codecs=av01,opus","video/mp4;codecs=av01,mp4a.40.2","video/webm;codecs=vp9,opus","video/mp4;codecs=hvc1,mp4a.40.2","video/mp4;codecs=hevc,mp4a.40.2","video/webm;codecs=h264,opus","video/mp4;codecs=avc1,mp4a.40.2","video/webm","video/mp4"];async function R(){let e=E();try{let r=await fetch("https://www.cloudflare.com/cdn-cgi/trace");if(!r.ok)return null;let t=E(),n=await r.text(),o=function(e){let r;for(let t of e.split("\n")){let[e,n]=t.split("=");if("ts"===e&&n){r=1e3*parseFloat(n);break}}return void 0===r||isNaN(r)?null:{ts:r}}(n);if(!o)return null;return{localTimeBefore:e,serverTime:o.ts,rtt:Math.round(t-e)}}catch(e){return null}}function b(e){let r=e.localTimeBefore+e.rtt/2;return e.serverTime-r}async function y(){var e,r,t;let n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:5,o=[];for(let e=0;esetTimeout(e,100))}if(0===o.length)throw Error("Time synchronization failed: no successful samples collected");let a=o.map(b);a.sort((e,r)=>e-r);let c=Math.floor(a.length/2),s=a.length%2==0?((null!=(e=a[c-1])?e:0)+(null!=(r=a[c])?r:0))/2:null!=(t=a[c])?t:0,u=o.map(e=>e.rtt);return{offset:Math.round(s),accuracy:Math.round(Math.max((u.length>0?Math.min(...u):0)/2,(a.length>0?Math.max(...a)-Math.min(...a):0)/2)),samples:o.length,getSyncedMonotonicNowMs:()=>Math.round(E()+s)}}function E(){return performance.timeOrigin+performance.now()}function C(e){var r,t,_,R;let b,{liveStreamId:E,onBackgroundRecordingUpdate:C}=e,T=(0,o.mP)(),I=(0,d.Jd)(),{getConfigFor:M}=(0,l.mJ)(),{iString:U}=(0,i.GO)(),[N,A]=(0,u.useState)(null),[F,D]=(0,u.useState)(null),[P,O]=(0,u.useState)(null),[x,H]=(0,u.useState)(null),[L,W]=(0,u.useState)(null),z=(0,u.useRef)(!1),q=!!M("enable_high_res_background_uploading"),{getTimeSyncResult:V}=function(e){let{enabled:r}=e,t=(0,u.useRef)(null);return{getTimeSyncResult:(0,u.useCallback)(()=>r?(t.current||(t.current=y()),t.current):Promise.reject(Error("Time sync not enabled")),[r])}}({enabled:q}),{progress:Y,start:K,stop:G,toggleManualPause:j}=function(e){let{enabled:r,liveStreamId:t,userId:n,localVideoTrack:o,localAudioTrack:a,connectionQuality:c,getTimeSyncResult:s}=e,{getProxyStream:i}=h({localVideoTrack:o,localAudioTrack:a}),[l,d]=(0,u.useState)("waiting_for_init"),p=(0,u.useRef)(null),f=(0,u.useRef)(null),m=(0,u.useRef)(0),_=(0,u.useRef)(0),v=(0,u.useRef)(!1),[R,b]=(0,u.useState)(),y=(0,u.useCallback)(e=>{d("error"),b(e)},[]),E=(0,u.useRef)(Promise.resolve()),C=w({userId:n,liveStreamId:t,onError:y,onWorkerMessage:(0,u.useCallback)(e=>{let r=e.data,t=r.type;switch(t){case"INIT_SUCCESS":d("recording");break;case"INIT_ERROR":case"CHUNK_WRITE_ERROR":case"FINALIZE_ERROR":d("error"),b(r.error);break;case"CHUNK_UPLOAD_ERROR":case"STATUS":case"FIRE_EVENT":break;case"FINALIZE_SUCCESS":d("complete");break;default:console.warn("Unknown message type from worker:",t)}},[])}),T=(0,u.useCallback)(async()=>{if(!r||"waiting_for_init"!==l)return;if(!("undefined"!=typeof navigator&&"storage"in navigator&&"function"==typeof navigator.storage.getDirectory&&"undefined"!=typeof Worker&&"undefined"!=typeof MediaRecorder))return void console.warn("High-res recording not supported in this browser");let e=function(){for(let e of S)if(MediaRecorder.isTypeSupported(e))return e;return null}();if(!e)return void console.warn("No supported MIME type for MediaRecorder");d("initializing"),b(void 0),_.current=0;try{let r=await s();f.current=r,m.current=r.getSyncedMonotonicNowMs(),await C.startNew({startTimestamp:m.current,timeOffset:f.current.offset,codec:e});let t=i(),n=new MediaRecorder(t,{mimeType:e,videoBitsPerSecond:4e7,audioBitsPerSecond:256e3});n.ondataavailable=async e=>{if(e.data.size>0){let r=E.current.then(async()=>{var r,t;let n=await e.data.arrayBuffer(),o=null!=(t=null==(r=f.current)?void 0:r.getSyncedMonotonicNowMs())?t:Date.now();C.writeChunk({chunkIndex:_.current,chunk:n,timestamp:o}),_.current++}).catch(e=>{console.error("Error processing chunk:",e)});E.current=r}},n.onerror=e=>{console.error("MediaRecorder error:",e),d("error"),b("MediaRecorder error")},n.onstop=()=>{E.current.finally(()=>{var e,r;v.current?d("complete"):(d("finalizing"),C.finalize({expectedChunkCount:_.current,endTimestamp:null!=(r=null==(e=f.current)?void 0:e.getSyncedMonotonicNowMs())?r:Date.now()}))})},p.current=n,n.start(1e4)}catch(e){console.error("Failed to start recording:",e),d("error"),b(e instanceof Error?e.message:"Failed to start recording")}},[r,l,i,C,s]),I=(0,u.useCallback)(async()=>{"recording"===l&&(d("stopping"),p.current&&"inactive"!==p.current.state&&p.current.stop())},[l]),M=(0,u.useCallback)(()=>{v.current=!0;let e="background_upload_paused"===C.progress.backgroundUploadState;C.setUploadPaused({paused:!e})},[C]);return(0,u.useEffect)(()=>{"recording"!==l||!c||v.current||C.setUploadPaused({paused:"poor"===c||"lost"===c})},[c,l,C]),(0,u.useEffect)(()=>()=>{p.current&&"inactive"!==p.current.state&&p.current.stop()},[]),{progress:(0,u.useMemo)(()=>{let e=null!=R?R:C.progress.error;return(0,k._)((0,g._)({},C.progress),{error:e,isManuallyPaused:v.current})},[R,C.progress]),start:T,stop:I,toggleManualPause:M}}({enabled:q,liveStreamId:E,userId:null!=(r=null==I?void 0:I.id)?r:0,localVideoTrack:N,localAudioTrack:F,connectionQuality:L,getTimeSyncResult:V}),B=function(e){let{enabled:r,liveStreamId:t,userId:n,connectionQuality:o,getTimeSyncResult:a}=e,[c,s]=(0,u.useState)(null),[i,l]=(0,u.useState)(null),{getProxyStream:d}=h({localVideoTrack:c,localAudioTrack:i,scalingMode:"letterbox"}),[p,f]=(0,u.useState)(),m=(0,u.useRef)(!1),_=(0,u.useRef)(!1),S=(0,u.useRef)([]),R=(0,u.useRef)(0),b=(0,u.useRef)(null),y=(0,u.useRef)(!1),E=(0,u.useRef)(!1),C=(0,u.useRef)(null),T=(0,u.useRef)(0),I=(0,u.useRef)(Promise.resolve()),M=w({userId:n,liveStreamId:t,trackType:"screenshare",onError:(0,u.useCallback)(e=>{f(e)},[]),onWorkerMessage:(0,u.useCallback)(e=>{let r=e.data;switch(r.type){case"INIT_SUCCESS":case"CHUNK_UPLOAD_ERROR":case"FINALIZE_SUCCESS":case"STATUS":case"FIRE_EVENT":break;case"INIT_ERROR":case"CHUNK_WRITE_ERROR":case"FINALIZE_ERROR":f(r.error);break;default:console.warn("Unknown message type from worker:",r)}},[])}),U=(0,u.useCallback)(async(e,t)=>{if(!r||_.current||y.current)return;if(!("undefined"!=typeof navigator&&"storage"in navigator&&"function"==typeof navigator.storage.getDirectory&&"undefined"!=typeof Worker&&"undefined"!=typeof MediaRecorder))return void console.warn("High-res recording not supported in this browser");let n=function(){for(let e of v)if(MediaRecorder.isTypeSupported(e))return e;return null}();if(!n)return void console.warn("No supported MIME type for MediaRecorder");y.current=!0,f(void 0);try{var o,c;if(!m.current){let e=await a();C.current=e,T.current=e.getSyncedMonotonicNowMs(),await M.startNew({startTimestamp:T.current,timeOffset:e.offset,codec:n}),m.current=!0}let r=null!=(c=null==(o=C.current)?void 0:o.getSyncedMonotonicNowMs())?c:Date.now();S.current.push({startTimestamp:r,endTimestamp:0,hasAudio:null!==t}),s(e),l(t),d(),await new Promise(e=>requestAnimationFrame(()=>requestAnimationFrame(()=>e())));let u=d(),i=[...u.getVideoTracks()];t&&i.push(...u.getAudioTracks());let p=new MediaStream(i),g=new MediaRecorder(p,{mimeType:n,videoBitsPerSecond:4e7,audioBitsPerSecond:256e3});g.ondataavailable=async e=>{if(e.data.size>0){let r=I.current.then(async()=>{var r,t;let n=await e.data.arrayBuffer(),o=null!=(t=null==(r=C.current)?void 0:r.getSyncedMonotonicNowMs())?t:Date.now();M.writeChunk({chunkIndex:R.current,chunk:n,timestamp:o}),R.current++}).catch(e=>{console.error("Error processing screenshare chunk:",e)});I.current=r}},g.onerror=e=>{console.error("Screenshare MediaRecorder error:",e),f("MediaRecorder error")},g.onstop=()=>{I.current.then(()=>{if(E.current){var e,r;E.current=!1,M.finalize({expectedChunkCount:R.current,endTimestamp:null!=(r=null==(e=C.current)?void 0:e.getSyncedMonotonicNowMs())?r:Date.now(),screenshareSegments:S.current})}else M.setFinishedSessionsChunkCount({finishedSessionsChunkCount:R.current})})},b.current=g,g.start(1e4),_.current=!0}catch(e){console.error("Failed to start screenshare recording session:",e),f(e instanceof Error?e.message:"Failed to start screenshare recording")}finally{y.current=!1}},[r,d,M,a]),N=(0,u.useCallback)(()=>{if(!_.current)return;_.current=!1,b.current&&"inactive"!==b.current.state&&b.current.stop(),b.current=null;let e=S.current[S.current.length-1];if(e){var r,t;e.endTimestamp=null!=(t=null==(r=C.current)?void 0:r.getSyncedMonotonicNowMs())?t:Date.now()}s(null),l(null)},[]),A=(0,u.useCallback)(()=>{m.current&&(_.current?(E.current=!0,N()):I.current.finally(()=>{var e,r;M.finalize({expectedChunkCount:R.current,endTimestamp:null!=(r=null==(e=C.current)?void 0:e.getSyncedMonotonicNowMs())?r:Date.now(),screenshareSegments:S.current})}))},[N,M]);return(0,u.useEffect)(()=>{m.current&&o&&M.setUploadPaused({paused:"poor"===o||"lost"===o})},[o,M]),(0,u.useEffect)(()=>()=>{b.current&&"inactive"!==b.current.state&&b.current.stop()},[]),{startSession:U,stopSession:N,finalStop:A,progress:(0,u.useMemo)(()=>(0,k._)((0,g._)({},M.progress),{error:null!=p?p:M.progress.error}),[p,M.progress])}}({enabled:q,liveStreamId:E,userId:null!=(t=null==I?void 0:I.id)?t:0,connectionQuality:L,getTimeSyncResult:V});(0,u.useEffect)(()=>{if(!T||!q)return;let e=()=>{let e=null,r=null;for(let t of T.localParticipant.videoTrackPublications.values())t.track&&(t.track.source===a.Track.Source.Camera?e=t.track:t.track.source===a.Track.Source.ScreenShare&&(r=t.track));let t=null,n=null;for(let e of T.localParticipant.audioTrackPublications.values())e.track&&(e.track.source===a.Track.Source.ScreenShareAudio?n=e.track:t=e.track);A(e),D(t),O(r),H(n)},r=(e,r)=>{r.isLocal&&W(e)},t=null,n=()=>{e(),null!==t&&clearTimeout(t),t=setTimeout(()=>{t=null,e()},0)};return e(),T.on(a.RoomEvent.LocalTrackPublished,n),T.on(a.RoomEvent.LocalTrackUnpublished,n),T.on(a.RoomEvent.ConnectionQualityChanged,r),()=>{null!==t&&clearTimeout(t),T.off(a.RoomEvent.LocalTrackPublished,n),T.off(a.RoomEvent.LocalTrackUnpublished,n),T.off(a.RoomEvent.ConnectionQualityChanged,r)}},[T,q]),(0,u.useEffect)(()=>{q&&!z.current&&"waiting_for_init"===Y.backgroundUploadState&&(z.current=!0,K().catch(e=>{console.error("Failed to start high-res recording:",e)}))},[q,Y.backgroundUploadState,K]),(0,u.useEffect)(()=>{if(!q)return;if(!P)return void B.stopSession();let e=setTimeout(()=>{B.startSession(P,x).catch(e=>{console.error("Failed to start screenshare recording session:",e)})},200);return()=>clearTimeout(e)},[q,P,x,B]),(0,u.useEffect)(()=>{if(!T||!q)return;let e=()=>{G().catch(e=>{console.error("Failed to stop high-res recording:",e)}),B.finalStop()};return T.on(a.RoomEvent.Disconnected,e),()=>{T.off(a.RoomEvent.Disconnected,e)}},[T,q,G,B]);let Z=Y.backgroundUploadState,J=B.progress,Q="waiting_for_init"!==J.backgroundUploadState,$=Q?(_=Z,R=J.backgroundUploadState,(b={background_upload_error:6,background_upload_paused:5,preparing_background_upload:4,background_upload_in_progress:3,background_upload_complete:2,waiting_for_init:1})[_]>=b[R]?_:R):Z,X=Q?(Y.percentComplete+J.percentComplete)/2:Y.percentComplete,ee=(0,u.useMemo)(()=>{var e;return{backgroundUploadState:$,isComplete:Y.isComplete&&(!Q||J.isComplete),isManuallyPaused:Y.isManuallyPaused,percentComplete:X,error:null!=(e=Y.error)?e:J.error}},[$,X,Y,J,Q]);(0,u.useEffect)(()=>{null==C||C({progress:ee})},[C,ee]);let er=function(e){let{percentComplete:r,backgroundUploadState:t}=e;switch(t){case"preparing_background_upload":return(0,n.Y)(p.y$,{size:14,padding:0});case"background_upload_in_progress":return(0,n.FD)(f.EY,{children:[r.toFixed(0),"%"]});case"background_upload_paused":return(0,n.Y)(c.A,{size:14,style:{color:"var(--color-utility-success)"}});case"background_upload_complete":return(0,n.Y)(s.A,{size:14,style:{color:"var(--color-utility-success)"}});case"background_upload_error":return(0,n.Y)(s.A,{size:14,style:{color:"var(--color-utility-danger)"}});case"waiting_for_init":return null;default:return console.warn("Unknown background upload state: ".concat(t)),null}}({percentComplete:X,backgroundUploadState:$});if(!er)return null;let et=(e,r,t)=>{switch(e){case"waiting_for_init":return U("Waiting");case"preparing_background_upload":return U("Preparing...");case"background_upload_paused":return U("Paused");case"background_upload_in_progress":return"".concat(r.toFixed(0),"%");case"background_upload_complete":return U("Complete");case"background_upload_error":return null!=t?t:U("Error");default:return""}},en="".concat(U("Camera"),": ").concat(et(Z,Y.percentComplete,Y.error)),eo=Q?"\n".concat(U("Screen"),": ").concat(et(J.backgroundUploadState,J.percentComplete,J.error)):"";return(0,n.Y)(m.m_,{text:en+eo,side:"bottom",children:(0,n.Y)("div",{style:{display:"flex",alignItems:"center",gap:4,padding:"4px 8px",borderRadius:4,background:"rgba(0,0,0,0.6)",cursor:"default",zIndex:10},onClick:void 0,children:er})})}}}]);