UNPKG

@salutejs/jazz-sdk-web-plugins

Version:

Jazz SDK plugins

1 lines 196 kB
import{token as e,injectableClass as t,injectable as r,bindModule as n,bindModules as o,declareModule as s}from"ditox";import{resolveServerUrl as a,getRequestConfig as i,success as c,HttpClientFetchError as u,failure as d,parseHttpErrorResponse as l,HttpClientResponseError as p,declareRuntimeModule as m,JAZZ_CLIENT_CONTEXT_TOKEN as f,isSuccess as g,isHttpClientFetchError as v,isFailure as y,NEXT_FLAGS_TOKEN as h,JazzRoomConnectionTokens as b,JAZZ_ROOM_CONTEXT_TOKEN as S,createModule as w,JAZZ_SDK_CONTEXT_TOKEN as E,createEventBus as R,createHooks as M,createKeyQueue as _,toQueryAtom as C,declareConfigFlags as P,declareStringFlag as k,declareNumberFlag as I,declareFlagsModule as A,filterByType as T,COLLECT_METRICS_MARKS as x,USER_MEDIA_TYPE as O,JazzVcsSdkTokens as V,DEBUG_STATE_REGISTRY_TOKEN as z,getBrowserName as G,declareBooleanFlag as D,getDisplayEndpoints as L,makeAsyncRequestFactory as $,mapFailure as j,mapSuccess as F,isMediaOutEvent as N,TransportResponseTimeoutError as q,TransportClosedError as U,TransportNotConnectedError as B,JAZZ_CLIENT_TOKEN as W,requestExtender as H,responseExtender as K,JAZZ_ROOM_TOKEN as J}from"@salutejs/jazz-sdk-web";import{declareController as Q}from"nrgy/mvc";import{switchMap as X,map as Y,catchError as Z,of as ee,firstValueFrom as te,filter as re,EMPTY as ne,from as oe,tap as se,fromEvent as ae,skipUntil as ie,takeWhile as ce,pairwise as ue,interval as de,scan as le,timer as pe,skip as me,combineLatest as fe,debounceTime as ge,startWith as ve,distinctUntilChanged as ye,merge as he,noop as be,take as Se,lastValueFrom as we,mergeMap as Ee,Subject as Re,withLatestFrom as Me,shareReplay as _e,Observable as Ce,throwError as Pe,reduce as ke,subscribeOn as Ie,asyncScheduler as Ae}from"rxjs";import{createScope as Te,declareStore as xe}from"rx-effects";import{fromObservable as Oe,observe as Ve}from"nrgy/rxjs";import{compute as ze,createScope as Ge,declareStore as De,effect as Le,batch as $e,combineAtoms as je}from"nrgy";import{fromQuery as Fe,toQuery as Ne,toAction as qe}from"nrgy/rx-effects";import{produce as Ue,castDraft as Be}from"immer";import{declareStateUpdates as We,declareStore as He}from"nrgy/store";class Ke extends Error{constructor(e,t){super(t),this.code=e,this.name="ServerRecordingError",this.error=t}}const Je={logger:e({key:"SERVER_RECORDING_LOGGER_TOKEN"})},Qe={RoomRecordingServiceClient:e("RoomRecordingServiceClient"),InternalRoomRecordingServiceClient:e("InternalRoomRecordingServiceClient")},Xe={RecordRoomService:e({key:"SERVER_RECORDING_ROOM_SERVICE_TOKEN"})},Ye=Symbol.for("@ts-pattern/matcher"),Ze=Symbol.for("@ts-pattern/isVariadic"),et="@ts-pattern/anonymous-select-key",tt=e=>Boolean(e&&"object"==typeof e),rt=e=>e&&!!e[Ye],nt=(e,t,r)=>{if(rt(e)){const n=e[Ye](),{matched:o,selections:s}=n.match(t);return o&&s&&Object.keys(s).forEach((e=>r(e,s[e]))),o}if(tt(e)){if(!tt(t))return!1;if(Array.isArray(e)){if(!Array.isArray(t))return!1;let n=[],o=[],s=[];for(const t of e.keys()){const r=e[t];rt(r)&&r[Ze]?s.push(r):s.length?o.push(r):n.push(r)}if(s.length){if(s.length>1)throw new Error("Pattern error: Using `...P.array(...)` several times in a single pattern is not allowed.");if(t.length<n.length+o.length)return!1;const e=t.slice(0,n.length),a=0===o.length?[]:t.slice(-o.length),i=t.slice(n.length,0===o.length?1/0:-o.length);return n.every(((t,n)=>nt(t,e[n],r)))&&o.every(((e,t)=>nt(e,a[t],r)))&&(0===s.length||nt(s[0],i,r))}return e.length===t.length&&e.every(((e,n)=>nt(e,t[n],r)))}return Reflect.ownKeys(e).every((n=>{const o=e[n];return(n in t||rt(s=o)&&"optional"===s[Ye]().matcherType)&&nt(o,t[n],r);var s}))}return Object.is(t,e)},ot=e=>{var t,r,n;return tt(e)?rt(e)?null!=(t=null==(r=(n=e[Ye]()).getSelectionKeys)?void 0:r.call(n))?t:[]:Array.isArray(e)?st(e,ot):st(Object.values(e),ot):[]},st=(e,t)=>e.reduce(((e,r)=>e.concat(t(r))),[]);function at(...e){if(1===e.length){const[t]=e;return e=>nt(t,e,(()=>{}))}if(2===e.length){const[t,r]=e;return nt(t,r,(()=>{}))}throw new Error(`isMatching wasn't given the right number of arguments: expected 1 or 2, received ${e.length}.`)}function it(e){return Object.assign(e,{optional:()=>ut(e),and:t=>pt(e,t),or:t=>mt(e,t),select:t=>void 0===t?gt(e):gt(t,e)})}function ct(e){return Object.assign((e=>Object.assign(e,{[Symbol.iterator](){let t=0;const r=[{value:Object.assign(e,{[Ze]:!0}),done:!1},{done:!0,value:void 0}];return{next:()=>{var e;return null!=(e=r[t++])?e:r.at(-1)}}}}))(e),{optional:()=>ct(ut(e)),select:t=>ct(void 0===t?gt(e):gt(t,e))})}function ut(e){return it({[Ye]:()=>({match:t=>{let r={};const n=(e,t)=>{r[e]=t};return void 0===t?(ot(e).forEach((e=>n(e,void 0))),{matched:!0,selections:r}):{matched:nt(e,t,n),selections:r}},getSelectionKeys:()=>ot(e),matcherType:"optional"})})}const dt=(e,t)=>{for(const r of e)if(!t(r))return!1;return!0},lt=(e,t)=>{for(const[r,n]of e.entries())if(!t(n,r))return!1;return!0};function pt(...e){return it({[Ye]:()=>({match:t=>{let r={};const n=(e,t)=>{r[e]=t};return{matched:e.every((e=>nt(e,t,n))),selections:r}},getSelectionKeys:()=>st(e,ot),matcherType:"and"})})}function mt(...e){return it({[Ye]:()=>({match:t=>{let r={};const n=(e,t)=>{r[e]=t};return st(e,ot).forEach((e=>n(e,void 0))),{matched:e.some((e=>nt(e,t,n))),selections:r}},getSelectionKeys:()=>st(e,ot),matcherType:"or"})})}function ft(e){return{[Ye]:()=>({match:t=>({matched:Boolean(e(t))})})}}function gt(...e){const t="string"==typeof e[0]?e[0]:void 0,r=2===e.length?e[1]:"string"==typeof e[0]?void 0:e[0];return it({[Ye]:()=>({match:e=>{let n={[null!=t?t:et]:e};return{matched:void 0===r||nt(r,e,((e,t)=>{n[e]=t})),selections:n}},getSelectionKeys:()=>[null!=t?t:et].concat(void 0===r?[]:ot(r))})})}function vt(e){return"number"==typeof e}function yt(e){return"string"==typeof e}function ht(e){return"bigint"==typeof e}const bt=it(ft((function(e){return!0}))),St=bt,wt=e=>Object.assign(it(e),{startsWith:t=>{return wt(pt(e,(r=t,ft((e=>yt(e)&&e.startsWith(r))))));var r},endsWith:t=>{return wt(pt(e,(r=t,ft((e=>yt(e)&&e.endsWith(r))))));var r},minLength:t=>wt(pt(e,(e=>ft((t=>yt(t)&&t.length>=e)))(t))),length:t=>wt(pt(e,(e=>ft((t=>yt(t)&&t.length===e)))(t))),maxLength:t=>wt(pt(e,(e=>ft((t=>yt(t)&&t.length<=e)))(t))),includes:t=>{return wt(pt(e,(r=t,ft((e=>yt(e)&&e.includes(r))))));var r},regex:t=>{return wt(pt(e,(r=t,ft((e=>yt(e)&&Boolean(e.match(r)))))));var r}}),Et=wt(ft(yt)),Rt=e=>Object.assign(it(e),{between:(t,r)=>Rt(pt(e,((e,t)=>ft((r=>vt(r)&&e<=r&&t>=r)))(t,r))),lt:t=>Rt(pt(e,(e=>ft((t=>vt(t)&&t<e)))(t))),gt:t=>Rt(pt(e,(e=>ft((t=>vt(t)&&t>e)))(t))),lte:t=>Rt(pt(e,(e=>ft((t=>vt(t)&&t<=e)))(t))),gte:t=>Rt(pt(e,(e=>ft((t=>vt(t)&&t>=e)))(t))),int:()=>Rt(pt(e,ft((e=>vt(e)&&Number.isInteger(e))))),finite:()=>Rt(pt(e,ft((e=>vt(e)&&Number.isFinite(e))))),positive:()=>Rt(pt(e,ft((e=>vt(e)&&e>0)))),negative:()=>Rt(pt(e,ft((e=>vt(e)&&e<0))))}),Mt=Rt(ft(vt)),_t=e=>Object.assign(it(e),{between:(t,r)=>_t(pt(e,((e,t)=>ft((r=>ht(r)&&e<=r&&t>=r)))(t,r))),lt:t=>_t(pt(e,(e=>ft((t=>ht(t)&&t<e)))(t))),gt:t=>_t(pt(e,(e=>ft((t=>ht(t)&&t>e)))(t))),lte:t=>_t(pt(e,(e=>ft((t=>ht(t)&&t<=e)))(t))),gte:t=>_t(pt(e,(e=>ft((t=>ht(t)&&t>=e)))(t))),positive:()=>_t(pt(e,ft((e=>ht(e)&&e>0)))),negative:()=>_t(pt(e,ft((e=>ht(e)&&e<0))))}),Ct=_t(ft(ht)),Pt=it(ft((function(e){return"boolean"==typeof e}))),kt=it(ft((function(e){return"symbol"==typeof e}))),It=it(ft((function(e){return null==e}))),At=it(ft((function(e){return null!=e})));var Tt={__proto__:null,matcher:Ye,optional:ut,array:function(...e){return ct({[Ye]:()=>({match:t=>{if(!Array.isArray(t))return{matched:!1};if(0===e.length)return{matched:!0};const r=e[0];let n={};if(0===t.length)return ot(r).forEach((e=>{n[e]=[]})),{matched:!0,selections:n};const o=(e,t)=>{n[e]=(n[e]||[]).concat([t])};return{matched:t.every((e=>nt(r,e,o))),selections:n}},getSelectionKeys:()=>0===e.length?[]:ot(e[0])})})},set:function(...e){return it({[Ye]:()=>({match:t=>{if(!(t instanceof Set))return{matched:!1};let r={};if(0===t.size)return{matched:!0,selections:r};if(0===e.length)return{matched:!0};const n=(e,t)=>{r[e]=(r[e]||[]).concat([t])},o=e[0];return{matched:dt(t,(e=>nt(o,e,n))),selections:r}},getSelectionKeys:()=>0===e.length?[]:ot(e[0])})})},map:function(...e){return it({[Ye]:()=>({match:t=>{if(!(t instanceof Map))return{matched:!1};let r={};if(0===t.size)return{matched:!0,selections:r};const n=(e,t)=>{r[e]=(r[e]||[]).concat([t])};if(0===e.length)return{matched:!0};var o;if(1===e.length)throw new Error(`\`P.map\` wasn't given enough arguments. Expected (key, value), received ${null==(o=e[0])?void 0:o.toString()}`);const[s,a]=e;return{matched:lt(t,((e,t)=>{const r=nt(s,t,n),o=nt(a,e,n);return r&&o})),selections:r}},getSelectionKeys:()=>0===e.length?[]:[...ot(e[0]),...ot(e[1])]})})},intersection:pt,union:mt,not:function(e){return it({[Ye]:()=>({match:t=>({matched:!nt(e,t,(()=>{}))}),getSelectionKeys:()=>[],matcherType:"not"})})},when:ft,select:gt,any:bt,_:St,string:Et,number:Mt,bigint:Ct,boolean:Pt,symbol:kt,nullish:It,nonNullable:At,instanceOf:function(e){return it(ft(function(e){return t=>t instanceof e}(e)))},shape:function(e){return it(ft(at(e)))}};const xt={id:Tt.number,publicId:Tt.optional(Tt.string),title:Tt.string,createdAt:Tt.string,durationSeconds:Tt.number,sizeMb:Tt.optional(Tt.number),publicAccess:Tt.optional(Tt.boolean),watchUrl:Tt.optional(Tt.union(Tt.nullish,Tt.string)),downloadUrl:Tt.optional(Tt.string),permissions:Tt.optional({canTogglePublicAccess:Tt.boolean})},Ot={totalPages:Tt.number,records:Tt.array(xt),pageSize:Tt.optional(Tt.number),pageNumber:Tt.optional(Tt.number)},Vt={usedMb:Tt.number,availableMb:Tt.optional(Tt.number),capacityMb:Tt.number};function zt(e){return{...e,permissions:{canTogglePublicAccess:e.permissions?.canTogglePublicAccess??!1}}}const Gt=m({factory:t(Q().params().apply((({params:e})=>{const{jazzClientContext:t}=e,r=function(e){const{httpClient:t,endpoints:r,apiScheduler:n,retryBackoff:o}=e;return{getVideoStorage:e=>{const s=a(e,r).pipe(X((r=>{const n=`${r}/video/storage`;return t.get({url:n,requestConfig:i(e)})})));return n.scheduleHttpRequest(s,{retryBackoff:o}).pipe(Y((e=>{if(at(Vt,e.data))return e.data;throw new Error("Incorrect format of the server response [/video/storage]")})))},startVideoRecord:(e,s)=>{const m=a(s,r).pipe(X((r=>{const n=`${r}/video/record/start`;return t.post({url:n,body:{roomId:e},requestConfig:i(s)})})));return n.scheduleHttpRequest(m,{retryBackoff:o}).pipe(X((async()=>c(void 0))),Z((e=>{if(e instanceof u)return ee(d(e));const t=l(e.data);let r;return r=403===e.status&&"VIDEO_RECORD_STORAGE_CAPACITY_EXCEEDED"===t?.code?{type:"storageQuotaExceeded"}:{type:"clientError"},ee(d(new p(e.name,e,r)))})))},stopVideoRecord:(e,s)=>{const c=a(s,r).pipe(X((r=>{const n=`${r}/video/record/stop`;return t.post({url:n,body:{roomId:e},requestConfig:i(s)})})));return n.scheduleHttpRequest(c,{retryBackoff:o}).pipe(Y((()=>{})))},getVideoFind:(e,s)=>{const c=a(s,r).pipe(X((r=>{const n=`${r}/video/find?${new URLSearchParams(e).toString()}`;return t.get({url:n,requestConfig:i(s)})})));return n.scheduleHttpRequest(c,{retryBackoff:o}).pipe(Y((e=>{if(at(Ot,e.data))return{...e.data,records:e.data.records.map((e=>zt(e)))};throw new Error("Incorrect format of the server response [/video/find]")})))},getVideo:(e,s)=>{const c=a(s,r).pipe(X((r=>{const n=`${r}/video/public/${e}`;return t.get({url:n,requestConfig:i(s)})})));return n.scheduleHttpRequest(c,{retryBackoff:o}).pipe(Y((e=>{if(at(xt,e.data))return zt(e.data);throw new Error("Incorrect format of the server response [/video/public]")})))},updateVideoTitle:(e,s,c)=>{const u=a(c,r).pipe(X((r=>{const n=`${r}/video/${e}/update-title`;return t.post({url:n,body:{title:s},requestConfig:i(c)})})));return n.scheduleHttpRequest(u,{retryBackoff:o}).pipe(Y((()=>{})))},updateVideoPublicAccess:(e,s,c)=>{const u=a(c,r).pipe(X((r=>{const n=`${r}/video/${e}/update-public-access`;return t.post({url:n,body:{publicAccess:s},requestConfig:i(c)})})));return n.scheduleHttpRequest(u,{retryBackoff:o}).pipe(Y((()=>{})))},deleteVideo:(e,s)=>{const c=a(s,r).pipe(X((r=>{const n=`${r}/video/${e}/delete`;return t.post({url:n,requestConfig:i(s)})})));return n.scheduleHttpRequest(c,{retryBackoff:o}).pipe(Y((()=>{})))},getDownloadLink:(e,s)=>{const c=a(s,r).pipe(X((r=>{const n=`${r}/video/public/contentUrl/${e}`;return t.get({url:n,responseType:"text",requestConfig:i(s)})})));return n.scheduleHttpRequest(c,{retryBackoff:o}).pipe(Y((({data:e})=>e)))},getS3DownloadLink:(e,s)=>{const c=a(s,r).pipe(X((()=>t.get({url:e,responseType:"stream",requestConfig:i(s)}))));return n.scheduleHttpRequest(c,{retryBackoff:o}).pipe(Y((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:async()=>te(e.getVideoStorage()),startVideoRecord:async t=>te(e.startVideoRecord(t)),stopVideoRecord:async t=>te(e.stopVideoRecord(t)),getVideoFind:async t=>te(e.getVideoFind(t)),getVideo:async t=>te(e.getVideo(t)),updateVideoTitle:async(t,r)=>te(e.updateVideoTitle(t,r)),updateVideoPublicAccess:async(t,r)=>te(e.updateVideoPublicAccess(t,r)),deleteVideo:async t=>te(e.deleteVideo(t)),getDownloadLink:async t=>te(e.getDownloadLink(t)),getS3DownloadLink:async t=>te(e.getS3DownloadLink(t))}}(r);return{client:n,internalClient:r}})),{jazzClientContext:f,logger:Je.logger}),exports:{client:Qe.RoomRecordingServiceClient,internalClient:Qe.InternalRoomRecordingServiceClient}}),Dt=Q().params().apply((({scope:e,params:t})=>{const{roomContext:r,roomRecordingServiceClient:n,status:o,logger:s}=t,{roomServerEvents$:a}=r,i=s.getLogger("next"),c=e.signal();return e.effect(Oe(a),(e=>{if(e)switch(e.type){case"serverVideoRecordStarted":{const{payload:{videoRecordOwnerId:t}}=e;o.set("recording"),c({type:"serverRecordStarted"}),i.debug(`Recording was started by ${t}`);break}case"serverVideoRecordStopped":{const{payload:{videoRecordOwnerId:t,reason:r}}=e,n="manual"===r||"STOP_MANUALLY"===r?"STOP_MANUALLY":"DURATION_LIMIT_EXCEEDED";o.set("inactive"),c({type:"serverRecordStopped",payload:{reason:n}}),i.debug(`Recording was stopped by ${t}, reason ${r}`);break}case"serverVideoRecordAutoStartError":{const{payload:{error:t}}=e;o.set("inactive"),c({type:"serverRecordAutoStartError",payload:{error:t}}),i.error("Auto-start recording failed",t);break}}})),{events:c,startServerRecording:async function(){try{const e=r.room.params.conferenceId;if(!e)throw new Error("Room not initialize for start server record");o.set("processStarting");const t=await n.startVideoRecord(e);if(g(t))return;throw o.set("inactive"),t.error&&"data"in t.error&&"storageQuotaExceeded"===t.error.data.type?(c({type:"serverRecordStartError",payload:{error:"storageCapacityExceeded"}}),new Ke("VIDEO_RECORD_STORAGE_CAPACITY_EXCEEDED")):v(t.error)?new Ke("NETWORK_ERROR"):(t.error instanceof p||c({type:"serverRecordStartError"}),new Ke("VIDEO_RECORD_START_ERROR"))}catch(e){throw i.error("fail start server record",e),c({type:"serverRecordStartError"}),new Ke("VIDEO_RECORD_START_ERROR")}},stopServerRecording:async function(){try{const e=r.room.params.conferenceId;if(!e)throw new Ke("VIDEO_RECORD_STOP_ERROR","Room not initialize for stop server record");o.set("processStopping"),await n.stopVideoRecord(e)}catch(e){throw i.error("fail stop server record",e),o.set("recording"),c({type:"serverRecordStopError"}),new Ke("VIDEO_RECORD_STOP_ERROR")}}}})),Lt={"video-record-started":!0,"video-record-stopped":!0,"video-record-uploaded":!0,"video-record-error":!0};const $t=Q().params().apply((({scope:e,params:t})=>{const{roomConnection:r,status:n,logger:o}=t,s=o.getLogger("next"),a=e.signal();return e.effect(Oe(r.event$),(e=>{if(e&&function(e){return e.event in Lt}(e))switch(s.info("connection event",e.event,e.payload),e.event){case"video-record-started":n.set("recording"),a({type:"serverRecordStarted"});break;case"video-record-stopped":n.set("inactive"),a({type:"serverRecordStopped",payload:{reason:e.payload.reason}});break;case"video-record-uploaded":a({type:"serverRecordUploaded"});break;case"video-record-error":switch(n.set("inactive"),e.payload.reason||e.payload.code){case"START_ERROR":throw a({type:"serverRecordStartError"}),new Ke("START_ERROR");case"UPLOAD_ERROR":throw a({type:"serverRecordUploadedError"}),new Ke("UPLOAD_ERROR");case"RECORD_ERROR":throw a({type:"serverRecordError"}),new Ke("RECORD_ERROR");case"AUTOSTART_ERROR":throw a({type:"serverRecordAutoStartError"}),new Ke("AUTOSTART_ERROR")}}})),{events:a,startServerRecording:async function(){n.set("processStarting");const e=await te(r.request({event:"start-video-record"}).pipe(re((e=>y(e)||g(e)))));if("failure"===e.type){switch(n.set("inactive"),s.error("Fail start video record",e.error.code,e.error.message),e.error.code){case"FORBIDDEN":throw a({type:"serverRecordStartError",payload:{error:"forbidden"}}),new Ke("FORBIDDEN");case"VIDEO_RECORD_ALREADY_STARTED":throw a({type:"serverRecordStartError",payload:{error:"alreadyStarted"}}),new Ke("VIDEO_RECORD_ALREADY_STARTED");case"VIDEO_RECORD_STORAGE_CAPACITY_EXCEEDED":throw a({type:"serverRecordStartError",payload:{error:"storageCapacityExceeded"}}),new Ke("VIDEO_RECORD_STORAGE_CAPACITY_EXCEEDED");case"VIDEO_RECORD_START_ERROR":throw a({type:"serverRecordStartError"}),new Ke("VIDEO_RECORD_START_ERROR")}a({type:"serverRecordStartError"})}},stopServerRecording:async function(){n.set("processStopping");const e=await te(r.request({event:"stop-video-record"}).pipe(re((e=>y(e)||g(e)))));if("failure"===e.type){switch(s.error("Fail stop video record",e.error.code,e.error.message),n.set("recording"),e.error.code){case"FORBIDDEN":throw a({type:"serverRecordStopError",payload:{error:"forbidden"}}),new Ke("FORBIDDEN");case"VIDEO_RECORD_STOP_ERROR":throw a({type:"serverRecordStopError"}),new Ke("VIDEO_RECORD_STOP_ERROR");case"VIDEO_RECORD_NOT_STARTED":throw a({type:"serverRecordStopError",payload:{error:"notStarted"}}),new Ke("VIDEO_RECORD_NOT_STARTED")}a({type:"serverRecordStopError"})}}}})),jt=Q().params().apply((({scope:e,params:t})=>{const{authQueries:r,roomContext:n}=t,{$userInfo:o}=r,s=e.add(Fe(o)),{userPermissions:a}=n.room.extend(),i=e.add(Fe(a));return{canManageServerRecordList:ze((()=>{const e=s();if(!e)return!1;const{features:t}=e,{serverVideoRecordAvailable:r}=t??{};return r??!1})),canManageServerRecord:ze((()=>{const e=i();return void 0!==e&&(e.canStartServerVideoRecord??!1)}))}})),Ft=m({factory:t(Q().params().apply((({scope:e,params:t})=>{const{clientContext:r,roomContext:n,roomConnection:o,roomRecordingServiceClient:s,nextFlags:a,logger:i}=t,c=e.atom("pending"),u=i.getLogger(`room[${n.room.params.conferenceId}]`),d=Te();e.onDestroy((()=>d.destroy()));const l=e.atom(!1),p=e.atom("inactive"),m=e.signal();e.onDestroy((()=>p.set("inactive")));const f=e.add(new jt({authQueries:r.authQueries,roomContext:n}));let g;const v=e.effect(o.isNext,(t=>{if(void 0!==t){if(v.destroy(),t){const t=e.add(new $t({roomConnection:o,status:p,logger:u})),r=a.get();c.set(r.supportedServerRecordingInNextRoom?"supported":"unsupported"),e.effect(t.events,m),g=t}else{const t=e.add(new Dt({roomContext:n,roomRecordingServiceClient:s,status:p,logger:u}));e.effect(t.events,m),g=t,c.set("supported")}l.set(!0)}}));return{service:{serverSupportedStatus:c,isReady:l,events:m,status:p,canManageServerRecordList:f.canManageServerRecordList,canManageServerRecord:f.canManageServerRecord,startServerRecording:async function(){if("supported"===c()){if(g)return g.startServerRecording();u.error("Server recording service is not initialize")}else u.error("Server recording service is disabled")},stopServerRecording:async function(){if("supported"===c()){if(g)return g.stopServerRecording();u.error("Server recording service is not initialize")}else u.error("Server recording service is disabled")}}}})),{clientContext:f,roomContext:S,roomConnection:b.Connection,roomRecordingServiceClient:Qe.RoomRecordingServiceClient,nextFlags:h,logger:Je.logger}),exports:{service:Xe.RecordRoomService}}),Nt=Q().params().apply((({params:e})=>{const{deps:{sdkContext:t}}=e,{moduleManager:r}=t,n=t.logger.getLogger("serverRecordingPlugin");return r.registerModule("addRoom",Ft),r.registerModule("addClient",Gt),{logger:n}}));async function qt(){return w({name:"serverRecordingPlugin",imports:{sdkContext:E},factory:e=>new Nt(e),exports:{logger:Je.logger}})}const Ut=e=>e.container.resolve(Xe.RecordRoomService),Bt=e=>e.container.resolve(Qe.RoomRecordingServiceClient),Wt=e=>({requestAdapter:t=>({...t,serverVideoRecordAutoStartEnabled:e.serverVideoRecordAutoStartEnabled})});function Ht(e){return{enabled:e.enabled,id:e.id,kind:e.kind,label:e.label,muted:e.muted,readyState:e.readyState}}function Kt(){const e=window.navigator?.userAgentData?.platform||window.navigator.platform;return["iPhone","iPad","iPod"].includes(e)||navigator.userAgent.includes("Mac")&&navigator.maxTouchPoints>1}function Jt(e){const t=e.getAudioTracks()[0];return!(!t||"ended"===t.readyState)}function Qt(){return"setSinkId"in AudioContext.prototype}function Xt(){const e=window.navigator?.userAgentData?.platform||window.navigator.platform;return["iPhone","iPad","iPod"].includes(e)||navigator.userAgent.includes("Mac")&&navigator.maxTouchPoints>1}function Yt(e){const t=parseFloat(e);return isNaN(t)?function(e){return!!Zt.includes(e)}(e)?e:void 0:t}const Zt=["balanced","interactive","playback"];const er=Q().params().apply((({params:e})=>{const{logger:t}=e,r=navigator.audioSession||null,n=function(){if(!Xt())return"standard";if(r)return"audioSession";return"polling"}();t.debug("AudioSessionManager initialized",{strategy:n,hasAudioSession:Boolean(r)});return{strategy:n,stateChanged$:ee(null),configureAudioSession:function(){if(r)try{r.type="play-and-record",t.debug("Audio session configured as play-and-record")}catch(e){t.warn("Failed to configure audio session type",e)}}}})),tr=Q().params().apply((({scope:e,params:t})=>{const{userInteraction:r,logger:n,sampleRate:o}=t,s=n.getLogger("AudioCore"),a=e.atom(!0);new er({logger:s}).configureAudioSession();const i=R(),c=new AudioContext({latencyHint:Yt(t.latencyHint),sampleRate:o||void 0});s.debug("audioContext created",c.sampleRate,o);const u=e.atom(c.state),d="running"===c.state&&!Xt(),l=e.atom(d),p=new Set,m=new Set,{destroy:f,hooks:g}=M(["startAudio","startedAudio","stopAudio","stoppedAudio"]);e.onDestroy(f);let v=!1;const y=r.detectUserInteraction(),h=e.add(_()),b=()=>{l()||(l.set(!0),(()=>{if(0===m.size)return;const e=Array.from(m);m.clear(),s.debug("processing pending iOS usages after gesture",e)})())};e.onDestroy((()=>{p.clear(),"closed"!==c.state&&c.close()})),e.add(y.pipe(X((()=>l()?ne:oe(w()))),se((()=>{b(),0===p.size&&T()}))).subscribe());let S=!1;async function w(){h.deleteKey("stopAudio"),await h.add({key:"startAudio",cb:E}),l()||b()}async function E(){v||(v=!0,S=!1,i({type:"startAudio"}),await g.startAudio.exec(),s.debug("AudioContext",{state:c.state,baseLatency:c.baseLatency,sampleRate:c.sampleRate}),a.set("suspended"===c.state),"suspended"===c.state&&await A(),i({type:"startedAudio"}),await g.startedAudio.exec(),s.debug("Started audio processes"))}d&&w();let C=0;const P=()=>0!==C&&Date.now()-C<800;e.add(ae(c,"statechange").subscribe((()=>{s.debug("AudioContext statechange",c.state),"running"===c.state&&(C=Date.now()),a.set("suspended"===c.state),v="running"===c.state,u.set(c.state)})));const k=Ve(l).pipe(re(Boolean)),I=Ve(u);if(e.add(I.pipe(ie(k),ce((e=>"closed"!==e)),re((e=>"running"!==e&&!S&&!P()&&p.size>0)),X((()=>{return s.debug("Scheduling recovery resume after unexpected suspension"),Xt()?(e=300,s.debug(`Scheduling delayed recovery ${e}ms`),pe(e,1e3).pipe(ce((()=>"running"!==u())),se((()=>c.resume().catch((()=>{})))))):oe(A());var e})),se((()=>{s.debug(`Recovery resume successful, state: ${c.state}`)})),Z((e=>(s.error("Recovery resume failed",e),ee(null))))).subscribe()),Xt()){const t=200,r=6*t,n=3*t,o=I.pipe(re((e=>"interrupted"===e||"running"===e)),ue(),re((([e,t])=>"interrupted"===e&&"running"===t&&!P())));e.add(o.pipe(X((()=>(s.debug("Interruption detected, starting healthcheck"),de(t).pipe(le((e=>{const{currentTime:r}=c,n=r-e.currentTime;let{progressMs:o,stallMs:s}=e;return n>=.01?o+=t:s+=t,{currentTime:r,progressMs:o,stallMs:s}}),{progressMs:0,stallMs:0,currentTime:c.currentTime}),ce((({progressMs:e,stallMs:t})=>e<=r&&t<=n))))))).subscribe((({stallMs:e,progressMs:t})=>{e>=n&&(s.debug("AudioContext is stalled, will try to suspend-resume"),async function(){if(S||"running"!==c.state)return;try{s.debug("Performing suspend-resume"),await T(),await w(),s.debug("Suspend-resume completed")}catch(e){s.error("Suspend-resume failed",e)}}()),t>=r&&s.debug(`Healtcheck stopped after ${t}ms stable increase`)})))}async function A(){try{s.log("AudioContext resume start:",c.state),await function(e,t){return new Promise((r=>{e.resume().catch((()=>{})),"running"===e.state&&r();const n=setInterval((()=>{e.resume().catch((()=>{})),"running"===e.state&&(clearInterval(n),r())}),t)}))}(c,1e3),s.log("AudioContext resume done:",c.state)}catch(e){s.error("Failed to resume the audio context",e)}a.set("suspended"===c.state)}async function T(){h.deleteKey("startAudio"),await h.add({key:"stopAudio",cb:async()=>{v&&(v=!1,i({type:"stopAudio"}),await g.stopAudio.exec(),S=!0,await c.suspend(),i({type:"stoppedAudio"}),await g.stoppedAudio.exec(),s.debug("Stopped audio processes"))}})}return{isSuspended:a,isReady:l,addUsage:async e=>{if(s.debug("usage added",e),p.add(e),!l()){if(Xt())return m.add(e),void s.debug("queued usage until first gesture",e);await te(k)}await w()},audioContext:c,event:i.event$,hooks:g,removeUsage:async e=>{s.debug("usage removed",e),p.delete(e),m.delete(e),0===p.size&&await T()},startAudio:w,stopAudio:T,setSinkId:async e=>{Qt()?(await c.setSinkId(e),"suspended"===c.state&&p.size>0&&(s.debug("Resume suspended but used context"),await w())):s.warn("setSinkId not supported")}}}));const rr=Q().params().apply((({scope:e,params:t})=>{const{logger:r,localTrackManager:n,audioLevelAnimationInterval:o}=t,s=r.getLogger("AudioLevel");let a,i,c=!1;const u=new AudioContext({latencyHint:"playback"}),d=new WeakMap,l=e.add(_()),p=e.atom(new Map),m=e=>{if(!Jt(e))return void s.error("Stream has not lives MediaStreamTracks");if(p().has(e.id))return;const t=u.createAnalyser();t.smoothingTimeConstant=.85,t.fftSize=1024;const r=t.frequencyBinCount,n=new Uint8Array(r);t.getByteTimeDomainData(n);const o=u.createMediaStreamSource(e);o.connect(t);const a={analyser:t,bufferLength:r,dataArray:n,source:o,stream:e};p.update((t=>{const r=new Map(t);return r.set(e.id,a),r}))},f=e=>{const t=p().get(e.id);if(!t)return;t.source.disconnect(),p.update((t=>{const r=new Map(t);return r.delete(e.id),r}));const r=d.get(e);r&&r.setLevel(0)};e.effect(p,(e=>{0!==e.size?(l.deleteKey("stop"),l.add({key:"start",cb:g})):l.add({key:"stop",cb:y})}));async function g(){c||(await u.resume(),c=!0,v())}function v(){o?i=setTimeout(v,o):a=requestAnimationFrame(v),p().forEach((({analyser:e,dataArray:t,bufferLength:r,stream:n})=>{const o=d.get(n);if(!o)return;e.getByteFrequencyData(t);let s=0;for(let e=0;e<r;e++)s+=t[e];const a=s/t.length,i=Math.min(a,100);o.setLevel(Math.round(i))}))}async function y(){c&&(c=!1,a&&(cancelAnimationFrame(a),a=void 0),i&&(clearTimeout(i),i=void 0),await u.suspend())}return e.onDestroy((()=>{const e=p();e.forEach((({source:e})=>{e.disconnect()})),e.clear(),u.close()})),e.add(ae(u,"statechange").subscribe((()=>{s.debug("state change",u.state)}))),{addMediaStream:e=>{const t=d.get(e);if(m(e),!t){const t=Ge(),r=t.atom(0),o={isActive:C(ze((()=>p().has(e.id)))),level:C(r)},s={audioLevel:o,setLevel:e=>{r()!==e&&r.set(e)},scope:t},a=t=>{"audio"===t.track.kind&&m(e)},i=t=>{"audio"===t.track.kind&&f(e)};return n.isLocalMediaStream(e)&&t.onDestroy(n.on("muteTrackChanged",((t,r)=>{if(r.stream.id===e.id){if(r.isMuted)return void f(e);m(e)}}))),e.addEventListener("addtrack",a),e.addEventListener("removetrack",i),t.onDestroy((()=>{e.removeEventListener("addtrack",a),e.removeEventListener("removetrack",i)})),d.set(e,s),o}return t.audioLevel},removeMediaStream:e=>{f(e),d.get(e)?.scope.destroy(),d.delete(e)}}})),nr=1,or=0,sr=10;var ar,ir,cr="undefined"!=typeof globalThis?globalThis:"undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{};function ur(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,"default")?e.default:e}var dr=ur(ir?ar:(ir=1,ar=function(){}));function lr(e){return e>=0&&e<=10}const pr="audioMixer";function mr(e){const{debugStateRegistry:t,logger:r,userInteraction:n,forceDestinationPipeline:o,audioCore:s}=e;let{outputGain:a=nr}=e;const i=Ge(),c=r.getLogger("WebAudioMixer"),u=R();lr(a)||(c.debug("The output gain should be in the range from 0 to 10"),a=nr);const d=i.atom(a);let l;const p=i.atom(!1),m=new Map;let f,g,v,y,h=dr;const b=Qt();let S,w=b;o&&(w=!0);let E=null;var M;async function _(){await s.addUsage(pr)}let C;function P(){C?.unsubscribe(),C=void 0}async function k(){if(w)c.debug("Skip play master due destination pipeline");else if(E){c.debug("Will play master audio"),P();try{E.load(),await E.play()}catch(e){c.error("Failed to play output element, will retry on next interaction",e),C=n.detectUserInteraction().subscribe((()=>{k()}))}}else c.error("masterOutputElement is not initialized")}return c.debug("Init controller",{isDestinationPipeline:w,isContextSetSinkIdSupported:b}),S=s.audioContext.createMediaStreamDestination(),g=s.audioContext.createGain(),w?g.connect(s.audioContext.destination):(g.connect(S),E=new Audio,E.srcObject=S.stream),g.gain.value=d(),v=s.audioContext.createGain(),v.connect(g),y=s.audioContext.createGain(),y.connect(v),M=g,h=()=>{const e=M.context.createOscillator();e.type="sine",e.frequency.value=440,e.connect(M),e.start(),e.stop(M.context.currentTime+2),e.onended=()=>e.disconnect()},c.debug("Init audio elements"),i.add(Ve(p,{sync:!0}).pipe(me(1)).subscribe((async e=>{c.debug("Audio sources playback enabled",e),v&&g&&(e?(v.disconnect(g),c.debug("Disconnected group output")):(v.connect(g),c.debug("Connected group output"))),e?(await s.removeUsage(pr),c.debug("Will play sources audio"),m.forEach((({element:e,streamId:t})=>{e.paused&&e.play().catch((e=>{c.error("Failed to play audio source",t,e)}))}))):(await s.addUsage(pr),c.debug("Will stop sources audio"),m.forEach((({element:e})=>{e.paused||e.pause()})))}))),i.onDestroy(s.hooks.startedAudio.tap((async()=>{p()||await k()}))),i.onDestroy(s.hooks.stopAudio.tap((async()=>{c.debug("Stop audio processes"),c.debug("Will stop master audio"),P(),E?.pause()}))),i.add(s.event.subscribe((e=>{u(e)}))),b&&s.audioContext.addEventListener("sinkchange",(()=>{const{sinkId:e}=s.audioContext;c.debug("sinkId changed to",""===e?"default":e)})),i.syncEffect(d,(e=>{g&&(g.gain.value=e)})),t.addProvider({key:"audioMixer",name:"audioMixer",getState:async()=>({audioContext:{currentTime:s.audioContext.currentTime,state:s.audioContext.state,sampleRate:s.audioContext.sampleRate,baseLatency:s.audioContext.baseLatency,outputLatency:s.audioContext.outputLatency},isSuspended:s.isSuspended(),masterGain:g?.gain.value??0,masterOutputPaused:E?.paused,isSourcesPlayback:p()})}),{isSuspended:s.isSuspended,isReady:s.isReady,startAudio:s.startAudio,stopAudio:s.stopAudio,addMediaStream:function(e){try{if(function(e,t){e.getAudioTracks().forEach((r=>{"ended"===r.readyState&&(t.warn(`Removing ended track ${r.id} from stream ${e.id}`),e.removeTrack(r))}))}(e,c),!Jt(e))return void c.debug("added mediaStream don not have audio tracks");const t=e.getTracks().map(Ht),r=e.id,n=m.get(r);n&&(c.debug("Replacing old stream, already had source with same id",r),n.scope.destroy(),m.delete(r)),c.debug("Creating audio node based on stream",e.id,t);const o=new Audio,a=Ge(),i=a.atom(s.audioContext.createMediaStreamSource(e)),d={sourceNode:i,scope:a,element:o,streamId:e.id},g=()=>{d.sourceNode().disconnect()},v=()=>{i.set(s.audioContext.createMediaStreamSource(e)),y?i().connect(y):c.warn("GroupInput is not initialized")};e.addEventListener("removetrack",g),e.addEventListener("addtrack",v),y?i().connect(y):c.warn("GroupInput is not initialized"),f&&d.scope.add(f.connect(d)),p()?(o.autoplay=!0,o.oncanplay=()=>{o.setSinkId&&l&&o.setSinkId(l).catch((e=>{c.error("Failed to set source sinkId",r,e)}))}):o.pause(),d.scope.onDestroy((()=>{try{if(c.debug("Removing audio on destroy",d.streamId),e.removeEventListener("removetrack",g),e.removeEventListener("addtrack",v),u({type:"removeMediaStream",payload:{audioElement:o,mediaStream:e}}),Kt()){const e=i();setTimeout((()=>{e.disconnect()}),1e3)}else i().disconnect();o.remove()}catch(e){c.error("Failed to remove audio",e)}})),m.set(r,d),u({type:"addMediaStream",payload:{audioElement:o,mediaStream:e}}),_(),c.debug(`Connected a track: ${r}`)}catch(e){c.error("Failed to connect a track",e)}},removeAllMediaStreams:function(){0!==m.size&&(c.debug("Removing all remote tracks..."),m.forEach(((e,t)=>{e.scope.destroy(),c.debug(`Removed a remote track: ${t}`)})),m.clear(),s.removeUsage(pr))},removeMediaStream:function(e){const t=e.id,r=m.get(t);r&&(r.scope.destroy(),m.delete(t),0===m.size&&s.removeUsage(pr),c.debug(`Removed a stream: ${t}`))},event$:u.event$,outputGain:d,setOutputGain:e=>{lr(e)?(d.set(e),u({type:"gainChanged",payload:{value:e}})):c.debug("The output gain should be in the range from 0 to 10")},setOutputDevice:async function(e){if(e&&e!==l){if(l=e,w&&b)try{c.debug("Will set AudioContext sinkId to",e);const t="default"===e?"":e;await s.setSinkId(t)}catch(e){c.error("Failed to set AudioContext sinkId",e)}E?.setSinkId&&(c.debug(`Will set master sinkId to ${e}`),E.setSinkId(e).then((()=>{c.debug(`Set master sinkId to ${e}`)})).catch((t=>{c.error(`Failed to set master sinkId to ${e}`,t)}))),c.debug(`Will set sources sinkId to ${e}`),m.forEach((({element:t})=>{t.setSinkId&&t.setSinkId(e).catch((t=>{c.error(`Failed to set source sinkId to ${e}`,t)}))}))}},soundCheck:h,setRemoteInputMixer:function(e){if(y&&v&&(f&&(f.destroy(),f=void 0,y.connect(v)),e)){y.disconnect(v),f=i.add(e(s.audioContext));const t=f;t.output.connect(v),m.forEach((e=>{e.scope.add(t.connect(e))}))}},getAudioContext:()=>s.audioContext,createMixinNode:async function(){await _();const e=s.audioContext.createMediaStreamDestination();g?.connect(e);const t=new Map;return{destinationNode:e,addStream:function(r){const n=s.audioContext.createMediaStreamSource(r);n.connect(e);const o=Ge(),a=()=>{const n=t.get(r.id);n&&n.source.disconnect(e)},i=()=>{const n=s.audioContext.createMediaStreamSource(r);n.connect(e);t.get(r.id)&&t.set(r.id,{scope:o,source:n})};r.addEventListener("removetrack",a),r.addEventListener("addtrack",i),o.onDestroy((()=>{r.removeEventListener("removetrack",a),r.removeEventListener("addtrack",i)})),t.set(r.id,{scope:o,source:n})},removeStream:function(r){const n=t.get(r.id);n&&(n.source.disconnect(e),n.scope.destroy(),t.delete(r.id))},destroy:function(){t.forEach((t=>{t.source.disconnect(e),t.scope.destroy()})),t.clear(),g?.disconnect(e)}}},setAudioSourcesPlayback(e){p()!==e&&p.set(e)},destroy:function(){i.destroy(),P(),E&&(E.pause(),E.srcObject=null,E.remove(),E=null),m.forEach((e=>e.scope.destroy())),m.clear()}}}const fr=P({sampleRate:I({key:"core.audioMixer.sampleRate",needsRestart:!0}),latencyHint:k({key:"core.audioMixer.latencyHint",defaultValue:"0.03",needsRestart:!0})}),{module:gr,flagsToken:vr}=A(fr),yr=xe({initialState:new Set,updates:{add:e=>t=>{const r=new Set(t);return Array.isArray(e)?e.forEach((e=>{r.add(e)})):r.add(e),r},remove:e=>t=>{const r=new Set(t);return Array.isArray(e)?e.forEach((e=>{r.delete(e)})):r.delete(e),r}}});function hr(e){const t=function(e){const t=performance.getEntriesByName(e);return t.length?t[t.length-1]?.startTime??0:0}(e);return t?performance.now()-t:0}function br(e){const{audioMixer:t,audioLevel:r,logger:n,rooms:o,checkLoadFirstAudioPackage:s,collectMetrics:a}=e,i=Te(),c=n.getLogger("AudioMixerParticipantsManager"),u=i.createController((()=>yr())),d=new Map;i.handle(t.event$.pipe(T("addMediaStream")),(({payload:{mediaStream:e,audioElement:t}})=>{o().forEach((r=>{r.container.resolve(S).roomMediaSources.hasMediaStream(e)&&(t.srcObject=e)}))})),i.handle(t.event$.pipe(T("removeMediaStream")),(({payload:{mediaStream:e,audioElement:t}})=>{o().forEach((r=>{const n=r.container.get(S);n?.roomMediaSources.hasMediaStream(e)&&(t.srcObject=null)}))}));const l=Ge();i.add((()=>l.destroy()));let p=!1;return{$mutedParticipants:u.asQuery(),addTracks:function(e){e.forEach((e=>function(e){try{const n=e.participantId,o=d.get(n)||new Map;c.debug(`Will addTrack for participant ${n}, prev size`,o.size),o.set(e.mediaStream.id,e.mediaStream),d.set(e.participantId,o);const i=e.mediaStream.id,m=e.mediaStream.getAudioTracks?.()?.[0]?.id;if(n&&u.get().has(n))return c.debug("Ignored added track, because participant was muted in mixer",n,m,i),void t.removeMediaStream(e.mediaStream);s&&!p&&(l.effect(r.addMediaStream(e.mediaStream).level,(e=>{if(e>0){l.destroy(),p=!0;const e=hr(x.connector.startJoinToRoom);a.sendMetric({type:"client.jn.latency",values:[{name:"subscriberFirstAudioPacketReceived0",value:e}]})}})),l.onDestroy((()=>{r.removeMediaStream(e.mediaStream)}))),t.addMediaStream(e.mediaStream),c.debug(`Connected a remote track ${m} via stream ${i}, new size`,o.size)}catch(e){c.error("Failed to connect a remote track",e)}}(e)))},removeTracks:function(e){e.forEach((e=>function(e){const r=e.mediaStream.id,n=e.mediaStream.getAudioTracks?.()?.[0]?.id,o=d.get(e.participantId)||new Map;c.debug(`Will removeTrack for ${e.participantId}, prev size`,o.size),o.delete(e.mediaStream.id),0===o.size?d.delete(e.participantId):d.set(e.participantId,o);t.removeMediaStream(e.mediaStream),c.debug(`Removed a remote track ${n} and a stream ${r}, new size`,o.size)}(e)))},muteParticipants:function(e,r){e?u.updates.add(r):u.updates.remove(r),r.forEach((r=>{const n=d.get(r);n&&n.forEach((r=>{e?t.removeMediaStream(r):t.addMediaStream(r)}))}))},removeAllTracks:()=>{d.forEach((e=>{e.forEach((e=>{t.removeMediaStream(e)}))})),d.clear()},destroy:function(){i.destroy()}}}const Sr=e({key:"AUDIO_OUTPUT_MIXER_CONTEXT_TOKEN"}),wr={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"})},Er=e({key:"AUDIO_OUTPUT_MIXER_MANAGER_TOKEN"}),Rr=De({initialState:new Set,updates:{addParticipant:e=>t=>{const r=new Set(t);return r.add(e),r},addParticipants:e=>t=>new Set([...t,...e]),removeParticipant:e=>t=>{const r=new Set(t);return r.delete(e),r},removeParticipants:e=>t=>{const r=new Set(t);return e.forEach((e=>{r.delete(e)})),r},clear:()=>()=>new Set}});function Mr(e){const{roomMediaSources:t,roomEvent$:r,remoteParticipants:n,audioMixerParticipantsManager:o}=e,s=Ge(),a=new Map,i=s.add(Rr()),c=s.atom(!1),u=R();s.effect(c,(e=>{u({type:"muteAllParticipantsChanged",payload:{isMuted:e}})}));const d=(e,t)=>{if(!e&&c()&&c.set(!1),Array.isArray(t))return o.muteParticipants(e,t),e?i.updates.addParticipants(t):i.updates.removeParticipants(t),void u({type:"muteParticipantsChanged",payload:{isMuted:e,participantIds:t}});e?i.updates.addParticipant(t):i.updates.removeParticipant(t),u({type:"muteParticipantsChanged",payload:{isMuted:e,participantIds:[t]}})};return s.add(u.event$.pipe(T("muteParticipantsChanged")).subscribe((({payload:{isMuted:e,participantIds:t}})=>{o.muteParticipants(e,t)}))),s.add(r.pipe(T("participants")).subscribe((({payload:{participants:e}})=>{if(!c())return;const t=e.map((({id:e})=>e));i.updates.addParticipants(t),u({type:"muteParticipantsChanged",payload:{isMuted:!0,participantIds:t}})}))),s.add(r.pipe(T("participantJoined")).subscribe((({payload:{participant:{id:e}}})=>{c()&&(i.updates.addParticipant(e),u({type:"muteParticipantsChanged",payload:{isMuted:!0,participantIds:[e]}}))}))),s.add(r.pipe(T("participantLeft")).subscribe((({payload:{participant:{id:e}}})=>{i().has(e)&&(i.updates.removeParticipant(e),u({type:"muteParticipantsChanged",payload:{isMuted:!1,participantIds:[e]}}))}))),s.add(r.pipe(T("disconnected","destroy")).subscribe((()=>{o.muteParticipants(!1,[...i()]),i.updates.clear(),o.removeTracks(Array.from(a,(([e,t])=>t))),a.clear()}))),s.onDestroy(t.on("addTrack",((e,{mediaType:t,isLocal:r,participantId:n,stream:s})=>{!function(e,t,r,n){if(e!==O.AUDIO)return;if(r)return;const s={mediaStream:n,participantId:t};a.set(t,s),o.addTracks([s])}(t,n,r,s)}))),s.onDestroy(t.on("removeTrack",((e,{mediaType:t,isLocal:r,participantId:n,stream:s})=>{!function(e,t,r,n){if(e!==O.AUDIO)return;if(r)return;a.delete(t),o.removeTracks([{mediaStream:n,participantId:t}])}(t,n,r,s)}))),{audioOutputMixerManager:{mutedParticipants:C(i),isMutedAll:C(c),event$:u.event$,muteParticipants:d,muteAllParticipants:e=>{c.set(e),d(e,n().map((({id:e})=>e)))}},destroy:()=>{s.destroy()}}}const _r=m({token:Er,factory:r((function({jazzRoomContext:e,audioOutputMixerContext:t,sdkContext:r}){const{localDevices:n}=r,{roomMediaSources:o,room:s}=e,{audioMixerParticipantsManager:a}=t,i=Te(),{audioOutputMixerManager:c}=i.createController((()=>Mr({remoteParticipants:s.remoteParticipants,roomEvent$:s.event$,roomMediaSources:o,audioMixerParticipantsManager:a})));Kt()&&i.add(s.status.value$.pipe(re((e=>"connected"===e)),se((()=>{"granted"!==n.userMediaPermissions().audio&&n.requestMediaPermission("audio")}))).subscribe());return{...c,destroy:i.destroy}}),{jazzRoomContext:S,audioOutputMixerContext:Sr,sdkContext:E})});const Cr=m({factory:t(Q().params().apply((({params:e,scope:t})=>{const{roomConnection:r,audioCore:n}=e,o=`room-${r.roomId}`;n.addUsage(o),t.onDestroy((()=>{n.removeUsage(o)}))})),{roomConnection:b.RoomConnection,audioCore:wr.AudioCore})});async function Pr(e){return w({imports:{audioMixerFlagsModule:gr,sdkContext:E,$flags:vr,debugStateRegistry:z,collectMetrics:V.CollectMetrics},factory:t=>function(e){const{deps:{sdkContext:t,$flags:r,debugStateRegistry:n,collectMetrics:o},options:s={},scope:a}=e,{clientManager:i,logger:c,localMediaSettings:u,userInteraction:d,moduleManager:l,localTrackManager:p}=t,m={...r.get(),...s.flags},f="Safari"===G(navigator.userAgent).name&&!Kt(),g=a.add(new tr({logger:c,userInteraction:d,sampleRate:m.sampleRate,latencyHint:m.latencyHint})),v=a.add(mr({debugStateRegistry:n,logger:c,userInteraction:d,forceDestinationPipeline:f,audioCore:g})),y=u.audioOutputDevice()?.deviceId;y&&v.setOutputDevice(y);a.onDestroy(u.hooks.selectAudioOutputDevice.tap((async({audioOutputDevice:e})=>{await v.setOutputDevice(e.deviceId)}))),a.onDestroy(p.on("mixDisplayAudio",((e,t)=>{v.setAudioSourcesPlayback(t.enabled)})));const h=a.add(new rr({logger:c,localTrackManager:p,audioLevelAnimationInterval:s.audioLevelAnimationInterval})),b=a.add(br({rooms:i.rooms,checkLoadFirstAudioPackage:s.checkLoadFirstAudioPackage??!1,collectMetrics:o,audioLevel:h,audioMixer:v,logger:c})),{audioOutputMixer:S}=a.add(function(e){const{audioMixer:t,localMediaSettings:r,audioMixerParticipantsManager:n}=e,o=Te();return{audioOutputMixer:{$isSuspended:Ne(t.isSuspended),isSuspended:t.isSuspended,event$:t.event$,outputGain:C(t.outputGain),setOutputGain:t.setOutputGain,startAudio:t.startAudio,stopAudio:t.stopAudio,setOutputDevice:r.selectAudioOutputDevice,addMediaStream:t.addMediaStream,removeMediaStream:t.removeMediaStream,muteParticipants:n.muteParticipants},destroy:()=>{o.destroy()}}}({audioMixer:v,localMediaSettings:u,audioMixerParticipantsManager:b}));l.registerModule("addRoom",_r),l.registerModule("addRoomConnection",Cr);return{destroy:()=>{a.destroy()},audioOutputMixerContext:{audioMixer:v,audioOutputMixer:S,audioMixerParticipantsManager:b,audioLevel:h},audioMixer:v,audioOutputMixer:S,audioMixerParticipantsManager:b,audioLevel:h,audioCore:g}}({...t,options:e}),exports:{audioOutputMixerContext:Sr,audioMixer:wr.AudioMixer,audioMixerParticipantsManager:wr.AudioMixerParticipantsManager,audioOutputMixer:wr.AudioOutputMixer,audioCore:wr.AudioCore,audioLevel:wr.AudioLevel}})}function kr(e){const{audioOutputMixer:t}=e.container.resolve(Sr);return t}function Ir(e){return e.container.resolve(Er)}const Ar=Ne,Tr=qe,xr=Ve,Or=Ve;function Vr(e,t){const r=Le(e,t);return()=>{r.destroy()}}const zr=e({key:"VIDEO_ELEMENT_POOL_GLOBAL_SERVICE_TOKEN"}),Gr=e({key:"VIDEO_ELEMENT_POOL_FOR_ROOM_SERVICE_TOKEN"}),Dr=e({key:"VIDEO_ELEMENT_POOL_DOM_OBSERVERS_SERVICE_TOKEN"}),Lr=e({key:"VIDEO_ELEMENT_POOL_SETTINGS_TOKEN"}),$r={domObserversService:Dr,settingsService:e({key:"VIDEO_ELEMENT_POOL_SETTINGS_SERVICE_TOKEN"}),settings:Lr},jr={globalService:zr,videoElementPoolForRoomService:Gr};function Fr(e){return e.container.resolve(jr.globalService)}function Nr(e){return e.container.resolve(jr.videoElementPoolForRoomService)}var qr=Object.defineProperty,Ur=(e,t,r)=>((e,t,r)=>t in e?qr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r)(e,"symbol"!=typeof t?t+"":t,r);const Br=()=>{};class Wr{constructor(e){Ur(this,"isDestroyed",!1),Ur(this,"__subscribers",{}),Ur(this,"name"),Ur(this,"on",((e,t)=>{if(this.isDestroyed)return Br;const r=this.__subscribers[e];return r?r.add(t):this.__subscribers[e]=new Set([t]),this.off.bind(this,e,t)})),Ur(this,"off",((e,t)=>{if(this.isDestroyed)return;const r=this.__subscribers[e];!r||!r.size||(r.delete(t),r.size||delete this.__subscribers[e])})),Ur(this,"send",((e,...t)=>{if(this.isDestroyed)return;const r=this.__subscribers[e];if(r&&r.size)for(const n of r)queueMicrotask((()=>{n(e,...t)}))})),Ur(this,"destroy",(()=>{this.isDestroyed||(this.isDestroyed=!0,setTimeout((()=>{for(const e in this.__subscribers)this.__subscribers[e].clear();this.__subscribers={}}),0))})),this.name=(null==e?void 0:e.name)??void 0}}class Hr{constructor(e){Ur(this,"name"),Ur(this,"__node"),Ur(this,"on",((e,t)=>this.__node.on(e,t))),Ur(this,"off",((e,t)=>this.__node.off(e,t))),this.name=e.name?`${e.name}__readonly_node`:void 0,this.__node=e}}class Kr{constructor(e){Ur(this,"__node"),Ur(this,"__isRoot",!1),Ur(this,"name"),Ur(this,"getTransports",(()=>this.__node.getTransports())),Ur(this,"on",((e,t)=>this.__node.on(e,t))),Ur(this,"once",((e,t)=>this.__node.once(e,t))),Ur(this,"off",((e,t)=>this.__node.off(e,t))),this.__node=e,e.name&&(this.name=`${e.name}__readonly_node`)}get isDestroyed(){return this.__node.isDestroyed}}function Jr(e,t){return e||t?e?t?`${e}:${t}`:e:t:""}function Qr(e,t){if("*"===e){const e=[];for(const r of t)e.push({namespace:r,event:"*"});return e}if(!e.includes(":"))return[{namespace:"",event:e}];const r=e.lastIndexOf(":"),n=e.substring(0,r),o=e.substring(r+1);if("*"===o){const e=[];for(const r of t)(r===n||r.startsWith(`${n}:`))&&e.push({namespace:r,event:"*"});return e}return t.includes(n)?[{namespace:n,event:o}]:[{namespace:"",event:e}]}class Xr{constructor(e){Ur(this,"__roots",{}),Ur(this,"__subscribers",{}),Ur(this,"__destroySubscribers",{}),Ur(this,"__isRoot",!1),Ur(this,"isDestroyed",!1),Ur(this,"name"),Ur(this,"getTransports",(()=>this.__roots)),Ur(this,"add",((e,t)=>{if(t.isDestroyed)return;if(!t.__isRoot){const r=t.getTransports();for(const t in r){const n=r[t],o=""===e?t:`${e}:${t}`;for(const e of n)this.add(o,e)}return}if(this.__roots[e]){if(this.__roots[e].includes(t))return;this.__roots[e].push(t)}else this.__roots[e]=[t];let r=this.__destroySubscribers[e];r||(r=new Map,this.__destroySubscribers[e]=r),r.has(t)||r.set(t,t.lifecycle.on("destroy",(()=>this.remove(e,t))));const n=this.__subscribers[e];if(n)for(const r in n){const o=n[r];if(o&&o.size)for(const[n,{mode:s,roots:a}]of o)if("on"===s){const o=""===e?n:(t,...r)=>{n(`${e}:${t}`,...r)};a.set(t,t.on(r,o))}else{const o=""===e?(e,...r)=>{n(e,...r),a.delete(t)}:(r,...o)=>{n(`${e}:${r}`,...o),a.delete(t)};a.set(t,t.once(r,o))}}})),Ur(this,"remove",((e,t)=>{var r,n;if(!t.__isRoot){const r=t.getTransports();for(const t in r){const n=r[t],o=""===e?t:`${e}:${t}`;for(const e of n)this.remove(o,e)}return}const o=this.__roots[e];if(!o||!o.includes(t))return;const s=this.__destroySubscribers[e];s&&s.has(t)&&(null==(r=s.get(t))||r(),s.delete(t),s.size||delete this.__destroySubscribers[e]);const a=o.indexOf(t);if(-1===a)return;o.splice(a,1),o.length||delete this.__roots[e];const i=this.__subscribers[e];if(!i)return;const c=[];for(const e in i){const r=i[e];if(r&&r.size){for(const e of r){const{roots:r}=e[1];r.has(t)&&(null==(n=r.get(t))||n(),r.delete(t))}r.size||c.push(e)}}for(const e of c)delete i[e]})),Ur(this,"channel",(e=>{if(!e)throw new Error("not use empty channel");const t=function(e,t){const r={},n=Object.keys(t);for(const o of n)if(o!==e){if(o.startsWith(e+":")){const n=o.substring(e.length+1);r[n]?r[n].push(...t[o]):r[n]=[...t[o]]}}else r[""]=[...t[o]];return r}(e,this.__roots);return new Xr({name:this.name?`${this.name}__channel_${e}`:void 0,roots:t})})),Ur(this,"asReadonly",(()=>function(e){return new Kr(e)}(this))),Ur(this,"on",((e,t)=>{var r,n,o;if(this.isDestroyed)return Br;const s=[],a=Qr(e,Object.keys(this.__roots));for(const{namespace:e,event:i}of a){if(null!=(n=null==(r=this.__subscribers[e])?void 0:r[i])&&n.has(t)){const r=null==(o=this.__subscribers[e])?void 0:o[i].get(t);r&&s.push(r.roots);continue}const a={mode:"on",roots:new Map};s.push(a.roots);const c=""===e?t:(r,...n)=>{t(`${e}:${r}`,...n)};if(this.__subscribers[e])if(this.__subscribers[e][i])this.__subscribers[e][i].set(t,a);else{const r=new Map;r.set(t,a),this.__subscribers[e][i]=r}else{const r=new Map;r.set(t,a),this.__subscribers[e]={[i]:r}}const u=this.__roots[e];if(u)for(const e of u)a.roots.set(e,e.on(i,c))}return()=>{for(const e of s)for(const t of e)t[1]()}})),Ur(this,"once",((e,t)=>{var r,n,o;if(this.isDestroyed)return Br;const s=Qr(e,Object.keys(this.__roots));let a={};for(const{namespace:e,event:i}of s){if(null!=(n=null==(r=this.__subscribers[e])?void 0:r[i])&&n.has(t)){const r=null==(o=this.__subscribers[e])?void 0:o[i].get(t);r&&(a[e]=r.roots);continue}const s={mode:"once",roots:new Map};if(this.__subscribers[e])if(this.__subsc