@vidtreo/recorder-wc 0.9.8 → 1.0.0-rc1

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.
package/README.md CHANGED
@@ -20,7 +20,7 @@ npm install @vidtreo/recorder-wc
20
20
 
21
21
  <vidtreo-recorder
22
22
  api-key="your-api-key"
23
- backend-url="https://api.vidtreo.com"
23
+ backend-url="https://core.vidtreo.com"
24
24
  ></vidtreo-recorder>
25
25
  ```
26
26
 
@@ -33,7 +33,7 @@ npm install @vidtreo/recorder-wc
33
33
 
34
34
  <vidtreo-recorder
35
35
  api-key="your-api-key"
36
- <!-- backend-url is optional, defaults to https://api.vidtreo.com -->
36
+ <!-- backend-url is optional, defaults to https://core.vidtreo.com -->
37
37
  ></vidtreo-recorder>
38
38
  ```
39
39
 
@@ -52,7 +52,7 @@ All attributes are optional except where noted. Attributes use kebab-case (e.g.,
52
52
  | Attribute | Type | Required | Default | Description |
53
53
  |-----------|------|----------|---------|-------------|
54
54
  | `api-key` | `string` | No* | - | API key for authentication. Required if not set via JavaScript. |
55
- | `backend-url` | `string` | No | `https://api.vidtreo.com` | Backend API URL. Automatically adds `https://` prefix if missing. |
55
+ | `backend-url` | `string` | No | `https://core.vidtreo.com` | Backend API URL. Automatically adds `https://` prefix if missing. |
56
56
  | `countdown-duration` | `number` | No | - | Countdown duration in milliseconds before recording starts (e.g., `3000` for 3 seconds) |
57
57
  | `max-recording-time` | `number` | No | - | Maximum recording time in milliseconds (e.g., `300000` for 5 minutes) |
58
58
  | `user-metadata` | `string` (JSON) | No | - | Custom metadata to attach to recordings. Must be valid JSON string. |
@@ -84,7 +84,7 @@ All attributes are optional except where noted. Attributes use kebab-case (e.g.,
84
84
 
85
85
  <vidtreo-recorder
86
86
  api-key="your-api-key"
87
- backend-url="https://api.vidtreo.com"
87
+ backend-url="https://core.vidtreo.com"
88
88
  ></vidtreo-recorder>
89
89
  ```
90
90
 
@@ -93,7 +93,7 @@ All attributes are optional except where noted. Attributes use kebab-case (e.g.,
93
93
  ```html
94
94
  <vidtreo-recorder
95
95
  api-key="your-api-key"
96
- backend-url="https://api.vidtreo.com"
96
+ backend-url="https://core.vidtreo.com"
97
97
  countdown-duration="3000"
98
98
  max-recording-time="300000"
99
99
  ></vidtreo-recorder>
@@ -104,7 +104,7 @@ All attributes are optional except where noted. Attributes use kebab-case (e.g.,
104
104
  ```html
105
105
  <vidtreo-recorder
106
106
  api-key="your-api-key"
107
- backend-url="https://api.vidtreo.com"
107
+ backend-url="https://core.vidtreo.com"
108
108
  user-metadata='{"userId": "12345", "sessionId": "abc123"}'
109
109
  ></vidtreo-recorder>
110
110
  ```
@@ -114,7 +114,7 @@ All attributes are optional except where noted. Attributes use kebab-case (e.g.,
114
114
  ```html
115
115
  <vidtreo-recorder
116
116
  api-key="your-api-key"
117
- backend-url="https://api.vidtreo.com"
117
+ backend-url="https://core.vidtreo.com"
118
118
  enable-source-switching="false"
119
119
  enable-mute="false"
120
120
  enable-pause="false"
@@ -127,7 +127,7 @@ All attributes are optional except where noted. Attributes use kebab-case (e.g.,
127
127
  ```html
128
128
  <vidtreo-recorder
129
129
  api-key="your-api-key"
130
- backend-url="https://api.vidtreo.com"
130
+ backend-url="https://core.vidtreo.com"
131
131
  enable-source-switching="false"
132
132
  enable-mute="false"
133
133
  enable-pause="false"
@@ -181,7 +181,7 @@ const recorder = document.querySelector('vidtreo-recorder');
181
181
  <vidtreo-recorder
182
182
  id="my-recorder"
183
183
  api-key="your-api-key"
184
- backend-url="https://api.vidtreo.com"
184
+ backend-url="https://core.vidtreo.com"
185
185
  ></vidtreo-recorder>
186
186
 
187
187
  <button onclick="startRecording()">Start Recording</button>
@@ -217,7 +217,7 @@ const recorder = document.querySelector('vidtreo-recorder');
217
217
  <vidtreo-recorder
218
218
  id="my-recorder"
219
219
  api-key="your-api-key"
220
- backend-url="https://api.vidtreo.com"
220
+ backend-url="https://core.vidtreo.com"
221
221
  ></vidtreo-recorder>
222
222
 
223
223
  <script type="module">
@@ -248,7 +248,7 @@ const recorder = document.querySelector('vidtreo-recorder');
248
248
  <vidtreo-recorder
249
249
  id="my-recorder"
250
250
  api-key="your-api-key"
251
- backend-url="https://api.vidtreo.com"
251
+ backend-url="https://core.vidtreo.com"
252
252
  ></vidtreo-recorder>
253
253
 
254
254
  <script type="module">
@@ -295,7 +295,7 @@ The web component uses Shadow DOM, so styles are encapsulated. However, you can
295
295
 
296
296
  <vidtreo-recorder
297
297
  api-key="your-api-key"
298
- backend-url="https://api.vidtreo.com"
298
+ backend-url="https://core.vidtreo.com"
299
299
  ></vidtreo-recorder>
300
300
  ```
301
301
 
@@ -306,7 +306,7 @@ The web component uses Shadow DOM, so styles are encapsulated. However, you can
306
306
  <vidtreo-recorder
307
307
  id="recorder"
308
308
  api-key="your-api-key"
309
- backend-url="https://api.vidtreo.com"
309
+ backend-url="https://core.vidtreo.com"
310
310
  ></vidtreo-recorder>
311
311
 
312
312
  <button type="submit">Submit Recording</button>
@@ -346,7 +346,7 @@ For Vite projects, you can use environment variables:
346
346
  ```bash
347
347
  # .env
348
348
  VITE_VIDTREO_API_KEY=your-api-key
349
- VITE_VIDTREO_BACKEND_URL=https://api.vidtreo.com
349
+ VITE_VIDTREO_BACKEND_URL=https://core.vidtreo.com
350
350
  ```
351
351
 
352
352
  ```html
@@ -104,7 +104,7 @@ function o(e){if(!e)throw Error(`Assertion failed.`)}var s,c,l,u,d,f,p,m,h,g,_,v
104
104
  Tracks were discarded because your environment is not able to encode any of the following codecs: ${t.map(e=>`'${e}'`).join(`, `)}.`),t.includes(`mp3`)&&e.push(`
105
105
  The @mediabunny/mp3-encoder extension package provides support for encoding MP3.`)}else e.push(`
106
106
  Check the discardedTracks field for more info.`)}return e}async execute(){if(!this.isValid)throw Error(`Cannot execute this conversion because its output configuration is invalid. Make sure to always check the isValid field before executing a conversion.
107
- `+this._getInvalidityExplanation().join(``));if(this._executed)throw Error(`Conversion cannot be executed twice.`);if(this._executed=!0,this.onProgress){this._computeProgress=!0,this._totalDuration=Math.min(await this.input.computeDuration()-this._startTimestamp,this._endTimestamp-this._startTimestamp);for(let e of this.utilizedTracks)this._maxTimestamps.set(e.id,0);this.onProgress?.(0)}await this.output.start(),this._start();try{await Promise.all(this._trackPromises)}catch(e){throw this._canceled||this.cancel(),e}this._canceled&&await new Promise(()=>{}),await this.output.finalize(),this._computeProgress&&this.onProgress?.(1)}async cancel(){if(!(this.output.state===`finalizing`||this.output.state===`finalized`)){if(this._canceled){console.warn(`Conversion already canceled.`);return}this._canceled=!0,await this.output.cancel()}}async _processVideoTrack(e,t){let n=e.codec;if(!n){this.discardedTracks.push({track:e,reason:`unknown_source_codec`});return}let r,i=s(e.rotation+(t.rotate??0)),a=this.output.format.supportsVideoRotationMetadata&&(t.allowRotationMetadata??!0),[c,l]=i%180==0?[e.codedWidth,e.codedHeight]:[e.codedHeight,e.codedWidth],u=t.crop;u&&rr(u,c,l);let[d,f]=u?[u.width,u.height]:[c,l],p=d,m=f,h=p/m,g=e=>Math.ceil(e/2)*2;t.width!==void 0&&t.height===void 0?(p=g(t.width),m=g(Math.round(p/h))):t.width===void 0&&t.height!==void 0?(m=g(t.height),p=g(Math.round(m*h))):t.width!==void 0&&t.height!==void 0&&(p=g(t.width),m=g(t.height));let _=await e.getFirstTimestamp(),v=!!t.forceTranscode||this._startTimestamp>0||_<0||!!t.frameRate||t.keyFrameInterval!==void 0||t.process!==void 0,y=p!==d||m!==f||i!==0&&(!a||t.process!==void 0)||!!u,ee=t.alpha??`discard`,te=this.output.format.getSupportedVideoCodecs();if(!v&&!t.bitrate&&!y&&te.includes(n)&&(!t.codec||t.codec===n)){let t=new ku(n);r=t,this._trackPromises.push((async()=>{await this._started;let n=new yr(e),r={decoderConfig:await e.getDecoderConfig()??void 0},i=Number.isFinite(this._endTimestamp)?await n.getPacket(this._endTimestamp,{metadataOnly:!0})??void 0:void 0;for await(let a of n.packets(void 0,i,{verifyKeyPackets:!0})){if(this._canceled)return;ee===`discard`&&(delete a.sideData.alpha,delete a.sideData.alphaByteLength),this._reportProgress(e.id,a.timestamp),await t.add(a,r),this._synchronizer.shouldWait(e.id,a.timestamp)&&await this._synchronizer.wait(a.timestamp)}t.close(),this._synchronizer.closeTrack(e.id)})())}else{if(!await e.canDecode()){this.discardedTracks.push({track:e,reason:`undecodable_source_codec`});return}t.codec&&(te=te.filter(e=>e===t.codec));let n=t.bitrate??pu,a=await Cu(te,{width:t.process&&t.processedWidth?t.processedWidth:p,height:t.process&&t.processedHeight?t.processedHeight:m,bitrate:n});if(!a){this.discardedTracks.push({track:e,reason:`no_encodable_target_codec`});return}let s={codec:a,bitrate:n,keyFrameInterval:t.keyFrameInterval,sizeChangeBehavior:t.fit??`passThrough`,alpha:ee,hardwareAcceleration:t.hardwareAcceleration},c=new Mu(s);if(r=c,!y){let t=new $u({format:new ql,target:new yl}),n=new Mu(s);t.addVideoTrack(n),await t.start();let r=await new Tr(e).getSample(_);if(r)try{await n.add(r),r.close(),await t.finalize()}catch(e){console.info(`Error when probing encoder support. Falling back to rerender path.`,e),y=!0,t.cancel()}else await t.cancel()}y?this._trackPromises.push((async()=>{await this._started;let n=new Er(e,{width:p,height:m,fit:t.fit??`fill`,rotation:i,crop:t.crop,poolSize:1,alpha:ee===`keep`}).canvases(this._startTimestamp,this._endTimestamp),r=t.frameRate,a=null,s=null,l=null,u=async n=>{o(a),o(r!==void 0);let i=Math.round((n-s)*r);for(let n=1;n<i;n++){let i=new er(a,{timestamp:s+n/r,duration:1/r});await this._registerVideoSample(e,t,c,i),i.close()}};for await(let{canvas:i,timestamp:o,duration:d}of n){if(this._canceled)return;let n=Math.max(o-this._startTimestamp,0);if(l=n+d,r!==void 0){let e=Math.floor(n*r)/r;if(a!==null)if(e<=s){a=i,s=e;continue}else await u(e);n=e}let f=new er(i,{timestamp:n,duration:r===void 0?d:1/r});await this._registerVideoSample(e,t,c,f),f.close(),r!==void 0&&(a=i,s=n)}a&&(o(l!==null),o(r!==void 0),await u(Math.floor(l*r)/r)),c.close(),this._synchronizer.closeTrack(e.id)})()):this._trackPromises.push((async()=>{await this._started;let n=new Tr(e),r=t.frameRate,i=null,a=null,s=null,l=async n=>{o(i),o(r!==void 0);let s=Math.round((n-a)*r);for(let n=1;n<s;n++)i.setTimestamp(a+n/r),i.setDuration(1/r),await this._registerVideoSample(e,t,c,i);i.close()};for await(let o of n.samples(this._startTimestamp,this._endTimestamp)){if(this._canceled){i?.close();return}let n=Math.max(o.timestamp-this._startTimestamp,0);if(s=n+o.duration,r!==void 0){let e=Math.floor(n*r)/r;if(i!==null)if(e<=a){i.close(),i=o,a=e;continue}else await l(e);n=e,o.setDuration(1/r)}o.setTimestamp(n),await this._registerVideoSample(e,t,c,o),r===void 0?o.close():(i=o,a=n)}i&&(o(s!==null),o(r!==void 0),await l(Math.floor(s*r)/r)),c.close(),this._synchronizer.closeTrack(e.id)})())}this.output.addVideoTrack(r,{frameRate:t.frameRate,languageCode:Oe(e.languageCode)?e.languageCode:void 0,name:e.name??void 0,disposition:e.disposition,rotation:y?0:i}),this._addedCounts.video++,this._totalTrackCount++,this.utilizedTracks.push(e)}async _registerVideoSample(e,t,n,r){if(this._canceled)return;this._reportProgress(e.id,r.timestamp);let i;if(!t.process)i=[r];else{let e=t.process(r);e instanceof Promise&&(e=await e),Array.isArray(e)||(e=e===null?[]:[e]),i=e.map(e=>e instanceof er?e:typeof VideoFrame<`u`&&e instanceof VideoFrame?new er(e):new er(e,{timestamp:r.timestamp,duration:r.duration}))}for(let t of i){if(this._canceled)break;await n.add(t),this._synchronizer.shouldWait(e.id,t.timestamp)&&await this._synchronizer.wait(t.timestamp)}for(let e of i)e!==r&&e.close()}async _processAudioTrack(e,t){let n=e.codec;if(!n){this.discardedTracks.push({track:e,reason:`unknown_source_codec`});return}let r,i=e.numberOfChannels,a=e.sampleRate,o=await e.getFirstTimestamp(),s=t.numberOfChannels??i,c=t.sampleRate??a,l=s!==i||c!==a||this._startTimestamp>0||o<0,u=this.output.format.getSupportedAudioCodecs();if(!t.forceTranscode&&!t.bitrate&&!l&&u.includes(n)&&(!t.codec||t.codec===n)&&!t.process){let t=new Iu(n);r=t,this._trackPromises.push((async()=>{await this._started;let n=new yr(e),r={decoderConfig:await e.getDecoderConfig()??void 0},i=Number.isFinite(this._endTimestamp)?await n.getPacket(this._endTimestamp,{metadataOnly:!0})??void 0:void 0;for await(let a of n.packets(void 0,i)){if(this._canceled)return;this._reportProgress(e.id,a.timestamp),await t.add(a,r),this._synchronizer.shouldWait(e.id,a.timestamp)&&await this._synchronizer.wait(a.timestamp)}t.close(),this._synchronizer.closeTrack(e.id)})())}else{if(!await e.canDecode()){this.discardedTracks.push({track:e,reason:`undecodable_source_codec`});return}let n=null;t.codec&&(u=u.filter(e=>e===t.codec));let i=t.bitrate??pu,a=await xu(u,{numberOfChannels:t.process&&t.processedNumberOfChannels?t.processedNumberOfChannels:s,sampleRate:t.process&&t.processedSampleRate?t.processedSampleRate:c,bitrate:i});if(!a.some(e=>ot.includes(e))&&u.some(e=>ot.includes(e))&&(s!==rd||c!==id)){let e=(await xu(u,{numberOfChannels:rd,sampleRate:id,bitrate:i})).find(e=>ot.includes(e));e&&(l=!0,n=e,s=rd,c=id)}else n=a[0]??null;if(n===null){this.discardedTracks.push({track:e,reason:`no_encodable_target_codec`});return}if(l)r=this._resampleAudio(e,t,n,s,c,i);else{let a=new Ru({codec:n,bitrate:i});r=a,this._trackPromises.push((async()=>{await this._started;let n=new kr(e);for await(let r of n.samples(void 0,this._endTimestamp)){if(this._canceled)return;await this._registerAudioSample(e,t,a,r),r.close()}a.close(),this._synchronizer.closeTrack(e.id)})())}}this.output.addAudioTrack(r,{languageCode:Oe(e.languageCode)?e.languageCode:void 0,name:e.name??void 0,disposition:e.disposition}),this._addedCounts.audio++,this._totalTrackCount++,this.utilizedTracks.push(e)}async _registerAudioSample(e,t,n,r){if(this._canceled)return;this._reportProgress(e.id,r.timestamp);let i;if(!t.process)i=[r];else{let e=t.process(r);if(e instanceof Promise&&(e=await e),Array.isArray(e)||(e=e===null?[]:[e]),!e.every(e=>e instanceof lr))throw TypeError(`The audio process function must return an AudioSample, null, or an array of AudioSamples.`);i=e}for(let t of i){if(this._canceled)break;await n.add(t),this._synchronizer.shouldWait(e.id,t.timestamp)&&await this._synchronizer.wait(t.timestamp)}for(let e of i)e!==r&&e.close()}_resampleAudio(e,t,n,r,i,a){let o=new Ru({codec:n,bitrate:a});return this._trackPromises.push((async()=>{await this._started;let n=new cd({targetNumberOfChannels:r,targetSampleRate:i,startTime:this._startTimestamp,endTime:this._endTimestamp,onSample:async n=>{await this._registerAudioSample(e,t,o,n),n.close()}}),a=new kr(e).samples(this._startTimestamp,this._endTimestamp);for await(let e of a){if(this._canceled)return;await n.add(e),e.close()}await n.finalize(),o.close(),this._synchronizer.closeTrack(e.id)})()),o}_reportProgress(e,t){if(!this._computeProgress)return;o(this._totalDuration!==null),this._maxTimestamps.set(e,Math.max(t,this._maxTimestamps.get(e)));let n=C(Math.min(...this._maxTimestamps.values())/this._totalDuration,0,1);n!==this._lastProgress&&(this._lastProgress=n,this.onProgress?.(n))}},od=5,sd=class{constructor(){this.maxTimestamps=new Map,this.resolvers=[]}computeMinAndMaybeResolve(){let e=1/0;for(let[,t]of this.maxTimestamps)e=Math.min(e,t);for(let t=0;t<this.resolvers.length;t++){let n=this.resolvers[t];n.timestamp-e<od&&(n.resolve(),this.resolvers.splice(t,1),t--)}return e}shouldWait(e,t){return this.maxTimestamps.set(e,Math.max(t,this.maxTimestamps.get(e)??-1/0)),t-this.computeMinAndMaybeResolve()>=od}wait(e){let{promise:t,resolve:n}=x();return this.resolvers.push({timestamp:e,resolve:n}),t}closeTrack(e){this.maxTimestamps.delete(e),this.computeMinAndMaybeResolve()}},cd=class{constructor(e){this.sourceSampleRate=null,this.sourceNumberOfChannels=null,this.targetSampleRate=e.targetSampleRate,this.targetNumberOfChannels=e.targetNumberOfChannels,this.startTime=e.startTime,this.endTime=e.endTime,this.onSample=e.onSample,this.bufferSizeInFrames=Math.floor(this.targetSampleRate*5),this.bufferSizeInSamples=this.bufferSizeInFrames*this.targetNumberOfChannels,this.outputBuffer=new Float32Array(this.bufferSizeInSamples),this.bufferStartFrame=0,this.maxWrittenFrame=-1}doChannelMixerSetup(){o(this.sourceNumberOfChannels!==null);let e=this.sourceNumberOfChannels,t=this.targetNumberOfChannels;e===1&&t===2?this.channelMixer=(t,n)=>t[n*e]:e===1&&t===4?this.channelMixer=(t,n,r)=>t[n*e]*+(r<2):e===1&&t===6?this.channelMixer=(t,n,r)=>t[n*e]*+(r===2):e===2&&t===1?this.channelMixer=(t,n)=>{let r=n*e;return .5*(t[r]+t[r+1])}:e===2&&t===4||e===2&&t===6?this.channelMixer=(t,n,r)=>t[n*e+r]*+(r<2):e===4&&t===1?this.channelMixer=(t,n)=>{let r=n*e;return .25*(t[r]+t[r+1]+t[r+2]+t[r+3])}:e===4&&t===2?this.channelMixer=(t,n,r)=>{let i=n*e;return .5*(t[i+r]+t[i+r+2])}:e===4&&t===6?this.channelMixer=(t,n,r)=>{let i=n*e;return r<2?t[i+r]:r===2||r===3?0:t[i+r-2]}:e===6&&t===1?this.channelMixer=(t,n)=>{let r=n*e;return Math.SQRT1_2*(t[r]+t[r+1])+t[r+2]+.5*(t[r+4]+t[r+5])}:e===6&&t===2?this.channelMixer=(t,n,r)=>{let i=n*e;return t[i+r]+Math.SQRT1_2*(t[i+2]+t[i+r+4])}:e===6&&t===4?this.channelMixer=(t,n,r)=>{let i=n*e;return r<2?t[i+r]+Math.SQRT1_2*t[i+2]:t[i+r+2]}:this.channelMixer=(t,n,r)=>r<e?t[n*e+r]:0}ensureTempBufferSize(e){let t=this.tempSourceBuffer.length;for(;t<e;)t*=2;if(t!==this.tempSourceBuffer.length){let e=new Float32Array(t);e.set(this.tempSourceBuffer),this.tempSourceBuffer=e}}async add(e){this.sourceSampleRate===null&&(this.sourceSampleRate=e.sampleRate,this.sourceNumberOfChannels=e.numberOfChannels,this.tempSourceBuffer=new Float32Array(this.sourceSampleRate*this.sourceNumberOfChannels),this.doChannelMixerSetup());let t=e.numberOfFrames*e.numberOfChannels;this.ensureTempBufferSize(t);let n=e.allocationSize({planeIndex:0,format:`f32`}),r=new Float32Array(this.tempSourceBuffer.buffer,0,n/4);e.copyTo(r,{planeIndex:0,format:`f32`});let i=e.timestamp-this.startTime,a=e.numberOfFrames/this.sourceSampleRate,s=Math.min(i+a,this.endTime-this.startTime),c=Math.floor(i*this.targetSampleRate),l=Math.ceil(s*this.targetSampleRate);for(let t=c;t<l;t++){if(t<this.bufferStartFrame)continue;for(;t>=this.bufferStartFrame+this.bufferSizeInFrames;)await this.finalizeCurrentBuffer(),this.bufferStartFrame+=this.bufferSizeInFrames;let n=t-this.bufferStartFrame;o(n<this.bufferSizeInFrames);let a=(t/this.targetSampleRate-i)*this.sourceSampleRate,s=Math.floor(a),c=Math.ceil(a),l=a-s;for(let t=0;t<this.targetNumberOfChannels;t++){let i=0,a=0;s>=0&&s<e.numberOfFrames&&(i=this.channelMixer(r,s,t)),c>=0&&c<e.numberOfFrames&&(a=this.channelMixer(r,c,t));let o=i+l*(a-i),u=n*this.targetNumberOfChannels+t;this.outputBuffer[u]+=o}this.maxWrittenFrame=Math.max(this.maxWrittenFrame,n)}}async finalizeCurrentBuffer(){if(this.maxWrittenFrame<0)return;let e=(this.maxWrittenFrame+1)*this.targetNumberOfChannels,t=new Float32Array(e);t.set(this.outputBuffer.subarray(0,e));let n=this.bufferStartFrame/this.targetSampleRate,r=new lr({format:`f32`,sampleRate:this.targetSampleRate,numberOfChannels:this.targetNumberOfChannels,timestamp:n,data:t});await this.onSample(r),this.outputBuffer.fill(0),this.maxWrittenFrame=-1}finalize(){return this.finalizeCurrentBuffer()}}})),ud=r({ADTS:()=>Eo,ALL_FORMATS:()=>Oo,ALL_TRACK_TYPES:()=>Zu,AUDIO_CODECS:()=>st,AdtsInputFormat:()=>vo,AdtsOutputFormat:()=>eu,AttachedFile:()=>$e,AudioBufferSink:()=>Ar,AudioBufferSource:()=>zu,AudioSample:()=>lr,AudioSampleSink:()=>kr,AudioSampleSource:()=>Ru,AudioSource:()=>Fu,BaseMediaSampleSink:()=>xr,BlobSource:()=>Fo,BufferSource:()=>Po,BufferTarget:()=>gl,CanvasSink:()=>Er,CanvasSource:()=>Nu,Conversion:()=>ad,CustomAudioDecoder:()=>Mn,CustomAudioEncoder:()=>Pn,CustomVideoDecoder:()=>jn,CustomVideoEncoder:()=>Nn,EncodedAudioPacketSource:()=>Iu,EncodedPacket:()=>D,EncodedPacketSink:()=>yr,EncodedVideoPacketSource:()=>ku,FLAC:()=>Do,FilePathSource:()=>zo,FilePathTarget:()=>vl,FlacInputFormat:()=>_o,FlacOutputFormat:()=>tu,Input:()=>Go,InputAudioTrack:()=>Pr,InputDisposedError:()=>Ko,InputFormat:()=>so,InputTrack:()=>Mr,InputVideoTrack:()=>Nr,IsobmffInputFormat:()=>co,IsobmffOutputFormat:()=>Kl,MATROSKA:()=>xo,MP3:()=>Co,MP4:()=>yo,MatroskaInputFormat:()=>fo,MediaSource:()=>Du,MediaStreamAudioTrackSource:()=>Bu,MediaStreamVideoTrackSource:()=>Pu,MkvOutputFormat:()=>Yl,MovOutputFormat:()=>Jl,Mp3InputFormat:()=>mo,Mp3OutputFormat:()=>Zl,Mp4InputFormat:()=>lo,Mp4OutputFormat:()=>ql,NON_PCM_AUDIO_CODECS:()=>ot,NullTarget:()=>yl,OGG:()=>To,OggInputFormat:()=>go,OggOutputFormat:()=>$l,Output:()=>$u,OutputFormat:()=>Gl,PCM_AUDIO_CODECS:()=>T,QTFF:()=>bo,QUALITY_HIGH:()=>pu,QUALITY_LOW:()=>du,QUALITY_MEDIUM:()=>fu,QUALITY_VERY_HIGH:()=>mu,QUALITY_VERY_LOW:()=>uu,Quality:()=>lu,QuickTimeInputFormat:()=>uo,ReadableStreamSource:()=>Vo,RichImageData:()=>Qe,SUBTITLE_CODECS:()=>ct,Source:()=>No,StreamSource:()=>Bo,StreamTarget:()=>_l,SubtitleSource:()=>Ju,Target:()=>hl,TextSubtitleSource:()=>Yu,UrlSource:()=>Ro,VIDEO_CODECS:()=>at,VIDEO_SAMPLE_PIXEL_FORMATS:()=>Qn,VideoSample:()=>er,VideoSampleColorSpace:()=>tr,VideoSampleSink:()=>Tr,VideoSampleSource:()=>Mu,VideoSource:()=>Ou,WAVE:()=>wo,WEBM:()=>So,WavOutputFormat:()=>Ql,WaveInputFormat:()=>ho,WebMInputFormat:()=>po,WebMOutputFormat:()=>Xl,canEncode:()=>hu,canEncodeAudio:()=>_u,canEncodeSubtitles:()=>vu,canEncodeVideo:()=>gu,getEncodableAudioCodecs:()=>xu,getEncodableCodecs:()=>yu,getEncodableSubtitleCodecs:()=>Su,getEncodableVideoCodecs:()=>bu,getFirstEncodableAudioCodec:()=>wu,getFirstEncodableSubtitleCodec:()=>Tu,getFirstEncodableVideoCodec:()=>Cu,registerDecoder:()=>zn,registerEncoder:()=>Bn}),dd=n((()=>{ed(),nu(),Xu(),E(),Eu(),bl(),Wo(),ko(),qo(),Fr(),Un(),hr(),jr(),ld(),Vn(),it()}));dd();let fd={mp4:`aac`,mov:`aac`,mkv:`opus`,webm:`opus`};function pd(e){return fd[e]}let md={sd:du,hd:fu,fhd:pu,"4k":mu},hd={sd:{width:854,height:480},hd:{width:1280,height:720},fhd:{width:1920,height:1080},"4k":{width:3840,height:2160}},gd=Object.freeze({format:`mp4`,fps:30,width:hd.fhd.width,height:hd.fhd.height,bitrate:md.fhd,audioCodec:`aac`,audioBitrate:96e3,watermark:{url:`https://avatars.githubusercontent.com/u/244247750?s=200&v=4`,opacity:1,position:`bottom-right`}});function _d(e){return{...gd,format:e,audioCodec:pd(e)}}function vd(e){let{preset:t,outputFormat:n,watermark:r}=e;if(!(t in md))throw Error(`Invalid preset: ${t}`);let{width:i,height:a}=hd[t],o=n||`mp4`,s=pd(o),c={format:o,width:i,height:a,bitrate:md[t],audioCodec:s,audioBitrate:128e3};return r&&(c.watermark={url:r.url,opacity:r.opacity,position:r.position}),c}let yd=new Map;function bd(e,t){return`${e}:${t}`}var xd=class e{constructor(e){if(this.cachedConfig=null,this.cacheTimestamp=0,this.fetchPromise=null,this.options=e,e.cacheTimeout!==void 0){if(typeof e.cacheTimeout!=`number`||e.cacheTimeout<=0)throw Error(`cacheTimeout must be a positive number`);this.cacheTimeout=e.cacheTimeout}else this.cacheTimeout=3e5}static getInstance(t){let n=bd(t.backendUrl,t.apiKey),r=yd.get(n);return r||(r=new e(t),yd.set(n,r)),r}async fetchConfig(){let e=Date.now();if(this.cachedConfig&&e-this.cacheTimestamp<this.cacheTimeout)return this.cachedConfig;if(this.fetchPromise)return this.fetchPromise;this.fetchPromise=this.fetchConfigFromBackend();try{let t=await this.fetchPromise;return this.cachedConfig=t,this.cacheTimestamp=e,this.fetchPromise=null,t}catch{return this.fetchPromise=null,gd}}clearCache(){let e=bd(this.options.backendUrl,this.options.apiKey);this.cachedConfig=null,this.cacheTimestamp=0,this.fetchPromise=null,yd.delete(e)}static clearAllInstances(){yd.clear()}getCurrentConfig(){if(!this.cachedConfig)throw Error(`No cached config available. Call fetchConfig() first.`);return this.cachedConfig}async fetchConfigFromBackend(){let e=`${this.options.backendUrl}/api/v1/videos/config`,t=await fetch(e,{method:`GET`,headers:{Authorization:`Bearer ${this.options.apiKey}`,"Content-Type":`application/json`}});if(!t.ok)throw Error(`Failed to fetch config: ${t.status} ${t.statusText}`);let n=await t.json();if(!n.presetEncoding)throw Error(`Invalid config response from backend: missing presetEncoding`);return vd({preset:n.presetEncoding,outputFormat:n.outputFormat,watermark:n.watermark})}},Sd=class{constructor(){this.configService=null,this.currentConfig=gd,this.configFetched=!1}async initialize(e,t){if(this.configService)return;if(!e)throw Error(`apiKey is required`);let n=t||`https://api.vidtreo.com`;this.configService=xd.getInstance({apiKey:e,backendUrl:n}),this.configService.fetchConfig().then(e=>{this.currentConfig=e,this.configFetched=!0}).catch(()=>{this.configFetched=!1})}async fetchConfig(){this.configService&&(this.currentConfig=await this.configService.fetchConfig(),this.configFetched=!0)}async getConfig(){return this.configService&&!this.configFetched&&await this.fetchConfig(),this.currentConfig}clearCache(){if(!this.configService)throw Error(`ConfigService is not initialized`);this.configService.clearCache()}},Cd=class{constructor(e,t){this.availableDevices={audioinput:[],videoinput:[]},this.selectedCameraDeviceId=null,this.selectedMicDeviceId=null,this.streamManager=e,this.callbacks=t}async getAvailableDevices(){return this.availableDevices=await this.streamManager.getAvailableDevices(),this.callbacks?.onDevicesChanged&&this.callbacks.onDevicesChanged(this.availableDevices),this.availableDevices}setCameraDevice(e){this.selectedCameraDeviceId=e,this.streamManager.setVideoDevice(e),this.callbacks?.onDeviceSelected&&this.callbacks.onDeviceSelected(`camera`,e)}setMicDevice(e){this.selectedMicDeviceId=e,this.streamManager.setAudioDevice(e),this.callbacks?.onDeviceSelected&&this.callbacks.onDeviceSelected(`mic`,e)}getSelectedCameraDeviceId(){return this.selectedCameraDeviceId}getSelectedMicDeviceId(){return this.selectedMicDeviceId}getAvailableDevicesList(){return this.availableDevices}};dd();async function wd(e){try{let t=new Fo(e),n=new Go({formats:[yo],source:t});if(typeof n.computeDuration!=`function`)throw Error(`computeDuration method is not available`);let r=await n.computeDuration();if(!r)throw Error(`Duration is missing from computeDuration`);if(r<=0)throw Error(`Invalid duration: must be greater than 0`);return r}catch{return Td(e)}}function Td(e){return new Promise((t,n)=>{let r=document.createElement(`video`),i=URL.createObjectURL(e),a=()=>{URL.revokeObjectURL(i)};r.addEventListener(`loadedmetadata`,()=>{a();let e=r.duration;if(!Number.isFinite(e)||e<=0){n(Error(`Invalid video duration`));return}t(e)}),r.addEventListener(`error`,()=>{a(),n(Error(`Failed to load video metadata`))}),r.src=i,r.load()})}let Ed=`pending-uploads`,Dd=`status`,Od=`createdAt`;var kd=class{constructor(){this.db=null}init(){return this.db?Promise.resolve():new Promise((e,t)=>{let n=indexedDB.open(`vidtreo-recorder`,1);n.onerror=()=>{n.error?t(n.error):t(Error(`Failed to open database`))},n.onsuccess=()=>{if(!n.result){t(Error(`Database result is null`));return}this.db=n.result,e()},n.onupgradeneeded=e=>{let n=e.target.result;if(!n){t(Error(`Database upgrade result is null`));return}if(!n.objectStoreNames.contains(Ed)){let e=n.createObjectStore(Ed,{keyPath:`id`});e.createIndex(Dd,Dd,{unique:!1}),e.createIndex(Od,Od,{unique:!1})}}})}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(Dd).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([Ed],e).objectStore(Ed))}},Ad=class{constructor(){this.storageService=null,this.cleanupIntervalId=null}async initialize(e){this.storageService||=new kd,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 jd(){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 Md=jd(),Nd={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 Pd(e,t,n){if(!Md)return``;let r=n?.prefix||`[${e.toUpperCase()}]`;return`${Nd[n?.color||Fd(e)]}${r}${Nd.reset} ${t}`}function Fd(e){switch(e){case`error`:return`red`;case`warn`:return`yellow`;case`info`:return`cyan`;case`debug`:return`gray`;default:return`white`}}function Id(e,t,...n){if(!Md)return;let r=Pd(e,t);console[e](r,...n)}let W={log:(e,...t)=>{Id(`log`,e,...t)},info:(e,...t)=>{Id(`info`,e,...t)},warn:(e,...t)=>{Id(`warn`,e,...t)},error:(e,...t)=>{Id(`error`,e,...t)},debug:(e,...t)=>{Id(`debug`,e,...t)},group:(e,t=`cyan`)=>{if(!Md)return;let n=Nd[t],r=Nd.reset;console.group(`${n}${e}${r}`)},groupEnd:()=>{Md&&console.groupEnd()}},Ld=`live`;var Rd=class{constructor(e,t={}){this.currentSourceType=`camera`,this.originalCameraStream=null,this.originalCameraConstraints=null,this.screenShareStream=null,this.screenShareTrackEndHandler=null,this.streamManager=e,this.callbacks=t}getCurrentSourceType(){return this.currentSourceType}getOriginalCameraStream(){return this.originalCameraStream}stopLiveTracks(e){for(let t of e)t.readyState===Ld&&t.stop()}stopStreamTracks(e){this.stopLiveTracks(e.getTracks())}stopStreamVideoTracks(e){this.stopLiveTracks(e.getVideoTracks())}isTrackLive(e){return e!==void 0&&e.readyState===Ld}areTracksLive(e,t){return this.isTrackLive(e)&&this.isTrackLive(t)}storeOriginalCameraConstraints(e){let t=e.getVideoTracks()[0];if(!t)return;let n=t.getSettings();this.originalCameraConstraints={width:n.width,height:n.height,aspectRatio:n.aspectRatio,frameRate:n.frameRate,deviceId:n.deviceId,facingMode:n.facingMode}}storeOriginalCameraStream(e){let t=e.getVideoTracks()[0],n=e.getAudioTracks()[0];this.areTracksLive(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?this.originalCameraStream.getAudioTracks()[0]:void 0;W.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:this.isTrackLive(t),screenVideoTrackId:e.id,screenVideoTrackReadyState:e.readyState});let n=[e];this.isTrackLive(t)&&t?(n.push(t),W.debug(`[SourceSwitchManager] Added original audio track to combined stream`,{audioTrackId:t.id,combinedTracksCount:n.length})):W.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 W.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}handleScreenSelectionError(){this.callbacks.onScreenSelectionEnd&&this.callbacks.onScreenSelectionEnd(),this.callbacks.onTransitionEnd&&this.callbacks.onTransitionEnd()}isPermissionDeniedError(e){let t=i(e);return t.includes(`NotAllowedError`)||t.includes(`AbortError`)||t.toLowerCase().includes(`permission denied`)||t.toLowerCase().includes(`user denied`)}async processScreenShareStream(e,t){this.screenShareStream=e;let n=e.getVideoTracks()[0];if(!n)throw this.stopStreamTracks(e),Error(`No video track found in screen share stream`);let r=this.combineScreenShareWithOriginalAudio(n);t&&t!==this.originalCameraStream&&this.stopStreamVideoTracks(t);let i=e.getAudioTracks();for(let e of i)e.stop();return this.currentSourceType=`screen`,this.callbacks.onSourceChange&&await this.callbacks.onSourceChange(this.currentSourceType),this.setupScreenShareTrackHandler(r),r}async switchToScreenCapture(){let e=this.streamManager.getStream();e&&(this.storeOriginalCameraConstraints(e),this.storeOriginalCameraStream(e)),this.callbacks.onTransitionStart&&this.callbacks.onTransitionStart(`Select screen to share...`),this.callbacks.onScreenSelectionStart&&this.callbacks.onScreenSelectionStart();try{let t=await navigator.mediaDevices.getDisplayMedia({video:!0,audio:!0});return await this.processScreenShareStream(t,e)}catch(e){if(this.handleScreenSelectionError(),this.isPermissionDeniedError(e))return null;throw e}}setupScreenShareTrackHandler(e){let t=e.getVideoTracks()[0];if(!t)throw Error(`No video track found in screen share stream`);let n=this.screenShareTrackEndHandler;if(n){let e=this.streamManager.getStream();if(e){let t=e.getVideoTracks()[0];t&&t.removeEventListener(`ended`,n)}}this.screenShareTrackEndHandler=async()=>{if(this.currentSourceType===`screen`)try{await this.switchToCamera()}catch(e){this.callbacks.onError&&this.callbacks.onError(this.createError(e))}},t.addEventListener(`ended`,this.screenShareTrackEndHandler)}removeScreenShareTrackHandler(e){if(!(this.screenShareTrackEndHandler&&e))return;let t=e.getVideoTracks()[0];t&&t.removeEventListener(`ended`,this.screenShareTrackEndHandler),this.screenShareTrackEndHandler=null}canReuseStream(e,t){if(!e||t&&e!==this.originalCameraStream)return!1;let n=e.getVideoTracks()[0],r=e.getAudioTracks()[0];return!(!this.areTracksLive(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}getSelectedCameraDeviceId(){return this.callbacks.getSelectedCameraDeviceId?this.callbacks.getSelectedCameraDeviceId():this.streamManager.getVideoDevice()}getSelectedMicDeviceId(){return this.callbacks.getSelectedMicDeviceId?this.callbacks.getSelectedMicDeviceId():this.streamManager.getAudioDevice()}buildVideoConstraints(e){let t={};if(this.originalCameraConstraints){let{deviceId:e,...n}=this.originalCameraConstraints;Object.assign(t,n)}if(e)t.deviceId={exact:e};else if(!t.deviceId){let e=this.getSelectedCameraDeviceId();e&&(t.deviceId={exact:e})}return t}buildAudioConstraints(e){return e?{deviceId:{exact:e}}:!0}validateTrack(e,t,n){if(!this.isTrackLive(e)){this.stopStreamTracks(n);let r=e?e.readyState:`undefined`;throw Error(`Failed to get live camera ${t} track. ReadyState: ${r}`)}}async createCameraStreamWithOriginalAudio(e){let t=this.originalCameraStream?this.originalCameraStream.getAudioTracks()[0]:void 0;if(W.debug(`[SourceSwitchManager] createCameraStreamWithOriginalAudio`,{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:this.isTrackLive(t),cameraDeviceId:e}),!this.isTrackLive(t))return W.warn(`[SourceSwitchManager] Original audio track is not live, cannot reuse`,{originalAudioTrackId:t?.id,originalAudioTrackReadyState:t?.readyState}),null;let n=this.buildVideoConstraints(e),r={video:Object.keys(n).length>0?n:!0,audio:!1};W.debug(`[SourceSwitchManager] Requesting new video stream`,{constraints:r,cameraDeviceId:e});let i=await navigator.mediaDevices.getUserMedia(r),a=i.getVideoTracks()[0];this.validateTrack(a,`video`,i),W.debug(`[SourceSwitchManager] New video stream obtained`,{newStreamId:i.id,videoTrackId:a.id,videoTrackReadyState:a.readyState,newStreamAudioTracksCount:i.getAudioTracks().length});let o=[a];t&&o.push(t),W.debug(`[SourceSwitchManager] Creating combined stream with original audio`,{videoTrackId:a.id,audioTrackId:t?.id,audioTrackReadyState:t?.readyState,audioTrackEnabled:t?.enabled,audioTrackMuted:t?.muted,combinedTracksCount:o.length});let s=new MediaStream(o);this.stopLiveTracks(i.getAudioTracks());let c=this.originalCameraStream?.id;return this.originalCameraStream=s,W.debug(`[SourceSwitchManager] Combined stream created and assigned`,{combinedStreamId:s.id,previousOriginalCameraStreamId:c,newOriginalCameraStreamId:this.originalCameraStream.id,combinedStreamVideoTracksCount:s.getVideoTracks().length,combinedStreamAudioTracksCount:s.getAudioTracks().length,combinedStreamAudioTrackId:s.getAudioTracks()[0]?.id,combinedStreamAudioTrackReadyState:s.getAudioTracks()[0]?.readyState,audioTrackStillSame:s.getAudioTracks()[0]===t}),s}async createCameraStreamWithNewAudio(e){let t=this.getSelectedMicDeviceId(),n=this.buildVideoConstraints(e),r=this.buildAudioConstraints(t),i={video:Object.keys(n).length>0?n:!0,audio:r},a=await navigator.mediaDevices.getUserMedia(i),o=a.getVideoTracks()[0],s=a.getAudioTracks()[0];return this.validateTrack(o,`video`,a),this.validateTrack(s,`audio`,a),this.originalCameraStream=a,a}async createNewCameraStreamForRecording(){let e=this.getSelectedCameraDeviceId();return await this.createCameraStreamWithOriginalAudio(e)||this.createCameraStreamWithNewAudio(e)}async getCameraStream(){let e=this.streamManager.isRecording(),t=this.getSelectedCameraDeviceId(),n=this.getSelectedMicDeviceId();if(this.streamManager.setVideoDevice(t),this.streamManager.setAudioDevice(n),this.canReuseOriginalStream()){if(!this.originalCameraStream)throw Error(`Original camera stream is null`);return this.originalCameraStream}if(this.canReuseManagerStream()){let e=this.streamManager.getStream();if(!e)throw Error(`Manager stream is null`);return e}!e&&this.originalCameraStream&&(this.originalCameraStream=null);let r=this.streamManager.getStream();if(!e&&r&&r!==this.originalCameraStream&&(this.stopStreamTracks(r),this.streamManager.setMediaStream(null)),e)return this.streamManager.setVideoDevice(this.getSelectedCameraDeviceId()),this.streamManager.setAudioDevice(this.getSelectedMicDeviceId()),this.createNewCameraStreamForRecording();let i=await this.streamManager.startStream();return this.originalCameraStream=i,i}async switchToCamera(){let e=this.streamManager.isRecording();if(!(!e&&this.currentSourceType===`camera`))try{this.notifyTransitionStart(`Switching to camera...`),await this.handleScreenShareStop();let t=await this.getCameraStream();if(!t)throw Error(`Failed to get camera stream`);await this.applyCameraStream(t,e),this.notifyTransitionEnd()}catch(e){throw this.notifyTransitionEnd(),e}}notifyTransitionStart(e){this.callbacks.onTransitionStart&&this.callbacks.onTransitionStart(e)}notifyTransitionEnd(){this.callbacks.onTransitionEnd&&this.callbacks.onTransitionEnd()}stopScreenShareStreamTracks(e){let t=e.getVideoTracks(),n=e.getAudioTracks();W.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`&&t.readyState===Ld&&(W.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;W.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(W.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();W.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}))}),this.removeScreenShareTrackHandler(e),this.stopScreenShareStreamTracks(e),this.stopDisplayTracks(e),this.screenShareStream=null,await this.waitForTracksToEnd(0),W.debug(`[SourceSwitchManager] Screen share stream stopped`,{screenShareAudioTracksAfterStop:t.map(e=>({id:e.id,readyState:e.readyState}))})}if(t){let e=t.getAudioTracks();W.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}))}),this.stopStreamVideoTracks(t),this.stopDisplayTracks(t),W.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}))})}W.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),W.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())try{this.currentSourceType===`camera`?await this.switchToScreen():await this.switchToCamera()}catch(e){this.handleToggleError(e)}}async switchToScreen(){let e=await this.switchToScreenCapture();if(!e){this.notifyTransitionEnd();return}this.notifyTransitionStart(`Switching to screen...`),await this.streamManager.switchVideoSource(e),this.callbacks.onPreviewUpdate&&await this.callbacks.onPreviewUpdate(e),this.notifyTransitionEnd()}handleToggleError(e){this.notifyTransitionEnd();let t=i(e);t.includes(`NotAllowedError`)||t.includes(`AbortError`)?this.currentSourceType===`screen`&&this.switchToCamera().catch(e=>{this.callbacks.onError&&this.callbacks.onError(this.createError(e))}):this.callbacks.onError&&this.callbacks.onError(this.createError(e))}async handleRecordingStop(){if(this.currentSourceType!==`screen`){this.cleanup();return}try{let e=this.streamManager.getStream();e&&(this.removeScreenShareTrackHandler(e),this.stopStreamVideoTracks(e));let t=await this.getCameraStream();if(!t)throw Error(`Failed to get camera stream`);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&&=(this.removeScreenShareTrackHandler(this.screenShareStream),this.stopScreenShareStreamTracks(this.screenShareStream),null);let e=this.streamManager.getStream();e&&this.removeScreenShareTrackHandler(e),this.screenShareTrackEndHandler=null,this.originalCameraStream=null,this.originalCameraConstraints=null}setCallbacks(e){this.callbacks={...this.callbacks,...e}}};let zd=Object.freeze({width:{ideal:gd.width||1920},height:{ideal:gd.height||1080},frameRate:{ideal:gd.fps||30}}),Bd=Object.freeze({video:zd,audio:!0});Object.freeze({mimeType:`video/webm;codecs=vp9,opus`});var Vd=class{constructor(e={}){this.mediaStream=null,this.state=`idle`,this.eventListeners=new Map,this.selectedAudioDeviceId=null,this.selectedVideoDeviceId=null,this.streamConfig={...Bd,...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(W.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)W.debug(`[StreamManager] Stopping existing stream to recreate`),this.stopStream();else return W.debug(`[StreamManager] Reusing existing stream`),this.mediaStream;if(e?.getSettings&&e.getSettings().deviceId===this.selectedVideoDeviceId)return W.debug(`[StreamManager] Existing stream matches device, reusing`),this.mediaStream;W.debug(`[StreamManager] Device changed, stopping existing stream`),this.stopStream()}this.setState(`starting`),W.debug(`[StreamManager] State set to 'starting'`);try{W.debug(`[StreamManager] Building constraints`,{selectedVideoDeviceId:this.selectedVideoDeviceId,selectedAudioDeviceId:this.selectedAudioDeviceId});let e={video:this.buildVideoConstraints(this.selectedVideoDeviceId),audio:this.buildAudioConstraints(this.selectedAudioDeviceId)};return W.debug(`[StreamManager] Requesting media stream with constraints`,{hasVideo:!!e.video,hasAudio:!!e.audio}),this.mediaStream=await navigator.mediaDevices.getUserMedia(e),W.info(`[StreamManager] Media stream obtained`,{streamId:this.mediaStream.id,videoTracks:this.mediaStream.getVideoTracks().length,audioTracks:this.mediaStream.getAudioTracks().length}),this.setState(`active`),W.debug(`[StreamManager] State set to 'active'`),W.debug(`[StreamManager] Emitting streamstart event`),this.emit(`streamstart`,{stream:this.mediaStream}),this.mediaStream}catch(e){let t=e instanceof Error?e:Error(i(e));throw W.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 navigator.mediaDevices.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 Hd=[`Bytes`,`KB`,`MB`,`GB`],Ud=1024;function Wd(e){if(e===0)return`0 Bytes`;let t=Math.floor(Math.log(e)/Math.log(Ud));return`${Math.round(e/Ud**t*100)/100} ${Hd[t]}`}function Gd(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`)}`}var Kd=class{constructor(){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)}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=Date.now(),this.endCurrentIntervalIfActive())}resume(){if(!this.isTracking||this.pauseStartTime===null)return;let e=Date.now()-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=Date.now())}endCurrentIntervalIfActive(){if(this.currentIntervalStart===null)return;let e=Date.now(),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)}};function qd(e,t){if(e==null)throw Error(t);return e}function Jd(e,t=`StreamProcessor`){if(!e)throw Error(`${t} is required`);return e}let Yd=1e3;var Xd=class{constructor(e){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}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();if(W.debug(`[StreamRecordingState] startRecording called`,{hasMediaStream:!!i,isRecording:this.isRecording(),hasProcessor:!!e,audioTracks:i?.getAudioTracks().length||0}),!i)throw Error(`Stream must be started before recording`);if(this.isRecording())return W.debug(`[StreamRecordingState] Already recording, returning`),Promise.resolve();this.streamProcessor=e,W.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=Wd(e);this.streamManager.emit(`recordingbufferupdate`,{size:e,formatted:t})},Yd),this.resetRecordingState();let a=n&&r?{enabled:!0,text:r,recordingStartTime:this.recordingStartTime}:void 0;W.debug(`[StreamRecordingState] Overlay config`,{enableTabVisibilityOverlay:n,hasOverlayText:!!r,overlayText:r,overlayConfig:a}),W.debug(`[StreamRecordingState] Starting processing`),await e.startProcessing(i,t,a),W.info(`[StreamRecordingState] Processing started and worker ready`),n&&(W.debug(`[StreamRecordingState] Setting up tab visibility tracking`,{recordingStartTime:this.recordingStartTime}),this.tabVisibilityTracker=new Kd,this.tabVisibilityTracker.start(this.recordingStartTime),this.setupVisibilityUpdates(e)),this.streamManager.setState(`recording`),this.streamManager.emit(`recordingstart`,{recorder:null}),this.startRecordingTimer()}async stopRecording(){if(W.debug(`[StreamRecordingState] stopRecording called`,{hasStreamProcessor:!!this.streamProcessor,isRecording:this.isRecording()}),!(this.streamProcessor&&this.isRecording()))throw Error(`Not currently recording`);this.streamManager.setState(`stopping`),this.clearRecordingTimer(),this.clearBufferSizeInterval(),this.resetPauseState(),this.cleanupVisibilityUpdates();let e=[];this.tabVisibilityTracker?(e=this.tabVisibilityTracker.getIntervals(),W.debug(`[StreamRecordingState] Tab visibility intervals collected`,{intervalsCount:e.length,intervals:e}),this.tabVisibilityTracker.cleanup(),this.tabVisibilityTracker=null):W.debug(`[StreamRecordingState] No tab visibility tracker was active`),W.debug(`[StreamRecordingState] Finalizing stream processor`);let t=await this.streamProcessor.finalize();return W.info(`[StreamRecordingState] Stream processor finalized`,{blobSize:t.blob.size,hasBlob:!!t.blob}),this.streamManager.setState(`active`),this.streamManager.emit(`recordingstop`,{blob:t.blob,mimeType:`video/mp4`}),this.streamProcessor=null,W.debug(`[StreamRecordingState] StreamProcessor cleared`),{blob:t.blob,tabVisibilityIntervals:e}}pauseRecording(){this.clearRecordingTimer(),this.pauseStartTime===null&&(this.pauseStartTime=Date.now()),this.tabVisibilityTracker&&this.tabVisibilityTracker.pause(),this.streamProcessor&&this.isRecording()&&this.streamProcessor.pause()}resumeRecording(){if(this.pauseStartTime!==null){let e=Date.now()-this.pauseStartTime;this.totalPausedTime+=e,this.pauseStartTime=null}this.tabVisibilityTracker&&this.tabVisibilityTracker.resume(),this.startRecordingTimer(),this.streamProcessor&&this.isRecording()&&this.streamProcessor.resume()}toggleMute(){Jd(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 Jd(this.streamProcessor,`StreamProcessor`).switchVideoSource(e)}getCurrentVideoSource(){return qd(Jd(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=(Date.now()-this.recordingStartTime-this.totalPausedTime)/1e3,t=this.formatTimeElapsed(e);this.streamManager.emit(`recordingtimeupdate`,{elapsed:e,formatted:t})},Yd)}clearRecordingTimer(){this.recordingTimer!==null&&(clearInterval(this.recordingTimer),this.recordingTimer=null)}clearBufferSizeInterval(){this.bufferSizeUpdateInterval!==null&&(clearInterval(this.bufferSizeUpdateInterval),this.bufferSizeUpdateInterval=null)}resetRecordingState(){this.recordingStartTime=performance.now(),this.totalPausedTime=0,this.pauseStartTime=null}resetPauseState(){this.totalPausedTime=0,this.pauseStartTime=null}setupVisibilityUpdates(e){if(typeof document>`u`||typeof window>`u`){W.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=performance.now();W.debug(`[StreamRecordingState] Visibility change`,{isHidden:t,timestamp:n,visibilityState:document.visibilityState}),e.updateTabVisibility(t,n)},this.blurHandler=()=>{let t=performance.now();W.debug(`[StreamRecordingState] Window blur`,{timestamp:t}),e.updateTabVisibility(!0,t)},this.focusHandler=()=>{let t=performance.now();W.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=performance.now();W.debug(`[StreamRecordingState] Initial state is hidden`,{timestamp:t}),e.updateTabVisibility(!0,t)}else W.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()}},Zd=class{constructor(e={}){this.streamManager=new Vd(e),this.recordingState=new Xd(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()}},Qd=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,duration:e.duration,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)}},$d=class{async uploadVideo(e,t){if(!t.filename)throw Error(`Filename is required`);if(!e.type||e.type.trim()===``)throw Error(`Blob type is required`);let n=await this.initVideoUpload({apiKey:t.apiKey,backendUrl:t.backendUrl,filename:t.filename,fileSize:e.size,mimeType:e.type,metadata:t.metadata,userMetadata:t.userMetadata});return this.uploadVideoFile(e,n.uploadUrl,{apiKey:t.apiKey,duration:t.duration,onProgress:t.onProgress})}async initVideoUpload(e){let t=`${e.backendUrl}/api/v1/videos/init`,n={filename:e.filename,fileSize:e.fileSize,mimeType:e.mimeType,preProcessed:!0};e.metadata&&(n.metadata=e.metadata),e.userMetadata&&(n.userMetadata=e.userMetadata);let r=await fetch(t,{method:`POST`,headers:{Authorization:`Bearer ${e.apiKey}`,"Content-Type":`application/json`},body:JSON.stringify(n)});if(!r.ok){let e=await this.extractErrorFromResponse(r,`Failed to initialize video upload`);throw Error(e)}return await r.json()}async extractErrorFromResponse(e,t){let n=await this.parseJsonResponse(e);return n&&typeof n==`object`&&`error`in n&&typeof n.error==`string`?n.error:`${t}: ${e.status} ${e.statusText}`}async parseJsonResponse(e){let t=await e.json();return typeof t==`object`&&t?t:null}uploadVideoFile(e,t,n){return new Promise((r,i)=>{let a=new XMLHttpRequest;if(n.onProgress){let e=n.onProgress;a.upload.addEventListener(`progress`,t=>{t.lengthComputable&&e(t.loaded/t.total)})}a.addEventListener(`load`,()=>{if(a.status>=200&&a.status<=299){this.parseSuccessResponse(a,r,i);return}this.parseErrorResponse(a,i)}),a.addEventListener(`error`,()=>{i(Error(`Network error during upload`))}),a.addEventListener(`abort`,()=>{i(Error(`Upload was aborted`))}),a.open(`PUT`,t),a.setRequestHeader(`Authorization`,`Bearer ${n.apiKey}`),a.setRequestHeader(`Content-Type`,e.type),n.duration!==void 0&&a.setRequestHeader(`X-Video-Duration`,n.duration.toString()),a.send(e)})}parseSuccessResponse(e,t,n){let r=this.safeParseJsonFromXhr(e);if(!r){n(Error(`Failed to parse upload response: invalid JSON`));return}t(r)}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}};function ef(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`)}dd();function tf(e){if(e!==void 0)return typeof e==`number`?e:e===du?`low`:e===fu?`medium`:e===pu?`high`:e===mu?`very-high`:`high`}async function nf(e,t,n){try{let{canEncodeVideo:r}=await Promise.resolve().then(()=>(dd(),ud));if(typeof r==`function`){let i={};if(e!==void 0&&(i.width=e),t!==void 0&&(i.height=t),n!==void 0&&(i.bitrate=n),await r(`hevc`,i))return`hevc`}}catch{}return`avc`}let rf=null;function af(){if(rf)return rf;if(typeof Blob>`u`||typeof URL>`u`)throw Error(`Blob and URL APIs are required for worker loading`);let e=new Blob([`// ../../node_modules/mediabunny/dist/modules/src/misc.js
107
+ `+this._getInvalidityExplanation().join(``));if(this._executed)throw Error(`Conversion cannot be executed twice.`);if(this._executed=!0,this.onProgress){this._computeProgress=!0,this._totalDuration=Math.min(await this.input.computeDuration()-this._startTimestamp,this._endTimestamp-this._startTimestamp);for(let e of this.utilizedTracks)this._maxTimestamps.set(e.id,0);this.onProgress?.(0)}await this.output.start(),this._start();try{await Promise.all(this._trackPromises)}catch(e){throw this._canceled||this.cancel(),e}this._canceled&&await new Promise(()=>{}),await this.output.finalize(),this._computeProgress&&this.onProgress?.(1)}async cancel(){if(!(this.output.state===`finalizing`||this.output.state===`finalized`)){if(this._canceled){console.warn(`Conversion already canceled.`);return}this._canceled=!0,await this.output.cancel()}}async _processVideoTrack(e,t){let n=e.codec;if(!n){this.discardedTracks.push({track:e,reason:`unknown_source_codec`});return}let r,i=s(e.rotation+(t.rotate??0)),a=this.output.format.supportsVideoRotationMetadata&&(t.allowRotationMetadata??!0),[c,l]=i%180==0?[e.codedWidth,e.codedHeight]:[e.codedHeight,e.codedWidth],u=t.crop;u&&rr(u,c,l);let[d,f]=u?[u.width,u.height]:[c,l],p=d,m=f,h=p/m,g=e=>Math.ceil(e/2)*2;t.width!==void 0&&t.height===void 0?(p=g(t.width),m=g(Math.round(p/h))):t.width===void 0&&t.height!==void 0?(m=g(t.height),p=g(Math.round(m*h))):t.width!==void 0&&t.height!==void 0&&(p=g(t.width),m=g(t.height));let _=await e.getFirstTimestamp(),v=!!t.forceTranscode||this._startTimestamp>0||_<0||!!t.frameRate||t.keyFrameInterval!==void 0||t.process!==void 0,y=p!==d||m!==f||i!==0&&(!a||t.process!==void 0)||!!u,ee=t.alpha??`discard`,te=this.output.format.getSupportedVideoCodecs();if(!v&&!t.bitrate&&!y&&te.includes(n)&&(!t.codec||t.codec===n)){let t=new ku(n);r=t,this._trackPromises.push((async()=>{await this._started;let n=new yr(e),r={decoderConfig:await e.getDecoderConfig()??void 0},i=Number.isFinite(this._endTimestamp)?await n.getPacket(this._endTimestamp,{metadataOnly:!0})??void 0:void 0;for await(let a of n.packets(void 0,i,{verifyKeyPackets:!0})){if(this._canceled)return;ee===`discard`&&(delete a.sideData.alpha,delete a.sideData.alphaByteLength),this._reportProgress(e.id,a.timestamp),await t.add(a,r),this._synchronizer.shouldWait(e.id,a.timestamp)&&await this._synchronizer.wait(a.timestamp)}t.close(),this._synchronizer.closeTrack(e.id)})())}else{if(!await e.canDecode()){this.discardedTracks.push({track:e,reason:`undecodable_source_codec`});return}t.codec&&(te=te.filter(e=>e===t.codec));let n=t.bitrate??pu,a=await Cu(te,{width:t.process&&t.processedWidth?t.processedWidth:p,height:t.process&&t.processedHeight?t.processedHeight:m,bitrate:n});if(!a){this.discardedTracks.push({track:e,reason:`no_encodable_target_codec`});return}let s={codec:a,bitrate:n,keyFrameInterval:t.keyFrameInterval,sizeChangeBehavior:t.fit??`passThrough`,alpha:ee,hardwareAcceleration:t.hardwareAcceleration},c=new Mu(s);if(r=c,!y){let t=new $u({format:new ql,target:new yl}),n=new Mu(s);t.addVideoTrack(n),await t.start();let r=await new Tr(e).getSample(_);if(r)try{await n.add(r),r.close(),await t.finalize()}catch(e){console.info(`Error when probing encoder support. Falling back to rerender path.`,e),y=!0,t.cancel()}else await t.cancel()}y?this._trackPromises.push((async()=>{await this._started;let n=new Er(e,{width:p,height:m,fit:t.fit??`fill`,rotation:i,crop:t.crop,poolSize:1,alpha:ee===`keep`}).canvases(this._startTimestamp,this._endTimestamp),r=t.frameRate,a=null,s=null,l=null,u=async n=>{o(a),o(r!==void 0);let i=Math.round((n-s)*r);for(let n=1;n<i;n++){let i=new er(a,{timestamp:s+n/r,duration:1/r});await this._registerVideoSample(e,t,c,i),i.close()}};for await(let{canvas:i,timestamp:o,duration:d}of n){if(this._canceled)return;let n=Math.max(o-this._startTimestamp,0);if(l=n+d,r!==void 0){let e=Math.floor(n*r)/r;if(a!==null)if(e<=s){a=i,s=e;continue}else await u(e);n=e}let f=new er(i,{timestamp:n,duration:r===void 0?d:1/r});await this._registerVideoSample(e,t,c,f),f.close(),r!==void 0&&(a=i,s=n)}a&&(o(l!==null),o(r!==void 0),await u(Math.floor(l*r)/r)),c.close(),this._synchronizer.closeTrack(e.id)})()):this._trackPromises.push((async()=>{await this._started;let n=new Tr(e),r=t.frameRate,i=null,a=null,s=null,l=async n=>{o(i),o(r!==void 0);let s=Math.round((n-a)*r);for(let n=1;n<s;n++)i.setTimestamp(a+n/r),i.setDuration(1/r),await this._registerVideoSample(e,t,c,i);i.close()};for await(let o of n.samples(this._startTimestamp,this._endTimestamp)){if(this._canceled){i?.close();return}let n=Math.max(o.timestamp-this._startTimestamp,0);if(s=n+o.duration,r!==void 0){let e=Math.floor(n*r)/r;if(i!==null)if(e<=a){i.close(),i=o,a=e;continue}else await l(e);n=e,o.setDuration(1/r)}o.setTimestamp(n),await this._registerVideoSample(e,t,c,o),r===void 0?o.close():(i=o,a=n)}i&&(o(s!==null),o(r!==void 0),await l(Math.floor(s*r)/r)),c.close(),this._synchronizer.closeTrack(e.id)})())}this.output.addVideoTrack(r,{frameRate:t.frameRate,languageCode:Oe(e.languageCode)?e.languageCode:void 0,name:e.name??void 0,disposition:e.disposition,rotation:y?0:i}),this._addedCounts.video++,this._totalTrackCount++,this.utilizedTracks.push(e)}async _registerVideoSample(e,t,n,r){if(this._canceled)return;this._reportProgress(e.id,r.timestamp);let i;if(!t.process)i=[r];else{let e=t.process(r);e instanceof Promise&&(e=await e),Array.isArray(e)||(e=e===null?[]:[e]),i=e.map(e=>e instanceof er?e:typeof VideoFrame<`u`&&e instanceof VideoFrame?new er(e):new er(e,{timestamp:r.timestamp,duration:r.duration}))}for(let t of i){if(this._canceled)break;await n.add(t),this._synchronizer.shouldWait(e.id,t.timestamp)&&await this._synchronizer.wait(t.timestamp)}for(let e of i)e!==r&&e.close()}async _processAudioTrack(e,t){let n=e.codec;if(!n){this.discardedTracks.push({track:e,reason:`unknown_source_codec`});return}let r,i=e.numberOfChannels,a=e.sampleRate,o=await e.getFirstTimestamp(),s=t.numberOfChannels??i,c=t.sampleRate??a,l=s!==i||c!==a||this._startTimestamp>0||o<0,u=this.output.format.getSupportedAudioCodecs();if(!t.forceTranscode&&!t.bitrate&&!l&&u.includes(n)&&(!t.codec||t.codec===n)&&!t.process){let t=new Iu(n);r=t,this._trackPromises.push((async()=>{await this._started;let n=new yr(e),r={decoderConfig:await e.getDecoderConfig()??void 0},i=Number.isFinite(this._endTimestamp)?await n.getPacket(this._endTimestamp,{metadataOnly:!0})??void 0:void 0;for await(let a of n.packets(void 0,i)){if(this._canceled)return;this._reportProgress(e.id,a.timestamp),await t.add(a,r),this._synchronizer.shouldWait(e.id,a.timestamp)&&await this._synchronizer.wait(a.timestamp)}t.close(),this._synchronizer.closeTrack(e.id)})())}else{if(!await e.canDecode()){this.discardedTracks.push({track:e,reason:`undecodable_source_codec`});return}let n=null;t.codec&&(u=u.filter(e=>e===t.codec));let i=t.bitrate??pu,a=await xu(u,{numberOfChannels:t.process&&t.processedNumberOfChannels?t.processedNumberOfChannels:s,sampleRate:t.process&&t.processedSampleRate?t.processedSampleRate:c,bitrate:i});if(!a.some(e=>ot.includes(e))&&u.some(e=>ot.includes(e))&&(s!==rd||c!==id)){let e=(await xu(u,{numberOfChannels:rd,sampleRate:id,bitrate:i})).find(e=>ot.includes(e));e&&(l=!0,n=e,s=rd,c=id)}else n=a[0]??null;if(n===null){this.discardedTracks.push({track:e,reason:`no_encodable_target_codec`});return}if(l)r=this._resampleAudio(e,t,n,s,c,i);else{let a=new Ru({codec:n,bitrate:i});r=a,this._trackPromises.push((async()=>{await this._started;let n=new kr(e);for await(let r of n.samples(void 0,this._endTimestamp)){if(this._canceled)return;await this._registerAudioSample(e,t,a,r),r.close()}a.close(),this._synchronizer.closeTrack(e.id)})())}}this.output.addAudioTrack(r,{languageCode:Oe(e.languageCode)?e.languageCode:void 0,name:e.name??void 0,disposition:e.disposition}),this._addedCounts.audio++,this._totalTrackCount++,this.utilizedTracks.push(e)}async _registerAudioSample(e,t,n,r){if(this._canceled)return;this._reportProgress(e.id,r.timestamp);let i;if(!t.process)i=[r];else{let e=t.process(r);if(e instanceof Promise&&(e=await e),Array.isArray(e)||(e=e===null?[]:[e]),!e.every(e=>e instanceof lr))throw TypeError(`The audio process function must return an AudioSample, null, or an array of AudioSamples.`);i=e}for(let t of i){if(this._canceled)break;await n.add(t),this._synchronizer.shouldWait(e.id,t.timestamp)&&await this._synchronizer.wait(t.timestamp)}for(let e of i)e!==r&&e.close()}_resampleAudio(e,t,n,r,i,a){let o=new Ru({codec:n,bitrate:a});return this._trackPromises.push((async()=>{await this._started;let n=new cd({targetNumberOfChannels:r,targetSampleRate:i,startTime:this._startTimestamp,endTime:this._endTimestamp,onSample:async n=>{await this._registerAudioSample(e,t,o,n),n.close()}}),a=new kr(e).samples(this._startTimestamp,this._endTimestamp);for await(let e of a){if(this._canceled)return;await n.add(e),e.close()}await n.finalize(),o.close(),this._synchronizer.closeTrack(e.id)})()),o}_reportProgress(e,t){if(!this._computeProgress)return;o(this._totalDuration!==null),this._maxTimestamps.set(e,Math.max(t,this._maxTimestamps.get(e)));let n=C(Math.min(...this._maxTimestamps.values())/this._totalDuration,0,1);n!==this._lastProgress&&(this._lastProgress=n,this.onProgress?.(n))}},od=5,sd=class{constructor(){this.maxTimestamps=new Map,this.resolvers=[]}computeMinAndMaybeResolve(){let e=1/0;for(let[,t]of this.maxTimestamps)e=Math.min(e,t);for(let t=0;t<this.resolvers.length;t++){let n=this.resolvers[t];n.timestamp-e<od&&(n.resolve(),this.resolvers.splice(t,1),t--)}return e}shouldWait(e,t){return this.maxTimestamps.set(e,Math.max(t,this.maxTimestamps.get(e)??-1/0)),t-this.computeMinAndMaybeResolve()>=od}wait(e){let{promise:t,resolve:n}=x();return this.resolvers.push({timestamp:e,resolve:n}),t}closeTrack(e){this.maxTimestamps.delete(e),this.computeMinAndMaybeResolve()}},cd=class{constructor(e){this.sourceSampleRate=null,this.sourceNumberOfChannels=null,this.targetSampleRate=e.targetSampleRate,this.targetNumberOfChannels=e.targetNumberOfChannels,this.startTime=e.startTime,this.endTime=e.endTime,this.onSample=e.onSample,this.bufferSizeInFrames=Math.floor(this.targetSampleRate*5),this.bufferSizeInSamples=this.bufferSizeInFrames*this.targetNumberOfChannels,this.outputBuffer=new Float32Array(this.bufferSizeInSamples),this.bufferStartFrame=0,this.maxWrittenFrame=-1}doChannelMixerSetup(){o(this.sourceNumberOfChannels!==null);let e=this.sourceNumberOfChannels,t=this.targetNumberOfChannels;e===1&&t===2?this.channelMixer=(t,n)=>t[n*e]:e===1&&t===4?this.channelMixer=(t,n,r)=>t[n*e]*+(r<2):e===1&&t===6?this.channelMixer=(t,n,r)=>t[n*e]*+(r===2):e===2&&t===1?this.channelMixer=(t,n)=>{let r=n*e;return .5*(t[r]+t[r+1])}:e===2&&t===4||e===2&&t===6?this.channelMixer=(t,n,r)=>t[n*e+r]*+(r<2):e===4&&t===1?this.channelMixer=(t,n)=>{let r=n*e;return .25*(t[r]+t[r+1]+t[r+2]+t[r+3])}:e===4&&t===2?this.channelMixer=(t,n,r)=>{let i=n*e;return .5*(t[i+r]+t[i+r+2])}:e===4&&t===6?this.channelMixer=(t,n,r)=>{let i=n*e;return r<2?t[i+r]:r===2||r===3?0:t[i+r-2]}:e===6&&t===1?this.channelMixer=(t,n)=>{let r=n*e;return Math.SQRT1_2*(t[r]+t[r+1])+t[r+2]+.5*(t[r+4]+t[r+5])}:e===6&&t===2?this.channelMixer=(t,n,r)=>{let i=n*e;return t[i+r]+Math.SQRT1_2*(t[i+2]+t[i+r+4])}:e===6&&t===4?this.channelMixer=(t,n,r)=>{let i=n*e;return r<2?t[i+r]+Math.SQRT1_2*t[i+2]:t[i+r+2]}:this.channelMixer=(t,n,r)=>r<e?t[n*e+r]:0}ensureTempBufferSize(e){let t=this.tempSourceBuffer.length;for(;t<e;)t*=2;if(t!==this.tempSourceBuffer.length){let e=new Float32Array(t);e.set(this.tempSourceBuffer),this.tempSourceBuffer=e}}async add(e){this.sourceSampleRate===null&&(this.sourceSampleRate=e.sampleRate,this.sourceNumberOfChannels=e.numberOfChannels,this.tempSourceBuffer=new Float32Array(this.sourceSampleRate*this.sourceNumberOfChannels),this.doChannelMixerSetup());let t=e.numberOfFrames*e.numberOfChannels;this.ensureTempBufferSize(t);let n=e.allocationSize({planeIndex:0,format:`f32`}),r=new Float32Array(this.tempSourceBuffer.buffer,0,n/4);e.copyTo(r,{planeIndex:0,format:`f32`});let i=e.timestamp-this.startTime,a=e.numberOfFrames/this.sourceSampleRate,s=Math.min(i+a,this.endTime-this.startTime),c=Math.floor(i*this.targetSampleRate),l=Math.ceil(s*this.targetSampleRate);for(let t=c;t<l;t++){if(t<this.bufferStartFrame)continue;for(;t>=this.bufferStartFrame+this.bufferSizeInFrames;)await this.finalizeCurrentBuffer(),this.bufferStartFrame+=this.bufferSizeInFrames;let n=t-this.bufferStartFrame;o(n<this.bufferSizeInFrames);let a=(t/this.targetSampleRate-i)*this.sourceSampleRate,s=Math.floor(a),c=Math.ceil(a),l=a-s;for(let t=0;t<this.targetNumberOfChannels;t++){let i=0,a=0;s>=0&&s<e.numberOfFrames&&(i=this.channelMixer(r,s,t)),c>=0&&c<e.numberOfFrames&&(a=this.channelMixer(r,c,t));let o=i+l*(a-i),u=n*this.targetNumberOfChannels+t;this.outputBuffer[u]+=o}this.maxWrittenFrame=Math.max(this.maxWrittenFrame,n)}}async finalizeCurrentBuffer(){if(this.maxWrittenFrame<0)return;let e=(this.maxWrittenFrame+1)*this.targetNumberOfChannels,t=new Float32Array(e);t.set(this.outputBuffer.subarray(0,e));let n=this.bufferStartFrame/this.targetSampleRate,r=new lr({format:`f32`,sampleRate:this.targetSampleRate,numberOfChannels:this.targetNumberOfChannels,timestamp:n,data:t});await this.onSample(r),this.outputBuffer.fill(0),this.maxWrittenFrame=-1}finalize(){return this.finalizeCurrentBuffer()}}})),ud=r({ADTS:()=>Eo,ALL_FORMATS:()=>Oo,ALL_TRACK_TYPES:()=>Zu,AUDIO_CODECS:()=>st,AdtsInputFormat:()=>vo,AdtsOutputFormat:()=>eu,AttachedFile:()=>$e,AudioBufferSink:()=>Ar,AudioBufferSource:()=>zu,AudioSample:()=>lr,AudioSampleSink:()=>kr,AudioSampleSource:()=>Ru,AudioSource:()=>Fu,BaseMediaSampleSink:()=>xr,BlobSource:()=>Fo,BufferSource:()=>Po,BufferTarget:()=>gl,CanvasSink:()=>Er,CanvasSource:()=>Nu,Conversion:()=>ad,CustomAudioDecoder:()=>Mn,CustomAudioEncoder:()=>Pn,CustomVideoDecoder:()=>jn,CustomVideoEncoder:()=>Nn,EncodedAudioPacketSource:()=>Iu,EncodedPacket:()=>D,EncodedPacketSink:()=>yr,EncodedVideoPacketSource:()=>ku,FLAC:()=>Do,FilePathSource:()=>zo,FilePathTarget:()=>vl,FlacInputFormat:()=>_o,FlacOutputFormat:()=>tu,Input:()=>Go,InputAudioTrack:()=>Pr,InputDisposedError:()=>Ko,InputFormat:()=>so,InputTrack:()=>Mr,InputVideoTrack:()=>Nr,IsobmffInputFormat:()=>co,IsobmffOutputFormat:()=>Kl,MATROSKA:()=>xo,MP3:()=>Co,MP4:()=>yo,MatroskaInputFormat:()=>fo,MediaSource:()=>Du,MediaStreamAudioTrackSource:()=>Bu,MediaStreamVideoTrackSource:()=>Pu,MkvOutputFormat:()=>Yl,MovOutputFormat:()=>Jl,Mp3InputFormat:()=>mo,Mp3OutputFormat:()=>Zl,Mp4InputFormat:()=>lo,Mp4OutputFormat:()=>ql,NON_PCM_AUDIO_CODECS:()=>ot,NullTarget:()=>yl,OGG:()=>To,OggInputFormat:()=>go,OggOutputFormat:()=>$l,Output:()=>$u,OutputFormat:()=>Gl,PCM_AUDIO_CODECS:()=>T,QTFF:()=>bo,QUALITY_HIGH:()=>pu,QUALITY_LOW:()=>du,QUALITY_MEDIUM:()=>fu,QUALITY_VERY_HIGH:()=>mu,QUALITY_VERY_LOW:()=>uu,Quality:()=>lu,QuickTimeInputFormat:()=>uo,ReadableStreamSource:()=>Vo,RichImageData:()=>Qe,SUBTITLE_CODECS:()=>ct,Source:()=>No,StreamSource:()=>Bo,StreamTarget:()=>_l,SubtitleSource:()=>Ju,Target:()=>hl,TextSubtitleSource:()=>Yu,UrlSource:()=>Ro,VIDEO_CODECS:()=>at,VIDEO_SAMPLE_PIXEL_FORMATS:()=>Qn,VideoSample:()=>er,VideoSampleColorSpace:()=>tr,VideoSampleSink:()=>Tr,VideoSampleSource:()=>Mu,VideoSource:()=>Ou,WAVE:()=>wo,WEBM:()=>So,WavOutputFormat:()=>Ql,WaveInputFormat:()=>ho,WebMInputFormat:()=>po,WebMOutputFormat:()=>Xl,canEncode:()=>hu,canEncodeAudio:()=>_u,canEncodeSubtitles:()=>vu,canEncodeVideo:()=>gu,getEncodableAudioCodecs:()=>xu,getEncodableCodecs:()=>yu,getEncodableSubtitleCodecs:()=>Su,getEncodableVideoCodecs:()=>bu,getFirstEncodableAudioCodec:()=>wu,getFirstEncodableSubtitleCodec:()=>Tu,getFirstEncodableVideoCodec:()=>Cu,registerDecoder:()=>zn,registerEncoder:()=>Bn}),dd=n((()=>{ed(),nu(),Xu(),E(),Eu(),bl(),Wo(),ko(),qo(),Fr(),Un(),hr(),jr(),ld(),Vn(),it()}));dd();let fd={mp4:`aac`,mov:`aac`,mkv:`opus`,webm:`opus`};function pd(e){return fd[e]}let md={sd:du,hd:fu,fhd:pu,"4k":mu},hd={sd:{width:854,height:480},hd:{width:1280,height:720},fhd:{width:1920,height:1080},"4k":{width:3840,height:2160}},gd=Object.freeze({format:`mp4`,fps:30,width:hd.fhd.width,height:hd.fhd.height,bitrate:md.fhd,audioCodec:`aac`,audioBitrate:96e3,watermark:{url:`https://avatars.githubusercontent.com/u/244247750?s=200&v=4`,opacity:1,position:`bottom-right`}});function _d(e){return{...gd,format:e,audioCodec:pd(e)}}function vd(e){let{preset:t,outputFormat:n,watermark:r}=e;if(!(t in md))throw Error(`Invalid preset: ${t}`);let{width:i,height:a}=hd[t],o=n||`mp4`,s=pd(o),c={format:o,width:i,height:a,bitrate:md[t],audioCodec:s,audioBitrate:128e3};return r&&(c.watermark={url:r.url,opacity:r.opacity,position:r.position}),c}let yd=new Map;function bd(e,t){return`${e}:${t}`}var xd=class e{constructor(e){if(this.cachedConfig=null,this.cacheTimestamp=0,this.fetchPromise=null,this.options=e,e.cacheTimeout!==void 0){if(typeof e.cacheTimeout!=`number`||e.cacheTimeout<=0)throw Error(`cacheTimeout must be a positive number`);this.cacheTimeout=e.cacheTimeout}else this.cacheTimeout=3e5}static getInstance(t){let n=bd(t.backendUrl,t.apiKey),r=yd.get(n);return r||(r=new e(t),yd.set(n,r)),r}async fetchConfig(){let e=Date.now();if(this.cachedConfig&&e-this.cacheTimestamp<this.cacheTimeout)return this.cachedConfig;if(this.fetchPromise)return this.fetchPromise;this.fetchPromise=this.fetchConfigFromBackend();try{let t=await this.fetchPromise;return this.cachedConfig=t,this.cacheTimestamp=e,this.fetchPromise=null,t}catch{return this.fetchPromise=null,gd}}clearCache(){let e=bd(this.options.backendUrl,this.options.apiKey);this.cachedConfig=null,this.cacheTimestamp=0,this.fetchPromise=null,yd.delete(e)}static clearAllInstances(){yd.clear()}getCurrentConfig(){if(!this.cachedConfig)throw Error(`No cached config available. Call fetchConfig() first.`);return this.cachedConfig}async fetchConfigFromBackend(){let e=`${this.options.backendUrl}/api/v1/videos/config`,t=await fetch(e,{method:`GET`,headers:{Authorization:`Bearer ${this.options.apiKey}`,"Content-Type":`application/json`}});if(!t.ok)throw Error(`Failed to fetch config: ${t.status} ${t.statusText}`);let n=await t.json();if(!n.presetEncoding)throw Error(`Invalid config response from backend: missing presetEncoding`);return vd({preset:n.presetEncoding,outputFormat:n.outputFormat,watermark:n.watermark})}},Sd=class{constructor(){this.configService=null,this.currentConfig=gd,this.configFetched=!1}async initialize(e,t){if(this.configService)return;if(!e)throw Error(`apiKey is required`);let n=t||`https://core.vidtreo.com`;this.configService=xd.getInstance({apiKey:e,backendUrl:n}),this.configService.fetchConfig().then(e=>{this.currentConfig=e,this.configFetched=!0}).catch(()=>{this.configFetched=!1})}async fetchConfig(){this.configService&&(this.currentConfig=await this.configService.fetchConfig(),this.configFetched=!0)}async getConfig(){return this.configService&&!this.configFetched&&await this.fetchConfig(),this.currentConfig}clearCache(){if(!this.configService)throw Error(`ConfigService is not initialized`);this.configService.clearCache()}},Cd=class{constructor(e,t){this.availableDevices={audioinput:[],videoinput:[]},this.selectedCameraDeviceId=null,this.selectedMicDeviceId=null,this.streamManager=e,this.callbacks=t}async getAvailableDevices(){return this.availableDevices=await this.streamManager.getAvailableDevices(),this.callbacks?.onDevicesChanged&&this.callbacks.onDevicesChanged(this.availableDevices),this.availableDevices}setCameraDevice(e){this.selectedCameraDeviceId=e,this.streamManager.setVideoDevice(e),this.callbacks?.onDeviceSelected&&this.callbacks.onDeviceSelected(`camera`,e)}setMicDevice(e){this.selectedMicDeviceId=e,this.streamManager.setAudioDevice(e),this.callbacks?.onDeviceSelected&&this.callbacks.onDeviceSelected(`mic`,e)}getSelectedCameraDeviceId(){return this.selectedCameraDeviceId}getSelectedMicDeviceId(){return this.selectedMicDeviceId}getAvailableDevicesList(){return this.availableDevices}};dd();async function wd(e){try{let t=new Fo(e),n=new Go({formats:[yo],source:t});if(typeof n.computeDuration!=`function`)throw Error(`computeDuration method is not available`);let r=await n.computeDuration();if(!r)throw Error(`Duration is missing from computeDuration`);if(r<=0)throw Error(`Invalid duration: must be greater than 0`);return r}catch{return Td(e)}}function Td(e){return new Promise((t,n)=>{let r=document.createElement(`video`),i=URL.createObjectURL(e),a=()=>{URL.revokeObjectURL(i)};r.addEventListener(`loadedmetadata`,()=>{a();let e=r.duration;if(!Number.isFinite(e)||e<=0){n(Error(`Invalid video duration`));return}t(e)}),r.addEventListener(`error`,()=>{a(),n(Error(`Failed to load video metadata`))}),r.src=i,r.load()})}let Ed=`pending-uploads`,Dd=`status`,Od=`createdAt`;var kd=class{constructor(){this.db=null}init(){return this.db?Promise.resolve():new Promise((e,t)=>{let n=indexedDB.open(`vidtreo-recorder`,1);n.onerror=()=>{n.error?t(n.error):t(Error(`Failed to open database`))},n.onsuccess=()=>{if(!n.result){t(Error(`Database result is null`));return}this.db=n.result,e()},n.onupgradeneeded=e=>{let n=e.target.result;if(!n){t(Error(`Database upgrade result is null`));return}if(!n.objectStoreNames.contains(Ed)){let e=n.createObjectStore(Ed,{keyPath:`id`});e.createIndex(Dd,Dd,{unique:!1}),e.createIndex(Od,Od,{unique:!1})}}})}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(Dd).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([Ed],e).objectStore(Ed))}},Ad=class{constructor(){this.storageService=null,this.cleanupIntervalId=null}async initialize(e){this.storageService||=new kd,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 jd(){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 Md=jd(),Nd={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 Pd(e,t,n){if(!Md)return``;let r=n?.prefix||`[${e.toUpperCase()}]`;return`${Nd[n?.color||Fd(e)]}${r}${Nd.reset} ${t}`}function Fd(e){switch(e){case`error`:return`red`;case`warn`:return`yellow`;case`info`:return`cyan`;case`debug`:return`gray`;default:return`white`}}function Id(e,t,...n){if(!Md)return;let r=Pd(e,t);console[e](r,...n)}let W={log:(e,...t)=>{Id(`log`,e,...t)},info:(e,...t)=>{Id(`info`,e,...t)},warn:(e,...t)=>{Id(`warn`,e,...t)},error:(e,...t)=>{Id(`error`,e,...t)},debug:(e,...t)=>{Id(`debug`,e,...t)},group:(e,t=`cyan`)=>{if(!Md)return;let n=Nd[t],r=Nd.reset;console.group(`${n}${e}${r}`)},groupEnd:()=>{Md&&console.groupEnd()}},Ld=`live`;var Rd=class{constructor(e,t={}){this.currentSourceType=`camera`,this.originalCameraStream=null,this.originalCameraConstraints=null,this.screenShareStream=null,this.screenShareTrackEndHandler=null,this.streamManager=e,this.callbacks=t}getCurrentSourceType(){return this.currentSourceType}getOriginalCameraStream(){return this.originalCameraStream}stopLiveTracks(e){for(let t of e)t.readyState===Ld&&t.stop()}stopStreamTracks(e){this.stopLiveTracks(e.getTracks())}stopStreamVideoTracks(e){this.stopLiveTracks(e.getVideoTracks())}isTrackLive(e){return e!==void 0&&e.readyState===Ld}areTracksLive(e,t){return this.isTrackLive(e)&&this.isTrackLive(t)}storeOriginalCameraConstraints(e){let t=e.getVideoTracks()[0];if(!t)return;let n=t.getSettings();this.originalCameraConstraints={width:n.width,height:n.height,aspectRatio:n.aspectRatio,frameRate:n.frameRate,deviceId:n.deviceId,facingMode:n.facingMode}}storeOriginalCameraStream(e){let t=e.getVideoTracks()[0],n=e.getAudioTracks()[0];this.areTracksLive(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?this.originalCameraStream.getAudioTracks()[0]:void 0;W.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:this.isTrackLive(t),screenVideoTrackId:e.id,screenVideoTrackReadyState:e.readyState});let n=[e];this.isTrackLive(t)&&t?(n.push(t),W.debug(`[SourceSwitchManager] Added original audio track to combined stream`,{audioTrackId:t.id,combinedTracksCount:n.length})):W.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 W.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}handleScreenSelectionError(){this.callbacks.onScreenSelectionEnd&&this.callbacks.onScreenSelectionEnd(),this.callbacks.onTransitionEnd&&this.callbacks.onTransitionEnd()}isPermissionDeniedError(e){let t=i(e);return t.includes(`NotAllowedError`)||t.includes(`AbortError`)||t.toLowerCase().includes(`permission denied`)||t.toLowerCase().includes(`user denied`)}async processScreenShareStream(e,t){this.screenShareStream=e;let n=e.getVideoTracks()[0];if(!n)throw this.stopStreamTracks(e),Error(`No video track found in screen share stream`);let r=this.combineScreenShareWithOriginalAudio(n);t&&t!==this.originalCameraStream&&this.stopStreamVideoTracks(t);let i=e.getAudioTracks();for(let e of i)e.stop();return this.currentSourceType=`screen`,this.callbacks.onSourceChange&&await this.callbacks.onSourceChange(this.currentSourceType),this.setupScreenShareTrackHandler(r),r}async switchToScreenCapture(){let e=this.streamManager.getStream();e&&(this.storeOriginalCameraConstraints(e),this.storeOriginalCameraStream(e)),this.callbacks.onTransitionStart&&this.callbacks.onTransitionStart(`Select screen to share...`),this.callbacks.onScreenSelectionStart&&this.callbacks.onScreenSelectionStart();try{let t=await navigator.mediaDevices.getDisplayMedia({video:!0,audio:!0});return await this.processScreenShareStream(t,e)}catch(e){if(this.handleScreenSelectionError(),this.isPermissionDeniedError(e))return null;throw e}}setupScreenShareTrackHandler(e){let t=e.getVideoTracks()[0];if(!t)throw Error(`No video track found in screen share stream`);let n=this.screenShareTrackEndHandler;if(n){let e=this.streamManager.getStream();if(e){let t=e.getVideoTracks()[0];t&&t.removeEventListener(`ended`,n)}}this.screenShareTrackEndHandler=async()=>{if(this.currentSourceType===`screen`)try{await this.switchToCamera()}catch(e){this.callbacks.onError&&this.callbacks.onError(this.createError(e))}},t.addEventListener(`ended`,this.screenShareTrackEndHandler)}removeScreenShareTrackHandler(e){if(!(this.screenShareTrackEndHandler&&e))return;let t=e.getVideoTracks()[0];t&&t.removeEventListener(`ended`,this.screenShareTrackEndHandler),this.screenShareTrackEndHandler=null}canReuseStream(e,t){if(!e||t&&e!==this.originalCameraStream)return!1;let n=e.getVideoTracks()[0],r=e.getAudioTracks()[0];return!(!this.areTracksLive(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}getSelectedCameraDeviceId(){return this.callbacks.getSelectedCameraDeviceId?this.callbacks.getSelectedCameraDeviceId():this.streamManager.getVideoDevice()}getSelectedMicDeviceId(){return this.callbacks.getSelectedMicDeviceId?this.callbacks.getSelectedMicDeviceId():this.streamManager.getAudioDevice()}buildVideoConstraints(e){let t={};if(this.originalCameraConstraints){let{deviceId:e,...n}=this.originalCameraConstraints;Object.assign(t,n)}if(e)t.deviceId={exact:e};else if(!t.deviceId){let e=this.getSelectedCameraDeviceId();e&&(t.deviceId={exact:e})}return t}buildAudioConstraints(e){return e?{deviceId:{exact:e}}:!0}validateTrack(e,t,n){if(!this.isTrackLive(e)){this.stopStreamTracks(n);let r=e?e.readyState:`undefined`;throw Error(`Failed to get live camera ${t} track. ReadyState: ${r}`)}}async createCameraStreamWithOriginalAudio(e){let t=this.originalCameraStream?this.originalCameraStream.getAudioTracks()[0]:void 0;if(W.debug(`[SourceSwitchManager] createCameraStreamWithOriginalAudio`,{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:this.isTrackLive(t),cameraDeviceId:e}),!this.isTrackLive(t))return W.warn(`[SourceSwitchManager] Original audio track is not live, cannot reuse`,{originalAudioTrackId:t?.id,originalAudioTrackReadyState:t?.readyState}),null;let n=this.buildVideoConstraints(e),r={video:Object.keys(n).length>0?n:!0,audio:!1};W.debug(`[SourceSwitchManager] Requesting new video stream`,{constraints:r,cameraDeviceId:e});let i=await navigator.mediaDevices.getUserMedia(r),a=i.getVideoTracks()[0];this.validateTrack(a,`video`,i),W.debug(`[SourceSwitchManager] New video stream obtained`,{newStreamId:i.id,videoTrackId:a.id,videoTrackReadyState:a.readyState,newStreamAudioTracksCount:i.getAudioTracks().length});let o=[a];t&&o.push(t),W.debug(`[SourceSwitchManager] Creating combined stream with original audio`,{videoTrackId:a.id,audioTrackId:t?.id,audioTrackReadyState:t?.readyState,audioTrackEnabled:t?.enabled,audioTrackMuted:t?.muted,combinedTracksCount:o.length});let s=new MediaStream(o);this.stopLiveTracks(i.getAudioTracks());let c=this.originalCameraStream?.id;return this.originalCameraStream=s,W.debug(`[SourceSwitchManager] Combined stream created and assigned`,{combinedStreamId:s.id,previousOriginalCameraStreamId:c,newOriginalCameraStreamId:this.originalCameraStream.id,combinedStreamVideoTracksCount:s.getVideoTracks().length,combinedStreamAudioTracksCount:s.getAudioTracks().length,combinedStreamAudioTrackId:s.getAudioTracks()[0]?.id,combinedStreamAudioTrackReadyState:s.getAudioTracks()[0]?.readyState,audioTrackStillSame:s.getAudioTracks()[0]===t}),s}async createCameraStreamWithNewAudio(e){let t=this.getSelectedMicDeviceId(),n=this.buildVideoConstraints(e),r=this.buildAudioConstraints(t),i={video:Object.keys(n).length>0?n:!0,audio:r},a=await navigator.mediaDevices.getUserMedia(i),o=a.getVideoTracks()[0],s=a.getAudioTracks()[0];return this.validateTrack(o,`video`,a),this.validateTrack(s,`audio`,a),this.originalCameraStream=a,a}async createNewCameraStreamForRecording(){let e=this.getSelectedCameraDeviceId();return await this.createCameraStreamWithOriginalAudio(e)||this.createCameraStreamWithNewAudio(e)}async getCameraStream(){let e=this.streamManager.isRecording(),t=this.getSelectedCameraDeviceId(),n=this.getSelectedMicDeviceId();if(this.streamManager.setVideoDevice(t),this.streamManager.setAudioDevice(n),this.canReuseOriginalStream()){if(!this.originalCameraStream)throw Error(`Original camera stream is null`);return this.originalCameraStream}if(this.canReuseManagerStream()){let e=this.streamManager.getStream();if(!e)throw Error(`Manager stream is null`);return e}!e&&this.originalCameraStream&&(this.originalCameraStream=null);let r=this.streamManager.getStream();if(!e&&r&&r!==this.originalCameraStream&&(this.stopStreamTracks(r),this.streamManager.setMediaStream(null)),e)return this.streamManager.setVideoDevice(this.getSelectedCameraDeviceId()),this.streamManager.setAudioDevice(this.getSelectedMicDeviceId()),this.createNewCameraStreamForRecording();let i=await this.streamManager.startStream();return this.originalCameraStream=i,i}async switchToCamera(){let e=this.streamManager.isRecording();if(!(!e&&this.currentSourceType===`camera`))try{this.notifyTransitionStart(`Switching to camera...`),await this.handleScreenShareStop();let t=await this.getCameraStream();if(!t)throw Error(`Failed to get camera stream`);await this.applyCameraStream(t,e),this.notifyTransitionEnd()}catch(e){throw this.notifyTransitionEnd(),e}}notifyTransitionStart(e){this.callbacks.onTransitionStart&&this.callbacks.onTransitionStart(e)}notifyTransitionEnd(){this.callbacks.onTransitionEnd&&this.callbacks.onTransitionEnd()}stopScreenShareStreamTracks(e){let t=e.getVideoTracks(),n=e.getAudioTracks();W.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`&&t.readyState===Ld&&(W.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;W.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(W.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();W.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}))}),this.removeScreenShareTrackHandler(e),this.stopScreenShareStreamTracks(e),this.stopDisplayTracks(e),this.screenShareStream=null,await this.waitForTracksToEnd(0),W.debug(`[SourceSwitchManager] Screen share stream stopped`,{screenShareAudioTracksAfterStop:t.map(e=>({id:e.id,readyState:e.readyState}))})}if(t){let e=t.getAudioTracks();W.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}))}),this.stopStreamVideoTracks(t),this.stopDisplayTracks(t),W.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}))})}W.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),W.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())try{this.currentSourceType===`camera`?await this.switchToScreen():await this.switchToCamera()}catch(e){this.handleToggleError(e)}}async switchToScreen(){let e=await this.switchToScreenCapture();if(!e){this.notifyTransitionEnd();return}this.notifyTransitionStart(`Switching to screen...`),await this.streamManager.switchVideoSource(e),this.callbacks.onPreviewUpdate&&await this.callbacks.onPreviewUpdate(e),this.notifyTransitionEnd()}handleToggleError(e){this.notifyTransitionEnd();let t=i(e);t.includes(`NotAllowedError`)||t.includes(`AbortError`)?this.currentSourceType===`screen`&&this.switchToCamera().catch(e=>{this.callbacks.onError&&this.callbacks.onError(this.createError(e))}):this.callbacks.onError&&this.callbacks.onError(this.createError(e))}async handleRecordingStop(){if(this.currentSourceType!==`screen`){this.cleanup();return}try{let e=this.streamManager.getStream();e&&(this.removeScreenShareTrackHandler(e),this.stopStreamVideoTracks(e));let t=await this.getCameraStream();if(!t)throw Error(`Failed to get camera stream`);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&&=(this.removeScreenShareTrackHandler(this.screenShareStream),this.stopScreenShareStreamTracks(this.screenShareStream),null);let e=this.streamManager.getStream();e&&this.removeScreenShareTrackHandler(e),this.screenShareTrackEndHandler=null,this.originalCameraStream=null,this.originalCameraConstraints=null}setCallbacks(e){this.callbacks={...this.callbacks,...e}}};let zd=Object.freeze({width:{ideal:gd.width||1920},height:{ideal:gd.height||1080},frameRate:{ideal:gd.fps||30}}),Bd=Object.freeze({video:zd,audio:!0});Object.freeze({mimeType:`video/webm;codecs=vp9,opus`});var Vd=class{constructor(e={}){this.mediaStream=null,this.state=`idle`,this.eventListeners=new Map,this.selectedAudioDeviceId=null,this.selectedVideoDeviceId=null,this.streamConfig={...Bd,...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(W.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)W.debug(`[StreamManager] Stopping existing stream to recreate`),this.stopStream();else return W.debug(`[StreamManager] Reusing existing stream`),this.mediaStream;if(e?.getSettings&&e.getSettings().deviceId===this.selectedVideoDeviceId)return W.debug(`[StreamManager] Existing stream matches device, reusing`),this.mediaStream;W.debug(`[StreamManager] Device changed, stopping existing stream`),this.stopStream()}this.setState(`starting`),W.debug(`[StreamManager] State set to 'starting'`);try{W.debug(`[StreamManager] Building constraints`,{selectedVideoDeviceId:this.selectedVideoDeviceId,selectedAudioDeviceId:this.selectedAudioDeviceId});let e={video:this.buildVideoConstraints(this.selectedVideoDeviceId),audio:this.buildAudioConstraints(this.selectedAudioDeviceId)};return W.debug(`[StreamManager] Requesting media stream with constraints`,{hasVideo:!!e.video,hasAudio:!!e.audio}),this.mediaStream=await navigator.mediaDevices.getUserMedia(e),W.info(`[StreamManager] Media stream obtained`,{streamId:this.mediaStream.id,videoTracks:this.mediaStream.getVideoTracks().length,audioTracks:this.mediaStream.getAudioTracks().length}),this.setState(`active`),W.debug(`[StreamManager] State set to 'active'`),W.debug(`[StreamManager] Emitting streamstart event`),this.emit(`streamstart`,{stream:this.mediaStream}),this.mediaStream}catch(e){let t=e instanceof Error?e:Error(i(e));throw W.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 navigator.mediaDevices.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 Hd=[`Bytes`,`KB`,`MB`,`GB`],Ud=1024;function Wd(e){if(e===0)return`0 Bytes`;let t=Math.floor(Math.log(e)/Math.log(Ud));return`${Math.round(e/Ud**t*100)/100} ${Hd[t]}`}function Gd(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`)}`}var Kd=class{constructor(){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)}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=Date.now(),this.endCurrentIntervalIfActive())}resume(){if(!this.isTracking||this.pauseStartTime===null)return;let e=Date.now()-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=Date.now())}endCurrentIntervalIfActive(){if(this.currentIntervalStart===null)return;let e=Date.now(),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)}};function qd(e,t){if(e==null)throw Error(t);return e}function Jd(e,t=`StreamProcessor`){if(!e)throw Error(`${t} is required`);return e}let Yd=1e3;var Xd=class{constructor(e){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}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();if(W.debug(`[StreamRecordingState] startRecording called`,{hasMediaStream:!!i,isRecording:this.isRecording(),hasProcessor:!!e,audioTracks:i?.getAudioTracks().length||0}),!i)throw Error(`Stream must be started before recording`);if(this.isRecording())return W.debug(`[StreamRecordingState] Already recording, returning`),Promise.resolve();this.streamProcessor=e,W.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=Wd(e);this.streamManager.emit(`recordingbufferupdate`,{size:e,formatted:t})},Yd),this.resetRecordingState();let a=n&&r?{enabled:!0,text:r,recordingStartTime:this.recordingStartTime}:void 0;W.debug(`[StreamRecordingState] Overlay config`,{enableTabVisibilityOverlay:n,hasOverlayText:!!r,overlayText:r,overlayConfig:a}),W.debug(`[StreamRecordingState] Starting processing`),await e.startProcessing(i,t,a),W.info(`[StreamRecordingState] Processing started and worker ready`),n&&(W.debug(`[StreamRecordingState] Setting up tab visibility tracking`,{recordingStartTime:this.recordingStartTime}),this.tabVisibilityTracker=new Kd,this.tabVisibilityTracker.start(this.recordingStartTime),this.setupVisibilityUpdates(e)),this.streamManager.setState(`recording`),this.streamManager.emit(`recordingstart`,{recorder:null}),this.startRecordingTimer()}async stopRecording(){if(W.debug(`[StreamRecordingState] stopRecording called`,{hasStreamProcessor:!!this.streamProcessor,isRecording:this.isRecording()}),!(this.streamProcessor&&this.isRecording()))throw Error(`Not currently recording`);this.streamManager.setState(`stopping`),this.clearRecordingTimer(),this.clearBufferSizeInterval(),this.resetPauseState(),this.cleanupVisibilityUpdates();let e=[];this.tabVisibilityTracker?(e=this.tabVisibilityTracker.getIntervals(),W.debug(`[StreamRecordingState] Tab visibility intervals collected`,{intervalsCount:e.length,intervals:e}),this.tabVisibilityTracker.cleanup(),this.tabVisibilityTracker=null):W.debug(`[StreamRecordingState] No tab visibility tracker was active`),W.debug(`[StreamRecordingState] Finalizing stream processor`);let t=await this.streamProcessor.finalize();return W.info(`[StreamRecordingState] Stream processor finalized`,{blobSize:t.blob.size,hasBlob:!!t.blob}),this.streamManager.setState(`active`),this.streamManager.emit(`recordingstop`,{blob:t.blob,mimeType:`video/mp4`}),this.streamProcessor=null,W.debug(`[StreamRecordingState] StreamProcessor cleared`),{blob:t.blob,tabVisibilityIntervals:e}}pauseRecording(){this.clearRecordingTimer(),this.pauseStartTime===null&&(this.pauseStartTime=Date.now()),this.tabVisibilityTracker&&this.tabVisibilityTracker.pause(),this.streamProcessor&&this.isRecording()&&this.streamProcessor.pause()}resumeRecording(){if(this.pauseStartTime!==null){let e=Date.now()-this.pauseStartTime;this.totalPausedTime+=e,this.pauseStartTime=null}this.tabVisibilityTracker&&this.tabVisibilityTracker.resume(),this.startRecordingTimer(),this.streamProcessor&&this.isRecording()&&this.streamProcessor.resume()}toggleMute(){Jd(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 Jd(this.streamProcessor,`StreamProcessor`).switchVideoSource(e)}getCurrentVideoSource(){return qd(Jd(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=(Date.now()-this.recordingStartTime-this.totalPausedTime)/1e3,t=this.formatTimeElapsed(e);this.streamManager.emit(`recordingtimeupdate`,{elapsed:e,formatted:t})},Yd)}clearRecordingTimer(){this.recordingTimer!==null&&(clearInterval(this.recordingTimer),this.recordingTimer=null)}clearBufferSizeInterval(){this.bufferSizeUpdateInterval!==null&&(clearInterval(this.bufferSizeUpdateInterval),this.bufferSizeUpdateInterval=null)}resetRecordingState(){this.recordingStartTime=performance.now(),this.totalPausedTime=0,this.pauseStartTime=null}resetPauseState(){this.totalPausedTime=0,this.pauseStartTime=null}setupVisibilityUpdates(e){if(typeof document>`u`||typeof window>`u`){W.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=performance.now();W.debug(`[StreamRecordingState] Visibility change`,{isHidden:t,timestamp:n,visibilityState:document.visibilityState}),e.updateTabVisibility(t,n)},this.blurHandler=()=>{let t=performance.now();W.debug(`[StreamRecordingState] Window blur`,{timestamp:t}),e.updateTabVisibility(!0,t)},this.focusHandler=()=>{let t=performance.now();W.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=performance.now();W.debug(`[StreamRecordingState] Initial state is hidden`,{timestamp:t}),e.updateTabVisibility(!0,t)}else W.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()}},Zd=class{constructor(e={}){this.streamManager=new Vd(e),this.recordingState=new Xd(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()}},Qd=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,duration:e.duration,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)}},$d=class{async uploadVideo(e,t){if(!t.filename)throw Error(`Filename is required`);if(!e.type||e.type.trim()===``)throw Error(`Blob type is required`);let n=await this.initVideoUpload({apiKey:t.apiKey,backendUrl:t.backendUrl,filename:t.filename,fileSize:e.size,mimeType:e.type,metadata:t.metadata,userMetadata:t.userMetadata});return this.uploadVideoFile(e,n.uploadUrl,{apiKey:t.apiKey,duration:t.duration,onProgress:t.onProgress})}async initVideoUpload(e){let t=`${e.backendUrl}/api/v1/videos/init`,n={filename:e.filename,fileSize:e.fileSize,mimeType:e.mimeType,preProcessed:!0};e.metadata&&(n.metadata=e.metadata),e.userMetadata&&(n.userMetadata=e.userMetadata);let r=await fetch(t,{method:`POST`,headers:{Authorization:`Bearer ${e.apiKey}`,"Content-Type":`application/json`},body:JSON.stringify(n)});if(!r.ok){let e=await this.extractErrorFromResponse(r,`Failed to initialize video upload`);throw Error(e)}return await r.json()}async extractErrorFromResponse(e,t){let n=await this.parseJsonResponse(e);return n&&typeof n==`object`&&`error`in n&&typeof n.error==`string`?n.error:`${t}: ${e.status} ${e.statusText}`}async parseJsonResponse(e){let t=await e.json();return typeof t==`object`&&t?t:null}uploadVideoFile(e,t,n){return new Promise((r,i)=>{let a=new XMLHttpRequest;if(n.onProgress){let e=n.onProgress;a.upload.addEventListener(`progress`,t=>{t.lengthComputable&&e(t.loaded/t.total)})}a.addEventListener(`load`,()=>{if(a.status>=200&&a.status<=299){this.parseSuccessResponse(a,r,i);return}this.parseErrorResponse(a,i)}),a.addEventListener(`error`,()=>{i(Error(`Network error during upload`))}),a.addEventListener(`abort`,()=>{i(Error(`Upload was aborted`))}),a.open(`PUT`,t),a.setRequestHeader(`Authorization`,`Bearer ${n.apiKey}`),a.setRequestHeader(`Content-Type`,e.type),n.duration!==void 0&&a.setRequestHeader(`X-Video-Duration`,n.duration.toString()),a.send(e)})}parseSuccessResponse(e,t,n){let r=this.safeParseJsonFromXhr(e);if(!r){n(Error(`Failed to parse upload response: invalid JSON`));return}t(r)}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}};function ef(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`)}dd();function tf(e){if(e!==void 0)return typeof e==`number`?e:e===du?`low`:e===fu?`medium`:e===pu?`high`:e===mu?`very-high`:`high`}async function nf(e,t,n){try{let{canEncodeVideo:r}=await Promise.resolve().then(()=>(dd(),ud));if(typeof r==`function`){let i={};if(e!==void 0&&(i.width=e),t!==void 0&&(i.height=t),n!==void 0&&(i.bitrate=n),await r(`hevc`,i))return`hevc`}}catch{}return`avc`}let rf=null;function af(){if(rf)return rf;if(typeof Blob>`u`||typeof URL>`u`)throw Error(`Blob and URL APIs are required for worker loading`);let e=new Blob([`// ../../node_modules/mediabunny/dist/modules/src/misc.js
108
108
  /*!
109
109
  * Copyright (c) 2025-present, Vanilagy and contributors
110
110
  *
@@ -8423,7 +8423,8 @@ class RecorderWorker {
8423
8423
  }
8424
8424
  }
8425
8425
  new RecorderWorker;
8426
- `],{type:`application/javascript`});return rf=URL.createObjectURL(e),rf}var of=class{constructor(){this.worker=null,this.chunks=[],this.totalSize=0,this.isActive=!1,this.videoTrackClone=null,this.audioTrackClone=null,this.isMuted=!1,this.currentVideoTrack=null,this.isPaused=!1,this.overlayConfig=null,this.readyPromiseResolve=null,this.setupWorker()}setupWorker(){if(typeof Worker>`u`)throw W.error(`[WorkerProcessor] Web Workers are not supported`),Error(`Web Workers are not supported`);try{W.debug(`[WorkerProcessor] Setting up worker`);let e=af();W.debug(`[WorkerProcessor] Worker URL created`,{urlType:typeof e,isBlobUrl:e.startsWith(`blob:`)}),this.worker=new Worker(e,{type:`classic`}),W.debug(`[WorkerProcessor] Worker created successfully`),this.worker.onmessage=this.handleWorkerMessage.bind(this),this.worker.onerror=this.handleWorkerError.bind(this),W.debug(`[WorkerProcessor] Worker event handlers attached`)}catch(e){let t=e instanceof Error?e.message:String(e);throw W.error(`[WorkerProcessor] Failed to create worker:`,e),Error(`Failed to create worker: ${t}`)}}handleWorkerMessage(e){let t=e.data;switch(t.type){case`ready`:W.debug(`[WorkerProcessor] Worker ready`),this.readyPromiseResolve&&=(this.readyPromiseResolve(),null);break;case`error`:W.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`:W.debug(`[WorkerProcessor] State changed:`,t.state),this.isPaused=t.state===`paused`;break;default:W.warn(`[WorkerProcessor] Unknown response type:`,t)}}handleWorkerError(e){W.error(`[WorkerProcessor] Worker error event:`,{message:e.message,filename:e.filename,lineno:e.lineno,colno:e.colno,error:e.error}),this.onError&&this.onError(Error(e.message||`Unknown worker error`))}async startProcessing(e,t,n){if(!this.worker)throw Error(`Worker not initialized`);if(this.isActive)throw Error(`Processing already active`);this.isActive=!0,this.isMuted=!1,this.isPaused=!1,this.chunks=[],this.totalSize=0,this.overlayConfig=n||null;let r=t.format||`mp4`,i=t.audioCodec||pd(r),a=ef(e),o=t.codec||await nf(t.width,t.height,t.bitrate);W.debug(`[WorkerProcessor] Starting processing`,{isScreenCapture:a,fps:t.fps,codec:o,bitrate:t.bitrate});let s={width:t.width,height:t.height,fps:t.fps,bitrate:tf(t.bitrate),audioCodec:i,audioBitrate:t.audioBitrate,codec:o,keyFrameInterval:5,format:r,watermark:t.watermark},c=e.getVideoTracks(),l=e.getAudioTracks();W.debug(`[WorkerProcessor] Preparing to start processing`,{videoTracksCount:c.length,audioTracksCount:l.length,hasWorker:!!this.worker});let u=null,d=null;if(c.length>0){this.stopCurrentVideoTrack();let e=c[0];u=this.cloneVideoTrack(e),this.currentVideoTrack=u}if(l.length>0){let e=l[0];d=this.cloneAudioTrack(e)}W.debug(`[WorkerProcessor] Track details`,{hasVideoTrack:!!u,videoTrackId:u?.id,videoTrackKind:u?.kind,videoTrackReadyState:u?.readyState,hasAudioTrack:!!d,audioTrackId:d?.id,audioTrackKind:d?.kind,audioTrackReadyState:d?.readyState});let f=u===null?null:new MediaStreamTrackProcessor({track:u}).readable,p=d===null?null:new MediaStreamTrackProcessor({track:d}).readable,m={type:`start`,videoStream:f,audioStream:p,config:s,overlayConfig:this.overlayConfig||void 0},h=[];f&&h.push(f),p&&h.push(p),W.debug(`[WorkerProcessor] Posting message to worker`,{transferablesCount:h.length,messageType:m.type});let g=new Promise(e=>{this.readyPromiseResolve=e});try{this.worker.postMessage(m,h),W.debug(`[WorkerProcessor] Message posted successfully`),await g,W.debug(`[WorkerProcessor] Worker confirmed ready`)}catch(e){throw W.error(`[WorkerProcessor] Failed to post message:`,e),this.readyPromiseResolve=null,e}}pause(){this.worker&&this.isActive&&this.worker.postMessage({type:`pause`})}resume(){this.isWorkerActive()&&this.worker&&this.worker.postMessage({type:`resume`})}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`})}switchVideoSource(e){if(!(this.isWorkerActive()&&this.worker))return W.debug(`[WorkerProcessor] Cannot switch source - worker not active`,{hasWorker:!!this.worker,isActive:this.isActive}),Promise.resolve();let t=e.getVideoTracks();if(W.debug(`[WorkerProcessor] Switching video source`,{videoTracksCount:t.length}),t.length===0)return W.warn(`[WorkerProcessor] No video tracks in new stream`),Promise.resolve();let n=ef(e);W.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=t[0];this.stopCurrentVideoTrack();let a=this.cloneVideoTrack(i);W.debug(`[WorkerProcessor] New video track details`,{trackId:a.id,trackKind:a.kind,trackReadyState:a.readyState}),this.currentVideoTrack=a;let o={type:`switchSource`,videoStream:new MediaStreamTrackProcessor({track:a}).readable};try{W.debug(`[WorkerProcessor] Posting switch source message`);let e=[];return o.videoStream&&e.push(o.videoStream),this.worker.postMessage(o,e),W.debug(`[WorkerProcessor] Switch source message posted`),new Promise(e=>{setTimeout(()=>{e()},0)})}catch(e){throw W.error(`[WorkerProcessor] Failed to switch source:`,e),e}}finalize(){if(!this.isWorkerActive())throw Error(`Processing not active`);return new Promise((e,t)=>{let n=setTimeout(()=>{t(Error(`Finalize timeout`))},3e4),r=i=>{let a=i.data;a.type===`stateChange`&&a.state===`stopped`?(this.worker&&this.worker.removeEventListener(`message`,r),clearTimeout(n),this.isActive=!1,e(this.createBlobFromChunks())):a.type===`error`&&(this.worker&&this.worker.removeEventListener(`message`,r),clearTimeout(n),t(Error(a.error)))};this.worker&&(this.worker.addEventListener(`message`,r),this.worker.postMessage({type:`stop`}))})}createBlobFromChunks(){let e=[...this.chunks].sort((e,t)=>e.position-t.position),t=new ArrayBuffer(this.totalSize),n=new Uint8Array(t);for(let t of e)n.set(t.data,t.position);return{blob:new Blob([t],{type:`video/mp4`}),totalSize:this.totalSize}}cancel(){return this.worker&&this.isActive&&this.worker.postMessage({type:`stop`}),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)){W.warn(`[WorkerProcessor] Cannot update visibility - worker not active`,{isActive:this.isActive,hasWorker:!!this.worker});return}W.debug(`[WorkerProcessor] Sending visibility update to worker`,{isHidden:e,timestamp:t,timestampSeconds:t/1e3});let n={type:`updateVisibility`,isHidden:e,timestamp:t};this.worker.postMessage(n)}updateSourceType(e){if(!(this.isWorkerActive()&&this.worker)){W.warn(`[WorkerProcessor] Cannot update source type - worker not active`,{isActive:this.isActive,hasWorker:!!this.worker});return}W.debug(`[WorkerProcessor] Sending source type update to worker`,{isScreenCapture:e});let t={type:`updateSourceType`,isScreenCapture:e};this.worker.postMessage(t)}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(W.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 this.videoTrackClone=t,W.debug(`[WorkerProcessor] Video track cloned successfully:`,{id:t.id,kind:t.kind,readyState:t.readyState}),t}catch(e){throw W.error(`[WorkerProcessor] Failed to clone video track:`,e),Error(`Failed to clone video track: ${e instanceof Error?e.message:String(e)}`)}return W.warn(`[WorkerProcessor] Video track clone() not available, using original`),this.videoTrackClone=e,e}cloneAudioTrack(e){if(W.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,W.debug(`[WorkerProcessor] Audio track cloned successfully:`,{id:t.id,kind:t.kind,readyState:t.readyState}),t}catch(e){throw W.error(`[WorkerProcessor] Failed to clone audio track:`,e),Error(`Failed to clone audio track: ${e instanceof Error?e.message:String(e)}`)}return W.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),rf&&=(URL.revokeObjectURL(rf),null),this.isActive=!1,this.isPaused=!1,this.chunks=[],this.totalSize=0}static isSupported(){return typeof Worker<`u`&&typeof MediaStreamTrackProcessor<`u`&&typeof VideoFrame<`u`&&typeof AudioData<`u`&&typeof OffscreenCanvas<`u`}},sf=class{constructor(){if(this.currentVideoStream=null,!of.isSupported())throw Error(`Web Workers are required for video processing. Please use a modern browser that supports Web Workers, MediaStreamTrackProcessor, VideoFrame, and AudioData APIs.`);try{this.workerProcessor=new of,W.debug(`[StreamProcessor] Using worker-based processing`)}catch(e){let t=e instanceof Error?e.message:String(e);throw Error(`Failed to initialize worker: ${t}. Web Workers are required for video processing.`)}}async startProcessing(e,t,n){this.workerProcessor.setOnBufferUpdate((e,t)=>{W.debug(`[StreamProcessor] Buffer update:`,{size:e,formatted:t})}),this.workerProcessor.setOnError(e=>{W.error(`[StreamProcessor] Worker error:`,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 W.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}async cancel(){await this.workerProcessor.cancel(),this.workerProcessor.cleanup(),this.currentVideoStream=null}};let cf=1e3,lf=`recording`,uf=`idle`;var df=class{constructor(e,t){this.recordingState=uf,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.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!==lf||!this.streamProcessor||this.streamProcessor.updateSourceType(e)}setOriginalCameraStream(e){this.originalCameraStream=e}getOriginalCameraStream(){return this.originalCameraStream}async startRecording(){try{this.callbacks.onClearUploadStatus(),this.countdownDuration>0?this.startCountdown():await this.doStartRecording()}catch(e){this.handleError(e),this.recordingState=uf,this.cancelCountdown()}}startCountdown(){this.recordingState=`countdown`,this.countdownRemaining=Math.ceil(this.countdownDuration/cf),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)/cf)),this.callbacks.onCountdownUpdate(this.recordingState,this.countdownRemaining)},100),this.countdownTimeoutId=window.setTimeout(async()=>{await this.doStartRecording().catch(()=>{})},this.countdownDuration)}async doStartRecording(){W.debug(`[RecordingManager] doStartRecording called`),this.cancelCountdown(),this.recordingState=lf,this.callbacks.onStateChange(this.recordingState),this.resetRecordingState();let e=this.streamManager.getStream();if(W.debug(`[RecordingManager] Current stream:`,{hasStream:!!e,audioTracks:e?.getAudioTracks().length||0,videoTracks:e?.getVideoTracks().length||0}),!e){W.warn(`[RecordingManager] No stream available`),this.handleError(Error(`No stream available for recording`)),this.recordingState=uf,this.callbacks.onStateChange(this.recordingState);return}this.originalCameraStream=e,W.debug(`[RecordingManager] Creating new StreamProcessor`),this.streamProcessor=new sf,W.debug(`[RecordingManager] StreamProcessor created:`,!!this.streamProcessor);let t=await this.callbacks.onGetConfig().then(e=>({config:e,error:null})).catch(e=>({config:null,error:e}));if(t.error){this.handleError(t.error),this.recordingState=uf,this.callbacks.onStateChange(this.recordingState);return}if(!t.config){this.handleError(Error(`Failed to get recording config`)),this.recordingState=uf,this.callbacks.onStateChange(this.recordingState);return}W.debug(`[RecordingManager] Starting recording with stream manager`);let n=await this.streamManager.startRecording(this.streamProcessor,t.config,this.enableTabVisibilityOverlay,this.tabVisibilityOverlayText).then(()=>(W.info(`[RecordingManager] Recording started successfully`),null)).catch(e=>(W.error(`[RecordingManager] Error starting recording:`,e),e));if(n){this.handleError(n),this.recordingState=uf,this.callbacks.onStateChange(this.recordingState);return}this.startRecordingTimer(),this.maxRecordingTime&&this.maxRecordingTime>0&&(this.maxTimeTimer=window.setTimeout(async()=>{this.recordingState===lf&&await this.stopRecording()},this.maxRecordingTime))}async stopRecording(){W.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(),W.debug(`[RecordingManager] Stopping recording in stream manager`);let e=(await this.streamManager.stopRecording()).blob;return W.info(`[RecordingManager] Recording stopped, blob size:`,e.size),this.recordingState=uf,this.callbacks.onStateChange(this.recordingState),this.recordingSeconds=0,this.streamProcessor=null,this.callbacks.onRecordingComplete(e),e}catch(e){throw this.handleError(e),this.recordingState=uf,this.callbacks.onStateChange(this.recordingState),e}}pauseRecording(){this.recordingState!==lf||this.isPaused||(this.streamManager.pauseRecording(),this.isPaused=!0,this.clearTimer(this.recordingIntervalId,clearInterval),this.recordingIntervalId=null,this.pauseStartTime=Date.now())}resumeRecording(){this.recordingState!==lf||!this.isPaused||(this.streamManager.resumeRecording(),this.isPaused=!1,this.updatePausedDuration(),this.startRecordingTimer())}cancelCountdown(){this.clearTimer(this.countdownTimeoutId,clearTimeout),this.countdownTimeoutId=null,this.clearTimer(this.countdownIntervalId,clearInterval),this.countdownIntervalId=null,this.recordingState=uf,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}resetRecordingState(){this.isPaused=!1,this.recordingSeconds=0,this.totalPausedTime=0,this.pauseStartTime=null}resetPauseState(){this.isPaused=!1,this.pauseStartTime=null,this.totalPausedTime=0}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(){this.recordingIntervalId===null&&(this.recordingIntervalId=window.setInterval(()=>{this.recordingSeconds+=1,this.callbacks.onTimerUpdate(Gd(this.recordingSeconds))},1e3))}clearTimer(e,t){e!==null&&t(e)}handleError(e){let t=e instanceof Error?e:Error(i(e));this.callbacks.onError(t)}};let ff=()=>{},pf=()=>{},mf=()=>{},hf=()=>{},gf=e=>{},_f=(e,t)=>{},vf=e=>{},yf=e=>{},bf=e=>{},xf=()=>{},Sf=e=>{};function Cf(){return{onProgress:ff,onSuccess:pf,onError:mf,onClearStatus:hf}}var wf=class{constructor(e={}){this.uploadService=null,this.uploadQueueManager=null,this.isInitialized=!1,this.enableTabVisibilityOverlay=!1,this.callbacks=e,this.streamManager=new Zd,this.configManager=new Sd,this.storageManager=new Ad,this.deviceManager=new Cd(this.streamManager,e.device),this.audioLevelAnalyzer=new a,this.uploadService=new $d,this.uploadCallbacks=e.upload?e.upload:Cf();let t=this.createRecordingCallbacks(e);this.recordingManager=new df(this.streamManager,t);let n=this.createSourceSwitchCallbacks(e);this.sourceSwitchManager=new Rd(this.streamManager,n),e.stream&&(this.streamManager.on(`streamstart`,({stream:t})=>{W.debug(`[RecorderController] streamstart event received, calling callback`),e.stream?.onStreamStart&&e.stream.onStreamStart(t)}),this.streamManager.on(`streamstop`,()=>{W.debug(`[RecorderController] streamstop event received, calling callback`),e.stream?.onStreamStop&&e.stream.onStreamStop()}),this.streamManager.on(`error`,({error:t})=>{W.error(`[RecorderController] stream error event received, calling callback`,t),e.stream?.onError&&e.stream.onError(t)}))}async initialize(e){if(this.isInitialized)return;e.apiKey&&e.backendUrl&&await this.configManager.initialize(e.apiKey,e.backendUrl),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);let t=this.callbacks.onStorageCleanupError??Sf;await this.storageManager.initialize(t);let n=this.storageManager.getStorageService();n&&this.uploadService&&(this.uploadQueueManager=new Qd(n,this.uploadService),this.uploadQueueManager.setCallbacks({onUploadProgress:(e,t)=>{this.uploadCallbacks.onProgress(t)},onUploadComplete:(e,t)=>{this.uploadCallbacks.onSuccess(t)},onUploadError:(e,t)=>{this.uploadCallbacks.onError(t)}})),this.isInitialized=!0}async startStream(){W.debug(`[RecorderController] startStream called`),await this.streamManager.startStream(),W.debug(`[RecorderController] startStream completed`)}async stopStream(){await this.streamManager.stopStream()}switchVideoDevice(e){return this.streamManager.switchVideoDevice(e)}switchAudioDevice(e){return this.streamManager.switchAudioDevice(e)}async startRecording(){await this.recordingManager.startRecording()}async stopRecording(){let e=await this.recordingManager.stopRecording();return await this.sourceSwitchManager.handleRecordingStop().catch(()=>{throw Error(`Source switch cleanup failed`)}),e}getTabVisibilityOverlayConfig(){return{enabled:this.enableTabVisibilityOverlay,text:this.tabVisibilityOverlayText}}pauseRecording(){this.recordingManager.pauseRecording()}resumeRecording(){this.recordingManager.resumeRecording()}async switchSource(e){await this.sourceSwitchManager.toggleSource()}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 wd(e),a=Object.keys(r).length>0?r:void 0;await this.uploadQueueManager.queueUpload({blob:e,apiKey:t,backendUrl:n,filename:`recording-${Date.now()}.mp4`,duration:i,metadata:void 0,userMetadata:a})}getStream(){return this.streamManager.getStream()}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()}cleanup(){this.storageManager.destroy(),this.recordingManager.cleanup(),this.audioLevelAnalyzer.stopTracking(),this.sourceSwitchManager.cleanup()}createRecordingCallbacks(e){let t=e.recording;return{onStateChange:t?.onStateChange??gf,onCountdownUpdate:t?.onCountdownUpdate??_f,onTimerUpdate:t?.onTimerUpdate??vf,onError:t?.onError??yf,onRecordingComplete:t?.onRecordingComplete??bf,onClearUploadStatus:t?.onClearUploadStatus??xf,onStopAudioTracking:()=>{this.audioLevelAnalyzer.stopTracking()},onGetConfig:()=>this.configManager.getConfig()}}createSourceSwitchCallbacks(e){let t=e.sourceSwitch;return{onSourceChange:t?.onSourceChange,onPreviewUpdate:t?.onPreviewUpdate,onError:t?.onError,onTransitionStart:t?.onTransitionStart,onTransitionEnd:t?.onTransitionEnd,onScreenSelectionStart:()=>{this.isRecording()&&this.recordingManager.updateSourceType(!0)},onScreenSelectionEnd:()=>{this.isRecording()&&this.recordingManager.updateSourceType(!1)},getSelectedCameraDeviceId:()=>this.deviceManager.getSelectedCameraDeviceId(),getSelectedMicDeviceId:()=>this.deviceManager.getSelectedMicDeviceId()}}},Tf=`2.0.7`,Ef=500,Df=`user-agent`,Of=``,kf=`?`,G={FUNCTION:`function`,OBJECT:`object`,STRING:`string`,UNDEFINED:`undefined`},Af=`browser`,jf=`cpu`,Mf=`device`,Nf=`engine`,Pf=`os`,Ff=`result`,K=`name`,q=`type`,J=`vendor`,Y=`version`,If=`architecture`,Lf=`major`,X=`model`,Rf=`console`,Z=`mobile`,Q=`tablet`,$=`smarttv`,zf=`wearable`,Bf=`xr`,Vf=`embedded`,Hf=`inapp`,Uf=`brands`,Wf=`formFactors`,Gf=`fullVersionList`,Kf=`platform`,qf=`platformVersion`,Jf=`bitness`,Yf=`sec-ch-ua`,Xf=Yf+`-full-version-list`,Zf=Yf+`-arch`,Qf=Yf+`-`+Jf,$f=Yf+`-form-factors`,ep=Yf+`-`+Z,tp=Yf+`-`+X,np=Yf+`-`+Kf,rp=np+`-version`,ip=[Uf,Gf,Z,X,Kf,qf,If,Wf,Jf],ap=`Amazon`,op=`Apple`,sp=`ASUS`,cp=`BlackBerry`,lp=`Google`,up=`Huawei`,dp=`Lenovo`,fp=`Honor`,pp=`LG`,mp=`Microsoft`,hp=`Motorola`,gp=`Nvidia`,_p=`OnePlus`,vp=`OPPO`,yp=`Samsung`,bp=`Sharp`,xp=`Sony`,Sp=`Xiaomi`,Cp=`Zebra`,wp=`Chrome`,Tp=`Chromium`,Ep=`Chromecast`,Dp=`Edge`,Op=`Firefox`,kp=`Opera`,Ap=`Facebook`,jp=`Sogou`,Mp=`Mobile `,Np=` Browser`,Pp=`Windows`,Fp=typeof window!==G.UNDEFINED&&window.navigator?window.navigator:void 0,Ip=Fp&&Fp.userAgentData?Fp.userAgentData:void 0,Lp=function(e,t){var n={},r=t;if(!Bp(t))for(var i in r={},t)for(var a in t[i])r[a]=t[i][a].concat(r[a]?r[a]:[]);for(var o in e)n[o]=r[o]&&r[o].length%2==0?r[o].concat(e[o]):e[o];return n},Rp=function(e){for(var t={},n=0;n<e.length;n++)t[e[n].toUpperCase()]=e[n];return t},zp=function(e,t){if(typeof e===G.OBJECT&&e.length>0){for(var n in e)if(Up(t)==Up(e[n]))return!0;return!1}return Vp(e)?Up(t)==Up(e):!1},Bp=function(e,t){for(var n in e)return/^(browser|cpu|device|engine|os)$/.test(n)||(t?Bp(e[n]):!1)},Vp=function(e){return typeof e===G.STRING},Hp=function(e){if(e){for(var t=[],n=Kp(/\\?\"/g,e).split(`,`),r=0;r<n.length;r++)if(n[r].indexOf(`;`)>-1){var i=Jp(n[r]).split(`;v=`);t[r]={brand:i[0],version:i[1]}}else t[r]=Jp(n[r]);return t}},Up=function(e){return Vp(e)?e.toLowerCase():e},Wp=function(e){return Vp(e)?Kp(/[^\d\.]/g,e).split(`.`)[0]:void 0},Gp=function(e){for(var t in e)if(e.hasOwnProperty(t)){var n=e[t];typeof n==G.OBJECT&&n.length==2?this[n[0]]=n[1]:this[n]=void 0}return this},Kp=function(e,t){return Vp(t)?t.replace(e,Of):t},qp=function(e){return Kp(/\\?\"/g,e)},Jp=function(e,t){return e=Kp(/^\s\s*/,String(e)),typeof t===G.UNDEFINED?e:e.substring(0,t)},Yp=function(e,t){if(!(!e||!t))for(var n=0,r,i,a,o,s,c;n<t.length&&!s;){var l=t[n],u=t[n+1];for(r=i=0;r<l.length&&!s&&l[r];)if(s=l[r++].exec(e),s)for(a=0;a<u.length;a++)c=s[++i],o=u[a],typeof o===G.OBJECT&&o.length>0?o.length===2?typeof o[1]==G.FUNCTION?this[o[0]]=o[1].call(this,c):this[o[0]]=o[1]:o.length>=3&&(typeof o[1]===G.FUNCTION&&!(o[1].exec&&o[1].test)?o.length>3?this[o[0]]=c?o[1].apply(this,o.slice(2)):void 0:this[o[0]]=c?o[1].call(this,c,o[2]):void 0:o.length==3?this[o[0]]=c?c.replace(o[1],o[2]):void 0:o.length==4?this[o[0]]=c?o[3].call(this,c.replace(o[1],o[2])):void 0:o.length>4&&(this[o[0]]=c?o[3].apply(this,[c.replace(o[1],o[2])].concat(o.slice(4))):void 0)):this[o]=c||void 0;n+=2}},Xp=function(e,t){for(var n in t)if(typeof t[n]===G.OBJECT&&t[n].length>0){for(var r=0;r<t[n].length;r++)if(zp(t[n][r],e))return n===kf?void 0:n}else if(zp(t[n],e))return n===kf?void 0:n;return t.hasOwnProperty(`*`)?t[`*`]:e},Zp={ME:`4.90`,"NT 3.51":`3.51`,"NT 4.0":`4.0`,2e3:[`5.0`,`5.01`],XP:[`5.1`,`5.2`],Vista:`6.0`,7:`6.1`,8:`6.2`,"8.1":`6.3`,10:[`6.4`,`10.0`],NT:``},Qp={embedded:`Automotive`,mobile:`Mobile`,tablet:[`Tablet`,`EInk`],smarttv:`TV`,wearable:`Watch`,xr:[`VR`,`XR`],"?":[`Desktop`,`Unknown`],"*":void 0},$p={Chrome:`Google Chrome`,Edge:`Microsoft Edge`,"Edge WebView2":`Microsoft Edge WebView2`,"Chrome WebView":`Android WebView`,"Chrome Headless":`HeadlessChrome`,"Huawei Browser":`HuaweiBrowser`,"MIUI Browser":`Miui Browser`,"Opera Mobi":`OperaMobile`,Yandex:`YaBrowser`},em={browser:[[/\b(?:crmo|crios)\/([\w\.]+)/i],[Y,[K,Mp+`Chrome`]],[/webview.+edge\/([\w\.]+)/i],[Y,[K,Dp+` WebView`]],[/edg(?:e|ios|a)?\/([\w\.]+)/i],[Y,[K,`Edge`]],[/(opera mini)\/([-\w\.]+)/i,/(opera [mobiletab]{3,6})\b.+version\/([-\w\.]+)/i,/(opera)(?:.+version\/|[\/ ]+)([\w\.]+)/i],[K,Y],[/opios[\/ ]+([\w\.]+)/i],[Y,[K,kp+` Mini`]],[/\bop(?:rg)?x\/([\w\.]+)/i],[Y,[K,kp+` GX`]],[/\bopr\/([\w\.]+)/i],[Y,[K,kp]],[/\bb[ai]*d(?:uhd|[ub]*[aekoprswx]{5,6})[\/ ]?([\w\.]+)/i],[Y,[K,`Baidu`]],[/\b(?:mxbrowser|mxios|myie2)\/?([-\w\.]*)\b/i],[Y,[K,`Maxthon`]],[/(kindle)\/([\w\.]+)/i,/(lunascape|maxthon|netfront|jasmine|blazer|sleipnir)[\/ ]?([\w\.]*)/i,/(avant|iemobile|slim(?:browser|boat|jet))[\/ ]?([\d\.]*)/i,/(?:ms|\()(ie) ([\w\.]+)/i,/(atlas|flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|qupzilla|falkon|rekonq|puffin|brave|whale(?!.+naver)|qqbrowserlite|duckduckgo|klar|helio|(?=comodo_)?dragon|otter|dooble|(?:lg |qute)browser|palemoon)\/([-\w\.]+)/i,/(heytap|ovi|115|surf|qwant)browser\/([\d\.]+)/i,/(qwant)(?:ios|mobile)\/([\d\.]+)/i,/(ecosia|weibo)(?:__| \w+@)([\d\.]+)/i],[K,Y],[/quark(?:pc)?\/([-\w\.]+)/i],[Y,[K,`Quark`]],[/\bddg\/([\w\.]+)/i],[Y,[K,`DuckDuckGo`]],[/(?:\buc? ?browser|(?:juc.+)ucweb)[\/ ]?([\w\.]+)/i],[Y,[K,`UCBrowser`]],[/microm.+\bqbcore\/([\w\.]+)/i,/\bqbcore\/([\w\.]+).+microm/i,/micromessenger\/([\w\.]+)/i],[Y,[K,`WeChat`]],[/konqueror\/([\w\.]+)/i],[Y,[K,`Konqueror`]],[/trident.+rv[: ]([\w\.]{1,9})\b.+like gecko/i],[Y,[K,`IE`]],[/ya(?:search)?browser\/([\w\.]+)/i],[Y,[K,`Yandex`]],[/slbrowser\/([\w\.]+)/i],[Y,[K,`Smart `+dp+Np]],[/(avast|avg)\/([\w\.]+)/i],[[K,/(.+)/,`$1 Secure`+Np],Y],[/\bfocus\/([\w\.]+)/i],[Y,[K,Op+` Focus`]],[/\bopt\/([\w\.]+)/i],[Y,[K,kp+` Touch`]],[/coc_coc\w+\/([\w\.]+)/i],[Y,[K,`Coc Coc`]],[/dolfin\/([\w\.]+)/i],[Y,[K,`Dolphin`]],[/coast\/([\w\.]+)/i],[Y,[K,kp+` Coast`]],[/miuibrowser\/([\w\.]+)/i],[Y,[K,`MIUI`+Np]],[/fxios\/([\w\.-]+)/i],[Y,[K,Mp+Op]],[/\bqihoobrowser\/?([\w\.]*)/i],[Y,[K,`360`]],[/\b(qq)\/([\w\.]+)/i],[[K,/(.+)/,`$1Browser`],Y],[/(oculus|sailfish|huawei|vivo|pico)browser\/([\w\.]+)/i],[[K,/(.+)/,`$1`+Np],Y],[/samsungbrowser\/([\w\.]+)/i],[Y,[K,yp+` Internet`]],[/metasr[\/ ]?([\d\.]+)/i],[Y,[K,jp+` Explorer`]],[/(sogou)mo\w+\/([\d\.]+)/i],[[K,jp+` Mobile`],Y],[/(electron)\/([\w\.]+) safari/i,/(tesla)(?: qtcarbrowser|\/(20\d\d\.[-\w\.]+))/i,/m?(qqbrowser|2345(?=browser|chrome|explorer))\w*[\/ ]?v?([\w\.]+)/i],[K,Y],[/(lbbrowser|rekonq|steam(?= (clie|tenf|gameo)))/i],[K],[/ome\/([\w\.]+) \w* ?(iron) saf/i,/ome\/([\w\.]+).+qihu (360)[es]e/i],[Y,K],[/((?:fban\/fbios|fb_iab\/fb4a)(?!.+fbav)|;fbav\/([\w\.]+);)/i],[[K,Ap],Y,[q,Hf]],[/(kakao(?:talk|story))[\/ ]([\w\.]+)/i,/(naver)\(.*?(\d+\.[\w\.]+).*\)/i,/(daum)apps[\/ ]([\w\.]+)/i,/safari (line)\/([\w\.]+)/i,/\b(line)\/([\w\.]+)\/iab/i,/(alipay)client\/([\w\.]+)/i,/(twitter)(?:and| f.+e\/([\w\.]+))/i,/(bing)(?:web|sapphire)\/([\w\.]+)/i,/(instagram|snapchat|klarna)[\/ ]([-\w\.]+)/i],[K,Y,[q,Hf]],[/\bgsa\/([\w\.]+) .*safari\//i],[Y,[K,`GSA`],[q,Hf]],[/musical_ly(?:.+app_?version\/|_)([\w\.]+)/i],[Y,[K,`TikTok`],[q,Hf]],[/\[(linkedin)app\]/i],[K,[q,Hf]],[/(zalo(?:app)?)[\/\sa-z]*([\w\.-]+)/i],[[K,/(.+)/,`Zalo`],Y,[q,Hf]],[/(chromium)[\/ ]([-\w\.]+)/i],[K,Y],[/headlesschrome(?:\/([\w\.]+)| )/i],[Y,[K,wp+` Headless`]],[/wv\).+chrome\/([\w\.]+).+edgw\//i],[Y,[K,Dp+` WebView2`]],[/ wv\).+(chrome)\/([\w\.]+)/i],[[K,wp+` WebView`],Y],[/droid.+ version\/([\w\.]+)\b.+(?:mobile safari|safari)/i],[Y,[K,`Android`+Np]],[/chrome\/([\w\.]+) mobile/i],[Y,[K,Mp+`Chrome`]],[/(chrome|omniweb|arora|[tizenoka]{5} ?browser)\/v?([\w\.]+)/i],[K,Y],[/version\/([\w\.\,]+) .*mobile(?:\/\w+ | ?)safari/i],[Y,[K,Mp+`Safari`]],[/iphone .*mobile(?:\/\w+ | ?)safari/i],[[K,Mp+`Safari`]],[/version\/([\w\.\,]+) .*(safari)/i],[Y,K],[/webkit.+?(mobile ?safari|safari)(\/[\w\.]+)/i],[K,[Y,`1`]],[/(webkit|khtml)\/([\w\.]+)/i],[K,Y],[/(?:mobile|tablet);.*(firefox)\/([\w\.-]+)/i],[[K,Mp+Op],Y],[/(navigator|netscape\d?)\/([-\w\.]+)/i],[[K,`Netscape`],Y],[/(wolvic|librewolf)\/([\w\.]+)/i],[K,Y],[/mobile vr; rv:([\w\.]+)\).+firefox/i],[Y,[K,Op+` Reality`]],[/ekiohf.+(flow)\/([\w\.]+)/i,/(swiftfox)/i,/(icedragon|iceweasel|camino|chimera|fennec|maemo browser|minimo|conkeror)[\/ ]?([\w\.\+]+)/i,/(seamonkey|k-meleon|icecat|iceape|firebird|phoenix|basilisk|waterfox)\/([-\w\.]+)$/i,/(firefox)\/([\w\.]+)/i,/(mozilla)\/([\w\.]+(?= .+rv\:.+gecko\/\d+)|[0-4][\w\.]+(?!.+compatible))/i,/(amaya|dillo|doris|icab|ladybird|lynx|mosaic|netsurf|obigo|polaris|w3m|(?:go|ice|up)[\. ]?browser)[-\/ ]?v?([\w\.]+)/i,/\b(links) \(([\w\.]+)/i],[K,[Y,/_/g,`.`]],[/(cobalt)\/([\w\.]+)/i],[K,[Y,/[^\d\.]+./,Of]]],cpu:[[/\b((amd|x|x86[-_]?|wow|win)64)\b/i],[[If,`amd64`]],[/(ia32(?=;))/i,/\b((i[346]|x)86)(pc)?\b/i],[[If,`ia32`]],[/\b(aarch64|arm(v?[89]e?l?|_?64))\b/i],[[If,`arm64`]],[/\b(arm(v[67])?ht?n?[fl]p?)\b/i],[[If,`armhf`]],[/( (ce|mobile); ppc;|\/[\w\.]+arm\b)/i],[[If,`arm`]],[/ sun4\w[;\)]/i],[[If,`sparc`]],[/\b(avr32|ia64(?=;)|68k(?=\))|\barm(?=v([1-7]|[5-7]1)l?|;|eabi)|(irix|mips|sparc)(64)?\b|pa-risc)/i,/((ppc|powerpc)(64)?)( mac|;|\))/i,/(?:osf1|[freopnt]{3,4}bsd) (alpha)/i],[[If,/ower/,Of,Up]],[/mc680.0/i],[[If,`68k`]],[/winnt.+\[axp/i],[[If,`alpha`]]],device:[[/\b(sch-i[89]0\d|shw-m380s|sm-[ptx]\w{2,4}|gt-[pn]\d{2,4}|sgh-t8[56]9|nexus 10)/i],[X,[J,yp],[q,Q]],[/\b((?:s[cgp]h|gt|sm)-(?![lr])\w+|sc[g-]?[\d]+a?|galaxy nexus)/i,/samsung[- ]((?!sm-[lr]|browser)[-\w]+)/i,/sec-(sgh\w+)/i],[X,[J,yp],[q,Z]],[/(?:\/|\()(ip(?:hone|od)[\w, ]*)[\/\);]/i],[X,[J,op],[q,Z]],[/\b(?:ios|apple\w+)\/.+[\(\/](ipad)/i,/\b(ipad)[\d,]*[;\] ].+(mac |i(pad)?)os/i],[X,[J,op],[q,Q]],[/(macintosh);/i],[X,[J,op]],[/\b(sh-?[altvz]?\d\d[a-ekm]?)/i],[X,[J,bp],[q,Z]],[/\b((?:brt|eln|hey2?|gdi|jdn)-a?[lnw]09|(?:ag[rm]3?|jdn2|kob2)-a?[lw]0[09]hn)(?: bui|\)|;)/i],[X,[J,fp],[q,Q]],[/honor([-\w ]+)[;\)]/i],[X,[J,fp],[q,Z]],[/\b((?:ag[rs][2356]?k?|bah[234]?|bg[2o]|bt[kv]|cmr|cpn|db[ry]2?|jdn2|got|kob2?k?|mon|pce|scm|sht?|[tw]gr|vrd)-[ad]?[lw][0125][09]b?|605hw|bg2-u03|(?:gem|fdr|m2|ple|t1)-[7a]0[1-4][lu]|t1-a2[13][lw]|mediapad[\w\. ]*(?= bui|\)))\b(?!.+d\/s)/i],[X,[J,up],[q,Q]],[/(?:huawei) ?([-\w ]+)[;\)]/i,/\b(nexus 6p|\w{2,4}e?-[atu]?[ln][\dx][\dc][adnt]?)\b(?!.+d\/s)/i],[X,[J,up],[q,Z]],[/oid[^\)]+; (2[\dbc]{4}(182|283|rp\w{2})[cgl]|m2105k81a?c)(?: bui|\))/i,/\b(?:xiao)?((?:red)?mi[-_ ]?pad[\w- ]*)(?: bui|\))/i],[[X,/_/g,` `],[J,Sp],[q,Q]],[/\b; (\w+) build\/hm\1/i,/\b(hm[-_ ]?note?[_ ]?(?:\d\w)?) bui/i,/oid[^\)]+; (redmi[\-_ ]?(?:note|k)?[\w_ ]+|m?[12]\d[01]\d\w{3,6}|poco[\w ]+|(shark )?\w{3}-[ah]0|qin ?[1-3](s\+|ultra| pro)?)( bui|; wv|\))/i,/\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note|max|cc)?[_ ]?(?:\d{0,2}\w?)[_ ]?(?:plus|se|lite|pro)?( 5g|lte)?)(?: bui|\))/i,/ ([\w ]+) miui\/v?\d/i],[[X,/_/g,` `],[J,Sp],[q,Z]],[/droid.+; (cph2[3-6]\d[13579]|((gm|hd)19|(ac|be|in|kb)20|(d[en]|eb|le|mt)21|ne22)[0-2]\d|p[g-k]\w[1m]10)\b/i,/(?:one)?(?:plus)? (a\d0\d\d)(?: b|\))/i],[X,[J,_p],[q,Z]],[/; (\w+) bui.+ oppo/i,/\b(cph[12]\d{3}|p(?:af|c[al]|d\w|e[ar])[mt]\d0|x9007|a101op)\b/i],[X,[J,vp],[q,Z]],[/\b(opd2(\d{3}a?))(?: bui|\))/i],[X,[J,Xp,{OnePlus:[`203`,`304`,`403`,`404`,`413`,`415`],"*":vp}],[q,Q]],[/(vivo (5r?|6|8l?|go|one|s|x[il]?[2-4]?)[\w\+ ]*)(?: bui|\))/i],[X,[J,`BLU`],[q,Z]],[/; vivo (\w+)(?: bui|\))/i,/\b(v[12]\d{3}\w?[at])(?: bui|;)/i],[X,[J,`Vivo`],[q,Z]],[/\b(rmx[1-3]\d{3})(?: bui|;|\))/i],[X,[J,`Realme`],[q,Z]],[/(ideatab[-\w ]+|602lv|d-42a|a101lv|a2109a|a3500-hv|s[56]000|pb-6505[my]|tb-?x?\d{3,4}(?:f[cu]|xu|[av])|yt\d?-[jx]?\d+[lfmx])( bui|;|\)|\/)/i,/lenovo ?(b[68]0[08]0-?[hf]?|tab(?:[\w- ]+?)|tb[\w-]{6,7})( bui|;|\)|\/)/i],[X,[J,dp],[q,Q]],[/lenovo[-_ ]?([-\w ]+?)(?: bui|\)|\/)/i],[X,[J,dp],[q,Z]],[/\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\b[\w ]+build\//i,/\bmot(?:orola)?[- ]([\w\s]+)(\)| bui)/i,/((?:moto(?! 360)[-\w\(\) ]+|xt\d{3,4}[cgkosw\+]?[-\d]*|nexus 6)(?= bui|\)))/i],[X,[J,hp],[q,Z]],[/\b(mz60\d|xoom[2 ]{0,2}) build\//i],[X,[J,hp],[q,Q]],[/((?=lg)?[vl]k\-?\d{3}) bui| 3\.[-\w; ]{10}lg?-([06cv9]{3,4})/i],[X,[J,pp],[q,Q]],[/(lm(?:-?f100[nv]?|-[\w\.]+)(?= bui|\))|nexus [45])/i,/\blg[-e;\/ ]+(?!.*(?:browser|netcast|android tv|watch|webos))(\w+)/i,/\blg-?([\d\w]+) bui/i],[X,[J,pp],[q,Z]],[/(nokia) (t[12][01])/i],[J,X,[q,Q]],[/(?:maemo|nokia).*(n900|lumia \d+|rm-\d+)/i,/nokia[-_ ]?(([-\w\. ]*?))( bui|\)|;|\/)/i],[[X,/_/g,` `],[q,Z],[J,`Nokia`]],[/(pixel (c|tablet))\b/i],[X,[J,lp],[q,Q]],[/droid.+;(?: google)? (g(01[13]a|020[aem]|025[jn]|1b60|1f8f|2ybb|4s1m|576d|5nz6|8hhn|8vou|a02099|c15s|d1yq|e2ae|ec77|gh2x|kv4x|p4bc|pj41|r83y|tt9q|ur25|wvk6)|pixel[\d ]*a?( pro)?( xl)?( fold)?( \(5g\))?)( bui|\))/i],[X,[J,lp],[q,Z]],[/(google) (pixelbook( go)?)/i],[J,X],[/droid.+; (a?\d[0-2]{2}so|[c-g]\d{4}|so[-gl]\w+|xq-\w\w\d\d)(?= bui|\).+chrome\/(?![1-6]{0,1}\d\.))/i],[X,[J,xp],[q,Z]],[/sony tablet [ps]/i,/\b(?:sony)?sgp\w+(?: bui|\))/i],[[X,`Xperia Tablet`],[J,xp],[q,Q]],[/(alexa)webm/i,/(kf[a-z]{2}wi|aeo(?!bc)\w\w)( bui|\))/i,/(kf[a-z]+)( bui|\)).+silk\//i],[X,[J,ap],[q,Q]],[/((?:sd|kf)[0349hijorstuw]+)( bui|\)).+silk\//i],[[X,/(.+)/g,`Fire Phone $1`],[J,ap],[q,Z]],[/(playbook);[-\w\),; ]+(rim)/i],[X,J,[q,Q]],[/\b((?:bb[a-f]|st[hv])100-\d)/i,/(?:blackberry|\(bb10;) (\w+)/i],[X,[J,cp],[q,Z]],[/(?:\b|asus_)(transfo[prime ]{4,10} \w+|eeepc|slider \w+|nexus 7|padfone|p00[cj])/i],[X,[J,sp],[q,Q]],[/ (z[bes]6[027][012][km][ls]|zenfone \d\w?)\b/i],[X,[J,sp],[q,Z]],[/(nexus 9)/i],[X,[J,`HTC`],[q,Q]],[/(htc)[-;_ ]{1,2}([\w ]+(?=\)| bui)|\w+)/i,/(zte)[- ]([\w ]+?)(?: bui|\/|\))/i,/(alcatel|geeksphone|nexian|panasonic(?!(?:;|\.))|sony(?!-bra))[-_ ]?([-\w]*)/i],[J,[X,/_/g,` `],[q,Z]],[/tcl (xess p17aa)/i,/droid [\w\.]+; ((?:8[14]9[16]|9(?:0(?:48|60|8[01])|1(?:3[27]|66)|2(?:6[69]|9[56])|466))[gqswx])(_\w(\w|\w\w))?(\)| bui)/i],[X,[J,`TCL`],[q,Q]],[/droid [\w\.]+; (418(?:7d|8v)|5087z|5102l|61(?:02[dh]|25[adfh]|27[ai]|56[dh]|59k|65[ah])|a509dl|t(?:43(?:0w|1[adepqu])|50(?:6d|7[adju])|6(?:09dl|10k|12b|71[efho]|76[hjk])|7(?:66[ahju]|67[hw]|7[045][bh]|71[hk]|73o|76[ho]|79w|81[hks]?|82h|90[bhsy]|99b)|810[hs]))(_\w(\w|\w\w))?(\)| bui)/i],[X,[J,`TCL`],[q,Z]],[/(itel) ((\w+))/i],[[J,Up],X,[q,Xp,{tablet:[`p10001l`,`w7001`],"*":`mobile`}]],[/droid.+; ([ab][1-7]-?[0178a]\d\d?)/i],[X,[J,`Acer`],[q,Q]],[/droid.+; (m[1-5] note) bui/i,/\bmz-([-\w]{2,})/i],[X,[J,`Meizu`],[q,Z]],[/; ((?:power )?armor(?:[\w ]{0,8}))(?: bui|\))/i],[X,[J,`Ulefone`],[q,Z]],[/; (energy ?\w+)(?: bui|\))/i,/; energizer ([\w ]+)(?: bui|\))/i],[X,[J,`Energizer`],[q,Z]],[/; cat (b35);/i,/; (b15q?|s22 flip|s48c|s62 pro)(?: bui|\))/i],[X,[J,`Cat`],[q,Z]],[/((?:new )?andromax[\w- ]+)(?: bui|\))/i],[X,[J,`Smartfren`],[q,Z]],[/droid.+; (a(in)?(0(15|59|6[35])|142)p?)/i],[X,[J,`Nothing`],[q,Z]],[/; (x67 5g|tikeasy \w+|ac[1789]\d\w+)( b|\))/i,/archos ?(5|gamepad2?|([\w ]*[t1789]|hello) ?\d+[\w ]*)( b|\))/i],[X,[J,`Archos`],[q,Q]],[/archos ([\w ]+)( b|\))/i,/; (ac[3-6]\d\w{2,8})( b|\))/i],[X,[J,`Archos`],[q,Z]],[/; (n159v)/i],[X,[J,`HMD`],[q,Z]],[/(imo) (tab \w+)/i,/(infinix|tecno) (x1101b?|p904|dp(7c|8d|10a)( pro)?|p70[1-3]a?|p904|t1101)/i],[J,X,[q,Q]],[/(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus(?! zenw)|dell|jolla|meizu|motorola|polytron|tecno|micromax|advan)[-_ ]?([-\w]*)/i,/; (blu|hmd|imo|infinix|lava|oneplus|tcl|wiko)[_ ]([\w\+ ]+?)(?: bui|\)|; r)/i,/(hp) ([\w ]+\w)/i,/(microsoft); (lumia[\w ]+)/i,/(oppo) ?([\w ]+) bui/i,/(hisense) ([ehv][\w ]+)\)/i,/droid[^;]+; (philips)[_ ]([sv-x][\d]{3,4}[xz]?)/i],[J,X,[q,Z]],[/(kobo)\s(ereader|touch)/i,/(hp).+(touchpad(?!.+tablet)|tablet)/i,/(kindle)\/([\w\.]+)/i],[J,X,[q,Q]],[/(surface duo)/i],[X,[J,mp],[q,Q]],[/droid [\d\.]+; (fp\du?)(?: b|\))/i],[X,[J,`Fairphone`],[q,Z]],[/((?:tegranote|shield t(?!.+d tv))[\w- ]*?)(?: b|\))/i],[X,[J,gp],[q,Q]],[/(sprint) (\w+)/i],[J,X,[q,Z]],[/(kin\.[onetw]{3})/i],[[X,/\./g,` `],[J,mp],[q,Z]],[/droid.+; ([c6]+|et5[16]|mc[239][23]x?|vc8[03]x?)\)/i],[X,[J,Cp],[q,Q]],[/droid.+; (ec30|ps20|tc[2-8]\d[kx])\)/i],[X,[J,Cp],[q,Z]],[/(philips)[\w ]+tv/i,/smart-tv.+(samsung)/i],[J,[q,$]],[/hbbtv.+maple;(\d+)/i],[[X,/^/,`SmartTV`],[J,yp],[q,$]],[/(vizio)(?: |.+model\/)(\w+-\w+)/i,/tcast.+(lg)e?. ([-\w]+)/i],[J,X,[q,$]],[/(nux; netcast.+smarttv|lg (netcast\.tv-201\d|android tv))/i],[[J,pp],[q,$]],[/(apple) ?tv/i],[J,[X,op+` TV`],[q,$]],[/crkey.*devicetype\/chromecast/i],[[X,Ep+` Third Generation`],[J,lp],[q,$]],[/crkey.*devicetype\/([^/]*)/i],[[X,/^/,`Chromecast `],[J,lp],[q,$]],[/fuchsia.*crkey/i],[[X,Ep+` Nest Hub`],[J,lp],[q,$]],[/crkey/i],[[X,Ep],[J,lp],[q,$]],[/(portaltv)/i],[X,[J,Ap],[q,$]],[/droid.+aft(\w+)( bui|\))/i],[X,[J,ap],[q,$]],[/(shield \w+ tv)/i],[X,[J,gp],[q,$]],[/\(dtv[\);].+(aquos)/i,/(aquos-tv[\w ]+)\)/i],[X,[J,bp],[q,$]],[/(bravia[\w ]+)( bui|\))/i],[X,[J,xp],[q,$]],[/(mi(tv|box)-?\w+) bui/i],[X,[J,Sp],[q,$]],[/Hbbtv.*(technisat) (.*);/i],[J,X,[q,$]],[/\b(roku)[\dx]*[\)\/]((?:dvp-)?[\d\.]*)/i,/hbbtv\/\d+\.\d+\.\d+ +\([\w\+ ]*; *([\w\d][^;]*);([^;]*)/i],[[J,/.+\/(\w+)/,`$1`,Xp,{LG:`lge`}],[X,Jp],[q,$]],[/(playstation \w+)/i],[X,[J,xp],[q,Rf]],[/\b(xbox(?: one)?(?!; xbox))[\); ]/i],[X,[J,mp],[q,Rf]],[/(ouya)/i,/(nintendo) (\w+)/i,/(retroid) (pocket ([^\)]+))/i,/(valve).+(steam deck)/i,/droid.+; ((shield|rgcube|gr0006))( bui|\))/i],[[J,Xp,{Nvidia:`Shield`,Anbernic:`RGCUBE`,Logitech:`GR0006`}],X,[q,Rf]],[/\b(sm-[lr]\d\d[0156][fnuw]?s?|gear live)\b/i],[X,[J,yp],[q,zf]],[/((pebble))app/i,/(asus|google|lg|oppo|xiaomi) ((pixel |zen)?watch[\w ]*)( bui|\))/i],[J,X,[q,zf]],[/(ow(?:19|20)?we?[1-3]{1,3})/i],[X,[J,vp],[q,zf]],[/(watch)(?: ?os[,\/]|\d,\d\/)[\d\.]+/i],[X,[J,op],[q,zf]],[/(opwwe\d{3})/i],[X,[J,_p],[q,zf]],[/(moto 360)/i],[X,[J,hp],[q,zf]],[/(smartwatch 3)/i],[X,[J,xp],[q,zf]],[/(g watch r)/i],[X,[J,pp],[q,zf]],[/droid.+; (wt63?0{2,3})\)/i],[X,[J,Cp],[q,zf]],[/droid.+; (glass) \d/i],[X,[J,lp],[q,Bf]],[/(pico) ([\w ]+) os\d/i],[J,X,[q,Bf]],[/(quest( \d| pro)?s?).+vr/i],[X,[J,Ap],[q,Bf]],[/mobile vr; rv.+firefox/i],[[q,Bf]],[/(tesla)(?: qtcarbrowser|\/[-\w\.]+)/i],[J,[q,Vf]],[/(aeobc)\b/i],[X,[J,ap],[q,Vf]],[/(homepod).+mac os/i],[X,[J,op],[q,Vf]],[/windows iot/i],[[q,Vf]],[/droid.+; ([\w- ]+) (4k|android|smart|google)[- ]?tv/i],[X,[q,$]],[/\b((4k|android|smart|opera)[- ]?tv|tv; rv:|large screen[\w ]+safari)\b/i],[[q,$]],[/droid .+?; ([^;]+?)(?: bui|; wv\)|\) applew|; hmsc).+?(mobile|vr|\d) safari/i],[X,[q,Xp,{mobile:`Mobile`,xr:`VR`,"*":Q}]],[/\b((tablet|tab)[;\/]|focus\/\d(?!.+mobile))/i],[[q,Q]],[/(phone|mobile(?:[;\/]| [ \w\/\.]*safari)|pda(?=.+windows ce))/i],[[q,Z]],[/droid .+?; ([\w\. -]+)( bui|\))/i],[X,[J,`Generic`]]],engine:[[/windows.+ edge\/([\w\.]+)/i],[Y,[K,Dp+`HTML`]],[/(arkweb)\/([\w\.]+)/i],[K,Y],[/webkit\/537\.36.+chrome\/(?!27)([\w\.]+)/i],[Y,[K,`Blink`]],[/(presto)\/([\w\.]+)/i,/(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna|servo)\/([\w\.]+)/i,/ekioh(flow)\/([\w\.]+)/i,/(khtml|tasman|links)[\/ ]\(?([\w\.]+)/i,/(icab)[\/ ]([23]\.[\d\.]+)/i,/\b(libweb)/i],[K,Y],[/ladybird\//i],[[K,`LibWeb`]],[/rv\:([\w\.]{1,9})\b.+(gecko)/i],[Y,K]],os:[[/(windows nt) (6\.[23]); arm/i],[[K,/N/,`R`],[Y,Xp,Zp]],[/(windows (?:phone|mobile|iot))(?: os)?[\/ ]?([\d\.]*( se)?)/i,/(windows)[\/ ](1[01]|2000|3\.1|7|8(\.1)?|9[58]|me|server 20\d\d( r2)?|vista|xp)/i],[K,Y],[/windows nt ?([\d\.\)]*)(?!.+xbox)/i,/\bwin(?=3| ?9|n)(?:nt| 9x )?([\d\.;]*)/i],[[Y,/(;|\))/g,``,Xp,Zp],[K,Pp]],[/(windows ce)\/?([\d\.]*)/i],[K,Y],[/[adehimnop]{4,7}\b(?:.*os ([\w]+) like mac|; opera)/i,/(?:ios;fbsv|ios(?=.+ip(?:ad|hone)|.+apple ?tv)|ip(?:ad|hone)(?: |.+i(?:pad)?)os|apple ?tv.+ios)[\/ ]([\w\.]+)/i,/\btvos ?([\w\.]+)/i,/cfnetwork\/.+darwin/i],[[Y,/_/g,`.`],[K,`iOS`]],[/(mac os x) ?([\w\. ]*)/i,/(macintosh|mac_powerpc\b)(?!.+(haiku|morphos))/i],[[K,`macOS`],[Y,/_/g,`.`]],[/android ([\d\.]+).*crkey/i],[Y,[K,Ep+` Android`]],[/fuchsia.*crkey\/([\d\.]+)/i],[Y,[K,Ep+` Fuchsia`]],[/crkey\/([\d\.]+).*devicetype\/smartspeaker/i],[Y,[K,Ep+` SmartSpeaker`]],[/linux.*crkey\/([\d\.]+)/i],[Y,[K,Ep+` Linux`]],[/crkey\/([\d\.]+)/i],[Y,[K,Ep]],[/droid ([\w\.]+)\b.+(android[- ]x86)/i],[Y,K],[/(ubuntu) ([\w\.]+) like android/i],[[K,/(.+)/,`$1 Touch`],Y],[/(harmonyos)[\/ ]?([\d\.]*)/i,/(android|bada|blackberry|kaios|maemo|meego|openharmony|qnx|rim tablet os|sailfish|series40|symbian|tizen)\w*[-\/\.; ]?([\d\.]*)/i],[K,Y],[/\(bb(10);/i],[Y,[K,cp]],[/(?:symbian ?os|symbos|s60(?=;)|series ?60)[-\/ ]?([\w\.]*)/i],[Y,[K,`Symbian`]],[/mozilla\/[\d\.]+ \((?:mobile|tablet|tv|mobile; [\w ]+); rv:.+ gecko\/([\w\.]+)/i],[Y,[K,Op+` OS`]],[/\b(?:hp)?wos(?:browser)?\/([\w\.]+)/i,/webos(?:[ \/]?|\.tv-20(?=2[2-9]))(\d[\d\.]*)/i],[Y,[K,`webOS`]],[/web0s;.+?(?:chr[o0]me|safari)\/(\d+)/i],[[Y,Xp,{25:`120`,24:`108`,23:`94`,22:`87`,6:`79`,5:`68`,4:`53`,3:`38`,2:`538`,1:`537`,"*":`TV`}],[K,`webOS`]],[/watch(?: ?os[,\/]|\d,\d\/)([\d\.]+)/i],[Y,[K,`watchOS`]],[/(cros) [\w]+(?:\)| ([\w\.]+)\b)/i],[[K,`Chrome OS`],Y],[/panasonic;(viera)/i,/(netrange)mmh/i,/(nettv)\/(\d+\.[\w\.]+)/i,/(nintendo|playstation) (\w+)/i,/(xbox); +xbox ([^\);]+)/i,/(pico) .+os([\w\.]+)/i,/\b(joli|palm)\b ?(?:os)?\/?([\w\.]*)/i,/linux.+(mint)[\/\(\) ]?([\w\.]*)/i,/(mageia|vectorlinux|fuchsia|arcaos|arch(?= ?linux))[;l ]([\d\.]*)/i,/([kxln]?ubuntu|debian|suse|opensuse|gentoo|slackware|fedora|mandriva|centos|pclinuxos|red ?hat|zenwalk|linpus|raspbian|plan 9|minix|risc os|contiki|deepin|manjaro|elementary os|sabayon|linspire|knoppix)(?: gnu[\/ ]linux)?(?: enterprise)?(?:[- ]linux)?(?:-gnu)?[-\/ ]?(?!chrom|package)([-\w\.]*)/i,/((?:open)?solaris)[-\/ ]?([\w\.]*)/i,/\b(aix)[; ]([1-9\.]{0,4})/i,/(hurd|linux|morphos)(?: (?:arm|x86|ppc)\w*| ?)([\w\.]*)/i,/(gnu) ?([\w\.]*)/i,/\b([-frentopcghs]{0,5}bsd|dragonfly)[\/ ]?(?!amd|[ix346]{1,2}86)([\w\.]*)/i,/(haiku) ?(r\d)?/i],[K,Y],[/(sunos) ?([\d\.]*)/i],[[K,`Solaris`],Y],[/\b(beos|os\/2|amigaos|openvms|hp-ux|serenityos)/i,/(unix) ?([\w\.]*)/i],[K,Y]]},tm=(function(){var e={init:{},isIgnore:{},isIgnoreRgx:{},toString:{}};return Gp.call(e.init,[[Af,[K,Y,Lf,q]],[jf,[If]],[Mf,[q,X,J]],[Nf,[K,Y]],[Pf,[K,Y]]]),Gp.call(e.isIgnore,[[Af,[Y,Lf]],[Nf,[Y]],[Pf,[Y]]]),Gp.call(e.isIgnoreRgx,[[Af,/ ?browser$/i],[Pf,/ ?os$/i]]),Gp.call(e.toString,[[Af,[K,Y]],[jf,[If]],[Mf,[J,X]],[Nf,[K,Y]],[Pf,[K,Y]]]),e})(),nm=function(e,t){var n=tm.init[t],r=tm.isIgnore[t]||0,i=tm.isIgnoreRgx[t]||0,a=tm.toString[t]||0;function o(){Gp.call(this,n)}return o.prototype.getItem=function(){return e},o.prototype.withClientHints=function(){return Ip?Ip.getHighEntropyValues(ip).then(function(t){return e.setCH(new rm(t,!1)).parseCH().get()}):e.parseCH().get()},o.prototype.withFeatureCheck=function(){return e.detectFeature().get()},t!=Ff&&(o.prototype.is=function(e){var t=!1;for(var n in this)if(this.hasOwnProperty(n)&&!zp(r,n)&&Up(i?Kp(i,this[n]):this[n])==Up(i?Kp(i,e):e)){if(t=!0,e!=G.UNDEFINED)break}else if(e==G.UNDEFINED&&t){t=!t;break}return t},o.prototype.toString=function(){var e=Of;for(var t in a)typeof this[a[t]]!==G.UNDEFINED&&(e+=(e?` `:Of)+this[a[t]]);return e||G.UNDEFINED}),o.prototype.then=function(e){var t=this,n=function(){for(var e in t)t.hasOwnProperty(e)&&(this[e]=t[e])};n.prototype={is:o.prototype.is,toString:o.prototype.toString,withClientHints:o.prototype.withClientHints,withFeatureCheck:o.prototype.withFeatureCheck};var r=new n;return e(r),r},new o};function rm(e,t){if(e||={},Gp.call(this,ip),t)Gp.call(this,[[Uf,Hp(e[Yf])],[Gf,Hp(e[Xf])],[Z,/\?1/.test(e[ep])],[X,qp(e[tp])],[Kf,qp(e[np])],[qf,qp(e[rp])],[If,qp(e[Zf])],[Wf,Hp(e[$f])],[Jf,qp(e[Qf])]]);else for(var n in e)this.hasOwnProperty(n)&&typeof e[n]!==G.UNDEFINED&&(this[n]=e[n])}function im(e,t,n,r){return Gp.call(this,[[`itemType`,e],[`ua`,t],[`uaCH`,r],[`rgxMap`,n],[`data`,nm(this,e)]]),this}im.prototype.get=function(e){return e?this.data.hasOwnProperty(e)?this.data[e]:void 0:this.data},im.prototype.set=function(e,t){return this.data[e]=t,this},im.prototype.setCH=function(e){return this.uaCH=e,this},im.prototype.detectFeature=function(){if(Fp&&Fp.userAgent==this.ua)switch(this.itemType){case Af:Fp.brave&&typeof Fp.brave.isBrave==G.FUNCTION&&this.set(K,`Brave`);break;case Mf:!this.get(q)&&Ip&&Ip[Z]&&this.set(q,Z),this.get(X)==`Macintosh`&&Fp&&typeof Fp.standalone!==G.UNDEFINED&&Fp.maxTouchPoints&&Fp.maxTouchPoints>2&&this.set(X,`iPad`).set(q,Q);break;case Pf:!this.get(K)&&Ip&&Ip[Kf]&&this.set(K,Ip[Kf]);break;case Ff:var e=this.data,t=function(t){return e[t].getItem().detectFeature().get()};this.set(Af,t(Af)).set(jf,t(jf)).set(Mf,t(Mf)).set(Nf,t(Nf)).set(Pf,t(Pf))}return this},im.prototype.parseUA=function(){switch(this.itemType!=Ff&&Yp.call(this.data,this.ua,this.rgxMap),this.itemType){case Af:this.set(Lf,Wp(this.get(Y)));break;case Pf:if(this.get(K)==`iOS`&&this.get(Y)==`18.6`){var e=/\) Version\/([\d\.]+)/.exec(this.ua);e&&parseInt(e[1].substring(0,2),10)>=26&&this.set(Y,e[1])}break}return this},im.prototype.parseCH=function(){var e=this.uaCH,t=this.rgxMap;switch(this.itemType){case Af:case Nf:var n=e[Gf]||e[Uf],r;if(n)for(var i=0;i<n.length;i++){var a=n[i].brand||n[i],o=n[i].version;this.itemType==Af&&!/not.a.brand/i.test(a)&&(!r||/Chrom/.test(r)&&a!=Tp||r==Dp&&/WebView2/.test(a))&&(a=Xp(a,$p),r=this.get(K),r&&!/Chrom/.test(r)&&/Chrom/.test(a)||this.set(K,a).set(Y,o).set(Lf,Wp(o)),r=a),this.itemType==Nf&&a==Tp&&this.set(Y,o)}break;case jf:var s=e[If];s&&(s&&e[Jf]==`64`&&(s+=`64`),Yp.call(this.data,s+`;`,t));break;case Mf:if(e[Z]&&this.set(q,Z),e[X]&&(this.set(X,e[X]),!this.get(q)||!this.get(J))){var c={};Yp.call(c,`droid 9; `+e[X]+`)`,t),!this.get(q)&&c.type&&this.set(q,c.type),!this.get(J)&&c.vendor&&this.set(J,c.vendor)}if(e[Wf]){var l;if(typeof e[Wf]!=`string`)for(var u=0;!l&&u<e[Wf].length;)l=Xp(e[Wf][u++],Qp);else l=Xp(e[Wf],Qp);this.set(q,l)}break;case Pf:var d=e[Kf];if(d){var f=e[qf];d==Pp&&(f=parseInt(Wp(f),10)>=13?`11`:`10`),this.set(K,d).set(Y,f)}this.get(K)==Pp&&e[X]==`Xbox`&&this.set(K,`Xbox`).set(Y,void 0);break;case Ff:var p=this.data,m=function(t){return p[t].getItem().setCH(e).parseCH().get()};this.set(Af,m(Af)).set(jf,m(jf)).set(Mf,m(Mf)).set(Nf,m(Nf)).set(Pf,m(Pf))}return this};function am(e,t,n){if(typeof e===G.OBJECT?(Bp(e,!0)?(typeof t===G.OBJECT&&(n=t),t=e):(n=e,t=void 0),e=void 0):typeof e===G.STRING&&!Bp(t,!0)&&(n=t,t=void 0),n)if(typeof n.append===G.FUNCTION){var r={};n.forEach(function(e,t){r[String(t).toLowerCase()]=e}),n=r}else{var i={};for(var a in n)n.hasOwnProperty(a)&&(i[String(a).toLowerCase()]=n[a]);n=i}if(!(this instanceof am))return new am(e,t,n).getResult();var o=typeof e===G.STRING?e:n&&n[Df]?n[Df]:Fp&&Fp.userAgent?Fp.userAgent:Of,s=new rm(n,!0),c=t?Lp(em,t):em,l=function(e){return e==Ff?function(){return new im(e,o,c,s).set(`ua`,o).set(Af,this.getBrowser()).set(jf,this.getCPU()).set(Mf,this.getDevice()).set(Nf,this.getEngine()).set(Pf,this.getOS()).get()}:function(){return new im(e,o,c[e],s).parseUA().get()}};return Gp.call(this,[[`getBrowser`,l(Af)],[`getCPU`,l(jf)],[`getDevice`,l(Mf)],[`getEngine`,l(Nf)],[`getOS`,l(Pf)],[`getResult`,l(Ff)],[`getUA`,function(){return o}],[`setUA`,function(e){return Vp(e)&&(o=Jp(e,Ef)),this}]]).setUA(o),this}am.VERSION=Tf,am.BROWSER=Rp([K,Y,Lf,q]),am.CPU=Rp([If]),am.DEVICE=Rp([X,J,q,Rf,Z,$,Q,zf,Vf]),am.ENGINE=am.OS=Rp([K,Y]);function om(e){return{recording:{onStateChange:t=>{e.updateState({recordingState:t})},onCountdownUpdate:(t,n)=>{e.updateState({recordingState:t,countdown:n})},onTimerUpdate:t=>{e.updateState({timer:t})},onError:t=>{e.updateState({error:i(t)})},onRecordingComplete:t=>{e.updateState({countdown:null})},onClearUploadStatus:()=>{e.updateState({uploadProgress:null})},onStopAudioTracking:()=>{},onGetConfig:()=>{if(!e.controller)throw Error(`Controller not initialized`);return e.isDemo?Promise.resolve(_d(`mp4`)):e.controller.getConfig()}},sourceSwitch:{onSourceChange:e=>Promise.resolve(),onPreviewUpdate:t=>(e.updateState({stream:t}),Promise.resolve()),onError:t=>{e.updateState({error:i(t)})},onTransitionStart:t=>{e.updateState({transitionMessage:t})},onTransitionEnd:()=>{e.updateState({transitionMessage:null})}},storage:{onUploadProgress:()=>{},onUploadComplete:()=>{},onUploadError:()=>{}},onStorageCleanupError:e=>{console.error(e)}}}function sm(e,t){let n=(e=>e===``||e===`default`?null:e)(t);return e.setCameraDevice(n),e.switchVideoDevice(n)}function cm(e,t){let n=(e=>e===``||e===`default`?null:e)(t);return e.setMicDevice(n),e.switchAudioDevice(n)}async function lm(e,t=`camera`){e.isActive()||await e.startStream(),t!==e.getCurrentSourceType()&&await e.switchSource(t),await e.startRecording()}async function um(e,t,n,r){return await e.stopRecording()}function dm(e){e.pauseRecording()}function fm(e){e.resumeRecording()}async function pm(e,t){await e.switchSource(t)}function mm(e){return e.toggleMute(),e.getIsMuted()}function hm(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)}var gm=class{constructor(e){if(this.proxyEndpoint=e.proxyEndpoint,this.proxyEndpoint)throw Error(`Proxy mode not yet implemented`);this.service=new $d}uploadVideo(e,t){if(this.proxyEndpoint)throw Error(`Proxy mode not yet implemented`);return this.service.uploadVideo(e,t)}};let _m=()=>`
8426
+ `],{type:`application/javascript`});return rf=URL.createObjectURL(e),rf}var of=class{constructor(){this.worker=null,this.chunks=[],this.totalSize=0,this.isActive=!1,this.videoTrackClone=null,this.audioTrackClone=null,this.isMuted=!1,this.currentVideoTrack=null,this.isPaused=!1,this.overlayConfig=null,this.readyPromiseResolve=null,this.setupWorker()}setupWorker(){if(typeof Worker>`u`)throw W.error(`[WorkerProcessor] Web Workers are not supported`),Error(`Web Workers are not supported`);try{W.debug(`[WorkerProcessor] Setting up worker`);let e=af();W.debug(`[WorkerProcessor] Worker URL created`,{urlType:typeof e,isBlobUrl:e.startsWith(`blob:`)}),this.worker=new Worker(e,{type:`classic`}),W.debug(`[WorkerProcessor] Worker created successfully`),this.worker.onmessage=this.handleWorkerMessage.bind(this),this.worker.onerror=this.handleWorkerError.bind(this),W.debug(`[WorkerProcessor] Worker event handlers attached`)}catch(e){let t=e instanceof Error?e.message:String(e);throw W.error(`[WorkerProcessor] Failed to create worker:`,e),Error(`Failed to create worker: ${t}`)}}handleWorkerMessage(e){let t=e.data;switch(t.type){case`ready`:W.debug(`[WorkerProcessor] Worker ready`),this.readyPromiseResolve&&=(this.readyPromiseResolve(),null);break;case`error`:W.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`:W.debug(`[WorkerProcessor] State changed:`,t.state),this.isPaused=t.state===`paused`;break;default:W.warn(`[WorkerProcessor] Unknown response type:`,t)}}handleWorkerError(e){W.error(`[WorkerProcessor] Worker error event:`,{message:e.message,filename:e.filename,lineno:e.lineno,colno:e.colno,error:e.error}),this.onError&&this.onError(Error(e.message||`Unknown worker error`))}async startProcessing(e,t,n){if(!this.worker)throw Error(`Worker not initialized`);if(this.isActive)throw Error(`Processing already active`);this.isActive=!0,this.isMuted=!1,this.isPaused=!1,this.chunks=[],this.totalSize=0,this.overlayConfig=n||null;let r=t.format||`mp4`,i=t.audioCodec||pd(r),a=ef(e),o=t.codec||await nf(t.width,t.height,t.bitrate);W.debug(`[WorkerProcessor] Starting processing`,{isScreenCapture:a,fps:t.fps,codec:o,bitrate:t.bitrate});let s={width:t.width,height:t.height,fps:t.fps,bitrate:tf(t.bitrate),audioCodec:i,audioBitrate:t.audioBitrate,codec:o,keyFrameInterval:5,format:r,watermark:t.watermark},c=e.getVideoTracks(),l=e.getAudioTracks();W.debug(`[WorkerProcessor] Preparing to start processing`,{videoTracksCount:c.length,audioTracksCount:l.length,hasWorker:!!this.worker});let u=null,d=null;if(c.length>0){this.stopCurrentVideoTrack();let e=c[0];u=this.cloneVideoTrack(e),this.currentVideoTrack=u}if(l.length>0){let e=l[0];d=this.cloneAudioTrack(e)}W.debug(`[WorkerProcessor] Track details`,{hasVideoTrack:!!u,videoTrackId:u?.id,videoTrackKind:u?.kind,videoTrackReadyState:u?.readyState,hasAudioTrack:!!d,audioTrackId:d?.id,audioTrackKind:d?.kind,audioTrackReadyState:d?.readyState});let f=u===null?null:new MediaStreamTrackProcessor({track:u}).readable,p=d===null?null:new MediaStreamTrackProcessor({track:d}).readable,m={type:`start`,videoStream:f,audioStream:p,config:s,overlayConfig:this.overlayConfig||void 0},h=[];f&&h.push(f),p&&h.push(p),W.debug(`[WorkerProcessor] Posting message to worker`,{transferablesCount:h.length,messageType:m.type});let g=new Promise(e=>{this.readyPromiseResolve=e});try{this.worker.postMessage(m,h),W.debug(`[WorkerProcessor] Message posted successfully`),await g,W.debug(`[WorkerProcessor] Worker confirmed ready`)}catch(e){throw W.error(`[WorkerProcessor] Failed to post message:`,e),this.readyPromiseResolve=null,e}}pause(){this.worker&&this.isActive&&this.worker.postMessage({type:`pause`})}resume(){this.isWorkerActive()&&this.worker&&this.worker.postMessage({type:`resume`})}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`})}switchVideoSource(e){if(!(this.isWorkerActive()&&this.worker))return W.debug(`[WorkerProcessor] Cannot switch source - worker not active`,{hasWorker:!!this.worker,isActive:this.isActive}),Promise.resolve();let t=e.getVideoTracks();if(W.debug(`[WorkerProcessor] Switching video source`,{videoTracksCount:t.length}),t.length===0)return W.warn(`[WorkerProcessor] No video tracks in new stream`),Promise.resolve();let n=ef(e);W.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=t[0];this.stopCurrentVideoTrack();let a=this.cloneVideoTrack(i);W.debug(`[WorkerProcessor] New video track details`,{trackId:a.id,trackKind:a.kind,trackReadyState:a.readyState}),this.currentVideoTrack=a;let o={type:`switchSource`,videoStream:new MediaStreamTrackProcessor({track:a}).readable};try{W.debug(`[WorkerProcessor] Posting switch source message`);let e=[];return o.videoStream&&e.push(o.videoStream),this.worker.postMessage(o,e),W.debug(`[WorkerProcessor] Switch source message posted`),new Promise(e=>{setTimeout(()=>{e()},0)})}catch(e){throw W.error(`[WorkerProcessor] Failed to switch source:`,e),e}}finalize(){if(!this.isWorkerActive())throw Error(`Processing not active`);return new Promise((e,t)=>{let n=setTimeout(()=>{t(Error(`Finalize timeout`))},3e4),r=i=>{let a=i.data;a.type===`stateChange`&&a.state===`stopped`?(this.worker&&this.worker.removeEventListener(`message`,r),clearTimeout(n),this.isActive=!1,e(this.createBlobFromChunks())):a.type===`error`&&(this.worker&&this.worker.removeEventListener(`message`,r),clearTimeout(n),t(Error(a.error)))};this.worker&&(this.worker.addEventListener(`message`,r),this.worker.postMessage({type:`stop`}))})}createBlobFromChunks(){let e=[...this.chunks].sort((e,t)=>e.position-t.position),t=new ArrayBuffer(this.totalSize),n=new Uint8Array(t);for(let t of e)n.set(t.data,t.position);return{blob:new Blob([t],{type:`video/mp4`}),totalSize:this.totalSize}}cancel(){return this.worker&&this.isActive&&this.worker.postMessage({type:`stop`}),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)){W.warn(`[WorkerProcessor] Cannot update visibility - worker not active`,{isActive:this.isActive,hasWorker:!!this.worker});return}W.debug(`[WorkerProcessor] Sending visibility update to worker`,{isHidden:e,timestamp:t,timestampSeconds:t/1e3});let n={type:`updateVisibility`,isHidden:e,timestamp:t};this.worker.postMessage(n)}updateSourceType(e){if(!(this.isWorkerActive()&&this.worker)){W.warn(`[WorkerProcessor] Cannot update source type - worker not active`,{isActive:this.isActive,hasWorker:!!this.worker});return}W.debug(`[WorkerProcessor] Sending source type update to worker`,{isScreenCapture:e});let t={type:`updateSourceType`,isScreenCapture:e};this.worker.postMessage(t)}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(W.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 this.videoTrackClone=t,W.debug(`[WorkerProcessor] Video track cloned successfully:`,{id:t.id,kind:t.kind,readyState:t.readyState}),t}catch(e){throw W.error(`[WorkerProcessor] Failed to clone video track:`,e),Error(`Failed to clone video track: ${e instanceof Error?e.message:String(e)}`)}return W.warn(`[WorkerProcessor] Video track clone() not available, using original`),this.videoTrackClone=e,e}cloneAudioTrack(e){if(W.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,W.debug(`[WorkerProcessor] Audio track cloned successfully:`,{id:t.id,kind:t.kind,readyState:t.readyState}),t}catch(e){throw W.error(`[WorkerProcessor] Failed to clone audio track:`,e),Error(`Failed to clone audio track: ${e instanceof Error?e.message:String(e)}`)}return W.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),rf&&=(URL.revokeObjectURL(rf),null),this.isActive=!1,this.isPaused=!1,this.chunks=[],this.totalSize=0}static isSupported(){return typeof Worker<`u`&&typeof MediaStreamTrackProcessor<`u`&&typeof VideoFrame<`u`&&typeof AudioData<`u`&&typeof OffscreenCanvas<`u`}},sf=class{constructor(){if(this.currentVideoStream=null,!of.isSupported())throw Error(`Web Workers are required for video processing. Please use a modern browser that supports Web Workers, MediaStreamTrackProcessor, VideoFrame, and AudioData APIs.`);try{this.workerProcessor=new of,W.debug(`[StreamProcessor] Using worker-based processing`)}catch(e){let t=e instanceof Error?e.message:String(e);throw Error(`Failed to initialize worker: ${t}. Web Workers are required for video processing.`)}}async startProcessing(e,t,n){this.workerProcessor.setOnBufferUpdate((e,t)=>{W.debug(`[StreamProcessor] Buffer update:`,{size:e,formatted:t})}),this.workerProcessor.setOnError(e=>{W.error(`[StreamProcessor] Worker error:`,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 W.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}async cancel(){await this.workerProcessor.cancel(),this.workerProcessor.cleanup(),this.currentVideoStream=null}};let cf=1e3,lf=`recording`,uf=`idle`;var df=class{constructor(e,t){this.recordingState=uf,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!==lf||!this.streamProcessor||this.streamProcessor.updateSourceType(e)}setOriginalCameraStream(e){this.originalCameraStream=e}getOriginalCameraStream(){return this.originalCameraStream}async startRecording(){try{this.callbacks.onClearUploadStatus(),this.countdownDuration>0?this.startCountdown():await this.doStartRecording()}catch(e){this.handleError(e),this.recordingState=uf,this.cancelCountdown()}}startCountdown(){this.recordingState=`countdown`,this.countdownRemaining=Math.ceil(this.countdownDuration/cf),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)/cf)),this.callbacks.onCountdownUpdate(this.recordingState,this.countdownRemaining)},100),this.countdownTimeoutId=window.setTimeout(async()=>{await this.doStartRecording().catch(()=>{})},this.countdownDuration)}async doStartRecording(){W.debug(`[RecordingManager] doStartRecording called`),this.cancelCountdown(),this.recordingState=lf,this.callbacks.onStateChange(this.recordingState),this.resetRecordingState();let e=this.streamManager.getStream();if(W.debug(`[RecordingManager] Current stream:`,{hasStream:!!e,audioTracks:e?.getAudioTracks().length||0,videoTracks:e?.getVideoTracks().length||0}),!e){W.warn(`[RecordingManager] No stream available`),this.handleError(Error(`No stream available for recording`)),this.recordingState=uf,this.callbacks.onStateChange(this.recordingState);return}this.originalCameraStream=e,W.debug(`[RecordingManager] Creating new StreamProcessor`),this.streamProcessor=new sf,W.debug(`[RecordingManager] StreamProcessor created:`,!!this.streamProcessor);let t=await this.callbacks.onGetConfig().then(e=>({config:e,error:null})).catch(e=>({config:null,error:e}));if(t.error){this.handleError(t.error),this.recordingState=uf,this.callbacks.onStateChange(this.recordingState);return}if(!t.config){this.handleError(Error(`Failed to get recording config`)),this.recordingState=uf,this.callbacks.onStateChange(this.recordingState);return}W.debug(`[RecordingManager] Starting recording with stream manager`);let n=await this.streamManager.startRecording(this.streamProcessor,t.config,this.enableTabVisibilityOverlay,this.tabVisibilityOverlayText).then(()=>(W.info(`[RecordingManager] Recording started successfully`),null)).catch(e=>(W.error(`[RecordingManager] Error starting recording:`,e),e));if(n){this.handleError(n),this.recordingState=uf,this.callbacks.onStateChange(this.recordingState);return}this.startRecordingTimer(),this.recordingStartTime=Date.now(),this.maxRecordingTime&&this.maxRecordingTime>0&&(this.maxTimeRemaining=this.maxRecordingTime,this.startMaxTimeTimer())}async stopRecording(){W.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(),W.debug(`[RecordingManager] Stopping recording in stream manager`);let e=(await this.streamManager.stopRecording()).blob;return W.info(`[RecordingManager] Recording stopped, blob size:`,e.size),this.recordingState=uf,this.callbacks.onStateChange(this.recordingState),this.recordingSeconds=0,this.streamProcessor=null,this.callbacks.onRecordingComplete(e),e}catch(e){throw this.handleError(e),this.recordingState=uf,this.callbacks.onStateChange(this.recordingState),e}}pauseRecording(){if(!(this.recordingState!==lf||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!==lf||!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=uf,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}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}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(){this.recordingIntervalId===null&&(this.recordingIntervalId=window.setInterval(()=>{this.recordingSeconds+=1,this.callbacks.onTimerUpdate(Gd(this.recordingSeconds))},1e3))}startMaxTimeTimer(){this.maxTimeRemaining===null||this.maxTimeRemaining<=0||(this.clearTimer(this.maxTimeTimer,clearTimeout),this.maxTimeTimer=window.setTimeout(async()=>{this.recordingState===lf&&!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)}};let ff=()=>{},pf=()=>{},mf=()=>{},hf=()=>{},gf=e=>{},_f=(e,t)=>{},vf=e=>{},yf=e=>{},bf=e=>{},xf=()=>{},Sf=e=>{};function Cf(){return{onProgress:ff,onSuccess:pf,onError:mf,onClearStatus:hf}}var wf=class{constructor(e={}){this.uploadService=null,this.uploadQueueManager=null,this.isInitialized=!1,this.enableTabVisibilityOverlay=!1,this.callbacks=e,this.streamManager=new Zd,this.configManager=new Sd,this.storageManager=new Ad,this.deviceManager=new Cd(this.streamManager,e.device),this.audioLevelAnalyzer=new a,this.uploadService=new $d,this.uploadCallbacks=e.upload?e.upload:Cf();let t=this.createRecordingCallbacks(e);this.recordingManager=new df(this.streamManager,t);let n=this.createSourceSwitchCallbacks(e);this.sourceSwitchManager=new Rd(this.streamManager,n),e.stream&&(this.streamManager.on(`streamstart`,({stream:t})=>{W.debug(`[RecorderController] streamstart event received, calling callback`),e.stream?.onStreamStart&&e.stream.onStreamStart(t)}),this.streamManager.on(`streamstop`,()=>{W.debug(`[RecorderController] streamstop event received, calling callback`),e.stream?.onStreamStop&&e.stream.onStreamStop()}),this.streamManager.on(`error`,({error:t})=>{W.error(`[RecorderController] stream error event received, calling callback`,t),e.stream?.onError&&e.stream.onError(t)}))}async initialize(e){if(this.isInitialized)return;e.apiKey&&e.backendUrl&&await this.configManager.initialize(e.apiKey,e.backendUrl),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);let t=this.callbacks.onStorageCleanupError??Sf;await this.storageManager.initialize(t);let n=this.storageManager.getStorageService();n&&this.uploadService&&(this.uploadQueueManager=new Qd(n,this.uploadService),this.uploadQueueManager.setCallbacks({onUploadProgress:(e,t)=>{this.uploadCallbacks.onProgress(t)},onUploadComplete:(e,t)=>{this.uploadCallbacks.onSuccess(t)},onUploadError:(e,t)=>{this.uploadCallbacks.onError(t)}})),this.isInitialized=!0}async startStream(){W.debug(`[RecorderController] startStream called`),await this.streamManager.startStream(),W.debug(`[RecorderController] startStream completed`)}async stopStream(){await this.streamManager.stopStream()}switchVideoDevice(e){return this.streamManager.switchVideoDevice(e)}switchAudioDevice(e){return this.streamManager.switchAudioDevice(e)}async startRecording(){await this.recordingManager.startRecording()}async stopRecording(){let e=await this.recordingManager.stopRecording();return await this.sourceSwitchManager.handleRecordingStop().catch(()=>{throw Error(`Source switch cleanup failed`)}),e}getTabVisibilityOverlayConfig(){return{enabled:this.enableTabVisibilityOverlay,text:this.tabVisibilityOverlayText}}pauseRecording(){this.recordingManager.pauseRecording()}resumeRecording(){this.recordingManager.resumeRecording()}async switchSource(e){await this.sourceSwitchManager.toggleSource()}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 wd(e),a=Object.keys(r).length>0?r:void 0;await this.uploadQueueManager.queueUpload({blob:e,apiKey:t,backendUrl:n,filename:`recording-${Date.now()}.mp4`,duration:i,metadata:void 0,userMetadata:a})}getStream(){return this.streamManager.getStream()}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()}cleanup(){this.storageManager.destroy(),this.recordingManager.cleanup(),this.audioLevelAnalyzer.stopTracking(),this.sourceSwitchManager.cleanup()}createRecordingCallbacks(e){let t=e.recording;return{onStateChange:t?.onStateChange??gf,onCountdownUpdate:t?.onCountdownUpdate??_f,onTimerUpdate:t?.onTimerUpdate??vf,onError:t?.onError??yf,onRecordingComplete:t?.onRecordingComplete??bf,onClearUploadStatus:t?.onClearUploadStatus??xf,onStopAudioTracking:()=>{this.audioLevelAnalyzer.stopTracking()},onGetConfig:()=>this.configManager.getConfig()}}createSourceSwitchCallbacks(e){let t=e.sourceSwitch;return{onSourceChange:t?.onSourceChange,onPreviewUpdate:t?.onPreviewUpdate,onError:t?.onError,onTransitionStart:t?.onTransitionStart,onTransitionEnd:t?.onTransitionEnd,onScreenSelectionStart:()=>{this.isRecording()&&this.recordingManager.updateSourceType(!0)},onScreenSelectionEnd:()=>{this.isRecording()&&this.recordingManager.updateSourceType(!1)},getSelectedCameraDeviceId:()=>this.deviceManager.getSelectedCameraDeviceId(),getSelectedMicDeviceId:()=>this.deviceManager.getSelectedMicDeviceId()}}},Tf=`2.0.7`,Ef=500,Df=`user-agent`,Of=``,kf=`?`,G={FUNCTION:`function`,OBJECT:`object`,STRING:`string`,UNDEFINED:`undefined`},Af=`browser`,jf=`cpu`,Mf=`device`,Nf=`engine`,Pf=`os`,Ff=`result`,K=`name`,q=`type`,J=`vendor`,Y=`version`,If=`architecture`,Lf=`major`,X=`model`,Rf=`console`,Z=`mobile`,Q=`tablet`,$=`smarttv`,zf=`wearable`,Bf=`xr`,Vf=`embedded`,Hf=`inapp`,Uf=`brands`,Wf=`formFactors`,Gf=`fullVersionList`,Kf=`platform`,qf=`platformVersion`,Jf=`bitness`,Yf=`sec-ch-ua`,Xf=Yf+`-full-version-list`,Zf=Yf+`-arch`,Qf=Yf+`-`+Jf,$f=Yf+`-form-factors`,ep=Yf+`-`+Z,tp=Yf+`-`+X,np=Yf+`-`+Kf,rp=np+`-version`,ip=[Uf,Gf,Z,X,Kf,qf,If,Wf,Jf],ap=`Amazon`,op=`Apple`,sp=`ASUS`,cp=`BlackBerry`,lp=`Google`,up=`Huawei`,dp=`Lenovo`,fp=`Honor`,pp=`LG`,mp=`Microsoft`,hp=`Motorola`,gp=`Nvidia`,_p=`OnePlus`,vp=`OPPO`,yp=`Samsung`,bp=`Sharp`,xp=`Sony`,Sp=`Xiaomi`,Cp=`Zebra`,wp=`Chrome`,Tp=`Chromium`,Ep=`Chromecast`,Dp=`Edge`,Op=`Firefox`,kp=`Opera`,Ap=`Facebook`,jp=`Sogou`,Mp=`Mobile `,Np=` Browser`,Pp=`Windows`,Fp=typeof window!==G.UNDEFINED&&window.navigator?window.navigator:void 0,Ip=Fp&&Fp.userAgentData?Fp.userAgentData:void 0,Lp=function(e,t){var n={},r=t;if(!Bp(t))for(var i in r={},t)for(var a in t[i])r[a]=t[i][a].concat(r[a]?r[a]:[]);for(var o in e)n[o]=r[o]&&r[o].length%2==0?r[o].concat(e[o]):e[o];return n},Rp=function(e){for(var t={},n=0;n<e.length;n++)t[e[n].toUpperCase()]=e[n];return t},zp=function(e,t){if(typeof e===G.OBJECT&&e.length>0){for(var n in e)if(Up(t)==Up(e[n]))return!0;return!1}return Vp(e)?Up(t)==Up(e):!1},Bp=function(e,t){for(var n in e)return/^(browser|cpu|device|engine|os)$/.test(n)||(t?Bp(e[n]):!1)},Vp=function(e){return typeof e===G.STRING},Hp=function(e){if(e){for(var t=[],n=Kp(/\\?\"/g,e).split(`,`),r=0;r<n.length;r++)if(n[r].indexOf(`;`)>-1){var i=Jp(n[r]).split(`;v=`);t[r]={brand:i[0],version:i[1]}}else t[r]=Jp(n[r]);return t}},Up=function(e){return Vp(e)?e.toLowerCase():e},Wp=function(e){return Vp(e)?Kp(/[^\d\.]/g,e).split(`.`)[0]:void 0},Gp=function(e){for(var t in e)if(e.hasOwnProperty(t)){var n=e[t];typeof n==G.OBJECT&&n.length==2?this[n[0]]=n[1]:this[n]=void 0}return this},Kp=function(e,t){return Vp(t)?t.replace(e,Of):t},qp=function(e){return Kp(/\\?\"/g,e)},Jp=function(e,t){return e=Kp(/^\s\s*/,String(e)),typeof t===G.UNDEFINED?e:e.substring(0,t)},Yp=function(e,t){if(!(!e||!t))for(var n=0,r,i,a,o,s,c;n<t.length&&!s;){var l=t[n],u=t[n+1];for(r=i=0;r<l.length&&!s&&l[r];)if(s=l[r++].exec(e),s)for(a=0;a<u.length;a++)c=s[++i],o=u[a],typeof o===G.OBJECT&&o.length>0?o.length===2?typeof o[1]==G.FUNCTION?this[o[0]]=o[1].call(this,c):this[o[0]]=o[1]:o.length>=3&&(typeof o[1]===G.FUNCTION&&!(o[1].exec&&o[1].test)?o.length>3?this[o[0]]=c?o[1].apply(this,o.slice(2)):void 0:this[o[0]]=c?o[1].call(this,c,o[2]):void 0:o.length==3?this[o[0]]=c?c.replace(o[1],o[2]):void 0:o.length==4?this[o[0]]=c?o[3].call(this,c.replace(o[1],o[2])):void 0:o.length>4&&(this[o[0]]=c?o[3].apply(this,[c.replace(o[1],o[2])].concat(o.slice(4))):void 0)):this[o]=c||void 0;n+=2}},Xp=function(e,t){for(var n in t)if(typeof t[n]===G.OBJECT&&t[n].length>0){for(var r=0;r<t[n].length;r++)if(zp(t[n][r],e))return n===kf?void 0:n}else if(zp(t[n],e))return n===kf?void 0:n;return t.hasOwnProperty(`*`)?t[`*`]:e},Zp={ME:`4.90`,"NT 3.51":`3.51`,"NT 4.0":`4.0`,2e3:[`5.0`,`5.01`],XP:[`5.1`,`5.2`],Vista:`6.0`,7:`6.1`,8:`6.2`,"8.1":`6.3`,10:[`6.4`,`10.0`],NT:``},Qp={embedded:`Automotive`,mobile:`Mobile`,tablet:[`Tablet`,`EInk`],smarttv:`TV`,wearable:`Watch`,xr:[`VR`,`XR`],"?":[`Desktop`,`Unknown`],"*":void 0},$p={Chrome:`Google Chrome`,Edge:`Microsoft Edge`,"Edge WebView2":`Microsoft Edge WebView2`,"Chrome WebView":`Android WebView`,"Chrome Headless":`HeadlessChrome`,"Huawei Browser":`HuaweiBrowser`,"MIUI Browser":`Miui Browser`,"Opera Mobi":`OperaMobile`,Yandex:`YaBrowser`},em={browser:[[/\b(?:crmo|crios)\/([\w\.]+)/i],[Y,[K,Mp+`Chrome`]],[/webview.+edge\/([\w\.]+)/i],[Y,[K,Dp+` WebView`]],[/edg(?:e|ios|a)?\/([\w\.]+)/i],[Y,[K,`Edge`]],[/(opera mini)\/([-\w\.]+)/i,/(opera [mobiletab]{3,6})\b.+version\/([-\w\.]+)/i,/(opera)(?:.+version\/|[\/ ]+)([\w\.]+)/i],[K,Y],[/opios[\/ ]+([\w\.]+)/i],[Y,[K,kp+` Mini`]],[/\bop(?:rg)?x\/([\w\.]+)/i],[Y,[K,kp+` GX`]],[/\bopr\/([\w\.]+)/i],[Y,[K,kp]],[/\bb[ai]*d(?:uhd|[ub]*[aekoprswx]{5,6})[\/ ]?([\w\.]+)/i],[Y,[K,`Baidu`]],[/\b(?:mxbrowser|mxios|myie2)\/?([-\w\.]*)\b/i],[Y,[K,`Maxthon`]],[/(kindle)\/([\w\.]+)/i,/(lunascape|maxthon|netfront|jasmine|blazer|sleipnir)[\/ ]?([\w\.]*)/i,/(avant|iemobile|slim(?:browser|boat|jet))[\/ ]?([\d\.]*)/i,/(?:ms|\()(ie) ([\w\.]+)/i,/(atlas|flock|rockmelt|midori|epiphany|silk|skyfire|ovibrowser|bolt|iron|vivaldi|iridium|phantomjs|bowser|qupzilla|falkon|rekonq|puffin|brave|whale(?!.+naver)|qqbrowserlite|duckduckgo|klar|helio|(?=comodo_)?dragon|otter|dooble|(?:lg |qute)browser|palemoon)\/([-\w\.]+)/i,/(heytap|ovi|115|surf|qwant)browser\/([\d\.]+)/i,/(qwant)(?:ios|mobile)\/([\d\.]+)/i,/(ecosia|weibo)(?:__| \w+@)([\d\.]+)/i],[K,Y],[/quark(?:pc)?\/([-\w\.]+)/i],[Y,[K,`Quark`]],[/\bddg\/([\w\.]+)/i],[Y,[K,`DuckDuckGo`]],[/(?:\buc? ?browser|(?:juc.+)ucweb)[\/ ]?([\w\.]+)/i],[Y,[K,`UCBrowser`]],[/microm.+\bqbcore\/([\w\.]+)/i,/\bqbcore\/([\w\.]+).+microm/i,/micromessenger\/([\w\.]+)/i],[Y,[K,`WeChat`]],[/konqueror\/([\w\.]+)/i],[Y,[K,`Konqueror`]],[/trident.+rv[: ]([\w\.]{1,9})\b.+like gecko/i],[Y,[K,`IE`]],[/ya(?:search)?browser\/([\w\.]+)/i],[Y,[K,`Yandex`]],[/slbrowser\/([\w\.]+)/i],[Y,[K,`Smart `+dp+Np]],[/(avast|avg)\/([\w\.]+)/i],[[K,/(.+)/,`$1 Secure`+Np],Y],[/\bfocus\/([\w\.]+)/i],[Y,[K,Op+` Focus`]],[/\bopt\/([\w\.]+)/i],[Y,[K,kp+` Touch`]],[/coc_coc\w+\/([\w\.]+)/i],[Y,[K,`Coc Coc`]],[/dolfin\/([\w\.]+)/i],[Y,[K,`Dolphin`]],[/coast\/([\w\.]+)/i],[Y,[K,kp+` Coast`]],[/miuibrowser\/([\w\.]+)/i],[Y,[K,`MIUI`+Np]],[/fxios\/([\w\.-]+)/i],[Y,[K,Mp+Op]],[/\bqihoobrowser\/?([\w\.]*)/i],[Y,[K,`360`]],[/\b(qq)\/([\w\.]+)/i],[[K,/(.+)/,`$1Browser`],Y],[/(oculus|sailfish|huawei|vivo|pico)browser\/([\w\.]+)/i],[[K,/(.+)/,`$1`+Np],Y],[/samsungbrowser\/([\w\.]+)/i],[Y,[K,yp+` Internet`]],[/metasr[\/ ]?([\d\.]+)/i],[Y,[K,jp+` Explorer`]],[/(sogou)mo\w+\/([\d\.]+)/i],[[K,jp+` Mobile`],Y],[/(electron)\/([\w\.]+) safari/i,/(tesla)(?: qtcarbrowser|\/(20\d\d\.[-\w\.]+))/i,/m?(qqbrowser|2345(?=browser|chrome|explorer))\w*[\/ ]?v?([\w\.]+)/i],[K,Y],[/(lbbrowser|rekonq|steam(?= (clie|tenf|gameo)))/i],[K],[/ome\/([\w\.]+) \w* ?(iron) saf/i,/ome\/([\w\.]+).+qihu (360)[es]e/i],[Y,K],[/((?:fban\/fbios|fb_iab\/fb4a)(?!.+fbav)|;fbav\/([\w\.]+);)/i],[[K,Ap],Y,[q,Hf]],[/(kakao(?:talk|story))[\/ ]([\w\.]+)/i,/(naver)\(.*?(\d+\.[\w\.]+).*\)/i,/(daum)apps[\/ ]([\w\.]+)/i,/safari (line)\/([\w\.]+)/i,/\b(line)\/([\w\.]+)\/iab/i,/(alipay)client\/([\w\.]+)/i,/(twitter)(?:and| f.+e\/([\w\.]+))/i,/(bing)(?:web|sapphire)\/([\w\.]+)/i,/(instagram|snapchat|klarna)[\/ ]([-\w\.]+)/i],[K,Y,[q,Hf]],[/\bgsa\/([\w\.]+) .*safari\//i],[Y,[K,`GSA`],[q,Hf]],[/musical_ly(?:.+app_?version\/|_)([\w\.]+)/i],[Y,[K,`TikTok`],[q,Hf]],[/\[(linkedin)app\]/i],[K,[q,Hf]],[/(zalo(?:app)?)[\/\sa-z]*([\w\.-]+)/i],[[K,/(.+)/,`Zalo`],Y,[q,Hf]],[/(chromium)[\/ ]([-\w\.]+)/i],[K,Y],[/headlesschrome(?:\/([\w\.]+)| )/i],[Y,[K,wp+` Headless`]],[/wv\).+chrome\/([\w\.]+).+edgw\//i],[Y,[K,Dp+` WebView2`]],[/ wv\).+(chrome)\/([\w\.]+)/i],[[K,wp+` WebView`],Y],[/droid.+ version\/([\w\.]+)\b.+(?:mobile safari|safari)/i],[Y,[K,`Android`+Np]],[/chrome\/([\w\.]+) mobile/i],[Y,[K,Mp+`Chrome`]],[/(chrome|omniweb|arora|[tizenoka]{5} ?browser)\/v?([\w\.]+)/i],[K,Y],[/version\/([\w\.\,]+) .*mobile(?:\/\w+ | ?)safari/i],[Y,[K,Mp+`Safari`]],[/iphone .*mobile(?:\/\w+ | ?)safari/i],[[K,Mp+`Safari`]],[/version\/([\w\.\,]+) .*(safari)/i],[Y,K],[/webkit.+?(mobile ?safari|safari)(\/[\w\.]+)/i],[K,[Y,`1`]],[/(webkit|khtml)\/([\w\.]+)/i],[K,Y],[/(?:mobile|tablet);.*(firefox)\/([\w\.-]+)/i],[[K,Mp+Op],Y],[/(navigator|netscape\d?)\/([-\w\.]+)/i],[[K,`Netscape`],Y],[/(wolvic|librewolf)\/([\w\.]+)/i],[K,Y],[/mobile vr; rv:([\w\.]+)\).+firefox/i],[Y,[K,Op+` Reality`]],[/ekiohf.+(flow)\/([\w\.]+)/i,/(swiftfox)/i,/(icedragon|iceweasel|camino|chimera|fennec|maemo browser|minimo|conkeror)[\/ ]?([\w\.\+]+)/i,/(seamonkey|k-meleon|icecat|iceape|firebird|phoenix|basilisk|waterfox)\/([-\w\.]+)$/i,/(firefox)\/([\w\.]+)/i,/(mozilla)\/([\w\.]+(?= .+rv\:.+gecko\/\d+)|[0-4][\w\.]+(?!.+compatible))/i,/(amaya|dillo|doris|icab|ladybird|lynx|mosaic|netsurf|obigo|polaris|w3m|(?:go|ice|up)[\. ]?browser)[-\/ ]?v?([\w\.]+)/i,/\b(links) \(([\w\.]+)/i],[K,[Y,/_/g,`.`]],[/(cobalt)\/([\w\.]+)/i],[K,[Y,/[^\d\.]+./,Of]]],cpu:[[/\b((amd|x|x86[-_]?|wow|win)64)\b/i],[[If,`amd64`]],[/(ia32(?=;))/i,/\b((i[346]|x)86)(pc)?\b/i],[[If,`ia32`]],[/\b(aarch64|arm(v?[89]e?l?|_?64))\b/i],[[If,`arm64`]],[/\b(arm(v[67])?ht?n?[fl]p?)\b/i],[[If,`armhf`]],[/( (ce|mobile); ppc;|\/[\w\.]+arm\b)/i],[[If,`arm`]],[/ sun4\w[;\)]/i],[[If,`sparc`]],[/\b(avr32|ia64(?=;)|68k(?=\))|\barm(?=v([1-7]|[5-7]1)l?|;|eabi)|(irix|mips|sparc)(64)?\b|pa-risc)/i,/((ppc|powerpc)(64)?)( mac|;|\))/i,/(?:osf1|[freopnt]{3,4}bsd) (alpha)/i],[[If,/ower/,Of,Up]],[/mc680.0/i],[[If,`68k`]],[/winnt.+\[axp/i],[[If,`alpha`]]],device:[[/\b(sch-i[89]0\d|shw-m380s|sm-[ptx]\w{2,4}|gt-[pn]\d{2,4}|sgh-t8[56]9|nexus 10)/i],[X,[J,yp],[q,Q]],[/\b((?:s[cgp]h|gt|sm)-(?![lr])\w+|sc[g-]?[\d]+a?|galaxy nexus)/i,/samsung[- ]((?!sm-[lr]|browser)[-\w]+)/i,/sec-(sgh\w+)/i],[X,[J,yp],[q,Z]],[/(?:\/|\()(ip(?:hone|od)[\w, ]*)[\/\);]/i],[X,[J,op],[q,Z]],[/\b(?:ios|apple\w+)\/.+[\(\/](ipad)/i,/\b(ipad)[\d,]*[;\] ].+(mac |i(pad)?)os/i],[X,[J,op],[q,Q]],[/(macintosh);/i],[X,[J,op]],[/\b(sh-?[altvz]?\d\d[a-ekm]?)/i],[X,[J,bp],[q,Z]],[/\b((?:brt|eln|hey2?|gdi|jdn)-a?[lnw]09|(?:ag[rm]3?|jdn2|kob2)-a?[lw]0[09]hn)(?: bui|\)|;)/i],[X,[J,fp],[q,Q]],[/honor([-\w ]+)[;\)]/i],[X,[J,fp],[q,Z]],[/\b((?:ag[rs][2356]?k?|bah[234]?|bg[2o]|bt[kv]|cmr|cpn|db[ry]2?|jdn2|got|kob2?k?|mon|pce|scm|sht?|[tw]gr|vrd)-[ad]?[lw][0125][09]b?|605hw|bg2-u03|(?:gem|fdr|m2|ple|t1)-[7a]0[1-4][lu]|t1-a2[13][lw]|mediapad[\w\. ]*(?= bui|\)))\b(?!.+d\/s)/i],[X,[J,up],[q,Q]],[/(?:huawei) ?([-\w ]+)[;\)]/i,/\b(nexus 6p|\w{2,4}e?-[atu]?[ln][\dx][\dc][adnt]?)\b(?!.+d\/s)/i],[X,[J,up],[q,Z]],[/oid[^\)]+; (2[\dbc]{4}(182|283|rp\w{2})[cgl]|m2105k81a?c)(?: bui|\))/i,/\b(?:xiao)?((?:red)?mi[-_ ]?pad[\w- ]*)(?: bui|\))/i],[[X,/_/g,` `],[J,Sp],[q,Q]],[/\b; (\w+) build\/hm\1/i,/\b(hm[-_ ]?note?[_ ]?(?:\d\w)?) bui/i,/oid[^\)]+; (redmi[\-_ ]?(?:note|k)?[\w_ ]+|m?[12]\d[01]\d\w{3,6}|poco[\w ]+|(shark )?\w{3}-[ah]0|qin ?[1-3](s\+|ultra| pro)?)( bui|; wv|\))/i,/\b(mi[-_ ]?(?:a\d|one|one[_ ]plus|note|max|cc)?[_ ]?(?:\d{0,2}\w?)[_ ]?(?:plus|se|lite|pro)?( 5g|lte)?)(?: bui|\))/i,/ ([\w ]+) miui\/v?\d/i],[[X,/_/g,` `],[J,Sp],[q,Z]],[/droid.+; (cph2[3-6]\d[13579]|((gm|hd)19|(ac|be|in|kb)20|(d[en]|eb|le|mt)21|ne22)[0-2]\d|p[g-k]\w[1m]10)\b/i,/(?:one)?(?:plus)? (a\d0\d\d)(?: b|\))/i],[X,[J,_p],[q,Z]],[/; (\w+) bui.+ oppo/i,/\b(cph[12]\d{3}|p(?:af|c[al]|d\w|e[ar])[mt]\d0|x9007|a101op)\b/i],[X,[J,vp],[q,Z]],[/\b(opd2(\d{3}a?))(?: bui|\))/i],[X,[J,Xp,{OnePlus:[`203`,`304`,`403`,`404`,`413`,`415`],"*":vp}],[q,Q]],[/(vivo (5r?|6|8l?|go|one|s|x[il]?[2-4]?)[\w\+ ]*)(?: bui|\))/i],[X,[J,`BLU`],[q,Z]],[/; vivo (\w+)(?: bui|\))/i,/\b(v[12]\d{3}\w?[at])(?: bui|;)/i],[X,[J,`Vivo`],[q,Z]],[/\b(rmx[1-3]\d{3})(?: bui|;|\))/i],[X,[J,`Realme`],[q,Z]],[/(ideatab[-\w ]+|602lv|d-42a|a101lv|a2109a|a3500-hv|s[56]000|pb-6505[my]|tb-?x?\d{3,4}(?:f[cu]|xu|[av])|yt\d?-[jx]?\d+[lfmx])( bui|;|\)|\/)/i,/lenovo ?(b[68]0[08]0-?[hf]?|tab(?:[\w- ]+?)|tb[\w-]{6,7})( bui|;|\)|\/)/i],[X,[J,dp],[q,Q]],[/lenovo[-_ ]?([-\w ]+?)(?: bui|\)|\/)/i],[X,[J,dp],[q,Z]],[/\b(milestone|droid(?:[2-4x]| (?:bionic|x2|pro|razr))?:?( 4g)?)\b[\w ]+build\//i,/\bmot(?:orola)?[- ]([\w\s]+)(\)| bui)/i,/((?:moto(?! 360)[-\w\(\) ]+|xt\d{3,4}[cgkosw\+]?[-\d]*|nexus 6)(?= bui|\)))/i],[X,[J,hp],[q,Z]],[/\b(mz60\d|xoom[2 ]{0,2}) build\//i],[X,[J,hp],[q,Q]],[/((?=lg)?[vl]k\-?\d{3}) bui| 3\.[-\w; ]{10}lg?-([06cv9]{3,4})/i],[X,[J,pp],[q,Q]],[/(lm(?:-?f100[nv]?|-[\w\.]+)(?= bui|\))|nexus [45])/i,/\blg[-e;\/ ]+(?!.*(?:browser|netcast|android tv|watch|webos))(\w+)/i,/\blg-?([\d\w]+) bui/i],[X,[J,pp],[q,Z]],[/(nokia) (t[12][01])/i],[J,X,[q,Q]],[/(?:maemo|nokia).*(n900|lumia \d+|rm-\d+)/i,/nokia[-_ ]?(([-\w\. ]*?))( bui|\)|;|\/)/i],[[X,/_/g,` `],[q,Z],[J,`Nokia`]],[/(pixel (c|tablet))\b/i],[X,[J,lp],[q,Q]],[/droid.+;(?: google)? (g(01[13]a|020[aem]|025[jn]|1b60|1f8f|2ybb|4s1m|576d|5nz6|8hhn|8vou|a02099|c15s|d1yq|e2ae|ec77|gh2x|kv4x|p4bc|pj41|r83y|tt9q|ur25|wvk6)|pixel[\d ]*a?( pro)?( xl)?( fold)?( \(5g\))?)( bui|\))/i],[X,[J,lp],[q,Z]],[/(google) (pixelbook( go)?)/i],[J,X],[/droid.+; (a?\d[0-2]{2}so|[c-g]\d{4}|so[-gl]\w+|xq-\w\w\d\d)(?= bui|\).+chrome\/(?![1-6]{0,1}\d\.))/i],[X,[J,xp],[q,Z]],[/sony tablet [ps]/i,/\b(?:sony)?sgp\w+(?: bui|\))/i],[[X,`Xperia Tablet`],[J,xp],[q,Q]],[/(alexa)webm/i,/(kf[a-z]{2}wi|aeo(?!bc)\w\w)( bui|\))/i,/(kf[a-z]+)( bui|\)).+silk\//i],[X,[J,ap],[q,Q]],[/((?:sd|kf)[0349hijorstuw]+)( bui|\)).+silk\//i],[[X,/(.+)/g,`Fire Phone $1`],[J,ap],[q,Z]],[/(playbook);[-\w\),; ]+(rim)/i],[X,J,[q,Q]],[/\b((?:bb[a-f]|st[hv])100-\d)/i,/(?:blackberry|\(bb10;) (\w+)/i],[X,[J,cp],[q,Z]],[/(?:\b|asus_)(transfo[prime ]{4,10} \w+|eeepc|slider \w+|nexus 7|padfone|p00[cj])/i],[X,[J,sp],[q,Q]],[/ (z[bes]6[027][012][km][ls]|zenfone \d\w?)\b/i],[X,[J,sp],[q,Z]],[/(nexus 9)/i],[X,[J,`HTC`],[q,Q]],[/(htc)[-;_ ]{1,2}([\w ]+(?=\)| bui)|\w+)/i,/(zte)[- ]([\w ]+?)(?: bui|\/|\))/i,/(alcatel|geeksphone|nexian|panasonic(?!(?:;|\.))|sony(?!-bra))[-_ ]?([-\w]*)/i],[J,[X,/_/g,` `],[q,Z]],[/tcl (xess p17aa)/i,/droid [\w\.]+; ((?:8[14]9[16]|9(?:0(?:48|60|8[01])|1(?:3[27]|66)|2(?:6[69]|9[56])|466))[gqswx])(_\w(\w|\w\w))?(\)| bui)/i],[X,[J,`TCL`],[q,Q]],[/droid [\w\.]+; (418(?:7d|8v)|5087z|5102l|61(?:02[dh]|25[adfh]|27[ai]|56[dh]|59k|65[ah])|a509dl|t(?:43(?:0w|1[adepqu])|50(?:6d|7[adju])|6(?:09dl|10k|12b|71[efho]|76[hjk])|7(?:66[ahju]|67[hw]|7[045][bh]|71[hk]|73o|76[ho]|79w|81[hks]?|82h|90[bhsy]|99b)|810[hs]))(_\w(\w|\w\w))?(\)| bui)/i],[X,[J,`TCL`],[q,Z]],[/(itel) ((\w+))/i],[[J,Up],X,[q,Xp,{tablet:[`p10001l`,`w7001`],"*":`mobile`}]],[/droid.+; ([ab][1-7]-?[0178a]\d\d?)/i],[X,[J,`Acer`],[q,Q]],[/droid.+; (m[1-5] note) bui/i,/\bmz-([-\w]{2,})/i],[X,[J,`Meizu`],[q,Z]],[/; ((?:power )?armor(?:[\w ]{0,8}))(?: bui|\))/i],[X,[J,`Ulefone`],[q,Z]],[/; (energy ?\w+)(?: bui|\))/i,/; energizer ([\w ]+)(?: bui|\))/i],[X,[J,`Energizer`],[q,Z]],[/; cat (b35);/i,/; (b15q?|s22 flip|s48c|s62 pro)(?: bui|\))/i],[X,[J,`Cat`],[q,Z]],[/((?:new )?andromax[\w- ]+)(?: bui|\))/i],[X,[J,`Smartfren`],[q,Z]],[/droid.+; (a(in)?(0(15|59|6[35])|142)p?)/i],[X,[J,`Nothing`],[q,Z]],[/; (x67 5g|tikeasy \w+|ac[1789]\d\w+)( b|\))/i,/archos ?(5|gamepad2?|([\w ]*[t1789]|hello) ?\d+[\w ]*)( b|\))/i],[X,[J,`Archos`],[q,Q]],[/archos ([\w ]+)( b|\))/i,/; (ac[3-6]\d\w{2,8})( b|\))/i],[X,[J,`Archos`],[q,Z]],[/; (n159v)/i],[X,[J,`HMD`],[q,Z]],[/(imo) (tab \w+)/i,/(infinix|tecno) (x1101b?|p904|dp(7c|8d|10a)( pro)?|p70[1-3]a?|p904|t1101)/i],[J,X,[q,Q]],[/(blackberry|benq|palm(?=\-)|sonyericsson|acer|asus(?! zenw)|dell|jolla|meizu|motorola|polytron|tecno|micromax|advan)[-_ ]?([-\w]*)/i,/; (blu|hmd|imo|infinix|lava|oneplus|tcl|wiko)[_ ]([\w\+ ]+?)(?: bui|\)|; r)/i,/(hp) ([\w ]+\w)/i,/(microsoft); (lumia[\w ]+)/i,/(oppo) ?([\w ]+) bui/i,/(hisense) ([ehv][\w ]+)\)/i,/droid[^;]+; (philips)[_ ]([sv-x][\d]{3,4}[xz]?)/i],[J,X,[q,Z]],[/(kobo)\s(ereader|touch)/i,/(hp).+(touchpad(?!.+tablet)|tablet)/i,/(kindle)\/([\w\.]+)/i],[J,X,[q,Q]],[/(surface duo)/i],[X,[J,mp],[q,Q]],[/droid [\d\.]+; (fp\du?)(?: b|\))/i],[X,[J,`Fairphone`],[q,Z]],[/((?:tegranote|shield t(?!.+d tv))[\w- ]*?)(?: b|\))/i],[X,[J,gp],[q,Q]],[/(sprint) (\w+)/i],[J,X,[q,Z]],[/(kin\.[onetw]{3})/i],[[X,/\./g,` `],[J,mp],[q,Z]],[/droid.+; ([c6]+|et5[16]|mc[239][23]x?|vc8[03]x?)\)/i],[X,[J,Cp],[q,Q]],[/droid.+; (ec30|ps20|tc[2-8]\d[kx])\)/i],[X,[J,Cp],[q,Z]],[/(philips)[\w ]+tv/i,/smart-tv.+(samsung)/i],[J,[q,$]],[/hbbtv.+maple;(\d+)/i],[[X,/^/,`SmartTV`],[J,yp],[q,$]],[/(vizio)(?: |.+model\/)(\w+-\w+)/i,/tcast.+(lg)e?. ([-\w]+)/i],[J,X,[q,$]],[/(nux; netcast.+smarttv|lg (netcast\.tv-201\d|android tv))/i],[[J,pp],[q,$]],[/(apple) ?tv/i],[J,[X,op+` TV`],[q,$]],[/crkey.*devicetype\/chromecast/i],[[X,Ep+` Third Generation`],[J,lp],[q,$]],[/crkey.*devicetype\/([^/]*)/i],[[X,/^/,`Chromecast `],[J,lp],[q,$]],[/fuchsia.*crkey/i],[[X,Ep+` Nest Hub`],[J,lp],[q,$]],[/crkey/i],[[X,Ep],[J,lp],[q,$]],[/(portaltv)/i],[X,[J,Ap],[q,$]],[/droid.+aft(\w+)( bui|\))/i],[X,[J,ap],[q,$]],[/(shield \w+ tv)/i],[X,[J,gp],[q,$]],[/\(dtv[\);].+(aquos)/i,/(aquos-tv[\w ]+)\)/i],[X,[J,bp],[q,$]],[/(bravia[\w ]+)( bui|\))/i],[X,[J,xp],[q,$]],[/(mi(tv|box)-?\w+) bui/i],[X,[J,Sp],[q,$]],[/Hbbtv.*(technisat) (.*);/i],[J,X,[q,$]],[/\b(roku)[\dx]*[\)\/]((?:dvp-)?[\d\.]*)/i,/hbbtv\/\d+\.\d+\.\d+ +\([\w\+ ]*; *([\w\d][^;]*);([^;]*)/i],[[J,/.+\/(\w+)/,`$1`,Xp,{LG:`lge`}],[X,Jp],[q,$]],[/(playstation \w+)/i],[X,[J,xp],[q,Rf]],[/\b(xbox(?: one)?(?!; xbox))[\); ]/i],[X,[J,mp],[q,Rf]],[/(ouya)/i,/(nintendo) (\w+)/i,/(retroid) (pocket ([^\)]+))/i,/(valve).+(steam deck)/i,/droid.+; ((shield|rgcube|gr0006))( bui|\))/i],[[J,Xp,{Nvidia:`Shield`,Anbernic:`RGCUBE`,Logitech:`GR0006`}],X,[q,Rf]],[/\b(sm-[lr]\d\d[0156][fnuw]?s?|gear live)\b/i],[X,[J,yp],[q,zf]],[/((pebble))app/i,/(asus|google|lg|oppo|xiaomi) ((pixel |zen)?watch[\w ]*)( bui|\))/i],[J,X,[q,zf]],[/(ow(?:19|20)?we?[1-3]{1,3})/i],[X,[J,vp],[q,zf]],[/(watch)(?: ?os[,\/]|\d,\d\/)[\d\.]+/i],[X,[J,op],[q,zf]],[/(opwwe\d{3})/i],[X,[J,_p],[q,zf]],[/(moto 360)/i],[X,[J,hp],[q,zf]],[/(smartwatch 3)/i],[X,[J,xp],[q,zf]],[/(g watch r)/i],[X,[J,pp],[q,zf]],[/droid.+; (wt63?0{2,3})\)/i],[X,[J,Cp],[q,zf]],[/droid.+; (glass) \d/i],[X,[J,lp],[q,Bf]],[/(pico) ([\w ]+) os\d/i],[J,X,[q,Bf]],[/(quest( \d| pro)?s?).+vr/i],[X,[J,Ap],[q,Bf]],[/mobile vr; rv.+firefox/i],[[q,Bf]],[/(tesla)(?: qtcarbrowser|\/[-\w\.]+)/i],[J,[q,Vf]],[/(aeobc)\b/i],[X,[J,ap],[q,Vf]],[/(homepod).+mac os/i],[X,[J,op],[q,Vf]],[/windows iot/i],[[q,Vf]],[/droid.+; ([\w- ]+) (4k|android|smart|google)[- ]?tv/i],[X,[q,$]],[/\b((4k|android|smart|opera)[- ]?tv|tv; rv:|large screen[\w ]+safari)\b/i],[[q,$]],[/droid .+?; ([^;]+?)(?: bui|; wv\)|\) applew|; hmsc).+?(mobile|vr|\d) safari/i],[X,[q,Xp,{mobile:`Mobile`,xr:`VR`,"*":Q}]],[/\b((tablet|tab)[;\/]|focus\/\d(?!.+mobile))/i],[[q,Q]],[/(phone|mobile(?:[;\/]| [ \w\/\.]*safari)|pda(?=.+windows ce))/i],[[q,Z]],[/droid .+?; ([\w\. -]+)( bui|\))/i],[X,[J,`Generic`]]],engine:[[/windows.+ edge\/([\w\.]+)/i],[Y,[K,Dp+`HTML`]],[/(arkweb)\/([\w\.]+)/i],[K,Y],[/webkit\/537\.36.+chrome\/(?!27)([\w\.]+)/i],[Y,[K,`Blink`]],[/(presto)\/([\w\.]+)/i,/(webkit|trident|netfront|netsurf|amaya|lynx|w3m|goanna|servo)\/([\w\.]+)/i,/ekioh(flow)\/([\w\.]+)/i,/(khtml|tasman|links)[\/ ]\(?([\w\.]+)/i,/(icab)[\/ ]([23]\.[\d\.]+)/i,/\b(libweb)/i],[K,Y],[/ladybird\//i],[[K,`LibWeb`]],[/rv\:([\w\.]{1,9})\b.+(gecko)/i],[Y,K]],os:[[/(windows nt) (6\.[23]); arm/i],[[K,/N/,`R`],[Y,Xp,Zp]],[/(windows (?:phone|mobile|iot))(?: os)?[\/ ]?([\d\.]*( se)?)/i,/(windows)[\/ ](1[01]|2000|3\.1|7|8(\.1)?|9[58]|me|server 20\d\d( r2)?|vista|xp)/i],[K,Y],[/windows nt ?([\d\.\)]*)(?!.+xbox)/i,/\bwin(?=3| ?9|n)(?:nt| 9x )?([\d\.;]*)/i],[[Y,/(;|\))/g,``,Xp,Zp],[K,Pp]],[/(windows ce)\/?([\d\.]*)/i],[K,Y],[/[adehimnop]{4,7}\b(?:.*os ([\w]+) like mac|; opera)/i,/(?:ios;fbsv|ios(?=.+ip(?:ad|hone)|.+apple ?tv)|ip(?:ad|hone)(?: |.+i(?:pad)?)os|apple ?tv.+ios)[\/ ]([\w\.]+)/i,/\btvos ?([\w\.]+)/i,/cfnetwork\/.+darwin/i],[[Y,/_/g,`.`],[K,`iOS`]],[/(mac os x) ?([\w\. ]*)/i,/(macintosh|mac_powerpc\b)(?!.+(haiku|morphos))/i],[[K,`macOS`],[Y,/_/g,`.`]],[/android ([\d\.]+).*crkey/i],[Y,[K,Ep+` Android`]],[/fuchsia.*crkey\/([\d\.]+)/i],[Y,[K,Ep+` Fuchsia`]],[/crkey\/([\d\.]+).*devicetype\/smartspeaker/i],[Y,[K,Ep+` SmartSpeaker`]],[/linux.*crkey\/([\d\.]+)/i],[Y,[K,Ep+` Linux`]],[/crkey\/([\d\.]+)/i],[Y,[K,Ep]],[/droid ([\w\.]+)\b.+(android[- ]x86)/i],[Y,K],[/(ubuntu) ([\w\.]+) like android/i],[[K,/(.+)/,`$1 Touch`],Y],[/(harmonyos)[\/ ]?([\d\.]*)/i,/(android|bada|blackberry|kaios|maemo|meego|openharmony|qnx|rim tablet os|sailfish|series40|symbian|tizen)\w*[-\/\.; ]?([\d\.]*)/i],[K,Y],[/\(bb(10);/i],[Y,[K,cp]],[/(?:symbian ?os|symbos|s60(?=;)|series ?60)[-\/ ]?([\w\.]*)/i],[Y,[K,`Symbian`]],[/mozilla\/[\d\.]+ \((?:mobile|tablet|tv|mobile; [\w ]+); rv:.+ gecko\/([\w\.]+)/i],[Y,[K,Op+` OS`]],[/\b(?:hp)?wos(?:browser)?\/([\w\.]+)/i,/webos(?:[ \/]?|\.tv-20(?=2[2-9]))(\d[\d\.]*)/i],[Y,[K,`webOS`]],[/web0s;.+?(?:chr[o0]me|safari)\/(\d+)/i],[[Y,Xp,{25:`120`,24:`108`,23:`94`,22:`87`,6:`79`,5:`68`,4:`53`,3:`38`,2:`538`,1:`537`,"*":`TV`}],[K,`webOS`]],[/watch(?: ?os[,\/]|\d,\d\/)([\d\.]+)/i],[Y,[K,`watchOS`]],[/(cros) [\w]+(?:\)| ([\w\.]+)\b)/i],[[K,`Chrome OS`],Y],[/panasonic;(viera)/i,/(netrange)mmh/i,/(nettv)\/(\d+\.[\w\.]+)/i,/(nintendo|playstation) (\w+)/i,/(xbox); +xbox ([^\);]+)/i,/(pico) .+os([\w\.]+)/i,/\b(joli|palm)\b ?(?:os)?\/?([\w\.]*)/i,/linux.+(mint)[\/\(\) ]?([\w\.]*)/i,/(mageia|vectorlinux|fuchsia|arcaos|arch(?= ?linux))[;l ]([\d\.]*)/i,/([kxln]?ubuntu|debian|suse|opensuse|gentoo|slackware|fedora|mandriva|centos|pclinuxos|red ?hat|zenwalk|linpus|raspbian|plan 9|minix|risc os|contiki|deepin|manjaro|elementary os|sabayon|linspire|knoppix)(?: gnu[\/ ]linux)?(?: enterprise)?(?:[- ]linux)?(?:-gnu)?[-\/ ]?(?!chrom|package)([-\w\.]*)/i,/((?:open)?solaris)[-\/ ]?([\w\.]*)/i,/\b(aix)[; ]([1-9\.]{0,4})/i,/(hurd|linux|morphos)(?: (?:arm|x86|ppc)\w*| ?)([\w\.]*)/i,/(gnu) ?([\w\.]*)/i,/\b([-frentopcghs]{0,5}bsd|dragonfly)[\/ ]?(?!amd|[ix346]{1,2}86)([\w\.]*)/i,/(haiku) ?(r\d)?/i],[K,Y],[/(sunos) ?([\d\.]*)/i],[[K,`Solaris`],Y],[/\b(beos|os\/2|amigaos|openvms|hp-ux|serenityos)/i,/(unix) ?([\w\.]*)/i],[K,Y]]},tm=(function(){var e={init:{},isIgnore:{},isIgnoreRgx:{},toString:{}};return Gp.call(e.init,[[Af,[K,Y,Lf,q]],[jf,[If]],[Mf,[q,X,J]],[Nf,[K,Y]],[Pf,[K,Y]]]),Gp.call(e.isIgnore,[[Af,[Y,Lf]],[Nf,[Y]],[Pf,[Y]]]),Gp.call(e.isIgnoreRgx,[[Af,/ ?browser$/i],[Pf,/ ?os$/i]]),Gp.call(e.toString,[[Af,[K,Y]],[jf,[If]],[Mf,[J,X]],[Nf,[K,Y]],[Pf,[K,Y]]]),e})(),nm=function(e,t){var n=tm.init[t],r=tm.isIgnore[t]||0,i=tm.isIgnoreRgx[t]||0,a=tm.toString[t]||0;function o(){Gp.call(this,n)}return o.prototype.getItem=function(){return e},o.prototype.withClientHints=function(){return Ip?Ip.getHighEntropyValues(ip).then(function(t){return e.setCH(new rm(t,!1)).parseCH().get()}):e.parseCH().get()},o.prototype.withFeatureCheck=function(){return e.detectFeature().get()},t!=Ff&&(o.prototype.is=function(e){var t=!1;for(var n in this)if(this.hasOwnProperty(n)&&!zp(r,n)&&Up(i?Kp(i,this[n]):this[n])==Up(i?Kp(i,e):e)){if(t=!0,e!=G.UNDEFINED)break}else if(e==G.UNDEFINED&&t){t=!t;break}return t},o.prototype.toString=function(){var e=Of;for(var t in a)typeof this[a[t]]!==G.UNDEFINED&&(e+=(e?` `:Of)+this[a[t]]);return e||G.UNDEFINED}),o.prototype.then=function(e){var t=this,n=function(){for(var e in t)t.hasOwnProperty(e)&&(this[e]=t[e])};n.prototype={is:o.prototype.is,toString:o.prototype.toString,withClientHints:o.prototype.withClientHints,withFeatureCheck:o.prototype.withFeatureCheck};var r=new n;return e(r),r},new o};function rm(e,t){if(e||={},Gp.call(this,ip),t)Gp.call(this,[[Uf,Hp(e[Yf])],[Gf,Hp(e[Xf])],[Z,/\?1/.test(e[ep])],[X,qp(e[tp])],[Kf,qp(e[np])],[qf,qp(e[rp])],[If,qp(e[Zf])],[Wf,Hp(e[$f])],[Jf,qp(e[Qf])]]);else for(var n in e)this.hasOwnProperty(n)&&typeof e[n]!==G.UNDEFINED&&(this[n]=e[n])}function im(e,t,n,r){return Gp.call(this,[[`itemType`,e],[`ua`,t],[`uaCH`,r],[`rgxMap`,n],[`data`,nm(this,e)]]),this}im.prototype.get=function(e){return e?this.data.hasOwnProperty(e)?this.data[e]:void 0:this.data},im.prototype.set=function(e,t){return this.data[e]=t,this},im.prototype.setCH=function(e){return this.uaCH=e,this},im.prototype.detectFeature=function(){if(Fp&&Fp.userAgent==this.ua)switch(this.itemType){case Af:Fp.brave&&typeof Fp.brave.isBrave==G.FUNCTION&&this.set(K,`Brave`);break;case Mf:!this.get(q)&&Ip&&Ip[Z]&&this.set(q,Z),this.get(X)==`Macintosh`&&Fp&&typeof Fp.standalone!==G.UNDEFINED&&Fp.maxTouchPoints&&Fp.maxTouchPoints>2&&this.set(X,`iPad`).set(q,Q);break;case Pf:!this.get(K)&&Ip&&Ip[Kf]&&this.set(K,Ip[Kf]);break;case Ff:var e=this.data,t=function(t){return e[t].getItem().detectFeature().get()};this.set(Af,t(Af)).set(jf,t(jf)).set(Mf,t(Mf)).set(Nf,t(Nf)).set(Pf,t(Pf))}return this},im.prototype.parseUA=function(){switch(this.itemType!=Ff&&Yp.call(this.data,this.ua,this.rgxMap),this.itemType){case Af:this.set(Lf,Wp(this.get(Y)));break;case Pf:if(this.get(K)==`iOS`&&this.get(Y)==`18.6`){var e=/\) Version\/([\d\.]+)/.exec(this.ua);e&&parseInt(e[1].substring(0,2),10)>=26&&this.set(Y,e[1])}break}return this},im.prototype.parseCH=function(){var e=this.uaCH,t=this.rgxMap;switch(this.itemType){case Af:case Nf:var n=e[Gf]||e[Uf],r;if(n)for(var i=0;i<n.length;i++){var a=n[i].brand||n[i],o=n[i].version;this.itemType==Af&&!/not.a.brand/i.test(a)&&(!r||/Chrom/.test(r)&&a!=Tp||r==Dp&&/WebView2/.test(a))&&(a=Xp(a,$p),r=this.get(K),r&&!/Chrom/.test(r)&&/Chrom/.test(a)||this.set(K,a).set(Y,o).set(Lf,Wp(o)),r=a),this.itemType==Nf&&a==Tp&&this.set(Y,o)}break;case jf:var s=e[If];s&&(s&&e[Jf]==`64`&&(s+=`64`),Yp.call(this.data,s+`;`,t));break;case Mf:if(e[Z]&&this.set(q,Z),e[X]&&(this.set(X,e[X]),!this.get(q)||!this.get(J))){var c={};Yp.call(c,`droid 9; `+e[X]+`)`,t),!this.get(q)&&c.type&&this.set(q,c.type),!this.get(J)&&c.vendor&&this.set(J,c.vendor)}if(e[Wf]){var l;if(typeof e[Wf]!=`string`)for(var u=0;!l&&u<e[Wf].length;)l=Xp(e[Wf][u++],Qp);else l=Xp(e[Wf],Qp);this.set(q,l)}break;case Pf:var d=e[Kf];if(d){var f=e[qf];d==Pp&&(f=parseInt(Wp(f),10)>=13?`11`:`10`),this.set(K,d).set(Y,f)}this.get(K)==Pp&&e[X]==`Xbox`&&this.set(K,`Xbox`).set(Y,void 0);break;case Ff:var p=this.data,m=function(t){return p[t].getItem().setCH(e).parseCH().get()};this.set(Af,m(Af)).set(jf,m(jf)).set(Mf,m(Mf)).set(Nf,m(Nf)).set(Pf,m(Pf))}return this};function am(e,t,n){if(typeof e===G.OBJECT?(Bp(e,!0)?(typeof t===G.OBJECT&&(n=t),t=e):(n=e,t=void 0),e=void 0):typeof e===G.STRING&&!Bp(t,!0)&&(n=t,t=void 0),n)if(typeof n.append===G.FUNCTION){var r={};n.forEach(function(e,t){r[String(t).toLowerCase()]=e}),n=r}else{var i={};for(var a in n)n.hasOwnProperty(a)&&(i[String(a).toLowerCase()]=n[a]);n=i}if(!(this instanceof am))return new am(e,t,n).getResult();var o=typeof e===G.STRING?e:n&&n[Df]?n[Df]:Fp&&Fp.userAgent?Fp.userAgent:Of,s=new rm(n,!0),c=t?Lp(em,t):em,l=function(e){return e==Ff?function(){return new im(e,o,c,s).set(`ua`,o).set(Af,this.getBrowser()).set(jf,this.getCPU()).set(Mf,this.getDevice()).set(Nf,this.getEngine()).set(Pf,this.getOS()).get()}:function(){return new im(e,o,c[e],s).parseUA().get()}};return Gp.call(this,[[`getBrowser`,l(Af)],[`getCPU`,l(jf)],[`getDevice`,l(Mf)],[`getEngine`,l(Nf)],[`getOS`,l(Pf)],[`getResult`,l(Ff)],[`getUA`,function(){return o}],[`setUA`,function(e){return Vp(e)&&(o=Jp(e,Ef)),this}]]).setUA(o),this}am.VERSION=Tf,am.BROWSER=Rp([K,Y,Lf,q]),am.CPU=Rp([If]),am.DEVICE=Rp([X,J,q,Rf,Z,$,Q,zf,Vf]),am.ENGINE=am.OS=Rp([K,Y]);function om(e){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:t=>{e.updateState({error:i(t)})},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(_d(`mp4`)):e.controller.getConfig()}},sourceSwitch:{onSourceChange:e=>Promise.resolve(),onPreviewUpdate:t=>(e.updateState({stream:t}),Promise.resolve()),onError:t=>{e.updateState({error:i(t)})},onTransitionStart:t=>{e.updateState({transitionMessage:t})},onTransitionEnd:()=>{e.updateState({transitionMessage:null})}},storage:{onUploadProgress:()=>{},onUploadComplete:()=>{},onUploadError:()=>{}},onStorageCleanupError:e=>{console.error(e)}}}function sm(e,t){let n=(e=>e===``||e===`default`?null:e)(t);return e.setCameraDevice(n),e.switchVideoDevice(n)}function cm(e,t){let n=(e=>e===``||e===`default`?null:e)(t);return e.setMicDevice(n),e.switchAudioDevice(n)}async function lm(e,t=`camera`){e.isActive()||await e.startStream(),t!==e.getCurrentSourceType()&&await e.switchSource(t),await e.startRecording()}async function um(e,t,n,r){return await e.stopRecording()}function dm(e){e.pauseRecording()}function fm(e){e.resumeRecording()}async function pm(e,t){await e.switchSource(t)}function mm(e){return e.toggleMute(),e.getIsMuted()}function hm(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)}var gm=class{constructor(e){if(this.proxyEndpoint=e.proxyEndpoint,this.proxyEndpoint)throw Error(`Proxy mode not yet implemented`);this.service=new $d}uploadVideo(e,t){if(this.proxyEndpoint)throw Error(`Proxy mode not yet implemented`);return this.service.uploadVideo(e,t)}},_m=`: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-preview-container{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)}.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:100;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:10;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:20;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:200;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;position:absolute;bottom:4rem;left:50%;overflow:hidden;transform:translateZ(0)}.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{z-index:10;contain:layout style paint;will-change:auto;backface-visibility:hidden;align-items:center;gap:.125rem;height:1rem;display:flex;position:absolute;bottom:.75rem;right:.75rem;transform:translateZ(0)}@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:10;contain:layout style paint;will-change:auto;backface-visibility:hidden;position:absolute;bottom:12px;left:50%;transform:translate(-50%)translateZ(0)}.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:10;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;display:flex;position:absolute;top:.75rem;right:.75rem;transform:translateZ(0);box-shadow:0 1px 3px #0000001a,0 1px 2px -1px #0000001a}.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-rec-indicator-top{z-index:10;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;display:flex;position:absolute;top:.75rem;left:.75rem;transform:translateZ(0);box-shadow:0 1px 3px #0000001a,0 1px 2px -1px #0000001a}.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-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:100;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-finishing-progress{margin-top:20px;display:none}.vidtreo-finishing-progress .vidtreo-progress-indeterminate{background:linear-gradient(90deg,#0000 0%,#667eea 50%,#0000 100%) 0 0/200% 100%;width:100%;animation:1.5s ease-in-out infinite vidtreo-progress-indeterminate}.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-icon{font-size:3rem;line-height:1}.vidtreo-error-retry{background:hsl(var(--vidtreo-destructive));color:hsl(var(--vidtreo-destructive-foreground));cursor:pointer;border:none;border-radius:.375rem;justify-content:center;align-items:center;margin-top:.5rem;padding:.5rem 1rem;font-size:.875rem;font-weight:500;transition:filter .2s;display:inline-flex}.vidtreo-error-retry:hover:not(:disabled){filter:brightness(.85)}.vidtreo-error-retry:disabled{opacity:.5;cursor:not-allowed}.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:10;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);z-index:20;pointer-events:none;background:#000000b3;flex-direction:column;justify-content:center;align-items:center;width:100%;height:100%;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{height:100%;transition:width .3s}.vidtreo-error-overlay{background:hsl(var(--vidtreo-preview-bg));z-index:1000;justify-content:center;align-items:center;display:flex;position:absolute;inset:0}.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{color:#fff;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-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}`;let vm=()=>`
8427
+ <style>${_m}</style>
8427
8428
  <div class="vidtreo-camera-area vidtreo-active" id="cameraArea">
