UNPKG

@salutejs/jazz-sdk-web-plugins

Version:

Jazz SDK plugins

1 lines 230 kB
import{token as e,injectableClass as t,injectable as o,bindModule as n,bindModules as r}from"ditox";import{resolveServerUrl as i,getRequestConfig as s,HttpClientFetchError as a,failure as c,parseHttpErrorResponse as d,HttpClientResponseError as u,success as l,declareRuntimeModule as p,JAZZ_CLIENT_CONTEXT_TOKEN as f,isSuccess as v,isHttpClientFetchError as m,isFailure as g,NEXT_FLAGS_TOKEN as b,JazzRoomConnectionTokens as y,JAZZ_ROOM_CONTEXT_TOKEN as h,createModule as S,JAZZ_SDK_CONTEXT_TOKEN as k,createHooks as E,createKeyQueue as M,toQueryAtom as R,releaseMediaStream as w,filterByType as C,createEventBus as I,declareConfigFlags as T,declareStringFlag as O,declareBooleanFlag as P,declareNumberFlag as _,declareFlagsModule as A,USER_MEDIA_TYPE as x,DEBUG_STATE_REGISTRY_TOKEN as j,getBrowserName as V,getChromiumVersion as D,getDisplayEndpoints as L,isMediaOutEvent as z,filterRtcEvent as $,VC_CORE_PERFORMANCE_MARKS as G,COLLECT_METRICS_MARKS as N,JazzVcsSdkTokens as q,NEXT_CONNECTION_SERVICE_TOKEN as U,makeAsyncRequestFactory as B,mapFailure as F,mapSuccess as H,TransportResponseTimeoutError as W,TransportClosedError as J,TransportNotConnectedError as Q,JAZZ_CLIENT_TOKEN as K,JAZZ_ROOM_TOKEN as X}from"@salutejs/jazz-sdk-web";import{declareController as Y}from"nrgy/mvc";import{switchMap as Z,map as ee,catchError as te,of as oe,firstValueFrom as ne,filter as re,EMPTY as ie,from as se,tap as ae,fromEvent as ce,merge as de,interval as ue,take as le,skip as pe,timer as fe,debounceTime as ve,Observable as me,buffer as ge,fromEventPattern as be,combineLatest as ye,startWith as he,distinctUntilChanged as Se,noop as ke,mergeMap as Ee,scan as Me,Subject as Re,withLatestFrom as we,throwError as Ce,reduce as Ie,lastValueFrom as Te}from"rxjs";import{createScope as Oe,declareStore as Pe,createAction as _e}from"rx-effects";import{fromObservable as Ae,observe as xe}from"nrgy/rxjs";import{compute as je,createScope as Ve,signal as De,effect as Le,batch as ze}from"nrgy";import{fromQuery as $e,toQuery as Ge,toAction as Ne}from"nrgy/rx-effects";import{produce as qe,castDraft as Ue}from"immer";import{declareStateUpdates as Be,declareStore as Fe}from"nrgy/store";class He extends Error{constructor(e,t){super(t),this.code=e,this.name="ServerRecordingError",this.error=t}}const We={logger:e({key:"SERVER_RECORDING_LOGGER_TOKEN"})},Je={RoomRecordingServiceClient:e("RoomRecordingServiceClient"),InternalRoomRecordingServiceClient:e("InternalRoomRecordingServiceClient")},Qe={RecordRoomService:e({key:"SERVER_RECORDING_ROOM_SERVICE_TOKEN"})};function Ke(e,t,o,n){return new(o||(o=Promise))((function(r,i){function s(e){try{c(n.next(e))}catch(e){i(e)}}function a(e){try{c(n.throw(e))}catch(e){i(e)}}function c(e){var t;e.done?r(e.value):(t=e.value,t instanceof o?t:new o((function(e){e(t)}))).then(s,a)}c((n=n.apply(e,t||[])).next())}))}const Xe=Symbol.for("@ts-pattern/matcher"),Ye=Symbol.for("@ts-pattern/isVariadic"),Ze="@ts-pattern/anonymous-select-key",et=e=>Boolean(e&&"object"==typeof e),tt=e=>e&&!!e[Xe],ot=(e,t,o)=>{if(tt(e)){const n=e[Xe](),{matched:r,selections:i}=n.match(t);return r&&i&&Object.keys(i).forEach((e=>o(e,i[e]))),r}if(et(e)){if(!et(t))return!1;if(Array.isArray(e)){if(!Array.isArray(t))return!1;let n=[],r=[],i=[];for(const t of e.keys()){const o=e[t];tt(o)&&o[Ye]?i.push(o):i.length?r.push(o):n.push(o)}if(i.length){if(i.length>1)throw new Error("Pattern error: Using `...P.array(...)` several times in a single pattern is not allowed.");if(t.length<n.length+r.length)return!1;const e=t.slice(0,n.length),s=0===r.length?[]:t.slice(-r.length),a=t.slice(n.length,0===r.length?1/0:-r.length);return n.every(((t,n)=>ot(t,e[n],o)))&&r.every(((e,t)=>ot(e,s[t],o)))&&(0===i.length||ot(i[0],a,o))}return e.length===t.length&&e.every(((e,n)=>ot(e,t[n],o)))}return Reflect.ownKeys(e).every((n=>{const r=e[n];return(n in t||tt(i=r)&&"optional"===i[Xe]().matcherType)&&ot(r,t[n],o);var i}))}return Object.is(t,e)},nt=e=>{var t,o,n;return et(e)?tt(e)?null!=(t=null==(o=(n=e[Xe]()).getSelectionKeys)?void 0:o.call(n))?t:[]:Array.isArray(e)?rt(e,nt):rt(Object.values(e),nt):[]},rt=(e,t)=>e.reduce(((e,o)=>e.concat(t(o))),[]);function it(...e){if(1===e.length){const[t]=e;return e=>ot(t,e,(()=>{}))}if(2===e.length){const[t,o]=e;return ot(t,o,(()=>{}))}throw new Error(`isMatching wasn't given the right number of arguments: expected 1 or 2, received ${e.length}.`)}function st(e){return Object.assign(e,{optional:()=>ct(e),and:t=>lt(e,t),or:t=>pt(e,t),select:t=>void 0===t?vt(e):vt(t,e)})}function at(e){return Object.assign((e=>Object.assign(e,{[Symbol.iterator](){let t=0;const o=[{value:Object.assign(e,{[Ye]:!0}),done:!1},{done:!0,value:void 0}];return{next:()=>{var e;return null!=(e=o[t++])?e:o.at(-1)}}}}))(e),{optional:()=>at(ct(e)),select:t=>at(void 0===t?vt(e):vt(t,e))})}function ct(e){return st({[Xe]:()=>({match:t=>{let o={};const n=(e,t)=>{o[e]=t};return void 0===t?(nt(e).forEach((e=>n(e,void 0))),{matched:!0,selections:o}):{matched:ot(e,t,n),selections:o}},getSelectionKeys:()=>nt(e),matcherType:"optional"})})}const dt=(e,t)=>{for(const o of e)if(!t(o))return!1;return!0},ut=(e,t)=>{for(const[o,n]of e.entries())if(!t(n,o))return!1;return!0};function lt(...e){return st({[Xe]:()=>({match:t=>{let o={};const n=(e,t)=>{o[e]=t};return{matched:e.every((e=>ot(e,t,n))),selections:o}},getSelectionKeys:()=>rt(e,nt),matcherType:"and"})})}function pt(...e){return st({[Xe]:()=>({match:t=>{let o={};const n=(e,t)=>{o[e]=t};return rt(e,nt).forEach((e=>n(e,void 0))),{matched:e.some((e=>ot(e,t,n))),selections:o}},getSelectionKeys:()=>rt(e,nt),matcherType:"or"})})}function ft(e){return{[Xe]:()=>({match:t=>({matched:Boolean(e(t))})})}}function vt(...e){const t="string"==typeof e[0]?e[0]:void 0,o=2===e.length?e[1]:"string"==typeof e[0]?void 0:e[0];return st({[Xe]:()=>({match:e=>{let n={[null!=t?t:Ze]:e};return{matched:void 0===o||ot(o,e,((e,t)=>{n[e]=t})),selections:n}},getSelectionKeys:()=>[null!=t?t:Ze].concat(void 0===o?[]:nt(o))})})}function mt(e){return"number"==typeof e}function gt(e){return"string"==typeof e}function bt(e){return"bigint"==typeof e}const yt=st(ft((function(e){return!0}))),ht=yt,St=e=>Object.assign(st(e),{startsWith:t=>{return St(lt(e,(o=t,ft((e=>gt(e)&&e.startsWith(o))))));var o},endsWith:t=>{return St(lt(e,(o=t,ft((e=>gt(e)&&e.endsWith(o))))));var o},minLength:t=>St(lt(e,(e=>ft((t=>gt(t)&&t.length>=e)))(t))),length:t=>St(lt(e,(e=>ft((t=>gt(t)&&t.length===e)))(t))),maxLength:t=>St(lt(e,(e=>ft((t=>gt(t)&&t.length<=e)))(t))),includes:t=>{return St(lt(e,(o=t,ft((e=>gt(e)&&e.includes(o))))));var o},regex:t=>{return St(lt(e,(o=t,ft((e=>gt(e)&&Boolean(e.match(o)))))));var o}}),kt=St(ft(gt)),Et=e=>Object.assign(st(e),{between:(t,o)=>Et(lt(e,((e,t)=>ft((o=>mt(o)&&e<=o&&t>=o)))(t,o))),lt:t=>Et(lt(e,(e=>ft((t=>mt(t)&&t<e)))(t))),gt:t=>Et(lt(e,(e=>ft((t=>mt(t)&&t>e)))(t))),lte:t=>Et(lt(e,(e=>ft((t=>mt(t)&&t<=e)))(t))),gte:t=>Et(lt(e,(e=>ft((t=>mt(t)&&t>=e)))(t))),int:()=>Et(lt(e,ft((e=>mt(e)&&Number.isInteger(e))))),finite:()=>Et(lt(e,ft((e=>mt(e)&&Number.isFinite(e))))),positive:()=>Et(lt(e,ft((e=>mt(e)&&e>0)))),negative:()=>Et(lt(e,ft((e=>mt(e)&&e<0))))}),Mt=Et(ft(mt)),Rt=e=>Object.assign(st(e),{between:(t,o)=>Rt(lt(e,((e,t)=>ft((o=>bt(o)&&e<=o&&t>=o)))(t,o))),lt:t=>Rt(lt(e,(e=>ft((t=>bt(t)&&t<e)))(t))),gt:t=>Rt(lt(e,(e=>ft((t=>bt(t)&&t>e)))(t))),lte:t=>Rt(lt(e,(e=>ft((t=>bt(t)&&t<=e)))(t))),gte:t=>Rt(lt(e,(e=>ft((t=>bt(t)&&t>=e)))(t))),positive:()=>Rt(lt(e,ft((e=>bt(e)&&e>0)))),negative:()=>Rt(lt(e,ft((e=>bt(e)&&e<0))))}),wt=Rt(ft(bt)),Ct=st(ft((function(e){return"boolean"==typeof e}))),It=st(ft((function(e){return"symbol"==typeof e}))),Tt=st(ft((function(e){return null==e}))),Ot=st(ft((function(e){return null!=e})));var Pt={__proto__:null,matcher:Xe,optional:ct,array:function(...e){return at({[Xe]:()=>({match:t=>{if(!Array.isArray(t))return{matched:!1};if(0===e.length)return{matched:!0};const o=e[0];let n={};if(0===t.length)return nt(o).forEach((e=>{n[e]=[]})),{matched:!0,selections:n};const r=(e,t)=>{n[e]=(n[e]||[]).concat([t])};return{matched:t.every((e=>ot(o,e,r))),selections:n}},getSelectionKeys:()=>0===e.length?[]:nt(e[0])})})},set:function(...e){return st({[Xe]:()=>({match:t=>{if(!(t instanceof Set))return{matched:!1};let o={};if(0===t.size)return{matched:!0,selections:o};if(0===e.length)return{matched:!0};const n=(e,t)=>{o[e]=(o[e]||[]).concat([t])},r=e[0];return{matched:dt(t,(e=>ot(r,e,n))),selections:o}},getSelectionKeys:()=>0===e.length?[]:nt(e[0])})})},map:function(...e){return st({[Xe]:()=>({match:t=>{if(!(t instanceof Map))return{matched:!1};let o={};if(0===t.size)return{matched:!0,selections:o};const n=(e,t)=>{o[e]=(o[e]||[]).concat([t])};if(0===e.length)return{matched:!0};var r;if(1===e.length)throw new Error(`\`P.map\` wasn't given enough arguments. Expected (key, value), received ${null==(r=e[0])?void 0:r.toString()}`);const[i,s]=e;return{matched:ut(t,((e,t)=>{const o=ot(i,t,n),r=ot(s,e,n);return o&&r})),selections:o}},getSelectionKeys:()=>0===e.length?[]:[...nt(e[0]),...nt(e[1])]})})},intersection:lt,union:pt,not:function(e){return st({[Xe]:()=>({match:t=>({matched:!ot(e,t,(()=>{}))}),getSelectionKeys:()=>[],matcherType:"not"})})},when:ft,select:vt,any:yt,_:ht,string:kt,number:Mt,bigint:wt,boolean:Ct,symbol:It,nullish:Tt,nonNullable:Ot,instanceOf:function(e){return st(ft(function(e){return t=>t instanceof e}(e)))},shape:function(e){return st(ft(it(e)))}};const _t={id:Pt.number,publicId:Pt.optional(Pt.string),title:Pt.string,createdAt:Pt.string,durationSeconds:Pt.number,sizeMb:Pt.optional(Pt.number),publicAccess:Pt.optional(Pt.boolean),watchUrl:Pt.optional(Pt.union(Pt.nullish,Pt.string)),downloadUrl:Pt.optional(Pt.string),permissions:Pt.optional({canTogglePublicAccess:Pt.boolean})},At={totalPages:Pt.number,records:Pt.array(_t),pageSize:Pt.optional(Pt.number),pageNumber:Pt.optional(Pt.number)},xt={usedMb:Pt.number,availableMb:Pt.optional(Pt.number),capacityMb:Pt.number};function jt(e){var t,o;return Object.assign(Object.assign({},e),{permissions:{canTogglePublicAccess:null!==(o=null===(t=e.permissions)||void 0===t?void 0:t.canTogglePublicAccess)&&void 0!==o&&o}})}const Vt=p({factory:t(Y().params().apply((({params:e})=>{const{jazzClientContext:t}=e,o=function(e){const{httpClient:t,endpoints:o,apiScheduler:n,retryBackoff:r}=e;return{getVideoStorage:e=>{const a=i(e,o).pipe(Z((o=>{const n=`${o}/video/storage`;return t.get({url:n,requestConfig:s(e)})})));return n.scheduleHttpRequest(a,{retryBackoff:r}).pipe(ee((e=>{if(it(xt,e.data))return e.data;throw new Error("Incorrect format of the server response [/video/storage]")})))},startVideoRecord:(e,p)=>{const f=i(p,o).pipe(Z((o=>{const n=`${o}/video/record/start`;return t.post({url:n,body:{roomId:e},requestConfig:s(p)})})));return n.scheduleHttpRequest(f,{retryBackoff:r}).pipe(Z((()=>Ke(this,void 0,void 0,(function*(){return l(void 0)})))),te((e=>{if(e instanceof a)return oe(c(e));const t=d(e.data);let o;return o=403===e.status&&"STORAGE_QUOTA_EXCEEDED"===(null==t?void 0:t.code)?{type:"storageQuotaExceeded"}:{type:"clientError"},oe(c(new u(e.name,e,o)))})))},stopVideoRecord:(e,a)=>{const c=i(a,o).pipe(Z((o=>{const n=`${o}/video/record/stop`;return t.post({url:n,body:{roomId:e},requestConfig:s(a)})})));return n.scheduleHttpRequest(c,{retryBackoff:r}).pipe(ee((()=>{})))},getVideoFind:(e,a)=>{const c=i(a,o).pipe(Z((o=>{const n=`${o}/video/find?${new URLSearchParams(e).toString()}`;return t.get({url:n,requestConfig:s(a)})})));return n.scheduleHttpRequest(c,{retryBackoff:r}).pipe(ee((e=>{if(it(At,e.data))return Object.assign(Object.assign({},e.data),{records:e.data.records.map((e=>jt(e)))});throw new Error("Incorrect format of the server response [/video/find]")})))},getVideo:(e,a)=>{const c=i(a,o).pipe(Z((o=>{const n=`${o}/video/public/${e}`;return t.get({url:n,requestConfig:s(a)})})));return n.scheduleHttpRequest(c,{retryBackoff:r}).pipe(ee((e=>{if(it(_t,e.data))return jt(e.data);throw new Error("Incorrect format of the server response [/video/public]")})))},updateVideoTitle:(e,a,c)=>{const d=i(c,o).pipe(Z((o=>{const n=`${o}/video/${e}/update-title`;return t.post({url:n,body:{title:a},requestConfig:s(c)})})));return n.scheduleHttpRequest(d,{retryBackoff:r}).pipe(ee((()=>{})))},updateVideoPublicAccess:(e,a,c)=>{const d=i(c,o).pipe(Z((o=>{const n=`${o}/video/${e}/update-public-access`;return t.post({url:n,body:{publicAccess:a},requestConfig:s(c)})})));return n.scheduleHttpRequest(d,{retryBackoff:r}).pipe(ee((()=>{})))},deleteVideo:(e,a)=>{const c=i(a,o).pipe(Z((o=>{const n=`${o}/video/${e}/delete`;return t.post({url:n,requestConfig:s(a)})})));return n.scheduleHttpRequest(c,{retryBackoff:r}).pipe(ee((()=>{})))},getDownloadLink:(e,a)=>{const c=i(a,o).pipe(Z((o=>{const n=`${o}/video/public/contentUrl/${e}`;return t.get({url:n,responseType:"text",requestConfig:s(a)})})));return n.scheduleHttpRequest(c,{retryBackoff:r}).pipe(ee((({data:e})=>e)))},getS3DownloadLink:(e,a)=>{const c=i(a,o).pipe(Z((()=>t.get({url:e,responseType:"stream",requestConfig:s(a)}))));return n.scheduleHttpRequest(c,{retryBackoff:r}).pipe(ee((e=>{if(e.redirected)return e.originalResponse.url})))}}}({apiScheduler:t.apiScheduler,endpoints:t.endpoints,httpClient:t.httpClient,retryBackoff:t.retryBackoff}),n=function(e){return{getVideoStorage:()=>Ke(this,void 0,void 0,(function*(){return ne(e.getVideoStorage())})),startVideoRecord:t=>Ke(this,void 0,void 0,(function*(){return ne(e.startVideoRecord(t))})),stopVideoRecord:t=>Ke(this,void 0,void 0,(function*(){return ne(e.stopVideoRecord(t))})),getVideoFind:t=>Ke(this,void 0,void 0,(function*(){return ne(e.getVideoFind(t))})),getVideo:t=>Ke(this,void 0,void 0,(function*(){return ne(e.getVideo(t))})),updateVideoTitle:(t,o)=>Ke(this,void 0,void 0,(function*(){return ne(e.updateVideoTitle(t,o))})),updateVideoPublicAccess:(t,o)=>Ke(this,void 0,void 0,(function*(){return ne(e.updateVideoPublicAccess(t,o))})),deleteVideo:t=>Ke(this,void 0,void 0,(function*(){return ne(e.deleteVideo(t))})),getDownloadLink:t=>Ke(this,void 0,void 0,(function*(){return ne(e.getDownloadLink(t))})),getS3DownloadLink:t=>Ke(this,void 0,void 0,(function*(){return ne(e.getS3DownloadLink(t))}))}}(o);return{client:n,internalClient:o}})),{jazzClientContext:f,logger:We.logger}),exports:{client:Je.RoomRecordingServiceClient,internalClient:Je.InternalRoomRecordingServiceClient}}),Dt=Y().params().apply((({scope:e,params:t})=>{const{roomContext:o,roomRecordingServiceClient:n,status:r,logger:i}=t,{roomServerEvents$:s}=o,a=i.getLogger("next"),c=e.signal();return e.effect(Ae(s),(e=>{if(e)switch(e.type){case"serverVideoRecordStarted":{const{payload:{videoRecordOwnerId:t}}=e;r.set("recording"),c({type:"serverRecordStarted"}),a.debug(`Recording was started by ${t}`);break}case"serverVideoRecordStopped":{const{payload:{videoRecordOwnerId:t,reason:o}}=e,n="manual"===o||"STOP_MANUALLY"===o?"STOP_MANUALLY":"DURATION_LIMIT_EXCEEDED";r.set("inactive"),c({type:"serverRecordStopped",payload:{reason:n}}),a.debug(`Recording was stopped by ${t}, reason ${o}`);break}case"serverVideoRecordAutoStartError":{const{payload:{error:t}}=e;r.set("inactive"),c({type:"serverRecordAutoStartError",payload:{error:t}}),a.error("Auto-start recording failed",t);break}}})),{events:c,startServerRecording:function(){return Ke(this,void 0,void 0,(function*(){try{const e=o.room.params.conferenceId;if(!e)throw new Error("Room not initialize for start server record");r.set("processStarting");const t=yield n.startVideoRecord(e);if(v(t))return;throw r.set("inactive"),t.error&&"data"in t.error&&"storageQuotaExceeded"===t.error.data.type?(c({type:"serverRecordStartError",payload:{error:"storageCapacityExceeded"}}),new He("VIDEO_RECORD_STORAGE_CAPACITY_EXCEEDED")):m(t.error)?new He("NETWORK_ERROR"):(t.error instanceof u||c({type:"serverRecordStartError"}),new He("VIDEO_RECORD_START_ERROR"))}catch(e){throw a.error("fail start server record",e),c({type:"serverRecordStartError"}),new He("VIDEO_RECORD_START_ERROR")}}))},stopServerRecording:function(){return Ke(this,void 0,void 0,(function*(){try{const e=o.room.params.conferenceId;if(!e)throw new He("VIDEO_RECORD_STOP_ERROR","Room not initialize for stop server record");r.set("processStopping"),yield n.stopVideoRecord(e)}catch(e){throw a.error("fail stop server record",e),r.set("recording"),c({type:"serverRecordStopError"}),new He("VIDEO_RECORD_STOP_ERROR")}}))}}})),Lt={"video-record-started":!0,"video-record-stopped":!0,"video-record-uploaded":!0,"video-record-error":!0};const zt=Y().params().apply((({scope:e,params:t})=>{const{roomConnection:o,status:n,logger:r}=t,i=r.getLogger("next"),s=e.signal();return e.effect(Ae(o.event$),(e=>{if(e&&function(e){return e.event in Lt}(e))switch(i.info("connection event",e.event,e.payload),e.event){case"video-record-started":n.set("recording"),s({type:"serverRecordStarted"});break;case"video-record-stopped":n.set("inactive"),s({type:"serverRecordStopped",payload:{reason:e.payload.reason}});break;case"video-record-uploaded":s({type:"serverRecordUploaded"});break;case"video-record-error":switch(n.set("inactive"),e.payload.code){case"START_ERROR":throw s({type:"serverRecordStartError"}),new He("START_ERROR");case"UPLOAD_ERROR":throw s({type:"serverRecordUploadedError"}),new He("UPLOAD_ERROR");case"RECORD_ERROR":throw s({type:"serverRecordError"}),new He("RECORD_ERROR");case"AUTOSTART_ERROR":throw s({type:"serverRecordAutoStartError"}),new He("AUTOSTART_ERROR")}}})),{events:s,startServerRecording:function(){return Ke(this,void 0,void 0,(function*(){n.set("processStarting");const e=yield ne(o.request({event:"start-video-record"}).pipe(re((e=>g(e)||v(e)))));if("failure"===e.type){switch(n.set("inactive"),i.error("Fail start video record",e.error.code,e.error.message),e.error.code){case"FORBIDDEN":throw s({type:"serverRecordStartError",payload:{error:"forbidden"}}),new He("FORBIDDEN");case"VIDEO_RECORD_ALREADY_STARTED":throw s({type:"serverRecordStartError",payload:{error:"alreadyStarted"}}),new He("VIDEO_RECORD_ALREADY_STARTED");case"VIDEO_RECORD_STORAGE_CAPACITY_EXCEEDED":throw s({type:"serverRecordStartError",payload:{error:"storageCapacityExceeded"}}),new He("VIDEO_RECORD_STORAGE_CAPACITY_EXCEEDED");case"VIDEO_RECORD_START_ERROR":throw s({type:"serverRecordStartError"}),new He("VIDEO_RECORD_START_ERROR")}s({type:"serverRecordStartError"})}}))},stopServerRecording:function(){return Ke(this,void 0,void 0,(function*(){n.set("processStopping");const e=yield ne(o.request({event:"stop-video-record"}).pipe(re((e=>g(e)||v(e)))));if("failure"===e.type){switch(i.error("Fail stop video record",e.error.code,e.error.message),n.set("recording"),e.error.code){case"FORBIDDEN":throw s({type:"serverRecordStopError",payload:{error:"forbidden"}}),new He("FORBIDDEN");case"VIDEO_RECORD_STOP_ERROR":throw s({type:"serverRecordStopError"}),new He("VIDEO_RECORD_STOP_ERROR");case"VIDEO_RECORD_NOT_STARTED":throw s({type:"serverRecordStopError",payload:{error:"notStarted"}}),new He("VIDEO_RECORD_NOT_STARTED")}s({type:"serverRecordStopError"})}}))}}})),$t=Y().params().apply((({scope:e,params:t})=>{const{authQueries:o,roomContext:n}=t,{$userInfo:r}=o,i=e.add($e(r)),{userPermissions:s}=n.room,a=e.add($e(s));return{canManageServerRecordList:je((()=>{const e=i();if(!e)return!1;const{features:t}=e,{serverVideoRecordAvailable:o}=null!=t?t:{};return null!=o&&o})),canManageServerRecord:je((()=>{const e=a();return void 0!==e&&e.canStartServerVideoRecord}))}})),Gt=p({factory:t(Y().params().apply((({scope:e,params:t})=>{const{clientContext:o,roomContext:n,roomConnection:r,roomRecordingServiceClient:i,nextFlags:s,logger:a}=t,c=e.atom("pending"),d=a.getLogger(`room[${n.room.params.conferenceId}]`),u=Oe();e.onDestroy((()=>u.destroy()));const l=e.atom(!1),p=e.atom("inactive"),f=e.signal();e.onDestroy((()=>p.set("inactive")));const v=e.add(new $t({authQueries:o.authQueries,roomContext:n}));let m;const g=e.effect(r.isNext,(t=>{if(void 0!==t){if(g.destroy(),t){const t=e.add(new zt({roomConnection:r,status:p,logger:d})),o=s.get();c.set(o.supportedServerRecordingInNextRoom?"supported":"unsupported"),e.effect(t.events,f),m=t}else{const t=e.add(new Dt({roomContext:n,roomRecordingServiceClient:i,status:p,logger:d}));e.effect(t.events,f),m=t,c.set("supported")}l.set(!0)}}));return{service:{serverSupportedStatus:c,isReady:l,events:f,status:p,canManageServerRecordList:v.canManageServerRecordList,canManageServerRecord:v.canManageServerRecord,startServerRecording:function(){return Ke(this,void 0,void 0,(function*(){if("supported"===c()){if(m)return m.startServerRecording();d.error("Server recording service is not initialize")}else d.error("Server recording service is disabled")}))},stopServerRecording:function(){return Ke(this,void 0,void 0,(function*(){if("supported"===c()){if(m)return m.stopServerRecording();d.error("Server recording service is not initialize")}else d.error("Server recording service is disabled")}))}}}})),{clientContext:f,roomContext:h,roomConnection:y.Connection,roomRecordingServiceClient:Je.RoomRecordingServiceClient,nextFlags:b,logger:We.logger}),exports:{service:Qe.RecordRoomService}}),Nt=Y().params().apply((({params:e})=>{const{deps:{sdkContext:t}}=e,{moduleManager:o}=t,n=t.logger.getLogger("serverRecordingPlugin");return o.registerModule("addRoom",Gt),o.registerModule("addClient",Vt),{logger:n}}));function qt(){return Ke(this,void 0,void 0,(function*(){return S({name:"serverRecordingPlugin",imports:{sdkContext:k},factory:e=>new Nt(e),exports:{logger:We.logger}})}))}const Ut=e=>e.container.resolve(Qe.RecordRoomService),Bt=e=>e.container.resolve(Je.RoomRecordingServiceClient),Ft=e=>({requestAdapter:t=>Object.assign(Object.assign({},t),{roomSettings:Object.assign(Object.assign({},t.roomSettings),{serverVideoRecordAutoStartEnabled:e.enabled})})});function Ht(e){return{enabled:e.enabled,id:e.id,kind:e.kind,label:e.label,muted:e.muted,readyState:e.readyState}}function Wt(e){const t=e.getAudioTracks()[0];return!(!t||"ended"===t.readyState)}function Jt(){return"setSinkId"in AudioContext.prototype}const Qt=Y().params().apply((({scope:e,params:t})=>{const{userInteraction:o,logger:n}=t,r=n.getLogger("AudioCore"),i=e.atom(!0),s=e.signal(),a=new AudioContext({latencyHint:"interactive"}),c="running"===a.state,d=e.atom(c),u=new Set,{destroy:l,hooks:p}=E(["startAudio","startedAudio","stopAudio","stoppedAudio"]);e.onDestroy(l);let f=!1;const v=o.detectUserInteraction(),m=e.add(M());function g(){return Ke(this,void 0,void 0,(function*(){m.deleteKey("stopAudio"),yield m.add({key:"startAudio",cb:b}),d()||d.set(!0)}))}function b(){return Ke(this,void 0,void 0,(function*(){f||(f=!0,s({type:"startAudio"}),yield p.startAudio.exec(),r.debug("AudioContext",{state:a.state,baseLatency:a.baseLatency,sampleRate:a.sampleRate}),i.set("suspended"===a.state),"suspended"===a.state&&(yield S()),s({type:"startedAudio"}),yield p.startedAudio.exec(),r.debug("Started audio processes"))}))}e.onDestroy((()=>{u.clear(),"closed"!==a.state&&a.close()})),e.add(v.pipe(Z((()=>d()?ie:se(g()))),ae((()=>{d.set(!0),0===u.size&&k()}))).subscribe()),c&&g();let y=!1;function h(){return Ke(this,void 0,void 0,(function*(){const{state:e}=a;if("interrupted"===e&&(r.debug("Resume interrupted context"),S()),function(){var e,t;const o=(null===(t=null===(e=window.navigator)||void 0===e?void 0:e.userAgentData)||void 0===t?void 0:t.platform)||window.navigator.platform;return["iPhone","iPad","iPod"].includes(o)||navigator.userAgent.includes("Mac")&&navigator.maxTouchPoints>1}()&&"running"===e&&y)try{const e=yield navigator.mediaDevices.getUserMedia({audio:!0,video:!1});w(e),S()}catch(e){r.error("Failed restart audio play",e)}y="interrupted"===e}))}function S(){return Ke(this,void 0,void 0,(function*(){try{r.log("AudioContext resume start:",a.state),yield function(e,t){return new Promise((o=>{e.resume(),"running"===e.state&&o();const n=setInterval((()=>{e.resume(),"running"===e.state&&(clearInterval(n),o())}),t)}))}(a,1e3),r.log("AudioContext resume done:",a.state)}catch(e){r.error("Failed to resume the audio context",e)}i.set("suspended"===a.state)}))}function k(){return Ke(this,void 0,void 0,(function*(){m.deleteKey("startAudio"),yield m.add({key:"stopAudio",cb:()=>Ke(this,void 0,void 0,(function*(){f&&(f=!1,s({type:"stopAudio"}),yield p.stopAudio.exec(),yield a.suspend(),s({type:"stoppedAudio"}),yield p.stoppedAudio.exec(),r.debug("Stopped audio processes"))}))})}))}return e.add(ce(a,"statechange").subscribe((()=>{r.debug("AudioContext statechange",a.state),i.set("suspended"===a.state),f="running"===a.state,h()}))),{isSuspended:R(i),isReady:R(d),addUsage:e=>Ke(void 0,void 0,void 0,(function*(){r.debug("usage added",e),u.add(e),yield ne(xe(d).pipe(re(Boolean))),yield g()})),audioContext:a,event:s,hooks:p,removeUsage:e=>Ke(void 0,void 0,void 0,(function*(){r.debug("usage removed",e),u.delete(e),0===u.size&&(yield k())})),startAudio:g,stopAudio:k,setSinkId:e=>Ke(void 0,void 0,void 0,(function*(){Jt()?(yield a.setSinkId(e),"suspended"===a.state&&u.size>0&&(r.debug("Resume suspended but used context"),yield g())):r.warn("setSinkId not supported")}))}}));const Kt="audioLevel",Xt=Y().params().apply((({scope:e,params:t})=>{const{logger:o,audioCore:n,localTrackManager:r,audioLevelAnimationInterval:i}=t;let s,a,c=!1;const d=new WeakMap,u=e.add(M()),l=e.atom(new Map),p=e=>{if(!Wt(e))return void o.error("Stream has not lives MediaStreamTracks");if(l().has(e.id))return;const t=n.audioContext.createAnalyser();t.smoothingTimeConstant=.85,t.fftSize=1024;const r=t.frequencyBinCount,i=new Uint8Array(r);t.getByteTimeDomainData(i);const s=n.audioContext.createMediaStreamSource(e);s.connect(t);const a={analyser:t,bufferLength:r,dataArray:i,source:s,stream:e};l.update((t=>{const o=new Map(t);return o.set(e.id,a),o}))},f=e=>{const t=l().get(e.id);if(!t)return;t.source.disconnect(),l.update((t=>{const o=new Map(t);return o.delete(e.id),o}));const o=d.get(e);o&&o.setLevel(0)};e.effect(l,(e=>{0!==e.size?(u.deleteKey("stop"),u.add({key:"start",cb:v})):u.add({key:"stop",cb:g})}));function v(){return Ke(this,void 0,void 0,(function*(){c||(yield n.addUsage(Kt),c=!0,m())}))}function m(){i?a=setTimeout(m,i):s=requestAnimationFrame(m),l().forEach((({analyser:e,dataArray:t,bufferLength:o,stream:n})=>{const r=d.get(n);if(!r)return;e.getByteFrequencyData(t);let i=0;for(let e=0;e<o;e++)i+=t[e];const s=i/t.length,a=Math.min(s,100);r.setLevel(Math.round(a))}))}function g(){return Ke(this,void 0,void 0,(function*(){c&&(c=!1,n.removeUsage(Kt),s&&(cancelAnimationFrame(s),s=void 0),a&&(clearTimeout(a),a=void 0))}))}return e.onDestroy((()=>{l().forEach((({source:e})=>{e.disconnect()}))})),{addMediaStream:e=>{const t=d.get(e);if(p(e),!t){const t=Ve(),o=t.atom(0),n={isActive:R(je((()=>l().has(e.id)))),level:R(o)},i={audioLevel:n,setLevel:e=>{o()!==e&&o.set(e)},scope:t},s=t=>{"audio"===t.track.kind&&p(e)},a=t=>{"audio"===t.track.kind&&f(e)};return r.isLocalMediaStream(e)&&t.add(r.event$.pipe(C("muteTrackChanged")).subscribe((t=>{if(t.payload.stream.id===e.id){if(t.payload.isMuted)return void f(e);p(e)}}))),e.addEventListener("addtrack",s),e.addEventListener("removetrack",a),t.onDestroy((()=>{e.removeEventListener("addtrack",s),e.removeEventListener("removetrack",a)})),d.set(e,i),n}return t.audioLevel},removeMediaStream:e=>{var t;f(e),null===(t=d.get(e))||void 0===t||t.scope.destroy(),d.delete(e)}}})),Yt=2e3,Zt=6e4,eo=1,to=0,oo=10;var no,ro,io="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function so(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var ao=so(ro?no:(ro=1,no=function(){}));const co=["failed","disconnected"];const uo=function(){let e=0;return function(){return e+=1,e>=Number.MAX_SAFE_INTEGER&&(e=0),e}}();function lo(e){return Ke(this,void 0,void 0,(function*(){const{inputStream:t,onDisconnect:o,stunServer:n,mungeCandidates:r,logger:i,wakeupMonitor:s,pageVisibility:a}=e,c=i.getLogger("LoopbackConnection"),d=uo(),u=Oe(),l=new MediaStream;n&&c.debug(`Using a local stun server: ${n}`);const p=n?{iceServers:[{urls:`stun:${n}`}]}:void 0;let f,v,m;function g(){f&&(clearTimeout(f),f=void 0)}u.add((()=>{c.debug("Destroy",d),g(),null==v||v.close(),null==m||m.close()}));try{v=new RTCPeerConnection(p),m=new RTCPeerConnection(p)}catch(e){throw u.destroy(),e}if(!v||!m)throw new Error("Could not initialize connections");po(v,"sender-"+d,c),po(m,"receiver-"+d,c);const b=[],y=[];function h(e,t,o){return Ke(this,void 0,void 0,(function*(){if(c.debug(`${o}.icecandidate`,e.candidate),!e.candidate)return;if("closed"===t.iceConnectionState)return void c.debug("Target PC is closed, dropping candidate");const n="sender"===o?b:y;let i=e.candidate;if(r){const e=function(e,t){let o;if("host"!==e.type)return;if(!e.address||!e.priority)return;const n=e.address.startsWith("192.16");for(const r of t)"host"===r.type&&r.protocol===e.protocol&&(n?r.address&&!r.address.startsWith("192.16")&&r.priority&&e.priority<r.priority&&(o=r.priority+1):r.address&&r.address.startsWith("192.16")&&r.priority&&e.priority>r.priority&&(o=r.priority-1));if(o)for(;t.findIndex((e=>e.priority===o))>=0;)n?o+=1:o-=1;return o}(i,n);if(e&&i.priority){const t=i.toJSON();t.candidate&&(t.candidate=t.candidate.replace(i.priority.toString(),e.toString()),i=new RTCIceCandidate(t),c.debug("Changed candidate priority",i))}n.push(i)}try{yield t.addIceCandidate(i)}catch(e){c.error("Failed to add ICE candidate",e,i)}}))}v.addEventListener("icecandidate",(e=>{m&&h(e,m,"sender")})),m.addEventListener("icecandidate",(e=>{v&&h(e,v,"receiver")})),m.addEventListener("track",(e=>{l.getTracks().forEach((e=>{l.removeTrack(e)})),l.addTrack(e.track)})),t.getTracks().forEach((e=>{v&&v.addTrack(e)}));try{const e=yield v.createOffer({offerToReceiveAudio:!1,offerToReceiveVideo:!1});c.debug("Created offer",e),yield v.setLocalDescription(e),yield m.setRemoteDescription(e);const t=yield m.createAnswer();t.sdp&&(t.sdp=t.sdp.replace("useinbandfec=1","useinbandfec=1; stereo=1")),c.debug("Created answer",t),yield m.setLocalDescription(t),yield v.setRemoteDescription(t)}catch(e){throw c.error("Failed OA cycle",e),u.destroy(),e}const S=new Promise(((e,t)=>{if(!v)return;const o=e=>{g(),f=setTimeout((()=>{t(`Connection timed out on ${e}`)}),16e3)},n=()=>{const r=null==v?void 0:v.connectionState;r&&"connected"!==r&&"failed"!==r||(g(),null==v||v.removeEventListener("connectionstatechange",n)),"connected"===r&&e(),"failed"===r&&t("Connection failed"),"connecting"!==r&&"new"!==r||o(r)};v.addEventListener("connectionstatechange",n),o("new")}));try{yield S}catch(e){throw u.destroy(),e}if(o){const e=de(ue(2e3),Ge(a.isVisible).value$.pipe(re(Boolean)),s.event$.pipe(C("wakeup")));u.handle(e.pipe(ee((()=>null==v?void 0:v.connectionState)),re(Boolean),re((e=>co.includes(e))),le(1)),(e=>{o(e,d),u.destroy()}))}return function(e,t){Ke(this,void 0,void 0,(function*(){const o=yield e.getStats();let n=null;for(const[e,t]of o)if("transport"===t.type){n=t.selectedCandidatePairId;break}if(!n)return void t.debug("No selectedPairId in connection stats");let r=o.get(n);if(!r)for(const[e,t]of o)if("candidate-pair"===t.type&&t.selected){r=t;break}if(r)for(const[e,n]of o)e!==r.localCandidateId&&e!==r.remoteCandidateId||t.debug("Selected candidate",n);else t.debug("No candidatePair in connection stats")}))}(v,c),{id:d,stream:l,destroy:u.destroy}}))}function po(e,t,o){e.addEventListener("iceconnectionstatechange",(()=>o.debug(`${t}.iceconnectionstatechange: ${e.iceConnectionState}`))),e.addEventListener("icecandidateerror",(e=>o.error(`${t}.icecandidateerror`,e)))}function fo(e){return e>=0&&e<=10}const vo="audioMixer";function mo(e){const{flags:t,debugStateRegistry:o,logger:n,coreMetrics:r,userInteraction:i,wakeupMonitor:s,pageVisibility:a,loopbackEnabled:c,forceDestinationPipeline:d,audioCore:u}=e;let{outputGain:l=eo}=e;const p=Oe(),f=Ve();p.add((()=>f.destroy()));const v=n.getLogger("WebAudioMixer"),m=I();fo(l)||(v.debug("The output gain should be in the range from 0 to 10"),l=eo);const g=p.createStore(l);let b;const y=p.createStore(!1),h=new Map;let S,k,E,M,R=ao;const w=Jt();let C,T=w&&!c;d&&(T=!0);let O=null;var P;function _(){return Ke(this,void 0,void 0,(function*(){yield u.addUsage(vo)}))}let A,x;function j(){null==A||A.unsubscribe(),A=void 0}function V(){return Ke(this,void 0,void 0,(function*(){if(T)v.debug("Skip play master due destination pipeline");else if(O){v.debug("Will play master audio"),j();try{O.load(),yield O.play()}catch(e){v.error("Failed to play output element, will retry on next interaction",e),A=i.detectUserInteraction().subscribe((()=>{V()}))}}else v.error("masterOutputElement is not initialized")}))}v.debug("Init controller",{isDestinationPipeline:T,loopbackEnabled:c,isContextSetSinkIdSupported:w}),C=u.audioContext.createMediaStreamDestination(),k=u.audioContext.createGain(),T?k.connect(u.audioContext.destination):(k.connect(C),O=new Audio,O.srcObject=C.stream),k.gain.value=g.get(),E=u.audioContext.createGain(),E.connect(k),M=u.audioContext.createGain(),M.connect(E),P=k,R=()=>{const e=P.context.createOscillator();e.type="sine",e.frequency.value=440,e.connect(P),e.start(),e.stop(P.context.currentTime+2),e.onended=()=>e.disconnect()},v.debug("Init audio elements"),p.handle(y.value$.pipe(pe(1)),(e=>Ke(this,void 0,void 0,(function*(){v.debug("Audio sources playback enabled",e),E&&k&&(e?(E.disconnect(k),v.debug("Disconnected group output")):(E.connect(k),v.debug("Connected group output"))),e?(yield u.removeUsage(vo),v.debug("Will play sources audio"),h.forEach((({element:e,streamId:t})=>{e.paused&&e.play().catch((e=>{v.error("Failed to play audio source",t,e)}))}))):(yield u.addUsage(vo),v.debug("Will stop sources audio"),h.forEach((({element:e})=>{e.paused||e.pause()})))})))),f.onDestroy(u.hooks.startedAudio.tap((()=>Ke(this,void 0,void 0,(function*(){y.get()||(yield V(),v.debug("Loopback enabled:",c),c&&(yield G()))}))))),f.onDestroy(u.hooks.stopAudio.tap((()=>Ke(this,void 0,void 0,(function*(){v.debug("Stop audio processes"),v.debug("Will stop master audio"),j(),null==O||O.pause(),yield N()}))))),f.effect(u.event,(e=>Ke(this,void 0,void 0,(function*(){m(e)}))));let D,L=!1,z=Yt;function $(){null==D||D.unsubscribe(),D=void 0}function G(){return Ke(this,void 0,void 0,(function*(){if(T)return;if(!C||!O)return void v.error("masterOutputNode is not initialized");if(v.debug("Start loopback",{running:L,id:null==x?void 0:x.id}),L)return;L=!0,$();const e=()=>{y.set(!0),N(),function(){$();const e=Math.min(z,6e4);v.debug(`Will restart in ${e} ms`),D=fe(e).subscribe((()=>{G(),z*=2}))}()},o=t.loopbackRestartOnDisconnect?(t,o)=>{v.error("LoopbackConnection disconnected",o,t),e()}:void 0;try{const e=yield lo({inputStream:C.stream,onDisconnect:o,stunServer:t.loopbackStunServer,mungeCandidates:t.loopbackMungeCandidates,logger:v,wakeupMonitor:s,pageVisibility:a});v.debug("LoopbackConnection created",e.id),x&&x.destroy(),x=e,p.add(e.destroy),O.srcObject=e.stream,y.set(!1),yield V(),z=Yt}catch(t){r.loopbackConnectionError((e=>"object"==typeof e&&null!==e&&"message"in e&&"string"==typeof e.message?e.message:"unknown")(t)),v.error("LoopbackConnection failed to create",t),e()}}))}function N(){return Ke(this,void 0,void 0,(function*(){v.debug("Stop loopback",{running:L,id:null==x?void 0:x.id}),L=!1,$(),null==x||x.destroy(),x=void 0}))}return w&&u.audioContext.addEventListener("sinkchange",(()=>{const{sinkId:e}=u.audioContext;v.debug("sinkId changed to",""===e?"default":e)})),p.handle(g,(e=>{k&&(k.gain.value=e)})),o.addProvider({key:"audioMixer",name:"audioMixer",getState:()=>Ke(this,void 0,void 0,(function*(){var e;return{isSuspended:u.isSuspended(),masterGain:null!==(e=null==k?void 0:k.gain.value)&&void 0!==e?e:0,masterOutputPaused:null==O?void 0:O.paused,loopbackConnection:Boolean(x),loopbackRunning:L,isSourcesPlayback:y.get()}}))}),{$isSuspended:Ge(u.isSuspended),isReady:Ge(u.isReady),startAudio:u.startAudio,stopAudio:u.stopAudio,addMediaStream:function(e){try{if(function(e,t){e.getAudioTracks().forEach((o=>{"ended"===o.readyState&&(t.warn(`Removing ended track ${o.id} from stream ${e.id}`),e.removeTrack(o))}))}(e,v),!Wt(e))return void v.debug("added mediaStream don not have audio tracks");const t=e.getTracks().map(Ht),o=e.id,n=h.get(o);n&&(v.debug("Replacing old stream, already had source with same id",o),n.scope.destroy(),h.delete(o)),v.debug("Creating audio node based on stream",e.id,t);const r=new Audio,i=Ve(),s=i.atom(u.audioContext.createMediaStreamSource(e)),a={sourceNode:s,scope:i,element:r,streamId:e.id},c=()=>{a.sourceNode().disconnect()},d=()=>{s.set(u.audioContext.createMediaStreamSource(e)),M?s().connect(M):v.warn("GroupInput is not initialized")};e.addEventListener("removetrack",c),e.addEventListener("addtrack",d),M?s().connect(M):v.warn("GroupInput is not initialized"),S&&a.scope.add(S.connect(a)),y.get()?(r.autoplay=!0,r.oncanplay=()=>{r.setSinkId&&b&&r.setSinkId(b).catch((e=>{v.error("Failed to set source sinkId",o,e)}))}):r.pause(),a.scope.onDestroy((()=>{try{v.debug("Removing audio on destroy",a.streamId),e.removeEventListener("removetrack",c),e.removeEventListener("addtrack",d),m({type:"removeMediaStream",payload:{audioElement:r,mediaStream:e}}),s().disconnect(),r.remove()}catch(e){v.error("Failed to remove audio",e)}})),h.set(o,a),m({type:"addMediaStream",payload:{audioElement:r,mediaStream:e}}),_(),v.debug(`Connected a track: ${o}`)}catch(e){v.error("Failed to connect a track",e)}},removeAllMediaStreams:function(){0!==h.size&&(v.debug("Removing all remote tracks..."),h.forEach(((e,t)=>{e.scope.destroy(),v.debug(`Removed a remote track: ${t}`)})),h.clear(),u.removeUsage(vo))},removeMediaStream:function(e){const t=e.id,o=h.get(t);o&&(o.scope.destroy(),h.delete(t),0===h.size&&u.removeUsage(vo),v.debug(`Removed a stream: ${t}`))},event$:m.event$,$outputGain:g,setOutputGain:e=>{fo(e)?(g.set(e),m({type:"gainChanged",payload:{value:e}})):v.debug("The output gain should be in the range from 0 to 10")},setOutputDevice:function(e){return Ke(this,void 0,void 0,(function*(){if(e&&e!==b){if(b=e,T&&w)try{v.debug("Will set AudioContext sinkId to",e);const t="default"===e?"":e;yield u.setSinkId(t)}catch(e){v.error("Failed to set AudioContext sinkId",e)}(null==O?void 0:O.setSinkId)&&(v.debug(`Will set master sinkId to ${e}`),O.setSinkId(e).then((()=>{v.debug(`Set master sinkId to ${e}`)})).catch((t=>{v.error(`Failed to set master sinkId to ${e}`,t)}))),v.debug(`Will set sources sinkId to ${e}`),h.forEach((({element:t})=>{t.setSinkId&&t.setSinkId(e).catch((t=>{v.error(`Failed to set source sinkId to ${e}`,t)}))}))}}))},soundCheck:R,setRemoteInputMixer:function(e){if(M&&E&&(S&&(S.destroy(),S=void 0,M.connect(E)),e)){M.disconnect(E),S=p.createController((()=>e(u.audioContext)));const t=S;t.output.connect(E),h.forEach((e=>{e.scope.add(t.connect(e))}))}},getAudioContext:()=>u.audioContext,createMixinNode:function(){return Ke(this,void 0,void 0,(function*(){yield _();const e=u.audioContext.createMediaStreamDestination();null==k||k.connect(e);const t=new Map;return{destinationNode:e,addStream:function(o){const n=u.audioContext.createMediaStreamSource(o);n.connect(e);const r=Ve(),i=()=>{const n=t.get(o.id);n&&n.source.disconnect(e)},s=()=>{const n=u.audioContext.createMediaStreamSource(o);n.connect(e);t.get(o.id)&&t.set(o.id,{scope:r,source:n})};o.addEventListener("removetrack",i),o.addEventListener("addtrack",s),r.onDestroy((()=>{o.removeEventListener("removetrack",i),o.removeEventListener("addtrack",s)})),t.set(o.id,{scope:r,source:n})},removeStream:function(o){const n=t.get(o.id);n&&(n.source.disconnect(e),n.scope.destroy(),t.delete(o.id))},destroy:function(){t.forEach((t=>{t.source.disconnect(e),t.scope.destroy()})),t.clear(),null==k||k.disconnect(e)}}}))},setAudioSourcesPlayback(e){y.set(e)},destroy:function(){p.destroy(),$(),j(),O&&(O.pause(),O.srcObject=null,O.remove(),O=null),h.forEach((e=>e.scope.destroy())),h.clear()}}}const go=T({loopbackEnabled:P({key:"audioOutputMixerPlugin.loopback.enabled",defaultValue:!0,needsRestart:!0}),loopbackMaxChromiumVersion:_({key:"core.audioMixer.loopback.maxChromiumVersion",defaultValue:111,needsRestart:!0}),loopbackRestartOnDisconnect:P({key:"audioOutputMixerPlugin.loopback.restartOnDisconnect",defaultValue:!0,needsRestart:!0}),loopbackMungeCandidates:P({key:"audioOutputMixerPlugin.loopback.mungeCandidates",defaultValue:!0,needsRestart:!0}),loopbackStunServer:O({key:"audioOutputMixerPlugin.loopback.stunServer",needsRestart:!0})}),{module:bo,flagsToken:yo}=A(go),ho=Pe({initialState:new Set,updates:{add:e=>t=>{const o=new Set(t);return Array.isArray(e)?e.forEach((e=>{o.add(e)})):o.add(e),o},remove:e=>t=>{const o=new Set(t);return Array.isArray(e)?e.forEach((e=>{o.delete(e)})):o.delete(e),o}}});function So(e){const{audioMixer:t,logger:o,rooms:n}=e,r=Oe(),i=o.getLogger("AudioMixerParticipantsManager"),s=r.createController((()=>ho())),a=new Map;r.handle(t.event$.pipe(C("addMediaStream")),(({payload:{mediaStream:e,audioElement:t}})=>{n().forEach((o=>{const n=o.container.resolve(h);n.roomTrackManager.hasMediaStream(e)&&n.roomTrackManager.attach(t,e)}))})),r.handle(t.event$.pipe(C("removeMediaStream")),(({payload:{mediaStream:e,audioElement:t}})=>{n().forEach((o=>{const n=o.container.get(h);(null==n?void 0:n.roomTrackManager.hasMediaStream(e))&&n.roomTrackManager.detach(t,e)}))}));return{$mutedParticipants:s.asQuery(),addTracks:function(e){e.forEach((e=>function(e){var o,n,r,c;try{const d=e.participantId,u=a.get(d)||new Map;0!==u.size&&(u.forEach((o=>{i.debug(`participant ${e.participantId} has old stream ${o.id}, removing...`),t.removeMediaStream(o)})),u.clear()),u.set(e.mediaStream.id,e.mediaStream),a.set(e.participantId,u);const l=e.mediaStream.id,p=null===(c=null===(r=null===(n=(o=e.mediaStream).getAudioTracks)||void 0===n?void 0:n.call(o))||void 0===r?void 0:r[0])||void 0===c?void 0:c.id;if(d&&s.get().has(d))return i.debug("Ignored added track, because participant was muted in mixer",d,p,l),void t.removeMediaStream(e.mediaStream);t.addMediaStream(e.mediaStream),i.debug(`Connected a remote track ${p} via stream ${l}`)}catch(e){i.error("Failed to connect a remote track",e)}}(e)))},removeTracks:function(e){e.forEach((e=>function(e){var o,n,r,s;const c=e.mediaStream.id,d=null===(s=null===(r=null===(n=(o=e.mediaStream).getAudioTracks)||void 0===n?void 0:n.call(o))||void 0===r?void 0:r[0])||void 0===s?void 0:s.id,u=a.get(e.participantId)||new Map;u.delete(e.mediaStream.id),0===u.size?a.delete(e.participantId):a.set(e.participantId,u);t.removeMediaStream(e.mediaStream),i.debug(`Removed a remote track ${d} and a stream ${c}`)}(e)))},muteParticipants:function(e,o){e?s.updates.add(o):s.updates.remove(o),o.forEach((o=>{const n=a.get(o);n&&n.forEach((o=>{e?t.removeMediaStream(o):t.addMediaStream(o)}))}))},removeAllTracks:()=>{a.forEach((e=>{e.forEach((e=>{t.removeMediaStream(e)}))})),a.clear()},destroy:function(){r.destroy()}}}const ko=e({key:"AUDIO_OUTPUT_MIXER_CONTEXT_TOKEN"}),Eo={AudioMixer:e({key:"AUDIO_OUTPUT_MIXER_TOKENS_AUDIO_MIXER"}),AudioCore:e({key:"AUDIO_OUTPUT_MIXER_TOKENS_AUDIO_CORE"}),AudioLevel:e({key:"AUDIO_OUTPUT_MIXER_TOKENS_AUDIO_LEVEL"}),AudioOutputMixer:e({key:"AUDIO_OUTPUT_MIXER_TOKENS_AUDIO_OUTPUT_MIXER"}),AudioMixerParticipantsManager:e({key:"AUDIO_OUTPUT_MIXER_TOKENS_AUDIO_MIXER_PARTICIPANTS_MANAGER"})},Mo=e({key:"AUDIO_OUTPUT_MIXER_MANAGER_TOKEN"}),Ro=Pe({initialState:new Set,updates:{addParticipant:e=>t=>{const o=new Set(t);return o.add(e),o},addParticipants:e=>t=>new Set([...t,...e]),removeParticipant:e=>t=>{const o=new Set(t);return o.delete(e),o},removeParticipants:e=>t=>{const o=new Set(t);return e.forEach((e=>{o.delete(e)})),o},clear:()=>()=>new Set}});const wo=p({token:Mo,factory:o((function({jazzRoomContext:e,audioOutputMixerContext:t,sdkContext:o}){const{localDevices:n}=o,{roomTrackManager:r,room:i}=e,{audioMixerParticipantsManager:s}=t,a=Oe(),{audioOutputMixerManager:c}=a.createController((()=>function(e){const{roomTrackManager:t,roomEvent$:o,$remoteParticipants:n,audioMixerParticipantsManager:r}=e,i=Oe(),s=new Map,a=i.createController((()=>Ro())),c=i.createStore(!1),d=I();i.handle(c,(e=>{d({type:"muteAllParticipantsChanged",payload:{isMuted:e}})}));const u=(e,t)=>{if(!e&&c.get()&&c.set(!1),Array.isArray(t))return r.muteParticipants(e,t),e?a.updates.addParticipants(t):a.updates.removeParticipants(t),void d({type:"muteParticipantsChanged",payload:{isMuted:e,participantIds:t}});e?a.updates.addParticipant(t):a.updates.removeParticipant(t),d({type:"muteParticipantsChanged",payload:{isMuted:e,participantIds:[t]}})};return i.handle(d.event$.pipe(C("muteParticipantsChanged")),(({payload:{isMuted:e,participantIds:t}})=>{r.muteParticipants(e,t)})),i.handle(o.pipe(C("participants")),(({payload:{participants:e}})=>{if(!c.get())return;const t=e.map((({id:e})=>e));a.updates.addParticipants(t),d({type:"muteParticipantsChanged",payload:{isMuted:!0,participantIds:t}})})),i.handle(o.pipe(C("participantJoined")),(({payload:{participant:{id:e}}})=>{c.get()&&(a.updates.addParticipant(e),d({type:"muteParticipantsChanged",payload:{isMuted:!0,participantIds:[e]}}))})),i.handle(o.pipe(C("participantLeft")),(({payload:{participant:{id:e}}})=>{a.get().has(e)&&(a.updates.removeParticipant(e),d({type:"muteParticipantsChanged",payload:{isMuted:!1,participantIds:[e]}}))})),i.handle(o.pipe(C("disconnected","destroy")),(()=>{r.muteParticipants(!1,[...a.get()]),a.updates.clear(),r.removeTracks(Array.from(s,(([e,t])=>t))),s.clear()})),i.handle(t.event$.pipe(C("addTrack")),(({payload:{mediaType:e,participantId:t,stream:o,isLocal:n}})=>{if(e!==x.AUDIO)return;if(n)return;const i={mediaStream:o,participantId:t};s.set(t,i),r.addTracks([i])})),i.handle(t.event$.pipe(C("removeTrack")),(({payload:{mediaType:e,participantId:t,stream:o}})=>{e===x.AUDIO&&(s.delete(t),r.removeTracks([{mediaStream:o,participantId:t}]))})),{audioOutputMixerManager:{mutedParticipants:a,isMutedAll:c,event$:d.event$,muteParticipants:u,muteAllParticipants:e=>{c.set(e),u(e,n.get().map((({id:e})=>e)))}},destroy:()=>{i.destroy()}}}({$remoteParticipants:i.remoteParticipants,roomEvent$:i.event$,roomTrackManager:r,audioMixerParticipantsManager:s})));(function(){var e,t;const o=(null===(t=null===(e=window.navigator)||void 0===e?void 0:e.userAgentData)||void 0===t?void 0:t.platform)||window.navigator.platform;return["iPhone","iPad","iPod"].includes(o)||navigator.userAgent.includes("Mac")&&navigator.maxTouchPoints>1})()&&a.add(i.status.value$.pipe(re((e=>"connected"===e)),ae((()=>{"granted"!==n.$userMediaPermissions.get().audio&&n.requestMediaPermission("audio")}))).subscribe());return Object.assign(Object.assign({},c),{destroy:a.destroy})}),{jazzRoomContext:h,audioOutputMixerContext:ko,sdkContext:k})});const Co=p({factory:t(Y().params().apply((({params:e,scope:t})=>{const{roomConnection:o,audioCore:n}=e,r=`room-${o.roomId}`;n.addUsage(r),t.onDestroy((()=>{n.removeUsage(r)}))})),{roomConnection:y.RoomConnection,audioCore:Eo.AudioCore})});function Io(e){return Ke(this,void 0,void 0,(function*(){return S({imports:{audioMixerFlagsModule:bo,sdkContext:k,$flags:yo,debugStateRegistry:j},factory:t=>function(e){var t;const{deps:{sdkContext:o,$flags:n,debugStateRegistry:r},options:i={}}=e,{clientManager:s,logger:a,localMediaSettings:c,coreMetrics:d,userInteraction:u,wakeupMonitor:l,pageVisibility:p,moduleManager:f,localTrackManager:v}=o,m=Oe(),g=Object.assign(Object.assign({},n.get()),i.flags),b=V(navigator.userAgent).name,y=D(navigator.userAgent),h=function(e,t){return!(!e.loopbackEnabled||!t||t>=e.loopbackMaxChromiumVersion)}(g,y),S="Safari"===b,k=m.createController((()=>new Qt({logger:a,userInteraction:u}))),E=m.createController((()=>mo({coreMetrics:d,flags:g,debugStateRegistry:r,logger:a,userInteraction:u,wakeupMonitor:l,pageVisibility:p,loopbackEnabled:h,forceDestinationPipeline:S,audioCore:k}))),M=null===(t=c.$audioOutputDevice.get())||void 0===t?void 0:t.deviceId;M&&E.setOutputDevice(M);m.add(c.hooks.selectAudioOutputDevice.tap((e=>Ke(this,[e],void 0,(function*({audioOutputDevice:e}){yield E.setOutputDevice(e.deviceId)}))))),m.add(v.event$.pipe(C("mixDisplayAudio")).subscribe((e=>{E.setAudioSourcesPlayback(e.payload.enabled)})));const R=m.createController((()=>new Xt({logger:a,audioCore:k,localTrackManager:v,audioLevelAnimationInterval:i.audioLevelAnimationInterval}))),w=m.createController((()=>So({rooms:s.rooms,audioMixer:E,logger:a}))),{audioOutputMixer:I}=m.createController((()=>function(e){const{audioMixer:t,localMediaSettings:o,audioMixerParticipantsManager:n}=e,r=Oe();return{audioOutputMixer:{$isSuspended:t.$isSuspended,event$:t.event$,outputGain:t.$outputGain,setOutputGain:t.setOutputGain,startAudio:t.startAudio,stopAudio:t.stopAudio,setOutputDevice:o.selectAudioOutputDevice,addMediaStream:t.addMediaStream,removeMediaStream:t.removeMediaStream,muteParticipants:n.muteParticipants},destroy:()=>{r.destroy()}}}({audioMixer:E,localMediaSettings:c,audioMixerParticipantsManager:w})));f.registerModule("addRoom",wo),f.registerModule("addRoomConnection",Co);return{destroy:()=>{m.destroy()},audioOutputMixerContext:{audioMixer:E,audioOutputMixer:I,audioMixerParticipantsManager:w,audioLevel:R},audioMixer:E,audioOutputMixer:I,audioMixerParticipantsManager:w,audioLevel:R,audioCore:k}}(Object.assign(Object.assign({},t),{options:e})),exports:{audioOutputMixerContext:ko,audioMixer:Eo.AudioMixer,audioMixerParticipantsManager:Eo.AudioMixerParticipantsManager,audioOutputMixer:Eo.AudioOutputMixer,audioCore:Eo.AudioCore,audioLevel:Eo.AudioLevel}})}))}function To(e){const{audioOutputMixer:t}=e.container.resolve(ko);return t}function Oo(e){return e.container.resolve(Mo)}const Po=Ge,_o=Ne,Ao=xe,xo=xe;function jo(e,t){const o=Le(e,t);return()=>{o.destroy()}}function Vo(e,t){const o=Le(e,t);return()=>{o.destroy()}}function Do(e,t){let o;const n=De({onSubscribe:()=>{o||(o=(e.__isRoot,e.on("*",((...e)=>n(t(...e))))))},onUnsubscribe:e=>{e&&o&&(o(),o=void 0)},onDestroy:()=>{o&&(o(),o=void 0)}});return n}const Lo=e({key:"VIDEO_ELEMENT_POOL_GLOBAL_SERVICE_TOKEN"}),zo=e({key:"VIDEO_ELEMENT_POOL_