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