UNPKG

@salutejs/jazz-sdk-web-plugins

Version:

Jazz SDK plugins

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