@vidtreo/recorder-wc 1.3.5 → 1.3.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -119,7 +119,7 @@ hasOffscreenCanvas:typeof OffscreenCanvas!=="undefined",
119
119
  hasCreateImageBitmap:typeof createImageBitmap!=="undefined",
120
120
  hasReadableStream:typeof ReadableStream!=="undefined"
121
121
  });
122
- };`],{type:`application/javascript`})}function Bm(){let e=zm();return URL.createObjectURL(e)}function Vm(e){URL.revokeObjectURL(e)}let Hm=`probe`,Um=`probeResult`,Wm=`mediaStreamTrackProcessor`,Gm=`unavailable`,Km=`unavailable`,qm=new Map,Jm=new Map;function Ym(e,t){return typeof e==`boolean`?e:t}function Xm(e){return e?`1`:`0`}function Zm(e,t){return[`audio`,Xm(e),`watermark`,Xm(t)].join(`|`)}function Qm(){return typeof process>`u`||process.env,!0}function $m(e){return e.probeResult.hasMediaStreamTrackProcessor?`worker-track`:e.hasMainThreadMediaStreamTrackProcessor?`main-thread-stream`:Gm}function eh(e){return e.requiresAudio?e.hasMainThreadMediaStreamTrackProcessor&&e.probeResult.hasAudioData?`main-thread-audio-stream`:e.hasAudioContext&&e.hasAudioWorklet?`audio-worklet-chunks`:Km:`none-required`}function th(e,t){return e.includes(t)?e:[...e,t]}function nh(e,t){let n=e;return t.hasWorker||(n=th(n,`worker`)),t.probeResult.hasVideoFrame||(n=th(n,`videoFrame`)),t.probeResult.hasOffscreenCanvas||(n=th(n,`offscreenCanvas`)),t.probeResult.hasReadableStream||(n=th(n,`readableStream`)),n}function rh(e,t){let n=e;return t.requiresWatermark&&!t.probeResult.hasCreateImageBitmap&&(n=th(n,`createImageBitmap`)),n}function ih(e,t){let n=e;return t.videoPath===Gm&&(n=th(n,Wm)),n}function ah(e,t){let n=e;return t.hasMainThreadMediaStreamTrackProcessor&&t.probeResult.hasAudioData?n:(t.hasMainThreadMediaStreamTrackProcessor||(n=th(n,Wm)),t.hasMainThreadMediaStreamTrackProcessor&&!t.probeResult.hasAudioData&&(n=th(n,`audioData`)),n)}function oh(e,t){let n=e;return t.hasAudioContext&&t.hasAudioWorklet?n:(t.hasAudioContext||(n=th(n,`audioContext`)),t.hasAudioWorklet||(n=th(n,`audioWorklet`)),n)}function sh(e,t){let n=e;return t.requiresAudio&&t.audioPath===Km?(n=ah(n,t),n=oh(n,t),n):n}function ch(e){let t=[];return t=nh(t,e),t=rh(t,e),t=ih(t,e),t=sh(t,e),t}function lh(e,t){return!(e===Gm||t===Km)}function uh(e,t){return!(!e.hasVideoFrame||!e.hasOffscreenCanvas||!e.hasReadableStream||t&&!e.hasCreateImageBitmap)}async function dh(e={}){let t=Ym(e.requiresAudio,!0),n=Ym(e.requiresWatermark,!1);if(!Qm())return await fh(t,n);let r=Zm(t,n),i=qm.get(r);if(i)return i;let a=Jm.get(r);if(a)return await a;let o=fh(t,n).then(e=>(qm.set(r,e),Jm.delete(r),e)).catch(e=>{throw Jm.delete(r),e});return Jm.set(r,o),await o}async function fh(e,t){let n=typeof Worker<`u`,r=a()!==null,i=typeof AudioWorkletNode<`u`,o=typeof MediaStreamTrackProcessor<`u`,s=await ph(n),c=$m({probeResult:s,hasMainThreadMediaStreamTrackProcessor:o}),l=eh({requiresAudio:e,hasAudioContext:r,hasAudioWorklet:i,hasMainThreadMediaStreamTrackProcessor:o,probeResult:s}),u=ch({hasWorker:n,hasAudioContext:r,hasAudioWorklet:i,hasMainThreadMediaStreamTrackProcessor:o,probeResult:s,requiresAudio:e,requiresWatermark:t,videoPath:c,audioPath:l}),d=lh(c,l),f=uh(s,t);return{isSupported:n&&d&&f,missing:u,hasWorker:n,hasAudioContext:r,hasAudioWorklet:i,hasMediaStreamTrackProcessor:s.hasMediaStreamTrackProcessor,hasMainThreadMediaStreamTrackProcessor:o,hasVideoFrame:s.hasVideoFrame,hasAudioData:s.hasAudioData,hasOffscreenCanvas:s.hasOffscreenCanvas,hasCreateImageBitmap:s.hasCreateImageBitmap,hasReadableStream:s.hasReadableStream,requiresAudio:e,requiresWatermark:t,videoPath:c,audioPath:l}}async function ph(e){if(!e)return hh();let t=await mh().catch(()=>null);return t?await new Promise(e=>{let n=!1,r=r=>{n||(n=!0,t.terminate(),e(r))},i=setTimeout(()=>{r(hh())},2e3);t.onmessage=e=>{let t=e.data;t.type===Um&&(clearTimeout(i),r({hasMediaStreamTrackProcessor:t.hasMediaStreamTrackProcessor===!0,hasVideoFrame:t.hasVideoFrame===!0,hasAudioData:t.hasAudioData===!0,hasOffscreenCanvas:t.hasOffscreenCanvas===!0,hasCreateImageBitmap:t.hasCreateImageBitmap===!0,hasReadableStream:t.hasReadableStream===!0}))},t.onerror=()=>{clearTimeout(i),r(hh())},Promise.resolve().then(()=>{t.postMessage({type:Hm})}).catch(()=>{clearTimeout(i),r(hh())})}):hh()}function mh(){return Promise.resolve().then(()=>{let e=Bm();try{let t=new Worker(e,{type:`classic`});return Vm(e),t}catch(t){throw Vm(e),t}})}function hh(){return{hasMediaStreamTrackProcessor:!1,hasVideoFrame:!1,hasAudioData:!1,hasOffscreenCanvas:!1,hasCreateImageBitmap:!1,hasReadableStream:!1}}let gh=`vidtreo-recorder`,_h=`pending-uploads`,vh=`status`,yh=`createdAt`;var bh=class{constructor(e){if(this.db=null,e){this.databaseFactory=e;return}this.databaseFactory=indexedDB}init(){return this.db?Promise.resolve():this.openDatabase(2,!0)}openDatabase(e,t){return new Promise((n,r)=>{let i=this.createOpenRequest(e);i.onerror=()=>{let e=i.error;if(t&&e&&e.name===`VersionError`){this.openDatabase(void 0,!1).then(n).catch(r);return}if(e){r(e);return}r(Error(`Failed to open database`))},i.onsuccess=()=>{if(!i.result){r(Error(`Database result is null`));return}let e=i.result,t=this.validateRequiredSchema(e);if(t){e.close(),r(t);return}this.db=e,n()},i.onupgradeneeded=e=>{let t=e.target.result;if(!t){r(Error(`Database upgrade result is null`));return}this.initializeStoreSchema(t)}})}createOpenRequest(e){return e===void 0?this.databaseFactory.open(gh):this.databaseFactory.open(gh,e)}initializeStoreSchema(e){if(e.objectStoreNames.contains(_h))return;let t=e.createObjectStore(_h,{keyPath:`id`});t.createIndex(vh,vh,{unique:!1}),t.createIndex(yh,yh,{unique:!1})}validateRequiredSchema(e){if(!e.objectStoreNames.contains(_h))return Error(`Database schema is missing required object store: pending-uploads`);let t=e.transaction([_h],`readonly`).objectStore(_h);return t.indexNames.contains(vh)?t.indexNames.contains(yh)?null:Error(`Database schema is missing required index: createdAt`):Error(`Database schema is missing required index: status`)}isInitialized(){return this.db!==null}savePendingUpload(e){let t=this.generateUploadId(),n={...e,id:t,status:`pending`,retryCount:0,createdAt:Date.now(),updatedAt:Date.now()};return this.executeTransaction(`readwrite`,e=>{let r=e.add(n);return new Promise((e,n)=>{r.onsuccess=()=>e(t),r.onerror=()=>{r.error?r.error.name===`QuotaExceededError`?n(Error(`Storage quota exceeded. Please free up space or delete old uploads.`)):n(r.error):n(Error(`Failed to save upload`))}})})}getPendingUploads(e){return this.executeTransaction(`readonly`,t=>{let n=e?t.index(vh).getAll(e):t.getAll();return new Promise((e,t)=>{n.onsuccess=()=>{if(n.result===void 0){t(Error(`Failed to get uploads: result is undefined`));return}e(n.result)},n.onerror=()=>{n.error?t(n.error):t(Error(`Failed to get uploads`))}})})}updateUploadStatus(e,t){return this.executeTransaction(`readwrite`,n=>{let r=n.get(e);return new Promise((e,i)=>{r.onsuccess=()=>{let a=r.result;if(!a){i(Error(`Upload not found`));return}let o={...a,...t,updatedAt:Date.now()},s=n.put(o);s.onsuccess=()=>e(),s.onerror=()=>{s.error?i(s.error):i(Error(`Failed to update upload`))}},r.onerror=()=>{r.error?i(r.error):i(Error(`Failed to get upload`))}})})}deleteUpload(e){return this.executeTransaction(`readwrite`,t=>{let n=t.delete(e);return new Promise((e,t)=>{n.onsuccess=()=>e(),n.onerror=()=>{n.error?t(n.error):t(Error(`Failed to delete upload`))}})})}async cleanupPermanentlyFailedUploads(e){let t=e===void 0?24:e;if(typeof t!=`number`||t<0)throw Error(`retentionHours must be a non-negative number`);let n=Date.now()-t*36e5,r=(await this.getPendingUploads()).filter(e=>e.status===`failed`&&e.retryCount>=10&&e.updatedAt<n);for(let e of r)await this.deleteUpload(e.id);return r.length}async getTotalStorageSize(){return(await this.getPendingUploads()).reduce((e,t)=>e+t.blob.size,0)}generateUploadId(){return`upload-${Date.now()}-${Math.random().toString(36).substring(2,11)}`}executeTransaction(e,t){if(!this.db)throw Error(`Database not initialized`);return t(this.db.transaction([_h],e).objectStore(_h))}},xh=class{constructor(){this.storageService=null,this.cleanupIntervalId=null}async initialize(e){this.storageService||=new bh,this.storageService.isInitialized()||await this.storageService.init(),this.setupCleanupInterval(e)}setupCleanupInterval(e){this.cleanupIntervalId===null&&(this.cleanupIntervalId=window.setInterval(()=>{this.performCleanup().catch(t=>{e(i(t))})},36e5))}async performCleanup(){if(!this.storageService)throw Error(`StorageService not initialized`);await this.storageService.cleanupPermanentlyFailedUploads(24)}getStorageService(){return this.storageService}destroy(){this.cleanupIntervalId!==null&&(clearInterval(this.cleanupIntervalId),this.cleanupIntervalId=null)}};function Sh(){let e=globalThis;if(e.__VIDTREO_DEBUG__===!0||e.__VIDTREO_DEV__===!0)return!0;let t=typeof process<`u`&&process?.env?`production`:void 0;return t===`development`||t===`test`||typeof localStorage<`u`&&localStorage.getItem(`VIDTREO_DEBUG`)===`true`}let Ch=Sh(),wh={reset:`\x1B[0m`,bright:`\x1B[1m`,dim:`\x1B[2m`,red:`\x1B[31m`,green:`\x1B[32m`,yellow:`\x1B[33m`,blue:`\x1B[34m`,magenta:`\x1B[35m`,cyan:`\x1B[36m`,white:`\x1B[37m`,gray:`\x1B[90m`};function Th(e,t,n){if(!Ch)return``;let r=n?.prefix||`[${e.toUpperCase()}]`;return`${wh[n?.color||Eh(e)]}${r}${wh.reset} ${t}`}function Eh(e){switch(e){case`error`:return`red`;case`warn`:return`yellow`;case`info`:return`cyan`;case`debug`:return`gray`;default:return`white`}}function Dh(e,t,...n){if(!Ch)return;let r=Th(e,t);console[e](r,...n)}let $={log:(e,...t)=>{Dh(`log`,e,...t)},info:(e,...t)=>{Dh(`info`,e,...t)},warn:(e,...t)=>{Dh(`warn`,e,...t)},error:(e,...t)=>{Dh(`error`,e,...t)},debug:(e,...t)=>{Dh(`debug`,e,...t)},group:(e,t=`cyan`)=>{if(!Ch)return;let n=wh[t],r=wh.reset;console.group(`${n}${e}${r}`)},groupEnd:()=>{Ch&&console.groupEnd()}};function Oh(e,t){if(e==null)throw Error(t);return e}function kh(e,t=`StreamProcessor`){if(!e)throw Error(`${t} is required`);return e}function Ah(){if(typeof navigator>`u`||!navigator.mediaDevices?.getUserMedia){let e=typeof window<`u`&&window.isSecureContext===!0?`Camera access is not supported in this browser`:`Camera access requires HTTPS. Please use a secure connection (https://) or localhost.`;throw Error(e)}return navigator.mediaDevices}function jh(e,t){let n={};if(t.originalCameraConstraints){let{deviceId:e,...r}=t.originalCameraConstraints;n={...n,...r}}e&&(n={...n,deviceId:{exact:e}});let r=t.getSelectedCameraDeviceId(),i=!1;return e&&(i=!0),n.deviceId&&(i=!0),!i&&r&&(n={...n,deviceId:{exact:r}}),n}function Mh(e){return e?{deviceId:{exact:e}}:!0}let Nh=`live`;function Ph(e){for(let t of e)t.readyState===Nh&&t.stop()}function Fh(e){Ph(e.getTracks())}function Ih(e){Ph(e.getVideoTracks())}function Lh(e){return e?e.readyState===Nh:!1}function Rh(e,t){return Lh(e)&&Lh(t)}function zh(e,t,n){if(!Lh(e)){Fh(n);let r=`undefined`;throw e&&(r=e.readyState),Error(`Failed to get live camera ${t} track. ReadyState: ${r}`)}}let Bh=`[SourceSwitchManager]`;var Vh=class{constructor(e){this.dependencies=e}async createCameraStreamWithOriginalAudio(e){let t=this.dependencies.getOriginalCameraStream(),n;if(t&&(n=t.getAudioTracks()[0]),this.dependencies.logger.debug(`${Bh} createCameraStreamWithOriginalAudio`,{hasOriginalCameraStream:!!t,originalCameraStreamId:t?.id,hasOriginalAudioTrack:!!n,originalAudioTrackId:n?.id,originalAudioTrackReadyState:n?.readyState,originalAudioTrackEnabled:n?.enabled,originalAudioTrackMuted:n?.muted,originalAudioTrackLabel:n?.label,isTrackLive:Lh(n),cameraDeviceId:e}),!Lh(n))return this.dependencies.logger.warn(`${Bh} Original audio track is not live, cannot reuse`,{originalAudioTrackId:n?.id,originalAudioTrackReadyState:n?.readyState}),null;let r=jh(e,{originalCameraConstraints:this.dependencies.getOriginalCameraConstraints(),getSelectedCameraDeviceId:this.dependencies.getSelectedCameraDeviceId}),i=Object.keys(r).length>0,a=!0;i&&(a=r);let o={video:a,audio:!1};this.dependencies.logger.debug(`${Bh} Requesting new video stream`,{constraints:o,cameraDeviceId:e});let s=await Ah().getUserMedia(o),c=s.getVideoTracks()[0];zh(c,`video`,s),this.dependencies.logger.debug(`${Bh} New video stream obtained`,{newStreamId:s.id,videoTrackId:c.id,videoTrackReadyState:c.readyState,newStreamAudioTracksCount:s.getAudioTracks().length});let l=[c];n&&(l=[...l,n]),this.dependencies.logger.debug(`${Bh} Creating combined stream with original audio`,{videoTrackId:c.id,audioTrackId:n?.id,audioTrackReadyState:n?.readyState,audioTrackEnabled:n?.enabled,audioTrackMuted:n?.muted,combinedTracksCount:l.length});let u=new MediaStream(l);Ph(s.getAudioTracks());let d=t?.id;return this.dependencies.setOriginalCameraStream(u),this.dependencies.logger.debug(`${Bh} Combined stream created and assigned`,{combinedStreamId:u.id,previousOriginalCameraStreamId:d,newOriginalCameraStreamId:u.id,combinedStreamVideoTracksCount:u.getVideoTracks().length,combinedStreamAudioTracksCount:u.getAudioTracks().length,combinedStreamAudioTrackId:u.getAudioTracks()[0]?.id,combinedStreamAudioTrackReadyState:u.getAudioTracks()[0]?.readyState,audioTrackStillSame:u.getAudioTracks()[0]===n}),u}async createCameraStreamWithNewAudio(e){let t=this.dependencies.getSelectedMicDeviceId(),n=jh(e,{originalCameraConstraints:this.dependencies.getOriginalCameraConstraints(),getSelectedCameraDeviceId:this.dependencies.getSelectedCameraDeviceId}),r=Mh(t),i=Object.keys(n).length>0,a=!0;i&&(a=n);let o={video:a,audio:r},s=await Ah().getUserMedia(o),c=s.getVideoTracks()[0],l=s.getAudioTracks()[0];return zh(c,`video`,s),zh(l,`audio`,s),this.dependencies.setOriginalCameraStream(s),s}async createNewCameraStreamForRecording(){let e=this.dependencies.getSelectedCameraDeviceId();return await this.createCameraStreamWithOriginalAudio(e)||this.createCameraStreamWithNewAudio(e)}async getCameraStream(e){let t=this.dependencies.streamManager.isRecording(),n=this.dependencies.getSelectedCameraDeviceId(),r=this.dependencies.getSelectedMicDeviceId();if(this.dependencies.streamManager.setVideoDevice(n),this.dependencies.streamManager.setAudioDevice(r),e.canReuseOriginalStream()){let e=this.dependencies.getOriginalCameraStream();if(!e)throw Error(`Original camera stream is null`);return e}if(e.canReuseManagerStream()){let e=this.dependencies.streamManager.getStream();if(!e)throw Error(`Manager stream is null`);return e}t||this.dependencies.getOriginalCameraStream()&&this.dependencies.setOriginalCameraStream(null);let i=this.dependencies.streamManager.getStream();if(!t&&i&&i!==this.dependencies.getOriginalCameraStream()&&(Fh(i),this.dependencies.streamManager.setMediaStream(null)),t)return this.dependencies.streamManager.setVideoDevice(this.dependencies.getSelectedCameraDeviceId()),this.dependencies.streamManager.setAudioDevice(this.dependencies.getSelectedMicDeviceId()),this.createNewCameraStreamForRecording();let a=await this.dependencies.streamManager.startStream();return this.dependencies.setOriginalCameraStream(a),a}};let Hh=`screen`,Uh=`No video track found in screen share stream`;async function Wh(e,t,n){n.setScreenShareStream(e);let r=e.getVideoTracks()[0];if(!r)throw n.stopStreamTracks(e),Error(Uh);let i=n.combineScreenShareWithOriginalAudio(r),a=n.getOriginalCameraStream();t&&t!==a&&n.stopStreamVideoTracks(t);let o=e.getAudioTracks();for(let e of o)e.stop();return n.setCurrentSourceType(Hh),n.callbacks.onSourceChange&&await n.callbacks.onSourceChange(n.getCurrentSourceType()),Gh(i,n),i}function Gh(e,t){let n=e.getVideoTracks()[0];if(!n)throw Error(Uh);let r=t.getScreenShareTrackEndHandler();if(r){let e=t.streamManager.getStream();if(e){let t=e.getVideoTracks()[0];t&&t.removeEventListener(`ended`,r)}}let i=()=>{t.getCurrentSourceType()===Hh&&t.switchToCamera().catch(e=>{t.handleSwitchError(e)})};t.setScreenShareTrackEndHandler(i),n.addEventListener(`ended`,i)}function Kh(e,t){let n=t.getScreenShareTrackEndHandler();if(!(n&&e))return;let r=e.getVideoTracks()[0];r&&r.removeEventListener(`ended`,n),t.setScreenShareTrackEndHandler(null)}function qh(e,t){e.onTransitionStart&&e.onTransitionStart(t)}function Jh(e){e.onTransitionEnd&&e.onTransitionEnd()}function Yh(e){e.onScreenSelectionStart&&e.onScreenSelectionStart()}function Xh(e){e.onScreenSelectionEnd&&e.onScreenSelectionEnd()}function Zh(e){Xh(e),Jh(e)}let Qh=`Failed to get camera stream`;var $h=class{constructor(e,t={}){this.currentSourceType=`camera`,this.originalCameraStream=null,this.screenShareStream=null,this.screenShareTrackEndHandler=null,this.streamManager=e,this.callbacks=t;let n=null,r=()=>n;this.getOriginalCameraConstraints=r,this.setOriginalCameraConstraints=e=>{n=e},this.cameraStreamBuilder=new Vh({streamManager:this.streamManager,logger:{debug:(e,t)=>$.debug(e,t),warn:(e,t)=>$.warn(e,t)},getSelectedCameraDeviceId:()=>this.callbacks.getSelectedCameraDeviceId?this.callbacks.getSelectedCameraDeviceId():this.streamManager.getVideoDevice(),getSelectedMicDeviceId:()=>this.callbacks.getSelectedMicDeviceId?this.callbacks.getSelectedMicDeviceId():this.streamManager.getAudioDevice(),getOriginalCameraStream:()=>this.originalCameraStream,setOriginalCameraStream:e=>{this.originalCameraStream=e},getOriginalCameraConstraints:r})}getCurrentSourceType(){return this.currentSourceType}getOriginalCameraStream(){return this.originalCameraStream}storeOriginalCameraConstraints(e){let t=e.getVideoTracks()[0];if(!t)return;let n=t.getSettings(),r={width:n.width,height:n.height,aspectRatio:n.aspectRatio,frameRate:n.frameRate,deviceId:n.deviceId,facingMode:n.facingMode},i=this.getOriginalCameraConstraints();i&&i.width===r.width&&i.height===r.height&&i.aspectRatio===r.aspectRatio&&i.frameRate===r.frameRate&&i.deviceId===r.deviceId&&i.facingMode===r.facingMode||this.setOriginalCameraConstraints(r)}storeOriginalCameraStream(e){let t=e.getVideoTracks()[0],n=e.getAudioTracks()[0];Rh(t,n)?this.originalCameraStream=new MediaStream([t,n]):this.originalCameraStream=e}createError(e){return e instanceof Error?e:Error(i(e))}waitForTracksToEnd(e){return new Promise(t=>{setTimeout(()=>{this.screenShareStream=null,t()},e)})}combineScreenShareWithOriginalAudio(e){let t;this.originalCameraStream&&(t=this.originalCameraStream.getAudioTracks()[0]),$.debug(`[SourceSwitchManager] combineScreenShareWithOriginalAudio`,{hasOriginalCameraStream:!!this.originalCameraStream,originalCameraStreamId:this.originalCameraStream?.id,hasOriginalAudioTrack:!!t,originalAudioTrackId:t?.id,originalAudioTrackReadyState:t?.readyState,originalAudioTrackEnabled:t?.enabled,originalAudioTrackMuted:t?.muted,originalAudioTrackLabel:t?.label,isTrackLive:Lh(t),screenVideoTrackId:e.id,screenVideoTrackReadyState:e.readyState});let n=[e];Lh(t)&&t?(n=[...n,t],$.debug(`[SourceSwitchManager] Added original audio track to combined stream`,{audioTrackId:t.id,combinedTracksCount:n.length})):$.warn(`[SourceSwitchManager] Original audio track is not live, not adding to combined stream`,{audioTrackId:t?.id,audioTrackReadyState:t?.readyState,combinedTracksCount:n.length});let r=new MediaStream(n);return $.debug(`[SourceSwitchManager] Combined stream created`,{combinedStreamId:r.id,combinedStreamVideoTracksCount:r.getVideoTracks().length,combinedStreamAudioTracksCount:r.getAudioTracks().length,combinedStreamAudioTrackId:r.getAudioTracks()[0]?.id,combinedStreamAudioTrackReadyState:r.getAudioTracks()[0]?.readyState}),r}isPermissionDeniedError(e){let t=i(e),n=!1;t.includes(`NotAllowedError`)&&(n=!0),t.includes(`AbortError`)&&(n=!0);let r=t.toLowerCase();return r.includes(`permission denied`)&&(n=!0),r.includes(`user denied`)&&(n=!0),n}switchToScreenCapture(){let e=this.streamManager.getStream();return e&&(this.storeOriginalCameraConstraints(e),this.storeOriginalCameraStream(e)),qh(this.callbacks,`Select screen to share...`),Yh(this.callbacks),Promise.resolve().then(async()=>{let t=Ah();if(typeof t.getDisplayMedia!=`function`)throw Error(`Screen sharing is not supported on this device`);return Wh(await t.getDisplayMedia({video:!0,audio:!0}),e,this.getScreenShareDependencies())}).catch(e=>{if(Zh(this.callbacks),this.isPermissionDeniedError(e))return null;throw e})}canReuseStream(e,t){if(!e||t&&e!==this.originalCameraStream)return!1;let n=e.getVideoTracks()[0],r=e.getAudioTracks()[0];return!(!Rh(n,r)||this.callbacks.getSelectedCameraDeviceId&&this.callbacks.getSelectedCameraDeviceId()!==n.getSettings().deviceId)}canReuseOriginalStream(){return this.canReuseStream(this.originalCameraStream,!1)}canReuseManagerStream(){let e=this.streamManager.getStream();return e&&this.originalCameraStream?this.canReuseStream(e,!0):!1}getScreenShareDependencies(){return{callbacks:this.callbacks,streamManager:this.streamManager,combineScreenShareWithOriginalAudio:e=>this.combineScreenShareWithOriginalAudio(e),stopStreamTracks:e=>Fh(e),stopStreamVideoTracks:e=>Ih(e),getCurrentSourceType:()=>this.currentSourceType,setCurrentSourceType:e=>{this.currentSourceType=e},getOriginalCameraStream:()=>this.originalCameraStream,getScreenShareStream:()=>this.screenShareStream,setScreenShareStream:e=>{this.screenShareStream=e},getScreenShareTrackEndHandler:()=>this.screenShareTrackEndHandler,setScreenShareTrackEndHandler:e=>{this.screenShareTrackEndHandler=e},switchToCamera:()=>this.switchToCamera(),handleSwitchError:e=>{this.callbacks.onError&&this.callbacks.onError(this.createError(e))}}}getCameraStream(){return this.cameraStreamBuilder.getCameraStream({canReuseOriginalStream:()=>this.canReuseOriginalStream(),canReuseManagerStream:()=>this.canReuseManagerStream()})}switchToCamera(){let e=this.streamManager.isRecording();return!e&&this.currentSourceType===`camera`?Promise.resolve():Promise.resolve().then(async()=>{qh(this.callbacks,`Switching to camera...`),await this.handleScreenShareStop();let t=await this.getCameraStream();if(!t)throw Error(Qh);await this.applyCameraStream(t,e),Jh(this.callbacks)}).catch(e=>{throw Jh(this.callbacks),e})}stopScreenShareStreamTracks(e){let t=e.getVideoTracks(),n=e.getAudioTracks();$.debug(`[SourceSwitchManager] stopping screen share tracks`,{videoTracks:t.map(e=>({id:e.id,readyState:e.readyState,displaySurface:e.getSettings().displaySurface,constraints:e.getConstraints()})),audioTracks:n.map(e=>({id:e.id,readyState:e.readyState,constraints:e.getConstraints()}))});for(let e of t)e.stop();for(let e of n)e.stop()}stopDisplayTracks(e){if(e)for(let t of e.getVideoTracks())typeof t.getSettings().displaySurface==`string`&&Lh(t)&&($.debug(`[SourceSwitchManager] stopping display track`,{id:t.id,readyState:t.readyState,constraints:t.getConstraints(),settings:t.getSettings()}),t.stop())}async handleScreenShareStop(){if(this.currentSourceType!==`screen`)return;$.debug(`[SourceSwitchManager] handleScreenShareStop invoked`,{currentSourceType:this.currentSourceType,hasScreenShareStream:!!this.screenShareStream,screenShareStreamId:this.screenShareStream?.id,hasOriginalCameraStream:!!this.originalCameraStream,originalCameraStreamId:this.originalCameraStream?.id});let e=this.screenShareStream,t=this.streamManager.getStream();if($.debug(`[SourceSwitchManager] Current stream state before stop`,{currentStreamId:t?.id,currentStreamVideoTracksCount:t?.getVideoTracks().length,currentStreamAudioTracksCount:t?.getAudioTracks().length,currentStreamAudioTrackId:t?.getAudioTracks()[0]?.id,currentStreamAudioTrackReadyState:t?.getAudioTracks()[0]?.readyState,originalCameraStreamAudioTrackId:this.originalCameraStream?.getAudioTracks()[0]?.id,originalCameraStreamAudioTrackReadyState:this.originalCameraStream?.getAudioTracks()[0]?.readyState}),e){let t=e.getAudioTracks();$.debug(`[SourceSwitchManager] Screen share stream audio tracks before stop`,{screenShareStreamId:e.id,screenShareAudioTracksCount:t.length,screenShareAudioTrackIds:t.map(e=>({id:e.id,readyState:e.readyState,enabled:e.enabled}))}),Kh(e,this.getScreenShareDependencies()),this.stopScreenShareStreamTracks(e),this.stopDisplayTracks(e),this.screenShareStream=null,await this.waitForTracksToEnd(0),$.debug(`[SourceSwitchManager] Screen share stream stopped`,{screenShareAudioTracksAfterStop:t.map(e=>({id:e.id,readyState:e.readyState}))})}if(t){let e=t.getAudioTracks();$.debug(`[SourceSwitchManager] Current stream audio tracks before video stop`,{currentStreamId:t.id,currentStreamAudioTracksCount:e.length,currentStreamAudioTrackIds:e.map(e=>({id:e.id,readyState:e.readyState,enabled:e.enabled}))}),Ih(t),this.stopDisplayTracks(t),$.debug(`[SourceSwitchManager] Current stream audio tracks after video stop`,{currentStreamId:t.id,currentStreamAudioTracksCount:t.getAudioTracks().length,currentStreamAudioTrackIds:t.getAudioTracks().map(e=>({id:e.id,readyState:e.readyState,enabled:e.enabled}))})}$.debug(`[SourceSwitchManager] Original camera stream state before source change`,{hasOriginalCameraStream:!!this.originalCameraStream,originalCameraStreamId:this.originalCameraStream?.id,originalCameraStreamAudioTracksCount:this.originalCameraStream?.getAudioTracks().length,originalCameraStreamAudioTrackId:this.originalCameraStream?.getAudioTracks()[0]?.id,originalCameraStreamAudioTrackReadyState:this.originalCameraStream?.getAudioTracks()[0]?.readyState,originalCameraStreamAudioTrackEnabled:this.originalCameraStream?.getAudioTracks()[0]?.enabled}),this.currentSourceType=`camera`,this.callbacks.onSourceChange&&await this.callbacks.onSourceChange(this.currentSourceType),$.debug(`[SourceSwitchManager] handleScreenShareStop completed`,{hasScreenShareStream:!!this.screenShareStream,currentSourceType:this.currentSourceType,hasOriginalCameraStream:!!this.originalCameraStream,originalCameraStreamId:this.originalCameraStream?.id,originalCameraStreamAudioTracksCount:this.originalCameraStream?.getAudioTracks().length,originalCameraStreamAudioTrackId:this.originalCameraStream?.getAudioTracks()[0]?.id,originalCameraStreamAudioTrackReadyState:this.originalCameraStream?.getAudioTracks()[0]?.readyState})}async applyCameraStream(e,t){this.streamManager.setMediaStream(e);let n=this.currentSourceType!==`camera`;this.currentSourceType=`camera`,n&&this.callbacks.onSourceChange&&await this.callbacks.onSourceChange(this.currentSourceType),t&&await this.streamManager.switchVideoSource(e),this.callbacks.onPreviewUpdate&&await this.callbacks.onPreviewUpdate(e)}async toggleSource(){if(!this.streamManager.isRecording())return;let e;e=this.currentSourceType===`camera`?this.switchToScreen():this.switchToCamera(),await e.catch(e=>{this.handleToggleError(e)})}async switchToScreen(){let e=await this.switchToScreenCapture();if(!e){Jh(this.callbacks);return}qh(this.callbacks,`Switching to screen...`),await this.streamManager.switchVideoSource(e),this.callbacks.onPreviewUpdate&&await this.callbacks.onPreviewUpdate(e),Jh(this.callbacks)}handleToggleError(e){Jh(this.callbacks);let t=i(e),n=!1;t.includes(`NotAllowedError`)&&(n=!0),t.includes(`AbortError`)&&(n=!0),n&&this.currentSourceType===`screen`&&this.switchToCamera().catch(e=>{this.callbacks.onError&&this.callbacks.onError(this.createError(e))}),!n&&this.callbacks.onError&&this.callbacks.onError(this.createError(e))}async handleRecordingStop(){if(this.currentSourceType!==`screen`){this.cleanup();return}await Promise.resolve().then(async()=>{let e=this.streamManager.getStream();e&&(Kh(e,this.getScreenShareDependencies()),Ih(e));let t=await this.getCameraStream();if(!t)throw Error(Qh);this.streamManager.setMediaStream(t),this.currentSourceType=`camera`,this.callbacks.onSourceChange&&await this.callbacks.onSourceChange(this.currentSourceType),this.callbacks.onPreviewUpdate&&await this.callbacks.onPreviewUpdate(t)}).catch(e=>{throw this.callbacks.onError&&this.callbacks.onError(this.createError(e)),e}),this.cleanup()}cleanup(){this.screenShareStream&&=(Kh(this.screenShareStream,this.getScreenShareDependencies()),this.stopScreenShareStreamTracks(this.screenShareStream),null);let e=this.streamManager.getStream();e&&Kh(e,this.getScreenShareDependencies()),this.screenShareTrackEndHandler=null,this.originalCameraStream=null,this.setOriginalCameraConstraints(null)}setCallbacks(e){this.callbacks={...this.callbacks,...e}}};let eg=Object.freeze({width:{ideal:Gt.width||1920},height:{ideal:Gt.height||1080},frameRate:{ideal:Gt.fps||30}}),tg=Object.freeze({video:eg,audio:!0});Object.freeze({mimeType:`video/webm;codecs=vp9,opus`});let ng={NotReadableError:`camera.in-use`,NotFoundError:`camera.not-found`,NotAllowedError:`camera.permission-denied`,OverconstrainedError:`camera.overconstrained`};function rg(e){if(e instanceof DOMException){let t=ng[e.name];if(t!==void 0)return t}if(typeof e==`object`&&e&&`name`in e&&typeof e.name==`string`){let t=ng[e.name];if(t!==void 0)return t}return`camera.unknown`}function ig(e){let t=i(e),n=Error(t);return n.name=`CameraError`,n.code=rg(e),n}var ag=class{constructor(e={}){this.mediaStream=null,this.state=`idle`,this.eventListeners=new Map,this.selectedAudioDeviceId=null,this.selectedVideoDeviceId=null,this.streamConfig={...tg,...e}}getState(){return this.state}getStream(){return this.mediaStream}getAudioStreamForAnalysis(){return this.mediaStream&&this.mediaStream.getAudioTracks().length>0?this.mediaStream:null}isActive(){return this.state===`active`||this.state===`recording`}on(e,t){this.eventListeners.has(e)||this.eventListeners.set(e,new Set);let n=this.eventListeners.get(e);return n&&n.add(t),()=>{this.off(e,t)}}off(e,t){let n=this.eventListeners.get(e);n&&n.delete(t)}once(e,t){let n=(r=>{t(r),this.off(e,n)});return this.on(e,n)}emit(e,t){let n=this.eventListeners.get(e);if(n)for(let e of n)try{e(t)}catch{}}setState(e){if(this.state===e)return;let t=this.state;this.state=e,this.emit(`statechange`,{state:e,previousState:t})}setAudioDevice(e){this.selectedAudioDeviceId=e}setVideoDevice(e){this.selectedVideoDeviceId=e}getAudioDevice(){return this.selectedAudioDeviceId}getVideoDevice(){return this.selectedVideoDeviceId}async getAvailableDevices(){try{let e=await navigator.mediaDevices.enumerateDevices();return{audioinput:e.filter(e=>e.kind===`audioinput`),videoinput:e.filter(e=>e.kind===`videoinput`)}}catch(e){throw Error(`Failed to enumerate devices: ${i(e)}`)}}buildDeviceConstraints(e,t){return e?typeof t==`object`?{...t,deviceId:{exact:e}}:{deviceId:{exact:e}}:t}buildVideoConstraints(e){return this.buildDeviceConstraints(e,this.streamConfig.video)}buildAudioConstraints(e){return this.buildDeviceConstraints(e,this.streamConfig.audio)}async startStream(){if($.debug(`[StreamManager] startStream called`,{hasExistingStream:!!this.mediaStream,selectedVideoDeviceId:this.selectedVideoDeviceId,selectedAudioDeviceId:this.selectedAudioDeviceId}),this.mediaStream){let e=this.mediaStream.getVideoTracks()[0];if(this.selectedVideoDeviceId===null)if(e?.getSettings?.()?.deviceId)$.debug(`[StreamManager] Stopping existing stream to recreate`),this.stopStream();else return $.debug(`[StreamManager] Reusing existing stream`),this.mediaStream;if(e?.getSettings&&e.getSettings().deviceId===this.selectedVideoDeviceId)return $.debug(`[StreamManager] Existing stream matches device, reusing`),this.mediaStream;$.debug(`[StreamManager] Device changed, stopping existing stream`),this.stopStream()}this.setState(`starting`),$.debug(`[StreamManager] State set to 'starting'`);try{$.debug(`[StreamManager] Building constraints`,{selectedVideoDeviceId:this.selectedVideoDeviceId,selectedAudioDeviceId:this.selectedAudioDeviceId});let e={video:this.buildVideoConstraints(this.selectedVideoDeviceId),audio:this.buildAudioConstraints(this.selectedAudioDeviceId)};return $.debug(`[StreamManager] Requesting media stream with constraints`,{hasVideo:!!e.video,hasAudio:!!e.audio}),this.mediaStream=await Ah().getUserMedia(e),$.info(`[StreamManager] Media stream obtained`,{streamId:this.mediaStream.id,videoTracks:this.mediaStream.getVideoTracks().length,audioTracks:this.mediaStream.getAudioTracks().length}),this.setState(`active`),$.debug(`[StreamManager] State set to 'active'`),$.debug(`[StreamManager] Emitting streamstart event`),this.emit(`streamstart`,{stream:this.mediaStream}),this.mediaStream}catch(e){let t=ig(e);throw $.error(`[StreamManager] Failed to start stream`,t),this.setState(`error`),this.emit(`error`,{error:t}),t}}stopStream(){if(this.mediaStream){for(let e of this.mediaStream.getTracks())e.stop();this.mediaStream=null}this.state!==`idle`&&(this.setState(`idle`),this.emit(`streamstop`,void 0))}stopStreamTracks(e){for(let t of e.getTracks())t.stop()}isTrackLive(e){return e!==void 0&&e.readyState===`live`}async tryReplaceTrack(e,t,n){let r=e.replaceTrack;if(typeof r!=`function`)return!1;try{await r.call(e,t),e.stop();for(let e of n.getTracks())e!==t&&e.stop();return t.stop(),!0}catch{return!1}}recreateStreamWithNewTrack(e,t,n){for(let t of n.getTracks())t!==e&&t.stop();let r=[e];this.isTrackLive(t)&&t&&r.push(t);let i=new MediaStream(r);if(this.mediaStream)for(let e of this.mediaStream.getTracks())e!==t&&e.stop();return i}async switchDeviceTrack(e,t,n){if(!this.mediaStream)throw Error(`No active stream to switch device`);let r=t===`video`?this.mediaStream.getVideoTracks()[0]:this.mediaStream.getAudioTracks()[0],i=t===`video`?this.mediaStream.getAudioTracks()[0]:this.mediaStream.getVideoTracks()[0];if(!r){let e=t===`video`?`video`:`audio`;throw Error(`No ${e} track in current stream`)}let a={[t]:this.buildDeviceConstraints(e,n)},o=await Ah().getUserMedia(a),s=t===`video`?o.getVideoTracks()[0]:o.getAudioTracks()[0];if(!s){this.stopStreamTracks(o);let e=t===`video`?`video`:`audio`;throw Error(`Failed to get new ${e} track`)}return await this.tryReplaceTrack(r,s,o)||(r.stop(),this.mediaStream=this.recreateStreamWithNewTrack(s,i,o)),t===`video`?(this.selectedVideoDeviceId=e,this.emit(`videosourcechange`,{stream:this.mediaStream})):this.selectedAudioDeviceId=e,this.mediaStream}switchVideoDevice(e){return this.switchDeviceTrack(e,`video`,this.streamConfig.video)}switchAudioDevice(e){return this.switchDeviceTrack(e,`audio`,this.streamConfig.audio)}setMediaStream(e){this.mediaStream=e}setAudioTracksEnabled(e){if(!this.mediaStream)return;let t=this.mediaStream.getAudioTracks();for(let n of t)n.enabled=e}destroy(){this.stopStream(),this.eventListeners.clear(),this.setState(`idle`)}};let og=[`Bytes`,`KB`,`MB`,`GB`],sg=1024;function cg(e){if(e===0)return`0 Bytes`;let t=Math.floor(Math.log(e)/Math.log(sg));return`${Math.round(e/sg**t*100)/100} ${og[t]}`}function lg(e){let t=Math.floor(e/3600),n=Math.floor(e%3600/60),r=e%60;return t>0?`${t.toString().padStart(2,`0`)}:${n.toString().padStart(2,`0`)}:${r.toString().padStart(2,`0`)}`:`${n.toString().padStart(2,`0`)}:${r.toString().padStart(2,`0`)}`}let ug={getCurrentTimestamp:()=>performance.now()};var dg=class{constructor(e){this.recordingStartTime=0,this.totalPausedTime=0,this.pauseStartTime=null,this.intervals=[],this.currentIntervalStart=null,this.isTracking=!1,this.visibilityChangeHandler=this.handleVisibilityChange.bind(this),this.blurHandler=this.handleBlur.bind(this),this.focusHandler=this.handleFocus.bind(this);let t=e?.getCurrentTimestamp;t===void 0?this.getCurrentTimestamp=ug.getCurrentTimestamp:this.getCurrentTimestamp=t}start(e){this.isTracking||(this.recordingStartTime=e,this.totalPausedTime=0,this.pauseStartTime=null,this.intervals=[],this.currentIntervalStart=null,this.isTracking=!0,typeof document<`u`&&document.addEventListener(`visibilitychange`,this.visibilityChangeHandler),typeof window<`u`&&(window.addEventListener(`blur`,this.blurHandler),window.addEventListener(`focus`,this.focusHandler)),this.checkInitialState())}pause(){!this.isTracking||this.pauseStartTime!==null||(this.pauseStartTime=this.getCurrentTimestamp(),this.endCurrentIntervalIfActive())}resume(){if(!this.isTracking||this.pauseStartTime===null)return;let e=this.getCurrentTimestamp()-this.pauseStartTime;this.totalPausedTime+=e,this.pauseStartTime=null}getIntervals(){return this.endCurrentIntervalIfActive(),this.intervals.map(e=>({start:this.normalizeTimestamp(e.start),end:this.normalizeTimestamp(e.end)}))}reset(){this.intervals=[],this.currentIntervalStart=null,this.totalPausedTime=0,this.pauseStartTime=null}cleanup(){this.isTracking=!1,this.endCurrentIntervalIfActive(),typeof document<`u`&&document.removeEventListener(`visibilitychange`,this.visibilityChangeHandler),typeof window<`u`&&(window.removeEventListener(`blur`,this.blurHandler),window.removeEventListener(`focus`,this.focusHandler)),this.reset()}checkInitialState(){typeof document>`u`||document.visibilityState===`hidden`&&this.startInterval()}handleVisibilityChange(){typeof document>`u`||(document.visibilityState===`hidden`?this.startInterval():this.endCurrentIntervalIfActive())}handleBlur(){this.startInterval()}handleFocus(){this.endCurrentIntervalIfActive()}startInterval(){this.currentIntervalStart!==null||!this.isTracking||this.pauseStartTime===null&&(this.currentIntervalStart=this.getCurrentTimestamp())}endCurrentIntervalIfActive(){if(this.currentIntervalStart===null)return;let e=this.getCurrentTimestamp(),t=this.currentIntervalStart;e>t&&this.intervals.push({start:t,end:e}),this.currentIntervalStart=null}normalizeTimestamp(e){let t=(e-this.recordingStartTime-this.totalPausedTime)/1e3;return Math.max(0,t)}};let fg=1e3,pg=1e3,mg={checkRecorderSupport:dh,getCurrentTimestamp:()=>performance.now()};var hg=class{constructor(e,t){this.recordingStartTime=0,this.recordingTimer=null,this.pauseStartTime=null,this.totalPausedTime=0,this.streamProcessor=null,this.bufferSizeUpdateInterval=null,this.tabVisibilityTracker=null,this.visibilityChangeHandler=null,this.blurHandler=null,this.focusHandler=null,this.streamManager=e;let n=t?.checkRecorderSupport,r;r=n===void 0?mg.checkRecorderSupport:n;let i=t?.getCurrentTimestamp,a;a=i===void 0?mg.getCurrentTimestamp:i,this.dependencies={checkRecorderSupport:r,getCurrentTimestamp:a}}isRecording(){return this.streamManager.getState()===`recording`}getStreamProcessor(){return this.streamProcessor}getAudioStreamForAnalysis(){if(this.streamProcessor){let e=this.streamProcessor.getAudioStreamForAnalysis();if(e)return e}return this.streamManager.getAudioStreamForAnalysis()}async startRecording(e,t,n,r){let i=this.streamManager.getStream(),a=0;if(i!==null&&(a=i.getAudioTracks().length),$.debug(`[StreamRecordingState] startRecording called`,{hasMediaStream:!!i,isRecording:this.isRecording(),hasProcessor:!!e,audioTracks:a}),!i)throw Error(`Stream must be started before recording`);if(this.isRecording())return $.debug(`[StreamRecordingState] Already recording, returning`),Promise.resolve();let o=i.getAudioTracks().length>0,s=t.watermark!==void 0,c=await this.dependencies.checkRecorderSupport({requiresAudio:o,requiresWatermark:s});if(!c.isSupported)throw kt({missingCapabilities:c.missing,resolutionStage:`feature-preflight`});this.streamProcessor=e,$.debug(`[StreamRecordingState] StreamProcessor assigned, setting callbacks`),e.setOnMuteStateChange(e=>{this.streamManager.emit(`audiomutetoggle`,{muted:e})}),e.setOnSourceChange(e=>{this.streamManager.emit(`videosourcechange`,{stream:e})}),this.bufferSizeUpdateInterval=window.setInterval(()=>{if(!this.streamProcessor)return;let e=this.streamProcessor.getBufferSize(),t=cg(e);this.streamManager.emit(`recordingbufferupdate`,{size:e,formatted:t})},fg),this.resetRecordingState();let l;n===!0&&(l={enabled:!0,text:this.resolveTabVisibilityOverlayText(r),recordingStartTime:this.recordingStartTime}),$.debug(`[StreamRecordingState] Overlay config`,{enableTabVisibilityOverlay:n,hasOverlayText:!!r,overlayText:r,overlayConfig:l}),$.debug(`[StreamRecordingState] Starting processing`),await e.startProcessing(i,t,l),$.info(`[StreamRecordingState] Processing started and worker ready`),n&&($.debug(`[StreamRecordingState] Setting up tab visibility tracking`,{recordingStartTime:this.recordingStartTime}),this.tabVisibilityTracker=new dg,this.tabVisibilityTracker.start(this.recordingStartTime),this.setupVisibilityUpdates(e)),this.streamManager.setState(`recording`),this.streamManager.emit(`recordingstart`,{recorder:null}),this.startRecordingTimer()}async stopRecording(){let e=(this.dependencies.getCurrentTimestamp()-this.recordingStartTime-this.totalPausedTime)/pg;if($.debug(`[StreamRecordingState] stopRecording called`,{hasStreamProcessor:!!this.streamProcessor,isRecording:this.isRecording(),recordingElapsedSeconds:e}),!(this.streamProcessor&&this.isRecording()))throw Error(`Not currently recording`);this.streamManager.setState(`stopping`),this.clearRecordingTimer(),this.clearBufferSizeInterval(),this.resetPauseState(),this.cleanupVisibilityUpdates();let t=[];this.tabVisibilityTracker?(t=this.tabVisibilityTracker.getIntervals(),$.debug(`[StreamRecordingState] Tab visibility intervals collected`,{intervalsCount:t.length,intervals:t}),this.tabVisibilityTracker.cleanup(),this.tabVisibilityTracker=null):$.debug(`[StreamRecordingState] No tab visibility tracker was active`),$.debug(`[StreamRecordingState] Finalizing stream processor`);let n=await this.streamProcessor.finalize();return $.info(`[StreamRecordingState] Stream processor finalized`,{blobSize:n.blob.size,hasBlob:!!n.blob}),this.streamManager.setState(`active`),this.streamManager.emit(`recordingstop`,{blob:n.blob,mimeType:`video/mp4`}),this.streamProcessor=null,$.debug(`[StreamRecordingState] StreamProcessor cleared`),{blob:n.blob,tabVisibilityIntervals:t,recordingStats:n.recordingStats,encoderAcceleration:n.encoderAcceleration}}pauseRecording(){this.clearRecordingTimer(),this.pauseStartTime===null&&(this.pauseStartTime=this.dependencies.getCurrentTimestamp()),this.tabVisibilityTracker&&this.tabVisibilityTracker.pause(),this.streamProcessor&&this.isRecording()&&this.streamProcessor.pause()}resumeRecording(){if(this.pauseStartTime!==null){let e=this.dependencies.getCurrentTimestamp()-this.pauseStartTime;this.totalPausedTime+=e,this.pauseStartTime=null}this.tabVisibilityTracker&&this.tabVisibilityTracker.resume(),this.startRecordingTimer(),this.streamProcessor&&this.isRecording()&&this.streamProcessor.resume()}toggleMute(){kh(this.streamProcessor,`StreamProcessor`).toggleMute()}muteAudio(){this.streamProcessor?(this.streamProcessor.isMutedState()||this.streamProcessor.toggleMute(),this.streamManager.setAudioTracksEnabled(!1)):this.streamManager.getStream()&&(this.streamManager.setAudioTracksEnabled(!1),this.streamManager.emit(`audiomutetoggle`,{muted:!0}))}unmuteAudio(){this.streamProcessor?(this.streamProcessor.isMutedState()&&this.streamProcessor.toggleMute(),this.streamManager.setAudioTracksEnabled(!0)):this.streamManager.getStream()&&(this.streamManager.setAudioTracksEnabled(!0),this.streamManager.emit(`audiomutetoggle`,{muted:!1}))}isMuted(){if(this.streamProcessor)return this.streamProcessor.isMutedState();let e=this.streamManager.getStream();if(e){let t=e.getAudioTracks();return t.length>0&&t.every(e=>!e.enabled)}return!1}async switchVideoSource(e){await kh(this.streamProcessor,`StreamProcessor`).switchVideoSource(e)}getCurrentVideoSource(){return Oh(kh(this.streamProcessor,`StreamProcessor`).getCurrentVideoSource(),`Current video source is not available`)}formatTimeElapsed(e){let t=Math.floor(e/60),n=Math.floor(e%60);return`${t.toString().padStart(2,`0`)}:${n.toString().padStart(2,`0`)}`}startRecordingTimer(){this.recordingTimer=window.setInterval(()=>{let e=(this.dependencies.getCurrentTimestamp()-this.recordingStartTime-this.totalPausedTime)/pg,t=this.formatTimeElapsed(e);this.streamManager.emit(`recordingtimeupdate`,{elapsed:e,formatted:t})},fg)}clearRecordingTimer(){this.recordingTimer!==null&&(clearInterval(this.recordingTimer),this.recordingTimer=null)}clearBufferSizeInterval(){this.bufferSizeUpdateInterval!==null&&(clearInterval(this.bufferSizeUpdateInterval),this.bufferSizeUpdateInterval=null)}resetRecordingState(){this.recordingStartTime=this.dependencies.getCurrentTimestamp(),this.totalPausedTime=0,this.pauseStartTime=null}resetPauseState(){this.totalPausedTime=0,this.pauseStartTime=null}resolveTabVisibilityOverlayText(e){return e===void 0||e.trim().length===0?`User in another tab`:e}setupVisibilityUpdates(e){if(typeof document>`u`||typeof window>`u`){$.warn(`[StreamRecordingState] Cannot setup visibility updates - document/window not available`);return}if(this.visibilityChangeHandler=()=>{if(typeof document>`u`)return;let t=document.visibilityState===`hidden`,n=this.dependencies.getCurrentTimestamp();$.debug(`[StreamRecordingState] Visibility change`,{isHidden:t,timestamp:n,visibilityState:document.visibilityState}),e.updateTabVisibility(t,n)},this.blurHandler=()=>{let t=this.dependencies.getCurrentTimestamp();$.debug(`[StreamRecordingState] Window blur`,{timestamp:t}),e.updateTabVisibility(!0,t)},this.focusHandler=()=>{let t=this.dependencies.getCurrentTimestamp();$.debug(`[StreamRecordingState] Window focus`,{timestamp:t}),e.updateTabVisibility(!1,t)},document.addEventListener(`visibilitychange`,this.visibilityChangeHandler),window.addEventListener(`blur`,this.blurHandler),window.addEventListener(`focus`,this.focusHandler),document.visibilityState===`hidden`){let t=this.dependencies.getCurrentTimestamp();$.debug(`[StreamRecordingState] Initial state is hidden`,{timestamp:t}),e.updateTabVisibility(!0,t)}else $.debug(`[StreamRecordingState] Initial state is visible`)}cleanupVisibilityUpdates(){this.visibilityChangeHandler&&typeof document<`u`&&(document.removeEventListener(`visibilitychange`,this.visibilityChangeHandler),this.visibilityChangeHandler=null),this.blurHandler&&typeof window<`u`&&(window.removeEventListener(`blur`,this.blurHandler),this.blurHandler=null),this.focusHandler&&typeof window<`u`&&(window.removeEventListener(`focus`,this.focusHandler),this.focusHandler=null)}destroy(){this.streamProcessor&&=(this.streamProcessor.cancel().catch(()=>{}),null),this.cleanupVisibilityUpdates(),this.tabVisibilityTracker&&=(this.tabVisibilityTracker.cleanup(),null),this.clearRecordingTimer(),this.clearBufferSizeInterval()}},gg=class{constructor(e={}){this.streamManager=new ag(e),this.recordingState=new hg(this.streamManager)}getState(){return this.streamManager.getState()}getStream(){return this.streamManager.getStream()}getAudioStreamForAnalysis(){return this.recordingState.getAudioStreamForAnalysis()}isRecording(){return this.recordingState.isRecording()}isActive(){return this.streamManager.isActive()}on(e,t){return this.streamManager.on(e,t)}off(e,t){this.streamManager.off(e,t)}once(e,t){return this.streamManager.once(e,t)}setAudioDevice(e){this.streamManager.setAudioDevice(e)}setVideoDevice(e){this.streamManager.setVideoDevice(e)}getAudioDevice(){return this.streamManager.getAudioDevice()}getVideoDevice(){return this.streamManager.getVideoDevice()}async getAvailableDevices(){return await this.streamManager.getAvailableDevices()}async startStream(){return await this.streamManager.startStream()}stopStream(){this.streamManager.stopStream()}switchVideoDevice(e){return this.streamManager.switchVideoDevice(e)}switchAudioDevice(e){return this.streamManager.switchAudioDevice(e)}async startRecording(e,t,n,r){return await this.recordingState.startRecording(e,t,n,r)}async stopRecording(){return await this.recordingState.stopRecording()}pauseRecording(){this.recordingState.pauseRecording()}resumeRecording(){this.recordingState.resumeRecording()}toggleMute(){this.recordingState.toggleMute()}muteAudio(){this.recordingState.muteAudio()}unmuteAudio(){this.recordingState.unmuteAudio()}isMuted(){return this.recordingState.isMuted()}async switchVideoSource(e){return await this.recordingState.switchVideoSource(e)}setMediaStream(e){this.streamManager.setMediaStream(e)}getCurrentVideoSource(){return this.recordingState.getCurrentVideoSource()}destroy(){this.recordingState.destroy(),this.streamManager.destroy()}};let _g=`VIDTREO_INSTALLATION_ID`,vg=`unknown`,yg=new Map;function bg(e){let t=e.storageProvider,n=t?.getItem(_g);if(n)return $.debug(`Using existing installation ID from storage`,{installationId:n}),n;let r=xg(e);return t?.setItem(_g,r),$.debug(`Created new installation ID`,{installationId:r}),r}function xg(e){let t=e.cryptoProvider;if(t?.getRandomValues){let e=new Uint8Array(16);return t.getRandomValues(e),Array.from(e).map(e=>e.toString(16).padStart(2,`0`)).join(``)}let n=e.nowProvider().toString(16),r=e.randomProvider();return`${n}-${Math.floor(r*1e9).toString(16)}`}let Sg=[`sdk.init.started`,`sdk.init.succeeded`,`sdk.init.failed`],Cg=[`stream.error`],wg={"sdk.init.started":`lifecycle`,"sdk.init.succeeded":`lifecycle`,"sdk.init.failed":`error`,"preview.start.succeeded":`interaction`,"preview.start.failed":`error`,"recording.start.requested":`interaction`,"recording.start.succeeded":`interaction`,"recording.start.failed":`error`,"recording.stop.requested":`interaction`,"recording.stop.succeeded":`interaction`,"recording.stop.failed":`error`,"upload.started":`performance`,"upload.succeeded":`performance`,"upload.failed":`error`,"source.switch.requested":`interaction`,"source.switch.succeeded":`interaction`,"source.switch.failed":`error`,"stream.error":`error`};var Tg=class{constructor(e,t){this.pendingEvents=[],this.flushTimeoutId=null,this.throttledEventTimestamps=new Map,this.retryCountMap=new Map,this.config=e,this.dependencies=t,this.installationId=bg(this.dependencies),$.debug(`TelemetryClient initialized`,{installationId:this.installationId,backendUrl:e.backendUrl})}triggerTelemetryEvent(e){try{let t=this.dependencies.nowProvider();if(this.shouldSkipEvent(e.name,t))return;let n=wg[e.name],r=this.buildError(e.error),i=this.buildFingerprint(),a=this.buildContext(),o=this.mergeProperties(this.buildBaseProperties(i),e),s={event:e.name,category:n,timestamp:t,installationId:this.installationId,fingerprint:i,sdkVersion:`1.3.2`,context:a,properties:o,error:r};this.markEventTracking(e.name,t),this.enqueueEvent(s)}catch(t){$.error(`Telemetry event failed`,{eventName:e.name,error:i(t)})}}enqueueEvent(e){try{if(this.pendingEvents=[...this.pendingEvents,e],this.pendingEvents.length>=10){this.flushQueue();return}this.scheduleFlush()}catch(e){$.error(`Failed to enqueue telemetry event`,{error:i(e)})}}scheduleFlush(){this.flushTimeoutId||=this.dependencies.setTimeoutFunction(()=>{this.flushQueue()},1e3)}flushQueue(){try{if(this.pendingEvents.length===0){this.clearFlushTimer();return}let e=this.pendingEvents;this.pendingEvents=[],this.clearFlushTimer();let t=this.buildRequestPayload(e);$.debug(`Telemetry batch flush`,{eventsCount:t.events.length}),this.sendPayload(t).then(()=>{this.clearRetryMetadata(e)}).catch(()=>{this.requeueFailedEvents(e)})}catch(e){$.error(`Failed to flush telemetry queue`,{error:i(e)})}}clearFlushTimer(){this.flushTimeoutId&&=(this.dependencies.clearTimeoutFunction(this.flushTimeoutId),null)}buildRequestPayload(e){return{events:[...e]}}shouldSkipEvent(e,t){if(this.isOneTimeEvent(e)){let t=this.getOneTimeCacheKey(e);if(yg.get(t))return $.debug(`Telemetry event skipped (dedupe)`,{event:e}),!0}if(this.isThrottledEvent(e)){let n=this.throttledEventTimestamps.get(e);if(n!==void 0&&t-n<5e3)return $.debug(`Telemetry event skipped (throttle)`,{event:e,lastSent:n}),!0}return!1}markEventTracking(e,t){if(this.isOneTimeEvent(e)){let t=this.getOneTimeCacheKey(e);yg.set(t,!0)}this.isThrottledEvent(e)&&(this.throttledEventTimestamps=this.updateNumberMap(this.throttledEventTimestamps,e,t))}updateNumberMap(e,t,n){let r=new Map(e);return r.set(t,n),r}getOneTimeCacheKey(e){return`${this.installationId}:${e}`}isOneTimeEvent(e){return Sg.includes(e)}isThrottledEvent(e){return Cg.includes(e)}buildBaseProperties(e){let t={},n=e.userAgent,r=this.getBrowserName(n);return r&&(t={...t,browserName:r}),t}mergeProperties(e,t){let n=t.properties;if(!(Object.keys(e).length===0&&!n)){if(Object.keys(e).length>0&&n)return{...e,...n};if(Object.keys(e).length>0)return{...e};if(n)return{...n}}}buildFingerprint(){let e=this.dependencies.navigatorProvider;if(!e)return{};let t={userAgent:e.userAgent,language:e.language,platform:e.platform};e.hardwareConcurrency&&(t={...t,hardwareConcurrency:e.hardwareConcurrency});let n=this.getDeviceMemory(e);return n!==null&&(t={...t,deviceMemory:n}),t}buildContext(){let e=this.config.pageUrl,t=this.config.referrerUrl;if(!e){let t=this.dependencies.locationProvider;t&&(e=t.href)}if(!t){let e=this.dependencies.documentProvider;if(e){let n=e.referrer;n&&(t=n)}}return{sessionId:this.config.sessionId,userId:this.config.userId,environmentId:this.config.environmentId,appVersion:this.config.appVersion,release:this.config.release,pageUrl:e,referrerUrl:t,sdkLocation:this.config.sdkLocation,clientLocation:this.config.clientLocation}}buildError(e){if(!e)return;let t={message:i(e)};return e instanceof Error&&(e.name&&(t.code=e.name),e.stack&&(t.stack=e.stack)),t}getBrowserName(e){return e?e.includes(`Edg`)?`edge`:e.includes(`Chrome`)?`chrome`:e.includes(`Firefox`)?`firefox`:e.includes(`Safari`)?`safari`:vg:vg}getDeviceMemory(e){let t=e;return t.deviceMemory?t.deviceMemory:null}async sendPayload(e){let t=this.buildTelemetryEndpoint(),n={method:`POST`,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${this.config.apiKey}`},body:JSON.stringify(e)};$.debug(`Sending telemetry to endpoint`,{endpoint:t,payloadSize:JSON.stringify(e).length,hasApiKey:!!this.config.apiKey});let r=await this.dependencies.fetchFunction(t,n).catch(e=>{throw $.error(`Failed to send telemetry`,{endpoint:t,error:i(e)}),e});if(r&&!r.ok)throw $.error(`Telemetry endpoint returned error`,{status:r.status}),Error(`Telemetry HTTP ${r.status}`)}requeueFailedEvents(e){let t=e.filter(e=>(this.retryCountMap.get(e)??0)<3);for(let e of t){let t=this.retryCountMap.get(e)??0;this.retryCountMap.set(e,t+1)}let n=e.length-t.length;if(n>0){let r=e.filter(e=>!t.includes(e));this.clearRetryMetadata(r),$.warn(`Dropped ${n} telemetry events after max retries`)}if(t.length===0)return;let r=this.pendingEvents.length,i=Math.max(0,100-r);this.pendingEvents=[...t.slice(0,i),...this.pendingEvents],this.scheduleFlush()}clearRetryMetadata(e){for(let t of e)this.retryCountMap.delete(t)}buildTelemetryEndpoint(){return this.config.endpoint?this.config.endpoint:`${this.config.backendUrl}/api/v1/telemetry`}};function Eg(){let e=typeof window<`u`,t=typeof document<`u`,n=fetch,r=null,i=null,a=null,o=null,s=null,c=setTimeout,l=clearTimeout;return e&&(n=window.fetch.bind(window),r=window.crypto,i=window.localStorage,a=window.navigator,o=window.location,c=window.setTimeout.bind(window),l=window.clearTimeout.bind(window)),t&&(s=document),{fetchFunction:n,cryptoProvider:r,storageProvider:i,navigatorProvider:a,locationProvider:o,documentProvider:s,nowProvider:()=>Date.now(),randomProvider:()=>Math.random(),setTimeoutFunction:c,clearTimeoutFunction:l}}function Dg(e,t,n){return new Tg({apiKey:e,backendUrl:t,endpoint:n?.endpoint,sessionId:n?.sessionId,userId:n?.userId,environmentId:n?.environmentId,appVersion:n?.appVersion,release:n?.release,pageUrl:n?.pageUrl,referrerUrl:n?.referrerUrl,sdkLocation:n?.sdkLocation,clientLocation:n?.clientLocation},Eg())}var Og=class{constructor(e,t){this.isProcessing=!1,this.retryTimeoutId=null,this.callbacks={},this.storageService=e,this.uploadService=t,this.networkOnlineHandler=()=>{this.processQueue().catch(e=>{let t=i(e);this.callbacks.onUploadError?.(`network-recovery`,Error(t))})},window.addEventListener(`online`,this.networkOnlineHandler),this.processingIntervalId=window.setInterval(()=>{this.processQueue().catch(e=>{let t=i(e);this.callbacks.onUploadError?.(`processing-loop`,Error(t))})},5e3)}destroy(){this.clearTimer(this.processingIntervalId,clearInterval),this.clearTimer(this.retryTimeoutId,clearTimeout),window.removeEventListener(`online`,this.networkOnlineHandler)}setCallbacks(e){this.callbacks=e}async queueUpload(e){let t=await this.storageService.savePendingUpload(e);return this.processQueue(),t}async processQueue(){if(!this.isProcessing){this.isProcessing=!0;try{if(!this.storageService.isInitialized())throw Error(`Database not initialized`);let e=await this.storageService.getPendingUploads(`pending`);if(e.length>0){let t=this.getOldestUpload(e);await this.processUpload(t),this.isProcessing=!1;return}let t=(await this.storageService.getPendingUploads(`failed`)).filter(e=>e.retryCount<10);if(t.length>0){let e=this.getOldestFailedUpload(t),n=this.calculateRetryDelay(e.retryCount),r=Date.now()-e.updatedAt;if(r>=n)await this.storageService.updateUploadStatus(e.id,{status:`pending`,retryCount:e.retryCount}),await this.processUpload(e);else{let e=n-r;this.scheduleRetry(e)}}this.isProcessing=!1}catch(e){throw this.isProcessing=!1,Error(`Error processing upload queue: ${i(e)}`)}}}getPendingUploads(){return this.storageService.getPendingUploads()}async getStats(){let e=await this.storageService.getPendingUploads(),t={pending:0,uploading:0,failed:0,total:e.length};for(let n of e)n.status===`pending`?t.pending+=1:n.status===`uploading`?t.uploading+=1:n.status===`failed`&&(t.failed+=1);return t}getOldestUpload(e){if(e.length===0)throw Error(`Cannot get oldest upload from empty array`);return e.sort((e,t)=>e.createdAt-t.createdAt)[0]}getOldestFailedUpload(e){if(e.length===0)throw Error(`Cannot get oldest failed upload from empty array`);return e.sort((e,t)=>e.updatedAt-t.updatedAt)[0]}async processUpload(e){try{await this.storageService.updateUploadStatus(e.id,{status:`uploading`});let t=await this.uploadService.uploadVideo(e.blob,{apiKey:e.apiKey,backendUrl:e.backendUrl,filename:e.filename,metadata:e.metadata,userMetadata:e.userMetadata,onProgress:t=>{this.callbacks.onUploadProgress?.(e.id,t)}});await this.storageService.deleteUpload(e.id),this.callbacks.onUploadComplete?.(e.id,t)}catch(t){let n=i(t),r=e.retryCount+1;if(await this.storageService.updateUploadStatus(e.id,{status:`failed`,retryCount:r,lastError:n}),r>=10)this.callbacks.onUploadError?.(e.id,Error(`Upload failed after 10 attempts: ${n}`));else{let e=this.calculateRetryDelay(r);this.scheduleRetry(e)}}}calculateRetryDelay(e){let t=2e3*1.5**(e-1);return Math.min(t,3e5)}scheduleRetry(e){this.clearTimer(this.retryTimeoutId,clearTimeout),this.retryTimeoutId=window.setTimeout(()=>{this.retryTimeoutId=null,this.processQueue()},e)}clearTimer(e,t){e!==null&&t(e)}},kg=class{uploadVideo(e,t){if(!t.filename)throw Error(`Filename is required`);if(!e.type||e.type.trim()===``)throw Error(`Blob type is required`);return this.uploadVideoFile(e,t)}uploadVideoFile(e,t){return new Promise((n,r)=>{let i=new XMLHttpRequest;if(t.onProgress){let e=t.onProgress;i.upload.addEventListener(`progress`,t=>{t.lengthComputable&&e(t.loaded/t.total)})}i.addEventListener(`load`,()=>{if(i.status>=200&&i.status<=299){this.parseSuccessResponse(i,n,r);return}this.parseErrorResponse(i,r)}),i.addEventListener(`error`,()=>{r(Error(`Network error during upload`))}),i.addEventListener(`abort`,()=>{r(Error(`Upload was aborted`))});let a=`${t.backendUrl}/api/v1/videos/upload`;i.open(`POST`,a),i.setRequestHeader(`Authorization`,`Bearer ${t.apiKey}`);let o=new FormData;o.append(`file`,e,t.filename);let s={filename:t.filename,mimeType:e.type};t.userMetadata&&(s.userMetadata=t.userMetadata),o.append(`metadata`,JSON.stringify(s)),i.send(o)})}parseSuccessResponse(e,t,n){let r=this.safeParseJsonFromXhr(e);if(!r){n(Error(`Failed to parse upload response: invalid JSON`));return}let i=r.data;if(!i){n(Error(`Failed to parse upload response: missing data`));return}t({id:i.id,publicId:i.publicId,filename:i.filename,fileSize:i.fileSize,mimeType:i.mimeType,duration:i.duration,status:i.status,uploadUrl:i.uploadUrl,createdAt:i.createdAt})}parseErrorResponse(e,t){let n=this.safeParseJsonFromXhr(e);if(n&&typeof n==`object`&&`error`in n&&typeof n.error==`string`){t(Error(n.error));return}t(Error(`Upload failed: ${e.status} ${e.statusText}`))}safeParseJsonFromXhr(e){if(!e.responseText||e.responseText.trim()===``)return null;let t=e.responseText.trim();if(!(t.startsWith(`{`)&&t.endsWith(`}`))||t.length<2)return null;let n=JSON.parse(e.responseText);return typeof n==`object`&&n?n:null}};let Ag=e=>{},jg=e=>{},Mg=e=>{},Ng=()=>{},Pg=e=>{},Fg=(e,t)=>{},Ig=e=>{},Lg=e=>{},Rg=e=>{},zg=()=>{},Bg=e=>{};function Vg(e){let t={onProgress:Ag,onSuccess:jg,onError:Mg,onClearStatus:Ng};return e.upload&&(t=e.upload),t}function Hg(e){let t=Bg;return e.onStorageCleanupError&&(t=e.onStorageCleanupError),t}function Ug(e,t){let n=e.recording,r=Pg;n?.onStateChange&&(r=n.onStateChange);let i=Fg;n?.onCountdownUpdate&&(i=n.onCountdownUpdate);let a=Ig;n?.onTimerUpdate&&(a=n.onTimerUpdate);let o=Lg;n?.onError&&(o=n.onError);let s=Rg;n?.onRecordingComplete&&(s=n.onRecordingComplete);let c=zg;return n?.onClearUploadStatus&&(c=n.onClearUploadStatus),{onStateChange:r,onCountdownUpdate:i,onTimerUpdate:a,onError:o,onRecordingComplete:s,onClearUploadStatus:c,onStopAudioTracking:t.stopAudioTracking,onGetConfig:t.getConfig}}function Wg(e,t){let n=e.sourceSwitch;return{onSourceChange:n?.onSourceChange,onPreviewUpdate:n?.onPreviewUpdate,onError:n?.onError,onTransitionStart:n?.onTransitionStart,onTransitionEnd:n?.onTransitionEnd,onScreenSelectionStart:()=>{t.isRecording()&&t.updateSourceType(!0)},onScreenSelectionEnd:()=>{t.isRecording()&&t.updateSourceType(!1)},getSelectedCameraDeviceId:t.getSelectedCameraDeviceId,getSelectedMicDeviceId:t.getSelectedMicDeviceId}}function Gg(e){let t=e.getVideoTracks();if(t.length===0)return!1;let n=t[0];return`displaySurface`in n.getSettings()||n.label.toLowerCase().includes(`screen`)||n.label.toLowerCase().includes(`display`)}ym();function Kg(e){if(e!==void 0)return typeof e==`number`?e:e===_p?`low`:e===vp?`medium`:e===yp?`high`:e===bp?`very-high`:`high`}let qg=`recording.invalid-container-layout`,Jg=`recording.no-video-track`,Yg=`stsz`;function Xg(e){let t=Error(qg);return t.code=qg,t.detectedBoxTypes=e,t}function Zg(e){let t=Error(e);return t.code=e,t}function Qg(e){return e instanceof Uint8Array?e:new Uint8Array(e)}function $g(e,t){let n=e.getUint8(t),r=e.getUint8(t+1),i=e.getUint8(t+2),a=e.getUint8(t+3);return String.fromCharCode(n,r,i,a)}function e_(e,t){let n=e.getUint32(t,!1),r=e.getUint32(t+4,!1);return n*4294967296+r}function t_(e){let t=new Set;for(let n of e)t.add(n);return[...t]}function n_(e,t,n){let r=new DataView(e.buffer,e.byteOffset,e.byteLength),i=[],a=t;for(;a<n;){if(!(a+8<=n))throw Xg(i.map(e=>e.type));let e=r.getUint32(a,!1),t=$g(r,a+4),o=e,s=8;if(e===1){let e=a+8;if(!(e+8<=n))throw Xg(i.map(e=>e.type));o=e_(r,e),s=16}if(e===0&&(o=n-a),!(o>=s))throw Xg(i.map(e=>e.type));let c=a+o;if(!(c<=n))throw Xg(i.map(e=>e.type));let l=a+s;i.push({type:t,size:o,startOffset:a,endOffset:c,payloadStartOffset:l}),a=c}return i}function r_(e,t){for(let n of e)if(n.type===t)return n;return null}function i_(e,t,n){if(!(t+4<=n))throw Xg([]);return $g(e,t)}function a_(e,t){let n=new DataView(e.buffer,e.byteOffset,e.byteLength),r=r_(n_(e,t.payloadStartOffset,t.endOffset),`mdia`);if(r===null)return{isVideoTrack:!1,sampleCount:0};let i=n_(e,r.payloadStartOffset,r.endOffset),a=r_(i,`hdlr`);if(a===null||i_(n,a.payloadStartOffset+8,a.endOffset)!==`vide`)return{isVideoTrack:!1,sampleCount:0};let o=r_(i,`minf`);if(o===null)return{isVideoTrack:!0,sampleCount:0};let s=r_(n_(e,o.payloadStartOffset,o.endOffset),`stbl`);if(s===null)return{isVideoTrack:!0,sampleCount:0};let c=r_(n_(e,s.payloadStartOffset,s.endOffset),Yg);if(c===null)return{isVideoTrack:!0,sampleCount:0};let l=c.payloadStartOffset+8;if(!(l+4<=c.endOffset))throw Xg([Yg]);return{isVideoTrack:!0,sampleCount:n.getUint32(l,!1)}}function o_(e){let t=Qg(e),n=t.byteLength,r=new DataView(t.buffer,t.byteOffset,t.byteLength),i=[],a=0;for(;a<n;){if(!(a+8<=n))throw Xg(i.map(e=>e.type));let e=r.getUint32(a,!1),t=$g(r,a+4),o=e,s=8;if(e===1){let e=a+8;if(!(e+8<=n))throw Xg(i.map(e=>e.type));o=e_(r,e),s=16}if(e===0&&(o=n-a),!(o>=s))throw Xg(i.map(e=>e.type));let c=a+o;if(!(c<=n))throw Xg(i.map(e=>e.type));i.push({type:t,size:o,startOffset:a,endOffset:c}),a=c}return i}function s_(e){let t=o_(e).filter(e=>e.type===`moof`||e.type===`mfra`).map(e=>e.type);if(t.length>0)throw Xg(t_(t))}function c_(e){let t=Qg(e),n=r_(n_(t,0,t.byteLength),`moov`);if(n===null)throw Zg(Jg);let r=n_(t,n.payloadStartOffset,n.endOffset).filter(e=>e.type===`trak`);if(r.length===0)throw Zg(Jg);let i=!1;for(let e of r){let n=a_(t,e);if(n.isVideoTrack&&(i=!0,n.sampleCount>0))return}throw Zg(i?`recording.no-video-frames`:Jg)}function l_(e){let t=null,n=0;function r(){if(!t){let n=e.createBlob();t=e.createObjectUrl(n)}return n+=1,t}function i(){n!==0&&(--n,n===0&&(t&&=(e.revokeObjectUrl(t),null)))}return{acquire:r,release:i}}let u_=`vidtreo-audio-worklet`,d_=`audioChunk`,f_=`setMuted`,p_=`setPaused`,m_=`shutdown`,h_=`
122
+ };`],{type:`application/javascript`})}function Bm(){let e=zm();return URL.createObjectURL(e)}function Vm(e){URL.revokeObjectURL(e)}let Hm=`probe`,Um=`probeResult`,Wm=`mediaStreamTrackProcessor`,Gm=`unavailable`,Km=`unavailable`,qm=new Map,Jm=new Map;function Ym(e,t){return typeof e==`boolean`?e:t}function Xm(e){return e?`1`:`0`}function Zm(e,t){return[`audio`,Xm(e),`watermark`,Xm(t)].join(`|`)}function Qm(){return typeof process>`u`||process.env,!0}function $m(e){return e.probeResult.hasMediaStreamTrackProcessor?`worker-track`:e.hasMainThreadMediaStreamTrackProcessor?`main-thread-stream`:Gm}function eh(e){return e.requiresAudio?e.hasMainThreadMediaStreamTrackProcessor&&e.probeResult.hasAudioData?`main-thread-audio-stream`:e.hasAudioContext&&e.hasAudioWorklet?`audio-worklet-chunks`:Km:`none-required`}function th(e,t){return e.includes(t)?e:[...e,t]}function nh(e,t){let n=e;return t.hasWorker||(n=th(n,`worker`)),t.probeResult.hasVideoFrame||(n=th(n,`videoFrame`)),t.probeResult.hasOffscreenCanvas||(n=th(n,`offscreenCanvas`)),t.probeResult.hasReadableStream||(n=th(n,`readableStream`)),n}function rh(e,t){let n=e;return t.requiresWatermark&&!t.probeResult.hasCreateImageBitmap&&(n=th(n,`createImageBitmap`)),n}function ih(e,t){let n=e;return t.videoPath===Gm&&(n=th(n,Wm)),n}function ah(e,t){let n=e;return t.hasMainThreadMediaStreamTrackProcessor&&t.probeResult.hasAudioData?n:(t.hasMainThreadMediaStreamTrackProcessor||(n=th(n,Wm)),t.hasMainThreadMediaStreamTrackProcessor&&!t.probeResult.hasAudioData&&(n=th(n,`audioData`)),n)}function oh(e,t){let n=e;return t.hasAudioContext&&t.hasAudioWorklet?n:(t.hasAudioContext||(n=th(n,`audioContext`)),t.hasAudioWorklet||(n=th(n,`audioWorklet`)),n)}function sh(e,t){let n=e;return t.requiresAudio&&t.audioPath===Km?(n=ah(n,t),n=oh(n,t),n):n}function ch(e){let t=[];return t=nh(t,e),t=rh(t,e),t=ih(t,e),t=sh(t,e),t}function lh(e,t){return!(e===Gm||t===Km)}function uh(e,t){return!(!e.hasVideoFrame||!e.hasOffscreenCanvas||!e.hasReadableStream||t&&!e.hasCreateImageBitmap)}async function dh(e={}){let t=Ym(e.requiresAudio,!0),n=Ym(e.requiresWatermark,!1);if(!Qm())return await fh(t,n);let r=Zm(t,n),i=qm.get(r);if(i)return i;let a=Jm.get(r);if(a)return await a;let o=fh(t,n).then(e=>(qm.set(r,e),Jm.delete(r),e)).catch(e=>{throw Jm.delete(r),e});return Jm.set(r,o),await o}async function fh(e,t){let n=typeof Worker<`u`,r=a()!==null,i=typeof AudioWorkletNode<`u`,o=typeof MediaStreamTrackProcessor<`u`,s=await ph(n),c=$m({probeResult:s,hasMainThreadMediaStreamTrackProcessor:o}),l=eh({requiresAudio:e,hasAudioContext:r,hasAudioWorklet:i,hasMainThreadMediaStreamTrackProcessor:o,probeResult:s}),u=ch({hasWorker:n,hasAudioContext:r,hasAudioWorklet:i,hasMainThreadMediaStreamTrackProcessor:o,probeResult:s,requiresAudio:e,requiresWatermark:t,videoPath:c,audioPath:l}),d=lh(c,l),f=uh(s,t);return{isSupported:n&&d&&f,missing:u,hasWorker:n,hasAudioContext:r,hasAudioWorklet:i,hasMediaStreamTrackProcessor:s.hasMediaStreamTrackProcessor,hasMainThreadMediaStreamTrackProcessor:o,hasVideoFrame:s.hasVideoFrame,hasAudioData:s.hasAudioData,hasOffscreenCanvas:s.hasOffscreenCanvas,hasCreateImageBitmap:s.hasCreateImageBitmap,hasReadableStream:s.hasReadableStream,requiresAudio:e,requiresWatermark:t,videoPath:c,audioPath:l}}async function ph(e){if(!e)return hh();let t=await mh().catch(()=>null);return t?await new Promise(e=>{let n=!1,r=r=>{n||(n=!0,t.terminate(),e(r))},i=setTimeout(()=>{r(hh())},2e3);t.onmessage=e=>{let t=e.data;t.type===Um&&(clearTimeout(i),r({hasMediaStreamTrackProcessor:t.hasMediaStreamTrackProcessor===!0,hasVideoFrame:t.hasVideoFrame===!0,hasAudioData:t.hasAudioData===!0,hasOffscreenCanvas:t.hasOffscreenCanvas===!0,hasCreateImageBitmap:t.hasCreateImageBitmap===!0,hasReadableStream:t.hasReadableStream===!0}))},t.onerror=()=>{clearTimeout(i),r(hh())},Promise.resolve().then(()=>{t.postMessage({type:Hm})}).catch(()=>{clearTimeout(i),r(hh())})}):hh()}function mh(){return Promise.resolve().then(()=>{let e=Bm();try{let t=new Worker(e,{type:`classic`});return Vm(e),t}catch(t){throw Vm(e),t}})}function hh(){return{hasMediaStreamTrackProcessor:!1,hasVideoFrame:!1,hasAudioData:!1,hasOffscreenCanvas:!1,hasCreateImageBitmap:!1,hasReadableStream:!1}}let gh=`vidtreo-recorder`,_h=`pending-uploads`,vh=`status`,yh=`createdAt`;var bh=class{constructor(e){if(this.db=null,e){this.databaseFactory=e;return}this.databaseFactory=indexedDB}init(){return this.db?Promise.resolve():this.openDatabase(2,!0)}openDatabase(e,t){return new Promise((n,r)=>{let i=this.createOpenRequest(e);i.onerror=()=>{let e=i.error;if(t&&e&&e.name===`VersionError`){this.openDatabase(void 0,!1).then(n).catch(r);return}if(e){r(e);return}r(Error(`Failed to open database`))},i.onsuccess=()=>{if(!i.result){r(Error(`Database result is null`));return}let e=i.result,t=this.validateRequiredSchema(e);if(t){e.close(),r(t);return}this.db=e,n()},i.onupgradeneeded=e=>{let t=e.target.result;if(!t){r(Error(`Database upgrade result is null`));return}this.initializeStoreSchema(t)}})}createOpenRequest(e){return e===void 0?this.databaseFactory.open(gh):this.databaseFactory.open(gh,e)}initializeStoreSchema(e){if(e.objectStoreNames.contains(_h))return;let t=e.createObjectStore(_h,{keyPath:`id`});t.createIndex(vh,vh,{unique:!1}),t.createIndex(yh,yh,{unique:!1})}validateRequiredSchema(e){if(!e.objectStoreNames.contains(_h))return Error(`Database schema is missing required object store: pending-uploads`);let t=e.transaction([_h],`readonly`).objectStore(_h);return t.indexNames.contains(vh)?t.indexNames.contains(yh)?null:Error(`Database schema is missing required index: createdAt`):Error(`Database schema is missing required index: status`)}isInitialized(){return this.db!==null}savePendingUpload(e){let t=this.generateUploadId(),n={...e,id:t,status:`pending`,retryCount:0,createdAt:Date.now(),updatedAt:Date.now()};return this.executeTransaction(`readwrite`,e=>{let r=e.add(n);return new Promise((e,n)=>{r.onsuccess=()=>e(t),r.onerror=()=>{r.error?r.error.name===`QuotaExceededError`?n(Error(`Storage quota exceeded. Please free up space or delete old uploads.`)):n(r.error):n(Error(`Failed to save upload`))}})})}getPendingUploads(e){return this.executeTransaction(`readonly`,t=>{let n=e?t.index(vh).getAll(e):t.getAll();return new Promise((e,t)=>{n.onsuccess=()=>{if(n.result===void 0){t(Error(`Failed to get uploads: result is undefined`));return}e(n.result)},n.onerror=()=>{n.error?t(n.error):t(Error(`Failed to get uploads`))}})})}updateUploadStatus(e,t){return this.executeTransaction(`readwrite`,n=>{let r=n.get(e);return new Promise((e,i)=>{r.onsuccess=()=>{let a=r.result;if(!a){i(Error(`Upload not found`));return}let o={...a,...t,updatedAt:Date.now()},s=n.put(o);s.onsuccess=()=>e(),s.onerror=()=>{s.error?i(s.error):i(Error(`Failed to update upload`))}},r.onerror=()=>{r.error?i(r.error):i(Error(`Failed to get upload`))}})})}deleteUpload(e){return this.executeTransaction(`readwrite`,t=>{let n=t.delete(e);return new Promise((e,t)=>{n.onsuccess=()=>e(),n.onerror=()=>{n.error?t(n.error):t(Error(`Failed to delete upload`))}})})}async cleanupPermanentlyFailedUploads(e){let t=e===void 0?24:e;if(typeof t!=`number`||t<0)throw Error(`retentionHours must be a non-negative number`);let n=Date.now()-t*36e5,r=(await this.getPendingUploads()).filter(e=>e.status===`failed`&&e.retryCount>=10&&e.updatedAt<n);for(let e of r)await this.deleteUpload(e.id);return r.length}async getTotalStorageSize(){return(await this.getPendingUploads()).reduce((e,t)=>e+t.blob.size,0)}generateUploadId(){return`upload-${Date.now()}-${Math.random().toString(36).substring(2,11)}`}executeTransaction(e,t){if(!this.db)throw Error(`Database not initialized`);return t(this.db.transaction([_h],e).objectStore(_h))}},xh=class{constructor(){this.storageService=null,this.cleanupIntervalId=null}async initialize(e){this.storageService||=new bh,this.storageService.isInitialized()||await this.storageService.init(),this.setupCleanupInterval(e)}setupCleanupInterval(e){this.cleanupIntervalId===null&&(this.cleanupIntervalId=window.setInterval(()=>{this.performCleanup().catch(t=>{e(i(t))})},36e5))}async performCleanup(){if(!this.storageService)throw Error(`StorageService not initialized`);await this.storageService.cleanupPermanentlyFailedUploads(24)}getStorageService(){return this.storageService}destroy(){this.cleanupIntervalId!==null&&(clearInterval(this.cleanupIntervalId),this.cleanupIntervalId=null)}};function Sh(){let e=globalThis;if(e.__VIDTREO_DEBUG__===!0||e.__VIDTREO_DEV__===!0)return!0;let t=typeof process<`u`&&process?.env?`production`:void 0;return t===`development`||t===`test`||typeof localStorage<`u`&&localStorage.getItem(`VIDTREO_DEBUG`)===`true`}let Ch=Sh(),wh={reset:`\x1B[0m`,bright:`\x1B[1m`,dim:`\x1B[2m`,red:`\x1B[31m`,green:`\x1B[32m`,yellow:`\x1B[33m`,blue:`\x1B[34m`,magenta:`\x1B[35m`,cyan:`\x1B[36m`,white:`\x1B[37m`,gray:`\x1B[90m`};function Th(e,t,n){if(!Ch)return``;let r=n?.prefix||`[${e.toUpperCase()}]`;return`${wh[n?.color||Eh(e)]}${r}${wh.reset} ${t}`}function Eh(e){switch(e){case`error`:return`red`;case`warn`:return`yellow`;case`info`:return`cyan`;case`debug`:return`gray`;default:return`white`}}function Dh(e,t,...n){if(!Ch)return;let r=Th(e,t);console[e](r,...n)}let $={log:(e,...t)=>{Dh(`log`,e,...t)},info:(e,...t)=>{Dh(`info`,e,...t)},warn:(e,...t)=>{Dh(`warn`,e,...t)},error:(e,...t)=>{Dh(`error`,e,...t)},debug:(e,...t)=>{Dh(`debug`,e,...t)},group:(e,t=`cyan`)=>{if(!Ch)return;let n=wh[t],r=wh.reset;console.group(`${n}${e}${r}`)},groupEnd:()=>{Ch&&console.groupEnd()}};function Oh(e,t){if(e==null)throw Error(t);return e}function kh(e,t=`StreamProcessor`){if(!e)throw Error(`${t} is required`);return e}function Ah(){if(typeof navigator>`u`||!navigator.mediaDevices?.getUserMedia){let e=typeof window<`u`&&window.isSecureContext===!0?`Camera access is not supported in this browser`:`Camera access requires HTTPS. Please use a secure connection (https://) or localhost.`;throw Error(e)}return navigator.mediaDevices}function jh(e,t){let n={};if(t.originalCameraConstraints){let{deviceId:e,...r}=t.originalCameraConstraints;n={...n,...r}}e&&(n={...n,deviceId:{exact:e}});let r=t.getSelectedCameraDeviceId(),i=!1;return e&&(i=!0),n.deviceId&&(i=!0),!i&&r&&(n={...n,deviceId:{exact:r}}),n}function Mh(e){return e?{deviceId:{exact:e}}:!0}let Nh=`live`;function Ph(e){for(let t of e)t.readyState===Nh&&t.stop()}function Fh(e){Ph(e.getTracks())}function Ih(e){Ph(e.getVideoTracks())}function Lh(e){return e?e.readyState===Nh:!1}function Rh(e,t){return Lh(e)&&Lh(t)}function zh(e,t,n){if(!Lh(e)){Fh(n);let r=`undefined`;throw e&&(r=e.readyState),Error(`Failed to get live camera ${t} track. ReadyState: ${r}`)}}let Bh=`[SourceSwitchManager]`;var Vh=class{constructor(e){this.dependencies=e}async createCameraStreamWithOriginalAudio(e){let t=this.dependencies.getOriginalCameraStream(),n;if(t&&(n=t.getAudioTracks()[0]),this.dependencies.logger.debug(`${Bh} createCameraStreamWithOriginalAudio`,{hasOriginalCameraStream:!!t,originalCameraStreamId:t?.id,hasOriginalAudioTrack:!!n,originalAudioTrackId:n?.id,originalAudioTrackReadyState:n?.readyState,originalAudioTrackEnabled:n?.enabled,originalAudioTrackMuted:n?.muted,originalAudioTrackLabel:n?.label,isTrackLive:Lh(n),cameraDeviceId:e}),!Lh(n))return this.dependencies.logger.warn(`${Bh} Original audio track is not live, cannot reuse`,{originalAudioTrackId:n?.id,originalAudioTrackReadyState:n?.readyState}),null;let r=jh(e,{originalCameraConstraints:this.dependencies.getOriginalCameraConstraints(),getSelectedCameraDeviceId:this.dependencies.getSelectedCameraDeviceId}),i=Object.keys(r).length>0,a=!0;i&&(a=r);let o={video:a,audio:!1};this.dependencies.logger.debug(`${Bh} Requesting new video stream`,{constraints:o,cameraDeviceId:e});let s=await Ah().getUserMedia(o),c=s.getVideoTracks()[0];zh(c,`video`,s),this.dependencies.logger.debug(`${Bh} New video stream obtained`,{newStreamId:s.id,videoTrackId:c.id,videoTrackReadyState:c.readyState,newStreamAudioTracksCount:s.getAudioTracks().length});let l=[c];n&&(l=[...l,n]),this.dependencies.logger.debug(`${Bh} Creating combined stream with original audio`,{videoTrackId:c.id,audioTrackId:n?.id,audioTrackReadyState:n?.readyState,audioTrackEnabled:n?.enabled,audioTrackMuted:n?.muted,combinedTracksCount:l.length});let u=new MediaStream(l);Ph(s.getAudioTracks());let d=t?.id;return this.dependencies.setOriginalCameraStream(u),this.dependencies.logger.debug(`${Bh} Combined stream created and assigned`,{combinedStreamId:u.id,previousOriginalCameraStreamId:d,newOriginalCameraStreamId:u.id,combinedStreamVideoTracksCount:u.getVideoTracks().length,combinedStreamAudioTracksCount:u.getAudioTracks().length,combinedStreamAudioTrackId:u.getAudioTracks()[0]?.id,combinedStreamAudioTrackReadyState:u.getAudioTracks()[0]?.readyState,audioTrackStillSame:u.getAudioTracks()[0]===n}),u}async createCameraStreamWithNewAudio(e){let t=this.dependencies.getSelectedMicDeviceId(),n=jh(e,{originalCameraConstraints:this.dependencies.getOriginalCameraConstraints(),getSelectedCameraDeviceId:this.dependencies.getSelectedCameraDeviceId}),r=Mh(t),i=Object.keys(n).length>0,a=!0;i&&(a=n);let o={video:a,audio:r},s=await Ah().getUserMedia(o),c=s.getVideoTracks()[0],l=s.getAudioTracks()[0];return zh(c,`video`,s),zh(l,`audio`,s),this.dependencies.setOriginalCameraStream(s),s}async createNewCameraStreamForRecording(){let e=this.dependencies.getSelectedCameraDeviceId();return await this.createCameraStreamWithOriginalAudio(e)||this.createCameraStreamWithNewAudio(e)}async getCameraStream(e){let t=this.dependencies.streamManager.isRecording(),n=this.dependencies.getSelectedCameraDeviceId(),r=this.dependencies.getSelectedMicDeviceId();if(this.dependencies.streamManager.setVideoDevice(n),this.dependencies.streamManager.setAudioDevice(r),e.canReuseOriginalStream()){let e=this.dependencies.getOriginalCameraStream();if(!e)throw Error(`Original camera stream is null`);return e}if(e.canReuseManagerStream()){let e=this.dependencies.streamManager.getStream();if(!e)throw Error(`Manager stream is null`);return e}t||this.dependencies.getOriginalCameraStream()&&this.dependencies.setOriginalCameraStream(null);let i=this.dependencies.streamManager.getStream();if(!t&&i&&i!==this.dependencies.getOriginalCameraStream()&&(Fh(i),this.dependencies.streamManager.setMediaStream(null)),t)return this.dependencies.streamManager.setVideoDevice(this.dependencies.getSelectedCameraDeviceId()),this.dependencies.streamManager.setAudioDevice(this.dependencies.getSelectedMicDeviceId()),this.createNewCameraStreamForRecording();let a=await this.dependencies.streamManager.startStream();return this.dependencies.setOriginalCameraStream(a),a}};let Hh=`screen`,Uh=`No video track found in screen share stream`;async function Wh(e,t,n){n.setScreenShareStream(e);let r=e.getVideoTracks()[0];if(!r)throw n.stopStreamTracks(e),Error(Uh);let i=n.combineScreenShareWithOriginalAudio(r),a=n.getOriginalCameraStream();t&&t!==a&&n.stopStreamVideoTracks(t);let o=e.getAudioTracks();for(let e of o)e.stop();return n.setCurrentSourceType(Hh),n.callbacks.onSourceChange&&await n.callbacks.onSourceChange(n.getCurrentSourceType()),Gh(i,n),i}function Gh(e,t){let n=e.getVideoTracks()[0];if(!n)throw Error(Uh);let r=t.getScreenShareTrackEndHandler();if(r){let e=t.streamManager.getStream();if(e){let t=e.getVideoTracks()[0];t&&t.removeEventListener(`ended`,r)}}let i=()=>{t.getCurrentSourceType()===Hh&&t.switchToCamera().catch(e=>{t.handleSwitchError(e)})};t.setScreenShareTrackEndHandler(i),n.addEventListener(`ended`,i)}function Kh(e,t){let n=t.getScreenShareTrackEndHandler();if(!(n&&e))return;let r=e.getVideoTracks()[0];r&&r.removeEventListener(`ended`,n),t.setScreenShareTrackEndHandler(null)}function qh(e,t){e.onTransitionStart&&e.onTransitionStart(t)}function Jh(e){e.onTransitionEnd&&e.onTransitionEnd()}function Yh(e){e.onScreenSelectionStart&&e.onScreenSelectionStart()}function Xh(e){e.onScreenSelectionEnd&&e.onScreenSelectionEnd()}function Zh(e){Xh(e),Jh(e)}let Qh=`Failed to get camera stream`;var $h=class{constructor(e,t={}){this.currentSourceType=`camera`,this.originalCameraStream=null,this.screenShareStream=null,this.screenShareTrackEndHandler=null,this.streamManager=e,this.callbacks=t;let n=null,r=()=>n;this.getOriginalCameraConstraints=r,this.setOriginalCameraConstraints=e=>{n=e},this.cameraStreamBuilder=new Vh({streamManager:this.streamManager,logger:{debug:(e,t)=>$.debug(e,t),warn:(e,t)=>$.warn(e,t)},getSelectedCameraDeviceId:()=>this.callbacks.getSelectedCameraDeviceId?this.callbacks.getSelectedCameraDeviceId():this.streamManager.getVideoDevice(),getSelectedMicDeviceId:()=>this.callbacks.getSelectedMicDeviceId?this.callbacks.getSelectedMicDeviceId():this.streamManager.getAudioDevice(),getOriginalCameraStream:()=>this.originalCameraStream,setOriginalCameraStream:e=>{this.originalCameraStream=e},getOriginalCameraConstraints:r})}getCurrentSourceType(){return this.currentSourceType}getOriginalCameraStream(){return this.originalCameraStream}storeOriginalCameraConstraints(e){let t=e.getVideoTracks()[0];if(!t)return;let n=t.getSettings(),r={width:n.width,height:n.height,aspectRatio:n.aspectRatio,frameRate:n.frameRate,deviceId:n.deviceId,facingMode:n.facingMode},i=this.getOriginalCameraConstraints();i&&i.width===r.width&&i.height===r.height&&i.aspectRatio===r.aspectRatio&&i.frameRate===r.frameRate&&i.deviceId===r.deviceId&&i.facingMode===r.facingMode||this.setOriginalCameraConstraints(r)}storeOriginalCameraStream(e){let t=e.getVideoTracks()[0],n=e.getAudioTracks()[0];Rh(t,n)?this.originalCameraStream=new MediaStream([t,n]):this.originalCameraStream=e}createError(e){return e instanceof Error?e:Error(i(e))}waitForTracksToEnd(e){return new Promise(t=>{setTimeout(()=>{this.screenShareStream=null,t()},e)})}combineScreenShareWithOriginalAudio(e){let t;this.originalCameraStream&&(t=this.originalCameraStream.getAudioTracks()[0]),$.debug(`[SourceSwitchManager] combineScreenShareWithOriginalAudio`,{hasOriginalCameraStream:!!this.originalCameraStream,originalCameraStreamId:this.originalCameraStream?.id,hasOriginalAudioTrack:!!t,originalAudioTrackId:t?.id,originalAudioTrackReadyState:t?.readyState,originalAudioTrackEnabled:t?.enabled,originalAudioTrackMuted:t?.muted,originalAudioTrackLabel:t?.label,isTrackLive:Lh(t),screenVideoTrackId:e.id,screenVideoTrackReadyState:e.readyState});let n=[e];Lh(t)&&t?(n=[...n,t],$.debug(`[SourceSwitchManager] Added original audio track to combined stream`,{audioTrackId:t.id,combinedTracksCount:n.length})):$.warn(`[SourceSwitchManager] Original audio track is not live, not adding to combined stream`,{audioTrackId:t?.id,audioTrackReadyState:t?.readyState,combinedTracksCount:n.length});let r=new MediaStream(n);return $.debug(`[SourceSwitchManager] Combined stream created`,{combinedStreamId:r.id,combinedStreamVideoTracksCount:r.getVideoTracks().length,combinedStreamAudioTracksCount:r.getAudioTracks().length,combinedStreamAudioTrackId:r.getAudioTracks()[0]?.id,combinedStreamAudioTrackReadyState:r.getAudioTracks()[0]?.readyState}),r}isPermissionDeniedError(e){let t=i(e),n=!1;t.includes(`NotAllowedError`)&&(n=!0),t.includes(`AbortError`)&&(n=!0);let r=t.toLowerCase();return r.includes(`permission denied`)&&(n=!0),r.includes(`user denied`)&&(n=!0),n}switchToScreenCapture(){let e=this.streamManager.getStream();return e&&(this.storeOriginalCameraConstraints(e),this.storeOriginalCameraStream(e)),qh(this.callbacks,`Select screen to share...`),Yh(this.callbacks),Promise.resolve().then(async()=>{let t=Ah();if(typeof t.getDisplayMedia!=`function`)throw Error(`Screen sharing is not supported on this device`);return Wh(await t.getDisplayMedia({video:!0,audio:!0}),e,this.getScreenShareDependencies())}).catch(e=>{if(Zh(this.callbacks),this.isPermissionDeniedError(e))return null;throw e})}canReuseStream(e,t){if(!e||t&&e!==this.originalCameraStream)return!1;let n=e.getVideoTracks()[0],r=e.getAudioTracks()[0];return!(!Rh(n,r)||this.callbacks.getSelectedCameraDeviceId&&this.callbacks.getSelectedCameraDeviceId()!==n.getSettings().deviceId)}canReuseOriginalStream(){return this.canReuseStream(this.originalCameraStream,!1)}canReuseManagerStream(){let e=this.streamManager.getStream();return e&&this.originalCameraStream?this.canReuseStream(e,!0):!1}getScreenShareDependencies(){return{callbacks:this.callbacks,streamManager:this.streamManager,combineScreenShareWithOriginalAudio:e=>this.combineScreenShareWithOriginalAudio(e),stopStreamTracks:e=>Fh(e),stopStreamVideoTracks:e=>Ih(e),getCurrentSourceType:()=>this.currentSourceType,setCurrentSourceType:e=>{this.currentSourceType=e},getOriginalCameraStream:()=>this.originalCameraStream,getScreenShareStream:()=>this.screenShareStream,setScreenShareStream:e=>{this.screenShareStream=e},getScreenShareTrackEndHandler:()=>this.screenShareTrackEndHandler,setScreenShareTrackEndHandler:e=>{this.screenShareTrackEndHandler=e},switchToCamera:()=>this.switchToCamera(),handleSwitchError:e=>{this.callbacks.onError&&this.callbacks.onError(this.createError(e))}}}getCameraStream(){return this.cameraStreamBuilder.getCameraStream({canReuseOriginalStream:()=>this.canReuseOriginalStream(),canReuseManagerStream:()=>this.canReuseManagerStream()})}switchToCamera(){let e=this.streamManager.isRecording();return!e&&this.currentSourceType===`camera`?Promise.resolve():Promise.resolve().then(async()=>{qh(this.callbacks,`Switching to camera...`),await this.handleScreenShareStop();let t=await this.getCameraStream();if(!t)throw Error(Qh);await this.applyCameraStream(t,e),Jh(this.callbacks)}).catch(e=>{throw Jh(this.callbacks),e})}stopScreenShareStreamTracks(e){let t=e.getVideoTracks(),n=e.getAudioTracks();$.debug(`[SourceSwitchManager] stopping screen share tracks`,{videoTracks:t.map(e=>({id:e.id,readyState:e.readyState,displaySurface:e.getSettings().displaySurface,constraints:e.getConstraints()})),audioTracks:n.map(e=>({id:e.id,readyState:e.readyState,constraints:e.getConstraints()}))});for(let e of t)e.stop();for(let e of n)e.stop()}stopDisplayTracks(e){if(e)for(let t of e.getVideoTracks())typeof t.getSettings().displaySurface==`string`&&Lh(t)&&($.debug(`[SourceSwitchManager] stopping display track`,{id:t.id,readyState:t.readyState,constraints:t.getConstraints(),settings:t.getSettings()}),t.stop())}async handleScreenShareStop(){if(this.currentSourceType!==`screen`)return;$.debug(`[SourceSwitchManager] handleScreenShareStop invoked`,{currentSourceType:this.currentSourceType,hasScreenShareStream:!!this.screenShareStream,screenShareStreamId:this.screenShareStream?.id,hasOriginalCameraStream:!!this.originalCameraStream,originalCameraStreamId:this.originalCameraStream?.id});let e=this.screenShareStream,t=this.streamManager.getStream();if($.debug(`[SourceSwitchManager] Current stream state before stop`,{currentStreamId:t?.id,currentStreamVideoTracksCount:t?.getVideoTracks().length,currentStreamAudioTracksCount:t?.getAudioTracks().length,currentStreamAudioTrackId:t?.getAudioTracks()[0]?.id,currentStreamAudioTrackReadyState:t?.getAudioTracks()[0]?.readyState,originalCameraStreamAudioTrackId:this.originalCameraStream?.getAudioTracks()[0]?.id,originalCameraStreamAudioTrackReadyState:this.originalCameraStream?.getAudioTracks()[0]?.readyState}),e){let t=e.getAudioTracks();$.debug(`[SourceSwitchManager] Screen share stream audio tracks before stop`,{screenShareStreamId:e.id,screenShareAudioTracksCount:t.length,screenShareAudioTrackIds:t.map(e=>({id:e.id,readyState:e.readyState,enabled:e.enabled}))}),Kh(e,this.getScreenShareDependencies()),this.stopScreenShareStreamTracks(e),this.stopDisplayTracks(e),this.screenShareStream=null,await this.waitForTracksToEnd(0),$.debug(`[SourceSwitchManager] Screen share stream stopped`,{screenShareAudioTracksAfterStop:t.map(e=>({id:e.id,readyState:e.readyState}))})}if(t){let e=t.getAudioTracks();$.debug(`[SourceSwitchManager] Current stream audio tracks before video stop`,{currentStreamId:t.id,currentStreamAudioTracksCount:e.length,currentStreamAudioTrackIds:e.map(e=>({id:e.id,readyState:e.readyState,enabled:e.enabled}))}),Ih(t),this.stopDisplayTracks(t),$.debug(`[SourceSwitchManager] Current stream audio tracks after video stop`,{currentStreamId:t.id,currentStreamAudioTracksCount:t.getAudioTracks().length,currentStreamAudioTrackIds:t.getAudioTracks().map(e=>({id:e.id,readyState:e.readyState,enabled:e.enabled}))})}$.debug(`[SourceSwitchManager] Original camera stream state before source change`,{hasOriginalCameraStream:!!this.originalCameraStream,originalCameraStreamId:this.originalCameraStream?.id,originalCameraStreamAudioTracksCount:this.originalCameraStream?.getAudioTracks().length,originalCameraStreamAudioTrackId:this.originalCameraStream?.getAudioTracks()[0]?.id,originalCameraStreamAudioTrackReadyState:this.originalCameraStream?.getAudioTracks()[0]?.readyState,originalCameraStreamAudioTrackEnabled:this.originalCameraStream?.getAudioTracks()[0]?.enabled}),this.currentSourceType=`camera`,this.callbacks.onSourceChange&&await this.callbacks.onSourceChange(this.currentSourceType),$.debug(`[SourceSwitchManager] handleScreenShareStop completed`,{hasScreenShareStream:!!this.screenShareStream,currentSourceType:this.currentSourceType,hasOriginalCameraStream:!!this.originalCameraStream,originalCameraStreamId:this.originalCameraStream?.id,originalCameraStreamAudioTracksCount:this.originalCameraStream?.getAudioTracks().length,originalCameraStreamAudioTrackId:this.originalCameraStream?.getAudioTracks()[0]?.id,originalCameraStreamAudioTrackReadyState:this.originalCameraStream?.getAudioTracks()[0]?.readyState})}async applyCameraStream(e,t){this.streamManager.setMediaStream(e);let n=this.currentSourceType!==`camera`;this.currentSourceType=`camera`,n&&this.callbacks.onSourceChange&&await this.callbacks.onSourceChange(this.currentSourceType),t&&await this.streamManager.switchVideoSource(e),this.callbacks.onPreviewUpdate&&await this.callbacks.onPreviewUpdate(e)}async toggleSource(){if(!this.streamManager.isRecording())return;let e;e=this.currentSourceType===`camera`?this.switchToScreen():this.switchToCamera(),await e.catch(e=>{this.handleToggleError(e)})}async switchToScreen(){let e=await this.switchToScreenCapture();if(!e){Jh(this.callbacks);return}qh(this.callbacks,`Switching to screen...`),await this.streamManager.switchVideoSource(e),this.callbacks.onPreviewUpdate&&await this.callbacks.onPreviewUpdate(e),Jh(this.callbacks)}handleToggleError(e){Jh(this.callbacks);let t=i(e),n=!1;t.includes(`NotAllowedError`)&&(n=!0),t.includes(`AbortError`)&&(n=!0),n&&this.currentSourceType===`screen`&&this.switchToCamera().catch(e=>{this.callbacks.onError&&this.callbacks.onError(this.createError(e))}),!n&&this.callbacks.onError&&this.callbacks.onError(this.createError(e))}async handleRecordingStop(){if(this.currentSourceType!==`screen`){this.cleanup();return}await Promise.resolve().then(async()=>{let e=this.streamManager.getStream();e&&(Kh(e,this.getScreenShareDependencies()),Ih(e));let t=await this.getCameraStream();if(!t)throw Error(Qh);this.streamManager.setMediaStream(t),this.currentSourceType=`camera`,this.callbacks.onSourceChange&&await this.callbacks.onSourceChange(this.currentSourceType),this.callbacks.onPreviewUpdate&&await this.callbacks.onPreviewUpdate(t)}).catch(e=>{throw this.callbacks.onError&&this.callbacks.onError(this.createError(e)),e}),this.cleanup()}cleanup(){this.screenShareStream&&=(Kh(this.screenShareStream,this.getScreenShareDependencies()),this.stopScreenShareStreamTracks(this.screenShareStream),null);let e=this.streamManager.getStream();e&&Kh(e,this.getScreenShareDependencies()),this.screenShareTrackEndHandler=null,this.originalCameraStream=null,this.setOriginalCameraConstraints(null)}setCallbacks(e){this.callbacks={...this.callbacks,...e}}};let eg=Object.freeze({width:{ideal:Gt.width||1920},height:{ideal:Gt.height||1080},frameRate:{ideal:Gt.fps||30}}),tg=Object.freeze({video:eg,audio:!0});Object.freeze({mimeType:`video/webm;codecs=vp9,opus`});let ng={NotReadableError:`camera.in-use`,NotFoundError:`camera.not-found`,NotAllowedError:`camera.permission-denied`,OverconstrainedError:`camera.overconstrained`};function rg(e){if(e instanceof DOMException){let t=ng[e.name];if(t!==void 0)return t}if(typeof e==`object`&&e&&`name`in e&&typeof e.name==`string`){let t=ng[e.name];if(t!==void 0)return t}return`camera.unknown`}function ig(e){let t=i(e),n=Error(t);return n.name=`CameraError`,n.code=rg(e),n}var ag=class{constructor(e={}){this.mediaStream=null,this.state=`idle`,this.eventListeners=new Map,this.selectedAudioDeviceId=null,this.selectedVideoDeviceId=null,this.streamConfig={...tg,...e}}getState(){return this.state}getStream(){return this.mediaStream}getAudioStreamForAnalysis(){return this.mediaStream&&this.mediaStream.getAudioTracks().length>0?this.mediaStream:null}isActive(){return this.state===`active`||this.state===`recording`}on(e,t){this.eventListeners.has(e)||this.eventListeners.set(e,new Set);let n=this.eventListeners.get(e);return n&&n.add(t),()=>{this.off(e,t)}}off(e,t){let n=this.eventListeners.get(e);n&&n.delete(t)}once(e,t){let n=(r=>{t(r),this.off(e,n)});return this.on(e,n)}emit(e,t){let n=this.eventListeners.get(e);if(n)for(let e of n)try{e(t)}catch{}}setState(e){if(this.state===e)return;let t=this.state;this.state=e,this.emit(`statechange`,{state:e,previousState:t})}setAudioDevice(e){this.selectedAudioDeviceId=e}setVideoDevice(e){this.selectedVideoDeviceId=e}getAudioDevice(){return this.selectedAudioDeviceId}getVideoDevice(){return this.selectedVideoDeviceId}async getAvailableDevices(){try{let e=await navigator.mediaDevices.enumerateDevices();return{audioinput:e.filter(e=>e.kind===`audioinput`),videoinput:e.filter(e=>e.kind===`videoinput`)}}catch(e){throw Error(`Failed to enumerate devices: ${i(e)}`)}}buildDeviceConstraints(e,t){return e?typeof t==`object`?{...t,deviceId:{exact:e}}:{deviceId:{exact:e}}:t}buildVideoConstraints(e){return this.buildDeviceConstraints(e,this.streamConfig.video)}buildAudioConstraints(e){return this.buildDeviceConstraints(e,this.streamConfig.audio)}async startStream(){if($.debug(`[StreamManager] startStream called`,{hasExistingStream:!!this.mediaStream,selectedVideoDeviceId:this.selectedVideoDeviceId,selectedAudioDeviceId:this.selectedAudioDeviceId}),this.mediaStream){let e=this.mediaStream.getVideoTracks()[0];if(this.selectedVideoDeviceId===null)if(e?.getSettings?.()?.deviceId)$.debug(`[StreamManager] Stopping existing stream to recreate`),this.stopStream();else return $.debug(`[StreamManager] Reusing existing stream`),this.mediaStream;if(e?.getSettings&&e.getSettings().deviceId===this.selectedVideoDeviceId)return $.debug(`[StreamManager] Existing stream matches device, reusing`),this.mediaStream;$.debug(`[StreamManager] Device changed, stopping existing stream`),this.stopStream()}this.setState(`starting`),$.debug(`[StreamManager] State set to 'starting'`);try{$.debug(`[StreamManager] Building constraints`,{selectedVideoDeviceId:this.selectedVideoDeviceId,selectedAudioDeviceId:this.selectedAudioDeviceId});let e={video:this.buildVideoConstraints(this.selectedVideoDeviceId),audio:this.buildAudioConstraints(this.selectedAudioDeviceId)};return $.debug(`[StreamManager] Requesting media stream with constraints`,{hasVideo:!!e.video,hasAudio:!!e.audio}),this.mediaStream=await Ah().getUserMedia(e),$.info(`[StreamManager] Media stream obtained`,{streamId:this.mediaStream.id,videoTracks:this.mediaStream.getVideoTracks().length,audioTracks:this.mediaStream.getAudioTracks().length}),this.setState(`active`),$.debug(`[StreamManager] State set to 'active'`),$.debug(`[StreamManager] Emitting streamstart event`),this.emit(`streamstart`,{stream:this.mediaStream}),this.mediaStream}catch(e){let t=ig(e);throw $.error(`[StreamManager] Failed to start stream`,t),this.setState(`error`),this.emit(`error`,{error:t}),t}}stopStream(){if(this.mediaStream){for(let e of this.mediaStream.getTracks())e.stop();this.mediaStream=null}this.state!==`idle`&&(this.setState(`idle`),this.emit(`streamstop`,void 0))}stopStreamTracks(e){for(let t of e.getTracks())t.stop()}isTrackLive(e){return e!==void 0&&e.readyState===`live`}async tryReplaceTrack(e,t,n){let r=e.replaceTrack;if(typeof r!=`function`)return!1;try{await r.call(e,t),e.stop();for(let e of n.getTracks())e!==t&&e.stop();return t.stop(),!0}catch{return!1}}recreateStreamWithNewTrack(e,t,n){for(let t of n.getTracks())t!==e&&t.stop();let r=[e];this.isTrackLive(t)&&t&&r.push(t);let i=new MediaStream(r);if(this.mediaStream)for(let e of this.mediaStream.getTracks())e!==t&&e.stop();return i}async switchDeviceTrack(e,t,n){if(!this.mediaStream)throw Error(`No active stream to switch device`);let r=t===`video`?this.mediaStream.getVideoTracks()[0]:this.mediaStream.getAudioTracks()[0],i=t===`video`?this.mediaStream.getAudioTracks()[0]:this.mediaStream.getVideoTracks()[0];if(!r){let e=t===`video`?`video`:`audio`;throw Error(`No ${e} track in current stream`)}let a={[t]:this.buildDeviceConstraints(e,n)},o=await Ah().getUserMedia(a),s=t===`video`?o.getVideoTracks()[0]:o.getAudioTracks()[0];if(!s){this.stopStreamTracks(o);let e=t===`video`?`video`:`audio`;throw Error(`Failed to get new ${e} track`)}return await this.tryReplaceTrack(r,s,o)||(r.stop(),this.mediaStream=this.recreateStreamWithNewTrack(s,i,o)),t===`video`?(this.selectedVideoDeviceId=e,this.emit(`videosourcechange`,{stream:this.mediaStream})):this.selectedAudioDeviceId=e,this.mediaStream}switchVideoDevice(e){return this.switchDeviceTrack(e,`video`,this.streamConfig.video)}switchAudioDevice(e){return this.switchDeviceTrack(e,`audio`,this.streamConfig.audio)}setMediaStream(e){this.mediaStream=e}setAudioTracksEnabled(e){if(!this.mediaStream)return;let t=this.mediaStream.getAudioTracks();for(let n of t)n.enabled=e}destroy(){this.stopStream(),this.eventListeners.clear(),this.setState(`idle`)}};let og=[`Bytes`,`KB`,`MB`,`GB`],sg=1024;function cg(e){if(e===0)return`0 Bytes`;let t=Math.floor(Math.log(e)/Math.log(sg));return`${Math.round(e/sg**t*100)/100} ${og[t]}`}function lg(e){let t=Math.floor(e/3600),n=Math.floor(e%3600/60),r=e%60;return t>0?`${t.toString().padStart(2,`0`)}:${n.toString().padStart(2,`0`)}:${r.toString().padStart(2,`0`)}`:`${n.toString().padStart(2,`0`)}:${r.toString().padStart(2,`0`)}`}let ug={getCurrentTimestamp:()=>performance.now()};var dg=class{constructor(e){this.recordingStartTime=0,this.totalPausedTime=0,this.pauseStartTime=null,this.intervals=[],this.currentIntervalStart=null,this.isTracking=!1,this.visibilityChangeHandler=this.handleVisibilityChange.bind(this),this.blurHandler=this.handleBlur.bind(this),this.focusHandler=this.handleFocus.bind(this);let t=e?.getCurrentTimestamp;t===void 0?this.getCurrentTimestamp=ug.getCurrentTimestamp:this.getCurrentTimestamp=t}start(e){this.isTracking||(this.recordingStartTime=e,this.totalPausedTime=0,this.pauseStartTime=null,this.intervals=[],this.currentIntervalStart=null,this.isTracking=!0,typeof document<`u`&&document.addEventListener(`visibilitychange`,this.visibilityChangeHandler),typeof window<`u`&&(window.addEventListener(`blur`,this.blurHandler),window.addEventListener(`focus`,this.focusHandler)),this.checkInitialState())}pause(){!this.isTracking||this.pauseStartTime!==null||(this.pauseStartTime=this.getCurrentTimestamp(),this.endCurrentIntervalIfActive())}resume(){if(!this.isTracking||this.pauseStartTime===null)return;let e=this.getCurrentTimestamp()-this.pauseStartTime;this.totalPausedTime+=e,this.pauseStartTime=null}getIntervals(){return this.endCurrentIntervalIfActive(),this.intervals.map(e=>({start:this.normalizeTimestamp(e.start),end:this.normalizeTimestamp(e.end)}))}reset(){this.intervals=[],this.currentIntervalStart=null,this.totalPausedTime=0,this.pauseStartTime=null}cleanup(){this.isTracking=!1,this.endCurrentIntervalIfActive(),typeof document<`u`&&document.removeEventListener(`visibilitychange`,this.visibilityChangeHandler),typeof window<`u`&&(window.removeEventListener(`blur`,this.blurHandler),window.removeEventListener(`focus`,this.focusHandler)),this.reset()}checkInitialState(){typeof document>`u`||document.visibilityState===`hidden`&&this.startInterval()}handleVisibilityChange(){typeof document>`u`||(document.visibilityState===`hidden`?this.startInterval():this.endCurrentIntervalIfActive())}handleBlur(){this.startInterval()}handleFocus(){this.endCurrentIntervalIfActive()}startInterval(){this.currentIntervalStart!==null||!this.isTracking||this.pauseStartTime===null&&(this.currentIntervalStart=this.getCurrentTimestamp())}endCurrentIntervalIfActive(){if(this.currentIntervalStart===null)return;let e=this.getCurrentTimestamp(),t=this.currentIntervalStart;e>t&&this.intervals.push({start:t,end:e}),this.currentIntervalStart=null}normalizeTimestamp(e){let t=(e-this.recordingStartTime-this.totalPausedTime)/1e3;return Math.max(0,t)}};let fg=1e3,pg=1e3,mg={checkRecorderSupport:dh,getCurrentTimestamp:()=>performance.now()};var hg=class{constructor(e,t){this.recordingStartTime=0,this.recordingTimer=null,this.pauseStartTime=null,this.totalPausedTime=0,this.streamProcessor=null,this.bufferSizeUpdateInterval=null,this.tabVisibilityTracker=null,this.visibilityChangeHandler=null,this.blurHandler=null,this.focusHandler=null,this.streamManager=e;let n=t?.checkRecorderSupport,r;r=n===void 0?mg.checkRecorderSupport:n;let i=t?.getCurrentTimestamp,a;a=i===void 0?mg.getCurrentTimestamp:i,this.dependencies={checkRecorderSupport:r,getCurrentTimestamp:a}}isRecording(){return this.streamManager.getState()===`recording`}getStreamProcessor(){return this.streamProcessor}getAudioStreamForAnalysis(){if(this.streamProcessor){let e=this.streamProcessor.getAudioStreamForAnalysis();if(e)return e}return this.streamManager.getAudioStreamForAnalysis()}async startRecording(e,t,n,r){let i=this.streamManager.getStream(),a=0;if(i!==null&&(a=i.getAudioTracks().length),$.debug(`[StreamRecordingState] startRecording called`,{hasMediaStream:!!i,isRecording:this.isRecording(),hasProcessor:!!e,audioTracks:a}),!i)throw Error(`Stream must be started before recording`);if(this.isRecording())return $.debug(`[StreamRecordingState] Already recording, returning`),Promise.resolve();let o=i.getAudioTracks().length>0,s=t.watermark!==void 0,c=await this.dependencies.checkRecorderSupport({requiresAudio:o,requiresWatermark:s});if(!c.isSupported)throw kt({missingCapabilities:c.missing,resolutionStage:`feature-preflight`});this.streamProcessor=e,$.debug(`[StreamRecordingState] StreamProcessor assigned, setting callbacks`),e.setOnMuteStateChange(e=>{this.streamManager.emit(`audiomutetoggle`,{muted:e})}),e.setOnSourceChange(e=>{this.streamManager.emit(`videosourcechange`,{stream:e})}),this.bufferSizeUpdateInterval=window.setInterval(()=>{if(!this.streamProcessor)return;let e=this.streamProcessor.getBufferSize(),t=cg(e);this.streamManager.emit(`recordingbufferupdate`,{size:e,formatted:t})},fg),this.resetRecordingState();let l;n===!0&&(l={enabled:!0,text:this.resolveTabVisibilityOverlayText(r),recordingStartTime:this.recordingStartTime}),$.debug(`[StreamRecordingState] Overlay config`,{enableTabVisibilityOverlay:n,hasOverlayText:!!r,overlayText:r,overlayConfig:l}),$.debug(`[StreamRecordingState] Starting processing`),await e.startProcessing(i,t,l),$.info(`[StreamRecordingState] Processing started and worker ready`),n&&($.debug(`[StreamRecordingState] Setting up tab visibility tracking`,{recordingStartTime:this.recordingStartTime}),this.tabVisibilityTracker=new dg,this.tabVisibilityTracker.start(this.recordingStartTime),this.setupVisibilityUpdates(e)),this.streamManager.setState(`recording`),this.streamManager.emit(`recordingstart`,{recorder:null}),this.startRecordingTimer()}async stopRecording(){let e=(this.dependencies.getCurrentTimestamp()-this.recordingStartTime-this.totalPausedTime)/pg;if($.debug(`[StreamRecordingState] stopRecording called`,{hasStreamProcessor:!!this.streamProcessor,isRecording:this.isRecording(),recordingElapsedSeconds:e}),!(this.streamProcessor&&this.isRecording()))throw Error(`Not currently recording`);this.streamManager.setState(`stopping`),this.clearRecordingTimer(),this.clearBufferSizeInterval(),this.resetPauseState(),this.cleanupVisibilityUpdates();let t=[];this.tabVisibilityTracker?(t=this.tabVisibilityTracker.getIntervals(),$.debug(`[StreamRecordingState] Tab visibility intervals collected`,{intervalsCount:t.length,intervals:t}),this.tabVisibilityTracker.cleanup(),this.tabVisibilityTracker=null):$.debug(`[StreamRecordingState] No tab visibility tracker was active`),$.debug(`[StreamRecordingState] Finalizing stream processor`);let n=await this.streamProcessor.finalize();return $.info(`[StreamRecordingState] Stream processor finalized`,{blobSize:n.blob.size,hasBlob:!!n.blob}),this.streamManager.setState(`active`),this.streamManager.emit(`recordingstop`,{blob:n.blob,mimeType:`video/mp4`}),this.streamProcessor=null,$.debug(`[StreamRecordingState] StreamProcessor cleared`),{blob:n.blob,tabVisibilityIntervals:t,recordingStats:n.recordingStats,encoderAcceleration:n.encoderAcceleration}}pauseRecording(){this.clearRecordingTimer(),this.pauseStartTime===null&&(this.pauseStartTime=this.dependencies.getCurrentTimestamp()),this.tabVisibilityTracker&&this.tabVisibilityTracker.pause(),this.streamProcessor&&this.isRecording()&&this.streamProcessor.pause()}resumeRecording(){if(this.pauseStartTime!==null){let e=this.dependencies.getCurrentTimestamp()-this.pauseStartTime;this.totalPausedTime+=e,this.pauseStartTime=null}this.tabVisibilityTracker&&this.tabVisibilityTracker.resume(),this.startRecordingTimer(),this.streamProcessor&&this.isRecording()&&this.streamProcessor.resume()}toggleMute(){kh(this.streamProcessor,`StreamProcessor`).toggleMute()}muteAudio(){this.streamProcessor?(this.streamProcessor.isMutedState()||this.streamProcessor.toggleMute(),this.streamManager.setAudioTracksEnabled(!1)):this.streamManager.getStream()&&(this.streamManager.setAudioTracksEnabled(!1),this.streamManager.emit(`audiomutetoggle`,{muted:!0}))}unmuteAudio(){this.streamProcessor?(this.streamProcessor.isMutedState()&&this.streamProcessor.toggleMute(),this.streamManager.setAudioTracksEnabled(!0)):this.streamManager.getStream()&&(this.streamManager.setAudioTracksEnabled(!0),this.streamManager.emit(`audiomutetoggle`,{muted:!1}))}isMuted(){if(this.streamProcessor)return this.streamProcessor.isMutedState();let e=this.streamManager.getStream();if(e){let t=e.getAudioTracks();return t.length>0&&t.every(e=>!e.enabled)}return!1}async switchVideoSource(e){await kh(this.streamProcessor,`StreamProcessor`).switchVideoSource(e)}getCurrentVideoSource(){return Oh(kh(this.streamProcessor,`StreamProcessor`).getCurrentVideoSource(),`Current video source is not available`)}formatTimeElapsed(e){let t=Math.floor(e/60),n=Math.floor(e%60);return`${t.toString().padStart(2,`0`)}:${n.toString().padStart(2,`0`)}`}startRecordingTimer(){this.recordingTimer=window.setInterval(()=>{let e=(this.dependencies.getCurrentTimestamp()-this.recordingStartTime-this.totalPausedTime)/pg,t=this.formatTimeElapsed(e);this.streamManager.emit(`recordingtimeupdate`,{elapsed:e,formatted:t})},fg)}clearRecordingTimer(){this.recordingTimer!==null&&(clearInterval(this.recordingTimer),this.recordingTimer=null)}clearBufferSizeInterval(){this.bufferSizeUpdateInterval!==null&&(clearInterval(this.bufferSizeUpdateInterval),this.bufferSizeUpdateInterval=null)}resetRecordingState(){this.recordingStartTime=this.dependencies.getCurrentTimestamp(),this.totalPausedTime=0,this.pauseStartTime=null}resetPauseState(){this.totalPausedTime=0,this.pauseStartTime=null}resolveTabVisibilityOverlayText(e){return e===void 0||e.trim().length===0?`User in another tab`:e}setupVisibilityUpdates(e){if(typeof document>`u`||typeof window>`u`){$.warn(`[StreamRecordingState] Cannot setup visibility updates - document/window not available`);return}if(this.visibilityChangeHandler=()=>{if(typeof document>`u`)return;let t=document.visibilityState===`hidden`,n=this.dependencies.getCurrentTimestamp();$.debug(`[StreamRecordingState] Visibility change`,{isHidden:t,timestamp:n,visibilityState:document.visibilityState}),e.updateTabVisibility(t,n)},this.blurHandler=()=>{let t=this.dependencies.getCurrentTimestamp();$.debug(`[StreamRecordingState] Window blur`,{timestamp:t}),e.updateTabVisibility(!0,t)},this.focusHandler=()=>{let t=this.dependencies.getCurrentTimestamp();$.debug(`[StreamRecordingState] Window focus`,{timestamp:t}),e.updateTabVisibility(!1,t)},document.addEventListener(`visibilitychange`,this.visibilityChangeHandler),window.addEventListener(`blur`,this.blurHandler),window.addEventListener(`focus`,this.focusHandler),document.visibilityState===`hidden`){let t=this.dependencies.getCurrentTimestamp();$.debug(`[StreamRecordingState] Initial state is hidden`,{timestamp:t}),e.updateTabVisibility(!0,t)}else $.debug(`[StreamRecordingState] Initial state is visible`)}cleanupVisibilityUpdates(){this.visibilityChangeHandler&&typeof document<`u`&&(document.removeEventListener(`visibilitychange`,this.visibilityChangeHandler),this.visibilityChangeHandler=null),this.blurHandler&&typeof window<`u`&&(window.removeEventListener(`blur`,this.blurHandler),this.blurHandler=null),this.focusHandler&&typeof window<`u`&&(window.removeEventListener(`focus`,this.focusHandler),this.focusHandler=null)}destroy(){this.streamProcessor&&=(this.streamProcessor.cancel().catch(()=>{}),null),this.cleanupVisibilityUpdates(),this.tabVisibilityTracker&&=(this.tabVisibilityTracker.cleanup(),null),this.clearRecordingTimer(),this.clearBufferSizeInterval()}},gg=class{constructor(e={}){this.streamManager=new ag(e),this.recordingState=new hg(this.streamManager)}getState(){return this.streamManager.getState()}getStream(){return this.streamManager.getStream()}getAudioStreamForAnalysis(){return this.recordingState.getAudioStreamForAnalysis()}isRecording(){return this.recordingState.isRecording()}isActive(){return this.streamManager.isActive()}on(e,t){return this.streamManager.on(e,t)}off(e,t){this.streamManager.off(e,t)}once(e,t){return this.streamManager.once(e,t)}setAudioDevice(e){this.streamManager.setAudioDevice(e)}setVideoDevice(e){this.streamManager.setVideoDevice(e)}getAudioDevice(){return this.streamManager.getAudioDevice()}getVideoDevice(){return this.streamManager.getVideoDevice()}async getAvailableDevices(){return await this.streamManager.getAvailableDevices()}async startStream(){return await this.streamManager.startStream()}stopStream(){this.streamManager.stopStream()}switchVideoDevice(e){return this.streamManager.switchVideoDevice(e)}switchAudioDevice(e){return this.streamManager.switchAudioDevice(e)}async startRecording(e,t,n,r){return await this.recordingState.startRecording(e,t,n,r)}async stopRecording(){return await this.recordingState.stopRecording()}pauseRecording(){this.recordingState.pauseRecording()}resumeRecording(){this.recordingState.resumeRecording()}toggleMute(){this.recordingState.toggleMute()}muteAudio(){this.recordingState.muteAudio()}unmuteAudio(){this.recordingState.unmuteAudio()}isMuted(){return this.recordingState.isMuted()}async switchVideoSource(e){return await this.recordingState.switchVideoSource(e)}setMediaStream(e){this.streamManager.setMediaStream(e)}getCurrentVideoSource(){return this.recordingState.getCurrentVideoSource()}destroy(){this.recordingState.destroy(),this.streamManager.destroy()}};let _g=`VIDTREO_INSTALLATION_ID`,vg=`unknown`,yg=new Map;function bg(e){let t=e.storageProvider,n=t?.getItem(_g);if(n)return $.debug(`Using existing installation ID from storage`,{installationId:n}),n;let r=xg(e);return t?.setItem(_g,r),$.debug(`Created new installation ID`,{installationId:r}),r}function xg(e){let t=e.cryptoProvider;if(t?.getRandomValues){let e=new Uint8Array(16);return t.getRandomValues(e),Array.from(e).map(e=>e.toString(16).padStart(2,`0`)).join(``)}let n=e.nowProvider().toString(16),r=e.randomProvider();return`${n}-${Math.floor(r*1e9).toString(16)}`}let Sg=[`sdk.init.started`,`sdk.init.succeeded`,`sdk.init.failed`],Cg=[`stream.error`],wg={"sdk.init.started":`lifecycle`,"sdk.init.succeeded":`lifecycle`,"sdk.init.failed":`error`,"preview.start.succeeded":`interaction`,"preview.start.failed":`error`,"recording.start.requested":`interaction`,"recording.start.succeeded":`interaction`,"recording.start.failed":`error`,"recording.stop.requested":`interaction`,"recording.stop.succeeded":`interaction`,"recording.stop.failed":`error`,"upload.started":`performance`,"upload.succeeded":`performance`,"upload.failed":`error`,"source.switch.requested":`interaction`,"source.switch.succeeded":`interaction`,"source.switch.failed":`error`,"stream.error":`error`};var Tg=class{constructor(e,t){this.pendingEvents=[],this.flushTimeoutId=null,this.throttledEventTimestamps=new Map,this.retryCountMap=new Map,this.config=e,this.dependencies=t,this.installationId=bg(this.dependencies),$.debug(`TelemetryClient initialized`,{installationId:this.installationId,backendUrl:e.backendUrl})}triggerTelemetryEvent(e){try{let t=this.dependencies.nowProvider();if(this.shouldSkipEvent(e.name,t))return;let n=wg[e.name],r=this.buildError(e.error),i=this.buildFingerprint(),a=this.buildContext(),o=this.mergeProperties(this.buildBaseProperties(i),e),s={event:e.name,category:n,timestamp:t,installationId:this.installationId,fingerprint:i,sdkVersion:`1.3.3`,context:a,properties:o,error:r};this.markEventTracking(e.name,t),this.enqueueEvent(s)}catch(t){$.error(`Telemetry event failed`,{eventName:e.name,error:i(t)})}}enqueueEvent(e){try{if(this.pendingEvents=[...this.pendingEvents,e],this.pendingEvents.length>=10){this.flushQueue();return}this.scheduleFlush()}catch(e){$.error(`Failed to enqueue telemetry event`,{error:i(e)})}}scheduleFlush(){this.flushTimeoutId||=this.dependencies.setTimeoutFunction(()=>{this.flushQueue()},1e3)}flushQueue(){try{if(this.pendingEvents.length===0){this.clearFlushTimer();return}let e=this.pendingEvents;this.pendingEvents=[],this.clearFlushTimer();let t=this.buildRequestPayload(e);$.debug(`Telemetry batch flush`,{eventsCount:t.events.length}),this.sendPayload(t).then(()=>{this.clearRetryMetadata(e)}).catch(()=>{this.requeueFailedEvents(e)})}catch(e){$.error(`Failed to flush telemetry queue`,{error:i(e)})}}clearFlushTimer(){this.flushTimeoutId&&=(this.dependencies.clearTimeoutFunction(this.flushTimeoutId),null)}buildRequestPayload(e){return{events:[...e]}}shouldSkipEvent(e,t){if(this.isOneTimeEvent(e)){let t=this.getOneTimeCacheKey(e);if(yg.get(t))return $.debug(`Telemetry event skipped (dedupe)`,{event:e}),!0}if(this.isThrottledEvent(e)){let n=this.throttledEventTimestamps.get(e);if(n!==void 0&&t-n<5e3)return $.debug(`Telemetry event skipped (throttle)`,{event:e,lastSent:n}),!0}return!1}markEventTracking(e,t){if(this.isOneTimeEvent(e)){let t=this.getOneTimeCacheKey(e);yg.set(t,!0)}this.isThrottledEvent(e)&&(this.throttledEventTimestamps=this.updateNumberMap(this.throttledEventTimestamps,e,t))}updateNumberMap(e,t,n){let r=new Map(e);return r.set(t,n),r}getOneTimeCacheKey(e){return`${this.installationId}:${e}`}isOneTimeEvent(e){return Sg.includes(e)}isThrottledEvent(e){return Cg.includes(e)}buildBaseProperties(e){let t={},n=e.userAgent,r=this.getBrowserName(n);return r&&(t={...t,browserName:r}),t}mergeProperties(e,t){let n=t.properties;if(!(Object.keys(e).length===0&&!n)){if(Object.keys(e).length>0&&n)return{...e,...n};if(Object.keys(e).length>0)return{...e};if(n)return{...n}}}buildFingerprint(){let e=this.dependencies.navigatorProvider;if(!e)return{};let t={userAgent:e.userAgent,language:e.language,platform:e.platform};e.hardwareConcurrency&&(t={...t,hardwareConcurrency:e.hardwareConcurrency});let n=this.getDeviceMemory(e);return n!==null&&(t={...t,deviceMemory:n}),t}buildContext(){let e=this.config.pageUrl,t=this.config.referrerUrl;if(!e){let t=this.dependencies.locationProvider;t&&(e=t.href)}if(!t){let e=this.dependencies.documentProvider;if(e){let n=e.referrer;n&&(t=n)}}return{sessionId:this.config.sessionId,userId:this.config.userId,environmentId:this.config.environmentId,appVersion:this.config.appVersion,release:this.config.release,pageUrl:e,referrerUrl:t,sdkLocation:this.config.sdkLocation,clientLocation:this.config.clientLocation}}buildError(e){if(!e)return;let t={message:i(e)};return e instanceof Error&&(e.name&&(t.code=e.name),e.stack&&(t.stack=e.stack)),t}getBrowserName(e){return e?e.includes(`Edg`)?`edge`:e.includes(`Chrome`)?`chrome`:e.includes(`Firefox`)?`firefox`:e.includes(`Safari`)?`safari`:vg:vg}getDeviceMemory(e){let t=e;return t.deviceMemory?t.deviceMemory:null}async sendPayload(e){let t=this.buildTelemetryEndpoint(),n={method:`POST`,headers:{"Content-Type":`application/json`,Authorization:`Bearer ${this.config.apiKey}`},body:JSON.stringify(e)};$.debug(`Sending telemetry to endpoint`,{endpoint:t,payloadSize:JSON.stringify(e).length,hasApiKey:!!this.config.apiKey});let r=await this.dependencies.fetchFunction(t,n).catch(e=>{throw $.error(`Failed to send telemetry`,{endpoint:t,error:i(e)}),e});if(r&&!r.ok)throw $.error(`Telemetry endpoint returned error`,{status:r.status}),Error(`Telemetry HTTP ${r.status}`)}requeueFailedEvents(e){let t=e.filter(e=>(this.retryCountMap.get(e)??0)<3);for(let e of t){let t=this.retryCountMap.get(e)??0;this.retryCountMap.set(e,t+1)}let n=e.length-t.length;if(n>0){let r=e.filter(e=>!t.includes(e));this.clearRetryMetadata(r),$.warn(`Dropped ${n} telemetry events after max retries`)}if(t.length===0)return;let r=this.pendingEvents.length,i=Math.max(0,100-r);this.pendingEvents=[...t.slice(0,i),...this.pendingEvents],this.scheduleFlush()}clearRetryMetadata(e){for(let t of e)this.retryCountMap.delete(t)}buildTelemetryEndpoint(){return this.config.endpoint?this.config.endpoint:`${this.config.backendUrl}/api/v1/telemetry`}};function Eg(){let e=typeof window<`u`,t=typeof document<`u`,n=fetch,r=null,i=null,a=null,o=null,s=null,c=setTimeout,l=clearTimeout;return e&&(n=window.fetch.bind(window),r=window.crypto,i=window.localStorage,a=window.navigator,o=window.location,c=window.setTimeout.bind(window),l=window.clearTimeout.bind(window)),t&&(s=document),{fetchFunction:n,cryptoProvider:r,storageProvider:i,navigatorProvider:a,locationProvider:o,documentProvider:s,nowProvider:()=>Date.now(),randomProvider:()=>Math.random(),setTimeoutFunction:c,clearTimeoutFunction:l}}function Dg(e,t,n){return new Tg({apiKey:e,backendUrl:t,endpoint:n?.endpoint,sessionId:n?.sessionId,userId:n?.userId,environmentId:n?.environmentId,appVersion:n?.appVersion,release:n?.release,pageUrl:n?.pageUrl,referrerUrl:n?.referrerUrl,sdkLocation:n?.sdkLocation,clientLocation:n?.clientLocation},Eg())}var Og=class{constructor(e,t){this.isProcessing=!1,this.retryTimeoutId=null,this.callbacks={},this.storageService=e,this.uploadService=t,this.networkOnlineHandler=()=>{this.processQueue().catch(e=>{let t=i(e);this.callbacks.onUploadError?.(`network-recovery`,Error(t))})},window.addEventListener(`online`,this.networkOnlineHandler),this.processingIntervalId=window.setInterval(()=>{this.processQueue().catch(e=>{let t=i(e);this.callbacks.onUploadError?.(`processing-loop`,Error(t))})},5e3)}destroy(){this.clearTimer(this.processingIntervalId,clearInterval),this.clearTimer(this.retryTimeoutId,clearTimeout),window.removeEventListener(`online`,this.networkOnlineHandler)}setCallbacks(e){this.callbacks=e}async queueUpload(e){let t=await this.storageService.savePendingUpload(e);return this.processQueue(),t}async processQueue(){if(!this.isProcessing){this.isProcessing=!0;try{if(!this.storageService.isInitialized())throw Error(`Database not initialized`);let e=await this.storageService.getPendingUploads(`pending`);if(e.length>0){let t=this.getOldestUpload(e);await this.processUpload(t),this.isProcessing=!1;return}let t=(await this.storageService.getPendingUploads(`failed`)).filter(e=>e.retryCount<10);if(t.length>0){let e=this.getOldestFailedUpload(t),n=this.calculateRetryDelay(e.retryCount),r=Date.now()-e.updatedAt;if(r>=n)await this.storageService.updateUploadStatus(e.id,{status:`pending`,retryCount:e.retryCount}),await this.processUpload(e);else{let e=n-r;this.scheduleRetry(e)}}this.isProcessing=!1}catch(e){throw this.isProcessing=!1,Error(`Error processing upload queue: ${i(e)}`)}}}getPendingUploads(){return this.storageService.getPendingUploads()}async getStats(){let e=await this.storageService.getPendingUploads(),t={pending:0,uploading:0,failed:0,total:e.length};for(let n of e)n.status===`pending`?t.pending+=1:n.status===`uploading`?t.uploading+=1:n.status===`failed`&&(t.failed+=1);return t}getOldestUpload(e){if(e.length===0)throw Error(`Cannot get oldest upload from empty array`);return e.sort((e,t)=>e.createdAt-t.createdAt)[0]}getOldestFailedUpload(e){if(e.length===0)throw Error(`Cannot get oldest failed upload from empty array`);return e.sort((e,t)=>e.updatedAt-t.updatedAt)[0]}async processUpload(e){try{await this.storageService.updateUploadStatus(e.id,{status:`uploading`});let t=await this.uploadService.uploadVideo(e.blob,{apiKey:e.apiKey,backendUrl:e.backendUrl,filename:e.filename,metadata:e.metadata,userMetadata:e.userMetadata,onProgress:t=>{this.callbacks.onUploadProgress?.(e.id,t)}});await this.storageService.deleteUpload(e.id),this.callbacks.onUploadComplete?.(e.id,t)}catch(t){let n=i(t),r=e.retryCount+1;if(await this.storageService.updateUploadStatus(e.id,{status:`failed`,retryCount:r,lastError:n}),r>=10)this.callbacks.onUploadError?.(e.id,Error(`Upload failed after 10 attempts: ${n}`));else{let e=this.calculateRetryDelay(r);this.scheduleRetry(e)}}}calculateRetryDelay(e){let t=2e3*1.5**(e-1);return Math.min(t,3e5)}scheduleRetry(e){this.clearTimer(this.retryTimeoutId,clearTimeout),this.retryTimeoutId=window.setTimeout(()=>{this.retryTimeoutId=null,this.processQueue()},e)}clearTimer(e,t){e!==null&&t(e)}},kg=class{uploadVideo(e,t){if(!t.filename)throw Error(`Filename is required`);if(!e.type||e.type.trim()===``)throw Error(`Blob type is required`);return this.uploadVideoFile(e,t)}uploadVideoFile(e,t){return new Promise((n,r)=>{let i=new XMLHttpRequest;if(t.onProgress){let e=t.onProgress;i.upload.addEventListener(`progress`,t=>{t.lengthComputable&&e(t.loaded/t.total)})}i.addEventListener(`load`,()=>{if(i.status>=200&&i.status<=299){this.parseSuccessResponse(i,n,r);return}this.parseErrorResponse(i,r)}),i.addEventListener(`error`,()=>{r(Error(`Network error during upload`))}),i.addEventListener(`abort`,()=>{r(Error(`Upload was aborted`))});let a=`${t.backendUrl}/api/v1/videos/upload`;i.open(`POST`,a),i.setRequestHeader(`Authorization`,`Bearer ${t.apiKey}`);let o=new FormData;o.append(`file`,e,t.filename);let s={filename:t.filename,mimeType:e.type};t.userMetadata&&(s.userMetadata=t.userMetadata),o.append(`metadata`,JSON.stringify(s)),i.send(o)})}parseSuccessResponse(e,t,n){let r=this.safeParseJsonFromXhr(e);if(!r){n(Error(`Failed to parse upload response: invalid JSON`));return}let i=r.data;if(!i){n(Error(`Failed to parse upload response: missing data`));return}t({id:i.id,publicId:i.publicId,filename:i.filename,fileSize:i.fileSize,mimeType:i.mimeType,duration:i.duration,status:i.status,uploadUrl:i.uploadUrl,createdAt:i.createdAt})}parseErrorResponse(e,t){let n=this.safeParseJsonFromXhr(e);if(n&&typeof n==`object`&&`error`in n&&typeof n.error==`string`){t(Error(n.error));return}t(Error(`Upload failed: ${e.status} ${e.statusText}`))}safeParseJsonFromXhr(e){if(!e.responseText||e.responseText.trim()===``)return null;let t=e.responseText.trim();if(!(t.startsWith(`{`)&&t.endsWith(`}`))||t.length<2)return null;let n=JSON.parse(e.responseText);return typeof n==`object`&&n?n:null}};let Ag=e=>{},jg=e=>{},Mg=e=>{},Ng=()=>{},Pg=e=>{},Fg=(e,t)=>{},Ig=e=>{},Lg=e=>{},Rg=e=>{},zg=()=>{},Bg=e=>{};function Vg(e){let t={onProgress:Ag,onSuccess:jg,onError:Mg,onClearStatus:Ng};return e.upload&&(t=e.upload),t}function Hg(e){let t=Bg;return e.onStorageCleanupError&&(t=e.onStorageCleanupError),t}function Ug(e,t){let n=e.recording,r=Pg;n?.onStateChange&&(r=n.onStateChange);let i=Fg;n?.onCountdownUpdate&&(i=n.onCountdownUpdate);let a=Ig;n?.onTimerUpdate&&(a=n.onTimerUpdate);let o=Lg;n?.onError&&(o=n.onError);let s=Rg;n?.onRecordingComplete&&(s=n.onRecordingComplete);let c=zg;return n?.onClearUploadStatus&&(c=n.onClearUploadStatus),{onStateChange:r,onCountdownUpdate:i,onTimerUpdate:a,onError:o,onRecordingComplete:s,onClearUploadStatus:c,onStopAudioTracking:t.stopAudioTracking,onGetConfig:t.getConfig}}function Wg(e,t){let n=e.sourceSwitch;return{onSourceChange:n?.onSourceChange,onPreviewUpdate:n?.onPreviewUpdate,onError:n?.onError,onTransitionStart:n?.onTransitionStart,onTransitionEnd:n?.onTransitionEnd,onScreenSelectionStart:()=>{t.isRecording()&&t.updateSourceType(!0)},onScreenSelectionEnd:()=>{t.isRecording()&&t.updateSourceType(!1)},getSelectedCameraDeviceId:t.getSelectedCameraDeviceId,getSelectedMicDeviceId:t.getSelectedMicDeviceId}}function Gg(e){let t=e.getVideoTracks();if(t.length===0)return!1;let n=t[0];return`displaySurface`in n.getSettings()||n.label.toLowerCase().includes(`screen`)||n.label.toLowerCase().includes(`display`)}ym();function Kg(e){if(e!==void 0)return typeof e==`number`?e:e===_p?`low`:e===vp?`medium`:e===yp?`high`:e===bp?`very-high`:`high`}let qg=`recording.invalid-container-layout`,Jg=`recording.no-video-track`,Yg=`stsz`;function Xg(e){let t=Error(qg);return t.code=qg,t.detectedBoxTypes=e,t}function Zg(e){let t=Error(e);return t.code=e,t}function Qg(e){return e instanceof Uint8Array?e:new Uint8Array(e)}function $g(e,t){let n=e.getUint8(t),r=e.getUint8(t+1),i=e.getUint8(t+2),a=e.getUint8(t+3);return String.fromCharCode(n,r,i,a)}function e_(e,t){let n=e.getUint32(t,!1),r=e.getUint32(t+4,!1);return n*4294967296+r}function t_(e){let t=new Set;for(let n of e)t.add(n);return[...t]}function n_(e,t,n){let r=new DataView(e.buffer,e.byteOffset,e.byteLength),i=[],a=t;for(;a<n;){if(!(a+8<=n))throw Xg(i.map(e=>e.type));let e=r.getUint32(a,!1),t=$g(r,a+4),o=e,s=8;if(e===1){let e=a+8;if(!(e+8<=n))throw Xg(i.map(e=>e.type));o=e_(r,e),s=16}if(e===0&&(o=n-a),!(o>=s))throw Xg(i.map(e=>e.type));let c=a+o;if(!(c<=n))throw Xg(i.map(e=>e.type));let l=a+s;i.push({type:t,size:o,startOffset:a,endOffset:c,payloadStartOffset:l}),a=c}return i}function r_(e,t){for(let n of e)if(n.type===t)return n;return null}function i_(e,t,n){if(!(t+4<=n))throw Xg([]);return $g(e,t)}function a_(e,t){let n=new DataView(e.buffer,e.byteOffset,e.byteLength),r=r_(n_(e,t.payloadStartOffset,t.endOffset),`mdia`);if(r===null)return{isVideoTrack:!1,sampleCount:0};let i=n_(e,r.payloadStartOffset,r.endOffset),a=r_(i,`hdlr`);if(a===null||i_(n,a.payloadStartOffset+8,a.endOffset)!==`vide`)return{isVideoTrack:!1,sampleCount:0};let o=r_(i,`minf`);if(o===null)return{isVideoTrack:!0,sampleCount:0};let s=r_(n_(e,o.payloadStartOffset,o.endOffset),`stbl`);if(s===null)return{isVideoTrack:!0,sampleCount:0};let c=r_(n_(e,s.payloadStartOffset,s.endOffset),Yg);if(c===null)return{isVideoTrack:!0,sampleCount:0};let l=c.payloadStartOffset+8;if(!(l+4<=c.endOffset))throw Xg([Yg]);return{isVideoTrack:!0,sampleCount:n.getUint32(l,!1)}}function o_(e){let t=Qg(e),n=t.byteLength,r=new DataView(t.buffer,t.byteOffset,t.byteLength),i=[],a=0;for(;a<n;){if(!(a+8<=n))throw Xg(i.map(e=>e.type));let e=r.getUint32(a,!1),t=$g(r,a+4),o=e,s=8;if(e===1){let e=a+8;if(!(e+8<=n))throw Xg(i.map(e=>e.type));o=e_(r,e),s=16}if(e===0&&(o=n-a),!(o>=s))throw Xg(i.map(e=>e.type));let c=a+o;if(!(c<=n))throw Xg(i.map(e=>e.type));i.push({type:t,size:o,startOffset:a,endOffset:c}),a=c}return i}function s_(e){let t=o_(e).filter(e=>e.type===`moof`||e.type===`mfra`).map(e=>e.type);if(t.length>0)throw Xg(t_(t))}function c_(e){let t=Qg(e),n=r_(n_(t,0,t.byteLength),`moov`);if(n===null)throw Zg(Jg);let r=n_(t,n.payloadStartOffset,n.endOffset).filter(e=>e.type===`trak`);if(r.length===0)throw Zg(Jg);let i=!1;for(let e of r){let n=a_(t,e);if(n.isVideoTrack&&(i=!0,n.sampleCount>0))return}throw Zg(i?`recording.no-video-frames`:Jg)}function l_(e){let t=null,n=0;function r(){if(!t){let n=e.createBlob();t=e.createObjectUrl(n)}return n+=1,t}function i(){n!==0&&(--n,n===0&&(t&&=(e.revokeObjectUrl(t),null)))}return{acquire:r,release:i}}let u_=`vidtreo-audio-worklet`,d_=`audioChunk`,f_=`setMuted`,p_=`setPaused`,m_=`shutdown`,h_=`
123
123
  const AUDIO_WORKLET_MESSAGE_TYPE_AUDIO_CHUNK = "${d_}";
124
124
  const AUDIO_WORKLET_MESSAGE_TYPE_SET_MUTED = "${f_}";
125
125
  const AUDIO_WORKLET_MESSAGE_TYPE_SET_PAUSED = "${p_}";
@@ -10242,8 +10242,8 @@ Mediabunny was loaded twice.\` + " This will likely cause Mediabunny not to work
10242
10242
  initializeRecorderWorker();
10243
10243
  }
10244
10244
  })();
10245
- `],{type:`application/javascript`})}let I_=l_({createBlob:F_,createObjectUrl:e=>URL.createObjectURL(e),revokeObjectUrl:e=>{URL.revokeObjectURL(e)}});function L_(){return I_.acquire()}function R_(){I_.release()}let z_=1e3,B_=`format`,V_=new Map,H_=new Map;function U_(e){return e===void 0?`undefined`:String(e)}function W_(e){return e.join(`,`)}function G_(e,t){return`${e}=${t}`}function K_(e,t,n){if(e.has(t)&&e.delete(t),e.set(t,n),e.size<=50)return;let r=e.keys().next();r.done||e.delete(r.value)}var q_=class{constructor(e={}){this.worker=null,this.hasWorkerUrlLease=!1,this.chunks=[],this.totalSize=0,this.isActive=!1,this.audioTrackClone=null,this.isMuted=!1,this.currentVideoTrack=null,this.isPaused=!1,this.overlayConfig=null,this.readyPromiseResolve=null,this.pendingFatalError=null,this.lastRecordingStats=null,this.lastEncoderAcceleration=null;let t=e=>new Worker(e,{type:`classic`});e.createWorker&&(t=e.createWorker);let n=()=>typeof MediaStreamTrackProcessor<`u`;e.canUseMainThreadVideoProcessor&&(n=e.canUseMainThreadVideoProcessor);let r=e=>typeof MediaStreamTrackProcessor>`u`?null:new MediaStreamTrackProcessor({track:e}).readable;e.createVideoStreamFromTrack&&(r=e.createVideoStreamFromTrack);let i=()=>en();e.isLinuxPlatform&&(i=e.isLinuxPlatform),this.canUseMainThreadVideoProcessorFn=n,this.createVideoStreamFromTrackFn=r,this.isLinuxPlatformFn=i;let a=!!e.createWorker;this.workerProbeManager=new P_({setTimeout:window.setTimeout.bind(window),clearTimeout:window.clearTimeout.bind(window),timeoutMilliseconds:2e3}),this.audioWorkletManager=new y_({onChunk:e=>{if(!(this.isWorkerActive()&&this.worker))return;let t={type:`audioChunk`,data:e.data,frames:e.frames,numberOfChannels:e.numberOfChannels,sampleRate:e.sampleRate,timestamp:e.timestamp},n=[];e.data.buffer instanceof ArrayBuffer&&n.push(e.data.buffer),this.worker.postMessage(t,n)}});let o=e=>{let t=e.data;switch(t.type){case`ready`:$.debug(`[WorkerProcessor] Worker ready`),this.readyPromiseResolve&&=(this.readyPromiseResolve(),null);break;case Um:this.workerProbeManager.handleProbeResult(t);break;case`debugLog`:t.payload?$.debug(t.message,t.payload):$.debug(t.message);break;case`error`:$.error(`[WorkerProcessor] Worker error:`,t.error),this.onError&&this.onError(Error(t.error));break;case`chunk`:this.chunks.push({data:t.data,position:t.position}),this.totalSize=Math.max(this.totalSize,t.position+t.data.length);break;case`bufferUpdate`:this.onBufferUpdate&&this.onBufferUpdate(t.size,t.formatted);break;case`stateChange`:$.debug(`[WorkerProcessor] State changed:`,t.state),this.isPaused=t.state===`paused`;break;case`fatalError`:this.pendingFatalError=t;break;case`recordingStats`:this.lastRecordingStats=t;break;case`encoderAcceleration`:this.lastEncoderAcceleration=t.acceleration,$.info(`[WorkerProcessor] Encoder acceleration resolved`,{acceleration:t.acceleration});break;default:$.warn(`[WorkerProcessor] Unknown response type:`,t)}},s=e=>{if($.error(`[WorkerProcessor] Worker error event:`,{message:e.message,filename:e.filename,lineno:e.lineno,colno:e.colno,error:e.error}),this.onError){let t=e.message;t||=`Unknown worker error`,this.onError(Error(t))}},c=typeof Worker<`u`,l=!1;if(c&&(l=!0),a&&(l=!0),!l)throw $.error(`[WorkerProcessor] Web Workers are not supported`),Error(`Web Workers are not supported`);let u=L_();this.hasWorkerUrlLease=!0;try{this.worker=A_({createWorker:t,workerUrl:u,onMessage:o,onError:s,logger:$})}catch(e){throw this.releaseWorkerUrlLease(),e}}getWorkerProbeResult(){let e=this.getWorkerOrThrow();return this.workerProbeManager.getProbeResult(e)}async startProcessing(e,t,n){this.getWorkerOrThrow(),this.ensureProcessingInactive(),this.resetProcessingState(n),this.stopAudioWorklet();let r=this.resolveRecordingFormat(t),i=Lt(r,{isLinuxPlatform:this.isLinuxPlatformFn()}),a=this.resolveAudioBitrate(t,r),o=await this.resolveAudioCodecWithCache(t,r,i,a),s=await this.resolveVideoCodecWithCache(t,r,i),c=Gg(e);$.debug(`[WorkerProcessor] Starting processing`,{isScreenCapture:c,fps:t.fps,codec:s,bitrate:t.bitrate});let l=this.buildWorkerTranscodeConfig(t,o,a,s,r),u=e.getVideoTracks(),d=e.getAudioTracks();$.debug(`[WorkerProcessor] Preparing to start processing`,{videoTracksCount:u.length,audioTracksCount:d.length,hasWorker:!!this.worker});let f=this.getVideoInputSelectorDependencies(),p=b_(u,f),m=x_(d,f),h=await this.getWorkerProbeResult(),g=S_(p,h,f),_=w_(f),ee=C_(p);E_(p,f),D_(f),T_(p,m,g.videoStream,f);let v=f.getViewportMetadata(),y;v&&(y={orientationAngle:v.orientationAngle,windowOrientation:v.windowOrientation});let{audioConfig:b,audioStream:x,shouldStartAudioWorklet:S}=await this.prepareAudioPipeline(m,h),te=this.buildOverlayConfigToSend(),C=j_({videoTrack:g.videoTrack,videoStream:g.videoStream,audioStream:x,isMobileDevice:_,videoSettings:ee,viewportMetadata:y,audioConfig:b,workerConfig:l,overlayConfig:te}),ne=N_(g.videoStream,x,g.videoTrack);$.debug(`[WorkerProcessor] Posting message to worker`,{transferablesCount:ne.length,messageType:C.type}),await this.postStartMessage(C,ne,S)}getWorkerOrThrow(){if(!this.worker)throw Error(`Worker not initialized`);return this.worker}ensureProcessingInactive(){if(this.isActive)throw Error(`Processing already active`)}resetProcessingState(e){this.isActive=!0,this.isMuted=!1,this.isPaused=!1,this.chunks=[],this.totalSize=0,e?this.overlayConfig=e:this.overlayConfig=null}resolveRecordingFormat(e){let t=e.format;return t||=`mp4`,t}resolveAudioBitrate(e,t){return e.audioBitrate===void 0?Vt(t):e.audioBitrate}async resolveAudioCodec(e,t,n,r){return await jm({format:t,overrideCodec:e.audioCodec,policy:n,bitrate:r})}async resolveVideoCodec(e,t,n){return await Am({format:t,overrideCodec:e.codec,policy:n,width:e.width,height:e.height,bitrate:e.bitrate})}async resolveAudioCodecWithCache(e,t,n,r){let i=this.buildAudioCodecCacheKey(e,t,n,r),a=V_.get(i);if(a)return a;let o=await this.resolveAudioCodec(e,t,n,r);return K_(V_,i,o),o}async resolveVideoCodecWithCache(e,t,n){let r=this.buildVideoCodecCacheKey(e,t,n),i=H_.get(r);if(i)return i;let a=await this.resolveVideoCodec(e,t,n);return K_(H_,r,a),a}buildAudioCodecCacheKey(e,t,n,r){let i=U_(e.audioCodec),a=U_(n.preferredAudioCodec),o=W_(n.audioCodecFallbackOrder),s=U_(r);return[G_(B_,U_(t)),G_(`audioOverride`,i),G_(`audioBitrate`,s),G_(`policyPreferredAudio`,a),G_(`policyAudioFallback`,o)].join(`|`)}buildVideoCodecCacheKey(e,t,n){let r=U_(e.codec),i=U_(e.width),a=U_(e.height),o=U_(e.bitrate),s=U_(n.preferredVideoCodec),c=W_(n.videoCodecFallbackOrder);return[G_(B_,U_(t)),G_(`videoOverride`,r),G_(`width`,i),G_(`height`,a),G_(`videoBitrate`,o),G_(`policyPreferredVideo`,s),G_(`policyVideoFallback`,c)].join(`|`)}buildWorkerTranscodeConfig(e,t,n,r,i){return{width:e.width,height:e.height,fps:e.fps,bitrate:Kg(e.bitrate),audioCodec:t,audioBitrate:n,codec:r,keyFrameInterval:5,format:i,watermark:e.watermark}}async prepareAudioPipeline(e,t){if(!e)return $.debug(`[WorkerProcessor] Audio pipeline disabled (no track)`),{audioConfig:null,audioStream:null,shouldStartAudioWorklet:!1};if(this.canUseMainThreadVideoProcessorFn()&&t.hasAudioData){let n=this.createAudioStreamFromTrack(e);if(n)return $.debug(`[WorkerProcessor] Audio pipeline selected`,{path:`main-thread-audio-stream`,hasAudioDataInWorker:t.hasAudioData}),{audioConfig:null,audioStream:n,shouldStartAudioWorklet:!1}}let n=await this.prepareAudioConfig(e);if(n)return $.debug(`[WorkerProcessor] Audio pipeline selected`,{path:`audio-worklet-chunks`,sampleRate:n.sampleRate,numberOfChannels:n.numberOfChannels}),{audioConfig:n,audioStream:null,shouldStartAudioWorklet:!0};throw this.createBrowserUnsupportedError()}buildOverlayConfigToSend(){if(this.overlayConfig)return this.overlayConfig}async postStartMessage(e,t,n){let r=this.getWorkerOrThrow(),i=new Promise(e=>{this.readyPromiseResolve=e});try{r.postMessage(e,t),$.debug(`[WorkerProcessor] Message posted successfully`),await i,$.debug(`[WorkerProcessor] Worker confirmed ready`),n&&await this.startAudioWorkletProcessing()}catch(e){throw $.error(`[WorkerProcessor] Failed to post message:`,e),this.readyPromiseResolve=null,this.stopAudioWorklet(),this.worker&&this.isActive&&this.worker.postMessage({type:`stop`}),this.isActive=!1,e}}pause(){this.worker&&this.isActive&&(this.worker.postMessage({type:`pause`}),this.setAudioWorkletPaused(!0))}resume(){this.isWorkerActive()&&this.worker&&(this.worker.postMessage({type:`resume`}),this.setAudioWorkletPaused(!1))}isWorkerActive(){return!!(this.worker&&this.isActive)}toggleMute(){this.isMuted=!this.isMuted,this.onMuteStateChange&&this.onMuteStateChange(this.isMuted),this.isWorkerActive()&&this.worker&&this.worker.postMessage({type:`toggleMute`}),this.setAudioWorkletMuted(this.isMuted)}async switchVideoSource(e){if(!(this.isWorkerActive()&&this.worker))return $.debug(`[WorkerProcessor] Cannot switch source - worker not active`,{hasWorker:!!this.worker,isActive:this.isActive}),Promise.resolve();let t=e.getVideoTracks();if($.debug(`[WorkerProcessor] Switching video source`,{videoTracksCount:t.length}),t.length===0)return $.warn(`[WorkerProcessor] No video tracks in new stream`),Promise.resolve();let n=Gg(e);$.debug(`[WorkerProcessor] Source type detected`,{isScreenCapture:n,targetFps:30}),this.worker.postMessage({type:`updateFps`,fps:30});let r={type:`updateSourceType`,isScreenCapture:n};this.worker.postMessage(r);let i=this.getVideoInputSelectorDependencies(),a=b_(t,i);if(!a)return $.warn(`[WorkerProcessor] Unable to prepare video track`),Promise.resolve();$.debug(`[WorkerProcessor] New video track details`,{trackId:a.id,trackKind:a.kind,trackReadyState:a.readyState});let o=S_(a,await this.getWorkerProbeResult(),i),s=M_(o.videoTrack,o.videoStream),c=N_(o.videoStream,null,o.videoTrack);try{return $.debug(`[WorkerProcessor] Posting switch source message`),this.worker.postMessage(s,c),$.debug(`[WorkerProcessor] Switch source message posted`),new Promise(e=>{setTimeout(()=>{e()},0)})}catch(e){throw $.error(`[WorkerProcessor] Failed to switch source:`,e),e}}finalize(){if(!this.isWorkerActive())throw Error(`Processing not active`);let e=performance.now();return new Promise((t,n)=>{let r=this.worker;if(!r){n(Error(`Worker not initialized`));return}let i=null,a=()=>{i!==null&&(clearTimeout(i),i=null)},o=()=>{r.removeEventListener(`message`,l)},s=!1,c=()=>s?!1:(s=!0,a(),o(),!0),l=r=>{if(s)return;let i=r.data;if(i.type===`fatalError`){this.pendingFatalError=i;return}if(i.type===`recordingStats`){this.lastRecordingStats=i;return}if(i.type===`stateChange`&&i.state===`stopped`){this.handleFinalizeStopped(c,t,n,e);return}i.type===`error`&&this.handleFinalizeError(c,n,i.error,e)};i=setTimeout(()=>{c()&&($.error(`[WorkerProcessor] Finalize timeout reached`,{elapsedSeconds:(performance.now()-e)/z_}),this.resetFinalizeRuntimeState(),n(Error(`Finalize timeout`)))},3e4),r.addEventListener(`message`,l),r.postMessage({type:`stop`})})}handleFinalizeStopped(e,t,n,r){let i=this.lastRecordingStats,a=this.lastEncoderAcceleration;if(this.pendingFatalError!==null){let t=this.pendingFatalError;if(!e())return;this.resetFinalizeRuntimeState(),n(Error(this.buildFatalFinalizeErrorMessage(t,i)));return}e()&&(this.resetFinalizeRuntimeState(),Promise.resolve().then(()=>this.createBlobFromChunks(i,a)).then(e=>{t(e)},e=>{this.rejectFinalizeBlobCreationError(n,e,r)}))}handleFinalizeError(e,t,n,r){e()&&(this.resetFinalizeRuntimeState(),$.error(`[WorkerProcessor] Finalize failed`,{elapsedSeconds:(performance.now()-r)/z_,error:n}),t(Error(n)))}buildFatalFinalizeErrorMessage(e,t){return t===null?`${e.message} [${e.code}]`:`${e.message} [${e.code}] frames=${t.videoFrameCount} errors=${t.totalFrameErrors}`}resetFinalizeRuntimeState(){this.isActive=!1,this.stopAudioWorklet(),this.pendingFatalError=null,this.lastRecordingStats=null,this.lastEncoderAcceleration=null}createBlobFromChunks(e,t){let n=[...this.chunks].sort((e,t)=>e.position-t.position),r=new ArrayBuffer(this.totalSize),i=new Uint8Array(r);for(let e of n)i.set(e.data,e.position);s_(r),c_(r);let a={blob:new Blob([r],{type:`video/mp4`}),totalSize:this.totalSize};return e!==null&&(a.recordingStats={totalFrameErrors:e.totalFrameErrors,totalFramesProcessed:e.totalFramesProcessed,videoFrameCount:e.videoFrameCount}),t!==null&&(a.encoderAcceleration=t),a}rejectFinalizeBlobCreationError(e,t,n){if($.error(`[WorkerProcessor] Finalize failed while creating blob`,{elapsedSeconds:(performance.now()-n)/z_,error:i(t)}),t instanceof Error){e(t);return}e(Error(i(t)))}cancel(){return this.worker&&this.isActive&&this.worker.postMessage({type:`stop`}),this.stopAudioWorklet(),this.isActive=!1,this.isPaused=!1,this.chunks=[],this.totalSize=0,Promise.resolve()}getBufferSize(){return this.totalSize}getMutedState(){return this.isMuted}updateTabVisibility(e,t){if(!(this.isWorkerActive()&&this.worker)){$.warn(`[WorkerProcessor] Cannot update visibility - worker not active`,{isActive:this.isActive,hasWorker:!!this.worker});return}$.debug(`[WorkerProcessor] Sending visibility update to worker`,{isHidden:e,timestamp:t,timestampSeconds:t/z_});let n={type:`updateVisibility`,isHidden:e,timestamp:t};this.worker.postMessage(n)}updateSourceType(e){if(!(this.isWorkerActive()&&this.worker)){$.warn(`[WorkerProcessor] Cannot update source type - worker not active`,{isActive:this.isActive,hasWorker:!!this.worker});return}$.debug(`[WorkerProcessor] Sending source type update to worker`,{isScreenCapture:e});let t={type:`updateSourceType`,isScreenCapture:e};this.worker.postMessage(t)}async startAudioWorkletProcessing(){await this.audioWorkletManager.startProcessing()}stopAudioWorklet(){this.audioWorkletManager.stop()}setAudioWorkletMuted(e){this.audioWorkletManager.setMuted(e)}setAudioWorkletPaused(e){this.audioWorkletManager.setPaused(e)}prepareAudioConfig(e){return this.audioWorkletManager.prepareAudioConfig(e)}createAudioStreamFromTrack(e){return!e||typeof MediaStreamTrackProcessor>`u`?null:new MediaStreamTrackProcessor({track:e}).readable}createBrowserUnsupportedError(){return kt({resolutionStage:`feature-preflight`})}getVideoInputSelectorDependencies(){return{stopCurrentVideoTrack:()=>this.stopCurrentVideoTrack(),cloneVideoTrack:e=>this.cloneVideoTrack(e),cloneAudioTrack:e=>this.cloneAudioTrack(e),setCurrentVideoTrack:e=>{this.currentVideoTrack=e},canUseMainThreadVideoProcessor:()=>this.canUseMainThreadVideoProcessorFn(),createVideoStreamFromTrack:e=>this.createVideoStreamFromTrackFn(e),createBrowserUnsupportedError:()=>this.createBrowserUnsupportedError(),getViewportMetadata:()=>{if(typeof window>`u`)return null;let e=window.screen,t,n,r,i;return e&&(i=e.orientation),i?.type&&(t=i.type),i&&typeof i.angle==`number`&&(n=i.angle),typeof window.orientation==`number`&&(r=window.orientation),{innerWidth:window.innerWidth,innerHeight:window.innerHeight,orientation:t,orientationAngle:n,windowOrientation:r}},logger:{debug:(e,t)=>$.debug(e,t),warn:(e,t)=>$.warn(e,t)},isMobileDevice:()=>qt()}}isPausedState(){return this.isPaused}getClonedAudioTrack(){return this.audioTrackClone}getAudioStreamForAnalysis(){return this.audioTrackClone?new MediaStream([this.audioTrackClone]):null}setOnBufferUpdate(e){this.onBufferUpdate=e}setOnError(e){this.onError=e}setOnMuteStateChange(e){this.onMuteStateChange=e}cloneVideoTrack(e){if($.debug(`[WorkerProcessor] Original video track:`,{id:e.id,kind:e.kind,readyState:e.readyState,hasClone:typeof e.clone==`function`}),typeof e.clone==`function`)try{let t=e.clone();return $.debug(`[WorkerProcessor] Video track cloned successfully:`,{id:t.id,kind:t.kind,readyState:t.readyState}),t}catch(e){$.error(`[WorkerProcessor] Failed to clone video track:`,e);let t=i(e);throw Error(`Failed to clone video track: ${t}`)}return $.warn(`[WorkerProcessor] Video track clone() not available, using original`),e}cloneAudioTrack(e){if($.debug(`[WorkerProcessor] Original audio track:`,{id:e.id,kind:e.kind,readyState:e.readyState,hasClone:typeof e.clone==`function`}),typeof e.clone==`function`)try{let t=e.clone();return this.audioTrackClone=t,$.debug(`[WorkerProcessor] Audio track cloned successfully:`,{id:t.id,kind:t.kind,readyState:t.readyState}),t}catch(e){$.error(`[WorkerProcessor] Failed to clone audio track:`,e);let t=i(e);throw Error(`Failed to clone audio track: ${t}`)}return $.warn(`[WorkerProcessor] Audio track clone() not available, using original`),this.audioTrackClone=e,e}stopCurrentVideoTrack(){this.currentVideoTrack&&this.currentVideoTrack.readyState===`live`&&this.currentVideoTrack.stop(),this.currentVideoTrack=null}cleanup(){this.worker&&=(this.worker.terminate(),null),this.releaseWorkerUrlLease(),this.stopAudioWorklet(),this.isActive=!1,this.isPaused=!1,this.chunks=[],this.totalSize=0}releaseWorkerUrlLease(){this.hasWorkerUrlLease&&=(R_(),!1)}},J_=class{constructor(e={}){this.currentVideoStream=null;let t=()=>new q_;e.workerProcessorFactory&&(t=e.workerProcessorFactory);try{this.workerProcessor=t(),$.debug(`[StreamProcessor] Using worker-based processing`)}catch(e){let t=i(e);throw Error(`Failed to initialize worker: ${t}`)}}async startProcessing(e,t,n){this.workerProcessor.setOnBufferUpdate((e,t)=>{$.debug(`[StreamProcessor] Buffer update:`,{size:e,formatted:t}),this.onBufferUpdate&&this.onBufferUpdate(e,t)}),this.workerProcessor.setOnError(e=>{$.error(`[StreamProcessor] Worker error:`,e),this.onError&&this.onError(e)}),this.currentVideoStream=e,await this.workerProcessor.startProcessing(e,t,n)}updateTabVisibility(e,t){this.workerProcessor.updateTabVisibility(e,t)}updateSourceType(e){this.workerProcessor.updateSourceType(e)}pause(){this.workerProcessor.pause()}resume(){this.workerProcessor.resume()}isPausedState(){return this.workerProcessor.isPausedState()}async finalize(){return $.debug(`[StreamProcessor] finalize called`),await this.workerProcessor.finalize()}toggleMute(){this.workerProcessor.toggleMute()}isMutedState(){return this.workerProcessor.getMutedState()}getClonedAudioTrack(){return this.workerProcessor.getClonedAudioTrack()}getAudioStreamForAnalysis(){return this.workerProcessor.getAudioStreamForAnalysis()}async switchVideoSource(e){await this.workerProcessor.switchVideoSource(e),this.currentVideoStream=e,this.onSourceChange&&this.onSourceChange(e)}getCurrentVideoSource(){return this.currentVideoStream}getBufferSize(){return this.workerProcessor.getBufferSize()}setOnMuteStateChange(e){this.workerProcessor.setOnMuteStateChange(e)}setOnSourceChange(e){this.onSourceChange=e}setOnBufferUpdate(e){this.onBufferUpdate=e}setOnError(e){this.onError=e}async cancel(){await this.workerProcessor.cancel(),this.workerProcessor.cleanup(),this.currentVideoStream=null}};let Y_=1e3,X_=`recording`,Z_=`idle`;var Q_=class{constructor(e,t){this.recordingState=Z_,this.countdownDuration=5e3,this.countdownRemaining=0,this.countdownTimeoutId=null,this.countdownIntervalId=null,this.countdownStartTime=null,this.isPaused=!1,this.maxRecordingTime=null,this.maxTimeTimer=null,this.recordingStartTime=null,this.maxTimeRemaining=null,this.recordingSeconds=0,this.recordingIntervalId=null,this.pauseStartTime=null,this.totalPausedTime=0,this.streamProcessor=null,this.originalCameraStream=null,this.enableTabVisibilityOverlay=!1,this.streamManager=e,this.callbacks=t}setCountdownDuration(e){this.countdownDuration=e}setMaxRecordingTime(e){this.maxRecordingTime=e}setTabVisibilityOverlayConfig(e,t){this.enableTabVisibilityOverlay=e,this.tabVisibilityOverlayText=t}getRecordingState(){return this.recordingState}isPausedState(){return this.isPaused}getRecordingSeconds(){return this.recordingSeconds}getStreamProcessor(){return this.streamProcessor}updateSourceType(e){this.recordingState!==X_||!this.streamProcessor||this.streamProcessor.updateSourceType(e)}setOriginalCameraStream(e){this.originalCameraStream=e}getOriginalCameraStream(){return this.originalCameraStream}prewarmStreamProcessor(){this.getOrCreateStreamProcessor()}async startRecording(){try{this.callbacks.onClearUploadStatus(),this.countdownDuration>0?this.startCountdown():await this.doStartRecording()}catch(e){this.handleError(e),this.recordingState=Z_,this.cancelCountdown()}}startCountdown(){this.recordingState=`countdown`,this.countdownRemaining=Math.ceil(this.countdownDuration/Y_),this.countdownStartTime=Date.now(),this.callbacks.onCountdownUpdate(this.recordingState,this.countdownRemaining),this.countdownIntervalId=window.setInterval(()=>{if(!this.countdownStartTime)return;let e=Date.now()-this.countdownStartTime;this.countdownRemaining=Math.max(0,Math.ceil((this.countdownDuration-e)/Y_)),this.callbacks.onCountdownUpdate(this.recordingState,this.countdownRemaining)},100),this.countdownTimeoutId=window.setTimeout(async()=>{await this.doStartRecording().catch(()=>{})},this.countdownDuration)}async doStartRecording(){$.debug(`[RecordingManager] doStartRecording called`),this.cancelCountdown(),this.resetRecordingState();let e=this.streamManager.getStream();if($.debug(`[RecordingManager] Current stream:`,{hasStream:!!e,audioTracks:e?.getAudioTracks().length||0,videoTracks:e?.getVideoTracks().length||0}),!e){$.warn(`[RecordingManager] No stream available`),this.handleError(Error(`No stream available for recording`)),this.recordingState=Z_,this.callbacks.onStateChange(this.recordingState);return}this.originalCameraStream=e,$.debug(`[RecordingManager] Ensuring stream processor`);let t=this.getOrCreateStreamProcessor();$.debug(`[RecordingManager] StreamProcessor ready:`,!!t);let n=null,r=await this.callbacks.onGetConfig().then(e=>(n=e,null)).catch(e=>e);if(r){this.handleError(r),this.recordingState=Z_,this.callbacks.onStateChange(this.recordingState);return}if(!n){this.handleError(Error(`Failed to get recording config`)),this.recordingState=Z_,this.callbacks.onStateChange(this.recordingState);return}$.debug(`[RecordingManager] Starting recording with stream manager`);let i=await this.streamManager.startRecording(t,n,this.enableTabVisibilityOverlay,this.tabVisibilityOverlayText).then(()=>($.info(`[RecordingManager] Recording started successfully`),null)).catch(e=>($.error(`[RecordingManager] Error starting recording:`,e),e));if(i){this.handleError(i),this.recordingState=Z_,this.callbacks.onStateChange(this.recordingState);return}this.recordingState=X_,this.callbacks.onStateChange(this.recordingState),this.startRecordingTimer(),this.recordingStartTime=Date.now(),this.maxRecordingTime&&this.maxRecordingTime>0&&(this.maxTimeRemaining=this.maxRecordingTime,this.startMaxTimeTimer())}async stopRecording(){$.debug(`[RecordingManager] stopRecording called`);try{this.cancelCountdown(),this.clearTimer(this.recordingIntervalId,clearInterval),this.recordingIntervalId=null,this.clearTimer(this.maxTimeTimer,clearTimeout),this.maxTimeTimer=null,this.resetPauseState(),this.callbacks.onStopAudioTracking(),$.debug(`[RecordingManager] Stopping recording in stream manager`);let e=await this.streamManager.stopRecording(),t=e.blob;$.info(`[RecordingManager] Recording stopped, blob size:`,t.size),this.recordingState=Z_,this.callbacks.onStateChange(this.recordingState),this.recordingSeconds=0,this.streamProcessor=null,this.callbacks.onRecordingComplete(t);let n={};return e.recordingStats!==void 0&&(n.videoFrameCount=e.recordingStats.videoFrameCount,n.totalFrameErrors=e.recordingStats.totalFrameErrors,n.totalFramesProcessed=e.recordingStats.totalFramesProcessed),e.encoderAcceleration!==void 0&&(n.encoderAcceleration=e.encoderAcceleration),{blob:t,telemetryProperties:n}}catch(e){throw this.handleError(e),this.recordingState=Z_,this.callbacks.onStateChange(this.recordingState),e}}pauseRecording(){if(!(this.recordingState!==X_||this.isPaused)&&(this.streamManager.pauseRecording(),this.isPaused=!0,this.clearTimer(this.recordingIntervalId,clearInterval),this.recordingIntervalId=null,this.pauseStartTime=Date.now(),this.maxTimeTimer!==null&&this.recordingStartTime!==null&&this.maxRecordingTime!==null)){let e=Date.now()-this.recordingStartTime-this.totalPausedTime;this.maxTimeRemaining=Math.max(0,this.maxRecordingTime-e),this.clearTimer(this.maxTimeTimer,clearTimeout),this.maxTimeTimer=null}}resumeRecording(){this.recordingState!==X_||!this.isPaused||(this.streamManager.resumeRecording(),this.isPaused=!1,this.updatePausedDuration(),this.startRecordingTimer(),this.maxTimeRemaining!==null&&this.maxTimeRemaining>0&&this.startMaxTimeTimer())}cancelCountdown(){this.clearTimer(this.countdownTimeoutId,clearTimeout),this.countdownTimeoutId=null,this.clearTimer(this.countdownIntervalId,clearInterval),this.countdownIntervalId=null,this.recordingState=Z_,this.countdownRemaining=0,this.countdownStartTime=null,this.callbacks.onCountdownUpdate(this.recordingState,this.countdownRemaining)}cleanup(){this.cancelCountdown(),this.clearTimer(this.recordingIntervalId,clearInterval),this.recordingIntervalId=null,this.clearTimer(this.maxTimeTimer,clearTimeout),this.maxTimeTimer=null,this.streamProcessor&&=(this.streamProcessor.cancel().catch(()=>void 0),null)}resetRecordingState(){this.isPaused=!1,this.recordingSeconds=0,this.totalPausedTime=0,this.pauseStartTime=null,this.recordingStartTime=null,this.maxTimeRemaining=null}resetPauseState(){this.isPaused=!1,this.pauseStartTime=null,this.totalPausedTime=0}getOrCreateStreamProcessor(){if(this.streamProcessor)return this.streamProcessor;let e=new J_;return this.streamProcessor=e,e}updatePausedDuration(){if(this.pauseStartTime===null)throw Error(`Pause start time not set`);let e=Date.now()-this.pauseStartTime;this.totalPausedTime+=e,this.pauseStartTime=null}startRecordingTimer(){if(this.recordingIntervalId!==null)return;let e=lg(this.recordingSeconds);this.callbacks.onTimerUpdate(e),this.recordingIntervalId=window.setInterval(()=>{this.recordingSeconds+=1;let e=lg(this.recordingSeconds);this.callbacks.onTimerUpdate(e)},1e3)}startMaxTimeTimer(){this.maxTimeRemaining===null||this.maxTimeRemaining<=0||(this.clearTimer(this.maxTimeTimer,clearTimeout),this.maxTimeTimer=window.setTimeout(async()=>{this.recordingState===X_&&!this.isPaused&&await this.stopRecording()},this.maxTimeRemaining))}clearTimer(e,t){e!==null&&t(e)}handleError(e){let t=e instanceof Error?e:Error(i(e));this.callbacks.onError(t)}},$_=class{constructor(e){this.client=null,this.createTelemetryClient=e.createTelemetryClient}initialize(e,t){typeof e==`string`&&e.length>0&&typeof t==`string`&&t.length>0&&(this.client=this.createTelemetryClient(e,t))}sendEvent(e,t,n){if(!this.client)return;let r={name:e};t&&(r={...r,properties:t}),n&&(r={...r,error:n}),this.client.triggerTelemetryEvent(r)}async executeAction(e){e.requestedEvent&&this.sendEvent(e.requestedEvent,e.properties);let t=null;if(await e.action().catch(e=>{t=e}),t)throw this.sendEvent(e.failedEvent,e.properties,t),t;this.sendEvent(e.succeededEvent,e.properties)}async executeActionWithResult(e){e.requestedEvent&&this.sendEvent(e.requestedEvent,e.properties);let t=null,n=null;if(await e.action().then(e=>{n=e}).catch(e=>{t=e}),t)throw this.sendEvent(e.failedEvent,e.properties,t),t;if(n===null)throw Error(`Telemetry action failed to return result`);let r=this.resolveResultTelemetryProperties(n,e.getPropertiesFromResult),i=this.mergeTelemetryProperties(e.properties,r);return this.sendEvent(e.succeededEvent,i),n}resolveResultTelemetryProperties(e,t){if(t!==void 0)return t(e)}mergeTelemetryProperties(e,t){if(!(e===void 0&&t===void 0))return e===void 0?t:t===void 0?e:{...e,...t}}},ev=class{constructor(){this.metadataById=new Map}getMetadata(e){return this.metadataById.get(e)}setMetadata(e,t){let n=new Map(this.metadataById);n.set(e,t),this.metadataById=n}clearMetadata(e){let t=new Map(this.metadataById);t.delete(e),this.metadataById=t}};let tv=`[RecorderController]`;var nv=class{constructor(e={}){this.uploadService=null,this.uploadQueueManager=null,this.isInitialized=!1,this.isDemo=!1,this.isDestroyed=!1,this.enableTabVisibilityOverlay=!1,this.recordingWarmupTimeoutId=null,this.callbacks=e,this.streamManager=new gg,this.configManager=new on,this.storageManager=new xh,this.deviceManager=new sn(this.streamManager,e.device),this.audioLevelAnalyzer=new o,this.uploadService=new kg,this.uploadCallbacks=Vg(e),this.telemetryManager=new $_({createTelemetryClient:Dg}),this.uploadMetadataManager=new ev;let t=Ug(e,{stopAudioTracking:()=>this.audioLevelAnalyzer.stopTracking(),getConfig:()=>Promise.resolve(this.configManager.getConfigForRecording())});this.recordingManager=new Q_(this.streamManager,t);let n=Wg(e,{isRecording:()=>this.isRecording(),updateSourceType:e=>{this.recordingManager.updateSourceType(e)},getSelectedCameraDeviceId:()=>this.deviceManager.getSelectedCameraDeviceId(),getSelectedMicDeviceId:()=>this.deviceManager.getSelectedMicDeviceId()});this.sourceSwitchManager=new $h(this.streamManager,n);let r=e.stream;r&&(this.streamManager.on(`streamstart`,({stream:e})=>{$.debug(`${tv} streamstart event received, calling callback`),r.onStreamStart&&r.onStreamStart(e)}),this.streamManager.on(`streamstop`,()=>{$.debug(`${tv} streamstop event received, calling callback`),r.onStreamStop&&r.onStreamStop()}),this.streamManager.on(`error`,({error:e})=>{$.error(`${tv} stream error event received, calling callback`,e),this.telemetryManager.sendEvent(`stream.error`,{sourceType:this.getCurrentSourceType()},e),r.onError&&r.onError(e)}))}async initialize(e){if(this.isInitialized)return;await this.validateRecorderSupport();let t=!1;typeof e.demo==`boolean`&&(t=e.demo),this.isDemo=t;let n=null;typeof e.apiKey==`string`&&e.apiKey.length>0&&(n=e.apiKey);let r=null;typeof e.backendUrl==`string`&&e.backendUrl.length>0&&(r=e.backendUrl),this.telemetryManager.initialize(n,r),await this.telemetryManager.executeAction({requestedEvent:`sdk.init.started`,succeededEvent:`sdk.init.succeeded`,failedEvent:`sdk.init.failed`,action:async()=>{await this.initializeConfig(n,r),this.applyRecordingConfig(e),await this.initializeStorage(),this.isInitialized=!0,this.scheduleRecordingWarmup()}})}async startStream(){let e=this.getCurrentSourceType();await this.telemetryManager.executeAction({succeededEvent:`preview.start.succeeded`,failedEvent:`preview.start.failed`,action:async()=>{$.debug(`${tv} startStream called`),await this.streamManager.startStream(),this.ignorePromiseRejection(this.ensureConfigReady()),this.recordingManager.prewarmStreamProcessor(),$.debug(`${tv} startStream completed`)},properties:{sourceType:e}})}async stopStream(){await this.streamManager.stopStream()}switchVideoDevice(e){return this.streamManager.switchVideoDevice(e)}switchAudioDevice(e){return this.streamManager.switchAudioDevice(e)}async startRecording(){let e=this.getCurrentSourceType();await this.telemetryManager.executeAction({requestedEvent:`recording.start.requested`,succeededEvent:`recording.start.succeeded`,failedEvent:`recording.start.failed`,action:async()=>{await this.ensureConfigReady(),await this.recordingManager.startRecording()},properties:{sourceType:e}})}async stopRecording(){let e=this.getCurrentSourceType();return(await this.telemetryManager.executeActionWithResult({requestedEvent:`recording.stop.requested`,succeededEvent:`recording.stop.succeeded`,failedEvent:`recording.stop.failed`,action:async()=>{let e=await this.recordingManager.stopRecording();return await this.sourceSwitchManager.handleRecordingStop().catch(()=>{throw Error(`Source switch cleanup failed`)}),this.streamManager.stopStream(),e},properties:{sourceType:e},getPropertiesFromResult:e=>e.telemetryProperties})).blob}getTabVisibilityOverlayConfig(){return{enabled:this.enableTabVisibilityOverlay,text:this.tabVisibilityOverlayText}}pauseRecording(){this.recordingManager.pauseRecording()}resumeRecording(){this.recordingManager.resumeRecording()}async switchSource(e){await this.telemetryManager.executeAction({requestedEvent:`source.switch.requested`,succeededEvent:`source.switch.succeeded`,failedEvent:`source.switch.failed`,action:async()=>{await this.sourceSwitchManager.toggleSource()},properties:{sourceType:e}})}setCameraDevice(e){this.deviceManager.setCameraDevice(e)}setMicDevice(e){this.deviceManager.setMicDevice(e)}getAvailableDevices(){return this.deviceManager.getAvailableDevices()}muteAudio(){this.streamManager.muteAudio()}unmuteAudio(){this.streamManager.unmuteAudio()}toggleMute(){this.streamManager.toggleMute()}getIsMuted(){return this.streamManager.isMuted()}startAudioLevelTracking(e,t){if(!t)throw Error(`Audio level callbacks are required`);return this.audioLevelAnalyzer.startTracking(e,t,()=>this.streamManager.isMuted()),Promise.resolve()}stopAudioLevelTracking(){this.audioLevelAnalyzer.stopTracking()}getAudioLevel(){return this.audioLevelAnalyzer.getAudioLevel()}async uploadVideo(e,t,n,r){if(!this.uploadQueueManager)throw Error(`Upload queue manager not initialized`);this.uploadCallbacks.onClearStatus();let i=await bm(e),a=`recording-${Date.now()}.mp4`,o=this.getCurrentSourceType(),s;Object.keys(r).length>0&&(s=r),this.telemetryManager.sendEvent(`upload.started`,{filename:a,duration:i,sourceType:o});let c=await this.uploadQueueManager.queueUpload({blob:e,apiKey:t,backendUrl:n,filename:a,duration:i,metadata:void 0,userMetadata:s});this.uploadMetadataManager.setMetadata(c,{filename:a,duration:i,sourceType:o})}getStream(){return this.streamManager.getStream()}isConfigReady(){return this.configManager.isConfigReady()}ensureConfigReady(){return this.isDemo||this.configManager.isConfigReady()?Promise.resolve():this.configManager.fetchConfig().then(()=>void 0).catch(()=>void 0)}cleanup(){this.isDestroyed=!0,this.recordingWarmupTimeoutId!==null&&(clearTimeout(this.recordingWarmupTimeoutId),this.recordingWarmupTimeoutId=null),this.storageManager.destroy(),this.recordingManager.cleanup(),this.audioLevelAnalyzer.stopTracking(),this.sourceSwitchManager.cleanup()}getRecordingState(){return this.recordingManager.getRecordingState()}isPaused(){return this.recordingManager.isPausedState()}getCurrentSourceType(){return this.sourceSwitchManager.getCurrentSourceType()}getOriginalCameraStream(){return this.sourceSwitchManager.getOriginalCameraStream()}getStreamManager(){return this.streamManager}getAudioStreamForAnalysis(){return this.streamManager.getAudioStreamForAnalysis()}getDeviceManager(){return this.deviceManager}getConfig(){return this.configManager.getConfig()}getUploadService(){return this.uploadService}isRecording(){return this.streamManager.isRecording()}isActive(){return this.streamManager.isActive()}async initializeConfig(e,t){let n=!0;e===null&&(n=!1),t===null&&(n=!1),n&&e!==null&&t!==null&&await this.configManager.initialize(e,t)}applyRecordingConfig(e){e.countdownDuration!==void 0&&this.recordingManager.setCountdownDuration(e.countdownDuration),e.maxRecordingTime!==void 0&&this.recordingManager.setMaxRecordingTime(e.maxRecordingTime),e.enableTabVisibilityOverlay!==void 0&&(this.enableTabVisibilityOverlay=e.enableTabVisibilityOverlay),e.tabVisibilityOverlayText!==void 0&&(this.tabVisibilityOverlayText=e.tabVisibilityOverlayText),this.recordingManager.setTabVisibilityOverlayConfig(this.enableTabVisibilityOverlay,this.tabVisibilityOverlayText)}async initializeStorage(){let e=Hg(this.callbacks);await this.storageManager.initialize(e);let t=this.storageManager.getStorageService();t&&this.uploadService&&(this.uploadQueueManager=new Og(t,this.uploadService),this.uploadQueueManager.setCallbacks({onUploadProgress:(e,t)=>{this.uploadCallbacks.onProgress(t)},onUploadComplete:(e,t)=>{this.uploadCallbacks.onSuccess(t);let n=this.uploadMetadataManager.getMetadata(e);n&&(this.telemetryManager.sendEvent(`upload.succeeded`,{filename:n.filename,duration:n.duration,sourceType:n.sourceType,recordingId:t.id}),this.uploadMetadataManager.clearMetadata(e))},onUploadError:(e,t)=>{this.uploadCallbacks.onError(t);let n=this.uploadMetadataManager.getMetadata(e);n&&(this.telemetryManager.sendEvent(`upload.failed`,{filename:n.filename,duration:n.duration,sourceType:n.sourceType},t),this.uploadMetadataManager.clearMetadata(e))}}))}async validateRecorderSupport(){At();let e=await dh({requiresAudio:!1,requiresWatermark:!1});if(!e.isSupported)throw kt({missingCapabilities:e.missing,resolutionStage:`feature-preflight`})}scheduleRecordingWarmup(){this.recordingWarmupTimeoutId!==null&&(clearTimeout(this.recordingWarmupTimeoutId),this.recordingWarmupTimeoutId=null),!this.isDestroyed&&(this.recordingWarmupTimeoutId=setTimeout(()=>{this.recordingWarmupTimeoutId=null,!this.isDestroyed&&(this.ignorePromiseRejection(this.ensureConfigReady()),this.ignorePromiseRejection(Promise.resolve().then(()=>{this.recordingManager.prewarmStreamProcessor()})))},0))}ignorePromiseRejection(e){e.catch(()=>void 0)}};let rv=/<a\s+href="(?<href>[^"]+)"(?:\s+target="(?<target>[^"]+)")?\s*>(?<text>[^<]+)<\/a>/,iv=/^[a-zA-Z][a-zA-Z\d+\-.]*:/,av=`{version}`;function ov(e,t){return e?e.toLowerCase().includes(t):!1}function sv(e){let t=e.trim();if(!t)return null;let n=t.toLowerCase();return!iv.test(n)||n.startsWith(`http:`)||n.startsWith(`https:`)?t:null}function cv(e,t,n,r){return e===`browser.unsupported`?r.browserUnsupportedDynamic?uv(r.browserUnsupportedDynamic,t,n):ov(t,`safari`)?r.browserUnsupportedSafari:ov(t,`firefox`)?r.browserUnsupportedFirefox:r.browserUnsupported:r.browserUnsupported}function lv(e,t){return e===`camera.in-use`?t.cameraInUse:e===`camera.not-found`?t.cameraNotFound:e===`camera.permission-denied`?t.cameraPermissionDenied:t.failedToStartCamera}function uv(e,t,n){let r=`This browser`;t&&t.trim().length>0&&(r=t);let i=e.replace(`{browser}`,r);return n&&n.trim().length>0&&n?(i=i.replace(av,n),i):(i=i.replace(` ({version})`,``),i=i.replace(av,``),i)}function dv(e){let t=rv.exec(e);if(!t?.groups)return{prefix:e,linkText:null,linkHref:null,linkTarget:null,suffix:``};let n=t.index,r=n+t[0].length,i=e.slice(0,n),a=e.slice(r),o=sv(t.groups.href);if(!o)return{prefix:i+t.groups.text+a,linkText:null,linkHref:null,linkTarget:null,suffix:``};let s=null;return t.groups.target&&(s=t.groups.target),{prefix:i,linkText:t.groups.text,linkHref:o,linkTarget:s,suffix:a}}function fv(){let e=Ot(),t=null;e.name.length>0&&(t=e.name);let n=null;return e.version.length>0&&(n=e.version),{browserName:t,browserVersion:n}}function pv(e){let t=t=>{if(!(`code`in t))return;let n=t;if(n.code!==`browser.unsupported`){n.code?.startsWith(`camera.`)&&e.updateState({errorCode:n.code,canRetry:!0,browserName:null,browserVersion:null});return}let r=fv(),i=r.browserName;n.browserName&&n.browserName.length>0&&(i=n.browserName);let a=r.browserVersion;n.browserVersion&&n.browserVersion.length>0&&(a=n.browserVersion),e.updateState({errorCode:`browser.unsupported`,canRetry:!1,browserName:i,browserVersion:a})};return{recording:{onStateChange:t=>{e.updateState({recordingState:t}),t===`idle`&&(e.isProcessingBlob=!1)},onCountdownUpdate:(t,n)=>{e.updateState({recordingState:t,countdown:n})},onTimerUpdate:t=>{e.updateState({timer:t})},onError:n=>{t(n),e.updateState({error:i(n)})},onRecordingComplete:t=>{e.updateState({countdown:null}),e.processRecordingBlob(t).catch(t=>{e.updateState({error:i(t)})})},onClearUploadStatus:()=>{e.updateState({uploadProgress:null})},onStopAudioTracking:()=>{},onGetConfig:()=>{if(!e.controller)throw Error(`Controller not initialized`);return e.isDemo?Promise.resolve(Kt(`mp4`)):e.controller.getConfig()}},sourceSwitch:{onSourceChange:e=>Promise.resolve(),onPreviewUpdate:t=>(e.updateState({stream:t}),Promise.resolve()),onError:n=>{t(n),e.updateState({error:i(n)})},onTransitionStart:t=>{e.updateState({transitionMessage:t})},onTransitionEnd:()=>{e.updateState({transitionMessage:null})}},storage:{onUploadProgress:()=>{},onUploadComplete:()=>{},onUploadError:()=>{}},onStorageCleanupError:t=>{e.updateState({error:t})}}}function mv(e,t){let n=(e=>e===``||e===`default`?null:e)(t);return e.setCameraDevice(n),e.switchVideoDevice(n)}function hv(e,t){let n=(e=>e===``||e===`default`?null:e)(t);return e.setMicDevice(n),e.switchAudioDevice(n)}async function gv(e,t=`camera`){e.isActive()||await e.startStream(),t!==e.getCurrentSourceType()&&await e.switchSource(t),await e.startRecording()}async function _v(e,t,n,r){return await e.stopRecording()}function vv(e){e.pauseRecording()}function yv(e){e.resumeRecording()}async function bv(e,t){await e.switchSource(t)}let xv=`camera`,Sv=`screen`,Cv=`recording`,wv=`browser.unsupported`,Tv=[.8,1.2,.9];function Ev(e,t){let{uploadProgress:n,uploadingLabel:r}=e,{overlay:i,fill:a,text:o}=t;if(!i)return;if(n===null){i.style.display=`none`;return}i.style.display=`block`;let s=Math.round(n*100);a&&(a.style.width=`${s}%`),o&&(o.textContent=`${r} ${s}%`)}function Dv(e,t){let{transitionMessage:n}=e,{overlay:r,message:i}=t;if(r){if(!n){r.classList.remove(`vidtreo-active`);return}r.classList.add(`vidtreo-active`),i&&(i.textContent=n)}}function Ov(e,t){e.textContent=``;let n=document.createTextNode(t.prefix);if(e.append(n),t.linkText&&t.linkHref){let n=document.createElement(`a`),r=t.linkTarget;n.href=t.linkHref,r&&(n.target=r),r===`_blank`&&(n.rel=`noopener noreferrer`),n.textContent=t.linkText,e.append(n)}let r=document.createTextNode(t.suffix);e.append(r)}function kv(e){let{stream:t,transitionMessage:n,isVideoLoaded:r}=e;return{showPreviewSkeleton:!!t&&!r&&!n,showVideoPreview:!!t}}function Av(e,t){let{previewSkeleton:n,videoPreview:r}=t;n&&(e.showPreviewSkeleton?n.style.display=`block`:n.style.display=`none`),r&&(e.showVideoPreview?r.style.display=`block`:r.style.display=`none`)}function jv(e,t,n){let{videoPreview:r}=t,{onVideoLoaded:a,onError:o,startAudioAnalysis:s,stopAudioAnalysis:c}=n;if(r){if(!e){r.srcObject=null,c();return}r.srcObject=e,r.onloadeddata=()=>{a()},r.play().catch(e=>o(i(e))),s(e)}}function Mv(e){return{startCameraArea:e.querySelector(`#startCameraArea`),startCameraButton:e.querySelector(`#startCameraButton`),cameraIcon:e.querySelector(`#startCameraArea .vidtreo-camera-icon`),cameraText:e.querySelector(`#startCameraArea .vidtreo-camera-text`),cameraHint:e.querySelector(`#startCameraArea .vidtreo-camera-hint`),previewSkeleton:e.querySelector(`#previewSkeleton`),previewSkeletonText:e.querySelector(`#previewSkeleton .vidtreo-skeleton-text`),videoPreview:e.querySelector(`#videoPreview`),countdownOverlay:e.querySelector(`#countdownOverlay`),countdownNumber:e.querySelector(`#countdownNumber`),recordingTimerRow:e.querySelector(`#recordingTimerRow`),recordingTimer:e.querySelector(`#recordingTimer`),recIndicatorTop:e.querySelector(`#recIndicatorTop`),audioLevelBars:e.querySelector(`#audioLevelBars`)}}function Nv(e,t,n,r,i){if(e.stream)return{shouldShow:!1,iconClassName:``,browserErrorContent:null,textContent:null,hintText:null,retryButtonLabel:null};let a=!1;e.errorCode?.startsWith(`camera.`)&&(a=!0);let o=e.errorCode===wv,s=!0;(o||a)&&(s=!1);let c=`ph-fill ph-camera`;(o||a)&&(c=`ph-fill ph-warning-circle`);let l=null,u=null;o&&(l=dv(n)),a&&(u=r),s&&(u=t.initializingCamera);let d=null;s&&(d=t.grantPermissions);let f=null;return a&&(f=i),{shouldShow:!0,iconClassName:c,browserErrorContent:l,textContent:u,hintText:d,retryButtonLabel:f}}function Pv(e,t){let n=!1;return e&&(n=!0),{shouldShow:n,text:t.switchingDevice}}function Fv(e,t,n){let r=!1;return e===`countdown`&&t!==null&&(r=!0),{shouldShow:r,countdown:t,text:n.recordingStartsIn}}function Iv(e,t){return{shouldShow:e,text:t.rec}}function Lv(e,t){return{shouldShow:e,timer:t}}function Rv(e){return{shouldShow:e}}function zv(e,t){let{state:n,isVideoLoaded:r,isRecording:i,translations:a}=e;Bv(Nv(n,a,cv(n.errorCode,n.browserName,n.browserVersion,{browserUnsupported:a.browserUnsupported,browserUnsupportedDynamic:a.browserUnsupportedDynamic,browserUnsupportedSafari:a.browserUnsupportedSafari,browserUnsupportedFirefox:a.browserUnsupportedFirefox}),lv(n.errorCode??``,{cameraInUse:a.cameraInUse,cameraNotFound:a.cameraNotFound,cameraPermissionDenied:a.cameraPermissionDenied,failedToStartCamera:a.failedToStartCamera}),a.retryCamera),t,e.onRetryCamera),Vv(Pv(n.transitionMessage,a),t),Av(kv({stream:n.stream,transitionMessage:n.transitionMessage,isVideoLoaded:r}),{previewSkeleton:t.previewSkeleton,videoPreview:t.videoPreview}),Hv(Fv(n.recordingState,n.countdown,a),t),Uv(Iv(i,a),t),Wv(Lv(i,n.timer),t),Gv(Rv(i),t)}function Bv(e,t,n){let{startCameraArea:r,startCameraButton:i,cameraIcon:a,cameraText:o,cameraHint:s}=t;if(r){if(!e.shouldShow){r.style.display=`none`;return}r.style.display=`block`,a&&(a.innerHTML=`<i class="${e.iconClassName}" style="font-size: 48px;"></i>`),o&&(e.browserErrorContent&&Ov(o,e.browserErrorContent),e.textContent&&(o.textContent=e.textContent)),s&&(e.hintText?(s.textContent=e.hintText,s.style.display=`block`):s.style.display=`none`),i&&(e.retryButtonLabel?(i.textContent=e.retryButtonLabel,i.hidden=!1,i.className=`vidtreo-error-retry`,i.onclick=e=>{e.preventDefault(),e.stopPropagation(),n&&n()}):(i.hidden=!0,i.onclick=null))}}function Vv(e,t){let{previewSkeleton:n,previewSkeletonText:r}=t;n&&(e.shouldShow?n.style.display=`block`:n.style.display=`none`,r&&(r.textContent=e.text))}function Hv(e,t){let{countdownOverlay:n,countdownNumber:r}=t;n&&(e.shouldShow?n.classList.add(`vidtreo-active`):n.classList.remove(`vidtreo-active`),r&&e.countdown!==null&&(r.textContent=e.countdown.toString()))}function Uv(e,t){let{recIndicatorTop:n}=t;n&&(e.shouldShow?n.style.display=`block`:n.style.display=`none`)}function Wv(e,t){let{recordingTimerRow:n,recordingTimer:r}=t;n&&(e.shouldShow?n.style.display=`flex`:n.style.display=`none`,r&&(r.textContent=e.timer))}function Gv(e,t){let{audioLevelBars:n}=t;n&&(e.shouldShow?n.style.display=`flex`:n.style.display=`none`)}let Kv=`inline-flex`;function qv(e){let{stream:t,buttonVisibility:n,currentSourceType:r,isMuted:i,isStopLocked:a,stopLockedTooltip:o,recordingState:s,buttonTranslations:c}=e,l=!!t,u=s===`idle`&&l,d=!1;(n.showPauseButton||n.showResumeButton)&&(d=!0);let f=c.pause,p=`ph-fill ph-pause`;n.showResumeButton&&(f=c.resume,p=`ph-fill ph-play`);let m=c.mute,h=`ph-fill ph-microphone`;i&&(m=c.unmute,h=`ph-fill ph-microphone-slash`);let g=`ph-fill ph-monitor`;r!==xv&&(g=`ph-fill ph-camera`);let _=!1;return n.showDownloadButton&&(_=!0),{showRecordingControls:l,showSettingsButton:n.showSettingsButton,showRecordButton:u,showMuteButton:n.showMuteButton,showPauseButton:d,showStopButton:n.showStopButton,showSwitchSourceButton:n.showSwitchSourceButton,showDownloadButton:_,pauseTitle:f,pauseIconClassName:p,muteTitle:m,muteIconClassName:h,switchSourceIconClassName:g,isMuted:i,isStopLocked:a,stopLockedTooltip:o,settingsTitle:c.settings,switchSourceTitle:c.switchSource,downloadTitle:c.download}}function Jv(e){return{recordingControls:e.querySelector(`#recordingControls`),settingsButton:e.querySelector(`#btnSettings`),recordButton:e.querySelector(`#btnRecord`),muteButton:e.querySelector(`#btnMute`),muteIcon:e.querySelector(`#iconMute`),pauseButton:e.querySelector(`#btnPause`),pauseIcon:e.querySelector(`#iconPause`),stopButton:e.querySelector(`#btnStop`),switchSourceButton:e.querySelector(`#btnSwitchSource`),switchSourceIcon:e.querySelector(`#iconSwitchSource`),downloadButton:e.querySelector(`#btnDownload`)}}function Yv(e,t){let{recordingControls:n,settingsButton:r,recordButton:i,muteButton:a,muteIcon:o,pauseButton:s,pauseIcon:c,stopButton:l,switchSourceButton:u,switchSourceIcon:d,downloadButton:f}=t;Zv(n,e),Qv(r,e),$v(i,e),ey(a,e),ty(o,e),ny(s,e),ry(c,e),iy(l,e),ay(u,e),oy(d,e),sy(f,e)}function Xv(e,t,n){e&&(t?e.style.display=n:e.style.display=`none`)}function Zv(e,t){Xv(e,t.showRecordingControls,`block`)}function Qv(e,t){Xv(e,t.showSettingsButton,Kv),e&&(e.title=t.settingsTitle)}function $v(e,t){Xv(e,t.showRecordButton,Kv)}function ey(e,t){Xv(e,t.showMuteButton,Kv),e&&(e.title=t.muteTitle,e.classList.toggle(`vidtreo-muted`,t.isMuted))}function ty(e,t){e&&(e.className=t.muteIconClassName)}function ny(e,t){Xv(e,t.showPauseButton,Kv),e&&(e.title=t.pauseTitle)}function ry(e,t){e&&(e.className=t.pauseIconClassName)}function iy(e,t){if(Xv(e,t.showStopButton,Kv),e){if(e.classList.toggle(`vidtreo-stop-button-locked`,t.isStopLocked),e.setAttribute(`aria-disabled`,String(t.isStopLocked)),t.isStopLocked){e.title=t.stopLockedTooltip;return}e.title=``}}function ay(e,t){Xv(e,t.showSwitchSourceButton,Kv),e&&(e.title=t.switchSourceTitle)}function oy(e,t){e&&(e.className=t.switchSourceIconClassName)}function sy(e,t){Xv(e,t.showDownloadButton,Kv),e&&(e.title=t.downloadTitle)}function cy(e){let{stream:t,showSettings:n}=e,r=!1;return t&&n&&(r=!0),{shouldShow:r}}function ly(e,t,n){if(t){if(!e.shouldShow){t.classList.remove(`vidtreo-active`);return}t.classList.add(`vidtreo-active`),n()}}function uy(e){return e.toggleMute(),e.getIsMuted()}function dy(e){if(!e)return;let t=URL.createObjectURL(e),n=document.createElement(`a`);n.href=t,n.download=`recording-${Date.now()}.mp4`,document.body.appendChild(n),n.click(),document.body.removeChild(n),URL.revokeObjectURL(t)}let fy={en:{initializingCamera:`Initializing camera...`,grantPermissions:`Grant camera and microphone permissions when prompted`,browserUnsupported:`This browser is not supported`,browserUnsupportedDynamic:`{browser} ({version}) is not supported, please use <a href="https://www.google.com/chrome/" target="_blank">Chrome</a>`,browserUnsupportedSafari:`Safari is not supported, please use <a href="https://www.google.com/chrome/" target="_blank">Chrome</a>`,browserUnsupportedFirefox:`Firefox is not supported, please use <a href="https://www.google.com/chrome/" target="_blank">Chrome</a>`,retryCamera:`Retry Camera`,cameraInUse:`Your camera is being used by another application. Close other apps using the camera (Zoom, Teams, Discord) and try again.`,cameraNotFound:`No camera detected. Connect a camera or check your device settings.`,cameraPermissionDenied:`Camera access was denied. Allow camera access in your browser settings and try again.`,switchingDevice:`Switching device...`,recordingStartsIn:`Recording starts in...`,switchingSource:`Switching source...`,rec:`REC`,settings:`Settings`,record:`Record`,stop:`Stop`,pause:`Pause`,resume:`Resume`,mute:`Mute`,unmute:`Unmute`,switchSource:`Switch Source`,camera:`Camera`,microphone:`Microphone`,minimumRecordingTimeNotReached:`You have not met the minimum recording time yet`,processVideo:`Process Video`,processing:`Processing...`,finishing:`Finishing...`,uploading:`Uploading...`,switchingCamera:`Switching camera...`,switchingMicrophone:`Switching microphone...`,failedToStartCamera:`Failed to start camera`,userInAnotherTab:`User in another tab`,download:`Download`,nativeCameraSelectVideo:`Select Video from Gallery`,nativeCameraRecordVideo:`Record with Camera`,errorTitle:`Configuration Error`,errorGeneric:`An error occurred while loading the configuration`,mobileOpenCamera:`Open Camera`,mobileOpenCameraTitle:`Record a Video`,mobileOpenCameraDescription:`Tap the button below to start recording`,mobileCloseCamera:`Close`,mobilePermissionDenied:`Camera Access Denied`,mobilePermissionDeniedDescription:`Please allow camera access in your browser settings to record video.`},es:{initializingCamera:`Inicializando cámara...`,grantPermissions:`Otorga permisos de cámara y micrófono cuando se solicite`,browserUnsupported:`Este navegador no es compatible`,browserUnsupportedDynamic:`{browser} ({version}) no es compatible, por favor usa <a href="https://www.google.com/chrome/" target="_blank">Chrome</a>`,browserUnsupportedSafari:`Safari no es compatible, usa <a href="https://www.google.com/chrome/" target="_blank">Chrome</a>`,browserUnsupportedFirefox:`Firefox no es compatible, usa <a href="https://www.google.com/chrome/" target="_blank">Chrome</a>`,retryCamera:`Reintentar Cámara`,cameraInUse:`Tu cámara está siendo usada por otra aplicación. Cierra otras apps que usen la cámara (Zoom, Teams, Discord) e intenta de nuevo.`,cameraNotFound:`No se detectó ninguna cámara. Conecta una cámara o revisa la configuración de tu dispositivo.`,cameraPermissionDenied:`Se denegó el acceso a la cámara. Permite el acceso a la cámara en la configuración de tu navegador e intenta de nuevo.`,switchingDevice:`Cambiando dispositivo...`,recordingStartsIn:`La grabación comienza en...`,switchingSource:`Cambiando fuente...`,rec:`GRAB`,settings:`Configuración`,record:`Grabar`,stop:`Detener`,pause:`Pausar`,resume:`Reanudar`,mute:`Silenciar`,unmute:`Activar sonido`,switchSource:`Cambiar Fuente`,camera:`Cámara`,microphone:`Micrófono`,minimumRecordingTimeNotReached:`Aun no cumples el tiempo minimo de grabacion`,processVideo:`Procesar Video`,processing:`Procesando...`,finishing:`Finalizando...`,uploading:`Subiendo...`,switchingCamera:`Cambiando cámara...`,switchingMicrophone:`Cambiando micrófono...`,failedToStartCamera:`Error al iniciar la cámara`,userInAnotherTab:`Usuario en otra pestaña`,download:`Descargar`,nativeCameraSelectVideo:`Seleccionar Video de la Galería`,nativeCameraRecordVideo:`Grabar con Cámara`,errorTitle:`Error de Configuración`,errorGeneric:`Ocurrió un error al cargar la configuración`,mobileOpenCamera:`Abrir Cámara`,mobileOpenCameraTitle:`Grabar un Video`,mobileOpenCameraDescription:`Toca el botón para comenzar a grabar`,mobileCloseCamera:`Cerrar`,mobilePermissionDenied:`Acceso a Cámara Denegado`,mobilePermissionDeniedDescription:`Por favor permite el acceso a la cámara en la configuración de tu navegador para grabar video.`}};var py=class{constructor(e=`en`,t={}){this.lang=e,this.customTexts=t}setLang(e){this.lang=e}setCustomTexts(e){this.customTexts=e}t(e){return this.customTexts[e]?this.customTexts[e]:(fy[this.lang]||fy.en)[e]}getAll(){return{...fy[this.lang]||fy.en,...this.customTexts}}};let my=new Map;function hy(e){e.style.position=`fixed`,e.style.top=`0`,e.style.left=`0`,e.style.width=`100vw`,e.style.height=`100vh`,e.style.height=`100dvh`,e.style.zIndex=`9999`,e.style.pointerEvents=`none`}function gy(e){e.style.pointerEvents=`auto`}function _y(e){e.style.pointerEvents=`none`}var vy=class{constructor(e=`vidtreo-portal-root`){this.portalContainer=null,this.contentWrapper=null,this.isRegistered=!1,this.containerId=e,this.instanceId=`portal-${Date.now()}-${Math.random().toString(36).slice(2,9)}`}get container(){return this.contentWrapper}get isActive(){return this.contentWrapper!==null&&this.portalContainer!==null}open(){let e=document.getElementById(this.containerId);return e||(e=document.createElement(`div`),e.id=this.containerId,hy(e),document.body.appendChild(e)),this.portalContainer=e,this.contentWrapper=document.createElement(`div`),this.contentWrapper.setAttribute(`data-portal-instance`,this.instanceId),this.contentWrapper.style.width=`100%`,this.contentWrapper.style.height=`100%`,this.portalContainer.appendChild(this.contentWrapper),this.registerInstance(),gy(e),this.contentWrapper}render(e){this.contentWrapper&&(this.contentWrapper.innerHTML=e)}querySelector(e){return this.contentWrapper?this.contentWrapper.querySelector(e):null}close(){this.contentWrapper&&=(this.contentWrapper.innerHTML=``,this.contentWrapper.remove(),null),this.unregisterInstance(),this.updatePortalContainerState()}destroy(){this.close(),this.portalContainer=null}registerInstance(){if(this.isRegistered)return;let e=my.get(this.containerId);e||(e=new Set,my.set(this.containerId,e)),e.add(this),this.isRegistered=!0}unregisterInstance(){if(!this.isRegistered)return;let e=my.get(this.containerId);e&&(e.delete(this),e.size===0&&my.delete(this.containerId)),this.isRegistered=!1}updatePortalContainerState(){if(!this.portalContainer)return;let e=my.get(this.containerId);e&&e.size>0?gy(this.portalContainer):(_y(this.portalContainer),this.portalContainer.childNodes.length===0&&this.portalContainer.remove())}},yy=class{constructor(e){this.state={isModalOpen:!1,permissionRequested:!1,prevUploading:!1},this.escapeHandler=null,this.initCheckInterval=null,this.callbacks=e,this.portalManager=new vy}get canCloseModal(){let{recordingState:e}=this.callbacks.getState();return!(e===`recording`||e===`countdown`)}get isModalOpen(){return this.state.isModalOpen}get portal(){return this.portalManager}openModal(){this.state.isModalOpen=!0,this.state.permissionRequested=!1,this.portalManager.open(),document.body.style.overflow=`hidden`,this.setupEscapeHandler(),this.callbacks.renderMobile(),this.requestCameraPreview()}closeModal(){this.canCloseModal&&(this.callbacks.stopPreview(),this.state.isModalOpen=!1,this.state.permissionRequested=!1,document.body.style.overflow=``,this.removeEscapeHandler(),this.portalManager.close(),this.callbacks.renderMobile())}checkUploadCompletion(e){let t=this.state.prevUploading,n=e!==null;this.state.prevUploading=n,t&&!n&&this.state.isModalOpen&&this.closeModal()}requestCameraPreview(){if(this.state.permissionRequested)return;let e=()=>{this.callbacks.isInitialized()?(this.state.permissionRequested=!0,this.callbacks.startPreview().catch(()=>{})):this.initCheckInterval=setTimeout(e,100)};e()}setupEscapeHandler(){this.escapeHandler=e=>{e.key===`Escape`&&this.canCloseModal&&this.closeModal()},document.addEventListener(`keydown`,this.escapeHandler)}removeEscapeHandler(){this.escapeHandler&&=(document.removeEventListener(`keydown`,this.escapeHandler),null)}destroy(){this.removeEscapeHandler(),this.portalManager.destroy(),document.body.style.overflow=``,this.initCheckInterval&&=(clearTimeout(this.initCheckInterval),null)}},by=class{constructor(e,t){this.state={file:null,transcodingProgress:null,uploadProgress:null,isTranscoding:!1,isConfigLoading:!0,error:null,transcodedBlob:null},this.handler=null,this.config=e,this.callbacks=t;let n=e.backendUrl||`https://core.vidtreo.com`,r=null;e.apiKey&&!e.demo&&(r=an.getInstance({apiKey:e.apiKey,backendUrl:n}));let i=new kg;this.handler=new Lm({apiKey:e.apiKey,backendUrl:n,maxRecordingTime:e.maxRecordingTime,maxFileSize:e.maxFileSize,userMetadata:e.userMetadata},r,i),e.apiKey&&!e.demo?(this.updateState({isConfigLoading:!0}),this.handler.preloadConfig().then(()=>this.updateState({isConfigLoading:!1})).catch(()=>{this.updateState({isConfigLoading:!1,error:`Failed to load settings`})})):this.updateState({isConfigLoading:!1})}updateState(e){this.state={...this.state,...e},this.callbacks.onStateChange()}getState(){return this.state}async handleFileSelect(e){if(this.updateState({error:null}),!this.handler)throw Error(`Handler not initialized`);try{let t=await this.handler.handleFileSelection(e);return this.updateState({file:t}),t}catch(e){let t=i(e),n=e instanceof Error?e:Error(t);throw this.updateState({error:t}),this.callbacks.onError?.(n),n}}async processAndUpload(e){let t=e||this.state.file;if(!(t&&this.handler))return;let n=this.config.demo;try{if(this.updateState({isTranscoding:!0,transcodingProgress:0,error:null}),n){let e=await Fm(t.file,Gt,e=>{this.updateState({transcodingProgress:e}),this.callbacks.onTranscodingProgress?.(e)});this.updateState({transcodedBlob:e.blob,isTranscoding:!1,transcodingProgress:null})}else{let e=await this.handler.processAndUpload(e=>{this.updateState({transcodingProgress:e}),this.callbacks.onTranscodingProgress?.(e)},e=>{this.updateState({uploadProgress:e}),this.callbacks.onUploadProgress?.(e)});this.updateState({file:null,transcodingProgress:null,uploadProgress:null,isTranscoding:!1}),this.callbacks.onUploadComplete?.({recordingId:e.recordingId||``,uploadUrl:e.uploadUrl||``})}}catch(e){let t=i(e),r=e instanceof Error?e:Error(t);this.updateState({error:t,isTranscoding:!1,transcodingProgress:null,uploadProgress:null,transcodedBlob:null}),this.callbacks.onError?.(r),n||this.callbacks.onUploadError?.(r)}}downloadVideo(){if(!this.state.transcodedBlob)return;let e=URL.createObjectURL(this.state.transcodedBlob),t=document.createElement(`a`);t.href=e,t.download=`recording-${Date.now()}.mp4`,document.body.appendChild(t),t.click(),document.body.removeChild(t),URL.revokeObjectURL(e)}reset(){this.updateState({file:null,transcodingProgress:null,uploadProgress:null,error:null,isTranscoding:!1,transcodedBlob:null})}destroy(){this.handler&&this.handler.cancel(),this.handler=null}};function xy(e){return{preview:{initializingCamera:e.initializingCamera,grantPermissions:e.grantPermissions,browserUnsupported:e.browserUnsupported,browserUnsupportedDynamic:e.browserUnsupportedDynamic,browserUnsupportedSafari:e.browserUnsupportedSafari,browserUnsupportedFirefox:e.browserUnsupportedFirefox,retryCamera:e.retryCamera,cameraInUse:e.cameraInUse,cameraNotFound:e.cameraNotFound,cameraPermissionDenied:e.cameraPermissionDenied,failedToStartCamera:e.failedToStartCamera,switchingDevice:e.switchingDevice,recordingStartsIn:e.recordingStartsIn,rec:e.rec},buttons:{settings:e.settings,record:e.record,stop:e.stop,minimumRecordingTimeNotReached:e.minimumRecordingTimeNotReached,pause:e.pause,resume:e.resume,mute:e.mute,unmute:e.unmute,switchSource:e.switchSource,download:e.download},settings:{settings:e.settings,camera:e.camera,microphone:e.microphone}}}var Sy=class{constructor(e){if(this.proxyEndpoint=e.proxyEndpoint,this.proxyEndpoint)throw Error(`Proxy mode not yet implemented`);this.service=new kg}uploadVideo(e,t){if(this.proxyEndpoint)throw Error(`Proxy mode not yet implemented`);return this.service.uploadVideo(e,t)}},Cy=`:root{--vidtreo-background:0 0% 100%;--vidtreo-foreground:0 0% 3.9%;--vidtreo-card:0 0% 100%;--vidtreo-card-foreground:0 0% 3.9%;--vidtreo-primary:0 0% 9%;--vidtreo-primary-foreground:0 0% 98%;--vidtreo-secondary:0 0% 96.1%;--vidtreo-secondary-foreground:0 0% 9%;--vidtreo-muted:0 0% 96.1%;--vidtreo-muted-foreground:0 0% 45.1%;--vidtreo-accent:0 0% 96.1%;--vidtreo-accent-foreground:0 0% 9%;--vidtreo-destructive:0 84.2% 60.2%;--vidtreo-destructive-foreground:0 0% 98%;--vidtreo-border:0 0% 89.8%;--vidtreo-input:0 0% 89.8%;--vidtreo-ring:0 0% 3.9%;--vidtreo-radius:.5rem;--vidtreo-preview-bg:0 0% 0%;--vidtreo-z-modal-overlay:9999;--vidtreo-z-settings-panel:200;--vidtreo-z-error-overlay:100;--vidtreo-z-countdown-overlay:20;--vidtreo-z-progress-overlay:20;--vidtreo-z-controls:10}.vidtreo-preview-container{aspect-ratio:9/16;background:hsl(var(--vidtreo-preview-bg));contain:layout style;will-change:auto;backface-visibility:hidden;isolation:isolate;border:none;border-radius:0;justify-content:center;align-items:center;width:100%;display:flex;position:relative;overflow:visible;transform:translateZ(0)}.vidtreo-preview-container:before{display:none}@media (width>=768px){.vidtreo-preview-container{aspect-ratio:16/9}}.vidtreo-camera-area{contain:layout style paint;backface-visibility:hidden;isolation:isolate;will-change:auto;width:100%;height:100%;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,sans-serif;display:none;position:relative;transform:translateZ(0)}.vidtreo-source-transition-overlay{z-index:var(--vidtreo-z-error-overlay);backdrop-filter:blur(4px);contain:layout style paint;backface-visibility:hidden;will-change:opacity;background:#000000b3;border-radius:0;flex-direction:column;justify-content:center;align-items:center;transition:opacity .3s;display:none;position:absolute;inset:0;transform:translateZ(0)}.vidtreo-source-transition-overlay.vidtreo-active{animation:.2s vidtreo-fadeIn;display:flex}@keyframes vidtreo-fadeIn{0%{opacity:0}to{opacity:1}}.vidtreo-transition-spinner{border:4px solid #ffffff4d;border-top-color:#667eea;border-radius:50%;width:40px;height:40px;margin-bottom:12px;animation:.8s linear infinite vidtreo-spin}@keyframes vidtreo-spin{to{transform:rotate(360deg)}}.vidtreo-transition-message{color:#fff;text-align:center;font-size:14px;font-weight:500}.vidtreo-camera-area.vidtreo-active{display:block}.vidtreo-preview-skeleton{z-index:var(--vidtreo-z-controls);contain:layout style paint;backface-visibility:hidden;will-change:auto;background:#000;border-radius:0;flex-direction:column;justify-content:center;align-items:center;gap:1rem;display:flex;position:absolute;inset:0;transform:translateZ(0)}.vidtreo-skeleton-spinner{border:4px solid #ffffff4d;border-top-color:#fff;border-radius:50%;width:40px;height:40px;animation:.8s linear infinite vidtreo-spin}.vidtreo-skeleton-text{color:#fff;font-size:.875rem;font-weight:500}.vidtreo-video-preview{object-fit:contain;will-change:auto;backface-visibility:hidden;background:#000;border-radius:0;width:100%;height:100%;transition:opacity .3s,transform .3s;display:block;position:absolute;inset:0;transform:translateZ(0)}.vidtreo-video-preview-skeleton{z-index:2;contain:layout style paint;backface-visibility:hidden;will-change:auto;background:#000;border-radius:0;width:100%;height:100%;position:absolute;inset:0;overflow:hidden;transform:translateZ(0)}.vidtreo-skeleton-shimmer{background:linear-gradient(90deg, hsl(var(--vidtreo-muted)) 0%, hsl(var(--vidtreo-muted) / .5) 50%, hsl(var(--vidtreo-muted)) 100%);background-size:200% 100%;animation:1.5s ease-in-out infinite vidtreo-shimmer;position:absolute;inset:0}@keyframes vidtreo-shimmer{0%{background-position:-200% 0}to{background-position:200% 0}}.vidtreo-video-preview-skeleton.vidtreo-hidden{opacity:0;pointer-events:none;transition:opacity .3s}.vidtreo-video-preview.vidtreo-screen-share{object-fit:cover}.vidtreo-video-preview.vidtreo-transitioning{opacity:.5;transform:scale(.98)}.vidtreo-countdown-overlay{z-index:var(--vidtreo-z-countdown-overlay);contain:layout style paint;backface-visibility:hidden;will-change:auto;background:#000000f2;border-radius:0;justify-content:center;align-items:center;display:none;position:absolute;inset:0;transform:translateZ(0)}.vidtreo-countdown-overlay.vidtreo-active{display:flex}.vidtreo-countdown-content{flex-direction:column;align-items:center;gap:1rem;display:flex}.vidtreo-countdown-number{color:#fff;font-size:9rem;font-weight:700;animation:.3s vidtreo-zoomIn}@keyframes vidtreo-zoomIn{0%{opacity:0;transform:scale(.5)}to{opacity:1;transform:scale(1)}}.vidtreo-countdown-text{color:#fff;margin-top:1rem;font-size:.875rem;font-weight:500}.vidtreo-settings-panel{z-index:var(--vidtreo-z-settings-panel);contain:layout style paint;backface-visibility:hidden;background:#0006;border:none;border-radius:.75rem;flex-direction:column;width:90%;margin-left:-47%;padding:.625rem;display:none;overflow:hidden;transform:translateZ(0);position:absolute!important;bottom:4rem!important;left:50%!important}.vidtreo-settings-panel.vidtreo-active{display:flex}.vidtreo-settings-content{will-change:transform;backface-visibility:hidden;flex-direction:column;width:100%;display:flex;transform:translateZ(0)}.vidtreo-settings-content.vidtreo-slide-right{animation:.3s vidtreo-slideRight}.vidtreo-settings-content.vidtreo-slide-left{animation:.3s vidtreo-slideLeft}.vidtreo-settings-content.vidtreo-slide-none{will-change:auto;animation:none}@keyframes vidtreo-slideIn{0%{opacity:0;transform:translateY(1rem)}to{opacity:1;transform:translateY(0)}}@keyframes vidtreo-slideRight{0%{opacity:0;transform:translate(-100%)}to{opacity:1;transform:translate(0)}}@keyframes vidtreo-slideLeft{0%{opacity:0;transform:translate(100%)}to{opacity:1;transform:translate(0)}}.vidtreo-settings-header{color:#fff;cursor:pointer;text-align:left;background:0 0;border:none;align-items:center;gap:.75rem;width:100%;margin-bottom:1rem;padding:0;display:flex}.vidtreo-settings-back-icon{color:#fff;flex-shrink:0}.vidtreo-settings-title{color:#fff;margin:0;font-size:.875rem;font-weight:600}.vidtreo-device-options-container{flex-direction:column;gap:.375rem;display:flex}.vidtreo-device-option-nav{cursor:pointer;color:#fff;background:0 0;border:none;border-radius:.5rem;align-items:center;gap:1rem;width:100%;padding:.5rem .75rem;transition:background-color .2s;display:flex}.vidtreo-device-option-nav:hover{background:#fff3}.vidtreo-device-option-nav-content{flex-shrink:0;align-items:center;gap:.75rem;display:flex}.vidtreo-device-option-nav-label{color:#fff;font-size:.875rem;font-weight:500}.vidtreo-device-option-nav-value{flex:1;justify-content:flex-end;align-items:center;gap:.5rem;min-width:0;display:flex}.vidtreo-device-option-nav-value-text{color:#fffc;text-overflow:ellipsis;white-space:nowrap;text-align:right;flex:1;font-size:.875rem;overflow:hidden}.vidtreo-device-option-nav-chevron{color:#fff;font-size:1.25rem;line-height:1}.vidtreo-device-list{flex-direction:column;gap:0;max-height:200px;display:flex;overflow-y:auto}.vidtreo-device-list::-webkit-scrollbar{width:4px}.vidtreo-device-list::-webkit-scrollbar-track{background:0 0}.vidtreo-device-list::-webkit-scrollbar-thumb{background:#fff3;border-radius:2px}.vidtreo-device-list::-webkit-scrollbar-thumb:hover{background:#ffffff4d}.vidtreo-device-option{cursor:pointer;color:#fff;text-align:left;background:0 0;border:none;border-radius:.5rem;align-items:center;gap:.75rem;width:100%;padding:.5rem .75rem;transition:background-color .2s;display:flex}.vidtreo-device-option:hover{background:#fff3}.vidtreo-device-option-check-container{flex-shrink:0;justify-content:center;align-items:center;width:20px;height:20px;display:flex}.vidtreo-device-checkmark-placeholder{flex-shrink:0;width:20px;height:20px}.vidtreo-device-checkmark{color:#fff;flex-shrink:0}.vidtreo-device-option-label{color:#fff;flex:1;font-size:.875rem}.vidtreo-device-empty{color:#fff9;text-align:center;padding:1rem 0;font-size:.875rem}.vidtreo-audio-level-bars{height:1rem;z-index:var(--vidtreo-z-controls);contain:layout style paint;will-change:auto;backface-visibility:hidden;align-items:center;gap:.125rem;transform:translateZ(0);display:flex!important;position:absolute!important;bottom:.75rem!important;right:.75rem!important}@media (width>=768px){.vidtreo-audio-level-bars{height:1.25rem}}.vidtreo-audio-level-bar{background:#ffffff80;border-radius:9999px;align-self:flex-end;width:.125rem;transition:all .1s}.vidtreo-recording-controls{z-index:var(--vidtreo-z-controls);contain:layout style;will-change:auto;backface-visibility:hidden;position:absolute!important;bottom:12px!important;left:50%!important;transform:translate(-50%)translateZ(0)!important}.vidtreo-recording-controls-row{will-change:auto;justify-content:center;align-items:center;gap:.5rem;display:flex;transform:translateZ(0)}.vidtreo-recording-timer-row{justify-content:space-between;align-items:center;gap:.5rem;display:flex}.vidtreo-recording-timer-badge{z-index:var(--vidtreo-z-controls);contain:layout style paint;will-change:auto;backface-visibility:hidden;background:#0000004d;border:none;border-radius:9999px;align-items:center;gap:.375rem;padding:.25rem .5rem;transform:translateZ(0);box-shadow:0 1px 3px #0000001a,0 1px 2px -1px #0000001a;display:flex!important;position:absolute!important;top:.75rem!important;right:.75rem!important}.vidtreo-recording-dot-small{background:hsl(var(--vidtreo-destructive));border-radius:50%;width:.375rem;height:.375rem;animation:1.5s ease-in-out infinite vidtreo-pulse}.vidtreo-recording-timer-text{color:#fff;font-family:monospace;font-size:.75rem;font-weight:500}.vidtreo-control-buttons-row{will-change:auto;justify-content:center;align-items:center;gap:.375rem;height:auto;min-height:2rem;display:flex;transform:translateZ(0)}@media (width>=768px){.vidtreo-control-buttons-row{min-height:2.25rem}}.vidtreo-control-button{cursor:pointer;color:#fff;box-sizing:border-box;vertical-align:top;contain:layout style paint;will-change:auto;backface-visibility:hidden;background:#0000004d;border:none;border-radius:9999px;flex-shrink:0;justify-content:center;align-items:center;width:2rem;height:2rem;min-height:2rem;max-height:2rem;margin:0;padding:.25rem;transition:background-color .2s;display:inline-flex;position:relative;transform:translateZ(0)}.vidtreo-control-button:before{content:"";z-index:0;border-radius:9999px;transition:background-color .2s;position:absolute;inset:.25rem}.vidtreo-control-button svg{color:inherit;z-index:1;flex-shrink:0;position:relative;width:22px!important;height:22px!important}@media (width>=768px){.vidtreo-control-button svg{width:24px!important;height:24px!important}.vidtreo-control-button{width:2.25rem;height:2.25rem;min-height:2.25rem;max-height:2.25rem}}.vidtreo-control-button:hover:not(:disabled):before{background:#fff3}.vidtreo-control-button:disabled{opacity:.5;cursor:not-allowed}.vidtreo-control-button.vidtreo-muted:before{background:#0000004d}.vidtreo-control-button.vidtreo-muted:hover:not(:disabled):before{background:#fff3}.vidtreo-record-button{background:hsl(var(--vidtreo-destructive));height:2rem;min-height:2rem;max-height:2rem;color:hsl(var(--vidtreo-destructive-foreground));box-sizing:border-box;vertical-align:top;cursor:pointer;border:none;border-radius:9999px;flex-shrink:0;justify-content:center;align-items:center;gap:.375rem;width:auto;margin:0;padding:0 .75rem;font-size:.75rem;font-weight:500;line-height:1;transition:background-color .2s,filter .2s;display:inline-flex}@media (width>=768px){.vidtreo-record-button{height:2.25rem;min-height:2.25rem;max-height:2.25rem;font-size:.875rem}}.vidtreo-record-button:hover:not(:disabled){filter:brightness(.85)}.vidtreo-record-button.vidtreo-stop-button-locked{opacity:.5;cursor:not-allowed;filter:none}.vidtreo-record-button.vidtreo-stop-button-locked:hover{filter:none}#startButton.vidtreo-record-button{animation:2s ease-in-out infinite vidtreo-record-glow-pulse}@keyframes vidtreo-record-glow-pulse{0%,to{box-shadow:0 0 8px 2px #ef444466,0 0 16px 4px #ef444433}50%{box-shadow:0 0 16px 4px #ef444499,0 0 32px 8px #ef44444d}}#startButton.vidtreo-record-button:hover:not(:disabled){animation-play-state:paused;box-shadow:0 0 20px 6px #ef4444b3,0 0 40px 10px #ef444459}.vidtreo-rec-indicator-top{contain:layout style paint;will-change:auto;backface-visibility:hidden;background:#0000004d;border:none;border-radius:9999px;align-items:center;gap:.375rem;padding:.25rem .5rem;transform:translateZ(0);box-shadow:0 1px 3px #0000001a,0 1px 2px -1px #0000001a;display:flex!important;position:absolute!important;top:.75rem!important;left:.75rem!important}.vidtreo-rec-indicator-top span{color:#fff;font-size:.75rem;font-weight:500}.vidtreo-start-camera-area{text-align:center;cursor:pointer;z-index:1;contain:layout style paint;backface-visibility:hidden;will-change:auto;background:#000;border:none;border-radius:0;flex-direction:column;justify-content:center;align-items:center;padding:40px;transition:all .3s;display:flex;position:absolute;inset:0;transform:translateZ(0)}.vidtreo-start-camera-area:hover:not(.vidtreo-loading){background:#000}.vidtreo-start-camera-area.vidtreo-loading{cursor:wait;opacity:.7}.vidtreo-start-camera-area.vidtreo-loading .vidtreo-camera-text{color:#fff;opacity:.7}.vidtreo-camera-icon{color:#fff;justify-content:center;margin-bottom:16px;font-size:48px;display:flex}.vidtreo-camera-text{color:#fff;margin-bottom:8px;font-weight:600}.vidtreo-camera-text a{color:#3b82f6;text-decoration:underline}.vidtreo-camera-text a:hover{color:#2563eb}.vidtreo-camera-hint{color:#fff;opacity:.8;font-size:12px}@keyframes vidtreo-pulse{0%,to{opacity:1}50%{opacity:.3}}.vidtreo-progress{margin-top:20px;display:none}.vidtreo-progress.vidtreo-active{display:block}.vidtreo-progress-bar{background:#e0e0e0;border-radius:4px;width:100%;height:8px;margin-bottom:8px;overflow:hidden}.vidtreo-progress-fill{background:linear-gradient(90deg,#667eea 0%,#764ba2 100%);width:0%;height:100%;transition:width .3s}.vidtreo-progress-text{text-align:center;color:#fff;font-size:14px}.vidtreo-error{color:#fff;text-align:center;z-index:var(--vidtreo-z-error-overlay);word-wrap:break-word;background:#dc2626;border:none;border-radius:.5rem;max-width:90%;padding:1rem 1.25rem;font-size:.875rem;font-weight:500;display:none;position:absolute;top:.75rem;left:50%;transform:translate(-50%);box-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a}.vidtreo-error.vidtreo-active{animation:.3s ease-out vidtreo-error-fade-in-slide-down;display:block}@keyframes vidtreo-error-fade-in-slide-down{0%{opacity:0;transform:translate(-50%)translateY(-1rem)}to{opacity:1;transform:translate(-50%)translateY(0)}}.vidtreo-upload-progress{margin-top:20px;display:none}.vidtreo-upload-progress.vidtreo-active{display:block}.vidtreo-preview-container .vidtreo-upload-progress{margin-top:0}.vidtreo-upload-status{border-radius:8px;margin-top:20px;padding:16px;display:none}.vidtreo-upload-status.vidtreo-active{display:block}.vidtreo-upload-status.vidtreo-success{color:#22543d;background:#f0f9ff;border:2px solid #48bb78}.vidtreo-upload-status.vidtreo-error{color:#c33;background:#fee;border:2px solid #fcc}.vidtreo-upload-status-text{font-size:14px;font-weight:500}.vidtreo-preview-error{aspect-ratio:9/16;background:hsl(var(--vidtreo-preview-bg));contain:strict;will-change:auto;backface-visibility:hidden;isolation:isolate;border:none;border-radius:0;justify-content:center;align-items:center;width:100%;display:flex;position:relative;overflow:hidden;transform:translateZ(0)}@media (width>=768px){.vidtreo-preview-error{aspect-ratio:16/9}}.vidtreo-error-content{text-align:center;color:#fff;flex-direction:column;justify-content:center;align-items:center;gap:1rem;max-width:400px;padding:2rem;display:flex}.vidtreo-error-icon{font-size:3rem;line-height:1}.vidtreo-error-title{font-size:1.25rem;font-weight:600;line-height:1.2}.vidtreo-error-message{opacity:.9;word-break:break-word;font-size:.875rem;line-height:1.5}.vidtreo-error-config{text-align:left;border-top:1px solid #fff3;width:100%;margin-top:1.5rem;padding-top:1.5rem}.vidtreo-error-config-title{color:#fff;margin-bottom:.75rem;font-size:.875rem;font-weight:600}.vidtreo-error-config-item{color:#ffffffd9;margin-bottom:.5rem;font-size:.8125rem;line-height:1.6}.vidtreo-error-config-item code{color:#fff;background:#ffffff26;border-radius:.25rem;padding:.125rem .375rem;font-family:monospace;font-size:.75rem}.vidtreo-error-retry{background:hsl(var(--vidtreo-destructive));color:hsl(var(--vidtreo-destructive-foreground));cursor:pointer;border:none;border-radius:.375rem;margin-top:.5rem;padding:.5rem 1rem;font-size:.875rem;font-weight:500;transition:filter .2s}.vidtreo-error-retry:hover:not(:disabled){filter:brightness(.85)}.vidtreo-error-retry:disabled{opacity:.5;cursor:not-allowed}.vidtreo-error-overlay{background:hsl(var(--vidtreo-preview-bg));z-index:var(--vidtreo-z-error-overlay);justify-content:center;align-items:center;display:flex;position:absolute;inset:0}.vidtreo-native-camera-container{aspect-ratio:9/16;background:hsl(var(--vidtreo-preview-bg));border-radius:0;justify-content:center;align-items:center;width:100%;display:flex;position:relative;overflow:hidden}@media (width>=768px){.vidtreo-native-camera-container{aspect-ratio:16/9}}.vidtreo-native-camera-container:has(.vidtreo-native-camera-preview-container){background:0 0}.vidtreo-config-loading-indicator{z-index:var(--vidtreo-z-controls);position:absolute;top:8px;right:8px}.vidtreo-spinner-small{border:2px solid #ffffff4d;border-top-color:#fff;border-radius:50%;width:16px;height:16px;animation:.6s linear infinite spin}.vidtreo-native-camera-empty-state{flex-direction:column;justify-content:center;align-items:center;gap:16px;width:100%;height:100%;padding:24px;display:flex;position:relative}.vidtreo-native-camera-buttons{flex-direction:column;gap:12px;width:100%;max-width:300px;display:flex}.vidtreo-native-camera-process-button,.vidtreo-native-camera-download-button{z-index:30;position:absolute;bottom:24px;left:50%;transform:translate(-50%)}.vidtreo-native-camera-process-button .vidtreo-btn,.vidtreo-native-camera-download-button .vidtreo-btn{min-width:200px}.vidtreo-btn{border-radius:var(--vidtreo-radius);cursor:pointer;border:none;padding:12px 24px;font-size:1rem;font-weight:500;transition:all .2s}.vidtreo-btn:disabled{opacity:.5;cursor:not-allowed}.vidtreo-btn-primary{background:hsl(var(--vidtreo-primary));color:hsl(var(--vidtreo-primary-foreground))}.vidtreo-btn-primary:hover:not(:disabled){filter:brightness(.9)}.vidtreo-btn-secondary{background:hsl(var(--vidtreo-secondary));color:hsl(var(--vidtreo-secondary-foreground));border:1px solid hsl(var(--vidtreo-border))}.vidtreo-btn-secondary:hover:not(:disabled){background:hsl(var(--vidtreo-accent))}.vidtreo-transcoding-progress{width:100%;max-width:400px;padding:16px}.vidtreo-progress-bar{background:#fff3;border-radius:4px;width:100%;height:8px;overflow:hidden}.vidtreo-progress-fill{background:hsl(var(--vidtreo-primary));height:100%;transition:width .3s}.vidtreo-progress-text{text-align:center;color:hsl(var(--vidtreo-foreground));margin-top:8px;font-size:.875rem}.vidtreo-native-camera-preview-container{background:0 0;justify-content:center;align-items:center;width:100%;height:100%;display:flex;position:relative}.vidtreo-native-camera-preview-image{object-fit:contain;width:100%;height:100%;display:block}.vidtreo-progress-overlay{backdrop-filter:blur(4px);width:100%;height:100%;z-index:var(--vidtreo-z-progress-overlay);pointer-events:none;background:#000000b3;flex-direction:column;justify-content:center;align-items:center;display:flex;position:absolute;inset:0}.vidtreo-progress-overlay .vidtreo-transcoding-progress,.vidtreo-progress-overlay .vidtreo-upload-progress{pointer-events:auto;background:0 0;flex-direction:column;align-items:center;gap:12px;width:90%;max-width:400px;padding:0;display:flex;position:relative}.vidtreo-progress-overlay .vidtreo-progress-bar,.vidtreo-progress-overlay .vidtreo-upload-progress-bar{background:#fff3;border-radius:4px;width:100%;height:8px;overflow:hidden}.vidtreo-progress-overlay .vidtreo-progress-fill{background:#fff;height:100%;transition:width .3s}.vidtreo-progress-overlay .vidtreo-progress-text,.vidtreo-progress-overlay .vidtreo-upload-progress-text{text-align:center;color:#fff;margin-top:0;font-size:.875rem;font-weight:500}.vidtreo-progress-overlay .vidtreo-upload-progress-bar{background:#fff3;border-radius:4px;width:100%;height:8px;overflow:hidden}.vidtreo-progress-overlay .vidtreo-upload-progress-fill{background:#fff;height:100%;transition:width .3s}.vidtreo-progress-overlay .vidtreo-progress-indeterminate{background:linear-gradient(90deg,#0000 0%,#fff 50%,#0000 100%) 0 0/200% 100%;width:100%;animation:1.5s ease-in-out infinite vidtreo-progress-indeterminate}@keyframes vidtreo-progress-indeterminate{0%{background-position:200% 0}to{background-position:-200% 0}}.vidtreo-mobile-web-recorder{width:100%;height:100%;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,sans-serif}.vidtreo-mobile-landing-container{aspect-ratio:4/3;background:hsl(var(--vidtreo-preview-bg));border-radius:0;justify-content:center;align-items:center;width:100%;max-height:100%;display:flex;position:relative;overflow:hidden}.vidtreo-mobile-landing-content{text-align:center;flex-direction:column;justify-content:center;align-items:center;gap:1.25rem;padding:2rem;display:flex}.vidtreo-mobile-landing-title{color:#fff;margin:0;font-size:1.25rem;font-weight:600;line-height:1.3}.vidtreo-mobile-landing-description{color:#ffffffbf;max-width:280px;margin:0;font-size:.875rem;line-height:1.5}.vidtreo-mobile-open-camera-btn{border-radius:9999px;justify-content:center;align-items:center;gap:.625rem;min-width:200px;margin-top:.5rem;padding:.875rem 1.75rem;font-size:1rem;font-weight:600;transition:all .2s;animation:2s ease-in-out infinite vidtreo-btn-glow-pulse;display:inline-flex}@keyframes vidtreo-btn-glow-pulse{0%,to{box-shadow:0 0 8px 2px #ffffff4d,0 0 16px 4px #ffffff26}50%{box-shadow:0 0 16px 4px #ffffff80,0 0 32px 8px #ffffff40}}.vidtreo-mobile-open-camera-btn:hover:not(:disabled){animation-play-state:paused;transform:scale(1.02);box-shadow:0 0 20px 6px #fff9,0 0 40px 10px #ffffff4d}.vidtreo-mobile-open-camera-btn:active:not(:disabled){transform:scale(.98)}.vidtreo-mobile-open-camera-btn:disabled{box-shadow:none;animation:none}#vidtreo-portal-root{z-index:9999;pointer-events:none;width:100vw;height:100dvh;position:fixed;top:0;left:0}#vidtreo-portal-root>*{pointer-events:auto}.vidtreo-mobile-modal-overlay{--vidtreo-safe-top:0px;--vidtreo-safe-bottom:0px;--vidtreo-safe-left:0px;--vidtreo-safe-right:0px;width:100vw;height:100dvh;z-index:var(--vidtreo-z-modal-overlay);background:#000;flex-direction:column;height:-webkit-fill-available;animation:.3s ease-out vidtreo-modal-fade-in;display:flex;position:fixed;inset:0}@keyframes vidtreo-modal-fade-in{0%{opacity:0}to{opacity:1}}.vidtreo-mobile-modal-header{padding:.75rem;padding-top:calc(.75rem + var(--vidtreo-safe-top,0px));z-index:var(--vidtreo-z-error-overlay);pointer-events:none;justify-content:center;display:flex;position:absolute;top:0;left:0;right:0}.vidtreo-mobile-modal-close-btn{color:#ffffffe6;cursor:pointer;pointer-events:auto;backdrop-filter:blur(4px);background:#00000080;border:none;border-radius:9999px;justify-content:center;align-items:center;gap:.375rem;height:2rem;padding:0 .75rem;font-size:.75rem;font-weight:500;transition:all .2s;display:flex}.vidtreo-mobile-modal-close-btn:hover:not(:disabled){background:#000000b3}.vidtreo-mobile-modal-close-btn:disabled{opacity:.3;cursor:not-allowed}.vidtreo-mobile-modal-content{width:100%;height:100%;padding-top:var(--vidtreo-safe-top,0px);padding-bottom:var(--vidtreo-safe-bottom,0px);padding-left:var(--vidtreo-safe-left,0px);padding-right:var(--vidtreo-safe-right,0px);flex-direction:column;flex:1;display:flex;position:relative}.vidtreo-mobile-recorder-content{--vidtreo-safe-top:0px;--vidtreo-safe-bottom:0px;--vidtreo-safe-left:0px;--vidtreo-safe-right:0px;flex-direction:column;width:100%;height:100%;display:flex;position:relative}.vidtreo-mobile-recorder-content .vidtreo-preview-container{aspect-ratio:unset;flex:1;width:100%;height:100%}.vidtreo-mobile-recorder-content .vidtreo-video-preview{object-fit:cover}.vidtreo-mobile-preview{flex:1;aspect-ratio:unset!important;height:100%!important}.vidtreo-mobile-recorder-content .vidtreo-recording-controls{bottom:calc(24px + var(--vidtreo-safe-bottom,0px))!important}.vidtreo-mobile-recorder-content .vidtreo-audio-level-bars{bottom:calc(12px + var(--vidtreo-safe-bottom,0px))!important}.vidtreo-mobile-recorder-content .vidtreo-settings-panel{bottom:calc(7rem + var(--vidtreo-safe-bottom,0px))!important}.vidtreo-mobile-recorder-content .vidtreo-rec-indicator-top,.vidtreo-mobile-recorder-content .vidtreo-recording-timer-badge{contain:layout style;height:2rem;padding:0 .75rem;top:calc(.75rem + var(--vidtreo-safe-top,0px))!important}.vidtreo-mobile-recorder-content .vidtreo-recording-timer-text{white-space:nowrap;color:#fff;min-width:3rem;font-size:.875rem;display:inline-block}.vidtreo-mobile-recorder-content .vidtreo-error{top:calc(3.5rem + var(--vidtreo-safe-top,0px))!important}.vidtreo-mobile-recorder-content .vidtreo-control-buttons-row{gap:.75rem;min-height:4rem}.vidtreo-mobile-recorder-content .vidtreo-control-button{width:4rem;height:4rem;min-height:4rem;max-height:4rem}.vidtreo-mobile-recorder-content .vidtreo-control-button svg{width:1.5rem;height:1.5rem}.vidtreo-mobile-recorder-content .vidtreo-record-button{gap:.5rem;height:4rem;min-height:4rem;max-height:4rem;padding:0 1.5rem;font-size:1rem}.vidtreo-mobile-recorder-content .vidtreo-record-button svg{width:1.5rem;height:1.5rem}`;function wy(e){return`
10246
- <style>${Cy}</style>
10245
+ `],{type:`application/javascript`})}let I_=l_({createBlob:F_,createObjectUrl:e=>URL.createObjectURL(e),revokeObjectUrl:e=>{URL.revokeObjectURL(e)}});function L_(){return I_.acquire()}function R_(){I_.release()}let z_=1e3,B_=`format`,V_=new Map,H_=new Map;function U_(e){return e===void 0?`undefined`:String(e)}function W_(e){return e.join(`,`)}function G_(e,t){return`${e}=${t}`}function K_(e,t,n){if(e.has(t)&&e.delete(t),e.set(t,n),e.size<=50)return;let r=e.keys().next();r.done||e.delete(r.value)}var q_=class{constructor(e={}){this.worker=null,this.hasWorkerUrlLease=!1,this.chunks=[],this.totalSize=0,this.isActive=!1,this.audioTrackClone=null,this.isMuted=!1,this.currentVideoTrack=null,this.isPaused=!1,this.overlayConfig=null,this.readyPromiseResolve=null,this.pendingFatalError=null,this.lastRecordingStats=null,this.lastEncoderAcceleration=null;let t=e=>new Worker(e,{type:`classic`});e.createWorker&&(t=e.createWorker);let n=()=>typeof MediaStreamTrackProcessor<`u`;e.canUseMainThreadVideoProcessor&&(n=e.canUseMainThreadVideoProcessor);let r=e=>typeof MediaStreamTrackProcessor>`u`?null:new MediaStreamTrackProcessor({track:e}).readable;e.createVideoStreamFromTrack&&(r=e.createVideoStreamFromTrack);let i=()=>en();e.isLinuxPlatform&&(i=e.isLinuxPlatform),this.canUseMainThreadVideoProcessorFn=n,this.createVideoStreamFromTrackFn=r,this.isLinuxPlatformFn=i;let a=!!e.createWorker;this.workerProbeManager=new P_({setTimeout:window.setTimeout.bind(window),clearTimeout:window.clearTimeout.bind(window),timeoutMilliseconds:2e3}),this.audioWorkletManager=new y_({onChunk:e=>{if(!(this.isWorkerActive()&&this.worker))return;let t={type:`audioChunk`,data:e.data,frames:e.frames,numberOfChannels:e.numberOfChannels,sampleRate:e.sampleRate,timestamp:e.timestamp},n=[];e.data.buffer instanceof ArrayBuffer&&n.push(e.data.buffer),this.worker.postMessage(t,n)}});let o=e=>{let t=e.data;switch(t.type){case`ready`:$.debug(`[WorkerProcessor] Worker ready`),this.readyPromiseResolve&&=(this.readyPromiseResolve(),null);break;case Um:this.workerProbeManager.handleProbeResult(t);break;case`debugLog`:t.payload?$.debug(t.message,t.payload):$.debug(t.message);break;case`error`:$.error(`[WorkerProcessor] Worker error:`,t.error),this.onError&&this.onError(Error(t.error));break;case`chunk`:this.chunks.push({data:t.data,position:t.position}),this.totalSize=Math.max(this.totalSize,t.position+t.data.length);break;case`bufferUpdate`:this.onBufferUpdate&&this.onBufferUpdate(t.size,t.formatted);break;case`stateChange`:$.debug(`[WorkerProcessor] State changed:`,t.state),this.isPaused=t.state===`paused`;break;case`fatalError`:this.pendingFatalError=t;break;case`recordingStats`:this.lastRecordingStats=t;break;case`encoderAcceleration`:this.lastEncoderAcceleration=t.acceleration,$.info(`[WorkerProcessor] Encoder acceleration resolved`,{acceleration:t.acceleration});break;default:$.warn(`[WorkerProcessor] Unknown response type:`,t)}},s=e=>{if($.error(`[WorkerProcessor] Worker error event:`,{message:e.message,filename:e.filename,lineno:e.lineno,colno:e.colno,error:e.error}),this.onError){let t=e.message;t||=`Unknown worker error`,this.onError(Error(t))}},c=typeof Worker<`u`,l=!1;if(c&&(l=!0),a&&(l=!0),!l)throw $.error(`[WorkerProcessor] Web Workers are not supported`),Error(`Web Workers are not supported`);let u=L_();this.hasWorkerUrlLease=!0;try{this.worker=A_({createWorker:t,workerUrl:u,onMessage:o,onError:s,logger:$})}catch(e){throw this.releaseWorkerUrlLease(),e}}getWorkerProbeResult(){let e=this.getWorkerOrThrow();return this.workerProbeManager.getProbeResult(e)}async startProcessing(e,t,n){this.getWorkerOrThrow(),this.ensureProcessingInactive(),this.resetProcessingState(n),this.stopAudioWorklet();let r=this.resolveRecordingFormat(t),i=Lt(r,{isLinuxPlatform:this.isLinuxPlatformFn()}),a=this.resolveAudioBitrate(t,r),o=await this.resolveAudioCodecWithCache(t,r,i,a),s=await this.resolveVideoCodecWithCache(t,r,i),c=Gg(e);$.debug(`[WorkerProcessor] Starting processing`,{isScreenCapture:c,fps:t.fps,codec:s,bitrate:t.bitrate});let l=this.buildWorkerTranscodeConfig(t,o,a,s,r),u=e.getVideoTracks(),d=e.getAudioTracks();$.debug(`[WorkerProcessor] Preparing to start processing`,{videoTracksCount:u.length,audioTracksCount:d.length,hasWorker:!!this.worker});let f=this.getVideoInputSelectorDependencies(),p=b_(u,f),m=x_(d,f),h=await this.getWorkerProbeResult(),g=S_(p,h,f),_=w_(f),ee=C_(p);E_(p,f),D_(f),T_(p,m,g.videoStream,f);let v=f.getViewportMetadata(),y;v&&(y={orientationAngle:v.orientationAngle,windowOrientation:v.windowOrientation});let{audioConfig:b,audioStream:x,shouldStartAudioWorklet:S}=await this.prepareAudioPipeline(m,h),te=this.buildOverlayConfigToSend(),C=j_({videoTrack:g.videoTrack,videoStream:g.videoStream,audioStream:x,isMobileDevice:_,videoSettings:ee,viewportMetadata:y,audioConfig:b,workerConfig:l,overlayConfig:te}),ne=N_(g.videoStream,x,g.videoTrack);$.debug(`[WorkerProcessor] Posting message to worker`,{transferablesCount:ne.length,messageType:C.type}),await this.postStartMessage(C,ne,S)}getWorkerOrThrow(){if(!this.worker)throw Error(`Worker not initialized`);return this.worker}ensureProcessingInactive(){if(this.isActive)throw Error(`Processing already active`)}resetProcessingState(e){this.isActive=!0,this.isMuted=!1,this.isPaused=!1,this.chunks=[],this.totalSize=0,e?this.overlayConfig=e:this.overlayConfig=null}resolveRecordingFormat(e){let t=e.format;return t||=`mp4`,t}resolveAudioBitrate(e,t){return e.audioBitrate===void 0?Vt(t):e.audioBitrate}async resolveAudioCodec(e,t,n,r){return await jm({format:t,overrideCodec:e.audioCodec,policy:n,bitrate:r})}async resolveVideoCodec(e,t,n){return await Am({format:t,overrideCodec:e.codec,policy:n,width:e.width,height:e.height,bitrate:e.bitrate})}async resolveAudioCodecWithCache(e,t,n,r){let i=this.buildAudioCodecCacheKey(e,t,n,r),a=V_.get(i);if(a)return a;let o=await this.resolveAudioCodec(e,t,n,r);return K_(V_,i,o),o}async resolveVideoCodecWithCache(e,t,n){let r=this.buildVideoCodecCacheKey(e,t,n),i=H_.get(r);if(i)return i;let a=await this.resolveVideoCodec(e,t,n);return K_(H_,r,a),a}buildAudioCodecCacheKey(e,t,n,r){let i=U_(e.audioCodec),a=U_(n.preferredAudioCodec),o=W_(n.audioCodecFallbackOrder),s=U_(r);return[G_(B_,U_(t)),G_(`audioOverride`,i),G_(`audioBitrate`,s),G_(`policyPreferredAudio`,a),G_(`policyAudioFallback`,o)].join(`|`)}buildVideoCodecCacheKey(e,t,n){let r=U_(e.codec),i=U_(e.width),a=U_(e.height),o=U_(e.bitrate),s=U_(n.preferredVideoCodec),c=W_(n.videoCodecFallbackOrder);return[G_(B_,U_(t)),G_(`videoOverride`,r),G_(`width`,i),G_(`height`,a),G_(`videoBitrate`,o),G_(`policyPreferredVideo`,s),G_(`policyVideoFallback`,c)].join(`|`)}buildWorkerTranscodeConfig(e,t,n,r,i){return{width:e.width,height:e.height,fps:e.fps,bitrate:Kg(e.bitrate),audioCodec:t,audioBitrate:n,codec:r,keyFrameInterval:5,format:i,watermark:e.watermark}}async prepareAudioPipeline(e,t){if(!e)return $.debug(`[WorkerProcessor] Audio pipeline disabled (no track)`),{audioConfig:null,audioStream:null,shouldStartAudioWorklet:!1};if(this.canUseMainThreadVideoProcessorFn()&&t.hasAudioData){let n=this.createAudioStreamFromTrack(e);if(n)return $.debug(`[WorkerProcessor] Audio pipeline selected`,{path:`main-thread-audio-stream`,hasAudioDataInWorker:t.hasAudioData}),{audioConfig:null,audioStream:n,shouldStartAudioWorklet:!1}}let n=await this.prepareAudioConfig(e);if(n)return $.debug(`[WorkerProcessor] Audio pipeline selected`,{path:`audio-worklet-chunks`,sampleRate:n.sampleRate,numberOfChannels:n.numberOfChannels}),{audioConfig:n,audioStream:null,shouldStartAudioWorklet:!0};throw this.createBrowserUnsupportedError()}buildOverlayConfigToSend(){if(this.overlayConfig)return this.overlayConfig}async postStartMessage(e,t,n){let r=this.getWorkerOrThrow(),i=new Promise(e=>{this.readyPromiseResolve=e});try{r.postMessage(e,t),$.debug(`[WorkerProcessor] Message posted successfully`),await i,$.debug(`[WorkerProcessor] Worker confirmed ready`),n&&await this.startAudioWorkletProcessing()}catch(e){throw $.error(`[WorkerProcessor] Failed to post message:`,e),this.readyPromiseResolve=null,this.stopAudioWorklet(),this.worker&&this.isActive&&this.worker.postMessage({type:`stop`}),this.isActive=!1,e}}pause(){this.worker&&this.isActive&&(this.worker.postMessage({type:`pause`}),this.setAudioWorkletPaused(!0))}resume(){this.isWorkerActive()&&this.worker&&(this.worker.postMessage({type:`resume`}),this.setAudioWorkletPaused(!1))}isWorkerActive(){return!!(this.worker&&this.isActive)}toggleMute(){this.isMuted=!this.isMuted,this.onMuteStateChange&&this.onMuteStateChange(this.isMuted),this.isWorkerActive()&&this.worker&&this.worker.postMessage({type:`toggleMute`}),this.setAudioWorkletMuted(this.isMuted)}async switchVideoSource(e){if(!(this.isWorkerActive()&&this.worker))return $.debug(`[WorkerProcessor] Cannot switch source - worker not active`,{hasWorker:!!this.worker,isActive:this.isActive}),Promise.resolve();let t=e.getVideoTracks();if($.debug(`[WorkerProcessor] Switching video source`,{videoTracksCount:t.length}),t.length===0)return $.warn(`[WorkerProcessor] No video tracks in new stream`),Promise.resolve();let n=Gg(e);$.debug(`[WorkerProcessor] Source type detected`,{isScreenCapture:n,targetFps:30}),this.worker.postMessage({type:`updateFps`,fps:30});let r={type:`updateSourceType`,isScreenCapture:n};this.worker.postMessage(r);let i=this.getVideoInputSelectorDependencies(),a=b_(t,i);if(!a)return $.warn(`[WorkerProcessor] Unable to prepare video track`),Promise.resolve();$.debug(`[WorkerProcessor] New video track details`,{trackId:a.id,trackKind:a.kind,trackReadyState:a.readyState});let o=S_(a,await this.getWorkerProbeResult(),i),s=M_(o.videoTrack,o.videoStream),c=N_(o.videoStream,null,o.videoTrack);try{return $.debug(`[WorkerProcessor] Posting switch source message`),this.worker.postMessage(s,c),$.debug(`[WorkerProcessor] Switch source message posted`),new Promise(e=>{setTimeout(()=>{e()},0)})}catch(e){throw $.error(`[WorkerProcessor] Failed to switch source:`,e),e}}finalize(){if(!this.isWorkerActive())throw Error(`Processing not active`);let e=performance.now();return new Promise((t,n)=>{let r=this.worker;if(!r){n(Error(`Worker not initialized`));return}let i=null,a=()=>{i!==null&&(clearTimeout(i),i=null)},o=()=>{r.removeEventListener(`message`,l)},s=!1,c=()=>s?!1:(s=!0,a(),o(),!0),l=r=>{if(s)return;let i=r.data;if(i.type===`fatalError`){this.pendingFatalError=i;return}if(i.type===`recordingStats`){this.lastRecordingStats=i;return}if(i.type===`stateChange`&&i.state===`stopped`){this.handleFinalizeStopped(c,t,n,e);return}i.type===`error`&&this.handleFinalizeError(c,n,i.error,e)};i=setTimeout(()=>{c()&&($.error(`[WorkerProcessor] Finalize timeout reached`,{elapsedSeconds:(performance.now()-e)/z_}),this.resetFinalizeRuntimeState(),n(Error(`Finalize timeout`)))},3e4),r.addEventListener(`message`,l),r.postMessage({type:`stop`})})}handleFinalizeStopped(e,t,n,r){let i=this.lastRecordingStats,a=this.lastEncoderAcceleration;if(this.pendingFatalError!==null){let t=this.pendingFatalError;if(!e())return;this.resetFinalizeRuntimeState(),n(Error(this.buildFatalFinalizeErrorMessage(t,i)));return}e()&&(this.resetFinalizeRuntimeState(),Promise.resolve().then(()=>this.createBlobFromChunks(i,a)).then(e=>{t(e)},e=>{this.rejectFinalizeBlobCreationError(n,e,r)}))}handleFinalizeError(e,t,n,r){e()&&(this.resetFinalizeRuntimeState(),$.error(`[WorkerProcessor] Finalize failed`,{elapsedSeconds:(performance.now()-r)/z_,error:n}),t(Error(n)))}buildFatalFinalizeErrorMessage(e,t){return t===null?`${e.message} [${e.code}]`:`${e.message} [${e.code}] frames=${t.videoFrameCount} errors=${t.totalFrameErrors}`}resetFinalizeRuntimeState(){this.isActive=!1,this.stopAudioWorklet(),this.pendingFatalError=null,this.lastRecordingStats=null,this.lastEncoderAcceleration=null}createBlobFromChunks(e,t){let n=[...this.chunks].sort((e,t)=>e.position-t.position),r=new ArrayBuffer(this.totalSize),i=new Uint8Array(r);for(let e of n)i.set(e.data,e.position);s_(r),c_(r);let a={blob:new Blob([r],{type:`video/mp4`}),totalSize:this.totalSize};return e!==null&&(a.recordingStats={totalFrameErrors:e.totalFrameErrors,totalFramesProcessed:e.totalFramesProcessed,videoFrameCount:e.videoFrameCount}),t!==null&&(a.encoderAcceleration=t),a}rejectFinalizeBlobCreationError(e,t,n){if($.error(`[WorkerProcessor] Finalize failed while creating blob`,{elapsedSeconds:(performance.now()-n)/z_,error:i(t)}),t instanceof Error){e(t);return}e(Error(i(t)))}cancel(){return this.worker&&this.isActive&&this.worker.postMessage({type:`stop`}),this.stopAudioWorklet(),this.isActive=!1,this.isPaused=!1,this.chunks=[],this.totalSize=0,Promise.resolve()}getBufferSize(){return this.totalSize}getMutedState(){return this.isMuted}updateTabVisibility(e,t){if(!(this.isWorkerActive()&&this.worker)){$.warn(`[WorkerProcessor] Cannot update visibility - worker not active`,{isActive:this.isActive,hasWorker:!!this.worker});return}$.debug(`[WorkerProcessor] Sending visibility update to worker`,{isHidden:e,timestamp:t,timestampSeconds:t/z_});let n={type:`updateVisibility`,isHidden:e,timestamp:t};this.worker.postMessage(n)}updateSourceType(e){if(!(this.isWorkerActive()&&this.worker)){$.warn(`[WorkerProcessor] Cannot update source type - worker not active`,{isActive:this.isActive,hasWorker:!!this.worker});return}$.debug(`[WorkerProcessor] Sending source type update to worker`,{isScreenCapture:e});let t={type:`updateSourceType`,isScreenCapture:e};this.worker.postMessage(t)}async startAudioWorkletProcessing(){await this.audioWorkletManager.startProcessing()}stopAudioWorklet(){this.audioWorkletManager.stop()}setAudioWorkletMuted(e){this.audioWorkletManager.setMuted(e)}setAudioWorkletPaused(e){this.audioWorkletManager.setPaused(e)}prepareAudioConfig(e){return this.audioWorkletManager.prepareAudioConfig(e)}createAudioStreamFromTrack(e){return!e||typeof MediaStreamTrackProcessor>`u`?null:new MediaStreamTrackProcessor({track:e}).readable}createBrowserUnsupportedError(){return kt({resolutionStage:`feature-preflight`})}getVideoInputSelectorDependencies(){return{stopCurrentVideoTrack:()=>this.stopCurrentVideoTrack(),cloneVideoTrack:e=>this.cloneVideoTrack(e),cloneAudioTrack:e=>this.cloneAudioTrack(e),setCurrentVideoTrack:e=>{this.currentVideoTrack=e},canUseMainThreadVideoProcessor:()=>this.canUseMainThreadVideoProcessorFn(),createVideoStreamFromTrack:e=>this.createVideoStreamFromTrackFn(e),createBrowserUnsupportedError:()=>this.createBrowserUnsupportedError(),getViewportMetadata:()=>{if(typeof window>`u`)return null;let e=window.screen,t,n,r,i;return e&&(i=e.orientation),i?.type&&(t=i.type),i&&typeof i.angle==`number`&&(n=i.angle),typeof window.orientation==`number`&&(r=window.orientation),{innerWidth:window.innerWidth,innerHeight:window.innerHeight,orientation:t,orientationAngle:n,windowOrientation:r}},logger:{debug:(e,t)=>$.debug(e,t),warn:(e,t)=>$.warn(e,t)},isMobileDevice:()=>qt()}}isPausedState(){return this.isPaused}getClonedAudioTrack(){return this.audioTrackClone}getAudioStreamForAnalysis(){return this.audioTrackClone?new MediaStream([this.audioTrackClone]):null}setOnBufferUpdate(e){this.onBufferUpdate=e}setOnError(e){this.onError=e}setOnMuteStateChange(e){this.onMuteStateChange=e}cloneVideoTrack(e){if($.debug(`[WorkerProcessor] Original video track:`,{id:e.id,kind:e.kind,readyState:e.readyState,hasClone:typeof e.clone==`function`}),typeof e.clone==`function`)try{let t=e.clone();return $.debug(`[WorkerProcessor] Video track cloned successfully:`,{id:t.id,kind:t.kind,readyState:t.readyState}),t}catch(e){$.error(`[WorkerProcessor] Failed to clone video track:`,e);let t=i(e);throw Error(`Failed to clone video track: ${t}`)}return $.warn(`[WorkerProcessor] Video track clone() not available, using original`),e}cloneAudioTrack(e){if($.debug(`[WorkerProcessor] Original audio track:`,{id:e.id,kind:e.kind,readyState:e.readyState,hasClone:typeof e.clone==`function`}),typeof e.clone==`function`)try{let t=e.clone();return this.audioTrackClone=t,$.debug(`[WorkerProcessor] Audio track cloned successfully:`,{id:t.id,kind:t.kind,readyState:t.readyState}),t}catch(e){$.error(`[WorkerProcessor] Failed to clone audio track:`,e);let t=i(e);throw Error(`Failed to clone audio track: ${t}`)}return $.warn(`[WorkerProcessor] Audio track clone() not available, using original`),this.audioTrackClone=e,e}stopCurrentVideoTrack(){this.currentVideoTrack&&this.currentVideoTrack.readyState===`live`&&this.currentVideoTrack.stop(),this.currentVideoTrack=null}cleanup(){this.worker&&=(this.worker.terminate(),null),this.releaseWorkerUrlLease(),this.stopAudioWorklet(),this.isActive=!1,this.isPaused=!1,this.chunks=[],this.totalSize=0}releaseWorkerUrlLease(){this.hasWorkerUrlLease&&=(R_(),!1)}},J_=class{constructor(e={}){this.currentVideoStream=null;let t=()=>new q_;e.workerProcessorFactory&&(t=e.workerProcessorFactory);try{this.workerProcessor=t(),$.debug(`[StreamProcessor] Using worker-based processing`)}catch(e){let t=i(e);throw Error(`Failed to initialize worker: ${t}`)}}async startProcessing(e,t,n){this.workerProcessor.setOnBufferUpdate((e,t)=>{$.debug(`[StreamProcessor] Buffer update:`,{size:e,formatted:t}),this.onBufferUpdate&&this.onBufferUpdate(e,t)}),this.workerProcessor.setOnError(e=>{$.error(`[StreamProcessor] Worker error:`,e),this.onError&&this.onError(e)}),this.currentVideoStream=e,await this.workerProcessor.startProcessing(e,t,n)}updateTabVisibility(e,t){this.workerProcessor.updateTabVisibility(e,t)}updateSourceType(e){this.workerProcessor.updateSourceType(e)}pause(){this.workerProcessor.pause()}resume(){this.workerProcessor.resume()}isPausedState(){return this.workerProcessor.isPausedState()}async finalize(){return $.debug(`[StreamProcessor] finalize called`),await this.workerProcessor.finalize()}toggleMute(){this.workerProcessor.toggleMute()}isMutedState(){return this.workerProcessor.getMutedState()}getClonedAudioTrack(){return this.workerProcessor.getClonedAudioTrack()}getAudioStreamForAnalysis(){return this.workerProcessor.getAudioStreamForAnalysis()}async switchVideoSource(e){await this.workerProcessor.switchVideoSource(e),this.currentVideoStream=e,this.onSourceChange&&this.onSourceChange(e)}getCurrentVideoSource(){return this.currentVideoStream}getBufferSize(){return this.workerProcessor.getBufferSize()}setOnMuteStateChange(e){this.workerProcessor.setOnMuteStateChange(e)}setOnSourceChange(e){this.onSourceChange=e}setOnBufferUpdate(e){this.onBufferUpdate=e}setOnError(e){this.onError=e}async cancel(){await this.workerProcessor.cancel(),this.workerProcessor.cleanup(),this.currentVideoStream=null}};let Y_=1e3,X_=`recording`,Z_=`idle`;var Q_=class{constructor(e,t){this.recordingState=Z_,this.countdownDuration=5e3,this.countdownRemaining=0,this.countdownTimeoutId=null,this.countdownIntervalId=null,this.countdownStartTime=null,this.isPaused=!1,this.maxRecordingTime=null,this.maxTimeTimer=null,this.recordingStartTime=null,this.maxTimeRemaining=null,this.recordingSeconds=0,this.recordingIntervalId=null,this.pauseStartTime=null,this.totalPausedTime=0,this.streamProcessor=null,this.originalCameraStream=null,this.enableTabVisibilityOverlay=!1,this.streamManager=e,this.callbacks=t}setCountdownDuration(e){this.countdownDuration=e}setMaxRecordingTime(e){this.maxRecordingTime=e}setTabVisibilityOverlayConfig(e,t){this.enableTabVisibilityOverlay=e,this.tabVisibilityOverlayText=t}getRecordingState(){return this.recordingState}isPausedState(){return this.isPaused}getRecordingSeconds(){return this.recordingSeconds}getStreamProcessor(){return this.streamProcessor}updateSourceType(e){this.recordingState!==X_||!this.streamProcessor||this.streamProcessor.updateSourceType(e)}setOriginalCameraStream(e){this.originalCameraStream=e}getOriginalCameraStream(){return this.originalCameraStream}prewarmStreamProcessor(){this.getOrCreateStreamProcessor()}async startRecording(){try{this.callbacks.onClearUploadStatus(),this.countdownDuration>0?this.startCountdown():await this.doStartRecording()}catch(e){this.handleError(e),this.recordingState=Z_,this.cancelCountdown()}}startCountdown(){this.recordingState=`countdown`,this.countdownRemaining=Math.ceil(this.countdownDuration/Y_),this.countdownStartTime=Date.now(),this.callbacks.onCountdownUpdate(this.recordingState,this.countdownRemaining),this.countdownIntervalId=window.setInterval(()=>{if(!this.countdownStartTime)return;let e=Date.now()-this.countdownStartTime;this.countdownRemaining=Math.max(0,Math.ceil((this.countdownDuration-e)/Y_)),this.callbacks.onCountdownUpdate(this.recordingState,this.countdownRemaining)},100),this.countdownTimeoutId=window.setTimeout(async()=>{await this.doStartRecording().catch(()=>{})},this.countdownDuration)}async doStartRecording(){$.debug(`[RecordingManager] doStartRecording called`),this.cancelCountdown(),this.resetRecordingState();let e=this.streamManager.getStream();if($.debug(`[RecordingManager] Current stream:`,{hasStream:!!e,audioTracks:e?.getAudioTracks().length||0,videoTracks:e?.getVideoTracks().length||0}),!e){$.warn(`[RecordingManager] No stream available`),this.handleError(Error(`No stream available for recording`)),this.recordingState=Z_,this.callbacks.onStateChange(this.recordingState);return}this.originalCameraStream=e,$.debug(`[RecordingManager] Ensuring stream processor`);let t=this.getOrCreateStreamProcessor();$.debug(`[RecordingManager] StreamProcessor ready:`,!!t);let n=null,r=await this.callbacks.onGetConfig().then(e=>(n=e,null)).catch(e=>e);if(r){this.handleError(r),this.recordingState=Z_,this.callbacks.onStateChange(this.recordingState);return}if(!n){this.handleError(Error(`Failed to get recording config`)),this.recordingState=Z_,this.callbacks.onStateChange(this.recordingState);return}$.debug(`[RecordingManager] Starting recording with stream manager`);let i=await this.streamManager.startRecording(t,n,this.enableTabVisibilityOverlay,this.tabVisibilityOverlayText).then(()=>($.info(`[RecordingManager] Recording started successfully`),null)).catch(e=>($.error(`[RecordingManager] Error starting recording:`,e),e));if(i){this.handleError(i),this.recordingState=Z_,this.callbacks.onStateChange(this.recordingState);return}this.recordingState=X_,this.callbacks.onStateChange(this.recordingState),this.startRecordingTimer(),this.recordingStartTime=Date.now(),this.maxRecordingTime&&this.maxRecordingTime>0&&(this.maxTimeRemaining=this.maxRecordingTime,this.startMaxTimeTimer())}async stopRecording(){$.debug(`[RecordingManager] stopRecording called`);try{this.cancelCountdown(),this.clearTimer(this.recordingIntervalId,clearInterval),this.recordingIntervalId=null,this.clearTimer(this.maxTimeTimer,clearTimeout),this.maxTimeTimer=null,this.resetPauseState(),this.callbacks.onStopAudioTracking(),$.debug(`[RecordingManager] Stopping recording in stream manager`);let e=await this.streamManager.stopRecording(),t=e.blob;$.info(`[RecordingManager] Recording stopped, blob size:`,t.size),this.recordingState=Z_,this.callbacks.onStateChange(this.recordingState),this.recordingSeconds=0,this.streamProcessor=null,this.callbacks.onRecordingComplete(t);let n={};return e.recordingStats!==void 0&&(n.videoFrameCount=e.recordingStats.videoFrameCount,n.totalFrameErrors=e.recordingStats.totalFrameErrors,n.totalFramesProcessed=e.recordingStats.totalFramesProcessed),e.encoderAcceleration!==void 0&&(n.encoderAcceleration=e.encoderAcceleration),{blob:t,telemetryProperties:n}}catch(e){throw this.handleError(e),this.recordingState=Z_,this.callbacks.onStateChange(this.recordingState),e}}pauseRecording(){if(!(this.recordingState!==X_||this.isPaused)&&(this.streamManager.pauseRecording(),this.isPaused=!0,this.clearTimer(this.recordingIntervalId,clearInterval),this.recordingIntervalId=null,this.pauseStartTime=Date.now(),this.maxTimeTimer!==null&&this.recordingStartTime!==null&&this.maxRecordingTime!==null)){let e=Date.now()-this.recordingStartTime-this.totalPausedTime;this.maxTimeRemaining=Math.max(0,this.maxRecordingTime-e),this.clearTimer(this.maxTimeTimer,clearTimeout),this.maxTimeTimer=null}}resumeRecording(){this.recordingState!==X_||!this.isPaused||(this.streamManager.resumeRecording(),this.isPaused=!1,this.updatePausedDuration(),this.startRecordingTimer(),this.maxTimeRemaining!==null&&this.maxTimeRemaining>0&&this.startMaxTimeTimer())}cancelCountdown(){this.clearTimer(this.countdownTimeoutId,clearTimeout),this.countdownTimeoutId=null,this.clearTimer(this.countdownIntervalId,clearInterval),this.countdownIntervalId=null,this.recordingState=Z_,this.countdownRemaining=0,this.countdownStartTime=null,this.callbacks.onCountdownUpdate(this.recordingState,this.countdownRemaining)}cleanup(){this.cancelCountdown(),this.clearTimer(this.recordingIntervalId,clearInterval),this.recordingIntervalId=null,this.clearTimer(this.maxTimeTimer,clearTimeout),this.maxTimeTimer=null,this.streamProcessor&&=(this.streamProcessor.cancel().catch(()=>void 0),null)}resetRecordingState(){this.isPaused=!1,this.recordingSeconds=0,this.totalPausedTime=0,this.pauseStartTime=null,this.recordingStartTime=null,this.maxTimeRemaining=null}resetPauseState(){this.isPaused=!1,this.pauseStartTime=null,this.totalPausedTime=0}getOrCreateStreamProcessor(){if(this.streamProcessor)return this.streamProcessor;let e=new J_;return this.streamProcessor=e,e}updatePausedDuration(){if(this.pauseStartTime===null)throw Error(`Pause start time not set`);let e=Date.now()-this.pauseStartTime;this.totalPausedTime+=e,this.pauseStartTime=null}startRecordingTimer(){if(this.recordingIntervalId!==null)return;let e=lg(this.recordingSeconds);this.callbacks.onTimerUpdate(e),this.recordingIntervalId=window.setInterval(()=>{this.recordingSeconds+=1;let e=lg(this.recordingSeconds);this.callbacks.onTimerUpdate(e)},1e3)}startMaxTimeTimer(){this.maxTimeRemaining===null||this.maxTimeRemaining<=0||(this.clearTimer(this.maxTimeTimer,clearTimeout),this.maxTimeTimer=window.setTimeout(async()=>{this.recordingState===X_&&!this.isPaused&&await this.stopRecording()},this.maxTimeRemaining))}clearTimer(e,t){e!==null&&t(e)}handleError(e){let t=e instanceof Error?e:Error(i(e));this.callbacks.onError(t)}},$_=class{constructor(e){this.client=null,this.createTelemetryClient=e.createTelemetryClient}initialize(e,t){typeof e==`string`&&e.length>0&&typeof t==`string`&&t.length>0&&(this.client=this.createTelemetryClient(e,t))}sendEvent(e,t,n){if(!this.client)return;let r={name:e};t&&(r={...r,properties:t}),n&&(r={...r,error:n}),this.client.triggerTelemetryEvent(r)}async executeAction(e){e.requestedEvent&&this.sendEvent(e.requestedEvent,e.properties);let t=null;if(await e.action().catch(e=>{t=e}),t)throw this.sendEvent(e.failedEvent,e.properties,t),t;this.sendEvent(e.succeededEvent,e.properties)}async executeActionWithResult(e){e.requestedEvent&&this.sendEvent(e.requestedEvent,e.properties);let t=null,n=null;if(await e.action().then(e=>{n=e}).catch(e=>{t=e}),t)throw this.sendEvent(e.failedEvent,e.properties,t),t;if(n===null)throw Error(`Telemetry action failed to return result`);let r=this.resolveResultTelemetryProperties(n,e.getPropertiesFromResult),i=this.mergeTelemetryProperties(e.properties,r);return this.sendEvent(e.succeededEvent,i),n}resolveResultTelemetryProperties(e,t){if(t!==void 0)return t(e)}mergeTelemetryProperties(e,t){if(!(e===void 0&&t===void 0))return e===void 0?t:t===void 0?e:{...e,...t}}},ev=class{constructor(){this.metadataById=new Map}getMetadata(e){return this.metadataById.get(e)}setMetadata(e,t){let n=new Map(this.metadataById);n.set(e,t),this.metadataById=n}clearMetadata(e){let t=new Map(this.metadataById);t.delete(e),this.metadataById=t}};let tv=`[RecorderController]`;var nv=class{constructor(e={}){this.uploadService=null,this.uploadQueueManager=null,this.isInitialized=!1,this.isDemo=!1,this.isDestroyed=!1,this.enableTabVisibilityOverlay=!1,this.recordingWarmupTimeoutId=null,this.callbacks=e,this.streamManager=new gg,this.configManager=new on,this.storageManager=new xh,this.deviceManager=new sn(this.streamManager,e.device),this.audioLevelAnalyzer=new o,this.uploadService=new kg,this.uploadCallbacks=Vg(e),this.telemetryManager=new $_({createTelemetryClient:Dg}),this.uploadMetadataManager=new ev;let t=Ug(e,{stopAudioTracking:()=>this.audioLevelAnalyzer.stopTracking(),getConfig:()=>Promise.resolve(this.configManager.getConfigForRecording())});this.recordingManager=new Q_(this.streamManager,t);let n=Wg(e,{isRecording:()=>this.isRecording(),updateSourceType:e=>{this.recordingManager.updateSourceType(e)},getSelectedCameraDeviceId:()=>this.deviceManager.getSelectedCameraDeviceId(),getSelectedMicDeviceId:()=>this.deviceManager.getSelectedMicDeviceId()});this.sourceSwitchManager=new $h(this.streamManager,n);let r=e.stream;r&&(this.streamManager.on(`streamstart`,({stream:e})=>{$.debug(`${tv} streamstart event received, calling callback`),r.onStreamStart&&r.onStreamStart(e)}),this.streamManager.on(`streamstop`,()=>{$.debug(`${tv} streamstop event received, calling callback`),r.onStreamStop&&r.onStreamStop()}),this.streamManager.on(`error`,({error:e})=>{$.error(`${tv} stream error event received, calling callback`,e),this.telemetryManager.sendEvent(`stream.error`,{sourceType:this.getCurrentSourceType()},e),r.onError&&r.onError(e)}))}async initialize(e){if(this.isInitialized)return;await this.validateRecorderSupport();let t=!1;typeof e.demo==`boolean`&&(t=e.demo),this.isDemo=t;let n=null;typeof e.apiKey==`string`&&e.apiKey.length>0&&(n=e.apiKey);let r=null;typeof e.backendUrl==`string`&&e.backendUrl.length>0&&(r=e.backendUrl),this.telemetryManager.initialize(n,r),await this.telemetryManager.executeAction({requestedEvent:`sdk.init.started`,succeededEvent:`sdk.init.succeeded`,failedEvent:`sdk.init.failed`,action:async()=>{await this.initializeConfig(n,r),this.applyRecordingConfig(e),await this.initializeStorage(),this.isInitialized=!0,this.scheduleRecordingWarmup()}})}async startStream(){let e=this.getCurrentSourceType();await this.telemetryManager.executeAction({succeededEvent:`preview.start.succeeded`,failedEvent:`preview.start.failed`,action:async()=>{$.debug(`${tv} startStream called`),await this.streamManager.startStream(),this.ignorePromiseRejection(this.ensureConfigReady()),this.recordingManager.prewarmStreamProcessor(),$.debug(`${tv} startStream completed`)},properties:{sourceType:e}})}async stopStream(){await this.streamManager.stopStream()}switchVideoDevice(e){return this.streamManager.switchVideoDevice(e)}switchAudioDevice(e){return this.streamManager.switchAudioDevice(e)}async startRecording(){let e=this.getCurrentSourceType();await this.telemetryManager.executeAction({requestedEvent:`recording.start.requested`,succeededEvent:`recording.start.succeeded`,failedEvent:`recording.start.failed`,action:async()=>{await this.ensureConfigReady(),await this.recordingManager.startRecording()},properties:{sourceType:e}})}async stopRecording(){let e=this.getCurrentSourceType();return(await this.telemetryManager.executeActionWithResult({requestedEvent:`recording.stop.requested`,succeededEvent:`recording.stop.succeeded`,failedEvent:`recording.stop.failed`,action:async()=>{let e=await this.recordingManager.stopRecording();return await this.sourceSwitchManager.handleRecordingStop().catch(()=>{throw Error(`Source switch cleanup failed`)}),this.streamManager.stopStream(),e},properties:{sourceType:e},getPropertiesFromResult:e=>e.telemetryProperties})).blob}getTabVisibilityOverlayConfig(){return{enabled:this.enableTabVisibilityOverlay,text:this.tabVisibilityOverlayText}}pauseRecording(){this.recordingManager.pauseRecording()}resumeRecording(){this.recordingManager.resumeRecording()}async switchSource(e){await this.telemetryManager.executeAction({requestedEvent:`source.switch.requested`,succeededEvent:`source.switch.succeeded`,failedEvent:`source.switch.failed`,action:async()=>{await this.sourceSwitchManager.toggleSource()},properties:{sourceType:e}})}setCameraDevice(e){this.deviceManager.setCameraDevice(e)}setMicDevice(e){this.deviceManager.setMicDevice(e)}getAvailableDevices(){return this.deviceManager.getAvailableDevices()}muteAudio(){this.streamManager.muteAudio()}unmuteAudio(){this.streamManager.unmuteAudio()}toggleMute(){this.streamManager.toggleMute()}getIsMuted(){return this.streamManager.isMuted()}startAudioLevelTracking(e,t){if(!t)throw Error(`Audio level callbacks are required`);return this.audioLevelAnalyzer.startTracking(e,t,()=>this.streamManager.isMuted()),Promise.resolve()}stopAudioLevelTracking(){this.audioLevelAnalyzer.stopTracking()}getAudioLevel(){return this.audioLevelAnalyzer.getAudioLevel()}async uploadVideo(e,t,n,r){if(!this.uploadQueueManager)throw Error(`Upload queue manager not initialized`);this.uploadCallbacks.onClearStatus();let i=await bm(e),a=`recording-${Date.now()}.mp4`,o=this.getCurrentSourceType(),s;Object.keys(r).length>0&&(s=r),this.telemetryManager.sendEvent(`upload.started`,{filename:a,duration:i,sourceType:o});let c=await this.uploadQueueManager.queueUpload({blob:e,apiKey:t,backendUrl:n,filename:a,duration:i,metadata:void 0,userMetadata:s});this.uploadMetadataManager.setMetadata(c,{filename:a,duration:i,sourceType:o})}getStream(){return this.streamManager.getStream()}isConfigReady(){return this.configManager.isConfigReady()}ensureConfigReady(){return this.isDemo||this.configManager.isConfigReady()?Promise.resolve():this.configManager.fetchConfig().then(()=>void 0).catch(()=>void 0)}cleanup(){this.isDestroyed=!0,this.recordingWarmupTimeoutId!==null&&(clearTimeout(this.recordingWarmupTimeoutId),this.recordingWarmupTimeoutId=null),this.storageManager.destroy(),this.recordingManager.cleanup(),this.audioLevelAnalyzer.stopTracking(),this.sourceSwitchManager.cleanup()}getRecordingState(){return this.recordingManager.getRecordingState()}isPaused(){return this.recordingManager.isPausedState()}getCurrentSourceType(){return this.sourceSwitchManager.getCurrentSourceType()}getOriginalCameraStream(){return this.sourceSwitchManager.getOriginalCameraStream()}getStreamManager(){return this.streamManager}getAudioStreamForAnalysis(){return this.streamManager.getAudioStreamForAnalysis()}getDeviceManager(){return this.deviceManager}getConfig(){return this.configManager.getConfig()}getUploadService(){return this.uploadService}isRecording(){return this.streamManager.isRecording()}isActive(){return this.streamManager.isActive()}async initializeConfig(e,t){let n=!0;e===null&&(n=!1),t===null&&(n=!1),n&&e!==null&&t!==null&&await this.configManager.initialize(e,t)}applyRecordingConfig(e){e.countdownDuration!==void 0&&this.recordingManager.setCountdownDuration(e.countdownDuration),e.maxRecordingTime!==void 0&&this.recordingManager.setMaxRecordingTime(e.maxRecordingTime),e.enableTabVisibilityOverlay!==void 0&&(this.enableTabVisibilityOverlay=e.enableTabVisibilityOverlay),e.tabVisibilityOverlayText!==void 0&&(this.tabVisibilityOverlayText=e.tabVisibilityOverlayText),this.recordingManager.setTabVisibilityOverlayConfig(this.enableTabVisibilityOverlay,this.tabVisibilityOverlayText)}async initializeStorage(){let e=Hg(this.callbacks);await this.storageManager.initialize(e);let t=this.storageManager.getStorageService();t&&this.uploadService&&(this.uploadQueueManager=new Og(t,this.uploadService),this.uploadQueueManager.setCallbacks({onUploadProgress:(e,t)=>{this.uploadCallbacks.onProgress(t)},onUploadComplete:(e,t)=>{this.uploadCallbacks.onSuccess(t);let n=this.uploadMetadataManager.getMetadata(e);n&&(this.telemetryManager.sendEvent(`upload.succeeded`,{filename:n.filename,duration:n.duration,sourceType:n.sourceType,recordingId:t.id}),this.uploadMetadataManager.clearMetadata(e))},onUploadError:(e,t)=>{this.uploadCallbacks.onError(t);let n=this.uploadMetadataManager.getMetadata(e);n&&(this.telemetryManager.sendEvent(`upload.failed`,{filename:n.filename,duration:n.duration,sourceType:n.sourceType},t),this.uploadMetadataManager.clearMetadata(e))}}))}async validateRecorderSupport(){At();let e=await dh({requiresAudio:!1,requiresWatermark:!1});if(!e.isSupported)throw kt({missingCapabilities:e.missing,resolutionStage:`feature-preflight`})}scheduleRecordingWarmup(){this.recordingWarmupTimeoutId!==null&&(clearTimeout(this.recordingWarmupTimeoutId),this.recordingWarmupTimeoutId=null),!this.isDestroyed&&(this.recordingWarmupTimeoutId=setTimeout(()=>{this.recordingWarmupTimeoutId=null,!this.isDestroyed&&(this.ignorePromiseRejection(this.ensureConfigReady()),this.ignorePromiseRejection(Promise.resolve().then(()=>{this.recordingManager.prewarmStreamProcessor()})))},0))}ignorePromiseRejection(e){e.catch(()=>void 0)}};let rv=/<a\s[^>]*href="(?<href>[^"]+)"[^>]*>(?<text>[^<]+)<\/a>/,iv=/\starget=["'](?<target>[^"']+)["']/,av=/^[a-zA-Z][a-zA-Z\d+\-.]*:/,ov=`{version}`;function sv(e,t){return e?e.toLowerCase().includes(t):!1}function cv(e){let t=e.trim();if(!t)return null;let n=t.toLowerCase();return!av.test(n)||n.startsWith(`http:`)||n.startsWith(`https:`)?t:null}function lv(e,t,n,r){return e===`browser.unsupported`?r.browserUnsupportedDynamic?dv(r.browserUnsupportedDynamic,t,n):sv(t,`safari`)?r.browserUnsupportedSafari:sv(t,`firefox`)?r.browserUnsupportedFirefox:r.browserUnsupported:r.browserUnsupported}function uv(e,t){return e===`camera.in-use`?t.cameraInUse:e===`camera.not-found`?t.cameraNotFound:e===`camera.permission-denied`?t.cameraPermissionDenied:t.failedToStartCamera}function dv(e,t,n){let r=`This browser`;t&&t.trim().length>0&&(r=t);let i=e.replace(`{browser}`,r);return n&&n.trim().length>0&&n?(i=i.replace(ov,n),i):(i=i.replace(` ({version})`,``),i=i.replace(ov,``),i)}function fv(e){let t=rv.exec(e);if(!t?.groups)return{prefix:e,linkText:null,linkHref:null,linkTarget:null,suffix:``};let n=t.index,r=n+t[0].length,i=e.slice(0,n),a=e.slice(r),o=cv(t.groups.href);if(!o)return{prefix:i+t.groups.text+a,linkText:null,linkHref:null,linkTarget:null,suffix:``};let s=iv.exec(t[0])?.groups?.target??null;return{prefix:i,linkText:t.groups.text,linkHref:o,linkTarget:s,suffix:a}}function pv(){let e=Ot(),t=null;e.name.length>0&&(t=e.name);let n=null;return e.version.length>0&&(n=e.version),{browserName:t,browserVersion:n}}function mv(e){let t=t=>{if(!(`code`in t))return;let n=t;if(n.code!==`browser.unsupported`){n.code?.startsWith(`camera.`)&&e.updateState({errorCode:n.code,canRetry:!0,browserName:null,browserVersion:null});return}let r=pv(),i=r.browserName;n.browserName&&n.browserName.length>0&&(i=n.browserName);let a=r.browserVersion;n.browserVersion&&n.browserVersion.length>0&&(a=n.browserVersion),e.updateState({errorCode:`browser.unsupported`,canRetry:!1,browserName:i,browserVersion:a})};return{recording:{onStateChange:t=>{e.updateState({recordingState:t}),t===`idle`&&(e.isProcessingBlob=!1)},onCountdownUpdate:(t,n)=>{e.updateState({recordingState:t,countdown:n})},onTimerUpdate:t=>{e.updateState({timer:t})},onError:n=>{t(n),e.updateState({error:i(n)})},onRecordingComplete:t=>{e.updateState({countdown:null}),e.processRecordingBlob(t).catch(t=>{e.updateState({error:i(t)})})},onClearUploadStatus:()=>{e.updateState({uploadProgress:null})},onStopAudioTracking:()=>{},onGetConfig:()=>{if(!e.controller)throw Error(`Controller not initialized`);return e.isDemo?Promise.resolve(Kt(`mp4`)):e.controller.getConfig()}},sourceSwitch:{onSourceChange:e=>Promise.resolve(),onPreviewUpdate:t=>(e.updateState({stream:t}),Promise.resolve()),onError:n=>{t(n),e.updateState({error:i(n)})},onTransitionStart:t=>{e.updateState({transitionMessage:t})},onTransitionEnd:()=>{e.updateState({transitionMessage:null})}},storage:{onUploadProgress:()=>{},onUploadComplete:()=>{},onUploadError:()=>{}},onStorageCleanupError:t=>{e.updateState({error:t})}}}function hv(e,t){let n=(e=>e===``||e===`default`?null:e)(t);return e.setCameraDevice(n),e.switchVideoDevice(n)}function gv(e,t){let n=(e=>e===``||e===`default`?null:e)(t);return e.setMicDevice(n),e.switchAudioDevice(n)}async function _v(e,t=`camera`){e.isActive()||await e.startStream(),t!==e.getCurrentSourceType()&&await e.switchSource(t),await e.startRecording()}async function vv(e,t,n,r){return await e.stopRecording()}function yv(e){e.pauseRecording()}function bv(e){e.resumeRecording()}async function xv(e,t){await e.switchSource(t)}let Sv=`camera`,Cv=`screen`,wv=`recording`,Tv=`browser.unsupported`,Ev=[.8,1.2,.9];function Dv(e,t){let{uploadProgress:n,uploadingLabel:r}=e,{overlay:i,fill:a,text:o}=t;if(!i)return;if(n===null){i.style.display=`none`;return}i.style.display=`block`;let s=Math.round(n*100);a&&(a.style.width=`${s}%`),o&&(o.textContent=`${r} ${s}%`)}function Ov(e,t){let{transitionMessage:n}=e,{overlay:r,message:i}=t;if(r){if(!n){r.classList.remove(`vidtreo-active`);return}r.classList.add(`vidtreo-active`),i&&(i.textContent=n)}}function kv(e,t){e.textContent=``;let n=document.createTextNode(t.prefix);if(e.append(n),t.linkText&&t.linkHref){let n=document.createElement(`a`),r=t.linkTarget;n.href=t.linkHref,r&&(n.target=r),r===`_blank`&&(n.rel=`noopener noreferrer`),n.textContent=t.linkText,e.append(n)}let r=document.createTextNode(t.suffix);e.append(r)}function Av(e){let{stream:t,transitionMessage:n,isVideoLoaded:r}=e;return{showPreviewSkeleton:!!t&&!r&&!n,showVideoPreview:!!t}}function jv(e,t){let{previewSkeleton:n,videoPreview:r}=t;n&&(e.showPreviewSkeleton?n.style.display=`block`:n.style.display=`none`),r&&(e.showVideoPreview?r.style.display=`block`:r.style.display=`none`)}function Mv(e,t,n){let{videoPreview:r}=t,{onVideoLoaded:a,onError:o,startAudioAnalysis:s,stopAudioAnalysis:c}=n;if(r){if(!e){r.srcObject=null,c();return}r.srcObject=e,r.onloadeddata=()=>{a()},r.play().catch(e=>o(i(e))),s(e)}}function Nv(e){return{startCameraArea:e.querySelector(`#startCameraArea`),startCameraButton:e.querySelector(`#startCameraButton`),cameraIcon:e.querySelector(`#startCameraArea .vidtreo-camera-icon`),cameraText:e.querySelector(`#startCameraArea .vidtreo-camera-text`),cameraHint:e.querySelector(`#startCameraArea .vidtreo-camera-hint`),previewSkeleton:e.querySelector(`#previewSkeleton`),previewSkeletonText:e.querySelector(`#previewSkeleton .vidtreo-skeleton-text`),videoPreview:e.querySelector(`#videoPreview`),countdownOverlay:e.querySelector(`#countdownOverlay`),countdownNumber:e.querySelector(`#countdownNumber`),recordingTimerRow:e.querySelector(`#recordingTimerRow`),recordingTimer:e.querySelector(`#recordingTimer`),recIndicatorTop:e.querySelector(`#recIndicatorTop`),audioLevelBars:e.querySelector(`#audioLevelBars`)}}function Pv(e,t,n,r,i){if(e.stream)return{shouldShow:!1,iconClassName:``,browserErrorContent:null,textContent:null,hintText:null,retryButtonLabel:null};let a=!1;e.errorCode?.startsWith(`camera.`)&&(a=!0);let o=e.errorCode===Tv,s=!0;(o||a)&&(s=!1);let c=`ph-fill ph-camera`;(o||a)&&(c=`ph-fill ph-warning-circle`);let l=null,u=null;o&&(l=fv(n)),a&&(u=r),s&&(u=t.initializingCamera);let d=null;s&&(d=t.grantPermissions);let f=null;return a&&e.errorCode!==`camera.permission-denied`&&(f=i),{shouldShow:!0,iconClassName:c,browserErrorContent:l,textContent:u,hintText:d,retryButtonLabel:f}}function Fv(e,t){let n=!1;return e&&(n=!0),{shouldShow:n,text:t.switchingDevice}}function Iv(e,t,n){let r=!1;return e===`countdown`&&t!==null&&(r=!0),{shouldShow:r,countdown:t,text:n.recordingStartsIn}}function Lv(e,t){return{shouldShow:e,text:t.rec}}function Rv(e,t){return{shouldShow:e,timer:t}}function zv(e){return{shouldShow:e}}function Bv(e,t){let{state:n,isVideoLoaded:r,isRecording:i,translations:a}=e;Vv(Pv(n,a,lv(n.errorCode,n.browserName,n.browserVersion,{browserUnsupported:a.browserUnsupported,browserUnsupportedDynamic:a.browserUnsupportedDynamic,browserUnsupportedSafari:a.browserUnsupportedSafari,browserUnsupportedFirefox:a.browserUnsupportedFirefox}),uv(n.errorCode??``,{cameraInUse:a.cameraInUse,cameraNotFound:a.cameraNotFound,cameraPermissionDenied:a.cameraPermissionDenied,failedToStartCamera:a.failedToStartCamera}),a.retryCamera),t,e.onRetryCamera),Hv(Fv(n.transitionMessage,a),t),jv(Av({stream:n.stream,transitionMessage:n.transitionMessage,isVideoLoaded:r}),{previewSkeleton:t.previewSkeleton,videoPreview:t.videoPreview}),Uv(Iv(n.recordingState,n.countdown,a),t),Wv(Lv(i,a),t),Gv(Rv(i,n.timer),t),Kv(zv(i),t)}function Vv(e,t,n){let{startCameraArea:r,startCameraButton:i,cameraIcon:a,cameraText:o,cameraHint:s}=t;if(r){if(!e.shouldShow){r.style.display=`none`;return}r.style.display=`block`,a&&(a.innerHTML=`<i class="${e.iconClassName}" style="font-size: 48px;"></i>`),o&&(e.browserErrorContent&&kv(o,e.browserErrorContent),e.textContent&&(o.textContent=e.textContent)),s&&(e.hintText?(s.textContent=e.hintText,s.style.display=`block`):s.style.display=`none`),i&&(e.retryButtonLabel?(i.textContent=e.retryButtonLabel,i.hidden=!1,i.className=`vidtreo-error-retry`,i.onclick=e=>{e.preventDefault(),e.stopPropagation(),n&&n()}):(i.hidden=!0,i.onclick=null))}}function Hv(e,t){let{previewSkeleton:n,previewSkeletonText:r}=t;n&&(e.shouldShow?n.style.display=`block`:n.style.display=`none`,r&&(r.textContent=e.text))}function Uv(e,t){let{countdownOverlay:n,countdownNumber:r}=t;n&&(e.shouldShow?n.classList.add(`vidtreo-active`):n.classList.remove(`vidtreo-active`),r&&e.countdown!==null&&(r.textContent=e.countdown.toString()))}function Wv(e,t){let{recIndicatorTop:n}=t;n&&(e.shouldShow?n.style.display=`block`:n.style.display=`none`)}function Gv(e,t){let{recordingTimerRow:n,recordingTimer:r}=t;n&&(e.shouldShow?n.style.display=`flex`:n.style.display=`none`,r&&(r.textContent=e.timer))}function Kv(e,t){let{audioLevelBars:n}=t;n&&(e.shouldShow?n.style.display=`flex`:n.style.display=`none`)}let qv=`inline-flex`;function Jv(e){let{stream:t,buttonVisibility:n,currentSourceType:r,isMuted:i,isStopLocked:a,stopLockedTooltip:o,recordingState:s,buttonTranslations:c}=e,l=!!t,u=s===`idle`&&l,d=!1;(n.showPauseButton||n.showResumeButton)&&(d=!0);let f=c.pause,p=`ph-fill ph-pause`;n.showResumeButton&&(f=c.resume,p=`ph-fill ph-play`);let m=c.mute,h=`ph-fill ph-microphone`;i&&(m=c.unmute,h=`ph-fill ph-microphone-slash`);let g=`ph-fill ph-monitor`;r!==Sv&&(g=`ph-fill ph-camera`);let _=!1;return n.showDownloadButton&&(_=!0),{showRecordingControls:l,showSettingsButton:n.showSettingsButton,showRecordButton:u,showMuteButton:n.showMuteButton,showPauseButton:d,showStopButton:n.showStopButton,showSwitchSourceButton:n.showSwitchSourceButton,showDownloadButton:_,pauseTitle:f,pauseIconClassName:p,muteTitle:m,muteIconClassName:h,switchSourceIconClassName:g,isMuted:i,isStopLocked:a,stopLockedTooltip:o,settingsTitle:c.settings,switchSourceTitle:c.switchSource,downloadTitle:c.download}}function Yv(e){return{recordingControls:e.querySelector(`#recordingControls`),settingsButton:e.querySelector(`#btnSettings`),recordButton:e.querySelector(`#btnRecord`),muteButton:e.querySelector(`#btnMute`),muteIcon:e.querySelector(`#iconMute`),pauseButton:e.querySelector(`#btnPause`),pauseIcon:e.querySelector(`#iconPause`),stopButton:e.querySelector(`#btnStop`),switchSourceButton:e.querySelector(`#btnSwitchSource`),switchSourceIcon:e.querySelector(`#iconSwitchSource`),downloadButton:e.querySelector(`#btnDownload`)}}function Xv(e,t){let{recordingControls:n,settingsButton:r,recordButton:i,muteButton:a,muteIcon:o,pauseButton:s,pauseIcon:c,stopButton:l,switchSourceButton:u,switchSourceIcon:d,downloadButton:f}=t;Qv(n,e),$v(r,e),ey(i,e),ty(a,e),ny(o,e),ry(s,e),iy(c,e),ay(l,e),oy(u,e),sy(d,e),cy(f,e)}function Zv(e,t,n){e&&(t?e.style.display=n:e.style.display=`none`)}function Qv(e,t){Zv(e,t.showRecordingControls,`block`)}function $v(e,t){Zv(e,t.showSettingsButton,qv),e&&(e.title=t.settingsTitle)}function ey(e,t){Zv(e,t.showRecordButton,qv)}function ty(e,t){Zv(e,t.showMuteButton,qv),e&&(e.title=t.muteTitle,e.classList.toggle(`vidtreo-muted`,t.isMuted))}function ny(e,t){e&&(e.className=t.muteIconClassName)}function ry(e,t){Zv(e,t.showPauseButton,qv),e&&(e.title=t.pauseTitle)}function iy(e,t){e&&(e.className=t.pauseIconClassName)}function ay(e,t){if(Zv(e,t.showStopButton,qv),e){if(e.classList.toggle(`vidtreo-stop-button-locked`,t.isStopLocked),e.setAttribute(`aria-disabled`,String(t.isStopLocked)),t.isStopLocked){e.title=t.stopLockedTooltip;return}e.title=``}}function oy(e,t){Zv(e,t.showSwitchSourceButton,qv),e&&(e.title=t.switchSourceTitle)}function sy(e,t){e&&(e.className=t.switchSourceIconClassName)}function cy(e,t){Zv(e,t.showDownloadButton,qv),e&&(e.title=t.downloadTitle)}function ly(e){let{stream:t,showSettings:n}=e,r=!1;return t&&n&&(r=!0),{shouldShow:r}}function uy(e,t,n){if(t){if(!e.shouldShow){t.classList.remove(`vidtreo-active`);return}t.classList.add(`vidtreo-active`),n()}}function dy(e){return e.toggleMute(),e.getIsMuted()}function fy(e){if(!e)return;let t=URL.createObjectURL(e),n=document.createElement(`a`);n.href=t,n.download=`recording-${Date.now()}.mp4`,document.body.appendChild(n),n.click(),document.body.removeChild(n),URL.revokeObjectURL(t)}let py={en:{initializingCamera:`Initializing camera...`,grantPermissions:`Grant camera and microphone permissions when prompted`,browserUnsupported:`This browser is not supported`,browserUnsupportedDynamic:`{browser} ({version}) is not supported, please use <a href="https://www.google.com/chrome/" target="_blank">Chrome</a>`,browserUnsupportedSafari:`Safari is not supported, please use <a href="https://www.google.com/chrome/" target="_blank">Chrome</a>`,browserUnsupportedFirefox:`Firefox is not supported, please use <a href="https://www.google.com/chrome/" target="_blank">Chrome</a>`,retryCamera:`Retry Camera`,cameraInUse:`Your camera is being used by another application. Close other apps using the camera (Zoom, Teams, Discord) and try again.`,cameraNotFound:`No camera detected. Connect a camera or check your device settings.`,cameraPermissionDenied:`Camera access was denied. Allow camera access in your browser settings and try again.`,switchingDevice:`Switching device...`,recordingStartsIn:`Recording starts in...`,switchingSource:`Switching source...`,rec:`REC`,settings:`Settings`,record:`Record`,stop:`Stop`,pause:`Pause`,resume:`Resume`,mute:`Mute`,unmute:`Unmute`,switchSource:`Switch Source`,camera:`Camera`,microphone:`Microphone`,minimumRecordingTimeNotReached:`You have not met the minimum recording time yet`,processVideo:`Process Video`,processing:`Processing...`,finishing:`Finishing...`,uploading:`Uploading...`,switchingCamera:`Switching camera...`,switchingMicrophone:`Switching microphone...`,failedToStartCamera:`Failed to start camera`,userInAnotherTab:`User in another tab`,download:`Download`,nativeCameraSelectVideo:`Select Video from Gallery`,nativeCameraRecordVideo:`Record with Camera`,errorTitle:`Configuration Error`,errorGeneric:`An error occurred while loading the configuration`,mobileOpenCamera:`Open Camera`,mobileOpenCameraTitle:`Record a Video`,mobileOpenCameraDescription:`Tap the button below to start recording`,mobileCloseCamera:`Close`,mobilePermissionDenied:`Camera Access Denied`,mobilePermissionDeniedDescription:`Please allow camera access in your browser settings to record video.`},es:{initializingCamera:`Inicializando cámara...`,grantPermissions:`Otorga permisos de cámara y micrófono cuando se solicite`,browserUnsupported:`Este navegador no es compatible`,browserUnsupportedDynamic:`{browser} ({version}) no es compatible, por favor usa <a href="https://www.google.com/chrome/" target="_blank">Chrome</a>`,browserUnsupportedSafari:`Safari no es compatible, usa <a href="https://www.google.com/chrome/" target="_blank">Chrome</a>`,browserUnsupportedFirefox:`Firefox no es compatible, usa <a href="https://www.google.com/chrome/" target="_blank">Chrome</a>`,retryCamera:`Reintentar Cámara`,cameraInUse:`Tu cámara está siendo usada por otra aplicación. Cierra otras apps que usen la cámara (Zoom, Teams, Discord) e intenta de nuevo.`,cameraNotFound:`No se detectó ninguna cámara. Conecta una cámara o revisa la configuración de tu dispositivo.`,cameraPermissionDenied:`Se denegó el acceso a la cámara. Permite el acceso a la cámara en la configuración de tu navegador e intenta de nuevo.`,switchingDevice:`Cambiando dispositivo...`,recordingStartsIn:`La grabación comienza en...`,switchingSource:`Cambiando fuente...`,rec:`GRAB`,settings:`Configuración`,record:`Grabar`,stop:`Detener`,pause:`Pausar`,resume:`Reanudar`,mute:`Silenciar`,unmute:`Activar sonido`,switchSource:`Cambiar Fuente`,camera:`Cámara`,microphone:`Micrófono`,minimumRecordingTimeNotReached:`Aun no cumples el tiempo minimo de grabacion`,processVideo:`Procesar Video`,processing:`Procesando...`,finishing:`Finalizando...`,uploading:`Subiendo...`,switchingCamera:`Cambiando cámara...`,switchingMicrophone:`Cambiando micrófono...`,failedToStartCamera:`Error al iniciar la cámara`,userInAnotherTab:`Usuario en otra pestaña`,download:`Descargar`,nativeCameraSelectVideo:`Seleccionar Video de la Galería`,nativeCameraRecordVideo:`Grabar con Cámara`,errorTitle:`Error de Configuración`,errorGeneric:`Ocurrió un error al cargar la configuración`,mobileOpenCamera:`Abrir Cámara`,mobileOpenCameraTitle:`Grabar un Video`,mobileOpenCameraDescription:`Toca el botón para comenzar a grabar`,mobileCloseCamera:`Cerrar`,mobilePermissionDenied:`Acceso a Cámara Denegado`,mobilePermissionDeniedDescription:`Por favor permite el acceso a la cámara en la configuración de tu navegador para grabar video.`}};var my=class{constructor(e=`en`,t={}){this.lang=e,this.customTexts=t}setLang(e){this.lang=e}setCustomTexts(e){this.customTexts=e}t(e){return this.customTexts[e]?this.customTexts[e]:(py[this.lang]||py.en)[e]}getAll(){return{...py[this.lang]||py.en,...this.customTexts}}};let hy=new Map;function gy(e){e.style.position=`fixed`,e.style.top=`0`,e.style.left=`0`,e.style.width=`100vw`,e.style.height=`100vh`,e.style.height=`100dvh`,e.style.zIndex=`9999`,e.style.pointerEvents=`none`}function _y(e){e.style.pointerEvents=`auto`}function vy(e){e.style.pointerEvents=`none`}var yy=class{constructor(e=`vidtreo-portal-root`){this.portalContainer=null,this.contentWrapper=null,this.isRegistered=!1,this.containerId=e,this.instanceId=`portal-${Date.now()}-${Math.random().toString(36).slice(2,9)}`}get container(){return this.contentWrapper}get isActive(){return this.contentWrapper!==null&&this.portalContainer!==null}open(){let e=document.getElementById(this.containerId);return e||(e=document.createElement(`div`),e.id=this.containerId,gy(e),document.body.appendChild(e)),this.portalContainer=e,this.contentWrapper=document.createElement(`div`),this.contentWrapper.setAttribute(`data-portal-instance`,this.instanceId),this.contentWrapper.style.width=`100%`,this.contentWrapper.style.height=`100%`,this.portalContainer.appendChild(this.contentWrapper),this.registerInstance(),_y(e),this.contentWrapper}render(e){this.contentWrapper&&(this.contentWrapper.innerHTML=e)}querySelector(e){return this.contentWrapper?this.contentWrapper.querySelector(e):null}close(){this.contentWrapper&&=(this.contentWrapper.innerHTML=``,this.contentWrapper.remove(),null),this.unregisterInstance(),this.updatePortalContainerState()}destroy(){this.close(),this.portalContainer=null}registerInstance(){if(this.isRegistered)return;let e=hy.get(this.containerId);e||(e=new Set,hy.set(this.containerId,e)),e.add(this),this.isRegistered=!0}unregisterInstance(){if(!this.isRegistered)return;let e=hy.get(this.containerId);e&&(e.delete(this),e.size===0&&hy.delete(this.containerId)),this.isRegistered=!1}updatePortalContainerState(){if(!this.portalContainer)return;let e=hy.get(this.containerId);e&&e.size>0?_y(this.portalContainer):(vy(this.portalContainer),this.portalContainer.childNodes.length===0&&this.portalContainer.remove())}},by=class{constructor(e){this.state={isModalOpen:!1,permissionRequested:!1,prevUploading:!1},this.escapeHandler=null,this.initCheckInterval=null,this.callbacks=e,this.portalManager=new yy}get canCloseModal(){let{recordingState:e}=this.callbacks.getState();return!(e===`recording`||e===`countdown`)}get isModalOpen(){return this.state.isModalOpen}get portal(){return this.portalManager}openModal(){this.state.isModalOpen=!0,this.state.permissionRequested=!1,this.portalManager.open(),document.body.style.overflow=`hidden`,this.setupEscapeHandler(),this.callbacks.renderMobile(),this.requestCameraPreview()}closeModal(){this.canCloseModal&&(this.callbacks.stopPreview(),this.state.isModalOpen=!1,this.state.permissionRequested=!1,document.body.style.overflow=``,this.removeEscapeHandler(),this.portalManager.close(),this.callbacks.renderMobile())}checkUploadCompletion(e){let t=this.state.prevUploading,n=e!==null;this.state.prevUploading=n,t&&!n&&this.state.isModalOpen&&this.closeModal()}requestCameraPreview(){if(this.state.permissionRequested)return;let e=()=>{this.callbacks.isInitialized()?(this.state.permissionRequested=!0,this.callbacks.startPreview().catch(()=>{})):this.initCheckInterval=setTimeout(e,100)};e()}setupEscapeHandler(){this.escapeHandler=e=>{e.key===`Escape`&&this.canCloseModal&&this.closeModal()},document.addEventListener(`keydown`,this.escapeHandler)}removeEscapeHandler(){this.escapeHandler&&=(document.removeEventListener(`keydown`,this.escapeHandler),null)}destroy(){this.removeEscapeHandler(),this.portalManager.destroy(),document.body.style.overflow=``,this.initCheckInterval&&=(clearTimeout(this.initCheckInterval),null)}},xy=class{constructor(e,t){this.state={file:null,transcodingProgress:null,uploadProgress:null,isTranscoding:!1,isConfigLoading:!0,error:null,transcodedBlob:null},this.handler=null,this.config=e,this.callbacks=t;let n=e.backendUrl||`https://core.vidtreo.com`,r=null;e.apiKey&&!e.demo&&(r=an.getInstance({apiKey:e.apiKey,backendUrl:n}));let i=new kg;this.handler=new Lm({apiKey:e.apiKey,backendUrl:n,maxRecordingTime:e.maxRecordingTime,maxFileSize:e.maxFileSize,userMetadata:e.userMetadata},r,i),e.apiKey&&!e.demo?(this.updateState({isConfigLoading:!0}),this.handler.preloadConfig().then(()=>this.updateState({isConfigLoading:!1})).catch(()=>{this.updateState({isConfigLoading:!1,error:`Failed to load settings`})})):this.updateState({isConfigLoading:!1})}updateState(e){this.state={...this.state,...e},this.callbacks.onStateChange()}getState(){return this.state}async handleFileSelect(e){if(this.updateState({error:null}),!this.handler)throw Error(`Handler not initialized`);try{let t=await this.handler.handleFileSelection(e);return this.updateState({file:t}),t}catch(e){let t=i(e),n=e instanceof Error?e:Error(t);throw this.updateState({error:t}),this.callbacks.onError?.(n),n}}async processAndUpload(e){let t=e||this.state.file;if(!(t&&this.handler))return;let n=this.config.demo;try{if(this.updateState({isTranscoding:!0,transcodingProgress:0,error:null}),n){let e=await Fm(t.file,Gt,e=>{this.updateState({transcodingProgress:e}),this.callbacks.onTranscodingProgress?.(e)});this.updateState({transcodedBlob:e.blob,isTranscoding:!1,transcodingProgress:null})}else{let e=await this.handler.processAndUpload(e=>{this.updateState({transcodingProgress:e}),this.callbacks.onTranscodingProgress?.(e)},e=>{this.updateState({uploadProgress:e}),this.callbacks.onUploadProgress?.(e)});this.updateState({file:null,transcodingProgress:null,uploadProgress:null,isTranscoding:!1}),this.callbacks.onUploadComplete?.({recordingId:e.recordingId||``,uploadUrl:e.uploadUrl||``})}}catch(e){let t=i(e),r=e instanceof Error?e:Error(t);this.updateState({error:t,isTranscoding:!1,transcodingProgress:null,uploadProgress:null,transcodedBlob:null}),this.callbacks.onError?.(r),n||this.callbacks.onUploadError?.(r)}}downloadVideo(){if(!this.state.transcodedBlob)return;let e=URL.createObjectURL(this.state.transcodedBlob),t=document.createElement(`a`);t.href=e,t.download=`recording-${Date.now()}.mp4`,document.body.appendChild(t),t.click(),document.body.removeChild(t),URL.revokeObjectURL(e)}reset(){this.updateState({file:null,transcodingProgress:null,uploadProgress:null,error:null,isTranscoding:!1,transcodedBlob:null})}destroy(){this.handler&&this.handler.cancel(),this.handler=null}};function Sy(e){return{preview:{initializingCamera:e.initializingCamera,grantPermissions:e.grantPermissions,browserUnsupported:e.browserUnsupported,browserUnsupportedDynamic:e.browserUnsupportedDynamic,browserUnsupportedSafari:e.browserUnsupportedSafari,browserUnsupportedFirefox:e.browserUnsupportedFirefox,retryCamera:e.retryCamera,cameraInUse:e.cameraInUse,cameraNotFound:e.cameraNotFound,cameraPermissionDenied:e.cameraPermissionDenied,failedToStartCamera:e.failedToStartCamera,switchingDevice:e.switchingDevice,recordingStartsIn:e.recordingStartsIn,rec:e.rec},buttons:{settings:e.settings,record:e.record,stop:e.stop,minimumRecordingTimeNotReached:e.minimumRecordingTimeNotReached,pause:e.pause,resume:e.resume,mute:e.mute,unmute:e.unmute,switchSource:e.switchSource,download:e.download},settings:{settings:e.settings,camera:e.camera,microphone:e.microphone}}}var Cy=class{constructor(e){if(this.proxyEndpoint=e.proxyEndpoint,this.proxyEndpoint)throw Error(`Proxy mode not yet implemented`);this.service=new kg}uploadVideo(e,t){if(this.proxyEndpoint)throw Error(`Proxy mode not yet implemented`);return this.service.uploadVideo(e,t)}},wy=`:root{--vidtreo-background:0 0% 100%;--vidtreo-foreground:0 0% 3.9%;--vidtreo-card:0 0% 100%;--vidtreo-card-foreground:0 0% 3.9%;--vidtreo-primary:0 0% 9%;--vidtreo-primary-foreground:0 0% 98%;--vidtreo-secondary:0 0% 96.1%;--vidtreo-secondary-foreground:0 0% 9%;--vidtreo-muted:0 0% 96.1%;--vidtreo-muted-foreground:0 0% 45.1%;--vidtreo-accent:0 0% 96.1%;--vidtreo-accent-foreground:0 0% 9%;--vidtreo-destructive:0 84.2% 60.2%;--vidtreo-destructive-foreground:0 0% 98%;--vidtreo-border:0 0% 89.8%;--vidtreo-input:0 0% 89.8%;--vidtreo-ring:0 0% 3.9%;--vidtreo-radius:.5rem;--vidtreo-preview-bg:0 0% 0%;--vidtreo-z-modal-overlay:9999;--vidtreo-z-settings-panel:200;--vidtreo-z-error-overlay:100;--vidtreo-z-countdown-overlay:20;--vidtreo-z-progress-overlay:20;--vidtreo-z-controls:10}.vidtreo-preview-container{aspect-ratio:9/16;background:hsl(var(--vidtreo-preview-bg));contain:layout style;will-change:auto;backface-visibility:hidden;isolation:isolate;border:none;border-radius:0;justify-content:center;align-items:center;width:100%;display:flex;position:relative;overflow:visible;transform:translateZ(0)}.vidtreo-preview-container:before{display:none}@media (width>=768px){.vidtreo-preview-container{aspect-ratio:16/9}}.vidtreo-camera-area{contain:layout style paint;backface-visibility:hidden;isolation:isolate;will-change:auto;width:100%;height:100%;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,sans-serif;display:none;position:relative;transform:translateZ(0)}.vidtreo-source-transition-overlay{z-index:var(--vidtreo-z-error-overlay);backdrop-filter:blur(4px);contain:layout style paint;backface-visibility:hidden;will-change:opacity;background:#000000b3;border-radius:0;flex-direction:column;justify-content:center;align-items:center;transition:opacity .3s;display:none;position:absolute;inset:0;transform:translateZ(0)}.vidtreo-source-transition-overlay.vidtreo-active{animation:.2s vidtreo-fadeIn;display:flex}@keyframes vidtreo-fadeIn{0%{opacity:0}to{opacity:1}}.vidtreo-transition-spinner{border:4px solid #ffffff4d;border-top-color:#667eea;border-radius:50%;width:40px;height:40px;margin-bottom:12px;animation:.8s linear infinite vidtreo-spin}@keyframes vidtreo-spin{to{transform:rotate(360deg)}}.vidtreo-transition-message{color:#fff;text-align:center;font-size:14px;font-weight:500}.vidtreo-camera-area.vidtreo-active{display:block}.vidtreo-preview-skeleton{z-index:var(--vidtreo-z-controls);contain:layout style paint;backface-visibility:hidden;will-change:auto;background:#000;border-radius:0;flex-direction:column;justify-content:center;align-items:center;gap:1rem;display:flex;position:absolute;inset:0;transform:translateZ(0)}.vidtreo-skeleton-spinner{border:4px solid #ffffff4d;border-top-color:#fff;border-radius:50%;width:40px;height:40px;animation:.8s linear infinite vidtreo-spin}.vidtreo-skeleton-text{color:#fff;font-size:.875rem;font-weight:500}.vidtreo-video-preview{object-fit:contain;will-change:auto;backface-visibility:hidden;background:#000;border-radius:0;width:100%;height:100%;transition:opacity .3s,transform .3s;display:block;position:absolute;inset:0;transform:translateZ(0)}.vidtreo-video-preview-skeleton{z-index:2;contain:layout style paint;backface-visibility:hidden;will-change:auto;background:#000;border-radius:0;width:100%;height:100%;position:absolute;inset:0;overflow:hidden;transform:translateZ(0)}.vidtreo-skeleton-shimmer{background:linear-gradient(90deg, hsl(var(--vidtreo-muted)) 0%, hsl(var(--vidtreo-muted) / .5) 50%, hsl(var(--vidtreo-muted)) 100%);background-size:200% 100%;animation:1.5s ease-in-out infinite vidtreo-shimmer;position:absolute;inset:0}@keyframes vidtreo-shimmer{0%{background-position:-200% 0}to{background-position:200% 0}}.vidtreo-video-preview-skeleton.vidtreo-hidden{opacity:0;pointer-events:none;transition:opacity .3s}.vidtreo-video-preview.vidtreo-screen-share{object-fit:cover}.vidtreo-video-preview.vidtreo-transitioning{opacity:.5;transform:scale(.98)}.vidtreo-countdown-overlay{z-index:var(--vidtreo-z-countdown-overlay);contain:layout style paint;backface-visibility:hidden;will-change:auto;background:#000000f2;border-radius:0;justify-content:center;align-items:center;display:none;position:absolute;inset:0;transform:translateZ(0)}.vidtreo-countdown-overlay.vidtreo-active{display:flex}.vidtreo-countdown-content{flex-direction:column;align-items:center;gap:1rem;display:flex}.vidtreo-countdown-number{color:#fff;font-size:9rem;font-weight:700;animation:.3s vidtreo-zoomIn}@keyframes vidtreo-zoomIn{0%{opacity:0;transform:scale(.5)}to{opacity:1;transform:scale(1)}}.vidtreo-countdown-text{color:#fff;margin-top:1rem;font-size:.875rem;font-weight:500}.vidtreo-settings-panel{z-index:var(--vidtreo-z-settings-panel);contain:layout style paint;backface-visibility:hidden;background:#0006;border:none;border-radius:.75rem;flex-direction:column;width:90%;margin-left:-47%;padding:.625rem;display:none;overflow:hidden;transform:translateZ(0);position:absolute!important;bottom:4rem!important;left:50%!important}.vidtreo-settings-panel.vidtreo-active{display:flex}.vidtreo-settings-content{will-change:transform;backface-visibility:hidden;flex-direction:column;width:100%;display:flex;transform:translateZ(0)}.vidtreo-settings-content.vidtreo-slide-right{animation:.3s vidtreo-slideRight}.vidtreo-settings-content.vidtreo-slide-left{animation:.3s vidtreo-slideLeft}.vidtreo-settings-content.vidtreo-slide-none{will-change:auto;animation:none}@keyframes vidtreo-slideIn{0%{opacity:0;transform:translateY(1rem)}to{opacity:1;transform:translateY(0)}}@keyframes vidtreo-slideRight{0%{opacity:0;transform:translate(-100%)}to{opacity:1;transform:translate(0)}}@keyframes vidtreo-slideLeft{0%{opacity:0;transform:translate(100%)}to{opacity:1;transform:translate(0)}}.vidtreo-settings-header{color:#fff;cursor:pointer;text-align:left;background:0 0;border:none;align-items:center;gap:.75rem;width:100%;margin-bottom:1rem;padding:0;display:flex}.vidtreo-settings-back-icon{color:#fff;flex-shrink:0}.vidtreo-settings-title{color:#fff;margin:0;font-size:.875rem;font-weight:600}.vidtreo-device-options-container{flex-direction:column;gap:.375rem;display:flex}.vidtreo-device-option-nav{cursor:pointer;color:#fff;background:0 0;border:none;border-radius:.5rem;align-items:center;gap:1rem;width:100%;padding:.5rem .75rem;transition:background-color .2s;display:flex}.vidtreo-device-option-nav:hover{background:#fff3}.vidtreo-device-option-nav-content{flex-shrink:0;align-items:center;gap:.75rem;display:flex}.vidtreo-device-option-nav-label{color:#fff;font-size:.875rem;font-weight:500}.vidtreo-device-option-nav-value{flex:1;justify-content:flex-end;align-items:center;gap:.5rem;min-width:0;display:flex}.vidtreo-device-option-nav-value-text{color:#fffc;text-overflow:ellipsis;white-space:nowrap;text-align:right;flex:1;font-size:.875rem;overflow:hidden}.vidtreo-device-option-nav-chevron{color:#fff;font-size:1.25rem;line-height:1}.vidtreo-device-list{flex-direction:column;gap:0;max-height:200px;display:flex;overflow-y:auto}.vidtreo-device-list::-webkit-scrollbar{width:4px}.vidtreo-device-list::-webkit-scrollbar-track{background:0 0}.vidtreo-device-list::-webkit-scrollbar-thumb{background:#fff3;border-radius:2px}.vidtreo-device-list::-webkit-scrollbar-thumb:hover{background:#ffffff4d}.vidtreo-device-option{cursor:pointer;color:#fff;text-align:left;background:0 0;border:none;border-radius:.5rem;align-items:center;gap:.75rem;width:100%;padding:.5rem .75rem;transition:background-color .2s;display:flex}.vidtreo-device-option:hover{background:#fff3}.vidtreo-device-option-check-container{flex-shrink:0;justify-content:center;align-items:center;width:20px;height:20px;display:flex}.vidtreo-device-checkmark-placeholder{flex-shrink:0;width:20px;height:20px}.vidtreo-device-checkmark{color:#fff;flex-shrink:0}.vidtreo-device-option-label{color:#fff;flex:1;font-size:.875rem}.vidtreo-device-empty{color:#fff9;text-align:center;padding:1rem 0;font-size:.875rem}.vidtreo-audio-level-bars{height:1rem;z-index:var(--vidtreo-z-controls);contain:layout style paint;will-change:auto;backface-visibility:hidden;align-items:center;gap:.125rem;transform:translateZ(0);display:flex!important;position:absolute!important;bottom:.75rem!important;right:.75rem!important}@media (width>=768px){.vidtreo-audio-level-bars{height:1.25rem}}.vidtreo-audio-level-bar{background:#ffffff80;border-radius:9999px;align-self:flex-end;width:.125rem;transition:all .1s}.vidtreo-recording-controls{z-index:var(--vidtreo-z-controls);contain:layout style;will-change:auto;backface-visibility:hidden;position:absolute!important;bottom:12px!important;left:50%!important;transform:translate(-50%)translateZ(0)!important}.vidtreo-recording-controls-row{will-change:auto;justify-content:center;align-items:center;gap:.5rem;display:flex;transform:translateZ(0)}.vidtreo-recording-timer-row{justify-content:space-between;align-items:center;gap:.5rem;display:flex}.vidtreo-recording-timer-badge{z-index:var(--vidtreo-z-controls);contain:layout style paint;will-change:auto;backface-visibility:hidden;background:#0000004d;border:none;border-radius:9999px;align-items:center;gap:.375rem;padding:.25rem .5rem;transform:translateZ(0);box-shadow:0 1px 3px #0000001a,0 1px 2px -1px #0000001a;display:flex!important;position:absolute!important;top:.75rem!important;right:.75rem!important}.vidtreo-recording-dot-small{background:hsl(var(--vidtreo-destructive));border-radius:50%;width:.375rem;height:.375rem;animation:1.5s ease-in-out infinite vidtreo-pulse}.vidtreo-recording-timer-text{color:#fff;font-family:monospace;font-size:.75rem;font-weight:500}.vidtreo-control-buttons-row{will-change:auto;justify-content:center;align-items:center;gap:.375rem;height:auto;min-height:2rem;display:flex;transform:translateZ(0)}@media (width>=768px){.vidtreo-control-buttons-row{min-height:2.25rem}}.vidtreo-control-button{cursor:pointer;color:#fff;box-sizing:border-box;vertical-align:top;contain:layout style paint;will-change:auto;backface-visibility:hidden;background:#0000004d;border:none;border-radius:9999px;flex-shrink:0;justify-content:center;align-items:center;width:2rem;height:2rem;min-height:2rem;max-height:2rem;margin:0;padding:.25rem;transition:background-color .2s;display:inline-flex;position:relative;transform:translateZ(0)}.vidtreo-control-button:before{content:"";z-index:0;border-radius:9999px;transition:background-color .2s;position:absolute;inset:.25rem}.vidtreo-control-button svg{color:inherit;z-index:1;flex-shrink:0;position:relative;width:22px!important;height:22px!important}@media (width>=768px){.vidtreo-control-button svg{width:24px!important;height:24px!important}.vidtreo-control-button{width:2.25rem;height:2.25rem;min-height:2.25rem;max-height:2.25rem}}.vidtreo-control-button:hover:not(:disabled):before{background:#fff3}.vidtreo-control-button:disabled{opacity:.5;cursor:not-allowed}.vidtreo-control-button.vidtreo-muted:before{background:#0000004d}.vidtreo-control-button.vidtreo-muted:hover:not(:disabled):before{background:#fff3}.vidtreo-record-button{background:hsl(var(--vidtreo-destructive));height:2rem;min-height:2rem;max-height:2rem;color:hsl(var(--vidtreo-destructive-foreground));box-sizing:border-box;vertical-align:top;cursor:pointer;border:none;border-radius:9999px;flex-shrink:0;justify-content:center;align-items:center;gap:.375rem;width:auto;margin:0;padding:0 .75rem;font-size:.75rem;font-weight:500;line-height:1;transition:background-color .2s,filter .2s;display:inline-flex}@media (width>=768px){.vidtreo-record-button{height:2.25rem;min-height:2.25rem;max-height:2.25rem;font-size:.875rem}}.vidtreo-record-button:hover:not(:disabled){filter:brightness(.85)}.vidtreo-record-button.vidtreo-stop-button-locked{opacity:.5;cursor:not-allowed;filter:none}.vidtreo-record-button.vidtreo-stop-button-locked:hover{filter:none}#startButton.vidtreo-record-button{animation:2s ease-in-out infinite vidtreo-record-glow-pulse}@keyframes vidtreo-record-glow-pulse{0%,to{box-shadow:0 0 8px 2px #ef444466,0 0 16px 4px #ef444433}50%{box-shadow:0 0 16px 4px #ef444499,0 0 32px 8px #ef44444d}}#startButton.vidtreo-record-button:hover:not(:disabled){animation-play-state:paused;box-shadow:0 0 20px 6px #ef4444b3,0 0 40px 10px #ef444459}.vidtreo-rec-indicator-top{contain:layout style paint;will-change:auto;backface-visibility:hidden;background:#0000004d;border:none;border-radius:9999px;align-items:center;gap:.375rem;padding:.25rem .5rem;transform:translateZ(0);box-shadow:0 1px 3px #0000001a,0 1px 2px -1px #0000001a;display:flex!important;position:absolute!important;top:.75rem!important;left:.75rem!important}.vidtreo-rec-indicator-top span{color:#fff;font-size:.75rem;font-weight:500}.vidtreo-start-camera-area{text-align:center;cursor:pointer;z-index:1;contain:layout style paint;backface-visibility:hidden;will-change:auto;background:#000;border:none;border-radius:0;flex-direction:column;justify-content:center;align-items:center;padding:40px;transition:all .3s;display:flex;position:absolute;inset:0;transform:translateZ(0)}.vidtreo-start-camera-area:hover:not(.vidtreo-loading){background:#000}.vidtreo-start-camera-area.vidtreo-loading{cursor:wait;opacity:.7}.vidtreo-start-camera-area.vidtreo-loading .vidtreo-camera-text{color:#fff;opacity:.7}.vidtreo-camera-icon{color:#fff;justify-content:center;margin-bottom:16px;font-size:48px;display:flex}.vidtreo-camera-text{color:#fff;margin-bottom:8px;font-weight:600}.vidtreo-camera-text a{color:#3b82f6;text-decoration:underline}.vidtreo-camera-text a:hover{color:#2563eb}.vidtreo-camera-hint{color:#fff;opacity:.8;font-size:12px}@keyframes vidtreo-pulse{0%,to{opacity:1}50%{opacity:.3}}.vidtreo-progress{margin-top:20px;display:none}.vidtreo-progress.vidtreo-active{display:block}.vidtreo-progress-bar{background:#e0e0e0;border-radius:4px;width:100%;height:8px;margin-bottom:8px;overflow:hidden}.vidtreo-progress-fill{background:linear-gradient(90deg,#667eea 0%,#764ba2 100%);width:0%;height:100%;transition:width .3s}.vidtreo-progress-text{text-align:center;color:#fff;font-size:14px}.vidtreo-error{color:#fff;text-align:center;z-index:var(--vidtreo-z-error-overlay);word-wrap:break-word;background:#dc2626;border:none;border-radius:.5rem;max-width:90%;padding:1rem 1.25rem;font-size:.875rem;font-weight:500;display:none;position:absolute;top:.75rem;left:50%;transform:translate(-50%);box-shadow:0 4px 6px -1px #0000001a,0 2px 4px -2px #0000001a}.vidtreo-error.vidtreo-active{animation:.3s ease-out vidtreo-error-fade-in-slide-down;display:block}@keyframes vidtreo-error-fade-in-slide-down{0%{opacity:0;transform:translate(-50%)translateY(-1rem)}to{opacity:1;transform:translate(-50%)translateY(0)}}.vidtreo-upload-progress{margin-top:20px;display:none}.vidtreo-upload-progress.vidtreo-active{display:block}.vidtreo-preview-container .vidtreo-upload-progress{margin-top:0}.vidtreo-upload-status{border-radius:8px;margin-top:20px;padding:16px;display:none}.vidtreo-upload-status.vidtreo-active{display:block}.vidtreo-upload-status.vidtreo-success{color:#22543d;background:#f0f9ff;border:2px solid #48bb78}.vidtreo-upload-status.vidtreo-error{color:#c33;background:#fee;border:2px solid #fcc}.vidtreo-upload-status-text{font-size:14px;font-weight:500}.vidtreo-preview-error{aspect-ratio:9/16;background:hsl(var(--vidtreo-preview-bg));contain:strict;will-change:auto;backface-visibility:hidden;isolation:isolate;border:none;border-radius:0;justify-content:center;align-items:center;width:100%;display:flex;position:relative;overflow:hidden;transform:translateZ(0)}@media (width>=768px){.vidtreo-preview-error{aspect-ratio:16/9}}.vidtreo-error-content{text-align:center;color:#fff;flex-direction:column;justify-content:center;align-items:center;gap:1rem;max-width:400px;padding:2rem;display:flex}.vidtreo-error-icon{font-size:3rem;line-height:1}.vidtreo-error-title{font-size:1.25rem;font-weight:600;line-height:1.2}.vidtreo-error-message{opacity:.9;word-break:break-word;font-size:.875rem;line-height:1.5}.vidtreo-error-config{text-align:left;border-top:1px solid #fff3;width:100%;margin-top:1.5rem;padding-top:1.5rem}.vidtreo-error-config-title{color:#fff;margin-bottom:.75rem;font-size:.875rem;font-weight:600}.vidtreo-error-config-item{color:#ffffffd9;margin-bottom:.5rem;font-size:.8125rem;line-height:1.6}.vidtreo-error-config-item code{color:#fff;background:#ffffff26;border-radius:.25rem;padding:.125rem .375rem;font-family:monospace;font-size:.75rem}.vidtreo-error-retry{background:hsl(var(--vidtreo-destructive));color:hsl(var(--vidtreo-destructive-foreground));cursor:pointer;border:none;border-radius:.375rem;margin-top:.5rem;padding:.5rem 1rem;font-size:.875rem;font-weight:500;transition:filter .2s}.vidtreo-error-retry:hover:not(:disabled){filter:brightness(.85)}.vidtreo-error-retry:disabled{opacity:.5;cursor:not-allowed}.vidtreo-error-overlay{background:hsl(var(--vidtreo-preview-bg));z-index:var(--vidtreo-z-error-overlay);justify-content:center;align-items:center;display:flex;position:absolute;inset:0}.vidtreo-native-camera-container{aspect-ratio:9/16;background:hsl(var(--vidtreo-preview-bg));border-radius:0;justify-content:center;align-items:center;width:100%;display:flex;position:relative;overflow:hidden}@media (width>=768px){.vidtreo-native-camera-container{aspect-ratio:16/9}}.vidtreo-native-camera-container:has(.vidtreo-native-camera-preview-container){background:0 0}.vidtreo-config-loading-indicator{z-index:var(--vidtreo-z-controls);position:absolute;top:8px;right:8px}.vidtreo-spinner-small{border:2px solid #ffffff4d;border-top-color:#fff;border-radius:50%;width:16px;height:16px;animation:.6s linear infinite spin}.vidtreo-native-camera-empty-state{flex-direction:column;justify-content:center;align-items:center;gap:16px;width:100%;height:100%;padding:24px;display:flex;position:relative}.vidtreo-native-camera-buttons{flex-direction:column;gap:12px;width:100%;max-width:300px;display:flex}.vidtreo-native-camera-process-button,.vidtreo-native-camera-download-button{z-index:30;position:absolute;bottom:24px;left:50%;transform:translate(-50%)}.vidtreo-native-camera-process-button .vidtreo-btn,.vidtreo-native-camera-download-button .vidtreo-btn{min-width:200px}.vidtreo-btn{border-radius:var(--vidtreo-radius);cursor:pointer;border:none;padding:12px 24px;font-size:1rem;font-weight:500;transition:all .2s}.vidtreo-btn:disabled{opacity:.5;cursor:not-allowed}.vidtreo-btn-primary{background:hsl(var(--vidtreo-primary));color:hsl(var(--vidtreo-primary-foreground))}.vidtreo-btn-primary:hover:not(:disabled){filter:brightness(.9)}.vidtreo-btn-secondary{background:hsl(var(--vidtreo-secondary));color:hsl(var(--vidtreo-secondary-foreground));border:1px solid hsl(var(--vidtreo-border))}.vidtreo-btn-secondary:hover:not(:disabled){background:hsl(var(--vidtreo-accent))}.vidtreo-transcoding-progress{width:100%;max-width:400px;padding:16px}.vidtreo-progress-bar{background:#fff3;border-radius:4px;width:100%;height:8px;overflow:hidden}.vidtreo-progress-fill{background:hsl(var(--vidtreo-primary));height:100%;transition:width .3s}.vidtreo-progress-text{text-align:center;color:hsl(var(--vidtreo-foreground));margin-top:8px;font-size:.875rem}.vidtreo-native-camera-preview-container{background:0 0;justify-content:center;align-items:center;width:100%;height:100%;display:flex;position:relative}.vidtreo-native-camera-preview-image{object-fit:contain;width:100%;height:100%;display:block}.vidtreo-progress-overlay{backdrop-filter:blur(4px);width:100%;height:100%;z-index:var(--vidtreo-z-progress-overlay);pointer-events:none;background:#000000b3;flex-direction:column;justify-content:center;align-items:center;display:flex;position:absolute;inset:0}.vidtreo-progress-overlay .vidtreo-transcoding-progress,.vidtreo-progress-overlay .vidtreo-upload-progress{pointer-events:auto;background:0 0;flex-direction:column;align-items:center;gap:12px;width:90%;max-width:400px;padding:0;display:flex;position:relative}.vidtreo-progress-overlay .vidtreo-progress-bar,.vidtreo-progress-overlay .vidtreo-upload-progress-bar{background:#fff3;border-radius:4px;width:100%;height:8px;overflow:hidden}.vidtreo-progress-overlay .vidtreo-progress-fill{background:#fff;height:100%;transition:width .3s}.vidtreo-progress-overlay .vidtreo-progress-text,.vidtreo-progress-overlay .vidtreo-upload-progress-text{text-align:center;color:#fff;margin-top:0;font-size:.875rem;font-weight:500}.vidtreo-progress-overlay .vidtreo-upload-progress-bar{background:#fff3;border-radius:4px;width:100%;height:8px;overflow:hidden}.vidtreo-progress-overlay .vidtreo-upload-progress-fill{background:#fff;height:100%;transition:width .3s}.vidtreo-progress-overlay .vidtreo-progress-indeterminate{background:linear-gradient(90deg,#0000 0%,#fff 50%,#0000 100%) 0 0/200% 100%;width:100%;animation:1.5s ease-in-out infinite vidtreo-progress-indeterminate}@keyframes vidtreo-progress-indeterminate{0%{background-position:200% 0}to{background-position:-200% 0}}.vidtreo-mobile-web-recorder{width:100%;height:100%;font-family:-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,sans-serif}.vidtreo-mobile-landing-container{aspect-ratio:4/3;background:hsl(var(--vidtreo-preview-bg));border-radius:0;justify-content:center;align-items:center;width:100%;max-height:100%;display:flex;position:relative;overflow:hidden}.vidtreo-mobile-landing-content{text-align:center;flex-direction:column;justify-content:center;align-items:center;gap:1.25rem;padding:2rem;display:flex}.vidtreo-mobile-landing-title{color:#fff;margin:0;font-size:1.25rem;font-weight:600;line-height:1.3}.vidtreo-mobile-landing-description{color:#ffffffbf;max-width:280px;margin:0;font-size:.875rem;line-height:1.5}.vidtreo-mobile-open-camera-btn{border-radius:9999px;justify-content:center;align-items:center;gap:.625rem;min-width:200px;margin-top:.5rem;padding:.875rem 1.75rem;font-size:1rem;font-weight:600;transition:all .2s;animation:2s ease-in-out infinite vidtreo-btn-glow-pulse;display:inline-flex}@keyframes vidtreo-btn-glow-pulse{0%,to{box-shadow:0 0 8px 2px #ffffff4d,0 0 16px 4px #ffffff26}50%{box-shadow:0 0 16px 4px #ffffff80,0 0 32px 8px #ffffff40}}.vidtreo-mobile-open-camera-btn:hover:not(:disabled){animation-play-state:paused;transform:scale(1.02);box-shadow:0 0 20px 6px #fff9,0 0 40px 10px #ffffff4d}.vidtreo-mobile-open-camera-btn:active:not(:disabled){transform:scale(.98)}.vidtreo-mobile-open-camera-btn:disabled{box-shadow:none;animation:none}#vidtreo-portal-root{z-index:9999;pointer-events:none;width:100vw;height:100dvh;position:fixed;top:0;left:0}#vidtreo-portal-root>*{pointer-events:auto}.vidtreo-mobile-modal-overlay{--vidtreo-safe-top:0px;--vidtreo-safe-bottom:0px;--vidtreo-safe-left:0px;--vidtreo-safe-right:0px;width:100vw;height:100dvh;z-index:var(--vidtreo-z-modal-overlay);background:#000;flex-direction:column;height:-webkit-fill-available;animation:.3s ease-out vidtreo-modal-fade-in;display:flex;position:fixed;inset:0}@keyframes vidtreo-modal-fade-in{0%{opacity:0}to{opacity:1}}.vidtreo-mobile-modal-header{padding:.75rem;padding-top:calc(.75rem + var(--vidtreo-safe-top,0px));z-index:var(--vidtreo-z-error-overlay);pointer-events:none;justify-content:center;display:flex;position:absolute;top:0;left:0;right:0}.vidtreo-mobile-modal-close-btn{color:#ffffffe6;cursor:pointer;pointer-events:auto;backdrop-filter:blur(4px);background:#00000080;border:none;border-radius:9999px;justify-content:center;align-items:center;gap:.375rem;height:2rem;padding:0 .75rem;font-size:.75rem;font-weight:500;transition:all .2s;display:flex}.vidtreo-mobile-modal-close-btn:hover:not(:disabled){background:#000000b3}.vidtreo-mobile-modal-close-btn:disabled{opacity:.3;cursor:not-allowed}.vidtreo-mobile-modal-content{width:100%;height:100%;padding-top:var(--vidtreo-safe-top,0px);padding-bottom:var(--vidtreo-safe-bottom,0px);padding-left:var(--vidtreo-safe-left,0px);padding-right:var(--vidtreo-safe-right,0px);flex-direction:column;flex:1;display:flex;position:relative}.vidtreo-mobile-recorder-content{--vidtreo-safe-top:0px;--vidtreo-safe-bottom:0px;--vidtreo-safe-left:0px;--vidtreo-safe-right:0px;flex-direction:column;width:100%;height:100%;display:flex;position:relative}.vidtreo-mobile-recorder-content .vidtreo-preview-container{aspect-ratio:unset;flex:1;width:100%;height:100%}.vidtreo-mobile-recorder-content .vidtreo-video-preview{object-fit:cover}.vidtreo-mobile-preview{flex:1;aspect-ratio:unset!important;height:100%!important}.vidtreo-mobile-recorder-content .vidtreo-recording-controls{bottom:calc(24px + var(--vidtreo-safe-bottom,0px))!important}.vidtreo-mobile-recorder-content .vidtreo-audio-level-bars{bottom:calc(12px + var(--vidtreo-safe-bottom,0px))!important}.vidtreo-mobile-recorder-content .vidtreo-settings-panel{bottom:calc(7rem + var(--vidtreo-safe-bottom,0px))!important}.vidtreo-mobile-recorder-content .vidtreo-rec-indicator-top,.vidtreo-mobile-recorder-content .vidtreo-recording-timer-badge{contain:layout style;height:2rem;padding:0 .75rem;top:calc(.75rem + var(--vidtreo-safe-top,0px))!important}.vidtreo-mobile-recorder-content .vidtreo-recording-timer-text{white-space:nowrap;color:#fff;min-width:3rem;font-size:.875rem;display:inline-block}.vidtreo-mobile-recorder-content .vidtreo-error{top:calc(3.5rem + var(--vidtreo-safe-top,0px))!important}.vidtreo-mobile-recorder-content .vidtreo-control-buttons-row{gap:.75rem;min-height:4rem}.vidtreo-mobile-recorder-content .vidtreo-control-button{width:4rem;height:4rem;min-height:4rem;max-height:4rem}.vidtreo-mobile-recorder-content .vidtreo-control-button svg{width:1.5rem;height:1.5rem}.vidtreo-mobile-recorder-content .vidtreo-record-button{gap:.5rem;height:4rem;min-height:4rem;max-height:4rem;padding:0 1.5rem;font-size:1rem}.vidtreo-mobile-recorder-content .vidtreo-record-button svg{width:1.5rem;height:1.5rem}`;function Ty(e){return`
10246
+ <style>${wy}</style>
10247
10247
  <div class="vidtreo-mobile-landing-container">
10248
10248
  <div class="vidtreo-mobile-landing-content">
10249
10249
  <h2 class="vidtreo-mobile-landing-title">
@@ -10261,8 +10261,8 @@ Mediabunny was loaded twice.\` + " This will likely cause Mediabunny not to work
10261
10261
  </button>
10262
10262
  </div>
10263
10263
  </div>
10264
- `}function Ty(e,t,n){return`
10265
- <style>${Cy}</style>
10264
+ `}function Ey(e,t,n){return`
10265
+ <style>${wy}</style>
10266
10266
  <div class="vidtreo-mobile-modal-overlay" role="dialog" aria-modal="true" aria-label="${e.t(`mobileOpenCameraTitle`)}">
10267
10267
  <div class="vidtreo-mobile-modal-header">
10268
10268
  <!-- Left: Recording Indicator -->
@@ -10297,8 +10297,8 @@ Mediabunny was loaded twice.\` + " This will likely cause Mediabunny not to work
10297
10297
  ${n}
10298
10298
  </div>
10299
10299
  </div>
10300
- `}function Ey(e){return`
10301
- <style>${Cy}</style>
10300
+ `}function Dy(e){return`
10301
+ <style>${wy}</style>
10302
10302
  <div class="vidtreo-native-camera-container">
10303
10303
  <input
10304
10304
  type="file"
@@ -10358,7 +10358,7 @@ Mediabunny was loaded twice.\` + " This will likely cause Mediabunny not to work
10358
10358
 
10359
10359
  <div class="vidtreo-error" id="nativeError" style="display: none;"></div>
10360
10360
  </div>
10361
- `}function Dy(e){return`
10361
+ `}function Oy(e){return`
10362
10362
  <div class="vidtreo-mobile-recorder-content">
10363
10363
  <div class="vidtreo-preview-container vidtreo-mobile-preview">
10364
10364
 
@@ -10527,8 +10527,8 @@ Mediabunny was loaded twice.\` + " This will likely cause Mediabunny not to work
10527
10527
  <div class="vidtreo-error" id="error" style="display: none;"></div>
10528
10528
  </div>
10529
10529
  </div>
10530
- `}let Oy=()=>`
10531
- <style>${Cy}</style>
10530
+ `}let ky=()=>`
10531
+ <style>${wy}</style>
10532
10532
  <div class="vidtreo-camera-area vidtreo-active" id="cameraArea">
10533
10533
  <!-- Error Boundary / Preview Container -->
10534
10534
  <div class="vidtreo-preview-container">
@@ -10717,7 +10717,7 @@ Mediabunny was loaded twice.\` + " This will likely cause Mediabunny not to work
10717
10717
  <!-- Error Message -->
10718
10718
  <div class="vidtreo-error" id="error" style="display: none;"></div>
10719
10719
  </div>
10720
- `;function ky(e,t,n,r){return{showSettingsButton:!e&&r.enableDeviceChange!==!1,showMuteButton:e&&r.enableMute!==!1,showPauseButton:e&&r.enablePause!==!1&&t===`recording`&&!n,showResumeButton:e&&r.enablePause!==!1&&n,showStopButton:e,showSwitchSourceButton:e&&r.enableSourceSwitching!==!1}}let Ay=/^https?:\/\//i;function jy(e){return e?Ay.test(e)?e:`https://${e}`:`https://core.vidtreo.com`}function My(e,t,n){let r=e.getAttribute(t);return r===null?n:r!==`false`}function Ny(e,t){let n=e.getAttribute(t);if(!n)return;let r=Number.parseInt(n,10);if(!Number.isNaN(r))return r}function Py(e,t){let n=e.getAttribute(t);if(n!==null)return n}function Fy(e){return{apiKey:e.getAttribute(`api-key`)||``,backendUrl:jy(e.getAttribute(`backend-url`)),demo:My(e,`demo`,!1),enableSourceSwitching:My(e,`enable-source-switching`,!0),enableMute:My(e,`enable-mute`,!0),enablePause:My(e,`enable-pause`,!0),enableDeviceChange:My(e,`enable-device-change`,!0),enableTabVisibilityOverlay:My(e,`enable-tab-visibility-overlay`,!1)}}function Iy(e){let t={},n=Ny(e,`countdown-duration`);n!==void 0&&(t.countdownDuration=n);let r=Ny(e,`max-recording-time`);r!==void 0&&(t.maxRecordingTime=r);let i=Ny(e,`min-time-record`);return i!==void 0&&(t.minTimeRecord=i),t}function Ly(e,t,n){return e?t!==void 0&&t.trim().length>0?t:n!==void 0&&n.trim().length>0?n:void 0:t}function Ry(e,t){let n=e.getAttribute(`user-metadata`);if(n)try{let e=JSON.parse(n);return{...t,...e}}catch(e){throw Error(`Invalid user-metadata JSON: ${i(e)}`)}}function zy(e,t,n){let r=Fy(e),i=Iy(e),a=Py(e,`tab-visibility-overlay-text`),o=Ly(r.enableTabVisibilityOverlay===!0,a,n),s=Ry(e,t),c={...r,...i};return o!==void 0&&(c={...c,tabVisibilityOverlayText:o}),s!==void 0&&(c={...c,userMetadata:s}),c}function By(){if(typeof document>`u`||document.querySelector(`script[src*="@phosphor-icons/web"]`))return;let e=document.createElement(`script`);e.src=`https://unpkg.com/@phosphor-icons/web`,e.async=!0,document.head.appendChild(e)}let Vy=1e3,Hy=/^\d+$/;function Uy(e){return Hy.test(e)}function Wy(e){let t=e.trim();if(t.length===0)return 0;let n=t.split(`:`);if(n.length!==2&&n.length!==3)return 0;for(let e of n)if(!Uy(e))return 0;if(n.length===2){let e=Number.parseInt(n[0],10),t=Number.parseInt(n[1],10);return(e*60+t)*Vy}let r=Number.parseInt(n[0],10),i=Number.parseInt(n[1],10),a=Number.parseInt(n[2],10);return((r*60+i)*60+a)*Vy}function Gy(e,t,n){return!n||e==null||Number.isFinite(e)===!1||e<=0?!1:Wy(t)<e}function Ky(){let e=Error(`Minimum recording time has not been reached yet`);return e.code=`recording.minimum-time-not-reached`,e}let qy={requiresAudio:!1,requiresWatermark:!1},Jy={recordingState:`idle`,stream:null,isVideoLoaded:!1,isMuted:!1,isPaused:!1,showSettings:!1,error:null,errorCode:null,canRetry:!1,browserName:null,browserVersion:null,countdown:null,timer:`00:00`,uploadProgress:null,transitionMessage:null,recordedBlob:null,devices:{cameras:[],microphones:[],selectedCamera:null,selectedMic:null},configError:null};var Yy=class extends HTMLElement{constructor(...e){super(...e),this.controller=null,this.uploadService=null,this.state={...Jy},this.config={},this.isMounted=!1,this.connectionGeneration=0,this.initialized=!1,this.isInitializing=!1,this.isProcessingBlob=!1,this.audioBarsContainer=null,this.previewContentElements=null,this.recordingControlsElements=null,this.videoPreviewElements=null,this.overlayElements=null,this.settingsPanelElement=null,this.audioContext=null,this.analyser=null,this.animationFrameId=null,this.mobileManager=null,this.nativeCameraManager=null,this.i18n=new py,this.settingsView=`main`,this.slideDirection=`none`}static{this.observedAttributes=[`api-key`,`backend-url`,`countdown-duration`,`min-time-record`,`max-recording-time`,`user-metadata`,`enable-source-switching`,`enable-mute`,`enable-pause`,`enable-device-change`,`enable-tab-visibility-overlay`,`tab-visibility-overlay-text`,`demo`,`mobile-mode`,`lang`]}get isDemo(){return this.hasAttribute(`demo`)&&this.getAttribute(`demo`)!==`false`}get lang(){return this.getAttribute(`lang`)||`en`}async connectedCallback(){this.connectionGeneration+=1;let e=this.connectionGeneration;this.i18n.setLang(this.lang);let t=this.shouldProbeWebRecorderSupport();if(await this.probeWebRecorderSupport(t,e),this.shouldAbortConnection(e))return;let n=this.getEffectiveMobileMode();this.initializeRecorderForMobileMode(n)}disconnectedCallback(){this.connectionGeneration+=1,this.isMounted=!1,this.mobileManager?.destroy(),this.nativeCameraManager?.destroy(),this.cleanup()}async probeWebRecorderSupport(e,t){this.isMounted||(this.isMounted=!0,e&&await dh(qy).then(e=>{if(!this.shouldAbortConnection(t)){if(!e.isSupported){this.updateUnsupportedBrowserState();return}this.updateState({errorCode:null,canRetry:!1,browserName:null,browserVersion:null})}}).catch(()=>{this.shouldAbortConnection(t)||this.updateUnsupportedBrowserState()}))}updateUnsupportedBrowserState(){let e=fv();this.updateState({errorCode:wv,canRetry:!1,browserName:e.browserName,browserVersion:e.browserVersion})}clearBrowserUnsupportedState(){this.updateState({errorCode:null,canRetry:!1,browserName:null,browserVersion:null})}applyBrowserUnsupportedStateFromError(e){if(!(e&&typeof e==`object`&&`code`in e))return;let t=e;if(t.code?.startsWith(`camera.`)){this.updateState({errorCode:t.code,canRetry:!0,browserName:null,browserVersion:null});return}if(t.code!==wv)return;let n=fv(),r=n.browserName;t.browserName&&t.browserName.length>0&&(r=t.browserName);let i=n.browserVersion;t.browserVersion&&t.browserVersion.length>0&&(i=t.browserVersion),this.updateState({errorCode:wv,canRetry:!1,browserName:r,browserVersion:i})}resolveBrowserErrorState(){let e=this.state.errorCode,t=this.state.browserName,n=this.state.browserVersion;if(e===wv&&t===null){let e=fv();t=e.browserName,n===null&&(n=e.browserVersion)}return{errorCode:e,browserName:t,browserVersion:n}}shouldAbortConnection(e){return!this.isConnected||e!==this.connectionGeneration}initializeRecorderForMobileMode(e){if(e===`native`){this.initNativeCamera();return}if(e===`overlay`){this.mobileManager=new yy({getState:()=>({recordingState:this.state.recordingState,uploadProgress:this.state.uploadProgress}),isInitialized:()=>this.initialized,startPreview:()=>this.startPreview(),stopPreview:()=>this.stopPreview(),renderMobile:()=>this.renderMobile()}),this.renderMobile(),this.init();return}this.innerHTML=Oy(),this.init()}getRequestedMobileMode(){let e=this.getAttribute(`mobile-mode`);return e===null?null:e===`embed`?`embed`:e===`native`?`native`:`overlay`}shouldProbeWebRecorderSupport(){return this.getRequestedMobileMode()!==`native`}getEffectiveMobileMode(){let e=this.getRequestedMobileMode();return e===null?`overlay`:e}initNativeCamera(){this.config=this.resolveRecorderComponentConfig({}),this.nativeCameraManager=new by({apiKey:this.config.apiKey,backendUrl:this.config.backendUrl,maxRecordingTime:this.config.maxRecordingTime,userMetadata:this.config.userMetadata,demo:this.isDemo},{onStateChange:()=>this.renderNativeCamera(),onUploadComplete:e=>{this.dispatchEvent(new CustomEvent(`recording-complete`,{detail:e,bubbles:!0,composed:!0}))},onError:e=>{this.dispatchEvent(new CustomEvent(`error`,{detail:{error:e.message},bubbles:!0,composed:!0}))}}),this.renderNativeCamera(),By()}renderNativeCamera(){if(!this.nativeCameraManager)return;let e=this.nativeCameraManager.getState();this.innerHTML=Ey(this.i18n);let t=e.file!==null,n=!(t||e.isTranscoding)&&e.uploadProgress===null&&!e.transcodedBlob;this.setElementDisplay(`#nativeCameraEmptyState`,n),this.setElementDisplay(`#nativePreviewContainer`,t||!!e.transcodedBlob),this.setElementDisplay(`#nativeProgressOverlay`,e.isTranscoding||e.uploadProgress!==null),this.updateNativeCameraProgress(e),this.updateNativeCameraPreview(e,t);let r=this.isDemo&&!!e.transcodedBlob&&!e.isTranscoding&&e.uploadProgress===null;this.setElementDisplay(`#nativeActions`,r),this.updateNativeCameraError(e),this.setupNativeCameraListeners()}setElementDisplay(e,t){let n=this.querySelector(e);n instanceof HTMLElement&&(t&&(n.style.display=``),t||(n.style.display=`none`))}updateNativeCameraProgress(e){let t=this.querySelector(`#nativeUploadProgressFill`),n=this.querySelector(`#nativeUploadProgressText`),r=null;t instanceof HTMLElement&&(r=t);let i=e.uploadProgress!==null,a=e.isTranscoding&&!i,o=0;e.uploadProgress!==null&&(o=e.uploadProgress);let s=0;e.transcodingProgress!==null&&(s=e.transcodingProgress),i&&this.setElementDisplay(`#nativeUploadProgress`,!0),r&&i&&(r.style.width=`${o}%`),n&&i&&(n.textContent=`${this.i18n.t(`uploading`)} ${Math.round(o)}%`),a&&this.setElementDisplay(`#nativeUploadProgress`,!0),r&&a&&(r.style.width=`${s}%`),n&&a&&(n.textContent=`${this.i18n.t(`finishing`)} ${Math.round(s)}%`)}updateNativeCameraPreview(e,t){let n=this.querySelector(`#nativeVideoPreview`);if(n){if(t&&e.file){n.src=URL.createObjectURL(e.file.file);return}e.transcodedBlob&&(n.src=URL.createObjectURL(e.transcodedBlob))}}updateNativeCameraError(e){let t=this.querySelector(`#nativeError`);t instanceof HTMLElement&&(e.error?(t.style.display=``,t.textContent=e.error):t.style.display=`none`)}setupNativeCameraListeners(){let e=this.querySelector(`#btnSelectVideo`),t=this.querySelector(`#btnRecordVideo`),n=this.querySelector(`#btnNativeRetake`),r=this.querySelector(`#nativeCameraInput`);e?.addEventListener(`click`,()=>{r&&(r.accept=`video/*`,r.removeAttribute(`capture`),r.click())}),t?.addEventListener(`click`,()=>{r&&(r.accept=`video/*`,r.setAttribute(`capture`,`environment`),r.click())}),n?.addEventListener(`click`,()=>{this.nativeCameraManager?.reset()}),r?.addEventListener(`change`,async e=>{let t=e.target,n=t.files?.[0];if(n&&this.nativeCameraManager)try{let e=await this.nativeCameraManager.handleFileSelect(n);await this.nativeCameraManager.processAndUpload(e)}catch{}t.value=``})}attributeChangedCallback(e,t,n){if(t!==n){if(e===`min-time-record`){let e=zy(this,{});this.config={...this.config,minTimeRecord:e.minTimeRecord},this.render();return}[`api-key`,`backend-url`,`demo`].includes(e)&&(this.initialized&&this.cleanup(),this.init())}}async init(){if(!this.isInitializing){this.isInitializing=!0;try{this.initialized&&this.cleanup(),this.config=this.resolveRecorderComponentConfig({});let e=this.config.apiKey||``,t=this.config.backendUrl||``;if(!(this.isDemo||e)){this.updateState({configError:Error(`apiKey is required. Provide it as an attribute or ensure demo mode is enabled.`)}),this.isInitializing=!1;return}this.isDemo||(this.uploadService=new Sy({apiKey:e,backendUrl:t})),this.controller=new nv(pv(this));let n={...this.config};if(await this.controller.initialize(n),this.initialized=!0,this.updateState({configError:null}),this.clearBrowserUnsupportedState(),this.mobileManager){By();return}this.cacheUiElements(),this.setupEventListeners(),By(),setTimeout(()=>this.startPreview(),100)}catch(e){this.applyBrowserUnsupportedStateFromError(e),this.updateState({error:i(e)})}finally{this.isInitializing=!1}}}renderConfigError(){let e=this.state,t=!!e.configError;if(this.toggleDisplay(`#configErrorOverlay`,t),t&&e.configError){let t=e.configError.message.includes(`apiKey is required`);this.toggleDisplay(`#configErrorMessageDefault`,!t),this.toggleDisplay(`#configErrorDetails`,t),t||this.setText(`#configErrorMessageDefault`,e.configError.message)}}resolveRecorderComponentConfig(e){return zy(this,e,this.i18n.t(`userInAnotherTab`))}cleanup(){this.controller&&=(this.controller.cleanup(),null),this.stopAudioAnalysis(),this.initialized=!1,this.state={...Jy}}updateState(e){let t={...this.state,...e};e.stream!==void 0&&(t={...t,isVideoLoaded:!1}),e.recordingState!==void 0&&t.showSettings&&t.recordingState===Cv&&(t={...t,showSettings:!1}),this.state=t,this.mobileManager&&e.uploadProgress!==void 0&&this.mobileManager.checkUploadCompletion(this.state.uploadProgress),this.render(),e.stream!==void 0&&this.handleStreamUpdate(this.state.stream),this.state.devices.cameras.length===0&&this.state.stream&&this.updateDevices()}async updateDevices(){if(!this.controller)return;let e=this.controller.getDeviceManager(),t=await e.getAvailableDevices();this.updateState({devices:{cameras:t.videoinput,microphones:t.audioinput,selectedCamera:e.getSelectedCameraDeviceId(),selectedMic:e.getSelectedMicDeviceId()}})}handleStreamUpdate(e){this.videoPreviewElements||this.cacheUiElements(),this.videoPreviewElements&&jv(e,this.videoPreviewElements,{onVideoLoaded:()=>{this.updateState({isVideoLoaded:!0})},onError:e=>{this.updateState({error:e})},startAudioAnalysis:e=>this.startAudioAnalysis(e),stopAudioAnalysis:()=>this.stopAudioAnalysis()})}startAudioAnalysis(e){if(this.stopAudioAnalysis(),e.getAudioTracks().length!==0)try{this.audioContext=new AudioContext;let t=this.audioContext.createMediaStreamSource(e);this.analyser=this.audioContext.createAnalyser(),this.analyser.fftSize=64,t.connect(this.analyser);let n=new Uint8Array(this.analyser.frequencyBinCount),r=()=>{if(!this.analyser)return;this.analyser.getByteFrequencyData(n);let e=0;for(let t of n)e+=t;let t=e/n.length,i=Math.min(1,t/128);this.renderAudioBars(i),this.animationFrameId=requestAnimationFrame(r)};r()}catch(e){this.updateState({error:i(e)})}}stopAudioAnalysis(){this.animationFrameId&&=(cancelAnimationFrame(this.animationFrameId),null),this.audioContext&&=(this.audioContext.close(),null)}renderAudioBars(e){if(!this.audioBarsContainer)return;let t=Tv,n=``;if(!this.state.isMuted)for(let r of t){let t=Math.max(4,e*24*r);n+=`<div class="vidtreo-audio-level-bar" style="height: ${t}px;"></div>`}this.audioBarsContainer.innerHTML=n}render(){if(this.mobileManager&&!this.mobileManager.isModalOpen||(this.previewContentElements&&this.recordingControlsElements&&this.overlayElements&&this.videoPreviewElements||this.cacheUiElements(),!(this.previewContentElements&&this.recordingControlsElements&&this.overlayElements&&this.videoPreviewElements)))return;let e=this.i18n.getAll(),t=xy(e),n=this.state.recordingState===Cv||this.state.isPaused,r=Gy(this.config.minTimeRecord,this.state.timer,n),a={enableDeviceChange:this.config.enableDeviceChange,enableMute:this.config.enableMute,enablePause:this.config.enablePause,enableSourceSwitching:this.config.enableSourceSwitching},o=ky(n,this.state.recordingState,this.state.isPaused,a),s=!1;this.isDemo&&!n&&this.state.recordingState===`idle`&&this.state.recordedBlob!==null&&(s=!0);let c={...o,showDownloadButton:s},l=xv;this.controller&&(l=this.controller.getCurrentSourceType());let{errorCode:u,browserName:d,browserVersion:f}=this.resolveBrowserErrorState();zv({state:{stream:this.state.stream,transitionMessage:this.state.transitionMessage,recordingState:this.state.recordingState,countdown:this.state.countdown,timer:this.state.timer,isMuted:this.state.isMuted,isPaused:this.state.isPaused,errorCode:u,browserName:d,browserVersion:f},isVideoLoaded:this.state.isVideoLoaded,isRecording:n,controller:this.controller,audioLevel:0,buttonVisibility:c,currentSourceType:l,onStartRecording:()=>this.handleRecord(),onStopRecording:()=>this.handleStop(),onSwitchSource:()=>this.handleSwitch(),onToggleSettings:()=>this.updateState({showSettings:!this.state.showSettings}),onToggleMute:()=>this.handleMute(),onPause:()=>this.handlePauseToggle(),onResume:()=>this.handlePauseToggle(),onRetryCamera:()=>{this.startPreview().catch(e=>{let t;t=e instanceof Error?e:Error(i(e)),this.dispatchEvent(new CustomEvent(`error`,{detail:{error:t.message},bubbles:!0,composed:!0}))})},onLoadedChange:()=>this.updateState({isVideoLoaded:!0}),onDownload:()=>this.handleDownload(),translations:t.preview,buttonTranslations:t.buttons},this.previewContentElements),Yv(qv({stream:this.state.stream,buttonVisibility:c,currentSourceType:l,isMuted:this.state.isMuted,onDownload:()=>this.handleDownload(),onPause:()=>this.handlePauseToggle(),onResume:()=>this.handlePauseToggle(),onStartRecording:()=>this.handleRecord(),onStopRecording:()=>this.handleStop(),onSwitchSource:()=>this.handleSwitch(),onToggleMute:()=>this.handleMute(),onToggleSettings:()=>this.updateState({showSettings:!this.state.showSettings}),recordingState:this.state.recordingState,isStopLocked:r,stopLockedTooltip:t.buttons.minimumRecordingTimeNotReached,buttonTranslations:t.buttons}),this.recordingControlsElements),Ev({uploadProgress:this.state.uploadProgress,uploadingLabel:e.uploading},{overlay:this.overlayElements.uploadOverlay,fill:this.overlayElements.uploadFill,text:this.overlayElements.uploadText}),Dv({transitionMessage:this.state.transitionMessage},{overlay:this.overlayElements.transitionOverlay,message:this.overlayElements.transitionMessage}),ly(cy({stream:this.state.stream,showSettings:this.state.showSettings,devices:this.state.devices,onCameraChange:e=>this.handleCameraChange(e),onMicChange:e=>this.handleMicChange(e),translations:t.settings}),this.settingsPanelElement,()=>this.renderSettings()),this.renderStatusSection(),this.renderMobileIndicators(n),this.renderConfigError()}renderStatusSection(){let e=this.state;this.toggleDisplay(`#error`,!!e.error);let t=``;e.error&&(t=e.error),this.setText(`#error`,t)}renderMobileIndicators(e){this.mobileManager?.isModalOpen&&(this.toggleDisplay(`#mobileRecIndicator`,e),this.toggleDisplay(`#mobileTimerBadge`,e),this.setText(`#mobileTimer`,this.state.timer))}toggleDisplay(e,t){let n=this.queryMobileElement(e);if(!n)return;if(!t){n.style.display=`none`;return}let r=n.tagName===`BUTTON`,i=e.includes(`row`)||e.includes(`controls`)||e.includes(`Overlay`)||e.includes(`Indicator`)||e.includes(`Timer`)||e.includes(`Bars`),a=`block`;r&&(a=`inline-flex`),!r&&i&&(a=`flex`),n.style.display=a}setText(e,t){let n=this.queryMobileElement(e);n&&(n.textContent=t)}async startPreview(){if(this.controller)try{await this.controller.startStream(),this.updateState({stream:this.controller.getStream()}),this.clearBrowserUnsupportedState()}catch(e){this.applyBrowserUnsupportedStateFromError(e),this.updateState({error:i(e)})}}stopPreview(){if(!this.controller)return;this.stopAudioAnalysis();let e=this.controller.getStream();if(e)for(let t of e.getTracks())t.stop();this.controller.getStreamManager().stopStream(),this.updateState({stream:null,error:null,errorCode:null,canRetry:!1,browserName:null,browserVersion:null})}renderMobile(){if(!this.mobileManager)return;let e=this.mobileManager.portal;if(!this.mobileManager.isModalOpen){this.innerHTML=wy(this.i18n),this.setupMobileLandingListeners(),By();return}let t=Dy(this.i18n),n=Ty(this.i18n,this.mobileManager.canCloseModal,t);e.render(n),this.setupMobileModalListeners(),this.setupEventListeners(),this.cacheUiElements(),this.handleStreamUpdate(this.state.stream),this.render(),By()}queryMobileElement(e){return this.mobileManager?.isModalOpen&&this.mobileManager.portal.isActive?this.mobileManager.portal.querySelector(e):this.querySelector(e)}getQueryRoot(){return this.mobileManager?.isModalOpen&&this.mobileManager.portal.isActive?this.mobileManager.portal:this}cacheUiElements(){let e=this.getQueryRoot();this.previewContentElements=Mv(e),this.recordingControlsElements=Jv(e),this.videoPreviewElements={previewSkeleton:this.previewContentElements.previewSkeleton,videoPreview:this.previewContentElements.videoPreview},this.audioBarsContainer=this.previewContentElements.audioLevelBars,this.overlayElements={uploadOverlay:e.querySelector(`#uploadProgressOverlay`),uploadFill:e.querySelector(`#uploadProgressFill`),uploadText:e.querySelector(`#uploadProgressText`),transitionOverlay:e.querySelector(`#sourceTransitionOverlay`),transitionMessage:e.querySelector(`#transitionMessage`)},this.settingsPanelElement=e.querySelector(`#settingsPanel`)}setupMobileLandingListeners(){this.querySelector(`#btnMobileOpenCamera`)?.addEventListener(`click`,()=>this.mobileManager?.openModal())}setupMobileModalListeners(){this.queryMobileElement(`#btnMobileCloseModal`)?.addEventListener(`click`,()=>this.mobileManager?.closeModal())}handleCameraChange(e){return this.handleDeviceChange(e,`camera`)}handleMicChange(e){return this.handleDeviceChange(e,`mic`)}async handleDeviceChange(e,t){if(!this.controller)return;let n=mv(this.controller,e);t===`mic`&&(n=hv(this.controller,e)),await n.then(e=>{this.updateState({stream:e})}).catch(e=>{this.updateState({error:i(e)})});let r=this.state.devices;t===`camera`&&(r={...this.state.devices,selectedCamera:e}),t===`mic`&&(r={...this.state.devices,selectedMic:e}),this.updateState({devices:r})}async handleRecord(){if(this.controller)try{this.updateState({configError:null}),await gv(this.controller,xv)}catch(e){this.applyBrowserUnsupportedStateFromError(e),this.updateState({configError:Error(i(e)),error:i(e)})}}async processRecordingBlob(e){if(!this.isProcessingBlob){this.isProcessingBlob=!0;try{if(this.isDemo){this.updateState({recordedBlob:e});return}if(!this.uploadService)throw Error(`Upload service not ready`);let t=`recording-${Date.now()}.mp4`;this.updateState({uploadProgress:0});try{let n=await this.uploadService.uploadVideo(e,{apiKey:this.config.apiKey||``,backendUrl:this.config.backendUrl||``,filename:t,userMetadata:this.config.userMetadata,onProgress:e=>{this.updateState({uploadProgress:e})}});this.updateState({uploadProgress:null}),this.dispatchEvent(new CustomEvent(`upload-complete`,{detail:n}))}catch(e){throw this.updateState({uploadProgress:null}),e}}finally{this.isProcessingBlob=!1}}}isStopBlockedByMinimumTime(){let e=this.state.recordingState===Cv||this.state.isPaused;return Gy(this.config.minTimeRecord,this.state.timer,e)}async stopRecording(){if(!this.controller)return null;if(this.isStopBlockedByMinimumTime())throw Ky();let e=await _v(this.controller,this.isDemo,()=>{},()=>{});return e&&await this.processRecordingBlob(e),e}async handleStop(){if(!this.isStopBlockedByMinimumTime())try{await this.stopRecording()}catch(e){this.applyBrowserUnsupportedStateFromError(e),this.updateState({error:i(e)})}}handlePauseToggle(){this.controller&&(this.state.isPaused&&yv(this.controller),this.state.isPaused||vv(this.controller),this.updateState({isPaused:this.controller.isPaused()}))}handleDownload(){this.state.recordedBlob&&dy(this.state.recordedBlob)}handleMute(){this.controller&&(uy(this.controller),this.updateState({isMuted:this.controller.getIsMuted()}))}async handleSwitch(){if(!this.controller)return;let e=this.controller.getCurrentSourceType(),t=xv;e===xv&&(t=Sv),e===Sv&&(t=xv);try{await bv(this.controller,t)}catch(e){this.applyBrowserUnsupportedStateFromError(e),this.updateState({error:i(e)})}}setupEventListeners(){let e=(e,t)=>{let n=this.queryMobileElement(e);n&&n.addEventListener(`click`,t)};e(`#btnRecord`,()=>this.handleRecord()),e(`#btnStop`,()=>this.handleStop()),e(`#btnPause`,()=>this.handlePauseToggle()),e(`#btnDownload`,()=>this.handleDownload()),e(`#btnMute`,()=>this.handleMute()),e(`#btnSwitchSource`,()=>this.handleSwitch());let t=this.queryMobileElement(`#startCameraArea`);t&&t.addEventListener(`click`,()=>this.startPreview());let n=this.queryMobileElement(`#btnSettings`),r=this.queryMobileElement(`#settingsPanel`);n&&r&&n.addEventListener(`click`,()=>{let e=!this.state.showSettings;this.updateState({showSettings:e}),e&&this.populateSettings()});let i=this.queryMobileElement(`#btnSettingsBack`);i&&r&&i.addEventListener(`click`,()=>{}),this.setupSettingsListeners()}setupSettingsListeners(){let e=this.queryMobileElement(`#btnCameraMenu`);e&&e.addEventListener(`click`,()=>this.navigateSettings(`camera`));let t=this.queryMobileElement(`#btnMicMenu`);t&&t.addEventListener(`click`,()=>this.navigateSettings(`microphone`));let n=this.queryMobileElement(`#btnSettingsBack`);n&&n.addEventListener(`click`,e=>{e.stopPropagation(),this.settingsView!==`main`&&this.navigateSettings(`main`)})}navigateSettings(e){e===`main`?this.slideDirection=`left`:this.slideDirection=`right`,this.settingsView=e,this.renderSettings(),setTimeout(()=>{this.slideDirection=`none`,this.renderSettings()},300)}renderSettings(){this.updateSettingsContent(),this.renderSettingsView()}updateSettingsContent(){let e=this.queryMobileElement(`#settingsContent`);e&&(e.classList.remove(`vidtreo-slide-left`,`vidtreo-slide-right`,`vidtreo-slide-none`),this.slideDirection!==`none`&&e.classList.add(`vidtreo-slide-${this.slideDirection}`))}renderSettingsView(){let e=this.queryMobileElement(`#settingsMain`),t=this.queryMobileElement(`#cameraList`),n=this.queryMobileElement(`#micList`),r=this.queryMobileElement(`#btnSettingsBack`);e&&(e.style.display=`none`),t&&(t.style.display=`none`),n&&(n.style.display=`none`),r&&(r.style.display=`none`),this.settingsView===`main`&&this.renderSettingsMain(e,r),this.settingsView===`camera`&&this.renderSettingsCamera(t,r),this.settingsView===`microphone`&&this.renderSettingsMicrophone(n,r)}renderSettingsMain(e,t){e&&(e.style.display=`flex`),t&&(t.style.display=`none`),this.updateCurrentDeviceLabels()}updateCurrentDeviceLabels(){let e=this.state.devices.cameras.filter(e=>e.deviceId&&e.deviceId.trim()!==``),t=this.state.devices.microphones.filter(e=>e.deviceId&&e.deviceId.trim()!==``),n=e.find(e=>e.deviceId===this.state.devices.selectedCamera),r=t.find(e=>e.deviceId===this.state.devices.selectedMic),i=n?.label||e[0]?.label||`Camera`,a=r?.label||t[0]?.label||`Microphone`;this.setText(`#currentCameraName`,i),this.setText(`#currentMicName`,a)}renderSettingsCamera(e,t){e&&(e.style.display=`flex`,this.renderDeviceList(e,this.state.devices.cameras,this.state.devices.selectedCamera,`camera`));let n=this.queryMobileElement(`.vidtreo-settings-title`),r=this.queryMobileElement(`.vidtreo-settings-back-icon`);t&&(t.style.display=`flex`,t.style.cursor=`pointer`,t.onclick=()=>this.navigateSettings(`main`)),n&&(n.textContent=`Camera`),r&&(r.style.display=`flex`)}renderSettingsMicrophone(e,t){e&&(e.style.display=`flex`,this.renderDeviceList(e,this.state.devices.microphones,this.state.devices.selectedMic,`mic`));let n=this.queryMobileElement(`.vidtreo-settings-title`),r=this.queryMobileElement(`.vidtreo-settings-back-icon`);t&&(t.style.display=`flex`,t.style.cursor=`pointer`,t.onclick=()=>this.navigateSettings(`main`)),n&&(n.textContent=`Microphone`),r&&(r.style.display=`flex`)}renderDeviceList(e,t,n,r){if(!t||t.length===0){e.innerHTML=`<div class="vidtreo-device-empty">No devices found</div>`;return}e.innerHTML=``;for(let i of t){let t=document.createElement(`button`);t.className=`vidtreo-device-option`;let a=i.deviceId===n,o=`<span class="vidtreo-device-checkmark-placeholder"></span>`;a&&(o=`<i class="ph-fill ph-check vidtreo-device-checkmark" style="display: flex; font-size: 20px;"></i>`);let s=i.label;s||=`Device ${i.deviceId.slice(0,8)}`,t.innerHTML=`
10720
+ `;function Ay(e,t,n,r){return{showSettingsButton:!e&&r.enableDeviceChange!==!1,showMuteButton:e&&r.enableMute!==!1,showPauseButton:e&&r.enablePause!==!1&&t===`recording`&&!n,showResumeButton:e&&r.enablePause!==!1&&n,showStopButton:e,showSwitchSourceButton:e&&r.enableSourceSwitching!==!1}}let jy=/^https?:\/\//i;function My(e){return e?jy.test(e)?e:`https://${e}`:`https://core.vidtreo.com`}function Ny(e,t,n){let r=e.getAttribute(t);return r===null?n:r!==`false`}function Py(e,t){let n=e.getAttribute(t);if(!n)return;let r=Number.parseInt(n,10);if(!Number.isNaN(r))return r}function Fy(e,t){let n=e.getAttribute(t);if(n!==null)return n}function Iy(e){return{apiKey:e.getAttribute(`api-key`)||``,backendUrl:My(e.getAttribute(`backend-url`)),demo:Ny(e,`demo`,!1),enableSourceSwitching:Ny(e,`enable-source-switching`,!0),enableMute:Ny(e,`enable-mute`,!0),enablePause:Ny(e,`enable-pause`,!0),enableDeviceChange:Ny(e,`enable-device-change`,!0),enableTabVisibilityOverlay:Ny(e,`enable-tab-visibility-overlay`,!1)}}function Ly(e){let t={},n=Py(e,`countdown-duration`);n!==void 0&&(t.countdownDuration=n);let r=Py(e,`max-recording-time`);r!==void 0&&(t.maxRecordingTime=r);let i=Py(e,`min-time-record`);return i!==void 0&&(t.minTimeRecord=i),t}function Ry(e,t,n){return e?t!==void 0&&t.trim().length>0?t:n!==void 0&&n.trim().length>0?n:void 0:t}function zy(e,t){let n=e.getAttribute(`user-metadata`);if(n)try{let e=JSON.parse(n);return{...t,...e}}catch(e){throw Error(`Invalid user-metadata JSON: ${i(e)}`)}}function By(e,t,n){let r=Iy(e),i=Ly(e),a=Fy(e,`tab-visibility-overlay-text`),o=Ry(r.enableTabVisibilityOverlay===!0,a,n),s=zy(e,t),c={...r,...i};return o!==void 0&&(c={...c,tabVisibilityOverlayText:o}),s!==void 0&&(c={...c,userMetadata:s}),c}function Vy(){if(typeof document>`u`||document.querySelector(`script[src*="@phosphor-icons/web"]`))return;let e=document.createElement(`script`);e.src=`https://unpkg.com/@phosphor-icons/web`,e.async=!0,document.head.appendChild(e)}let Hy=1e3,Uy=/^\d+$/;function Wy(e){return Uy.test(e)}function Gy(e){let t=e.trim();if(t.length===0)return 0;let n=t.split(`:`);if(n.length!==2&&n.length!==3)return 0;for(let e of n)if(!Wy(e))return 0;if(n.length===2){let e=Number.parseInt(n[0],10),t=Number.parseInt(n[1],10);return(e*60+t)*Hy}let r=Number.parseInt(n[0],10),i=Number.parseInt(n[1],10),a=Number.parseInt(n[2],10);return((r*60+i)*60+a)*Hy}function Ky(e,t,n){return!n||e==null||Number.isFinite(e)===!1||e<=0?!1:Gy(t)<e}function qy(){let e=Error(`Minimum recording time has not been reached yet`);return e.code=`recording.minimum-time-not-reached`,e}let Jy={requiresAudio:!1,requiresWatermark:!1},Yy={recordingState:`idle`,stream:null,isVideoLoaded:!1,isMuted:!1,isPaused:!1,showSettings:!1,error:null,errorCode:null,canRetry:!1,browserName:null,browserVersion:null,countdown:null,timer:`00:00`,uploadProgress:null,transitionMessage:null,recordedBlob:null,devices:{cameras:[],microphones:[],selectedCamera:null,selectedMic:null},configError:null};var Xy=class extends HTMLElement{constructor(...e){super(...e),this.controller=null,this.uploadService=null,this.state={...Yy},this.config={},this.isMounted=!1,this.connectionGeneration=0,this.initialized=!1,this.isInitializing=!1,this.isProcessingBlob=!1,this.audioBarsContainer=null,this.previewContentElements=null,this.recordingControlsElements=null,this.videoPreviewElements=null,this.overlayElements=null,this.settingsPanelElement=null,this.audioContext=null,this.analyser=null,this.animationFrameId=null,this.mobileManager=null,this.nativeCameraManager=null,this.i18n=new my,this.settingsView=`main`,this.slideDirection=`none`}static{this.observedAttributes=[`api-key`,`backend-url`,`countdown-duration`,`min-time-record`,`max-recording-time`,`user-metadata`,`enable-source-switching`,`enable-mute`,`enable-pause`,`enable-device-change`,`enable-tab-visibility-overlay`,`tab-visibility-overlay-text`,`demo`,`mobile-mode`,`lang`]}get isDemo(){return this.hasAttribute(`demo`)&&this.getAttribute(`demo`)!==`false`}get lang(){return this.getAttribute(`lang`)||`en`}async connectedCallback(){this.connectionGeneration+=1;let e=this.connectionGeneration;this.i18n.setLang(this.lang);let t=this.shouldProbeWebRecorderSupport();if(await this.probeWebRecorderSupport(t,e),this.shouldAbortConnection(e))return;let n=this.getEffectiveMobileMode();this.initializeRecorderForMobileMode(n)}disconnectedCallback(){this.connectionGeneration+=1,this.isMounted=!1,this.mobileManager?.destroy(),this.nativeCameraManager?.destroy(),this.cleanup()}async probeWebRecorderSupport(e,t){this.isMounted||(this.isMounted=!0,e&&await dh(Jy).then(e=>{if(!this.shouldAbortConnection(t)){if(!e.isSupported){this.updateUnsupportedBrowserState();return}this.updateState({errorCode:null,canRetry:!1,browserName:null,browserVersion:null})}}).catch(()=>{this.shouldAbortConnection(t)||this.updateUnsupportedBrowserState()}))}updateUnsupportedBrowserState(){let e=pv();this.updateState({errorCode:Tv,canRetry:!1,browserName:e.browserName,browserVersion:e.browserVersion})}clearBrowserUnsupportedState(){this.updateState({errorCode:null,canRetry:!1,browserName:null,browserVersion:null})}applyBrowserUnsupportedStateFromError(e){if(!(e&&typeof e==`object`&&`code`in e))return;let t=e;if(t.code?.startsWith(`camera.`)){this.updateState({errorCode:t.code,canRetry:!0,browserName:null,browserVersion:null});return}if(t.code!==Tv)return;let n=pv(),r=n.browserName;t.browserName&&t.browserName.length>0&&(r=t.browserName);let i=n.browserVersion;t.browserVersion&&t.browserVersion.length>0&&(i=t.browserVersion),this.updateState({errorCode:Tv,canRetry:!1,browserName:r,browserVersion:i})}resolveBrowserErrorState(){let e=this.state.errorCode,t=this.state.browserName,n=this.state.browserVersion;if(e===Tv&&t===null){let e=pv();t=e.browserName,n===null&&(n=e.browserVersion)}return{errorCode:e,browserName:t,browserVersion:n}}shouldAbortConnection(e){return!this.isConnected||e!==this.connectionGeneration}initializeRecorderForMobileMode(e){if(e===`native`){this.initNativeCamera();return}if(e===`overlay`){this.mobileManager=new by({getState:()=>({recordingState:this.state.recordingState,uploadProgress:this.state.uploadProgress}),isInitialized:()=>this.initialized,startPreview:()=>this.startPreview(),stopPreview:()=>this.stopPreview(),renderMobile:()=>this.renderMobile()}),this.renderMobile(),this.init();return}this.innerHTML=ky(),this.init()}getRequestedMobileMode(){let e=this.getAttribute(`mobile-mode`);return e===null?null:e===`embed`?`embed`:e===`native`?`native`:`overlay`}shouldProbeWebRecorderSupport(){return this.getRequestedMobileMode()!==`native`}getEffectiveMobileMode(){let e=this.getRequestedMobileMode();return e===null?`overlay`:e}initNativeCamera(){this.config=this.resolveRecorderComponentConfig({}),this.nativeCameraManager=new xy({apiKey:this.config.apiKey,backendUrl:this.config.backendUrl,maxRecordingTime:this.config.maxRecordingTime,userMetadata:this.config.userMetadata,demo:this.isDemo},{onStateChange:()=>this.renderNativeCamera(),onUploadComplete:e=>{this.dispatchEvent(new CustomEvent(`recording-complete`,{detail:e,bubbles:!0,composed:!0}))},onError:e=>{this.dispatchEvent(new CustomEvent(`error`,{detail:{error:e.message},bubbles:!0,composed:!0}))}}),this.renderNativeCamera(),Vy()}renderNativeCamera(){if(!this.nativeCameraManager)return;let e=this.nativeCameraManager.getState();this.innerHTML=Dy(this.i18n);let t=e.file!==null,n=!(t||e.isTranscoding)&&e.uploadProgress===null&&!e.transcodedBlob;this.setElementDisplay(`#nativeCameraEmptyState`,n),this.setElementDisplay(`#nativePreviewContainer`,t||!!e.transcodedBlob),this.setElementDisplay(`#nativeProgressOverlay`,e.isTranscoding||e.uploadProgress!==null),this.updateNativeCameraProgress(e),this.updateNativeCameraPreview(e,t);let r=this.isDemo&&!!e.transcodedBlob&&!e.isTranscoding&&e.uploadProgress===null;this.setElementDisplay(`#nativeActions`,r),this.updateNativeCameraError(e),this.setupNativeCameraListeners()}setElementDisplay(e,t){let n=this.querySelector(e);n instanceof HTMLElement&&(t&&(n.style.display=``),t||(n.style.display=`none`))}updateNativeCameraProgress(e){let t=this.querySelector(`#nativeUploadProgressFill`),n=this.querySelector(`#nativeUploadProgressText`),r=null;t instanceof HTMLElement&&(r=t);let i=e.uploadProgress!==null,a=e.isTranscoding&&!i,o=0;e.uploadProgress!==null&&(o=e.uploadProgress);let s=0;e.transcodingProgress!==null&&(s=e.transcodingProgress),i&&this.setElementDisplay(`#nativeUploadProgress`,!0),r&&i&&(r.style.width=`${o}%`),n&&i&&(n.textContent=`${this.i18n.t(`uploading`)} ${Math.round(o)}%`),a&&this.setElementDisplay(`#nativeUploadProgress`,!0),r&&a&&(r.style.width=`${s}%`),n&&a&&(n.textContent=`${this.i18n.t(`finishing`)} ${Math.round(s)}%`)}updateNativeCameraPreview(e,t){let n=this.querySelector(`#nativeVideoPreview`);if(n){if(t&&e.file){n.src=URL.createObjectURL(e.file.file);return}e.transcodedBlob&&(n.src=URL.createObjectURL(e.transcodedBlob))}}updateNativeCameraError(e){let t=this.querySelector(`#nativeError`);t instanceof HTMLElement&&(e.error?(t.style.display=``,t.textContent=e.error):t.style.display=`none`)}setupNativeCameraListeners(){let e=this.querySelector(`#btnSelectVideo`),t=this.querySelector(`#btnRecordVideo`),n=this.querySelector(`#btnNativeRetake`),r=this.querySelector(`#nativeCameraInput`);e?.addEventListener(`click`,()=>{r&&(r.accept=`video/*`,r.removeAttribute(`capture`),r.click())}),t?.addEventListener(`click`,()=>{r&&(r.accept=`video/*`,r.setAttribute(`capture`,`environment`),r.click())}),n?.addEventListener(`click`,()=>{this.nativeCameraManager?.reset()}),r?.addEventListener(`change`,async e=>{let t=e.target,n=t.files?.[0];if(n&&this.nativeCameraManager)try{let e=await this.nativeCameraManager.handleFileSelect(n);await this.nativeCameraManager.processAndUpload(e)}catch{}t.value=``})}attributeChangedCallback(e,t,n){if(t!==n){if(e===`min-time-record`){let e=By(this,{});this.config={...this.config,minTimeRecord:e.minTimeRecord},this.render();return}[`api-key`,`backend-url`,`demo`].includes(e)&&(this.initialized&&this.cleanup(),this.init())}}async init(){if(!this.isInitializing){this.isInitializing=!0;try{this.initialized&&this.cleanup(),this.config=this.resolveRecorderComponentConfig({});let e=this.config.apiKey||``,t=this.config.backendUrl||``;if(!(this.isDemo||e)){this.updateState({configError:Error(`apiKey is required. Provide it as an attribute or ensure demo mode is enabled.`)}),this.isInitializing=!1;return}this.isDemo||(this.uploadService=new Cy({apiKey:e,backendUrl:t})),this.controller=new nv(mv(this));let n={...this.config};if(await this.controller.initialize(n),this.initialized=!0,this.updateState({configError:null}),this.clearBrowserUnsupportedState(),this.mobileManager){Vy();return}this.cacheUiElements(),this.setupEventListeners(),Vy(),setTimeout(()=>this.startPreview(),100)}catch(e){this.applyBrowserUnsupportedStateFromError(e),this.updateState({error:i(e)})}finally{this.isInitializing=!1}}}renderConfigError(){let e=this.state,t=!!e.configError;if(this.toggleDisplay(`#configErrorOverlay`,t),t&&e.configError){let t=e.configError.message.includes(`apiKey is required`);this.toggleDisplay(`#configErrorMessageDefault`,!t),this.toggleDisplay(`#configErrorDetails`,t),t||this.setText(`#configErrorMessageDefault`,e.configError.message)}}resolveRecorderComponentConfig(e){return By(this,e,this.i18n.t(`userInAnotherTab`))}cleanup(){this.controller&&=(this.controller.cleanup(),null),this.stopAudioAnalysis(),this.initialized=!1,this.state={...Yy}}updateState(e){let t={...this.state,...e};e.stream!==void 0&&(t={...t,isVideoLoaded:!1}),e.recordingState!==void 0&&t.showSettings&&t.recordingState===wv&&(t={...t,showSettings:!1}),this.state=t,this.mobileManager&&e.uploadProgress!==void 0&&this.mobileManager.checkUploadCompletion(this.state.uploadProgress),this.render(),e.stream!==void 0&&this.handleStreamUpdate(this.state.stream),this.state.devices.cameras.length===0&&this.state.stream&&this.updateDevices()}async updateDevices(){if(!this.controller)return;let e=this.controller.getDeviceManager(),t=await e.getAvailableDevices();this.updateState({devices:{cameras:t.videoinput,microphones:t.audioinput,selectedCamera:e.getSelectedCameraDeviceId(),selectedMic:e.getSelectedMicDeviceId()}})}handleStreamUpdate(e){this.videoPreviewElements||this.cacheUiElements(),this.videoPreviewElements&&Mv(e,this.videoPreviewElements,{onVideoLoaded:()=>{this.updateState({isVideoLoaded:!0})},onError:e=>{this.updateState({error:e})},startAudioAnalysis:e=>this.startAudioAnalysis(e),stopAudioAnalysis:()=>this.stopAudioAnalysis()})}startAudioAnalysis(e){if(this.stopAudioAnalysis(),e.getAudioTracks().length!==0)try{this.audioContext=new AudioContext;let t=this.audioContext.createMediaStreamSource(e);this.analyser=this.audioContext.createAnalyser(),this.analyser.fftSize=64,t.connect(this.analyser);let n=new Uint8Array(this.analyser.frequencyBinCount),r=()=>{if(!this.analyser)return;this.analyser.getByteFrequencyData(n);let e=0;for(let t of n)e+=t;let t=e/n.length,i=Math.min(1,t/128);this.renderAudioBars(i),this.animationFrameId=requestAnimationFrame(r)};r()}catch(e){this.updateState({error:i(e)})}}stopAudioAnalysis(){this.animationFrameId&&=(cancelAnimationFrame(this.animationFrameId),null),this.audioContext&&=(this.audioContext.close(),null)}renderAudioBars(e){if(!this.audioBarsContainer)return;let t=Ev,n=``;if(!this.state.isMuted)for(let r of t){let t=Math.max(4,e*24*r);n+=`<div class="vidtreo-audio-level-bar" style="height: ${t}px;"></div>`}this.audioBarsContainer.innerHTML=n}render(){if(this.mobileManager&&!this.mobileManager.isModalOpen||(this.previewContentElements&&this.recordingControlsElements&&this.overlayElements&&this.videoPreviewElements||this.cacheUiElements(),!(this.previewContentElements&&this.recordingControlsElements&&this.overlayElements&&this.videoPreviewElements)))return;let e=this.i18n.getAll(),t=Sy(e),n=this.state.recordingState===wv||this.state.isPaused,r=Ky(this.config.minTimeRecord,this.state.timer,n),a={enableDeviceChange:this.config.enableDeviceChange,enableMute:this.config.enableMute,enablePause:this.config.enablePause,enableSourceSwitching:this.config.enableSourceSwitching},o=Ay(n,this.state.recordingState,this.state.isPaused,a),s=!1;this.isDemo&&!n&&this.state.recordingState===`idle`&&this.state.recordedBlob!==null&&(s=!0);let c={...o,showDownloadButton:s},l=Sv;this.controller&&(l=this.controller.getCurrentSourceType());let{errorCode:u,browserName:d,browserVersion:f}=this.resolveBrowserErrorState();Bv({state:{stream:this.state.stream,transitionMessage:this.state.transitionMessage,recordingState:this.state.recordingState,countdown:this.state.countdown,timer:this.state.timer,isMuted:this.state.isMuted,isPaused:this.state.isPaused,errorCode:u,browserName:d,browserVersion:f},isVideoLoaded:this.state.isVideoLoaded,isRecording:n,controller:this.controller,audioLevel:0,buttonVisibility:c,currentSourceType:l,onStartRecording:()=>this.handleRecord(),onStopRecording:()=>this.handleStop(),onSwitchSource:()=>this.handleSwitch(),onToggleSettings:()=>this.updateState({showSettings:!this.state.showSettings}),onToggleMute:()=>this.handleMute(),onPause:()=>this.handlePauseToggle(),onResume:()=>this.handlePauseToggle(),onRetryCamera:()=>{this.startPreview().catch(e=>{let t;t=e instanceof Error?e:Error(i(e)),this.dispatchEvent(new CustomEvent(`error`,{detail:{error:t.message},bubbles:!0,composed:!0}))})},onLoadedChange:()=>this.updateState({isVideoLoaded:!0}),onDownload:()=>this.handleDownload(),translations:t.preview,buttonTranslations:t.buttons},this.previewContentElements),Xv(Jv({stream:this.state.stream,buttonVisibility:c,currentSourceType:l,isMuted:this.state.isMuted,onDownload:()=>this.handleDownload(),onPause:()=>this.handlePauseToggle(),onResume:()=>this.handlePauseToggle(),onStartRecording:()=>this.handleRecord(),onStopRecording:()=>this.handleStop(),onSwitchSource:()=>this.handleSwitch(),onToggleMute:()=>this.handleMute(),onToggleSettings:()=>this.updateState({showSettings:!this.state.showSettings}),recordingState:this.state.recordingState,isStopLocked:r,stopLockedTooltip:t.buttons.minimumRecordingTimeNotReached,buttonTranslations:t.buttons}),this.recordingControlsElements),Dv({uploadProgress:this.state.uploadProgress,uploadingLabel:e.uploading},{overlay:this.overlayElements.uploadOverlay,fill:this.overlayElements.uploadFill,text:this.overlayElements.uploadText}),Ov({transitionMessage:this.state.transitionMessage},{overlay:this.overlayElements.transitionOverlay,message:this.overlayElements.transitionMessage}),uy(ly({stream:this.state.stream,showSettings:this.state.showSettings,devices:this.state.devices,onCameraChange:e=>this.handleCameraChange(e),onMicChange:e=>this.handleMicChange(e),translations:t.settings}),this.settingsPanelElement,()=>this.renderSettings()),this.renderStatusSection(),this.renderMobileIndicators(n),this.renderConfigError()}renderStatusSection(){let e=this.state;this.toggleDisplay(`#error`,!!e.error);let t=``;e.error&&(t=e.error),this.setText(`#error`,t)}renderMobileIndicators(e){this.mobileManager?.isModalOpen&&(this.toggleDisplay(`#mobileRecIndicator`,e),this.toggleDisplay(`#mobileTimerBadge`,e),this.setText(`#mobileTimer`,this.state.timer))}toggleDisplay(e,t){let n=this.queryMobileElement(e);if(!n)return;if(!t){n.style.display=`none`;return}let r=n.tagName===`BUTTON`,i=e.includes(`row`)||e.includes(`controls`)||e.includes(`Overlay`)||e.includes(`Indicator`)||e.includes(`Timer`)||e.includes(`Bars`),a=`block`;r&&(a=`inline-flex`),!r&&i&&(a=`flex`),n.style.display=a}setText(e,t){let n=this.queryMobileElement(e);n&&(n.textContent=t)}async startPreview(){if(this.controller)try{await this.controller.startStream(),this.updateState({stream:this.controller.getStream()}),this.clearBrowserUnsupportedState()}catch(e){this.applyBrowserUnsupportedStateFromError(e),this.updateState({error:i(e)})}}stopPreview(){if(!this.controller)return;this.stopAudioAnalysis();let e=this.controller.getStream();if(e)for(let t of e.getTracks())t.stop();this.controller.getStreamManager().stopStream(),this.updateState({stream:null,error:null,errorCode:null,canRetry:!1,browserName:null,browserVersion:null})}renderMobile(){if(!this.mobileManager)return;let e=this.mobileManager.portal;if(!this.mobileManager.isModalOpen){this.innerHTML=Ty(this.i18n),this.setupMobileLandingListeners(),Vy();return}let t=Oy(this.i18n),n=Ey(this.i18n,this.mobileManager.canCloseModal,t);e.render(n),this.setupMobileModalListeners(),this.setupEventListeners(),this.cacheUiElements(),this.handleStreamUpdate(this.state.stream),this.render(),Vy()}queryMobileElement(e){return this.mobileManager?.isModalOpen&&this.mobileManager.portal.isActive?this.mobileManager.portal.querySelector(e):this.querySelector(e)}getQueryRoot(){return this.mobileManager?.isModalOpen&&this.mobileManager.portal.isActive?this.mobileManager.portal:this}cacheUiElements(){let e=this.getQueryRoot();this.previewContentElements=Nv(e),this.recordingControlsElements=Yv(e),this.videoPreviewElements={previewSkeleton:this.previewContentElements.previewSkeleton,videoPreview:this.previewContentElements.videoPreview},this.audioBarsContainer=this.previewContentElements.audioLevelBars,this.overlayElements={uploadOverlay:e.querySelector(`#uploadProgressOverlay`),uploadFill:e.querySelector(`#uploadProgressFill`),uploadText:e.querySelector(`#uploadProgressText`),transitionOverlay:e.querySelector(`#sourceTransitionOverlay`),transitionMessage:e.querySelector(`#transitionMessage`)},this.settingsPanelElement=e.querySelector(`#settingsPanel`)}setupMobileLandingListeners(){this.querySelector(`#btnMobileOpenCamera`)?.addEventListener(`click`,()=>this.mobileManager?.openModal())}setupMobileModalListeners(){this.queryMobileElement(`#btnMobileCloseModal`)?.addEventListener(`click`,()=>this.mobileManager?.closeModal())}handleCameraChange(e){return this.handleDeviceChange(e,`camera`)}handleMicChange(e){return this.handleDeviceChange(e,`mic`)}async handleDeviceChange(e,t){if(!this.controller)return;let n=hv(this.controller,e);t===`mic`&&(n=gv(this.controller,e)),await n.then(e=>{this.updateState({stream:e})}).catch(e=>{this.updateState({error:i(e)})});let r=this.state.devices;t===`camera`&&(r={...this.state.devices,selectedCamera:e}),t===`mic`&&(r={...this.state.devices,selectedMic:e}),this.updateState({devices:r})}async handleRecord(){if(this.controller)try{this.updateState({configError:null}),await _v(this.controller,Sv)}catch(e){this.applyBrowserUnsupportedStateFromError(e),this.updateState({configError:Error(i(e)),error:i(e)})}}async processRecordingBlob(e){if(!this.isProcessingBlob){this.isProcessingBlob=!0;try{if(this.isDemo){this.updateState({recordedBlob:e});return}if(!this.uploadService)throw Error(`Upload service not ready`);let t=`recording-${Date.now()}.mp4`;this.updateState({uploadProgress:0});try{let n=await this.uploadService.uploadVideo(e,{apiKey:this.config.apiKey||``,backendUrl:this.config.backendUrl||``,filename:t,userMetadata:this.config.userMetadata,onProgress:e=>{this.updateState({uploadProgress:e})}});this.updateState({uploadProgress:null}),this.dispatchEvent(new CustomEvent(`upload-complete`,{detail:n}))}catch(e){throw this.updateState({uploadProgress:null}),e}}finally{this.isProcessingBlob=!1}}}isStopBlockedByMinimumTime(){let e=this.state.recordingState===wv||this.state.isPaused;return Ky(this.config.minTimeRecord,this.state.timer,e)}async stopRecording(){if(!this.controller)return null;if(this.isStopBlockedByMinimumTime())throw qy();let e=await vv(this.controller,this.isDemo,()=>{},()=>{});return e&&await this.processRecordingBlob(e),e}async handleStop(){if(!this.isStopBlockedByMinimumTime())try{await this.stopRecording()}catch(e){this.applyBrowserUnsupportedStateFromError(e),this.updateState({error:i(e)})}}handlePauseToggle(){this.controller&&(this.state.isPaused&&bv(this.controller),this.state.isPaused||yv(this.controller),this.updateState({isPaused:this.controller.isPaused()}))}handleDownload(){this.state.recordedBlob&&fy(this.state.recordedBlob)}handleMute(){this.controller&&(dy(this.controller),this.updateState({isMuted:this.controller.getIsMuted()}))}async handleSwitch(){if(!this.controller)return;let e=this.controller.getCurrentSourceType(),t=Sv;e===Sv&&(t=Cv),e===Cv&&(t=Sv);try{await xv(this.controller,t)}catch(e){this.applyBrowserUnsupportedStateFromError(e),this.updateState({error:i(e)})}}setupEventListeners(){let e=(e,t)=>{let n=this.queryMobileElement(e);n&&n.addEventListener(`click`,t)};e(`#btnRecord`,()=>this.handleRecord()),e(`#btnStop`,()=>this.handleStop()),e(`#btnPause`,()=>this.handlePauseToggle()),e(`#btnDownload`,()=>this.handleDownload()),e(`#btnMute`,()=>this.handleMute()),e(`#btnSwitchSource`,()=>this.handleSwitch());let t=this.queryMobileElement(`#startCameraArea`);t&&t.addEventListener(`click`,()=>this.startPreview());let n=this.queryMobileElement(`#btnSettings`),r=this.queryMobileElement(`#settingsPanel`);n&&r&&n.addEventListener(`click`,()=>{let e=!this.state.showSettings;this.updateState({showSettings:e}),e&&this.populateSettings()});let i=this.queryMobileElement(`#btnSettingsBack`);i&&r&&i.addEventListener(`click`,()=>{}),this.setupSettingsListeners()}setupSettingsListeners(){let e=this.queryMobileElement(`#btnCameraMenu`);e&&e.addEventListener(`click`,()=>this.navigateSettings(`camera`));let t=this.queryMobileElement(`#btnMicMenu`);t&&t.addEventListener(`click`,()=>this.navigateSettings(`microphone`));let n=this.queryMobileElement(`#btnSettingsBack`);n&&n.addEventListener(`click`,e=>{e.stopPropagation(),this.settingsView!==`main`&&this.navigateSettings(`main`)})}navigateSettings(e){e===`main`?this.slideDirection=`left`:this.slideDirection=`right`,this.settingsView=e,this.renderSettings(),setTimeout(()=>{this.slideDirection=`none`,this.renderSettings()},300)}renderSettings(){this.updateSettingsContent(),this.renderSettingsView()}updateSettingsContent(){let e=this.queryMobileElement(`#settingsContent`);e&&(e.classList.remove(`vidtreo-slide-left`,`vidtreo-slide-right`,`vidtreo-slide-none`),this.slideDirection!==`none`&&e.classList.add(`vidtreo-slide-${this.slideDirection}`))}renderSettingsView(){let e=this.queryMobileElement(`#settingsMain`),t=this.queryMobileElement(`#cameraList`),n=this.queryMobileElement(`#micList`),r=this.queryMobileElement(`#btnSettingsBack`);e&&(e.style.display=`none`),t&&(t.style.display=`none`),n&&(n.style.display=`none`),r&&(r.style.display=`none`),this.settingsView===`main`&&this.renderSettingsMain(e,r),this.settingsView===`camera`&&this.renderSettingsCamera(t,r),this.settingsView===`microphone`&&this.renderSettingsMicrophone(n,r)}renderSettingsMain(e,t){e&&(e.style.display=`flex`),t&&(t.style.display=`none`),this.updateCurrentDeviceLabels()}updateCurrentDeviceLabels(){let e=this.state.devices.cameras.filter(e=>e.deviceId&&e.deviceId.trim()!==``),t=this.state.devices.microphones.filter(e=>e.deviceId&&e.deviceId.trim()!==``),n=e.find(e=>e.deviceId===this.state.devices.selectedCamera),r=t.find(e=>e.deviceId===this.state.devices.selectedMic),i=n?.label||e[0]?.label||`Camera`,a=r?.label||t[0]?.label||`Microphone`;this.setText(`#currentCameraName`,i),this.setText(`#currentMicName`,a)}renderSettingsCamera(e,t){e&&(e.style.display=`flex`,this.renderDeviceList(e,this.state.devices.cameras,this.state.devices.selectedCamera,`camera`));let n=this.queryMobileElement(`.vidtreo-settings-title`),r=this.queryMobileElement(`.vidtreo-settings-back-icon`);t&&(t.style.display=`flex`,t.style.cursor=`pointer`,t.onclick=()=>this.navigateSettings(`main`)),n&&(n.textContent=`Camera`),r&&(r.style.display=`flex`)}renderSettingsMicrophone(e,t){e&&(e.style.display=`flex`,this.renderDeviceList(e,this.state.devices.microphones,this.state.devices.selectedMic,`mic`));let n=this.queryMobileElement(`.vidtreo-settings-title`),r=this.queryMobileElement(`.vidtreo-settings-back-icon`);t&&(t.style.display=`flex`,t.style.cursor=`pointer`,t.onclick=()=>this.navigateSettings(`main`)),n&&(n.textContent=`Microphone`),r&&(r.style.display=`flex`)}renderDeviceList(e,t,n,r){if(!t||t.length===0){e.innerHTML=`<div class="vidtreo-device-empty">No devices found</div>`;return}e.innerHTML=``;for(let i of t){let t=document.createElement(`button`);t.className=`vidtreo-device-option`;let a=i.deviceId===n,o=`<span class="vidtreo-device-checkmark-placeholder"></span>`;a&&(o=`<i class="ph-fill ph-check vidtreo-device-checkmark" style="display: flex; font-size: 20px;"></i>`);let s=i.label;s||=`Device ${i.deviceId.slice(0,8)}`,t.innerHTML=`
10721
10721
  <div class="vidtreo-device-option-check-container">${o}</div>
10722
10722
  <span class="vidtreo-device-option-label">${s}</span>
10723
- `,t.onclick=()=>{r===`camera`&&this.handleCameraChange(i.deviceId),r===`mic`&&this.handleMicChange(i.deviceId),this.navigateSettings(`main`)},e.appendChild(t)}}populateSettings(){this.settingsView=`main`,this.slideDirection=`none`,this.renderSettings()}};return customElements.get(`vidtreo-recorder`)||customElements.define(`vidtreo-recorder`,Yy),e.VidtreoRecorder=Yy,e})({});
10723
+ `,t.onclick=()=>{r===`camera`&&this.handleCameraChange(i.deviceId),r===`mic`&&this.handleMicChange(i.deviceId),this.navigateSettings(`main`)},e.appendChild(t)}}populateSettings(){this.settingsView=`main`,this.slideDirection=`none`,this.renderSettings()}};return customElements.get(`vidtreo-recorder`)||customElements.define(`vidtreo-recorder`,Xy),e.VidtreoRecorder=Xy,e})({});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vidtreo/recorder-wc",
3
- "version": "1.3.5",
3
+ "version": "1.3.6",
4
4
  "type": "module",
5
5
  "description": "Web component for @vidtreo/recorder - video recording SDK",
6
6
  "main": "./dist/vidtreo-recorder.js",
@@ -26,7 +26,7 @@
26
26
  ],
27
27
  "license": "MIT",
28
28
  "peerDependencies": {
29
- "@vidtreo/recorder": ">=1.3.2"
29
+ "@vidtreo/recorder": ">=1.3.3"
30
30
  },
31
31
  "devDependencies": {
32
32
  "@types/node": "^25.2.3",