8428
8429
  <!-- Error Boundary / Preview Container -->
8429
8430
  <div class="vidtreo-preview-container">
@@ -8609,7 +8610,7 @@ new RecorderWorker;
8609
8610
  <!-- Error Message -->
8610
8611
  <div class="vidtreo-error" id="error" style="display: none;"></div>
8611
8612
  </div>
8612
- `;function vm(e,t){return e.querySelector(t)}let ym=/^https?:\/\//i;function bm(e){return e?ym.test(e)?e:`https://${e}`:`https://api.vidtreo.com`}function xm(e,t){let n={apiKey:e.getAttribute(`api-key`),backendUrl:bm(e.getAttribute(`backend-url`))},r=e.getAttribute(`countdown-duration`);if(r){let e=Number.parseInt(r,10);Number.isNaN(e)||(n.countdownDuration=e)}let a=e.getAttribute(`max-recording-time`);if(a){let e=Number.parseInt(a,10);Number.isNaN(e)||(n.maxRecordingTime=e)}let o=e.getAttribute(`user-metadata`);if(o)try{let e=JSON.parse(o);Object.assign(t,e),n.userMetadata=t}catch(e){throw Error(`Invalid user-metadata JSON: ${i(e)}`)}let s=e.getAttribute(`enable-source-switching`);n.enableSourceSwitching=s===null||s!==`false`;let c=e.getAttribute(`enable-mute`);n.enableMute=c===null||c!==`false`;let l=e.getAttribute(`enable-pause`);n.enablePause=l===null||l!==`false`;let u=e.getAttribute(`enable-device-change`);n.enableDeviceChange=u===null||u!==`false`;let d=e.getAttribute(`enable-tab-visibility-overlay`);return n.enableTabVisibilityOverlay=d!==null&&d!==`false`,n}function Sm(){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 Cm={recordingState:`idle`,stream:null,isMuted:!1,isPaused:!1,error:null,countdown:null,timer:`00:00`,uploadProgress:null,transitionMessage:null,recordedBlob:null,devices:{cameras:[],microphones:[],selectedCamera:null,selectedMic:null},configError:null};var wm=class extends HTMLElement{constructor(...e){super(...e),this.controller=null,this.uploadService=null,this.state={...Cm},this.config={},this.initialized=!1,this.isInitializing=!1,this.videoPreview=null,this.audioBarsContainer=null,this.audioContext=null,this.analyser=null,this.animationFrameId=null,this.settingsView=`main`,this.slideDirection=`none`}static{this.observedAttributes=[`api-key`,`backend-url`,`countdown-duration`,`max-recording-time`,`user-metadata`,`enable-source-switching`,`enable-mute`,`enable-pause`,`enable-device-change`,`enable-tab-visibility-overlay`,`demo`]}get isDemo(){return this.hasAttribute(`demo`)&&this.getAttribute(`demo`)!==`false`}connectedCallback(){this.innerHTML=_m(),this.init()}disconnectedCallback(){this.cleanup()}attributeChangedCallback(e,t,n){t!==n&&[`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=xm(this,{});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 gm({apiKey:e,backendUrl:t})),this.controller=new wf(om(this));let n={...this.config};await this.controller.initialize(n),this.initialized=!0,this.updateState({configError:null}),this.videoPreview=vm(this,`#videoPreview`),this.audioBarsContainer=vm(this,`#audioLevelBars`),this.setupEventListeners(),Sm(),setTimeout(()=>this.startPreview(),100)}catch(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)}}cleanup(){this.controller&&=(this.controller.cleanup(),null),this.stopAudioAnalysis(),this.initialized=!1,this.state={...Cm}}updateState(e){this.state={...this.state,...e},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.videoPreview&&(e?(this.videoPreview.srcObject=e,this.videoPreview.style.display=`block`,this.videoPreview.play().catch(console.error),this.startAudioAnalysis(e)):(this.videoPreview.srcObject=null,this.videoPreview.style.display=`none`,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){console.error(`Audio analysis setup failed`,e)}}stopAudioAnalysis(){this.animationFrameId&&=(cancelAnimationFrame(this.animationFrameId),null),this.audioContext&&=(this.audioContext.close(),null)}renderAudioBars(e){if(!this.audioBarsContainer)return;let t=[.8,1.2,.9],n=``;this.state.isMuted||t.forEach((t,r)=>{let i=Math.max(4,e*24*t);n+=`<div class="vidtreo-audio-level-bar" style="height: ${i}px;"></div>`}),this.audioBarsContainer.innerHTML=n}render(){this.renderPreviewSection(),this.renderIndicatorsSection(),this.renderButtonsSection(),this.renderStatusSection(),this.renderConfigError()}renderPreviewSection(){let e=this.state;this.toggleDisplay(`#startCameraArea`,!e.stream),this.toggleDisplay(`#videoPreview`,!!e.stream&&!e.transitionMessage),this.toggleClass(`#sourceTransitionOverlay`,`vidtreo-active`,!!e.transitionMessage),this.setText(`#transitionMessage`,e.transitionMessage||``)}renderIndicatorsSection(){let e=this.state,t=e.recordingState===`recording`||e.isPaused;this.toggleClass(`#countdownOverlay`,`vidtreo-active`,e.recordingState===`countdown`),this.setText(`#countdownNumber`,e.countdown?.toString()||``),this.toggleDisplay(`#recIndicatorTop`,t),this.toggleDisplay(`#recordingTimerRow`,t),this.setText(`#recordingTimer`,e.timer),this.toggleDisplay(`#audioLevelBars`,t),this.toggleDisplay(`#recordingControls`,!!e.stream)}renderButtonsSection(){let e=this.state,t=e.recordingState===`recording`||e.isPaused;this.toggleDisplay(`#btnSettings`,!t&&this.config.enableDeviceChange!==!1),this.toggleDisplay(`#btnRecord`,e.recordingState===`idle`),this.toggleDisplay(`#btnMute`,t&&this.config.enableMute!==!1),this.toggleDisplay(`#btnStop`,t),this.toggleDisplay(`#btnSwitchSource`,t&&this.config.enableSourceSwitching!==!1),this.renderPauseButton(t),this.renderMuteButton();let n=this.isDemo&&!t&&e.recordingState===`idle`&&e.recordedBlob!==null;this.toggleDisplay(`#btnDownload`,n)}renderPauseButton(e){let t=this.state,n=vm(this,`#btnPause`),r=this.querySelector(`#iconPause`);n&&(t.isPaused?(n.title=`Resume`,r&&(r.className=`ph-fill ph-play`)):(n.title=`Pause`,r&&(r.className=`ph-fill ph-pause`)),n.style.display=e&&this.config.enablePause!==!1?`inline-flex`:`none`)}renderMuteButton(){let e=this.state,t=vm(this,`#btnMute`),n=this.querySelector(`#iconMute`);t&&(n&&(n.className=e.isMuted?`ph-fill ph-microphone-slash`:`ph-fill ph-microphone`),t.classList.toggle(`vidtreo-muted`,e.isMuted))}renderStatusSection(){let e=this.state;if(this.toggleDisplay(`#error`,!!e.error),this.setText(`#error`,e.error||``),this.renderUploadStatus(),e.recordingState!==`idle`){let e=this.querySelector(`#settingsPanel`);e&&e.classList.remove(`vidtreo-active`)}}renderUploadStatus(){let e=this.state;this.toggleDisplay(`#uploadProgressOverlay`,e.uploadProgress!==null);let t=this.querySelector(`#uploadProgressFill`);t&&e.uploadProgress!==null&&(t.style.width=`${Math.round(e.uploadProgress*100)}%`);let n=this.querySelector(`#uploadProgressText`);n&&e.uploadProgress!==null&&(n.textContent=`Uploading... ${Math.round(e.uploadProgress*100)}%`)}toggleDisplay(e,t){let n=this.querySelector(e);if(n)if(t){let t=n.tagName===`BUTTON`,r=e.includes(`row`)||e.includes(`controls`)||e.includes(`Overlay`)||e.includes(`Indicator`)||e.includes(`Timer`)||e.includes(`Bars`);t?n.style.display=`inline-flex`:r?n.style.display=`flex`:n.style.display=`block`}else n.style.display=`none`}toggleClass(e,t,n){let r=this.querySelector(e);r&&r.classList.toggle(t,n)}setText(e,t){let n=this.querySelector(e);n&&(n.textContent=t)}async startPreview(){if(this.controller)try{await this.controller.startStream(),this.updateState({stream:this.controller.getStream()})}catch(e){this.updateState({error:i(e)})}}async handleRecord(){if(this.controller)try{await lm(this.controller,`camera`)}catch(e){this.updateState({error:i(e)})}}async handleStop(){if(this.controller)try{let e=await um(this.controller,this.isDemo,()=>{},()=>{});if(this.isDemo&&e)this.updateState({recordedBlob:e});else if(!this.isDemo&&e){if(!this.uploadService)throw Error(`Upload service not ready`);let t=await wd(e),n=`recording-${Date.now()}.mp4`;this.updateState({uploadProgress:0});try{let r=await this.uploadService.uploadVideo(e,{apiKey:this.config.apiKey||``,backendUrl:this.config.backendUrl||``,filename:n,duration:t,userMetadata:this.config.userMetadata,onProgress:e=>this.updateState({uploadProgress:e})});this.updateState({uploadProgress:null}),this.dispatchEvent(new CustomEvent(`upload-complete`,{detail:r}))}catch(e){throw this.updateState({uploadProgress:null}),e}}}catch(e){this.updateState({error:i(e)})}}handlePauseToggle(){this.controller&&(this.state.isPaused?fm(this.controller):dm(this.controller),this.updateState({isPaused:this.controller.isPaused()}))}handleDownload(){this.state.recordedBlob&&hm(this.state.recordedBlob)}handleMute(){this.controller&&(mm(this.controller),this.updateState({isMuted:this.controller.getIsMuted()}))}async handleSwitch(){if(!this.controller)return;let e=this.controller.getCurrentSourceType()===`camera`?`screen`:`camera`;try{await pm(this.controller,e)}catch(e){this.updateState({error:i(e)})}}setupEventListeners(){let e=(e,t)=>{let n=vm(this,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.querySelector(`#startCameraArea`);t&&t.addEventListener(`click`,()=>this.startPreview());let n=this.querySelector(`#btnSettings`),r=this.querySelector(`#settingsPanel`);n&&r&&n.addEventListener(`click`,()=>{r.classList.toggle(`vidtreo-active`),this.populateSettings()});let i=this.querySelector(`#btnSettingsBack`);i&&r&&i.addEventListener(`click`,()=>{}),this.setupSettingsListeners()}setupSettingsListeners(){let e=this.querySelector(`#btnCameraMenu`);e&&e.addEventListener(`click`,()=>this.navigateSettings(`camera`));let t=this.querySelector(`#btnMicMenu`);t&&t.addEventListener(`click`,()=>this.navigateSettings(`microphone`));let n=this.querySelector(`#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.querySelector(`#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.querySelector(`#settingsMain`),t=this.querySelector(`#cameraList`),n=this.querySelector(`#micList`),r=this.querySelector(`#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.querySelector(`.vidtreo-settings-title`),r=this.querySelector(`.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.querySelector(`.vidtreo-settings-title`),r=this.querySelector(`.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 a of t){let t=document.createElement(`button`);t.className=`vidtreo-device-option`,t.innerHTML=`
8613
+ `;function ym(e,t){return e.querySelector(t)}let bm=/^https?:\/\//i;function xm(e){return e?bm.test(e)?e:`https://${e}`:`https://core.vidtreo.com`}function Sm(e,t){let n={apiKey:e.getAttribute(`api-key`),backendUrl:xm(e.getAttribute(`backend-url`))},r=e.getAttribute(`countdown-duration`);if(r){let e=Number.parseInt(r,10);Number.isNaN(e)||(n.countdownDuration=e)}let a=e.getAttribute(`max-recording-time`);if(a){let e=Number.parseInt(a,10);Number.isNaN(e)||(n.maxRecordingTime=e)}let o=e.getAttribute(`user-metadata`);if(o)try{let e=JSON.parse(o);Object.assign(t,e),n.userMetadata=t}catch(e){throw Error(`Invalid user-metadata JSON: ${i(e)}`)}let s=e.getAttribute(`enable-source-switching`);n.enableSourceSwitching=s===null||s!==`false`;let c=e.getAttribute(`enable-mute`);n.enableMute=c===null||c!==`false`;let l=e.getAttribute(`enable-pause`);n.enablePause=l===null||l!==`false`;let u=e.getAttribute(`enable-device-change`);n.enableDeviceChange=u===null||u!==`false`;let d=e.getAttribute(`enable-tab-visibility-overlay`);return n.enableTabVisibilityOverlay=d!==null&&d!==`false`,n}function Cm(){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 wm={recordingState:`idle`,stream:null,isMuted:!1,isPaused:!1,error:null,countdown:null,timer:`00:00`,isFinishing:!1,uploadProgress:null,transitionMessage:null,recordedBlob:null,devices:{cameras:[],microphones:[],selectedCamera:null,selectedMic:null},configError:null};var Tm=class extends HTMLElement{constructor(...e){super(...e),this.controller=null,this.uploadService=null,this.state={...wm},this.config={},this.initialized=!1,this.isInitializing=!1,this.isProcessingBlob=!1,this.videoPreview=null,this.audioBarsContainer=null,this.audioContext=null,this.analyser=null,this.animationFrameId=null,this.settingsView=`main`,this.slideDirection=`none`}static{this.observedAttributes=[`api-key`,`backend-url`,`countdown-duration`,`max-recording-time`,`user-metadata`,`enable-source-switching`,`enable-mute`,`enable-pause`,`enable-device-change`,`enable-tab-visibility-overlay`,`demo`]}get isDemo(){return this.hasAttribute(`demo`)&&this.getAttribute(`demo`)!==`false`}connectedCallback(){this.innerHTML=vm(),this.init()}disconnectedCallback(){this.cleanup()}attributeChangedCallback(e,t,n){t!==n&&[`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=Sm(this,{});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 gm({apiKey:e,backendUrl:t})),this.controller=new wf(om(this));let n={...this.config};await this.controller.initialize(n),this.initialized=!0,this.updateState({configError:null}),this.videoPreview=ym(this,`#videoPreview`),this.audioBarsContainer=ym(this,`#audioLevelBars`),this.setupEventListeners(),Cm(),setTimeout(()=>this.startPreview(),100)}catch(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)}}cleanup(){this.controller&&=(this.controller.cleanup(),null),this.stopAudioAnalysis(),this.initialized=!1,this.state={...wm}}updateState(e){this.state={...this.state,...e},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.videoPreview&&(e?(this.videoPreview.srcObject=e,this.videoPreview.style.display=`block`,this.videoPreview.play().catch(console.error),this.startAudioAnalysis(e)):(this.videoPreview.srcObject=null,this.videoPreview.style.display=`none`,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){console.error(`Audio analysis setup failed`,e)}}stopAudioAnalysis(){this.animationFrameId&&=(cancelAnimationFrame(this.animationFrameId),null),this.audioContext&&=(this.audioContext.close(),null)}renderAudioBars(e){if(!this.audioBarsContainer)return;let t=[.8,1.2,.9],n=``;this.state.isMuted||t.forEach((t,r)=>{let i=Math.max(4,e*24*t);n+=`<div class="vidtreo-audio-level-bar" style="height: ${i}px;"></div>`}),this.audioBarsContainer.innerHTML=n}render(){this.renderPreviewSection(),this.renderIndicatorsSection(),this.renderButtonsSection(),this.renderStatusSection(),this.renderConfigError()}renderPreviewSection(){let e=this.state;this.toggleDisplay(`#startCameraArea`,!e.stream),this.toggleDisplay(`#videoPreview`,!!e.stream&&!e.transitionMessage),this.toggleClass(`#sourceTransitionOverlay`,`vidtreo-active`,!!e.transitionMessage),this.setText(`#transitionMessage`,e.transitionMessage||``)}renderIndicatorsSection(){let e=this.state,t=e.recordingState===`recording`||e.isPaused;this.toggleClass(`#countdownOverlay`,`vidtreo-active`,e.recordingState===`countdown`),this.setText(`#countdownNumber`,e.countdown?.toString()||``),this.toggleDisplay(`#recIndicatorTop`,t),this.toggleDisplay(`#recordingTimerRow`,t),this.setText(`#recordingTimer`,e.timer),this.toggleDisplay(`#audioLevelBars`,t),this.toggleDisplay(`#recordingControls`,!!e.stream)}renderButtonsSection(){let e=this.state,t=e.recordingState===`recording`||e.isPaused;this.toggleDisplay(`#btnSettings`,!t&&this.config.enableDeviceChange!==!1),this.toggleDisplay(`#btnRecord`,e.recordingState===`idle`),this.toggleDisplay(`#btnMute`,t&&this.config.enableMute!==!1),this.toggleDisplay(`#btnStop`,t),this.toggleDisplay(`#btnSwitchSource`,t&&this.config.enableSourceSwitching!==!1),this.renderPauseButton(t),this.renderMuteButton();let n=this.isDemo&&!t&&e.recordingState===`idle`&&e.recordedBlob!==null;this.toggleDisplay(`#btnDownload`,n)}renderPauseButton(e){let t=this.state,n=ym(this,`#btnPause`),r=this.querySelector(`#iconPause`);n&&(t.isPaused?(n.title=`Resume`,r&&(r.className=`ph-fill ph-play`)):(n.title=`Pause`,r&&(r.className=`ph-fill ph-pause`)),n.style.display=e&&this.config.enablePause!==!1?`inline-flex`:`none`)}renderMuteButton(){let e=this.state,t=ym(this,`#btnMute`),n=this.querySelector(`#iconMute`);t&&(n&&(n.className=e.isMuted?`ph-fill ph-microphone-slash`:`ph-fill ph-microphone`),t.classList.toggle(`vidtreo-muted`,e.isMuted))}renderStatusSection(){let e=this.state;if(this.toggleDisplay(`#error`,!!e.error),this.setText(`#error`,e.error||``),this.renderUploadStatus(),e.recordingState!==`idle`){let e=this.querySelector(`#settingsPanel`);e&&e.classList.remove(`vidtreo-active`)}}renderUploadStatus(){let e=this.state;this.toggleDisplay(`#finishingProgress`,e.isFinishing),this.toggleDisplay(`#uploadProgress`,e.uploadProgress!==null&&!e.isFinishing);let t=this.querySelector(`#uploadProgressFill`);t&&e.uploadProgress!==null&&(t.style.width=`${Math.round(e.uploadProgress*100)}%`);let n=this.querySelector(`#uploadProgressText`);n&&e.uploadProgress!==null&&(n.textContent=`${n.textContent?.split(` `)[0]||`Uploading...`} ${Math.round(e.uploadProgress*100)}%`)}toggleDisplay(e,t){let n=this.querySelector(e);if(n)if(t){let t=n.tagName===`BUTTON`,r=e.includes(`row`)||e.includes(`controls`)||e.includes(`Overlay`)||e.includes(`Indicator`)||e.includes(`Timer`)||e.includes(`Bars`);t?n.style.display=`inline-flex`:r?n.style.display=`flex`:n.style.display=`block`}else n.style.display=`none`}toggleClass(e,t,n){let r=this.querySelector(e);r&&r.classList.toggle(t,n)}setText(e,t){let n=this.querySelector(e);n&&(n.textContent=t)}async startPreview(){if(this.controller)try{await this.controller.startStream(),this.updateState({stream:this.controller.getStream()})}catch(e){this.updateState({error:i(e)})}}async handleRecord(){if(this.controller)try{await lm(this.controller,`camera`)}catch(e){this.updateState({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`);this.updateState({isFinishing:!0});let t=await wd(e),n=`recording-${Date.now()}.mp4`;try{let r=await this.uploadService.uploadVideo(e,{apiKey:this.config.apiKey||``,backendUrl:this.config.backendUrl||``,filename:n,duration:t,userMetadata:this.config.userMetadata,onProgress:e=>{this.updateState({isFinishing:!1,uploadProgress:e})}});this.updateState({isFinishing:!1,uploadProgress:null}),this.dispatchEvent(new CustomEvent(`upload-complete`,{detail:r}))}catch(e){throw this.updateState({isFinishing:!1,uploadProgress:null}),e}}finally{this.isProcessingBlob=!1}}}async handleStop(){if(this.controller)try{let e=await um(this.controller,this.isDemo,()=>{},()=>{});e&&await this.processRecordingBlob(e)}catch(e){this.updateState({error:i(e)})}}handlePauseToggle(){this.controller&&(this.state.isPaused?fm(this.controller):dm(this.controller),this.updateState({isPaused:this.controller.isPaused()}))}handleDownload(){this.state.recordedBlob&&hm(this.state.recordedBlob)}handleMute(){this.controller&&(mm(this.controller),this.updateState({isMuted:this.controller.getIsMuted()}))}async handleSwitch(){if(!this.controller)return;let e=this.controller.getCurrentSourceType()===`camera`?`screen`:`camera`;try{await pm(this.controller,e)}catch(e){this.updateState({error:i(e)})}}setupEventListeners(){let e=(e,t)=>{let n=ym(this,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.querySelector(`#startCameraArea`);t&&t.addEventListener(`click`,()=>this.startPreview());let n=this.querySelector(`#btnSettings`),r=this.querySelector(`#settingsPanel`);n&&r&&n.addEventListener(`click`,()=>{r.classList.toggle(`vidtreo-active`),this.populateSettings()});let i=this.querySelector(`#btnSettingsBack`);i&&r&&i.addEventListener(`click`,()=>{}),this.setupSettingsListeners()}setupSettingsListeners(){let e=this.querySelector(`#btnCameraMenu`);e&&e.addEventListener(`click`,()=>this.navigateSettings(`camera`));let t=this.querySelector(`#btnMicMenu`);t&&t.addEventListener(`click`,()=>this.navigateSettings(`microphone`));let n=this.querySelector(`#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.querySelector(`#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.querySelector(`#settingsMain`),t=this.querySelector(`#cameraList`),n=this.querySelector(`#micList`),r=this.querySelector(`#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.querySelector(`.vidtreo-settings-title`),r=this.querySelector(`.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.querySelector(`.vidtreo-settings-title`),r=this.querySelector(`.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 a of t){let t=document.createElement(`button`);t.className=`vidtreo-device-option`,t.innerHTML=`
8613
8614
  <div class="vidtreo-device-option-check-container">${a.deviceId===n?`<i class="ph-fill ph-check vidtreo-device-checkmark" style="display: flex; font-size: 20px;"></i>`:`<span class="vidtreo-device-checkmark-placeholder"></span>`}</div>
