@salutejs/jazz-sdk-electron-plugins
Version:
Jazz SDK electron plugins
2 lines (1 loc) • 5.94 kB
JavaScript
import{token as e}from"ditox";import{createEventBus as s,createKeyQueue as t,filterByType as o,COLLECT_METRICS_MARKS as r,DeniedBySystemError as a,createModule as i,toQueryAtom as c}from"@salutejs/jazz-sdk-web";import{createScope as n}from"rx-effects";import{createScope as u}from"nrgy";import{observe as d}from"nrgy/rxjs";import{switchMap as p,Observable as l,map as y,firstValueFrom as S,filter as f}from"rxjs";const m=e({key:"JAZZ_SDK_CONTEXT_TOKEN"}),g=e({key:"JAZZ_SDK_DESKTOP_CAPTURER_TOKEN"}),w=2e3;function k(e){const{ipcMain:a,logger:i,mediaAccess:c}=e,n=u(),m=s(),g=s(),w=n.atom(void 0),k=t(),h=n.atom("finished"),D=n.atom([]),v=n.atom(!0),A=n.atom(!1),b=n.atom(void 0);a.osInfo().then((e=>{v.set("linux"!==e.platform),A.set("linux"===e.platform),b.set(e.linuxSessionInfo)})).catch((e=>{i.error("Failed get osInfo",e)}));const M=e=>{i.debug("received sources",e.map((e=>e.id))),e.sort(((e,s)=>e.name<s.name?1:-1)),D.set(e)};let P;a.capturerSourcesFinishProcess();const x=n.atom(void 0);window.JazzScreenObtainer={openDesktopPicker:async(e,s)=>{i.debug("Request to open desktop capture picker");if(await(async()=>{if(void 0!==P)return P;const e=A(),s=b();return e&&s&&s.xdgSessionType?.toLowerCase().includes("wayland")?(P=!0,P):(P=!1,P)})())return i.debug("view desktop picker is disabled!"),i.debug("send to main auto select first screen"),g({type:"select",payload:{source:"autoSelectFirstSource",isShareDisplayAudio:v()}}),void s("autoSelectFirstSource");h.set("pending");const t=await async function(){const e=await c.getMediaAccessStatus("screen");return x.set(e),e}();if("denied"===t)return h.set("failed"),void s();a.capturerSourcesStartProcess().then((async e=>{if(w.set({onSourceChoose:s}),"failure"===e.type)return s(),await C(),h.set("failed"),void("accessDenied"===e.error.type&&x.set("denied"));h.set("started"),M(e.value.sources),m({type:"sources",payload:{sources:e.value.sources}})}))}},n.onDestroy((()=>{window.JazzScreenObtainer=void 0,a.capturerSourcesFinishProcess()}));const C=async()=>{w.set(void 0),D.set([]),await a.capturerSourcesFinishProcess(),h.set("finished")},z=async()=>{if("finished"===h())return;"finished"!==await S(d(h,{sync:!0}).pipe(f((e=>"pending"!==e))))&&(w()?.onSourceChoose(),m({type:"cancel",payload:{action:"cancel"}}),await C())};return n.onDestroy(a.subscribe("autoSelectSource",(({audio:e,source:s})=>{m({type:"selectDesktopSource",payload:{source:s,isShareDisplayAudio:e}})}))),n.add(g.event$.pipe(o("select"),p((({payload:e})=>new l((e=>{a.once("askDisplayMediaStream",(()=>{e.next("askDisplayMediaStream")}))})).pipe(y((()=>e)))))).subscribe((({source:e,isShareDisplayAudio:s})=>{a.replyDisplayMediaStream(e,s)}))),n.onDestroy(a.subscribe("updateSources",(e=>{M(e.sources),m({type:"updateSources",payload:e})}))),n.onDestroy(a.subscribe("startProcess",(e=>{m({type:"startProcess",payload:e})}))),n.onDestroy(a.subscribe("finishProcess",(e=>{m({type:"finishProcess",payload:e})}))),{accessStatus:x,sources:D,status:h,isSupportedShareDisplayAudio:v,event$:m.event$,cancel:async()=>{await k.add({key:"cancel",execute:z})},selectSource:async(e,s=!1)=>{await k.add({key:"selectSource",execute:()=>(async(e,s=!1)=>{if("finished"===h())return;if("finished"===await S(d(h,{sync:!0}).pipe(f((e=>"pending"!==e)))))return;const t=w();if(!t)return;performance.mark(r.tracks.runScreenShare);const o=v()&&s;g({type:"select",payload:{source:e,isShareDisplayAudio:o}}),m({type:"selectDesktopSource",payload:{source:e,isShareDisplayAudio:o}}),t.onSourceChoose(e.id),await C()})(e,s)})},destroy:()=>{n.destroy()}}}function h(e){const{ipcMain:s,logger:t}=e,o=n();async function r(e){t.debug("Request media access status for",e);const{status:o}=await s.getMediaAccessStatus(e);return t.debug("Response media access status is",o),o}async function i(e){return await s.askForMediaAccess(e)}const c=async e=>{const s=function(e){switch(e){case"audio":return"microphone";case"video":return"camera";case"displayScreen":return"screen";default:!function(e){throw new Error(`Unexpected value ${e}`)}(e)}}(e),o=await r(s);if(t.debug("Received desktop media access status",o),"not-determined"!==o)return o;if("screen"===s)return o;await i(s);return await r(s)};return{askForMediaAccess:i,getMediaAccessStatus:r,requestDesktopMediaPermissions:async e=>{for(const s of e){if("denied"===await c(s))throw new a("audio"===s,"video"===s)}},requestDesktopMediaAccess:c,openSystemSettings:async function(e){t.debug("Request openSystemSettings",e),await s.openSystemSettings(e)},destroy:()=>{o.destroy()}}}async function D(){return i({name:"DesktopCapturerPlugin",imports:{sdkContext:m},factory:v,exports:{desktopCapturer:g}})}function v(e){const{sdkContext:{logger:s,localDevices:t,emitter:o}}=e.deps;o.once("pluginsResolved",(()=>{o.send("screenCapturePluginAdded",{pluginName:e.name})}));const r=s.getLogger(e.name),a=n(),{ipcMain:i}=function(){const e=window["jazz-sdk-desktop-capturer-bridge"];if(void 0===e)throw new Error("Failed connect to the preload layer. Please setup @salutejs/jazz-sdk-electron-plugins/preload/desktopCapturerPlugin to preload layer of electron");return e}(),u=a.createController((()=>h({ipcMain:i,logger:r}))),{status:d,accessStatus:p,sources:l,isSupportedShareDisplayAudio:y,cancel:S,event$:f,selectSource:m}=a.createController((()=>k({ipcMain:i,logger:r,mediaAccess:u}))),g=t.hooks.requestMediaPermissions.tap((async e=>{await u.requestDesktopMediaPermissions(e)}));return a.add((()=>g())),{desktopCapturer:{sources:c(l),accessStatus:c(p),status:c(d),isSupportedShareDisplayAudio:c(y),getMediaAccessStatus:u.getMediaAccessStatus,requestDesktopMediaAccess:u.requestDesktopMediaAccess,selectSource:m,openSystemSettings:u.openSystemSettings,cancel:S,event$:f},destroy:()=>{a.destroy()}}}function A(e){return e.container.resolve(g)}export{w as INTERVAL_CHECK_ACTUAL_SOURCE,m as JAZZ_SDK_CONTEXT_TOKEN,g as JAZZ_SDK_DESKTOP_CAPTURER_TOKEN,D as desktopCapturerPlugin,A as getDesktopCapturer};