8614
8615
  <span class="vidtreo-device-option-label">${a.label||`Device ${a.deviceId.slice(0,8)}`}</span>
8615
- `,t.onclick=()=>{this.controller&&(r===`camera`?sm(this.controller,a.deviceId).then(e=>this.updateState({stream:e})).catch(e=>this.updateState({error:i(e)})):cm(this.controller,a.deviceId).then(e=>this.updateState({stream:e})).catch(e=>this.updateState({error:i(e)})),r===`camera`&&(this.state.devices.selectedCamera=a.deviceId),r===`mic`&&(this.state.devices.selectedMic=a.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`,wm),e.VidtreoRecorder=wm,e})({});
8616
+ `,t.onclick=()=>{this.controller&&(r===`camera`?sm(this.controller,a.deviceId).then(e=>this.updateState({stream:e})).catch(e=>this.updateState({error:i(e)})):cm(this.controller,a.deviceId).then(e=>this.updateState({stream:e})).catch(e=>this.updateState({error:i(e)})),r===`camera`&&(this.state.devices.selectedCamera=a.deviceId),r===`mic`&&(this.state.devices.selectedMic=a.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`,Tm),e.VidtreoRecorder=Tm,e})({});
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vidtreo/recorder-wc",
3
- "version": "0.9.8",
3
+ "version": "1.0.0-rc1",
4
4
  "type": "module",
5
5
  "description": "Web component for @vidtreo/recorder - video recording SDK",
6
6
  "main": "./dist/vidtreo-recorder.js",
@@ -27,7 +27,7 @@
27
27
  "author": "cfonseca@vidtreo.com",
28
28
  "license": "MIT",
29
29
  "peerDependencies": {
30
- "@vidtreo/recorder": ">=0.9.8"
30
+ "@vidtreo/recorder": ">=1.0.0-rc1"
31
31
  },
32
32
  "devDependencies": {
33
33
  "@types/node": "^24.10.1",